1. 项目概述
这个基于Vue和Java的酒店客房管理系统项目,是我去年为本地一家连锁酒店开发的实战项目。系统采用前后端分离架构,前端使用Vue.js+Element UI构建响应式界面,后端基于Spring Boot框架开发,数据库选用MySQL 8.0。整个系统从需求分析到上线部署历时3个月,目前已在6家分店稳定运行。
提示:酒店管理系统不同于普通CRM,需要特别关注实时房态更新、多分店数据同步和夜间审计等酒店行业特有需求。
2. 核心功能设计
2.1 房态管理模块
采用WebSocket实现实时房态看板,关键数据结构设计:
// 房态实体类 public class RoomStatus { private String roomNumber; // 房号 private Integer roomTypeId; // 房型ID private Integer status; // 0-空房 1-已入住 2-待清洁 3-维修中 private LocalDateTime updateTime; // getters & setters }前端使用Vuex管理全局房态数据,通过颜色区分不同状态:
<template> <div class="room" :class="{ 'vacant': status === 0, 'occupied': status === 1, 'dirty': status === 2, 'maintenance': status === 3 }"> {{ roomNumber }} </div> </template>2.2 预订入住流程
采用状态机模式管理订单生命周期:
预订 → 确认 → 入住 → 退房 → 完成 ↘ 取消关键业务逻辑处理:
public class ReservationService { @Transactional public void checkIn(Long orderId) { Order order = orderRepository.findById(orderId) .orElseThrow(() -> new BusinessException("订单不存在")); if (!order.getStatus().equals(OrderStatus.CONFIRMED)) { throw new BusinessException("当前状态不可办理入住"); } order.setStatus(OrderStatus.CHECKED_IN); order.setCheckInTime(LocalDateTime.now()); // 关联房态变更 roomService.updateStatus(order.getRoomId(), RoomStatus.OCCUPIED); } }3. 技术实现细节
3.1 前后端分离架构
技术栈选型对比:
| 技术点 | 前端方案 | 后端方案 |
|---|---|---|
| HTTP客户端 | Axios | RestTemplate |
| 状态管理 | Vuex | Spring Session |
| 路由控制 | Vue Router | Spring MVC |
| 安全认证 | JWT+前端存储 | Spring Security |
跨域解决方案:
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowCredentials(true) .maxAge(3600); } }3.2 数据库设计要点
主要表结构关系图:
客人表 (guest) ← 订单表 (order) → 房型表 (room_type) → 房间表 (room) ↑ 支付记录表 (payment)索引优化方案:
-- 高频查询字段添加索引 CREATE INDEX idx_order_status ON `order`(status); CREATE INDEX idx_room_status ON room(status); CREATE INDEX idx_guest_phone ON guest(phone); -- 组合索引优化 CREATE INDEX idx_order_dates ON `order`(check_in_date, check_out_date);4. 典型问题解决方案
4.1 房态同步延迟问题
现象:多终端操作时房态显示不一致
解决方案:
- 采用WebSocket全双工通信
- 后端使用Redis发布订阅模式
- 前端增加手动刷新按钮
实现代码:
@RestController @RequestMapping("/ws") public class RoomStatusWSController { @Autowired private SimpMessagingTemplate messagingTemplate; @PostMapping("/updateStatus") public void updateStatus(@RequestBody RoomStatusDTO dto) { // 更新数据库 roomService.updateStatus(dto); // 广播通知所有客户端 messagingTemplate.convertAndSend("/topic/roomStatus", dto); } }4.2 并发预订控制
使用数据库乐观锁解决超卖问题:
public class OrderService { @Transactional public boolean createOrder(OrderDTO dto) { Room room = roomRepository.findById(dto.getRoomId()) .orElseThrow(() -> new BusinessException("房间不存在")); // 检查版本号 if (room.getVersion() != dto.getVersion()) { throw new OptimisticLockException("房间状态已变更"); } // 业务逻辑处理 // ... // 更新版本号 room.setVersion(room.getVersion() + 1); roomRepository.save(room); return true; } }5. 部署与性能优化
5.1 前端部署方案
采用Nginx配置多环境部署:
server { listen 80; server_name hotel-admin.example.com; location / { root /usr/share/nginx/html/hotel-admin; index index.html; try_files $uri $uri/ /index.html; } location /api { proxy_pass http://backend-server:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }5.2 后端性能优化
- 缓存策略:
@Cacheable(value = "roomTypes", key = "#hotelId") public List<RoomType> getRoomTypesByHotel(Long hotelId) { return roomTypeRepository.findByHotelId(hotelId); }- 数据库连接池配置:
spring: datasource: hikari: maximum-pool-size: 20 minimum-idle: 5 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000- 日志切割配置(Logback):
<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>6. 项目演进方向
- 智能排房算法:根据客人偏好、房间位置等因素自动分配房间
- 移动端PWA应用:支持离线办理基础业务
- 对接OTA平台:实现与携程、美团等平台的直连
- 房务人员APP:通过扫码实现快速查房、报修
在实施这类系统时,特别要注意酒店业务流程的特殊性。比如夜间审计(Night Audit)必须在特定时间执行,涉及房费计算、报表生成等批量操作,我们最终采用Spring Batch+Quartz的方案实现,处理200间客房的数据约需8分钟