2026-09-10-basic-membership-design.md 23 KB

浠艾福·体验会员(BASIC)PRD

文档版本:v1.0 创建日期:2026-09-10 状态:PRD 评审中


1. 产品背景与目标

1.1 背景

浠艾福平台当前会员体系仅有 FREE → FAMILY → PREMIUM → PROVIDER 四档,缺乏中间层:

  • 免费用户从未付费,转化路径过长(直接跳到 131.4 元/月)
  • 有尝试付费意愿但价格敏感的用户流失在免费层
  • 无法验证用户是否真正需要 AI 健康顾问、报告解读等高价值功能

1.2 目标

新增 BASIC(体验会员) 层级,定价 9.9 元/月,实现:

指标 目标值 说明
免费→BASIC 付费转化率 ≥ 3% 月活用户中完成首单的比例
BASIC→FAMILY 升级转化率 ≥ 15% BASIC 用户在有效期内的升级比例
BASIC 次月留存率 ≥ 40% 首月付费用户次月仍然活跃的比例
BASIC 月均 AI 对话次数 ≥ 2.5 次 月度配额 3 次中实际使用率

1.3 核心设计原则

  • 不是免费试用:TrialMembership(7 天免费)已存在,BASIC 是独立付费产品,二者不重叠
  • 限次不是限制,是钩子:配额制制造"用完还想用"的周期回归动力
  • 数据不消失:会员到期后成长记录、五维能量曲线等数据保留 30 天,迁移成本高是粘性本质
  • 软引导 > 硬屏蔽:让用户看到"我本来可以",而非"我被挡在外面"

2. 等级体系定位

FREE(免费)
    │  9.9元/月
    ▼
BASIC(体验会员)← 本 PRD
    │  131.4元/月(活动价)
    ▼
FAMILY(家庭会员)
    │
    ▼
PREMIUM(尊享会员)
    │
    ▼
PROVIDER(服务商)

2.1 BASIC 等级定义

字段 说明
level_code BASIC 数据库新增等级编码
level_name 体验会员 前端展示名
price_monthly 990(分) 9.9 元
price_quarterly NULL 不支持季付
price_yearly NULL 不支持年付
features 见 §3.2 功能权限 JSON
max_children 3 可添加孩子上限(FREE=0, FAMILY=10)
max_tasks_per_day 3 孩子每日任务上限
ai_review_enabled 0 不做 AI 审核
priority_support 0 不做
teacher_consultation 0 不做

2.2 与其他等级的核心差异

对比项 FREE BASIC FAMILY
月费 0 9.9 元 131.4 元
AI 对话 3 次/月 不限
报告解读 1 次/月 不限
测评预约 仅查看 1 次/月 不限
能量沙盘 🔒
专属教练 🔒 🔒 ✅ 月1次
管家分配 🔒 🔒

3. 功能权益矩阵

3.1 完整权益表

功能模块 子功能 FREE BASIC FAMILY PREMIUM BASIC 限制说明
五维能量 基础能量分
趋势曲线/对比 🔒 付费解锁深度数据
能量沙盘 🔒硬门禁 复用 UnlockGate.MEMBERSHIP
AI 服务 AI 健康顾问 3次/月 不限 不限 _lite 后缀配额型
报告 AI 解读 🔒 1次/月 不限 深度解读 _lite 后缀配额型
成长与测评 成长计划 创建 创建+基础查看 完整+模板 +教练随访 _lite 后缀
测评预约/订单 查看 1次/月 不限 不限+优先 _lite 后缀,硬门禁
成长记录 创建 创建+查看 完整+导出 完整+AI生成 资产型,不限制
任务/心愿 基础模板 更多模板 全部模板 +定制 _lite 后缀
健康与家庭 健康报告上传 2份/月 不限 不限+AI解析 _lite 后缀配额型
家庭邀请码 创建+邀请 完整关系图 完整 BASIC 是家庭功能入口
饮食推荐 基础 基础 个性化 深度定制 引流功能
商业与服务 积分商城 可见 可见+购买 可见+折扣 额外折扣
优惠券 平台券 会员券 专属券
专属健康教练 🔒 🔒软引导 ✅ 月1次 ✅ 周1次 FAMILY+ 专属
规划师一对一咨询 🔒 🔒软引导 ✅ 优先 核心变现保留
成长档案导出 🔒 🔒软引导 FAMILY+ 专属
管家分配(butler) 🔒 🔒软引导 ✅ 优先 FAMILY+ 专属

