1. 项目背景与核心价值
去年帮学弟调试毕业设计时,发现市面上80%的民宿管理系统都存在两个致命问题:要么功能冗余导致操作复杂,要么扩展性差难以二次开发。这个基于SpringBoot的民宿客房管理系统正是针对这些痛点设计的轻量级解决方案。
不同于传统酒店管理系统,我们特别强化了三个民宿特色功能:
- 灵活的房态日历(支持钟点房/日租房混合模式)
- 微信小程序端客户自助入住
- 动态价格策略(周末/节假日自动调价)
系统采用经典的B/S架构,前端用Thymeleaf+AdminLTE模板快速搭建管理后台,后端基于SpringBoot 2.7 + MyBatis-Plus实现。实测在2核4G的云服务器上能稳定支撑200+间客房的并发预订。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术栈选型解析
2.1 为什么选择SpringBoot
相比原生SSM框架,SpringBoot带来三个关键优势:
- 内嵌Tomcat避免war包部署的版本冲突
- 自动配置省去80%的XML编写
- Actuator端点方便毕设演示时展示系统健康状态
关键依赖版本:
xml复制<spring-boot.version>2.7.12</spring-boot.version>
<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
<hutool.version>5.8.16</hutool.version>
2.2 数据库设计要点
民宿业务特有的几个表设计技巧:
- 客房表添加
characteristic字段存储JSON格式的特色标签(如"海景/温泉/宠物友好") - 订单表使用
status枚举值区分"待支付/已预约/已入住/已取消"等状态 - 价格日历表采用复合主键(room_id + date)避免重复报价
sql复制CREATE TABLE `room_price_calendar` (
`room_id` int NOT NULL,
`date` date NOT NULL,
`price` decimal(10,2) DEFAULT NULL,
`is_weekend` tinyint(1) GENERATED ALWAYS AS (DAYOFWEEK(`date`) IN (1,7)) VIRTUAL,
PRIMARY KEY (`room_id`,`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 核心功能实现细节
3.1 动态定价策略实现
通过Spring的Scheduled注解实现每天凌晨自动刷新未来30天价格:
java复制@Scheduled(cron = "0 0 0 * * ?")
public void refreshRoomPrices() {
LocalDate start = LocalDate.now();
LocalDate end = start.plusDays(30);
roomService.list().forEach(room -> {
// 基础价格算法
Map<LocalDate, BigDecimal> priceMap = new LinkedHashMap<>();
for (LocalDate date = start; date.isBefore(end); date = date.plusDays(1)) {
BigDecimal price = calculateDynamicPrice(room, date);
priceMap.put(date, price);
}
priceCalendarService.batchInsertOrUpdate(room.getId(), priceMap);
});
}
3.2 微信小程序对接
采用WxJava SDK处理微信登录和消息模板:
java复制@GetMapping("/wx/auth")
public String wxAuth(@RequestParam String code) {
WxMpService wxService = wxMpConfiguration.getWxMpService();
WxMpOAuth2AccessToken accessToken;
try {
accessToken = wxService.getOAuth2Service().getAccessToken(code);
String openId = accessToken.getOpenId();
return customerService.handleWxLogin(openId);
} catch (WxErrorException e) {
log.error("微信登录失败", e);
throw new BizException("微信授权失败");
}
}
4. 典型问题排查实录
4.1 日期重叠预订冲突
初期直接使用SQL查询可用房间会导致并发问题:
sql复制-- 错误做法(存在并发漏洞)
SELECT * FROM room
WHERE id NOT IN (
SELECT room_id FROM orders
WHERE check_in < '2023-12-31'
AND check_out > '2023-12-25'
)
最终解决方案:
- 添加数据库悲观锁:
SELECT ... FOR UPDATE - 引入Redis分布式锁
- 前端增加防重复提交限制
4.2 MyBatis-Plus逻辑删除陷阱
默认的逻辑删除配置会导致关联查询异常:
yaml复制mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted # 全局逻辑删除字段
logic-not-delete-value: 0
logic-delete-value: 1
必须手动修改所有多表查询的XML:
xml复制<select id="selectRoomsWithOrder" resultMap="RoomWithOrderMap">
SELECT r.*, o.order_no
FROM room r LEFT JOIN orders o ON r.id = o.room_id
AND o.deleted = 0 <!-- 关键点 -->
WHERE r.deleted = 0
</select>
5. 毕设答辩加分项
根据近年答辩经验,这三个扩展功能最能打动评委:
- 数据大屏:用ECharts展示入住率/营收趋势图
- 智能门锁对接:模拟调用智能门锁API发送开锁密码
- 压力测试报告:用JMeter模拟100用户并发预订
演示时特别注意:
- 准备两套数据库:干净的演示库和带测试数据的开发库
- 对关键操作(如订单取消)做好异常场景预演
- 在application.yml中关闭Swagger的"try it out"功能避免误操作
6. 项目部署指南
6.1 开发环境快速启动
bash复制# 初始化数据库(内置Flyway迁移脚本)
mysql -uroot -p < src/main/resources/db/migration/V1__init_schema.sql
# 启动后端
mvn spring-boot:run -Dspring-boot.run.profiles=dev
# 前端热部署
cd src/main/resources/static/admin
npm run serve
6.2 生产环境打包要点
- 使用jib-maven-plugin构建Docker镜像
xml复制<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<to>
<image>${docker.image.prefix}/${project.artifactId}</image>
</to>
</configuration>
</plugin>
- Nginx配置静态资源缓存
nginx复制location /static {
alias /var/www/static;
expires 30d;
add_header Cache-Control "public";
}
7. 二次开发建议
如需定制化开发,重点关注这三个模块:
- 支付模块:在
PaymentStrategy接口中添加新的支付方式实现类 - 消息通知:扩展
Notifier接口支持短信/邮件等渠道 - 权限控制:修改
ShiroConfig中的过滤器链定义
推荐扩展方向:
- 接入支付宝刷脸入住
- 增加清洁工单自动分配
- 实现房源照片AI质量检测
- 开发抖音小程序引流入口
我在实际部署中发现,Linux环境下需要特别注意文件权限问题:
bash复制# 解决上传图片权限问题
chown -R www-data:www-data /var/uploads
chmod -R 755 /var/uploads
对于需要快速演示的场景,可以使用内置的MockDataGenerator类生成测试数据,通过修改application-test.yml中的mock.enabled开关控制。记得在正式演示前清理测试数据,避免出现"测试用户123"这样的尴尬情况。
