基于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浏览器端后台管理(移动端功能没有减少),管理员后台(用户管理、试卷管理、题库管理),教师后台(试卷管理、题库管理);

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

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

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

部分后端代码展示

java 复制代码
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);
        }

    }

部分前端代码展示

javascript 复制代码
<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微信小程序

相关推荐
忒可君1 分钟前
C# winform 报错:类型“System.Int32”的对象无法转换为类型“System.Int16”。
java·开发语言
斌斌_____16 分钟前
Spring Boot 配置文件的加载顺序
java·spring boot·后端
路在脚下@25 分钟前
Spring如何处理循环依赖
java·后端·spring
一个不秃头的 程序员1 小时前
代码加入SFTP JAVA ---(小白篇3)
java·python·github
丁总学Java1 小时前
--spring.profiles.active=prod
java·spring
苹果醋31 小时前
React系列(八)——React进阶知识点拓展
运维·vue.js·spring boot·nginx·课程设计
上等猿1 小时前
集合stream
java
java1234_小锋1 小时前
MyBatis如何处理延迟加载?
java·开发语言
菠萝咕噜肉i1 小时前
MyBatis是什么?为什么有全自动ORM框架还是MyBatis比较受欢迎?
java·mybatis·框架·半自动
林的快手1 小时前
209.长度最小的子数组
java·数据结构·数据库·python·算法·leetcode