# 后端真实接口清单 > 本文档为前后端对接的唯一事实来源,由后端 Controller 扫描生成。 > 整理日期:2026-06-05 > > **关键约定**(摘自 `server-snack/src/main/java/com/snack/server/config/SaTokenConfig.java`): > - 用户端白名单:`/api/user/login`;需登录:`/api/user/**`、`/api/cart/**`、`/api/orders/**`、`/api/seckill/buy`、`/api/coupons/*/receive`、`/api/user/coupons` > - 管理端白名单:`/api/admin/login`、`/api/admin/captcha`;其余 `/api/admin/**` 均需登录 > - 响应统一封装 `Result`:`{code, message, data}`。前端 axios 拦截器在 `code===200` 时直接返回 `data`(已解包) --- ## 一、用户端接口(`/api/...`) ### 1. 用户鉴权 | 方法 | 路径 | 入参 | 出参 | 鉴权 | |------|------|------|------|------| | POST | `/api/user/login` | `{username, password}` | `{token, userId, nickname}` | 白名单 | | POST | `/api/user/register` | TODO 业务模块未实现注册(由 UserAuthController 暂代) | — | 待确认 | > 现状:用户端没有 profile 公开接口,登录后只能用 token 调其他接口。注册入口需另作设计。 ### 2. 商品(用户端) | 方法 | 路径 | 入参 | 出参 | 鉴权 | |------|------|------|------|------| | GET | `/api/product/{id}` | 路径:`id` | `ProductDetailVO`(含 skuList) | 公开 | | GET | `/api/product/list` | query:`categoryIds`(逗号分隔)、`orderBy`(`sales_desc`/`price_asc`/`price_desc`/`create_desc`)、`limit` | `List` | 公开 | | GET | `/api/product/hot` | query:`limit` | `List` | 公开 | | GET | `/api/product/new` | query:`limit` | `List` | 公开 | > 注意:用户端没有 keyword 搜索接口,需确认是否走 `categoryIds` 或单独 `/api/search` — **当前不存在**。 ### 3. 分类(用户端) | 方法 | 路径 | 入参 | 出参 | 鉴权 | |------|------|------|------|------| | GET | `/api/category/tree` | — | `List`(树形) | 公开 | ### 4. 轮播图(用户端) | 方法 | 路径 | 入参 | 出参 | 鉴权 | |------|------|------|------|------| | GET | `/api/banner` | — | `List` | 公开 | ### 5. 公告(用户端) | 方法 | 路径 | 入参 | 出参 | 鉴权 | |------|------|------|------|------| | GET | `/api/notice/list` | — | `List` | 公开 | | GET | `/api/notice/{id}` | 路径:`id` | `NoticeVO`(自动 +1 viewCount) | 公开 | ### 6. 购物车(用户端) | 方法 | 路径 | 入参 | 出参 | 鉴权 | |------|------|------|------|------| | GET | `/api/cart` | — | `CartVO`{items, totalCount, selectedCount, totalAmount, selectedAmount, allSelected} | 登录 | | POST | `/api/cart` | `CartAddReq`{productId, skuId, quantity} | void | 登录 | | PUT | `/api/cart/quantity` | `CartUpdateReq`{skuId, quantity} | void | 登录 | | PUT | `/api/cart/{skuId}/selected` | query:`selected`(0/1) | void | 登录 | | PUT | `/api/cart/all-selected` | query:`selected`(0/1) | void | 登录 | | DELETE | `/api/cart/{skuId}` | 路径:skuId | void | 登录 | | DELETE | `/api/cart` | body:`List`(skuIds 批量) | void | 登录 | | DELETE | `/api/cart/all` | — | void | 登录 | | GET | `/api/cart/count` | — | `Integer`(商品总件数) | 登录 | > `CartItemVO` 关键字段:`id`/`productId`/`productName`/`productImage`/`skuId`/`skuName`/`skuImage`/`price`/`quantity`/`subtotal`/`stock`/`selected`/`productStatus` ### 7. 收货地址(用户端) | 方法 | 路径 | 入参 | 出参 | 鉴权 | |------|------|------|------|------| | GET | `/api/address` | — | `List` | 登录 | | GET | `/api/address/default` | — | `AddressVO` | 登录 | | GET | `/api/address/{id}` | 路径:id | `AddressVO` | 登录 | | POST | `/api/address` | `AddressSaveReq` | `Long`(新 ID) | 登录 | | PUT | `/api/address` | `AddressSaveReq`(带 id) | void | 登录 | | DELETE | `/api/address/{id}` | 路径:id | void | 登录 | | PUT | `/api/address/{id}/default` | 路径:id | void | 登录 | > `AddressSaveReq` 字段:`receiver`、`phone`(^1[3-9]\d{9}$)、`province`、`city`、`district`、`detail`、`tag`、`isDefault`(0/1) > `AddressVO` 额外返回 `fullAddress`(省市区+详细 拼接) ### 8. 订单(用户端)— 路径是 **`/api/orders`**(复数,非 order) | 方法 | 路径 | 入参 | 出参 | 鉴权 | |------|------|------|------|------| | POST | `/api/orders` | `OrderSubmitReq`{items[{skuId, quantity}], addressId, couponId?, remark?} | `{orderNo}` | 登录 | | GET | `/api/orders/{id}` | 路径:id | `OrderDetailVO` | 登录 | | GET | `/api/orders` | query:current/size/status?/keyword? | `Page` | 登录 | | POST | `/api/orders/{id}/pay` | 路径:id | void | 登录 | | POST | `/api/orders/{id}/cancel` | 路径:id | void | 登录 | | POST | `/api/orders/{id}/receive` | 路径:id | void | 登录 | | POST | `/api/orders/{id}/refund` | 路径:id + query:reason? | void | 登录 | > `OrderDetailVO` 关键字段:`id`/`orderNo`/`totalAmount`/`freightAmount`/`discountAmount`/`couponAmount`/`payAmount`/`status`+`statusText`+`statusTagType`(Element Plus tag 类型)/`receiverName`/`receiverPhone`/`receiverAddress`/`trackingCompany`/`trackingNo`/`payTime`/`deliverTime`/`receiveTime`/`payChannel`+`payChannelText`/`items`+`totalQuantity` ### 9. 优惠券(用户端)— 路径是 **`/api/coupons`**(复数) | 方法 | 路径 | 入参 | 出参 | 鉴权 | |------|------|------|------|------| | GET | `/api/coupons` | — | `List`(可领取列表,含已领取标记) | 公开 | | POST | `/api/coupons/{id}/receive` | 路径:id | `Long`(领取记录 ID) | 登录 | | GET | `/api/user/coupons` | query:status?(0未使用/1已使用/2过期/3作废) | `List` | 登录 | ### 10. 收藏(用户端) | 方法 | 路径 | 入参 | 出参 | 鉴权 | |------|------|------|------|------| | GET | `/api/favorite` | query:current/size | `Page` | 登录 | | POST | `/api/favorite/{productId}` | 路径:productId | void | 登录 | | DELETE | `/api/favorite/{favoriteId}` | 路径:favoriteId | void | 登录 | | DELETE | `/api/favorite/product/{productId}` | 路径:productId | void | 登录 | | GET | `/api/favorite/check` | query:productId | `Boolean` | 登录 | | GET | `/api/favorite/count` | — | `Long` | 登录 | ### 11. 抢购(用户端) | 方法 | 路径 | 入参 | 出参 | 鉴权 | |------|------|------|------|------| | GET | `/api/seckill/activities` | — | `List`(进行中/即将开始) | 公开 | | GET | `/api/seckill/activities/{id}` | 路径:id | `SeckillActivityVO`(含 products) | 公开 | | POST | `/api/seckill/buy` | `SeckillBuyReq`{activityId, skuId, quantity} | `{orderNo}`(排队号/订单号) | 登录 | | GET | `/api/seckill/result/{orderNo}` | 路径:orderNo | `SeckillResultVO`{orderNo, status(0排队/1成功/2失败), statusText, message?, mainOrderId?} | 登录 | > `SeckillActivityVO` 关键字段:`id`/`name`/`cover`/`startTime`/`endTime`/`status`(0未开始/1进行中/2已结束)+`statusText`/`countdownSeconds`/`description`/`products` > `SeckillProductVO` 关键字段:`id`/`activityId`/`productId`/`productName`/`productImage`/`skuId`/`skuName`/`originPrice`/`seckillPrice`/`discount`/`seckillStock`/`remainStock`/`soldPercent`/`perLimit` ### 12. 客服聊天(用户端) | 方法 | 路径 | 入参 | 出参 | 鉴权 | |------|------|------|------|------| | POST | `/api/chat/session` | — | `ChatSessionDetailVO`(创建/恢复) | 登录 | | GET | `/api/chat/sessions` | — | `List`(我的会话) | 登录 | | GET | `/api/chat/session/{id}` | 路径:id | `ChatSessionDetailVO` | 登录 | | GET | `/api/chat/session/{id}/messages` | query:afterSeq?、limit(默认50) | `List` | 登录 | | POST | `/api/chat/session/{id}/message` | `ChatSendMessageReq` | `ChatMessageVO` | 登录 | | PUT | `/api/chat/session/{id}/ack` | `ChatAckReq` | void | 登录 | | PUT | `/api/chat/session/{id}/close` | 路径:id | void | 登录 | | GET | `/api/chat/admin/online` | — | `Boolean` | 登录 | | POST | `/api/chat/heartbeat` | — | void | 登录 | ### 13. 文件上传(用户端 + 管理端通用) | 方法 | 路径 | 入参 | 出参 | 鉴权 | |------|------|------|------|------| | POST | `/api/file/upload` | multipart:`file` + query:`bizType`(avatar/product/banner/notice/chat/common,默认 common) | `FileUploadVO`{id, name, url, path, size, contentType, bizType, createTime} | 登录 | | DELETE | `/api/file/{id}` | 路径:id | void | 登录 | --- ## 二、管理端接口(`/api/admin/...`) ### 1. 管理员鉴权 | 方法 | 路径 | 入参 | 出参 | 鉴权 | |------|------|------|------|------| | POST | `/api/admin/login` | `AdminLoginReq` | `LoginVO` | 白名单 | | GET | `/api/admin/captcha` | — | `CaptchaVO`(推测) | 白名单 | | POST | `/api/admin/logout` | — | void | 登录 | | GET | `/api/admin/info` | — | `AdminVO`(当前登录管理员) | 登录 | | PUT | `/api/admin/password` | `ChangePasswordReq` | void | 登录 | | GET | `/api/admin/page` | query:AdminPageReq | `Page` | 登录 | | GET | `/api/admin/{id}` | 路径:id | `AdminVO` | 登录 | | POST | `/api/admin` | `AdminSaveReq` | `Long` | 登录 + super_admin | | PUT | `/api/admin` | `AdminSaveReq` | void | 登录 + super_admin | | DELETE | `/api/admin/{id}` | 路径:id | void | 登录 + super_admin | | PUT | `/api/admin/{id}/password/reset` | 路径:id + query:newPassword | void | 登录 + super_admin | | PUT | `/api/admin/{id}/status/{status}` | 路径:id/status | void | 登录 + super_admin | | POST | `/api/admin/avatar/upload` | multipart:file | `FileUploadVO` | 登录 | ### 2. 用户管理 | 方法 | 路径 | 出参 | 鉴权 | |------|------|------|------| | GET | `/api/admin/user/page` | `Page` | 登录 | | GET | `/api/admin/user/{id}` | `UserVO` | 登录 | | POST | `/api/admin/user` | `Long` | 登录 | | PUT | `/api/admin/user` | void | 登录 | | DELETE | `/api/admin/user/{id}` | void | 登录 | | PUT | `/api/admin/user/{id}/password/reset` | void | 登录 | | PUT | `/api/admin/user/{id}/status/{status}` | void | 登录 | | GET | `/api/admin/user/{id}/orders` | `Page` | 登录 | ### 3. 商品分类 | 方法 | 路径 | 出参 | 鉴权 | |------|------|------|------| | GET | `/api/admin/category/tree` | `List` | 登录 | | GET | `/api/admin/category/children` | `List` | 登录 | | GET | `/api/admin/category/options` | `List` | 登录 | | GET | `/api/admin/category/{id}` | `Category` | 登录 | | POST | `/api/admin/category` | `Long` | 登录 | | PUT | `/api/admin/category` | void | 登录 | | DELETE | `/api/admin/category/{id}` | void | 登录 | | PUT | `/api/admin/category/{id}/status/{status}` | void | 登录 | | PUT | `/api/admin/category/{id}/sort/{sort}` | void | 登录 | | POST | `/api/admin/category/{id}/icon` | `FileUploadVO` | 登录 | ### 4. 商品管理 | 方法 | 路径 | 出参 | 鉴权 | |------|------|------|------| | GET | `/api/admin/product/page` | `Page` | 登录 | | GET | `/api/admin/product/{id}` | `ProductDetailVO` | 登录 | | POST | `/api/admin/product` | `Long` | 登录 | | PUT | `/api/admin/product` | void | 登录 | | DELETE | `/api/admin/product/{id}` | void | 登录 | | PUT | `/api/admin/product/{id}/status/{status}` | void | 登录 | | PUT | `/api/admin/product/{id}/hot/{isHot}` | void | 登录 | | PUT | `/api/admin/product/{id}/new/{isNew}` | void | 登录 | | PUT | `/api/admin/product/stock/adjust` | void(StockAdjustReq) | 登录 | ### 5. 轮播图管理 | 方法 | 路径 | 出参 | 鉴权 | |------|------|------|------| | GET | `/api/admin/banner/page` | `Page` | 登录 | | GET | `/api/admin/banner/{id}` | `BannerVO` | 登录 | | POST | `/api/admin/banner` | `Long` | 登录 | | PUT | `/api/admin/banner` | void | 登录 | | DELETE | `/api/admin/banner/{id}` | void | 登录 | | PUT | `/api/admin/banner/{id}/status/{status}` | void | 登录 | | PUT | `/api/admin/banner/{id}/sort/{sort}` | void | 登录 | ### 6. 公告管理 | 方法 | 路径 | 出参 | 鉴权 | |------|------|------|------| | GET | `/api/admin/notice/page` | `Page` | 登录 | | GET | `/api/admin/notice/{id}` | `NoticeVO` | 登录 | | POST | `/api/admin/notice` | `Long` | 登录 | | PUT | `/api/admin/notice` | void | 登录 | | DELETE | `/api/admin/notice/{id}` | void | 登录 | | PUT | `/api/admin/notice/{id}/status/{status}` | void | 登录 | | PUT | `/api/admin/notice/{id}/top/{isTop}` | void | 登录 | ### 7. 订单管理 | 方法 | 路径 | 出参 | 鉴权 | |------|------|------|------| | GET | `/api/admin/order/page` | `Page` | 登录 | | GET | `/api/admin/order/{id}` | `OrderDetailVO` | 登录 | | POST | `/api/admin/order/{id}/deliver` | void(company, trackingNo) | 登录 | | POST | `/api/admin/order/{id}/cancel` | void(reason) | 登录 | ### 8. 抢购管理 | 方法 | 路径 | 出参 | 鉴权 | |------|------|------|------| | GET | `/api/admin/seckill/page` | `Page` | 登录 | | POST | `/api/admin/seckill` | `Long` | 登录 + super_admin | | PUT | `/api/admin/seckill` | void | 登录 + super_admin | | DELETE | `/api/admin/seckill/{id}` | void | 登录 + super_admin | | PUT | `/api/admin/seckill/{id}/end` | void | 登录 + super_admin | | POST | `/api/admin/seckill/{id}/warmup` | void | 登录 + super_admin | | POST | `/api/admin/seckill/product` | `Long` | 登录 + super_admin | | DELETE | `/api/admin/seckill/product/{id}` | void | 登录 + super_admin | ### 9. 优惠券管理 | 方法 | 路径 | 出参 | 鉴权 | |------|------|------|------| | GET | `/api/admin/coupon/page` | `Page` | 登录 | | GET | `/api/admin/coupon/{id}` | `CouponVO` | 登录 | | POST | `/api/admin/coupon` | `Long` | 登录 | | PUT | `/api/admin/coupon` | void | 登录 | | DELETE | `/api/admin/coupon/{id}` | void | 登录 | | PUT | `/api/admin/coupon/{id}/status/{status}` | void | 登录 | | PUT | `/api/admin/coupon/{id}/status` | void(兼容旧前端) | 登录 | | GET | `/api/admin/coupon/record/page` | `Page` | 登录 | | GET | `/api/admin/coupon/{id}/records` | `Page` | 登录 | ### 10. 客服聊天(管理端) | 方法 | 路径 | 出参 | 鉴权 | |------|------|------|------| | GET | `/api/admin/chat/session/page` | `Page` | 登录 | | GET | `/api/admin/chat/session/{id}` | `ChatSessionDetailVO` | 登录 | | POST | `/api/admin/chat/session/{id}/accept` | `ChatSessionVO` | 登录 | | POST | `/api/admin/chat/session/{id}/transfer` | `ChatSessionVO`(toAdminId) | 登录 | | PUT | `/api/admin/chat/session/{id}/status/{status}` | void | 登录 | | PUT | `/api/admin/chat/session/{id}/close` | void | 登录 | | GET | `/api/admin/chat/session/{id}/messages` | `List` | 登录 | | POST | `/api/admin/chat/session/{id}/message` | `ChatMessageVO` | 登录 | | PUT | `/api/admin/chat/session/{id}/ack` | void | 登录 | | GET | `/api/admin/chat/quick-reply/list` | `List` | 登录 | | GET | `/api/admin/chat/quick-reply/{id}` | `QuickReplyVO` | 登录 | | POST | `/api/admin/chat/quick-reply` | `Long` | 登录 | | PUT | `/api/admin/chat/quick-reply` | void | 登录 | | DELETE | `/api/admin/chat/quick-reply/{id}` | void | 登录 | | POST | `/api/admin/chat/heartbeat` | void | 登录 | | GET | `/api/admin/chat/admin/online/count` | `Long` | 登录 | ### 11. 支付回调(沙箱) | 方法 | 路径 | 入参 | 出参 | 鉴权 | |------|------|------|------|------| | POST | `/api/payment/alipay/notify` | orderId/payChannel?/payTradeNo? | `String` | 公开 | | POST | `/api/payment/alipay/refund/notify` | orderId/refundTradeNo? | `String` | 公开 | --- ## 三、与前端 api 现状的差异(摘录) ### web-snack `src/api/index.ts` 当前(已淘汰/需改): | 当前路径 | 实际后端 | 备注 | |----------|---------|------| | `/user/login`(已脱 `/api`) | `POST /api/user/login` | 缺少 `/api` 前缀,且 `request` 工具应该统一加前缀 | | `/user/profile` | **不存在** | 改为从 `LoginResp` 中保存 userId/nickname 到 store,登录后通过其他接口取信息 | | `/banner/list` | `GET /api/banner` | 路径不同 | | `/category/list` | `GET /api/category/tree` | 返回结构是树形,不是平铺 | | `/product/list?categoryId&keyword&isHot&isNew` | `GET /api/product/list?categoryIds&orderBy&limit` | **不支持 keyword/isHot/isNew 参数**;categoryId 改 categoryIds;无搜索接口 | | `/product/detail/{id}` | `GET /api/product/{id}` | 路径差 `/api` 前缀 | | `/cart/list` | `GET /api/cart` | 列表嵌套在 CartVO.items,结构不一样 | | `/cart/add` | `POST /api/cart` | 路径不同 | | `/cart/update`(body 含 id+quantity+selected) | `PUT /api/cart/quantity`(只改数量)+ `PUT /api/cart/{skuId}/selected` | 拆成两个接口 | | `/cart/delete/{id}` | `DELETE /api/cart/{skuId}`(用 skuId 不是 cart item id) | 标识符不同 | | `/address/list`、`/address/default` | `GET /api/address`、`GET /api/address/default` | ✓ 路径一致(只差前缀) | | `/order/list` | `GET /api/orders` | 路径是 orders(复数) | | `/order/create` | `POST /api/orders` | 路径不同;返回结构是 `{orderNo}` 不是完整 Order | | `/order/detail/{id}` | `GET /api/orders/{id}` | 路径是 orders | | `/coupon/list` | `GET /api/coupons` | 路径是 coupons(复数) | | `/notice/list` | `GET /api/notice/list` | ✓ | | `/seckill/list` | `GET /api/seckill/activities` | 路径不同 | ### admin-snack 现状(基本 OK,主要差异点) | 模块 | 现状(可能) | 后端实际 | 备注 | |------|------------|---------|------| | auth | `auth/login`、`auth/captcha` | `/api/admin/login`、`/api/admin/captcha` | 应确认是否存在 `auth/` 子目录,或直接 `/admin` | | chat | 见 admin | 见 admin | ✓ | | coupon | `coupon/list` | `/api/admin/coupon/page` | 用 `page` 而非 `list` | | order | `order/list` | `/api/admin/order/page` | 同上 | | seckill | `seckill/list` | `/api/admin/seckill/page` | 同上 | | product | `product/list` | `/api/admin/product/page` | 同上 | | notice | `notice/list` | `/api/admin/notice/page` | 同上 | | file | `/file/upload` | `POST /api/file/upload`(multipart,bizType) | ✓ 路径一致 | | user | `user/list` | `/api/admin/user/page` | 同上 | --- ## 四、关键 VO 字段速查(给前端写 TS 类型用) ### ProductListVO ``` id, name, categoryId, categoryName, brand, mainImage, minPrice, maxPrice, totalStock, sales, status, isHot, isNew, createTime ``` ### ProductDetailVO ``` id, name, categoryId, categoryName, brand, mainImage, subImages[], detail, originPrice, minPrice, sales, viewCount, status, isHot, isNew, skuList: ProductSkuVO[], createTime ``` ### ProductSkuVO ``` id, productId, skuName, image, price, stock, sales, weight, sort ``` ### CartVO ``` items: CartItemVO[], totalCount, selectedCount, totalAmount, selectedAmount, allSelected ``` ### CartItemVO ``` id, productId, productName, productImage, skuId, skuName, skuImage, price, quantity, subtotal, stock, selected, productStatus ``` ### OrderDetailVO ``` id, orderNo, userId, username, totalAmount, freightAmount, discountAmount, couponAmount, payAmount, status, statusText, statusTagType, receiverName, receiverPhone, receiverAddress, remark, trackingCompany, trackingNo, payTime, deliverTime, receiveTime, cancelTime, createTime, payChannel, payChannelText, payTradeNo, refundTradeNo, refundTime, refundReason, items: OrderItemVO[], totalQuantity ``` ### SeckillActivityVO ``` id, name, cover, startTime, endTime, status(0未开始/1进行中/2已结束), statusText, countdownSeconds, description, products: SeckillProductVO[] ``` ### SeckillProductVO ``` id, activityId, productId, productName, productImage, skuId, skuName, originPrice, seckillPrice, discount, seckillStock, remainStock, soldPercent, perLimit ``` ### AddressVO ``` id, receiver, phone, province, city, district, detail, tag, isDefault, fullAddress, createTime ``` ### BannerVO ``` id, title, image, linkType(0无/1商品/2分类/3外链), linkValue, sort, status(0下线/1上线), startTime, endTime, createTime, updateTime ``` ### NoticeVO ``` id, title, content(HTML), type(0普通/1重要/2活动), isTop, status, startTime, endTime, viewCount, publisherId, createTime, updateTime ``` ### CategoryTreeVO ``` id, name, parentId, level(1/2/3), sort, icon, status, children: CategoryTreeVO[], createTime ``` ### CouponVO ``` id, name, type(0满减/1折扣/2无门槛), typeText, amount, minAmount, maxDiscount, total(发放总量,-1不限量), remain, received, perLimit, status(0未上线/1已上线/2已结束), statusText, startTime, endTime, validDays, description, createTime, updateTime ``` ### UserCouponVO ``` id, userId, username, nickname, couponId, couponName, couponType, status(0未使用/1已使用/2过期/3作废), statusText, orderId, receiveTime, useTime, expireTime ``` ### FileUploadVO ``` id, name, url(直接用), path, size, contentType, bizType, createTime ``` ### ChatSessionVO ``` id, sessionNo, userId, username, nickname, avatar, adminId, adminName, status(0待处理/1处理中/2已解决/3关闭), statusText, unreadCount(视角相关), lastMessage, lastTime, createTime ``` ### ChatSessionDetailVO ``` session: ChatSessionVO, userSeq, adminSeq, closeTime ``` ### ChatMessageVO ``` id, sessionId, seq(会话内递增), senderId, senderType(0用户/1客服/2系统), type(text/image/file/product/system), content, extra(JSON), isRecalled, createTime ``` ### FavoriteVO ``` id, productId, productName, productMainImage, minPrice, productStatus, createTime ```