基于Java的旅游民宿信息管理系统设计与实现 - 代码讲解文档
·
基于Java的旅游民宿信息管理系统设计与实现 - 代码讲解文档

一、项目概述
本项目是一个基于SpringBoot框架的旅游民宿信息管理系统,为游客和民宿商家提供一个便捷的民宿预订平台。系统实现了民宿信息展示、在线预订、商家管理、新闻公告等核心功能,支持用户、商家和管理员三种用户角色。
1.1 系统主要功能
- 民宿信息管理:商家发布民宿信息,包含房间类型、价格、设施等
- 民宿预订:用户在线预订民宿房间
- 商家入驻:商家注册入驻平台
- 收藏功能:用户收藏感兴趣的民宿
- 新闻公告:发布平台公告和行业资讯
- 关于我们:平台介绍与联系方式
1.2 技术选型
| 技术 | 版本 | 说明 |
|---|---|---|
| SpringBoot | 2.x | 核心框架 |
| MyBatis-Plus | 2.3 | ORM框架 |
| MySQL | 默认 | 关系型数据库 |
| WebSocket | 内置 | 实时通信 |
| FastJSON | 1.2.8 | JSON处理 |
| Hutool | 4.0.12 | Java工具库 |
| POI | 3.11 | Excel导出 |
| 百度AI SDK | 4.4.1 | 智能识别 |
二、技术架构
2.1 项目结构
springboot414j55j2/
├── src/main/java/com/
│ ├── annotation/ # 自定义注解
│ ├── config/ # 配置类
│ ├── controller/ # 控制器层(10个)
│ ├── dao/ # 数据访问层
│ ├── entity/ # 实体类
│ │ ├── model/ # Model对象
│ │ ├── view/ # View对象
│ │ └ vo/ # VO对象
│ ├── handler/ # 全局异常处理
│ ├── interceptor/ # 权限拦截器
│ ├── service/ # 业务逻辑层
│ │ └ impl/ # Service实现
│ └── utils/ # 工具类
├── src/main/resources/
│ ├── mapper/ # MyBatis映射
│ └── application.yml # SpringBoot配置
└── pom.xml
2.2 Controller层模块
| Controller | 功能说明 |
|---|---|
| MinsuxinxiController | 民宿信息管理 |
| YudingminsuController | 民宿预订管理 |
| ShangjiaController | 商家管理 |
| YonghuController | 用户管理 |
| StoreupController | 收藏功能 |
| NewsController | 新闻公告 |
| NewstypeController | 新闻分类 |
| AboutusController | 关于我们 |
| SystemintroController | 系统简介 |
| UsersController | 管理员 |
三、核心功能模块讲解
3.1 民宿信息管理模块
MinsuxinxiController.java
@RestController
@RequestMapping("/minsuxinxi")
public class MinsuxinxiController {
@Autowired
private MinsuxinxiService minsuxinxiService;
@Autowired
private StoreupService storeupService;
// 后台列表查询(商家只能查看自己的民宿)
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, MinsuxinxiEntity minsuxinxi, HttpServletRequest request) {
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("shangjia")) {
minsuxinxi.setShangjiazhanghao((String)request.getSession().getAttribute("username"));
}
EntityWrapper<MinsuxinxiEntity> ew = new EntityWrapper<>();
PageUtils page = minsuxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, minsuxinxi), params), params));
Map<String, String> deSens = new HashMap<>();
DeSensUtil.desensitize(page, deSens);
return R.ok().put("data", page);
}
// 前台列表(无需登录)
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params, MinsuxinxiEntity minsuxinxi, HttpServletRequest request) {
EntityWrapper<MinsuxinxiEntity> ew = new EntityWrapper<>();
PageUtils page = minsuxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, minsuxinxi), params), params));
return R.ok().put("data", page);
}
// 查询接口
@RequestMapping("/query")
public R query(MinsuxinxiEntity minsuxinxi) {
EntityWrapper<MinsuxinxiEntity> ew = new EntityWrapper<>();
ew.allEq(MPUtil.allEQMapPre(minsuxinxi, "minsuxinxi"));
MinsuxinxiView minsuxinxiView = minsuxinxiService.selectView(ew);
return R.ok("查询民宿信息成功").put("data", minsuxinxiView);
}
// 保存民宿信息
@RequestMapping("/save")
public R save(@RequestBody MinsuxinxiEntity minsuxinxi, HttpServletRequest request) {
minsuxinxiService.insert(minsuxinxi);
return R.ok().put("data", minsuxinxi.getId());
}
// 更新民宿信息
@RequestMapping("/update")
@Transactional
public R update(@RequestBody MinsuxinxiEntity minsuxinxi, HttpServletRequest request) {
minsuxinxiService.updateById(minsuxinxi);
return R.ok();
}
// 删除民宿信息
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids) {
minsuxinxiService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
}
Entity层 - MinsuxinxiEntity.java
民宿信息实体类:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | Long | 主键ID(自增) |
| minsumingcheng | String | 民宿名称 |
| minsuxingji | String | 民宿星级 |
| minsutupian | String | 民宿图片 |
| minsudizhi | String | 民宿地址 |
| fangjianleixing | String | 房间类型 |
| yiwanjiage | Double | 一晚价格 |
| fangjianzhuangtai | String | 房间状态 |
| fabushijian | Date | 发布时间 |
| fangjiansheshi | String | 房间设施 |
| minsujieshao | String | 民宿介绍 |
| shangjiazhanghao | String | 商家账号 |
| shangjiamingcheng | String | 商家名称 |
| lianxidianhua | String | 联系电话 |
| storeupnum | Integer | 收藏数 |
| addtime | Date | 创建时间 |
3.2 民宿预订模块
YudingminsuController.java
民宿预订流程:
- 用户选择民宿和入住日期
- 提交预订申请
- 商家确认预订
- 用户按时入住
YudingminsuEntity.java
预订信息实体:
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Long | 主键 |
| minsumingcheng | String | 民宿名称 |
| fangjianleixing | String | 房间类型 |
| yiwanjiage | Double | 价格 |
| yudingriqi | Date | 预订日期 |
| ruzhutianshu | Integer | 入住天数 |
| zongjiage | Double | 总价 |
| yonghuzhanghao | String | 用户账号 |
| yonghuxingming | String | 用户姓名 |
| shangjiazhanghao | String | 商家账号 |
| shangjiamingcheng | String | 商家名称 |
3.3 商家管理模块
ShangjiaController.java
商家入驻流程:
- 商家注册账号
- 填写商家信息
- 管理员审核
- 开始发布民宿
ShangjiaEntity.java
商家实体:
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Long | 主键 |
| shangjiazhanghao | String | 商家账号 |
| mima | String | 密码 |
| shangjiamingcheng | String | 商家名称 |
| lianxidianhua | String | 联系电话 |
| youxiang | String | 邮箱 |
| shangjiajieshao | String | 商家介绍 |
| touxiang | String | 封面图片 |
3.4 收藏功能模块
StoreupController.java
用户可收藏感兴趣的民宿,便于后续查看:
@RestController
@RequestMapping("/storeup")
public class StoreupController {
@Autowired
private StoreupService storeupService;
// 添加收藏
@RequestMapping("/save")
public R save(@RequestBody StoreupEntity storeup, HttpServletRequest request) {
storeup.setUserid((Long)request.getSession().getAttribute("userId"));
storeupService.insert(storeup);
return R.ok();
}
// 取消收藏
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids) {
storeupService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
}
StoreupEntity.java
收藏实体:
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Long | 主键 |
| userid | Long | 用户ID |
| refid | Long | 关联民宿ID |
| tablename | String | 表名(minsuxinxi) |
| name | String | 民宿名称 |
| picture | String | 图片 |
| type | Integer | 类型(1收藏) |
| inteltime | Date | 收藏时间 |
3.5 新闻公告模块
NewsController.java
发布平台公告、行业资讯:
- 公告标题
- 公告内容
- 发布时间
- 公告分类
四、数据库设计分析
4.1 主要数据表结构
minsuxinxi(民宿信息表)
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | bigint | PK, AUTO | 主键 |
| minsumingcheng | varchar(100) | NOT NULL | 民宿名称 |
| minsuxingji | varchar(20) | 星级 | |
| minsutupian | varchar(200) | 图片URL | |
| minsudizhi | varchar(200) | 地址 | |
| fangjianleixing | varchar(50) | 房间类型 | |
| yiwanjiage | double | 一晚价格 | |
| fangjianzhuangtai | varchar(20) | 房间状态 | |
| fabushijian | date | 发布时间 | |
| fangjiansheshi | varchar(200) | 房间设施 | |
| minsujieshao | text | 民宿介绍 | |
| shangjiazhanghao | varchar(50) | FK | 商家账号 |
| lianxidianhua | varchar(20) | 联系电话 | |
| storeupnum | int | DEFAULT 0 | 收藏数 |
yudingminsu(民宿预订表)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| minsumingcheng | varchar | 民宿名称 |
| fangjianleixing | varchar | 房间类型 |
| yudingriqi | date | 预订日期 |
| ruzhutianshu | int | 入住天数 |
| zongjiage | double | 总价 |
| yonghuzhanghao | varchar | 用户账号 |
| shangjiazhanghao | varchar | 商家账号 |
shangjia(商家表)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| shangjiazhanghao | varchar(50) | 商家账号 |
| mima | varchar(50) | 密码 |
| shangjiamingcheng | varchar(100) | 商家名称 |
| lianxidianhua | varchar(20) | 联系电话 |
| youxiang | varchar(50) | 邵箱 |
storeup(收藏表)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| userid | bigint | 用户ID |
| refid | bigint | 关联民宿ID |
| tablename | varchar(50) | 表名 |
| inteltime | datetime | 收藏时间 |
4.2 数据表关系
- 商家(shangjia) 1:N 发布民宿(minsuxinxi)
- 用户(yonghu) 1:N 预订民宿(yudingminsu)
- 民宿(minsuxinxi) 1:N 预订记录(yudingminsu)
- 用户(yonghu) 1:N 收藏(storeup)
五、关键代码解析
5.1 数据权限隔离
商家只能管理自己发布的民宿:
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("shangjia")) {
minsuxinxi.setShangjiazhanghao((String)request.getSession().getAttribute("username"));
}
5.2 分页查询
PageUtils page = minsuxinxiService.queryPage(params,
MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, minsuxinxi), params), params));
// 返回格式:{list: [], totalCount: 100, pageSize: 10, totalPage: 10, currPage: 1}
5.3 事务管理
@RequestMapping("/update")
@Transactional
public R update(@RequestBody MinsuxinxiEntity minsuxinxi, HttpServletRequest request) {
minsuxinxiService.updateById(minsuxinxi);
return R.ok();
}
5.4 数据脱敏
Map<String, String> deSens = new HashMap<>();
DeSensUtil.desensitize(page, deSens);
对联系电话、邮箱等敏感信息进行脱敏处理。
5.5 多条件查询
支持按名称、地址、价格范围等多条件组合查询:
// 构建查询条件
EntityWrapper<MinsuxinxiEntity> ew = new EntityWrapper<>();
if(minsuxinxi.getMinsumingcheng() != null) {
ew.like("minsumingcheng", minsuxinxi.getMinsumingcheng());
}
if(minsuxinxi.getMinsudizhi() != null) {
ew.like("minsudizhi", minsuxinxi.getMinsudizhi());
}
// 价格范围查询
if(priceStart != null) ew.ge("yiwanjiage", priceStart);
if(priceEnd != null) ew.le("yiwanjiage", priceEnd);
六、项目亮点总结
- 商家入驻机制:商家可注册入驻平台发布民宿
- 数据权限隔离:商家只能管理自己的民宿信息
- 房间状态管理:实时更新房间预订状态
- 收藏功能:用户可收藏感兴趣的民宿
- 数据脱敏保护:敏感信息自动脱敏
- 多条件查询:支持名称、地址、价格等多维度搜索
- 价格计算:自动计算入住总价
七、运行部署说明
7.1 环境要求
- JDK 1.8+
- MySQL 5.7+
- Maven 3.x
7.2 配置步骤
- 导入数据库SQL脚本
- 修改application.yml数据库连接
- 执行:
mvn spring-boot:run
7.3 访问地址
- 前台:http://localhost:8080/springboot414j55j2/front
- 后台:http://localhost:8080/springboot414j55j2/admin
更多推荐

所有评论(0)