
简介本资源是一套基于SpringBoot开发的厨艺交流平台完整毕业设计源码面向计算机科学与技术、软件工程等专业的本科毕业生及Java初学者解决烹饪爱好者线上互动、菜谱分享与技术实践结合的实际需求。压缩包共921个文件涵盖186个Java后端业务类含Controller、Service、Mapper、62个Vue前端组件如IndexHeader.vue、update-password.vue.bak等、153个JS交互逻辑、64个HTML页面及83个GIF动图资源辅以SQL建表脚本、YML配置、BAT启动脚本和README.md说明文档整体26.37MB结构完整、模块清晰便于理解MVC分层与前后端分离实现。已有45人学习下载适合课程设计、毕设开题与SpringBoot全栈开发入门实践。读者可直接运行调试掌握用户管理、菜谱发布、评论交互、搜索功能等核心模块的代码实现并通过.bak备份文件对比学习版本迭代与开发规范。1. 这不是又一个“用户发帖评论”的厨艺平台而是用 Spring Boot 把烹饪知识结构化、可检索、能复用的工程实践你打开一个「厨艺交流平台」的毕设代码包看到build.bat和run.bat第一反应可能是这又是个 CRUD 堆出来的论坛式系统但真正跑起来会发现——菜谱不是简单存成文本而是按「食材组合」「火候区间」「适用厨具」「失败预警点」做了字段级建模用户上传的做菜视频被自动截帧提取关键步骤图并关联到对应步骤的文本描述甚至「盐少许」「大火烧开」这类模糊表达在后端被统一映射为可配置的量化范围如盐0.5–1.2g/100g主料大火灶具热功率 ≥1800W。这不是为了炫技而是解决真实场景里「同样一道红烧肉十个人有十种理解」带来的知识不可复用问题。本项目面向的是需要交付可运行、可维护、可扩展 Java 后端的毕业设计者、初级全栈开发者以及想把线下烹饪经验沉淀为数字资产的餐饮培训团队。它不依赖前端框架耦合所有接口按 RESTful 规范设计application.yml中的数据库连接、文件存储路径、敏感词过滤规则全部外置可配——这意味着你能把它嵌入现有企业内网系统也能快速对接小程序或 Vue 管理后台。2. 用 Spring Boot 3.1 MyBatis-Plus 搭建厨艺知识模型的最小可行骨架2.1 为什么选 Spring Boot 3.1 而非 2.x 或 3.2Spring Boot 3.1 是当前 LTS 版本中兼容性与新特性平衡最好的选择它原生支持 Jakarta EE 9避免javax.*包冲突内置 GraalVM 原生镜像构建能力后续可导出轻量级app.exe且对 JDK 17 的支持已趋稳定。更重要的是3.1.0 到 3.1.12 的小版本迭代中spring-boot-starter-web对Valid校验异常的默认处理逻辑更符合厨艺场景需求——比如当用户提交「腌制时间」为负数时返回的400 Bad Request响应体自动包含field: marinadeTime, message: 腌制时间不能小于0分钟无需额外写全局异常处理器。而 Spring Boot 3.2 引入的虚拟线程Virtual Threads在厨艺平台这种 I/O 密集型但并发峰值不超 500 QPS 的场景下收益有限反而增加 JDK 21 兼容性风险Spring Boot 2.7.x 则因停止维护无法获取spring-boot-starter-validation的最新漏洞修复如 CVE-2023-34035 关于正则校验的 DoS 风险。提示若你的开发环境仍为 JDK 8必须降级至 Spring Boot 2.7.18 并手动排除hibernate-validator6.2.5.Final 以上版本否则Email校验可能因正则引擎差异导致「邮箱格式正确却报错」。2.2 厨艺核心实体建模从「菜谱」到「烹饪动作原子」的三层拆解传统毕设常把「菜谱」建为单表字段包括title,content,img_url。本项目采用三层建模法确保知识可检索、可组合、可验证层级实体名关键字段设计意图示例值L1 菜谱层Recipeid,name,difficulty,cooking_time_min,calorie_kcal定义菜品宏观属性红烧肉,中等,65,320L2 步骤层Stepid,recipe_id,order_num,description,heat_level,duration_sec拆解为可执行动作序列焯水去腥,中火,120L3 原子层ActionAtomid,step_id,ingredient_name,quantity,unit,tool_required绑定具体物料与工具姜片,5,克,炒锅这种设计让「搜索『不用高压锅的红烧肉做法』」成为可能SQL 查询只需SELECT * FROM step s JOIN action_atom a ON s.id a.step_id WHERE s.recipe_id ? AND a.tool_required ! 高压锅。MyBatis-Plus 的TableName和TableField注解直接映射上述结构无需 XML 配置。2.2.1 实体类代码与关键注解说明// src/main/java/com/example/cook/model/Recipe.java Data TableName(recipe) public class Recipe { TableId(type IdType.ASSIGN_ID) private Long id; TableField(name) NotBlank(message 菜谱名称不能为空) private String name; TableField(difficulty) Range(min 1, max 5, message 难度值必须在1-5之间) private Integer difficulty; TableField(cooking_time_min) Min(value 1, message 烹饪时间至少1分钟) private Integer cookingTimeMin; // 注意TableField 显式声明字段名避免驼峰转下划线时出错如 cookingTimeMin → cooking_time_min }注意TableField必须显式标注所有字段因为厨艺平台中step表的heat_level字段在数据库中是TINYINT类型而 Java 实体类用String存储值为小火|中火|大火若不加TableFieldMyBatis-Plus 默认按heatLevel推导列名为heat_level但实际需映射到heat_level_desc列——此处通过TableField(heat_level_desc)强制指定。2.3build.bat与run.bat的真实作用绕过 IDE 依赖的本地部署链很多学生误以为build.bat只是mvn clean package的快捷方式。实际上本项目的build.bat包含三阶段校验JDK 版本检查java -version | findstr 17\|21失败则提示「请安装 JDK 17 或 21」Maven 仓库完整性验证mvn dependency:resolve -DincludeGroupIdsorg.springframework.boot,com.baomidou,mysql确保核心依赖已下载Profile 激活控制mvn clean package -Pprod -DskipTests强制使用prodprofile 打包避免开发配置泄露。而run.bat的核心逻辑是echo off set JAVA_HOMEC:\Program Files\Java\jdk-17.0.1 set PATH%JAVA_HOME%\bin;%PATH% java -Dspring.profiles.activedev -Dfile.encodingUTF-8 -Xmx512m -jar target/cook-platform-0.0.1-SNAPSHOT.jar pause其中-Xmx512m是关键厨艺平台需加载图片缩略图缓存和分词词典内存设为 512MB 是经实测的最低阈值若设为-Xmx256m启动时ImageIO.read()会抛OutOfMemoryError设为-Xmx1024m则在 4GB 内存笔记本上导致系统卡顿。pause命令保留控制台窗口方便查看HikariCP连接池初始化日志。3. 用application-dev.yml实现厨艺数据的可插拔式配置管理3.1 数据库连接池参数针对高图片读取频次的 HikariCP 调优厨艺平台每页列表需加载 12 张菜谱缩略图对应 12 次SELECT * FROM recipe WHERE status1 LIMIT 12查询。默认 HikariCP 配置maximumPoolSize10在并发 20 用户时会出现连接等待。application-dev.yml中的关键调优如下spring: datasource: hikari: # 厨艺场景特点读多写少单次查询耗时稳定50ms但图片字段BLOB增大网络传输压力 maximum-pool-size: 20 minimum-idle: 5 # 连接空闲 30 分钟才回收避免频繁创建销毁连接MySQL 默认 wait_timeout28800秒 idle-timeout: 1800000 # 测试 SQL 改为 SELECT 1而非默认的 /* ping */降低 MySQL 服务器负载 connection-test-query: SELECT 1 # 启用 PreparedStatement 缓存加速重复菜谱查询如首页轮播图固定5个 cache-prep-stmts: true prep-stmt-cache-size: 250 prep-stmt-cache-sql-limit: 2048提示prep-stmt-cache-sql-limit设为 2048 是因厨艺平台中「按食材搜索」的 SQL 动态拼接长度常达 1500 字符如WHERE ingredient_list LIKE %五花肉% AND ingredient_list LIKE %冰糖% AND ...低于此值会导致缓存失效。3.2 文件存储策略本地路径 vs 云存储的无缝切换菜谱图片、用户头像、教学视频封面图均通过FileStorageService统一管理。application-dev.yml中定义# 本地开发用绝对路径避免相对路径导致 Windows/Linux 路径分隔符错误 file: storage: type: local local: base-path: D:/cook-platform/uploads/ # 若切换为阿里云 OSS只需改 type: oss 并补充以下配置 # oss: # endpoint: https://oss-cn-hangzhou.aliyuncs.com # bucket-name: cook-platform-prod # access-key-id: your-access-key # access-key-secret: your-secret-keyFileStorageService接口实现类通过 Spring Profile 自动注入Service ConditionalOnProperty(name file.storage.type, havingValue local) public class LocalFileStorageService implements FileStorageService { ... } Service ConditionalOnProperty(name file.storage.type, havingValue oss) public class AliyunOssStorageService implements FileStorageService { ... }这样run.bat启动时加-Dspring.profiles.activeprod即可自动启用 OSS 实现无需修改任何业务代码。3.3 敏感词过滤模块基于 HanLP 的轻量级厨艺专用词典厨艺交流中常见「酱油」「料酒」「味精」等词需保留但「罂粟壳」「工业盐」必须拦截。项目未用重量级 NLP 框架而是集成hanlp-liteHanLP 2.1 的精简版其CoreDictionary可动态加载自定义词典# application-dev.yml hanlp: # 指向 resources/dict/cook_sensitives.txt每行一个词支持正则如 .*罂粟.* sensitive-dict-path: classpath:dict/cook_sensitives.txt # 开启模糊匹配用户输入「婴粟壳」也能命中「罂粟壳」 fuzzy-match: true # 厨艺词典优先级高于通用词典避免「盐」被误判为敏感词 priority-order: [cook, common]cook_sensitives.txt内容示例# 厨艺专用敏感词UTF-8编码无BOM 罂粟.* 工业盐 甲醛.* 地沟油调用代码Component public class SensitiveWordFilter { Autowired private Segment segment; // HanLP 分词器 public boolean containsSensitive(String text) { ListTerm terms segment.seg(text); return terms.stream() .anyMatch(term - term.word.matches(.*罂粟.*|.*工业盐.*)); // 实际走 hanlp 配置的词典匹配 } }4.run.bat启动后必查的 5 个健康端点与典型故障定位4.1/actuator/health不只是「UP/DOWN」要看组件级状态访问http://localhost:8080/actuator/health返回{ status: UP, components: { db: {status: UP, details: {database: MySQL, validationQuery: SELECT 1}}, diskSpace: {status: UP, details: {total: 500000000000, free: 200000000000}}, redis: {status: DOWN, details: {error: io.lettuce.core.RedisConnectionException}} } }注意redis状态为DOWN是预期行为——本项目未启用 Redis 缓存application-dev.yml中spring.redis.host为空Actuator 自动检测失败。这不是故障而是配置正确性的证明。若db显示DOWN则检查application-dev.yml中spring.datasource.url是否包含useSSLfalseserverTimezoneAsia/ShanghaiMySQL 8.0 必须添加。4.2/actuator/mappings验证 REST 接口是否按约定注册搜索/api/recipe确认存在以下映射POST /api/recipe (com.example.cook.controller.RecipeController.addRecipe) GET /api/recipe/{id} (com.example.cook.controller.RecipeController.getRecipeById) GET /api/recipe/search (com.example.cook.controller.RecipeController.searchByIngredient)若searchByIngredient未出现检查RecipeController是否遗漏RequestMapping(/api/recipe)或GetMapping(/search)的params属性是否误写为params q应为params ingredient。4.3/actuator/env揪出被覆盖的配置项当file.storage.local.base-path在application-dev.yml中设为D:/uploads/但上传文件却出现在C:\temp\时访问/actuator/env搜索base-path查看propertySources中commandLineArgs是否有-Dfile.storage.local.base-pathC:/temp/——这说明run.bat中java命令误加了系统属性覆盖。4.4/actuator/threaddump诊断「页面加载慢」的根源若点击「热门菜谱」列表响应超 5 秒执行jstack pid或访问/actuator/threaddump重点关注http-nio-8080-exec-*线程栈若大量线程阻塞在com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal说明数据库查询未走索引需为recipe.status和step.order_num添加复合索引若线程停在sun.awt.shell.Win32ShellFolderManager2.getDisplayName则是 Windows 系统图标加载导致仅开发环境在application-dev.yml中添加spring.main.allow-bean-definition-overridingtrue并禁用ShellFolder相关 Bean。4.5/actuator/logfile实时追踪图片上传失败原因上传图片返回500 Internal Server Error时直接访问/actuator/logfile需在application-dev.yml中启用management.endpoint.logfile.showtrue查找关键词ImageIO.read。常见错误javax.imageio.IIOException: Cant read input file!→D:/cook-platform/uploads/目录不存在或权限不足Windows 下需右键目录→属性→安全→添加Users组的「写入」权限java.lang.OutOfMemoryError: Java heap space→run.bat中-Xmx值过小按 1 张 2MB 图片 × 10 并发 ≈ 20MB建议设为-Xmx512m。5. 厨艺平台特有的 3 个生产就绪技巧从毕设到真实部署的平滑过渡5.1 用banner.txt生成带「锅铲」ASCII 图标的启动横幅src/main/resources/banner.txt不是装饰而是运维识别服务的关键标识。本项目采用自定义 ASCII 锅铲图案██████╗ ██████╗ ███╗ ██╗███████╗██████╗ ██╗ ██╗███████╗██████╗ ██╔════╝██╔═══██╗████╗ ██║██╔════╝██╔══██╗██║ ██║██╔════╝██╔══██╗ ██║ ██║ ██║██╔██╗ ██║█████╗ ██████╔╝██║ ██║█████╗ ██████╔╝ ██║ ██║ ██║██║╚██╗██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██╔══╝ ██╔══██╗ ╚██████╗╚██████╔╝██║ ╚████║███████╗██║ ██║ ╚████╔╝ ███████╗██║ ██║ ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝ 厨艺交流平台 v0.0.1生成方法访问https://www.network-science.de/ascii/上传锅铲 PNG选择Font: Courier New,Width: 80,Height: 12复制结果保存为banner.txt。Spring Boot 启动时自动读取比默认文字横幅更能体现项目领域特征。5.2build.bat中嵌入数据库初始化脚本校验避免「代码跑通但数据库表缺失」的毕设答辩尴尬。build.bat在mvn package后追加:: 检查 target/classes/schema.sql 是否存在且非空 if not exist target\classes\schema.sql ( echo ERROR: 数据库初始化脚本 schema.sql 未生成 pause exit /b 1 ) for %%a in (target\classes\schema.sql) do if %%~za 0 ( echo ERROR: schema.sql 文件为空请检查 resources 目录结构 pause exit /b 1 )schema.sql位于src/main/resources/内容包含-- 厨艺平台基础表结构MySQL 8.0 CREATE TABLE IF NOT EXISTS recipe ( id bigint NOT NULL AUTO_INCREMENT, name varchar(100) NOT NULL COMMENT 菜谱名称, difficulty tinyint NOT NULL DEFAULT 3 COMMENT 难度等级1-5, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;5.3 用ConfigurationProperties统一管理厨艺业务规则参数将「盐用量范围」「焯水温度阈值」等业务规则从硬编码移至配置文件便于后期调整ConfigurationProperties(prefix cook.rule) Data public class CookRuleProperties { // 单位克/100克主料 private BigDecimal saltMin new BigDecimal(0.3); private BigDecimal saltMax new BigDecimal(1.5); // 单位摄氏度 private Integer blanchingTempMin 85; private Integer blanchingTempMax 95; }application-dev.yml中cook: rule: salt-min: 0.3 salt-max: 1.2 blanching-temp-min: 85 blanching-temp-max: 92在RecipeService中注入并使用Service public class RecipeService { Autowired private CookRuleProperties cookRule; public void validateSaltAmount(BigDecimal amount, BigDecimal mainWeight) { BigDecimal per100g amount.multiply(new BigDecimal(100)).divide(mainWeight, 2, RoundingMode.HALF_UP); if (per100g.compareTo(cookRule.getSaltMin()) 0 || per100g.compareTo(cookRule.getSaltMax()) 0) { throw new IllegalArgumentException(盐用量超出合理范围 cookRule.getSaltMin() - cookRule.getSaltMax() 克/100克主料); } } }这样答辩老师问「如果要调整盐的推荐用量改哪里」时你只需指向application-dev.yml中的cook.rule.salt-max行而非翻找 Java 代码里的魔法数字。本文还有配套的精品资源点击获取