☰
智能天气出行服务系统:Spring Boot + Thymeleaf + AI大模型毕设全解析
2026/10/11 15:19:05 网站建设 项目流程

很多计算机专业的学生在选毕业设计题目时,都卡在同一个问题上:想做一个既能体现技术含量、又不容易翻车、还能在答辩时讲出亮点的系统。如果只是做一个普通的 CRUD 管理系统,答辩时很难讲出东西;如果选题太偏、技术太生僻,又怕自己做不完、做不透。今天要拆解的这套“智能天气出行服务系统”,正好踩在一个比较舒服的位置上:它用 Spring Boot 做后端、Thymeleaf 做服务端页面渲染,再接入 AI 大模型的能力来做“智能出行建议”,技术栈是当前企业级 Java 开发的主流组合,又在业务上加入了 AI 这个热门话题。

这篇文章不只讲“这个系统有哪些界面”,而是把题目背后的设计逻辑讲清楚:为什么用 Spring Boot 而不是 SSM,为什么页面层用 Thymeleaf 而不是前后端分离,AI 大模型在系统里到底扮演什么角色,以及从数据库设计、接口封装到页面渲染,一条完整链路应该怎么写。读完你不仅能理解这套毕业设计的代码结构,还能自己动手把核心模块跑起来,并在论文和答辩环节把技术亮点讲明白。

1. 这套系统到底在解决什么问题

先别急着看代码,我们先把业务场景讲清楚。

传统的天气类网站或 App,基本路径是“查天气 → 用户自己决定要不要出门”。用户看到明天有雨,自己会想“那我不去爬山了,改去商场”;看到明天降温,会想“我要加件外套”。这里面的决策链路是断开的:天气数据是天气数据,出行决策是出行决策,中间那一步“根据天气给出合理建议”并没有被系统承接。

智能天气出行服务系统的核心改进,就是把这条链路补上。系统不仅能展示当天的天气状况、温度、风力、空气质量,还能结合用户输入的出行计划,借助 AI 大模型生成一份合理的出行建议。比如用户输入“明天想去郊区露营”,系统会在拿到明天的天气数据后,把“天气情况 + 用户计划”一起交给大模型,让模型判断是否适合露营、需要带什么装备、有没有更合适的替代方案。

这部分就是“智能”二字的落点,也是这套毕业设计和普通天气网站拉开差距的地方。毕业设计最怕的就是“功能看着多,细看全是数据库增删改查”。引入 AI 大模型之后,系统的业务深度和技术话题性都会明显增强,论文里也有东西可写。

从实际开发角度看,这个题目也很适合作为 Spring Boot 学习项目。它能覆盖 Web 层、Service 层、数据访问层、模板引擎渲染、第三方接口对接、配置管理、异常处理等多个环节,难度适中,又不至于太单薄。

2. 技术选型分析:Spring Boot、Thymeleaf 和 AI 大模型的分工

这个项目的技术栈可以简单理解为三层分工。

2.1 能力层:AI 大模型提供“智能判断”

大模型在本项目里并不是用来做“聊天机器人”的,而是充当一个“决策助手”。系统把天气数据、用户出行计划、注意事项等组装成一段结构化的提示词,请求大模型的接口,拿到模型返回的出行建议文本,再在页面上展示出来。

这里需要先想清楚一个问题:是本地部署大模型,还是调用云端 API?

对于毕业设计来说,更稳妥的是调用成熟的云端大模型 API。原因很直接:本地部署大模型对显卡和内存要求高,普通笔记本很难跑通,而且校验收环境时,答辩现场很难保证 GPU 资源。云端 API 只需要一个 Key,在 controller 或 service 里通过 HTTP 调用即可,逻辑链路简单、可控性强。至于具体接哪家模型,以实际学校要求和个人资源为准,代码层面只需要封装一个统一的“AI 服务接口”,后续更换模型厂商不用改上层逻辑。

