小碼哥CRM專案(二)p20~p35
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實戰專案)
相關文章
- CRM中的專案管理:搭建CRM與專案一體化管理專案管理
- Vue專案中生成二維碼Vue
- 微信小程式:小程式碼、小程式二維碼、普通二維碼微信小程式
- 小浪哥狂聊PromisePromise
- 專案二
- 練手小專案(二):計算器(說明文件)
- 使用Git進行小專案程式碼管理Git
- vue-cli 專案下生成二維碼Vue
- Sonata簽署業務轉型CRM專案
- 灰哥的二叉樹二叉樹
- 小碼哥iOS學習筆記第六天: initialize方法iOS筆記
- 爬蟲小專案爬蟲
- 飛機小專案
- springmvc小專案SpringMVC
- 小專案模組外包
- 華為P20 Pro與P20區別對比評測 華為P20和P20 Pro哪個好?
- 對CRM專案實施全程質量管理
- 三類企業不適合上CRM專案
- 社交CRM專案失敗的10大原因
- 專案分享二:APP 小紅點中數字的處理APP
- MySQL 只能做小專案?鬆哥要說幾句公道話!MySql
- 小碼哥iOS學習筆記第三天: isa和superclassiOS筆記
- 練手小專案一:JAVA聊天室原始碼Java原始碼
- 華為P20/P20 Pro截圖方法詳解 華為P20怎麼截圖?
- 聊聊 Web 專案二維碼生成的最佳姿勢Web
- webpack練手專案之easySlide(二):程式碼分割WebIDE
- Swift指令碼(二):無失真壓縮專案中的png檔案Swift指令碼
- 小程式專案之填坑小記
- 智雲通CRM:如何判斷專案的價值?
- 考勤系統+(小專案)
- Mysql-cluster小專案MySql
- 小程式專案總結
- 初步建立小程式專案
- 小程式專案-總結
- 續專案管理小結專案管理
- 微信小程式上手專案微信小程式
- (原)專案管理之外談專案管理之二專案管理
- docker部署Web專案(二)DockerWeb