简介这是一套面向计算机专业本科生的Java毕设实战项目聚焦高考志愿填报场景解决考生信息获取碎片化、推荐匹配粗放、模拟决策缺乏数据支撑等现实痛点。资源完整包含SpringBoot后端135个Java文件、Vue前端99个Vue文件、爬虫模块8个Python脚本及Scrapy配置、知识图谱数据处理逻辑、MBTI性格测试集成及MySQL建库SQL脚本配套毕业论文、答辩PPT与详细说明文档。压缩包共671个文件含SVG图标、JPG/PNG素材、JS/CSS/HTML前端资源、YML配置及BAT一键启停脚本等结构清晰前后端分离明确总大小34.56MB。已有87人学习下载开箱即用——提供可直接运行的完整工程含Tomcat7JDK1.8环境适配、爬虫数据采集流程含中国教育在线录取数据抓取、知识图谱构建思路与智能推荐算法实现逻辑是理解教育类AI应用落地的优质教学案例。1. 这套高考志愿推荐系统装到第3遍才跑通SpringBoot 2.x Vue 2.x MySQL 5.7 的毕设环境新手最容易在 JDK 和前端构建上翻车你不是一个人在崩溃。某高校计算机系A同学在答辩前一周反复重装环境——后端报UnsupportedClassVersionError前端npm run build卡死在node-sass编译爬虫模块直接提示ModuleNotFoundError: No module named scrapy。这不是代码问题是环境没对齐。这套「基于爬虫的高考志愿智能推荐系统」本质是个典型的前后端分离毕设项目后端用 SpringBoot 2.x注意不是 3.x前端用 Vue 2.x非 Vue 3数据库锁定 MySQL 5.7非 8.0而所有脚本.bat文件都默认指向 JDK 1.8、Node.js 14.x、Python 3.7 —— 任何一个版本越界整个项目就变成黑匣子。它适合两类人一是大三下刚学完 Java Web 和基础前端、需要快速交付毕设的本科生二是想练手真实业务链路爬虫→数据清洗→知识图谱建模→推荐算法→前后端联调的自学开发者。别被“智能推荐”“知识图谱”唬住核心逻辑就藏在spider/下的 Scrapy 爬虫和springboot2a1qfv22/src/main/java/com/example/recommend/algorithm/里的几个匹配函数里。装不起来90% 是 JDK、Node、Python 版本没卡死剩下 10% 是.bat脚本里硬编码的路径没改。下面我们从零开始把这堆.bat文件、.cfg配置、build.bat和run.bat全部掰开揉碎让你一次配通。2. 环境底座JDK 1.8、MySQL 5.7、Node.js 14.x、Python 3.7 四件套精准安装与验证这套系统不是“能跑就行”而是“必须按文档锁死版本”。SpringBoot 2.x 官方最低要求 JDK 1.8但如果你装了 JDK 17mvn compile会直接报错java.lang.UnsupportedClassVersionError: com/example/Application has been compiled by a more recent version of the Java RuntimeVue CLI 3.x本项目front/目录下package.json中vue-cli-service: ^3.12.1明确要求 Node.js ≥ 10.13.0 且 15.0.0装了 Node 16 就会在npm install时卡在fsevents编译Scrapy 1.8scrapy.cfg中[settings]指向spider.settings依赖 Twisted而 Twisted 20.3.0 是最后一个支持 Python 3.7 的版本——装 Python 3.9pip install scrapy会静默失败。这不是玄学是 Maven、npm、pip 三方生态的版本契约。2.1 JDK 1.8 安装必须用 1.8.0_3XX不能用 OpenJDK路径禁含空格和中文从 Oracle 官网归档页下载jdk-8u391-windows-x64.exe2023年10月发布的最后一个免费更新版兼容性最稳。不要用 Adoptium 或 Amazon Corretto 的 OpenJDK 8本项目pom.xml中java.version1.8/java.version绑定的是 Oracle JDK 字节码规范OpenJDK 在部分反射调用如admin/src/main.js.bak中对DateUtil的调用会触发NoSuchMethodError。安装时务必自定义路径为C:\Java\jdk1.8.0_391不能是C:\Program Files\Java\...空格会导致3-build.bat中set JAVA_HOMEC:\Program Files\Java\jdk1.8.0_391解析失败。安装完毕后打开 CMD 执行set JAVA_HOMEC:\Java\jdk1.8.0_391 set PATH%JAVA_HOME%\bin;%PATH% java -version提示输出必须为java version 1.8.0_391若显示1.8.0_XXX其他数字说明系统残留旧 JDK需在「系统属性 → 高级 → 环境变量」中彻底删除JAVA_HOME和Path里的旧路径。2.2 MySQL 5.7 安装用 ZIP 包免安装版跳过服务注册Navicat 连接要关 strict mode官网下载mysql-5.7.44-winx64.zip5.7 最终版比 5.7.39 更稳定。解压到C:\MySQL\mysql-5.7.44-winx64新建my.ini放入根目录内容如下[mysqld] port3306 basedirC:/MySQL/mysql-5.7.44-winx64 datadirC:/MySQL/mysql-5.7.44-winx64/data max_connections200 character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci sql_modeSTRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION # 关键注释掉这一行或改为 OFF否则 Navicat 导入 mysql.sql 时会因 datetime 默认值报错 # sql_modeSTRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION [client] default-character-setutf8mb4然后以管理员身份运行 CMD执行cd C:\MySQL\mysql-5.7.44-winx64\bin mysqld --initialize-insecure --usermysql mysqld --install MySQL57 --defaults-fileC:\MySQL\mysql-5.7.44-winx64\my.ini net start MySQL57 mysql -u root -p # 初始密码为空直接回车进入 MySQL 后执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123456; FLUSH PRIVILEGES;逻辑说明--initialize-insecure生成空密码 root 用户避免初始化密码丢失sql_mode中NO_ZERO_DATE等规则在本项目student_score表的enroll_time字段类型datetime插入0000-00-00 00:00:00时会触发错误必须关闭 strict mode。2.3 Node.js 14.x 与 Python 3.7 安装用 nvm-windows 和 pyenv-win 锁版本拒绝全局污染Node.js 必须用nvm-windowshttps://github.com/coreybutler/nvm-windows/releases安装而非直接下.msi。因为项目front/和admin/两个前端工程共存admin/依赖vue-cli-service3.12.1Node 14而front/的package.json中node-sass: ^4.14.1只支持 Node ≤ 14.19。用 nvm 可随时切换# 安装 nvm-windows 后 nvm install 14.21.3 nvm use 14.21.3 node -v # 必须输出 v14.21.3 npm -v # 必须输出 6.14.18Python 同理用pyenv-winhttps://github.com/pyenv-win/pyenv-winpyenv install 3.7.17 pyenv global 3.7.17 python --version # 必须输出 3.7.17 pip install --upgrade pip pip install scrapy1.8.0 twisted20.3.0参数说明scrapy1.8.0是最后一个支持 Python 3.7 的正式版twisted20.3.0是其硬依赖高版本会报ModuleNotFoundError: No module named zope.interfacepip install后必须验证scrapy version输出1.8.0否则爬虫模块spider\运行.bat会闪退。3. 后端启动SpringBoot 2.x 项目结构解析、Maven 依赖修复与 Tomcat 7 嵌入式配置项目后端位于springboot2a1qfv22/目录这是一个标准的 Maven 多模块结构springboot2a1qfv22是父 POMspringboot2a1qfv22/recommend是主模块含Application.javaspringboot2a1qfv22/spider-api是爬虫数据接口模块。但原始压缩包里的pom.xml存在三处致命缺陷一是spring-boot-starter-parent版本写成2.7.18实际应为2.3.12.RELEASE因spring-boot-starter-web依赖tomcat-embed-core9.0.x而 Tomcat 7 要求 Servlet 3.1必须降级二是 MySQL 驱动用mysql-connector-java:8.0.28不兼容 MySQL 5.7 的caching_sha2_password认证必须回退到5.1.49三是mybatis-spring-boot-starter版本2.2.2与 SpringBoot 2.3.x 不兼容需锁定2.1.5。3.1 修复pom.xml三处关键降级否则mvn clean package必失败打开springboot2a1qfv22/pom.xml定位以下位置并修改!-- 父POM版本必须改为 2.3.12.RELEASE -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.3.12.RELEASE/version relativePath/ /parent!-- MySQL驱动必须用 5.1.498.x 驱动连不上 MySQL 5.7 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope version5.1.49/version /dependency!-- MyBatis Starter2.2.x 依赖 SpringBoot 2.4此处必须锁 2.1.5 -- dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.1.5/version /dependency保存后在springboot2a1qfv22/目录下执行mvn clean compile -Dmaven.test.skiptrue逻辑说明-Dmaven.test.skiptrue跳过单元测试因recommend/src/test/下的TestRecommendService.java依赖未 mock 的KnowledgeGraphService会编译失败compile阶段成功即证明依赖树已拉平此时target/classes/下应有完整的application.yml和mapper/XML 文件。3.2application.yml配置数据库、Redis、爬虫路径三处必改项原始springboot2a1qfv22/src/main/resources/application.yml中spring.datasource.url默认为jdbc:mysql://localhost:3306/gaokao?useUnicodetruecharacterEncodingutf-8serverTimezoneGMT%2B8但 MySQL 5.7 需显式指定useSSLfalse否则连接超时spring.redis.host默认127.0.0.1但本项目未集成 Redis必须注释掉整段spring.redis配置否则启动时报Cannot connect to redisspider.path默认D:/spider/需改为你的实际路径如C:/project/java-gaokao/spider/这是RecommendController.java中调用Runtime.getRuntime().exec()启动爬虫的依据。修改后关键段落spring: datasource: url: jdbc:mysql://localhost:3306/gaokao?useUnicodetruecharacterEncodingutf-8serverTimezoneGMT%2B8useSSLfalse username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver # 注释掉以下整段 # spring: # redis: # host: 127.0.0.1 # port: 6379 # database: 0 spider: path: C:/project/java-gaokao/spider/3.3 启动后端用mvn spring-boot:run替代1-install.bat避开 bat 脚本路径陷阱原始springboot2a1qfv22/src/main/resources/admin/1-install.bat内容为cd .. cd .. mvn clean install -Dmaven.test.skiptrue pause此脚本在 IDEA 中右键运行会因工作目录错乱cd ..多次导致pom.xml not found。正确做法是在springboot2a1qfv22/目录下用命令行执行mvn spring-boot:run -Dspring-boot.run.profilesdev其中-Dspring-boot.run.profilesdev激活application-dev.yml若存在该文件通常配置 H2 内存库用于开发但本项目未提供故实际走application.yml。启动成功标志是日志末尾出现Tomcat started on port(s): 8080 (http) with context path Started Application in 8.234 seconds (JVM running for 9.123)注意若看到Failed to configure a DataSource说明application.yml中spring.datasource配置有误若卡在Starting service [Tomcat]检查server.port8080是否被占用可临时改为8081。4. 前端构建Admin 后台与 Front 考生端双 Vue 2.x 工程独立编译与 Nginx 代理配置项目包含两个前端工程admin/基于 Vue CLI 3 的后台管理地址http://localhost:8080/admin和front/基于 Vue CLI 3 的考生门户地址http://localhost:8080。它们共享同一套后端 API/api/**但路由完全隔离。原始admin/和front/目录下的build.bat和run.bat脚本存在路径硬编码问题run.bat中cd /d D:\admin会强制跳转到 D 盘若你解压在 C 盘则直接失败。必须手动修正。4.1 Admin 后台admin/目录下npm install后用npm run serve启动开发服务器进入springboot2a1qfv22/src/main/resources/admin/admin/目录注意是两层admin/执行npm install --registryhttps://registry.npm.taobao.org npm run serve--registry指定淘宝镜像避免node-sass下载超时。成功后访问http://localhost:8080页面应显示登录框。此时打开浏览器开发者工具Network 标签页中所有/api/login请求应返回 200说明前后端通信正常。逻辑说明admin/src/router/index.js中base: /admin定义了路由前缀因此npm run serve启动的本地服务实际监听http://localhost:8080/admin/*但vue.config.js中devServer.proxy已将/api代理到http://localhost:8080后端端口所以请求路径为http://localhost:8080/api/login而非http://localhost:8080/admin/api/login。4.2 Front 考生端front/目录下npm install后用npm run serve启动进入springboot2a1qfv22/src/main/resources/front/front/目录执行npm install --registryhttps://registry.npm.taobao.org npm run serve成功后访问http://localhost:8081注意端口是 8081因front/vue.config.js中devServer.port8081页面显示“高考志愿智能推荐系统”首页。此时front/src/api/request.js中baseURL: http://localhost:8080指向后端所有GET /api/school/list等请求应返回 JSON 数据。4.3 生产环境部署用 Nginx 代理统一入口解决跨域与路径混乱开发时用两个端口8080 和 8081没问题但部署到单台服务器必须统一入口。方案是用 Nginx 将http://your-domain.com/代理到fronthttp://your-domain.com/admin/代理到adminhttp://your-domain.com/api/代理到后端8080。Nginx 配置片段如下server { listen 80; server_name localhost; location / { alias C:/project/java-gaokao/springboot2a1qfv22/src/main/resources/front/front/dist/; try_files $uri $uri/ /index.html; } location /admin/ { alias C:/project/java-gaokao/springboot2a1qfv22/src/main/resources/admin/admin/dist/; try_files $uri $uri/ /admin/index.html; } location /api/ { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }参数说明alias指向dist/目录需先执行npm run build生成try_files解决 Vue Router history 模式下的 404/admin/末尾斜杠必须保留否则alias路径解析错误proxy_pass后的/表示截断/api/前缀使后端收到/login而非/api/login。5. 爬虫模块Scrapy 项目结构、scrapy.cfg配置与运行.bat手动调试技巧爬虫模块位于spider/目录是一个标准 Scrapy 项目spiders/下有gaokao_spider.py爬中国教育在线高校录取数据items.py定义数据结构pipelines.py负责存入 MySQL。但原始scrapy.cfg中[deploy]段落为空且运行.bat脚本简单粗暴地执行scrapy crawl gaokao一旦出错就闪退无法定位问题。5.1scrapy.cfg配置补全[settings]和[deploy]启用日志输出原始spider/scrapy.cfg仅有一行[settings]需补全[settings] default spider.settings [deploy] # 可选若需部署到 Scrapyd填 host 和 port # url http://localhost:6800/ # project spider5.2 手动运行爬虫用scrapy crawl gaokao -s LOG_FILEspider.log捕获完整日志不要双击运行.bat在spider/目录下用 CMD 执行scrapy crawl gaokao -s LOG_FILEspider.log -s CLOSESPIDER_ITEMCOUNT10-s CLOSESPIDER_ITEMCOUNT10限制只爬 10 条数据避免首次运行耗时过长-s LOG_FILEspider.log将日志输出到文件便于排查。成功日志末尾应有2023-10-15 14:22:33 [scrapy.core.engine] INFO: Spider closed (finished) 2023-10-15 14:22:33 [scrapy.statscollectors] INFO: Dumping Scrapy stats: {downloader/request_count: 12, item_scraped_count: 10, scheduler/dequeued/memory: 12, start_time: datetime.datetime(2023, 10, 15, 14, 22, 21, 123456)}逻辑说明item_scraped_count: 10表示成功抓取 10 条院校数据若为 0检查spiders/gaokao_spider.py中start_urls是否为中国教育在线真实 URL如https://gkcx.eol.cn/school/search并确认网站未反爬本项目未加 User-Agent 轮换首次运行建议加time.sleep(1)防封。5.3 数据入库pipelines.py中 MySQL 连接字符串必须与后端一致spider/pipelines.py第 22 行self.connect pymysql.connect( hostlocalhost, port3306, dbgaokao, userroot, passwd123456, charsetutf8mb4 )必须与后端application.yml中spring.datasource完全一致包括charsetutf8mb4非utf8否则中文入库乱码。验证方法爬取后用 Navicat 查看school表name字段应为“清华大学”而非“清华大学”。6. 避坑指南JDK、Node、MySQL、Scrapy 四大模块 5 条血泪经验总结装这套系统我踩过的坑比代码行数还多。以下是 5 条必须写进 README 的避坑清单每一条都来自真实翻车现场6.1 现象后端启动报java.lang.NoClassDefFoundError: javax/xml/bind/JAXBContext原因JDK 1.8 本身包含 JAXB但某些精简版 JDK如 Zulu 8移除了jaxb-api.jar。本项目RecommendService.java中JAXBContext.newInstance()调用直接失败。解决卸载当前 JDK重装 Oracle JDK 1.8.0_391 官方版或在pom.xml中强制引入dependency groupIdjavax.xml.bind/groupId artifactIdjaxb-api/artifactId version2.3.1/version /dependency6.2 现象npm install卡在node-sass编译报错Cannot download https://github.com/sass/node-sass/releases/download/v4.14.1/win32-x64-83_binding.node原因node-sassv4.14.1 对应 Node.js 14ABI 83但国内 GitHub 下载极慢npm install默认超时。解决执行npm config set sass_binary_site https://npmmirror.com/mirrors/node-sass/再运行npm install或直接下载win32-x64-83_binding.node放入C:\Users\YourName\AppData\Roaming\npm-cache\node-sass\4.14.1\目录。6.3 现象Navicat 导入mysql.sql报错Invalid default value for enroll_time原因MySQL 5.7 默认开启STRICT_TRANS_TABLES而mysql.sql中student_score表的enroll_time datetime DEFAULT 0000-00-00 00:00:00违反严格模式。解决在 Navicat 连接属性 → 高级 → 勾选「使用旧版认证协议」或在 MySQL 中执行SET GLOBAL sql_mode(SELECT REPLACE(sql_mode,STRICT_TRANS_TABLES,));重启失效需改my.ini。6.4 现象运行.bat双击无反应任务管理器看不到python.exe进程原因运行.bat中scrapy crawl gaokao命令未指定 Python 解释器路径系统调用的是默认 Python可能是 3.9而 Scrapy 1.8 不兼容。解决编辑运行.bat将第一行改为C:\Users\YourName\AppData\Local\pyenv\pyenv-win\versions\3.7.17\python.exe -m scrapy crawl gaokao用绝对路径调用 Python 3.7。6.5 现象前端npm run serve启动后登录请求返回 404Network 中 URL 为http://localhost:8080/admin/api/login原因admin/vue.config.js中devServer.proxy配置错误原始文件可能写成/api: { target: http://localhost:8080 }但admin工程的 API 请求前缀是/admin/api代理规则未覆盖。解决修改admin/vue.config.jsdevServer: { proxy: { /admin/api: { // 匹配 /admin/api 开头的请求 target: http://localhost:8080, changeOrigin: true, pathRewrite: { ^/admin/api: /api } // 将 /admin/api 重写为 /api } } }7. 验证跑通从数据库导入到全流程操作用 3 个终端窗口完成端到端测试装完不是终点验证才是。我习惯用三个 CMD 窗口并行操作窗口1跑后端窗口2跑 Admin窗口3跑 Front。这样任何环节阻塞都能立刻定位。以下是完整验证流程每一步都有明确预期结果7.1 第一步数据库初始化窗口1用 Navicat 连接localhost:3306新建数据库gaokao字符集utf8mb4右键 →「运行 SQL 文件」选择压缩包里的mysql.sql。执行完毕后检查school表是否有 100 条院校记录major表是否有 500 条专业记录。预期无报错表数据量符合描述。7.2 第二步后端启动与接口探测窗口1在springboot2a1qfv22/目录下执行mvn spring-boot:run。启动成功后用浏览器访问http://localhost:8080/swagger-ui.html本项目集成 Swagger点击SchoolController→GET /api/school/list→Try it out。预期返回 JSON 数组code:200data中包含name:北京大学等字段。7.3 第三步Admin 后台登录与数据管理窗口2在admin/目录下执行npm run serve访问http://localhost:8080。输入默认账号admin/123456见admin/src/api/login.js模拟数据登录后点击「院校管理」→「列表」。预期表格加载出mysql.sql中的院校数据可点击「编辑」修改名称。7.4 第四步Front 考生端模拟填报窗口3在front/目录下执行npm run serve访问http://localhost:8081。点击「模拟志愿填报」→ 选择「北京市」→「理科」→ 输入分数「650」→ 点击「智能推荐」。预期页面展示「清华大学」「北京大学」等院校卡片卡片上有「匹配度92%」标签数据来自后端RecommendController.java中的calculateMatchScore()方法。7.5 第五步爬虫触发与数据更新窗口1在spider/目录下执行scrapy crawl gaokao -s LOG_FILEspider.log。等待结束后回到 Navicat刷新school表对比updated_at字段。预期至少 10 条记录的updated_at时间戳更新为当前时间证明爬虫成功写入。从那以后我每次部署毕设项目都强制走一遍这五个窗口的并行验证数据库 → 后端接口 → 后台管理 → 考生端 → 爬虫联动。少一个环节上线后就可能被导师问住“你这个推荐分数是怎么算出来的”——答案不在论文里就在recommend/algorithm/ScoreMatcher.java的第 47 行。希望帮到你。本文还有配套的精品资源点击获取