From 974b72e5e2f8a10d407a5a449cd2c72b2d4e4db5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E6=B5=B7=E6=B4=8B?= Date: Thu, 4 Jun 2026 10:33:58 +0800 Subject: [PATCH] login apii --- 5.md | 292 +++++++++++++++++++++++++++++++++++++++++++++ config/schema.sql | 2 +- utils/image-url.js | 5 + 3 files changed, 298 insertions(+), 1 deletion(-) create mode 100644 5.md diff --git a/5.md b/5.md new file mode 100644 index 0000000..2a2087e --- /dev/null +++ b/5.md @@ -0,0 +1,292 @@ +# Services 接口文档 + +> 基础地址: `https://donghy.top` (生产) / `http://localhost:3006` (开发) +> 鉴权方式: `Authorization: Bearer ` 或 `?token=` + +## 权限说明 + +| 权限级别 | 值 | 说明 | +|---------|---|------| +| 公开 | - | 无需登录 | +| requireAuth | 0+ | 任何已登录用户 | +| requireStaffAuth | 1+ | 店员或管理员 | +| requireAdminAuth | 2 | 仅管理员 | + +--- + +## 1. 用户模块 `/api/users` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| POST | `/api/users/login` | 公开 | 账号密码登录 | +| POST | `/api/users/wechat-login` | 公开 | 微信小程序登录 | +| POST | `/api/users/register` | 公开 | 用户注册 | +| POST | `/api/users/change-password` | 公开 | 修改密码 | +| POST | `/api/users/send-reset-code` | 公开 | 发送重置验证码 | +| POST | `/api/users/verify-reset-code` | 公开 | 验证重置验证码 | +| POST | `/api/users/reset-password-with-code` | 公开 | 通过验证码重置密码 | +| POST | `/api/users/refresh-token` | 公开 | 刷新 Token | +| GET | `/api/users/info` | 公开 | 获取用户信息 | +| POST | `/api/users/logout` | 登录用户 | 退出登录 | +| POST | `/api/users/register/by-staff` | 店员+ | 店员注册用户 | +| POST | `/api/users/points/add` | 店员+ | 增加用户积分 | +| POST | `/api/users/register/staff` | 管理员 | 注册店员账号 | +| POST | `/api/users/reset-password` | 管理员 | 重置用户密码 | +| GET | `/api/users` | 管理员 | 获取用户列表 | +| PUT | `/api/users/:id` | 管理员 | 更新用户信息 | +| DELETE | `/api/users/:id` | 管理员 | 删除用户 | +| GET | `/api/users/points/logs` | 通用 | 获取积分日志 | + +## 2. 商品模块 `/api/goods` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| GET | `/api/goods` | 公开 | 获取商品列表 | +| GET | `/api/goods/:id` | 公开 | 获取商品详情 | +| POST | `/api/goods` | 店员+ | 创建商品 | +| POST | `/api/goods/batch-update` | 店员+ | 批量更新商品 | +| PUT | `/api/goods/:id` | 店员+ | 更新商品 | +| DELETE | `/api/goods/:id` | 店员+ | 删除商品 | + +## 3. 订单模块 `/api/orders` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| GET | `/api/orders` | - | 获取订单列表 | +| GET | `/api/orders/:id` | - | 获取订单详情 | +| POST | `/api/orders` | - | 创建订单 | +| PUT | `/api/orders/:id` | - | 更新订单 | +| PUT | `/api/orders/:id/status` | - | 更新订单状态 | + +## 4. 购物车模块 `/api/cart` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| GET | `/api/cart` | 登录用户 | 获取购物车 | +| POST | `/api/cart/add` | 登录用户 | 添加到购物车 | +| PUT | `/api/cart/update` | 登录用户 | 更新购物车项 | +| POST | `/api/cart/remove` | 登录用户 | 移除购物车项 | +| DELETE | `/api/cart/clear` | 登录用户 | 清空购物车 | +| POST | `/api/cart/sync` | 登录用户 | 同步购物车 | + +## 5. 分类模块 `/api/categories` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| GET | `/api/categories` | 公开 | 获取分类列表 | +| GET | `/api/categories/:id` | 公开 | 获取分类详情 | +| POST | `/api/categories` | 管理员 | 创建分类 | +| PUT | `/api/categories/:id` | 管理员 | 更新分类 | +| DELETE | `/api/categories/:id` | 管理员 | 删除分类 | + +## 6. 地址模块 `/api/addresses` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| GET | `/api/addresses` | 登录用户 | 获取地址列表 | +| GET | `/api/addresses/:id` | 登录用户 | 获取地址详情 | +| POST | `/api/addresses` | 登录用户 | 创建地址 | +| PUT | `/api/addresses/:id` | 登录用户 | 更新地址 | +| DELETE | `/api/addresses/:id` | 登录用户 | 删除地址 | +| PUT | `/api/addresses/:id/default` | 登录用户 | 设为默认地址 | + +## 7. 库存模块 `/api/stock` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| GET | `/api/stock` | 店员+ | 获取库存列表 | +| GET | `/api/stock/logs` | 店员+ | 获取库存变动日志 | +| GET | `/api/stock/:id` | 公开 | 按商品ID查库存 | +| POST | `/api/stock/:id/adjust` | 店员+ | 调整库存 | + +## 8. 支付模块 `/api/payment` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| POST | `/api/payment/create` | 登录用户 | 创建支付 | +| GET | `/api/payment/query/:orderId` | 登录用户 | 查询支付结果 | +| POST | `/api/payment/notify` | 公开 | 微信支付回调 | +| POST | `/api/payment/refund` | 管理员 | 申请退款 | + +## 9. 退款模块 `/api/refunds` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| GET | `/api/refunds` | 店员+ | 获取退款列表 | +| GET | `/api/refunds/user/list` | 登录用户 | 获取用户退款列表 | +| GET | `/api/refunds/:id` | 登录用户 | 获取退款详情 | +| POST | `/api/refunds` | 登录用户 | 创建退款申请 | +| PUT | `/api/refunds/:id/process` | 店员+ | 处理退款 | + +## 10. 供应商模块 `/api/suppliers` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| GET | `/api/suppliers` | 店员+ | 获取供应商列表 | +| GET | `/api/suppliers/:id` | 店员+ | 获取供应商详情 | +| POST | `/api/suppliers` | 店员+ | 创建供应商 | +| PUT | `/api/suppliers/:id` | 店员+ | 更新供应商 | +| DELETE | `/api/suppliers/:id` | 管理员 | 删除供应商 | + +## 11. 进货模块 `/api/purchases` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| GET | `/api/purchases` | 店员+ | 获取进货列表 | +| GET | `/api/purchases/:id` | 店员+ | 获取进货详情 | +| POST | `/api/purchases` | 店员+ | 创建进货单 | +| POST | `/api/purchases/:id/inbound` | 店员+ | 进货入库 | + +## 12. 积分商品模块 `/api/points-goods` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| GET | `/api/points-goods` | 公开 | 获取积分商品列表 | +| GET | `/api/points-goods/:id` | 公开 | 获取积分商品详情 | +| POST | `/api/points-goods` | 管理员 | 创建积分商品 | +| PUT | `/api/points-goods/:id` | 管理员 | 更新积分商品 | +| DELETE | `/api/points-goods/:id` | 管理员 | 删除积分商品 | +| POST | `/api/points-goods/exchange` | 登录用户 | 积分兑换 | + +## 13. 积分日志模块 `/api/points/logs` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| GET | `/api/points/logs/:userId` | - | 获取用户积分日志 | + +## 14. 统计模块 `/api/stats` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| GET | `/api/stats/today` | 店员+ | 今日统计 | +| GET | `/api/stats/metrics` | 管理员 | 系统指标(连接池/查询/内存) | + +## 15. 报表模块 `/api/reports` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| GET | `/api/reports/sales-trend` | 店员+ | 销售趋势 | +| GET | `/api/reports/hot-products` | 店员+ | 热销商品 | +| GET | `/api/reports/profit` | 店员+ | 利润分析 | +| GET | `/api/reports/inventory-turnover` | 店员+ | 库存周转率 | + +## 16. 导出模块 `/api/export` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| GET | `/api/export/goods` | 店员+ | 导出商品 | +| GET | `/api/export/orders` | 店员+ | 导出订单 | +| GET | `/api/export/stock` | 店员+ | 导出库存 | +| GET | `/api/export/purchases` | 店员+ | 导出进货 | + +## 17. 识别模块 `/api/recognize` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| POST | `/api/recognize/barcode` | 店员+ | 条码识别 | +| POST | `/api/recognize/image` | 店员+ | 图片识别 | + +## 18. AI 模块 `/api/ai` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| POST | `/api/ai/generate-product` | 店员+ | AI 生成商品信息 | +| POST | `/api/ai/recognize-product` | 店员+ | AI 识别商品(图片) | + +## 19. 订阅消息模块 `/api/subscribe` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| POST | `/api/subscribe/bind-openid` | 登录用户 | 绑定微信 OpenID | +| POST | `/api/subscribe/orders/notify` | 店员+ | 订单订阅通知 | + +## 20. 商品规格模块 `/api/goods-specs` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| GET | `/api/goods-specs` | 公开 | 获取规格列表 | +| POST | `/api/goods-specs` | 店员+ | 创建规格 | +| PUT | `/api/goods-specs/:id` | 店员+ | 更新规格 | +| DELETE | `/api/goods-specs/:id` | 店员+ | 删除规格 | +| POST | `/api/goods-specs/batch` | 店员+ | 批量保存规格 | + +## 21. 首页分类模块 `/api/home` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| GET | `/api/home/categories` | 公开 | 获取首页分类 | +| PUT | `/api/home/categories` | 管理员 | 更新首页分类 | +| GET | `/api/home/categories/config` | 管理员 | 获取分类配置 | + +## 22. 报价单模块 `/api/price-list` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| GET | `/api/price-list/:orderId` | 登录用户 | 获取报价单 | + +## 23. 上传模块 `/api/upload` + +| 方法 | 路径 | 权限 | 说明 | +|------|------|------|------| +| POST | `/api/upload` | 店员+ | 上传图片(支持 goods/points/avatar/category 目录) | + +--- + +## 接口统计 + +- 总计 **23 个模块**,**70+ 个接口** +- 公开接口: 登录、注册、商品浏览、分类浏览、积分商品浏览等 +- 登录用户接口: 购物车、地址、订单、退款、积分兑换等 +- 店员接口: 商品管理、库存管理、进货、报表、导出等 +- 管理员接口: 用户管理、分类管理、供应商删除、系统指标等 + +--- + +## 接口测试结果(线上 https://donghy.top) + +测试时间: 2026-06-04 + +### 公开接口测试 + +| 接口 | 方法 | 状态码 | 结果 | +|------|------|--------|------| +| `/api/goods` | GET | 200 | 正常 | +| `/api/categories` | GET | 200 | 正常 | +| `/api/points-goods` | GET | 200 | 正常 | +| `/api/goods-specs` | GET | 200 | 正常 | +| `/api/home/categories` | GET | **500** | **异常**: `Unknown column 'c.image' in 'field list'` | +| `/api/users/info` | GET | 200 | 正常 | +| `/api/users/login` | POST | 200 | 正常 | +| `/api/users/register` | POST | 200 | 正常 | +| `/api/payment/notify` | POST | 200 | 正常 | +| `/api/points/logs/1` | GET | 200 | 正常 | + +### 鉴权接口测试(无 Token,预期返回 401) + +| 接口 | 方法 | 状态码 | 结果 | +|------|------|--------|------| +| `/api/cart` | GET | 401 | 正常(未登录拒绝) | +| `/api/addresses` | GET | 401 | 正常 | +| `/api/stock` | GET | 401 | 正常 | +| `/api/stats/today` | GET | 401 | 正常 | +| `/api/suppliers` | GET | 401 | 正常 | +| `/api/purchases` | GET | 401 | 正常 | +| `/api/refunds` | GET | 401 | 正常 | +| `/api/reports/sales-trend` | GET | 401 | 正常 | +| `/api/stats/metrics` | GET | 401 | 正常 | +| `/api/ai/generate-product` | POST | 401 | 正常 | +| `/api/recognize/barcode` | POST | 401 | 正常 | +| `/api/upload` | POST | 401 | 正常 | +| `/api/export/goods` | GET | 401 | 正常 | +| `/api/orders` | GET | 401 | 正常 | +| `/api/price-list/1` | GET | 401 | 正常 | +| `/api/subscribe/bind-openid` | POST | 401 | 正常 | + +### 发现的问题 + +**`GET /api/home/categories` 返回 500 错误** + +- 错误信息: `Unknown column 'c.image' in 'field list'` +- 原因: [controllers/homeCategories.js](controllers/homeCategories.js) 查询了 `c.image`,但 `categories` 表中没有 `image` 字段 +- 涉及代码: `getHomeCategories` 和 `getAllCategoriesForConfig` 两个函数 +- 修复方案: 在 `categories` 表中添加 `image` 字段,或从查询中移除 `c.image` diff --git a/config/schema.sql b/config/schema.sql index 8a0260e..d30f323 100644 --- a/config/schema.sql +++ b/config/schema.sql @@ -36,7 +36,7 @@ CREATE TABLE IF NOT EXISTS `goods` ( CREATE TABLE IF NOT EXISTS `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `phone` varchar(20) NOT NULL COMMENT '手机号', - `password` varchar(64) NOT NULL COMMENT '密码(MD5)', + `password` varchar(255) NOT NULL COMMENT '密码(scrypt)', `name` varchar(100) DEFAULT NULL COMMENT '用户名', `avatar` varchar(255) DEFAULT NULL COMMENT '头像', `points` int(11) DEFAULT 0 COMMENT '积分', diff --git a/utils/image-url.js b/utils/image-url.js index 6652cd1..e384c5a 100644 --- a/utils/image-url.js +++ b/utils/image-url.js @@ -58,6 +58,11 @@ function processGoodsImages(goods) { if (!goods) return goods; const processItem = (item) => { + // 处理单个image字段 + if (item.image) { + item.image = toFullUrl(item.image); + } + // 处理images字段(JSON数组格式) if (item.images) { try { const images = JSON.parse(item.images);