基于javaweb的课程在线学习与测试系统(java+ssm+redis+bootstrap+tomcat+mysql)
运行环境
Java≥8、MySQL≥5.7、Tomcat≥8
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb+SpringBoot的课程在线学习与测试系统(java+SSM+redis+Bootstrap+Tomcat+mysql)
基于B/S架构的课程在线学习与测试系统
启动说明
项目为maven管理,最近集成了redis,所以在运行项目是先要下载redis并启动客户端,方可正常运行项目,由于只需要下载redis,无需其他配置,这里就不做过多说明。
最近更新
集成redis来保存用户登录信息,添加过滤器重置用户登录有效期。拦截器实现统一登录和权限校验(相关重构还未完成)。
修改配置文件:com.bs.commonn.RedisPool 地址、端口号
pool = new JedisPool(config,“127.0.0.1”,6379,1000*2);
修改数据库配置文件,导入项目bs.sql文件
学生账号测试:lwj 123456
教师测试账号:lwj 123456
管理员测试账号:admin admin
项目采用前后端分离技术实现
-
框架:SSM(Spring,SpringMVC,Mybatis)
-
缓存:redis
-
数据库:MySQL
-
IDE:Intellij IDEA/Eclipse
-
其他:Maven,Git
项目亮点
-
前后端分离。
-
用户登录权限区分和控制。
-
防止横向越权和纵向越权。
-
密码MD5明文加密。
-
设计高复用的服务器响应对象。
-
guava缓存。
-
pojo,vo抽象模型。
-
数据绑定对象。
-
Mybatis分页
-
Bootstrap。
-
artTemplate,artDialog,iframe前端模板使用。
-
select2、toastr、sweetalert等等前端插件的使用。
-
redis缓存。
-
全局异常处理,拦截器权限统一检验。
班级管理控制层:
@Controller
@SuppressWarnings(“all”)
public class ClassInfoHandler {
@Autowired
private ClassInfoService classInfoService;
@Autowired
private GradeInfoService gradeInfoService;
@Autowired
private TeacherInfoService teacherInfoService;
@Autowired
private TeacherInfo teacher;
@Autowired
private ClassInfo classInfo;
@Autowired
private Gson gson;
private Logger logger = Logger.getLogger(ClassInfoHandler.class);
/**
-
获取所有班级
-
@param gradeId
-
系部编号
-
@param className
-
班级名称 可用于模糊查询
-
@param classId
-
班级编号
-
@return
*/
@RequestMapping(value = “/classes”, method = RequestMethod.GET)
public ModelAndView getClasses(@RequestParam(value = “gradeId”, required = false) Integer gradeId,
@RequestParam(value = “className”, required = false) String className,
@RequestParam(value = “classId”, required = false) Integer classId) {
ModelAndView model = new ModelAndView();
ClassInfo classInfo = new ClassInfo();
/* 处理查询条件 */
if (gradeId != null) {
GradeInfo gradeInfo = new GradeInfo();
gradeInfo.setGradeId(gradeId);
classInfo.setGrade(gradeInfo);
if (classId != null)
classInfo.setClassId(classId);
if (className != null) {
if (className.trim() != “”)
classInfo.setClassName(className);
List classes = classInfoService.getClasses(classInfo);
model.setViewName(“admin/clazz/classes”);
model.addObject(“classes”, classes);
return model;
/**
-
预添加班级处理
-
@return
*/
@RequestMapping(“/preAddClass”)
public ModelAndView preAddClass(@RequestParam(name = “gid”,required = false,defaultValue = “”)Integer gid) {
ModelAndView model = new ModelAndView();
// 获取系部信息
List grades = gradeInfoService.getGrades();
model.setViewName(“admin/clazz/classedit”);
model.addObject(“grades”, grades);
// 获取不是班主任的教师
teacher.setIsWork(0);
Map<String, Object> map = new HashMap<String, Object>();
map.put(“startIndex”, null);
map.put(“pageShow”, null);
map.put(“teacher”, teacher);
List teachers = teacherInfoService.getTeachers(map);
model.addObject(“teachers”, teachers);
model.addObject(“editClass”, new ClassInfo());
model.addObject(“gid”,gid);
return model;
/**
-
添加班级
-
@param classInfo
-
班级信息
-
@param request
-
@return
*/
@RequestMapping(value = “/class”, method = RequestMethod.POST)
public String isAddClass(ClassInfo classInfo, HttpServletRequest request) {
//判断班级名是否存在
ClassInfo byClassName = classInfoService.findByClassName(classInfo.getClassName());
if(byClassName!=null){
request.setAttribute(“error”, “该班级名称已存在!”);
return “error”;
// 修改教师班主任状态
String returnMsg = isChangeTeacherWork(1, classInfo.getTeacher().getTeacherId());
if (returnMsg != null) {
request.setAttribute(“error”, “修改教师班主任状态 对应教师编号有误”);
return “error”;
// 添加
int row = classInfoService.isAddClass(classInfo);
if (row < 1) {
request.setAttribute(“error”, “班级 " + classInfo.getClassName() + " 添加失败,请稍后再试!”);
return “error”;
return “redirect:/classes”;
/**
-
删除班级
-
@param classId
-
班级编号
-
@param request
-
@return
*/
@RequestMapping(value = “/del/class/{classId}”, method = RequestMethod.DELETE)
public String isDelClass(@PathVariable(“classId”) Integer classId, HttpServletRequest request) {
logger.info("删除班级 " + classId);
// 将删除班级对于之前班主任改为 非班主任状态
// 需要在删除班级之前修改,如果先删除了班级,再根据班级获取教师编号,就不能获取
ClassInfo delClass = classInfoService.getClassById(classId);
String returnMsg = isChangeTeacherWork(0, delClass.getTeacher().getTeacherId());
if (returnMsg != null) {
request.setAttribute(“error”, “修改教师班主任状态 对应教师编号有误”);
return “error”;
// 删除
int row = classInfoService.isDelClass(classId);
if (row < 1) {
logger.error(“班级 " + classId + " 删除失败”);
request.setAttribute(“error”, “班级删除失败,请稍后再试!”);
return “…/error”;
return “redirect:/classes”;
/**
-
预修改班级处理
-
@param classId
-
班级编号
-
@return
*/
@RequestMapping(value = “edit/class/{classId}”, method = RequestMethod.GET)
public ModelAndView preUpdateClass(@PathVariable(“classId”) Integer classId) {
logger.info(“预修改班级处理”);
ModelAndView model = new ModelAndView();
// 获取要修改班级
ClassInfo classInfo = classInfoService.getClassById(classId);
model.setViewName(“/admin/clazz/classe