# 会员中心重设计 + 用户管理会员功能扩展 实现计划 > **面向 AI 代理的工作者:** 必需子技能:使用 superpowers:subagent-driven-development(推荐)或 superpowers:executing-plans 逐任务实现此计划。步骤使用复选框(`- [ ]`)语法来跟踪进度。 **目标:** 重设计会员中心为「统计卡 + 3 个 Tab 页签」,在用户管理增加「会员信息」修改入口,并让后台改会员等级时自动赠送 JOIN 优惠券(与小程序购买一致)。 **架构:** 前端 `cfc-web` Vue2 + Element UI 重构 MembershipCenter.vue 与 Users.vue;后端 `AdminController.updateMembershipUser` 注入 `CouponService`,等级实际变化后调用 `grantJoinCoupons` 送券(幂等)。不新增后端接口,全部复用现有 API。 **技术栈:** Vue 2 Options API + Element UI 2.15 / Spring Boot 2.7.18 + MyBatis-Plus + Java 8 --- ## 设计参考 规格文档:`docs/superpowers/specs/2026-08-30-membership-center-admin-redesign.md` 关键复用点: - 送券方法:`CouponService.grantJoinCoupons(Long userId, String levelCode, String source)`(幂等,period="JOIN" 唯一键防重) - 后端接口(已存在,前端复用): - `POST /api/admin/membership/user-update`(改 memberLevel + referrerId) - `POST /api/admin/membership/levels`(等级列表) - `POST /api/admin/membership/overview`(统计) - `POST /api/admin/membership/upgrade-records`(升级记录) - `POST /api/admin/user/search`(用户搜索) - 前端 API 封装(已存在): - `updateMembershipUser(data)` — `cfc-web/src/api/admin.js:719` - `searchUsers(params)` — `cfc-web/src/api/admin.js:1176` - `getUserList(params)` — `cfc-web/src/api/admin.js`(Users.vue) - 等级表 Tag 防御:`safeLevels` 计算属性(过滤 null/undefined/无 levelCode 元素)+ `v-if` 空值保护(避免 el-dialog v-show 白屏) --- ## 文件结构 | 文件 | 职责 | 操作 | |------|------|------| | `cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminController.java` | 注入 CouponService,改等级后送券 | 修改 | | `cfc-web/src/views/admin/MembershipCenter.vue` | 重设计:统计卡 + 3 Tab | 修改(重写 template + script + style) | | `cfc-web/src/views/Users.vue` | 新增「会员信息」按钮 + 弹窗 | 修改 | --- # 任务 1:后端 —— 改会员等级自动送券 **文件:** - 修改:`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminController.java` - 注入区(第 63-79 行附近):新增 CouponService 注入 - 导入区(第 11-12 行附近):新增 CouponService import - `updateMembershipUser`(第 1421-1433 行):等级变化分支追加送券 - [ ] **步骤 1:添加 CouponService import 与注入** 在现有 import 区(第 11-12 行 `import com.etotem.cfc.service.TaskService;` / `import com.etotem.cfc.service.UserService;`)之后,追加: ```java import com.etotem.cfc.service.CouponService; ``` 在注入区(现有 `@Resource private MemberUpgradeRecordMapper memberUpgradeRecordMapper;` 第 79 行之后)追加: ```java @Resource private CouponService couponService; ``` - [ ] **步骤 2:在等级变化分支追加送券** 修改 `updateMembershipUser` 中第 1421-1433 行的 `if (newLevel != null && !oldLevel.equals(newLevel))` 块,在现有的 `memberUpgradeRecordMapper.insert(record);` 之后(第 1432 行后)追加送券逻辑: ```java if (newLevel != null && !oldLevel.equals(newLevel)) { MemberUpgradeRecord record = new MemberUpgradeRecord(); record.setUserId(targetUserId); record.setFromLevel(oldLevel); record.setToLevel(newLevel); record.setUpgradeType("admin"); record.setApproveUserId(adminUserId); record.setApproveStatus("approved"); record.setApproveTime(new Date()); record.setApproveRemark("管理员会员维护"); record.setCreatedAt(new Date()); memberUpgradeRecordMapper.insert(record); // 等级变化后,按新等级发放 JOIN 会员券(与小程序购买会员一致,幂等防重) try { couponService.grantJoinCoupons(targetUserId, newLevel, "admin:" + adminUserId); } catch (Exception e) { // 送券失败不影响等级更新,仅记录日志 System.err.println("[Membership] 后台改等级发放JOIN会员券异常: userId=" + targetUserId + ", levelCode=" + newLevel + ", err=" + e.getMessage()); } } ``` - [ ] **步骤 3:编译验证** 运行: ```bash cd cfc-backend && mvn clean compile ``` 预期:BUILD SUCCESS,无编译错误。 - [ ] **步骤 4:Commit** ```bash git add cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminController.java git commit -m "feat(backend): 后台修改会员等级自动发放JOIN优惠券 - 与小程序购买一致(幂等防重)" ``` --- # 任务 2:重设计会员中心(MembershipCenter.vue) **文件:** - 重写:`cfc-web/src/views/admin/MembershipCenter.vue` 重写整个文件为「统计卡 + 3 个 Tab 页签」结构。内容较长,拆为 template、script、style 三个子步骤,每个子步骤内替换对应区块。 ## 步骤 2a:重写 template —— 统计卡 + Tab 容器 + Tab1 等级配置 - [ ] **步骤 2a-1:替换整个 `