基于SSM框架的洗浴中心在线预约平台 - 源码深度解析

JavaJavaScriptHTMLCSSSSM框架MySQL
2026-03-144 浏览

文章摘要

本项目是一款基于SSM(Spring+Spring MVC+MyBatis)框架构建的洗浴中心在线预约平台,旨在解决传统洗浴行业依赖电话或到店预约带来的效率低下、信息记录易出错、客户体验差等核心痛点。平台通过数字化流程将服务预约、资源调度与管理一体化,显著降低人力沟通成本,提升场地与技师资源的利用率...

在传统洗浴服务行业中,客户预约主要依赖电话沟通或到店登记,这种方式存在信息记录不准确、资源调度效率低、客户体验差等诸多痛点。针对这一市场需求,开发了"沐云预约"——一个基于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>

系统优化与扩展方向

  1. 弹性资源调度算法:引入基于机器学习的预测模型,根据历史数据预测高峰时段,动态调整资源分配策略。实现思路包括收集历史预约模式数据,训练时间序列预测模型,优化房间和技师排班。

  2. 移动端原生应用:开发React Native或Flutter跨平台移动应用,集成推送通知、地理位置服务和移动支付功能。通过API网关统一管理后端服务接口。

  3. 会员积分与营销系统:建立完整的会员成长体系,设计积分累计和兑换规则。实现优惠券发放、会员等级特权等营销功能,提升客户粘性。

  4. 实时数据分析看板:使用Elasticsearch进行业务数据索引,通过Kibana构建实时业务监控仪表盘。监控关键指标如房间利用率、客户满意度、营收趋势等。

  5. 微服务架构重构:将单体应用拆分为用户服务、预约服务、支付服务、消息服务等独立微服务。采用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加速提升页面加载速度。数据库层面通过读写分离和分库分表策略支撑高并发场景。

本文关键词
SSM框架洗浴中心在线预约平台源码解析数据库设计

上下篇

上一篇
没有更多文章
下一篇
没有更多文章