在传统洗浴服务行业中,客户预约主要依赖电话沟通或到店登记,这种方式存在信息记录不准确、资源调度效率低、客户体验差等诸多痛点。针对这一市场需求,开发了"沐云预约"——一个基于SSM框架的智能化洗浴中心在线预约管理系统。
系统采用经典的三层架构设计,表现层使用Spring MVC框架处理前端请求和视图渲染,通过注解驱动的控制器清晰定义业务接口。业务层基于Spring IoC容器管理服务组件,利用AOP机制统一处理事务管理与日志记录。数据持久层依托MyBatis框架,通过XML映射文件实现灵活的SQL编写与对象关系映射。
数据库架构设计亮点
系统数据库包含11张核心表,其中预约记录表的设计体现了业务复杂性:
CREATE TABLE booking_records (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
room_id BIGINT NOT NULL,
service_type VARCHAR(50) NOT NULL,
booking_time DATETIME NOT NULL,
duration INT NOT NULL COMMENT '预约时长(分钟)',
status ENUM('pending', 'confirmed', 'completed', 'cancelled') DEFAULT 'pending',
total_amount DECIMAL(10,2) NOT NULL,
created_time DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (room_id) REFERENCES rooms(id),
INDEX idx_booking_time (booking_time),
INDEX idx_user_status (user_id, status)
);
该表通过外键关联用户和房间信息,使用ENUM类型规范预约状态,并建立复合索引优化查询性能。时间戳字段的自动更新机制确保了数据一致性。
房间资源管理表的设计考虑了并发预约的场景:
CREATE TABLE rooms (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
room_number VARCHAR(20) UNIQUE NOT NULL,
room_type VARCHAR(50) NOT NULL,
capacity INT NOT NULL,
hourly_rate DECIMAL(8,2) NOT NULL,
status ENUM('available', 'occupied', 'maintenance') DEFAULT 'available',
description TEXT,
features JSON COMMENT '房间特色设施JSON格式存储'
);
采用JSON类型存储动态的房间特色信息,为后续功能扩展提供了灵活性。
核心业务功能实现
用户认证与权限管理
系统采用基于角色的访问控制(RBAC)模型,用户登录后根据角色权限显示不同的功能菜单。
@Controller
@RequestMapping("/auth")
public class AuthController {
@Autowired
private UserService userService;
@PostMapping("/login")
@ResponseBody
public ResponseEntity<Map<String, Object>> login(
@RequestParam String username,
@RequestParam String password,
HttpSession session) {
User user = userService.authenticate(username, password);
if (user != null) {
session.setAttribute("currentUser", user);
session.setAttribute("userRole", user.getRole());
Map<String, Object> result = new HashMap<>();
result.put("success", true);
result.put("redirectUrl", user.getRole().equals("ADMIN") ? "/admin/dashboard" : "/user/home");
return ResponseEntity.ok(result);
} else {
throw new AuthenticationException("用户名或密码错误");
}
}
}

智能预约调度引擎
预约功能的核心在于资源冲突检测和智能排期算法:
@Service
public class BookingService {
@Autowired
private BookingMapper bookingMapper;
@Transactional
public BookingResult createBooking(BookingRequest request) {
// 检查时间冲突
List<Booking> conflicts = bookingMapper.findConflicts(
request.getRoomId(),
request.getBookingTime(),
request.getDuration()
);
if (!conflicts.isEmpty()) {
throw new BookingConflictException("该时间段房间已被预约");
}
// 计算费用
BigDecimal amount = calculateAmount(request);
// 创建预约记录
Booking booking = new Booking();
booking.setUserId(request.getUserId());
booking.setRoomId(request.getRoomId());
booking.setBookingTime(request.getBookingTime());
booking.setDuration(request.getDuration());
booking.setTotalAmount(amount);
booking.setStatus(BookingStatus.PENDING);
bookingMapper.insert(booking);
// 发送通知
notificationService.sendBookingConfirmation(booking);
return new BookingResult(booking.getId(), amount);
}
private BigDecimal calculateAmount(BookingRequest request) {
Room room = roomMapper.selectById(request.getRoomId());
int hours = (int) Math.ceil(request.getDuration() / 60.0);
return room.getHourlyRate().multiply(new BigDecimal(hours));
}
}

后台管理功能
管理员界面提供完整的业务管理能力,包括订单管理、房间管理和用户管理:
@Controller
@RequestMapping("/admin")
public class AdminController {
@Autowired
private OrderService orderService;
@GetMapping("/orders")
public String orderManagement(Model model,
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size) {
PageHelper.startPage(page, size);
List<Order> orders = orderService.getAllOrders();
PageInfo<Order> pageInfo = new PageInfo<>(orders);
model.addAttribute("orders", orders);
model.addAttribute("pageInfo", pageInfo);
return "admin/order-management";
}
@PostMapping("/orders/{orderId}/status")
@ResponseBody
public ResponseEntity<?> updateOrderStatus(@PathVariable Long orderId,
@RequestParam String status) {
orderService.updateStatus(orderId, status);
return ResponseEntity.ok().build();
}
}

