Skip to content

集合:徽章进度(badges)

字数
900 字
阅读时间
4 分钟

1. 目的与使用场景

  • 记录用户在徽章成就体系中的解锁状态与进度,支撑“我的”页徽章墙、任务激励、推送通知。由 /api/badges、周报生成、激励云函数写入。

2. Schema 定义

字段类型必填默认值约束/校验说明隐私分级
_idstring-TCB 自动主键P1
user_id指针id-指向 users._id用户P1
badge_codestring-枚举(consistency_7d,consistency_30d,guardian_connect,community_support,task_master)徽章编码P1
statusstringlocked枚举(locked,in_progress,unlocked)当前状态P1
progress_valuenumber0≥0当前进度P1
progress_targetnumber0≥0目标P1
progress_detailobject-{last_event, streak_days}进度详情P1
unlocked_atdate-ISO 字符串解锁时间P1
first_completed_atdate-ISO 字符串首次达成时间P1
sourcestringsystem枚举(system,ops)更新来源P1
createdAtdate-服务端时间创建时间P1
updatedAtdate-服务端时间更新时间P1

3. 索引与唯一约束

  • 单字段索引:user_id, badge_code
  • 复合索引:[user_id, badge_code]
  • 唯一性约束:[user_id, badge_code]
  • 设计理由:用户徽章需要快速查询;每种徽章仅一条记录。

4. 访问控制(TCB 权限)

json
{
  "read": "user_id == auth.uid || auth.role in ['ops']",
  "write": "auth.role in ['badge_service','ops']"
}

徽章服务负责写入;用户只读自身进度。

  1. 关系与级联
  • user_idusers
  • eventstaskscheckins 等集合通过统计逻辑关联
  • 删除策略:用户注销时软删;保留匿名统计。
  • 反范式:progress_detail 缓存 streak 等信息,避免实时计算。
  1. 数据生命周期与合规
  • 留存:随账号存在;注销后保留匿名指标 180 天。
  • 匿名化:导出时移除 user_id,按批次聚合。
  • 审计:createdAtupdatedAtsource
  1. API/云函数契约映射 | 接口/函数 | 读/写 | 使用字段 | 过滤条件 | 排序/分页 | 备注 | | /api/badges GET | 读 | badge_code, status, progress_value, progress_target, unlocked_at | user_id = auth.uid | - | 我的页徽章墙 | | /api/badges PATCH | 写 | status, unlocked_at | _id | - | 补发徽章 | | 激励云函数 updateBadgeProgress | 写 | badge_code, progress_value, progress_detail, status | user_id | - | 根据行为事件更新 | | 周报生成器 | 读 | status, unlocked_at, badge_code | user_id, 时间范围 | - | 周报成就区域 |

  2. 示例文档(≥3条)

json
{
  "_id": "badge_usr001_7d",
  "user_id": "usr_001",
  "badge_code": "consistency_7d",
  "status": "unlocked",
  "progress_value": 7,
  "progress_target": 7,
  "progress_detail": {"streak_days": 7, "last_event": "2024-04-06"},
  "unlocked_at": "2024-04-06T23:00:00Z",
  "createdAt": "2024-03-31T00:00:00Z",
  "updatedAt": "2024-04-06T23:00:00Z"
}
{
  "_id": "badge_usr001_support",
  "user_id": "usr_001",
  "badge_code": "community_support",
  "status": "in_progress",
  "progress_value": 12,
  "progress_target": 20,
  "progress_detail": {"last_event": "2024-04-05T15:35:00Z"},
  "createdAt": "2024-04-01T08:00:00Z",
  "updatedAt": "2024-04-05T15:35:00Z"
}
{
  "_id": "badge_usr002_guardian",
  "user_id": "usr_002",
  "badge_code": "guardian_connect",
  "status": "locked",
  "progress_value": 0,
  "progress_target": 1,
  "createdAt": "2024-03-20T10:00:00Z",
  "updatedAt": "2024-03-20T10:00:00Z"
}
  1. 常用查询样例(≥3条)
javascript
// 用户徽章列表
const badges = await db.collection('badges').where({ user_id: auth.uid }).get();

// 统计已解锁徽章数量
const unlockedCount = await db.collection('badges').where({
  user_id: auth.uid,
  status: 'unlocked'
}).count();

// 运营查看某徽章解锁用户
const unlockedUsers = await db.collection('badges').where({
  badge_code: 'consistency_30d',
  status: 'unlocked'
}).orderBy('unlocked_at', 'desc').limit(100).get();
  1. 边界与错误码
  • 重复解锁:已 unlocked 再次更新返回 E_BADGE_ALREADY_UNLOCKED
  • 越权写入:非授权角色返回 E_FORBIDDEN
  • 进度回退:小于当前进度返回 E_BADGE_PROGRESS_INVALID
  1. 变更影响评估
  • 新徽章需同步 /api/badges、徽章配置文件、埋点 badge_unlock
  • 索引调整影响我的页加载速度与激励统计。
  1. 假设与待确认
  • 假设徽章配置表存放于云函数配置,待确认是否需要 badge_catalog 集合。
  • 待确认 progress_detail 是否需记录更多维度(如来源事件列表)。

贡献者

The avatar of contributor named as Cai Hongyu Cai Hongyu

文件历史

撰写