基于ssm框架开发的在线考试管理系统设计与实现

博主介绍:专注于Java(springboot ssm springcloud等开发框架) vue  .net  php phython node.js    uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作
☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟
我的博客空间发布了1000+毕设题目 方便大家学习使用
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
更多项目地址 介绍  翰文编程-CSDN博客
文末下方有源码获取地址

系统实现预览

4系统设计

4.1数据库设计

考试信息管理系统的效率和实现的效果完全取决于数据库结构设计的好坏。为了保证数据的完整性,提高数据库存储的效率,那么统一合理地设计数据库结构是必要的。数据库设计一般包括如下几个步骤:

(1)根据学生需求,确定数据库信息进行保存

对学生的需求分析是数据库设计的第一阶段,学生的需求调研,熟悉运作流程,系统要求,这些都是以概念模型为基础的。

(2)设计数据的概念模型

概念模型与数据建模学生的观点一致,用于信息世界的建模工具。通过E-R图可以清楚地描述系统涉及到的实体之间的相互关系。

学生信息实体图如图4-1所示:

图4-1学生信息实体图

管理员信息实体图如图4-2所示:

图4-2管理员信息实体图

(3)数据库逻辑结构分析

数据库概念结构设计后,可以数据库概念转化实际的数据模型,这是一种数据库的逻辑结构,就是将概念结构与支持数据库管理系统的模型相符合。具体的表设计如下所示:

表4-1:classinfo表

字段名称

类型

长度

字段说明

主键

默认值

classId

int

11

NOT NULL

className

varchar

50

NOT NULL

gradeId

int

11

NOT NULL

teacherId

int

11

DEFAULT NULL

表4-2:courseinfo表

字段名称

类型

长度

字段说明

主键

默认值

courseId

int

11

NOT NULL

courseName

varchar

50

NOT NULL

division

int

11

DEFAULT

gradeId

int

11

DEFAULT NULL

表4-3:examchooseinfo表

字段名称

类型

长度

字段说明

主键

默认值

chooseId

int

11

NOT NULL

studentId

int

11

NOT NULL

examPaperId

int

11

NOT NULL

subjectId

int

11

NOT NULL

chooseResult

varchar

500

NOT NULL

chooseError

varchar

3000

有错误的情况

DEFAULT NULL

表4-4 examhistoryinfo表

字段名称

类型

长度

字段说明

主键

默认值

historyId

int

11

NOT NULL

studentId

int

11

NOT NULL

examPaperId

int

11

NOT NULL

examScore

int

11

DEFAULT NULL

beginTime

timestamp

NULL DEFAULT

表4-5:exampaperinfo表

字段名称

类型

长度

字段说明

主键

默认值

examPaperId

int

11

NOT NULL

examPaperName

varchar

50

NOT NULL

subjectNum

int

11

NOT NULL

examPaperTime

int

11

NOT NULL

examPaperScore

int

11

NOT NULL

gradeId

int

11

NOT NULL

division

int

11

DEFAULT

examPaperEasy

int

11

DEFAULT

表4-6:examplaninfo表

字段名称

类型

长度

字段说明

主键

默认值

examPlanId

int

11

NOT NULL

courseId

int

11

NOT NULL

classId

int

11

NOT NULL

examPaperId

int

11

NOT NULL

beginTime

timestamp

NOT NULL

表4-7:examsubjectmiddleinfo表

字段名称

类型

长度

字段说明

主键

默认值

esmId

int

11

NOT NULL

examPaperId

int

11

NOT NULL

subjectId

int

11

NOT NULL

表4-8:gradeinfo表

字段名称

类型

长度

字段说明

主键

默认值

gradeId

int

11

NOT NULL

gradeName

varchar

50

NOT NULL

表4-9:studentinfo表

字段名称

类型

长度

字段说明

主键

默认值

studentId

int

11

NOT NULL

studentName

varchar

32

