基于javaweb的SSM+Maven课程在线学习与测试系统(java+ssm+bootstrap+html+mysql)

运行环境

Java≥8、MySQL≥5.7、Tomcat≥8

开发工具

eclipse/idea/myeclipse/sts等均可配置运行

适用

课程设计,大作业,毕业设计,项目练习,学习演示等

功能说明

510023252402

520023252402

530023252402

540023252402

550023252402

560023252402

570023252402

基于javaweb的SSM+Maven课程在线学习与测试系统(java+ssm+bootstrap+html+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

项目亮点


  1. 前后端分离。

  2. 用户登录权限区分和控制。

  3. 防止横向越权和纵向越权。

  4. 设计高复用的服务器响应对象。

  5. guava缓存。

  6. pojo,vo抽象模型。

  7. 数据绑定对象。

  8. Mybatis分页

  9. Bootstrap。

  10. artTemplate,artDialog,iframe前端模板使用。

  11. select2、toastr、sweetalert等等前端插件的使用。

  12. redis缓存。

  13. 全局异常处理,拦截器权限统一检验。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 */
@RequestMapping("delTeacher.do")
@ResponseBody
public ServerResponse delTeacher(HttpServletRequest request, Integer pkTeacher) {
//判断登录
String token = CookieUtil.readCookie(request);
if (StringUtils.isEmpty(token)) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "请先登录");
}
String manageStr = RedisPoolUtil.get(token);
Manager manager = JacksonUtil.stringToObj(manageStr, Manager.class);
if (manager == null) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "请先登录");
}
//判断权限,业务处理
if (Constant.Role.ROLE_ADMIN.equals(manager.getRole())) {
return manageService.delTeacher(pkTeacher);
}
return ServerResponse.createByErrorMessage("不是管理员,无法操作");
}

/**
* @description 查询学生
*/
@RequestMapping("queryStudent.do")
@ResponseBody
public ServerResponse queryStudent(HttpServletRequest request, Student student,
@RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
@RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
//判断登录
String token = CookieUtil.readCookie(request);
if (StringUtils.isEmpty(token)) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "请先登录");
}
String manageStr = RedisPoolUtil.get(token);
Manager manager = JacksonUtil.stringToObj(manageStr, Manager.class);
if (manager == null) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "请先登录");
}
//判断权限,业务处理
if (Constant.Role.ROLE_ADMIN.equals(manager.getRole())) {
return manageService.queryStudent(student, pageNum, pageSize);
}
return ServerResponse.createByErrorMessage("不是管理员,无法操作");
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
        Manager manager = JacksonUtil.stringToObj(manageStr, Manager.class);
if (manager == null) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "请先登录");
}
//判断权限,业务处理
if (Constant.Role.ROLE_ADMIN.equals(manager.getRole())) {
return noticeService.addOrModifyNotice(notice, manager);
}
return ServerResponse.createByErrorMessage("不是管理员,无法操作");
}

/**
* @description 获取单条通知内容
*/
@RequestMapping("getNotice.do")
@ResponseBody
public ServerResponse getNotice(HttpServletRequest request, Integer pkNotice) {
//判断登录
String token = CookieUtil.readCookie(request);
if (StringUtils.isEmpty(token)) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "请先登录");
}
String manageStr = RedisPoolUtil.get(token);
Manager manager = JacksonUtil.stringToObj(manageStr, Manager.class);
if (manager == null) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "请先登录");
}
//判断权限,业务处理
if (Constant.Role.ROLE_ADMIN.equals(manager.getRole())) {
return noticeService.getNotice(pkNotice);
}
return ServerResponse.createByErrorMessage("不是管理员,无法操作");
}
}
package com.bs.controller;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    //判断登录
String token = CookieUtil.readCookie(request);
if (StringUtils.isEmpty(token)) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "请先登录");
}
String teacherStr = RedisPoolUtil.get(token);
Teacher teacher = JacksonUtil.stringToObj(teacherStr, Teacher.class);
if (teacher == null) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "请先登录");
}
//判断权限,业务处理
if (Constant.Role.ROLE_TEACHER.equals(teacher.getRole())) {
return testsService.getTestsInfo(pkTest);
}
return ServerResponse.createByErrorMessage("不是教师,无法操作");
}

