作为一名长期从事Java企业级开发的工程师,我最近完成了一个基于Spring Boot的小型超市商品管理系统。这个项目源于实际需求——我的一位经营社区超市的朋友经常抱怨传统手工管理方式效率低下,库存不准导致频繁出现缺货或积压的情况。通过这个系统,我们成功将超市的库存准确率从原来的75%提升到了98%,采购决策时间缩短了60%。
这个系统采用B/S架构,前端使用Thymeleaf模板引擎,后端基于Spring Boot 2.7.3,数据库选用MySQL 8.0,开发工具是Eclipse IDE配合Maven进行依赖管理。系统部署在Tomcat 9.0服务器上,整个技术栈保持了高度的轻量化和可维护性。
系统采用经典的三层架构:
我特别采用了Spring的依赖注入(DI)和面向切面编程(AOP)来实现松耦合。例如,通过@Transactional注解管理事务,确保数据操作的原子性。数据库连接池选用HikariCP,实测比传统的DBCP性能提升40%以上。
系统主要分为两大角色模块:
提示:在设计权限系统时,我采用了基于角色的访问控制(RBAC)模型,通过user、role、permission三张表实现灵活的权限分配。这种方式比传统的ACL更易于维护,特别适合中小型系统。
数据库设计遵循第三范式,主要包含12张核心表。以下是几个关键表的设计要点:
商品信息表(product_information):
采购订单表(purchase_order):
销售订单表(sales_order):
java复制// 典型的实体类设计示例
@Entity
@Table(name = "product_information")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 64)
private String name;
@Column(name = "selling_price", precision = 9, scale = 2)
private BigDecimal sellingPrice;
// 省略其他字段和方法
}
在application.yml中进行了多项优化配置:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/supermarket?useSSL=false&serverTimezone=UTC
username: root
password: 123456
hikari:
maximum-pool-size: 20
connection-timeout: 30000
thymeleaf:
cache: false # 开发时关闭缓存
mode: HTML
encoding: UTF-8
server:
port: 8080
servlet:
context-path: /smms
采用乐观锁解决并发更新问题:
java复制@Transactional
public void updateStock(Long productId, BigDecimal quantity) {
Product product = productRepository.findById(productId)
.orElseThrow(() -> new RuntimeException("商品不存在"));
if(product.getInventory().compareTo(quantity) < 0) {
throw new RuntimeException("库存不足");
}
int rows = productRepository.updateInventory(
productId,
quantity,
product.getVersion());
if(rows == 0) {
throw new OptimisticLockingFailureException("库存更新冲突");
}
}
使用状态模式管理订单生命周期:
java复制public interface OrderState {
void confirm(Order order);
void cancel(Order order);
void complete(Order order);
}
@Service
@Transactional
public class OrderService {
public void processOrder(Long orderId, OrderAction action) {
Order order = orderRepository.findById(orderId)
.orElseThrow(() -> new RuntimeException("订单不存在"));
OrderState state = getState(order.getStatus());
switch(action) {
case CONFIRM: state.confirm(order); break;
case CANCEL: state.cancel(order); break;
case COMPLETE: state.complete(order); break;
}
}
private OrderState getState(OrderStatus status) {
// 返回对应的状态处理器
}
}
缓存策略:
SQL优化:
异步处理:
前端采用Bootstrap 5实现响应式布局,确保在PC和平板上都能良好显示。主要界面包括:
登录界面:
商品管理界面:
数据看板:
大量使用Fetch API实现异步交互:
javascript复制// 商品搜索示例
async function searchProducts() {
const params = new URLSearchParams({
category: document.getElementById('category').value,
keyword: document.getElementById('keyword').value,
page: currentPage
});
try {
const response = await fetch(`/api/products?${params}`);
const data = await response.json();
renderProductList(data.content);
updatePagination(data.totalPages);
} catch (error) {
showError("搜索失败,请稍后重试");
}
}
服务器配置:
部署步骤:
bash复制# 打包应用
mvn clean package -DskipTests
# 上传到服务器
scp target/smms.war root@yourserver:/opt/tomcat/webapps/
# 启动Tomcat
/opt/tomcat/bin/startup.sh
nginx复制server {
listen 80;
server_name supermarket.example.com;
location / {
proxy_pass http://localhost:8080/smms;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
java复制@RestController
@RequestMapping("/actuator")
public class HealthController {
@GetMapping("/health")
public ResponseEntity<Map<String, String>> health() {
Map<String, String> status = new HashMap<>();
status.put("status", "UP");
status.put("db", checkDatabase() ? "UP" : "DOWN");
return ResponseEntity.ok(status);
}
}
xml复制<!-- logback-spring.xml配置示例 -->
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
并发库存更新问题:
事务失效场景:
性能瓶颈:
代码规范:
安全实践:
性能调优:
移动端适配:
智能分析:
物联网集成:
这个项目从需求分析到上线部署共耗时3个月,期间遇到了各种技术挑战,但最终成功帮助朋友解决了实际问题。对于想学习Spring Boot实战开发的同学,超市管理系统是个很好的练手项目,它涵盖了CRUD、事务管理、权限控制等企业开发的常见需求。