这里主要介绍该系统的总体功能,以及登录功能的实现。

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>

 

Logo

前往低代码交流专区

更多推荐