酒店预订管理平台及小程序

目录

  • [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)
    • [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,上下文路径 /apiapplication.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) 手机号
email 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 管理端、门户端与微信小程序端实现多端协同,覆盖酒店管理与客户预订核心链路。后续可进一步扩展:

    • 引入更细粒度权限模型(菜单级/按钮级权限)。
    • 增加支付对接与订单对账能力。
    • 引入操作审计日志与异常告警,提高可运维性。
相关推荐
2501_915918412 小时前
除了 Perfdog,如何在 Windows 环境中完成 iOS App 的性能测试工作
android·ios·小程序·https·uni-app·iphone·webview
weixin_lynhgworld3 小时前
[特殊字符]短剧小程序开发:开启娱乐新纪元的钥匙[特殊字符]
小程序
qq_12498707534 小时前
基于Spring Boot的“味蕾探索”线上零食购物平台的设计与实现(源码+论文+部署+安装)
java·前端·数据库·spring boot·后端·小程序
m0_471199634 小时前
【小程序】订单数据缓存 以及针对海量库存数据的 懒加载+数据分片 的具体实现方式
前端·vue.js·小程序
難釋懷5 小时前
微信小程序案例 - 自定义 tabBar
微信小程序·小程序·notepad++
2501_915106326 小时前
常见 iOS 抓包工具的使用方式与组合思路
android·ios·小程序·https·uni-app·iphone·webview
说私域7 小时前
基于AI智能名片链动2+1模式S2B2C商城小程序的企业运营能力提升策略研究
大数据·人工智能·小程序·开源·流量运营
宁夏雨科网7 小时前
家电公司想开发小程序有没有现成的
小程序·家电·商城小程序·家电小程序·家电商城
计算机毕设指导67 小时前
基于微信小程序的咖啡店点餐系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·intellij-idea