尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Spring Boot+Thymeleaf+AI智能天气出行服务系统开发实战

Spring Boot+Thymeleaf+AI智能天气出行服务系统开发实战 基于 Spring Boot Thymeleaf AI 的智能天气出行服务系统是一个很适合用来做计算机毕业设计的AI应用型项目。它把传统的 Spring Boot 业务系统和大模型接口调用结合到了一起既有完整的管理后台、数据库设计、页面渲染又有当前比较热的 AI 交互能力整体难度适中工作量也容易讲清楚。如果你正在犹豫毕设选什么方向或者已经拿到这个题目但不知道从哪下手这篇文章会按我实际做过类似项目的顺序给你拆清楚功能设计、技术选型、核心代码、环境配置、测试验证以及论文和答辩材料怎么组织。下面直接进入正题。1. 先搞清楚这个系统要做什么再决定怎么做1.1 这个系统的核心价值不是“查天气”而是“出行建议”很多人一听到“智能天气出行服务系统”第一反应是做一个天气预报网站。这个理解不算错但会限制你对系统的设计高度。如果只是展示天气数据那用现成的天气组件就能实现根本不需要引入 AI。这个系统的核心价值是把天气数据变成一个“出行参考依据”。用户输入目的地、出发时间、出行方式之后系统能根据天气情况给出是否需要带伞、是否适合骑行、穿衣建议、紫外线防护提示、是否建议调整出行时间等。这部分内容如果靠人工写规则很难覆盖所有场景所以引入 AI 大模型来做语义化建议就是一个非常合理的切入点。从毕设评分角度看这样的系统也能体现三层能力第一层掌握了 Spring Boot 后端开发、MyBatis/MyBatis-Plus 数据持久化、RESTful API 设计。第二层掌握了 Thymeleaf 服务端页面渲染能够完成前后端数据流转。第三层掌握了大模型接口接入、Prompt 构造、输出解析能够把 AI 能力集成进业务系统。这三层能力正好对应一篇本科毕设论文里常见的研究内容、系统设计、系统实现和系统测试。1.2 为什么这个技术栈适合计算机毕业设计Spring Boot 是当前国内 Java 后端开发最主流的基础框架企业对它的认可度高网上资料也多。用 Spring Boot 做毕设遇到问题很容易找到参考。Thymeleaf 是 Spring Boot 官方推荐的模板引擎之一。它和 Spring Boot 集成非常顺畅可以做到后端渲染页面不需要独立搭建 Vue 或 React 前端工程。这对一个人完成整个系统来说工作量和调试成本都会低很多。如果后端能力一般也不擅长 JavaScript 调试Thymeleaf 是很稳妥的选择。AI 大模型接入目前有两种常见方式方式一使用 Spring AI 官方项目通过 Spring Boot 风格配置来对接大模型接口。方式二直接使用 HttpClient 或 OkHttp 调用大模型厂商提供的 HTTP 接口自己处理请求参数和响应解析。对于毕设项目我更建议先掌握方式二因为它能看到完整的请求链路出现问题容易排查。等对调用逻辑清楚了再换成 Spring AI 封装方式也不难。注意这里提到的 AI 大模型接口指的是你申请到的合法开放平台 API Key按平台规则调用即可。不要使用任何绕开限制或未经授权的第三方代理方式。所以这个系统在技术选型上的逻辑非常清楚Spring Boot 解决后端服务能力Thymeleaf 解决页面展示AI 大模型解决“智能出行建议”这个差异化功能。2. 功能模块怎么拆数据流怎么走2.1 核心功能模块划分一个可用于毕业设计的智能天气出行服务系统可以按以下模块划分。这套划分也方便后面写论文画功能结构图。模块主要功能涉及角色用户模块注册、登录、个人信息管理普通用户天气查询模块按城市查询实时天气、天气预报、空气质量普通用户出行建议模块输入目的地、出行方式、出行时间AI 生成建议普通用户收藏管理模块收藏常用城市或出行方案普通用户管理后台模块用户管理、天气数据管理、建议记录管理、系统日志管理员系统辅助模块轮播图管理、公告管理、数据统计管理员这六个模块对于一个毕设来说规模适中、功能完整不会因为模块太多导致开发周期失控也不会因为只有简单 CRUD 让人觉得工作量不够。2.2 数据流向设计明确数据流向能帮助你后面写代码、画时序图、讲答辩时更清楚。先看用户访问天气信息这条链路用户在页面选择城市点击查询。浏览器将城市名称请求发送到 Spring Boot 后端 Controller。Controller 校验参数后调用天气服务类。天气服务类先从数据库查询该城市是否存在缓存记录以及缓存时间是否过期。如果缓存有效直接返回数据库中的天气数据。如果缓存无效或不存在调用第三方天气 API 获取最新天气数据。将第三方返回的数据解析后存入数据库同时返回给前端页面展示。再看 AI 出行建议这条链路用户在出行建议页面输入目的地城市、出行日期、出行方式、出行时段。后端接收参数后先通过天气查询模块获取对应城市的天气情况。将天气数据拼接到 Prompt 中调用 AI 大模型接口。大模型返回建议文本例如穿衣建议、是否带伞、出行风险提示等。系统将问题和回答保存到出行建议记录表页面展示建议结果。这种双链路设计既能保证天气数据有来源、有缓存、有持久化也能让 AI 建议建立在实际天气数据之上而不是让用户凭空提问。这一点在论文里写系统详细设计时会显得逻辑严密。3. 环境准备和依赖配置先把基础夯住3.1 本地开发环境我建议按以下环境来准备这是一个比较稳妥且容易找到资料的环境组合项目建议版本说明JDKJDK 1.8 或 JDK 17JDK 8 兼容性最好JDK 17 适合新版 Spring BootSpring Boot2.7.x 或 3.x选 2.7.x 更稳第三方资料多3.x 需要 JDK 17数据库MySQL 5.7 或 MySQL 8.0MySQL 8.0 是常见选择构建工具Maven 3.6 及以上管理依赖和打包前端技术Thymeleaf Bootstrap jQuery页面样式和交互IDEIntelliJ IDEA社区版足够不需要特别配置如果你的机器配置不高也可以正常运行。这类系统对性能要求很低内存 8GB 就足够重点是你本地的 MySQL 服务和 IDE 不要同时卡顿。如果你不想自己安装 MySQL也可以暂时使用 H2 内存数据库跑通逻辑但生产演示和论文截图建议还是用 MySQL更贴近实际项目。3.2 Maven 核心依赖在pom.xml中至少需要引入以下依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-thymeleaf/artifactId /dependency dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.3.0/version /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency如果你的 Spring Boot 版本是 2.7.x使用mysql-connector-j时要注意包名和驱动类变化。MySQL 8 及以上版本驱动类通常配置为com.mysql.cj.jdbc.Driver。AI 请求相关的依赖如果你使用 Spring AI需要引入spring-ai-starter-model-openai之类的依赖。如果你使用 HttpClient 直接调用接口则不需要额外引入大模型依赖。我个人的建议是先使用 HttpClient 方式实现把核心代码写在 Service 层。这样不会因为 Spring AI 版本问题卡住也更容易在论文中画出调用流程图。3.3 配置文件示例在application.yml中除了配置数据源和 MyBatis还需要预留 AI 接口的配置项server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/weather_travel?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver thymeleaf: cache: false prefix: classpath:/templates/ suffix: .html mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.weather.entity configuration: map-underscore-to-camel-case: true ai: api-key: your-api-key base-url: https://your-ai-provider.example.com model: your-model-name timeout: 30注意ai.api-key、ai.base-url、ai.model这些字段要按你实际申请的模型服务商文档来填。不同服务商地址格式不一样。这里给的是通用示例不要原样照抄。3.4 数据库表设计思路数据库表不需要太多围绕业务闭环设计即可。我建议至少包含以下表user用户表包含用户名、密码、昵称、手机号、角色等。city城市表存储城市编码、城市名称、省份、热门程度等。weather_info天气信息表存储城市、天气状况、温度、湿度、风力、空气质量、更新时间等。travel_advice出行建议记录表存用户ID、出发城市、目的城市、出行方式、出行日期、AI 建议内容、创建时间。user_favorite用户收藏表收藏城市或出行方案。notice公告表后台发布系统公告。system_log系统日志表记录用户操作行为。在表设计上不需要追求特别复杂但要能说明关系。比如travel_advice表通过user_id关联用户表通过city_code关联城市编码。这样在论文画 E-R 图时可以形成清晰的关系结构。4. 后端核心代码实现重点看 AI 接入和天气服务4.1 项目目录结构比较推荐的分层结构如下既清晰又符合企业开发习惯com.example.weather ├── WeatherApplication.java ├── controller │ ├── IndexController.java │ ├── WeatherController.java │ ├── AdviceController.java │ └── AdminController.java ├── service │ ├── UserService.java │ ├── WeatherService.java │ ├── AdviceService.java │ └── impl │ ├── UserServiceImpl.java │ ├── WeatherServiceImpl.java │ └── AdviceServiceImpl.java ├── mapper │ ├── UserMapper.java │ ├── WeatherMapper.java │ ├── AdviceMapper.java │ └── FavoriteMapper.java ├── entity │ ├── User.java │ ├── WeatherInfo.java │ ├── TravelAdvice.java │ ├── City.java │ └── Favorite.java ├── common │ ├── Result.java │ └── ResultCode.java └── config ├── WebConfig.java └── AiConfig.java这个结构在你写论文时的系统架构图里可以直接复用。Controller 层负责接收请求Service 层负责业务逻辑Mapper 层负责数据库操作实体类对应数据库表。4.2 天气查询服务实现天气服务建议先写一个服务类负责获取天气数据。下面是一个简化版的逻辑框架Service public class WeatherServiceImpl implements WeatherService { Autowired private WeatherMapper weatherMapper; Autowired private RestTemplate restTemplate; Value(${weather.api.key}) private String weatherApiKey; Override public WeatherInfo getWeatherByCity(String cityName) { // 1. 先从数据库查询缓存 WeatherInfo cache weatherMapper.selectByCityName(cityName); if (cache ! null isCacheFresh(cache.getUpdateTime())) { return cache; } // 2. 缓存不存在或过期调用第三方天气 API String url https://your-weather-api.example.com/weather?city cityName key weatherApiKey; String response restTemplate.getForObject(url, String.class); // 3. 解析返回 JSON构造天气信息对象 WeatherInfo weatherInfo parseWeatherResponse(response, cityName); // 4. 保存到数据库作为下次请求的缓存 weatherMapper.insertOrUpdate(weatherInfo); return weatherInfo; } private boolean isCacheFresh(LocalDateTime updateTime) { return updateTime ! null updateTime.isAfter(LocalDateTime.now().minusMinutes(30)); } }需要注意两点。第一第三方天气 API 的返回格式各不相同有的是 JSON有的是 XML。一定要根据你实际使用接口的文档来解析不要直接照抄别人的解析字段。第二缓存时间可以根据需要调整。如果只是演示缓存 30 分钟完全够用。如果你希望每次查询都能看到最新请求效果可以把缓存时间调短到 5 分钟或者在后台上增加一个“刷新天气”按钮。这种设计在答辩时也可以解释为通过数据库缓存减少第三方接口调用次数降低接口请求频率提高页面响应速度。这是一个很实用的业务优化点。4.3 AI 出行建议服务实现AI 服务是这个项目最值得展示的部分。核心思路是先把天气数据拿到再把天气数据拼成 Prompt最后调用大模型接口生成建议。以一个通用的 HTTP 请求方式为例Service public class AdviceServiceImpl implements AdviceService { Value(${ai.api-key}) private String apiKey; Value(${ai.base-url}) private String baseUrl; Value(${ai.model}) private String model; Autowired private RestTemplate restTemplate; Autowired private WeatherService weatherService; Autowired private AdviceMapper adviceMapper; Override public TravelAdvice generateAdvice(TravelRequest req) { // 1. 查询目的地天气 WeatherInfo weather weatherService.getWeatherByCity(req.getDestination()); // 2. 构造提示词 String prompt buildPrompt(req, weather); // 3. 调用大模型接口 String answer callAiApi(prompt); // 4. 保存记录 TravelAdvice advice new TravelAdvice(); advice.setUserId(req.getUserId()); advice.setDestination(req.getDestination()); advice.setTravelDate(req.getTravelDate()); advice.setTravelMode(req.getTravelMode()); advice.setAdviceContent(answer); adviceMapper.insert(advice); return advice; } private String buildPrompt(TravelRequest req, WeatherInfo weather) { StringBuilder sb new StringBuilder(); sb.append(你是智能出行助手请根据以下天气信息给出出行建议。\n); sb.append(目的地).append(req.getDestination()).append(\n); sb.append(出行时间).append(req.getTravelDate()).append(\n); sb.append(出行方式).append(req.getTravelMode()).append(\n); sb.append(天气).append(weather.getCondition()).append(\n); sb.append(温度).append(weather.getTemperature()).append(℃\n); sb.append(湿度).append(weather.getHumidity()).append(%\n); sb.append(风力).append(weather.getWindPower()).append(\n); sb.append(请输出包括穿衣建议、是否需要带雨具、是否适合当前出行方式、注意事项在内的完整建议。); return sb.toString(); } private String callAiApi(String prompt) { // 这里根据你使用的大模型接口规范构造请求 // 一般是构建 JSON 请求体发送 POST 请求然后解析返回内容 return AI 返回的建议文本; } }这段代码里的callAiApi方法需要按你自己选的模型服务商提供的接口规范来写。不同平台请求地址不同、参数不同、返回结构不同。网上很多代码示例用的是 OpenAI 风格格式但国内不少服务商也有兼容接口使用前先看文档。Prompt 构造是整段代码的核心。你要让 AI 输出适合当前天气场景的建议就必须把天气字段明确传入。另一个关键点是要求 AI 分条目输出比如“穿衣建议”“雨具建议”“出行风险提示”。这能提高输出内容的可读性也方便页面展示。注意AI 建议是基于开放模型接口生成的参考内容并不保证完全准确也不应该让用户把系统输出当成官方气象预警。页面底部最好加一句“建议仅供参考极端天气请以官方预警为准”。这也说明你的系统有安全意识。4.4 Controller 层设计Controller 层要尽量薄只做参数接收、校验、调用 Service、返回结果。Controller RequestMapping(/travel) public class AdviceController { Autowired private AdviceService adviceService; GetMapping(/page) public String advicePage(Model model) { return travel/advice; } PostMapping(/generate) ResponseBody public Result generate(RequestBody TravelRequest req) { TravelAdvice advice adviceService.generateAdvice(req); return Result.success(advice); } }页面请求和接口请求分开处理。页面请求返回 Thymeleaf 模板接口请求返回 JSON。如果你在页面上用 Ajax 提交表单就通过/travel/generate获取结果局部刷新到页面。如果你希望整个页面跳转也可以改成返回redirect:/travel/result?idxxx。两种方式各有优点。Ajax 方式用户体验好页面不用刷新页面跳转方式更容易在答辩时说明数据流转过程。新手我建议先用页面跳转方式做通再改成 Ajax 优化。5. Thymeleaf 页面渲染怎么组织5.1 模板文件结构Thymeleaf 模板文件统一放在src/main/resources/templates下。可以按页面类型拆分目录templates ├── index.html ├── user │ ├── login.html │ └── register.html ├── weather │ └── query.html ├── travel │ └── advice.html ├── admin │ ├── user_list.html │ ├── weather_list.html │ └── advice_list.html └── common ├── header.html └── footer.htmlheader.html和footer.html是公共片段通过 Thymeleaf 的th:replace引入到其他页面。这样改导航栏时不用逐个页面修改也能让代码更整洁。5.2 天气查询页面的渲染逻辑天气查询页面就是一个典型的数据展示页面。Controller 从 Service 拿到天气数据后放入 Model页面通过 Thymeleaf 表达式取值。div classcard h3 th:text${weather.cityName}城市/h3 p 天气状况span th:text${weather.condition}晴/span /p p 温度span th:text${weather.temperature} ℃26℃/span /p p 湿度span th:text${weather.humidity} %60%/span /p p 风力span th:text${weather.windPower}3级/span /p p 更新时间span th:text${#temporals.format(weather.updateTime, yyyy-MM-dd HH:mm:ss)}/span /p /div这里要特别注意如果你的实体字段是updateTime数据库字段是update_time那么只需要在 MyBatis 配置中开启mybatis: configuration: map-underscore-to-camel-case: true就可以自动完成字段映射。如果不配置查询结果会出现updateTime为 null 的问题。5.3 AI 出行建议页面交互出行建议页面包含一个表单用户填写出发城市、目的城市、出行日期、出行方式。表单提交后后端返回建议内容。页面可以直接展示返回的文本。如果你希望展示效果更好可以和前端代码配合把建议内容按换行切分或者让 AI 返回 Markdown 格式在页面用简单的 JS 渲染。不过对于 Thymeleaf 项目我建议保持简单让 AI 返回纯文本即可页面用pre或white-space: pre-wrap样式展示。如果要做历史记录展示可以在页面下面加一个“历史建议记录”列表。列表数据来自当前用户的历史travel_advice记录按时间倒序展示。这块逻辑同样是简单的数据库查询不需要额外复杂度。6. 单条流程跑通之后再处理批量和权限6.1 从最小功能开始验证很多同学一拿到项目就想着把所有页面都写完再一次性启动验证。这个顺序最容易出问题。我建议按以下顺序开发先建 Spring Boot 项目能启动一个空首页。配置数据库连接跑通用户注册和登录。接入天气 API能通过一个测试接口返回天气 JSON。把天气查询页面用 Thymeleaf 渲染出来。再接入 AI 接口先写一个测试方法确认接口调用和返回解析没问题。完成出行建议页面和记录保存功能。最后做后台管理和数据统计。每完成一步都启动一次项目验证。等所有模块都跑通了再做美化。这样开发过程中报错范围小定位也快。6.2 用户权限怎么控制既然是毕设系统建议至少区分用户和管理员两种角色。最简单的方式是用户表中增加role字段值可以是USER或ADMIN。登录成功后将用户信息存储到 Session。后端在进入管理员页面之前检查当前登录用户角色。如果是管理员正常访问如果不是管理员跳转回首页。Spring Boot 中可以使用拦截器实现也可以直接在每个后端 Controller 方法中判断。对于毕设来说拦截器是更规范的方式。Component public class AdminInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object user request.getSession().getAttribute(loginUser); if (user null) { response.sendRedirect(/user/login); return false; } return true; } }然后注册到 WebConfig 中并指定拦截路径。比如/admin/**。Configuration public class WebConfig implements WebMvcConfigurer { Autowired private AdminInterceptor adminInterceptor; Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(adminInterceptor) .addPathPatterns(/admin/**) .excludePathPatterns(/user/login, /user/register); } }这套逻辑虽然简单但已经覆盖了“权限控制”这个知识点在论文中可以写成一节。6.3 批量数据怎么处理如果你需要在后台批量导入城市天气数据或者批量生成多城市出行建议就涉及到批量任务设计了。此时不能简单使用 for 循环加接口调用原因有几个第三方天气接口通常有访问频率限制频繁请求会报错。AI 接口调用耗时较长单条建议可能要几秒批量调用会让浏览器长时间等待。大量请求同时发出可能导致连接池耗尽。稳妥的批量处理方式有两种。第一种前台循环调用单条接口用户可以逐个查看结果。这种方式实现简单适合演示。第二种后台创建批量任务前端提交任务队列后端异步执行。执行完成后再把结果批量展示。这种方式更接近真实项目但实现成本高一些。对于毕设来说我建议先实现第一种。如果时间允许再在后台管理模块中实现“导入城市列表异步获取天气”功能。论文中可以写系统支持任务式批量更新通过线程池控制并发数量避免触发接口频率限制。Configuration public class TaskPoolConfig { Bean(taskExecutor) public Executor taskExecutor() { ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor(); executor.setCorePoolSize(2); executor.setMaxPoolSize(4); executor.setQueueCapacity(100); executor.setKeepAliveSeconds(60); executor.setThreadNamePrefix(task-); executor.initialize(); return executor; } }核心线程数不要设置太高。本地开发环境 CPU 有限并发过高反而会导致任务排队时间变长。这里给的是通用示例具体参数以你的环境和接口限制为准。7. 常见问题排查先看日志再看参数7.1 项目启动失败启动失败时首先要分清是端口占用、数据库连接失败还是依赖冲突。端口占用报错信息通常包含Port already in use。解决方式是关闭占用进程或改server.port。数据库连接失败报错信息通常包含Access denied或Unknown database。检查用户名、密码、数据库名是否正确。依赖冲突报错信息通常包含ClassNotFoundException或NoSuchMethodError。优先检查 Spring Boot 父版本和各依赖版本是否匹配。启动类直接SpringBootApplication就可以了。注意启动类要放在所有 Controller 和 Service 包的父级目录下否则组件扫描不到。7.2 页面能打开但数据为空页面能正常渲染说明路由和模板没问题。数据为空优先排查三层Controller 里是否把数据放进了 Model且属性名和页面th:text对应。Service 是否返回了 null可能是查询条件不对。数据库是否存在对应记录可能是城市名不匹配。这里最容易被忽略的是编码问题。城市名称在 URL 传递时如果前后端编码不一致数据库查不到对应记录页面就会显示为空。建议在 Spring Boot 中显式配置编码过滤器。Bean public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter new CharacterEncodingFilter(); filter.setEncoding(UTF-8); filter.setForceEncoding(true); return filter; }另外在application.yml中配置数据库连接时加上characterEncodingutf8可以避免中文乱码。7.3 AI 接口调用报错AI 接口报错一般集中在几个方面API Key 无效。检查是否填对是否有空格。请求格式不正确。不同模型对参数名要求不同比如有的要求messages有的要求prompt。一定按实际接口文档构造请求体。响应解析失败。大模型返回的 JSON 中存在额外字段或流式返回方式不同。超时。模型推理时间较长默认超时时间不够可以在 RestTemplate 中设置超时时长。对于超时问题建议单独编写一个方法测试 AI 接口避免被页面流程干扰。GetMapping(/test-ai) ResponseBody public String testAi(RequestParam String prompt) { return adviceService.callAiApi(prompt); }通过这个测试接口可以先确认 AI 调用本身是否正常再回到业务页面调试。7.4 页面样式和静态资源加载不出来Thymeleaf 项目如果静态资源放在static目录并且模板中使用相对路径通常不会有大问题。如果出现资源加载不出来检查模板里是否用了类似th:href{/css/style.css}的写法。在后端渲染页面中尽量使用{}表达式引用静态资源它会自动拼接项目上下文路径。不要用硬编码绝对路径否则项目部署到子目录时会失效。8. 毕业论文、PPT 和答辩讲解怎么组织8.1 论文结构框架拿到这个题目论文结构可以按以下目录来写整体逻辑是标准的“提出问题、分析问题、解决问题、验证结果”绪论研究背景与意义国内外研究现状主要研究内容论文组织结构相关技术介绍Spring Boot 框架Thymeleaf 模板引擎MyBatis 持久层框架AI 大模型接口服务系统分析可行性分析需求分析功能需求分析非功能需求分析系统设计系统总体架构设计功能模块设计数据库设计接口设计系统实现用户模块实现天气查询模块实现AI 出行建议模块实现后台管理模块实现系统测试测试环境功能测试性能测试测试结果分析总结与展望这套结构中第 4 章和第 5 章是重点。第 4 章主要画图包括系统架构图、功能结构图、E-R 图、数据库表结构图、时序图。第 5 章要配合核心代码截图和页面截图来说明实现过程。8.2 PPT 制作要点PPT 不需要把代码全部贴进去而是突出三部分系统解决了什么问题。系统用什么技术实现。系统实际运行效果如何。建议准备 15 到 20 页结构如下封面页项目名称、技术栈。目录页。背景与意义为什么要做智能天气出行系统。技术选型为什么选 Spring Boot、Thymeleaf、AI 接口。需求分析用户需求和管理员需求。系统功能结构图。系统总体架构图。核心功能流程图。数据库设计核心表结构和关系。用户模块展示。天气查询页面展示。AI 出行建议页面展示。管理后台页面展示。核心代码说明。系统测试结果。项目总结与改进方向。PPT 里的页面截图建议使用统一的浏览器分辨率并把地址栏信息截进去这样更有真实感。尽量多截操作前后的对比图比如查询前和查询后。8.3 答辩时容易被问到的问题根据以往经验答辩老师通常会围绕以下角度提问天气数据是怎么获取的缓存策略是什么AI 建议是怎么生成的Prompt 是怎么设计的为什么选择 Thymeleaf 而不是 Vue用户权限是怎么控制的系统有哪些安全性考虑如果第三方接口不可用系统如何处理系统的性能和扩展性怎么样针对第三方接口不可用这个问题你可以在系统中增加异常处理。接口失败时返回固定提示并读取数据库最近一次缓存记录。这样即使外部服务异常页面也不会直接白屏。ExceptionHandler(Exception.class) ResponseBody public Result handleException(Exception e) { log.error(系统异常, e); return Result.error(服务暂时不可用请稍后重试); }这个全局异常处理是加分项能体现你的工程意识。8.4 需求文档和操作手册怎么补题目中带着 LW说明还需要写一份完整的设计文档。设计文档可以看作是论文的扩展版重点描述系统从需求到设计再到实现的完整过程。除了需求文档建议再补一份操作说明文档包含系统启动步骤。默认管理员账号。每个页面的操作说明。常见问题说明。操作说明文档虽然简单但在答辩现场会被老师翻阅也是完整度的一个重要体现。如果你不想写太多按“启动、登录、查询、使用出行建议、进入后台管理”这五步来写就足够了。写在最后这种基于 Spring Boot Thymeleaf AI 的毕设项目真正的难点不在某个单点技术而是如何把天气查询、AI 建议、用户管理、页面渲染串成一个完整业务闭环。只要按照“先跑通单条链路再扩展功能模块最后完善文档”的顺序来做整个过程会顺利很多。我个人更建议你先把核心链路做扎实用户登录、天气查询、AI 出行建议、记录展示。这四个功能运行稳定之后再补后台管理和界面美化。很多出问题的项目不是技术选型不对而是前期想一步到位后面被一堆小问题拖住。最后再提醒一遍天气 API 和 AI 接口的文档永远要比网上任何示例代码都优先。以实际返回为准以官方文档为准。把输入的格式字段、请求方式、返回结构都对齐这套系统就能稳定落地。
返回列表