后端技术文档
更新日期:2026-05-31。
本文以 WinTradeCloudService 当前代码结构为准,描述后端模块、接口入口、通用机制和数据模型。历史数据库资料的有效内容已归并到本文,不再单独维护 doc/database。
技术栈
| 类型 | 技术 |
|---|---|
| 运行环境 | Java 21 |
| 框架 | Spring Boot 3.5.0、Spring MVC、Spring Security |
| 鉴权 | JWT、权限注解、菜单和角色授权 |
| 数据访问 | MyBatis、PageHelper、Druid |
| 接口文档 | Springdoc OpenAPI、Swagger annotations |
| 工具库 | Hutool、Fastjson2、MapStruct、Lombok、Apache POI |
| 文件 | wt-file 文件模块、OSS 文件上传和预签名上传 |
| 微信能力 | WxJava,小程序微信登录和手机号绑定 |
后端当前是单仓库多 Maven 模块结构。wt-admin 和 wt-client 是 Web 入口模块,业务逻辑由领域模块承接;公共配置、安全、异常和工具能力沉淀在 wt-framework 和 wt-common。
模块结构
| 模块 | 职责 |
|---|---|
wt-admin |
平台管理端接口入口,面向 admin 和部分运营作业能力 |
wt-client |
客户端接口入口,面向 client、商户、员工和通用客户端能力 |
wt-business |
订单、购物车、商品评价、商户业务、结算等核心业务 |
wt-logistics |
发货、包裹、车次、批次、运单、仓入库、中转、派送、报关、退货物流 |
wt-market |
Banner、广告位、运营展示资源、营销活动、优惠券、券池、活动价、预算、补贴记录 |
wt-message |
消息模板、消息内容、订阅、偏好、站内信、待办、派发和统计 |
wt-user |
用户账户、个人账户、商户账户、员工账户、地址、钱包、支付流水 |
wt-file |
文件、文件夹、文件 URL、上传和 OSS 相关能力 |
wt-system |
菜单、角色、权限、字典、参数、语言、日志、基础配置 |
wt-common |
通用响应、异常、工具、常量和基础模型 |
wt-framework |
安全、拦截、配置、上下文和 Web 基础设施 |
wt-quartz |
定时任务和任务日志 |
wt-generator |
代码生成辅助能力 |
模块依赖边界
| 层级 | 模块 | 说明 |
|---|---|---|
| 接口层 | wt-admin、wt-client |
只承接请求、参数校验、权限、响应封装和接口文档注解 |
| 业务层 | wt-business、wt-logistics、wt-market、wt-message、wt-user、wt-file、wt-system |
承接业务规则、状态流转、数据读写和跨模块编排 |
| 基础层 | wt-common、wt-framework |
提供统一异常、响应、鉴权、上下文、工具、配置和通用模型 |
| 工具层 | wt-quartz、wt-generator |
定时任务和代码生成,不应承接核心交易规则 |
接口层应尽量薄。新增业务规则优先落在领域模块的 Service 或 Component 中,避免 Controller 直接复制业务逻辑。
领域组件职责
后端业务中常见的 Component 用于承接跨 Service 编排、复杂状态校验和事务边界内的业务动作。
| 组件类型 | 代表职责 |
|---|---|
| 订单组件 | 幂等键、订单金额聚合、订单支付、取消、确认收货和退款后的副作用 |
| 价格组件 | 货架价格、价格策略、活动价、运费和当前价格快照 |
| 物流组件 | 入库、复核、中转、派送、配送员任务和包裹状态推进 |
| 结算组件 | 佣金快照、结算批次执行、结算反冲和钱包入账 |
| 营销组件 | 领券、发券、锁券、用券、预算核算、补贴确认和成本日报 |
| 消息组件 | 消息路由、订阅偏好、站内信、待办和派发统计 |
新增业务规则建议优先落在对应领域组件中。例如优惠券下单不应分散在 Controller,而应由订单 Service 调用营销订单组件统一处理。
接口入口
后端主要有两个 Controller 入口:
| 入口 | 包路径 | 使用端 | 说明 |
|---|---|---|---|
wt-admin |
com.wt.admin.controller |
admin、部分 ops 作业接口 |
管理、配置、审核、监控和平台作业接口 |
wt-client |
com.wt.client.controller |
client、商户、员工、消费者 |
客户端查询、交易、个人中心、商户侧和员工侧接口 |
接口统一使用 /api/v1 前缀。前端根据网关或请求封装将端口前缀映射为管理端或客户端访问路径。
入口选择原则
| 场景 | 推荐入口 | 原因 |
|---|---|---|
| 平台配置、审核、监管、日志、监控 | wt-admin |
属于平台管理行为,权限标识以 admin: 开头 |
| 消费者浏览、下单、个人中心 | wt-client |
面向个人账户和小程序端 |
| 商户自助查询和操作 | wt-client |
面向商户身份,权限标识以 client:merchant: 开头 |
| 仓库和配送员移动作业 | 当前多在 wt-admin |
现有代码已落在 admin:logistics:*,后续可评估是否迁移到客户端入口 |
| 公共基础资料查询 | 两端可按需要暴露 | 需要保证只读接口和写接口权限分离 |
通用接口约定
- 查询列表通常使用
GET /list,分页通常使用GET /page。 - 详情通常使用
GET /{id}或业务语义详情路径。 - 新增使用
POST,修改使用PUT,删除使用DELETE。 - 业务动作使用语义化子路径,例如
/publish、/approve、/payment、/shipping、/complete。 - 接口返回统一响应结构,分页结果通常返回
content、records或rows,前端封装会兼容这些字段。 - 权限标识通常写在
@Operation描述中,例如admin:product:spu:query、client:merchant:message:edit。
请求和响应规范
| 类型 | 约定 |
|---|---|
| 列表查询 | 适合轻量下拉和全量列表,路径使用 /list |
| 分页查询 | 适合表格和移动端分页,路径使用 /page |
| 主键详情 | 优先使用 /{id},如果同一资源有多种详情再增加语义路径 |
| 业务动作 | 使用 PUT 或 POST 搭配动作名,例如 /approve、/payment、/shipping |
| 批量动作 | 使用 /batch/... 或路径参数集合,必须说明幂等性和失败策略 |
| 文件上传 | 普通上传和预签名上传分开,上传完成需要显式确认 |
分页字段在历史接口中存在多种返回形态,前端已做兼容。新增接口应尽量统一分页模型,减少 content、records、rows 混用。
事务、幂等和异常
交易、资金、库存、物流和营销动作都需要严格处理事务和幂等。
| 场景 | 后端处理重点 |
|---|---|
| 下单 | 购物车归属、SKU 可售、库存、当前价格、优惠券选择和幂等键 |
| 支付 | 订单状态、支付流水、钱包入账、优惠券用券、补贴记录和事务提交顺序 |
| 取消 | 订单状态、卡券释放、预算释放和状态日志 |
| 退款 | 售后状态、商户退款异常、结算反冲、预算冲销和补贴治理 |
| 仓作业 | 包裹状态、当前仓库、库位、复核状态、任务占用和员工身份 |
| 结算 | 批次防重复、结算明细唯一性、佣金策略快照和钱包流水 |
异常处理原则:
- 业务校验失败抛出
BusinessException,由统一异常处理转换响应。 - Controller 不应通过大段
try/catch吞掉业务错误。 - 状态机动作失败时,错误信息应能让前端展示可操作原因。
- 涉及金额和钱包的操作需要保留业务单号,便于通过流水反查。
- 事务提交后才触发不可回滚的异步副作用,例如消息派发或外部通知。
幂等建议:
| 动作 | 幂等键建议 |
|---|---|
| 购物车下单 | 客户、客户类型、购物车项、数量、地址、优惠券 |
| SKU 直购 | 客户、客户类型、SKU、数量、地址、优惠券 |
| 支付 | 订单 ID、支付方式、支付流水号 |
| 发券 | 券池 ID、个人账户 ID、请求号 |
| 预算账务 | 预算池 ID、业务类型、业务单号 |
| 结算批次 | 结算日期、商户、店铺、批次号 |
鉴权与权限
- 登录接口返回
token,后续请求通过Authorization: Bearer <token>传递。 admin登录后通过/api/v1/info获取用户信息,通过/api/v1/routers获取菜单路由。- 微信小程序登录使用
/api/v1/login/wechat,未绑定手机号时继续调用/api/v1/login/wechat/phone/bind。 - 平台权限由用户、角色、菜单、权限标识组成;后端负责接口权限校验,前端负责菜单和按钮可见性控制。
权限标识规则
权限标识建议按 端别:领域:资源:动作 组织:
| 示例 | 含义 |
|---|---|
admin:product:spu:query |
管理端查询 SPU |
admin:merchant:shop:shelf:audit:edit |
管理端处理店铺上架审核 |
client:personal:order:query |
消费者查询个人订单 |
client:merchant:message:edit |
商户处理消息状态 |
admin:logistics:warehouse:dispatch:edit |
仓派送操作 |
后端新增接口时,需要同步确认菜单、按钮、角色和接口权限是否完整,否则会出现页面可见但接口被拒绝,或接口可访问但页面无入口的问题。
文件能力
文件接口分为文件和文件夹两组:
- 文件:访问 URL、普通上传、预签名上传、按路径上传、上传完成、移动、复制、删除。
- 文件夹:子文件和子文件夹列表、分页、详情、新建、修改、移动、复制、删除。
- 小程序头像当前走后端直传接口
/api/v1/system/user/profile/avatar/upload,不再依赖前端直传 OSS。
文件业务建议:
- 普通业务图片优先通过文件模块上传并保存
fileId。 - 页面展示时通过文件 URL 接口换取可访问地址。
- 大文件或需要客户端直传时使用预签名上传,并在上传完成后调用完成接口。
- 富文本中的图片应保存文件标识,避免只保存临时外链。
商品、价格和营销
商品价格现在由货架价格、原价格策略、活动价、优惠券和运费共同影响。当前价格计算是订单金额的基础,前端不应自行重算。
| 价格来源 | 所在模块 | 说明 |
|---|---|---|
| 货架价 | wt-business |
店铺上架后的基础售卖价 |
| 价格策略 | wt-business |
会员价、阶梯价、促销价等历史价格策略 |
| 活动价 | wt-market + wt-business |
平台或商户营销活动价,优先参与当前价格计算 |
| 优惠券 | wt-market + wt-user + wt-business |
用户卡券钱包中的平台券和商户券,订单试算后扣减 |
| 运费 | wt-logistics + wt-business |
国内和国际运费规则,加入订单应付金额 |
订单项会保存价格和营销快照,包括 promotionId、promotionData、couponDiscountAmount、platformCouponAmount、merchantCouponAmount 和 merchantSettlementBaseAmount,用于后续结算和退款追溯。
物流状态与仓作业
物流域以 wt-logistics 为核心,包含发货单、包裹、运单、车次、批次、仓库存和配送任务。
关键流程:
- 商户或平台生成发货单和发货明细。
- 包裹进入车次和批次,形成运单和轨迹。
- 仓库管理员确认车次到仓。
- 仓库管理员按批次号、包裹号或运单号执行入库预查询。
- 满足条件后正式入库,包裹进入仓内库存。
- 仓内复核后,包裹可进入中转或派送准备流程。
- 配送员领取或被分配派送任务,执行签收、失败上报或退仓。
海外仓当前使用通用仓接口 /api/v1/logistics/warehouse/...,通过场景组件校验仓库类型。当前派送加包允许 ARRIVED 或 STORED 包裹,但要求 reviewed = true,并校验当前仓、库位和目的地区;INBOUND 包裹需要先完成复核。
物流对象关系
| 对象 | 说明 | 典型关系 |
|---|---|---|
| 发货单 | 商户或订单维度的履约单据 | 包含多个发货明细 |
| 发货明细 | 具体订单商品的发货任务 | 可生成包裹或关联包裹 |
| 包裹 | 物流流转核心对象 | 可加入批次、车次、仓库存和派送任务 |
| 车次 | 一段运输任务 | 包含多个批次 |
| 批次 | 车次内的包裹集合 | 用于封批、装车和出库 |
| 运单 | 对外或内部物流单据 | 关联包裹和轨迹 |
| 分拣任务 | 仓内分拣集合 | 中转或派送前置作业 |
| 派送任务 | 配送员执行对象 | 包含多个派送明细 |
仓作业状态关注点
| 环节 | 成功后状态影响 | 需要关注 |
|---|---|---|
| 到仓确认 | 车次到达目标仓 | 不等于包裹已入库 |
| 正式入库 | 包裹进入仓内库存 | 会重置复核状态 |
| 仓内复核 | 包裹标记已复核,INBOUND 通常推进为 STORED |
派送加包依赖 reviewed = true |
| 中转发运 | 包裹离开当前仓 | 运单轨迹需要同步 |
| 分拣完成 | 包裹进入派送中 | 配送员任务需要生成或更新 |
| 签收失败 | 包裹进入异常或退仓链路 | 需要保留失败原因和处理人 |
消息与待办
消息中心支持多角色消息:
- 平台消息:模板、内容、路由规则、派发计划、派发日志、统计、公告。
- 个人消息:个人站内信、未读数、已读、置顶、重要标记、删除、订阅和偏好。个人订阅当前包含 SKU 到货、SKU 降价、店铺上新、订阅状态查询和订阅分页。
- 商户消息:商户站内信、未读数、已读、置顶、重要标记、删除和偏好。
- 员工消息:员工消息、员工待办和偏好。
待办适合承接审核、订单、发货、售后、仓作业等需要人工处理的业务事项。
消息域建议和业务事件解耦:业务模块只发出明确事件,消息模块根据模板、订阅、偏好和路由规则决定接收人、渠道和内容。这样能避免订单、物流、结算模块直接硬编码消息内容。
数据模型
当前数据模型按业务模块划分,不再按旧文档中的 mall-* 独立服务维护。核心数据域如下:
| 数据域 | 关键对象 |
|---|---|
| 用户与权限 | 用户、个人账户、企业账户、政府账户、商户账户、员工账户、角色、菜单、权限、登录日志 |
| 地址与钱包 | 收货地址、个人钱包、个人钱包流水、个人支付记录、商户钱包、保证金钱包、提现申请 |
| 商品 | 类目、品牌、属性、属性值、SPU、SKU、价格策略、店铺上架、上架审核、评价、评价回复 |
| 商户 | 商户店铺、商户仓库、商户库存、库存流水、佣金策略、结算批次、结算单、结算明细 |
| 订单 | 购物车、主订单、子订单、子订单明细、订单支付、订单取消、退货申请 |
| 物流 | 物流公司、运费规则、发货单、发货明细、包裹、包裹类型、件级单元、车次、批次、运单、轨迹、仓库存、分拣任务、派送任务、报关单 |
| 营销 | Banner、Banner 分组、广告位、广告位分组、公告、平台活动、商户活动、活动范围、优惠券、券池、活动价、预算池、成本日报、补贴确认、卡券钱包 |
| 消息 | 消息模板、消息内容、订阅、偏好、收件箱、派发计划、派发日志、待办、统计 |
| 系统基础 | 字典、参数配置、语言、地区、组织、文件、文件夹、监控日志 |
数据一致性重点
| 场景 | 一致性要求 |
|---|---|
| 下单与库存 | 创建订单、锁定库存、支付状态需要避免重复提交导致重复扣减 |
| 支付与订单 | 支付回调或支付动作必须幂等,不能重复入账 |
| 发货与包裹 | 发货明细、包裹、运单和轨迹需要保持可追踪关系 |
| 仓内操作 | 入库、复核、中转、派送不能跳过状态前置校验 |
| 结算与钱包 | 结算单、钱包余额和钱包流水需要可对账 |
| 消息与待办 | 业务事件重复触发时需要避免重复生成未处理待办 |
| 营销与预算 | 发券、用券、退款、活动价和补贴都需要能通过预算流水和分摊记录对账 |
定时任务
wt-quartz 承接周期性任务和任务日志。业务任务本身通常调用领域组件,不应在任务类里堆复杂规则。
| 任务方向 | 代表能力 | 维护要点 |
|---|---|---|
| 系统任务 | 任务调度、任务日志、手工执行、启停 | 任务参数和 cron 表达式需要可追溯 |
| 营销任务 | 活动到期结束、卡券过期、过期提醒、预算预警、预算对账、成本日报 | 任务应可重复执行,不应造成重复扣减或重复提醒 |
| 订单任务 | 待支付超时关闭 | 关闭订单时要释放卡券和预算预占 |
| 日志清理 | 登录日志、操作日志、任务日志 | 清理前确认审计保留周期 |
新增定时任务时需要同步:任务 Bean 名称、方法名、推荐 cron、影响数据、是否幂等、失败重试策略。
开发约定
- 新增接口优先沿用现有 Controller 风格和
/api/v1版本路径。 - 非必要不要在接口层使用
try/catch,让统一异常处理承接业务异常。 - 查询接口保持幂等,业务动作接口使用明确动作路径。
- 权限标识需要与菜单和前端按钮控制保持一致。
- 涉及中文的文案、注释和文档必须确保编码正常,中文与英文、数字之间保留空格。
排查入口
| 问题 | 优先检查 |
|---|---|
| 登录失败 | SysLoginController、验证码、JWT 配置、用户状态 |
| 菜单为空 | /api/v1/info、/api/v1/routers、用户角色和菜单绑定 |
| 接口 403 | @Operation 中权限标识、角色权限、前端按钮权限 |
| 文件无法显示 | 文件上传结果、fileId、文件 URL 接口、OSS 配置 |
| 小程序微信登录异常 | WxMiniProgramLoginController、微信配置、手机号绑定流程 |
| 商品价格异常 | 店铺上架、价格策略、SKU 当前价接口 |
| 优惠券不可用 | 卡券钱包状态、券池时间和库存、活动范围、订单店铺和金额门槛 |
| 活动价不生效 | 活动状态、活动时间、店铺范围、SKU 范围、活动价策略启停和冲突组 |
| 预算对不上 | 预算池余额、预算流水、用券分摊记录、退款冲销和剩余预算退回 |
| 物流无法推进 | 包裹状态、当前仓、库位、复核状态、活跃任务占用 |
| 结算金额异常 | 佣金策略版本、订单完成状态、结算批次和钱包流水 |