后台管理系统的权限(vue如何实现后台管理系统的权限,react如何实现后台管理系统的权限)

news2024/9/25 11:56:58

一、权限的解释

一般来说,在后台管理系统里肯定会使用到权限,权限一般分为功能级权限和数据级权限

1、功能级权限

1)、页面级权限(菜单):

不同的用户(角色)登录到管理系统后,看到的功能(页面)不一样。

思路:

1.1)、添加操作人员时:

超级管理,在添加操作人员时,需要给该人员分配权限(当然,后期也可以修改权限)。这个权限会发给后端。由后端保存。

1.2)、登录时:

前端进入登录页面,------》前端发送请求给后端------》后端验证用户名和密码是否正确----》如果验证通过,需要根据用户所属的角色查询查他对应功能----》响应给前端----》前端接收到后端响应的权限----》把权限循环显示在菜单区域(同时还需要处理路由配置)

1)、显示对应的菜单

2)、做对应的路由配置

2)、数据操作级的权限:

不同的用户进入同一个页面,对数据的操作权限不一样,即:有的用户进去后,只能查询数据,有的用户可以对数据进行添加,修改,删除。

如:个人(员工)信息页面,员工进去只能做修改,不能做删除添加的功能。

不同的用户进入到同样的功能,看到的数据不一样。数据级权限一般都是跟前端没有关系,是由后端处理。

2、数据查看权限:(这个是后端处理,前端啥也不做)

不同的用户进入同一个页面,看到数据不同。如:人事管理系统的考勤。人事小姐姐能够看到所有人的考勤信息,而其它员工只能看到自己的信息。

补充:

纠正大家的误区:

1、(超级)管理员具有项目功能的所有权限? 答:不对。

管理员不做业务,所以,没有业务权限。

一般来说,管理员做的事情:操作员(员工)信息的维护(开账号),权限,角色,部门的分配。

2、 领导具有项目功能的所有权限?答:不会的。

一般来说,领导具有查询,统计的功能。

3、不要认为,一个后台管理系统只有管理员和超级管理员。

4、补充:

不同的系统,有不同的角色(其实就是甲方公司的职位),如:HIS(医院信息管理系统)的角色有:院长,主任,医生,护士,药剂师等等,这些人属于不同的岗位,那么,也就具备不同的功能。

二、react实现权限的思路和代码:

1、添加操作人员的界面_同时设置权限

1)、界面

 

 

2)、添加时,给后端保存的数据(这个数据格式,每个项目可以按照实际情况进行定义)

 

2、登录 

登录成功时,可以把后端发回来的权限数据保存到sessionStorage中。如:

3、跳转到后台管理系统的主页面 

1)、处理(动态的)菜单

1.1)、思路:

定义一个完整菜单的数据,然后,根据后端返回回来的权限(checkedkeys),进行过滤。

// 一、定义所有的菜单数据

const allMenus: any[] = [
  {
    id: "0-0",
    key: "/Admin/Home",
    label: "首页",
  },
  {
    id: "0-1",
    key: "0-1",
    label: "系统管理",
    children: [
      {
        id: "0-1-0",
        key: "/Admin/Dept",
        label: "部门管理",
      },
      {
        id: "0-1-1",
        key: "/Admin/User",
        label: "用户管理",
      },
      {
        id: "0-1-2",
        key: "/Admin/Role",
        label: "角色管理",
      },
    ],
  },
  {
    id: "0-2",
    key: "0-2",
    label: "业务管理",
    children: [
      {
        id: "0-2-0",
        key: "/Admin/YuYue",
        label: "预约管理",
      },
      {
        id: "0-2-1",
        key: "/Admin/HuanZhe",
        label: "患者管理",
      },
      {
        id: "0-2-2",
        key: "/Admin/YuYue",
        label: "医护管理",
      },
    ],
  },
];

// 二、根据当前用户的权限,得到当前用户的菜单数据

export const getCurrentMenus = () => {
  console.log("getCurrentMenus");
  
  //1、获取当前用户的权限:checkedKeys。
  const checkedKeys = JSON.parse(  sessionStorage.getItem("checkedKeys") as string );
  if(!checkedKeys){
    return [];
  }
  // ["0-1-0","0-2-1","0-1-2"]

  //2、循环所有菜单数据,过滤出当前用户的菜单数据。

  const currMenus: any[] = [];//这个保存最终结果(当前用户的菜单数据)

  // 2.1)、循环父级
  allMenus.forEach((item) => {
    if(checkedKeys.includes(item.id)){
      //1)、添加父级
      const newParentItem = {...item};
      currMenus.push(newParentItem);

      // 2.2)、循环子级
      if(item.children){
        // 给父级添加children;
        newParentItem.children = [];
        // 循环子级
        item.children.forEach((sonItem:any)=>{
            if(checkedKeys.includes(sonItem.id)){   
              //把子级添加到父级的children。  
              newParentItem.children.push({...sonItem});
            }
        })
      }
    }
  });

  console.log("currMenus", currMenus);

  return currMenus;
};