有人可能会问:如果不接大模型 API,能不能做成纯规则匹配?

也可以,比如“雨天 → 建议带伞”“降温 → 建议加衣”。但这种规则匹配本质上还是 if-else,写论文的时候很难说“智能”,答辩也容易被追问。大模型的价值在于它能理解自然语言,能处理开放式问题。比如用户说“明天和女朋友去城市周边玩,预算五百以内”,这种问题用规则根本写不完,但大模型可以给出一份很具体的建议。这就是这套系统选择大模型的原因。

2.2 后端层:Spring Boot 负责业务编排

Spring Boot 在这里承担的是标准的后端职责:处理 HTTP 请求、调用服务层方法、管理数据访问、统配业务逻辑。

项目里可以拆出几个核心模块:

  • weather:负责对接天气数据源,解析天气信息。
  • ai:负责封装大模型接口调用,构造提示词,解析模型返回内容。
  • travel:负责出行建议相关的业务逻辑。
  • user:负责用户的注册、登录、历史记录管理。

这种包结构的好处是职责清晰,写论文画架构图时也方便。答辩时老师问你“系统怎么分层”“每个模块干什么”,你按包结构讲一遍,逻辑非常通顺。

2.3 表现层:Thymeleaf 完成服务端渲染

很多学生现在一说到页面就默认“前后端分离、Vue + Element UI”。但毕业设计里,前后端分离有时反而是个坑:你需要同时维护前端工程和后端工程,联调成本高,部署也麻烦,论文里还要多写一套接口文档。

Thymeleaf 是 Spring Boot 官方推荐的模板引擎,它直接写在后端工程的 resources/templates 目录下,后端通过 Model 把数据塞进页面,页面在服务器端渲染完成后直接传给浏览器。这个模式对毕设非常友好:少了一套前端工程,部署时一个 Spring Boot jar 全搞定,导师演示时也不用操心 Node.js 环境。

Thymeleaf 还有一个特点,就是页面本身是静态 HTML,可以直接用浏览器打开预览样式。它的核心语法主要是几个:

<!-- 用 th:text 输出后端传过来的变量 --> <p th:text="${cityName}">默认城市</p> <!-- 用 th:each 遍历列表 --> <tr th:each="item : ${suggestions}"> <td th:text="${item}"></td> </tr> <!-- 用 th:if 做条件判断 --> <div th:if="${isRainy}" class="alert-warning"> 今天可能有雨,记得带伞 </div>

这些语法学起来很快,比 Vue 的双向绑定、组件通信要轻量得多。对 Java 方向的学生来说,Thymeleaf 几乎是零额外负担。

2.4 为什么这个技术组合适合毕业设计

用一张表来对比几种常见的毕设技术方案:

技术方案开发成本答辩亮点翻车概率适合人群
Spring Boot + Thymeleaf低中低想稳扎稳打完成毕设的学生
Spring Boot + Vue 前后端分离高中高中高前端基础好、时间充裕的学生
Spring Boot + Thymeleaf + AI低高低想让项目有亮点又不想太冒进的学生

第三套方案就是本项目的选型。AI 负责制造话题,Spring Boot 负责稳定落地,Thymeleaf 负责控制成本。

3. 数据库设计与核心表结构

这个系统的数据量并不大,但数据库设计仍然要认真做。论文里“数据库设计”章节一般要画 ER 图、写数据字典,这块做得好,能拉高不少分数。

建议设计这几张核心表。

3.1 用户表

用户表用于支撑登录注册功能,字段如下:

CREATE TABLE sys_user ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键', username VARCHAR(64) NOT NULL UNIQUE COMMENT '用户名', password VARCHAR(128) NOT NULL COMMENT '密码,BCrypt加密存储', nickname VARCHAR(64) COMMENT '昵称', email VARCHAR(128) COMMENT '邮箱', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ) COMMENT '用户表';

