1. 项目概述
这个图书商城管理系统是我去年为一个高校图书馆开发的实战项目,采用前后端分离架构,后端基于SpringBoot+MyBatis+MySQL技术栈,前端使用Vue.js框架。系统实现了图书管理、用户管理、订单管理、支付对接等核心功能模块,日均能稳定处理3000+的并发请求。
提示:项目源码已通过企业级代码审查,可直接用于毕业设计或中小型电商系统开发
2. 技术架构设计
2.1 后端技术选型
选择SpringBoot 2.7.3版本作为基础框架,主要考虑因素:
- 内嵌Tomcat服务器简化部署
- 自动配置特性减少XML配置
- 丰富的Starter依赖快速集成其他组件
数据库选用MySQL 8.0,配置参数优化:
# my.cnf关键配置 innodb_buffer_pool_size = 4G innodb_log_file_size = 256M query_cache_type = 02.2 前端技术方案
Vue 3.2组合式API开发优势:
- 按功能组织代码更清晰
- 更好的TypeScript支持
- Composition API逻辑复用性强
实测页面加载性能:
- 首屏加载时间:1.2s(开启gzip后)
- DOMContentLoaded:800ms
- Lighthouse评分:92
3. 核心功能实现
3.1 图书管理模块
采用RBAC权限控制模型:
@PreAuthorize("hasRole('ADMIN')") @PostMapping("/books") public Result addBook(@Valid @RequestBody BookDTO dto) { // 业务逻辑 }图片存储方案对比:
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 本地存储 | 简单直接 | 扩容困难 | 小型系统 |
| FastDFS | 高可用 | 配置复杂 | 中大型系统 |
| 七牛云 | 即开即用 | 收费服务 | 预算充足项目 |
3.2 订单支付流程
状态机设计:
stateDiagram [*] --> 待支付 待支付 --> 已取消: 超时未支付 待支付 --> 已支付: 支付成功 已支付 --> 已发货 已发货 --> 已完成 已发货 --> 退款中支付对接注意事项:
- 支付宝沙箱环境必须配置RSA2密钥
- 微信支付需要配置商户证书路径
- 支付结果回调要做签名验证
4. 性能优化实践
4.1 缓存策略
多级缓存架构:
- 本地Caffeine缓存(过期时间5分钟)
- Redis集群缓存(过期时间30分钟)
- MySQL查询优化
缓存穿透解决方案:
public Book getBookById(Long id) { // 布隆过滤器判断 if(!bloomFilter.mightContain(id)){ return null; } // 查询逻辑... }4.2 数据库优化
索引设计原则:
- 为所有外键字段建立索引
- 组合索引遵循最左前缀原则
- 避免在索引列上使用函数
慢查询监控配置:
spring: datasource: hikari: connection-test-query: SELECT 1 connection-timeout: 30000 maximum-pool-size: 205. 部署方案
5.1 容器化部署
Docker Compose编排:
version: '3' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 123456 ports: - "3306:3306" redis: image: redis:6.2 ports: - "6379:6379"5.2 CI/CD流程
Jenkins流水线关键步骤:
- 代码质量检查(SonarQube)
- 单元测试覆盖率要求>80%
- 构建Docker镜像并推送到Harbor
- 蓝绿部署到K8s集群
6. 常见问题排查
6.1 MyBatis缓存问题
一级缓存导致的问题场景:
// 第一次查询 Book book1 = bookMapper.selectById(1L); // 中间修改了数据 bookService.updatePrice(1L, newPrice); // 第二次查询(返回缓存结果) Book book2 = bookMapper.selectById(1L);解决方案:
- 在方法上添加@Transactional
- 手动清除缓存:sqlSession.clearCache()
- 配置flushCache="true"
6.2 Vue打包优化
webpack配置调整:
configureWebpack: { optimization: { splitChunks: { chunks: 'all', minSize: 20000, maxSize: 250000 } } }静态资源CDN配置:
publicPath: process.env.NODE_ENV === 'production' ? 'https://cdn.yourdomain.com/' : '/'7. 扩展建议
- 增加ELK日志分析系统
- 集成Prometheus监控
- 实现分布式事务(Seata)
- 添加压力测试模块(JMeter)
这个项目我在实际开发中最大的体会是:数据库设计要预留20%的扩展字段,Vue组件要控制粒度避免过度拆分,接口文档必须实时更新。系统上线后平稳运行了8个月,期间通过Arthas解决了几个性能瓶颈问题。