export function getIdByKey(currentMenus:any[],key: string) {
  //  /Admin/Dept"

  let result = "";

  currentMenus.forEach((item) => {
    if (item.key === key) {
      result = item.id;
    }
    if (item.children) {
      item.children.forEach((sonItem: any) => {
        if (sonItem.key === key) {
          result = sonItem.id;
        }
      });
    }
  });
  return result;
}

// 返回值:"1000" 表示 只有C的权限。如:"1010 表示有 C和U的权限。
export function getCRUD(id: string) {
  let checkedKeys = JSON.parse(sessionStorage.getItem("checkedKeys") as string);

  let arr = checkedKeys.filter((item: any) => item.startsWith(id + "-")); //["0-1-0-C"]

  let str = "";

  if (arr.some((item: any) => item.endsWith("C"))) {
    str += "1";
  } else {
    str += "0";
  }
  if (arr.some((item: any) => item.endsWith("R"))) {
    str += "1";
  } else {
    str += "0";
  }
  if (arr.some((item: any) => item.endsWith("U"))) {
    str += "1";
  } else {
    str += "0";
  }
  if (arr.some((item: any) => item.endsWith("D"))) {
    str += "1";
  } else {
    str += "0";
  }

  return str;
}
1.2)、显示动态菜单。

每个人可以根据自己使用的UI组件库。把上面的“getCurrentMenus ”函数的返回数据进行渲染。

2)、处理(动态)路由配置

2.1)、思路

思路和菜单差不多。定义所有的路由配置数组。根据后端返回来的checkedkeys,进行过滤。



import Home from '../views/Admin/Home';
import Dept from '../views/Admin/Dept';
import User from '../views/Admin/User';
import Role from '../views/Admin/Role';
import NotFound from '../views/Admin/NotFound';


// 所有路由配置的数组

const allRoutes:any[] = [
    {
        "key":"0-0",
        path:'/Admin/Home',
        component:Home
    },
    {
        "key":"0-1-0",
        path:'/Admin/Dept',
        component:Dept
    },
    {
        "key":"0-1-1",
        path:'/Admin/User',
        component:User
    },
    {
        "key":"0-1-2",
        path:'/Admin/Role',
        component:Role
    }
]


// 定义一个当前用户的路由配置

export const gettCurrentRoutes=()=>{

    // 1、获取当前用户的权限
    const checkedKeys = JSON.parse(sessionStorage.getItem("checkedKeys") as string);

    // 2、根据当前用户的权限得到当前用户的路由配置。
    const currentRoutes:any[]=[];
    allRoutes.forEach(item=>{
        if(checkedKeys.includes(item.key)){
            currentRoutes.push({...item});
        }
    })

    console.log("currentRoutes",currentRoutes);

    currentRoutes.push({
        component:NotFound
    });
    
    return currentRoutes;
}
2.2)、界面

每个人根据自己使用的路由版本。把上述代码中 “gettCurrentRoutes” 函数的返回值进行渲染。

3)、CRUD的权限。

CRUD的权限思路:根据后端返回的权限数据(如,这种用CRUD字母标识:"0-1-0-R", "0-1-0-U", "0-1-0-D"),通过路由传参,在组件里,显示或者隐藏对应的按钮即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql load data infile 报错 1290 处理方法

mysql load data infile 命令导入数据报错"16:06:13 load data infile “/var/lib/mysql/test/employee.csv” into table emp fields terminated by ‘,’ ignore 1 lines Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cann…

Linux应用层开发--多线程进程编程

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、linux开发的方向二、Linux环境特点介绍Linux环境基本构成 三、进程与线程1、进程的概念2、进程的状态3、线程的概念4、线…

leetcode 559. N 叉树的最大深度

2023.7.2 这道题还是使用层序遍历&#xff0c;在N叉树的层序遍历的基础上增加一个求深度的操作即可。下面上代码&#xff1a; class Solution { public:int maxDepth(Node* root) {int depth 0;queue<Node*> que;if(root nullptr) return 0;que.push(root);while(!que…

json 压缩算法详解

概要 无论使用何种编程语言&#xff0c;json格式的数据已被广泛应用&#xff0c;不论是数据的传输还是存储&#xff0c;在很多应用场景下&#xff0c;你可能想进一步地压缩JSON字符串的长度&#xff0c;以提升传输效率&#xff0c;如果你使用的是nosql数据库&#xff0c;你可能…

2012年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题——纯享题目版

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

记一次tomcat版本升级导致的现网问题

前言 最近公司项目做安全漏洞审查&#xff0c;把一批服务的fastjson,tomcat,log4j版本做升级&#xff0c;那天上线了50个服务&#xff0c;所有服务上线之后&#xff0c;现网有客服反馈录音笔下单异常。查询了现网日志&#xff0c;发现适配服务有异常信息&#xff0c;报错信息如…

闲人闲谈PS之四十二——顾问的“禁忌之地”—制造能力计划

