一、项目背景与立项动机
故事的开始
那是一个春寒料峭的夜晚,我和女友视频聊天时,她突然说:"你知道吗?还有不到三个月就是我们在一起 2 周年了。"
我们是一对异地恋情侣,分隔在两个城市已经一年零九个月。虽然每天都会视频聊天,但距离的隔阂总是让一些情感无法完全传递。
"时间过得真快,感觉我们好像昨天才认识一样。" 女友的一句话,像一颗种子,在我心里发了芽。
立项动机
- 情感连接:跨越距离的障碍,创造一个只属于我们的虚拟空间
- 惊喜准备:为5月5日的2周年纪念日准备一个特别的礼物
- 技术实践:作为前端开发者,挑战纯前端实现完整应用
- 数据隐私:珍贵的回忆只属于我们,不依赖第三方平台
- 长期价值:不仅是礼物,更是未来持续记录回忆的平台
秘密计划
我决定偷偷地开始这个项目,计划在 5 月 5 日我们相恋两周年的那天,给她一个大大的惊喜。从那天起,每天下班后,我都会躲在房间里,对着电脑敲代码,像一个正在准备神秘礼物的工匠。
现在,我正在倒计时——距离 5 月 5 日还有 XX 天。
二、详细的需求分析过程
功能需求梳理
基于项目的实际功能,我整理了以下需求:
| 功能模块 | 核心需求 | 情感价值 |
|---|---|---|
| 时间轴 | 添加、编辑、删除节点,支持照片上传,标记里程碑 | 记录异地恋中的重要时刻,让回忆有迹可循 |
| 照片墙 | 本地图片上传,编辑照片信息,点击预览大图 | 睹物思人,照片是连接思念的桥梁 |
| 纪念日 | 添加多种类型纪念日,自动计算倒计时,标记已过纪念日 | 期待与惊喜的源泉,让等待变得有意义 |
| 爱情故事 | 创建故事集,管理章节,编辑和删除内容 | 用文字记录异地恋的酸甜苦辣 |
| 爱情宣言 | 添加宣言内容,按分类展示,编辑和删除 | 表达爱意的直接方式,让对方感受到在乎 |
| 时间计算 | 多种时间显示模式(按年月日、按天、按年日),实时更新 | 见证爱情的成长,计算重逢的喜悦 |
技术需求梳理
- 纯前端实现:不依赖后端服务器,使用HTML5、CSS3、JavaScript
- 本地数据存储:使用localStorage持久化存储数据
- 响应式设计:适配移动设备和桌面设备
- 图片处理:使用FileReader API处理本地图片上传
- 用户体验:添加平滑动画和过渡效果,优化触摸交互
秘密数据收集
为了让网站更有意义,我开始秘密收集我们的回忆:
- 整理手机里的所有合照,从第一次见面到最近一次分别
- 记录所有重要的日期,包括相识日、第一次约会、每个月的纪念日
- 回忆我们之间的小故事,准备写成爱情故事
- 整理想对她说的话,准备添加到爱情宣言中
三、技术栈选型依据与考量
技术选型
- HTML5:构建页面结构,使用语义化标签
- CSS3:实现样式设计,包括响应式布局和动画效果
- JavaScript (ES6+):实现交互逻辑和功能模块
- localStorage:本地数据存储,持久化保存所有数据
- FileReader API:处理本地图片上传和预览
技术栈选型图
图 2:技术栈选型图 - 展示了爱情纪念网站使用的技术栈及其关系。前端技术(HTML5、CSS3、JavaScript)与浏览器 API(localStorage、FileReader API、DOM API)共同支持项目的核心特性,包括响应式设计、单页应用和离线使用能力。
选型考量
为什么选择这些技术?让我用项目的实际需求来解释:
- 纯前端技术:满足数据隐私需求,所有数据存储在本地,不依赖外部服务器
- localStorage:适合存储我们的回忆数据,虽然有5MB的限制,但通过优化可以满足需求
- 响应式设计:确保女友无论是用手机还是电脑,都能完美浏览网站
- FileReader API:支持本地图片上传,不需要后端服务器处理
- 原生JavaScript:轻量高效,加载速度快,适合作为惊喜礼物
技术架构
项目采用模块化的 JavaScript 架构,将功能划分为多个独立模块:
- DataStorage:处理本地数据存储
- TimeCalculator:处理时间计算和显示
- timelineModule:处理时间轴功能
- photoWallModule:处理照片墙功能
- anniversaryModule:处理纪念日功能
- storyModule:处理爱情故事功能
- declarationModule:处理爱情宣言功能
项目架构图
图 1:项目架构图 - 展示了爱情纪念网站的三层架构设计,包括用户界面层、模块层和数据层。模块层的各个功能模块通过 DataStorage 模块与本地存储进行交互,实现数据的持久化存储。
四、开发实现中的关键技术挑战及解决方案
核心功能模块
核心功能模块图
图 4:核心功能模块图 - 展示了爱情纪念网站的六大核心功能模块及其详细功能特性,包括时间轴、照片墙、纪念日、爱情故事、爱情宣言和时间计算模块。
挑战1:localStorage存储限制
问题:localStorage 的存储容量有限(通常为 5MB),而我们有很多珍贵的照片。
解决方案:
- 实现图片压缩功能,在上传时自动调整图片大小
- 优化数据结构,减少冗余字段,最大化利用存储空间
- 使用Base64编码存储图片,确保数据完整性
实际操作:
我在代码中添加了图片压缩逻辑,将上传的图片限制在合理大小,同时保证视觉效果。这样既节省了存储空间,又提高了页面加载速度。
挑战2:时间计算的精度
问题:如何准确计算时间差,避免时区和夏令时的影响。
解决方案:
- 使用Date对象的getTime()方法获取时间戳,避免时区问题
- 实现多种时间显示模式,满足不同场景的需求
- 优化时间更新逻辑,确保实时性的同时减少性能消耗
实际操作:
我在 TimeCalculator 模块中实现了三种时间显示模式,并添加了实时更新功能,确保时间计算的准确性和显示的美观性。
挑战3:响应式布局的实现
问题:如何让网站在不同设备上都能完美显示。
解决方案:
- 使用CSS Grid和Flexbox实现弹性布局
- 添加媒体查询,针对不同屏幕尺寸调整样式
- 优化触摸交互,提高移动设备体验
实际操作:
我在 CSS 中添加了响应式设计,确保网站在手机、平板和桌面设备上都能完美显示,特别是照片墙的网格布局,在不同屏幕尺寸下都能保持美观。
挑战4:秘密开发的时间管理
问题:如何在不被女友发现的情况下,合理安排开发时间。
解决方案:
- 制定详细的开发计划,分解任务,确保在5月5日前完成
- 利用下班后的时间开发,避免占用和女友视频的时间
- 建立代码备份,确保数据安全
- 创造合理的借口,避免女友起疑心
实际操作:
我制定了详细的开发计划,每天完成一个小任务,确保项目稳步推进。同时,我会在和女友视频时,把代码编辑器最小化,切换到工作文档,避免露馅。
挑战5:用户体验的优化
问题:如何让网站的交互更流畅、更有吸引力。
解决方案:
- 添加平滑的过渡动画和转场效果
- 实现键盘导航,支持键盘操作
- 添加加载状态和错误处理
- 优化表单交互,提供即时反馈
实际操作:
我在照片预览功能中添加了平滑的过渡动画,在时间计算中添加了实时更新效果,让整个网站的交互更加流畅和有吸引力。
五、测试策略与部署计划
测试策略
- 功能测试:逐个测试每个功能模块,确保所有功能正常工作
- 兼容性测试:在女友使用的手机浏览器中反复测试
- 响应式测试:确保在不同屏幕尺寸下都能完美显示
- 性能测试:测试页面加载速度和交互流畅度
- 数据测试:测试数据存储和读取的稳定性
开发流程图
图 3:开发流程图 - 展示了爱情纪念网站从需求分析到 5 月 5 日惊喜发布的完整开发流程,包括开发阶段、准备阶段和发布阶段的各个关键步骤。
测试工具
- Chrome DevTools:调试JavaScript和CSS
- Responsive Design Mode:模拟女友的手机屏幕
- Lighthouse:分析性能和可访问性
- 手动测试:无数次地打开网站,测试所有功能
部署计划
- 代码优化:在4月底前完成所有代码优化和bug修复
- 数据填充:整理所有照片和回忆,填充到网站中
- 最终测试:进行全面的功能测试和性能测试
- 部署方式:
- 生成最终的HTML文件,确保所有功能正常
- 上传到云存储服务,生成一个唯一的访问链接
- 备份所有数据,确保安全
- 时机选择:5月5日当天,在我们视频聊天时,突然发给她
六、项目进展与未来期待
目前进展
- 核心功能开发:已完成时间轴、照片墙、纪念日、爱情故事、爱情宣言等所有核心功能
- 数据结构优化:已实现localStorage数据的高效存储和管理
- 响应式设计:已完成在不同设备上的适配
- 用户体验优化:已添加平滑动画和过渡效果
- 数据收集:正在整理和上传我们的照片和回忆
项目时间线图
图 5:项目时间线图 - 展示了爱情纪念网站从 2 月到 5 月 5 日的详细项目时间线,包括开发、准备和发布三个阶段的里程碑。
对5月5日的期待
那一天,我会提前准备好一切,然后在视频聊天时,神秘地对她说:"宝贝,我为你准备了一个特别的 2 周年礼物。"
当她打开链接,看到那个充满我们回忆的网站时,我想象她会:
- 看到时间轴上的第一个节点——我们第一次见面的那天
- 浏览照片墙上的合照,回忆起每一次见面的场景
- 看到纪念日模块中我们的重要日期
- 读到我为她写的爱情故事
- 看到爱情宣言中我对她的表白
- 发现时间计算器显示"我们已经在一起730天"
那一刻,距离将不再是障碍,我们的情感会通过这个网站紧紧连接在一起。
长期价值
这个网站不仅是 2 周年的礼物,更是我们未来持续记录回忆的平台。以后,我们可以:
- 继续在时间轴上添加新的回忆
- 在照片墙上传新的合照
- 在纪念日模块添加新的重要日期
- 续写我们的爱情故事
- 添加新的爱情宣言
- 看着时间计算器的数字不断增长
七、网站界面预览
1. 时间轴页面
描述:记录重要时刻的时间轴页面,包含时间计算和重要时刻节点。
功能:
- 时间轴节点的添加、编辑、删除
- 节点照片的上传和展示
- 里程碑标记
- 时间轴的滚动浏览
- 多种时间显示模式切换
布局:
- 顶部时间计算卡片,显示在一起的时间
- 左侧时间线,右侧节点内容
- 每个节点包含标题、日期、描述和照片
- 节点的渐入动画效果
特色:
- 实时更新的时间计算器
- 平滑的节点动画效果
- 响应式设计,适配不同设备

