news 2026/9/28 8:44:29

Java+SSM+MySQL+微信小程序答题系统源码部署与联调实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java+SSM+MySQL+微信小程序答题系统源码部署与联调实战

简介:本资源是一套基于Java、SSM框架、MySQL数据库与微信小程序开发的答题小程序完整项目包,面向计算机相关专业学生、毕业设计选题者及课程设计需求者,可直接用于毕设、期末大作业或在线答题场景的二次开发。压缩包共1095个文件,约14.92MB,涵盖88个Java后端源码、115个Vue前端组件、52个WXML与48个WXSS小程序页面文件,以及PNG、SVG等界面素材和SQL数据库脚本、论文文档,前后端代码与数据库脚本齐全。项目采用IDEA与微信开发者工具开发,Maven构建,MySQL 5.7以上配合Navicat管理,功能覆盖用户注册登录、题目展示、在线答题、成绩统计及管理员题库与权限管理。已有68人学习关注。资源经过导师指导与严格调试,下载即用无需修改,可帮助读者快速理解SSM与小程序联调思路,节省从零搭建的时间成本。

1. 从一份「答题小程序」源码包说起:SSM 后端 + 微信小程序前端到底怎么落地

很多同学拿到「基于 Java+SSM+MySQL+微信小程序的答题小程序」这类毕业设计源码包时,第一反应是解压、找README、然后卡在第一步——数据库连不上,或者小程序端请求 404。这个标题背后其实是一条非常典型的全栈链路:后端用 SSM(Spring + SpringMVC + MyBatis)提供 REST 接口,MySQL 存题库、用户、答题记录,微信小程序负责页面渲染和交互。它解决的核心问题是「一套可运行的在线答题系统」,适合课程设计、毕业设计、以及想练手 Java Web + 小程序联调的新手。我见过太多人把源码跑成「只能看不能动」的黑匣子,这篇就按我实际部署的顺序,把环境、建库、接口、联调、避坑一次讲透,让你拿到包之后能自己改题、加题型、换皮肤,而不是只会截图交差。

2. 环境与工程结构:先把 SSM 后端和 MySQL 跑起来

2.1 JDK、Tomcat、Maven 的版本选择与验证

SSM 项目对版本比较敏感,尤其是 Spring 4.x/5.x 和 JDK 8 的搭配。我一般固定用 JDK 8(1.8.0_xxx),Tomcat 8.5 或 9.0,Maven 3.6+。别上来就 JDK 17,SSM 老项目里javax.*和反射会给你惊喜。验证命令如下:

java -version mvn -v

输出里确认java version "1.8.0"和 Maven 的Java version: 1.8。如果mvn -v显示 JDK 17,去~/.mavenrc或系统环境变量JAVA_HOME改回 JDK 8。参数说明:JAVA_HOME指向 JDK 根目录,不是bin;PATH里加%JAVA_HOME%\bin。这一步翻车最多,现象是mvn clean package报Unsupported class file major version。

2.2 用 Navicat 或命令行导入 MySQL 数据库

源码包里通常有db.sql或answer_db.sql。先建库再导表:

CREATE DATABASE answer_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE answer_db; SOURCE D:/project/db.sql;

如果你用 Navicat,右键连接 → 新建数据库 → 字符集选utf8mb4→ 运行 SQL 文件。注意:utf8mb4才能存 emoji 和生僻字,utf8在 MySQL 里其实是utf8mb3,遇到四字节字符会截断。导入后执行SHOW TABLES;,正常应看到user、question、answer_record、question_type等表。参数说明:SOURCE路径用正斜杠或双反斜杠,Windows 下单反斜杠会被当转义。

2.3 改jdbc.properties并启动 Tomcat

在src/main/resources下找jdbc.properties:

jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/answer_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false jdbc.username=root jdbc.password=你的密码

逻辑说明:com.mysql.cj.jdbc.Driver对应 MySQL Connector/J 8.x,如果你用的是 5.x 驱动,类名是com.mysql.jdbc.Driver。serverTimezone必须加,否则报The server time zone value '?D1ú±ê×?ê±??' is unrecognized。useSSL=false避免本地自签证书警告。改完在 IDEA 里配 Tomcat,Application context 设/或/answer,启动后访问http://localhost:8080/看是否出现登录页或接口返回。常见现象:404 说明web.xml里DispatcherServlet映射没生效;500 且日志有NoSuchBeanDefinitionException,检查applicationContext.xml的包扫描路径是否覆盖了你的controller包。

3. 后端接口与小程序请求封装:让答题数据真正跑通

3.1 题库、答题记录表结构与 MyBatis 映射

先看核心表设计,这决定了你后面加题型顺不顺手:

