Files

446 lines
15 KiB
Markdown
Raw Permalink 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.
# 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. 订单列表与订单详情。