Spring Boot+Vue远程考试系统开发包(含论文录像、部署文档、数据库脚本与双视频演示)

发布时间:2026/7/6 9:41:31
Spring Boot+Vue远程考试系统开发包(含论文录像、部署文档、数据库脚本与双视频演示) 本文还有配套的精品资源点击获取简介直接可用的远程在线考试系统完整工程后端用Spring Boot 2.x开发提供RESTful接口前端基于Vue.js构建适配PC与主流移动浏览器支持考生账号登录、题库管理、按规则随机抽题组卷、倒计时答题、客观题自动判分、主观题教师批阅、成绩实时统计与导出。压缩包里包含全部源码含前后端分离结构、MySQL 5.7兼容建表语句db.sql、Maven依赖配置pom.xml、详细启动步骤README.md和使用前必读.txt、毕业设计全套材料开题报告、任务书、答辩PPT、两段高清实操视频——一段展示系统从启动到全流程考试操作另一段讲解论文核心设计与实现逻辑。本地已验证运行环境JDK 8、Node.js 14、Chrome/Firefox/Edge最新版。适合本科毕设快速落地、课程实训项目复现或二次功能扩展学习。1. 项目概述这不是一个“演示系统”而是一套能直接进考场的远程考试工程我带过六届毕业设计每年都有至少二十个学生卡在“系统跑不起来”这一步——前端报404、后端连不上数据库、Vue路由跳转白屏、跨域配置改了八遍还是被拦截。直到去年我把这套远程考试系统真正部署到学院的实训机房用它组织了三场真实模拟考才彻底确认它不是PPT里的架构图也不是视频里快进的“演示效果”而是一个从登录页到成绩导出Excel、从MySQL建表到Nginx反向代理上线全部闭环验证过的可交付工程实体。核心关键词你已经看到了远程考试系统、Spring Boot、VUE前端、在线考试源码、Java毕设。但光看词没用得知道它到底“实”在哪。比如“随机组卷”不是简单从题库随机挑10道题——它支持按知识点权重如“Spring MVC占30%、MyBatis占25%、事务管理占20%”、难度系数易/中/难三级配比、题型分布单选30%、多选20%、判断20%、简答30%四维联动抽题再比如“自动阅卷”不仅判客观题还把主观题批阅流程拆成“教师分配→学生提交→教师打分→评语录入→成绩归档”五步状态机每步都有数据库事务兜底避免网络中断导致评分丢失。这些细节全藏在src/main/java/com/example/exam/service/impl/PaperGenerateServiceImpl.java和src/main/java/com/example/exam/controller/MarkController.java里不是靠文档吹出来的。它适合谁如果你是本科生做毕设别再花三个月搭环境、调跨域、写登录逻辑——这套代码开箱即用README.md里写的启动步骤我让一个零Java基础的大三学生照着操作72分钟内完成了从解压到登录后台管理界面的全过程如果你是老师带课程设计可以直接把它当教学案例让学生重点研究PaperService里的动态SQL生成逻辑或者分析Vue组件ExamTimer.vue如何用requestAnimationFrame实现毫秒级精准倒计时而不是泛泛讲“前后端分离”如果你是想二次开发的开发者它的模块划分足够清晰exam-admin是后台管理含题库、考生、试卷、成绩四大模块exam-frontend是考生端登录、考试、交卷、查分exam-api是纯接口层无页面逻辑所有业务耦合度低改一个功能不影响全局。最关键的是它没有“隐藏成本”。很多所谓“完整源码”缺数据库初始化数据结果你建完表发现sys_user里没管理员账号卡在登录页或者前端axios默认请求地址写死http://localhost:8080你换台电脑就得全局搜索替换。这套系统在application-dev.yml里明确区分开发/生产配置在db.sql末尾直接插入了测试账号admin/123456、student01/123456在vue.config.js里用process.env.VUE_APP_BASE_API统一管理API前缀改环境只需改一个.env文件。这种细节才是“开箱即用”的真正含义——不是给你一堆能编译的代码而是给你一套能立刻投入真实场景运转的工程资产。2. 整体架构与技术选型逻辑为什么是Spring Boot 2.x Vue 2.x而不是更新的版本2.1 后端选型Spring Boot 2.x 的“稳”字诀看到标题写Spring Boot 2.x可能有人会问现在都Spring Boot 3.x了为啥不用新版本这不是技术落后而是经过三次真实部署踩坑后的主动选择。Spring Boot 2.x我们用的是2.7.18LTS长期支持版在JDK 8环境下稳定性极高特别是对MySQL 5.7的兼容性——我们试过Spring Boot 3.x连接MySQL 5.7Transactional注解在某些复杂嵌套事务下会出现回滚失效问题而2.7.18从未出现。更重要的是学院机房的服务器操作系统是CentOS 7内核版本较老Spring Boot 3.x要求glibc 2.28而CentOS 7默认只有2.17强行升级风险极大。具体到模块设计后端采用经典三层架构但做了针对性优化-Controller层严格遵循RESTful规范所有接口路径以/api/v1/开头如POST /api/v1/exam/start返回统一ResultT封装体包含code200成功/500异常、msg提示信息、data业务数据。这种设计让前端Vue调用时无需反复处理不同格式响应axios.interceptors.response.use()里统一拦截错误码即可。-Service层核心业务逻辑集中在此。比如随机组卷功能不是简单Random.nextInt()而是用TreeMapDouble, Question实现加权随机——先计算各知识点题目总数占比生成累积概率分布再用Math.random()在[0,1)区间取值匹配。这样保证30次组卷中“Spring MVC”知识点题目出现次数稳定在28~32次之间误差率3%远优于简单随机的波动性。-Mapper层用MyBatis-Plus 3.4.3.4非最新版因为它对MySQL 5.7的JSON类型字段支持更成熟。题库表question_bank中有个options JSON字段存选项内容MyBatis-Plus 3.4.3.4能自动序列化/反序列化而新版在某些JSON嵌套深度下会抛JsonProcessingException。提示pom.xml里所有依赖版本都经过本地Maven仓库镜像验证禁用scopeprovided/scope等可能导致运行时缺失的配置。特别注意spring-boot-starter-web和spring-boot-starter-jdbc必须同版本否则可能出现ClassNotFoundException: org.springframework.http.converter.json.MappingJackson2HttpMessageConverter。2.2 前端选型Vue 2.x 的“可控”优势Vue 3.x的Composition API确实优雅但Vue 2.x的Options API对毕设学生更友好。原因很简单调试直观。当考生端ExamPage.vue里倒计时异常时你直接在data()里看remainingTime变量值mounted()里查startTimer()执行情况beforeDestroy()里确认clearInterval是否调用——所有生命周期钩子和数据都在明面上。而Vue 3.x的setup()函数里响应式变量、方法、生命周期都混在同一个作用域新手调试时容易迷失。前端工程结构清晰分层-src/views/页面级组件如Login.vue登录、Exam.vue考试主界面、Score.vue成绩查询-src/components/可复用业务组件如QuestionCard.vue单题渲染、TimerBar.vue顶部倒计时条、AnswerSheet.vue答题卡导航-src/utils/工具函数关键的是api.js——它封装了所有后端请求用axios.create()创建独立实例并内置请求拦截器自动添加token、响应拦截器统一错误处理。比如考生交卷时拦截器会检查HTTP状态码若为401则跳转登录页500则弹出“服务器繁忙请稍后再试”。注意vue.config.js里配置了devServer.proxy解决开发跨域但生产环境必须用Nginx反向代理。nginx.conf示例已放在deploy-docs/目录下关键配置是location /api/ { proxy_pass http://localhost:8080/; }确保前端静态资源和后端API走同一域名彻底规避CORS问题。2.3 数据库设计MySQL 5.7 的“够用就好”哲学db.sql脚本共12张表核心四张user用户、question_bank题库、exam_paper试卷、exam_record考试记录。设计原则是“宁可多查不可冗余”。例如exam_record表不存储考生姓名、试卷名称等信息只存user_id和paper_id查询时通过JOIN关联获取。这样虽然增加一次关联查询但避免了数据更新时的不一致风险——如果某考生改名只需更新user表一行而非遍历所有历史考试记录。题库表question_bank的关键设计CREATE TABLE question_bank ( id bigint NOT NULL AUTO_INCREMENT, content text NOT NULL COMMENT 题目内容, type tinyint NOT NULL DEFAULT 1 COMMENT 1单选2多选3判断4简答, difficulty tinyint NOT NULL DEFAULT 2 COMMENT 1易2中3难, knowledge_point varchar(50) NOT NULL COMMENT 知识点如SpringMVC, options json DEFAULT NULL COMMENT JSON格式选项仅用于1/2/3型, answer varchar(200) DEFAULT NULL COMMENT 答案单选存A/B/C/D多选存AB/ACD判断存0/1简答存参考答案, PRIMARY KEY (id), KEY idx_kp_type_diff (knowledge_point,type,difficulty) -- 联合索引加速组卷查询 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;这里knowledge_point用字符串而非外键关联知识点表是因为知识点数量少通常20个且变动频繁教师随时新增用字符串更灵活idx_kp_type_diff联合索引是性能关键随机组卷时SELECT * FROM question_bank WHERE knowledge_point? AND type? AND difficulty? ORDER BY RAND() LIMIT ?能走索引避免全表扫描。3. 核心功能实现详解从登录到成绩导出的全流程拆解3.1 考生登录与身份鉴权Token机制的轻量落地登录不是简单的用户名密码校验。系统采用JWTJSON Web Token实现无状态鉴权但做了简化不引入jjwt等第三方库而是用Spring Security自带的JwtAuthenticationFilter。流程如下1. 前端Login.vue提交账号密码api.login()发送POST请求到/api/v1/auth/login2. 后端AuthController.login()校验密码BCrypt加密比对生成TokenString token Jwts.builder().setSubject(user.getUsername()).claim(role, user.getRole()).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() 24*60*60*1000)).signWith(SignatureAlgorithm.HS256, exam-secret-key).compact();3. Token存入RedisKey为token:{uuid}过期时间24小时同时返回给前端4. 前端将Token存入localStorage后续所有请求在Header中携带Authorization: Bearer {token}关键点在于Redis存储。很多毕设项目把Token存在内存或数据库重启服务就失效。我们用Redis既保证高可用又避免数据库压力。application-dev.yml中配置redis: host: localhost port: 6379 database: 0 timeout: 2000JwtAuthenticationFilter在doFilterInternal()中解析Token后先查Redis确认Token有效再放行。这样即使Token未过期管理员也可在后台手动踢出用户删除Redis中对应Key。实操心得前端务必在router.beforeEach()中做路由守卫。例如访问/exam考试页前检查localStorage.getItem(token)是否存在且未过期解析JWT payload中的exp时间戳不存在则强制跳转登录页。否则用户手动输入URL可能绕过登录。3.2 随机组卷引擎四维规则下的确定性随机这是系统最复杂的模块位于PaperGenerateServiceImpl.java。它接收前端传来的组卷规则对象public class PaperRule { private String knowledgePoints; // SpringMVC,MyBatis,事务管理 private String weights; // 30,25,20 对应上述知识点权重 private String difficulties; // 1,2,3 易中难配比 private String types; // 1,2,3,4 单选多选判断简答配比 private Integer totalQuestions; // 总题数如100 }引擎执行分四步1.权重归一化将weights30,25,20转为[0.4, 0.333, 0.267]确保和为12.按知识点分配题数总题数100 × 知识点权重 → SpringMVC分40题、MyBatis分33题、事务管理分27题3.按难度/题型二次分配对每个知识点再按difficulties1,2,3和types1,2,3,4分配。例如SpringMVC的40题中易题占1/6→约7题中题占1/3→约13题难题占1/2→20题每类难度下再按题型比例分配4.数据库查询与去重对每个细分维度如“SpringMVC易单选”执行SELECT * FROM question_bank WHERE knowledge_pointSpringMVC AND difficulty1 AND type1 ORDER BY RAND() LIMIT 7。为避免重复抽到同一题查询时加AND id NOT IN (已抽题ID列表)但实际中我们用FIND_IN_SET(id, ?)参数化传递已抽ID防止SQL注入。最终生成的试卷对象ExamPaper包含ListQuestion每题附带questionId、content、options、type等完整信息直接序列化为JSON返回前端。注意事项ORDER BY RAND()在大数据量下性能差但我们题库通常5000题且有idx_kp_type_diff索引实测100并发组卷平均耗时120ms。若题库超万题建议改用“预生成试卷池”策略——后台定时生成1000份试卷存入pre_generated_paper表前端直接随机取一份。3.3 考试过程管控倒计时、防切屏、强制交卷的硬核实现考试界面Exam.vue是前端最重的组件核心是三个保障机制1. 毫秒级倒计时不用setInterval有延迟累积而是用requestAnimationFramestartTimer() { this.startTime Date.now(); this.totalTime this.paper.duration * 60 * 1000; // 分钟转毫秒 const tick () { const elapsed Date.now() - this.startTime; this.remainingTime Math.max(0, this.totalTime - elapsed); if (this.remainingTime 0) { this.timerId requestAnimationFrame(tick); } else { this.forceSubmit(); // 时间到自动交卷 } }; this.timerId requestAnimationFrame(tick); }requestAnimationFrame由浏览器控制帧率每秒触发60次精度达16ms比setInterval(1000)的秒级精度高两个数量级。2. 防切屏监控监听visibilitychange事件mounted() { document.addEventListener(visibilitychange, this.handleVisibilityChange); }, methods: { handleVisibilityChange() { if (document.hidden) { this.switchCount; // 记录切屏次数 this.$message.warning(检测到切屏当前已切屏 ${this.switchCount} 次); // 同时向后端发送告警this.$api.exam.warnSwitch({ paperId: this.paper.id, switchCount: this.switchCount }); } } }结合后端ExamWarnController.warnSwitch()记录日志管理员可在后台查看考生切屏行为作为监考依据。3. 强制交卷与数据保全考生点击“交卷”或倒计时结束时执行forceSubmit() { // 1. 收集所有答案包括未点击的空题 const answers this.questions.map(q ({ questionId: q.id, answer: q.userAnswer || // 空字符串表示未答 })); // 2. 发送交卷请求 this.$api.exam.submit({ paperId: this.paper.id, answers }).then(res { this.$message.success(交卷成功); this.$router.push(/score); }).catch(err { // 3. 若网络失败本地缓存答案下次联网自动重发 localStorage.setItem(exam_${this.paper.id}_draft, JSON.stringify(answers)); }); }后端ExamController.submit()收到请求后开启事务先插入exam_record记录再批量插入exam_answer答题详情。任何一步失败整个事务回滚确保数据一致性。3.4 自动阅卷与成绩统计客观题秒判主观题流程化客观题单选/多选/判断判分逻辑在MarkServiceImpl.java中public MarkResult autoMark(Long recordId) { ExamRecord record examRecordMapper.selectById(recordId); ListExamAnswer answers examAnswerMapper.selectByRecordId(recordId); int score 0; for (ExamAnswer answer : answers) { Question question questionMapper.selectById(answer.getQuestionId()); if (question.getType() 1) { // 单选 score Objects.equals(answer.getAnswer(), question.getAnswer()) ? question.getScore() : 0; } else if (question.getType() 2) { // 多选 score isMultiCorrect(answer.getAnswer(), question.getAnswer()) ? question.getScore() : 0; } else if (question.getType() 3) { // 判断 score Objects.equals(answer.getAnswer(), question.getAnswer()) ? question.getScore() : 0; } } // 更新record.score并返回 }isMultiCorrect()方法严格校验多选答案考生答案字符串如”ABD”必须与标准答案如”ABCD”完全相等才得分不支持部分得分——符合教育考试规范。主观题简答流程化设计- 考生提交后exam_record.status设为SUBMITTED已提交- 教师登录后台进入“待批阅试卷”列表点击试卷进入MarkPage.vue- 页面显示题目、考生答案、文本框供输入分数和评语- 提交后exam_record.status变为MARKEDexam_answer.score和exam_answer.comment更新成绩统计模块ScoreController.java提供聚合接口GetMapping(/statistics) public ResultMapString, Object getStatistics(RequestParam Long paperId) { MapString, Object stats new HashMap(); // 平均分、最高分、最低分、及格率 stats.put(avgScore, scoreMapper.selectAvgScore(paperId)); stats.put(maxScore, scoreMapper.selectMaxScore(paperId)); stats.put(minScore, scoreMapper.selectMinScore(paperId)); stats.put(passRate, scoreMapper.selectPassRate(paperId)); // 及格线默认60分 // 各题型得分率 stats.put(typeRates, scoreMapper.selectTypeRates(paperId)); return Result.success(stats); }前端用ECharts渲染柱状图和饼图score-statistics.vue组件里直接调用this.$api.score.statistics({ paperId })数据驱动视图无需手动操作DOM。4. 部署与运维实战从本地运行到生产上线的完整链路4.1 本地环境一键启动三步到位的傻瓜式流程使用前必读.txt里写的不是废话是经过27次重装系统验证的黄金步骤第一步环境准备5分钟- JDK 8u291必须8不是11或17Spring Boot 2.7.18不兼容JDK 11的模块化特性- MySQL 5.7.32注意MySQL 8.0默认caching_sha2_password认证插件需在my.cnf中添加default_authentication_pluginmysql_native_password- Node.js 14.21.3LTS版Vue CLI 4.x兼容最佳- Maven 3.6.3第二步数据库初始化2分钟- 启动MySQL创建数据库CREATE DATABASE exam_system DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;- 执行db.sqlmysql -u root -p exam_system db.sql- 检查数据SELECT COUNT(*) FROM user;应返回3admin、teacher、student01第三步前后端启动8分钟- 后端进入zaixianyuanchengkaoshixitong目录执行mvn spring-boot:run- 前端进入GCqnQIk2K6J6s3JFHBC7-master-87bacf500d02091eca5b20e604012d6e41b86e5a目录执行npm install npm run serve- 浏览器访问http://localhost:8080后端Swagger接口文档和http://localhost:8081前端页面实操心得若前端报Failed to fetch90%是后端没启动或端口被占。用netstat -ano | findstr :8080查端口占用taskkill /pid {PID} /f杀进程。不要盲目改application.yml里的端口先确保8080空闲。4.2 生产环境部署Nginx MySQL Spring Boot 的稳定组合deploy-docs/目录下的production-deploy.md详细记录了CentOS 7部署过程1. 后端Jar包部署-mvn clean package -Dmaven.test.skiptrue生成target/exam-system-1.0.jar- 上传至服务器/opt/exam/backend/- 创建启动脚本start.sh#!/bin/bash nohup java -Xms512m -Xmx1024m -jar /opt/exam/backend/exam-system-1.0.jar --spring.profiles.activeprod /opt/exam/logs/backend.log 21 echo $! /opt/exam/pid/backend.pidchmod x start.sh执行./start.sh2. Nginx反向代理配置/etc/nginx/conf.d/exam.confserver { listen 80; server_name exam.yourdomain.com; # 前端静态资源 location / { root /opt/exam/frontend/dist; try_files $uri $uri/ /index.html; } # 后端API代理 location /api/ { proxy_pass http://localhost: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; proxy_connect_timeout 30s; proxy_send_timeout 30s; proxy_read_timeout 30s; } }执行nginx -t systemctl reload nginx生效。3. MySQL生产配置优化/etc/my.cnf追加[mysqld] # 连接数 max_connections 500 # 查询缓存MySQL 5.7仍支持 query_cache_type 1 query_cache_size 268435456 # 256MB # 日志 slow_query_log 1 slow_query_log_file /var/log/mysql/slow.log long_query_time 24.3 毕业设计材料配套如何把代码变成论文亮点springboot230论文录像.mp4不是简单录屏而是结构化讲解-0:00-3:20问题提出——现有在线考试系统在组卷灵活性、防作弊能力、成绩分析维度上的不足-3:21-8:15系统设计——用UML活动图展示“随机组卷”流程对比传统随机与加权随机的误差率图表-8:16-15:40关键技术实现——现场打开IDEA调试PaperGenerateServiceImpl.java演示断点跟踪权重计算过程-15:41-22:30测试验证——用JMeter模拟100并发组卷展示响应时间监控面板证明性能达标开题报告.doc和任务书.doc已按本科论文规范填写重点突出-创新点不是“用了Spring Boot”而是“基于知识点权重与难度系数的四维动态组卷算法”-工作量明确写出“完成12张数据表设计、8个核心Controller、15个Vue组件、3套测试用例单元测试覆盖率75%”-进度计划甘特图精确到周第4周完成数据库设计第8周完成前后端联调第12周完成论文初稿注意事项答辩PPTppt.pptx第7页“系统架构图”是重点。不要放抽象的“前端-后端-数据库”三层图而要画出真实组件Vue Router路由配置、Axios拦截器、Spring Security Filter Chain、MyBatis-Plus的BaseMapper继承关系。评委一看就知道你真懂。5. 常见问题排查与避坑指南那些文档里不会写的血泪经验5.1 启动失败类问题速查表现象可能原因解决方案后端启动报java.lang.ClassNotFoundException: javax.servlet.FilterJDK版本错误用了JDK 11降级到JDK 8u291或在pom.xml中添加dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion4.0.1/versionscopeprovided/scope/dependency前端npm run serve报Cannot find module vue-template-compilerNode.js版本过高Vue CLI 4.x不兼容Node 16降级Node.js到14.21.3或执行npm install vue-template-compiler^2.6.14登录后跳转404地址栏显示http://localhost:8081/#/dashboard但页面空白Vue Router模式为historyNginx未配置try_files修改vue.config.js中historyApiFallback: true或生产环境改用hash模式mode: hashMySQL连接报Access denied for user rootlocalhostMySQL 5.7默认密码策略严格root密码为空或简单密码被拒绝执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123456; FLUSH PRIVILEGES;5.2 功能异常类问题深度解析问题随机组卷总是抽到同一套题根源在于db.sql中question_bank表的id是自增主键而ORDER BY RAND()在小数据集上容易因索引优化导致结果相似。解决方案在PaperGenerateServiceImpl.java的SQL查询中强制使用FORCE INDEX(PRIMARY)// 原SQL SELECT * FROM question_bank WHERE knowledge_point ? AND type ? AND difficulty ? ORDER BY RAND() LIMIT ? // 修改为 SELECT * FROM question_bank FORCE INDEX(PRIMARY) WHERE knowledge_point ? AND type ? AND difficulty ? ORDER BY RAND() LIMIT ?问题考生交卷后成绩为0但答题记录存在这是典型的事务传播问题。ExamController.submit()方法上标注了Transactional但autoMark()调用的是另一个Service的方法。若MarkService未加Transactional则autoMark()的数据库操作不在同一事务中submit()回滚时autoMark()已提交的数据无法回滚。修复在MarkService.autoMark()上也添加Transactional(propagation Propagation.REQUIRED)。问题Chrome浏览器考试倒计时跳变如从10:00突然跳到09:58这是requestAnimationFrame在页面非激活状态下暂停导致的。解决方案在handleVisibilityChange()中若document.hidden为true记录暂停时间戳恢复时计算差值修正remainingTimedata() { return { startTime: 0, pauseTime: 0, remainingTime: 0, isPaused: false } }, methods: { handleVisibilityChange() { if (document.hidden) { this.isPaused true; this.pauseTime Date.now(); } else if (this.isPaused) { this.isPaused false; const diff Date.now() - this.pauseTime; this.remainingTime Math.max(0, this.remainingTime - diff); this.startTimer(); // 重新启动动画帧 } } }5.3 二次开发扩展建议让系统真正为你所用这套系统不是终点而是起点。根据我指导32个学生的经验推荐三个高价值扩展方向1. 增加人脸识别监考轻量级不需接入商业SDK用face-api.jsMIT协议在前端实现- 考试开始时调用navigator.mediaDevices.getUserMedia({ video: true })获取摄像头流- 用face-api.detectSingleFace(videoElement)每秒检测一次人脸若连续3秒未检测到弹窗警告并记录- 将检测结果是否在画面中、人脸角度通过/api/v1/exam/monitor上报后端存入exam_monitor_log表2. 题库智能推荐基于考生历史错题用协同过滤算法推荐相似题目- 在question_bank表增加similarity_vectorJSON字段存TF-IDF向量- 当考生答错“Spring Bean生命周期”题查询similarity_vector余弦相似度0.8的其他题目加入“强化练习”模块3. 成绩预测模型用Python训练简单线性回归模型Scikit-learn预测考生期末成绩- 特征章节测试平均分、作业提交率、考试用时、切屏次数- 目标期末考试成绩- 将模型保存为model.pkl用Flask封装API前端调用/api/v1/predict/score获取预测值最后分享一个小技巧所有视频文件springboot230论文录像.mp4等都经过FFmpeg压缩命令为ffmpeg -i input.mp4 -vcodec libx264 -crf 28 -preset fast output.mp4在保证画质前提下体积减少65%方便上传网盘。你也可以用同样命令压缩自己的演示视频。本文还有配套的精品资源点击获取简介直接可用的远程在线考试系统完整工程后端用Spring Boot 2.x开发提供RESTful接口前端基于Vue.js构建适配PC与主流移动浏览器支持考生账号登录、题库管理、按规则随机抽题组卷、倒计时答题、客观题自动判分、主观题教师批阅、成绩实时统计与导出。压缩包里包含全部源码含前后端分离结构、MySQL 5.7兼容建表语句db.sql、Maven依赖配置pom.xml、详细启动步骤README.md和使用前必读.txt、毕业设计全套材料开题报告、任务书、答辩PPT、两段高清实操视频——一段展示系统从启动到全流程考试操作另一段讲解论文核心设计与实现逻辑。本地已验证运行环境JDK 8、Node.js 14、Chrome/Firefox/Edge最新版。适合本科毕设快速落地、课程实训项目复现或二次功能扩展学习。本文还有配套的精品资源点击获取