基于SpringBootAI的在线考试管理系统程序代码下载本系统是一个基于 B/S 架构、前后端分离的在线考试与刷题练习平台面向学校教学场景覆盖“出题→考试→判分→错题巩固→学情分析”的完整教学闭环。系统将 AI 大模型能力Spring AI深度融入刷题、考试、错题复习等核心环节为不同角色学生、教师、管理员提供差异化的功能与数据视图。层次技术版本用途后端框架Spring Boot3.2.5Web 服务、依赖管理运行环境Java17后端运行时ORMMyBatis-Plus3.5.5数据访问、分页、逻辑删除数据库MySQL8.xutf8mb4业务数据存储AI 框架Spring AIOpenAI 兼容 starter1.0.0-M5对接大模型服务前端框架Vue3.5用户界面Composition API构建工具Vite8前端开发与构建UI 组件库Element Plus2.14界面组件状态管理Pinia3全局状态用户/考试/题目/配置路由Vue Router4SPA 路由与守卫HTTP 客户端Axios1.x前后端通信辅助工具Lombok、Validation—简化代码、参数校验学生端/student模块功能大厅首页个人学习数据总览、公告浏览、AI 学习建议浏览题库按科目/题型浏览题目与解析刷题练习随机抽题练习即时判分练习记录留存模拟考试查看已发布考试→进入考试答题限时计时→交卷自动判分出分我的成绩历史考试成绩、得分明细、用时统计错题本考试/练习错题自动归集、AI 错题分析、标记“已掌握/待复习”AI 智能助手多轮对话问答结合个人学习数据给出解答与建议个人中心资料修改、头像上传前端压缩、密码修改教师端/teacher模块功能教师主页所授科目题量、考试场次、成绩概况题库管理题目增删改查、批量录入、AI 自动生成答案解析、图片上传考试管理创建考试选题组卷、设置时长/总分/及格分/起止时间、发布与下架成绩统计考试成绩单、正确率/通过率统计、AI 教学分析薄弱点与教学建议公告管理发布与维护系统公告管理员端/admin模块功能控制台用户数、科目数、题库规模、考试场次等全局概览用户管理三类用户分页查询、新增/禁用/删除、密码重置科目管理科目维护与任课教师分配数据统计全平台学习/考试数据统计系统设置系统参数与 AI 模型在线配置密钥加密存储于 sys_config公告管理全局公告维护参考代码packagecom.studyroom.ai;importcom.studyroom.ai.model.*;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Service;importjava.util.ArrayList;importjava.util.List;importjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;Slf4jServicepublicclassAIChatService{privatefinalSparkAIClient sparkClient;privatefinalAIToolRegistry toolRegistry;privatefinalMapLong, ListSparkMessagesessionHistorynewConcurrentHashMap();privatefinaldoubletemperature;privatefinalintmaxTokens;privatestaticfinalStringSYSTEM_PROMPT你是校园自习室预约系统的AI助手可以帮助用户查询系统各类数据、预约座位、管理预约等。你可以查询以下数据【自习室】自习室列表、详情、座位布局、可用座位【预约】我的预约记录、预约座位、取消预约、签到、签退【个人】个人信息姓名/学号/院系/信用分、信用积分变动记录【消息】我的消息通知、未读消息【公告】系统公告列表【反馈】我提交的意见反馈及处理状态【评价】座位评价列表及平均评分【统计】系统整体数据用户数、预约数、热门时段、热门座位等注意事项- 当用户想预约座位时如果没指定具体时间主动询问日期和时间段- 当用户想查可用座位时如果没指定自习室先列出所有自习室让用户选择- 用户问我的XXX时直接调用对应工具查询无需额外确认- 回复简洁友好用中文适当使用emoji- 如果操作成功用积极的语气告知结果- 如果操作失败解释原因并给出建议- 如果用户的问题涉及多个数据来源可以一次调用多个工具;publicAIChatService(SparkAIClient sparkClient,AIToolRegistry toolRegistry,Value(${spark.temperature})doubletemperature,Value(${spark.max-tokens})intmaxTokens) {this.sparkClient sparkClient;this.toolRegistry toolRegistry;this.temperature temperature;this.maxTokens maxTokens;}publicChatResponsechat(String message, Long userId) {ListSparkMessagehistory sessionHistory.computeIfAbsent(userId, k -newArrayList());if(history.isEmpty()) {history.add(SparkMessage.builder().role(system).content(SYSTEM_PROMPT).build());}history.add(SparkMessage.builder().role(user).content(message).build());SparkRequestrequest SparkRequest.builder().messages(newArrayList(history)).temperature(temperature).max_tokens(maxTokens).tools(toolRegistry.getTools()).tool_choice(auto).build();SparkResponseresponse sparkClient.chat(request);if(response null|| response.getChoices() null|| response.getChoices().isEmpty()) {returnChatResponse.builder().content(抱歉AI 服务暂时无响应请稍后重试。).build();}SparkMessageassistantMessage response.getChoices().get(0).getMessage();history.add(assistantMessage);if(assistantMessage.getTool_calls() !null !assistantMessage.getTool_calls().isEmpty()) {for(ToolCall toolCall : assistantMessage.getTool_calls()) {StringfunctionName toolCall.getFunction().getName();Stringarguments toolCall.getFunction().getArguments();log.info(AI calling tool: {} with args: {}, functionName, arguments);StringtoolResult toolRegistry.execute(functionName, arguments, userId);history.add(SparkMessage.builder().role(tool).tool_call_id(toolCall.getId()).content(toolResult).build());}SparkRequestfollowUp SparkRequest.builder().messages(newArrayList(history)).temperature(temperature).max_tokens(maxTokens).build();SparkResponsefollowUpResponse sparkClient.chat(followUp);if(followUpResponse !null followUpResponse.getChoices() !null !followUpResponse.getChoices().isEmpty()) {SparkMessagefinalMessage followUpResponse.getChoices().get(0).getMessage();history.add(finalMessage);returnChatResponse.builder().content(finalMessage.getContent()).toolCalled(true).build();}}if(history.size() 40) {SparkMessagesystemMsg history.get(0);history.subList(1, history.size() -20).clear();history.add(0, systemMsg);}returnChatResponse.builder().content(assistantMessage.getContent() !null? assistantMessage.getContent():已处理您的请求).build();}publicvoidclearHistory(Long userId) {sessionHistory.remove(userId);}}
企业数字化 ERP 产品动态
相关推荐
【毕设技巧】文献综述怎么写? 这3种综述写法和4个常犯的错误,一篇文章给你列清楚。 💖💖作者:IT跃迁谷毕设展 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数… · 2026/11/4 7:13:30
4、Eureka服务端安装 1. 新建一个eureka server module
<project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.x… · 2026/11/4 7:13:30
设备树其实只描述三件事 前两天调一块 imx6ull 的板子,外挂了一颗 I2C 的温湿度传感器,驱动是从别处拷过来的,按理说改个地址就能跑。结果 probe 死活不进来,dmesg 里干干净净,连个报错都没有。我盯着 arch/arm/boot/dts/imx6ull-myboard.dts … · 2026/11/4 7:12:30
企业健康申报系统设计与高并发优化实践 1. 项目背景与核心需求职工健康每日申报系统是近年来企事业单位健康管理的重要数字化工具。这套系统最初源于2020年特殊时期的企业防疫需求,如今已演变为常态化健康管理平台。以某制造企业(代号M193)为例,其拥有2000余名员工&… · 2026/11/4 14:16:23
Redis读写分离架构与Spring Boot整合实战 1. Redis读写分离架构解析Redis作为高性能键值数据库,在实际生产环境中经常会遇到读多写少的场景。我经历过一个电商项目,大促期间读请求量达到写请求的20倍以上,单节点Redis实例的CPU直接飙到100%。这时候就需要引入读写分离架构来分担主节点… · 2026/11/4 14:16:23
从Claude Code到Pi:AI Coding迁移潮与harness工程实践 1. 这场“迁移潮”到底在迁移什么 最近半年,AI Coding 圈子里一个越来越明显的现象是:不少原本重度使用 Claude Code 的开发者,开始把日常主力工具换成了 Pi。注意,这里说的“放弃”并不是说 Claude Code 一夜之间不能用了&#x… · 2026/11/4 14:16:23
无人船MPAPF路径规划:动态避障与实时决策技术 1. 无人船路径规划的技术挑战与创新方案在无人船自主航行领域,复杂动态环境下的路径规划一直是困扰工程师的核心难题。传统人工势场法(APF)虽然计算效率高,但在多障碍物场景容易陷入局部最优;而模型预测控制࿰… · 2026/11/4 14:16:23
Context即服务:AI时代的新基础设施 1. 入口战争早已结束:当搜索框、App图标和浏览器标签都开始“失语”我第一次意识到“入口”这个词正在失效,是在去年帮一家做智能客服SaaS的客户做架构复盘时。他们花了整整18个月、投入三支前端团队,把产品首页重做了7版——从瀑布流到卡片式… · 2026/11/4 14:16:23
AgentScope多智能体框架实战:消息驱动与工具调用避坑指南 1. 为什么我会盯上 AgentScope 这个多智能体框架第一次听到 AgentScope 这个名字,是在一个做智能客服系统的朋友那里。他当时吐槽说,用某几个主流框架搭多智能体协作,光是让两个 Agent 稳定对话就调了三天,消息传递、状态管理、工… · 2026/11/4 14:15:22
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38