密码字段一定要加密,不能用明文。Spring Security 或 Hutool 都提供 BCrypt 加密工具,论文里也能写“用户密码采用 BCrypt 加密存储,防止拖库后密码泄露”。

3.2 天气查询记录表

每次用户查询天气或生成出行建议时,可以把记录落库。这张表的作用是支撑“历史记录”功能,也能在论文里展示你对数据审计的理解。

CREATE TABLE weather_query_log ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键', user_id BIGINT COMMENT '用户ID', city VARCHAR(64) NOT NULL COMMENT '查询城市', query_date DATE NOT NULL COMMENT '查询日期', weather_info TEXT COMMENT '天气信息快照', ai_advice TEXT COMMENT 'AI出行建议', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ) COMMENT '天气查询记录表';

3.3 出行建议收藏表

用户看到一条不错的出游建议后,可以收藏起来。收藏功能虽然简单,但它体现的是“用户交互设计”,论文里可以写“通过收藏功能帮助用户沉淀高价值建议”。

CREATE TABLE travel_favorite ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键', user_id BIGINT NOT NULL COMMENT '用户ID', advice_content TEXT NOT NULL COMMENT '收藏的建议内容', location VARCHAR(128) COMMENT '建议地点', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '收藏时间' ) COMMENT '出行建议收藏表';

数据库层面不需要搞太多表,四到六张就足够了。重点是表与表之间的关联要清晰、字段命名要规范、注释要写全,论文数据字典可以直接从建表语句里复制。

4. 项目环境准备与初始化

在写代码之前,先把开发环境准备好。

4.1 环境清单

依赖项说明
JDK8 或 17,具体看你建的 Spring Boot 版本
Maven3.6 以上,用来管理依赖
MySQL5.7 或 8.0
IDEIDEA 社区版或专业版均可
API Key大模型平台的 Key

Spring Boot 版本建议用 2.7.x 或 3.x 中的某个稳定版本,具体以你创建项目时选到的版本为准。如果用的是 JDK 8,就选 Spring Boot 2.x;如果 JDK 17,3.x 也可以。不要盲目追最新版本,稳定最重要。

4.2 Spring Boot 项目初始化

最简单的创建方式是通过 IDEA 内置的 Spring Initializr:新建 Project → Spring Initializr → 选好 JDK 版本 → 勾选依赖。

需要添加的依赖包括:

  • Spring Web
  • Thymeleaf
  • Spring Data JPA 或 MyBatis Plus,二选一
  • MySQL Driver
  • Lombok(可选,但推荐)

如果你更习惯手写 pom.xml,核心依赖如下:

<!-- 文件路径:pom.xml --> <dependencies> <!-- Web 支持,包含 Spring MVC --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Thymeleaf 模板引擎 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- MyBatis Plus,简化数据库操作 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> <!-- MySQL 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- Hutool 工具库,提高开发效率 --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.25</version> </dependency> </dependencies>

如果你的项目里 JPA 和 MyBatis 出现了冲突,通常是两者同时引入了导致数据源初始化混乱,实际项目中建议只保留一个 ORM 框架。

4.3 配置文件编写

application.yml主要配三块内容:服务器端口、数据库连接、第三方接口地址。

# 文件路径:src/main/resources/application.yml server: port: 8080 spring: application: name: smart-weather-travel datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/smart_weather?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: your_password thymeleaf: cache: false prefix: classpath:/templates/ suffix: .html mybatis-plus: mapper-locations: classpath:/mapper/**/*.xml configuration: map-underscore-to-camel-case: true # 自定义配置,存放第三方接口信息 app: weather: api-url: https://api.example.com/weather api-key: your_weather_api_key ai: api-url: https://api.example.com/v1/chat/completions api-key: your_ai_api_key model: gpt-3.5-turbo

实际开发中,建议把不同的配置放到不同环境:application-dev.yml给本地开发,application-prod.yml给服务器部署。答辩演示时用 dev 配置即可。

5. 核心功能与代码实现

