升鲜宝后端 API 与手机端 API 开发说明(一)---升鲜宝生鲜配送供应链管理系统重构版

升鲜宝后端 API 与手机端 API
开发说明

项目源代码改造版 · Spring Boot + MyBatis-Plus

适用范围:管理后台 API、手机端 API、小程序 API、POS/API、公共 API、开放 API

版本:V1.0
日期:2025-04-21

 

文档目录

1. 文档目标与总体结论

2. API 分层原则:入口分开,业务共用

3. 管理后台 API 与手机端 API 的利弊分析

4. 升鲜宝推荐后端分层架构

5. API 路径、命名与版本规范

6. Spring Boot 项目结构与包命名规范

7. DTO / VO / Query / Convert 设计规范

8. 权限、租户、数据权限与字段权限设计

9. 管理后台 API 开发规范

10. 手机端 API 开发规范

11. 公共 API、开放 API、POS/API 的边界

12. 核心业务域 API 清单建议

13. 我的中心模块 API 改造示例

14. 代码骨架与标准模板

15. 旧项目 API 改造实施路线图

16. 测试、审计、日志、缓存与上线检查

17. 附录:接口评审清单与迁移清单

 

1. 文档目标与总体结论

本说明用于指导升鲜宝供应链管理系统在 Spring Boot 项目中,统一改造“后端管理端 API”和“手机端 API”的代码结构、接口命名、权限控制、DTO/VO 设计、Service 复用、缓存与审计策略。

本文重点不是简单新增接口,而是建立一套可长期演进的 API 分层规范,方便后续逐步改造商品、订单、采购、仓储、门店、POS、CRM、财务、打印、设置等模块。

1.1 最终结论

升鲜宝推荐原则:
API 入口分开
业务 Service 共用
Domain 规则共用
Mapper / Entity 共用
DTO / VO 按端区分
权限、数据范围、字段输出按端区分

层级

是否共用

说明

Controller

不建议完全共用

管理后台、手机端、POS、小程序、开放接口的入口语义不同,应独立定义路径和返回结构。

Facade

按端聚合

手机端常用 BFF 聚合接口;后台端偏 CRUD 与配置管理。

Service

必须共用

业务规则和写入逻辑不能重复实现,应统一在 Service / Domain 层。

Domain Service

必须共用

审核、库存、成本、价格、权限等核心规则必须统一。

Mapper / Entity

必须共用

统一数据访问和数据模型,避免产生两套表或两套实体。

DTO / VO

建议分开

不同端请求字段、展示字段、权限字段不同,避免字段泄露和返回臃肿。

权限编码

建议分开

后台管理权限和手机端操作权限颗粒度不同。

 

2. API 分层原则:入口分开,业务共用

升鲜宝是企业级业务系统,未来会存在 PC 后台、移动 App、小程序、POS 收银端、仓库 PDA、司机端、供应商协同端、客户协同端等多个入口。不同入口面对的角色不同、交互方式不同、接口版本节奏不同,因此不建议把所有接口混在一个 Controller 中。

2.1 正确的共用方式

controller/admin  ->  Admin API:后台配置、审核、维护、统计
controller/app    ->  App API:移动端页面展示、个人操作、移动业务动作
controller/pos    ->  POS API:收银、离线同步、设备相关
controller/open   ->  Open API:第三方对接、签名、限流
controller/common ->  Common API:字典、文件、地区、验证码等公共能力

以上入口可以不同,但最终都调用同一批 Service / Domain / Mapper。

2.2 错误的共用方式

  • PC 后台列表接口直接给手机端使用,导致手机端拿到大量无用字段。
  • 手机端新增接口直接操作 Mapper,绕开后台 Service 规则。
  • 后台端和手机端各写一套审核、反审核、库存扣减、成本计算逻辑。
  • 用同一个 VO 同时返回给后台和手机端,造成权限字段、内部状态、审计字段泄露。
  • 同一个接口内部大量 if 判断 terminalType,导致 Controller 越来越难维护。

3. 管理后台 API 与手机端 API 的利弊分析

3.1 分开接口的优点

优点

说明

对升鲜宝的价值

安全性更高

后台管理字段、权限字段、审计字段不直接暴露给手机端。

降低越权、字段泄露、误操作风险。

职责更清晰

后台 API 偏管理配置,手机 API 偏页面展示和移动操作。

代码结构清楚,后续模块多人协作更容易。

返回更轻量

手机端只返回页面需要的字段。

减少移动网络传输,提高页面响应速度。

版本更好管理

App/小程序发版慢,需要 v1/v2 兼容;后台可快速升级。

