小碼哥CRM專案(二)p20~p35

你的熱情還在嗎發表於2020-10-21

P20

儲存日誌資訊,建立資料庫表

在這裡插入圖片描述
在這裡插入圖片描述

程式碼生成器生成物件檔案

在這裡插入圖片描述

  • 修改檔案

在這裡插入圖片描述

還要修改opuserid=>opuser.id

在這裡插入圖片描述

要把日誌資訊切入到哪個service方法中

在這裡插入圖片描述
在這裡插入圖片描述

把request繫結到執行緒中

在這裡插入圖片描述
在這裡插入圖片描述

因為所有請求都要通過攔截器,所以繫結在攔截器上

在這裡插入圖片描述登入方法也能獲取得到request物件。
在這裡插入圖片描述

public class LogUtil {
    public void writeLog(){
        System.out.println(UserContext.get());
        System.out.println("*****************");
        System.out.println("******寫入日誌******");
        System.out.println("*****************");
    }
}

在這裡插入圖片描述

LogUtil.java

public class LogUtil {
    @Autowired
    private ILogService logService;
    public void wirteLog(JoinPoint joinPoint){
        //出現自己切自己的情況
        if(joinPoint.getTarget() instanceof ILogService){
            return;
        }
        Log log = new Log();
        log.setOptime(new Date());
        HttpServletRequest request = UserContext.get();
        Employee currentUser = (Employee) request.getSession().getAttribute(UserContext.USERINSESSION);
        log.setOpuser(currentUser);
        String ip = request.getRemoteAddr();
        log.setOpip(ip);
        String function = joinPoint.getTarget().getClass().getName()+":"+joinPoint.getSignature().getName();
        log.setFunction(function);
        ObjectMapper mapper = new ObjectMapper();
        String params;
        try {
            params = mapper.writeValueAsString(joinPoint.getArgs());
            log.setParams(params);
            System.out.println(params);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        //插入日誌記錄到資料庫
        //logService.insert(log);
    }

}

在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述

這裡我必須要吐槽一下,WC...所有操作都完成了後,我去查詢資料庫,發現資料庫裡面的資料沒有更新??,我就開始排查,一直在檢查程式碼,看以前寫過的專案,又重看視訊兩次,在想:mysql沒有開啟自動提交??檔案打錯了??差點還想著手動提交程式碼試一下了,不過我忘記怎麼手動提交了[捂臉]

後面就想著要不重新開啟一個新的視窗查詢,居然...居然出來了,還出來了很多,從11:40分的資料到14:20的資料都出來了...好吧,以後再也不想用MySQLworkbeach的上一個視窗查詢了。That's all.

總結
在這裡插入圖片描述在這裡插入圖片描述


P21

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述在這裡插入圖片描述
建立資料庫表
在這裡插入圖片描述在這裡插入圖片描述
在這裡插入圖片描述在這裡插入圖片描述

編寫分頁

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述在這裡插入圖片描述


