博主介绍:专注于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)数据库逻辑结构分析
数据库概念结构设计后,可以数据库概念转化实际的数据模型,这是一种数据库的逻辑结构,就是将概念结构与支持数据库管理系统的模型相符合。具体的表设计如下所示:
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
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以往考试信息界面图
大家点赞、收藏、关注、评论啦 其他的定制服务 下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作