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

news2024/10/6 18:21:41

摘要

基于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微信小程序

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

netmask一键修改子网掩码(KALI工具系列八)

目录 1、KALI LINUX简介 2、netmask工具简介 3、在KALI中使用netmask 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、命令示例 4.1 查看版本 4.2 修改etho的子网掩码 4.3 查看状态信息 4.4 查看子网掩码 4.5 查看范围 4.6 DNS查看 5.、总结 1、KAL…

【实际项目精选源码】ehr人力资源管理系统实现案例(java,vue)

一、项目介绍 一款全源码可二开&#xff0c;可基于云部署、私有部署的企业级数字化人力资源管理系统&#xff0c;涵盖了招聘、人事、考勤、绩效、社保、酬薪六大模块&#xff0c;解决了从人事招聘到酬薪计算的全周期人力资源管理&#xff0c;符合当下大中小型企业组织架构管理运…

Redis可视化工具:Another Redis Desktop Manager下载安装使用

1.Github下载 github下载地址&#xff1a; Releases qishibo/AnotherRedisDesktopManager GitHub 2. 安装 直接双击exe文件进行安装 3. 连接Redis服务 先启动Redis服务&#xff0c;具体启动过程可参考&#xff1a; Windows安装并启动Redis服务端&#xff08;zip包&#xff09…

Linux -- 进程间通信的五种方式

IPC&#xff08;InterProcess Communication&#xff09;的方式通常有管道&#xff08;包括无名管道和命名管道&#xff09;、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和Stream支持不同主机上的两个进程IPC。 管道&#xff08;Pipes&#xff09;&#xff1a…

618快到了,送大家一款自动化脚本工具,一起薅羊毛

前言 一年一次的618活动来了&#xff0c;大家做好准备了&#xff0c;奇谈君为大家准备好用的618神器&#xff0c;解放双手&#xff0c;简单操作就可以把红包拿到手。 京淘自动助手 首次使用前需要进行设置 将手机的无障碍权限和悬浮窗权限打开 设置完成后&#xff0c;可以把…

编程实战:类C语法的编译型脚本解释器(四)总入口和使用方法

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 系列入口&#xff1a; 编程实战…

深入了解数据库设计中的规范化与反规范化

目录 零、前言 一、一些基本术语 二、关系模式 2.1. 什么是关系模式 2.2. 示例 三、数据依赖 3.1. 函数依赖 3.1.1. 完全函数依赖 3.1.2. 部分函数依赖 3.1.3. 传递函数依赖 3.2. 多值依赖 3.3. 连接依赖 四、规范化 4.1. 第一范式&#xff08;1NF&#xff09; …

Redis 性能管理

一、Redis 性能管理 #查看Redis内存使用 172.168.1.11:6379> info memory 1. 内存碎片率 操作系统分配的内存值 used_memory_rss 除以 Redis 使用的内存总量值 used_memory 计算得出。内存值 used_memory_rss 表示该进程所占物理内存的大小&#xff0c;即为操作系统分配给…

批量化处理和矩阵(torch)

左边是权重&#xff0c;右边是变量 高维可以看成二维的堆叠 总结&#xff1a;二维是一维的堆叠&#xff0c;三维是二维的堆叠。但似乎是为了引入矩阵&#xff0c;本来应该是左上角是第一组权重和第一组变量的乘积这种表示表示来着&#xff0c;最后成了和列向量乘积&#xff…

Python | Leetcode Python题解之第111题二叉树的最小深度

题目&#xff1a; 题解&#xff1a; class Solution:def minDepth(self, root: TreeNode) -> int:if not root:return 0que collections.deque([(root, 1)])while que:node, depth que.popleft()if not node.left and not node.right:return depthif node.left:que.appen…

认识K8s集群的声明式资源管理方法

前言 Kubernetes 集群的声明式资源管理方法是当今云原生领域中的核心概念之一&#xff0c;使得容器化应用程序的部署和管理变得更加高效和可靠。本文将认识了解 Kubernetes 中声明式管理的相关理念、实际应用以及优势。 目录 一、管理方法介绍 1. 概述 2. 语法格式 2.1 管…

猫头虎 解析:为什么AIGC在国内适合做TOB,在国外适合做TOC?

猫头虎 解析&#xff1a;为什么AIGC在国内适合做TOB&#xff0c;在国外适合做TOC&#xff1f; 博主 猫头虎 的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面…

掩码生成蒸馏——知识蒸馏

摘要 https://arxiv.org/pdf/2205.01529 知识蒸馏已成功应用于各种任务。当前的蒸馏算法通常通过模仿教师的输出来提高学生的性能。本文表明&#xff0c;教师还可以通过指导学生的特征恢复来提高学生的表示能力。从这一观点出发&#xff0c;我们提出了掩码生成蒸馏&#xff08…

《图解支付系统设计与实现》电子书_V20240525

相较于上次公开发布的V20240503版本&#xff0c;变更内容如下&#xff1a; 根据掘金网友zz67373&#xff08;李浩铭&#xff09;的勘误建议&#xff0c;优化了部分描述。增加&#xff1a;金额处理规范&#xff0c;低代码报文网关实现完整代码&#xff0c;分布式流控等内容。扩…

Golang | Leetcode Golang题解之第111题二叉树的最小深度

题目&#xff1a; 题解&#xff1a; func minDepth(root *TreeNode) int {if root nil {return 0}queue : []*TreeNode{}count : []int{}queue append(queue, root)count append(count, 1)for i : 0; i < len(queue); i {node : queue[i]depth : count[i]if node.Left …

(十一)统计学基础练习题五(50道选择题)

本文整理了统计学基础知识相关的练习题&#xff0c;共50道&#xff0c;适用于想巩固统计学基础或备考的同学。来源&#xff1a;如荷学数据科学题库&#xff08;技术专项-统计学二&#xff09;。序号之前的题请看往期文章。 201&#xff09; 202&#xff09; 203&#xff09; 2…

LeetCode 第131场双周赛个人题解

100309. 求出出现两次数字的 XOR 值 原题链接 求出出现两次数字的 XOR 值 - 力扣 (LeetCode) 竞赛 思路分析 签到题&#xff0c;一次遍历 AC代码 class Solution:def duplicateNumbersXOR(self, nums: List[int]) -> int:cnt Counter(nums)res 0st set(nums)for x …

linux系统环境—基础开发工具

目录 1. yum工具&#xff0c;进行软件安装 示例&#xff1a;下载第一个软件 2. vim编辑器&#xff0c;学会vim的简单配置 vim的基本操作 vim末行模式命令集 插入模式与普通编辑器差不多。无命令集合 3. gcc/g编译器的使用&#xff0c;并了解其过程&#xff0c;原理 1预…

脚注:书籍的小秘密,躲藏在脚注间

脚注&#xff1a;书籍的小秘密&#xff0c;躲藏在脚注间 脚注是一种在文本中提供补充信息、引用出处或注解的方式&#xff0c;有助于读者更全面地理解文中内容&#xff0c;并为进一步研究提供参考和跳转点。 在一书本中&#xff0c;脚注是额外提供给读者的文字信息&#xff0…

java:static关键字用法

在静态方法中不能访问类的非静态成员变量和非静态方法&#xff0c; 因为非静态成员变量和非静态方法都必须依赖于具体的对象才能被调用。 从上面代码里看出&#xff1a; 1.静态方法不能调用非静态成员变量。静态方法test2()中调用非静态成员变量address&#xff0c;编译失败…