1. 项目概述
这个基于SpringBoot的洗衣店订单管理系统是我在指导本科生毕业设计时开发的一个实战项目。作为一个完整的商业系统解决方案,它涵盖了洗衣店日常运营中的核心业务流程,包括顾客下单、店家接单、订单跟踪、支付管理等全流程功能。
系统采用典型的三层架构设计,分为管理员、店家、顾客三个角色。管理员负责整个平台的运营管理,店家专注于订单处理和店铺运营,顾客则通过前端界面完成洗衣服务的预约和支付。这种角色划分很好地模拟了现实洗衣店的业务场景。
提示:在实际开发中,角色权限的划分需要特别注意数据隔离问题。比如店家只能看到自己店铺的订单,而不能查看其他店铺的数据。
2. 技术选型与架构设计
2.1 后端技术栈
系统采用SpringBoot 2.7作为基础框架,这是目前Java领域最流行的微服务开发框架。选择SpringBoot主要基于以下几个考虑:
- 快速开发:SpringBoot的自动配置和起步依赖大大简化了项目搭建过程
- 生态丰富:Spring生态拥有大量成熟的解决方案
- 易于扩展:可以方便地集成其他Spring项目如Spring Security、Spring Data等
数据库选用MySQL 8.0,主要考虑到:
- 洗衣店业务数据关系明确,适合关系型数据库
- MySQL在中小型项目中性能表现优异
- 开源免费,适合教学和毕业设计场景
2.2 前端技术方案
前端采用传统的Thymeleaf模板引擎,这种选择主要基于以下因素:
- 学习成本低:对于Java开发者来说,Thymeleaf语法简单易学
- 前后端耦合:适合小型项目快速开发
- SEO友好:服务端渲染对搜索引擎更友好
虽然现在主流趋势是前后端分离,但对于毕业设计这类小型项目,使用模板引擎可以避免复杂的前端工程化配置,让学生更专注于业务逻辑的实现。
2.3 系统架构设计
系统采用典型的三层架构:
code复制表现层(Web) → 业务逻辑层(Service) → 数据访问层(DAO)
这种分层设计的好处是:
- 职责分离,便于维护
- 各层可以独立演进
- 便于单元测试
3. 核心功能实现
3.1 用户认证与权限控制
系统使用Spring Security实现基于角色的访问控制(RBAC)。在SecurityConfig配置类中,我们定义了三种角色:
java复制@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/store/**").hasRole("STORE")
.antMatchers("/user/**").hasRole("USER")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll();
}
密码存储采用BCrypt加密算法,这是目前最安全的密码哈希算法之一:
java复制@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
3.2 订单状态机设计
订单状态流转是系统的核心业务逻辑。我们使用状态模式(State Pattern)来实现订单状态管理:
java复制public enum OrderStatus {
PENDING("待处理"),
CONFIRMED("已确认"),
WASHING("洗涤中"),
DRYING("烘干中"),
IRONING("熨烫中"),
COMPLETED("已完成"),
PICKED_UP("已取件"),
CANCELLED("已取消");
private final String description;
// 省略构造方法和getter
}
状态转换规则通过业务逻辑层的方法来保证:
java复制public void changeOrderStatus(Long orderId, OrderStatus newStatus) {
Order order = orderRepository.findById(orderId)
.orElseThrow(() -> new OrderNotFoundException(orderId));
if (!order.getStatus().canTransitionTo(newStatus)) {
throw new IllegalStateException("无效的状态转换");
}
order.setStatus(newStatus);
orderRepository.save(order);
}
3.3 店铺审核流程
店家注册后需要管理员审核才能正式营业。这个流程通过sfsh(是否审核)字段控制:
java复制@Entity
public class Store {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String address;
private String phone;
@Column(name = "sfsh")
private Boolean approved = false;
// 其他字段和方法
}
审核接口实现:
java复制@PostMapping("/admin/stores/{id}/approve")
public String approveStore(@PathVariable Long id) {
Store store = storeService.findById(id);
store.setApproved(true);
storeService.save(store);
// 发送通知邮件给店家
emailService.sendStoreApprovalNotification(store.getEmail());
return "redirect:/admin/stores";
}
4. 数据库设计
4.1 核心表结构
系统主要包含以下核心表:
- 用户表(users):存储所有用户的基本信息
- 店铺表(stores):记录店铺详细信息
- 订单表(orders):存储订单基本信息
- 订单明细表(order_items):记录订单中的具体洗衣项目
- 帖子表(posts):交流区帖子
- 评论表(comments):帖子评论
4.2 关键表关系
sql复制CREATE TABLE orders (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
store_id BIGINT NOT NULL,
order_number VARCHAR(32) NOT NULL UNIQUE,
total_amount DECIMAL(10,2) NOT NULL,
status VARCHAR(20) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (store_id) REFERENCES stores(id)
);
CREATE TABLE order_items (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_id BIGINT NOT NULL,
clothing_type VARCHAR(50) NOT NULL,
quantity INT NOT NULL,
unit_price DECIMAL(10,2) NOT NULL,
special_instructions TEXT,
FOREIGN KEY (order_id) REFERENCES orders(id)
);
5. 开发经验与避坑指南
5.1 事务管理要点
在订单创建等需要保证数据一致性的操作中,必须正确使用事务:
java复制@Service
@Transactional
public class OrderServiceImpl implements OrderService {
@Override
public Order createOrder(OrderDTO orderDTO) {
// 1. 验证用户和店铺
User user = userRepository.findById(orderDTO.getUserId())
.orElseThrow(() -> new UserNotFoundException(orderDTO.getUserId()));
Store store = storeRepository.findById(orderDTO.getStoreId())
.orElseThrow(() -> new StoreNotFoundException(orderDTO.getStoreId()));
// 2. 创建订单
Order order = new Order();
order.setUser(user);
order.setStore(store);
order.setStatus(OrderStatus.PENDING);
// 3. 添加订单项
List<OrderItem> items = orderDTO.getItems().stream()
.map(itemDTO -> {
OrderItem item = new OrderItem();
item.setClothingType(itemDTO.getClothingType());
item.setQuantity(itemDTO.getQuantity());
item.setUnitPrice(getPriceForType(itemDTO.getClothingType()));
return item;
})
.collect(Collectors.toList());
order.setItems(items);
// 4. 计算总价
BigDecimal total = items.stream()
.map(item -> item.getUnitPrice().multiply(BigDecimal.valueOf(item.getQuantity())))
.reduce(BigDecimal.ZERO, BigDecimal::add);
order.setTotalAmount(total);
// 5. 保存订单
return orderRepository.save(order);
}
}
注意:默认情况下Spring的事务只在运行时异常时回滚,如果需要检查异常也触发回滚,需要使用
@Transactional(rollbackFor = Exception.class)
5.2 性能优化实践
-
缓存策略:
- 使用Redis缓存热门店铺信息
- 实现二级缓存(Ehcache + Redis)减轻数据库压力
-
批量操作:
- 使用JPA的
saveAll进行批量插入 - 对于大量数据更新,使用原生SQL提高效率
- 使用JPA的
-
懒加载与DTO:
- 实体类关联关系使用懒加载
- 接口返回DTO而非实体,避免不必要的数据传输
java复制public interface OrderRepository extends JpaRepository<Order, Long> {
@Query("SELECT new com.example.dto.OrderListDTO(o.id, o.orderNumber, o.status, o.createdAt) " +
"FROM Order o WHERE o.user.id = :userId")
Page<OrderListDTO> findOrderSummariesByUser(@Param("userId") Long userId, Pageable pageable);
}
5.3 安全防护措施
-
XSS防护:
- 前端使用DOMPurify对用户输入进行净化
- 后端使用Spring的HtmlUtils进行HTML转义
-
CSRF防护:
- 启用Spring Security的CSRF保护
- 敏感操作使用POST而非GET
-
SQL注入防护:
- 使用JPA或MyBatis等ORM框架
- 必须使用参数化查询
-
文件上传安全:
- 限制上传文件类型
- 存储时使用随机文件名
- 文件不直接存储在web目录下
6. 部署与运维
6.1 环境要求
- JDK 11+
- MySQL 8.0+
- Redis 5.0+(可选,用于缓存)
- Tomcat 9.0+或直接使用SpringBoot内嵌服务器
6.2 部署步骤
- 数据库准备:
bash复制mysql -u root -p
CREATE DATABASE laundry_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON laundry_system.* TO 'laundry'@'%' IDENTIFIED BY 'securepassword';
FLUSH PRIVILEGES;
- 应用配置:
properties复制# application-prod.properties
spring.datasource.url=jdbc:mysql://localhost:3306/laundry_system?useSSL=false&serverTimezone=UTC
spring.datasource.username=laundry
spring.datasource.password=securepassword
spring.jpa.hibernate.ddl-auto=update
- 构建与运行:
bash复制mvn clean package -DskipTests
java -jar target/laundry-system-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
6.3 监控与日志
- 集成Spring Boot Actuator进行健康检查:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 配置Logback日志:
xml复制<!-- logback-spring.xml -->
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/laundry-system.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/laundry-system.%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>
7. 项目扩展方向
在实际教学过程中,我通常会建议学生在基础功能完成后考虑以下扩展方向:
- 微信小程序端:开发顾客端小程序,提升用户体验
- 智能柜集成:与智能快递柜API对接,实现无人交接
- 物流跟踪:集成地图API实现取送件路线规划
- 会员系统:增加积分、优惠券等营销功能
- 数据分析:使用ELK或Prometheus+Grafana实现业务数据分析
对于希望深入学习的同学,我会建议他们尝试将单体架构改造为微服务架构,使用Spring Cloud Alibaba等技术栈。这不仅能提升技术水平,也能更好地理解现代分布式系统的设计理念。