图 6:时间轴页面 - 展示了时间计算卡片和重要时刻节点,显示了相识至今的时间和第一个节点 "初识"。
2. 照片墙页面
描述:展示照片的网格布局页面,支持照片的上传和管理。
功能:
- 照片的上传、编辑和删除
- 点击照片查看大图预览
- 响应式网格布局
- 照片信息的编辑
布局:
- 自适应网格,根据屏幕尺寸调整列数
- 每张照片带有标题和日期
- 悬停效果显示操作按钮
- 上传照片按钮
特色:
- 响应式网格布局
- 平滑的悬停效果
- 大图预览功能

图 7:照片墙页面 - 展示了照片墙的网格布局,包含两张示例照片,每张照片都有悬停效果。
3. 纪念日页面
描述:展示和管理纪念日的页面,支持多种类型的纪念日。
功能:
- 纪念日的添加、编辑、删除
- 自动倒计时显示
- 已过纪念日标记
- 多种纪念日类型
布局:
- 卡片式布局,每个纪念日一个卡片
- 显示倒计时或已过时间
- 分类展示不同类型的纪念日
- 添加纪念日按钮
特色:
- 实时更新的倒计时
- 已过纪念日的特殊标记
- 不同类型纪念日的颜色区分

图 8:纪念日页面 - 展示了两个纪念日卡片,左侧是已过的 "初识" 纪念日,右侧是未来的 "结婚纪念日",显示了倒计时。
4. 爱情故事页面
描述:展示爱情故事的页面,支持故事集和章节的管理。
功能:
- 故事集的创建和管理
- 章节的添加、编辑、删除
- 故事的阅读模式
- 故事的分类管理
布局:
- 故事集列表,每个故事集一个卡片
- 故事阅读页面,包含章节导航
- 章节内容的优雅展示
- 添加故事按钮
特色:
- 故事集的卡片式布局
- 优雅的阅读体验
- 章节的有序管理

