作者主页:夜未央5788

简介:Java领域优质创作者、Java项目、学习资料、技术互助

文末获取源码

ssm在线答题系统

技术框架

使用SSM+Vue的形式来实现,SSM框架用于处理后台的数据逻辑,Vue框架用于前端的数据显示

系统分为客户端,管理端

注意事项

1 数据库文件在一级目录下,命名为answerWeb.sql,部署时,需要在answerWeb/config/dbconfig.properties配置文件中配置好数据库
2 管理端用户表为'admins'表
3 客户端用户表为'user'表,用户端登录页登录帐号为邮箱
4 管理端,在创建题目时,在选择完图片后,图片会立即上传到百度云BOS对象存储中(需要在util包的BOSUtil工具类你的BOS对象存储),未点击添加题目时,此时试题的资源(图片,视频)是在BOS的临时文件夹下(在QuestionController类定义路径),当点击添加题目后,会把此试题的资源添加到目标文件夹下(在QuestionController类定义路径),临时文件夹下的东西可以设置任务调度器进行定时删除,防止浪费BOS存储空间。

5 项目的jar包除了用maven管理外,有一部分jar需要手动导入(answerWeb/WebRoot/WEB-INF/lib)

运行截图

相关代码

管理员登入

package cn.edu.lingnan.controller;import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import cn.edu.lingnan.pojo.Admins;
import cn.edu.lingnan.service.AdminsService;@Controller
public class AdminController extends BaseController {@Autowiredprivate AdminsService adminsService;/*** 管理员登入* @param admins* @param map* @author lizhi*/@RequestMapping("/adminLogin")public String adminLogin(Admins admins,Map<String,Object> map){if(adminsService.login(admins).size()<=0){map.put("loginError", "帐号或密码错误");return "/admin/login";}super.session.setAttribute("admins", adminsService.login(admins).get(0));return "redirect:/selectUserByExample";}/*** 更新管理员资料(修改密码)* @param admins* @author lizhi*/@RequestMapping("/changeAdminPassword")public String changeAdminPassword(Admins admins){adminsService.updateSelective(admins);return "redirect:/selectUserByExample";}/*** 注销* @return*/@RequestMapping("/logout")public String logout(){session.invalidate();return "/admin/login";}}

获取题目基础类型

