## 概述 为 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.go`:`ListUserInventoryForApp()`(调用 `usersvc.ListInventoryWithProduct`) - `internal/api/user/titles_app.go`:`ListUserTitlesForApp()`(新增 usersvc 方法或复用 admin 服务逻辑) - `internal/api/user/backpack_app.go`:`GetUserBackpackOverview()`(各服务查询计数与最近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` 校验一致性,防越权 - 分页统一:`page`、`page_size`(默认 1/20,最大 100),按 `created_at` 倒序 ## Swagger 文档 - 为新增 3 个接口添加注解:`@Summary`、`@Description`、`@Tags APP端.用户`、`@Security LoginVerifyToken`、`@Param`、`@Success`/`@Failure`、`@Router` - 模型定义共用已有结构;为新结构 `UserTitleItem`、`InventoryWithProduct` 增加定义 - 执行脚本生成文档:`scripts/swagger.sh` ## 测试与验收 - 单元/集成: - 伪造用户会话,验证分页与鉴权;数据空集场景返回空数组 - 概要接口在 `include` 过滤时仅返回所选分组 - 手工验证: - 分别对六类接口 `curl` 测试分页与计数一致性 - Swagger 文档能正确展示并可试用 ## 验收标准 - 三个新增接口可用且鉴权正确;分页与计数正确 - 概要接口耗时可控(<200ms 在百条内数据量);可通过 `include` 控制 - 文档完整,前端对接字段明确;无越权与泄露