  • 新增許可權
    在這裡插入圖片描述

P22
雙擊選中新增許可權

在這裡插入圖片描述

在這裡插入圖片描述


P23
在這裡插入圖片描述

將所有許可權儲存在一個集合中
執行逆向工程

在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述先註釋掉新增方法
在這裡插入圖片描述

測試
在這裡插入圖片描述沒有額外引數
在這裡插入圖片描述獲得引數
在這裡插入圖片描述
在這裡插入圖片描述


P24
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述在這裡插入圖片描述

查詢該角色的許可權

在這裡插入圖片描述


P25

查詢許可權

在這裡插入圖片描述
在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述

編輯

需要先刪除以前的許可權,在新增新的許可權

在這裡插入圖片描述
在這裡插入圖片描述在這裡插入圖片描述

測試一下


在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

總結

在這裡插入圖片描述在這裡插入圖片描述


P26
先點選角色,會載入許可權資訊=>點選新增的時候會帶過來

在這裡插入圖片描述
在這裡插入圖片描述


P27
員工和角色之間的關係

在這裡插入圖片描述
在這裡插入圖片描述在這裡插入圖片描述

employee.jsp

<tr>
          <td>角色</td>
          <td><input type="text" id="emp_roles" class="easyui-combobox" data-options="valueField:'id',textField:'name',url:'/role_queryForEmp',multiple:true"></td>
</tr>

在這裡插入圖片描述測試,role下拉框

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

總結

在這裡插入圖片描述在這裡插入圖片描述


P28

點選編輯的時候可以看到員工的所有角色資訊

在這裡插入圖片描述

在這裡插入圖片描述在這裡插入圖片描述

測試一下

在這裡插入圖片描述
編輯也是先把之前的角色資訊刪除掉,然後在新增新的進去

在這裡插入圖片描述
在這裡插入圖片描述

測試,更新成功

總結
在這裡插入圖片描述


P29

在這裡插入圖片描述
在這裡插入圖片描述


P30,URL控制

這一章節確實好難,要多敲多看幾遍[捂臉]

在這裡插入圖片描述在這裡插入圖片描述

LoginInterceptor .java

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {

        //-----------------為當前執行緒繫結request物件------------------
        UserContext.set(httpServletRequest);

        //-----------------登入攔截-------------------
        // 從session中獲取使用者資訊
        Employee employee = (Employee) httpServletRequest.getSession().getAttribute(UserContext.USER_IN_SESSION);
        if (employee == null) {
            // 攔截請求並重定向到登入頁面
            httpServletResponse.sendRedirect("/login.jsp");
            // 記得return false,否則程式還是會往下走,經過攔截器達到目標Controller
            return false;
        }

        //-----------------許可權校驗-------------------
        if (handler instanceof HandlerMethod) {
            HandlerMethod methodObj = (HandlerMethod) handler;
            String function = methodObj.getBean().getClass().getName() + ":" + methodObj.getMethod().getName();
            // 判斷當前使用者是否有許可權訪問這個方法
            boolean flag = PermissionUtil.checkPermission(function);
            if (flag) {
                return true;
            } else {
                 System.out.println("被攔截了.");
                                 return false;
                }

            }
        }

        return true;

    }

PermissionUtil ,java

package com._520it.crm.util;

import com._520it.crm.domain.Employee;
import com._520it.crm.domain.Menu;
import com._520it.crm.domain.Permission;
import com._520it.crm.service.IPermissionService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

@Component
public class PermissionUtil {

    /*
     * Spring確實能給物件屬性注入值
     * 但我們必須搞明白,什麼是物件屬性?非靜態欄位!!
     * 靜態欄位屬於類,不屬於物件。
     * 不信的話,大家可以建立一個Person類,設定兩個欄位 靜態的age、非靜態的name。
     * 結果你debug觀察person物件只能看到name!
     * */


    private static IPermissionService permissionService;

    @Autowired
    public void setPermissionService(IPermissionService permissionService) {
        PermissionUtil.permissionService = permissionService;
    }

    /**
     * 你們可能覺得 超級管理員放行、ALL許可權又放行,之間的邏輯是不是有點亂,感覺可以合併?其實仔細想想,確實有這樣的需求的
     * @param function
     * @return
     */
    public static boolean checkPermission(String function) {

        System.out.println(function);
        /*
         * 如果是超級管理員直接放行
         *
         * 拿到當前系統所有許可權資源(需要許可權驗證的url),判斷當前方法是否包含在其中
         *   1.不包含:不需要許可權判斷,返回true,放行
         *   2.包含,則進一步判斷當前使用者是否擁有該許可權
         *       1)擁有:返回true,放行
         *       2)沒有:返回false,攔截
         *
         * */

        // 如果是超級管理員,直接放行
        Employee currentUser = (Employee) UserContext.get().getSession().getAttribute(UserContext.USER_IN_SESSION);
        if (currentUser.getAdmin()) {
            return true;
        }

        // 得到當前系統所有許可權(需要許可權驗證的url的)
        if (CommonUtil.ALL_PERMISSIONS.size() == 0) {
            // 從資料庫查詢當前系統所有許可權資源,封裝到ALL_PERMISSIONS
            List<Permission> permissions = permissionService.selectAll();
            for (Permission permission : permissions) {
                CommonUtil.ALL_PERMISSIONS.add(permission.getResource());
            }
        }

        // 如果當前訪問的url不在系統所有許可權中,說明不需要驗證,否則進行驗證
        if (CommonUtil.ALL_PERMISSIONS.contains(function)) {
            // 當前訪問的方法需要許可權驗證,所以要檢視當前使用者是否擁有該許可權
            List<String> userPermissions = (List<String>) UserContext.get().getSession().getAttribute(UserContext.PERMISSION_IN_SESSION);
            if (userPermissions.contains(function)) {
                return true;
            } else {
                // ALL許可權匹配
                String allPermission = function.split(":")[0] + ":ALL";
                if (userPermissions.contains(allPermission)) {
                    return true;
                } else {
                    return false;
                }
            }
        } else {
            // 當前訪問的方法不需要許可權驗證,直接放行
            return true;
        }
    }


