🏗️ Mall-App 架构学习笔记

📅 创建时间:2026-05-20

🏷️ 标签: Spring Cloud 微服务 UniApp Vue 2 电商系统 全栈架构

📍 项目路径:E:\workSpace\mall-app

📑 目录
  1. 项目总览
  2. 整体架构
  3. 前端架构 (UniApp)
  4. 后端架构 (Spring Cloud)
  5. API 与数据层
  6. 设计模式与架构决策
  7. 技术栈全景
  8. 部署架构
  9. 学习要点与启发

1. 项目总览

Mall-App 是一个完整的生产级电商系统,由两个独立子项目组成,协同工作构成全栈解决方案:

前端技术栈
UniApp + Vue 2
后端技术栈
Spring Cloud 2023
前端页面数
23 页 / 14 模块
后端微服务数
9 个模块
📱 子项目 A: mall-app-web-master

基于 UniApp (Vue 2) 的移动端购物前端,一套代码编译到 H5、Android、iOS、微信小程序四大平台。通过 HTTP REST API 与后端 mall-portal 服务通信,基础 URL 为 http://localhost:8085

☁️ 子项目 B: mall-swarm-master

基于 Spring Boot 3.2 + Spring Cloud 2023 + Spring Cloud Alibaba 的 Java 微服务后端,源自知名开源项目 mall-swarm (macrozheng)。包含认证、网关、管理后台、商城门户、商品搜索、监控等 9 个微服务模块。

2. 整体架构

2.1 架构全景图

┌─────────────────────────────────────────────────────────────────────────┐ │ 客户端层 (Client Layer) │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │ │ │ H5 │ │ Android │ │ iOS │ │ 微信小程序 │ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────────┬─────────┘ │ │ │ │ │ │ │ │ └──────────────┴──────────────┴─────────────────┘ │ │ │ │ │ UniApp (Vue 2) 跨平台框架 │ │ │ │ │ ┌───────────────┼───────────────┐ │ │ │ │ │ │ │ Vuex Store pages.json API Layer │ │ (状态管理) (路由配置) (luch-request) │ └──────────────────────────────┼──────────────────────────────────────────┘ │ HTTP REST ▼ ┌──────────────────────────────────────────────────────────────────────────┐ │ 网关层 (Gateway Layer) │ │ │ │ ┌────────────────────────┐ │ │ │ mall-gateway │ │ │ │ Spring Cloud Gateway │ │ │ │ + Sa-Token 鉴权 │ │ │ └───────────┬────────────┘ │ │ │ │ │ ┌─────────────────┼─────────────────┐ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ mall-portal │ │ mall-admin │ │ mall-search │ │ │ │ 商城门户 API │ │ 管理后台 API │ │ 商品搜索服务 │ │ │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ └────────────┼─────────────────┼─────────────────┼─────────────────────────┘ │ │ │ ┌────────────┼─────────────────┼─────────────────┼─────────────────────────┐ │ ▼ ▼ ▼ │ │ 基础设施层 (Infrastructure) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ MySQL │ │ Redis │ │ MongoDB │ │ ES │ │ RabbitMQ │ │ │ │ 主数据 │ │ 缓存/会话│ │ 浏览历史 │ │ 全文搜索 │ │ 异步消息 │ │ │ └─────────┘ └─────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │ │ │ Nacos │ │ Seata │ │ Spring Boot Admin│ │ │ │ 注册中心/配置 │ │ 分布式事务 │ │ 监控中心 │ │ │ └──────────────┘ └──────────────┘ └──────────────────┘ │ └──────────────────────────────────────────────────────────────────────────┘

2.2 请求流转路径

1
用户操作 → UniApp 页面触发 API 调用(如点击"加入购物车")
2
API Layerluch-request 封装请求,自动附带 Authorization token
3
Gatewaymall-gateway 校验 Sa-Token,路由到目标微服务
4
Servicemall-portal Controller → Service → DAO 执行业务逻辑
5
Data → MySQL/Redis/MongoDB 读写数据
6
ResponseCommonResult<T> 统一格式返回,前端解析展示

3. 前端架构 (UniApp)

3.1 目录结构

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 变量

3.2 入口与全局机制

🔑 main.js 入口文件
🚀 App.vue 根组件

3.3 状态管理 (Vuex)

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 的本地存储中,跨会话保持登录态。

3.4 HTTP 客户端封装

🌐 requestUtil.js 请求拦截

