Java全栈项目:酒店客房管理系统
项目介绍
酒店客房管理系统是一个基于Spring Boot + Vue.js的全栈应用项目,主要用于酒店日常客房管理、预订、入住等业务操作的管理系统。
技术栈
后端
- Spring Boot 2.7.x
- MyBatis Plus
- MySQL 8.0
- Spring Security
- JWT认证
- Redis缓存
前端
- Vue.js 3
- Element Plus
- Axios
- Vuex
- Vue Router
核心功能模块
-
用户管理
- 员工账号管理
- 角色权限控制
- 登录认证
-
客房管理
- 房间类型管理
- 房间状态监控
- 房间维护记录
-
预订管理
- 在线预订
- 预订变更
- 预订取消
-
入住管理
- 客人入住登记
- 房间分配
- 退房结算
核心代码示例
1. 房间实体类
@Data
@TableName("t_room")
public class Room {
@TableId(type = IdType.AUTO)
private Long id;
private String roomNumber;
private Integer roomType;
private BigDecimal price;
private Integer status; // 0-空闲 1-已预订 2-已入住 3-维护中
private String description;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
2. 预订服务接口
@Service
public class BookingServiceImpl implements BookingService {
@Autowired
private RoomMapper roomMapper;
@Transactional
public boolean createBooking(BookingDTO bookingDTO) {
// 检查房间是否可预订
Room room = roomMapper.selectById(bookingDTO.getRoomId());
if (room == null || room.getStatus() != 0) {
throw new BusinessException("房间不可预订");
}
// 创建预订记录
Booking booking = new Booking();
BeanUtils.copyProperties(bookingDTO, booking);
// 更新房间状态
room.setStatus(1);
roomMapper.updateById(room);
return bookingMapper.insert(booking) > 0;
}
}
3. 前端预订表单组件
<template>
<el-form :model="bookingForm" :rules="rules" ref="bookingForm">
<el-form-item label="入住日期" prop="checkInDate">
<el-date-picker
v-model="bookingForm.checkInDate"
type="date"
placeholder="选择入住日期">
</el-date-picker>
</el-form-item>
<el-form-item label="退房日期" prop="checkOutDate">
<el-date-picker
v-model="bookingForm.checkOutDate"
type="date"
placeholder="选择退房日期">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitBooking">提交预订</el-button>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
bookingForm: {
checkInDate: '',
checkOutDate: ''
},
rules: {
checkInDate: [
{ required: true, message: '请选择入住日期', trigger: 'blur' }
],
checkOutDate: [
{ required: true, message: '请选择退房日期', trigger: 'blur' }
]
}
}
},
methods: {
submitBooking() {
this.$refs.bookingForm.validate(async (valid) => {
if (valid) {
try {
await this.$api.booking.create(this.bookingForm)
this.$message.success('预订成功')
} catch (error) {
this.$message.error('预订失败:' + error.message)
}
}
})
}
}
}
</script>
项目亮点
- 采用前后端分离架构,提高开发效率和系统可维护性
- 使用JWT + Redis实现安全认证和权限控制
- 引入MyBatis Plus简化数据库操作
- 使用Vue.js 3 Composition API提升代码复用性
- 统一异常处理,规范接口响应格式
项目收获
- 深入理解Spring Boot全家桶的使用
- 掌握Vue.js 3新特性和开发模式
- 了解酒店业务流程和数据模型设计
- 提升项目架构和代码规范意识
项目优化方向
- 引入ElasticSearch优化搜索功能
- 添加微信小程序端
- 接入支付功能
- 优化系统性能和安全性
- 添加数据统计和可视化功能
Java酒店管理系统 - 用户管理与客房管理模块详解
一、用户管理模块
1. 数据库设计
-- 用户表
CREATE TABLE `sys_user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(100) NOT NULL COMMENT '密码',
`real_name` varchar(50) COMMENT '真实姓名',
`phone` varchar(20) COMMENT '手机号',
`email` varchar(100) COMMENT '邮箱',
`status` tinyint DEFAULT 1 COMMENT '状态:0-禁用 1-正常',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 角色表
CREATE TABLE `sys_role` (
`id` bigint NOT NULL AUTO_INCREMENT,
`role_name` varchar(50) NOT NULL COMMENT '角色名称',
`role_code` varchar(50) NOT NULL COMMENT '角色编码',
`description` varchar(200) COMMENT '描述',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 用户角色关联表
CREATE TABLE `sys_user_role` (
`user_id` bigint NOT NULL,
`role_id` bigint NOT NULL,
PRIMARY KEY (`user_id`,`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2. 核心实体类
@Data
@TableName("sys_user")
public class SysUser {
@TableId(type = IdType.AUTO)
private Long id;
private String username;
private String password;
private String realName;
private String phone;
private String email;
private Integer status;
private LocalDateTime createTime;
private LocalDateTime updateTime;
@TableField(exist = false)
private List<SysRole> roles;
}
@Data
@TableName("sys_role")
public class SysRole {
@TableId(type = IdType.AUTO)
private Long id;
private String roleName;
private String roleCode;
private String description;
}
3. 用户认证与权限控制
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsServiceImpl userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/api/auth/login").permitAll()
.antMatchers("/api/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.addFilter(new JwtAuthorizationFilter(authenticationManager()));
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
4. 用户服务实现
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private SysUserMapper userMapper;
@Autowired
private PasswordEncoder passwordEncoder;
public void createUser(UserDTO userDTO) {
SysUser user = new SysUser();
BeanUtils.copyProperties(userDTO, user);
// 密码加密
user.setPassword(passwordEncoder.encode(userDTO.getPassword()));
userMapper.insert(user);
// 保存用户角色关系
if (userDTO.getRoleIds() != null) {
userMapper.insertUserRoles(user.getId(), userDTO.getRoleIds());
}
}
public void updateUserStatus(Long userId, Integer status) {
SysUser user = new SysUser();
user.setId(userId);
user.setStatus(status);
userMapper.updateById(user);
}
}
二、客房管理模块
1. 数据库设计
-- 房间类型表
CREATE TABLE `room_type` (
`id` bigint NOT NULL AUTO_INCREMENT,
`type_name` varchar(50) NOT NULL COMMENT '类型名称',
`price` decimal(10,2) NOT NULL COMMENT '价格',
`capacity` int NOT NULL COMMENT '容纳人数',
`description` varchar(500) COMMENT '描述',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 房间表
CREATE TABLE `room` (
`id` bigint NOT NULL AUTO_INCREMENT,
`room_number` varchar(20) NOT NULL COMMENT '房间号',
`type_id` bigint NOT NULL COMMENT '房间类型ID',
`floor` int NOT NULL COMMENT '楼层',
`status` tinyint NOT NULL COMMENT '状态:0-空闲 1-已预订 2-已入住 3-维护中',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_room_number` (`room_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 房间维护记录表
CREATE TABLE `room_maintenance` (
`id` bigint NOT NULL AUTO_INCREMENT,
`room_id` bigint NOT NULL COMMENT '房间ID',
`maintenance_type` varchar(50) NOT NULL COMMENT '维护类型',
`description` varchar(500) COMMENT '维护描述',
`start_time` datetime NOT NULL COMMENT '开始时间',
`end_time` datetime COMMENT '结束时间',
`status` tinyint NOT NULL COMMENT '状态:0-进行中 1-已完成',
`operator` varchar(50) NOT NULL COMMENT '操作人',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2. 房间状态监控服务
@Service
public class RoomMonitorService {
@Autowired
private RoomMapper roomMapper;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
// 获取所有房间状态
public Map<String, RoomStatusVO> getAllRoomStatus() {
List<Room> rooms = roomMapper.selectList(null);
Map<String, RoomStatusVO> statusMap = new HashMap<>();
rooms.forEach(room -> {
RoomStatusVO statusVO = new RoomStatusVO();
statusVO.setRoomNumber(room.getRoomNumber());
statusVO.setStatus(room.getStatus());
statusVO.setFloor(room.getFloor());
// 从Redis获取实时状态信息
String key = "room:status:" + room.getId();
RoomStatusDetail detail = (RoomStatusDetail) redisTemplate.opsForValue().get(key);
if (detail != null) {
statusVO.setLastUpdateTime(detail.getLastUpdateTime());
statusVO.setCurrentGuest(detail.getCurrentGuest());
}
statusMap.put(room.getRoomNumber(), statusVO);
});
return statusMap;
}
}
3. 房间维护记录管理
@Service
@Transactional
public class MaintenanceServiceImpl implements MaintenanceService {
@Autowired
private RoomMaintenanceMapper maintenanceMapper;
@Autowired
private RoomMapper roomMapper;
// 创建维护记录
public void createMaintenance(MaintenanceDTO dto) {
// 检查房间状态
Room room = roomMapper.selectById(dto.getRoomId());
if (room.getStatus() == 2) {
throw new BusinessException("房间已入住,无法进行维护");
}
// 创建维护记录
RoomMaintenance maintenance = new RoomMaintenance();
BeanUtils.copyProperties(dto, maintenance);
maintenance.setStatus(0);
maintenanceMapper.insert(maintenance);
// 更新房间状态为维护中
room.setStatus(3);
roomMapper.updateById(room);
}
// 完成维护
public void completeMaintenance(Long maintenanceId) {
RoomMaintenance maintenance = maintenanceMapper.selectById(maintenanceId);
if (maintenance == null) {
throw new BusinessException("维护记录不存在");
}
maintenance.setStatus(1);
maintenance.setEndTime(LocalDateTime.now());
maintenanceMapper.updateById(maintenance);
// 更新房间状态为空闲
Room room = roomMapper.selectById(maintenance.getRoomId());
room.setStatus(0);
roomMapper.updateById(room);
}
}
4. 前端房间状态监控组件
<template>
<div class="room-monitor">
<el-card v-for="floor in floors" :key="floor">
<template #header>
<div class="floor-title">{{ floor }}层</div>
</template>
<div class="room-grid">
<el-tooltip
v-for="room in getRoomsByFloor(floor)"
:key="room.roomNumber"
:content="getRoomTooltip(room)"
placement="top"
>
<div
class="room-item"
:class="getRoomStatusClass(room.status)"
@click="handleRoomClick(room)"
>
{{ room.roomNumber }}
</div>
</el-tooltip>
</div>
</el-card>
<!-- 房间详情对话框 -->
<el-dialog
v-model="dialogVisible"
title="房间详情"
width="500px"
>
<room-detail
v-if="selectedRoom"
:room="selectedRoom"
@update="handleRoomUpdate"
/>
</el-dialog>
</div>
</template>
<script>
import { ref, computed, onMounted } from 'vue'
import { useStore } from 'vuex'
export default {
setup() {
const store = useStore()
const rooms = ref([])
const selectedRoom = ref(null)
const dialogVisible = ref(false)
// 获取所有楼层
const floors = computed(() => {
const floorSet = new Set(rooms.value.map(room => room.floor))
return Array.from(floorSet).sort()
})
// 按楼层获取房间
const getRoomsByFloor = (floor) => {
return rooms.value.filter(room => room.floor === floor)
}
// 获取房间状态样式
const getRoomStatusClass = (status) => {
const statusMap = {
0: 'status-vacant',
1: 'status-reserved',
2: 'status-occupied',
3: 'status-maintenance'
}
return statusMap[status]
}
// 初始化数据
onMounted(async () => {
const response = await store.dispatch('room/fetchRoomStatus')
rooms.value = response.data
})
return {
rooms,
floors,
selectedRoom,
dialogVisible,
getRoomsByFloor,
getRoomStatusClass
}
}
}
</script>
<style scoped>
.room-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
gap: 10px;
}
.room-item {
padding: 10px;
text-align: center;
border-radius: 4px;
cursor: pointer;
}
.status-vacant {
background-color: #67C23A;
color: white;
}
.status-reserved {
background-color: #E6A23C;
color: white;
}
.status-occupied {
background-color: #F56C6C;
color: white;
}
.status-maintenance {
background-color: #909399;
color: white;
}
</style>
三、系统优化建议
-
用户管理优化:
- 实现用户操作日志记录
- 添加用户行为分析
- 引入RBAC权限模型
- 支持多因素认证
-
客房管理优化:
- 添加房态图可视化展示
- 实现房间实时状态推送
- 引入房间清洁管理
- 支持批量房间操作
-
性能优化:
- 使用Redis缓存热点数据
- 添加数据库索引
- 实现分页查询
- 优化SQL语句
-
安全性优化:
- 加强密码策略
- 实现操作审计
- 防止SQL注入
- XSS防护
Java酒店管理系统 - 预订与入住管理模块详解
三、预订管理模块
1. 数据库设计
-- 预订表
CREATE TABLE `booking` (
`id` bigint NOT NULL AUTO_INCREMENT,
`room_id` bigint NOT NULL COMMENT '房间ID',
`guest_id` bigint NOT NULL COMMENT '客人ID',
`check_in_date` date NOT NULL COMMENT '入住日期',
`check_out_date` date NOT NULL COMMENT '退房日期',
`status` tinyint NOT NULL COMMENT '状态:0-待确认 1-已确认 2-已取消 3-已完成',
`total_amount` decimal(10,2) NOT NULL COMMENT '总金额',
`remark` varchar(500) COMMENT '备注',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 客人信息表
CREATE TABLE `guest` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT '姓名',
`id_card` varchar(20) NOT NULL COMMENT '身份证号',
`phone` varchar(20) NOT NULL COMMENT '手机号',
`email` varchar(100) COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2. 核心实体类
@Data
@TableName("booking")
public class Booking {
@TableId(type = IdType.AUTO)
private Long id;
private Long roomId;
private Long guestId;
private LocalDate checkInDate;
private LocalDate checkOutDate;
private Integer status; // 使用BookingStatus枚举
private BigDecimal totalAmount;
private String remark;
private LocalDateTime createTime;
@TableField(exist = false)
private Room room;
@TableField(exist = false)
private Guest guest;
}
public enum BookingStatus {
PENDING_CONFIRMATION(0),
CONFIRMED(1),
CANCELLED(2),
COMPLETED(3);
private final int code;
// 构造函数和getter
}
3. 预订服务实现
@Service
@Transactional
public class BookingServiceImpl implements BookingService {
@Autowired
private BookingMapper bookingMapper;
@Autowired
private RoomService roomService;
@Autowired
private GuestService guestService;
// 创建预订
public BookingVO createBooking(BookingCreateDTO dto) {
// 验证房间可用性
Room room = roomService.validateRoomAvailable(
dto.getRoomId(),
dto.getCheckInDate(),
dto.getCheckOutDate()
);
// 创建/更新客人信息
Guest guest = guestService.createOrUpdateGuest(dto.getGuestInfo());
// 计算预订金额
BigDecimal totalAmount = calculateTotalAmount(
room.getPrice(),
dto.getCheckInDate(),
dto.getCheckOutDate()
);
// 保存预订记录
Booking booking = new Booking();
BeanUtils.copyProperties(dto, booking);
booking.setGuestId(guest.getId());
booking.setTotalAmount(totalAmount);
booking.setStatus(BookingStatus.PENDING_CONFIRMATION.getCode());
bookingMapper.insert(booking);
// 更新房间状态
roomService.updateRoomStatus(room.getId(), RoomStatus.RESERVED);
return convertToVO(booking);
}
// 取消预订
public void cancelBooking(Long bookingId) {
Booking booking = bookingMapper.selectById(bookingId);
if (booking.getStatus() != BookingStatus.CONFIRMED.getCode()) {
throw new BusinessException("只有已确认的预订可以取消");
}
// 更新预订状态
booking.setStatus(BookingStatus.CANCELLED.getCode());
bookingMapper.updateById(booking);
// 释放房间
roomService.updateRoomStatus(booking.getRoomId(), RoomStatus.VACANT);
}
}
4. 前端预订组件
<template>
<div class="booking-container">
<el-steps :active="currentStep" finish-status="success">
<el-step title="选择房型"></el-step>
<el-step title="填写信息"></el-step>
<el-step title="确认订单"></el-step>
</el-steps>
<!-- 步骤1:房型选择 -->
<div v-show="currentStep === 0">
<room-type-selector
:check-in-date="form.checkInDate"
:check-out-date="form.checkOutDate"
@select="handleRoomSelect"
/>
</div>
<!-- 步骤2:客人信息 -->
<div v-show="currentStep === 1">
<guest-info-form
v-model="form.guestInfo"
@validate="handleGuestValidate"
/>
</div>
<!-- 步骤3:订单确认 -->
<div v-show="currentStep === 2">
<booking-summary
:booking-info="form"
@confirm="handleConfirm"
/>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { useRouter } from 'vue-router'
const currentStep = ref(0)
const form = ref({
checkInDate: '',
checkOutDate: '',
roomId: null,
guestInfo: {},
totalAmount: 0
})
const handleRoomSelect = (room) => {
form.value.roomId = room.id
currentStep.value++
}
const handleConfirm = async () => {
try {
await api.booking.create(form.value)
router.push('/booking/success')
} catch (error) {
ElMessage.error('预订失败: ' + error.message)
}
}
</script>
四、入住管理模块
1. 数据库设计
-- 入住记录表
CREATE TABLE `check_in` (
`id` bigint NOT NULL AUTO_INCREMENT,
`booking_id` bigint COMMENT '关联预订ID',
`room_id` bigint NOT NULL,
`guest_id` bigint NOT NULL,
`check_in_time` datetime NOT NULL,
`expected_check_out` date NOT NULL,
`actual_check_out` datetime COMMENT '实际退房时间',
`deposit` decimal(10,2) COMMENT '押金',
`status` tinyint NOT NULL COMMENT '0-已入住 1-已退房',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 消费明细表
CREATE TABLE `consumption` (
`id` bigint NOT NULL AUTO_INCREMENT,
`check_in_id` bigint NOT NULL,
`item_name` varchar(100) NOT NULL COMMENT '消费项目',
`amount` decimal(10,2) NOT NULL,
`quantity` int NOT NULL DEFAULT 1,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2. 入住服务实现
@Service
@Transactional
public class CheckInServiceImpl implements CheckInService {
@Autowired
private CheckInMapper checkInMapper;
@Autowired
private RoomService roomService;
@Autowired
private BookingService bookingService;
// 办理入住
public CheckInVO processCheckIn(CheckInDTO dto) {
// 验证预订信息
Booking booking = bookingService.validateBooking(
dto.getBookingId(),
BookingStatus.CONFIRMED
);
// 分配房间
Room room = roomService.assignRoom(booking.getRoomId());
// 创建入住记录
CheckIn checkIn = new CheckIn();
checkIn.setBookingId(dto.getBookingId());
checkIn.setRoomId(room.getId());
checkIn.setGuestId(booking.getGuestId());
checkIn.setCheckInTime(LocalDateTime.now());
checkIn.setExpectedCheckOut(booking.getCheckOutDate());
checkIn.setDeposit(dto.getDeposit());
checkIn.setStatus(CheckInStatus.CHECKED_IN.getCode());
checkInMapper.insert(checkIn);
// 更新房间状态
roomService.updateRoomStatus(room.getId(), RoomStatus.OCCUPIED);
return convertToVO(checkIn);
}
// 退房结算
public CheckOutVO processCheckOut(Long checkInId) {
CheckIn checkIn = checkInMapper.selectById(checkInId);
if (checkIn.getStatus() != CheckInStatus.CHECKED_IN.getCode()) {
throw new BusinessException("该房间未处于入住状态");
}
// 计算总费用
BigDecimal roomCharge = calculateRoomCharge(checkIn);
BigDecimal consumptionTotal = calculateConsumptionTotal(checkInId);
BigDecimal totalAmount = roomCharge.add(consumptionTotal);
// 更新入住记录
checkIn.setActualCheckOut(LocalDateTime.now());
checkIn.setStatus(CheckInStatus.CHECKED_OUT.getCode());
checkInMapper.updateById(checkIn);
// 生成结算单
CheckOutVO vo = new CheckOutVO();
vo.setRoomCharge(roomCharge);
vo.setConsumptionTotal(consumptionTotal);
vo.setDepositDeduct(checkIn.getDeposit());
vo.setTotalAmount(totalAmount);
vo.setBalance(totalAmount.subtract(checkIn.getDeposit()));
// 更新房间状态
roomService.updateRoomStatus(checkIn.getRoomId(), RoomStatus.VACANT);
return vo;
}
}
3. 前端入住管理组件
<template>
<div class="check-in-management">
<!-- 入住登记 -->
<el-card class="check-in-form">
<el-form :model="checkInForm" label-width="120px">
<el-form-item label="预订编号">
<el-input
v-model="checkInForm.bookingId"
placeholder="输入预订编号或扫描二维码"
>
<template #append>
<el-button icon="el-icon-search" @click="searchBooking"/>
</template>
</el-input>
</el-form-item>
<el-form-item label="分配房间">
<room-selector
v-model="checkInForm.roomId"
:status-filter="[0,1]"
/>
</el-form-item>
<el-form-item label="押金金额">
<el-input-number
v-model="checkInForm.deposit"
:min="0"
:precision="2"
/>
</el-form-item>
</el-form>
</el-card>
<!-- 退房结算 -->
<el-dialog title="退房结算" v-model="checkOutDialogVisible">
<div v-if="currentCheckIn">
<el-descriptions :column="1" border>
<el-descriptions-item label="房号">{{ currentCheckIn.roomNumber }}</el-descriptions-item>
<el-descriptions-item label="入住日期">{{ currentCheckIn.checkInTime }}</el-descriptions-item>
<el-descriptions-item label="退房日期">{{ currentCheckIn.actualCheckOut }}</el-descriptions-item>
<el-descriptions-item label="房费总计">{{ currentCheckOut.roomCharge }}</el-descriptions-item>
<el-descriptions-item label="消费合计">{{ currentCheckOut.consumptionTotal }}</el-descriptions-item>
<el-descriptions-item label="应退押金">{{ currentCheckOut.balance }}</el-descriptions-item>
</el-descriptions>
<el-button type="primary" @click="printInvoice">打印发票</el-button>
</div>
</el-dialog>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { useCheckInStore } from '@/stores/checkIn'
const checkInStore = useCheckInStore()
const checkInForm = ref({
bookingId: null,
roomId: null,
deposit: 500
})
const searchBooking = async () => {
try {
const booking = await api.booking.getById(checkInForm.value.bookingId)
checkInForm.value.roomId = booking.roomId
} catch (error) {
ElMessage.error('未找到预订信息')
}
}
</script>
五、系统优化建议
-
预订管理优化:
- 引入工作流引擎处理复杂预订流程
- 添加房价日历功能
- 实现超额预订控制
- 集成第三方支付
-
入住管理优化:
- 添加人脸识别登记
- 实现电子门锁集成
- 开发移动端房务管理
- 添加钟点房支持
-
业务扩展:
- 会议室预订管理
- 餐饮消费集成
- 会员积分系统
- 团体客户管理
-
技术增强:
- 使用WebSocket实现实时房态更新
- 添加分布式事务支持
- 实现自动分房算法
- 构建数据中台进行业务分析