这个章节是全篇重点,我会把核心链路拆成几段代码:天气数据获取、AI 建议生成、后端 Controller、Thymeleaf 页面渲染,以及历史记录查询。

5.1 天气服务封装

天气数据怎么来?通常有两种方式:一种是调用云厂商的天气 API,另一种是本地模拟数据。对于真实项目,推荐接入第三方天气 API,比如和风天气、心知天气、高德天气都是常见的免费方案。

这里的关键不是具体用哪家 API,而是把“天气数据来源”封装成一个独立 Service。这样后续换数据源时,不用改页面和控制器。

定义一个天气服务接口:

// 文件路径:src/main/java/com/example/smartweather/service/WeatherService.java public interface WeatherService { /** * 根据城市名称查询实时天气 */ WeatherResult getWeather(String city); }

再写一个基于 HTTP API 的实现类:

// 文件路径:src/main/java/com/example/smartweather/service/impl/WeatherServiceImpl.java @Service public class WeatherServiceImpl implements WeatherService { @Value("${app.weather.api-url}") private String apiUrl; @Value("${app.weather.api-key}") private String apiKey; @Override public WeatherResult getWeather(String city) { // 1. 构造请求 URL String url = apiUrl + "?key=" + apiKey + "&location=" + city; // 2. 通过 Hutool 的 HttpUtil 发送 GET 请求 String jsonStr = HttpUtil.get(url); // 3. 解析 JSON 字符串成对象 JSONObject jsonObject = JSONUtil.parseObj(jsonStr); // 4. 提取需要的字段,组装成业务对象 WeatherResult result = new WeatherResult(); result.setCity(city); result.setTemperature(jsonObject.getStr("temp")); result.setWeather(jsonObject.getStr("text")); result.setWindDirection(jsonObject.getStr("windDir")); result.setWindScale(jsonObject.getStr("windScale")); result.setHumidity(jsonObject.getStr("humidity")); result.setUpdateTime(jsonObject.getStr("lastUpdate")); return result; } }

WeatherResult可以定义为一个简单的 POJO 类,包含城市、温度、天气现象、风力等字段。这个类主要作用是把第三方接口返回的差异隔离掉,后续对接真实天气数据源时只需改动WeatherServiceImpl。

这里容易踩的坑是:部分天气 API 返回的是嵌套 JSON,比如now.temp、now.text这样的结构,解析的时候要看清层级关系。如果解析字段路径写错,页面里就会显示空值,而不是报错,排查起来比较隐蔽。

5.2 AI 出行建议服务

AI 服务的核心逻辑是:把天气信息和用户输入组织成提示词,调用大模型接口,拿到自然语言建议。

这里我直接用一个轻量级的 HTTP 调用方式,不引入 SDK,保持代码简单直接。

// 文件路径:src/main/java/com/example/smartweather/service/AiTravelAdviceService.java @Service public class AiTravelAdviceService { @Value("${app.ai.api-url}") private String apiUrl; @Value("${app.ai.api-key}") private String apiKey; @Value("${app.ai.model}") private String model; /** * 生成出行建议 * * @param weatherInfo 天气信息 * @param userPlan 用户出行计划 */ public String generateAdvice(String weatherInfo, String userPlan) { // 1. 构造 Prompt String systemPrompt = "你是一个专业的出行规划助手。" + "请根据天气信息和用户出行计划,给出实用、具体的建议。" + "建议内容包括:是否适合出行、需要做的准备、注意事项、替代方案。"; String userPrompt = "天气信息:" + weatherInfo + "\n" + "用户出行计划:" + userPlan; // 2. 构造请求体 JSONObject requestBody = new JSONObject(); requestBody.set("model", model); JSONArray messages = new JSONArray(); JSONObject systemMessage = new JSONObject(); systemMessage.set("role", "system"); systemMessage.set("content", systemPrompt); messages.add(systemMessage); JSONObject userMessage = new JSONObject(); userMessage.set("role", "user"); userMessage.set("content", userPrompt); messages.add(userMessage); requestBody.set("messages", messages); requestBody.set("temperature", 0.7); // 3. 发送 POST 请求 String result = HttpRequest.post(apiUrl) .header("Authorization", "Bearer " + apiKey) .header("Content-Type", "application/json") .body(requestBody.toString()) .execute() .body(); // 4. 解析模型返回结果 JSONObject responseJson = JSONUtil.parseObj(result); JSONArray choices = responseJson.getJSONArray("choices"); JSONObject firstChoice = choices.getJSONObject(0); return firstChoice.getJSONObject("message").getStr("content"); } }

