平臺模塊總結

簡述:前端

  權限是什麼?針對咱們後臺系統簡單說,就是不一樣用戶登陸後,看到的模塊-菜單-功能按鈕的維度不一樣。本次主要講權限模塊表設計、表關聯關係、如何作到權限控制、以及登陸過程後臺都發生了什麼。咱們的後臺涉及到兩個權限角色,一個是針對平臺管理員、供應商管理員的大權限角色 sys_role;一個是針對平臺、供應商普通員工的小權限角色 company_role。管理員涉及到:role.xml功能菜單樹、sys_role,sys_admin,customer_info三張表和sysAdiminLogin視圖;普通員工涉及到:role.xml功能菜單樹、company_role公司角色表,company_dept公司部門表,company_user公司員工三張表和adminLogin視圖。這裏只講大權限表關係,小權限表關係相似。角色表sys_role和功能菜單是多對多的關係,一個角色能夠有多功能菜單,一個功能菜單也能夠對應多個角色;管理員表sys_admin和角色表sys_role是多對一的關係,及一個管理員只能有一個角色,但一個角色可對應多個管理員(其它平臺通常設計成多對多的關係,他們的角色表是針對於模塊。如商品角色、訂單角色等),本質上是同樣的,咱們角色可對應多個模塊的功能菜單。咱們菜單功能數據使用xml文件管理的,好處的能夠下降數據庫呀壓力;不太方便的是每增長菜單或功能都要從新部署平臺模塊。登陸發生了什麼:根據帳號和密碼查詢數據庫,若驗證經過拿到登陸者信息(含擁有的功能權限ID逗號拼接),將該信息放到緩存中並返回token給前端。前端拿着token、sign數據請求用戶菜單信息接口,根據返回數據展現對應模塊菜單信息。所登陸的用戶共4種,1-平臺管理員,2-平臺員工,3-供應商管理員,4-供應商員工。(其中供應商登陸者最多隻能看到平臺爲該供應商管理員指定的角色權限功能)。redis

一:表設計數據庫

sys_role:平臺角色權限表,用於管理員(平臺-供應商)緩存

