# 云隙-旅行计划助手 **Repository Path**: LLS312885991/cloudgap ## Basic Information - **Project Name**: 云隙-旅行计划助手 - **Description**: 云隙-旅行计划助手:一个专注于旅行规划的开源项目,提供行程安排、景点推荐和实用指南,帮助用户轻松制定完美旅行计划。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-15 - **Last Updated**: 2026-06-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 云隙 CloudGap > 当阳光透过云层缝隙倾泻而下时,光便有了形状。 **云隙**(CloudGap)是一款基于 AI 对话的智能旅行规划助手。用户通过与助手对话,输入目的地、出发地、时间等关键信息,即可自动生成完整的旅行计划——包括总体行程路线(地图展示)、每一天的日程安排、交通/美食/景点等详细内容,确认后生成行程日历提醒。 ## 技术栈 ### 后端 | 技术 | 版本 | 说明 | |------|------|------| | JDK | 25 | 运行环境 | | Spring Boot | 4.0.0 | 后端框架 | | MyBatis-Plus | 3.5.15 | ORM(spring-boot4-starter) | | PostgreSQL | 16 | 数据库 | | Flyway | — | 数据库迁移 | | Spring AI Alibaba | 1.0.0.3 | AI 对话(DashScope) | | Spring AI OpenAI | 1.0.0 | DeepSeek 模型接入 | | iCal4j | 4.0.3 | 日历文件生成 | | Maven | 3.9.16 | 构建工具 | ### 前端 | 技术 | 版本 | 说明 | |------|------|------| | Vue | 3.5.x | 前端框架 | | Vue Router | 4.6.x | 路由管理 | | Vite | 8.x | 构建工具 | | 高德地图 JS API | 2.0 | 地图展示与路线绘制 | ## 目录结构 ``` cloudgap/ ├── cloudgap-server/ # Spring Boot 后端 │ ├── src/main/java/com/cloudgap/ │ │ ├── agent/ # AI Agent 工作流节点 │ │ │ ├── TripPlannerWorkflow.java │ │ │ ├── IntentExtractNode.java │ │ │ ├── PoiNode.java │ │ │ ├── RouteNode.java │ │ │ ├── ScheduleNode.java │ │ │ ├── PolishNode.java │ │ │ └── FrameworkNode.java │ │ ├── config/ # 配置类 │ │ ├── controller/ # REST 控制器 │ │ │ ├── AuthController.java │ │ │ ├── ChatController.java │ │ │ ├── MapController.java │ │ │ ├── TripController.java │ │ │ └── UserController.java │ │ ├── dto/ # 数据传输对象 │ │ ├── entity/ # 数据库实体 │ │ ├── mapper/ # MyBatis-Plus Mapper │ │ └── service/ # 业务服务 │ │ ├── AmapService.java # 高德地图 API 服务 │ │ ├── CalendarService.java │ │ ├── ChatService.java │ │ ├── TripService.java │ │ └── UserService.java │ └── src/main/resources/ │ ├── application.yml │ └── db/migration/ # Flyway SQL 脚本 ├── cloudgap-web/ # Vue 3 前端 │ └── src/ │ ├── components/ # 公共组件 │ │ ├── CloudGapIcon.vue │ │ └── NavBar.vue │ ├── composables/ # 组合式函数 │ │ └── useChat.js │ ├── router/ # 路由配置 │ ├── views/ # 页面视图 │ │ ├── SplashView.vue │ │ ├── LoginView.vue │ │ ├── ChatView.vue │ │ ├── TripListView.vue │ │ ├── TripDetailView.vue │ │ ├── TripDayView.vue │ │ └── ProfileView.vue │ ├── App.vue │ ├── main.js │ └── style.css ├── docs/ # 设计文档与原型 │ ├── prototype/ # 原型图 │ └── superpowers/ # 设计规格与实施计划 ├── docker-compose.yml # PostgreSQL 容器 └── README.md ``` ## 快速启动 ### 环境要求 - JDK 25(路径:`D:\jdks\jdk-25.0.3`) - Maven 3.9.16(路径:`D:\applications\apache-maven-3.9.16`) - Node.js 18+ - Docker(用于启动 PostgreSQL) ### 1. 启动 PostgreSQL ```bash docker compose up -d ``` ### 2. 配置环境变量 | 变量名 | 说明 | 示例 | |--------|------|------| | `AMAP_KEY` | 高德地图 Web 服务 API Key | `your_amap_key_here` | | `DASHSCOPE_API_KEY` | 阿里云 DashScope API Key | — | | `DEEPSEEK_API_KEY` | DeepSeek API Key | — | ### 3. 启动后端 ```bash cd cloudgap-server # 设置环境变量(PowerShell) $env:JAVA_HOME = "D:\jdks\jdk-25.0.3" # 编译运行 D:\applications\apache-maven-3.9.16\bin\mvn spring-boot:run ``` 后端启动后访问:`http://localhost:8080` ### 4. 启动前端 ```bash cd cloudgap-web npm install npm run dev ``` 前端开发服务器默认访问:`http://localhost:5173` ## 高德地图 API 配置 本项目的后端和前端均使用高德地图 API。服务端通过 Web 服务 API(`restapi.amap.com`)进行 POI 搜索和路径规划,前端使用 JS API 2.0 展示地图和绘制路线。 ### 高德开放平台 Key 体系说明 高德地图不同平台需要申请**不同类型的 Key**,不可混用: | 平台类型 | 申请入口 | Key 类型 | 是否需要安全密钥 | |----------|----------|----------|:---:| | **Web 端(JS API)** | 高德开放平台 → Web端(JS API) | Web 端 Key | ✅ 是 | | **Web 服务(Rest API)** | 高德开放平台 → Web服务 | Web 服务 Key | ❌ 否 | | **微信小程序** | 高德开放平台 → 微信小程序 | 小程序 Key | ❌ 否(需绑定 AppID) | > **重要**:本项目同时使用了 Web 服务 API(后端)和 JS API(前端),需要分别申请对应类型的 Key,或使用同一个已开通两种服务的 Key。 ### Web 端 JS API 安全密钥机制 自 **2021 年 12 月 02 日**起,高德地图新申请的 Web 端 JS API Key **必须配合安全密钥(jscode)**一起使用。安全密钥的作用是防止 Key 被恶意冒用。 #### 配置方式(开发环境 — 明文) 在加载 JS API 脚本**之前**,设置 `window._AMapSecurityConfig`: ```html ``` > ⚠️ **注意**:明文方式仅适合开发调试,生产环境请使用代理服务器方式。 #### 配置方式(生产环境 — 代理服务器,推荐) 通过 Nginx 反向代理,将安全密钥放在服务端: ```nginx server { listen 80; server_name 127.0.0.1; location /_AMapService/ { set $args "$args&jscode=你的安全密钥"; proxy_pass https://restapi.amap.com/; } } ``` 前端配置: ```html ``` > `_AMapService` 为固定前缀,不可修改。 ### 微信小程序 vs Web JS API 核心差异 | 维度 | Web JS API | 微信小程序 | |------|-----------|-----------| | **加载方式** | ` ``` 推荐使用 `@amap/amap-jsapi-loader` 以 npm 包方式加载: ```bash npm install @amap/amap-jsapi-loader ``` ```javascript import AMapLoader from '@amap/amap-jsapi-loader'; window._AMapSecurityConfig = { securityJsCode: '你的安全密钥', }; AMapLoader.load({ key: '你的Key', version: '2.0', plugins: ['AMap.Scale', 'AMap.ToolBar'], }).then((AMap) => { const map = new AMap.Map('container', { zoom: 12, center: [116.397428, 39.90923], }); }); ``` ### 常见问题 | 现象 | 可能原因 | 解决方式 | |------|---------|---------| | 地图白屏/加载失败 | 安全密钥未在 JS API 加载前设置 | 确保 `_AMapSecurityConfig` 在 `