基于Java、SpringBoot和uniapp在线考试系统安卓APP和微信小程序

摘要

基于Java、SpringBoot和uniapp的在线考试系统安卓APP微信小程序是一种结合了现代Web开发技术和移动应用技术的解决方案,旨在为教育机构提供一个方便、高效和灵活的在线考试平台。该系统采用Java语言进行后端开发,使用SpringBoot框架简化企业级应用的开发流程。同时,利用uniapp框架开发跨平台的移动应用程序和微信小程序,以满足不同用户的需求。

在这个系统中,用户可以在安卓设备上安装APP或通过微信搜索小程序来访问在线考试功能。学生可以参加考试、查看成绩和学习进度,教师可以创建和管理试卷,设置考试时间限制等。

总之,基于Java、SpringBoot和uniapp的在线考试系统安卓APP微信小程序为教育机构提供了一个便捷、高效和灵活的在线考试解决方案,有助于提高教育质量和效率。

使用的技术

后端:Java语言,SpringBoot框架,MySql数据库,Maven依赖管理等;

前端:Vue.js语法的uni-app框架。

版本1实现的功能

管理员、教师、学生三种角色;

用户登录:管理员、教师和学生均可以使用自己的账号和密码进行登录APP;

人员管理:管理员可以对老师和学生的身份信息编辑、删除,老师可以对学生的身份信息进行编辑和删除;

考试记录:参与过考试的人员可以查看自己的考试记录,包括成绩和试题答案;

试卷管理:管理员和老师可以对试卷进行管理,包括添加试卷、添加试题、发布试卷等操作;

版本2在1的基础上新增如下功能

由原来的只支持APP改为支持APP和微信小程序;

管理员和教师新增PC浏览器端后台管理(移动端功能没有减少),管理员后台(用户管理、试卷管理、题库管理),教师后台(试卷管理、题库管理);

新增题库管理,试卷可以从题库选择已有的试题;

试卷添加之后可以一键自动组卷,添加试题到试卷里面去,也可以手动修改试卷的试题内容;

教师和管理员可以为试卷添加考试人员,只有被添加的人才能进行那套试卷的在线考试。

部分后端代码展示

