# 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. 订单列表与订单详情。