国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

vue權(quán)限管理系統(tǒng)

bovenson / 1108人閱讀

摘要:權(quán)限系統(tǒng)后臺(tái)管理系統(tǒng)一般都會(huì)有權(quán)限模塊,用來(lái)控制用戶(hù)能訪(fǎng)問(wèn)哪些頁(yè)面和哪些數(shù)據(jù)接口。大多數(shù)管理系統(tǒng)的頁(yè)面都長(zhǎng)這樣。表為角色權(quán)限關(guān)聯(lián)表,一個(gè)角色擁有哪些權(quán)限是通過(guò)這張表查出來(lái)的。這樣就是一個(gè)賬號(hào)角色權(quán)限的關(guān)系。

vue權(quán)限系統(tǒng)

后臺(tái)管理系統(tǒng)一般都會(huì)有權(quán)限模塊,用來(lái)控制用戶(hù)能訪(fǎng)問(wèn)哪些頁(yè)面和哪些數(shù)據(jù)接口。大多數(shù)管理系統(tǒng)的頁(yè)面都長(zhǎng)這樣。

左邊為菜單,分為兩級(jí),右邊為圖表顯示區(qū)域,有增刪改查的按鈕。

表的結(jié)構(gòu)
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_auth_rule
-- ----------------------------
DROP TABLE IF EXISTS `t_auth_rule`;
CREATE TABLE `t_auth_rule` (
  `id_pk` bigint(20) NOT NULL AUTO_INCREMENT,
  `auth_id` varchar(128) NOT NULL COMMENT "權(quán)限Id",
  `pauth_id` varchar(128) DEFAULT NULL COMMENT "父級(jí)Id",
  `auth_name` varchar(255) NOT NULL COMMENT "權(quán)限名稱(chēng)",
  `auth_icon` varchar(255) NOT NULL COMMENT "權(quán)限圖標(biāo)",
  `auth_type` smallint(6) NOT NULL COMMENT "權(quán)限類(lèi)型,BIT表示其屬性
            0x00表示可顯示的菜單權(quán)限節(jié)點(diǎn);
            0x01表示普通節(jié)點(diǎn)",
  `auth_condition` text COMMENT "條件",
  `remark` varchar(255) DEFAULT NULL COMMENT "備注",
  `is_menu` smallint(255) DEFAULT "0" COMMENT "是否為菜單,0表示非,1表示是",
  `weight` int(11) NOT NULL DEFAULT "0" COMMENT "權(quán)重",
  `rule` varchar(256) DEFAULT NULL COMMENT "規(guī)則路徑主要對(duì)應(yīng)菜單或方法的路徑名稱(chēng)",
  `cr_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "創(chuàng)建時(shí)間",
  `up_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "更新時(shí)間",
  PRIMARY KEY (`id_pk`),
  UNIQUE KEY `AK_auth_id` (`auth_id`)
) ENGINE=InnoDB AUTO_INCREMENT=264 DEFAULT CHARSET=utf8 COMMENT="權(quán)限規(guī)則表,記錄權(quán)限相關(guān)的信息,權(quán)限以父子關(guān)系存在,菜單是權(quán)限的一種。";

SET FOREIGN_KEY_CHECKS = 1;


SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_role_auth
-- ----------------------------
DROP TABLE IF EXISTS `t_role_auth`;
CREATE TABLE `t_role_auth` (
  `id_pk` bigint(20) NOT NULL AUTO_INCREMENT,
  `role_id_fk` varchar(32) DEFAULT NULL COMMENT "角色id",
  `auth_id_fk` varchar(128) DEFAULT NULL COMMENT "權(quán)限id",
  `aa` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id_pk`)
) ENGINE=InnoDB AUTO_INCREMENT=77 DEFAULT CHARSET=utf8 COMMENT="角色與權(quán)限的關(guān)系表";

SET FOREIGN_KEY_CHECKS = 1;

稍微解釋一下表結(jié)構(gòu),t_auth_rule 表用來(lái)存儲(chǔ)對(duì)應(yīng)的權(quán)限菜單,一般來(lái)說(shuō),菜單分為一級(jí)和二級(jí)菜單,rule字段對(duì)應(yīng)前端的路由規(guī)則;而按鈕為第三級(jí),rule對(duì)應(yīng)的是接口url地址。
t_role_auth 表為角色權(quán)限關(guān)聯(lián)表,一個(gè)角色擁有哪些權(quán)限是通過(guò)這張表查出來(lái)的。當(dāng)然還有一個(gè)role表,還有一個(gè)賬號(hào)表,賬號(hào)表里有一個(gè)role的外鍵。
這樣就是一個(gè)賬號(hào) --> 角色 --> 權(quán)限的關(guān)系。

對(duì)于菜單的權(quán)限,通過(guò)路由表匹配
// 本地寫(xiě)好路由列表(需要進(jìn)行動(dòng)態(tài)匹配的)
export const routerList: Array = [
  // 首頁(yè)
  {
    path: "/",
    name: "_home",
    redirect: "/home",
    component: Layout,
    meta: {
      hideInMenu: true,
      notCache: true
    },
    children: [
      {
        path: "home",
        name: "home",
        meta: {
          hideInMenu: true,
          title: "首頁(yè)",
          notCache: true,
          icon: "md-home"
        },
        component: () => import("@/views/overview-operations/data-center/DataCenter.vue")
      }
    ]
  }
]

// 負(fù)責(zé)將后臺(tái)返回的 菜單列表 轉(zhuǎn)成vue-router所需要的 router list
export function toRouterComponent(menuList: Array) {
  if (!menuList.length) return []

  let routerArr = [];
  for (let j = 0; j < menuList.length; j++) {
    let obj;
    let firstIndex = routerList.findIndex(i => i.path === menuList[j].url); // 一級(jí)菜單
    if (firstIndex !== -1) {
      let children: Array = []
      obj = {
        path: routerList[firstIndex].path,
        component: routerList[firstIndex].component,
        redirect: routerList[firstIndex].redirect,
        name: routerList[firstIndex].name,
        meta: routerList[firstIndex].meta,
        children
      };

      // 如果有子菜單
      if (menuList[j].children && menuList[j].children.length) {
        for (let k = 0; k < menuList[j].children.length; k++) {
          const _children = routerList[firstIndex].children!
          let secondIndex = _children.findIndex(i => {
            let fullpath = "";
            if (routerList[firstIndex].path === "/") {
              fullpath = `${routerList[firstIndex].path}${i.path}`;
            } else {
              fullpath = `${routerList[firstIndex].path}/${i.path}`;
            }
            return fullpath === menuList[j].children[k].url;
          });
          if (secondIndex !== -1) {
            obj.children.push(_children[secondIndex]);
          }
        }
      }
    }

    if (obj) {
      routerArr.push(obj);
    }
  }

  return routerArr;
}

// 根據(jù)菜單權(quán)限,獲取路由數(shù)組
// 本地只保存后臺(tái)返回的菜單,在頁(yè)面刷新的時(shí)候從本地拿到菜單重新調(diào)用toRouterComponent生成 路由數(shù)組
export function getRouterList() {
  if (!storage.get("username")) {
    storage.set("menuTree", ""); // 清空菜單權(quán)限數(shù)據(jù)
  }
  let menuList = storage.get("menuTree") ? storage.get("menuTree") : [];

  const routerArr = toRouterComponent(menuList);
  return routerArr;
}

menuList,菜單數(shù)組(或?qū)ο螅? 由后臺(tái)返回; routerList為前端定義的路由表;遍歷routerList,如果routerList的path在menuMap里能找到的話(huà),就表示該路由存在。最后生成一個(gè)過(guò)濾后的路由表,用vue提供的addRoutes方法動(dòng)態(tài)添加到路由中,并把過(guò)濾后的路由表存到本地。

在頁(yè)面刷新的時(shí)候,從本地獲取路由表,添加到路由表中,代碼如下,constRouterArr為基礎(chǔ)路由表,比如登錄,404等

注意這一步有個(gè)問(wèn)題,由于我寫(xiě)的storage庫(kù)用了JSON.stringify,把路由表中的component(實(shí)際為一個(gè)函數(shù))丟失了,所以在從本地獲取路由的時(shí)候,還要重新生成一個(gè)新的路由表,重新把component加上去,即把上面的addrouters重新執(zhí)行一遍

對(duì)于按鈕的權(quán)限
if (res.data.auth_rule_map) {
    let obj = {}
    Object.keys(res.data.auth_rule_map).forEach(i => {
      // 將所有的按鈕放到一個(gè)obj里 key 為接口地址  
      if (res.data.auth_rule_map[i].is_menu === 0) {  // 如果是按鈕
        obj[res.data.auth_rule_map[i].rule] = 1
      }             
    })
    storage.set("btnList", obj);
    storage.set("menuTree", res.data.auth_rule_map);
}

auth_rule_map為接口返回權(quán)限map,把按鈕的權(quán)限過(guò)濾出來(lái)存到本地
將map添加到每個(gè)路由組件的data里,(這里有一個(gè)問(wèn)題,怎么判斷一個(gè)組件是否是路由組件),目前想到的是通過(guò)組件name來(lái)判斷,把所有的路由組件放到一個(gè)數(shù)組里做判斷。

在組件內(nèi)部的按鈕上加上v-if,如果this.uri__里的uri在uriMap里存在就顯示。
也可以通過(guò)方法來(lái)判斷,如下面的__isBtnShow,不僅可以控制按鈕的顯示隱藏,還可以控制其樣式,比如顏色等,更加靈活,推薦使用方法來(lái)控制

uri = {
    ADD_MEMBER: "/api/add_member"
}

export default function install (Vue) {
  const uriMap = storage.get("btnList")
  //uriMap["/admin/api/auth_rule/update_auth_rule.action"] = 1
  Vue.mixin({
    created() {
      const arr = ["MemberManage", "PayManage", "..."]
      if (arr.indexOf(this.$options.name) !== -1) {
        this.dataUri__ = uriMap
        this.uri__ = uri  
      }
    },
    data() {
      return {
        dataUri__: {}
      }
    },
    methods: {
      __isBtnShow(uri) {
        return uriMap[uri] ? "display: inline-block" : "display: none"
      },
    }
  })
}



// 通過(guò)方法來(lái)控制,更加靈活
登出的問(wèn)題

**登出后要清空緩存,routerArr,btnList 等。
由于之前登錄,調(diào)用addRouter把權(quán)限上個(gè)賬號(hào)的路由表加進(jìn)去了,所以登出后要location.reload()一次,重新實(shí)例化路由表,去掉動(dòng)態(tài)添加的路由,只保留基礎(chǔ)路由。
location.reload()體驗(yàn)不是太好,但是vue-router沒(méi)有提供動(dòng)態(tài)刪除路由的api,比如 deleteRouter。**

同時(shí)登兩個(gè)賬號(hào),導(dǎo)致刷新頁(yè)面的時(shí)候,前者頁(yè)面的本地緩存被覆蓋,權(quán)限菜單等數(shù)據(jù)發(fā)生變化,路由表也發(fā)生變化

能想到的解決方法是存一個(gè)loginIndex 來(lái)表示登錄賬號(hào)的個(gè)數(shù),比如第一次登錄的時(shí)候存一個(gè)loginIndex=0, 后面存數(shù)據(jù)的時(shí)候都把這個(gè)參數(shù)帶上;后面登多個(gè)賬號(hào)的時(shí)候個(gè)loginIndex++,這樣localStorage的key就是一個(gè)動(dòng)態(tài)的(這樣還是不行)
最簡(jiǎn)單的方法是存到localStorage里,只有登出才會(huì)清空緩存,只能登一個(gè)賬號(hào)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/101115.html

相關(guān)文章

  • vue中如何實(shí)現(xiàn)后臺(tái)管理系統(tǒng)權(quán)限控制

    摘要:二接口訪(fǎng)問(wèn)的權(quán)限控制接口權(quán)限就是對(duì)用戶(hù)的校驗(yàn)。代碼如下按扭權(quán)限指令至此為止,權(quán)限控制流程就已經(jīng)完全結(jié)束了,在最后我們?cè)倏匆幌峦暾臋?quán)限控制流程圖吧五路由控制完整流程圖六參考文獻(xiàn)手?jǐn)]后臺(tái)管理網(wǎng)站之權(quán)限控制手摸手,帶你用擼后臺(tái)之權(quán)限控制 原文首發(fā)于我的博客,歡迎點(diǎn)擊查看獲得更好的閱讀體驗(yàn)~ 一、前言 在廣告機(jī)項(xiàng)目中,角色的權(quán)限管理是卡了挺久的一個(gè)難點(diǎn)。首先我們確定的權(quán)限控制分為兩大部分,其...

    songze 評(píng)論0 收藏0
  • vue中如何實(shí)現(xiàn)后臺(tái)管理系統(tǒng)權(quán)限控制

    摘要:二接口訪(fǎng)問(wèn)的權(quán)限控制接口權(quán)限就是對(duì)用戶(hù)的校驗(yàn)。代碼如下按扭權(quán)限指令至此為止,權(quán)限控制流程就已經(jīng)完全結(jié)束了,在最后我們?cè)倏匆幌峦暾臋?quán)限控制流程圖吧五路由控制完整流程圖六參考文獻(xiàn)手?jǐn)]后臺(tái)管理網(wǎng)站之權(quán)限控制手摸手,帶你用擼后臺(tái)之權(quán)限控制 原文首發(fā)于我的博客,歡迎點(diǎn)擊查看獲得更好的閱讀體驗(yàn)~ 一、前言 在廣告機(jī)項(xiàng)目中,角色的權(quán)限管理是卡了挺久的一個(gè)難點(diǎn)。首先我們確定的權(quán)限控制分為兩大部分,其...

    iliyaku 評(píng)論0 收藏0
  • vue中如何實(shí)現(xiàn)后臺(tái)管理系統(tǒng)權(quán)限控制

    摘要:二接口訪(fǎng)問(wèn)的權(quán)限控制接口權(quán)限就是對(duì)用戶(hù)的校驗(yàn)。代碼如下按扭權(quán)限指令至此為止,權(quán)限控制流程就已經(jīng)完全結(jié)束了,在最后我們?cè)倏匆幌峦暾臋?quán)限控制流程圖吧五路由控制完整流程圖六參考文獻(xiàn)手?jǐn)]后臺(tái)管理網(wǎng)站之權(quán)限控制手摸手,帶你用擼后臺(tái)之權(quán)限控制 原文首發(fā)于我的博客,歡迎點(diǎn)擊查看獲得更好的閱讀體驗(yàn)~ 一、前言 在廣告機(jī)項(xiàng)目中,角色的權(quán)限管理是卡了挺久的一個(gè)難點(diǎn)。首先我們確定的權(quán)限控制分為兩大部分,其...

    VincentFF 評(píng)論0 收藏0
  • Vue項(xiàng)目實(shí)現(xiàn)簡(jiǎn)單的權(quán)限控制

    摘要:路由不可見(jiàn)實(shí)現(xiàn)方法在中的字段中加入該路由的訪(fǎng)問(wèn)權(quán)限列表字段。元素不可見(jiàn)實(shí)現(xiàn)方法因?yàn)槟承╉?yè)面中會(huì)有一些特殊的接口調(diào)用或數(shù)據(jù)展示受到權(quán)限控制顯示。 在Vue項(xiàng)目中實(shí)現(xiàn)權(quán)限控制管理 對(duì)于一般稍大一些的后臺(tái)管理系統(tǒng),往往有很多個(gè)人員需要使用,而不同的人員也對(duì)應(yīng)了不同的權(quán)限系統(tǒng),后端的權(quán)限校驗(yàn)保障了系統(tǒng)的安全性,而前端的權(quán)限校驗(yàn)則提供了優(yōu)秀的交互體驗(yàn)。 校驗(yàn)方式 前端對(duì)用戶(hù)的權(quán)限信息進(jìn)行校驗(yàn)往往...

    fou7 評(píng)論0 收藏0
  • Vue項(xiàng)目實(shí)現(xiàn)簡(jiǎn)單的權(quán)限控制

    摘要:路由不可見(jiàn)實(shí)現(xiàn)方法在中的字段中加入該路由的訪(fǎng)問(wèn)權(quán)限列表字段。元素不可見(jiàn)實(shí)現(xiàn)方法因?yàn)槟承╉?yè)面中會(huì)有一些特殊的接口調(diào)用或數(shù)據(jù)展示受到權(quán)限控制顯示。 在Vue項(xiàng)目中實(shí)現(xiàn)權(quán)限控制管理 對(duì)于一般稍大一些的后臺(tái)管理系統(tǒng),往往有很多個(gè)人員需要使用,而不同的人員也對(duì)應(yīng)了不同的權(quán)限系統(tǒng),后端的權(quán)限校驗(yàn)保障了系統(tǒng)的安全性,而前端的權(quán)限校驗(yàn)則提供了優(yōu)秀的交互體驗(yàn)。 校驗(yàn)方式 前端對(duì)用戶(hù)的權(quán)限信息進(jìn)行校驗(yàn)往往...

    chaosx110 評(píng)論0 收藏0
  • sSpring Boot多模塊+ Shiro + Vue:前后端分離登陸整合,權(quán)限認(rèn)證(一)

    摘要:前言本文主要使用來(lái)實(shí)現(xiàn)前后端分離的認(rèn)證登陸和權(quán)限管理,適合和我一樣剛開(kāi)始接觸前后端完全分離項(xiàng)目的同學(xué),但是你必須自己搭建過(guò)前端項(xiàng)目和后端項(xiàng)目,本文主要是介紹他們之間的互通,如果不知道這么搭建前端項(xiàng)目的同學(xué)可以先找別的看一下。 前言 本文主要使用spring boot + shiro + vue來(lái)實(shí)現(xiàn)前后端分離的認(rèn)證登陸和權(quán)限管理,適合和我一樣剛開(kāi)始接觸前后端完全分離項(xiàng)目的同學(xué),但是你必...

    macg0406 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<