惯例闲话&#xff1a;上个月有幸成为乐老师乐谈IT系列培训课程的讲师&#xff0c;分享主题是&#xff0c;PS在装备制造和工程行业的应用。虽然培训规模不是很大&#xff0c;但是闲人很有信心&#xff0c;至少在小范围之内&#xff0c;参与培训的听友人来说&#xff0c;PS一直以…

什么条件下会出现死锁,如何避免?

文章目录 一、什么是死锁二、产生死锁的原因&#xff1a;三、如何避免死锁&#xff1a; 一、什么是死锁 死锁&#xff0c;简单来说就是两个或者两个以上的线程在执行过程中&#xff0c;去争夺同一个共享资源导致相互等待的现象。如果没有外部干预&#xff0c;线程会一直处于阻塞…

图像的算术操作

1.图像的加法 用途&#xff1a;图像的合成 Rain图片View图片 合成代码&#xff1a; import numpy as np import cv2 as cv import matplotlib.pyplot as pltrain cv.imread(rain.png) plt.imshow(rain[:, :, ::-1]) plt.show()view cv.imread(view.png) plt.imshow(view…

773. 滑动谜题

链接&#xff1a;773. 滑动谜题 题解&#xff1a;https://blog.csdn.net/INGNIGHT/article/details/131350054 滑动拼图 II class Solution { public:int slidingPuzzle(vector<vector<int>>& board) {// 异常判断if (board.size() < 0 || board[0].size…

怎么管理好一个团队?

一个成功的企业需要一个高效、有能力、积极的团队来支持其业务运营。管理一个团队需要领导者具备一定的技能和知识&#xff0c;怎么管理好一个团队对于许多企业领导者而言也是一项不小的挑战。对此&#xff0c;我想首先推荐一本非常优秀的团队书籍——《经理人参阅&#xff1a;…

js vuejs dagre-d3绘制流程图实用指南 有向图可视化

写在前面 之前有小伙伴问我如何使用 D3 在前端绘制流程图,今天在这里给安排上,与大家分享。 明确一点,只要你的数据计算能力足够强,使用原生D3绘制流程图绝对可以的,但是,为了让大家更容易上手,避免重复造轮子,给大家推荐一个专门绘制流程图的 D3 插件 dagre-d3。 首…

idea tomcat js 汉字乱码

Run/Debug Configuiations->VM options:-Dfile.encodingUTF-8

服务 第七章

目录 1.tomcat 核心组件 2.处理请求&#xff0c;内部数据流向 3.请求处理过程 4.主要目录说明 5.tomcat 优化 6.总结 1.tomcat 核心组件 2.处理请求&#xff0c;内部数据流向 3.请求处理过程 4.主要目录说明 5.tomcat 优化 6.总结 tomcat 属于轻量级应用服务器&#xf…

基于Tars高并发IM系统的设计与实现-基础篇1

基于Tars高并发IM系统的设计与实现–基础篇1 作者简介 兰怀玉 毕业于中央民族大学计算机专业 先后供职国内外多家公司软件研发设计岗位&#xff0c;有丰富的软件研发经验。 从事IM领域设计研发十余年&#xff0c;先后领衔多个IM通讯系统设计与研发发&#xff0c;拥有丰富的IM…

裂墙推荐!阿里大牛新产Java面试速成指南,主打就是躺着拿Ofeer

很多粉丝后台留言&#xff0c;Java程序员面临的竞争太激烈了…… 我自己也有实感&#xff0c;多年身处一线互联网公司&#xff0c;虽没有直面过求职跳槽的残酷&#xff0c;但经常担任技术面试考官&#xff0c;对程序员招聘市场的现状很清楚。导致现在激烈竞争的原因不外乎三方面…

移动端数据可视化设计

在做APP设计的时候&#xff0c;难免会遇到一些需要展示数据的场景。使用传统的表格和文档展示数据不仅难看&#xff0c;也影响用户理解数据的含义。而数据可视化设计能将数据以更加直观的方式展现出来&#xff0c;使数据更加客观、更有说服力。 在移动应用中&#xff0c;数据可…

uview-plus上传图片,upload组件带参数上传

一、引入uview-plus 请自行在项目中引入uview-plus组件库&#xff0c;此处不多赘述 二、使用 html 部分&#xff0c;上传组件的样式自己去定义&#xff0c;不多赘述 <u-upload:fileList"fileList" // 文列列表afterRead"afterRead" // 读取后的…

03双向链表

双向链表 单向链表的缺点 单向链表&#xff0c;只能是一个方向来查找&#xff0c;而双向链表可以向前或者向后查找。单向链表不能自我删除&#xff0c;需要靠辅助结点。而双向链表可以自我删除。所以我们单链表删除结点的时候&#xff0c;总要找到temp&#xff08;待删除结点…

python+requests库使用时报错:ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1131)

本人测试小白~第一次用pythonunittestrequest做接口测试的学习时&#xff0c;一直报这个ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1131) 反复检查代码也没有发现什么问题&#xff0c;然后在网上找了很多方法&#xff0c;最终解决这个问题的方法…