表名关键字段说明
questionid,type_id,content,option_a~d,answer,analysis题干、选项、正确答案、解析
question_typeid,name单选、多选、判断
answer_recordid,user_id,question_id,user_answer,is_correct,create_time每次作答流水
userid,openid,nickname,score小程序用户,openid唯一

MyBatis 的QuestionMapper.xml里通常有selectByType和selectRandom。如果你要改随机抽题,把ORDER BY RAND() LIMIT #{num}换成先查 ID 再IN,数据量大时RAND()会全表扫描。参数说明:#{num}是预编译占位,别写成${num},否则有 SQL 注入风险。

3.2 用wx.request封装统一请求与登录态

小程序端别在每个页面裸写wx.request,我一般封一个request.js:

const BASE_URL = 'http://localhost:8080/answer'; function request(options) { return new Promise((resolve, reject) => { wx.request({ url: BASE_URL + options.url, method: options.method || 'GET', data: options.data || {}, header: { 'content-type': 'application/json', 'token': wx.getStorageSync('token') || '' }, success(res) { if (res.data.code === 200) resolve(res.data.data); else { wx.showToast({ title: res.data.msg, icon: 'none' }); reject(res.data); } }, fail(err) { wx.showToast({ title: '网络异常', icon: 'none' }); reject(err); } }); }); } module.exports = { request };

逻辑说明:BASE_URL本地调试用localhost,真机预览要换成局域网 IP 或已备案域名,且小程序后台配置request合法域名。token从缓存取,登录后写入。参数说明:header里content-type用application/json,后端@RequestBody才能接住;如果后端用@RequestParam,改成application/x-www-form-urlencoded。常见坑:开发者工具勾了「不校验合法域名」能跑,真机不行,这是两套校验。

3.3 登录、交卷、错题本三个接口的联调顺序

联调别一上来就交卷,按「登录 → 拉题 → 交卷 → 查记录」走。登录接口用wx.login拿code换openid:

wx.login({ success(res) { request({ url: '/user/login', method: 'POST', data: { code: res.code } }) .then(data => { wx.setStorageSync('token', data.token); }); } });

后端UserController.login里用code调微信接口换openid,再查库插入或更新user,生成 token 返回。交卷接口收userId、questionId、userAnswer数组,逐条比对answer字段写answer_record,同时更新user.score。错题本就是SELECT * FROM answer_record WHERE user_id=? AND is_correct=0。参数说明:code只能用一次,5 分钟过期;openid不要暴露给前端做业务主键,用自增id或 UUID。联调时打开小程序开发者工具的 Network 面板,看请求体、响应体、状态码,比猜快得多。

4. 避坑与排查:数据库、跨域、真机调试的 5 个血泪记录

4.1 现象:启动报Access denied for user 'root'@'localhost'

原因:jdbc.properties里的密码和 MySQL 实际密码不一致,或者 MySQL 8 的caching_sha2_password插件导致旧驱动连不上。解决:先用命令行mysql -uroot -p确认密码;如果驱动是 5.x,执行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';并FLUSH PRIVILEGES;。然后确认pom.xml里mysql-connector-java版本与驱动类名匹配。

4.2 现象:小程序请求返回 404 或 405

原因:BASE_URL拼错,或者后端@RequestMapping路径多了/少了斜杠。解决:在浏览器直接访问http://localhost:8080/answer/user/login,看是否 404。405 通常是 GET/POST 不匹配,检查@RequestMapping(method = RequestMethod.POST)。另外 Tomcat 的Application context如果是/answer,BASE_URL就要带/answer,别一个带一个不带。

4.3 现象:真机预览请求失败,开发者工具正常

原因:真机不认localhost,也不认未配置的域名。解决:手机和电脑连同一 WiFi,BASE_URL换成电脑局域网 IP(ipconfig查),小程序后台「开发设置」里把http://你的IP:8080加入 request 合法域名,或者真机调试时打开「调试模式」临时跳过校验。注意:正式发布必须 HTTPS 且域名已备案。

4.4 现象:交卷后分数不对,多选总是判错

原因:多选答案存的是"A,B",前端传的是["A","B"],后端直接equals字符串。解决:后端统一把选项排序后拼接再比对,或者用集合containsAll。参数说明:answer字段建议存排序后的字符串,如"A,B,C",前端提交前也排序,避免顺序不同导致误判。

4.5 现象:MySQL 中文乱码,题目显示问号

原因:建库时用了latin1或utf8,连接串没加characterEncoding=utf8。解决:ALTER DATABASE answer_db CHARACTER SET utf8mb4;,表也改,连接串加useUnicode=true&characterEncoding=utf8。如果已经乱码,数据可能救不回来,重新导入db.sql最稳。我一般建库时就固定utf8mb4,省得后面后悔药都没得吃。

