springBoot+shiro+vue的学生管理系统(二、总体功能及登录功能)
这里主要介绍该系统的总体功能,以及登录功能的实现。GitHub代码后端地址:https://github.com/qiuxinfa/springboot-shiro-vue-stuGitHub代码前端地址:https://github.com/qiuxinfa/boot-shiro-vue-stu-client一、总体功能目前整个系统分为3种角色(可以增加其他角色...
这里主要介绍该系统的总体功能,以及登录功能的实现。
GitHub代码后端地址:https://github.com/qiuxinfa/springboot-shiro-vue-stu
GitHub代码前端地址:https://github.com/qiuxinfa/boot-shiro-vue-stu-client
一、总体功能
目前整个系统分为3种角色(可以增加其他角色),包括管理员、老师、学生,各自拥有不同的权限,具体看图和代码(数据库里面权限的设计,参考第一篇)。
1.管理员:
2.老师:
3.学生:
每个角色都可以查看用户列表,因为登录成功之后,默认是进入用户列表的,简单说一下老师和学生的功能:
(1)老师拥有:查看自己负责的课程,选择该课程的学生,以及可以录入成绩,并可以查看成绩统计分析(在开发中。。。)
(2)学生可以选课,查看成绩
4.后端代码总体结构:
(1)spect
主要利用AOP功能对请求进行拦截,进入日志记录和操作记录,以及权限判断处理。
(2)config
配置文件,主要包括mybatis配置,跨域配置,shiro配置
(3)controller
前后台交互的接口
(4)exception
利用@ControllerAdvice注解,实现全局异常处理
(5)ftp
文件上传,这里主要处理头像的上传
(6)mapper
dao层接口以及mybatis映射文件
(7)pojo
实体类
(8)service
业务逻辑层
(9)shiro
自定义shiro身份认证,这里没有用到权限,权限的处理,都在aspect进行拦截处理
(10)utils
统一结果返回形式,以及相关常量的定义
二、登录功能
实现思路:
1.前端采用用户名+密码的方式登录
2.后端根据前端传过来的用户名和密码,到数据库查询,如果查到了用户,则根据用户的角色查找权限,并返回
3.前端根据返回的状态码进行判断是否登录成功(状态为200则成功)
4.后端相关代码:
(1)controller
@RequestMapping(value = "/login",method = RequestMethod.POST)
public Object login(String name,String pass, HttpSession session, HttpServletRequest request) {
User user = new User();
user.setUsername(name);
user.setPassword(pass);
return userService.login(user, session, request);
}
(2)serviceImpl
@Override
public Object login(User u, HttpSession session, HttpServletRequest request) {
UsernamePasswordToken upToken = new UsernamePasswordToken(u.getUsername(), SecureUtil.md5(u.getPassword()));
Subject subject = SecurityUtils.getSubject();
subject.login(upToken);
User user = (User) subject.getPrincipal();
session.setAttribute("user", user);
// 登录日志
LoginLog loginLog = new LoginLog();
loginLog.setUserId(user.getId());
loginLog.setLoginTime(new Date());
loginLog.setLoginIp(request.getRemoteAddr());
loginLog.setLoginTotal(loginLogService.findMaxLoginTatalByUserId(user.getId())); // 登录总次数
loginLogService.insert(loginLog);
// 根据用户类型查询 一级菜单
List<Perms> parentList = rolePermissionService.findRolesPermisByFatherId(null, user.getRoleId());
List<Perms> sonList = null;
List<Perms> sonssonList = null;
for (int i = 0, j = parentList.size(); i < j; i++) {
// 二级 页面
sonList = rolePermissionService.findRolesPermisByFatherId(parentList.get(i).getId(), user.getRoleId());
for (int k = 0, l = sonList.size(); k < l; k++) {
// 三级 按钮
sonssonList = rolePermissionService.findRolesPermisByFatherId(sonList.get(k).getId(), user.getRoleId());
sonList.get(k).setChildren(sonssonList);
}
parentList.get(i).setChildren(sonList);
}
user.setUserPerms(parentList);
user.setLastLoginTime(new Date());
super.updateById(user);
return ResultUtil.result(EnumCode.OK.getValue(), "登陆成功", JSON.toJSON(user));
}
3.根据父权限id和角色id查询菜单的sql
<select id="findRolesPermisByFatherId" resultType="com.qxf.pojo.Perms">
<if test="null == parentId">
SELECT
p.`name`,
p.url,
p.id
FROM
`t_perms` AS p LEFT JOIN t_role_perms AS rp ON p.id = rp.perms_id
WHERE
p.parent_id = '0'
<if test="null != roleId and ''!=roleId">
AND rp.role_id = #{roleId}
</if>
GROUP BY p.sort
</if>
<if test="null != parentId">
SELECT
p.`name`,
p.url,
p.id
FROM t_perms AS p LEFT JOIN t_role_perms AS rp ON p.id = rp.perms_id
WHERE
p.parent_id = #{parentId}
<if test="null != roleId and ''!=roleId">
AND rp.role_id = #{roleId}
</if>
GROUP BY p.sort
</if>
</select>
更多推荐
所有评论(0)