这段代码做完之后,有一个地方要特别注意:大模型返回的内容是纯文本,如果里面带换行符,渲染到 HTML 里会丢失换行。建议在 Controller 里把换行符转换成 HTML 的<br>标签,或者在前端模板里用th:utext输出。

5.3 Controller 层编排

Controller 的作用是接收页面请求、调用 Service、把数据塞进 Model。

// 文件路径:src/main/java/com/example/smartweather/controller/TravelController.java @Controller public class TravelController { @Resource private WeatherService weatherService; @Resource private AiTravelAdviceService aiTravelAdviceService; /** * 跳转到首页 */ @GetMapping("/") public String index() { return "index"; } /** * 查询天气并生成出行建议 */ @PostMapping("/travel/advice") public String getTravelAdvice(@RequestParam String city, @RequestParam String plan, Model model) { // 1. 查询天气 WeatherResult weather = weatherService.getWeather(city); // 2. 生成 AI 建议 String advice = aiTravelAdviceService.generateAdvice(weather.toString(), plan); // 3. 把数据放进 Model,交给 Thymeleaf 渲染 model.addAttribute("city", city); model.addAttribute("weather", weather); model.addAttribute("advice", advice); model.addAttribute("plan", plan); return "advice"; } }

这里可以看到 Thymeleaf 的典型用法:Controller 返回的是模板名advice,Spring Boot 会自动去resources/templates/advice.html找到对应页面,并把 Model 里的数据渲染进去。整个过程不需要写@ResponseBody,也不需要返回 JSON。

5.4 Thymeleaf 页面渲染

页面部分不需要写得特别炫酷,但要做到信息清晰、展示完整。

index.html是首页,负责收集用户输入:

<!DOCTYPE html> <!-- 文件路径:src/main/resources/templates/index.html --> <html lang="zh-CN" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>智能天气出行服务系统</title> <link rel="stylesheet" th:href="@{/css/style.css}"> </head> <body> <div class="container"> <h1>智能天气出行服务</h1> <p class="subtitle">输入城市和出行计划,AI 帮你规划更合适的一天</p> <form th:action="@{/travel/advice}" method="post"> <div class="form-group"> <label for="city">所在城市</label> <input type="text" id="city" name="city" placeholder="例如:北京" required> </div> <div class="form-group"> <label for="plan">出行计划</label> <textarea id="plan" name="plan" rows="4" placeholder="例如:明天想去郊外爬山,有没有什么需要注意的?" required></textarea> </div> <button type="submit">获取出行建议</button> </form> </div> </body> </html>

advice.html是结果页:

<!DOCTYPE html> <!-- 文件路径:src/main/resources/templates/advice.html --> <html lang="zh-CN" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>出行建议结果</title> </head> <body> <div class="container"> <h2 th:text="|${city} 出行建议|">北京出行建议</h2> <div class="weather-panel"> <h3>实时天气</h3> <p>天气:<span th:text="${weather.weather}">晴</span></p> <p>温度:<span th:text="${weather.temperature}">20°C</span></p> <p>湿度:<span th:text="${weather.humidity}">40%</span></p> <p>风向:<span th:text="${weather.windDirection}">南风</span></p> </div> <div class="advice-panel"> <h3>AI 出行建议</h3> <div class="advice-content" th:utext="${advice}"></div> </div> <a th:href="@{/}">重新查询</a> </div> </body> </html>

