公司动态

基于Springboot景点民宿优选系统的设计与实现

📅 2026/8/31 6:46:49
基于Springboot景点民宿优选系统的设计与实现
1. 项目背景与意义随着国内旅游业的持续升温游客对住宿品质和个性化体验的要求不断提高。传统民宿预订平台往往存在信息冗杂、筛选维度单一、评价参考价值有限等问题游客难以在短时间内找到符合自身偏好的优质民宿。与此同时民宿经营者也面临房源展示渠道分散、订单管理效率低、定价策略缺乏数据支撑等痛点。基于Spring Boot的景点民宿优选系统正是针对上述问题设计的一套面向景区周边民宿的在线预订与优选管理平台。系统通过整合民宿基础信息、地理位置、设施服务、用户评价等多维度数据构建一套可量化的民宿优选评分机制帮助游客快速定位高性价比房源同时为经营者提供订单管理、房态维护和数据分析能力具有明确的实用价值和社会意义。2. 系统技术栈本系统采用前后端分离架构后端以Spring Boot为核心框架前端使用Vue.js构建单页应用数据库选用MySQL缓存层引入Redis整体技术选型兼顾开发效率、运行性能与后期可维护性。层次技术选型主要用途后端框架Spring Boot 2.7业务逻辑、接口服务、自动配置持久层MyBatis-PlusORM映射、通用CRUD、分页查询数据库MySQL 8.0核心业务数据存储缓存Redis热点房源缓存、会话管理安全认证Spring Security JWT用户认证与接口鉴权前端框架Vue.js 3 Element Plus页面交互与后台管理界面接口文档Swagger / Knife4j接口调试与文档生成构建工具Maven依赖管理与项目构建3. 系统功能模块设计系统面向游客、民宿经营者和系统管理员三类角色核心功能模块划分如下用户模块注册登录、个人信息维护、密码修改、收藏民宿。民宿模块民宿信息发布、多条件检索、详情展示、图片轮播。优选推荐模块基于评分、销量、评价、地理位置等维度生成优选榜单。预订模块在线选房、提交订单、支付模拟、订单状态流转。评价模块订单完成后发表评价、评分、上传图片。管理后台用户管理、民宿审核、订单管理、数据统计。4. 数据库设计系统核心数据表包括用户表、民宿表、房间表、订单表、评价表和收藏表。以下为民宿表和订单表的核心字段设计。CREATE TABLE homestay ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL COMMENT 民宿名称, scenic_id BIGINT COMMENT 所属景点ID, address VARCHAR(255) COMMENT 详细地址, price DECIMAL(10,2) COMMENT 参考价格, score DECIMAL(3,2) DEFAULT 5.00 COMMENT 综合评分, sales INT DEFAULT 0 COMMENT 累计销量, status TINYINT DEFAULT 1 COMMENT 状态0下架 1上架, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE booking_order ( id BIGINT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(32) UNIQUE COMMENT 订单编号, user_id BIGINT NOT NULL COMMENT 下单用户, room_id BIGINT NOT NULL COMMENT 房间ID, check_in DATE NOT NULL COMMENT 入住日期, check_out DATE NOT NULL COMMENT 离店日期, total_price DECIMAL(10,2) COMMENT 订单金额, status TINYINT DEFAULT 0 COMMENT 0待支付 1已支付 2已入住 3已完成 4已取消, create_time DATETIME DEFAULT CURRENT_TIMESTAMP );5. 核心代码实现5.1 民宿优选评分算法优选评分综合价格、评分、销量和距离四个维度通过加权计算得到民宿的综合推荐指数分值越高排名越靠前。Service public class RecommendService { Resource private HomestayMapper homestayMapper; /** 计算民宿优选指数 权重评分40% 销量30% 价格优势20% 距离10% */ public Listlt;HomestayVOgt; getRecommendList(Long scenicId, Double userLng, Double userLat) { Listlt;Homestaygt; list homestayMapper.selectList( new LambdaQueryWrapperlt;Homestaygt;() .eq(Homestay::getStatus, 1) .eq(scenicId ! null, Homestay::getScenicId, scenicId)); return list.stream().map(h -gt; { HomestayVO vo new HomestayVO(); BeanUtils.copyProperties(h, vo); // 价格优势得分价格越低得分越高归一化到0-100 double priceScore Math.max(0, 100 - h.getPrice() / 10); // 销量得分按销量对数映射到0-100 double salesScore Math.min(100, Math.log1p(h.getSales()) * 10); // 距离得分假设距离越近得分越高 double distanceScore 80.0; if (userLng ! null amp;amp; userLat ! null) { double distance GeoUtil.distance(userLng, userLat, h.getLng(), h.getLat()); distanceScore Math.max(0, 100 - distance / 100); } double recommendScore h.getScore() * 0.4 * 20 salesScore * 0.3 priceScore * 0.2 distanceScore * 0.1; vo.setRecommendScore(Math.round(recommendScore * 100) / 100.0); return vo; }).sorted(Comparator.comparing(HomestayVO::getRecommendScore).reversed()) .collect(Collectors.toList()); } }5.2 民宿多条件检索接口检索接口支持按景点、价格区间、评分、关键词等条件组合查询并返回分页结果。RestController RequestMapping(/api/homestay) public class HomestayController { Resource private HomestayService homestayService; GetMapping(/search) public Resultlt;PageResultlt;HomestayVOgt;gt; search(HomestayQuery query) { PageResultlt;HomestayVOgt; page homestayService.search(query); return Result.success(page); } GetMapping(/detail/{id}) public Resultlt;HomestayDetailVOgt; detail(PathVariable Long id) { return Result.success(homestayService.getDetail(id)); } }Service public class HomestayServiceImpl implements HomestayService { Override public PageResultlt;HomestayVOgt; search(HomestayQuery query) { Pagelt;Homestaygt; page new Pagelt;gt;(query.getPageNum(), query.getPageSize()); LambdaQueryWrapperlt;Homestaygt; wrapper new LambdaQueryWrapperlt;gt;(); wrapper.eq(Homestay::getStatus, 1); if (StringUtils.hasText(query.getKeyword())) { wrapper.like(Homestay::getName, query.getKeyword()); } if (query.getScenicId() ! null) { wrapper.eq(Homestay::getScenicId, query.getScenicId()); } if (query.getMinPrice() ! null) { wrapper.ge(Homestay::getPrice, query.getMinPrice()); } if (query.getMaxPrice() ! null) { wrapper.le(Homestay::getPrice, query.getMaxPrice()); } if (query.getMinScore() ! null) { wrapper.ge(Homestay::getScore, query.getMinScore()); } wrapper.orderByDesc(Homestay::getScore); homestayMapper.selectPage(page, wrapper); return PageResult.of(page); } }5.3 订单状态流转订单模块采用状态机方式管理订单流转确保各状态之间的转换合法且可追溯。Service public class OrderServiceImpl implements OrderService { Resource private OrderMapper orderMapper; Resource private RoomMapper roomMapper; Transactional(rollbackFor Exception.class) public Order createOrder(OrderCreateDTO dto, Long userId) { // 校验房间库存 Room room roomMapper.selectById(dto.getRoomId()); if (room null || room.getStock() lt; 0) { throw new BusinessException(该房间已满房); } // 计算入住天数与总价 long days ChronoUnit.DAYS.between(dto.getCheckIn(), dto.getCheckOut()); BigDecimal total room.getPrice().multiply(BigDecimal.valueOf(days)); Order order new Order(); order.setOrderNo(generateOrderNo()); order.setUserId(userId); order.setRoomId(dto.getRoomId()); order.setCheckIn(dto.getCheckIn()); order.setCheckOut(dto.getCheckOut()); order.setTotalPrice(total); order.setStatus(0); orderMapper.insert(order); // 扣减库存 roomMapper.reduceStock(dto.getRoomId()); return order; } Transactional(rollbackFor Exception.class) public void cancelOrder(Long orderId, Long userId) { Order order orderMapper.selectById(orderId); if (order null || !order.getUserId().equals(userId)) { throw new BusinessException(订单不存在); } if (order.getStatus() ! 0 amp;amp; order.getStatus() ! 1) { throw new BusinessException(当前状态不可取消); } order.setStatus(4); orderMapper.updateById(order); // 恢复库存 roomMapper.increaseStock(order.getRoomId()); } private String generateOrderNo() { return HS System.currentTimeMillis() String.format(%04d, ThreadLocalRandom.current().nextInt(10000)); } }6. 系统亮点与总结本系统的核心亮点在于将民宿优选评分机制与多维度检索相结合使游客能够基于评分、销量、价格和距离等指标快速筛选出高性价比房源。同时订单状态机设计和库存联动机制保证了预订流程的严谨性Redis缓存的应用有效提升了热点民宿详情页的访问性能。基于Spring Boot的景点民宿优选系统在技术层面采用了成熟稳定的主流框架在业务层面贴合景区民宿预订的真实场景兼具学习参考价值与工程落地意义。后续可进一步引入民宿智能推荐算法、地图选房和在线支付对接持续提升系统的智能化水平与用户体验。