# 用户使用流程图 — 商城交易 > **端口说明**: 📱 小程序 | 🖥 管理后台 | 📋 规划师端 | ⚙️ 系统自动 > > **分层说明**: 🏠 页面 → 🔗 API → ⚙️ Service → 📦 数据实体 ```mermaid flowchart TD %% ============ 颜色定义 ============ classDef page fill:#e3f2fd,stroke:#1565c0,stroke-width:2px classDef api fill:#fff3e0,stroke:#f57c00,stroke-width:1px classDef service fill:#e8f5e9,stroke:#388e3c,stroke-width:1px classDef data fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1px classDef external fill:#fce4ec,stroke:#d32f2f,stroke-width:1px,stroke-dasharray:3 2 classDef actor fill:#e1f5fe,stroke:#0288d1,stroke-width:2px,stroke-dasharray:5 3 %% ============ 角色 ============ ROLE_BUYER(("👤 买家")):::actor ROLE_VENDOR(("🏪 商家")):::actor ROLE_ADMIN(("🖥 管理员")):::actor ROLE_PAY(("💳 微信支付")):::actor %% ================================================================ %% 阶段一:商品浏览 %% ================================================================ subgraph 阶段一[阶段一:商品浏览] direction TB P1["🏠 小程序:商城首页"]:::page P1 -->|"选择操作"| P1_choice{"浏览分类 / 搜索商品"}:::page P1_choice -->|"浏览分类"| P1a["🏠 分类树"]:::page P1a -->|""| A1["🔗 POST /api/shop/category/tree"]:::api A1 -->|""| S1["⚙️ ProductCategoryService.tree()"]:::service S1 -->|"商品分类层级树"| D1["📦 product_categories 表"]:::data P1_choice -->|"查看分类商品"| P1b["🏠 分类商品列表"]:::page P1b -->|"categoryId"| A2["🔗 POST /api/shop/category/products"]:::api A2 -->|"分类ID"| S2["⚙️ ProductCategoryService.products()"]:::service S2 -->|"该分类下的商品列表"| D2["📦 products 表(按分类筛选)"]:::data P1_choice -->|"商品列表"| P1c["🏠 商品列表页"]:::page P1c -->|"关键词, 分类, 排序, 分页"| A3["🔗 POST /api/product/list"]:::api A3 -->|"查询参数"| S3["⚙️ ProductService.list()"]:::service S3 -->|"分页商品数据"| D2 P1c -->|"查看详情"| P1d["🏠 商品详情页"]:::page P1d -->|"商品ID"| A4["🔗 POST /api/product/detail"]:::api A4 -->|"商品ID"| S4["⚙️ ProductService.detail()"]:::service S4 -->|"商品完整信息(含规格)"| D2 P1d -->|"查看规格映射"| P1e["🏠 规格选择弹窗"]:::page P1e -->|"商品ID列表"| A5["🔗 POST /api/product/spec/map"]:::api A5 -->|"商品IDs"| S5["⚙️ ProductSkuService.listByProductId()"]:::service S5 -->|"SKU规格分组与选项"| D3["📦 product_skus 表"]:::data end %% ================================================================ %% 阶段二:购物车 %% ================================================================ subgraph 阶段二[阶段二:购物车] D3 -->|"选定SKU"| P2["🏠 购物车页"]:::page P2 -->|"添加商品"| P2a["🏠 添加到购物车"] P2a -->|"商品ID, 数量, SKU ID"| A6["🔗 POST /api/cart/add"]:::api A6 -->|"用户ID, 商品ID, 数量"| S6["⚙️ CartService.addToCart()"]:::service S6 -->|"写入购物车项"| D4["📦 cart 表"]:::data D4 -->|"购物车数据"| P2b["🏠 购物车列表"] P2b -->|"用户ID"| A7["🔗 POST /api/cart/list"]:::api A7 -->|"用户ID"| S7["⚙️ CartService.getCartList()"]:::service S7 -->|"购物车商品列表"| D4 P2b -->|"修改数量"| P2c["🏠 编辑数量"] P2c -->|"商品ID, 新数量"| A8["🔗 POST /api/cart/update"]:::api A8 -->|"商品ID, 数量"| S8["⚙️ CartService.updateQuantity()"]:::service S8 -->|"更新数量"| D4 P2b -->|"移除商品"| P2d["🏠 移除"] P2d -->|"商品ID"| A9["🔗 POST /api/cart/remove"]:::api A9 -->|"商品ID"| S9["⚙️ CartService.removeItem()"]:::service S9 -->|"删除购物车项"| D4 P2b -->|"查看数量"| P2e["🏠 购物车角标"] P2e -->|"用户ID"| A10["🔗 POST /api/cart/count"]:::api A10 -->|"用户ID"| S10["⚙️ CartService.getCartCount()"]:::service S10 -->|"购物车商品总数"| D4 end %% ================================================================ %% 阶段三:下单支付 %% ================================================================ subgraph 阶段三[阶段三:下单支付] D4 -->|"选中商品"| P3["🏠 确认订单页"]:::page P3 -->|"提交订单"| A11["🔗 POST /api/product/order/create"]:::api A11 -->|"收货地址ID, 商品列表, 备注"| S11["⚙️ ProductOrderService.create()"]:::service S11 -->|"写入订单, 状态=待支付"| D5["📦 product_orders 表"]:::data D5 -->|"订单号"| P3a["🏠 支付页"] P3a -->|"发起支付"| A12["🔗 POST /api/product/order/pay"]:::api A12 -->|"订单号"| S12["⚙️ ProductOrderService.pay()"]:::service S12 -->|"微信支付参数(预支付ID)"| PAY["💳 微信支付收银台"]:::external PAY -->|"用户完成支付"| A13["🔗 POST /api/product/order/notify"]:::api A13 -->|"微信异步通知密文"| S13["⚙️ PaymentService.handleWechatNotify()"]:::service S13 -->|"解密+验证签名"| S13a["⚙️ ProductOrderService.handlePaymentSuccess()"]:::service S13a -->|"更新订单状态=已支付"| D5 end %% ================================================================ %% 阶段四:订单管理 %% ================================================================ subgraph 阶段四[阶段四:订单管理] D5 -->|"用户ID"| P4["🏠 我的订单页"]:::page P4 -->|"按状态筛选"| A14["🔗 POST /api/product/order/my"]:::api A14 -->|"用户ID, 状态"| S14["⚙️ ProductOrderService.myOrders()"]:::service S14 -->|"用户订单列表"| D5 P4 -->|"数量统计"| P4a["🏠 订单角标"] P4a -->|"用户ID"| A15["🔗 POST /api/product/order/my/counts"]:::api A15 -->|"用户ID"| S15["⚙️ ProductOrderService.myOrderCounts()"]:::service S15 -->|"各状态订单数量"| D5 P4 -->|"查看详情"| P4b["🏠 订单详情页"] P4b -->|"订单号"| A16["🔗 POST /api/product/order/detail"]:::api A16 -->|"订单号"| S16["⚙️ ProductOrderService.detail()"]:::service S16 -->|"订单完整信息"| D5 P4b -->|"取消订单"| P4c{"状态=待支付?"}:::page P4c -->|"是"| P4d["🏠 取消订单"] P4d -->|"订单号"| A17["🔗 POST /api/product/order/cancel"]:::api A17 -->|"订单号"| S17["⚙️ ProductOrderService.cancel()"]:::service S17 -->|"更新状态=已取消"| D5 P4b -->|"确认收货"| P4e{"状态=已发货?"}:::page P4e -->|"是"| P4f["🏠 确认收货"] P4f -->|"订单号"| A18["🔗 POST /api/product/order/confirm"]:::api A18 -->|"订单号"| S18["⚙️ ProductOrderService.confirmReceive()"]:::service S18 -->|"更新状态=已完成"| D5 P4b -->|"申请退款"| P4g{"已支付且未完成?"}:::page P4g -->|"是"| P4h["🏠 申请退款"] P4h -->|"订单号, 退款原因"| A19["🔗 POST /api/product/order/refund/apply"]:::api A19 -->|"订单号, 原因"| S19["⚙️ ProductOrderService.applyRefund()"]:::service S19 -->|"更新状态=退款中"| D5 end %% ================================================================ %% 阶段五:商家发货 %% ================================================================ subgraph 阶段五[阶段五:商家发货] D5 -->|"待发货订单"| P5["🖥 商家端:订单管理页"]:::page P5 -->|"查看商家订单"| A20["🔗 POST /api/product/order/vendor"]:::api A20 -->|"商家ID, 状态"| S20["⚙️ ProductOrderService.vendorOrders()"]:::service S20 -->|"商家订单列表"| D5 P5 -->|"发货"| P5a["🖥 发货表单"] P5a -->|"订单号, 快递公司, 运单号"| A21["🔗 POST /api/product/order/ship"]:::api A21 -->|"快递信息"| S21["⚙️ ProductOrderService.ship()"]:::service S21 -->|"更新状态=已发货, 记录物流"| D5 D5 -->|"物流信息"| P5b["📱 小程序:物流查询"] P5b -->|"订单ID"| A22["🔗 POST /api/shop/logistics/query"]:::api A22 -->|"订单ID"| S22["⚙️ ProductOrderService.queryLogistics()"]:::service S22 -->|"物流跟踪信息"| D5 end %% ================================================================ %% 阶段六:售后 %% ================================================================ subgraph 阶段六[阶段六:售后] D5 -->|"退款中的订单"| P6["📱 小程序:售后申请页"]:::page P6 -->|"提交申请"| A23["🔗 POST /api/shop/after-sales/create"]:::api A23 -->|"订单ID, 售后类型, 原因, 描述"| S23["⚙️ AfterSalesService.create()"]:::service S23 -->|"创建售后记录, 订单状态=退款中"| D6["📦 after_sales_requests 表"]:::data D6 -->|"售后列表"| P6a["📱 售后列表页"] P6a -->|"用户ID, 状态筛选"| A24["🔗 POST /api/shop/after-sales/list"]:::api A24 -->|"状态"| S24["⚙️ AfterSalesService.list()"]:::service S24 -->|"售后申请列表"| D6 P6a -->|"查看详情"| P6b["📱 售后详情页"] P6b -->|"售后单ID"| A25["🔗 POST /api/shop/after-sales/detail"]:::api A25 -->|"售后单ID"| S25["⚙️ AfterSalesService.detail()"]:::service S25 -->|"售后单完整信息"| D6 end %% ================================================================ %% 阶段七:评价 %% ================================================================ subgraph 阶段七[阶段七:评价] D5 -->|"已完成订单"| P7["📱 发表评价页"]:::page P7 -->|"提交评价"| A26["🔗 POST /api/review/order"]:::api A26 -->|"订单ID, 评分, 内容, 图片"| S26["⚙️ ReviewOrderService.createReview()"]:::service S26 -->|"写入评价记录"| D7["📦 review_orders 表"]:::data D7 -->|"评价数据"| P7a["📱 评价详情"] P7a -->|"订单ID"| A27["🔗 POST /api/review/order/detail"]:::api A27 -->|"订单ID"| S27["⚙️ ReviewOrderService.findByOrder()"]:::service S27 -->|"评价详情"| D7 P7a -->|"评价状态"| A28["🔗 POST /api/review/order/status"]:::api A28 -->|"订单ID"| S28["⚙️ ReviewOrderService.getStats()"]:::service S28 -->|"评价统计数据"| D7 end %% ================================================================ %% 阶段八:收货地址 %% ================================================================ subgraph 阶段八[阶段八:收货地址] P3 -->|"管理地址"| P8["📱 地址管理页"]:::page P8 -->|"地址列表"| A29["🔗 POST /api/consignee/list"]:::api A29 -->|"用户ID"| S29["⚙️ ConsigneeService.list()"]:::service S29 -->|"用户收货地址列表"| D8["📦 consignees 表"]:::data P8 -->|"新增/编辑"| P8a["📱 地址表单"] P8a -->|"收货人, 手机号, 省市区, 详细地址"| A30["🔗 POST /api/consignee/save"]:::api A30 -->|"地址对象"| S30["⚙️ ConsigneeService.save()"]:::service S30 -->|"写入/更新地址"| D8 P8 -->|"地址详情"| P8b["📱 地址详情"] P8b -->|"地址ID"| A31["🔗 POST /api/consignee/detail"]:::api A31 -->|"地址ID"| S31["⚙️ ConsigneeService.detail()"]:::service S31 -->|"地址完整信息"| D8 P8 -->|"删除地址"| P8c["📱 删除确认"] P8c -->|"地址ID"| A32["🔗 POST /api/consignee/delete"]:::api A32 -->|"地址ID, 用户ID"| S32["⚙️ ConsigneeService.delete()"]:::service S32 -->|"删除地址记录"| D8 end %% ================================================================ %% 阶段九:商家商品管理 %% ================================================================ subgraph 阶段九[阶段九:商家商品管理] P5 -->|"管理商品"| P9["🖥 商家端:商品管理页"]:::page P9 -->|"创建商品"| P9a["🖥 商品发布表单"] P9a -->|"商品名称, 价格, 库存, 图片, 类目"| A33["🔗 POST /api/product/create"]:::api A33 -->|"商品对象"| S33["⚙️ ProductService.create()"]:::service S33 -->|"写入新商品, 状态=待审核"| D2 P9 -->|"编辑商品"| P9b["🖥 编辑表单"] P9b -->|"商品ID, 更新字段"| A34["🔗 POST /api/product/update"]:::api A34 -->|"商品对象"| S34["⚙️ ProductService.update()"]:::service S34 -->|"更新商品信息"| D2 P9 -->|"我的商品"| P9c["🖥 我的商品列表"] P9c -->|"商家ID"| A35["🔗 POST /api/product/my"]:::api A35 -->|"商家ID"| S35["⚙️ ProductService.myProducts()"]:::service S35 -->|"该商家的所有商品"| D2 P9 -->|"上架/下架"| P9d["🖥 上架/下架操作"] P9d -->|"商品ID, 动作(on/off)"| A36["🔗 POST /api/product/shelve"]:::api A36 -->|"商品ID, 动作"| S36["⚙️ ProductService.shelve()"]:::service S36 -->|"更新商品状态"| D2 P9 -->|"更新图片"| P9e["🖥 图片管理"] P9e -->|"商品ID, 图片列表"| A37["🔗 POST /api/product/images/update"]:::api A37 -->|"商品ID, 图片URL列表"| S37["⚙️ ProductService.updateImages()"]:::service S37 -->|"更新商品图片字段"| D2 end %% ================================================================ %% 角色关联 %% ================================================================ ROLE_BUYER -.- P1 ROLE_BUYER -.- P2 ROLE_BUYER -.- P3 ROLE_BUYER -.- P4 ROLE_BUYER -.- P6 ROLE_BUYER -.- P7 ROLE_BUYER -.- P8 ROLE_VENDOR -.- P5 ROLE_VENDOR -.- P9 ROLE_ADMIN -.- P5 ROLE_PAY -.- PAY ``` ## 端点明细 ### 商品浏览 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/product/list` | 获取商品列表 | 📱小程序 | `{keyword, categoryId, sort, page, size, ...}` | `分页商品列表(含价格, 库存, 封面)` | | `POST /api/product/detail` | 获取商品详情 | 📱小程序 | `{id}` | `商品完整信息(含规格, 描述, 图片)` | | `POST /api/product/spec/map` | 获取规格映射 | 📱小程序 | `{productIds: [id1, id2]}` | `每个商品的分组规格(颜色, 尺寸等)及SKU价格库存` | | `POST /api/shop/category/tree` | 获取分类树 | 📱小程序 | — | `商品分类层级树` | | `POST /api/shop/category/products` | 获取分类下商品 | 📱小程序 | `{categoryId}` | `该分类下的商品列表` | ### 购物车 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/cart/add` | 添加购物车 | 📱小程序 | `{productId, quantity, skuId}` | `CartItemDTO(含商品名称, 数量, 价格)` | | `POST /api/cart/list` | 获取购物车列表 | 📱小程序 | Header: `userId` | `购物车商品列表(含规格信息)` | | `POST /api/cart/update` | 更新购物车数量 | 📱小程序 | `{productId, quantity}` | `成功/失败` | | `POST /api/cart/remove` | 移除购物车商品 | 📱小程序 | `{productId}` | `成功/失败` | | `POST /api/cart/count` | 获取购物车数量 | 📱小程序 | Header: `userId` | `购物车商品总数` | ### 下单支付 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/product/order/create` | 创建订单 | 📱小程序 | `{productId, quantity, skuId, consigneeId, remark, ...}` | `ProductOrderDTO(含订单号, 金额, 状态)` | | `POST /api/product/order/pay` | 发起支付 | 📱小程序 | `{orderNo}` | `微信支付参数(prepay_id, sign等)` | | `POST /api/product/order/notify` | 微信支付回调 | ⚙️系统自动 | 微信异步通知密文 | `{code, message}` | | `POST /api/product/order/handlePaymentSuccess` | 手动处理支付成功 | ⚙️系统自动 | `{orderNo}` | `成功/失败` | ### 订单管理 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/product/order/my` | 获取我的订单 | 📱小程序 | `{status, keyword}` | `订单列表(含商品快照, 状态)` | | `POST /api/product/order/my/counts` | 订单数量统计 | 📱小程序 | Header: `userId` | `各状态订单数量` | | `POST /api/product/order/detail` | 订单详情 | 📱小程序 | `{orderNo}` | `订单完整信息(含地址快照, 物流)` | | `POST /api/product/order/cancel` | 取消订单 | 📱小程序 | `{orderNo}` | `成功/失败` | | `POST /api/product/order/confirm` | 确认收货 | 📱小程序 | `{orderNo}` | `成功/失败` | | `POST /api/product/order/refund/apply` | 申请退款 | 📱小程序 | `{orderNo, reason}` | `成功/失败` | | `POST /api/product/order/vendor` | 商家订单列表 | 🖥管理后台 | `{status}` | `商家订单列表` | | `POST /api/product/order/ship` | 商家发货 | 🖥管理后台 | `{orderNo, trackingNumber, expressCompany}` | `成功/失败` | ### 物流 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/shop/logistics/query` | 查询物流 | 📱小程序 | `{orderId}` | `物流跟踪信息` | ### 售后 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/shop/after-sales/create` | 创建售后申请 | 📱小程序 | `{orderId, type, reason, description, images}` | `AfterSalesRequest对象` | | `POST /api/shop/after-sales/list` | 售后列表 | 📱小程序 | `{status}` | `售后申请列表` | | `POST /api/shop/after-sales/detail` | 售后详情 | 📱小程序 | `{id}` | `售后申请完整信息` | ### 评价 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/review/order` | 发表评价 | 📱小程序 | `{orderId, rating, content, images}` | `成功/失败` | | `POST /api/review/order/detail` | 评价详情 | 📱小程序 | `{orderId}` | `评价内容及回复` | | `POST /api/review/order/status` | 评价状态 | 📱小程序 | `{orderId}` | `评价统计数据` | ### 收货地址 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/consignee/list` | 地址列表 | 📱小程序 | Header: `userId` | `收货地址列表` | | `POST /api/consignee/save` | 添加/保存地址 | 📱小程序 | `{id, name, phone, province, city, district, street, detail}` | `地址ID` | | `POST /api/consignee/detail` | 地址详情 | 📱小程序 | `{id}` | `地址完整信息` | | `POST /api/consignee/delete` | 删除地址 | 📱小程序 | `{id}` | `成功/失败` | ### 商家商品管理 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/product/create` | 创建商品 | 🖥管理后台 | `{name, price, stock, coverImage, categoryId, ...}` | `ProductDTO` | | `POST /api/product/update` | 更新商品 | 🖥管理后台 | `{id, name, price, stock, ...}` | `ProductDTO` | | `POST /api/product/my` | 我的商品 | 🖥管理后台 | Header: `userId` | `商品列表` | | `POST /api/product/shelve` | 上架/下架 | 🖥管理后台 | `{productId, action: "on"/"off"}` | `成功/失败` | | `POST /api/product/images/update` | 更新商品图片 | 🖥管理后台 | `{productId, images: [url1, url2]}` | `成功/失败` | ## 数据实体关系 ```mermaid erDiagram ProductCategory ||--o{ Product : "一个分类多个商品" Vendor ||--o{ Product : "一个商家多个商品" Product ||--o{ ProductSku : "一个商品多个规格" Product ||--o{ Cart : "一个商品可被多次加入" User ||--o{ Cart : "一个用户多个购物车项" User ||--o{ ProductOrder : "一个用户多笔订单" User ||--o{ Consignee : "一个用户多个地址" Product ||--o{ ProductOrder : "一个商品对多笔订单" ProductOrder ||--o{ AfterSalesRequest : "一笔订单多个售后" ProductOrder ||--o{ ReviewOrder : "一笔订单一个评价" Product { Long id PK string name int price int stock string productType "physical / assessment" string status "pending / approved / rejected / on / off" Long vendorId FK string dimensionWeights } ProductSku { Long id PK Long productId FK string specs "JSON规格选项" int price int stock } Cart { Long id PK Long userId FK Long productId FK Long skuId FK int quantity } ProductOrder { Long id PK string orderNo Long buyerId FK Long productId FK int totalAmount string status "pending_pay / paid / shipped / completed / cancelled / refunding" string logisticsNo string trackingNumber } Consignee { Long id PK Long userId FK string name string phone string province string city string district string street string detail } AfterSalesRequest { Long id PK Long orderId FK string type string status "pending / approved / rejected / completed" } ReviewOrder { Long id PK Long orderId FK int rating string content string images } ``` ## 完整性分析 | # | 维度 | 评估 | 说明 | |---|------|------|------| | 1 | **流程完整性** | ✅ 完整 | 覆盖商品浏览→购物车→下单支付→订单管理→发货→售后→评价→地址管理→商家商品管理9个阶段,包含买家与商家双视角 | | 2 | **异常路径** | ⚠️ 部分覆盖 | 支付失败/取消订单/退款申请已覆盖;库存不足/价格变动/支付超时等边界情况在前端校验,未在图里展开 | | 3 | **端点覆盖** | ✅ 完整 | 32个端点全部映射到流程图中,与代码中ProductController、CartController、ProductOrderController、ConsigneeController、ReviewController、AfterSalesController、ProductCategoryController、LogisticsController一致 | | 4 | **角色覆盖** | ✅ 完整 | 买家(小程序)、商家(管理后台)、管理员(管理后台)、微信支付(外部系统)三种视角均已覆盖 | | 5 | **数据实体** | ✅ 完整 | products、product_skus、cart、product_orders、consignees、after_sales_requests、review_orders、product_categories 8张表均在图中映射 | | 6 | **一致性** | ✅ 与代码一致 | 所有端点路径与实际Controller中的`@PostMapping`匹配,Service方法名与代码中的业务方法一致(create/detail/list/ship等) |