1. 项目概述:爱心商城系统的技术架构与核心价值
这个基于SpringBoot+Vue3+MyBatis的爱心商城系统,是我在2022年疫情期间为一个公益组织开发的实际项目。当时他们需要快速上线一个能接受捐赠物资和善款的双向交易平台,同时要确保系统具备良好的扩展性和稳定性。经过技术选型对比,最终确定了这套现在看起来依然主流的技术组合。
前端采用Vue3的组合式API开发,相比Options API可以更灵活地组织代码逻辑。特别是利用<script setup>语法,让组件代码量减少了约40%。后台用SpringBoot 2.7.x构建RESTful API,数据层通过MyBatis-Plus 3.5.x实现高效ORM操作。数据库选用MySQL 8.0,主要看中其事务处理能力和对JSON字段的良好支持。
关键提示:这套技术栈的选择特别考虑了公益项目的特点——需要快速迭代但预算有限,同时要保证系统能承受突发流量(比如公益活动期间的访问高峰)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心技术栈深度解析
2.1 SpringBoot的后台架构设计
采用经典的三层架构设计,但针对商城业务做了特殊优化:
- Controller层:使用
@RestControllerAdvice统一异常处理,特别是对支付相关的接口做了防重放攻击设计。每个API都严格遵循RESTful规范,响应格式统一为:
json复制{
"code": 200,
"data": {},
"message": "success"
}
- Service层:商品服务采用CQRS模式分离读写操作。写操作使用领域驱动设计,包含商品库存的版本号控制:
java复制public Result deductStock(Long skuId, Integer quantity) {
// 使用乐观锁防止超卖
int rows = productMapper.updateStock(
skuId,
quantity,
product.getVersion()
);
if(rows == 0) {
throw new ConcurrentUpdateException("库存并发修改冲突");
}
}
- DAO层:MyBatis-Plus配置了多数据源——主库负责写操作,从库处理读请求。动态数据源切换通过注解实现:
java复制@DS("slave")
public List<Product> getHotProducts() {
return productMapper.selectList(...);
}
2.2 Vue3前端工程化实践
前端项目使用Vite4构建,相比Webpack启动速度提升70%。核心技术创新点:
- 状态管理:Pinia替代Vuex,模块化设计让店铺、用户、购物车等状态独立管理。典型store结构:
javascript复制// stores/cart.js
export const useCartStore = defineStore('cart', {
state: () => ({
items: [],
total: 0
}),
actions: {
async addItem(product) {
// 调用API并更新本地状态
}
}
})
- 组件封装:基于Element Plus二次封装了业务组件,如地址选择器集成了高德地图API:
vue复制<template>
<amap-search
v-model="address"
:api-key="amapKey"
@select="handleSelect"
/>
</template>
- 性能优化:
- 路由懒加载拆分打包文件
- 商品图片使用WebP格式+CDN加速
- 列表页实现虚拟滚动
3. 数据库设计与关键业务实现
3.1 MySQL表结构设计
核心表采用InnoDB引擎,字符集utf8mb4支持emoji。主要表关系如下:
| 表名 | 关键字段 | 索引设计 |
|---|---|---|
| product | id, category_id, title, price | 联合索引(category_id, status) |
| order | order_no, user_id, total_amount | 唯一索引(order_no) |
| order_item | order_id, product_id, quantity | 外键索引(order_id) |
| donation | user_id, amount, payment_method | 普通索引(user_id) |
特别注意的点:
- 订单号使用雪花算法生成
- 金额字段统一用DECIMAL(10,2)
- 软删除设计包含is_deleted字段
3.2 高并发场景解决方案
针对秒杀和捐赠高峰期的技术方案:
- Redis缓存:
- 商品详情缓存:设置5分钟过期时间
- 库存预减:Lua脚本保证原子性
lua复制local stock = tonumber(redis.call('GET', KEYS[1]))
if stock >= tonumber(ARGV[1]) then
return redis.call('DECRBY', KEYS[1], ARGV[1])
else
return -1
end
-
消息队列:
- 订单创建后发送RabbitMQ延迟消息(30分钟未支付自动取消)
- 使用死信队列处理失败消息
-
限流措施:
- 网关层令牌桶限流
- 敏感接口增加图形验证码
4. 开发环境搭建与部署
4.1 本地开发配置
后端开发需要:
- JDK17+(推荐Azul Zulu)
- IDEA安装Lombok插件
- 配置文件区分环境:
yaml复制# application-dev.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/love_mall
username: dev
password: dev123
前端开发准备:
- Node.js 16+
- 配置代理解决跨域:
javascript复制// vite.config.js
server: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true
}
}
}
4.2 生产环境部署
采用Docker Compose编排服务:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql-data:/var/lib/mysql
redis:
image: redis:6-alpine
ports:
- "6379:6379"
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
前端部署到Nginx,关键配置:
nginx复制location / {
try_files $uri $uri/ /index.html;
gzip on;
gzip_types text/plain application/xml application/javascript;
}
5. 典型问题排查实录
5.1 跨域问题深度解决
虽然开发环境配置了代理,但实际部署时遇到几个特殊场景:
- 预检请求(OPTIONS)拦截:
需要在SpringBoot中显式处理:
java复制@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowCredentials(true)
.maxAge(3600);
}
};
}
- Cookie跨域携带:
前端需要设置:
javascript复制axios.defaults.withCredentials = true
后端响应头需要包含:
code复制Access-Control-Allow-Credentials: true
5.2 MyBatis缓存踩坑记录
遇到过一个典型问题:开启事务后一级缓存导致查询不到最新数据。解决方案:
- 在方法上添加
@Transactional(propagation = Propagation.REQUIRES_NEW) - 或手动清除缓存:
java复制sqlSession.clearCache();
- 更推荐在Mapper接口上使用:
java复制@Options(flushCache = Options.FlushCachePolicy.TRUE)
6. 项目扩展与优化方向
这套系统在实际运行半年后,我们又做了几个重要升级:
-
Elasticsearch集成:
- 商品搜索响应时间从800ms降到120ms
- 实现拼音搜索和同义词扩展
-
微信小程序端:
- 使用Taro框架复用80%的业务逻辑
- 通过云开发降低服务器压力
-
数据分析看板:
- 用Spring Batch定时生成每日报表
- ECharts可视化展示捐赠趋势
对于想二次开发的同学,建议先从小功能入手,比如:
- 增加优惠券系统
- 实现分销功能
- 接入更多支付渠道
- 开发志愿者管理模块
整个项目最让我自豪的是技术方案既满足了公益组织"低成本、快上线"的核心需求,又为后续扩展留足了空间。特别是在2022年冬季募捐活动中,系统平稳支撑了单日23万的访问量,没有出现任何重大故障。