避免后台改动影响已上线移动端。

权限更容易落地

后台权限、手机端权限、POS 权限颗粒度不同。

RBAC + 数据权限 + 字段权限更好配置。

支持 BFF 聚合

手机页面可用一个接口聚合用户、菜单、授权、消息等。

减少移动端多次请求。

 

3.2 分开接口的缺点与解决办法

缺点

风险

解决办法

Controller 数量变多

初期看起来目录更多。

app/admin/pos/open/common 分包,命名统一。

DTO / VO 变多

维护对象增加。

Convert 层统一转换,DTO/VO 只做入参与出参。

可能重复业务

如果 Controller 写业务,会产生两套逻辑。

规定业务只能写在 Service / Domain,Controller 只收参和返回。

接口文档变多

前端联调需要区分端。

统一 Swagger 分组、Apifox 分组、接口命名规范。

 

3.3 什么时候可以共用接口

接口类型

是否适合共用

示例

公共字典

适合

/api/common/dict/list

地区树

适合

/api/common/area/tree

文件上传

适合,但要控制业务类型

/api/common/file/upload

验证码

适合

/api/common/captcha

用户资料

可共用基础能力,但输出要按端过滤

/api/common/user/current

菜单管理

不适合

后台维护菜单,手机端只读取可见菜单。

订单审核

不适合直接共用

后台审核和移动端操作要区分权限、日志、终端来源。

系统设置

不适合直接共用

后台配置全局参数,手机端保存个人偏好。

 

4. 升鲜宝推荐后端分层架构

推荐采用“多入口 Controller + Facade 聚合 + Service 业务复用 + Domain 规则中心 + Mapper 数据访问”的结构。

请求入口层
├── AdminController:后台管理接口
├── AppController:手机端/小程序接口
├── PosController:POS / 设备接口
├── OpenController:第三方开放接口
└── CommonController:公共接口

聚合编排层
├── Facade:页面聚合、跨 Service 编排、权限过滤、VO 组装

业务服务层
├── Service:业务能力、事务边界、幂等校验、状态机
├── DomainService:库存、成本、价格、审核、权限等核心规则

数据访问层
├── Mapper:MyBatis-Plus 数据访问
├── Entity:数据库实体
└── QueryFacade:复杂查询、排序白名单、分页适配

基础能力层
├── Security:JWT、RBAC、数据权限
├── Cache:Redis / Caffeine
├── Log:操作日志 / 审计日志
├── ErrorCode:错误码
└── Util:公共工具

4.1 Controller 职责边界

职责

允许做

禁止做

参数接收

接收 DTO / Query / PathVariable。

不要直接接收 Entity 作为业务入参。

参数校验

@Validated、简单必填校验。

不要写复杂业务规则。

权限入口

@PreAuthorize、接口权限声明。

不要在 Controller 写复杂数据权限 SQL。

调用服务

调用 Facade 或 Service。

不要直接调用 Mapper。

统一返回

包装 Result / PageResult。

Service 接口不要返回 Result。

 

4.2 Facade 职责边界

  • 负责页面级聚合接口,例如手机端首页、我的中心、订单详情、商品详情。
  • 负责调用多个 Service 后组装 VO。
  • 负责按端过滤字段、菜单、按钮、操作入口。
  • 负责组合查询,不直接承载核心业务写入规则。
  • 复杂写入仍由 Service 作为事务边界。
  • Service 是后台、手机端、POS、开放接口共用的业务能力层。
  • 审核、反审核、库存过账、成本计算、付款、核销等必须写在 Service / Domain 中。
  • Service 方法不要返回 Result,直接返回业务对象或 void,异常用 SxbException 抛出。
  • Service 方法要具备幂等性、状态校验、租户隔离、操作日志能力。

4.3 Service 职责边界

5. API 路径、命名与版本规范

5.1 推荐路径前缀

前缀

用途

示例

/api/admin

PC 管理后台 API

/api/admin/pms/goods/page

/api/app

手机 App / 小程序 API

/api/app/mine/home

/api/pos

POS 收银端 API

/api/pos/sale/order/create

/api/pda

仓库 PDA / 手持终端 API

/api/pda/wms/pick/task/list

/api/open

第三方开放接口

/api/open/order/push

/api/common

公共接口

/api/common/dict/list

 

5.2 业务域路径建议

业务域

域编码

后台路径示例

手机路径示例

系统/RBAC

sys

/api/admin/sys/user/page

/api/app/user/current

我的中心

mine

/api/admin/mine/menu/page

