📅 创建时间:2026-05-20
🏷️ 标签: Spring Cloud 微服务 UniApp Vue 2 电商系统 全栈架构
📍 项目路径:E:\workSpace\mall-app
Mall-App 是一个完整的生产级电商系统,由两个独立子项目组成,协同工作构成全栈解决方案:
基于 UniApp (Vue 2) 的移动端购物前端,一套代码编译到 H5、Android、iOS、微信小程序四大平台。通过 HTTP REST API 与后端 mall-portal 服务通信,基础 URL 为 http://localhost:8085。
基于 Spring Boot 3.2 + Spring Cloud 2023 + Spring Cloud Alibaba 的 Java 微服务后端,源自知名开源项目 mall-swarm (macrozheng)。包含认证、网关、管理后台、商城门户、商品搜索、监控等 9 个微服务模块。
luch-request 封装请求,自动附带 Authorization tokenmall-gateway 校验 Sa-Token,路由到目标微服务mall-portal Controller → Service → DAO 执行业务逻辑CommonResult<T> 统一格式返回,前端解析展示mall-app-web-master/
├── api/ # API 请求定义 (11 个模块)
├── components/ # 可复用组件 (2 个)
│ ├── mix-loading/ # 加载指示器
│ └── uni-load-more/ # 上拉加载更多
├── images/ # 图片资源
├── js_sdk/ # 第三方 SDK (luch-request)
├── pages/ # 页面视图 (14 模块, 23 页面)
├── static/ # 静态资源 (字体等)
├── store/ # Vuex 状态管理
├── utils/ # 工具函数
│ ├── requestUtil.js # HTTP 客户端封装
│ ├── appConfig.js # 应用配置 (API URL)
│ └── date.js # 日期工具
├── App.vue # 根组件 (全局样式 + 生命周期)
├── main.js # 入口文件
├── manifest.json # UniApp 平台配置
├── pages.json # 路由与页面配置
└── uni.scss # 全局 SCSS 变量
Vue.prototype. 辅助对象:msg() (Toast 提示) + prePage() (导航辅助)onLaunch 生命周期:从 uni.getStorageSync('userInfo') 恢复登录状态Vue.prototype. = new Vue()#ifdef MP, #ifdef H5) 处理平台差异Store 极其精简,仅管理认证状态:
// store/index.js
state: {
hasLogin: false,
userInfo: {}
},
mutations: {
login(state, provider) {
state.hasLogin = true;
state.userInfo = provider;
uni.setStorage({ key: 'userInfo', data: provider });
},
logout(state) {
state.hasLogin = false;
state.userInfo = {};
uni.removeStorageSync('userInfo');
uni.removeStorageSync('token');
}
}
uni.setStorage 做持久化,token 和 userInfo 存储在小程序/App 的本地存储中,跨会话保持登录态。
基于 luch-request(类 axios 的 uni-app 兼容 HTTP 库)封装:
| 拦截器 | 行为 |
|---|---|
| 请求拦截 | 从 uni.getStorageSync('token') 读取 token,附加到 Authorization 请求头 |
| 响应拦截 | 校验 res.code === 200,失败弹出错误 Toast;401 时弹窗提示并跳转登录页 |
基础 URL 配置于 appConfig.js:http://localhost:8085
UniApp 使用 pages.json 声明式路由(非 vue-router),首个条目为首页。
| 模块 | 页面 | 路径 | 功能 |
|---|---|---|---|
| 首页 | 首页 | pages/index/index | 商城首页,轮播/推荐/分类 |
| 商品 | 商品详情 | pages/product/product | SKU 选择、加购 |
| 商品列表 | pages/product/list | 搜索结果/分类列表 | |
| 新鲜好物 | pages/product/newProductList | 新品推荐 | |
| 热销商品 | pages/product/hotProductList | 热销排行 | |
| 分类 | 分类 | pages/category/category | 树形分类浏览 |
| 购物车 | 购物车 | pages/cart/cart | 购物车管理 |
| 订单 | 我的订单 | pages/order/order | 订单列表 |
| 创建订单 | pages/order/createOrder | 确认订单/选地址 | |
| 订单详情 | pages/order/orderDetail | 订单状态/物流 | |
| 支付 | 支付中心 | pages/money/money | 选择支付方式 |
| 支付 | pages/money/pay | 调起支付 | |
| 支付成功 | pages/money/paySuccess | 支付结果 | |
| 地址 | 地址列表 | pages/address/address | 收货地址管理 |
| 地址编辑 | pages/address/addressManage | 新增/编辑地址 | |
| 品牌 | 品牌详情 | pages/brand/brandDetail | 品牌介绍与商品 |
| 品牌列表 | pages/brand/list | 推荐品牌 | |
| 优惠券 | 优惠券列表 | pages/coupon/couponList | 领取/查看优惠券 |
| 通知 | 通知 | pages/notice/notice | 系统通知 |
| 用户 | 我的 | pages/user/user | 个人中心 |
| 资料 | 修改资料 | pages/userinfo/userinfo | 编辑个人信息 |
| 认证 | 登录 | pages/public/login | 账号登录 |
| 注册 | pages/public/register | 新用户注册 | |
| 设置 | 设置 | pages/set/set | 应用设置 |
| 模块 | 职责 | 核心技术 | 说明 |
|---|---|---|---|
mall-gateway |
API 网关 | Spring Cloud Gateway + Sa-Token | 统一入口,路由转发,鉴权过滤,会员/管理员双鉴权体系 |
mall-auth |
认证中心 | Sa-Token | 统一登录认证,token 签发与校验 |
mall-portal |
商城门户 API | Spring Boot + MyBatis | 直接服务 mall-app-web,首页/商品/购物车/订单/支付等全部 C 端接口 |
mall-admin |
管理后台 API | Spring Boot + MyBatis | 商品管理/订单管理/用户管理/营销活动等 B 端接口 |
mall-search |
商品搜索 | Elasticsearch | 全文检索,商品搜索/过滤/排序 |
mall-mbg |
数据访问层 | MyBatis Generator | 从数据库自动生成 Model/Mapper/XML,按业务域分包 |
mall-common |
公共模块 | Spring Boot | 统一响应格式、异常处理、AOP 日志、工具类 |
mall-monitor |
监控中心 | Spring Boot Admin | 服务健康检查、指标监控 |
mall-demo |
示例/测试 | Spring Boot | 功能演示和测试服务 |
每个业务微服务内部遵循经典的四层架构:
mall-portal 是直接服务移动端的微服务,包含 15 个 Controller:
| Controller | 职责 |
|---|---|
HomeController | 首页数据聚合(轮播、推荐、新品、热销) |
ProductController | 商品搜索、详情、分类树 |
CartItemController | 购物车增删改查 |
PortalOrderController | 订单创建、查询、取消、支付 |
MemberController | 会员登录、信息查询 |
MemberAddressController | 收货地址管理 |
MemberCouponController | 优惠券领取与查询 |
MemberCollectionController | 商品收藏 |
MemberAttentionController | 品牌关注 |
MemberReadHistoryController | 浏览历史 (MongoDB) |
BrandController | 品牌详情与商品 |
PayController | 支付回调处理 |
FlashSaleController | 限时抢购 |
MyBatis Generator 按业务域前缀自动生成代码:
| 前缀 | 领域 | 包含表 |
|---|---|---|
Oms* | 订单管理 | 订单、订单项、购物车、退货申请 |
Pms* | 商品管理 | 商品、品牌、分类、属性、SKU、相册 |
Ums* | 用户管理 | 会员、角色、权限、收货地址 |
Sms* | 营销管理 | 优惠券、限时抢购、首页广告/品牌/推荐 |
Cms* | 内容管理 | 专题、话题、帮助、优选专区 |
11 个 API 模块覆盖全部业务功能,均通过统一的 request(options) 函数发起请求:
| API 文件 | 核心接口 | 功能 |
|---|---|---|
home.js | /home/content, /home/recommendProductList, /home/newProductList, /home/hotProductList | 首页数据 |
product.js | /product/search, /product/detail/{id}, /product/categoryTreeList | 商品搜索与详情 |
cart.js | /cart/add, /cart/list, /cart/delete, /cart/update/quantity, /cart/clear | 购物车 CRUD |
order.js | /order/generateConfirmOrder, /order/createOrder, /order/list, /order/detail/{id}, /order/cancel/{id}, /order/payOrder | 订单全生命周期 |
member.js | /sso/login (POST form-urlencoded), /sso/info (GET) | 登录认证 |
address.js | /member/address/list, /member/address/add, /member/address/update, /member/address/delete/{id} | 收货地址 |
brand.js | /brand/detail/{id}, /brand/productList, /brand/recommendList | 品牌浏览 |
coupon.js | /member/coupon/listByProduct/{id}, /member/coupon/add/{id}, /member/coupon/list | 优惠券 |
memberBrandAttention.js | /member/attention/add, /member/attention/delete, /member/attention/list | 品牌关注 |
memberProductCollection.js | /member/productCollection/add, /member/productCollection/delete, /member/productCollection/list | 商品收藏 |
memberReadHistory.js | /member/readHistory/create, /member/readHistory/list, /member/readHistory/clear | 浏览历史 |
mall-common 模块定义了标准化的 API 响应结构:
// CommonResult<T> - 统一响应
{
"code": 200, // 状态码
"message": "成功", // 提示信息
"data": { ... } // 业务数据
}
// CommonPage<T> - 分页响应
{
"code": 200,
"data": {
"list": [ ... ], // 数据列表
"pageNum": 1, // 当前页
"pageSize": 20, // 每页大小
"totalPage": 5, // 总页数
"total": 100 // 总记录数
}
}
IErrorCode / ResultCode:错误码枚举定义GlobalExceptionHandler:全局异常处理,捕获异常后返回统一格式WebLogAspect:AOP 切面,自动记录请求/响应日志| 存储 | 用途 | 特点 |
|---|---|---|
| MySQL | 核心业务数据(商品、订单、用户、营销) | 主数据源,Druid 连接池,MyBatis ORM |
| Redis | 缓存、分布式 Session、验证码、购物车临时数据 | 高性能读写,过期策略 |
| MongoDB | 用户浏览历史、部分会员数据 | 文档型存储,适合非结构化数据 |
| Elasticsearch | 商品全文搜索、过滤、排序 | 倒排索引,分词搜索 |
| RabbitMQ | 异步消息:延迟取消超时订单 | CancelOrderSender → CancelOrderReceiver |
所有外部流量通过 mall-gateway (Spring Cloud Gateway) 统一入口。网关负责:
StpMemberUtil) 和管理员鉴权所有服务配置集中在 config/ 目录,通过 Nacos Config Center 管理,支持 dev/prod 多环境切换:
config/
├── admin/mall-admin-dev.yaml # 管理后台开发配置
├── admin/mall-admin-prod.yaml # 管理后台生产配置
├── portal/mall-portal-dev.yaml # 商城门户开发配置
├── gateway/mall-gateway-dev.yaml # 网关开发配置
└── search/mall-search-dev.yaml # 搜索服务开发配置
使用 Sa-Token 替代传统的 Spring Security OAuth2:
uni.setStorage('token') 持久化,每次请求附带 Authorization 头超时订单自动取消采用消息队列模式:
CancelOrderSender → RabbitMQ (延迟队列) → CancelOrderReceiver
发送取消消息 接收并执行取消
OrderTimeOutCancelTask (定时任务) → 扫描超时订单,触发取消
mall-mbg 模块从数据库 schema 自动生成:
业务微服务引用 mall-mbg 依赖,手写自定义查询放在各自的 dao/ 包中。
WebLogAspect 在 mall-common 中定义,所有微服务自动继承:
| 技术 | 版本 | 用途 |
|---|---|---|
| UniApp | Vue 2 | 跨平台移动框架(H5/Android/iOS/小程序) |
| Vuex | Vue 2 版 | 全局状态管理(登录态) |
| luch-request | 内置 SDK | HTTP 客户端(类 axios,uni-app 兼容) |
| SCSS | - | CSS 预处理器 |
| yticon | iconfont | 阿里巴巴图标字体 |
| 技术 | 版本 | 用途 |
|---|---|---|
| Java | 17 | 运行时 |
| Spring Boot | 3.2.2 | 应用框架 |
| Spring Cloud | 2023.0.1 | 微服务基础设施 |
| Spring Cloud Alibaba | 2023.0.1.0 | Nacos + Sentinel + Seata |
| Sa-Token | 1.37.0 | 认证授权框架 |
| MyBatis | 3.5.14 | ORM 框架 |
| MyBatis Generator | 1.4.2 | 数据层代码生成 |
| PageHelper | 6.1.0 | MyBatis 分页插件 |
| Knife4j | 4.5.0 | API 文档 (Swagger 增强) |
| MySQL Connector | 8.0.29 | 数据库驱动 |
| Druid | 1.2.9 | 数据库连接池 + 监控 |
| Redis | - | 缓存与分布式 Session |
| MongoDB | - | 文档存储(浏览历史等) |
| Elasticsearch | - | 全文搜索 |
| RabbitMQ | - | 异步消息队列 |
| Aliyun OSS | 2.5.0 | 云对象存储 |
| MinIO | 8.4.5 | 自建对象存储 |
| Alipay SDK | 4.38.61 | 支付宝支付 |
| Hutool | 5.8.16 | Java 工具库 |
| Lombok | - | 代码简化 (@Data, @Slf4j) |
| Seata | - | 分布式事务管理 |
| Spring Boot Admin | 3.2.2 | 服务监控仪表盘 |
| Logstash Logback | 5.3 | 日志采集 (ELK) |
项目提供两套 Docker Compose 配置:
docker-compose-env.yml:基础设施容器(MySQL、Redis、MongoDB、RabbitMQ、ES、Nacos)docker-compose-app.yml:应用服务容器(各微服务实例)# 启动基础设施
docker-compose -f docker-compose-env.yml up -d
# 启动应用服务
docker-compose -f docker-compose-app.yml up -d
document/k8s/ 目录包含所有微服务的 Deployment + Service YAML:
document/k8s/
├── mall-admin-deployment.yaml
├── mall-admin-service.yaml
├── mall-gateway-deployment.yaml
├── mall-gateway-service.yaml
├── mall-portal-deployment.yaml
├── mall-portal-service.yaml
└── ...
mall-monitor 提供服务健康检查、内存/CPU 指标、日志级别动态调整document/elk/ 包含 Logstash 配置,通过 Logstash Logback Appender 将日志推送到 Elasticsearch + KibanaUniApp 作为前端通过 REST API 与 Spring Cloud 后端通信,前端只关心 UI 和用户交互,后端专注业务逻辑和数据。Gateway 统一入口简化了鉴权和路由。
按业务能力拆分:门户(C端)、管理(B端)、搜索、认证各自独立。公共逻辑(统一响应、异常处理、日志)下沉到 mall-common,数据访问层 mall-mbg 独立为共享模块。
不同数据特征选择不同存储:关系数据 → MySQL,缓存/会话 → Redis,文档/日志型 → MongoDB,搜索 → ES。不是所有数据都要塞进一个数据库。
超时订单取消用 RabbitMQ 异步处理,避免定时任务轮询数据库的压力。消息队列是微服务间解耦的关键基础设施。
MyBatis Generator 处理重复的 CRUD 代码,开发只需关注自定义查询和业务逻辑。代码生成模块独立为 mall-mbg,各业务服务引用而非复制。
UniApp 一套代码覆盖 H5 + 小程序 + App,对于中小型电商项目是高性价比方案。条件编译 (#ifdef) 处理平台差异。
mall-gateway 的 Sa-Token 鉴权过滤器实现mall-portal 的订单创建流程(库存校验 → 价格计算 → 优惠券抵扣 → 下单)📅 生成时间:2026-05-20 | 📁 项目路径:E:\workSpace\mall-app
🤖 由 Claude Code 自动生成 | 📚 知识库:C:\Users\sunjie\Documents\我的知识库\技术项目知识库