5. 进阶技巧:把「能跑」变成「能改、能扩、能答辩」

5.1 用拦截器统一校验 token 和答题时限

别在每个 Controller 里写 token 校验,加一个LoginInterceptor:

public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("token"); if (token == null || !tokenService.validate(token)) { response.setStatus(401); response.getWriter().write("{\"code\":401,\"msg\":\"未登录\"}"); return false; } return true; } }

逻辑说明:preHandle返回false直接中断,前端收到 401 就跳登录页。参数说明:在spring-mvc.xml里配<mvc:interceptor>,exclude-mapping排除/user/login和静态资源。答题时限可以在 Redis 里存exam:userId:startTime,交卷时算差值,超过就拒绝。没有 Redis 就用answer_record第一条的时间戳兜底。

5.2 加判断题和填空题的最小改动路径

判断题复用question表,type_id=3,option_a='正确'、option_b='错误',前端根据type_id渲染不同组件。填空题加一个blank_answer字段,后端比对时去空格、忽略大小写。改动点只有三处:question表加字段、QuestionMapper.xml的resultMap加映射、小程序question.wxml加wx:if分支。别重写一套表,否则论文里的 E-R 图要重画。

5.3 答辩前必做的三个验证

第一,清空answer_record,用两个不同openid各答一遍,确认分数隔离;第二,把question表删到只剩 5 条,看随机抽题是否越界报错;第三,断网后点交卷,看是否有友好提示而不是白屏。这三个场景答辩老师最爱问。我自己的习惯是:每次改完 SQL 或接口,先跑一遍「登录→答题→交卷→错题本」全链路,再截图存档。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 8:44:10

IoT设备软硬件集成测试:从原理到实战排查

板子刚拿回来那天&#xff0c;实验室里一片热闹&#xff1a;硬件工程师在焊样品&#xff0c;嵌入式工程师在跑例程&#xff0c;测试同事架好了串口工具&#xff0c;准备把基本通信流程过一遍。结果不到半小时&#xff0c;有人开始皱眉&#xff1a;设备在上电后偶尔能连上&#…

作者头像 李华
网站建设 2026/9/28 8:42:21

Java+Access综合测评系统毕业设计落地:从环境配置到避坑指南

简介&#xff1a;一份面向计算机专业毕业设计的JAVAAccess综合测评系统完整资料包&#xff0c;适合需要完成选题、开发与论文写作的本科生。系统针对高校综合测评人工计算繁琐、核对低效等痛点&#xff0c;实现学生在线计分、成绩上传、按学号或成绩段查询以及分段比例统计等功…

作者头像 李华
网站建设 2026/9/28 8:42:04

Leiningen Profiles 完全指南:声明、合并、激活与调试项目配置

构建工具CLI 【免费下载链接】leiningen Moved to Codeberg; this is a temporary convenience mirror 项目地址&#xff1a; https://gitcode.com/gh_mirrors/le/leiningen 点击查看 免费下载 Leiningen 的 Profiles&#xff08;配置文件/配置档&#xff09;机制让你可以按场…

作者头像 李华
网站建设 2026/9/28 8:40:46

机器人DH参数选择:标准型与改进型的本质区别与工程选型指南

1. 这不是参数表填空题&#xff0c;而是机器人运动学建模的“第一道生死关”刚带完三届本科毕设&#xff0c;每年都有学生卡在DH参数这一步——不是不会算&#xff0c;是根本不知道自己算出来的结果能不能用。有位同学给松灵Piper机械臂建模&#xff0c;标准DH参数表填得工工整…

作者头像 李华
网站建设 2026/9/28 8:40:46

Node.js + Vue 红色旅游网站开发实践:接口设计、视频播放与地图标记

做这个基于 Node.js Vue 的红色旅游网站之前&#xff0c;我以为它无非是“景点介绍站”的换皮版本。真正把需求理完才发现&#xff0c;游客要的不只是列表和详情页&#xff0c;还有路线推荐、地图标记、宣传片播放、预约留资和心得体会提交这类交互功能。这篇文章把我从环境配…

作者头像 李华
网站建设 2026/9/28 8:40:00

C#读取WINCC归档数据库实战指南:从连接串到断点续读

简介&#xff1a;面向工业自动化开发者的C#读取WinCC归档数据库示例工程&#xff0c;聚焦S7-300过程归档与历史数据查询场景。压缩包内含完整Visual Studio项目&#xff0c;共39个文件&#xff1a;10个C#源文件、3个可直接运行的exe、2个dll动态库&#xff0c;另有配置、资源、…

作者头像 李华