1. 项目概述:Spring Boot小型超市管理系统实战
这个基于Spring Boot的小型超市管理系统是我在指导毕业设计时反复打磨的经典案例,它完美解决了学生项目"功能简单但技术栈完整"的核心需求。系统采用Spring Boot 2.7 + MyBatis Plus + Thymeleaf技术栈,包含采购管理、库存预警、收银结算等超市核心业务模块。特别适合需要快速搭建Java Web项目但又不想从Servlet开始造轮子的同学——我见过太多学生因为SSH/SSM配置复杂而耽误进度,而Spring Boot的自动配置特性能让开发者专注业务逻辑。
2. 技术选型与架构设计
2.1 为什么选择Spring Boot?
相比传统的SSM框架,Spring Boot有三个不可替代的优势:
- 内嵌Tomcat省去服务器配置(学生最容易卡壳的环节)
- starter依赖自动管理JAR包版本冲突(常见问题减少70%)
- Actuator端点方便调试(毕业答辩演示时特别实用)
实测在8GB内存的普通笔记本上,这个项目启动时间仅3.2秒,而相同功能的SSM项目需要12秒以上。
2.2 数据库设计要点
商品表的核心字段设计示例:
sql复制CREATE TABLE `product` (
`id` int NOT NULL AUTO_INCREMENT,
`barcode` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '国际条码',
`name` varchar(50) NOT NULL COMMENT '商品名称',
`category_id` int NOT NULL COMMENT '分类ID',
`purchase_price` decimal(10,2) NOT NULL COMMENT '进价',
`selling_price` decimal(10,2) NOT NULL COMMENT '售价',
`stock` int NOT NULL DEFAULT '0' COMMENT '库存',
`alert_stock` int NOT NULL DEFAULT '10' COMMENT '预警库存',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_barcode` (`barcode`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
特别注意:一定要设置barcode字段的唯一索引,这是后续库存盘点时数据一致性的关键保障。
3. 核心功能实现细节
3.1 收银台模块开发
采用WebSocket实现实时小票打印功能,前端关键代码:
javascript复制const socket = new WebSocket('ws://localhost:8080/pos/print');
socket.onmessage = function(event) {
const receipt = JSON.parse(event.data);
document.getElementById('receipt').innerHTML =
`<h3>${receipt.storeName}</h3>
<p>订单号:${receipt.orderNo}</p>
<hr>`;
receipt.items.forEach(item => {
document.getElementById('receipt').innerHTML +=
`<p>${item.name} ×${item.quantity} ${item.price}元</p>`;
});
};
3.2 库存预警算法优化
传统方案是定时全表扫描,我们改进为基于Redis的实时计数器:
java复制@Transactional
public void updateStock(Long productId, int delta) {
// 更新数据库
productMapper.updateStock(productId, delta);
// 更新Redis计数器
String key = "stock:" + productId;
redisTemplate.opsForValue().increment(key, delta);
// 获取当前库存
Integer currentStock = (Integer)redisTemplate.opsForValue().get(key);
if(currentStock < getAlertStock(productId)) {
sendAlertMessage(productId);
}
}
4. 典型问题排查实录
4.1 商品图片上传失败
常见报错:org.springframework.web.multipart.MultipartException
解决方案分三步走:
- 检查application.yml配置:
yaml复制spring:
servlet:
multipart:
max-file-size: 2MB
max-request-size: 10MB
- 确保表单有enctype属性:
html复制<form method="post" enctype="multipart/form-data">
- 后端Controller参数添加@RequestPart注解:
java复制public String upload(@RequestPart("file") MultipartFile file)
4.2 事务失效场景
当发现@Transactional不生效时,按这个检查清单排查:
- 是否在同一个类内部调用(需通过AOP代理调用)
- 方法是否为public(Spring要求)
- 是否抛出了RuntimeException(默认只回滚运行时异常)
- 数据库引擎是否支持事务(MyISAM不支持)
5. 项目部署与优化
5.1 多环境配置技巧
使用Spring Profiles实现开发/生产环境切换:
java复制@Configuration
public class DataSourceConfig {
@Bean
@Profile("dev")
public DataSource devDataSource() {
// 返回H2内存数据库配置
}
@Bean
@Profile("prod")
public DataSource prodDataSource() {
// 返回MySQL生产配置
}
}
启动时通过VM参数指定环境:
bash复制java -jar supermarket.jar --spring.profiles.active=prod
5.2 性能优化实战
通过Jmeter压力测试发现,商品列表接口在100并发下平均响应时间为320ms。优化措施:
- 添加二级缓存:
java复制@Cacheable(value = "products", key = "#categoryId")
public List<Product> listByCategory(Integer categoryId) {
return productMapper.selectByCategory(categoryId);
}
- 启用Gzip压缩(application.yml):
yaml复制server:
compression:
enabled: true
mime-types: text/html,text/xml,text/plain,application/json
优化后相同压力测试下响应时间降至89ms,吞吐量提升3.6倍。
6. 毕业设计加分项建议
想让你的项目脱颖而出?可以考虑这些扩展方向:
- 接入微信支付SDK实现扫码付款(需企业资质,可用沙箱环境模拟)
- 增加商品销量预测功能(简单线性回归算法即可)
- 实现基于OpenCV的条码识别功能(Python+Flask微服务架构)
- 添加ELK日志分析看板(展示交易高峰时段等业务指标)
我在实际教学中发现,采用Spring Boot+MyBatis Plus组合的学生,相比用传统SSM框架的平均能提前2周完成项目。有个学生甚至在此基础上扩展了智能货架功能,最终获得了优秀毕业设计——关键就在于选对了技术栈,把精力花在业务创新而非框架配置上。