/**
* @description 新增试题
*/
@RequestMapping("addTest.do")
@ResponseBody
public ServerResponse addTest(HttpServletRequest request, Tests tests) {
//判断登录
String token = CookieUtil.readCookie(request);
if (StringUtils.isEmpty(token)) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "请先登录");
}
String teacherStr = RedisPoolUtil.get(token);
Teacher teacher = JacksonUtil.stringToObj(teacherStr, Teacher.class);
if (teacher == null) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "请先登录");
}
//判断权限,业务处理
if (Constant.Role.ROLE_TEACHER.equals(teacher.getRole())) {
return testsService.addTest(tests, teacher);
}
return ServerResponse.createByErrorMessage("不是教师,无法操作");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27


/**
* @name ManageInterceptor
* @description
**/
public class ManageInterceptor implements HandlerInterceptor {

private static final Logger log = LoggerFactory.getLogger(ManageInterceptor.class);

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HandlerMethod handlerMethod = (HandlerMethod) handler;
String methodName = handlerMethod.getMethod().getName();
String className = handlerMethod.getBean().getClass().getName();
log.info("拦截类名:{},方法名:{}", className, methodName);
Manager manager = null;
//从redis获取用户信息
String token = CookieUtil.readCookie(request);
if (StringUtils.isNotEmpty(token)) {
String studentStr = RedisPoolUtil.get(token);
manager = JacksonUtil.stringToObj(studentStr, Manager.class);
}
//判断用户信息是否为空或者身份权限不对
return manager != null && (StringUtils.equals(manager.getRole(), "0")) || BaseInterceptor.check(response, manager);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 */
public static void writeCookie(HttpServletResponse response, String value) {
Cookie cookie = new Cookie(COOKIE_NAME, value);
cookie.setDomain(COOKIE_DOMAIN);
cookie.setPath("/");
//防止脚本获取cookie信息
cookie.setHttpOnly(true);
//cookie有效期
cookie.setMaxAge(60 * 60 * 24 * 365);
response.addCookie(cookie);
}

/**
* @description 读取Cookie
*/
public static String readCookie(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie ck : cookies){
if (StringUtils.equals(ck.getName(),COOKIE_NAME)){
return ck.getValue();
}
}
}
return null;
}

/**
* @description 删除Cookie
*/
public static void deleteCookie(HttpServletRequest request,HttpServletResponse response){
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie ck : cookies){
if (StringUtils.equals(ck.getName(),COOKIE_NAME)){
ck.setDomain(COOKIE_DOMAIN);
ck.setPath("/");
ck.setHttpOnly(true);
//直接设置Cookie有效期为0,表示删除此Cookie
ck.setMaxAge(0);
response.addCookie(ck);
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

/**
* @description 删除试卷试题
*/
@RequestMapping("deleteTestsFromPaper.do")
@ResponseBody
public ServerResponse deleteTestsFromPaper(HttpServletRequest request, Integer fkTest, Integer fkPaper) {
//判断登录
String token = CookieUtil.readCookie(request);
if (StringUtils.isEmpty(token)) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "请先登录");
}
String teacherStr = RedisPoolUtil.get(token);
Teacher teacher = JacksonUtil.stringToObj(teacherStr, Teacher.class);
if (teacher == null) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "请先登录");
}
//判断权限,业务处理
if (Constant.Role.ROLE_TEACHER.equals(teacher.getRole())) {
return paperService.deleteTestsFromPaper(fkTest, fkPaper, teacher);
}
return ServerResponse.createByErrorMessage("不是教师,无法操作");
}

/**
* @description 清空试卷试题
*/
@RequestMapping("emptyTestsFromPaper.do")
@ResponseBody
public ServerResponse emptyTestsFromPaper(HttpServletRequest request, Integer fkPaper) {
//判断登录
String token = CookieUtil.readCookie(request);
if (StringUtils.isEmpty(token)) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "请先登录");
}
String teacherStr = RedisPoolUtil.get(token);
Teacher teacher = JacksonUtil.stringToObj(teacherStr, Teacher.class);
if (teacher == null) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "请先登录");
}
//判断权限,业务处理
if (Constant.Role.ROLE_TEACHER.equals(teacher.getRole())) {
return paperService.emptyTestsFromPaper(fkPaper, teacher);
}
return ServerResponse.createByErrorMessage("不是教师,无法操作");


项目链接:
https://javayms.github.io?id=401422322105200ks
https://javayms.pages.dev?id=401422322105200ks