package cn.edu.lingnan.controller;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;import cn.edu.lingnan.pojo.Options;
import cn.edu.lingnan.pojo.Question;
import cn.edu.lingnan.pojo.QuestionOption;
import cn.edu.lingnan.pojo.QuestionType;
import cn.edu.lingnan.pojo.User;
import cn.edu.lingnan.pojo.WeChatUser;
import cn.edu.lingnan.service.AnswerService;@Controller
public class AnswerController extends BaseController {public static final int QUESTION_NUMBER = 10;@Autowiredprivate AnswerService answerService;/*** @author huang* 获取题目基础类型*/@ResponseBody@RequestMapping(value="user/getType")public Map<String, Object> getQuestionType() {Map<String, Object> map = new HashMap<String, Object>();List<QuestionType> firstlist = answerService.findType();if (firstlist.size() <= 0) {map.put("error", "系统错误:一级菜单获取失败");} else {map.put("firstlist", firstlist);}return map;}/*** @author huang* 获取题目具体类型*/@ResponseBody@RequestMapping(value="user/getType/{id}")public Map<String, Object> getQuestionType(@PathVariable int id) {Map<String, Object> map = new HashMap<String, Object>();List<QuestionType> secondlist = answerService.findType(id);if (secondlist.size() <= 0) {map.put("error", id);} else {//判断是否为3级菜单List<QuestionType> thirdList = answerService.findType(secondlist.get(0).getTypeno());if(thirdList.size() <= 0) map.put("grade", "two");else map.put("grade", "third");map.put("secondlist", secondlist);}return map;}/*** @author huang* 根据类型获取题目*/@ResponseBody@RequestMapping(value="user/getQuestion/{typeno}")public Map<String, Object> getQuestion(@PathVariable int typeno) {Map<String, Object> map = new HashMap<String, Object>();List<Question> questionList = answerService.getQuestionByType(typeno);List<QuestionOption> questionOptionsList = new ArrayList<QuestionOption>();for (Question q : questionList) {List<Options> optionlist = answerService.getOptionsByQuestion(q.getQuestionno());QuestionOption questionOption = new QuestionOption(q,optionlist);questionOptionsList.add(questionOption);}map.put("question",questionOptionsList);map.put("maxnumber", QUESTION_NUMBER);map.put("title", answerService.getQuestionTypeByID(typeno).getTypename());return map;}/*** @author huang* 用户答题更新记录*/@RequestMapping(value="user/refreshRecord/{typeno}/{status}")public void refreshRecord(@PathVariable int typeno, @PathVariable int status){User user = (User) super.session.getAttribute("user");WeChatUser weuser = (WeChatUser) super.session.getAttribute("weChatUser");if (user != null)answerService.answerRecord(user.getUserno(), typeno, status, 0);else if (weuser != null)answerService.answerRecord(weuser.getWechatuserno(), typeno, status, 1);}
}

可根据条件分页查询所有候选答案

package cn.edu.lingnan.controller;import java.util.List;
import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;import cn.edu.lingnan.pojo.Options;
import cn.edu.lingnan.pojo.OptionsExample;
import cn.edu.lingnan.service.OptionsService;@Controller
public class OptionsController extends BaseController {@Autowiredprivate OptionsService optionsService;/*** 可根据条件分页查询所有候选答案* @return* @author lizhi*/@RequestMapping("/selectOptions")public String selectOptions(OptionsExample options, Map<String, Object> map,@RequestParam(value = "pn", defaultValue = "1") Integer pn) {// 每页显示八条数据,且当前页是参数pnPageHelper.startPage(pn, 8);List<Options> list = optionsService.selectOptionsByExample(options);// 对数据进行分页处理PageInfo pageInfo = new PageInfo(list);map.put("optionsListPageInfo", pageInfo);// 到时候前端写出网页后再修改到具体的页面return "admin/index";}/*** 更新候选答案* @return* @author lizhi*/@RequestMapping("/updateOptions")public String updateOptions(Options options){optionsService.updateByPrimaryKey(options);return "admin/index";}}

QuestionController

package cn.edu.lingnan.controller;import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ThreadLocalRandom;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;import cn.edu.lingnan.pojo.Options;
import cn.edu.lingnan.pojo.OptionsList;
import cn.edu.lingnan.pojo.Question;
import cn.edu.lingnan.pojo.TempUrl;
import cn.edu.lingnan.service.OptionsService;
import cn.edu.lingnan.service.QuestionService;
import cn.edu.lingnan.service.QuestionTypeService;
import cn.edu.lingnan.service.TempUrlService;
import cn.edu.lingnan.utils.BOSUtil;@Controller
public class QuestionController extends BaseController {@Autowiredprivate QuestionService questionService;@Autowiredprivate QuestionTypeService questionTypeService;@Autowiredprivate OptionsService optionsService;@Autowiredprivate TempUrlService tempUrlService;/*** 分页根据条件查找试题* @param question* @param map* @param pn* @author lizhi*/@RequestMapping("/selectQuestion")public String selectQuestion(Question question, Map<String, Object> map,@RequestParam(value = "pn", defaultValue = "1") Integer pn,@RequestParam("toid")Integer toid) {// 每页显示八条数据,且当前页是参数pnPageHelper.startPage(pn, 6);List<Question> list = questionService.selectQuestionByExample(question);// 对数据进行分页处理PageInfo pageInfo = new PageInfo(list);map.put("pageInfo", pageInfo);//找出所有三级菜单类型,返回到前端多条件选择map.put("questionTypeList",questionTypeService.getAllQuestionType());//在选项卡一中显示map.put("toid", toid);// 到时候前端写出网页后再修改到具体的页面return "/admin/questionList";}/*** 更新试题第一步* @param question* @author lizhi*/@RequestMapping("/updateQuestionFirst")public String updateQuestionFirst(@RequestParam("questionno")Integer questionno,Map<String,Object> map,@RequestParam("pn") Integer pn){//找出具体题目map.put("question",questionService.getQuestionByKey(questionno));//找出题目的候选答案map.put("optionsList",optionsService.getQuestionOptions(questionno));//找出所有三级菜单类型,返回到更新页面map.put("questionTypeList",questionTypeService.getAllQuestionType());map.put("pn",pn);return "/admin/updateQuestion";}/*** 更新试题第二步* @param question* @param pn* @author lizhi*/@RequestMapping("/updateQuestionSecond")public String updateQuestionSecond(Question question,@RequestParam("pn") Integer pn,OptionsList optionsList,String oldContent,String oldDescription){//如果不同文件名,就要移动if(!question.getContent().equals(oldContent)){String strExtension = question.getContent().substring(question.getContent().lastIndexOf('.') + 1);String path = "/resource/images/question/";if(strExtension.equals("mp3")){path = "/resource/audio/";//将文件从临时文件夹移动到目标文件夹BOSUtil.moveFile("/temp/"+question.getContent(),path+question.getContent());}else if(strExtension.equals("mp4")){path = "/resource/video/";//将文件从临时文件夹移动到目标文件夹BOSUtil.moveFile("/temp/"+question.getContent(),path+question.getContent());}else if(strExtension.equals("jpg")||strExtension.equals("gif") ||strExtension.equals("png") || strExtension.equals("bmp")){//将文件从临时文件夹移动到目标文件夹BOSUtil.moveFile("/temp/"+question.getContent(),path+question.getContent());}}//如果不同文件名,就要删除原来的if(!question.getContent().equals(oldContent)){//把原来的文件删除String path="";String oldExtension = oldContent.substring(oldContent.lastIndexOf('.') + 1);String oldpath = "/resource/images/question/";if(oldExtension.equals("mp3")){path = "/resource/audio/";BOSUtil.deleteFile(path+oldContent);}else if(oldExtension.equals("mp4")){path = "/resource/video/";BOSUtil.deleteFile(path+oldContent);}else if(oldExtension.equals("jpg")||oldExtension.equals("gif") || oldExtension.equals("png") || oldExtension.equals("bmp")){BOSUtil.deleteFile(path+oldContent);}}//对答案图片进行更新if(question.getDesstatus()==2){if(!question.getDescription().equals(oldDescription)){String path = "/resource/images/answer/";//移动答案图片BOSUtil.moveFile("/temp/"+question.getDescription(),path+question.getDescription());//删除原来的答案图片BOSUtil.deleteFile(path+oldDescription);}}questionService.updateSelective(question);for(Options options:optionsList.getOptionsList()){optionsService.updateByPrimaryKey(options);}redirectAttributes.addAttribute("pn",pn);redirectAttributes.addAttribute("toid",1);return "redirect:/selectQuestion";}/*** 上传题目的图片,视频,音频* @param file* @param typename* @return* @throws IllegalStateException* @throws IOException*/@ResponseBody@RequestMapping(value = "/addQuestionFile", produces = "text/html;charset=UTF-8")public String addQuestionFile(@RequestParam(value = "file", required = false) MultipartFile file,@RequestParam(value="desFile",required=false) MultipartFile desFile,@RequestParam(value="flag",required=false) Integer flag ) throws IllegalStateException, IOException {if(flag == 1){/* String strExtension = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.') + 1);String path = "/resource/images/question/";if(strExtension.equals("mp3")){path = "/resource/audio/";}else if(strExtension.equals("mp4")){path = "/resource/video/";}*/// fileName唯一性int a = ThreadLocalRandom.current().nextInt(100,999);String fileName =+ a +"-"+ System.currentTimeMillis()+ file.getOriginalFilename();//上传到临时文件夹String typeImagesTempPath = "/temp/"+fileName;BOSUtil.upload(file, typeImagesTempPath);//插入上传记录SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmss");TempUrl tempUrl = new TempUrl(null,fileName,format.format(new Date()));tempUrlService.addTempUrl(tempUrl);return fileName;//这是答案详解图片的预览}else if(flag == 2){String path = "/resource/images/answer/";// fileName唯一性int a = ThreadLocalRandom.current().nextInt(100,999);String fileName =+ a +"-"+ System.currentTimeMillis()+ desFile.getOriginalFilename();//上传到临时文件夹String typeImagesTempPath = "/temp/"+fileName;BOSUtil.upload(desFile, typeImagesTempPath);//插入上传记录SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmss");TempUrl tempUrl = new TempUrl(null,fileName,format.format(new Date()));tempUrlService.addTempUrl(tempUrl);return fileName;}return "error";}/*** 增加试题* @param question* @author lizhi* @throws IOException * @throws IllegalStateException */@RequestMapping("/addQuestion")public String addQuestion(Question question,OptionsList optionsList,@RequestParam("pn") Integer pn) throws IllegalStateException, IOException{String strExtension = question.getContent().substring(question.getContent().lastIndexOf('.') + 1);String path = "/resource/images/question/";if(strExtension.equals("mp3")){path = "/resource/audio/";//将文件从临时文件夹移动到目标文件夹BOSUtil.moveFile("/temp/"+question.getContent(),path+question.getContent());}else if(strExtension.equals("mp4")){path = "/resource/video/";//将文件从临时文件夹移动到目标文件夹BOSUtil.moveFile("/temp/"+question.getContent(),path+question.getContent());}else if(strExtension.equals("jpg") || strExtension.equals("gif") || strExtension.equals("png") || strExtension.equals("bmp")){//将文件从临时文件夹移动到目标文件夹BOSUtil.moveFile("/temp/"+question.getContent(),path+question.getContent());}//移动答案图片if(question.getDesstatus()==2){String desImapgePath = "/resource/images/answer/";//移动答案图片BOSUtil.moveFile("/temp/"+question.getDescription(),desImapgePath+question.getDescription());}//插入数据库questionService.insertQuestion(question);for(Options options:optionsList.getOptionsList()){options.setQuestionno(question.getQuestionno());optionsService.insert(options);}redirectAttributes.addAttribute("pn",pn);redirectAttributes.addAttribute("toid",1);return "redirect:/selectQuestion";}/*** 根据试题id删除试题* @param id* @author lizhi*//*@RequestMapping(value="/deleteQuestion/{id}",method=RequestMethod.DELETE)public String deleteQuestion(@PathVariable(value="id") Integer id){questionService.deleteQuestion(id);return "/admin/index";}*//*** 根据试题id删除试题* @param id* @author lizhi*/@RequestMapping(value="/deleteQuestion")public String deleteQuestion(@RequestParam("questionno") Integer questionno,@RequestParam("pn") Integer pn){Question question = questionService.getQuestionByKey(questionno);questionService.deleteQuestion(questionno);redirectAttributes.addAttribute("pn", pn);redirectAttributes.addAttribute("toid",1);//删除题目内容对应的资源if(question.getConstatus()!=1){String contentExtension = question.getContent().substring(question.getContent().lastIndexOf('.') + 1);String path = "/resource/images/question/";if(contentExtension.equals("mp3")){path = "/resource/audio/";BOSUtil.deleteFile(path+question.getContent());}else if(contentExtension.equals("mp4")){path = "/resource/video/";BOSUtil.deleteFile(path+question.getContent());}else if(contentExtension.equals("jpg") || contentExtension.equals("gif") || contentExtension.equals("png") || contentExtension.equals("bmp")){BOSUtil.deleteFile(path+question.getContent());}}//删除题目答案对应的资源if(question.getDesstatus()==2){BOSUtil.deleteFile("/resource/images/answer/"+question.getDescription());}return "redirect:/selectQuestion";}}

如果也想学习本系统,下面领取。关注并回复:017ssm

Java项目:ssm在线答题系统相关推荐