/api/app/mine/home

商品中心

pms

/api/admin/pms/goods/page

/api/app/pms/goods/search

采购

pur

/api/admin/pur/order/page

/api/app/pur/order/detail

供应商

sup

/api/admin/sup/supplier/page

/api/app/sup/order/confirm

订单

oms

/api/admin/oms/order/page

/api/app/oms/order/list

仓库

wms

/api/admin/wms/stockin/page

/api/app/wms/task/list

门店仓储

hwms

/api/admin/hwms/inventory/page

/api/app/hwms/stocktake/create

POS

pos

/api/admin/pos/shift/page

/api/pos/sale/submit

CRM

crm

/api/admin/crm/customer/page

/api/app/crm/lead/create

财务

fin

/api/admin/fin/receivable/page

/api/app/fin/bill/list

 

5.3 动作命名规范

场景

推荐路径

说明

分页查询

GET /page

后台列表查询使用 page。

详情

GET /detail/{id}

ID 获取详情。

新增

POST /save

创建新记录。

修改

POST /update

更新记录。

删除

POST /delete

逻辑删除,支持批量时使用 ids。

启用

POST /enable

状态动作。

停用

POST /disable

状态动作。

审核

POST /approve

单据审核。

反审核

POST /unapprove

单据反审核。

导出

POST /export

复杂条件建议 POST。

导入

POST /import

上传文件并按 schemeId 执行。

 

5.4 手机端版本管理

手机端、小程序、POS 端发版周期与后台不同,建议从一开始支持版本前缀。

推荐:
/api/app/v1/mine/home
/api/app/v2/mine/home

也可在初期先使用:
/api/app/mine/home

Controller 内部要保留版本兼容意识,避免随意删除字段或改变字段语义。

6. Spring Boot 项目结构与包命名规范

以下结构适合升鲜宝单体模块化项目,也适合未来逐步拆分微服务。

src/main/java/com/sxb/scm
├── common
│   ├── result
│   ├── exception
│   ├── security
│   ├── tenant
│   ├── datasource
│   ├── permission
│   ├── log
│   ├── cache
│   └── utils

└── modules
    ├── sys
    ├── mine
    ├── pms
    ├── pur
    ├── sup
    ├── oms
    ├── wms
    ├── hwms
    ├── pos
    ├── crm
    └── fin

6.1 单个业务模块标准结构

modules/{domain}
├── controller
│   ├── admin
│   ├── app
│   ├── pos
│   └── open
├── facade
├── service
│   └── impl
├── domain
├── mapper
├── entity
├── dto
├── vo
├── query
├── convert
├── enums
├── constant
├── validator
└── support

目录

职责

controller/admin

PC 管理后台 API。

controller/app

手机 App / 小程序 API。

controller/pos

POS、PDA、设备端 API。

controller/open

外部系统对接 API。

facade

页面聚合与跨服务编排。

service

业务接口,Controller 调用入口,不返回 Result。

domain

核心业务规则、状态机、库存/成本/审核引擎。

mapper/entity

MyBatis-Plus 数据访问与实体。

dto/query/vo

入参、查询条件、出参。

convert

Entity、DTO、VO 转换。

validator

业务校验器。

 

7. DTO / VO / Query / Convert 设计规范

7.1 命名规范

类型

命名示例

说明

新增 DTO

GoodsSaveDTO

新增业务入参。

修改 DTO

GoodsUpdateDTO

修改业务入参。

状态 DTO

OrderApproveDTO

审核、反审核、启停等动作入参。

查询 Query

GoodsPageQuery

分页查询条件。

后台 VO

AdminGoodsDetailVO

后台详情返回,可包含管理字段。

手机端 VO

AppGoodsItemVO

手机端列表返回,字段精简。

聚合 VO

MineHomeVO

页面聚合返回。

转换器

GoodsConvert

Entity <-> VO/DTO 转换。

 

7.2 Entity 不直接作为接口入参

不建议 Controller 直接接收 Entity,因为 Entity 对应数据库字段,容易暴露 deleted、tenantId、createUserId、approveStatus、成本价等内部字段。

错误示例:
@PostMapping("/save")
public Result<Void> save(@RequestBody PmsGoodsEntity entity) { ... }

推荐示例:
@PostMapping("/save")
public Result<Void> save(@Validated @RequestBody GoodsSaveDTO dto) { ... }

7.3 后台 VO 与手机端 VO 分开

字段类型

后台 VO

手机端 VO

主键 ID

返回

按需返回,必要时可加密或只返回业务 ID。

创建/修改时间

返回

