Просмотр исходного кода

docs(spec): 首页问候条快捷入口与我的咨询消息设计规格

Agnes Agent 1 неделя назад
Родитель
Сommit
4fdeb3b43e

+ 107 - 0
docs/superpowers/specs/2026-11-01-home-greet-shortcut-and-my-messages-design.md

@@ -0,0 +1,107 @@
+# 设计规格:首页问候条快捷入口 + 小铃铛进入「我的咨询消息」
+
+- 日期:2026-11-01
+- 模块:cfc-frontend(微信小程序)+ cfc-backend(Spring Boot)
+- 状态:已批准
+
+## 1. 背景与目标
+
+家长首页 `pages/index-home/index.vue` 顶部问候条(`greet-bar`)当前有两个问题:
+
+1. 「XXX,今天家里有 X 位成员一起守护健康」只是静态文案,无任何跳转入口,用户想管理成员要另行找路径。
+2. 小铃铛 `goNotifications` 跳转到 `/pages/teacher/messages`(成长规划师咨询列表页)。该页调用 `/api/guide/messages/list`,后端硬性要求 `role=teacher`(`TeacherMessageController` line 89-90),家长点击即报「只有成长规划师可以查看」。
+
+目标:问候条可点击跳转家庭成员页;小铃铛进入家长自己的咨询消息列表。
+
+非目标(YAGNI):
+- 不做咨询消息的发送/回复功能(仅查看)。
+- 不改数据库结构,无 DDL 迁移。
+- 不改 `/pages/teacher/messages`(规划师侧页面保持原样)。
+
+## 2. 子项 1:问候条 → 家庭成员页快捷入口
+
+### 2.1 位置
+
+`pages/index-home/index.vue` 的 `greet-bar`(line 55-82),含三部分:成员头像组 `greet-avatars`、问候语 `greet-main`、小铃铛 `greet-bell`。
+
+### 2.2 行为
+
+- `greet-bar` 增加 `@click="goFamilyMembers"`,点击头像组或问候语区域均跳转家庭成员页。
+- `greet-bell` 增加 `@click.stop="goNotifications"`,阻断冒泡,避免点铃铛同时触发跳转。
+- `greet-main` 内新增轻量 `›` 箭头作为可点击视觉暗示(`.greet-arrow`),不改变现有排版结构。
+
+### 2.3 方法
+
+```js
+goFamilyMembers: function() {
+  this.navTo('/pages/profile-extra/family-members')
+}
+```
+
+复用已有 `navTo`(内部 `nav.goPage`)与已有目标路径(line 1841 `add-member` 分支已在用同一路径)。
+
+## 3. 子项 2:小铃铛 → 「我的咨询消息」
+
+### 3.1 后端
+
+**实体**:`TeacherMessage` 增加瞬态字段
+
+```java
+@TableField(exist = false)
+private String teacherName;   // 规划师昵称(回显用,不入库)
+```
+
+**接口增强**:`TeacherMessageController.getMyMessages`(`POST /api/guide/messages/my`,已存在)对每条消息按 `teacherId` 查 `users.nickname` 填充 `teacherName`。与同控制器 `/list` 填充家庭主账号昵称的模式一致。
+
+不新增路由,不改鉴权(`/my` 无 role 限制,按 `parentId` 查自己的记录)。
+
+### 3.2 前端
+
+**`utils/api.js`** 新增:
+
+```js
+export const getMyGuideMessages = () => request('/api/guide/messages/my', 'POST')
+```
+
+**新页面** `pages/profile/my-messages.vue`(分包 `root: pages/profile`,与 `message-history` 同包):
+
+- `pages.json` 注册,`navigationBarTitleText: "我的咨询消息"`。
+- `onLoad` 调 `getMyGuideMessages()`,渲染列表。
+- 列表项内容:
+  - 我的提问:`content`
+  - 提问时间:`createdAt`(`parseDate` 格式化)
+  - 规划师:`teacherName`,缺失时兜底「规划师」
+  - 回复:`replyContent`;有 → 显示回复正文 + 「已回复」状态;无 → 「待回复」状态
+- 空状态:「暂无咨询消息」。
+
+**`goNotifications`** 改为:
+
+```js
+goNotifications: function() {
+  uni.navigateTo({ url: '/pages/profile/my-messages' })
+}
+```
+
+## 4. 边界情况
+
+| 场景 | 行为 |
+|------|------|
+| 非家长访问首页(如规划师切家长视角) | `/my` 按自身 `parentId` 查询 → 空列表 → 空状态,不报错 |
+| 咨询尚无回复 | 显示「待回复」状态 |
+| `teacherId` 查不到用户 | `teacherName` 兜底「规划师」 |
+| 点击小铃铛 | 只进消息页,不触发家庭成员页跳转(`@click.stop`) |
+
+## 5. 小程序约束
+
+不使用可选链 `?.`;`:key` 使用方法调用;时间格式化用 `utils/format.js` 的 `parseDate()`,不直接 `new Date(string)`;不新增 `uni.getSystemInfoSync()`。
+
+## 6. 验证
+
+- 后端:`mvn clean compile` 通过。
+- 前端:`node scripts/verify-vue-compile.js pages/index-home/index.vue pages/profile/my-messages.vue` 三项 PASS。
+- 前端:`node scripts/audit-mp-antipatterns.js` ERROR 归零。
+- 不执行 HBuilderX 打包(按 AGENTS.md 规范由用户在 HBuilderX 完成)。
+
+## 7. 接口文档同步
+
+在 `docs/superpowers/api/API_REFERENCE.md` 记录 `/api/guide/messages/my` 的 `teacherName` 回显字段。