用户使用流程图 — 商城交易
端口说明: 📱 小程序 | 🖥 管理后台 | 📋 规划师端 | ⚙️ 系统自动
分层说明: 🏠 页面 → 🔗 API → ⚙️ Service → 📦 数据实体
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]} |
成功/失败 |
数据实体关系
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等) |