1. 项目概述
最近在整理自己做过的一个图书电商项目,采用SpringBoot+Vue的前后端分离架构,完整实现了从图书展示、购物车管理到订单支付的全流程功能。这个系统特别适合作为毕业设计或者中小型电商项目的开发参考,代码结构清晰且完全开源。
做这个项目的初衷,是发现很多传统图书管理系统存在几个痛点:前端页面交互生硬、后端接口响应慢、管理功能分散。采用现代技术栈重构后,系统实现了秒级的接口响应和流畅的用户体验,后台管理效率提升了60%以上。
2. 技术架构解析
2.1 后端技术选型
SpringBoot 2.7作为后端核心框架,主要基于以下几个考量:
- 自动配置机制省去了传统SSM框架80%的XML配置
- 内置Tomcat容器简化部署流程(只需打包成单一JAR)
- 与MyBatis的整合异常简单,只需添加starter依赖
数据库选用MySQL 8.0,主要看中其:
- 对JSON数据类型的原生支持(用于存储图书扩展属性)
- 窗口函数等高级特性(便于生成销售报表)
- 成本效益比(相比商业数据库)
java复制// 典型的事务处理示例
@Transactional
public void createOrder(OrderDTO dto) {
// 1. 扣减库存
bookMapper.reduceStock(dto.getBookId(), dto.getQuantity());
// 2. 生成订单
Order order = new Order();
BeanUtils.copyProperties(dto, order);
orderMapper.insert(order);
// 3. 记录流水
paymentService.createPaymentRecord(order);
}
2.2 前端技术方案
Vue 3 + Element Plus的组合带来了以下优势:
- Composition API使代码组织更灵活
- 基于Vite的构建速度比传统Webpack快5-8倍
- Element Plus的表格和表单组件极大提升了开发效率
前端工程化配置要点:
javascript复制// vite.config.js 优化配置
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules')) {
return 'vendor'
}
}
}
}
}
})
3. 核心功能实现
3.1 用户认证模块
采用JWT+Redis的方案实现无状态认证:
- 登录成功生成JWT token(有效期为2小时)
- token存入Redis并设置TTL
- 每次请求通过拦截器校验token有效性
安全增强措施:
- 密码使用BCrypt加密(自带盐值)
- 关键操作需要二次验证
- 接口防刷限流(Guava RateLimiter)
3.2 图书搜索功能
Elasticsearch实现多条件搜索:
java复制public Page<Book> searchBooks(SearchQuery query) {
NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.multiMatchQuery(query.getKeyword(),
"title", "author", "description"))
.withFilter(QueryBuilders.rangeQuery("price")
.gte(query.getMinPrice()).lte(query.getMaxPrice()))
.withPageable(PageRequest.of(query.getPage(), query.getSize()));
return elasticsearchTemplate.queryForPage(builder.build(), Book.class);
}
3.3 购物车设计
采用两种存储方案并存:
- 未登录用户:存在浏览器localStorage
- 已登录用户:同步到服务端Redis
数据结构设计:
json复制{
"userId": 123,
"items": [
{
"bookId": 456,
"quantity": 2,
"selected": true,
"addTime": "2023-07-20T10:00:00"
}
]
}
4. 数据库优化实践
4.1 表结构设计要点
图书表添加了垂直分表:
sql复制-- 主表存储高频访问数据
CREATE TABLE `book` (
`id` bigint PRIMARY KEY,
`title` varchar(100) NOT NULL,
`price` decimal(10,2) NOT NULL,
`cover_url` varchar(255)
);
-- 详情表存储大文本字段
CREATE TABLE `book_detail` (
`book_id` bigint PRIMARY KEY,
`description` text,
`catalog` text,
FOREIGN KEY (`book_id`) REFERENCES `book`(`id`)
);
4.2 索引优化案例
订单查询优化前后对比:
sql复制-- 优化前(全表扫描)
SELECT * FROM orders WHERE user_id = 123 AND status = 1;
-- 优化后(复合索引)
ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);
5. 部署与监控
5.1 容器化部署
Docker Compose编排文件示例:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- ./mysql-data:/var/lib/mysql
redis:
image: redis:6
ports:
- "6379:6379"
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
5.2 监控方案
Spring Boot Actuator配置:
properties复制# application.properties
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
management.endpoint.metrics.enabled=true
6. 踩坑经验分享
- 跨域问题:开发环境要配置正确的CORS,生产环境建议用Nginx反向代理
- MyBatis缓存:批量操作时需要手动清除一级缓存
- Vue响应式:数组操作要使用Vue.set或扩展运算符触发更新
- 支付对接:支付宝沙箱环境经常超时,建议增加重试机制
性能优化前后对比:
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 首页加载 | 2.8s | 1.2s |
| 搜索响应 | 1200ms | 300ms |
| 订单创建 | 800ms | 200ms |
7. 扩展功能建议
- 推荐系统:基于用户行为的协同过滤推荐
- 秒杀功能:Redis预减库存+消息队列异步处理
- 数据大屏:ECharts实现实时销售可视化
- 微信小程序:Uniapp跨端开发方案
这个项目从技术选型到最终上线历时3个月,最大的体会是:前期花时间做好技术方案论证,后期能节省50%以上的调试时间。特别是数据库设计阶段,一定要充分考虑业务扩展性。