    /**
     * 根據當前使用者的許可權,從全部選單中篩選出使用者能訪問的選單
     *
     * @param menuList
     */
    public static void checkMenuPermission(List<Menu> menuList) {

        /*
        * 不知道有沒有人注意到,老師for迴圈遍歷是反過來的。
        * 如果你是和我一樣正向遍歷,注意在remove後i--,否則會出錯。
        * 具體原因,大家自己畫圖分析一下就知道了,劉意老師在迭代器還是集合那邊有提到過。
        * 想視訊里老師的做法,他的迴圈判斷條件不受size影響,它只看i是否還大於0,即當前list是否還有元素,有就繼續迭代
        *
        * */

        // 使用者擁有的許可權
        List<String> userPermissions = (List<String>) UserContext.get().getSession().getAttribute(UserContext.PERMISSION_IN_SESSION);

        // 遍歷系統選單,與當前使用者擁有的許可權進行比對
        for (int i = 0; i < menuList.size(); i++) {

            String menuPermission = menuList.get(i).getFunction();
            // 選單需要訪問許可權
            if (StringUtils.isNotBlank(menuPermission)) {
                // 如果使用者沒有該選單許可權,刪除它,這樣前臺就不會顯示
                if (!userPermissions.contains(menuPermission)) {
                    menuList.remove(i);
                    // 注意,如果是從前往後遍歷,一定要i--,否則會出錯
                    i--;
                }
                // else 就說明使用者有許可權,那麼就不做處理,選單保留著
            }
            // else 說明該選單根本不要求訪問許可權,誰來都可以訪問,那麼當前使用者也可以,還是不做處理,選單保留著

            // 遞迴處理子選單
            List<Menu> childrenMenuList = menuList.get(i).getChildren();
            if (!childrenMenuList.isEmpty()) {
                checkMenuPermission(childrenMenuList);
            }
        }

    }
}

CommonUtil .java

package com._520it.crm.util;

import java.util.ArrayList;
import java.util.List;

public class CommonUtil {
    // 存放當前系統所有許可權資源(即需要進行許可權判斷的url地址)
    public static final List<String> ALL_PERMISSIONS = new ArrayList<>();

}

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

總結

在這裡插入圖片描述在這裡插入圖片描述


P32,攔截之後的相應處理

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述


P33
按鈕許可權控制
在這裡插入圖片描述

自定義標籤,現在可能不太常用了。畢竟JSP都快被淘汰了

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

測試一下

在這裡插入圖片描述

總結

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述


P34,系統選單
在這裡插入圖片描述
在這裡插入圖片描述

選單樹結構自關聯

在這裡插入圖片描述
逆向工程
在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com._520it.crm.mapper.MenuMapper" >
  <resultMap id="BaseResultMap" type="com._520it.crm.domain.Menu" >
    <id column="id" property="id" jdbcType="BIGINT" />
    <result column="text" property="text" jdbcType="VARCHAR" />
    <result column="iconCls" property="iconCls" jdbcType="VARCHAR" />
    <result column="checked" property="checked" jdbcType="BIT" />
    <result column="state" property="state" jdbcType="VARCHAR" />
    <result column="attributes" property="attributes" jdbcType="VARCHAR" />
    <result column="function" property="function" jdbcType="VARCHAR" />
    <collection property="children" column="id" ofType="com._520it.crm.domain.Menu" select="com._520it.crm.mapper.MenuMapper.queryByParentId"></collection>
  </resultMap>

  <select id="queryForMenu" resultMap="BaseResultMap">
    select * from menu where parent_id is null
  </select>

  <select id="queryByParentId" resultMap="BaseResultMap">
    select * from menu where parent_id = #{id}
  </select>

</mapper>

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

測試一下


P35
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

使用者登入的時候把登入放在session中

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

·選單許可權控制·

在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

這一節有點難https://www.bilibili.com/video/BV16E411q7N2?p=35

在這裡插入圖片描述

測試

又總結一下

在這裡插入圖片描述
在這裡插入圖片描述
學習自:小碼哥JavaEE課程CRM專案(SSM實戰專案)

相關文章