一般不返回,除非页面需要。

删除标记

不返回或仅管理页返回

不返回。

权限编码

管理页可返回

不返回。

成本价/毛利

按权限返回

默认不返回。

展示名称/图标/状态

返回

返回。

 

8. 权限、租户、数据权限与字段权限设计

8.1 认证信息建议

JWT 或登录上下文中建议包含以下信息,便于后台和手机端统一鉴权。

字段

说明

userId

当前登录用户 ID。

tenantId

当前租户 ID。

orgId

组织 ID。

shopId

门店 ID,可为空。

warehouseId

仓库 ID,可为空。

roleCodes

角色编码集合。

terminalType

admin/app/pos/pda/open。

language

当前语言,支持 i18n。

 

8.2 权限分层

权限类型

说明

示例

菜单权限

控制能否看到模块菜单。

pms:goods:menu

按钮权限

控制新增、修改、删除、审核等动作。

oms:order:approve

场景权限

同一个基础能力在不同业务场景下控制。

goods:select:orderCreate

数据权限

控制能看到哪些租户、组织、门店、仓库、客户数据。

tenant/org/shop/customer scope

字段权限

控制成本价、毛利、手机号等敏感字段是否返回。

goods:costPrice:view

 

8.3 数据权限处理建议

  • 后台列表查询必须经过 DataScopeEngine,支持租户、组织、门店、仓库、客户、供应商等范围。
  • 手机端接口默认只能访问当前用户绑定的门店、仓库、司机任务、客户范围。
  • QueryFacade 负责排序白名单、分页适配、别名映射,避免前端传任意 SQL 字段。
  • 复杂 JOIN 查询要明确表别名,例如 o.tenant_id、o.shop_id,便于数据权限注入。

9. 管理后台 API 开发规范

管理后台 API 主要面向系统管理员、老板、财务、采购主管、仓库主管、客服、运营人员。它的特点是配置、管理、审核、查询、导入导出、统计报表。

9.1 后台接口常用能力

能力

接口建议

说明

分页查询

GET /page

支持多条件、排序白名单、数据权限。

详情

GET /detail/{id}

返回完整管理字段。

新增

POST /save

DTO 入参,Service 事务处理。

修改

POST /update

DTO 入参,不允许越权修改租户字段。

删除

POST /delete

逻辑删除,记录操作日志。

审核

POST /approve

单据状态机,幂等校验。

反审核

POST /unapprove

必须反向回滚库存/成本/关联单据。

导入

POST /import

结合 EasyExcel 与导入方案配置中心。

导出

POST /export

大数据量使用异步导出任务。

 

9.2 后台 Controller 模板

@RestController
@RequestMapping("/api/admin/pms/goods")
@RequiredArgsConstructor
public class AdminGoodsController {

    private final GoodsService goodsService;

    @GetMapping("/page")
    @PreAuthorize("hasAuthority('pms:goods:page')")
    public Result<PageResult<AdminGoodsPageVO>> page(@Validated GoodsPageQuery query) {
        return Result.ok(goodsService.pageAdminGoods(query));
    }

    @PostMapping("/save")
    @PreAuthorize("hasAuthority('pms:goods:save')")
    public Result<Void> save(@Validated @RequestBody GoodsSaveDTO dto) {
        goodsService.saveGoods(dto);
        return Result.ok();
    }
}

10. 手机端 API 开发规范

手机端 API 面向业务员、司机、仓库员、门店员工、收银员、团长、客户、供应商协同用户等移动场景。它的核心不是“完整管理字段”,而是“少请求、轻字段、弱网可用、操作安全”。

10.1 手机端接口设计原则

  • 页面聚合:一个页面尽量一个聚合接口返回基本数据,减少移动端请求次数。
  • 字段精简:只返回 UI 展示与操作必需字段。
  • 按角色过滤:菜单、按钮、功能入口按当前用户权限过滤。
  • 强版本兼容:App 已发版接口不能随意删除字段或改变字段类型。
  • 弱网处理:关键操作支持幂等 key、重试、离线缓存或失败补偿。
  • 敏感字段默认不返回:成本价、毛利、内部审批备注等字段要受控。

10.2 手机端 BFF 聚合接口模板

@RestController
@RequestMapping("/api/app/mine")
@RequiredArgsConstructor
public class AppMineController {

    private final MineHomeFacade mineHomeFacade;

    @GetMapping("/home")
    @PreAuthorize("hasAuthority('mine:home:view')")
    public Result<MineHomeVO> home(@RequestHeader(value = "X-Terminal", required = false) String terminal) {
        return Result.ok(mineHomeFacade.getMineHome(terminal));
    }
}