public ResponseResult<Object> queryListWithNum(ExamPaper examPaper) {
        QueryWrapper<ExamPaper> queryWrapper;
        if(StringUtils.isNotEmpty(examPaper.getPaperName())) {
            queryWrapper= new QueryWrapper<ExamPaper>();
            queryWrapper.like("paper_name",examPaper.getPaperName());
        }else {
            queryWrapper= new QueryWrapper<ExamPaper>(examPaper);
        }
        List<ExamPaper> paperList = examPaperMapper.selectList(queryWrapper);
        for (ExamPaper paper:paperList){
            ExamTest examTest = new ExamTest();
            examTest.setValidFlag(1);
            examTest.setState(0);
            examTest.setPid(paper.getPid());
            QueryWrapper<ExamTest> queryWrapperTest = new QueryWrapper<ExamTest>(examTest);
            paper.setUnStartNum(examTestMapper.selectCount(queryWrapperTest));
            examTest.setState(1);
            paper.setPassNum(examTestMapper.selectCount(queryWrapperTest));
            examTest.setState(2);
            paper.setFailNum(examTestMapper.selectCount(queryWrapperTest));

            ExamQuestion examQuestion = new ExamQuestion();
            examQuestion.setValidFlag(1);
            examQuestion.setType(0);
            QueryWrapper<ExamQuestion> queryWrapperQuestion = new QueryWrapper<ExamQuestion>(examQuestion);
            paper.setSingleCount(examQuestionMapper.selectCount(queryWrapperQuestion));
            examQuestion.setType(1);
            paper.setMultiCount(examQuestionMapper.selectCount(queryWrapperQuestion));
            examQuestion.setType(2);
            paper.setJudgeCount(examQuestionMapper.selectCount(queryWrapperQuestion));

        }
        return new ResponseResult<Object>(ResponseCode.SUCCESS,"查询成功",paperList);
    }

    public ResponseResult<Object> autoCreatePaper(ExamPaper examPaper) {

        QueryWrapper<ExamPaper> queryWrapper = new QueryWrapper<ExamPaper>(examPaper);
        examPaper = examPaperMapper.selectOne(queryWrapper);

        ExamQuestion examQuestion = new ExamQuestion();
        examQuestion.setValidFlag(1);
        examQuestion.setType(0);
        examQuestion.setPid(examPaper.getPid().intValue());
        QueryWrapper<ExamQuestion> queryWrapperQuestion = new QueryWrapper<ExamQuestion>(examQuestion);

        examPaper.setSingleCount(examQuestionMapper.selectCount(queryWrapperQuestion));
        examQuestion.setType(1);
        examPaper.setMultiCount(examQuestionMapper.selectCount(queryWrapperQuestion));
        examQuestion.setType(2);
        examPaper.setJudgeCount(examQuestionMapper.selectCount(queryWrapperQuestion));

        if(examPaper.getSingleNum()>0){
            int limit = examPaper.getSingleNum() - examPaper.getSingleCount();
            if(limit > 0){
                List<ExamQuestion> randQue = examQuestionMapper.getRandQuestion(0,limit);
                autoAddItem(randQue, examPaper);
            }
        }

        if(examPaper.getMultiNum()>0){
            int limit = examPaper.getMultiNum() - examPaper.getMultiCount();
            if(limit > 0){
                List<ExamQuestion> randQue = examQuestionMapper.getRandQuestion(1,limit);
                autoAddItem(randQue, examPaper);
            }
        }

        if(examPaper.getSingleNum()>0){
            int limit = examPaper.getJudgeNum() - examPaper.getJudgeCount();
            if(limit > 0){
                List<ExamQuestion> randQue = examQuestionMapper.getRandQuestion(2,limit);
                autoAddItem(randQue, examPaper);
            }
        }
        return new ResponseResult<Object>(ResponseCode.SUCCESS,"创建成功");
    }

    public void autoAddItem(List<ExamQuestion> randQue,ExamPaper paper){
        if(randQue==null||randQue.isEmpty())
            return;
        for(ExamQuestion one:randQue){
            one.setPid(paper.getPid().intValue());
            one.setQid(null);
            examQuestionMapper.insert(one);
        }

    }

部分前端代码展示

<template>  
    <view class="container">  
		
		<view class="user-section">
			<image class="bg" src="/static/user-bg.jpg"></image>
			<view class="user-info-box">
				<view class="portrait-box">
					<image style="background-color: white;" class="portrait" :src="getHead()"></image>
				</view>
				<view class="info-box" >
					<text class="username">{{ user.nickName || '游客'}}</text>
					<view class="info-box" v-if="user.userName">
						<text class="username">姓名:<text class="u-tips-color">{{  user.userName }}</text></text>
					</view>
					<view class="info-box" v-if="user.userClass">
						<text class="username">班级:<text class="u-tips-color">{{  user.userClass }}</text></text>
					</view>
				</view>
				
				
			</view>
		</view>
		
		
		<view class="u-flex u-direction-row u-row-center" v-if="!user">
			<view class="container">
				<view class="list-cell " style="text-align: center;">
					<text class="cell-tit" style="color: #909399;">游客无法享受购物的快乐</text>
				</view>
				<view class="list-cell log-out-btn" @click="toLogin">
					<text class="cell-tit">前往登录</text>
				</view>
			</view>
		</view>
		
		
		
		<view v-if="user"
			class="cover-container"
			:style="[{
				transform: coverTransform,
				transition: coverTransition
			}]"
			@touchstart="coverTouchstart"
			@touchmove="coverTouchmove"
			@touchend="coverTouchend"
		>
			<image class="arc" src="/static/arc.png"></image>
			
			<view v-if="user.type != 2">
				<view class="tj-sction u-p-t-20 u-font-30" style="color: #2979ff;">
					管理专区
				</view>
				<view class="" style="background-color: white;">
					<view @click="jumpToAddUser(2)" class="u-p-20 u-border-bottom">添加学生</view>
					<view   @click="jumpToAddUser(1)" v-if="user.type==0" class="u-p-20 u-border-bottom">添加教师</view>
					<view  @click="jumpToUsrList"  class="u-p-20 u-border-bottom">人员管理</view>
					<view  @click="jumpToResList"  class="u-p-20">题库管理</view>
				</view>
			</view>
			
			
			
			
			<!-- 浏览历史 -->
			<view class="history-section icon">
				<view class="sec-header">
					<text>其他功能</text>
				</view>

				<list-cell icon="icon-shezhi1" iconColor="#e07472" title="设置" border="" @eventClick="navTo('/pages/set/set')"></list-cell>
				<list-cell icon="icon-share" iconColor="#3f80de" title="退出登录" border="" @eventClick="toLogout"></list-cell>
			</view>
		</view>
			
		
    </view>  
