# mars-spring-ai **Repository Path**: Marsfactory/mars-spring-ai ## Basic Information - **Project Name**: mars-spring-ai - **Description**: spring-ai项目实战(AI实时天气,12306接入AI大模型 ,AI自动下单课程) - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 3 - **Created**: 2026-08-23 - **Last Updated**: 2026-08-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring AI Weather 基于 **Spring Boot 3.4.5 + Spring AI + DeepSeek** 的智能对话应用,集成天气查询、火车票查询、编程课程推荐与微信 Native 支付能力。前端采用类 DeepSeek 风格的 SSE 流式聊天界面。 ## 功能特性 - **流式对话**:SSE 实时输出,支持快速模式 / 专家模式 / 深度思考 - **会话持久化**:会员 ID、会话、消息、大模型请求日志均存储于 MySQL - **天气查询**:通过 Tool 从 [中国天气网](https://www.weather.com.cn) 抓取实时天气 - **火车票查询**:对接 12306 `queryG` 接口查询余票 - **日期工具**:获取当前日期,支持「今天」「明天」等自然语言查票 - **课程推荐下单**:根据学历、专业推荐 Java / Python / 前端 / Golang / Rust 课程 - **微信支付**:Native 扫码支付,前端展示二维码,本地轮询查单(不依赖支付回调) ## 技术栈 | 类别 | 技术 | |------|------| | 后端框架 | Spring Boot 3.4.5 | | AI 框架 | Spring AI 1.0.0 | | 大模型 | DeepSeek(OpenAI 兼容接口) | | 数据库 | MySQL + MyBatis-Plus 3.5.9 | | 网页抓取 | Jsoup | | 微信支付 | wechatpay-java 0.2.14 | | 二维码 | ZXing 3.5.3 | | 前端 | 静态 HTML / CSS / JS + marked.js | ## 项目结构 ``` src/main/java/com/example/springaiweather/ ├── config/ # AI、MyBatis-Plus、微信支付等配置 ├── controller/ # Chat、Session、Member、Weather、Train、Pay 接口 ├── service/ # 业务逻辑 ├── tool/ # Spring AI Tools(天气、车票、课程、支付等) ├── entity/ # 数据库实体 ├── mapper/ # MyBatis-Plus Mapper └── dto/ # 请求/响应对象 src/main/resources/ ├── static/ # 前端页面(index.html、css、js) ├── schema.sql # 数据库建表及课程种子数据 ├── application.yml └── application-local.yml # 本地敏感配置(API Key、数据库密码) ``` ## 快速开始 ### 1. 环境要求 - JDK 17+ - Maven 3.8+ - MySQL 8.0+ ### 2. 初始化数据库 ```bash mysql -u root -p < src/main/resources/schema.sql ``` 将创建数据库 `spring_ai_weather` 及以下表: | 表名 | 说明 | |------|------| | `member` | 会员 | | `chat_session` | 会话 | | `chat_message` | 消息 | | `chat_request_log` | 大模型请求日志 | | `course` | 编程课程 | | `pay_order` | 支付订单 | ### 3. 配置 复制并编辑本地配置 `src/main/resources/application-local.yml`: ```yaml spring: datasource: password: your_mysql_password DEEPSEEK_API_KEY: sk-your-deepseek-api-key ``` 或通过环境变量配置: ```bash export DEEPSEEK_API_KEY=sk-xxx export MYSQL_PASSWORD=your_password ``` ### 4. 启动 ```bash mvn spring-boot:run ``` 访问:http://localhost:8080 ## API 接口 ### 对话 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/chat/stream` | SSE 流式对话 | | GET | `/api/member/init` | 初始化会员 ID | | GET | `/api/sessions?memberId=` | 会话列表 | | GET | `/api/sessions/{id}/messages?memberId=` | 会话消息 | ### 工具直连 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/api/weather?city=` | 天气查询 | | GET | `/api/train?from=&to=&date=` | 火车票查询 | ### 支付 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/api/pay/orders/{orderNo}?memberId=` | 订单详情 | | GET | `/api/pay/orders/{orderNo}/qrcode?memberId=` | 支付二维码(PNG) | | GET | `/api/pay/orders/{orderNo}/status?memberId=` | 轮询支付状态 | | POST | `/api/pay/orders/{orderNo}/mock-pay?memberId=` | 模拟支付(开发模式) | ## AI Tools | Tool | 说明 | |------|------| | `queryWeather` | 查询城市实时天气 | | `queryTrainTickets` | 查询火车票余票 | | `getCurrentDate` / `getTodayDate` | 获取当前日期 | | `recommendCourses` | 根据学历、专业推荐课程 | | `listCourses` | 列出所有可选课程 | | `createPayOrder` | 创建课程支付订单 | ## 课程下单流程 1. 用户表达想学编程 → AI 询问**学历**和**专业** 2. 调用 `recommendCourses` 推荐课程(Java / Python / 前端 / Golang / Rust) 3. 用户确认课程 → 调用 `createPayOrder` 创建订单 4. 回复中渲染「**立即支付**」按钮 → 弹窗展示微信 Native 二维码 5. 前端每 2 秒轮询 `/status`,后端主动查询微信订单状态,支付成功后自动更新 ## 微信支付配置 在 `application.yml` 中配置: ```yaml wechat: pay: app-id: your-app-id mch-id: your-mch-id cert-serial-no: your-cert-serial-no public-key-id: your-public-key-id private-key-path: classpath:wechat/apiclient_key.pem public-key-path: classpath:wechat/pub_key.pem api-v3-key: your-api-v3-key mock-fallback: true # 开发模式,使用模拟支付 ``` **开发模式**(`mock-fallback: true` 或 `api-v3-key` 为空): - 生成模拟支付链接和二维码 - 弹窗提供「模拟支付成功」按钮 **生产模式**: 1. 填写完整的微信支付商户配置 2. 将 `apiclient_key.pem` 放到 `src/main/resources/wechat/` 3. 设置 `mock-fallback: false` 4. 用户扫码支付后,由前端轮询触发后端查单,无需配置支付回调 ## 课程数据 | 编码 | 课程 | 价格 | |------|------|------| | `java` | Java 全栈开发 | ¥2999 | | `python` | Python 人工智能 | ¥2799 | | `frontend` | 前端开发实战 | ¥2599 | | `golang` | Golang 云原生开发 | ¥2899 | | `rust` | Rust 系统编程 | ¥3099 | ## 配置说明 | 配置项 | 默认值 | 说明 | |--------|--------|------| | `server.port` | 8080 | 服务端口 | | `spring.profiles.active` | local | 激活的配置文件 | | `MYSQL_HOST` | localhost | MySQL 主机 | | `MYSQL_PORT` | 3306 | MySQL 端口 | | `MYSQL_DB` | spring_ai_weather | 数据库名 | | `MYSQL_USER` | root | 数据库用户 | | `DEEPSEEK_API_KEY` | — | DeepSeek API Key(必填) | ## 常见问题 **Q: 支付按钮不显示?** AI 可能改写了工具返回内容。刷新页面(Ctrl+F5)后,前端会根据订单号自动补全支付按钮。 **Q: 二维码无法真实支付?** 检查 `mock-fallback` 是否为 `true`,以及 `api-v3-key` 和商户证书是否配置正确。 **Q: 端口 8080 被占用?** 修改 `application.yml` 中的 `server.port`,或结束占用进程后重启。 ## License MIT