3.2 features JSON

[
  "free_activities",
  "free_courses",
  "discount_purchase",
  "invite_family",
  "mascot_ai_lite",
  "ai_report_reading_lite",
  "assessment_quota_lite",
  "health_report_upload_lite",
  "growth_plan_lite",
  "task_template_lite"
]

命名规范_lite 后缀表示"功能可用,但有月度配额限制",需在配额系统中额外校验。


4. 配额系统(粘性引擎)

4.1 设计决策

决策2:配额按 user_id(家长账号)独立,不按 family_id 共享。

理由

  • 一个家庭可能有多个家长账号,各人独立付费各自获得配额更公平
  • 与现有 User.memberLevel 语义一致(等级挂在用户级别)
  • 简化逻辑:不需要跨用户分摊配额

4.2 月度配额详情

配额类型 Code 配额上限 刷新周期 超限行为 对应 feature
AI_CHAT 3 次 每月 1 号 00:00 软引导:Toast "本月额度已用完,升级 FAMILY 享不限次" mascot_ai_lite
REPORT_READING 1 次 每月 1 号 00:00 软引导:Toast "本月报告解读额度已用完" ai_report_reading_lite
ASSESSMENT_QUOTA 1 次 每月 1 号 00:00 硬门禁:禁止创建预约,弹窗"测评预约为 FAMILY 专属" assessment_quota_lite
REPORT_UPLOAD 2 份 每月 1 号 00:00 软引导:显示"本月还可上传 X 份" health_report_upload_lite

4.3 配额存储模型

