## 目标 - 在运营管理新增“小程序二维码生成”,输入:`invite_code`、`douyin_id`,生成跳转到小程序登录页的二维码。 - 在小程序登录 API 支持绑定抖音账号,仅绑定 `douyin_id`。 ## 后端改造 - 数据模型 - 为 `users` 表新增字段:`douyin_id`(string,唯一,可空)。 - 迁移脚本添加唯一索引 `idx_users_douyin_id`;`gorm/gen` 重新生成模型。 - 生成二维码接口 - 新增管理端接口:`POST /api/admin/miniapp/qrcode` - 请求:`{ invite_code: string, douyin_id: string, width?: number }` - 响应:`{ image_base64: string }` - 实现:使用 `internal/pkg/wechat/qrcode.go` 构造 `path`(示例:`/pages/login?invite_code=xxx&douyin_id=yyy`),校验长度 ≤1024。 - 小程序登录绑定 - 修改 `internal/api/user/login_app.go` 的 `weixinLoginRequest`:新增可选 `douyin_id`。 - service 层 `LoginWeixin`: - 当请求含 `douyin_id` 且当前用户未绑定时,写入 `douyin_id`。 - 若 `douyin_id` 已被其他用户绑定,返回冲突错误码;不覆盖已有绑定。 ## 前端改造(运营管理) - 新增页面:`views/operations/miniapp-qrcode/index.vue` - 表单:`invite_code`、`douyin_id`、`width`(默认 430) - 调用 `admin/miniapp/qrcode`,预览与下载二维码。 - 小程序前端:登录页读取 query,将 `invite_code` 与 `douyin_id` 随 `code` 一并调用 `POST /api/app/users/weixin/login`。 ## 路由与校验 - 路由:新增 admin 路由于 `internal/router/router.go` 管理端认证组。 - 输入校验: - `invite_code`:非空、长度/字符集校验 - `douyin_id`:长度 1–50,字符集限制(字母数字下划线) - 唯一绑定策略:`douyin_id` 全局唯一;冲突返回明确错误码与提示。 ## 配置 - 使用现有 `configs.Wechat.AppID/AppSecret`;复用 `internal/pkg/wechat/qrcode.go`。 ## 验收 - 运营页生成二维码成功;扫码进入并完成登录绑定,用户记录含 `douyin_id`。 - 登录接口兼容无 `douyin_id` 场景;携带时正确绑定并处理冲突。 ## 变更清单 - 后端:新增 `miniapp_qrcode` 管理端接口;修改登录请求体与 service;数据库迁移与模型生成。 - 前端:新增运营二维码页面与 API;路由注册。 ## 风险与回滚 - 字段新增不影响旧流程;二维码功能为增量,回滚可移除新路由与页面。