NOT NULL

studentAccount

varchar

64

NOT NULL

studentPwd

varchar

32

NOT NULL

classId

int

11

NOT NULL

表4-10:subjectinfo表

字段名称

类型

长度

字段说明

主键

默认值

subjectId

int

11

NOT NULL

subjectName

varchar

500

NOT NULL

optionA

varchar

500

NOT NULL

optionB

varchar

500

NOT NULL

optionC

varchar

500

NOT NULL

optionD

varchar

500

NOT NULL

rightResult

varchar

500

NOT NULL

subjectScore

int

11

NOT NULL

subjectType

int

11

DEFAULT

courseId

int

11

NOT NUL

gradeId

int

11

NOT NULL

subjectEasy

int

11

DEFAULT

division

int

11

DEFAULT

4.2系统整体设计 

4.2.1 系统设计思想

系统确定了各项需求,完成了系统的分析和数据库的设计,它就可以根据系统的特点决定系统的发展模式,才能实现代码。通过对系统的分析,这个系统是属于一个小项目,所完成的功能相对简单,就是对数据的基本操作。从而决定采用B/S开发模式。该模型的基本过程是:当学生访问网站的浏览器,或从学生向服务器发送请求时,通过接收请求,然后调用数据访问逻辑运算如比,将结果返回给将结果返回到学生通过浏览器。

使用开发的模型时,我们要把一些常用的,可以重复使用了Jsp技术。当学生浏览网页,很多网页上的信息是从数据库动态删除,这就要求网页必须有数据库操作的能力,如连接数据库和数据表,更新。一个系统包含多个相同的网页,实现数据库操作功能的、代码就需要在不一样的网页中重复的被使用,这样不仅降低了工作的效率,一般也会给维护带来较大的麻烦。为了弥补这一缺陷,功能代码应该在Jsp中完整的数据库操作,可以使用在每一个页面上。

4.2.2系统流程图

下图是学生进入这个在线考试系统后,基本的操作流程。学生输入学生名和密码,登录到系统后台,可以修改个人信息和密码,可以查看首页、考试中心、考试历史等信息是由学生进行的。学生系统流程图如下图所示:

图4-3系统操作流程图

5系统详细设计

5.1管理员功能模块

管理员登录系统,管理员通过输入用户名、密码并点击登录进行系统登录操作,如图5-1所示。

图5-1管理员登录界面图

管理员登录系统后,可以对系统首页、基本信息、班级管理、教师管理、学生管理、试卷管理、试题管理、考试安排管理、以往考试信息等功能模块进行相应操作,如图5-2所示。

图5-2管理员功能界图面

基本信息,在基本信息页面可以对年级编号、年级名称、进行添加等操作和修改、删除和班级等,如图5-3所示。

图5-3基本信息界面图

班级管理,在班级管理页面可以对班级编号、班级名称、所属年级、班主任等内容进行添加、修改或删除等操作,如图5-4所示。

图5-4班级管理界面图

教师管理,在教师管理页面可以对后台权限、教师姓名、后台登入账户、后台登入密码等内容进行添加或提交等操作,如图5-5所示。

图5-5教师管理界面图

主要代码