CREATE TABLE IF NOT EXISTS basic_quota_usage (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL COMMENT '家长用户ID(非family_id)',
    quota_type VARCHAR(30) NOT NULL COMMENT 'AI_CHAT/REPORT_READING/ASSESSMENT_QUOTA/REPORT_UPLOAD',
    used_count INT DEFAULT 0 COMMENT '本月已用次数',
    total_count INT NOT NULL COMMENT '月度总配额',
    period_start DATE NOT NULL COMMENT '周期开始日期(每月1号)',
    period_end DATE NOT NULL COMMENT '周期结束日期(月末)',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_user_type_period (user_id, quota_type, period_start),
    INDEX idx_user_period (user_id, period_start)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='BASIC会员月度配额使用记录';

5. 用户生命周期流转

5.1 核心路径

免费用户
  ↓ 浏览权益页 / 点击"9.9元开通体验"
支付 9.9 元(微信支付)
  ↓ 回调成功
激活 BASIC 等级:
  - user.memberLevel = "BASIC"
  - user.memberExpireTime = 30天后
  - family_memberships 写入 BASIC 记录
  - basic_quota_usage 初始化 4 类配额(used=0)
  ↓
使用期(第 1-30 天):
  - AI 对话 / 报告解读 / 测评预约 / 报告上传
  - 每次使用消耗对应配额
  - 配额接近耗尽时软引导提示
  ↓
第 25 天:推送到期提醒("还剩 5 天")
  ↓
第 30 天:到期降级为 FREE
  - user.memberLevel = "FREE"
  - user.memberExpireTime = null
  - family_memberships 标记 expired
  - basic_quota_usage 保留历史,不再刷新
  ↓
到期后 30 天内:数据保留,续费可恢复权益
  ↓ (可选)
升级 FAMILY:补差价(131.4 - 0 = 131.4 元,按剩余天数折算可选)

5.2 关键规则

  • 不做自动续费升级(决策1:A):到期后必须手动选择续费 BASIC 或升级 FAMILY
  • 到期不删数据:成长记录、五维能量曲线、健康报告保留 30 天
  • 配额不继承:到期后配额清零,续费/升级后重新分配

6. 软引导 vs 硬门禁 UX 规范

6.1 规则表

类型 触发条件 UI 表现 示例文案
硬门禁 测评预约超配额 弹窗阻断,仅显示"升级 FAMILY"按钮,禁止关闭后继续操作 "测评预约为 FAMILY 会员专属权益,升级后即可预约"
软引导 AI 对话超限 页面内 Toast,可关闭,保留"我知道了"和"了解权益"两个按钮 "您本月 AI 对话已用完(3/3),升级 FAMILY 享不限次畅聊"
软引导 报告解读超限 同上 "本月报告解读额度已用完,升级 FAMILY 解锁不限次深度解读"
进度可见 配额未用完 功能入口上方显示剩余次数进度条 "本月 AI 对话剩余 2 次"
软引导 报告上传超限 Toast + 上传按钮置灰 "本月报告上传额度已用完(2/2),升级 FAMILY 解锁更多"

6.2 弹窗统一组件

新建 UpgradeGuideModal.vue(小程序组件),统一处理所有软/硬引导场景:

  • 接收参数:type(soft/hard)、quotaTyperemainingtotal
  • 展示:图标 + 文案 + 行动按钮(硬门禁只有"升级",软引导有"知道了"+"了解详情")
  • 埋点:basic_upgrade_click 记录触发来源

7. 数据模型变更

7.1 membership_levels 新增种子数据

-- 在 DatabaseInitializer.runMigrations() 中添加:

// 迁移: membership_levels 新增 BASIC 体验会员等级
try {
    jdbcTemplate.execute("INSERT IGNORE INTO membership_levels " +
        "(level_code, level_name, level_desc, price_monthly, features, max_children, max_tasks_per_day) " +
        "VALUES ('BASIC', '体验会员', " +
        "'9.9元/月体验版,解锁核心功能,限次使用AI与报告解读', " +
        "990, " +
        "'[\"free_activities\",\"free_courses\",\"discount_purchase\",\"invite_family\",\"mascot_ai_lite\",\"ai_report_reading_lite\",\"assessment_quota_lite\",\"health_report_upload_lite\",\"growth_plan_lite\",\"task_template_lite\"]', " +
        "3, 3)");
    log.info("已初始化BASIC体验会员等级");
} catch (Exception e) {
    // 等级已存在,忽略
}

7.2 membership_benefits 新增 BASIC 权益

-- 在 DatabaseInitializer.runMigrations() 中添加:

// 迁移: membership_benefits 新增 BASIC 会员权益
try {
    jdbcTemplate.execute("INSERT IGNORE INTO membership_benefits " +
        "(level_code, benefit_code, benefit_name, benefit_desc, icon, bg_color, sort_order) VALUES " +
        "('BASIC', 'AI_CHAT_LITE', 'AI健康顾问(限3次/月)', '每月3次AI健康顾问问答', '🤖', '#DBEAFE', 1), " +
        "('BASIC', 'REPORT_READING_LITE', '报告解读(限1次/月)', '每月1次体检/测评报告AI解读', '📊', '#FCE7F3', 4), " +
        "('BASIC', 'GROWTH_PLAN_LITE', '基础成长计划', '创建成长计划但模板有限', '📋', '#FEF3C7', 3), " +
        "('BASIC', 'ASSESSMENT_QUOTA_LITE', '测评预约(限1次)', '每月可预约1次测评', '📝', '#E0E7FF', 8), " +
        "('BASIC', 'REPORT_UPLOAD_LITE', '健康报告上传(限2份/月)', '每月可上传2份健康报告', '📄', '#FEF9C3', 9)");
    log.info("已初始化BASIC会员权益列表");
} catch (Exception e) {
    // 已存在,忽略
}

7.3 新建 basic_quota_usage

CREATE TABLE IF NOT EXISTS basic_quota_usage (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL COMMENT '家长用户ID(非family_id)',
    quota_type VARCHAR(30) NOT NULL COMMENT 'AI_CHAT/REPORT_READING/ASSESSMENT_QUOTA/REPORT_UPLOAD',
    used_count INT DEFAULT 0 COMMENT '本月已用次数',
    total_count INT NOT NULL COMMENT '月度总配额',
    period_start DATE NOT NULL COMMENT '周期开始日期(每月1号)',
    period_end DATE NOT NULL COMMENT '周期结束日期(月末)',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_user_type_period (user_id, quota_type, period_start),
    INDEX idx_user_period (user_id, period_start)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='BASIC会员月度配额使用记录';

7.4 schema.sql 同步更新

  • schema.sql 末尾追加 basic_quota_usage 建表语句
  • membership_levels INSERT 补充 BASIC 等级 seed 数据
  • membership_benefits INSERT 补充 BASIC 权益 seed 数据

8. 接口变更清单

8.1 后端修改

8.1.1 MembershipService.canUseFeature() — 新增 BASIC 分支

// 在现有 FREE / FAMILY / PREMIUM / PROVIDER 分支之间插入:
if ("BASIC".equals(level)) {
    return "free_activities".equals(feature)
            || "free_courses".equals(feature)
            || "discount_purchase".equals(feature)
            || "invite_family".equals(feature)
            || "mascot_ai_lite".equals(feature)
            || "ai_report_reading_lite".equals(feature)
            || "assessment_quota_lite".equals(feature)
            || "health_report_upload_lite".equals(feature)
            || "growth_plan_lite".equals(feature)
            || "task_template_lite".equals(feature);
}

8.1.2 MembershipService.hasPermission() — 无需改

该接口已通过 features JSON 解析判断,BASIC 写入 features 后即自动支持,无需代码修改。

8.1.3 新增 BasicQuotaService.java

@Service
public class BasicQuotaService {

    // 查询指定用户指定月份某配额的剩余次数
    public QuotaStatusDTO getMonthlyQuota(Long userId, String quotaType);

    // 尝试扣减配额,返回是否成功(配额不足返回 false + 提示文案)
    public QuotaConsumeResult consumeQuota(Long userId, String quotaType);

    // 批量刷新所有 BASIC 用户当月的配额(定时任务调用)
    public void refreshMonthlyQuota();

    // 检查用户当前是否为有效的 BASIC 会员
    public boolean isActiveBasicMember(Long userId);

    // 获取 BASIC 用户到期时间
    public Date getExpireTime(Long userId);
}

QuotaStatusDTO

public class QuotaStatusDTO {
    private String quotaType;     // AI_CHAT / REPORT_READING / ...
    private int total;            // 总配额
    private int used;             // 已用
    private int remaining;        // 剩余
    private Date periodStart;     // 周期开始
    private Date periodEnd;       // 周期结束
}

QuotaConsumeResult

public class QuotaConsumeResult {
    private boolean success;      // 是否扣减成功
    private int remaining;        // 扣减后剩余
    private String toastMsg;      // 配额不足时的 Toast 文案(可为 null)
    private String actionUrl;     // 跳转升级页面的 URL(可为 null)
}

8.1.4 业务入口集成点

入口 Service 方法 集成逻辑
AiGateway.chat() 对话入口 先检查 isActiveBasicMember(userId),若 true 则调用 consumeQuota(AI_CHAT),失败返回 403 + 软引导文案
ReportSummaryService.parseReport() 报告解读 同上,quotaType=REPORT_READING
AssessmentAppointmentService.create() 创建测评预约 同上,quotaType=ASSESSMENT_QUOTA硬门禁,禁止继续
DanReportUploadService.upload() 报告上传 同上,quotaType=REPORT_UPLOAD,超限时隐藏上传按钮 + 显示进度提示

8.2 定时任务

Task Cron 职责
BasicQuotaRefreshTask 0 0 0 1 * ? 每月 1 号 00:00,遍历所有 BASIC 会员,重置 used_count=0,更新 period_start/period_end 为本月
BasicExpiryNoticeTask 0 0 10 * * ? 每天 10:00,查找 expireTime 在 1-5 天内的 BASIC 用户,推送微信模板消息提醒
BasicDowngradeExpiredTask 0 0 4 * * ? 每天 4:00,执行过期降级(复用现有 MembershipService.downgradeExpiredMembers(),需确认其支持 BASIC)

9. 前端变更清单

9.1 小程序(cfc-frontend)

页面/组件 变更类型 说明
会员权益页 pages/profile/membership 修改 新增 BASIC 卡片,读 membership_benefits BASIC 行动态渲染
会员开通页 pages/profile/upgrade 修改 新增"9.9元/月"选项,仅支持月付,不显示年付/季付
AI 对话入口 修改 显示"本月剩余 X/3 次",超限调用 UpgradeGuideModal(type=soft)
测评预约入口 修改 显示"本月剩余 X/1 次",超限调用 UpgradeGuideModal(type=hard) 并禁用按钮
报告上传/解读入口 修改 显示上传/解读剩余次数,超限软引导
个人中心-会员状态卡片 修改 显示"体验会员 · 剩余 X 天",倒计时到期
能量沙盘入口 无需改 UnlockGate.MEMBERSHIP 已覆盖(canUseFeature("mascot_ai_lite") = true)

9.2 新增组件

  • UpgradeGuideModal.vue:统一软/硬引导弹窗,参数化 typequotaType、文案
  • QuotaProgressBar.vue:配额进度条组件,通用展示"已用 X / 总额 Y"

9.3 Web 管理端(cfc-web)

页面 变更类型 说明
会员等级管理 修改 自动显示 BASIC 等级(读 DB)
BASIC 配额看板 新增 展示本月各配额使用率、BASIC 用户分布、到期提醒列表
配额手动重置接口 新增 运营可手动重置某用户的当月配额(应急用)

10. 埋点与数据指标

10.1 事件定义

事件名 触发时机 关键属性
basic_pay_click 点击"9.9元开通"按钮 from_page(会员页/升级页/弹窗)
basic_pay_success 支付回调成功 order_no, amount, family_id
basic_quota_consume 每次配额扣减 quota_type, remaining, period_start
basic_quota_exhausted 某类配额归零 quota_type, family_id, user_id
basic_upgrade_click 点击升级 FAMILY 按钮 trigger_type(quota_exhausted/expiry_near/manual)
basic_upgrade_success 升级支付成功 from_level, to_level, family_id, upgrade_amount
basic_expire_downgrade 到期自动降级 user_id, days_since_paid, has_data_retained
basic_renew_success 续费 BASIC user_id, renew_days

10.2 核心看板指标

  • BASIC 付费用户数 / 日(按 basic_quota_usage 首次写入 date 统计)
  • BASIC 月度配额使用率(各类型 used_count / total_count
  • BASIC→FAMILY 升级转化漏斗(付费→首次使用→配额耗尽→点击升级→支付成功)
  • BASIC 次月留存曲线(按首次付费月份分层)
  • BASIC 用户 ARPU(含交叉销售:商品、测评等)

11. 兼容性风险与缓解

风险点 影响 缓解方案
canUseFeature 硬编码分支遗漏 BASIC BASIC 用户调用新功能时报权限拒绝 单元测试覆盖所有 featureCode,发布前全量冒烟
现有 TrialMembership 与 BASIC 支付流程冲突 用户刚结束 7 天试用就被催促付费,体验差 Trial 结束第 8 天推"9.9 元续享权益"而非"开通会员",文案区分
配额刷新定时任务失败导致用户次月无配额 用户投诉、信任受损 任务幂等(先 DELETE 再 INSERT);增加手动重置接口;监控告警
MembershipService.downgradeExpiredMembers() 不识别 BASIC BASIC 到期后等级不降级 在现有方法中补充 BASIC 的判断逻辑
前端缓存导致权益页不显示 BASIC 新用户看不到 9.9 选项 版本号机制强制刷新;或在 MembershipController.getLevels() 接口中缓存 TTL=5 分钟
9.9 元价格过低冲击 FAMILY 定价 现有 FAMILY 用户要求退费改买 BASIC 1) BASIC 不支持年付 2) FAMILY 升级时展示"专属权益对比"价值锚定 3) 运营控制推送人群(仅免费活跃用户)
多家长同家庭各自持 BASIC 配额 配额按 user_id 独立,同一家庭可能有两个 BASIC 用户 这是决策2的预期行为,不做限制;但前端展示时统一显示家庭视角的汇总信息

