# 注册零填写 + 信息按需补充 实施计划 > **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:** 取消小程序注册时的信息填写步骤(注册成功直接进首页),新增接受家庭邀请独立页(真实姓名+家庭身份必填),更新功能→信息字段映射表,添加成员手机号冲突时提示邀请加入。 **Architecture:** 纯前端为主的最小改动:登录页去掉新用户跳转;`user-edit.vue` 停用新用户流程只留编辑用途;新增 `pages/invite/join-form.vue` 承接家庭邀请;`join.vue` 改跳新页;映射表 `profile-field-usage.js` 补全;后端 backfill 白名单加 `realName`;`add-member.vue` 手机号冲突改邀请提示。 **Tech Stack:** uni-app Vue 2 (小程序) + Spring Boot 2.7.18 (仅 1 处后端白名单改动) **Spec:** `docs/superpowers/specs/2026-09-28-registration-zero-fill-design.md` ## Global Constraints - 后端验证唯一方式:`cd cfc-backend && mvn clean compile`(测试目录有 ~166 个预先存在失败,**不要**尝试修复) - 前端**禁止打包**(`npm run build:mp-weixin` 等一律不执行),只做语法/结构校验(`node --check` 提取 script 块) - 接口一律 `@PostMapping`;DI 用 `@Resource`;响应统一 `Result` - 小程序限制:禁止可选链 `?.`(用 `&&`)、禁止 CSS Grid(用 flexbox)、禁止 `:key` 表达式、禁止 `new Date(string)`(用 `parseDate()`) - Vue 2 Options API,禁止 Composition API - 迁移幂等;`docs/superpowers/` 文件增改必须同步 `PROJECT-OVERVIEW.md` - 提交风格:`feat: 注册零填写-xxx` - 不破坏:服务用户注册流程(`pages/guide/register`)、个人中心编辑、现有活动报名回写 --- ## 文件结构 | 文件 | 操作 | 责任 | |------|------|------| | `cfc-frontend/pages/login/login.vue` | 修改 | 注册零填写:登录成功直接进首页 / 有家庭邀请则跳 join-form | | `cfc-frontend/pages/user-edit/user-edit.vue` | 修改 | 停用新用户流程,仅保留个人中心编辑 | | `cfc-frontend/pages/invite/join-form.vue` | **新建** | 接受家庭邀请:真实姓名+家庭身份必填 | | `cfc-frontend/pages.json` | 修改 | 注册 join-form 页面 | | `cfc-frontend/pages/invite/join.vue` | 修改 | 已登录跳 join-form 而非 user-edit | | `cfc-frontend/utils/profile-field-usage.js` | 修改 | 功能→信息字段映射表补全 | | `cfc-backend/.../service/UserService.java` | 修改 | backfill 白名单加 realName | | `cfc-frontend/pages/family/add-member.vue` | 修改 | 手机号冲突 → 邀请加入提示 | | `docs/superpowers/PROJECT-OVERVIEW.md` | 修改 | 状态同步 | --- ### Task 1: login.vue 注册零填写改造 **Files:** - Modify: `cfc-frontend/pages/login/login.vue:174-181` **Interfaces:** - Consumes: `uni.getStorageSync('pendingFamilyInviteCode')`(join.vue 写入) - Produces: 登录成功后的跳转决策(直接进首页 或 跳 join-form) - [ ] **Step 1: 修改 `completeLogin()` 跳转逻辑** 把 L174-181 的以下代码: ```js uni.showToast({ title: '登录成功', icon: 'success' }) self.loading = false // 新用户,或存在待加入的家庭邀请(join.vue 已写入 pendingFamilyInviteCode): // 都进入个人信息完善页,填写家庭身份并提交加入申请 var hasPendingFamilyInvite = !!uni.getStorageSync('pendingFamilyInviteCode') if (data.needsRoleSelect || hasPendingFamilyInvite) { uni.redirectTo({ url: '/pages/user-edit/user-edit?token=' + data.token + '&userId=' + data.userId + '&autoParent=true' }) } else { self.handlePostLoginRouting() } ``` 替换为: ```js uni.showToast({ title: '登录成功', icon: 'success' }) self.loading = false // 注册零填写:新用户(needsRoleSelect)不再跳信息填写页,直接进首页 // 家庭邀请衔接:有 pendingFamilyInviteCode(join.vue 写入)→ 直接进 join-form 填真实姓名+家庭身份 var pendingInvite = uni.getStorageSync('pendingFamilyInviteCode') if (pendingInvite) { uni.redirectTo({ url: '/pages/invite/join-form?familyInviteCode=' + encodeURIComponent(pendingInvite) }) } else { self.handlePostLoginRouting() } ``` - [ ] **Step 2: 校验改动** `node --check` 无法直接检查 .vue,改为人工核对:确认 L174-181 区域替换正确、`hasPendingFamilyInvite` 变量不再被引用、无遗留语法错误(`uni.showToast`/`self.loading` 保持原位置)。 - [ ] **Step 3: 提交** ```bash git add cfc-frontend/pages/login/login.vue git commit -m "feat: 注册零填写-登录成功直接进首页,家庭邀请改跳join-form" ``` --- ### Task 2: user-edit.vue 停用新用户流程 **Files:** - Modify: `cfc-frontend/pages/user-edit/user-edit.vue:418-463`(onLoad)、`:754-768`(saveUserInfo 家庭邀请块)、`:48-57`(家庭身份模板区)、`:400-403`(hasPendingFamilyInvite computed) **Interfaces:** - Consumes: 无(不再接收 autoParent/needsRoleSelect 参数) - Produces: 纯编辑模式页面(个人中心入口) - [ ] **Step 1: 替换 `onLoad` 为新用户流程废弃版** 把 L418-463 整个 `onLoad(options) {...}` 替换为: ```js onLoad(options) { // 注册零填写改造:本页仅保留「个人中心编辑资料」用途 // 新用户注册不再跳转本页(autoParent / needsRoleSelect 参数已废弃,不再处理) this.showRoleSelect = false this.isEdit = true this.isNewUserFlow = false // 加载已有用户信息 this.loadUserInfo() // 加载会员等级(用于助手解锁) var self = this getMyMembership().then(function(res) { if (res.data && res.data.memberLevel) { self.memberLevel = res.data.memberLevel } }).catch(function() {}) }, ``` > 注意:`options` 参数不再使用,保留形参避免调用方报错。原 L419-449 的 autoParent/needsRoleSelect/phone 测试分支全部删除。 - [ ] **Step 2: 删除模板中家庭身份区块(L48-57)** 删除以下整段: ```html 👨‍👩‍👧‍👦 家庭身份(可选) 您在家庭中的身份 {{ form.familyRole || '请选择(可跳过)' }} 不选也可先保存,后续在家庭页面发起申请 ``` - [ ] **Step 3: 删除 `hasPendingFamilyInvite` computed** 删除 L400-403: ```js // 是否有待处理的家庭邀请码 hasPendingFamilyInvite: function() { return !!uni.getStorageSync('pendingFamilyInviteCode') }, ``` - [ ] **Step 4: 简化 `saveUserInfo()` 家庭邀请分支** L753-778 当前结构(含 `if (this.isNewUserFlow && this.hasPendingFamilyInvite) {...} else {...}`)。由于 `isNewUserFlow` 恒为 false,将整个 if/else 替换为 else 分支内容: ```js uni.showToast({ title: '保存成功', icon: 'success' }) setTimeout(() => { if (this.isNewUserFlow) { this.navigateToHome() } else { uni.navigateBack() } }, 1500) ``` > 保留 `if (this.isNewUserFlow)` 判断(恒 false 走 else 返回上一页),不硬删判断以最小化 diff。删除原 `var inviteCode = uni.getStorageSync('pendingFamilyInviteCode')`、`var familyRole = ...`、`requestJoinByCode` try/catch 块、`uni.removeStorageSync('pendingFamilyInviteCode')`。 - [ ] **Step 5: 校验** 人工核对:模板中不再引用 `hasPendingFamilyInvite`;`saveUserInfo` 无 `requestJoinByCode` / `pendingFamilyInviteCode` 引用;`isNewUserFlow` 仍存在 data 定义(恒 false,其他 v-if 引用无害)。检查 `onFamilyRoleChange` / `familyRoleOptions` / `familyRoleIndex` 若模板无引用则保留方法体不删(无害死代码)。 - [ ] **Step 6: 提交** ```bash git add cfc-frontend/pages/user-edit/user-edit.vue git commit -m "feat: 注册零填写-user-edit停用新用户流程仅保留编辑用途" ``` --- ### Task 3: 新增 pages/invite/join-form.vue(接受家庭邀请页) **Files:** - Create: `cfc-frontend/pages/invite/join-form.vue` - Modify: `cfc-frontend/pages.json`(pages/invite 分包注册) **Interfaces:** - Consumes: `uni.getStorageSync('token')`、路由参数 `familyInviteCode`、`checkUserFamily`(可不用)、`updateUserInfo`、`requestJoinByCode`(均来自 `@/utils/api.js`) - Produces: 接受家庭邀请提交(真实姓名+家庭身份必填);`uni.removeStorageSync('pendingFamilyInviteCode')` 消费完成 - [ ] **Step 1: 在 pages.json 注册页面** `pages.json` L1448-1458 的 `pages/invite` 分包 `pages` 数组中,`join` 条目后追加: ```json { "path": "join-form", "style": { "navigationBarTitleText": "加入家庭" } } ``` - [ ] **Step 2: 新建页面文件** 创建 `cfc-frontend/pages/invite/join-form.vue`,完整内容: ```vue ``` - [ ] **Step 3: 校验** `node --check`:从文件中提取 `