th:utext会把 AI 返回的文本当作 HTML 内容输出,这样 AI 返回的换行符可以被正确渲染成段落。但要注意,如果用th:utext,必须确保后端对内容做了转换,避免把未过滤的 HTML 直接输出。

5.5 历史记录与收藏功能

历史记录功能可以增强系统的完整度。每次用户查询后,把天气和 AI 建议保存到weather_query_log表。用户登录后打开“历史记录”页面,可以看到之前查过的所有记录。

// 文件路径:src/main/java/com/example/smartweather/service/QueryLogService.java @Service public class QueryLogService { @Resource private WeatherQueryLogMapper logMapper; public void saveLog(Long userId, String city, String weatherInfo, String aiAdvice) { WeatherQueryLog log = new WeatherQueryLog(); log.setUserId(userId); log.setCity(city); log.setQueryDate(LocalDate.now()); log.setWeatherInfo(weatherInfo); log.setAiAdvice(aiAdvice); logMapper.insert(log); } }

这个功能本身不复杂,但它能让系统从“一个接口演示页面”变成“一个完整的带用户操作闭环的系统”,在论文“功能模块设计”和“系统测试”环节能填充不少内容。

6. 运行与验证

代码写到这个程度,系统的基本链路已经通了。下面是运行和验证步骤。

6.1 启动项目

在 IDEA 里直接运行主类SmartWeatherApplication,也可以命令行启动:

mvn spring-boot:run

启动成功后,控制台会出现 Spring Boot 的日志横幅,并提示Tomcat started on port(s): 8080。

6.2 打开页面并测试

浏览器访问http://localhost:8080/,可以看到首页。

在输入框里填城市和出行计划,点击“获取出行建议”,观察以下内容:

  • 页面是否正常显示城市天气信息。
  • AI 建议是否返回合理内容。
  • 历史记录表weather_query_log是否新增了记录。

如果 AI 建议迟迟不返回,第一步去控制台看日志:是大模型 API 超时、Key 无效,还是请求参数格式不对。这三个问题各对应不同的提示信息。

6.3 接口测试

如果后端写了 REST 接口,也可以用 Postman 或 curl 单独测试接口。

curl -X POST http://localhost:8080/travel/advice \ -d "city=北京&plan=明天想去故宫,需要带什么?"

不过注意,这个接口返回的是 HTML 页面,不是 JSON。如果你需要接口返回 JSON,那就要另写@RestController接口。毕设系统里两种方式可以共存:页面走@Controller,给移动端或演示用的接口走@RestController。

7. 常见问题与排查思路

在开发或者答辩演示过程中,有几类问题出现频率很高,提前列出来,遇到时直接对标排查。

问题现象可能原因排查方式解决方案
启动报Failed to configure a DataSource数据库未创建或配置不对检查 MySQL 是否启动,database是否已创建先建库smart_weather,再核对账号密码
页面渲染出原始 HTML 标签后端返回内容包含<br>等标签,但模板用了th:text查看页面源码换成th:utext
大模型接口调用超时网络不通或 API Key 无效在浏览器直接调用一次 API 地址检查 Key 和网络,打印完整的响应日志
天气数据显示空值JSON 解析层级不对打印第三方接口的原始 JSON调整getStr路径,比如now.temp
Thymeleaf 模板修改后不生效缓存未关闭检查配置文件spring.thymeleaf.cache=false,重启项目
MyBatis Plus 查询结果为 null实体类字段和表字段下划线映射没开启检查配置map-underscore-to-camel-case设置为 true,或使用@TableField指定

其中“大模型接口超时”是演示现场最怕发生的意外。建议提前准备一份固定的建议文本作为本地兜底,一旦 AI 调用失败,可以自动降级到本地默认建议。这样即使现场网络出问题,功能也不会“白屏”。