12. 发布计划

阶段 时间 交付物 验收标准
P0 核心链路 T+3 天 DB 迁移 + BASIC 等级 + 支付开通 + 基础权限判断 9.9 元支付成功 → BASIC 生效 → 能进沙盘/AI 对话 3 次
P1 配额系统 T+5 天 BasicQuotaService + 4 个业务入口配额扣减 + 定时刷新 月度配额正确扣减/刷新,超限软/硬引导生效
P2 前端展示 T+7 天 权益页/开通页/配额显示/升级弹窗 免费用户可见 BASIC 卡片,付费后正确显示剩余次数
P3 运营配套 T+10 天 推送模板 + 埋点 + 管理端配额看板 到期提醒/额度耗尽提醒自动发送,看板数据可查
灰度/全量 T+12 天 5% → 20% → 100% 流量灰度 核心指标无异常波动,全量放开

13. 验收用例(关键路径)

用例 ID 场景 预期结果
UC-01 免费用户支付 9.9 元 user.memberLevel=BASICmemberExpireTime=30天后family_memberships 写入 BASIC 记录、basic_quota_usage 初始化 4 类配额(used=0)
UC-02 BASIC 用户第 1 次 AI 对话 canUseFeature(mascot_ai_lite)=true,配额扣减成功,remaining=2/3,返回对话结果
UC-03 BASIC 用户第 4 次 AI 对话 consumeQuota(AI_CHAT) 返回 false,前端 Toast "本月额度已用完(3/3),升级 FAMILY 享不限次"
UC-04 BASIC 用户第 2 次测评预约 consumeQuota(ASSESSMENT_QUOTA) 硬门禁,弹窗阻断,禁止继续操作
UC-05 月初定时任务刷新 所有 BASIC 用户 basic_quota_usage.used_count=0period_start 更新为本月 1 号
UC-06 BASIC 到期自动降级 downgradeExpiredMembers() 跑批,user.memberLevel=FREEmemberExpireTime=null,配额表保留历史但不刷新
UC-07 BASIC 到期前 5 天推送 收到微信模板消息"您的体验会员 5 天后到期,还有 X 次 AI 对话未使用"
UC-08 BASIC 用户升级 FAMILY 支付差价 → memberLevel=FAMILY,配额表停止扣减(FAMILY 走不限逻辑)
UC-09 同一家庭两个 BASIC 用户 各自配额独立(user_id 维度),互不影响
UC-10 Trial 结束当天推荐 BASIC 第 8 天推送"9.9 元续享权益"(非"开通会员"),文案与 Trial 区分

14. 已确认的设计决策

# 决策项 选择 说明
1 到期后是否自动升级 FAMILY A. 否 到期必须手动选择续费 BASIC 或升级 FAMILY,不做自动续费
2 配额按 family_id 还是 user_id 共享 B. 按 user_id 独立 每个家长账号独立配额,同一家庭多个 BASIC 用户配额互不干扰
3 是否做阶梯定价(首月 9.9/次月 19.9) A. 固定 9.9 元/月 价格透明,长期稳定,利于口碑和留存