1. 项目概述:SpringBoot+Vue3+MyBatis全栈电商系统
这套前后端分离的在线商城系统采用了当前企业级开发中最主流的三大技术栈组合。后端基于SpringBoot 2.7框架构建RESTful API服务,前端使用Vue3组合式API开发管理后台,数据持久层采用MyBatis-Plus增强工具,数据库选用MySQL 8.0版本。整个系统严格遵循MVC分层架构,实现了商品管理、订单处理、支付对接等电商核心功能模块。
提示:本系统源码特别适合需要快速构建中小型电商平台的开发团队,所有依赖库版本均经过严格测试,避免了常见的版本冲突问题。
2. 技术栈深度解析
2.1 SpringBoot后端设计精要
后端工程采用多模块Maven结构:
code复制mall-parent
├── mall-common // 公共模块
├── mall-mbg // MyBatis生成器
├── mall-security // 安全模块
└── mall-admin // 业务主模块
关键配置类说明:
@EnableTransactionManagement开启声明式事务@MapperScan("com.mall.mapper")指定MyBatis接口路径@EnableCaching启用Redis缓存
实测中发现的版本兼容要点:
- SpringBoot 2.7.x需要配合MyBatis 3.5.9+
- Lombok 1.18.24+需添加jvm参数:
bash复制-Djps.track.ap.dependencies=false
2.2 Vue3前端工程化实践
前端项目使用Vite 4构建,主要技术选型:
- 状态管理:Pinia 2.0
- UI组件库:Element Plus 2.3
- 路由控制:Vue Router 4.2
核心封装技巧:
javascript复制// axios拦截器示例
service.interceptors.request.use(config => {
if (store.getters.token) {
config.headers['X-Token'] = getToken()
}
return config
}, error => {
return Promise.reject(error)
})
注意:Vue3的
<script setup>语法需要关闭Eslint的no-unused-vars规则
2.3 MyBatis-Plus高效开发
通过代码生成器自动创建:
xml复制<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mall?useSSL=false"
userId="root"
password="123456"/>
<javaModelGenerator targetPackage="com.mall.model" targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.mall.mapper" targetProject="src/main/java"/>
<table tableName="%"/>
</context>
</generatorConfiguration>
高级查询示例:
java复制// 复杂条件查询
LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Product::getStatus, 1)
.between(Product::getPrice, minPrice, maxPrice)
.orderByDesc(Product::getSales);
3. 数据库设计与优化
3.1 核心表结构
主要表关系图:
code复制用户表(user) ← 订单表(order) → 订单明细(order_item)
↑
商品表(product) ← 商品分类(category)
索引优化方案:
sql复制ALTER TABLE `order` ADD INDEX `idx_user_status` (`user_id`, `status`);
ALTER TABLE `product` ADD FULLTEXT INDEX `ftx_title` (`title`);
3.2 事务处理实战
分布式事务解决方案:
java复制@Transactional(rollbackFor = Exception.class)
public void createOrder(OrderDTO dto) {
// 1. 扣减库存
productMapper.reduceStock(dto.getItems());
// 2. 生成订单
orderMapper.insert(dto);
// 3. 记录日志
logService.saveOperationLog();
}
4. 典型业务场景实现
4.1 商品搜索功能
Elasticsearch集成步骤:
- 添加依赖:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
- 定义Repository:
java复制public interface ProductRepository extends ElasticsearchRepository<ProductEs, Long> {
List<ProductEs> findByTitleOrKeywords(String title, String keywords);
}
4.2 支付对接方案
支付宝沙箱配置:
properties复制# 应用ID
alipay.app-id=2021000122634567
# 商户私钥
alipay.merchant-private-key=...
# 支付宝公钥
alipay.alipay-public-key=...
回调验签逻辑:
java复制boolean signVerified = AlipaySignature.rsaCheckV1(
params,
alipayPublicKey,
charset,
signType);
if (!signVerified) {
throw new RuntimeException("验签失败");
}
5. 部署与性能调优
5.1 宝塔面板部署
Nginx关键配置:
nginx复制location /api/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
location / {
root /www/wwwroot/mall-fe;
try_files $uri $uri/ /index.html;
}
5.2 JVM参数优化
生产环境推荐配置:
bash复制java -jar -Xms1024m -Xmx1024m -XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=256m -XX:+HeapDumpOnOutOfMemoryError \
-Dfile.encoding=UTF-8 mall-admin.jar
6. 常见问题解决方案
6.1 跨域问题处理
SpringBoot配置类:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.maxAge(3600);
}
}
6.2 文件上传限制
调整SpringBoot配置:
properties复制spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB
前端处理代码:
javascript复制const checkFile = (file) => {
const isLt10M = file.size / 1024 / 1024 < 10
if (!isLt10M) {
ElMessage.error('文件大小不能超过10MB!')
return false
}
return true
}
7. 二次开发建议
-
扩展功能方向:
- 增加秒杀模块(Redis+Lua实现)
- 集成第三方登录(OAuth2.0)
- 搭建大数据看板(ECharts)
-
性能提升方案:
java复制// 使用Caffeine缓存 @Bean public CacheManager cacheManager() { CaffeineCacheManager cacheManager = new CaffeineCacheManager(); cacheManager.setCaffeine(Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) .maximumSize(1000)); return cacheManager; } -
安全加固措施:
- 定期更换JWT密钥
- 接口添加RateLimit限流
- 敏感数据加密存储