8. 毕业设计落地建议:从能跑到能答辩

代码跑通只是第一步,毕业设计更重要的是把它“讲出来”和“写出来”。几个建议供参考。

8.1 论文结构怎么排

论文目录可以按以下顺序组织:

  1. 绪论:背景、意义、国内外研究现状。
  2. 相关技术介绍:Spring Boot、Thymeleaf、AI 大模型。
  3. 系统分析:可行性分析、需求分析、用例图。
  4. 系统设计:架构图、功能模块图、数据库 ER 图、表设计。
  5. 系统实现:分模块贴核心代码、截图。
  6. 系统测试:功能测试用例、结果分析。
  7. 总结与展望。

8.2 答辩时怎么讲 AI 部分

这是很多同学的盲区。答辩时老师可能不关心你页面多好看,但一定会问“AI 是怎么接入的”。

你可以按这个逻辑讲:

  1. 抽象接口:系统先定义了一个统一的 AI 服务接口。
  2. 提示词工程:把天气信息和用户计划组织成结构化的 Prompt。
  3. 调用与解析:通过 HTTP 调用大模型 API,解析返回内容。
  4. 降级兜底:接口异常时回退到本地规则建议。

这样讲,老师能听出你对“AI 集成”有完整理解,而不是只加了一个“看起来能聊天的框”。

8.3 答辩时可能会被追问的问题

提前想一想这几个问题:

  • 为什么用大模型而不是直接天气接口给建议?
  • 大模型返回建议不稳定怎么办?
  • 多用户并发请求大模型接口会不会卡顿?
  • 如果用户输入恶意内容,你会怎么处理?

不要求回答得多深,但要能说出自己的思考。比如并发问题,可以回答“当前版本是同步调用,后续可以引入消息队列做异步化”;恶意输入问题,可以回答“可以在接入层增加参数校验和敏感词过滤”。不需要你真的实现,但要让老师看到你有工程思维。

8.4 源码、LW、PPT 怎么配合使用

这套项目附带的三件套各有分工。源码是要“能跑起来”,LW(论文文档)是要“能讲清楚设计过程”,PPT 是答辩的提词器。

建议拿到项目后的第一步,不是打开 PPT,而是先把源码的启动流程跑通。先跑通、再看代码结构、再对着 LW 改写成自己的表达。毕业设计评审最看重的是“你对自己项目的掌握程度”,不管你用的是不是别人的源码,能讲清楚核心类、核心流程、核心数据库表,才是关键。

不建议直接拿原封不动的 LW 和 PPT 交差,尽量把自己的理解融入进去,改成符合自己表达习惯的版本。这样做一方面能降低查重风险,另一方面也更能经得起答辩追问。

9. 总结与后续学习方向

这个项目用 Spring Boot 做后端、Thymeleaf 做页面渲染、大模型 API 做智能出行建议,技术链路短、落地成本低、答辩亮点足。整个系统的核心不复杂:天气接口解决“数据怎么来”,大模型解决“建议怎么给”,Thymeleaf 解决“页面怎么渲染”,Spring Boot 解决“链路怎么串”。

如果你准备做这个题目,下一步可以按这个顺序推进:先启动项目看效果 → 拆解包结构和数据库 → 改掉你不满意的部分 → 补充一个自己加的功能 → 按照自己的语言重写 LW → 做答辩 PPT。不要一开始就陷在“怎么改界面”里,先让系统在自己电脑上跑起来,再逐步理解每一个环节。

如果想继续加深,可以从这几个方向入手:把同步调用大模型改成异步任务、给 AI 提示词做缓存策略、接入 Redis 缓存天气数据、加上基于用户历史行为的个性化推荐。每一条都能成为一个亮点,写在“后续展望”里也顺理成章。

毕设这件事,不求做成产品级系统,但求做成“能讲清楚、能演示、经得起提问”的完整闭环。这套技术组合,恰好能帮你把这三件事都做到。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询