Bladeren bron

docs: 更新需求分析文档和设计文档

- 需求分析文档: 补充新需求背景描述

- superpowers: 新增规划文档(家长端重设计/邀请码流程)

- 新增logo和specs文档

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
User 4 maanden geleden
bovenliggende
commit
7c93a2af2a

+ 109 - 0
docs/superpowers/plans/2026-05-16-parent-redesign.md

@@ -0,0 +1,109 @@
+# 家长首页重构 Implementation Plan
+
+> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development to implement this plan task-by-task.
+
+**Goal:** Reconstruct parent mini-program homepage with child cards as core navigation, add child detail page.
+
+**Architecture:** Vue 2 + uni-app. Add child card row to parent-index.vue top, move growth archive into new child-detail.vue page. Other pages add childId query param support.
+
+**Tech Stack:** uni-app (Vue 2), WeChat miniprogram
+
+---
+
+### Task 1: Create child-detail.vue (new page)
+
+**Files:**
+- Create: `zxyj-frontend/pages/parent/child-detail.vue`
+
+**Spec:**
+- Route `/pages/parent/child-detail?childId=X`
+- Top: child info card (avatar, name, points, DAN level, streak days)
+- Middle: action buttons (创建任务 → navigate with childId, 心愿审核, 成长档案)
+- Bottom: today's tasks list (call getTodayTasks(childId)), pending review items
+- Use `onLoad(options)` to get childId from query params
+- Data: `getChildren()` → find child by id, `getTodayTasks(childId)`, `getPendingReviewTasks()`, wish API
+- Style: match parent-index.vue color scheme (#FFF9F0 background, orange #FF8C42 accents, white cards with shadow)
+
+**Key code structure:**
+```vue
+<template>
+  <view class="child-detail-container">
+    <!-- 孩子信息卡片 -->
+    <view class="info-card">...</view>
+    <!-- 操作区 -->
+    <view class="actions">...</view>
+    <!-- 今日任务 -->
+    <view class="tasks-section">...</view>
+    <!-- 待处理 -->
+    <view class="pending-section">...</view>
+  </view>
+</template>
+```
+
+### Task 2: Restructure parent-index.vue
+
+**Files:**
+- Modify: `zxyj-frontend/pages/index/parent-index.vue`
+
+**Changes:**
+1. Replace the existing `child-status-card` with a **child cards row** at the top (after greeting):
+   - One child: single large card ~70% width, centered, shows avatar, name, points, pending count
+   - Multiple children: horizontal scroll `scroll-view`, each card ~160rpx wide
+   - Click card → navigate to child-detail
+2. Keep existing sections below: stat cards (今日概览), 今日重点, 成长里程碑
+3. Enhance 待审核 section to show per-child items
+4. Quick actions: remove 成长档案 (moved to child-detail), keep others
+
+**Layout structure:**
+```
+welcome greeting
+child cards row (scroll-view horizontal, new)
+成长数据 (existing stats-grid)
+今日重点 (existing today-section)
+成长里程碑 (existing milestone-section)
+待审核任务 (existing review-section, kept)
+快捷操作 (existing quick-section, minus 成长档案)
+```
+
+### Task 3: Register child-detail route in pages.json
+
+**Files:**
+- Modify: `zxyj-frontend/pages.json`
+
+**Add:**
+```json
+{
+  "path": "pages/parent/child-detail",
+  "style": {
+    "navigationBarTitleText": "孩子详情"
+  }
+}
+```
+
+### Task 4: Support childId param in create-task.vue
+
+**Files:**
+- Modify: `zxyj-frontend/pages/tasks/create-task.vue`
+
+**Changes:**
+- In `onLoad(options)`: if `options.childId` exists, pre-select that child in the picker
+- Add `childId` to data, set in onLoad
+- The child picker already has `children` from mounted/getChildren, just set `selectedChildIndex` based on childId
+
+### Task 5: Support childId param in parent/wishes/index.vue
+
+**Files:**
+- Modify: `zxyj-frontend/pages/parent/wishes/index.vue`
+
+**Changes:**
+- In `onLoad(options)`: accept `childId`, filter wishes by childId if provided
+- Add `childId` to data, pass to API calls that support it
+
+### Task 6: Support childId param in growth/index.vue
+
+**Files:**
+- Modify: `zxyj-frontend/pages/growth/index.vue`
+
+**Changes:**
+- In `onLoad(options)`: accept `childId`, auto-select that child
+- If childId provided, skip the children list selection and directly load that child's records

+ 134 - 0
docs/superpowers/plans/2026-05-19-guide-invite-code-flow.md

@@ -0,0 +1,134 @@
+# Team Invitation Code Flow Implementation Plan
+
+> **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:** Implement two-code system (team + family) for guides and complete mini-program invite flow
+
+**Architecture:** Backend adds `type` field to `GuideInviteCode`, mini-program checks invite code type on registration to route correctly (register → apply → join), Web admin shows both codes in Layout.vue dialog
+
+**Tech Stack:** Spring Boot 2.7.18, uni-app Vue 2, Vue 2 + Element UI
+
+---
+
+### Task 1: Backend — Add type field to GuideInviteCode
+
+**Files:**
+- Modify: `zxyj-backend/.../entity/GuideInviteCode.java:24` (add type field)
+- Modify: `zxyj-backend/.../service/GuideInviteCodeService.java` (support type in create/generate)
+- Modify: `zxyj-backend/.../controller/guide/GuideTeamController.java` (add type to invite-code response)
+
+**Details:**
+- Add `private String type;` to `GuideInviteCode` with values `"team"` / `"family"`
+- Default new codes to `"team"` in `generateInviteCode()`
+- `createInviteCode()` checks existing by guideId + type, not just guideId
+- `GuideTeamController.getMyInviteCode()` accepts optional `type` param (defaults to `"team"`)
+- New endpoint `POST /api/guide/team/invite-code/family` returns family-type code
+
+---
+
+### Task 2: Backend — Invite code validation with type routing
+
+**Files:**
+- Modify: `zxyj-backend/.../service/GuideInviteCodeService.java`
+- Modify: `zxyj-backend/.../controller/guide/GuideManagementController.java`
+
+**Details:**
+- `validateInviteCode(code, type)` — validates code matches the expected type
+- `POST /api/guide/invite-code/validate` enhanced to return code type + guide info
+- Response includes: `{ valid, type, guideId, guideName, code }`
+
+---
+
+### Task 3: Backend — Team join/leave endpoints
+
+**Files:**
+- New: (add to) `zxyj-backend/.../controller/guide/GuideTeamController.java`
+
+**Endpoints:**
+- `POST /api/guide/team/join` — accept `{ inviteCode, userId }`, validates code, checks if user is already a teacher, if in another team → error telling them to leave first
+- `POST /api/guide/team/leave` — removes user from team (clears `teacher_no` or team relation)
+- `POST /api/guide/team/check-status` — returns `{ isTeacher, inTeam, teamId }` for the invite code flow routing
+
+---
+
+### Task 4: Web admin — Show both codes in Layout.vue dialog
+
+**Files:**
+- Modify: `zxyj-web/src/api/guide.js` — add `getMyFamilyInviteCode()`
+- Modify: `zxyj-web/src/views/Layout.vue` — extend invite code dialog
+
+**Details:**
+- Add "家庭邀请码" section below "团队邀请码" in the existing dialog
+- Family invite code fetched via separate API call
+- Both codes shown with copy button
+- Each section has description text explaining what the code is for
+
+---
+
+### Task 5: Mini-program — Registration with invite code
+
+**Files:**
+- Modify: `zxyj-frontend/pages/login/login.vue`
+- Modify: `zxyj-frontend/utils/api.js`
+
+**Details:**
+- When app opens with invite code param (from QR code or shared link), store it
+- Registration page: show invite code indicator, collect phone + verification code + nickname only (no role selection)
+- On submit: `POST /api/auth/register-with-invite` with `{ phone, code, inviteCode, nickname }`
+- Backend creates user, checks invite code type, routes accordingly
+
+---
+
+### Task 6: Mini-program — Invite code routing (application flow)
+
+**Files:**
+- New: `zxyj-frontend/pages/guide/apply/index.vue` (guide application page)
+- Modify: `zxyj-frontend/pages/teacher/index.vue`
+- Modify: `zxyj-frontend/App.vue`
+
+**Details:**
+- After registration, if invite code is team-type:
+  - User already has `role=teacher` → redirect to confirm team join
+  - User has `teacherStatus=pending` → show application pending page
+  - User is not a teacher → show guide application page
+- If invite code is family-type: bind to family on registration
+- Store `inviteCodeInfo` in global state (guide name, code type)
+
+---
+
+### Task 7: Mini-program — Team join confirmation page
+
+**Files:**
+- New: `zxyj-frontend/pages/guide/team-confirm/index.vue`
+
+**Details:**
+- Shows: inviting guide info (name, avatar), current team info (if any)
+- If already in a team: "您当前在 XX 团队中,请先退出再加入新团队" with "退出团队" button
+- If eligible: "确认加入 XX 的团队" → calls `/api/guide/team/join`
+- Success → navigate to teacher home
+
+---
+
+### Task 8: Database migration
+
+**Files:**
+- Modify: `zxyj-backend/.../config/DatabaseInitializer.java`
+
+**SQL:**
+```sql
+ALTER TABLE guide_invite_codes ADD COLUMN type VARCHAR(20) DEFAULT 'team' COMMENT '邀请码类型: team/family';
+ALTER TABLE guide_invite_codes ADD INDEX idx_type (type);
+```
+
+---
+
+### Task 9: Mini-program registration page update
+
+**Files:**
+- Modify: `zxyj-frontend/pages/login/login.vue` or registration page
+
+**Details:**
+- Remove role selector when invite code is present
+- Add hidden field carrying invite code through the flow
+- After registration success, call `/api/guide/team/check-status` to determine next step
+- Navigate to appropriate page based on user status + invite code type

+ 186 - 0
docs/superpowers/specs/2026-05-13-users-admins-merge.md

@@ -0,0 +1,186 @@
+# Users + Admins 表合并设计文档
+
+**日期**: 2026-05-13
+**状态**: 已定稿,待实施
+
+## 1. 背景
+
+当前系统使用两张独立的认证表:
+- `users` — 小程序用户(家长/孩子/规划师),加密算法 `xzyj_salt_` + MD5
+- `admins` — Web管理端用户(管理员/规划师),加密算法 `xzyj_admin_salt_` + MD5
+
+规划师需要在小程序端和 Web 管理端同时使用,但两套认证体系导致:
+- 规划师审核通过时需同步创建 admins 记录(`AdminController.guide/approve`)
+- 密码不同步,规划师需要两套密码
+- 扩展新角色需要同时修改两套系统
+
+## 2. 目标
+
+将 admins 表的功能合并到 users 表,统一认证体系,废弃 admins 表。
+
+## 3. 设计方案(4个模块)
+
+### Module 1: 数据模型合并
+
+#### users 表新增字段
+```sql
+-- 迁移SQL (DatabaseInitializer)
+ALTER TABLE users ADD COLUMN username VARCHAR(50) COMMENT '登录用户名(兼容admins迁移)';
+ALTER TABLE users ADD COLUMN status VARCHAR(20) DEFAULT 'active' COMMENT '账号状态: active/inactive/actived';
+ALTER TABLE users ADD INDEX idx_username (username);
+
+-- status 字段说明:
+--   active   - 正常(小程序用户默认)
+--   actived  - 已激活(规划师设置密码后)
+--   inactive - 已禁用
+```
+
+#### User.java 实体新增字段
+```java
+private String username;  // 登录用户名
+private String status;    // 账号状态: active/inactive/actived
+```
+
+#### 数据迁移逻辑 (DatabaseInitializer.runMigrations)
+```text
+遍历 admins 表所有记录:
+  1. 按 phone 查询 users 表
+  2. 如果 phone 已存在 users 中:
+     - 更新 role(如果 admins.role=teacher 且 users 是 parent,添加 teacher 角色)
+     - 设置 password(用 xzyj_salt_ + MD5 重新加密)
+     - 设置 username = admins.username(如果有)
+     - 设置 status = active
+  3. 如果 phone 不存在 users 中:
+     - 在 users 表创建新用户
+     - 设置必要字段(phone, username, password, role, status)
+     - 不创建家庭(admins 没有家庭概念)
+  4. 跳过没有 phone 的 admins 记录
+```
+
+**注意**: admins 表不删除,仅停止使用,保留作为回滚备份。
+
+### Module 2: Web登录重建
+
+#### AdminAuthController 重构
+- 将 `AdminMapper` 替换为 `UserMapper`
+- 所有查询从 `admins` 表改为 `users` 表
+- 加密算法从 `xzyj_admin_salt_` + MD5 改为 `xzyj_salt_` + MD5(与 UserService 一致)
+- `loginByPassword` 改为用 phone 查询 users 表,支持 teacher 角色
+- 登录时检测 `status = inactive` → 账号被禁用
+- 登录时检测 `role=teacher && password 为空/未设置` → 返回特殊标识让前端提示设置密码
+
+#### 删除文件
+- `Admin.java` 实体类
+- `AdminMapper.java` Mapper 接口
+
+#### AdminController 调整
+- 移除 `@Resource AdminMapper` 注入
+- `guide/approve` 方法:删除同步创建/更新 admins 表的逻辑,审核通过直接更新 User 即可
+- 检查其他引用 `AdminMapper` 或 `Admin` 的地方并清理
+
+#### UserService 修复
+- `resetPassword` 方法(第1021行)当前使用 `xzyj_user_` 加密算法,改为统一的 `xzyj_salt_` + MD5
+
+### Module 3: 规划师首次密码创建
+
+#### 触发场景
+规划师审核通过后,登录 Web 管理端时:
+1. Web 登录页输入手机号 + 密码
+2. `AdminAuthController.loginByPassword` 查询 users 表
+3. 检测到 `role=teacher && (password==null || password=="")`
+4. 返回 `Result.error(400, "请先设置密码")` 附带 `needsSetup: true` 标识
+
+#### 小程序端设置密码
+1. 规划师在小程序 teacher-profile 页点击 "设置网页密码"
+2. 输入新密码 + 确认密码
+3. 调用后端 API `POST /api/auth/set-web-password`
+4. 后端执行:
+   - `UserService.setPassword(userId, newPassword)` — 用 `xzyj_salt_` + MD5 加密
+   - `UserService.updateUserStatus(userId, "actived")` — 设置状态为已激活
+5. 成功后规划师可用密码登录 Web 管理端
+
+#### 新增后端 API
+```java
+// AuthController 或 AdminAuthController 新增
+@PostMapping("/api/auth/set-web-password")
+public Result<Boolean> setWebPassword(@RequestAttribute("userId") Long userId,
+                                       @RequestBody Map<String, String> params) {
+    // 1. 校验密码强度 (6位以上)
+    // 2. 设置密码 (xzyj_salt_ + MD5)
+    // 3. 设置 status = actived
+    // 4. 返回成功
+}
+```
+
+### Module 4: 规划师密码重置
+
+#### 小程序端修改密码
+1. 规划师在 teacher-profile 页 "修改网页密码"
+2. 输入旧密码 + 新密码 + 确认新密码
+3. 调用后端 API `POST /api/auth/reset-web-password`
+4. 后端执行:
+   - 校验旧密码是否正确
+   - 设置新密码(`xzyj_salt_` + MD5 加密)
+   - 状态保持不变
+
+#### 新增后端 API
+```java
+// AuthController 或 AdminAuthController 新增
+@PostMapping("/api/auth/reset-web-password")
+public Result<Boolean> resetWebPassword(@RequestAttribute("userId") Long userId,
+                                         @RequestBody Map<String, String> params) {
+    // 1. 校验旧密码
+    // 2. 设置新密码
+    // 3. 返回成功
+}
+```
+
+## 4. 加密算法统一
+
+**统一算法**: `DigestUtils.md5DigestAsHex(("xzyj_salt_" + password).getBytes(StandardCharsets.UTF_8))`
+
+| 位置 | 修改前 | 修改后 |
+|------|--------|--------|
+| AdminAuthController.encryptPassword (L271) | `xzyj_admin_salt_` + MD5 | `xzyj_salt_` + MD5 |
+| UserService.encryptPassword (L749) | `xzyj_salt_` + MD5 | ✅ 不变 |
+| UserService.resetPassword (L1021) | `xzyj_user_` + MD5 | `xzyj_salt_` + MD5 |
+
+## 5. 影响范围
+
+### 后端文件变更
+
+| 文件 | 变更类型 | 说明 |
+|------|----------|------|
+| `entity/User.java` | 修改 | 新增 username, status 字段 |
+| `entity/Admin.java` | 删除 | 废弃 |
+| `mapper/AdminMapper.java` | 删除 | 废弃 |
+| `controller/admin/AdminAuthController.java` | 重写 | UserMapper 替代 AdminMapper,统一加密 |
+| `controller/admin/AdminController.java` | 修改 | 移除 AdminMapper 引用,清理同步逻辑 |
+| `controller/auth/AuthController.java` | 修改 | 新增 set-web-password, reset-web-password 端点 |
+| `service/UserService.java` | 修改 | 修复 resetPassword 算法,新增 setStatus 方法 |
+| `config/DatabaseInitializer.java` | 修改 | 新增 username/status 迁移 + admins→users 数据迁移 |
+
+### 前端文件变更
+
+| 文件 | 变更类型 | 说明 |
+|------|----------|------|
+| `zxyj-frontend/pages/teacher/teacher-profile.vue` | 修改 | 拆分密码设置为首次设置和修改密码两个入口 |
+| `zxyj-frontend/utils/api.js` | 修改 | 新增 set-web-password, reset-web-password API |
+
+### Web端文件变更
+
+| 文件 | 变更类型 | 说明 |
+|------|----------|------|
+| `zxyj-web/src/views/Login.vue` | 无需修改 | AdminAuthController 端点不变(logic变化内部处理) |
+
+## 6. 安全考虑
+
+- 所有密码使用 MD5 + 固定 salt 传输(当前系统已有模式,暂不改 BCrypt 以保持兼容)
+- 小程序端不存储明文密码
+- Web 端密码传输使用 HTTPS(生产环境配置)
+
+## 7. 回滚方案
+
+- admins 表保留不删除,数据完整
+- 如果合并后出现问题,可停止使用 users 表的新字段
+- 钥匙管理器中有 DatabaseInitializer 中的迁移代码,重新部署会自动跳过

+ 151 - 0
docs/superpowers/specs/2026-05-14-parent-redesign.md

@@ -0,0 +1,151 @@
+# 家长端首页重构设计
+
+**日期**: 2026-05-14
+**状态**: 设计稿
+
+## 1. 目标
+
+重构家长端小程序首页,适配一孩到多孩场景,让孩子信息成为首页核心导航入口。
+
+## 2. 设计原则
+
+- **保留现有功能**:首页原有统计概览、待处理、快捷操作不动
+- **增加而非替换**:在顶部增加孩子卡片行,现有内容下沉
+- **一孩/多孩自适应**:一个孩子时卡片占满一行,多个孩子时横向滚动
+- **成长档案不放在首页**:放入孩子详情页
+
+## 3. 页面结构
+
+### 3.1 家长首页 (`parent-index.vue`)
+
+```
+┌──────────────────────────────────────┐
+│  上午好,王爸爸 👋                   │
+│                                      │
+│  ┌──────┐ ┌──────┐ ┌──────┐        │
+│  │ 👦小明│ │ 👧小红│ │ 👶小华│  ← 孩子卡片行│
+│  │ ⭐28  │ │ ⭐45  │ │ ⭐12  │         │
+│  │ 📋2   │ │ ✅    │ │ 💝1   │         │
+│  └──────┘ └──────┘ └──────┘        │
+│                                      │
+│  今日概览 (保留现有统计)              │
+│  ✅任务完成 68%  ⭐本月积分 85       │
+│  🔥连续打卡 5天  📝待审任务 3        │
+│                                      │
+│  待处理 (增强,混排所有孩子)          │
+│  ├─ 📋 小明·整理书包 → [审核]        │
+│  ├─ 💝 小红·买画笔 → [审批]          │
+│  └─ 📋 小明·练字 → [审核]            │
+│                                      │
+│  快捷操作                             │
+│  [➕创建任务] [📋任务审核] [💝心愿审批] │
+└──────────────────────────────────────┘
+```
+
+**孩子卡片行规则:**
+- 一孩:卡片占宽约 70%,居中,信息更丰富(含待审核数)
+- 多孩:横向滚动,每卡片 160rpx 宽,显示头像、姓名、积分、待处理数
+- 点击卡片 → `navigateTo /pages/parent/child-detail?childId=X`
+
+### 3.2 孩子详情页 (`pages/parent/child-detail.vue`) — 新页面
+
+```
+┌──────────────────────────────────────┐
+│  ← 返回          小明               │
+│                                      │
+│  ┌────── 孩子信息卡片 ──────┐        │
+│  │  👦 小明  ⭐ 28 分       │        │
+│  │  DAN: L3  🔥连续 5 天   │        │
+│  │  📋 今日任务 3/5 完成    │        │
+│  └──────────────────────────┘        │
+│                                      │
+│  操作区                               │
+│  ┌──────────┐ ┌──────────┐          │
+│  │ 📝       │ │ 💝       │          │
+│  │ 创建任务  │ │ 心愿审核  │          │
+│  └──────────┘ └──────────┘          │
+│  ┌──────────┐                        │
+│  │ 📊       │                        │
+│  │ 成长档案  │  ← 这里放成长档案      │
+│  └──────────┘                        │
+│                                      │
+│  今日任务                             │
+│  ├─ ✅ 整理书包                      │
+│  ├─ ⏳ 练字 30分钟                   │
+│  └─ ⏳ 阅读 20分钟                   │
+│                                      │
+│  待处理                              │
+│  ├─ 💝 买画笔 → 待审批              │
+│  └─ 📋 整理书包 → 待审核            │
+└──────────────────────────────────────┘
+```
+
+## 4. 文件变更清单
+
+| 文件 | 变更类型 | 说明 |
+|------|----------|------|
+| `pages/index/parent-index.vue` | 修改 | 顶部增加孩子卡片行,快捷操作去掉成长档案 |
+| `pages/parent/child-detail.vue` | 新增 | 孩子总览页 + 操作入口 |
+| `pages.json` | 修改 | 注册 child-detail 路由 |
+| `pages/tasks/create-task.vue` | 修改 | 支持 childId 参数自动选择孩子 |
+| `pages/parent/wishes/index.vue` | 修改 | 支持 childId 参数过滤心愿列表 |
+| `pages/growth/index.vue` | 修改 | 支持 childId 参数自动选择孩子 |
+| `utils/api.js` | 修改 | 按需新增 childId 过滤 API 参数 |
+
+### 页面路由
+
+```json
+// pages.json 新增
+{
+  "path": "pages/parent/child-detail",
+  "style": { "navigationBarTitleText": "孩子详情" }
+}
+```
+
+### API 改动策略
+
+- 不新增后端 API
+- 现有 `getChildren()` 已返回 id、nickname、danLevel、totalPoints、streakDays
+- 待审核任务:`getPendingReviewTasks()` → 前端按 childId 过滤
+- 待审批心愿:wish API 已支持 childId 参数
+- 成长档案:`/api/growth/record/child/{childId}` 已存在
+
+## 5. 组件设计要点
+
+### 5.1 孩子卡片组件
+
+```vue
+<ChildCard>
+  props: { child: Object, isSingle: Boolean }
+  - 显示头像(emoji)、昵称、积分、DAN等级
+  - 待审核任务数、待审批心愿数
+  - 点击 @click → 跳转 child-detail
+  - 单孩子模式: 大卡片,信息更多
+  - 多孩子模式: 小卡片,横向滚动
+</ChildCard>
+```
+
+### 5.2 首页数据加载
+
+```
+onShow():
+  await getChildren() → 孩子列表
+  await getPendingReviewTasks() → 按 childId 分组
+  await getFamilyMembers() 或 points/stats → 今日概览
+```
+
+## 6. 错误/边界情况
+
+- **孩子列表为空**:首页显示"添加孩子"引导卡片
+- **挂载失败**:孩子卡片显示重试按钮
+- **API 超时**:首页保留现有统计,孩子区域显示加载中
+- **单个孩子**:卡片占宽 70%,居中显示
+- **4+ 孩子**:横向滚动,最右侧有"查看更多"指示
+
+## 7. 视觉风格
+
+沿用现有配色:
+- 卡片底色: #fff, 圆角 16rpx, 阴影
+- 积分: 蓝色 #3B82F6
+- 待审核: 橙色 #F59E0B
+- 已完成: 绿色 #10B981

BIN
docs/系统设计/logo.png


+ 4 - 0
docs/需求分析/需求分析文档.md

@@ -228,6 +228,10 @@
 | GUIDE-009 | 家庭列表查看(以家庭为单位) | P1 | ✅ |
 | GUIDE-010 | 家庭详情查看(成员信息、任务完成情况) | P1 | ✅ |
 | GUIDE-011 | 规划师身份切换为家长 | P1 | ✅ |
+| GUIDE-012 | 注册时填写联系地址(必填) | P1 | ✅ |
+| GUIDE-013 | 注册时填写银行卡号和开户行(选填,佣金结算) | P1 | ✅ |
+| GUIDE-014 | 申请草稿/提交/撤回/重新提交工作流 | P1 | ✅ |
+| GUIDE-015 | 申请过程记录追踪(操作人/时间/状态变更/备注) | P1 | ✅ |
 | GUIDE-WEB-001 | Web端工作台 | P1 | ✅ |
 | GUIDE-WEB-002 | Web端家庭管理 | P1 | ✅ |
 | GUIDE-WEB-003 | Web端团队管理 | P1 | ✅ |