目录
- [Java 核心与应用:酒店预订管理平台及小程序](#Java 核心与应用:酒店预订管理平台及小程序)
- 酒店预订管理平台及小程序
-
- [1 绪论](#1 绪论)
-
- [1.1 项目背景与研究意义](#1.1 项目背景与研究意义)
- [1.2 国内外研究现状概述](#1.2 国内外研究现状概述)
- [1.3 研究内容与本文结构](#1.3 研究内容与本文结构)
- [2 需求分析](#2 需求分析)
-
- [2.1 角色与业务范围](#2.1 角色与业务范围)
- [2.2 功能性需求](#2.2 功能性需求)
-
- [2.2.1 认证与用户体系](#2.2.1 认证与用户体系)
- [2.2.2 房型与客房管理](#2.2.2 房型与客房管理)
- [2.2.3 预订管理](#2.2.3 预订管理)
- [2.2.4 入住与退房](#2.2.4 入住与退房)
- [2.2.5 维修管理](#2.2.5 维修管理)
- [2.2.6 客户服务(反馈/评价/服务请求)](#2.2.6 客户服务(反馈/评价/服务请求))
- [2.2.7 文件上传](#2.2.7 文件上传)
- [2.3 非功能性需求](#2.3 非功能性需求)
- [2.4 可行性分析](#2.4 可行性分析)
- [3 系统总体设计](#3 系统总体设计)
-
- [3.1 技术架构与选型](#3.1 技术架构与选型)
-
- [3.1.1 后端](#3.1.1 后端)
- [3.1.2 管理端与门户端](#3.1.2 管理端与门户端)
- [3.1.3 微信小程序端](#3.1.3 微信小程序端)
- [3.2 系统总体架构](#3.2 系统总体架构)
- [3.3 安全设计(认证与授权)](#3.3 安全设计(认证与授权))
- [3.4 部署与运行环境](#3.4 部署与运行环境)
- [4 系统详细设计](#4 系统详细设计)
-
- [4.1 功能模块划分](#4.1 功能模块划分)
- [4.2 核心业务流程设计](#4.2 核心业务流程设计)
-
- [4.2.1 登录认证流程](#4.2.1 登录认证流程)
- [4.2.2 预订---入住---退房链路](#4.2.2 预订—入住—退房链路)
- [4.2.3 客房维修流程](#4.2.3 客房维修流程)
- [4.3 数据库设计](#4.3 数据库设计)
-
- [4.3.1 概念结构(ER 关系概述)](#4.3.1 概念结构(ER 关系概述))
- [4.3.2 逻辑结构(表结构说明)](#4.3.2 逻辑结构(表结构说明))
-
- [(1)用户表 `sys_user`](#(1)用户表
sys_user) - [(2)客房类型表 `room_type`](#(2)客房类型表
room_type) - [(3)客房表 `room`](#(3)客房表
room) - [(4)预订表 `reservation`](#(4)预订表
reservation) - [(5)入住记录表 `check_in`](#(5)入住记录表
check_in) - [(6)维修记录表 `maintenance_record`](#(6)维修记录表
maintenance_record) - [(7)反馈表 `feedback`](#(7)反馈表
feedback) - [(8)服务请求表 `service_request`](#(8)服务请求表
service_request) - [(9)评价表 `review`](#(9)评价表
review)
- [(1)用户表 `sys_user`](#(1)用户表
- [5 系统实现](#5 系统实现)
-
- [5.1 认证与拦截器](#5.1 认证与拦截器)
- [5.2 公开接口放行与上传文件映射](#5.2 公开接口放行与上传文件映射)
- [5.3 客房管理与批量导入](#5.3 客房管理与批量导入)
- [5.4 预订与"我的预订"](#5.4 预订与“我的预订”)
- [5.5 入住、预订转入住与退房结算接口](#5.5 入住、预订转入住与退房结算接口)
- [5.6 客户服务:反馈/评价/服务请求](#5.6 客户服务:反馈/评价/服务请求)
- [5.7 统计报表(工作台概览)](#5.7 统计报表(工作台概览))
- [5.8 前端/门户端路由鉴权](#5.8 前端/门户端路由鉴权)
- [5.9 小程序请求封装与登录过期处理](#5.9 小程序请求封装与登录过期处理)
- [6 系统测试与总结](#6 系统测试与总结)
-
- [6.1 测试环境](#6.1 测试环境)
- [6.2 功能测试要点](#6.2 功能测试要点)
- [6.3 总结与展望](#6.3 总结与展望)
Java 核心与应用:酒店预订管理平台及小程序
系统演示视频 :点击查看B站视频
源码获取地址:https://codesharesite.xyz/project/32
酒店预订管理平台及小程序
1 绪论
1.1 项目背景与研究意义
酒店经营场景中存在"房型配置、客房状态、预订管理、入住办理、退房结算、维修维护、客户服务与评价、经营统计"等高频业务。传统人工登记方式在高峰期容易出现:
- 数据分散,房间状态与预订状态难以实时同步。
- 预订---入住---退房链路不可追溯,历史订单检索效率低。
- 统计报表依赖手工汇总,准确性与时效性不足。
svpm 项目将上述业务以信息化方式落地,包含:
- 管理端(
hotel-vue):面向管理员/前台操作员的业务后台。 - 门户端(
hotel-portal):面向客户的网页端在线预订平台。 - 微信小程序端(
hotel-miniprogram):面向客户的移动端预订与个人中心。 - 后端服务(
hotel-springboot):统一提供 REST API、认证与数据存储。
1.2 国内外研究现状概述
酒店管理信息化系统通常以"业务流程标准化 + 数据集中化 + 权限与审计"为核心。常见实现路线包括:
- B/S 架构(浏览器/服务器)与移动端结合,统一后端提供 API。
- 使用 JWT 等无状态认证,支撑多端一致登录态。
- 通过 ORM/持久层框架提升开发效率,并在数据层设计状态字段实现业务联动。
1.3 研究内容与本文结构
本文以 svpm 酒店管理系统为对象,围绕需求、设计、数据库与实现进行说明。
- 第2章:需求分析与可行性分析
- 第3章:系统总体设计(架构、技术选型、部署与安全)
- 第4章:系统详细设计(模块与数据库设计)
- 第5章:系统实现(关键业务流程与核心代码片段)
- 第6章:系统测试与总结
2 需求分析
2.1 角色与业务范围
系统主要涉及三类使用者:
- 管理员(ADMIN):房型管理、用户管理、统计报表等。
- 前台操作员(OPERATOR):预订登记、入住办理、退房结算、维修记录等。
- 客户(门户端/小程序):浏览房型、查询可用房间、在线预订、查看我的订单、评价与反馈、服务请求等。
2.2 功能性需求
2.2.1 认证与用户体系
- 登录、注册、忘记密码(后端
/auth/*)。 - 用户信息查询与管理(后端
/user/*)。 - 不同角色在管理端页面具备不同权限(前端路由
meta.roles控制)。
2.2.2 房型与客房管理
- 房型维护:房型分页、列表、详情、新增、修改、删除(
/room-type/*)。 - 客房维护:客房分页、详情、新增、修改、删除、状态更新(
/room/*)。 - 批量导入:管理端上传 Excel 批量导入客房(
/room/import)。 - 可用房间查询:对外公开接口
/room/available,支持未登录访问用于客户浏览。
2.2.3 预订管理
- 管理端预订分页:
/reservation/page。 - 客户端"我的预订":
/reservation/my(从 JWT 注入的userId过滤)。 - 新增预订:
POST /reservation。 - 取消预订:
PUT /reservation/{id}/cancel。
2.2.4 入住与退房
- 直接入住:
POST /check-in。 - 预订转入住:
POST /check-in/from-reservation。 - 退房结算:
POST /check-in/{id}/check-out。 - 导出与统计:
/check-in/export、/check-in/statistics/*。
2.2.5 维修管理
- 维修记录分页:
/maintenance/page。 - 提交维修申请:
POST /maintenance。 - 完成维修:
PUT /maintenance/{id}/complete。
2.2.6 客户服务(反馈/评价/服务请求)
- 意见反馈:提交、我的反馈、管理端分页、回复与关闭(
/feedback/*)。 - 评价管理:提交、我的评价、公开评价(最新/按房型)、管理端分页与回复(
/review/*)。 - 酒店服务:公开服务列表
/service/list;提交/取消服务请求;管理端处理与完成(/service/request/*)。
2.2.7 文件上传
- 上传图片:
POST /upload/image,校验后缀并按月份分目录保存,返回可访问 URL。
2.3 非功能性需求
- 性能:支持多端并发访问,分页查询降低一次性数据量。
- 安全:JWT 无状态认证,拦截器对受保护接口统一校验;公开接口通过放行白名单访问。
- 可维护性:分层设计(Controller/Service/DAO),统一返回结构(
Result)。
2.4 可行性分析
- 技术可行:后端采用 Spring Boot + MyBatis-Plus;前端/门户采用 Vue3 + Router + Pinia;小程序采用原生框架;技术栈成熟。
- 经济可行:开源框架与常见组件,部署成本较低。
- 运行可行:MySQL 数据库存储核心业务;静态资源与上传文件统一映射访问。
3 系统总体设计
3.1 技术架构与选型
3.1.1 后端
- Spring Boot:父工程版本以
pom.xml为准(spring-boot-starter-parent 2.5.15)。 - MyBatis-Plus:
3.5.3.1。 - MySQL:驱动版本
8.0.33。 - Druid:连接池
1.2.20。 - JWT:
jjwt 0.9.1。 - EasyExcel:
3.3.2。 - Hutool:
5.8.22。
3.1.2 管理端与门户端
- Vue 3、Element Plus、Vue Router 4、Pinia、Axios、Sass。
- Vite 构建工具。
3.1.3 微信小程序端
- 微信小程序原生框架。
utils/request.js封装请求,自动携带Authorization: Bearer <token>。
3.2 系统总体架构
浏览器
浏览器
微信客户端
Axios/HTTP
Axios/HTTP
wx.request
用户/管理员
管理端 hotel-vue
门户端 hotel-portal
小程序 hotel-miniprogram
后端 hotel-springboot
MySQL hotel_db
本地文件系统 uploads/
图3.1 系统总体架构图
3.3 安全设计(认证与授权)
- 后端:
AuthInterceptor统一校验 JWT;校验失败返回 HTTP 401 与 JSON 错误。 - 白名单放行:
WebConfig#excludePathPatterns放行登录注册、静态资源、房型/可用房间浏览、服务列表等公开接口。 - 管理端:路由守卫检查
localStorage.token;对meta.roles配置的页面进行角色判断。 - 门户端:路由守卫检查
localStorage.portal_token;对meta.requiresAuth的页面强制登录。
3.4 部署与运行环境
- 后端:默认端口
8080,上下文路径/api(application.yml)。 - 数据库:默认连接
jdbc:mysql://localhost:3306/hotel_db,用户名root,密码123456(可按环境调整)。 - 管理端:Vite 开发端口通常为
5173(以运行命令实际输出为准)。 - 门户端:Vite 开发端口通常为
5174(以运行命令实际输出为准)。
4 系统详细设计
4.1 功能模块划分
酒店管理系统 svpm
后端服务 hotel-springboot
管理端 hotel-vue
门户端 hotel-portal
微信小程序 hotel-miniprogram
认证与用户
房型与客房
预订
入住/退房
维修
反馈/评价/服务
统计报表
文件上传
工作台
前台业务: 预订/入住/订单
客房管理: 房型/客房/维修
客户服务: 评价/反馈/服务请求
系统管理: 统计/用户
房型浏览/可用房间
在线预订
我的预订/订单
评价/反馈/个人中心
房型浏览/可用房间
在线预订
我的预订/订单
个人中心
图4.1 功能模块划分图
4.2 核心业务流程设计
4.2.1 登录认证流程
失败
成功
开始
客户端提交用户名密码
后端 /auth/login
校验用户信息
返回错误信息
生成JWT Token
客户端保存 token
后续请求携带 Authorization: Bearer token
AuthInterceptor 校验并注入 userId/role
受保护接口正常访问
图4.2 登录认证流程图
4.2.2 预订---入住---退房链路
直接入住
预订入住
开始
客户选择房型与日期
查询可用房间 /room/available
提交预订 /reservation
生成预订记录 status=待入住
到店办理入住
POST /check-in
POST /check-in/from-reservation
生成入住记录 status=入住中
退房结算 /check-in/{id}/check-out
计算费用/押金/额外消费
更新客房状态=清洁中
结束
图4.3 预订---入住---退房业务流程图
4.2.3 客房维修流程
开始
前台提交维修申请 /maintenance
生成维修记录 status=维修中
客房状态切换为维修中
维修完成 /maintenance/{id}/complete
维修记录 status=已完成
客房状态恢复可用/清洁中
结束
图4.4 客房维修业务流程图
4.3 数据库设计
4.3.1 概念结构(ER 关系概述)
creates
has
contains
booked_for
used_by
has
submits
requests
writes
relates
SYS_USER
BIGINT
id
VARCHAR
username
VARCHAR
role
RESERVATION
BIGINT
id
VARCHAR
reservation_no
BIGINT
room_type_id
BIGINT
user_id
TINYINT
status
CHECK_IN
BIGINT
id
VARCHAR
order_no
BIGINT
room_id
BIGINT
user_id
TINYINT
status
ROOM_TYPE
BIGINT
id
VARCHAR
type_name
DECIMAL
base_price
ROOM
BIGINT
id
VARCHAR
room_number
BIGINT
room_type_id
TINYINT
status
MAINTENANCE_RECORD
BIGINT
id
BIGINT
room_id
TINYINT
status
FEEDBACK
BIGINT
id
BIGINT
user_id
TINYINT
status
SERVICE_REQUEST
BIGINT
id
BIGINT
user_id
TINYINT
status
REVIEW
BIGINT
id
BIGINT
user_id
BIGINT
check_in_id
TINYINT
rating
图4.5 数据库 ER 关系示意图
4.3.2 逻辑结构(表结构说明)
以下表结构来自 src/main/resources/db/schema.sql。
(1)用户表 sys_user
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | BIGINT | 主键ID |
| username | VARCHAR(50) | 用户名(唯一) |
| password | VARCHAR(100) | 密码 |
| real_name | VARCHAR(50) | 真实姓名 |
| phone | VARCHAR(20) | 手机号 |
| VARCHAR(100) | 邮箱 | |
| role | VARCHAR(20) | 角色:ADMIN/OPERATOR |
| status | TINYINT | 状态:0禁用/1启用 |
| deleted | TINYINT | 删除标记:0未删/1已删 |
| create_time | DATETIME | 创建时间 |
| update_time | DATETIME | 更新时间 |
(2)客房类型表 room_type
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | BIGINT | 主键ID |
| type_name | VARCHAR(50) | 房型名称 |
| base_price | DECIMAL(10,2) | 基础价格 |
| bed_count | INT | 床位数量 |
| max_guests | INT | 最大入住人数 |
| facilities | TEXT | 配套设施 |
| description | TEXT | 描述 |
| image_url | VARCHAR(500) | 图片地址 |
| deleted | TINYINT | 删除标记 |
| create_time | DATETIME | 创建时间 |
| update_time | DATETIME | 更新时间 |
(3)客房表 room
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | BIGINT | 主键ID |
| room_number | VARCHAR(20) | 房间号(唯一) |
| floor | INT | 楼层 |
| room_type_id | BIGINT | 房型ID |
| status | TINYINT | 状态:0空闲/1已预订/2已入住/3清洁中/4维修中 |
| remark | VARCHAR(500) | 备注 |
| deleted | TINYINT | 删除标记 |
| create_time | DATETIME | 创建时间 |
| update_time | DATETIME | 更新时间 |
(4)预订表 reservation
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | BIGINT | 主键ID |
| reservation_no | VARCHAR(50) | 预订编号(唯一) |
| guest_name | VARCHAR(50) | 客人姓名 |
| id_card | VARCHAR(20) | 身份证号 |
| phone | VARCHAR(20) | 手机号 |
| room_type_id | BIGINT | 房型ID |
| room_id | BIGINT | 房间ID(可为空) |
| check_in_date | DATE | 入住日期 |
| check_out_date | DATE | 退房日期 |
| status | TINYINT | 状态:0待入住/1已入住/2已取消/3已完成 |
| cancel_reason | VARCHAR(500) | 取消原因 |
| total_price | DECIMAL(10,2) | 总价 |
| remark | VARCHAR(500) | 备注 |
| operator_id | BIGINT | 操作员ID |
| user_id | BIGINT | 客户用户ID |
| deleted | TINYINT | 删除标记 |
| create_time | DATETIME | 创建时间 |
| update_time | DATETIME | 更新时间 |
(5)入住记录表 check_in
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | BIGINT | 主键ID |
| order_no | VARCHAR(50) | 订单编号(唯一) |
| reservation_id | BIGINT | 预订ID |
| guest_name | VARCHAR(50) | 客人姓名 |
| id_card | VARCHAR(20) | 身份证号 |
| phone | VARCHAR(20) | 手机号 |
| room_id | BIGINT | 房间ID |
| check_in_date | DATE | 入住日期 |
| expected_check_out_date | DATE | 预计退房日期 |
| actual_check_out_time | DATETIME | 实际退房时间 |
| deposit | DECIMAL(10,2) | 押金 |
| room_price | DECIMAL(10,2) | 房价 |
| extra_charge | DECIMAL(10,2) | 额外消费 |
| total_amount | DECIMAL(10,2) | 总金额 |
| status | TINYINT | 状态:0入住中/1已退房/2已结算 |
| remark | VARCHAR(500) | 备注 |
| operator_id | BIGINT | 操作员ID |
| user_id | BIGINT | 客户用户ID |
| deleted | TINYINT | 删除标记 |
| create_time | DATETIME | 创建时间 |
| update_time | DATETIME | 更新时间 |
(6)维修记录表 maintenance_record
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | BIGINT | 主键ID |
| room_id | BIGINT | 房间ID |
| description | TEXT | 维修描述 |
| status | TINYINT | 状态:0维修中/1已完成 |
| completed_time | DATETIME | 完成时间 |
| operator_id | BIGINT | 操作员ID |
| deleted | TINYINT | 删除标记 |
| create_time | DATETIME | 创建时间 |
| update_time | DATETIME | 更新时间 |
(7)反馈表 feedback
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | BIGINT | 主键ID |
| user_id | BIGINT | 用户ID |
| type | TINYINT | 类型:0建议/1投诉/2咨询/3其他 |
| content | TEXT | 反馈内容 |
| contact | VARCHAR(100) | 联系方式 |
| status | TINYINT | 状态:0待处理/1已回复/2已关闭 |
| reply | TEXT | 回复内容 |
| reply_time | DATETIME | 回复时间 |
| reply_user_id | BIGINT | 回复人ID |
| deleted | TINYINT | 删除标记 |
| create_time | DATETIME | 创建时间 |
| update_time | DATETIME | 更新时间 |
(8)服务请求表 service_request
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | BIGINT | 主键ID |
| user_id | BIGINT | 用户ID |
| service_id | INT | 服务ID |
| service_name | VARCHAR(100) | 服务名称 |
| room_number | VARCHAR(20) | 房间号 |
| remark | VARCHAR(500) | 备注 |
| status | TINYINT | 状态:0待处理/1处理中/2已完成/3已取消 |
| handler_id | BIGINT | 处理人ID |
| handle_time | DATETIME | 处理时间 |
| complete_time | DATETIME | 完成时间 |
| deleted | TINYINT | 删除标记 |
| create_time | DATETIME | 创建时间 |
| update_time | DATETIME | 更新时间 |
(9)评价表 review
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | BIGINT | 主键ID |
| user_id | BIGINT | 用户ID |
| check_in_id | BIGINT | 入住记录ID |
| room_type_id | BIGINT | 房型ID |
| rating | TINYINT | 评分 1-5 |
| content | TEXT | 评价内容 |
| images | VARCHAR(1000) | 评价图片(逗号分隔) |
| reply | TEXT | 商家回复 |
| reply_time | DATETIME | 回复时间 |
| status | TINYINT | 状态:0待审核/1已通过/2已拒绝 |
| is_anonymous | TINYINT | 是否匿名 |
| deleted | TINYINT | 删除标记 |
| create_time | DATETIME | 创建时间 |
| update_time | DATETIME | 更新时间 |
5 系统实现
本章选取系统中具有代表性的关键实现点,展示实现思路与核心代码片段(每段控制在 10-30 行左右)。
5.1 认证与拦截器
后端采用 JWT 无状态认证。AuthInterceptor 对除白名单外的所有请求进行校验;校验通过后将 userId/username/role 注入请求属性,便于业务接口获取当前用户上下文。

java
// AuthInterceptor 关键逻辑(Token提取 + 校验 + 注入用户上下文)
String token = request.getHeader(Constants.TOKEN_HEADER);
if (StringUtils.hasText(token) && token.startsWith(Constants.TOKEN_PREFIX)) {
token = token.substring(Constants.TOKEN_PREFIX.length());
}
if (!StringUtils.hasText(token) || !jwtUtils.validateToken(token)) {
response.setContentType("application/json;charset=UTF-8");
response.setStatus(401);
response.getWriter().write(objectMapper.writeValueAsString(
Result.error(401, "未登录或登录已过期")
));
return false;
}
request.setAttribute("userId", jwtUtils.getUserId(token));
request.setAttribute("username", jwtUtils.getUsername(token));
request.setAttribute("role", jwtUtils.getRole(token));
return true;
5.2 公开接口放行与上传文件映射
系统通过 WebConfig 统一配置跨域、上传目录静态映射,以及拦截器白名单放行规则。开放 /room/available、/room-type/* 等接口用于客户未登录浏览。
java
// WebConfig 关键逻辑(拦截器白名单放行:登录注册 + 公开浏览接口)
registry.addInterceptor(authInterceptor)
.addPathPatterns("/**")
.excludePathPatterns(
"/auth/login",
"/auth/register",
"/auth/forgot-password",
"/error",
"/uploads/**",
"/room-type/list",
"/room-type/page",
"/room-type/*",
"/room/available",
"/service/list"
);
5.3 客房管理与批量导入
客房管理提供分页查询、可用客房列表、详情与状态维护,并支持 Excel 批量导入,降低初始化录入成本。

java
// RoomController 关键逻辑(可用客房 + Excel导入)
@GetMapping("/available")
public Result<List<RoomVO>> listAvailable(@RequestParam(required = false) Long roomTypeId) {
return Result.success(roomService.listAvailable(roomTypeId));
}
@PostMapping("/import")
public Result<Void> batchImport(@RequestParam("file") MultipartFile file) {
try {
List<RoomImportDTO> list = EasyExcel.read(file.getInputStream())
.head(RoomImportDTO.class)
.sheet()
.doReadSync();
roomService.batchImport(list);
return Result.success();
} catch (Exception e) {
return Result.error("导入失败: " + e.getMessage());
}
}
5.4 预订与"我的预订"
预订模块在接口层区分管理端分页与客户侧"我的预订"。客户侧依赖拦截器注入的 userId,确保只返回当前登录用户的数据。

java
// ReservationController 关键逻辑(我的预订 + 新增预订)
@GetMapping("/my")
public Result<PageResult<ReservationVO>> myReservations(
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer size,
@RequestParam(required = false) Integer status,
HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId");
return Result.success(reservationService.myReservations(page, size, status, userId));
}
@PostMapping
public Result<Void> add(@Valid @RequestBody ReservationDTO dto, HttpServletRequest request) {
Long operatorId = (Long) request.getAttribute("userId");
reservationService.addReservation(dto, operatorId);
return Result.success();
}
5.5 入住、预订转入住与退房结算接口
入住模块提供三类核心能力:直接入住、预订转入住、退房结算。退房结算返回最新订单信息,便于前端展示结算结果。

java
// CheckInController 关键逻辑(预订入住 + 退房结算)
@PostMapping("/from-reservation")
public Result<Void> checkInFromReservation(@RequestParam Long reservationId,
@RequestParam Long roomId,
HttpServletRequest request) {
Long operatorId = (Long) request.getAttribute("userId");
checkInService.checkInFromReservation(reservationId, roomId, operatorId);
return Result.success();
}
@PostMapping("/{id}/check-out")
public Result<CheckInVO> checkOut(@PathVariable Long id, @RequestBody CheckOutDTO dto) {
return Result.success(checkInService.checkOut(id, dto));
}
5.6 客户服务:反馈/评价/服务请求
系统将客户服务拆分为三个并行能力:
-
反馈:提交、管理端回复与关闭;
-
评价:提交、按房型公开展示、管理端回复;
-
服务请求:公共服务列表 + 客户提交 + 管理端处理/完成。


java
// FeedbackController 关键逻辑(提交反馈 + 回复反馈)
@PostMapping
public Result<String> submitFeedback(@RequestBody FeedbackDTO dto, HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId");
feedbackService.submitFeedback(dto, userId);
return Result.success("反馈提交成功", null);
}
@PutMapping("/{id}/reply")
public Result<String> replyFeedback(@PathVariable Long id,
@RequestBody Map<String, String> body,
HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId");
feedbackService.replyFeedback(id, body.get("reply"), userId);
return Result.success("回复成功", null);
}
java
// ReviewController 关键逻辑(公开获取最新评价 + 管理端回复评价)
@GetMapping("/latest")
public Result<List<ReviewVO>> getLatestReviews(@RequestParam(defaultValue = "6") Integer limit) {
return Result.success(reviewService.getLatestReviews(limit));
}
@PutMapping("/{id}/reply")
public Result<Void> replyReview(@PathVariable Long id, @RequestBody Map<String, String> body) {
String reply = body.get("reply");
if (reply == null || reply.isEmpty()) {
return Result.error("回复内容不能为空");
}
reviewService.replyReview(id, reply);
return Result.success("回复成功", null);
}
java
// ServiceController 关键逻辑(公开服务列表 + 管理端处理请求)
@GetMapping("/list")
public Result<List<ServiceItemVO>> getServiceList() {
return Result.success(serviceRequestService.getServiceList());
}
@PutMapping("/request/{id}/handle")
public Result<String> handleServiceRequest(@PathVariable Long id, HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId");
serviceRequestService.handleServiceRequest(id, userId);
return Result.success("开始处理", null);
}
5.7 统计报表(工作台概览)
管理端工作台需要"今日营收/入住统计 + 客房状态统计"等综合数据,后端 StatisticsController 将不同业务服务结果聚合返回,减少前端多次请求。

java
// StatisticsController 关键逻辑(仪表盘数据聚合)
@GetMapping("/dashboard")
public Result<Map<String, Object>> getDashboardData() {
Map<String, Object> data = new HashMap<>();
LocalDate today = LocalDate.now();
StatisticsVO dailyStats = checkInService.getDailyStatistics(today);
data.put("dailyStats", dailyStats);
Map<String, Object> roomStats = roomService.getRoomStatistics();
data.put("roomStats", roomStats);
return Result.success(data);
}
5.8 前端/门户端路由鉴权
管理端使用 token + userInfo.role 组合实现"登录态校验 + 角色访问控制";门户端使用 portal_token 并对 requiresAuth 路由强制登录。

js
// hotel-vue 路由守卫关键逻辑(登录态 + 角色权限)
const token = localStorage.getItem('token')
if (to.path === '/login') {
next()
} else if (!token) {
next('/login')
} else {
const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
const roles = to.meta.roles
if (roles && !roles.includes(userInfo.role)) {
next('/dashboard')
} else {
next()
}
}
js
// hotel-portal 路由守卫关键逻辑(需要登录的页面强制跳转登录)
const token = localStorage.getItem('portal_token')
if (to.meta.requiresAuth && !token) {
next({ name: 'Login', query: { redirect: to.fullPath } })
} else {
next()
}
5.9 小程序请求封装与登录过期处理
小程序端统一通过 utils/request.js 封装请求,自动携带 Token;当返回 401 时清理登录信息并跳转登录页。

javascript
// utils/request.js 关键逻辑(携带token + 401过期处理)
const token = app.globalData.token
if (token) {
header['Authorization'] = `Bearer ${token}`
}
wx.request({
url: `${app.globalData.baseUrl}${url}`,
method,
data,
header,
success: (res) => {
if (res.statusCode === 401) {
app.clearLoginInfo()
wx.showToast({ title: '登录已过期,请重新登录', icon: 'none' })
setTimeout(() => wx.navigateTo({ url: '/pages/login/login' }), 1500)
reject(res)
}
}
})
6 系统测试与总结
6.1 测试环境
- Windows 开发环境
- JDK 8、Maven
- MySQL 8.x
- Node.js + npm(前端/门户端)
- 微信开发者工具(小程序端)
6.2 功能测试要点
- 认证:登录成功获取 token;未登录访问受保护接口返回 401;白名单接口可匿名访问。
- 预订:创建预订后状态正确;取消预订写入取消原因;"我的预订"只能看到本人数据。
- 入住:直接入住/预订转入住链路正确;退房结算金额正确返回;导出接口可生成文件。
- 客房:状态切换正确;批量导入可用;可用房间接口可按房型过滤。
- 维修:提交与完成流程正确;维修状态与客房状态联动。
- 反馈/评价/服务:客户侧提交与管理端处理闭环;公开评价接口可正常展示。
6.3 总结与展望
svpm 项目以 Spring Boot + MyBatis-Plus 构建后端统一服务,以 Vue3 管理端、门户端与微信小程序端实现多端协同,覆盖酒店管理与客户预订核心链路。后续可进一步扩展:
-
引入更细粒度权限模型(菜单级/按钮级权限)。
-
增加支付对接与订单对账能力。
-
引入操作审计日志与异常告警,提高可运维性。
fo()
wx.showToast({ title: '登录已过期,请重新登录', icon: 'none' })
setTimeout(() => wx.navigateTo({ url: '/pages/login/login' }), 1500)
reject(res)
}
}
})[外链图片转存中...(img-0CMoMhze-1768200804433)]
6 系统测试与总结
6.1 测试环境
- Windows 开发环境
- JDK 8、Maven
- MySQL 8.x
- Node.js + npm(前端/门户端)
- 微信开发者工具(小程序端)
6.2 功能测试要点
- 认证:登录成功获取 token;未登录访问受保护接口返回 401;白名单接口可匿名访问。
- 预订:创建预订后状态正确;取消预订写入取消原因;"我的预订"只能看到本人数据。
- 入住:直接入住/预订转入住链路正确;退房结算金额正确返回;导出接口可生成文件。
- 客房:状态切换正确;批量导入可用;可用房间接口可按房型过滤。
- 维修:提交与完成流程正确;维修状态与客房状态联动。
- 反馈/评价/服务:客户侧提交与管理端处理闭环;公开评价接口可正常展示。
6.3 总结与展望
svpm项目以 Spring Boot + MyBatis-Plus 构建后端统一服务,以 Vue3 管理端、门户端与微信小程序端实现多端协同,覆盖酒店管理与客户预订核心链路。后续可进一步扩展:- 引入更细粒度权限模型(菜单级/按钮级权限)。
- 增加支付对接与订单对账能力。
- 引入操作审计日志与异常告警,提高可运维性。