446 lines
15 KiB
Markdown
446 lines
15 KiB
Markdown
# Work Admin 商城后台项目说明
|
||
|
||
本文是给后续开发者和大模型快速接手项目用的总览文档。进入仓库后应先读本文,再按需查看 `docs/README.md` 的第三方接口文档、`docs/database.md` 的数据库草案和 `docs/payment-integration.md` 的支付接入说明。
|
||
|
||
# 开发规范
|
||
|
||
- 进行最小颗粒的开发,每一个步骤开发完成请给我反馈。
|
||
- 当前项目是中文项目,请尽量在前端项目中使用中文。
|
||
- 所有的需要表格和查询的页面请参考`/list/search-table`的样式实现
|
||
|
||
## 一句话目标
|
||
|
||
建设一个商城系统订单与工单管理后台。系统既要兼容第三方课程/商品接口,也要支持平台自营分类和自营商品的售卖流程,并为后续支付能力预留完整订单与支付状态。
|
||
|
||
## 当前进度
|
||
|
||
已完成:
|
||
|
||
- 工程初始化已完成,当前是 pnpm monorepo。
|
||
- 前端位于 `packages/frontend`,基于 Next.js 16、React 18、Shadcn Admin 模板。
|
||
- 后端位于 `packages/backend`,基于 NestJS 11,默认开发端口 `3001`。
|
||
- 共享包位于 `packages/share`,用于沉淀前后端共用类型、常量和工具函数。
|
||
- `docs/README.md` 已整理第三方接口文档。
|
||
- `docs/database.md` 已记录数据库基础方向。
|
||
- `docs/migrations` 中已有分类、课程、接口日志索引、课程价格和内容字段相关 SQL 草案。
|
||
|
||
尚未完成:
|
||
|
||
- 后端业务模块、TypeORM 实体、数据库连接、鉴权、第三方调用封装仍需实现。
|
||
- 前端仍主要是 Shadcn Admin 模板页面,业务菜单和业务页面仍需替换/新增。
|
||
- 登录、权限、商品管理、下单、订单管理、工单、日志、支付均未形成完整业务闭环。
|
||
- 当前迁移草案更偏第三方课程缓存,后续需要扩展为同时支持第三方商品和自营商品的统一商城模型。
|
||
|
||
## 本地默认登录
|
||
|
||
- 管理员账号:`root`
|
||
- 管理员密码:`123456`
|
||
- 该账号仅用于本地开发。生产环境上线前必须修改密码,并禁止在文档或日志中暴露真实密码。
|
||
|
||
## 技术栈
|
||
|
||
- 包管理器:`pnpm@10.33.0`
|
||
- Monorepo:`pnpm-workspace.yaml`,workspace 范围为 `packages/*`
|
||
- 前端:React、TypeScript、Shadcn Admin 、Tailwind CSS 可按实际使用保留
|
||
- 后端:NestJS 11、TypeScript、MySQL、TypeORM
|
||
- 参数校验:Zod 或 NestJS DTO 校验管道
|
||
- 鉴权:NextAuth.js 或后端自建 Session/JWT,优先选择与 NestJS 后端一致的方案
|
||
- 密码哈希:bcrypt 或 argon2
|
||
- 密钥加密:Node crypto,用于第三方 `key` 等敏感信息
|
||
- 后续异步任务:Redis + BullMQ,可用于订单同步、支付补偿、日志拉取等
|
||
|
||
## 常用命令
|
||
|
||
- `pnpm dev`:同时启动前端和后端开发服务。
|
||
- `pnpm dev:frontend`:只启动前端,默认 `http://localhost:3000`。
|
||
- `pnpm dev:backend`:只启动后端,默认 `http://localhost:3001`。
|
||
- `pnpm lint`:运行前端、后端、共享模块的 ESLint 和 Stylelint。
|
||
- `pnpm test`:运行 workspace 测试。
|
||
- `pnpm build`:构建前端、后端和共享模块。
|
||
|
||
## 核心业务原则
|
||
|
||
### 统一商城模型
|
||
|
||
本项目不是单纯的第三方课程管理后台,而是商城后台。商品来源需要统一建模:
|
||
|
||
- `third_party`:第三方接口同步来的分类和商品。下单后需要由服务端调用第三方接口提交信息。
|
||
- `self_owned`:平台自己新建的分类和商品。下单后只需要写入本地数据库,不调用第三方下单接口。
|
||
|
||
建议分类、商品、订单都保留来源字段,例如:
|
||
|
||
- `source_type`: `third_party` 或 `self_owned`
|
||
- `external_id`: 第三方分类/商品/订单 ID,自营数据为空
|
||
- `provider`: 第三方供应商标识,当前默认可用 `biedawo`
|
||
- `fulfillment_type`: `third_party_api`、`local_only`、`manual`
|
||
|
||
### 商品售卖流程
|
||
|
||
第三方商品:
|
||
|
||
1. 后台同步第三方分类:`act=getcate`。
|
||
2. 后台同步第三方课程/商品:`act=getclass`。
|
||
3. 用户/管理员输入学校、账号、密码、项目 ID 查课:`act=get`。
|
||
4. 选择课程并创建订单。
|
||
5. 如果订单已支付或后台允许先提交,则服务端调用第三方下单:`act=add`。
|
||
6. 保存第三方请求、脱敏后的响应、第三方订单号和本地订单状态。
|
||
|
||
自营商品:
|
||
|
||
1. 后台手动创建分类和商品。
|
||
2. 商品可配置价格、上下架状态、库存/限购、交付类型、售后规则等。
|
||
3. 用户/管理员创建订单时只写入本地订单、订单明细和交付记录。
|
||
4. 不调用第三方 `get`、`add`、`orders` 等接口。
|
||
5. 后续可由后台人工处理、自动发货或扩展为其他自营交付流程。
|
||
|
||
### 支付预留
|
||
|
||
订单创建后应进入 `pending_payment`,支付成功后再进入后续履约流程:
|
||
|
||
- 第三方商品:支付成功后调用第三方下单接口,成功后进入 `submitted` 或 `processing`。
|
||
- 自营商品:支付成功后生成本地交付记录,进入 `paid`、`processing` 或 `completed`,具体取决于交付类型。
|
||
|
||
支付接入详情见 `docs/payment-integration.md`。
|
||
|
||
## 核心业务模块
|
||
|
||
### 1. 用户与权限
|
||
|
||
- 管理员登录。
|
||
- 用户管理、用户注册。
|
||
- 角色权限:超级管理员、普通用户。
|
||
- 操作审计日志。
|
||
- 登录日志。
|
||
|
||
### 2. 商品分类与商品管理
|
||
|
||
第三方分类和商品:
|
||
|
||
- 同步第三方分类:`act=getcate`。
|
||
- 同步第三方课程/商品:`act=getclass`。
|
||
- 本地缓存第三方分类和商品。
|
||
- 支持手动同步和刷新。
|
||
- 第三方商品必须标记 `source_type=third_party`,并保存第三方项目 ID、课程 ID、原始关键信息或结构化字段。
|
||
|
||
自营分类和商品:
|
||
|
||
- 后台新建、编辑、删除/停用自营分类。
|
||
- 后台新建、编辑、上下架自营商品。
|
||
- 支持价格、商品描述、库存、排序、封面、售后说明、交付类型等字段。
|
||
- 自营商品必须标记 `source_type=self_owned`。
|
||
|
||
### 3. 第三方 API 账号与调用日志
|
||
|
||
- 基础地址默认 `https://biedawo.org/api.php`。
|
||
- 当前推荐通过 `.env` 配置 `WK_BASE_URL`、`WK_APP_UID`、`WK_APP_KEY`。
|
||
- `WK_APP_KEY` 原样作为第三方 `key` 使用,前端和日志展示时必须脱敏。
|
||
- 排查第三方请求参数时,可临时设置 `WK_DEBUG_LOG=true`,后端控制台会输出脱敏后的请求 URL、form body、响应状态和响应内容。
|
||
- 支持接口连接测试。
|
||
- 所有第三方调用都必须写入接口调用日志,包括 act、耗时、状态、失败原因、脱敏请求、脱敏响应。
|
||
- 前端不得直接请求第三方 API。
|
||
|
||
### 4. 查课与下单
|
||
|
||
第三方商品查课:
|
||
|
||
- 查课接口:`act=get`。
|
||
- 输入学校、账号、密码、项目 ID。
|
||
- 展示可下单课程。
|
||
- 支持通用 `expand` 参数。
|
||
- 支持恐龙项目 `expand.konglong` 参数。
|
||
|
||
统一下单:
|
||
|
||
- 创建本地订单时先识别商品来源。
|
||
- 第三方商品按第三方流程提交。
|
||
- 自营商品只写入本地数据库。
|
||
- 下单请求与响应必须落库,敏感字段必须脱敏展示。
|
||
- 下单失败时展示第三方返回信息或本地错误信息。
|
||
|
||
### 5. 订单管理
|
||
|
||
第三方订单相关接口:
|
||
|
||
- 获取订单:`act=orders`
|
||
- 查单:`act=chadan`
|
||
- 补单:`act=budan`
|
||
- 改密:`act=gaimi`
|
||
- 暂停:`act=stop`
|
||
- 优先学习:`act=priority`
|
||
- 课程转换:`act=convert`
|
||
- 修改时长:`act=update_time`
|
||
- 修改周期:`act=update_cycle`
|
||
|
||
功能:
|
||
|
||
- 订单列表。
|
||
- 订单详情。
|
||
- 按订单 ID、账号、学校、课程、状态、来源、项目筛选。
|
||
- 第三方订单支持查单刷新、补单、改密、暂停、优先学习、课程转换、修改时长、修改周期。
|
||
- 自营订单支持本地发货、备注、关闭、退款标记、售后处理等本地操作。
|
||
- 所有操作写入 `order_actions` 或统一审计日志。
|
||
|
||
### 6. 日志管理
|
||
|
||
第三方日志接口:
|
||
|
||
- 恐龙 Stream 日志:`/api/streamLogs`
|
||
- 普通日志:`act=cha_logwk`
|
||
- zhs 明细:`act=cha_log`
|
||
- 易教育学习记录:`act=get_yjy_study_log`
|
||
|
||
功能:
|
||
|
||
- 订单日志查询。
|
||
- Stream 日志实时展示。
|
||
- 日志内容格式化展示。
|
||
- 日志查询历史记录。
|
||
- 异常日志标记。
|
||
|
||
### 7. 工单管理
|
||
|
||
第三方工单接口:
|
||
|
||
- 上传工单图片:`act=uploadTicketImage`
|
||
- 提交工单:`act=submitWorkOrder`
|
||
- 查询工单:`act=queryWorkOrder`
|
||
|
||
功能:
|
||
|
||
- 工单图片上传。
|
||
- 附件预览。
|
||
- 提交工单。
|
||
- 查询工单状态。
|
||
- 本地保存工单记录。
|
||
- 工单状态映射展示。
|
||
- 限制同一订单重复创建工单。
|
||
- 自营订单也应支持本地工单,必要时不调用第三方工单接口。
|
||
|
||
工单状态映射:
|
||
|
||
| 状态值 | 状态文本 | 说明 |
|
||
| --- | --- | --- |
|
||
| 1 | 待处理 | 已创建,等待处理 |
|
||
| 2 | 处理中 | 管理员处理中 |
|
||
| 3 | 已回复 | 等待用户确认 |
|
||
| 4 | 已解决 | 工单已解决 |
|
||
| 5 | 已关闭 | 工单关闭 |
|
||
| 6 | 已取消 | 工单取消 |
|
||
|
||
### 8. 支付管理
|
||
|
||
支付模块需要预留并逐步实现:
|
||
|
||
- 支付渠道配置。
|
||
- 创建支付单。
|
||
- 支付回调验签。
|
||
- 支付状态同步。
|
||
- 退款申请和退款回调。
|
||
- 支付日志和回调日志。
|
||
- 支付成功后触发对应订单履约。
|
||
|
||
详细接入文档见 `docs/payment-integration.md`。
|
||
|
||
## 第三方接口摘要
|
||
|
||
通用规则:
|
||
|
||
- 除 `/api/streamLogs` 外,所有接口使用 `POST`。
|
||
- 请求头使用 `Content-Type: application/x-www-form-urlencoded`。
|
||
- 基础 URL 为 `https://biedawo.org/api.php`。
|
||
- 常规响应格式为 JSON。
|
||
- `/api/streamLogs` 为 GET 请求,响应为 Stream 格式。
|
||
|
||
接口清单详见 `docs/README.md`。实现时不要把 `uid`、`key`、学生账号、学生密码暴露给前端。
|
||
|
||
## 下单 expand 参数
|
||
|
||
通用字段:
|
||
|
||
```json
|
||
{
|
||
"score": 95,
|
||
"duration": 35,
|
||
"period": 7,
|
||
"staticIds": [1, 2]
|
||
}
|
||
```
|
||
|
||
恐龙项目字段:
|
||
|
||
```json
|
||
{
|
||
"konglong": {
|
||
"remark": ["urgent", "code_ready"],
|
||
"city": "beijing",
|
||
"tag": "vip",
|
||
"config": {
|
||
"useTime": 60,
|
||
"code": "888888"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
## 建议数据模型方向
|
||
|
||
后续不要把第三方课程和自营商品拆成两套完全独立的业务主干。建议使用统一主表并通过来源字段分流:
|
||
|
||
- `categories`:分类表,支持 `source_type`、`provider`、`external_id`。
|
||
- `products` :商品表,支持第三方课程和自营商品。
|
||
- `product_skus`:如后续商品存在规格、套餐、周期,可新增 SKU。
|
||
- `orders`:订单主表,记录用户、金额、支付状态、履约状态、来源摘要。
|
||
- `order_items`:订单明细,记录商品快照。
|
||
- `order_fulfillments`:履约记录,区分第三方 API 提交和本地交付。
|
||
- `payments`:支付单,记录支付渠道、支付金额、支付状态、渠道流水号。
|
||
- `payment_events`:支付回调和主动查询日志。
|
||
- `refunds`:退款单。
|
||
- `api_call_logs`:第三方接口调用日志。
|
||
- `audit_logs`:后台操作审计日志。
|
||
|
||
## 开发阶段计划
|
||
|
||
### 阶段 1:项目初始化
|
||
|
||
状态:基本完成。
|
||
|
||
- 建立 monorepo。
|
||
- 建立前端、后端、共享包。
|
||
- 保留 Shadcn Admin 后台模板。
|
||
- 准备基础 lint、test、build 命令。
|
||
|
||
验收标准:
|
||
|
||
- 可以启动本地开发服务。
|
||
- 可以访问登录页和后台首页。
|
||
- 后端服务可以启动。
|
||
|
||
### 阶段 2:数据库、鉴权与基础后台
|
||
|
||
状态:待开发。
|
||
|
||
- 接入 MySQL 和 TypeORM。
|
||
- 建立用户、角色、登录日志、审计日志基础表。
|
||
- 实现管理员登录。
|
||
- 实现 Session/JWT 鉴权。
|
||
- 未登录不能访问后台页面。
|
||
|
||
建议:
|
||
- 强制改密时自动跳转账号安全页
|
||
- 权限配置更细的资源枚举
|
||
- 日志导出
|
||
|
||
### 阶段 3:第三方 API 封装与接口日志
|
||
|
||
状态:待开发。
|
||
|
||
- 封装第三方通用调用客户端。
|
||
- 从环境变量读取 `WK_BASE_URL`、`WK_APP_UID`、`WK_APP_KEY`。
|
||
- 实现连接测试。
|
||
|
||
### 阶段 4:分类与商品
|
||
|
||
- 同步第三方分类和商品。
|
||
- 新建自营分类和商品。
|
||
- 商品列表同时展示第三方商品和自营商品。
|
||
- 商品来源、状态、价格、描述、排序可管理。
|
||
|
||
验收标准:
|
||
|
||
- 可以同步第三方分类数据。
|
||
- 可以同步第三方商品数据。
|
||
- 可以创建自营分类。
|
||
- 可以创建自营商品。
|
||
|
||
### 阶段 5:查课、购物车/下单与支付预留
|
||
|
||
状态:待开发。
|
||
|
||
- 第三方商品支持查课。
|
||
- 统一创建本地订单。
|
||
- 订单创建后默认待支付。
|
||
- 支付能力先预留表结构、状态和接口边界。
|
||
- 支付成功后按商品来源触发履约。
|
||
|
||
验收标准:
|
||
|
||
- 第三方商品可以查课后创建订单。
|
||
- 自营商品可以直接创建本地订单。
|
||
- 订单能区分 `pending_payment`、`paid`、`submitted` 等状态。
|
||
|
||
### 阶段 6:订单管理与第三方订单操作
|
||
|
||
状态:待开发。
|
||
|
||
- 订单列表和详情页。
|
||
- 第三方订单同步和查单刷新。
|
||
- 第三方订单补单、改密、暂停、优先学习、课程转换、修改时长、修改周期。
|
||
- 自营订单本地发货、关闭、备注、售后处理。
|
||
- 所有操作写入操作记录。
|
||
|
||
### 阶段 7:日志管理
|
||
|
||
状态:待开发。
|
||
|
||
- 普通日志查询。
|
||
- zhs 明细查询。
|
||
- 易教育学习记录查询。
|
||
- `/api/streamLogs` 服务端代理。
|
||
- 日志查看页面。
|
||
|
||
### 阶段 8:工单管理
|
||
|
||
状态:待开发。
|
||
|
||
- 第三方工单图片上传。
|
||
- 第三方工单提交和查询。
|
||
- 自营本地工单。
|
||
- 附件上传与预览。
|
||
- 工单与本地订单关联。
|
||
|
||
### 阶段 9:支付接入
|
||
|
||
状态:预留,待开发。
|
||
|
||
- 按 `docs/payment-integration.md` 实现支付渠道、支付单、回调、退款和补偿。
|
||
- 支付成功后触发第三方下单或自营履约。
|
||
- 支付失败、超时、重复回调、金额不一致都要有明确处理。
|
||
|
||
### 阶段 10:安全、审计与体验优化
|
||
|
||
状态:待开发。
|
||
|
||
- 敏感字段脱敏显示。
|
||
- 操作审计。
|
||
- 接口错误统一处理。
|
||
- 请求超时与重试策略。
|
||
- 表格筛选、分页、批量操作。
|
||
- 数据备份说明。
|
||
- 生产部署说明。
|
||
|
||
## 安全要求
|
||
|
||
- 第三方 `key` 必须加密保存或只通过安全环境变量读取。
|
||
- 学生密码、第三方密钥、支付密钥、请求原文中的敏感字段展示时必须脱敏。
|
||
- 前端不得直接请求第三方 API。
|
||
- 前端不得直接处理支付渠道私钥、商户密钥、第三方 API key。
|
||
- 第三方 API 调用必须经过服务端封装。
|
||
- 支付回调必须验签,并校验金额、订单号、支付状态。
|
||
- 所有订单操作、工单操作、配置修改、支付状态变更必须写入审计或事件日志。
|
||
- 上传文件需要限制类型和大小。
|
||
|
||
## 当前最高优先级
|
||
|
||
最小可行版本优先完成:
|
||
|
||
1. 数据库连接、TypeORM 基础实体和迁移机制。
|
||
2. 登录与权限。
|
||
3. 第三方 API 封装与调用日志。
|
||
4. 统一分类和商品模型,兼容第三方与自营。
|
||
5. 第三方分类/商品同步。
|
||
6. 自营分类/商品管理。
|
||
7. 查课。
|
||
8. 统一创建订单,并预留支付状态。
|
||
9. 第三方商品支付后提交第三方订单,自营商品支付后写入本地履约。
|
||
10. 订单列表与订单详情。
|