private TeacherInfoService teacherInfoService;
	
	private Logger logger = Logger.getLogger(TeacherInfoHandler.class);
	
	
	/**
	 * 获取  验证教师信息
	 * @param teacherAccount
	 * @param response
	 * @throws Exception
	 */
	@RequestMapping(value="/validateTeacher", method=RequestMethod.POST)
	public void queryTeacherExists(@RequestParam(value="account") String teacherAccount,
			HttpServletResponse response) throws Exception {
		logger.info("获取教师 "+teacherAccount+" 的信息");

		TeacherInfo teacherInfo = null;
		teacherInfo = teacherInfoService.getTeacherByAccount(teacherAccount);
		
		//教师账户不存在
		if (teacherInfo == null) {
			response.getWriter().print("1");
		} else {			
			response.getWriter().print(teacherInfo.getTeacherPwd());
		}
	}
	
	
	/**
	 * 教师登录
	 * @param teacherAccount
	 * @param request
	 * @return
	 */
	@RequestMapping(value="/teacherlogin", method=RequestMethod.POST)
	public String teacherLogin(@RequestParam("teacherAccount") String teacherAccount,
			HttpServletRequest request) {
		if (teacherAccount == null || "".equals(teacherAccount)) {
			logger.error("教师账号为空");
			request.setAttribute("error", "登录信息有误");
			return "/admin/login";
		}
		logger.info("教师  "+teacherAccount+" 登录");
		
		//获取当前登录教师
		TeacherInfo teacherInfo = teacherInfoService.getTeacherByAccount(teacherAccount);
		
		if(teacherInfo == null){
			logger.error("教师账号为空");
			request.setAttribute("error", "账号不存在!");
			return "/admin/login";
		}
		String teacherPwd = request.getParameter("teacherPwd");
		if(!teacherInfo.getTeacherPwd().equals(teacherPwd)){
			logger.error("密码错误");
			request.setAttribute("error", "密码错误!");
			return "/admin/login";
		}
		//将当前登录教师 后台权限存入 Session
		request.getSession().setAttribute("adminPower", teacherInfo.getAdminPower());
		request.getSession().setAttribute("loginTeacher", teacherInfo);
		
		return "redirect:admin/index.jsp";
	}
	
	/**
	 * 教师查看自己的信息
	 * @param teacherId
	 * @return
	 */
	@RequestMapping("/selfinfo/{teacherId}")
	public ModelAndView loginTeacherSelf(@PathVariable("teacherId") Integer teacherId) {
		ModelAndView model = new ModelAndView();
		logger.error("教师 "+teacherId+" 查看自己的信息");
		if (teacherId == null) {
			model.setViewName("../error");
			return model;
		} else {
			List<TeacherInfo> teachers = new ArrayList<TeacherInfo>();
			TeacherInfo teacher = teacherInfoService.getTeacherById(teacherId);
			teachers.add(teacher);
			model.addObject("teachers", teachers);
			model.setViewName("/admin/teachers");
			
			return model;
		}
	}
	
	
	/**
	 * 教师退出登录
	 * @throws IOException 
	 */
	@RequestMapping("/exitTeacher")
	public void exitTeacher(HttpSession session, HttpServletResponse response) throws IOException {
		session.removeAttribute("loginTeacher");
		session.removeAttribute("adminPower");
		
		response.sendRedirect("admin/login.jsp");
	}
	
	
	/**
	 * 查询教师集合
	 * @param startPage
	 * @param pageShow
	 * @return
	 */
	@RequestMapping(value="/teachers", method=RequestMethod.GET)
	public ModelAndView getTeachers(
			@RequestParam(value="startPage", required=false, defaultValue="1") Integer startPage,  //当前页码,默认第一页
			@RequestParam(value="pageShow", required=false, defaultValue="10") Integer pageShow /*每页显示数据量,默认10条*/) {
		logger.info("查询教师集合");
		
		ModelAndView model = new ModelAndView();
		model.setViewName("admin/teachers");
		
		List<TeacherInfo> teachers;
		
		Map<String, Object> map = new HashMap<String, Object>();
		//计算当前查询起始数据索引
		int startIndex = (startPage-1) * pageShow;
		map.put("startIndex", startIndex);
		map.put("pageShow", pageShow);
		map.put("teacher", null);
		teachers = teacherInfoService.getTeachers(map);
		model.addObject("teachers", teachers);
		
		//获取教师总量
		int teacherTotal = teacherInfoService.getTeacherTotal();
		//计算总页数
		int pageTotal = 1;
		if (teacherTotal % pageShow == 0)
			pageTotal = teacherTotal / pageShow;
		else
			pageTotal = teacherTotal / pageShow + 1;			
		model.addObject("pageTotal", pageTotal);
		model.addObject("pageNow", startPage);
		
		return model;
	}
	
	/**
	 * 预修改教师
	 * @param teacherId
	 * @return
	 */
	@RequestMapping(value="/teacher/{teacherId}", method=RequestMethod.GET)
	public ModelAndView preUpdateTeacher(@PathVariable("teacherId") Integer teacherId) {
		logger.info("预修改教师处理");
		
		ModelAndView model = new ModelAndView();
		//获取要修改教师
		TeacherInfo teacher = teacherInfoService.getTeacherById(teacherId);
		model.setViewName("/admin/teacheredit");
		model.addObject("teacher", teacher);
		
		return model;
	}
	
	/**
	 * 修改/添加 教师
	 * @param teacherId
	 * @param isUpdate 操作标识
	 * @param teacherName
	 * @param teacherAccount
	 * @param teacherPwd
	 * @param adminPower
	 * @return
	 */
	@RequestMapping(value="/teacher/teacher", method=RequestMethod.POST)
	public String isUpdateOrAddTeacher(@RequestParam(value="teacherId", required=false) Integer teacherId,
			@RequestParam(value="isupdate", required=false) Integer isUpdate,
			@RequestParam("teacherName") String teacherName,
			@RequestParam("teacherAccount") String teacherAccount,
			@RequestParam("teacherPwd") String teacherPwd,
			@RequestParam("adminPower") Integer adminPower) {
		
		TeacherInfo teacher = new TeacherInfo();
			teacher.setTeacherId(teacherId);
			teacher.setTeacherName(teacherName);
			teacher.setTeacherAccount(teacherAccount);
			teacher.setTeacherPwd(teacherPwd);
			teacher.setAdminPower(adminPower);
		
		if (isUpdate != null) {  //修改
			logger.info("修改教师 "+teacher+" 的信息");
			int row = teacherInfoService.isUpdateTeacherInfo(teacher);			
		} else {  //添加
			logger.info("添加教师 "+teacher+" 的信息");
			int row = teacherInfoService.isAddTeacherInfo(teacher);
		}
		
		return "redirect:/teachers";
	}
	
	
	/**
	 * 删除教师
	 * @param teacherId
	 * @return
	 */
	@RequestMapping(value="/teacher/{teacherId}", method=RequestMethod.DELETE)
	public String isDelTeacher(@PathVariable("teacherId") Integer teacherId) {
		logger.info("删除教师 "+teacherId);
		
		int row = teacherInfoService.isDelTeacherInfo(teacherId);
		
		return "redirect:/teachers";
	}

学生管理,在学生管理页面可以对学生编号、学生姓名、学生账户、登入密码、就读班级、就读年级等内容进行修改或删除等操作,如图5-6所示。

图5-6学生管理界面图

试卷管理,在试卷管理页面可以对已选、试题编号、题目、选项A、选项B、选项C、选项D、正确答案、分值、试题类型、难易程度、所属模块、所属年级等内容进行添加或移除等操作,如图5-7所示。

图5-7试卷管理界面图

试题管理页面,在试题管理页面可以对试题号、题目、选项A、选项B、选项C、选项D、正确答案、分值、试题类型、难易程度、所属模块、所属年级等内容进行添加、修改或删除操作,如图5-8所示。

图5-8试题管理界面图

考生安排管理,在考生安排管理页面可以对编号、考试班级、考试模块、试卷名称、题目数量、开考时间等内容进行添加、修改或移除操作,如图5-9所示。

图5-9考生安排管理界面图

以往考试信息页面,在以往考试信息页面可以查看考试题目等内容进行相应操作,如图5-10所示。

图5-10以往考试信息界面图

大家点赞、收藏、关注、评论啦  其他的定制服务  下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翰文编程

你的鼓励 是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值