实时资源状态监控
系统通过WebSocket实现房间状态的实时更新:
@Component
@ServerEndpoint("/websocket/roomStatus")
public class RoomStatusWebSocket {
private static ConcurrentHashMap<String, Session> sessions = new ConcurrentHashMap<>();
@OnOpen
public void onOpen(Session session) {
sessions.put(session.getId(), session);
sendInitialRoomStatus(session);
}
@OnMessage
public void onMessage(String message, Session session) {
// 处理客户端消息
}
public static void broadcastRoomStatusUpdate(RoomStatusUpdate update) {
for (Session session : sessions.values()) {
if (session.isOpen()) {
try {
session.getBasicRemote().sendText(
objectMapper.writeValueAsString(update)
);
} catch (IOException e) {
// 处理异常
}
}
}
}
}
数据模型核心设计
用户实体模型包含完整的业务属性:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true, nullable = false)
private String username;
@Column(nullable = false)
private String password;
private String realName;
private String phone;
private String email;
@Enumerated(EnumType.STRING)
private UserRole role;
@Column(nullable = false)
private Boolean enabled = true;
@CreationTimestamp
private LocalDateTime createTime;
@UpdateTimestamp
private LocalDateTime updateTime;
// 关联关系
@OneToMany(mappedBy = "user")
private List<Booking> bookings;
}
预约业务对象的完整生命周期管理:
public class Booking implements Serializable {
private Long id;
private Long userId;
private Long roomId;
private LocalDateTime bookingTime;
private Integer duration;
private BigDecimal totalAmount;
private BookingStatus status;
private String specialRequirements;
// 关联对象
private User user;
private Room room;
public enum BookingStatus {
PENDING, CONFIRMED, IN_PROGRESS, COMPLETED, CANCELLED
}
}
MyBatis数据持久化实现
复杂的查询操作通过动态SQL实现:
<!-- 预约记录动态查询 -->
<select id="selectBookingsByCriteria" parameterType="map" resultMap="BookingResultMap">
SELECT b.*, u.username, r.room_number, r.room_type
FROM booking_records b
LEFT JOIN users u ON b.user_id = u.id
LEFT JOIN rooms r ON b.room_id = r.id
<where>
<if test="userId != null">
AND b.user_id = #{userId}
</if>
<if test="status != null">
AND b.status = #{status}
</if>
<if test="startTime != null">
AND b.booking_time >= #{startTime}
</if>
<if test="endTime != null">
AND b.booking_time <= #{endTime}
</if>
<if test="roomType != null">
AND r.room_type = #{roomType}
</if>
</where>
ORDER BY b.booking_time DESC
<if test="limit != null">
LIMIT #{limit}
</if>
</select>
系统优化与扩展方向
弹性资源调度算法:引入基于机器学习的预测模型,根据历史数据预测高峰时段,动态调整资源分配策略。实现思路包括收集历史预约模式数据,训练时间序列预测模型,优化房间和技师排班。
移动端原生应用:开发React Native或Flutter跨平台移动应用,集成推送通知、地理位置服务和移动支付功能。通过API网关统一管理后端服务接口。
会员积分与营销系统:建立完整的会员成长体系,设计积分累计和兑换规则。实现优惠券发放、会员等级特权等营销功能,提升客户粘性。
实时数据分析看板:使用Elasticsearch进行业务数据索引,通过Kibana构建实时业务监控仪表盘。监控关键指标如房间利用率、客户满意度、营收趋势等。
微服务架构重构:将单体应用拆分为用户服务、预约服务、支付服务、消息服务等独立微服务。采用Spring Cloud生态实现服务治理、配置管理和链路追踪。

系统的数据库连接池配置优化:
@Configuration
@MapperScan("com.muyun.booking.mapper")
public class MyBatisConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return new HikariDataSource();
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
// 配置驼峰命名转换
org.apache.ibatis.session.Configuration configuration =
new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
sessionFactory.setConfiguration(configuration);
return sessionFactory.getObject();
}
}
事务管理的统一配置确保数据一致性:
@Configuration
@EnableTransactionManagement
public class TransactionConfig {
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
return new TransactionTemplate(transactionManager);
}
}
系统通过精细化的异常处理机制保证业务稳定性:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BookingConflictException.class)
public ResponseEntity<ErrorResponse> handleBookingConflict(BookingConflictException ex) {
ErrorResponse error = new ErrorResponse("BOOKING_CONFLICT", ex.getMessage());
return ResponseEntity.status(HttpStatus.CONFLICT).body(error);
}
@ExceptionHandler(AuthenticationException.class)
public ResponseEntity<ErrorResponse> handleAuthException(AuthenticationException ex) {
ErrorResponse error = new ErrorResponse("AUTH_FAILED", ex.getMessage());
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(error);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleGenericException(Exception ex) {
ErrorResponse error = new ErrorResponse("INTERNAL_ERROR", "系统内部错误");
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);
}
}
系统在安全性方面实现了多层次防护,包括SQL注入防护、XSS攻击防范、CSRF令牌验证等。通过Spring Security框架整合RBAC权限模型,确保不同角色用户只能访问授权资源。

系统性能优化方面,采用了多级缓存策略:使用Redis缓存热点数据如房间信息、服务价格等;通过MyBatis二级缓存减少数据库访问;静态资源通过CDN加速提升页面加载速度。数据库层面通过读写分离和分库分表策略支撑高并发场景。