</template>  

演示视频

基于Java和UniAPP在线考试系统安卓APP微信小程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/642395.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

储能服务系统架构:实现能源可持续利用的科技之路

随着可再生能源的快速发展和能源系统的智能化需求增加&#xff0c;储能技术作为能源转型和可持续发展的关键支撑之一&#xff0c;备受各界关注。储能服务系统架构的设计和实现将对能源行业产生深远影响。本文将探讨储能服务系统架构的重要性和关键组成部分&#xff0c;旨在为相…

【C++高阶(一)】继承

目录 一、继承的概念 1.继承的基本概念 2.继承的定义和语法 3.继承基类成员访问方式的变化 ​编辑 4.总结 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 1.派生类中的默认构造函数 2.派生类中的拷贝构造函数 3.派生类中的移动构造函数…

二维轮廓自动添加屋顶

1、背景介绍 在提取建筑物轮廓点后&#xff0c;对轮廓点进行简化得到建筑物轮廓线。将轮廓线进行拉伸&#xff0c;变可得到建筑物白膜&#xff0c;如下图所示。这种形状比较简单&#xff0c;所重建模型实质上就是一个个立方体盒子&#xff0c;缺少屋顶细节&#xff0c;视觉观感…

玩转盲盒潮流:从0到1搭建小程序平台

在当前的消费市场中&#xff0c;盲盒已成为一种炙手可热的消费模式&#xff0c;凭借其神秘性和随机性&#xff0c;迅速俘获了年轻消费者的心。作为一位有志于创新并紧跟市场趋势的创业者&#xff0c;你可能会想&#xff1a;如何从0到1搭建一个属于自己的盲盒小程序平台&#xf…

SpringBoot高级原理详解

文章目录 1 SpringBoot自动化配置原理01-SpringBoot2高级-starter依赖管理机制02-SpringBoot2高级-自动化配置初体验03-SpringBoot2高级-底层原理-Configuration配置注解04-SpringBoot2高级-底层原理-Import注解使用105-SpringBoot2高级-底层原理-Import注解使用206-SpringBoot…

linux---线程控制

线程和进程 以前我们要同时跑多个程序&#xff0c;可以通过fork()多个子进程&#xff0c;然后通过系统函数进行程序的替换&#xff0c;但是创建进程代价大&#xff0c;不仅要拷贝一份父进程的地址空间&#xff0c;页表&#xff0c;文件表述符表等。但是线程不需要因为是进程的…

frp搭建内网流量转发

前提条件 有一台外网服务器 背景介绍 外网服务器linux内网客户端Windows 10下载frp软件安装包 下载地址:https://github.com/fatedier/frp/releases 服务端软件包下载 客户端软件包下载 服务端部署 解压软件包 tar xzvf frp_0.58.0_linux_amd64.tar.gz修复加压后文件夹名…

TemperMonkey在百度搜索页面,提供跳转其他平台搜索、与批量打开搜索结果的功能的脚本代码

代码 // UserScript // name 百度搜索。链接其他搜索。跳转功能。 // namespace http://tampermonkey.net/ // version 0.1(2020-6-24 17:37:27) // description try to take over the world! // author gwd // match https://www.baidu.com/s?…

深度学习中的优化算法一(Pytorch 18)

一 优化和深度学习 优化算法 使我们能够 继续更新模型参数&#xff0c; 并使损失函数的值最小化。这就像在训练集上评估一样。事实上&#xff0c;任何满足于将优化视为黑盒装置&#xff0c;以在简 单的设置中最小化目标函数的人&#xff0c;都可能会知道存在着一系列此类“咒…

