天天看點

springBoot+shiro+vue的學生管理系統(二、總體功能及登入功能)

   這裡主要介紹該系統的總體功能,以及登入功能的實作。

GitHub代碼後端位址:https://github.com/qiuxinfa/springboot-shiro-vue-stu

GitHub代碼前端位址:https://github.com/qiuxinfa/boot-shiro-vue-stu-client

一、總體功能

      目前整個系統分為3種角色(可以增加其他角色),包括管理者、老師、學生,各自擁有不同的權限,具體看圖和代碼(資料庫裡面權限的設計,參考第一篇)。

1.管理者:

springBoot+shiro+vue的學生管理系統(二、總體功能及登入功能)

 2.老師:

springBoot+shiro+vue的學生管理系統(二、總體功能及登入功能)

3.學生:

springBoot+shiro+vue的學生管理系統(二、總體功能及登入功能)

每個角色都可以檢視使用者清單,因為登入成功之後,預設是進入使用者清單的,簡單說一下老師和學生的功能:

(1)老師擁有:檢視自己負責的課程,選擇該課程的學生,以及可以錄入成績,并可以檢視成績統計分析(在開發中。。。)

(2)學生可以選課,檢視成績

4.後端代碼總體結構:

springBoot+shiro+vue的學生管理系統(二、總體功能及登入功能)

(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>
           

繼續閱讀