10.3 手机端响应字段建议

字段原则

说明

只返回必要字段

列表中不要返回完整 Entity。

金额字段统一格式

BigDecimal 原值 + 展示字符串按需返回。

状态字段双返回

statusCode + statusName,方便前端展示。

图片字段返回完整 URL

避免前端拼接路径。

操作按钮由后端返回

根据权限、状态、终端返回 allowedActions。

服务端兜底

前端隐藏按钮不等于权限校验,后端必须再次校验。

 

11. 公共 API、开放 API、POS/API 的边界

11.1 公共 API

公共 API 是各端都可复用的基础能力,但仍需按业务类型控制权限、文件大小、访问频率。

接口

说明

/api/common/dict/list

数据字典列表。

/api/common/area/tree

省市区树。

/api/common/file/upload

文件上传,需传业务类型 bizType。

/api/common/captcha

验证码。

/api/common/version/check

版本检查。

 

11.2 开放 API

开放 API 面向第三方系统,需要单独的签名、AppKey、时间戳、防重放、IP 白名单、限流、审计日志。不要直接复用后台 Controller。

/api/open/v1/order/push
/api/open/v1/inventory/query
/api/open/v1/customer/sync

Header:
X-App-Key
X-Timestamp
X-Nonce
X-Signature
X-Tenant-Code

11.3 POS / PDA API

POS 与 PDA 需要考虑设备编号、离线同步、幂等提交、数据增量拉取、价格缓存、库存缓存、打印设备等能力,建议独立路径。

接口

说明

/api/pos/login

POS 设备登录。

/api/pos/sync/pull

拉取商品、价格、会员、促销等增量数据。

/api/pos/sale/submit

提交销售订单,必须带幂等号。

/api/pda/wms/pick/task/list

PDA 拣货任务。

/api/pda/wms/stocktake/submit

PDA 盘点提交。

 

12. 核心业务域 API 清单建议

以下清单用于改造整个升鲜宝项目源代码时做接口归类。实际开发时可按模块逐步落地,不要求一次性全部改完。

12.1 系统与权限域 sys

方法

路径

说明

共用服务

后台

GET

/api/admin/sys/user/page

用户分页查询

SysUserService

后台

POST

/api/admin/sys/user/save

新增用户

SysUserService

后台

POST

/api/admin/sys/role/save

新增角色

SysRoleService

后台

POST

/api/admin/sys/menu/save

新增菜单

SysMenuService

手机

GET

/api/app/user/current

获取当前用户

UserProfileFacade

公共

GET

/api/common/dict/list

字典列表

DictService

 

12.2 商品域 pms

方法

路径

说明

共用服务

后台

GET

/api/admin/pms/goods/page

商品分页管理

GoodsService

后台

POST

/api/admin/pms/goods/save

新增商品

GoodsService

后台

POST

/api/admin/pms/goods/update

修改商品

GoodsService

后台

GET

/api/admin/pms/unit/page

单位管理

UnitService

手机

GET

/api/app/pms/goods/search

移动端商品搜索

GoodsQueryFacade

手机

GET

/api/app/pms/goods/detail/{id}

移动端商品详情

GoodsQueryFacade

 

12.3 采购与供应商域 pur/sup

方法

路径

说明

共用服务

后台

GET

/api/admin/pur/order/page

采购订单分页

PurchaseOrderService

后台

POST

/api/admin/pur/order/approve

采购订单审核

PurchaseOrderService

后台

GET

/api/admin/sup/supplier/page

供应商分页

SupplierService

手机

GET

/api/app/pur/order/list

移动端采购订单列表

PurchaseOrderFacade

手机

POST

/api/app/sup/order/confirm

供应商确认订单

SupplierOrderService

 

12.4 订单域 oms

方法

路径

说明

共用服务

后台

GET

/api/admin/oms/order/page

订单分页

OrderService

后台

POST

/api/admin/oms/order/approve

订单审核

OrderService

后台

POST

/api/admin/oms/order/cancel

订单取消

OrderService

手机

GET

/api/app/oms/order/list

我的订单列表

OrderFacade

手机

GET

/api/app/oms/order/detail/{id}

订单详情

OrderFacade

手机

POST

/api/app/oms/order/create

移动端下单

OrderCreateService

 

12.5 公司仓库域 wms

方法

路径

说明

共用服务

后台

GET

/api/admin/wms/stockin/page

入库单分页

StockinService

后台

POST

/api/admin/wms/stockin/approve

入库审核

StockinService

