为了保持“静态部署”的特性,同时获得现代开发的便利性,推荐使用以下技术栈:
- 核心框架: Vue 3 (使用 Composition API) + TypeScript
- 理由: Vue 3 上手快,适合单页应用,Composition API 利于逻辑复用(比如计时器逻辑)。TS 提供类型安全,方便后期维护。
- 构建工具: Vite
- 理由: 极速启动和打包,开发体验远超传统 Webpack。
- 状态管理: Pinia
- 理由: 比 Vuex 更轻量、更直观,完美管理“播放状态”、“计时数据”、“用户设置”等全局数据。
- 样式方案: Tailwind CSS (或 SCSS)
- 理由: Tailwind 可以极快地构建 UI,且方便后期实现“UI 拼图化/主题化”。
- PWA 支持: vite-plugin-pwa
- 理由: 自动生成 Service Worker 和 Manifest,替代你目前手写的 sw.js,轻松实现离线访问。
- 云端服务 (BaaS): Supabase 或 LeanCloud
- 理由: 既然要“静态部署”又要“云端记录/排行榜”,我们需要一个后端即服务 (BaaS)。它们提供免费层,前端直接调用 API 即可存取数据,无需自己买服务器写后端。
| 模块 | v1 (当前) | v2 (目标) |
|---|---|---|
| 项目结构 | HTML + JS 散文件 | 组件化 (.vue 文件) |
| DOM 操作 | jQuery 直接操作 ($('#id').fadeIn()) |
数据驱动视图 (Vue 响应式变量) |
| 播放器 | APlayer + MetingJS (全局变量) | 封装为 <MusicPlayer /> 组件 |
| 计时器 | mikuplayer.js 中的 setInterval |
封装为 useTimer (Composable) 或 Pinia Store |
| 统计 | Umami (HTML 引入) | 封装为统计插件/Hook |
| 部署 | 静态文件直传 | 构建 (npm run build) 后产出静态文件 |
建议按照以下顺序一步步执行:
- 初始化项目: 使用 Vite 创建 Vue 3 + TS 项目。
- 配置环境: 安装 Pinia, Vue Router, Tailwind CSS, vite-plugin-pwa。
- 目录规划: 建立
src/components,src/stores,src/assets,src/hooks等目录。 - 资源迁移: 将 assets 下的图片、视频、字体迁移到新项目。
- 背景层 (Background): 实现视频背景播放组件,处理加载状态。
- 播放器组件 (Player):
- 集成 APlayer(或寻找 Vue 版本的替代品)。
- 实现歌单 ID 的配置化。
- 计时器核心 (Timer Core):
- 使用 Pinia 重写
valStore中的计时逻辑。 - 实现“学习中”、“休息中”的状态切换。
- 使用 Pinia 重写
- 主界面 (Dashboard):
- 复刻首页 UI,显示时间、一言、倒计时。
- 实现“全屏”、“设置”等按钮功能。
- 番茄钟 (Pomodoro):
- 基于计时器核心,增加“专注时长”和“休息时长”的设定。
- 实现自动状态流转(专注 -> 休息 -> 专注)。
- UI 拼图化 (Draggable UI):
- 引入拖拽库 (如
vue-draggable-plus)。 - 让时钟、播放器、一言框变成可拖拽的卡片。
- 引入拖拽库 (如
- 白噪音 (White Noise):
- 添加一个新的音频控制面板,允许混合播放雨声、键盘声等。
- 用户系统: 接入 Supabase Auth (支持 GitHub/Google 登录,或匿名登录)。
- 数据同步:
- 设计数据库表结构 (
study_logs,users)。 - 实现学习时长上传。
- 设计数据库表结构 (
- 排行榜: 读取云端数据并展示。
- PWA 配置: 完善
manifest.json和缓存策略,确保离线可用。 - SEO 优化: 确保 meta 标签正确。
- 部署: 配置 GitHub Actions 自动构建并推送到
gh-pages分支。
- [ ] 番茄钟: 在 Pinia Store 中增加
mode状态 (normal|pomodoro),复用底层计时逻辑。 - [ ] 学习时长云端记录/排行榜: 使用 Supabase,前端直接写 SQL (通过 JS SDK) 查询 Top 10 数据。
- [ ] 离线使用:
vite-plugin-pwa可以配置GenerateSW策略,自动缓存所有构建产物和静态资源。 - [ ] UI 拼图化: 利用 Vue 的动态组件和 Grid 布局系统,配合拖拽库实现。