技术栈分析

后端技术栈

  • Spring Boot 2.x:提供快速开发框架,集成Spring MVC、Spring Security等模块。
  • Spring Security:负责用户认证与授权,支持JWT令牌管理。
  • MyBatis/MyBatis-Plus:数据库ORM框架,简化SQL操作。
  • Redis:缓存热点数据(如酒店信息、用户行为记录)。
  • Elasticsearch:实现酒店搜索功能,支持分词、排序等高级查询。
  • MySQL 8.0:主数据库,存储用户、订单、酒店等核心数据。

前端技术栈

  • Vue 3:前端框架,采用Composition API编写组件。
  • Element Plus:UI组件库,提供表单、表格等交互组件。
  • Axios:HTTP请求库,与后端API交互。
  • Vue Router:管理前端路由。
  • ECharts:可视化用户行为数据(如偏好分析)。

核心功能模块

用户模块

  • 注册/登录(手机号+验证码或账号密码)。
  • 个人中心:历史订单、收藏夹、偏好设置(如价格区间、房型)。

酒店推荐模块

  • 协同过滤推荐:基于用户历史行为(浏览、订单)计算相似用户偏好。
  • 内容推荐:根据酒店标签(如“亲子”“商务”)匹配用户画像。
  • 实时推荐:Redis记录用户当前会话行为(如搜索关键词)。

搜索模块

  • 多条件筛选:地理位置、价格、评分、设施(WiFi、停车场)。
  • Elasticsearch聚合查询:支持关键词高亮、距离排序(如“距离地铁1km内”)。

订单模块

  • 在线预订:选择房型、日期生成订单。
  • 支付集成:对接支付宝/微信支付沙箱环境。
  • 订单状态管理:待支付、已入住、取消等。

后台管理模块

  • 酒店CRUD:管理房型、图片、促销活动。
  • 数据分析:生成报表(如入住率、用户地域分布)。

数据库设计

主要表结构

-- 用户表
CREATE TABLE `user` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT,
  `username` VARCHAR(50) UNIQUE,
  `password` VARCHAR(100),
  `phone` VARCHAR(20),
  `preferences` JSON COMMENT '存储用户偏好标签'
);

-- 酒店表
CREATE TABLE `hotel` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT,
  `name` VARCHAR(100),
  `location` POINT COMMENT '经纬度',
  `tags` JSON COMMENT '设施标签如["WiFi","泳池"]',
  `avg_score` DECIMAL(3,1)
);

-- 订单表
CREATE TABLE `order` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT,
  `user_id` BIGINT,
  `hotel_id` BIGINT,
  `status` ENUM('pending','paid','cancelled'),
  FOREIGN KEY (`user_id`) REFERENCES `user`(`id`),
  FOREIGN KEY (`hotel_id`) REFERENCES `hotel`(`id`)
);

索引优化

  • 酒店表:为location添加空间索引(R树),加速地理查询。
  • 订单表:联合索引(user_id, status)提升用户订单查询速度。

系统测试要点

单元测试(JUnit 5)

  • 测试Service层逻辑:例如推荐算法返回结果是否符合预期。
  • Mock数据库操作:使用@MockBean模拟MyBatis Mapper调用。

集成测试(TestRestTemplate)

  • 验证API接口:如提交订单后,数据库状态是否更新。
  • 安全性测试:未登录用户访问/admin/**应返回403。

性能测试(JMeter)

  • 模拟高并发搜索请求:测试Elasticsearch集群响应时间。
  • 缓存命中率监控:通过Redis日志分析推荐模块效率。

源码结构示例

src/
├── main/
│   ├── java/
│   │   ├── com.hotel.recommend/  
│   │   │   ├── algorithm/       # 推荐算法包
│   │   │   ├── controller/      # 暴露API
│   │   │   ├── entity/          # 数据库实体
│   │   ├── resources/
│   │   │   ├── application.yml  # 多环境配置
│   │   │   ├── mapper/          # MyBatis XML
│   ├── vue/                     # 前端项目
│   │   ├── src/
│   │   │   ├── api/             # Axios请求封装
│   │   │   ├── views/           # 页面组件

关键代码片段(推荐算法)

// 协同过滤核心逻辑
public List<Hotel> recommendByCF(Long userId) {
    List<UserSimilarity> similarities = userMapper.findSimilarUsers(userId);
    return similarities.stream()
        .flatMap(sim -> orderMapper.findHotelsByUserId(sim.getTargetUserId()).stream())
        .sorted(Comparator.comparingDouble(Hotel::getAvgScore).reversed())
        .limit(10)
        .collect(Collectors.toList());
}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