# 代码 vs 设计差异 — 全面修复计划 > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** 修复小程序全部 5 个 TabBar 页面(首页/身泰/心智/行远/富沛)的代码实现与 v2.0 设计文档 + 五维页面重设计 spec 之间的所有差异 **架构:** 分 9 阶段 19 Tasks 按依赖顺序推进。Phase 1-2 基础设施 → Phase 3-4 Tab页改造(含心智认知雷达图+大五人格图+关系图、行远关系雷达图)→ Phase 5 富沛页重做 → Phase 6 组件改造 → Phase 7 后端改造(含整型金额)→ Phase 8 RadarChart 组件 + 后端数据 API → Phase 9 验证。 - **首页五行沙盘保留不动**(仅增量加 FamilyEnergyBar/服务商入口/维度区块) - **心智页**:能量柱 + 认知六维雷达图 + 大五人格图(10岁+DAN) + 关系图 + 任务 + 活动 + 商品 - **行远页**:六类关系雷达图(孩子/另一半/父母/同伴/师长/领导) + 任务 + 活动 + 商品 - 需新建 `` canvas 通用组件,心智和行远页共用 **前置设计文档:** - `docs/需求分析/底签页面详细设计.md` (v2.0 TabBar 5页设计基线) - `docs/superpowers/specs/2026-06-13-five-dimension-pages-redesign.md` (三页统一改造+堆叠图+游客模式) **Tech Stack:** uni-app Vue 2, Spring Boot 2.7, MyBatis-Plus **优先级:** P0(阻塞) > P1(重要) > P2(一般) > P3(优化) **设计约束 (新增):** - **禁止使用多精度类型(decimal、double、float)**:数据库中所有涉及金额、百分比、评分等数值字段使用整型(`INT`/`BIGINT`),举例如下: - 金额以 **分** 为单位存储(如 `1 元 = 100`),前端展示时除以 100 并保留 2 位小数 - 百分比以 **千分比** 存储(如 `23.5% = 235`),前端展示时除以 10 并拼接 `%` - 评分以 **百分制整数** 存储(如 `85.5 = 855`),前端展示时除以 10 - **现有代码改造**:`Product.price`/`memberPrice` 等已存在的 `BigDecimal` 字段,在本次修复中改为 `Integer`(分),前端价格展示统一加 `¥` 前缀并做 `(price / 100).toFixed(2)` 转换 - **后端输出**:DTO 层输出时仍保留 price/memberPrice 等字段名,类型统一为 `Integer`,前端自行做分→元展示转换 - **理由**:彻底规避浮点数精度问题(0.1+0.2≠0.3),消除跨系统金额计算风险,简化数据库计算逻辑 --- ## 文件改动清单 | 文件 | 操作 | 任务 | |------|------|------| | `cfc-frontend/pages.json` | 修改 | T1 TabBar配置 | | `cfc-frontend/static/tab-*.png` | 创建 | T2 图标 | | `cfc-frontend/pages/index/index.vue` | 修改 | T3/T10 | | `cfc-frontend/pages/teacher/index.vue` | 修改 | T4 | | `cfc-frontend/pages/body/index.vue` | 修改 | T5 | | `cfc-frontend/pages/mind/index.vue` | 修改 | T6 | | `cfc-frontend/pages/action/index.vue` | 修改 | T7 | | `cfc-frontend/pages/index/parent-index.vue` | 修改 | T8 | | `cfc-frontend/pages/index/child-index.vue` | 修改 | T9 | | `cfc-frontend/pages/wealth/index.vue` | **重写** | T11 | | `cfc-frontend/components/FamilyEnergyBar.vue` | 修改 | T12 | | `cfc-frontend/components/DimensionProducts.vue` | 修改 | T13 | | `cfc-frontend/components/DimensionActivities.vue` | 修改 | T13 | | `cfc-frontend/utils/api.js` | 修改 | T10 | | `cfc-backend/.../controller/product/ProductController.java` | 修改 | T14 | | `cfc-backend/.../entity/Activity.java` | 修改 | T15 | | `cfc-backend/.../controller/sncp/ActivityController.java` | 修改 | T15 | | `cfc-frontend/components/RadarChart.vue` | **新建** | T17 | | `cfc-backend/.../controller/ContactController.java` | **新建** | T18 | | `cfc-backend/.../entity/Contact.java` | 修改(如有) | T18 | | `cfc-backend/.../controller/assessment/AssessmentController.java` | 修改 | T18 | --- ## Phase 1 — TabBar 基础设施 (P0 🔴) ### Task 1: pages.json TabBar 配置修改 **Files:** - Modify: `cfc-frontend/pages.json:589-626` - [ ] **Step 1: 修改 TabBar list 配置** 将 TabBar 5 个 Tab 的名称和路径更新: ```json { "tabBar": { "color": "#7A7E83", "selectedColor": "#F97316", "borderStyle": "black", "backgroundColor": "#FFFFFF", "list": [ { "pagePath": "pages/index/index", "text": "首页", "iconPath": "static/tab-home.png", "selectedIconPath": "static/tab-home-active.png" }, { "pagePath": "pages/body/index", "text": "身泰", "iconPath": "static/tab-body.png", "selectedIconPath": "static/tab-body-active.png" }, { "pagePath": "pages/mind/index", "text": "心智", "iconPath": "static/tab-mind.png", "selectedIconPath": "static/tab-mind-active.png" }, { "pagePath": "pages/action/index", "text": "行远", "iconPath": "static/tab-action.png", "selectedIconPath": "static/tab-action-active.png" }, { "pagePath": "pages/wealth/index", "text": "富沛", "iconPath": "static/tab-wealth.png", "selectedIconPath": "static/tab-wealth-active.png" } ] } } ``` 变更点: - Tab 2: "身体" → "身泰"(路径 `pages/body/index` 不变) - Tab 4: "行动" → "行远"(路径 `pages/action/index` 不变) - Tab 5: "我的" + `pages/profile/profile` → "富沛" + `pages/wealth/index` - [ ] **Step 2: 确认 wealth 子包注册存在** 确认 `pages.json` 的 `subPackages` 数组中包含: ```json { "root": "pages/wealth", "pages": [ { "path": "index", "style": { "navigationBarTitleText": "富沛" } }, { "path": "insurance-list", "style": { "navigationBarTitleText": "保单管理" } }, { "path": "insurance-add", "style": { "navigationBarTitleText": "保单详情" } }, { "path": "checkin", "style": { "navigationBarTitleText": "财商打卡" } } ] } ``` 如果缺少,补上 `navigationBarTitleText: "富沛"` 配置。 - [ ] **Step 3: LSP 诊断** 运行:`lsp_diagnostics(filePath="cfc-frontend/pages.json")` 预期:无错误 --- ### Task 2: TabBar 图标文件补全 **Files:** - Create: `cfc-frontend/static/tab-wealth.png`(从 `tab-profile.png` 复制) - Create: `cfc-frontend/static/tab-wealth-active.png`(从 `tab-profile-active.png` 复制) - [ ] **Step 1: 复制图标文件** ```bash cp cfc-frontend/static/tab-profile.png cfc-frontend/static/tab-wealth.png cp cfc-frontend/static/tab-profile-active.png cfc-frontend/static/tab-wealth-active.png ``` - [ ] **Step 2: 确认图标文件存在** 验证 `tab-wealth.png` 和 `tab-wealth-active.png` 文件存在且非空。 --- ## Phase 2 — 首页路由清理 (P0 🔴) ### Task 3: index.vue — 移除 TeacherIndex 引入和路由分支 **Files:** - Modify: `cfc-frontend/pages/index/index.vue` - [ ] **Step 1: 移除 TeacherIndex import** 修改前(约第 108 行): ```javascript import TeacherIndex from '../teacher/index.vue' ``` 修改后: ```javascript // TeacherIndex 已废弃(2026-06-15),教师功能折入 parent-index ``` - [ ] **Step 2: 从 components 对象中移除 TeacherIndex** 修改前: ```javascript components: { ParentIndex, ChildIndex, TeacherIndex, PageBanner, FamilyEnergyBar } ``` 修改后: ```javascript components: { ParentIndex, ChildIndex, PageBanner, FamilyEnergyBar } ``` - [ ] **Step 3: 移除 teacher 路由分支** 修改前(约第 97 行): ```html ``` 修改后:删除该行。 - [ ] **Step 4: LSP 诊断** 运行:`lsp_diagnostics(filePath="cfc-frontend/pages/index/index.vue")` 预期:clean(TeacherIndex 引用全部移除) --- ### Task 4: teacher/index.vue — 软废弃 **Files:** - Modify: `cfc-frontend/pages/teacher/index.vue` - [ ] **Step 1: 文件首部添加废弃标记** 在 `