图 9:爱情故事页面 - 展示了故事集列表,包含一个 "测试" 故事,显示了故事的创建日期、章节数和简介。
5. 爱情宣言页面
描述:展示爱情宣言的页面,支持宣言的添加和管理。
功能:
- 宣言的添加、编辑、删除
- 按分类展示
- 宣言的卡片式布局
布局:
- 卡片式布局,每个宣言一个卡片
- 分类标签筛选
- 优雅的文字展示效果
- 添加宣言按钮
特色:
- 不同风格的宣言卡片
- 分类标签的视觉区分
- 简洁优雅的布局

图 10:爱情宣言页面 - 展示了两个爱情宣言卡片,左侧是粉色心形背景的 "sweet" 类型宣言,右侧是绿色星星背景的 "romantic" 类型宣言。
6. 技术实现
响应式设计:
- 使用CSS Grid和Flexbox实现响应式布局
- 媒体查询适配不同屏幕尺寸
交互效果:
- 平滑的过渡动画
- 图片懒加载
- 键盘导航支持
- 触摸优化
数据存储:
- 使用localStorage存储所有数据
- 数据结构优化
- 定期备份
7. 未来展望
功能扩展:
- 导出/导入功能
- 主题切换
- 更多交互效果
用户体验:
- 优化加载速度
- 提升交互流畅度
- 增强情感连接
结语
从构思到现在,它不仅是一个技术项目,更是一份情感的结晶。每一行代码都带着我的思念,每一个功能都藏着我的用心。
异地恋的道路虽然艰辛,但因为有了这样的小期待,有了共同的回忆空间,距离反而让我们的感情更加深厚。每当我在代码中添加一个新的功能,我都会想象女友看到时的表情,这成为了我最大的动力。
现在,我正在倒计时,等待着 5 月 5 日的到来。我相信,当女友看到这个网站时,她会明白,无论距离有多远,我的心永远和她在一起。
技术可以跨越山海,代码可以传递真情。这就是这个项目最美好的地方。
附录
项目地址:https://github.com/NoEggEgg/love-memorial-website
git:[@github/NoEggEgg/love-memorial-website]
评论