bindbox-game/.trae/documents/Implement Backpack API for App Users.md
邹方成 45815bfb7d chore: 清理无用文件与优化代码结构
refactor(utils): 修复密码哈希比较逻辑错误
feat(user): 新增按状态筛选优惠券接口
docs: 添加虚拟发货与任务中心相关文档
fix(wechat): 修正Code2Session上下文传递问题
test: 补充订单折扣与积分转换测试用例
build: 更新配置文件与构建脚本
style: 清理多余的空行与注释
2025-12-18 17:35:55 +08:00

4.4 KiB
Raw Blame History

概述

为 APP 端提供“用户背包”能力,覆盖用户资产的六类数据:积分消费明细、优惠券、道具卡、头衔、订单、中奖资产(背包)。在保留现有分项查询接口的基础上,新增缺失的 APP 端接口与一个聚合概要接口,统一鉴权与分页规范,并更新 API 文档。

新增接口

  • GET /api/app/users/{user_id}/inventory
    • 功能:用户背包列表(中奖资产),按时间倒序,支持分页
    • 返回:InventoryWithProduct 列表(含商品名称、图片、等级/备注、关联活动/奖励ID
    • 鉴权:LoginVerifyToken
  • GET /api/app/users/{user_id}/titles
    • 功能:用户头衔列表,支持分页
    • 返回:UserTitleItem 列表称号ID、名称、来源/获得时间、可选效果)
    • 鉴权:LoginVerifyToken
  • GET /api/app/users/{user_id}/backpack
    • 功能:聚合概要接口,返回六类资产的“计数+最近N条”用于首页/概览展示
    • 查询参数:limit=5(各类最近条数),include=points,coupons,item_cards,titles,orders,inventory(可选,默认全包含)
    • 返回:
      • points: {count, recent: UserPointsLedger[]}
      • coupons: {count, recent: CouponItem[]}
      • item_cards: {count, recent: ItemCardWithTemplate[]}
      • titles: {count, recent: UserTitleItem[]}
      • orders: {count, recent: Orders[]}
      • inventory: {count, recent: InventoryWithProduct[]}
    • 鉴权:LoginVerifyToken

复用现有 APP 接口(保持不变)

  • 积分明细GET /api/app/users/{user_id}/points(已存在)
  • 积分余额GET /api/app/users/{user_id}/points/balance(已存在)
  • 优惠券GET /api/app/users/{user_id}/coupons(已存在)
  • 道具卡GET /api/app/users/{user_id}/item_cards、GET /api/app/users/{user_id}/item_cards/uses(已存在)
  • 订单GET /api/app/users/{user_id}/orders(已存在)

数据模型(响应结构)

  • InventoryWithProduct{ id, product_id, title, images[], activity_id, reward_id, order_id, level, created_at }
  • UserTitleItem{ user_title_id, title_id, title_name, acquired_at, effects?: [{key, value, unit}], expires_at? }
  • CouponItem(沿用现有):{ id, name, amount, valid_start, valid_end, status, rules }
  • ItemCardWithTemplate(沿用现有):含模板字段与剩余次数/有效期
  • Orders(沿用现有):按现有模型返回
  • UserPointsLedger(沿用现有):按现有模型返回

技术实现

  • 目录与文件:
    • internal/api/user/inventory_app.goListUserInventoryForApp()(调用 usersvc.ListInventoryWithProduct
    • internal/api/user/titles_app.goListUserTitlesForApp()(新增 usersvc 方法或复用 admin 服务逻辑)
    • internal/api/user/backpack_app.goGetUserBackpackOverview()各服务查询计数与最近N条
  • 路由:internal/router/router.go
    • APP 认证组注册:/users/:user_id/inventory/users/:user_id/titles/users/:user_id/backpack
  • Service 层:internal/service/user
    • ListInventoryWithProduct(ctx, userID, page, pageSize)(已有)
    • ListUserTitles(ctx, userID, page, pageSize)(新增):查询用户称号关联与系统称号名称/效果
    • 计数方法:各类 CountXxx(ctx, userID)(供概要接口聚合)

鉴权与约束

  • 所有接口使用 LoginVerifyToken
  • user_id 为路径参数,但服务端以会话 SessionUserInfo().Id 校验一致性,防越权
  • 分页统一:pagepage_size(默认 1/20最大 100created_at 倒序

Swagger 文档

  • 为新增 3 个接口添加注解:@Summary@Description@Tags APP端.用户@Security LoginVerifyToken@Param@Success/@Failure@Router
  • 模型定义共用已有结构;为新结构 UserTitleItemInventoryWithProduct 增加定义
  • 执行脚本生成文档:scripts/swagger.sh

测试与验收

  • 单元/集成:
    • 伪造用户会话,验证分页与鉴权;数据空集场景返回空数组
    • 概要接口在 include 过滤时仅返回所选分组
  • 手工验证:
    • 分别对六类接口 curl 测试分页与计数一致性
    • Swagger 文档能正确展示并可试用

验收标准

  • 三个新增接口可用且鉴权正确;分页与计数正确
  • 概要接口耗时可控(<200ms 在百条内数据量);可通过 include 控制
  • 文档完整,前端对接字段明确;无越权与泄露