Files
MyIP/refactor/04-store-hardcoded.md
T
jason5ng32andClaude Opus 4.6 0a5b0c1914 refactor: bootstrap → tailwind/shadcn-vue infra + sonner toast
Set up Tailwind v4 + shadcn-vue infrastructure and replace the first
Bootstrap component (Toast) as a vertical slice that proves the approach.

Infrastructure (refactor/01 phase A):
- Add tailwindcss + @tailwindcss/vite (devDependencies) and wire the plugin
  in vite.config.js
- Add shadcn-vue runtime deps: reka-ui, class-variance-authority, clsx,
  tailwind-merge, lucide-vue-next
- Add components.json and frontend/lib/utils.js (cn helper)
- Define design tokens via shadcn CSS variables (oklch, neutral baseColor)
  in frontend/style/style.css
- Wire dark mode: store.setDarkMode now toggles <html>.dark for the
  Tailwind dark: variant
- Coexist with Bootstrap (no removal yet)

Toast → vue-sonner (refactor/01 phase B item 1):
- Replace internals of widgets/Toast.vue (Bootstrap Toast → vue-sonner)
- Keep store.setAlert() public API unchanged so all 5 call sites stay put
- Map alertStyle text-success/warning/danger/info to sonner severities

Refactor planning:
- Add AGENTS.md so future AI sessions know the project layout, JS-only
  preference, and where to find refactor progress
- Add refactor/ with a 4-task plan, completion discipline, and per-task
  review checklists

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 02:37:58 +08:00

2.2 KiB
Raw Blame History

04 — store.js 硬编码数据治理

目标:将 frontend/store.js 中硬编码的数据(主要是 21 条 userAchievements、可能还有其它常量)抽离到独立数据文件,store 只持有可变状态和 actions,便于维护、便于测试、便于未来本地化与扩展。

状态:🟡 未开始


子任务

阶段 A — 现状盘点

  • 通读 frontend/store.js,列出所有"硬编码常量数据"候选清单(不仅仅是 achievements,可能还有默认偏好、curl 域名映射等)
  • 在本文件下方"盘点结果"小节登记发现项

阶段 B — achievements 抽离

  • 新建 frontend/data/achievements.js,导出形如 export const ACHIEVEMENTS_DEFINITIONS = [...] 的数组(定义:name / img),不含状态字段(achieved / achievedTime / showDetails)
  • 新建工厂函数 createInitialAchievementsState(),根据定义生成初始状态对象
  • store 的 state.userAchievements 改为调用工厂函数初始化
  • 校验所有读取 userAchievements 的地方(Achievements.vue / App.vue / 触发解锁的 utils)行为不变
  • 成就元数据(图片路径前缀不一致问题:'achievements/iamhuman.webp' vs /achievements/...)顺手统一

阶段 C — 其它硬编码

  • 处理盘点中发现的其它项(具体子任务在阶段 A 完成后补齐到这里)

阶段 D — 测试

  • 在 03 的覆盖范围里补:createInitialAchievementsState() 单测、关键解锁逻辑回归测试

盘点结果

阶段 A 完成后填写。每项注明:所在行号、内容性质、建议归宿(data/ 目录、constants 文件、保留在 store)。

  • (待填写)

完成前回顾清单

  • frontend/store.js 中已无大段静态对象字面量
  • frontend/data/ 下文件均为纯数据 + 纯函数,无副作用、无 store 依赖
  • 全仓库 grep 确认所有 userAchievements 的读写仍走 store,没有组件直接 import 数据文件硬编码
  • 图片路径前缀问题已统一并验证渲染
  • 任何新增导出都在文件顶部注释说明用途
  • 已与 03 任务联动,补充必要的单测