基于javaweb+mysql的ssm+maven在线考试系统(java+ssm+bootstrap+jsp+jquery+mysql)
运行环境
Java≥8、MySQL≥5.7、Tomcat≥8
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb+mysql的SSM+Maven在线考试系统(java+ssm+bootstrap+jsp+jquery+mysql)
项目介绍
这个项目是一个基于SSM的在线考试系统,分为考试用户和管理员两种角色。
考试用户功能包括: 个人信息中心 成绩查询 在线答题 我的错题本 我的试卷
管理员功能包括: 试题管理 题型管理 用户管理 年级管理 课程管理 试卷管理
环境需要
1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本; 6.是否maven项目:是;
技术栈
- 后端:Spring+SpringMVC+Mybatis 2. 前端:JSP+css+javascript+jQuery+bootstrap
使用说明
- 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven; 若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行; 3. 将项目中jdbc.properties配置文件中的数据库配置改为自己的配置; 4. 运行项目,在浏览器中输入http://localhost:8080/online_exam_ssm/toLogin.action 登录 学生账户:zhangsan/123456 后管登录地址:http://localhost:8080/online_exam_ssm/admin/login.action 管理员账户:admin/123456
}
typeService.update(type);
return MsgItem.success("编辑题型成功");
}
/**
* 删除题型信息
* @param type
* @param model
* @param session
* @return
*/
@RequestMapping("/delType.action")
public String delType(int typeId, HttpSession session){
typeService.delete(typeId);
return "redirect:/admin/type/toTypePage.action";
}
}
@RequestMapping("/home/error")
@Controller
public class ErrorBookController {
return MsgItem.success("添加试卷成功");
}
/**
* 删除试卷信息
* @param paperId 试卷编号,删除多个是,id用逗号分隔开
* @param model
* @return
*/
@RequestMapping("/deletePaper.action")
public String deletePaper(String paperId, Model model){
if(paperId != null){
String ids[] = paperId.split(",");
for(int i=0;i<ids.length;i++){
paperService.delete(ids[i]);
}
}
return "redirect:/admin/paper/toPaperPage.action";
}
/**
* 去掉最后一个逗号
* @param str
* @return
*/
public String removeLast(String str){
//判断最后一个字符是否为逗号,若是截取
String newStr = str.substring(str.length() -1, str.length());
if(",".equals(newStr)){
newStr = str.substring(0, str.length()-1);
}else{
newStr = str;
}
return newStr;
}
}
return MsgItem.success("添加年级成功");
}
/**
* 删除年级信息
* @param type
* @param model
* @param session
* @return
*/
@RequestMapping("/delGrade.action")
public String delGrade(int gradeId, Model model, HttpSession session){
gradeService.delete(gradeId);
return "redirect:/admin/grade/toGradePage.action";
}
}
/**
* 试题类型管理
*
*/
@RequestMapping("/admin/type")
@Controller
public class TypeController {
@Autowired
TypeService typeService;
@RequestMapping("/toTypePage.action")
public String toTypePage(@RequestParam(value="page", defaultValue="1") int page,
Type type,Model model, HttpSession session){
PageInfo<Type> pageInfo = typeService.findByPage(type, page, 5);
List<Type> dataList = pageInfo.getList();
* @param session
* @return
*/
@ResponseBody
@RequestMapping("/userLogin.action")
public MsgItem checkUser(User user, Model model, HttpSession session) {
if (StringUtils.isEmpty(user.getUserName())) {
return MsgItem.error("请填写用户名");
}
if (StringUtils.isEmpty(user.getUserPwd())) {
return MsgItem.error("请填写密码");
}
User loginUser = userService.loginCheck(user);
if (loginUser == null) {
return MsgItem.error("用户名或密码错误");
}
if (loginUser.getUserType() != 2) {
return MsgItem.error("用户类型不匹配");
}
session.setAttribute("adminName", loginUser.getUserName());
session.setAttribute("adminUser", loginUser);
return MsgItem.success("登录成功");
}
/**
* 判断账户信息是否存在
*
* @param name
* @return
*/
@RequestMapping("/checkAccount.action")
public String checkAccount(String userId, Model model) {
User userInfo = userService.get(userId);
if (userInfo != null) {
model.addAttribute("message", "该账号已经存在");
} else {
model.addAttribute("message", "<font color='green'>验证通过</font>");
}
model.addAttribute("userId", userId);
return "/admin/info-reg";
}
/**
public List<Type> qryTypePage(@RequestParam(value="page", defaultValue="1") int page,
Type type,Model model, HttpSession session){
PageInfo<Type> pageInfo = typeService.findByPage(type, page, 5);
List<Type> dataList = pageInfo.getList();
model.addAttribute("dataList", dataList);
model.addAttribute("pageInfo", pageInfo);
return dataList;
}
/**
* 删除题型信息
* @param typeId 题型编号,删除多个是,id用逗号分隔开
* @param model
* @return
*/
@RequestMapping("/deleteType.action")
public String deleteType(String typeId, Model model){
if(typeId != null){
String ids[] = typeId.split(",");
for(int i=0;i<ids.length;i++){
typeService.delete(Integer.parseInt(ids[i]));
}
}
return "redirect:/admin/type/toTypePage.action";
}
/**
* 跳转到添加用户信息页面
* @param user
* @param model
* @param session
* @return
*/
@RequestMapping("/toAddType.action")
public String toAddType(Type type, Model model, HttpSession session){
return "/admin/type/add";
}
/**
* 添加题型信息
* @param user
* @param model
* @return
*/
@ResponseBody
/**
* 注销登录
*
* @param session
* @return
*/
@RequestMapping("/exitSys.action")
public String exitSys(User user, Model model, HttpSession session) {
if (session.getAttribute("userName") != null) {
session.removeAttribute("userName");
session.removeAttribute("adminUser");
return "forward:/admin/login.action";
}
return "/admin/login";
}
//跳转到题库录入页面
@RequestMapping(value = "/toQueDep.action", method = RequestMethod.POST)
public String toQueDep(Model model, HttpSession session) {
return "/admin/info-reg";
}
//获取所有的用户信息
@RequestMapping("/getAllUser.action")
public String getAllUserInfo(@RequestParam(value = "page", defaultValue = "1") int page,
User user, Model model, HttpSession session) {
PageInfo<User> pageInfo = userService.findByPage(user, page, 5);
List<User> dataList = pageInfo.getList();
model.addAttribute("dataList", dataList);
model.addAttribute("pageInfo", pageInfo);
return "/admin/user/list";
}
//获取所有的用户信息
@RequestMapping("/qryAllUser.action")
@ResponseBody
public List<User> qryAllUser(@RequestParam(value = "page", defaultValue = "1") int page,
User user, Model model, HttpSession session) {
PageInfo<User> pageInfo = userService.findByPage(user, page, 5);
List<User> dataList = pageInfo.getList();
model.addAttribute("dataList", dataList);
model.addAttribute("pageInfo", pageInfo);
return dataList;
}
/**
* 跳转到添加用户信息页面
*
for(ErrorBook book:bookList) {
Question question = book.getQuestion();
int difficulty = question.getDifficulty();
if(difficulty==0) {
simple=simple+1;
}else if(difficulty==1) {
commonly=commonly+1;
}else {
difficultys=difficultys+1;
}
}
int total=simple+commonly+difficultys;
model.addAttribute("simple",simple);
model.addAttribute("commonly",commonly);
model.addAttribute("difficultys",difficultys);
model.addAttribute("total",total);
model.addAttribute("errorBook", bookList);
session.setAttribute("active", "error");
return "/user/mybooks";
}
//跳转到前台登录页面
@RequestMapping("/getBooks.action")
public String getBooks(User user, Model model, HttpSession session){
List<Grade> gradeList = gradeService.find(new Grade());
List<Course> courseList = courseService.find(new Course());
List<Type> typeList = typeService.find(new Type());
List<ErrorBook> errorBookList = bookService.getBookInfo(new HashMap());
model.addAttribute("grade", gradeList);
model.addAttribute("course", courseList);
model.addAttribute("type", typeList);
return "/user/mybooks";
}
}
}
}
if(selList.size()>0){
Type type = typeService.get(7);
model.addAttribute("selectQ", type.getTypeName()+"("+type.getScore()+")");
model.addAttribute("selList", selList);
}
if(inpList.size()>0){
Type type = typeService.get(8);
model.addAttribute("inpQ", type.getTypeName()+"("+type.getScore()+")");
model.addAttribute("inpList", inpList);
}
if(desList.size()>0){
Type type = typeService.get(9);
model.addAttribute("desQ", type.getTypeName()+"("+type.getScore()+")");
model.addAttribute("desList", desList);
}
model.addAttribute("paper", paper);
return "/user/test_paper";
}
/**
* 自动评分
* @param paper
* @param model
* @param session
* @return
* @throws UnsupportedEncodingException
*/
@SuppressWarnings("unchecked")
@RequestMapping("/dealPaper.action")
@ResponseBody
public MsgItem dealPaper(Paper paper, Model model, HttpSession session) throws UnsupportedEncodingException{
User user = (User) session.getAttribute("user");
if(user==null) {
return MsgItem.error("请先登录");
}
int paperId = paper.getPaperId();
//答案临时存放
String ans = paper.getScore();
ans = URLDecoder.decode(ans,"UTF-8");
String [] answer = null;
* @return
*/
@ResponseBody
@RequestMapping("/addUser.action")
public MsgItem addUser(@Validated User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return MsgItem.error("请填写正确的数据");
}
User findByUserName = userService.findByUserName(user.getUserName());
if (findByUserName != null) {
return MsgItem.error("账户名称已存在");
}
userService.insert(user);
return MsgItem.success("添加用户成功");
}
/**
* 删除用户信息
*
Id 用户账号,删除多个是,id用逗号分隔开
* @return
*/
@RequestMapping("/deleteUser.action")
public String deleteUser(String userId, Model model) {
if (userId != null) {
String ids[] = userId.split(",");
for (int i = 0; i < ids.length; i++) {
userService.delete(ids[i]);
}
}
return "redirect:/admin/getAllUser.action";
}
/**
* 用户身份信息审核(通过)
*
* @return
*/
@RequestMapping("/passinfo.action")
public String passUserInfo(@RequestParam("ids") String ids) {
User us = new User();
String currentIds[] = ids.split(",");
for (int i = 0; i < currentIds.length; i++) {
us.setUserId(Integer.parseInt(currentIds[i]));
us.setUserState(1);
userService.update(us);
@RequestMapping("/toAddGrade.action")
public String toAddGrade(Course course, Model model, HttpSession session){
List<Course> dataList = courseService.find(course);
model.addAttribute("courselList", dataList);
return "/admin/grade/add";
}
/**
* 添加年级信息
* @param user
* @param model
* @return
*/
@ResponseBody
@RequestMapping("/addGrade.action")
public MsgItem addGrade(@Validated Grade grade,BindingResult bindingResult){
if(bindingResult.hasErrors()) {
return MsgItem.error("请填写正确的数据");
}
Grade findByName = gradeService.findByName(grade.getGradeName());
if(findByName!=null) {
return MsgItem.error("该年级名称已存在");
}
gradeService.insert(grade);
return MsgItem.success("添加年级成功");
}
/**
* 删除年级信息
* @param type
* @param model
* @param session
* @return
*/
@RequestMapping("/delGrade.action")
public String delGrade(int gradeId, Model model, HttpSession session){
gradeService.delete(gradeId);
return "redirect:/admin/grade/toGradePage.action";
}
}
* @param model
* @param session
* @return
*/
@ResponseBody
@RequestMapping("/updateUserInfo.action")
public MsgItem updateUserInfo(@Validated User user,BindingResult bindingResult,String newPwd, Model model, HttpSession session){
if(bindingResult.hasErrors()) {
return MsgItem.error("请填写正确的数据");
}
if(newPwd!= null && newPwd.trim().length()>0){
String data = MD5Util.getData(newPwd);
user.setUserPwd(data);
}
userService.update(user);
user = userService.get(user.getUserId());
session.setAttribute("user", user);
return MsgItem.success("个人信息修改成功");
}
//跳转到登录页面
@RequestMapping("/user/exitSys.action")
public String exitSystem(User user, Model model, HttpSession session){
if(session.getAttribute("userName")!= null){
session.removeAttribute("userName");
session.removeAttribute("user");
return "redirect:/index/toLogin.action";
}
return "redirect:/toLogin.action";
}
//跳转到前台登录页面
@RequestMapping("/toAbout.action")
public String toAbout(User user, Model model, HttpSession session){
User loginUser = (User) session.getAttribute("user");
model.addAttribute("user", loginUser);
return "/user/about";
}
}
map.put("paperId", paperId);
map.put("userId", loginUser.getUserId());
Paper paper = paperService.getPaperDetail(map);
Question question = null;
String []ids = paper.getQuestionId().split(",");
List<Question> selList = new ArrayList<Question>();
List<Question> inpList = new ArrayList<Question>();
List<Question> desList = new ArrayList<Question>();
for(int i = 0;i<ids.length;i++){
question = questionService.get(Integer.parseInt(ids[i]));
if("7".equals(question.getTypeId())){//单选
selList.add(question);
}
if("8".equals(question.getTypeId())){//填空
inpList.add(question);
}
if("9".equals(question.getTypeId())){//简答题
desList.add(question);
}
}
if(selList.size()>0){
Type type = typeService.get(7);
model.addAttribute("selectQ", type.getTypeName()+"("+type.getScore()+")");
model.addAttribute("selList", selList);
}
if(inpList.size()>0){
Type type = typeService.get(8);
model.addAttribute("inpQ", type.getTypeName()+"("+type.getScore()+")");
model.addAttribute("inpList", inpList);
}
if(desList.size()>0){
Type type = typeService.get(9);
model.addAttribute("desQ", type.getTypeName()+"("+type.getScore()+")");
model.addAttribute("desList", desList);
}
model.addAttribute("paper", paper);
return "/user/test_paper";
}
/**
* 自动评分
* @param paper
* @param model
/**
* 试卷管理Controller
*
*/
@RequestMapping("/admin/paper")
@Controller
public class PaperController {
@Autowired
PaperService paperService;
@Autowired
CourseService courseService;
@Autowired
TypeService typeService;
@Autowired
GradeService gradeService;
@Autowired
QuestionService questionService;
/**
* 跳转到试卷管理页面
* @param course
* @param model
* @param session
* @return
*/
@RequestMapping("/toPaperPage.action")
public String toPaperPage(@RequestParam(value="page", defaultValue="1") int page,
/**
* 添加课程信息
* @param user
* @param model
* @return
*/
@ResponseBody
@RequestMapping("/addCourse.action")
public MsgItem addCourse(@Validated Course course, BindingResult result){
if (result.hasErrors()) {
return MsgItem.error("请填写正确的数据");
}
Course findByName = courseService.findByName(course.getCourseName());
if(findByName!=null) {
return MsgItem.error("该课程名已存在");
}
course.setCourseState("0");
courseService.insert(course);
return MsgItem.success("课程添加成功");
}
/**
* 查看课程信息
* @param type
* @param model
* @param session
* @return
*/
@RequestMapping("/toQryCourse.action")
public String toQryType(int courseId, Model model, HttpSession session){
Course courseInfo = courseService.get(courseId);
model.addAttribute("course", courseInfo);
return "/admin/course-qry";
}
/**
* 跳转到更新课程信息页面
* @param type
* @param model
* @param session
* @return
if (userInfo != null) {
model.addAttribute("message", "该账号已经存在");
} else {
model.addAttribute("message", "<font color='green'>验证通过</font>");
}
model.addAttribute("userId", userId);
return "/admin/info-reg";
}
/**
* ajax验证用户账号是否存在
*
Id
* @return
*/
@RequestMapping("/userRegist.action")
@ResponseBody
public MsgItem userRegist(String userId, Model model, HttpSession session) {
MsgItem msgItem = new MsgItem();
User user = userService.get(userId);
if (user != null) {
msgItem.setErrorNo("1");
msgItem.setErrorInfo("账号已经存在");
} else {
msgItem.setErrorNo("0");
msgItem.setErrorInfo("<font color='green'>验证通过</font>");
}
return msgItem;
}
/**
* 注销登录
*
* @param session
* @return
*/
@RequestMapping("/exitSys.action")
public String exitSys(User user, Model model, HttpSession session) {
if (session.getAttribute("userName") != null) {
session.removeAttribute("userName");
session.removeAttribute("adminUser");
if("9".equals(ques.getTypeId())){//为简答题的时候
String strA = answer1;
String strB = URLDecoder.decode(str2, "UTF-8");//转码
//计算相似
double d = Computeclass.SimilarDegree(strA, strB);
BigDecimal bg = new BigDecimal(d*5).setScale(1, RoundingMode.DOWN);
d = bg.doubleValue();
endScore+=d;
if(d<=2){//如果小于2分,认定错误
book.setQuestion(ques);
book.setCourseId(ques.getCourseId());
book.setGradeId(ques.getGradeId());
book.setUserAnswer(str2);
bookService.insert(book);
}
}
}
}
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date currentTime = new Date();//得到当前系统时间
String endTime = formatter.format(currentTime); //将日期时间格式化
map.put("beginTime", paper.getBeginTime());
map.put("endTime", endTime);
map.put("score", endScore);
//将考试的试卷状态改为2
map.put("paperState", "2");
paperService.updateUserPaper(map);
return MsgItem.success("试卷提交成功,本次考试得分:"+endScore +"分");
}
/**
* 考试页面
* @param paperId
* @param userId
* @param model
* @param session
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
@RequestMapping("/paperDetail.action")
public String qryPaperDetail(String paperId,String userId,Model model, HttpSession session){
User user = (User) session.getAttribute("user");
if(user==null) {
return "redirect:../../index/toLogin.action";
}
Map map = new HashMap();
map.put("paperId", paperId);
map.put("userId", user.getUserId());
Paper paper = paperService.getPaperDetail(map);
Question question = null;
String []ids = paper.getQuestionId().split(",");
List<Question> selList = new ArrayList<Question>();
List<Question> inpList = new ArrayList<Question>();
List<Question> desList = new ArrayList<Question>();
@RequestMapping("/home/error")
@Controller
public class ErrorBookController {
@Autowired
ErrorBookService bookService;
@Autowired
GradeService gradeService;
@Autowired
CourseService courseService;
@Autowired
TypeService typeService;
@Autowired
UserService userService;
//跳转到我的错题本页面
@RequestMapping("/toMyBooksPage.action")
public String toMyBooksPage(User user, Model model, HttpSession session){
User loginUser = (User) session.getAttribute("user");
if(loginUser==null) {
return "redirect:../../index/toLogin.action";
}
List<Grade> gradeList = gradeService.find(new Grade());
List<Course> courseList = courseService.find(new Course());
List<Type> typeList = typeService.find(new Type());
Map map = new HashMap();
map.put("userId", loginUser.getUserId());
List<ErrorBook> bookList = bookService.getBookInfo(map);
model.addAttribute("grade", gradeList);
model.addAttribute("course", courseList);
model.addAttribute("type", typeList);
int simple=0;
int commonly=0;
int difficultys=0;
/**
* 年级Controller
*
*/
@RequestMapping("/admin/grade")
@Controller
public class GradeController {
@Autowired
GradeService gradeService;
@Autowired
CourseService courseService;
/**
* 跳转到年级页面
* @param course
* @param model
* @param session
* @return
*/
@RequestMapping("/toGradePage.action")
public String toGradePage(@RequestParam(value="page", defaultValue="1") int page,
Grade grade,Model model, HttpSession session){
PageInfo<Grade> pageInfo = gradeService.findByPage(grade, page, 5);
List<Grade> dataList = pageInfo.getList();
Course course=null;
for(Grade g : dataList){
String courseName= "";
String id = g.getCourseId();
if(id != null){
String ids[] = id.split(",");
for(int i=0;i<ids.length;i++){
course = courseService.get(Integer.parseInt(ids[i]));
courseName+=course.getCourseName()+",";
}
}
//判断最后一个字符是否为逗号,若是截取
String str = courseName.substring(courseName.length() -1, courseName.length());
if(",".equals(str)){
str = courseName.substring(0, courseName.length()-1);