简介这套考研小程序毕业设计源码面向计算机相关专业需完成毕业设计或课程设计的学生提供一套基于Java/PHP后端与MySQL数据库的完整前后端实现。小程序端采用uniapp/原生小程序框架可在HBuilder X或微信开发者工具中运行覆盖考试信息查询、真题练习、模拟考试等典型备考场景。资源共59个文件含15个JSON、12个JS、11个WXSS、10个WXML等小程序前端文件以及Java/PHP后端配置与数据库脚本另外还附有说明文档doc、操作录屏mp4和项目结构图便于快速部署与理解。压缩包整体仅5.98MB内容精炼但流程完整。目前已有61人学习下载适合想参考完整项目结构、学习前后端联调或以此为基础二次开发的初学者。1. 考研小程序毕设项目它到底是什么值不值得拿来当主项目每年毕业设计季微信小程序都是选题重灾区而“考研小程序”又是重灾区里的热门。原因很直白题库、打卡、资讯、个人信息这几块功能天然适合小程序形态业务逻辑不复杂又有完整的“用户—数据—管理端”闭环拿来写论文、画架构图、做答辩演示都比纯管理系统有讲头。这套“完整前后端MySQL说明文档”的资源本质是一个可以直接导入运行的教学型项目不是生产级产品但作为课程设计和毕业设计起点它能把最折磨人的“环境搭建前后端联调”环节砍掉一大半。我的判断是这个方向适合两种人。第一种是想快速毕业、项目能跑通、文档能交差的人第二种是自己能写代码但需要一个成熟骨架来二次开发的人。前者需要的是“少踩坑”后者需要的是“看清边界”。这篇就按我实际带毕设项目时的路径来讲先拆清楚这套东西由哪几块组成再一步步把环境跑起来接着讲数据库和接口怎么改最后把部署、答辩、翻车重灾区都列出来。你能照着复现也能知道改哪里、为什么改、改了会碰什么新的坑。2. 先拆技术栈与项目结构看懂“前后端MySQL”是怎么协作的2.1 前后端分离还是半分离先看目录再下结论拿到压缩包后第一步不是急着导入 IDE而是先解压看顶层目录。常见做法是分为miniprogram或client/wechat、server或backend、doc、sql四个目录。通过目录就能判断项目的耦合方式目录名角色内容特征miniprogram / client微信小程序端app.js、app.json、pages/、utils/还有 project.config.jsonserver / backend后端服务多半是 Spring Boot 或 Node.js 工程含 src/main/java 或 app.jssql数据库脚本通常是 dump 文件或带建表语句的 .sqldoc说明文档部署文档、接口文档、开题报告模板、答辩 PPT如果 server 目录里有 Thymeleaf 模板或 JSP那它就不是前后端分离而是服务端渲染和微信小程序 API 混用。如果 server 是纯 Spring Boot 且只提供 JSON 接口那才是真正的前后端分离架构。从热词里“前后端分离项目实战”“springboot vue前后端分离”频繁出现就能看出来答辩老师很吃这套概念所以你在论文里写清楚“小程序端通过 wx.request 调用后端 RESTful API后端只负责业务逻辑与数据持久化前端只负责渲染与交互”比写一堆业务功能更有区分度。2.2 后端是 Spring Boot 还是 Node.js看依赖文件判断解压后第一眼看pom.xml还是package.json。如果是 Spring Boot 项目你就需要 JDK 8/11、Maven 和 IDEA如果是 Node.js 项目就需要 Node 14 和 npm。分辨方法有pom.xml是 Maven 项目有build.gradle是 Gradle 项目有package.json是 npm 项目有requirements.txt是 Python 项目。我见过很多被迫中途换题目的学生就是因为连这是什么技术栈都没确认就装了一堆用不上的环境。这套资源应该以 Java Spring Boot MyBatis/MyBatis-Plus MySQL 为主流原因很简单考研题库类项目涉及大量分页查询、条件筛选、用户答题记录写入MyBatis-Plus 的Wrapper能省掉大量 XML 映射配置而 Spring Boot 的自动装配让新手上手成本低。但如果压缩包里出现的是 Node.js Express也别慌逻辑一样只是换了一套语言壳。2.3 把项目跑起来的前置环境清单不管是什么后端前置环境基本恒定JDK、Maven、MySQL、微信开发者工具、Navicat 或命令行客户端。先列一份可直接照着装的清单软件版本建议用途检查命令JDK1.8 或 11编译运行 Spring Bootjava -versionMaven3.6依赖管理与打包mvn -vMySQL5.7 或 8.0数据存储mysql --version微信开发者工具稳定版运行小程序图形界面无命令Navicat / DBeaver任意导入 SQL、查看数据图形界面这里有个常见坑mysql命令能执行不代表 MySQL 服务在运行。Windows 上要打开“服务”确认MySQL80之类的服务状态是“正在运行”Linux 上要执行systemctl status mysqld确认。很多项目“连接数据库失败”不是代码问题而是服务压根没起这类现象在毕设季几乎是常态。3. 导入并跑通前后端每一步都留了验证点3.1 数据库导入用命令行操作别只依赖图形工具我一般建议先用 Navicat 或命令行把 SQL 跑通再决定要不要升级到图形化工具因为命令行能看到更完整的报错信息。先在 MySQL 中建一个空库再把压缩包里的 SQL 文件导入mysql -u root -p # 在 MySQL 命令行内执行 CREATE DATABASE IF NOT EXISTS kaoyan DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE kaoyan; SOURCE /你的路径/kaoyan.sql;逻辑说明utf8mb4是必选项不是可选项。考研题库里如果出现“”这类生僻字、或用户昵称带特殊 Emoji只有 utf8mb4 能存utf8会直接报错或落库后变成问号。COLLATE utf8mb4_general_ci表示大小写不敏感的比较规则对拼音、英文标题的模糊搜索更宽容。SOURCE是 MySQL 命令行内执行 SQL 文件的指令比mysql -u root -p sql文件更可控出错能定位到具体行。导完以后至少做一次验证SHOW TABLES;确认表数量不为零SELECT COUNT(*) FROM user;或题库表确认有数据行。很多压缩包的 SQL 文件是空表结构只能注册登录没有学习内容那就是“壳项目”。如果题库表是空的后续你必须自己造数据这是第一个要确认的边界。3.2 后端启动修改数据库密码后运行 Application 类Spring Boot 项目需要先改数据库连接配置。核心文件在src/main/resources/application.yml或application.propertiesspring.datasource.urljdbc:mysql://localhost:3306/kaoyan?useUnicodetruecharacterEncodingutf8mb4useSSLfalseserverTimezoneAsia/Shanghai spring.datasource.usernameroot spring.datasource.password你的数据库密码 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver server.port8080参数说明characterEncodingutf8mb4控制请求与响应编码之前我们已经建库用 utf8mb4这里必须一致serverTimezoneAsia/Shanghai是因为 JDBC 8.x 版本会读取系统时区不显式声明就会报差 8 小时的诡异错误useSSLfalse是本地开发绕过证书校验的常规配置生产环境当然要反过来。server.port8080是后端服务端口如果本机 8080 被别的服务占用改成 8081 也行但记得小程序端请求地址要同步改。改完以后用 Maven 启动mvn clean package -DskipTests java -jar target/考研项目名-0.0.1-SNAPSHOT.jar如果你不想打包也可以直接在 IDEA 里运行XxxApplication.java的main方法。启动日志里出现Tomcat started on port(s): 8080 (http)之后只完成了一半还得打开浏览器或命令行再验一次curl http://localhost:8080/api/healthcurl是一个很基础的命令行网络请求工具在 Windows PowerShell 里也能直接使用。返回 JSON 或 HTTP 200 才算后端真正活了。很多同学看到Tomcat started就以为成功实际 Controller 层因为缺注解扫描根本没注册路由请求一打就 404。3.3 小程序端导入AppID 与域名白名单的攻防微信开发者工具打开miniprogram目录第一步是改project.config.json里的appid没有自己的小程序 AppID 就填测试号。然后看utils/request.js或config.js里的baseUrl// request.js 中常见配置 const BASE_URL http://127.0.0.1:8080 function request(path, method, data) { return new Promise((resolve, reject) { wx.request({ url: BASE_URL path, method: method || GET, data: data || {}, header: { Content-Type: application/json }, success: (res) resolve(res.data), fail: (err) reject(err) }) }) }逻辑说明BASE_URL必须指向你本机后端地址127.0.0.1与localhost要一致不要混用。之后在微信开发者工具右上角“详情—本地设置”勾选“不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书”。这不是偷懒而是本地开发模式下的既定流程因为微信要求线上版必须用 HTTPS 备案域名而本地联调只能用测试豁免。面板启动后wx.request请求能打通数据库循环出现查询记录才算完成前后端联调。3.4 全链路验证注册、登录、刷题三步连跑前后端都启动后按业务主链路做一次冒烟测试。第一步小程序端注册一个账号到 MySQL 里查看user表是否出现新纪录第二步退出小程序重新登录确认 token 生成并被Storage持久化第三步进题库页随机做几道题提交答案后查answer_record或study_log表的新增记录。如果某一步数据库里没有变化说明对应接口只是返回了假成功或后端根本没有把数据落库。这一步是在验证“完整前后端mysql”是否真的完整项目代码“代码不止一次被改写”以标题描述为准。4. 数据库设计与业务表结构改数据模型前要懂的边界4.1 考研类小程序的核心表从用户到刷题的依赖关系一个考研小程序的典型表结构我按字段用途拆成五组逻辑分组表名关键字段职责账号体系user / studentid, openid, nickname, avatar, phone用户身份与会话题库内容questionid, subject, chapter, stem, option_a, option_b, option_c, option_d, answer, analysis各科题目与解析练习记录answer_recordid, user_id, question_id, user_answer, is_correct, create_time答题结果追踪打卡统计checkinid, user_id, date, is_completed连续学习天数资讯公告news / articleid, title, content, create_time学习资料发布这五组表不是各自独立的它们靠外键逻辑串联answer_record.user_id关联user.idanswer_record.question_id关联question.idcheckin.user_id关联user.id。不要听“有外键性能差”就全去掉外键毕设项目的数据量远没到性能瓶颈外键能让 E-R 图画得更合理答辩证更好讲。4.2 题库表设计答案存字符串还是数字对代码影响极大我见过好几个考研项目的题库表用answer字段存A、B、C、D也有用数字1、2、3、4的。两种都行但必须前后端一致。如果前端提交的是A后端判断却比较1就会造成永远答不对。解决办法是在后端写一个判断时做归一化// 判断答案是否正确的核心逻辑 String userAnswer request.getUserAnswer().trim().toUpperCase(); String correctAnswer question.getAnswer().trim().toUpperCase(); boolean isCorrect userAnswer.equals(correctAnswer);这里的trim()去掉用户误触的空格toUpperCase()统一大小写防止“选择 a 而标准答案是 A”这种低级误判。很多翻车现场都出在这个小判断上注册登录都正常一到交卷就零分查半天发现只是大小写没统一。4.3 添加新科目不只改前端菜单要同步改表与接口毕设答辩最常被问“你这个题库只覆盖一科能扩展吗”所以你要提前掌握加科目的完整链路。假设要加“考研政治”至少涉及三处修改前端pages下新增科目分类页或改data.js中科目列表后端 Service 层按subject字段过滤查询question表新增对应subject标记的数据。三个环节里漏掉任何一个就会出现“前端能看到科目、但打开没有题”的现象。正确的做法是让科目列表由接口动态返回而不是写死在前端常量里。我在项目中一般会建议设计一个subject字典表动态维护科目名称和科目编码前端登录后拉取展示。这样“扩展新科目”就变成往字典表插一行再往question表灌题改代码的部分最少。以这个标题来看源码里是固化在代码中的还是可配置的需要启动后先检查一遍。5. 关键接口改造从“能跑”到“像自己的项目”5.1 把分页查询改成带科目筛选MyBatis-Plus 一行式条件构造题库页的核心接口是分页查询题目毕设级项目多半已经实现了最简单的分页但它往往是全局查询没有按科目过滤。自己动手加过滤条件是最安全也最有展示价值的二次开发点。以 Spring Boot MyBatis-Plus 为例改造后的 Service 层public IPageQuestion queryQuestionPage(QuestionQuery query) { PageQuestion page new Page(query.getPageNum(), query.getPageSize()); LambdaQueryWrapperQuestion wrapper new LambdaQueryWrapper(); // 按科目精确过滤 wrapper.eq(StringUtils.isNotBlank(query.getSubject()), Question::getSubject, query.getSubject()); // 按题干关键词模糊查询 wrapper.like(StringUtils.isNotBlank(query.getKeyword()), Question::getStem, query.getKeyword()); // 按时间排序让新题排前面 wrapper.orderByDesc(Question::getCreateTime); return questionMapper.selectPage(page, wrapper); }逻辑说明LambdaQueryWrapper是 MyBatis-Plus 的条件构造器几个方法的含义是eq表示等值匹配适用于科目、难度这类精确维度like是 SQL 里的%关键字%模糊匹配用于题干搜索orderByDesc按create_time降序让最新录入的题先展示。条件里写StringUtils.isNotBlank(...)是为了实现“不传条件就不过滤”如果你传了 null 还去eqSQL 就变成WHERE subject null一条数据都查不回来这是新手最容易踩的逻辑坑。5.2 错题本功能复用答题记录表还是新建表如果你想把项目做成“有亮点”的毕设错题本是最值得做的功能也是被问频率极高的一块。实现方案无非两种第一种是每次答错时往wrong_question表插一条记录第二种是复用answer_record查询时只取is_correct 0的记录。第一种表结构清晰但答错重复题会产生多条记录要去重第二种不用新增表但查询逻辑需要过滤重复键数据量大时性能下降。对于毕设体量我更推荐新建wrong_question表并加唯一索引(user_id, question_id)重复答错时用ON DUPLICATE KEY UPDATE更新时间而不是插入新行。这种设计在答辩时能讲出“用户维度知识点维度去重”比简单复用记录表更有分析深度。5.3 模拟考试随机组卷不是随机排序是加权重抽题很多项目的随机组卷是ORDER BY RAND()数据量小时只看效果还行但这是个能直接引发技术追问的点。ORDER BY RAND()的问题在于全表扫描后再随机排序数据量一旦上升响应时间成倍增长。更适合的实现是先查出每科的题目 ID 列表在内存中按计划抽题再按指定顺序查询题目详情。// 模拟考试组卷的核心逻辑 ListInteger questionIds getQuestionIdsBySubject(subject); Collections.shuffle(questionIds); // 洗牌等价于随机排序 ListInteger selected questionIds.stream() .limit(questionCount) // 只取需要的题量 .collect(Collectors.toList()); ListQuestion questions questionMapper.selectBatchIds(selected);参数说明Collections.shuffle是在内存中做 Fisher-Yates 洗牌比数据库层ORDER BY RAND()的随机性更可控limit(questionCount)用来控制题量比如考研政治单选 16 题就传 16多选 17 题就传 17。selectBatchIds是 MyBatis-Plus 提供的批量主键查询方法最终生成的 SQL 是WHERE id IN (?, ?, ?)效率远比循环单查高。改造完成后你可以在答辩时说“随机组卷是前端无感知、后端按科目配额抽取不是简单 ORDER BY RAND”这句话的点比背十页论文都管用。6. 避坑指南考研小程序从导入到答辩的 5 个拦路虎6.1 现象小程序里的图片全部无法显示控制台报域名错误原因项目作者在代码里填写了某个图片 CDN 域名或者数据库里的图片地址指向了已失效的存储路径。微信小程序对图片域名校验严格非白名单域名直接拉取失败。解决把utils/config.js里的BASE_URL同时检查一遍看所有图片地址是否以相对路径或http://开头。本地调试可用“不校验合法域名”绕过但线上发布必须换成已备案域名并传完整图片地址。最省事的方案是把图片存到本地miniprogram/images/目录统一用/images/xx.png的本地路径引用避免域名问题。6.2 现象后端启动报Access denied for user rootlocalhost原因application.yml里的数据库密码和你本机 MySQL 实际密码不一致或 MySQL 密码加密插件不兼容。常见于 MySQL 8.0 默认caching_sha2_password而项目依赖的旧版驱动只认mysql_native_password。解决先改application.yml密码如果仍然报错就登录 MySQL 执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码;或者直接升级pom.xml里的 MySQL 驱动为mysql-connector-java 8.0.x。我更推荐后者因为旧驱动本身就是安全隐患。6.3 现象题库接口能通但中文搜索总查不到结果原因数据库表或字段的字符集不是utf8mb4导致写入时发生编码转换中文存成了乱码或问号查询时自然匹配不上。很多压缩包里的 SQL 文件建表语句自带DEFAULT CHARSETutf8这个在老项目里很常见但不是生僻字和表情符号的正确选择。解决检查所有核心表字符集执行SHOW CREATE TABLE question;看CHARSETutf8mb4是否生效。如果还是utf8用ALTER TABLE question CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;全表转码再重新导入数据。6.4 现象注册接口返回成功但数据库user表里没有记录原因后端接口只是生成了 token 返回给前端并没有执行真正的INSERT。这种“假成功”常见于源码未完整、或开发者在调试时注释掉了写入逻辑。解决先用命令行直接请求注册接口curl -X POST http://localhost:8080/api/register -H Content-Type: application/json -d {username:test,password:123456}看返回是否真的走完业务逻辑。然后在后端断点打在第 3 步说的userMapper.insert(user)一行如果是注释状态就恢复代码。这个检查非常容易做大多数“前后端都跑起来了但存不了数据”的问题都出自此。6.5 现象部署到云服务器后小程序无法访问后端原因后端监听地址写死为0.0.0.0或localhost都可能是问题源头。localhost默认只允许本机访问云服务器上小程序从公网请求根本到不了服务端口。同时云平台安全组未放行 8080 端口也会导致连接超时。解决后端启动参数加--server.address0.0.0.0或用application.yml指定server.address: 0.0.0.0然后在云控制台安全组放行对应端口最后用curl http://云服务器公网IP:8080/你的接口做验证。注意此时小程序端BASE_URL必须改成http://公网IP:8080而不是localhost。这一步做完以后就能跑线上版只是线上版还要接备案域名这是微信的硬规定绕不过去。7. 答辩前最后一步用验证清单和接口文档收尾项目7.1 花一小时整理接口文档答辩效果翻倍压缩包里的说明文档是作者写的只代表项目原始状态。你改过代码以后必须自己维护一份接口文档这是答辩时最能证明“工作量”的东西。格式不必复杂用表格列出接口名称、请求路径、请求方法、请求参数、返回结果。以下是我常用的表格模板模块接口路径方法请求参数返回说明注册/api/registerPOSTusername, password返回 token 与用户信息登录/api/loginPOSTusername, password返回 token 与用户信息题库分页/api/question/pageGETpageNum, pageSize, subject, keyword返回分页题目列表提交答案/api/answer/submitPOSTquestionId, userAnswer返回是否正确与解析每日打卡/api/checkinPOSTuserId返回连续天数接口文档的价值不在“写得多完整”而在它能串起你整个项目的业务逻辑。很多答辩开始都是“你先介绍一下项目功能”如果你能说“我从登录模块开始然后讲题库、答题、错题、打卡这条数据链路”比照着 PPT 念定义要自然得多。7.2 准备一个读项目的“讲述主线”不要等老师问答辩前给自己定一条串讲线注册登录拿到用户身份 token主页面从这里获取用户信息进入题库后按科目和关键词分页查询调用第 5 章改过的查询接口做题提交答案后端比较答案并记录到answer_record表错题归入wrong_question表错题重做后标记为已掌握。这条主线会把用户表、题库表、答题表、错题表全部带出来E-R 图、数据流图也都能对应上基本覆盖了答辩老师对“项目完整度”的全部提问。7.3 最后的冲刺三个你可能已经忽略的小贴士第一云服务器部署演练至少做两遍。第一遍全程录屏第二遍再独立走一遍不查录屏。第二遍如果卡住说明你根本没有掌握部署流程只是第一次碰巧成功。第二把 MySQL 备份用命令行执行一次mysqldump -u root -p kaoyan backup.sql把备份文件解压到桌面答辩现场展示“数据可靠性”时拿出来。第三也是我最想提醒的一点不要只在答辩前熬夜改代码把上面每个验证点记录成笔记答辩时老师问“你这个项目遇到过什么问题”你能直接说出“字符集不统一导致中文搜索失败”这一类具体问题而不是说“都很顺利”。我自己的习惯是每周日早上做一次全链路测试从头注册一个新账号走一遍刷题、打卡、看错题同时盯着 MySQL 的表变化。这样持续三周你对自己的项目会比任何人都熟。希望帮到你祝你毕设顺利。本文还有配套的精品资源点击获取