  1. java项目任务跟踪系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署

    java项目任务跟踪系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 java项目任务跟踪系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 本源码技术栈: 项目架构:B ...

  2. 基于JAVA项目任务跟踪系统计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVA项目任务跟踪系统计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA项目任务跟踪系统计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B/S架构 开发语 ...

  3. 基于java项目ssm二手书交易平台设计与实现(论文+程序设计源码+数据库文件)

    1 绪论 4 1.1 项目开发背景 4 1.2 项目开发意义 5 1.3 项目主要的内容 5 2 相关技术介绍及系统环境开发条件 6 2.1相关技术介绍 6 2.2系统环境开发条件 7 3 系统的需求 ...

  4. 本地Java项目连接Linux系统上的Redis

    本地Java项目连接Linux系统上的Redis 一.配置Redis 修改redis.conf文件 1.将bind 127.0.0.1加上注释,(#bind 127.0.0.1),允许出本机外的IP访 ...

  5. java学习笔记(9) 第9章 Java项目-房屋出租系统

    Java项目-房屋出租系统 代码打包--百度网盘链接: 9.1 房屋出租系统-需求 9.1.1 项目需求说明 9.2 房屋出租系统-界面 9.3 房屋出租系统-设计(!!) 9.4 房屋出租系统-实现 ...

  6. Java项目:停车位租赁系统(java+SSM+JSP+Maven+mysql)

    源码获取:博客首页 "资源" 里下载! 项目介绍 该系统采用了经典的springmvc,spring,mybatis的框架组合,对于物业公司来说,有助于管理车位信息.系统分为了两个 ...

  7. Java项目:化妆品商城系统(java+Springboot+ssm+mysql+jsp+maven)

    源码获取:博客首页 "资源" 里下载! 一.项目简述 本系统主要实现的功能有: 网上商城系统,前台+后台管理,用户注册,登录,上架展示,分组展示,搜索,收货地址管理,购物车管理,添 ...

  8. Java项目-SSM实现完整的BBS论坛

    作者主页:编程指南针 简介:Java领域优质创作者.CSDN博客专家  Java项目.简历模板.学习资料.面试题库.技术互助 文末获取源码 项目编号:BS-PT-002 这个论坛功能开发的比较完整,论 ...

  9. Java项目ssm企业工资管理系统源码

    Java版ssm企业工资管理系统,源码免费分享,需要可私信. 项目技术:jsp+mysql+Spring+mybatis 运行环境:最好是java jdk 1.8,我们在这个平台上运行的.其他版本理论 ...

  10. 基于SpringBoot的Java项目-销售评价系统(附:源码 课件)

    项目背景 我国的中小型企业飞速发展,每年的产品产销量越来越大,汽车产品消费市场也越来越成熟,消费者不仅对产品质量要求越来越高,还对与产品质量关系不大的附属因素的要求也越来越高,在竞争激烈的环境下,在做 ...

最新文章

  1. vs编译器 printf 控制台输出_【语言教程】通过语言了解GCC编译器工作过程
  2. 微信从原版到现在所有界面图片_微信突然宣布:现在能改微信号了,所有人都能改...
  3. 深度学习与计算机视觉系列(1)_基础介绍
  4. Java技术之掌握数据库连接工具DBUtils的应用
  5. 制作html5谭木记页面,北斗区域地理配套练习答案
  6. ExtJs UI框架学习六
  7. mysql第五章 在线测试_PHP+MySQL来实现在线测试quiz功能
  8. Centos7安装图形桌面
  9. springboot filter_SpringBoot(二) :web综合开发
  10. List<实体>转json
  11. matlab中怎么求矩阵的转置
  12. 使用osgeo的GDAL获取tiff文件坐标
  13. 金蝶Cloud取物料最后一次采购入库价格
  14. 无损更换系统固态硬盘(系统盘克隆)
  15. 建设容器云平台之前不能忽视3个评估,你的企业能得多少分? | 某银行最佳实践分享
  16. 一起来探索从双击程序到开始运行期间计算机经历了哪些过程
  17. 电商平台减少服务器性能,电商平台服务器数据安全灾备方案规划.doc
  18. 原生Android手机管家,腾讯手机管家Android 7.13版更新 你的专属管家已上线
  19. Facebook创始人:拒绝了10亿美元的CEO
  20. 伪全息老婆制作1(Shader入门1)

热门文章

  1. 操作系统:作业调度算法--短作业优先
  2. 决策树一CART算法(第一部分)
  3. 把失败看成常态 把成功当作偶然”——与庞加莱猜想“封顶”者之一、中山大学教授朱熹平面对面
  4. 中国工科研究生200多篇英文论文中最常见的习惯(The Most Common Habits from more than 200 English Papers written by Gradua)
  5. 基于STM32+华为云IOT设计智能称重系统
  6. 平安人寿保险-深圳Java开发工程师社招面试
  7. css竖向箭头符号_如何使用CSS制作箭头符号
  8. Unity3D帧动画,图片的切换实现动画效果
  9. 服务器销售术语,服务器术语大全
  10. 罗素“杀死了”康托尔