后台

GET

/api/admin/wms/stockout/page

出库单分页

StockoutService

后台

POST

/api/admin/wms/stocktake/approve

盘点审核

StocktakeService

手机

GET

/api/app/wms/task/list

移动仓库任务列表

WmsTaskFacade

手机

POST

/api/app/wms/stockin/receive

移动收货确认

StockinService

 

12.6 门店仓储与 POS 域 hwms/pos

方法

路径

说明

共用服务

后台

GET

/api/admin/hwms/inventory/page

门店库存分页

HwmsInventoryService

后台

GET

/api/admin/pos/shift/page

收银班次分页

PosShiftService

手机

GET

/api/app/hwms/stocktake/list

门店盘点列表

HwmsStocktakeFacade

手机

POST

/api/app/hwms/stocktake/submit

门店盘点提交

HwmsStocktakeService

POS

POST

/api/pos/sale/submit

收银订单提交

PosSaleService

POS

GET

/api/pos/sync/pull

POS 增量同步

PosSyncService

 

12.7 CRM 与财务域 crm/fin

方法

路径

说明

共用服务

后台

GET

/api/admin/crm/customer/page

客户分页

CustomerService

后台

POST

/api/admin/crm/customer/save

新增客户

CustomerService

手机

POST

/api/app/crm/lead/create

手机端新增线索

CustomerLeadService

后台

GET

/api/admin/fin/receivable/page

应收分页

ReceivableService

后台

POST

/api/admin/fin/payment/approve

收付款审核

PaymentService

手机

GET

/api/app/fin/bill/list

移动端账单列表

BillFacade

 

13. 我的中心模块 API 改造示例

我的中心是最适合先改造的模块,因为它天然同时包含手机端展示接口和后台配置接口。

13.1 手机端 API

方法

路径

说明

返回对象

GET

/api/app/mine/home

我的中心首页聚合:用户信息、授权信息、菜单分组。

MineHomeVO

GET

/api/app/mine/profile

个人资料。

MineProfileVO

POST

/api/app/mine/profile/update

修改个人资料。

Void

GET

/api/app/mine/qrcode

我的二维码/推广码。

MineQrCodeVO

GET

/api/app/mine/support/config

客服热线、在线客服、CEO 邮箱配置。

List<MineSupportConfigVO>

POST

/api/app/mine/feedback/submit

提交反馈。

Void

GET

/api/app/mine/print/device/list

我的打印设备列表。

List<MinePrintDeviceVO>

POST

/api/app/mine/print/device/save

保存打印设备。

Void

POST

/api/app/mine/print/test

打印测试。

MinePrintTestVO

GET

/api/app/mine/setting/list

用户设置项列表。

List<MineSettingGroupVO>

POST

/api/app/mine/setting/save

保存用户设置。

Void

 

13.2 后台管理 API

方法

路径

说明

返回对象

GET

/api/admin/mine/menu/page

我的中心菜单配置分页。

PageResult<AdminMineMenuVO>

POST

/api/admin/mine/menu/save

新增菜单配置。

Void

POST

/api/admin/mine/menu/update

修改菜单配置。

Void

POST

/api/admin/mine/menu/delete

删除菜单配置。

Void

POST

/api/admin/mine/menu/enable

启用菜单。

Void

POST

/api/admin/mine/menu/disable

停用菜单。

Void

GET

/api/admin/mine/support/page

客服配置分页。

PageResult<AdminSupportConfigVO>

POST

/api/admin/mine/support/save

保存客服配置。

Void

GET

/api/admin/mine/feedback/page

用户反馈分页。

PageResult<AdminFeedbackVO>

POST

/api/admin/mine/feedback/reply

回复用户反馈。

Void

GET

/api/admin/mine/print/device/page

打印设备分页。

PageResult<AdminPrintDeviceVO>

 

13.3 共用 Service

Service

职责

MineMenuService

菜单配置、启停、按终端和权限过滤。

MineUserSettingService

用户个性化设置保存、查询、重置。

MineSupportConfigService

客服热线、在线客服、CEO 邮箱配置。

MineFeedbackService

反馈提交、查询、回复、关闭。

MinePrintDeviceService

打印设备保存、默认设置、删除、测试。

MineHomeFacade

手机端我的中心首页聚合。

 

14. 代码骨架与标准模板

14.1 Service 接口模板

public interface MineMenuService extends IService<MineMenuEntity> {

    PageResult<AdminMineMenuVO> pageAdmin(MineMenuPageQuery query);

    List<MineMenuGroupVO> listAppMenuGroups(Long tenantId, Long userId, String terminalType);