基于 luch-request(类 axios 的 uni-app 兼容 HTTP 库)封装:

拦截器行为
请求拦截uni.getStorageSync('token') 读取 token,附加到 Authorization 请求头
响应拦截校验 res.code === 200,失败弹出错误 Toast;401 时弹窗提示并跳转登录页

基础 URL 配置于 appConfig.jshttp://localhost:8085

3.5 路由与页面模块

UniApp 使用 pages.json 声明式路由(非 vue-router),首个条目为首页。

模块页面路径功能
首页首页pages/index/index商城首页,轮播/推荐/分类
商品商品详情pages/product/productSKU 选择、加购
商品列表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应用设置

4. 后端架构 (Spring Cloud)

4.1 微服务模块总览

模块职责核心技术说明
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 功能演示和测试服务

4.2 分层架构模式

每个业务微服务内部遵循经典的四层架构

┌───────────────────────────────────────────────────────┐ │ Controller 层 │ │ 接收 HTTP 请求,参数校验,调用 Service │ └───────────────────────┬───────────────────────────────┘ │ ┌───────────────────────▼───────────────────────────────┐ │ Service 层 (接口) │ │ 定义业务契约 (interface) │ └───────────────────────┬───────────────────────────────┘ │ ┌───────────────────────▼───────────────────────────────┐ │ Service Impl 层 (实现) │ │ 核心业务逻辑,事务管理,数据组装 │ └──────────┬────────────────────────────┬───────────────┘ │ │ ┌──────────▼──────────┐ ┌────────────▼───────────────┐ │ DAO 层 │ │ MBG 自动生成 Mapper │ │ 手写自定义查询 │ │ 标准 CRUD (Model+Mapper) │ └──────────┬──────────┘ └────────────┬───────────────┘ │ │ └────────────┬───────────────┘ ▼ ┌───────────┐ │ Database │ │ MySQL │ └───────────┘

4.3 mall-portal 核心 Controller

mall-portal 是直接服务移动端的微服务,包含 15 个 Controller:

Controller职责
HomeController首页数据聚合(轮播、推荐、新品、热销)
ProductController商品搜索、详情、分类树
CartItemController购物车增删改查
PortalOrderController订单创建、查询、取消、支付
MemberController会员登录、信息查询
MemberAddressController收货地址管理
MemberCouponController优惠券领取与查询
MemberCollectionController商品收藏
MemberAttentionController品牌关注
MemberReadHistoryController浏览历史 (MongoDB)
BrandController品牌详情与商品
PayController支付回调处理
FlashSaleController限时抢购

4.4 数据库表域划分 (mall-mbg)

MyBatis Generator 按业务域前缀自动生成代码:

前缀领域包含表
Oms*订单管理订单、订单项、购物车、退货申请
Pms*商品管理商品、品牌、分类、属性、SKU、相册
Ums*用户管理会员、角色、权限、收货地址
Sms*营销管理优惠券、限时抢购、首页广告/品牌/推荐
Cms*内容管理专题、话题、帮助、优选专区

5. API 与数据层

5.1 前端 API 模块

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浏览历史

5.2 统一响应格式

mall-common 模块定义了标准化的 API 响应结构:

// CommonResult<T> - 统一响应
{
  "code": 200,        // 状态码
  "message": "成功",   // 提示信息
  "data": { ... }     // 业务数据
}

// CommonPage<T> - 分页响应
{
  "code": 200,
  "data": {
    "list": [ ... ],      // 数据列表
    "pageNum": 1,          // 当前页
    "pageSize": 20,        // 每页大小
    "totalPage": 5,        // 总页数
    "total": 100           // 总记录数
  }
}

5.3 多数据源架构

💾 数据存储策略
存储用途特点
MySQL 核心业务数据(商品、订单、用户、营销) 主数据源,Druid 连接池,MyBatis ORM
Redis 缓存、分布式 Session、验证码、购物车临时数据 高性能读写,过期策略
MongoDB 用户浏览历史、部分会员数据 文档型存储,适合非结构化数据
Elasticsearch 商品全文搜索、过滤、排序 倒排索引,分词搜索
RabbitMQ 异步消息:延迟取消超时订单 CancelOrderSenderCancelOrderReceiver

6. 设计模式与架构决策

1️⃣ 微服务 + API 网关模式

所有外部流量通过 mall-gateway (Spring Cloud Gateway) 统一入口。网关负责:

2️⃣ 集中式配置管理 (Nacos)

所有服务配置集中在 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    # 搜索服务开发配置
3️⃣ Token 认证 (Sa-Token)

使用 Sa-Token 替代传统的 Spring Security OAuth2:

4️⃣ 异步消息 (RabbitMQ)

超时订单自动取消采用消息队列模式:

CancelOrderSender   →  RabbitMQ (延迟队列)  →  CancelOrderReceiver
发送取消消息                                              接收并执行取消

OrderTimeOutCancelTask (定时任务)  →  扫描超时订单,触发取消
5️⃣ MyBatis Generator 代码生成

mall-mbg 模块从数据库 schema 自动生成:

业务微服务引用 mall-mbg 依赖,手写自定义查询放在各自的 dao/ 包中。

6️⃣ AOP 日志切面

WebLogAspectmall-common 中定义,所有微服务自动继承:

7. 技术栈全景

7.1 前端技术栈

技术版本用途
UniAppVue 2跨平台移动框架(H5/Android/iOS/小程序)
VuexVue 2 版全局状态管理(登录态)
luch-request内置 SDKHTTP 客户端(类 axios,uni-app 兼容)
SCSS-CSS 预处理器
yticoniconfont阿里巴巴图标字体

7.2 后端技术栈

技术版本用途
Java17运行时
Spring Boot3.2.2应用框架
Spring Cloud2023.0.1微服务基础设施
Spring Cloud Alibaba2023.0.1.0Nacos + Sentinel + Seata
Sa-Token1.37.0认证授权框架
MyBatis3.5.14ORM 框架
MyBatis Generator1.4.2数据层代码生成
PageHelper6.1.0MyBatis 分页插件
Knife4j4.5.0API 文档 (Swagger 增强)
MySQL Connector8.0.29数据库驱动
Druid1.2.9数据库连接池 + 监控
Redis-缓存与分布式 Session
MongoDB-文档存储(浏览历史等)
Elasticsearch-全文搜索
RabbitMQ-异步消息队列
Aliyun OSS2.5.0云对象存储
MinIO8.4.5自建对象存储
Alipay SDK4.38.61支付宝支付
Hutool5.8.16Java 工具库
Lombok-代码简化 (@Data, @Slf4j)
Seata-分布式事务管理
Spring Boot Admin3.2.2服务监控仪表盘
Logstash Logback5.3日志采集 (ELK)

8. 部署架构

8.1 容器化部署

📦 Docker Compose 部署

项目提供两套 Docker Compose 配置:

# 启动基础设施
docker-compose -f docker-compose-env.yml up -d

# 启动应用服务
docker-compose -f docker-compose-app.yml up -d

8.2 Kubernetes 部署

⚡ K8s 编排

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
└── ...

8.3 监控与日志

9. 学习要点与启发

🎓 架构设计启发

1. 前后端分离的最佳实践

UniApp 作为前端通过 REST API 与 Spring Cloud 后端通信,前端只关心 UI 和用户交互,后端专注业务逻辑和数据。Gateway 统一入口简化了鉴权和路由。

2. 微服务拆分策略

按业务能力拆分:门户(C端)、管理(B端)、搜索、认证各自独立。公共逻辑(统一响应、异常处理、日志)下沉到 mall-common,数据访问层 mall-mbg 独立为共享模块。

3. 多存储引擎选型

不同数据特征选择不同存储:关系数据 → MySQL,缓存/会话 → Redis,文档/日志型 → MongoDB,搜索 → ES。不是所有数据都要塞进一个数据库。

4. 异步解耦

超时订单取消用 RabbitMQ 异步处理,避免定时任务轮询数据库的压力。消息队列是微服务间解耦的关键基础设施。

5. 代码生成 vs 手写

MyBatis Generator 处理重复的 CRUD 代码,开发只需关注自定义查询和业务逻辑。代码生成模块独立为 mall-mbg,各业务服务引用而非复制。

6. 跨平台方案选择

UniApp 一套代码覆盖 H5 + 小程序 + App,对于中小型电商项目是高性价比方案。条件编译 (#ifdef) 处理平台差异。

📋 值得深入研究的点

📅 生成时间:2026-05-20 | 📁 项目路径:E:\workSpace\mall-app

🤖 由 Claude Code 自动生成 | 📚 知识库:C:\Users\sunjie\Documents\我的知识库\技术项目知识库