Vivado报错集合

Synth 8-5535 报错代码 [Synth 8-5535] port <clk_0> has illegal connections. It is illegal to have a port connected to an input buffer and other components. The following are the port connections : Input Buffer:Port I of instance clkin1_ibufg(IBUF) i…

监控服务器性能指标,提升服务器性能

服务器是网络中最关键的组件之一&#xff0c;混合网络架构中的每个关键活动都以某种方式与服务器操作相关&#xff0c;服务器不仅是现代计算操作的支柱&#xff0c;也是网络通信的关键。 从发送电子邮件到访问数据库和托管应用程序&#xff0c;服务器的可靠性和性能直接影响到…

打开服务器远程桌面连接不上,可能的原因及相应的解决策略

在解决远程桌面连接不上服务器的问题时&#xff0c;我们首先需要从专业的角度对可能的原因进行深入分析&#xff0c;并据此提出针对性的解决方案。以下是一些可能的原因及相应的解决策略&#xff1a; 一、网络连接问题 远程桌面连接需要稳定的网络支持&#xff0c;如果网络连接…

【车载开发系列】Autosar中的VFB

【车载开发系列】Autosar中的VFB # 【车载开发系列】Autosar中的VFB 【车载开发系列】Autosar中的VFB一. 什么是VFB二. VFB的优点与缺点1&#xff09;VFB的缺点2&#xff09;VFB的好处 三. RTE与VFB之间关系四. 总线架构模式 一. 什么是VFB Virtual Functional Bus。它就是虚拟…

对话:用言语构建深刻的思想碰撞

对话&#xff1a;用言语构建深刻的思想碰撞 在写书中&#xff0c;对话是一种有力的工具&#xff0c;能与读者进行有效的沟通和交流&#xff0c;引发深思和反思。它不仅是信息传递的方式&#xff0c;更是加深情感、探讨主题和吸引读者参与的桥梁。你应从读者的角度思考&#xf…

labelme的使用

创建虚拟环境 听说是要用这个3.6版本的python环境 conda create --namelabelme python3.6激活虚拟环境 activate labelme下载labelme pip install labelme #安装labelme组件启动labelme 在你打开文件的时候推荐还是自己先建立一个label.txt 把自己要分的类别放进去 label.…

AI | 基于扣子 Coze 零代码手把手从 0-1 搭建专属 Bot 机器人

前言 无论是智能语音助手、聊天机器人&#xff0c;还是自动化流程机器人&#xff0c;它们都在为我们提供更加便捷、高效的服务。然而&#xff0c;对于非专业人士来说&#xff0c;搭建一个属于自己的机器人似乎是一项遥不可及的任务。基于扣子 Coze 零代码平台&#xff0c;我们…

【评价类模型】层次分析法(AHP)

1.评价类思想综述&#xff1a; 明确评价主体–>评价指标确定–>计算指标权重–>方案评价 1.1指标确定&#xff1a; 可以通过一个思维导图的方式来画出一个指标系统&#xff0c;先确定方向&#xff0c;再向下细化 注意&#xff1a;指标需要具有贴合性和独立性。 贴合…

【Python】【Scrapy 爬虫】理解HTML和XPath

为了从网页中抽取信息&#xff0c;必须对其结构有更多了解。我们快速浏览HTML、HTML的树状表示&#xff0c;以及在网页上选取信息的一种方式XPath。 HTML、DOM树表示以及XPath 互联网是如何工作的&#xff1f; 当两台电脑需要通信的时候&#xff0c;你必须要连接他们&#xff…

盖雅技能发展云,助力制造企业人效合一

制造行业尽管经历多次变革&#xff0c;但企业对人的管理始终是一项高度依赖经验和耗费人力的工作。随着供应链管理和生产设备的自动化、数字化升级&#xff0c;如何将第一生产要素——人&#xff0c;通过数字化的工具融入制造过程的闭环&#xff0c;对企业实现自动化工厂和智能…

C语言 | Leetcode C语言题解之第101题对称二叉树

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isSymmetric(struct TreeNode* root) {if (root NULL) return true;//如果根为空直接…