    void saveMenu(MineMenuSaveDTO dto);

    void updateMenu(MineMenuUpdateDTO dto);

    void enable(Long id);

    void disable(Long id);
}

说明:Service 接口不返回 Result,Result 只出现在 Controller 层。

14.2 Facade 聚合模板

@Service
@RequiredArgsConstructor
public class MineHomeFacade {

    private final MineMenuService mineMenuService;
    private final MineSupportConfigService supportConfigService;
    private final LicenseService licenseService;
    private final UserProfileService userProfileService;

    public MineHomeVO getMineHome(String terminalType) {
        Long tenantId = LoginUserContext.getTenantId();
        Long userId = LoginUserContext.getUserId();

        MineUserInfoVO userInfo = userProfileService.getMineUserInfo(userId);
        MineLicenseInfoVO licenseInfo = licenseService.getMineLicenseInfo(tenantId);
        List<MineMenuGroupVO> menuGroups = mineMenuService.listAppMenuGroups(tenantId, userId, terminalType);

        MineHomeVO vo = new MineHomeVO();
        vo.setUserInfo(userInfo);
        vo.setLicenseInfo(licenseInfo);
        vo.setMenuGroups(menuGroups);
        return vo;
    }
}

14.3 Entity 模板

@Data
@TableName("mine_menu")
public class MineMenuEntity {

    @TableId(type = IdType.AUTO)
    private Long id;

    private Long tenantId;

    private String menuCode;

    private String menuName;

    private String groupCode;

    private String iconCode;

    private String iconUrl;

    private String path;

    private String permissionCode;

    private String terminalType;

    private Integer visibleFlag;

    private Integer enabledFlag;

    private Integer sortNo;

    private String remark;

    private LocalDateTime createTime;

    private LocalDateTime updateTime;

    private Integer deleted;
}

14.4 Controller 命名模板

Controller 命名

路径

后台

AdminMineMenuController

/api/admin/mine/menu

手机

AppMineController

/api/app/mine

POS

PosSaleController

/api/pos/sale

PDA

PdaPickTaskController

/api/pda/wms/pick/task

开放

OpenOrderController

/api/open/v1/order

公共

CommonDictController

/api/common/dict

 

15. 旧项目 API 改造实施路线图

为了降低风险,不建议一次性推倒重来。应按“接口盘点 -> 分类 -> 抽 Service -> 分 Controller -> 建 VO -> 加权限 -> 保持兼容 -> 灰度上线”的方式逐步改造。

15.1 改造步骤

1. 接口盘点:导出所有 Controller 路径,按业务域、终端、权限、是否外部使用进行分类。

2. 识别混用接口:找出 PC 后台和手机端共同调用的接口,标记字段泄露、权限混乱、返回臃肿问题。

3. 抽取共用 Service:把 Controller 中业务逻辑迁移到 Service / Domain。

4. 拆分 Controller:新增 controller/admin、controller/app、controller/pos 等入口。

5. 拆分 DTO/VO:后台 VO 保留管理字段,手机端 VO 做字段精简。

6. 补齐权限:为每个新接口配置权限编码、菜单、按钮、数据权限。

7. 兼容旧接口:旧接口保留一段时间,内部调用新 Service,并标记 deprecated。

8. 联调与回归:按模块进行接口自动化测试、权限测试、字段脱敏测试。

9. 灰度上线:优先改造我的中心、系统设置、商品查询等风险较低模块,再改造订单、库存、财务。

15.2 推荐改造优先级

优先级

模块

原因

P0

公共 Result、ErrorCode、LoginUserContext、权限注解

所有接口的基础能力,先统一。

P1

我的中心 / 设置 / 客服 / 打印

边界清晰,风险较低,适合做样板。

P1

商品查询接口

后台管理与手机端选择商品差异明显。

P2

订单 OMS

业务核心,先抽 Service,再拆接口。

P2

采购 / 供应商

涉及供应商协同端,应区分 admin/app/open。

P3

WMS / HWMS / POS

涉及库存和离线设备,需要充分测试。

P3

财务

权限敏感,字段权限和审计必须完善后再改。

 

15.3 兼容旧接口策略

  • 旧接口不要立即删除,先保留并在代码中标记 @Deprecated。
  • 旧接口内部调用新的 Service,避免维护两套逻辑。
  • 通过网关、日志或埋点统计旧接口调用量。
  • 前端全部迁移完成并运行一个版本周期后,再删除旧接口。
  • 对手机端旧版本接口,必须保留更长兼容期。

