1. 项目概述
这个在线书城系统采用前后端分离架构,前端基于Vue.js框架开发,后端使用Spring Boot构建RESTful API。系统实现了图书展示、分类检索、购物车管理、订单处理等核心功能模块,是一个典型的B2C电子商务应用。
我在实际开发中发现,这种技术组合特别适合中小型电商项目。Vue的组件化开发模式能够高效构建用户界面,而Spring Boot的自动配置特性可以快速搭建稳定的后端服务。两者通过axios进行数据交互,整体开发效率比传统JSP方案提升40%以上。
2. 技术架构设计
2.1 前端技术选型
前端采用Vue 2.x版本构建,主要基于以下考虑:
- 组件化开发:将图书卡片、分类导航等元素封装为可复用组件
- Vue Router:实现SPA页面无刷新跳转
- Vuex:管理全局状态(如购物车数据)
- Element UI:提供现成的UI组件库
- axios:处理HTTP请求
// 典型API请求示例 axios.get('/api/books', { params: { category: 'programming', page: 1, size: 10 } })2.2 后端技术方案
后端采用Spring Boot 2.4 + MyBatis技术栈:
- Spring Security:处理用户认证授权
- MyBatis-Plus:简化数据库操作
- Redis:缓存热门图书数据
- Nacos:作为配置中心
- Swagger:自动生成API文档
// 典型Controller示例 @RestController @RequestMapping("/api/books") public class BookController { @Autowired private BookService bookService; @GetMapping public PageResult<Book> listBooks( @RequestParam(required = false) String category, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size) { return bookService.getBooksByPage(category, page, size); } }3. 核心功能实现
3.1 图书展示模块
实现要点:
- 分页查询:后端返回包含总页数的分页数据
- 分类筛选:支持多级分类树形结构
- 搜索功能:基于Elasticsearch实现全文检索
- 详情页:使用keep-alive缓存已加载的图书详情
注意:分页参数需要做合法性校验,避免恶意请求导致大量数据查询
3.2 购物车系统
关键技术点:
- 本地存储:未登录用户使用localStorage暂存
- 服务端同步:登录后将本地数据合并到服务端
- 实时计算:使用Vue的computed属性自动计算总价
- 并发控制:使用乐观锁处理库存变更
// 购物车状态管理 const cartModule = { state: () => ({ items: [] }), mutations: { ADD_ITEM(state, book) { const existing = state.items.find(item => item.id === book.id) existing ? existing.quantity++ : state.items.push({...book, quantity: 1}) } } }3.3 订单处理流程
订单状态机设计:
- 待支付(10分钟未支付自动取消)
- 已支付/待发货
- 已发货/运输中
- 已完成(用户确认收货)
- 已取消(用户或系统取消)
// 订单状态变更逻辑 public class OrderService { @Transactional public void cancelOrder(Long orderId) { Order order = orderMapper.selectById(orderId); if (order.getStatus() != OrderStatus.PENDING_PAYMENT) { throw new BusinessException("只有待支付订单可以取消"); } order.setStatus(OrderStatus.CANCELLED); orderMapper.updateById(order); // 恢复库存 inventoryService.releaseStock(order); } }4. 性能优化实践
4.1 前端优化方案
- 组件懒加载:路由级组件使用动态导入
- 图片懒加载:Intersection Observer API实现
- 请求合并:同一页面的多个API合并请求
- 本地缓存:高频访问数据存入localStorage
4.2 后端优化措施
- 二级缓存:Redis缓存热点数据
- 连接池:Druid配置最优连接数
- SQL优化:EXPLAIN分析慢查询
- 异步处理:使用@Async处理非核心流程
# 示例Druid配置 spring: datasource: druid: initial-size: 5 max-active: 20 min-idle: 5 max-wait: 600005. 安全防护策略
5.1 常见攻击防护
- XSS防护:前端使用vue-sanitize过滤HTML
- CSRF防护:Spring Security默认启用
- SQL注入:MyBatis使用预编译语句
- 暴力破解:登录失败次数限制
5.2 敏感数据保护
- 密码加密:BCryptPasswordEncoder
- 数据传输:强制HTTPS
- 日志脱敏:手机号、邮箱等敏感信息
- 权限控制:基于角色的访问控制(RBAC)
// 密码加密示例 @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }6. 部署实施方案
6.1 前端部署
- 生产环境构建:npm run build生成dist
- Nginx配置:
- 开启gzip压缩
- 配置静态资源缓存
- 设置反向代理API请求
server { listen 80; server_name bookstore.com; gzip on; gzip_types text/plain application/javascript; location / { root /var/www/bookstore; try_files $uri $uri/ /index.html; } location /api { proxy_pass http://backend:8080; } }6.2 后端部署
- 打包:mvn clean package生成jar
- 运行:java -jar加上JVM参数
- 监控:Spring Boot Actuator
- 日志:ELK收集分析
# 启动示例 nohup java -Xms512m -Xmx1024m -jar bookstore.jar \ --spring.profiles.active=prod > log.out 2>&1 &7. 开发经验分享
在实际开发中,有几个关键点值得特别注意:
- 接口规范:前后端先定义好API契约(可以使用Swagger或YAPI)
- 异常处理:统一错误码和返回格式
- 数据一致性:分布式事务考虑使用Seata
- 压力测试:使用JMeter模拟高并发场景
对于初学者,我建议先从基础功能开始,逐步迭代完善。比如先实现基本的图书列表和详情,再开发购物车和订单功能。遇到问题时,可以多查阅Vue和Spring Boot的官方文档,这两个框架的文档都非常完善。