日期:2026-08-30 分支:cfclub
MembershipCenter.vue(525行)功能混杂:统计卡片 + 等级配置表 + 升级记录表 + 会员维护卡片挤在一个长页面,体验差。Users.vue(436行)操作列只有「编辑」「更多」,无法直接修改用户会员等级/推荐人,需跳转会员中心。CouponService.grantJoinCoupons,与小程序购买一致。| 文件 | 改动 |
|---|---|
cfc-web/src/views/admin/MembershipCenter.vue |
重构:统计卡 + Tab 页签 |
cfc-web/src/views/Users.vue |
新增「会员信息」按钮 + 弹窗 |
cfc-backend/.../controller/admin/AdminController.java |
注入 CouponService,改等级后送券 |
cfc-web/src/api/admin.js |
无需新增 API(复用现有) |
POST /api/admin/membership/levels — 等级列表(5个:FREE/FAMILY/PROVIDER/PREMIUM/LIFETIME)POST /api/admin/membership/overview — 统计POST /api/admin/membership/upgrade-records — 升级记录(分页)POST /api/admin/membership/user-update — 改 memberLevel + referrerIdPOST /api/admin/user/search — 用户搜索┌──────────────────────────────────────────────┐
│ 统计卡 ×5(带图标+渐变底色) │
│ 免费用户 / FAMILY会员 / PROVIDER会员 / │
│ 本月新增 / 终身会员 │
├──────────────────────────────────────────────┤
│ 【会员等级配置】 【升级记录】 【会员维护】 │
├──────────────────────────────────────────────┤
│ Tab 内容区 │
└──────────────────────────────────────────────┘
v-if 懒渲染(避免空数据抛错,参考 safeLevels 防御)[编辑] [会员信息] [更多▼]
| 字段 | 类型 |
|---|---|
| 用户昵称 | 只读 |
| 手机号 | 只读 |
| 当前会员等级 | 下拉(带Tag区分默认值) |
| 推荐人ID | 输入框(留空不变/填0清除/填ID设定) |
| 到期时间 | 可选日期(非LIFETIME时显示) |
/api/admin/membership/user-updateAdminController.updateMembershipUser@Resource CouponService couponService;(需 import com.etotem.cfc.service.CouponService)在等级实际变化(newLevel != null && !oldLevel.equals(newLevel))且写入升级记录后,追加送券:
// 等级变化后,按新等级发放 JOIN 会员券(与小程序购买会员一致,幂等)
try {
couponService.grantJoinCoupons(targetUserId, newLevel, "admin:" + adminUserId);
} catch (Exception e) {
log.error("后台改等级发放JOIN会员券异常: userId={}, levelCode={}", targetUserId, newLevel, e);
}
CouponService.grantJoinCouponsgrant_type=JOIN 且 grant_level_code=levelCode 的 ACTIVE 券模板grant(userId, couponId, "JOIN", "JOIN", source) 发放uk_grant (user_id, coupon_id, grant_type, period) 唯一键防重 → 同一等级券不重复发放| 场景 | 是否送券 |
|---|---|
| FREE → FAMILY | ✅ 送 FAMILY JOIN 券 |
| FAMILY → LIFETIME | ✅ 送 LIFETIME JOIN 券(如有模板) |
| 只改推荐人(等级不变) | ❌ 不送 |
| 重复保存相同等级 | ❌ 不送(幂等) |
upgradeType="admin" 升级记录已存在,送券在其后执行"admin:" + adminUserId 标识后台来源cd cfc-backend && mvn clean compile(唯一验证方式)cd cfc-web && npm run serve -- --port 8083