博主介绍:✌全网粉丝3W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌
博主作品:《微服务实战》专栏是本人的实战经验总结,《Spring家族及微服务系列》专注Spring、SpringMVC、SpringBoot、SpringCloud系列、Nacos等源码解读、热门面试题、架构设计等。除此之外还有不少文章等你来细细品味,更多惊喜等着你哦
文末获取联系精彩专栏推荐订阅 不然下次找不到哟
Java项目案例《100套》
https://blog.csdn.net/qq_57756904/category_12173599.html
uniapp小程序《100套》
https://blog.csdn.net/qq_57756904/category_12199600.html
✨【微服务】Nacos为什么丢弃短连接(http)而选择拥抱长连接(gRPC)
目录
一、前言
二、系统设计
1、系统运行环境
2、系统架构设计
三、需求分析简介
1、考试学员
2、系统管理员
四、数据库设计
1、用户信息属性
2、考试信息属性
3、试题信息属性
五、功能截图
1、登录/注册样式
2、考试学员
2.1、准备考试界面
2.2、考试答题界面
2.3、我的成绩界面
2.4、个人资料
3、管理员
3.1、试题管理
3.2、考试管理
3.3、系统设置
3.4、部门管理
3.5、角色管理
3.6、用户管理
六、代码实现
1、用户控制器
2、角色控制器
七、获取源码
一、前言
考试管理系统是一个信息处理的库系统,通过调用编程语言的库函数来进行编写考试管理系统,能够提高编程效率,降低开发成本。计算机的快速发展已经为考试管理系统在社会发展奠定了基础。落后的手工服务也不能够满足广大用户的需求,随着计算机的快速发展,学校开始突破传统的模式,和计算机技术相结合。紧密联系社会的需求,提供的服务是信息化的,能够满足用户的需求,简化了考试管理系统,间接提高了系统的安全性。随着大数据时代来临,信息存储要比以往大得多。在计算机快速发展的今天,有必要采用一套智能化高,操作简单的考试管理系统,这样可以方便管理员和用户,所以开发一个便于操作的管理系统是很有必要的。
21世纪是大数据时代,在信息管理方面,数据量非常多,因此要对大量数据进行处理,所以人们利用计算机开发大量管理系统。计算机的最大好处在于自动化,因此使用计算机处理数据,大大地提高了效率,还提高了系统的安全性。对于越复杂的数据处理,就越能体现计算机的优势。考试管理系统中数据众多,需要处理很多数据。刚开始,对信息处理方式主要是手工的方式进行管理。由于数据量巨大并且还用人工的方式进行管理,则容易出现问题。而且当数据量多起来的时候,数据容易丢失,查找起来也不容易。这样会导致效率低下。
CeaM在线学习考试系统应运而生,是一款基于JAVA开发的,使用SpringBoot+Vue开发的一款多角色在线培训考试系统平台,系统集成了用户管理、角色管理、部门管理、题库管理、试题管理、试题导入导出、考试管理、在线考试、错题训练等功能,考试流程完善。
二、系统设计
开发系统:Windows10
架构模式:MVC/前后端分离
JDK版本:Java JDK1.8
开发工具:IDEA
数据库版本: mysql5.7
数据库可视化工具: SQL yog或Navicat for MySQL
服务器:SpringBoot自带 apache tomcat
主要技术:Java、SpringBoot、MyBatis-plus、MySQL、Shiro、Html、Vue、Elementui等
三、需求分析简介
考试学员首先要完成注册登录,才可以使用系统功能。登录后可以维护自己的个人信息,可以修改密码等。完善个人信息后,可以参与考试,考生应该认证浏览试题信息按要求答题,交卷后系统将自动评卷并且返回学员考试结果。考试学员可以查看自己的考试结果。
系统管理员首先要完成注册登录,才可以使用系统功能。登录后可以维护自己的个人信息,可以修改密码等。系统管理员负责试题管理,包括设置试题题目、设置选项、答案解析等。负责考试的设置,包括考试名称、考试描述、总分数、及格线、考试时长等的设置维护。系统管理员还可以设置系统信息,管理部门、用户以及角色等信息。
四、数据库设计
部分数据库实体E-R图:
五、功能截图
交卷后系统自动改卷并且显示考试结果
六、代码实现
@Api(tags = {"管理用户"})
@RestController
@RequestMapping("/exam/api/sys/user")
public class SysUserController extends BaseController {
@Autowired
private SysUserService baseService;
/**
* 用户登录
* @return
*/
@CrossOrigin
@ApiOperation(value = "用户登录")
@RequestMapping(value = "/login", method = {RequestMethod.POST})
public ApiRest login(@RequestBody SysUserLoginReqDTO reqDTO) {
SysUserLoginDTO respDTO = baseService.login(reqDTO.getUsername(), reqDTO.getPassword());
return super.success(respDTO);
}
/**
* 用户登录
* @return
*/
@CrossOrigin
@ApiOperation(value = "用户登录")
@RequestMapping(value = "/logout", method = {RequestMethod.POST})
public ApiRest logout(HttpServletRequest request) {
String token = request.getHeader("token");
System.out.println("+++++当前会话为:"+token);
baseService.logout(token);
return super.success();
}
/**
* 获取会话
* @return
*/
@ApiOperation(value = "获取会话")
@RequestMapping(value = "/info", method = {RequestMethod.POST})
public ApiRest info(@RequestParam("token") String token) {
SysUserLoginDTO respDTO = baseService.token(token);
return success(respDTO);
}
/**
* 修改用户资料
* @return
*/
@ApiOperation(value = "修改用户资料")
@RequestMapping(value = "/update", method = {RequestMethod.POST})
public ApiRest update(@RequestBody SysUserDTO reqDTO) {
baseService.update(reqDTO);
return success();
}
/**
* 保存或修改系统用户
* @return
*/
@ApiOperation(value = "保存或修改")
@RequestMapping(value = "/save", method = {RequestMethod.POST})
public ApiRest save(@RequestBody SysUserSaveReqDTO reqDTO) {
baseService.save(reqDTO);
return success();
}
/**
* 批量删除
* @param reqDTO
* @return
*/
@ApiOperation(value = "批量删除")
@RequestMapping(value = "/delete", method = { RequestMethod.POST})
public ApiRest edit(@RequestBody BaseIdsReqDTO reqDTO) {
//根据ID删除
baseService.removeByIds(reqDTO.getIds());
return super.success();
}
/**
* 分页查找
* @param reqDTO
* @return
*/
@ApiOperation(value = "分页查找")
@RequestMapping(value = "/paging", method = { RequestMethod.POST})
public ApiRest> paging(@RequestBody PagingReqDTO reqDTO) {
//分页查询并转换
IPage page = baseService.paging(reqDTO);
return super.success(page);
}
/**
* 修改状态
* @param reqDTO
* @return
*/
@ApiOperation(value = "修改状态")
@RequestMapping(value = "/state", method = { RequestMethod.POST})
public ApiRest state(@RequestBody BaseStateReqDTO reqDTO) {
// 条件
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.lambda()
.in(SysUser::getId, reqDTO.getIds())
.ne(SysUser::getUserName, "admin");
SysUser record = new SysUser();
record.setState(reqDTO.getState());
baseService.update(record, wrapper);
return super.success();
}
/**
* 保存或修改系统用户
* @return
*/
@ApiOperation(value = "学员注册")
@RequestMapping(value = "/reg", method = {RequestMethod.POST})
public ApiRest reg(@RequestBody SysUserDTO reqDTO) {
SysUserLoginDTO respDTO = baseService.reg(reqDTO);
return success(respDTO);
}
/**
* 快速注册,如果手机号存在则登录,不存在就注册
* @return
*/
@ApiOperation(value = "快速注册")
@RequestMapping(value = "/quick-reg", method = {RequestMethod.POST})
public ApiRest quick(@RequestBody SysUserDTO reqDTO) {
SysUserLoginDTO respDTO = baseService.quickReg(reqDTO);
return success(respDTO);
}
}
@Api(tags = {"管理用户"})
@RestController
@RequestMapping("/exam/api/sys/role")
public class SysRoleController extends BaseController {
@Autowired
private SysRoleService baseService;
/**
* 分页查找
* @param reqDTO
* @return
*/
@ApiOperation(value = "分页查找")
@RequestMapping(value = "/paging", method = { RequestMethod.POST})
public ApiRest> paging(@RequestBody PagingReqDTO reqDTO) {
//分页查询并转换
IPage page = baseService.paging(reqDTO);
return super.success(page);
}
/**
* 查找列表,每次最多返回200条数据
* @return
*/
@ApiOperation(value = "查找列表")
@RequestMapping(value = "/list", method = { RequestMethod.POST})
public ApiRest> list() {
//分页查询并转换
QueryWrapper wrapper = new QueryWrapper<>();
//转换并返回
List list = baseService.list(wrapper);
//转换数据
List dtoList = BeanMapper.mapList(list, SysRoleDTO.class);
return super.success(dtoList);
}
}
七、获取源码
大家点赞、收藏、关注、评论啦 、关注下方公众号获取联系方式