# supplied-service 供应商业务后端,为 supplied-h5、supplied-admin 和 zhgh 平台对接提供接口。当前 HTTP 入口为 `src/server.ts`,默认端口为 `8888`。 ## 技术栈 - Koa、TypeScript:HTTP 服务与业务逻辑。 - Prisma、MySQL:数据库访问与模型定义。 - Redis:平台桥接 Token 缓存。 - MinIO:文件对象存储。 - Node.js crypto:管理端密码哈希与随机登录 Token。 ## 目录结构 ```text src/ server.ts # Koa 入口、路由分发、管理端登录校验 controllers/ # 请求解析与响应封装 services/ # 业务逻辑 dao/ # 数据访问 functions/ # 导出各接口处理器 utils/ # 数据库、日志、平台桥接等工具 types/ # 公共类型 prisma/ schema.prisma # 数据模型与表映射 sql/ # 专项表结构脚本 script/supplier_db.sql # 数据库结构及开发数据快照 init-supplied-user.mjs # 管理账号初始化与旧表处理 tools/ # 发票等辅助工具 ``` `src/functions` 保留接口处理器导出,当前本地服务由 Koa 的 `/api` 路由分发。 ## 环境配置 配置文件为本目录 `.env`,可参考 `.env.example`。数据库及存储服务的账号信息不在本文重复列出。 | 配置项 | 用途 | | --- | --- | | `DATABASE_URL` | MySQL 连接地址 | | `PORT` | Koa 服务端口,默认 `8888` | | `PRISMA_CLIENT_ENGINE_TYPE` | Prisma 引擎设置,示例为 `binary` | | `POINTS_MALL_OPEN_API_BASE` | zhgh 平台接口根地址,例如 `http://localhost/open` | | `SUPPLIER_OPEN_SM4_KEY_HEX`、`SUPPLIER_OPEN_SM4_IV_HEX` | 供应商开放接口 SM4 配置 | | `REDIS_HOST`、`REDIS_PORT`、`REDIS_PASSWORD`、`REDIS_DB` | 平台 Token 缓存连接配置 | | `MINIO_ENDPOINT`、`MINIO_ACCESS_KEY`、`MINIO_SECRET_KEY` | MinIO 地址与访问凭据 | | `MINIO_BUCKET`、`MINIO_REGION` | 存储桶与区域;本项目配置示例使用 `njupt` | `.env.example` 中的 `JWT_SECRET`、`UPLOAD_TOKEN` 不参与当前管理端登录校验;管理端采用数据库保存 Token 哈希的会话机制。 H5 通过供应商标识获取配置。供应商 `clientSecret` 保存在后端数据库中,用于请求平台桥接 Token,与管理端登录密码、登录 Token 分开处理。 ## 已有脚本说明 以下列出 `package.json` 中已有脚本的用途。 | 脚本名 | 用途 | | --- | --- | | `dev`、`start` | 通过 tsx 运行 Koa 服务 | | `build`、`prisma:generate` | 生成 Prisma Client;`build` 不生成后端应用打包产物 | | `typecheck` | TypeScript 静态类型检查 | | `prisma:migrate` | Prisma 开发迁移 | | `prisma:studio` | Prisma 数据查看界面 | | `seed:products` | 商品初始化数据脚本 | ## 管理账号与表结构 | 表名 | 用途 | | --- | --- | | `supplied_user` | 管理端账号、密码哈希、会话及失败登录状态 | | `supplied_cart_item` | 购物车条目,Prisma 模型为 `CartItem` | 管理端密码使用随机盐和 scrypt 哈希,格式为 `scrypt$盐$哈希`。登录时校验密码后签发随机 Token,数据库仅保存 Token 的 SHA-256 哈希及有效期。 - 会话有效期:8 小时,同一账号仅保留最新一次登录。 - 连续输错密码:启用账号累计 5 次后锁定 15 分钟。 - 退出登录:清除当前 Token 哈希与有效期。 - 登录请求密码不会写入供应商调试日志。 - 购物车 `userId` 仍为业务用户 ID,不关联 `supplied_user` 中的管理员。 ### 账号初始化脚本 `prisma/init-supplied-user.mjs` 读取本目录 `.env`,创建账号表并插入管理账号: - `SUPPLIED_ADMIN_USERNAME`:初始化账号,默认 `admin`。 - `SUPPLIED_ADMIN_PASSWORD`:初始化密码;未指定时随机生成,长度要求为 12–128 位。 - 账号创建成功后输出账号和密码,已存在账号不会覆盖密码。 - 可将旧 `cartitem` 重命名为 `supplied_cart_item`;新旧表同时存在时停止,避免覆盖数据。 - 旧 `user` 表有数据时停止;为空时移除。表结构处理发生在账号是否已存在的判断之前。 - 此脚本不会创建缺失的购物车表,也不处理曾使用过的 `supplied_cartitem` 名称。 当前开发账号见 [项目 README](../README.md#管理端登录)。 ## 接口入口 | 路径 | 用途 | | --- | --- | | `/api/:name` | H5 及通用业务接口 | | `/api/admin/:name` | 管理端入口,除 `login` 外校验 Bearer Token | | `/supplierOpenApi/pointOrder/*` | zhgh 调用的供应商开放接口 | | `/api/supplier-logs` | 查询或清除当前进程保存的调试日志 | ### 管理端登录接口 | 方法 | 路径 | 请求内容 | | --- | --- | --- | | POST | `/api/admin/login` | JSON:`username`、`password` | | POST | `/api/admin/admin-session` | Bearer Token,返回用户信息及过期时间 | | POST | `/api/admin/admin-logout` | Bearer Token,使当前登录失效 | 登录成功返回 `data.token`、`data.expiresAt` 和 `data.user`。管理端后续请求通过 `Authorization: Bearer ` 携带凭据。 ### 业务接口分组 - 商品:`product-list`、`product-detail`、`merchant-product-*`。 - 订单:`order-create`、`order-pay`、`order-list`、`order-detail`、取消及事件推送接口。 - 商家处理:`merchant-order-*`、`merchant-after-sale-*`。 - 对账:`merchant-reconciliation-*`、`supplier-reconciliation-*`。 - 发票:`supplier-invoice-apply`、`supplier-invoice-info`、`supplier-file-base64-info`。 - 平台授权:`supplier-info`、`supplier-session`、`supplier-token`。 完整路由以 `src/server.ts` 为准。`cart-add`、`user-info` 仍为占位实现。 ## 调试日志 `GET /api/supplier-logs` 返回当前后端接收请求、向 zhgh 发送请求、接收 zhgh 请求的记录;`DELETE /api/supplier-logs` 清除记录。日志保存在进程内存中,最多保留 200 条,服务重启后清空。