
简介这套基于爬虫的高考志愿智能推荐系统Java毕设项目采用SpringBootVue前后端分离架构面向计算机专业本科毕业设计、Java全栈学习或教育类系统二次开发。系统完整覆盖考生端与后台管理端包含登录注册、专业/院校/位次查询、MBTI职业性格测试、院校识别、收藏管理、模拟志愿填报与志愿管理后台支持专业、院校、咨询、招生计划、用户及MBTI测试管理。技术上通过Python爬虫抓取中国教育在线历年录取数据结合知识图谱与智能匹配算法为考生提供个性化志愿推荐。压缩包共671个文件以Java源码、Vue组件、Python脚本、SQL数据库为主另含设计文档、答辩PPT与说明文档整体仅34.56MB目录结构清晰。目前已有87人学习适合需要完整毕业设计参考、快速理解前后端分离项目或研究教育数据推荐系统的开发者具有较高的实战与学习价值。1. 这套高考志愿推荐系统卡在JDK版本上的次数最多拿到这份「基于爬虫的高考志愿智能推荐系统」源码包时我第一反应是这套东西肯定好装——SpringBoot 2.x Vue 前后端分离JDK 1.8、MySQL 5.7、Maven 都是老搭档了。结果第一次启动就翻车后端一直报UnsupportedClassVersionError查了半天才发现本机默认 JDK 是 17而项目是按 JDK 1.8 编译的。这类 SpringBoot 老项目对 JDK 版本极敏感换个大版本编译直接黑匣子式报错。这份源码带爬虫、知识图谱、MBTI 测试、模拟填报一整套功能适合毕设或者想跑通「爬虫采集 → 数据落库 → 推荐匹配」全链路的开发者。这篇笔记就是我从零装到跑通的全过程版本怎么选、参数怎么配、坏了怎么救都在里面。2. 环境准备JDK 1.8 Maven MySQL 5.7 的版本取舍2.1 JDK 1.8SpringBoot 老项目最不能乱动的一环这套系统后端是 SpringBoot 2.x开发语言 Java摘要在环境说明里写死了 JDK 1.8。这不是建议是硬性要求。SpringBoot 2.x 虽然能在高版本 JDK 上跑但项目里如果用了依赖 JDK 1.8 内部 API 的库换到 JDK 11 以上就会遇到java.lang.NoClassDefFoundError这类诡异报错。所以我装环境的第一步不是装新而是把本机已有的 JDK 版本理清楚。我一般先执行一条命令确认当前 shell 里到底用的是哪个 JDKjava -version javac -version echo $JAVA_HOME如果输出里带17、21这类字样但又不是 1.8说明环境变量指向错了。不要急着卸载老项目和新项目共存是常态正确做法是把 JDK 1.8 单独装到一个固定路径比如C:\Java\jdk1.8.0_202然后在系统环境变量里把JAVA_HOME指向它再把%JAVA_HOME%\bin挪到PATH的最前面。注意Windows 下PATH里如果同时存在多个 JDK 的 bin 目录谁在前面谁生效这是装环境最容易忽略的一个点。JDK 1.8 的最后一个免费公共版本是 8u202我一直用这个版本稳定也没有后续 Oracle 的授权问题。装完确认一下java -version # 期望输出包含 java version 1.8.0_2022.2 Maven 配置镜像、仓库与编译期的依赖坑Maven 是这个 SpringBoot 项目能否编译通过的关键。项目带了pom.xml所有依赖都靠它拉取。Maven 版本我建议选 3.6.x跟 JDK 1.8 配合最稳3.9 虽然也能用但对某些老插件的兼容性反而矫情。装完 Maven 后先改settings.xml这一步不做后面编译时下载依赖能卡到你怀疑人生。settings.xml一般在 Maven 安装目录的conf下我习惯把本地仓库指到一个独立盘符再配一个国内镜像。核心配置长这样localRepositoryD:/maven/repository/localRepository mirrors mirror idaliyun/id mirrorOfcentral/mirrorOf urlhttps://maven.aliyun.com/repository/public/url /mirror /mirrorslocalRepository指定依赖包落盘路径mirrorOf设成central表示中央仓库的请求全部走阿里云镜像。这一步默认不配的话Maven 会去访问中央仓库老项目的依赖又多又碎网络稍微一抖就报Could not transfer artifact然后整个编译流程卡死。配完镜像后验证一下mvn -version能看到 Maven 版本号和Java version: 1.8.0_202就说明环境变量没问题。这里还有个血泪经验如果mvn -version显示的 Java 版本不是 1.8优先查JAVA_HOMEMaven 本身不挑 JDK它只是把JAVA_HOME的路径透传给编译插件。2.3 MySQL 5.7 初始化字符集与密码策略决定后面能不能连上数据库这块摘要里写的是 MySQL 5.7一句话带过但实际安装时坑不少。MySQL 8.x 默认的密码加密方式是caching_sha2_password而这套项目大概率用的是老驱动不认这个加密方式连接时报Unable to load authentication plugin。所以别贪新老老实实装 MySQL 5.7。Windows 上装 5.7 建议下载 zip 包手动初始化不要用安装版——安装版会默认装成 Windows 服务、写一堆注册表后边想换版本很麻烦。手动初始化流程# 解压后进入 bin 目录执行初始化 mysqld --initialize-insecure --basedirD:/mysql-5.7.44 --datadirD:/mysql-5.7.44/data--initialize-insecure表示 root 账户初始密码为空适合本地开发省去翻日志找随机密码的功夫。初始化完还需要手动建一个my.ini关键几项如下[mysqld] basedirD:/mysql-5.7.44 datadirD:/mysql-5.7.44/data port3306 character-set-serverutf8mb4 [client] default-character-setutf8mb4utf8mb4比utf8多支持 emoji 和生僻字高考志愿系统里院校名称、专业名称偶尔会带特殊字符用utf8mb4省得插入数据报Incorrect string value。配好后启动服务mysqld --console另开一个窗口连进去改密码mysql -uroot -p ALTER USER rootlocalhost IDENTIFIED BY 你的密码;注意5.7 的ALTER USER默认走mysql_native_password这正是 SpringBoot 老驱动能识别的认证方式别手动改成别的。3. 数据库与后端启动SpringBoot 服务是怎么一步步跑起来的3.1 数据库导入用 Navicat 跑 SQL 的正确姿势源码压缩包里带 MySQL 数据库文件一般是一个.sql脚本。我用 Navicat 导入的步骤是新建连接填 localhost、端口 3306、用户名 root、密码填刚设置的连接成功后右键新建数据库库名跟脚本里的CREATE DATABASE保持一致然后右键这个库选「运行 SQL 文件」把脚本拖进去执行。这里有个关键点导入之前先确认脚本的字符集。Navicat 导入时如果识别错编码中文全变乱码后面页面上看到的所有院校名、专业名全是「锟斤拷」。我一般的做法是先用记事本打开.sql文件看前 20 行找SET NAMES utf8mb4或DEFAULT CHARSET这类标记没有的话导入时手动把编码选成 UTF-8。导入完成后验证一下表数量和数据量USE 数据库名; SHOW TABLES; SELECT COUNT(*) FROM 专业表;表名可能跟业务词不完全一致但至少要看到用户表、专业表、院校表、录取数据表这四类核心表存在。如果COUNT(*)是 0说明导入的数据有问题或者导错了库趁早重来别拖到后边启动才发现。3.2 后端配置修改application.yml 里的三个关键项SpringBoot 项目的配置集中在src/main/resources/application.yml里启动之前必须逐个核对。我整理了一份检查清单端口、数据源、MyBatis 映射路径。这三项错一个服务要么起不来要么起来后接口全 500。server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/数据库名?useUnicodetruecharacterEncodingutf8mb4useSSLfalseserverTimezoneAsia/Shanghai username: root password: 你的密码 driver-class-name: com.mysql.jdbc.DriveruseSSLfalse必须加本机开发环境没有证书不加会报 SSL 连接告警甚至失败。serverTimezoneAsia/Shanghai也是必须的——MySQL 5.7 的时区默认跟系统不一致不加的话日期字段查出来会差 8 个小时模拟志愿填报的时间戳全乱。driver-class-name有的项目写com.mysql.cj.jdbc.Driver有的写老驱动com.mysql.jdbc.Driver以项目里 pom.xml 的 MySQL 驱动版本为准改错会直接ClassNotFoundException。3.3 编译与启动两种启动方式各自的适用场景后端启动有两类方式IDE 里跑和命令行跑。IDE 方式适合调试——断点、热部署都在里面Eclipse 或 IDEA 导入 Maven 项目后直接右键SpringBootApplication主类运行。命令行方式适合部署和复现问题。# 在项目根目录执行先编译再启动 mvn clean package -DskipTests java -jar target/xxx.jarclean package会清理旧产物并重新打包-DskipTests跳过测试代码避免测试类里连不上数据库导致打包失败。这套项目里还带了1-install.bat、2-run.bat这类脚本本质就是上面这两条命令的封装。我习惯先用命令行跑一次全流程走通、日志不报错之后再进 IDE 加断点调试具体功能模块。启动成功的标志不是控制台停住而是日志里出现Started Application in x.xxx seconds或者 Tomcat 端口号被打印出来。看到这行字后端才算是真正起来了。4. 前端与爬虫Vue 管理后台构建 Scrapy 数据采集链路4.1 Vue 前端依赖安装与构建node_modules 黑洞怎么避开前端目录在src/main/resources/admin/admin和src/main/resources/front/front下面一个管后台管理端一个管考生端。两者都是 Vue 项目各自要npm install一次。前端装依赖是这套系统里最玄学的环节——同样的命令不同 Node 版本结果可能完全不一样。这套源码对应的 Vue 项目要看 package.json 里 vue 的版本决定 Node 版本。Vue 2.x 的老项目建议用 Node 10 或 12 这一代Vue 3.x 可以用 Node 14 以上。我之前在 Node 18 上装一个 Vue 2 的老项目node-sass编译直接报错换回 Node 12 一次通过。判断项目到底是哪一代看package.json里的vue字段就知道。安装命令本身不复杂npm install但执行前我建议先看一眼package.json里有没有node-sass。有的话这个包是 Node 版本敏感度最高的依赖它要通过 node-gyp 编译原生模块Node 版本对不上必挂。解决方式有两种一是切换到匹配的 Node 版本二是把node-sass换成sass然后稍微改一下引入方式。对毕设项目来说我建议直接换 Node 版本改动最小。依赖装完后的构建命令是npm run build构建产物是一个dist目录里面是纯静态文件可以丢给 Nginx 托管也可以让 SpringBoot 直接当静态资源加载。前端开发模式下用的是npm run dev会起一个带热更新的开发服务器。4.2 Scrapy 爬虫install 与运行流程爬虫这块用的是 Scrapy源码包里有独立的spider目录里面带了scrapy.cfg、安装.bat、运行.bat。Scrapy 是 Python 的框架所以本机还得有个 Python 环境。3.7 到 3.10 之间都行Scrapy 对 Python 版本要求不算苛刻。安装.bat本质就是pip install scrapy如果 pip 下载慢临时切到国内源pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple装完验证一下scrapy version运行.bat对应的命令是scrapy crawl 爬虫名爬虫名要去spiders目录下的具体爬虫文件里看一般是start_urls和name属性里定义的字符串。启动后如果控制台开始刷[scrapy.core.engine]之类的日志说明爬虫已经在跑。这套爬虫需要单独执行执行前确认目标数据库连接配置跟后端一致——因为爬到的院校录取数据要写进 MySQL通常配置在 Scrapy 项目的pipelines.py或者settings.py里。它的数据源是对公开放出的教育类录取数据站点采集的是历年分数线这类公开内容。4.3 前后端联调跨域与端口配置后端起在8080前端开发服务器默认起在9527之类的端口。两个端口不一样浏览器就会报跨域错误页面能打开但接口全红。处理方式两种一是后端加CrossOrigin或者全局 CORS 配置二是前端开发环境配代理转发。老 Vue 项目一般通过config/index.js里的proxyTable做代理proxyTable: { /api: { target: http://localhost:8080, changeOrigin: true } }这段配置的意思是前端发出的所有/api开头请求都由开发服务器转发到8080端口的后端服务。changeOrigin: true保证请求头里的 Host 被替换成目标地址不然部分后端框架会拒绝非本机来源的请求。后端那边如果自己写了 CORS 配置注意别跟前端代理同时开——双份跨域处理偶发冲突表现是请求能到后端但响应被浏览器拦了肉眼极难排查。我一般选前端代理这条路后端少碰配置。5. 常见问题排查启动失败的 5 个高频坑与解决记录5.1 端口被占用导致后端起不来现象启动 SpringBoot 时日志报Web server failed to start. Port 8080 was already in use或者直接抛BindException。原因本机其他进程占用了 8080 端口常见的有微信开发者工具、本地 Tomcat、另一个 SpringBoot 进程。解决先查谁占用了端口再决定杀进程还是换端口。netstat -ano | findstr 8080 taskkill /PID 进程号 /F如果是想换端口直接改application.yml里的server.port但要注意前端代理配置里的target端口同步改掉否则前端转发还是打到旧端口。5.2 MySQL 5.7 密码认证方式引发连接失败现象后端启动日志报Access denied for user rootlocalhost但 Navicat 用同样的账号密码连得好好的。原因Navicat 和 JDBC 驱动走不同的认证流程。常见场景是用户密码里带了、#这种特殊字符在application.yml里被解析出错或者密码确实是错的Navicat 记住了历史密码。解决先排除特殊字符问题——密码里的特殊字符在 YAML 里要用引号包起来比如password: abc123。确认无误后用命令行手动验证mysql -uroot -p你的密码 -e SELECT 1能执行成功说明认证没问题问题在配置解析上执行失败说明密码就是不对回 MySQL 里重置。5.3 Maven 依赖下载卡住或编译失败现象执行mvn clean package时卡在Downloading...半小时不动或者报Could not resolve dependencies某个jar显示Last updated时间很久远。原因默认走了中央仓库网络延迟高或者某个依赖版本在镜像里没有缓存。解决检查settings.xml里的镜像配置是否生效。确认方式mvn help:effective-settings这个命令会打印实际生效的 settings 内容能看到mirrorOf是否真的指到了阿里云镜像。如果镜像配置没问题但某个包还是拉不下来去仓库目录把这个包的.lastUpdated后缀文件删掉再重新编译。Maven 默认不重试失败的下载不删这个文件会一直报同样的错。5.4 前端 npm install 报错或 build 失败现象npm install时报node-gyp rebuild失败或者npm run build时内存溢出日志尾部是JS stack trace。原因依赖里有需要编译原生模块的包还是 node-sass 的问题Node 版本不匹配构建时 Webpack 内存不够则是 Node 默认堆大小限制。解决Node 版本不对就换版本这是最省事的路径。换完版本后先删掉已有的node_modules再重装避免旧包残留rm -rf node_modules package-lock.json npm install如果是构建内存溢出单独调大 Node 堆内存npm run build --max_old_space_size40965.5 Scrapy 爬虫能启动但采集不到数据现象scrapy crawl启动后日志刷了一堆翻页也正常但数据库里一条新数据都没写入。原因最常出在数据库写入管道上——数据库表结构跟 Scrapy item 字段对不上或者数据库连接配置用的还是默认的 SQLite数据被写进了本地.db文件而不是 MySQL。解决先看 Scrapy 项目的settings.py里的ITEM_PIPELINES配置确认启用了哪个管道类再打开对应的pipelines.py看里面连的是什么数据库。如果连的是 MySQL检查host、user、password、db四项是否跟后端application.yml一致。改完后重启爬虫看日志里有没有出现Item stored之类的成功标记。6. 装完怎么验证跑通功能级自测清单与数据链路验证环境全部装好、服务都能启动之后别急着截图交差先按业务主链路把功能过一遍。我一般按「数据 → 接口 → 页面」三层验证顺序不能反底层数据有问题上层页面再好看也是假跑通。第一层验证数据完整性。登录 MySQL 服务确认爬虫采集的数据已经落库。查看录取数据表的记录数SELECT COUNT(*) FROM 录取数据表; SELECT COUNT(*) FROM 专业表; SELECT COUNT(*) FROM 院校表;三个表的数量级应该跟正常业务量匹配如果全是 0后边的推荐匹配就是空转。第二层验证后端接口。打开浏览器直接访问几个关键接口路径确认返回 JSON 而不是 404 或 500。比如http://localhost:8080/api/专业查询接口?keyword计算机接口返回正常 JSON 数组就算通过。这一步我发现很多人跳过直接在页面上点点点结果接口报错被浏览器控制台吞了还以为是前端渲染问题。第三层验证页面功能。用考生账号走一遍核心链路注册登录 → 查询专业和院校 → 做一次 MBTI 职业性格测试 → 进入模拟志愿填报 → 添加几个志愿 → 查看推荐结果。后台管理端也值得花十分钟过一遍用管理员账号登录确认专业管理、院校管理、位次管理这几个菜单能打开、能编辑、能保存。数据链路验证还有一个技巧看推荐结果是否正确关联了历史录取数据。模拟填报后推荐列表里应该能看到院校的历年分数线信息——这些数据来自爬虫采集。如果推荐列表有院校但分数线全是空的说明爬虫采集的年份字段没对接到推荐逻辑上要回溯检查爬虫数据字段的映射。从那以后我每次拿到老项目源码都强制自己先走一遍这条链路查 JDK 版本、确认数据库认证方式、编译一次后端、构建一次前端、跑一个爬虫任务、最后点一遍关键页面。六个环节全绿才敢说「跑通了」。希望这篇笔记能帮到你少走我走过的这些弯路。本文还有配套的精品资源点击获取