今天分享一个基于springboot+vue在线考试系统。
系统具体介绍如下:
目录
1.技术介绍
核心技术:SpringBoot+mybatis;
前端:vue;
开发工具:idea;
数据库:mysql5.7;
模版引擎:thymeleaf;
安全框架:JWT;
日志:Hutool-log;
数据库连接池:druid;
2.功能介绍
本项目分前台用户界面功能和后台管理功能;
前台用户界面功能:
-
首页考试列表,展示考试信息及参加考试报名;
-
公告信息;
-
新闻信息;
-
在线留言;
-
用户登陆
后台管理功能:
-
管理员登录
-
系统管理
- 用户管理
- 角色管理
- 菜单管理
-
课程管理
-
题目管理
-
考试管理
-
试卷管理
-
报名管理
-
成绩管理
-
公告管理
-
新闻管理
-
在线留言管理
3.前端
3.1 首页
3.2 公告信息
3.3 新闻信息
3.4 在线留言
3.5 用户登录
根据不同的角色登录到后台后展示不一样的菜单权限
4.后端
4.1 主页
4.2 系统管理
4.2.1 用户管理
4.2.2 用户管理
4.2.3 菜单管理
4.3 课程管理
4.4 题目管理
4.5 考试管理
4.6 试卷管理
4.7 报名管理
4.8 成绩管理
4.9 公告管理
4.10 新闻管理
4.11 在线留言管理
5.核心代码
登录安全验证
public class JwtInterceptor implements HandlerInterceptor {
@Autowired
private IUserService userService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String token = request.getHeader("token");
if (StrUtil.isBlank(token)) {
token = request.getParameter("token");
}
// 如果不是映射到方法直接通过
if(handler instanceof HandlerMethod) {
AuthAccess annotation = ((HandlerMethod) handler).getMethodAnnotation(AuthAccess.class);
if (annotation != null) {
return true;
}
}
// 执行认证
if (StrUtil.isBlank(token)) {
throw new ServiceException(Constants.CODE_401, "无token,请重新登录");
}
// 获取 token 中的 user id
String userId;
try {
userId = JWT.decode(token).getAudience().get(0);
} catch (JWTDecodeException j) {
throw new ServiceException(Constants.CODE_401, "token验证失败,请重新登录");
}
// 根据token中的userid查询数据库
User user = userService.getById(userId);
if (user == null) {
throw new ServiceException(Constants.CODE_401, "用户不存在,请重新登录");
}
// 用户密码加签验证 token
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build();
try {
jwtVerifier.verify(token); // 验证token
} catch (JWTVerificationException e) {
throw new ServiceException(Constants.CODE_401, "token验证失败,请重新登录");
}
return true;
}
}
登录后获取用户对应权限菜单
public UserDTO login(UserDTO userDTO) {
User one = getUserInfo(userDTO);
if (one != null) {
BeanUtil.copyProperties(one, userDTO, true);
// 设置token
String token = TokenUtils.genToken(one.getId().toString(), one.getPassword());
userDTO.setToken(token);
String role = one.getRole(); // ROLE_ADMIN
// 设置用户的菜单列表
List<Menu> roleMenus = getRoleMenus(role);
userDTO.setMenus(roleMenus);
return userDTO;
} else {
throw new ServiceException(Constants.CODE_600, "用户名或密码错误");
}
}