16. 测试、审计、日志、缓存与上线检查

16.1 接口测试维度

测试类型

检查内容

功能测试

新增、修改、删除、审核、反审核、查询、导入导出是否正常。

权限测试

无权限用户不能访问,越权数据不能返回。

字段权限测试

成本价、手机号、毛利等敏感字段是否按权限返回。

租户隔离测试

A 租户不能访问 B 租户数据。

幂等测试

重复提交不会重复生成单据、重复扣库存、重复付款。

版本兼容测试

手机端旧版本字段仍能正常解析。

性能测试

分页、列表、聚合接口响应时间符合要求。

 

16.2 操作日志与审计

  • 后台新增、修改、删除、审核、反审核必须记录操作日志。
  • 手机端关键动作如收货、发货、签收、盘点、提交反馈也要记录终端来源。
  • 开放 API 必须记录 appKey、请求体摘要、签名结果、响应结果、耗时。
  • 失败日志要能定位 userId、tenantId、接口、参数摘要、错误码。

16.3 缓存建议

数据

缓存策略

失效方式

菜单配置

Redis + Caffeine,可按 tenantId + terminalType 缓存。

菜单新增/修改/启停后清理。

数据字典

高频缓存。

字典变更后清理。

用户设置

tenantId + userId 缓存。

用户保存设置后清理。

客服配置

低频变更,高频读取。

后台修改后清理。

商品基础信息

可缓存热点商品。

商品更新、价格更新后清理。

库存数量

谨慎缓存,关键扣减必须查数据库/库存引擎。

库存过账后失效或使用实时表。

 

16.4 错误码规范

建议继续使用升鲜宝分域错误码,Service 抛业务异常,Controller 统一转换为 Result。

编码段

示例

系统权限

10xxx

10001 用户未登录,10002 无权限。

商品

20xxx

20001 商品不存在。

订单

30xxx

30001 订单状态不允许审核。

仓库

40xxx

40001 库存不足。

门店

45xxx

45001 门店库存不存在。

我的中心

58xxx

58001 菜单不存在,58004 打印设备不存在。

财务

60xxx

60001 凭证不平。

 

17. 附录:接口评审清单与迁移清单

17.1 新接口评审清单

检查项

是否必须

说明

路径是否符合 /api/{端}/{域}/{资源}

路径必须清晰表达终端与业务域。

Controller 是否只做入口

不得直接写复杂业务,不得直接调 Mapper。

Service 是否可复用

后台、手机端、POS 能共用的业务能力必须沉淀到 Service。

DTO/VO 是否按端区分

避免字段泄露和返回臃肿。

是否配置权限编码

接口、按钮、场景权限必须清晰。

是否支持租户隔离

所有业务表必须受 tenantId 控制。

是否需要幂等

按场景

订单、库存、付款、打印重试等必须幂等。

是否记录操作日志

按场景

写操作、审核、反审核必须记录。

是否需要版本兼容

手机端必须

App、小程序接口字段不能随意破坏。

 

17.2 旧接口迁移清单模板

旧接口

新后台接口

新手机接口

共用 Service

迁移状态

/goods/list

/api/admin/pms/goods/page

/api/app/pms/goods/search

GoodsService

待迁移

/order/list

/api/admin/oms/order/page

/api/app/oms/order/list

OrderService

待迁移

/setting/list

/api/admin/mine/menu/page

/api/app/mine/setting/list

MineUserSettingService

待迁移

/print/list

/api/admin/mine/print/device/page

/api/app/mine/print/device/list

MinePrintDeviceService

待迁移

 

17.3 最终落地标准

升鲜宝 API 改造最终标准:

1. 后台管理端 Controller 与手机端 Controller 分开。
2. Service、Domain、Mapper、Entity 共用。
3. Service 接口不返回 Result。
4. Entity 不作为 Controller 入参。
5. AdminVO 与 AppVO 分开。
6. 所有接口都有权限编码、错误码、日志策略。
7. 手机端接口优先采用页面聚合接口,减少请求次数。
8. 旧接口迁移期间保留兼容层,稳定后再删除。
9. 所有核心写操作具备幂等能力。
10. 租户隔离、数据权限、字段权限必须作为底层能力统一处理。

以上规范可作为升鲜宝后端项目整体改造的 API 开发基准文档。建议先从“我的中心/设置模块”按本规范落地一版,再逐步推广到商品、订单、采购、仓储、门店、POS、CRM、财务等核心业务域。

posted @ 2026-04-26 22:20  升鲜宝生鲜供应链系统  阅读(6)  评论(0)    收藏  举报