CREATE TABLE `sys_role` ( `id` int(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '權限值ID:自增', `role_name` varchar(30) NOT NULL COMMENT '角色名稱', `description` varchar(100) DEFAULT NULL COMMENT '權限描述', `permission` text COMMENT '權限ID集', `pid` int(2) DEFAULT NULL COMMENT '大類ID 1:平臺商-2:採購商-3供應商', `create_time` datetime DEFAULT NULL COMMENT '建立時間', `creator` varchar(30) DEFAULT NULL COMMENT '建立人', `modify_time` datetime DEFAULT NULL COMMENT '修改時間', `modifier` varchar(30) DEFAULT NULL COMMENT '修改人', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=57 DEFAULT CHARSET=utf8 COMMENT='平臺角色權限表

sys_admin:平臺管理者表,用於存儲平臺和供應商管理員,(關聯平臺角色ID、供應商ID)。平臺管理員是預置的,供應商管理員是添加供應商時添加的。微信

CREATE TABLE `sys_admin` ( `id` int(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '權限值ID:自增', `sys_admin_name` varchar(30) NOT NULL COMMENT '管理者名稱', `sys_admin_pwd` varchar(32) DEFAULT NULL COMMENT '管理者密碼', `cid` int(8) DEFAULT NULL COMMENT '公司ID', `sys_role_id` int(8) DEFAULT NULL COMMENT '平臺角色ID', `user_type` int(1) DEFAULT NULL COMMENT '用戶固定標籤 0:管理員', `icon` varchar(100) DEFAULT NULL COMMENT '頭像', `token` varchar(32) DEFAULT NULL COMMENT '登陸Token', `login_time` varchar(20) DEFAULT NULL COMMENT '最後登陸時間', `create_time` datetime DEFAULT NULL COMMENT '建立時間', `creator` varchar(30) DEFAULT NULL COMMENT '建立人', `modify_time` datetime DEFAULT NULL COMMENT '修改時間', `modifier` varchar(30) DEFAULT NULL COMMENT '修改人', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=310 DEFAULT CHARSET=utf8 COMMENT='平臺管理者表'

sysAdiminLogin:後臺管理員登陸視圖SQLsession

SELECT (CASE`e`.`pid` WHEN '1' THEN '平臺管理員' WHEN '3' THEN '供應商管理員' ELSE '' END) AS `user_name`, `a`.`token` AS `token`, `a`.`sys_admin_name` AS `phone`, #登陸名 `a`.`sys_admin_pwd` AS `passwd`, #登陸密碼 `a`.`id` AS `uid`, #管理員ID `a`.`user_type` AS `user_type`,            #用戶固定標籤 0:管理員 1:普通員工 `f`.`customer_name` AS `customer_name`, #公司名稱 `f`.`status` AS `status`,                  #用戶狀態 0-禁用,1-啓用 `f`.`id` AS `cid`, #公司ID `e`.`pid` AS `customer_type`,              #大類ID 1-平臺商,3-供應商 `e`.`permission` AS `permission`, #權限 `e`.`role_name` AS `role_name` #角色名 FROM `sys_admin` `a` LEFT JOIN `sys_role` `e` ON `a`.`sys_role_id` = `e`.`id` LEFT JOIN `customer_info` `f`  ON `a`.`cid` = `f`.`id`

company_role:公司角色權限表,設置公司員工權限 (關聯公司ID,該角色屬於哪一個公司)架構

CREATE TABLE `company_role` ( `id` int(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '權限值ID:自增', `cid` int(8) NOT NULL COMMENT '公司ID', `role_name` varchar(30) NOT NULL COMMENT '權限名稱', `description` varchar(100) DEFAULT NULL, `permission` varchar(5000) DEFAULT NULL COMMENT '權限', `create_time` datetime DEFAULT NULL COMMENT '建立時間', `creator` varchar(30) DEFAULT NULL COMMENT '建立人', `modify_time` datetime DEFAULT NULL COMMENT '修改時間', `modifier` varchar(30) DEFAULT NULL COMMENT '修改人', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=179 DEFAULT CHARSET=utf8 COMMENT='公司角色權限表'

company_dept:公司部門表,保存公司部門(關聯公司ID,該部門屬於哪一個公司)ui

CREATE TABLE `company_dept` ( `id` int(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '表ID:自增', `dept_name` varchar(30) NOT NULL COMMENT '部門名稱', `pid` int(8) DEFAULT NULL COMMENT '父級部門ID', `cid` int(8) NOT NULL COMMENT '公司ID', `create_time` datetime DEFAULT NULL COMMENT '建立時間', `creator` varchar(30) DEFAULT NULL COMMENT '建立者 id', `modify_time` datetime DEFAULT NULL COMMENT '修改時間', `modifier` varchar(30) DEFAULT NULL COMMENT '修改人', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=181231 DEFAULT CHARSET=utf8 COMMENT='公司部門表'

company_user:公司員工表,(關聯公司角色ID,有什麼權限;關聯公司部門ID,屬於哪一個部門)加密

CREATE TABLE `company_user` ( `id` int(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '表ID:自增', `user_name` varchar(30) NOT NULL COMMENT '用戶名稱', `passwd` varchar(32) NOT NULL COMMENT '登錄密碼(MD5加密)', `token` varchar(32) DEFAULT NULL COMMENT '登陸Token', `pid` int(8) DEFAULT NULL COMMENT '上級ID', `phone` varchar(30) NOT NULL COMMENT '手機號碼', `qq` varchar(20) DEFAULT NULL COMMENT 'qq號', `wechat` varchar(32) DEFAULT NULL COMMENT '微信號', `email` varchar(32) DEFAULT NULL COMMENT '郵箱', `dept_id` int(8) DEFAULT NULL COMMENT '部門ID', `role_id` int(8) NOT NULL COMMENT '角色ID', `user_type` int(1) DEFAULT NULL COMMENT '用戶固定標籤 1:普通員工', `icon` varchar(100) DEFAULT NULL COMMENT '頭像', `view_scope` int(1) DEFAULT '0' COMMENT '查看數據範圍(1-本人,2-本部門,3-公司,4,所有)', `status` int(1) DEFAULT NULL COMMENT '員工狀態 0-離職,1-在職', `login_time` varchar(20) DEFAULT NULL COMMENT '最新登陸時間', `create_time` datetime DEFAULT NULL COMMENT '建立時間', `creator` varchar(30) DEFAULT NULL COMMENT '建立者 id', `modify_time` datetime DEFAULT NULL COMMENT '修改時間', `modifier` varchar(30) DEFAULT NULL COMMENT '修改人', `token2` varchar(32) DEFAULT NULL COMMENT '渠道部APP登陸token', `remark` varchar(100) DEFAULT NULL COMMENT '備註', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=233 DEFAULT CHARSET=utf8 COMMENT='公司員工表'

 adminLogin:公司員工登陸視圖url

SELECT `a`.`user_name`     AS `user_name`, #員工名 `a`.`token` AS `token`, `a`.`passwd` AS `passwd`, #密碼 `a`.`phone` AS `phone`, #登陸名 `a`.`id` AS `uid`, #員工ID `a`.`user_type` AS `user_type`,      #用戶固定標籤 1:普通員工 `a`.`view_scope` AS `view_scope`,     #查看數據範圍(1-本人,2-本部門,3-公司,4-所有) `b`.`id` AS `did`, #部門ID `b`.`dept_name` AS `dept_name`, #部門名稱 `c`.`id` AS `rid`, #角色ID `c`.`role_name` AS `role_name`, #角色名稱 `c`.`permission` AS `permission`, #權限ID集 `e`.`role_name` AS `sys_role_name`, #大類權限名稱 `f`.`id` AS `cid`, #所公司ID `f`.`customer_name` AS `customer_name`, #所屬公司 `f`.`customer_type` AS `customer_type`,  #所屬公司類型(1-平臺商,3-供應商) `f`.`status` AS `status`          #所屬公司(供應商)狀態 0-禁用,1-啓用 FROM `company_user` `a` LEFT JOIN `company_dept` `b`ON `a`.`dept_id` = `b`.`id` LEFT JOIN `company_role` `c` ON `c`.`id` = `a`.`role_id` LEFT JOIN `customer_info` `f` ON `c`.`cid` = `f`.`id` LEFT JOIN `sys_role` `e` ON (`e`.`pid` = `f`.`customer_type` AND `e`.`id` = `f`.`category`) WHERE `a`.`status` = 1

 三:權限樹格式,role.xml文件,菜單作到二級,功能按鈕作到一級

<?xml version="1.0" encoding="UTF8"?>
<org>
    <model name="平臺" id="10001" url="/platform">
        <menu name="員工管理" id="1000101" url="" icon="employee">
            <action id="100010101" name="組織架構" url="/platform/index">
                <function id="10001010101" name="組織架構列表"></function>
                <function id="10001010102" name="添加部門"></function>
                <function id="10001010103" name="編輯部門"></function>
                <function id="10001010104" name="刪除部門"></function>
                <function id="10001010105" name="添加員工"></function>
                <function id="10001010106" name="編輯員工"></function>
                <function id="10001010107" name="重置密碼"></function>
                <function id="10001010108" name="刪除員工"></function>
            </action>
        </menu>
    </model>
    <model name="客戶" id="10002" url="/custom">
        <menu name="採購商管理" id="1000201" url="" icon="purchase">
            <action id="100020101" name="採購商列表" url="/custom/index">
                <function id="10002010101" name="採購商列表"></function>
                <function id="10002010102" name="添加採購商" url="/custom/addPurchase"></function>
                <function id="10002010103" name="編輯採購商" url="/custom/addPurchase"></function>
                <function id="10002010104" name="查看採購商" url="/custom/checkPurchase"></function>
                <function id="10002010105" name="啓用/禁用採購商"></function>
                <function id="10002010106" name="分配採購商" url="/custom/checkPurchase"></function>
                <function id="10002010107" name="審覈採購商" url="/custom/confirmReview"></function>
                <function id="10002010108" name="複審採購商" url="/custom/confirmReview"> </function>
                <function id="10002010109" name="重置密碼"></function>
            </action>
        </menu>
    </model>
</org>

四:角色權限重要實現

(1)登陸接口:localhost:6001/sys/user/adminLogin (參數:手機號,密碼)

1.進入濾器,進行簽名驗證,登陸時不需token驗證; 2.經過手機號、MD5(密碼)做爲參數獲取登陸信息,(管理員->sysAdiminLogin視圖,普通員工->adminLogin視圖); 3.若拿到登陸信息,數據驗證(如部門、角色、權限、禁用等),清除緩存老的token; 4.用戶名+公司名+手機號+當前時間,MD5雙重加密生成新token; 5.改變最新登陸時間,緩存添加新token,設置有效時間爲1小時; 6.更新數據庫對應登錄者的token、最新登陸時間; 7.登陸成功返回token,用戶信息(去除密碼)。

token驗證及redis緩衝延時:
1.根據指定前綴+token做爲key,從redis獲取登陸信息userInfo;
2.若拿到userIfon,若是緩存有效時間小於10分鐘將更新緩存;
3.以relogin爲鍵將userInfo放到session中,而後放行。

(2)獲取用戶對應菜單信息:localhost:6001/sys/sysRole/getMenuByRoleId

目的:展現對應的模塊和菜單

1
.從session獲取登陸信息,拿到用戶角色對應逗號拼接功能權限ids;
2.循環拿到每一個功能id遍歷role.xml找到對應元素及全部上級元素封裝到List<SysRoleVO> list;
3.上面的list會存在多個重複的功能上級元素,重寫SysRoleVO的equals方法(name、id都相同),經過contains方法判斷去重;
4.找到全部的一級節點,爲一級節點設置子菜單(遞歸,繼續爲子菜單添加子菜單)返回。

( 3)平臺用戶類型、角色管理權限樹:localhost:6001/sys/sysRole/getRolePermission ,localhost:6001/sys/role/getRolePermission

目的:爲用戶類型-角色受權作準備

1
.經過角色roleId獲取逗號拼接功能權限ids;
2.new SAXReader().read(is)加載role.xml權限樹,將全部元素封裝到List<RoleVO> list,RoleVO全部auth屬性值均爲false; 3.循環list,ids改變auth屬性值爲true或false;4.找到全部的一級節點,爲一級節點設置子菜單(遞歸,繼續爲子菜單添加子菜單)返回。

( 4)供應商管理員及供應商員工,角色權限樹-->localhost:6001/sys/role/getRolePermission   注:最多隻能看到平臺爲該供應商管理員分配的權限菜單

1.從session獲取登陸信息,拿到管理員逗號拼接功能權限ids; 2.根據角色ID獲取角色對應權限ds2; 3.遍歷ids拿到每一個id去匹配role.xml,將部分元素封裝到list<RoleVo> list,同時便利ids2比較是否相等,改變auth屬性值爲true或false; 4.去重,遞歸分配子菜單。

 五:組織架構重要實現

(1)獲取組織架構樹結構:http://192.168.99.131:6001/sys/dept/findDeptByCid

1.根據公司ID找到全部的部門List<CompanyDeptVo> rootDepartment ;
2.遍歷rootDepartment拿到全部的一級部門了,一級菜單沒有parentId;
3.爲一級菜單遞歸設置子菜單,同時統計一級菜單所擁有的員工數(含子部門員工);

(3)獲取員工列表:http://192.168.99.131:6001/sys/user/findUserByParm

1.經過部門ID參數查詢所屬部門id集合;2.經過部門Id集合過濾員工;
相關文章
相關標籤/搜索