Files
quyun-v2/specs/PRD.md
2025-12-15 17:55:32 +08:00

127 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 新项目 PRD多租户 + 微信登录/分享 + 余额支付)
## 1. 范围与约束
### 1.1 多租户(从第一天开始)
- 所有站点与 API 都在路径前缀下:`/t/:tenant_code/...`
- `tenant_code` 规则:不区分大小写,允许字符集 `a-z0-9_-`
- 系统内部以 `tenant_uuid`UUID作为租户在 OSS 的存储分区标识
- OSS Key`quyun/<tenant_uuid>/<md5>.<ext>`
- 数据隔离:所有业务表均包含 `tenant_id`,所有查询必须带 `tenant_id` 过滤
### 1.2 微信能力
- 保留微信网页授权登录OAuth、JS-SDK 签名与分享
- 移除:微信支付/退款/回调(多租户版本完全不支持,历史也不兼容)
### 1.3 支付能力
- 仅支持:余额支付(单位:分),后台可充值余额
- 可退款:仅余额订单(退款 = 返还余额 + 撤销授权)
### 1.4 技术栈约束
- 后端开发语言GolangGo
- 前端技术栈Vue 3 + Vite
- UI 组件库推荐PrimeVue配合 TailwindCSS性能较好且扩展/主题定制能力强)
---
## 2. 角色与端
### 2.1 WeChat H5 端C 端用户)
- 访问曲谱列表、搜索
- 查看曲谱详情
- 播放未购买只能播放“预览版short=true已购买播放“完整版short=false
- 余额购买
- 查看已购列表(快速播放)
- 查看个人资料与余额
- 分享JS-SDK
### 2.2 Admin 管理端(租户运营人员)
- 登录(租户维度账号)
- 仪表盘统计
- 媒体库管理:上传(预签名)、列表、预览、删除
- 曲谱管理:创建/编辑/发布/草稿、绑定媒体资源、设置封面≤3
- 用户管理:列表、详情、查看已购、给用户充值余额
- 订单管理:列表、退款(余额订单)
- 运营操作:赠送曲谱给指定用户
---
## 3. 核心业务对象
### 3.1 曲谱Post
- 字段标题、简介、正文、价格、折扣0~100、状态draft/published
- 关联媒体:
- `head_images`:封面媒体 ID 列表≤3
- `assets`:媒体资产数组(见 MediaAsset包含视频/音频/文件等
### 3.2 媒体Media
- 字段name、mime_type、size、hash(md5)、path(OSS key)、metas
- metas`short`(是否预览资源)、`duration``parent_hash`
- hash 去重:在租户维度内去重(同租户相同 md5 视为同一资源)
### 3.3 授权UserPosts
- 记录用户购买/赠送后获得的曲谱访问权
- 唯一约束:同一租户同一用户同一曲谱只能有一条
### 3.4 订单Order
- 仅余额订单:`payment_method = balance`
- 状态:`pending/completed/refund_success/cancelled`(具体枚举在技术规格中确定)
---
## 4. 关键流程
### 4.1 租户识别
- 进入任意页面时,根据 URL 中的 `:tenant_code` 识别租户
- 服务端需校验:
- code 正则:`^[a-z0-9_-]+$`(不区分大小写)
- code 存在且启用
- 解析成功后,将 `tenant_id``tenant_uuid` 注入到请求上下文
### 4.2 微信登录
1) 未登录请求 API → 401XHR或 302 → `/t/:tenant/v1/auth/wechat?redirect=...`
2) `/auth/wechat` 生成微信授权地址(回调到 `/t/:tenant/v1/auth/login` 并透传 redirect
3) `/auth/login` 换取 openid + 用户信息,按 `(tenant_id, open_id)` 获取或创建用户,签发会话 tokencookie
### 4.3 播放策略(预览/完整版)
- assets 中选择 `type == "video/mp4"` 的资源:
- 未购买:选择 `metas.short == true`
- 已购买:选择 `metas.short == false`
- 媒体 URL 通过 OSS 预签名下发
### 4.4 余额购买与授权
- 下单:创建订单 `pending`
- 校验余额足够:
- 足够:扣减余额 → 订单 `completed` → 写入 `user_posts`
- 不足:返回业务错误(提示联系管理员充值)
### 4.5 余额退款
- 仅允许对 `completed + payment_method=balance` 的订单退款
- 退款动作:
- 返还余额
- 删除/撤销 `user_posts` 授权
- 订单标记为 `refund_success`
---
## 5. 非功能性要求(简版)
- 所有写操作必须带租户隔离与鉴权校验
- 关键唯一约束在 DB 层实现(避免并发重复授权/重复订单号)
- 租户 UUID 由业务代码生成并写入(不依赖 DB 扩展)