权限 | 前端控制权限

简介: 啊,我们经常做权限控制,控制菜单,控制按钮功能等,但是在一些特殊情况下不能够由后端来做权限控制,那就只能前端来做啦。

啊,我们经常做权限控制,控制菜单,控制按钮功能等,但是在一些特殊情况下不能够由后端来做权限控制,那就只能前端来做啦。

🤔初步思路

后端来控制权限,是在新增用户的时候来给用户添加不同的菜单或者按钮级别的权限,这些其实也是和前端约定好的数据,保存在数据库里面,那么前端在自己代码保存一份权限文件,通过对不同用户需求进行打包,不就能够生成对应的系统了吗?

🎍环境变量

  • 新建env文件

假如有两个用户权限为AB,那我们就新建两个env文件,分别为.env.A.env.B,分别在其中写入VITE_MODE=AVITE_MODE=B

  • 设置命令

package.json中设置命令,A:vite --mode AB:vite --mode B

  • 运行命令

运行yarn A或者yarn B

  • 获取环境变量

import.meta.env.MODE 即可获取env文件中的MODE参数,也就是环境变量。

🖥️配置文件

  • 新建premissionConfig文件
// 引入路由菜单文件
import { routerMap } from "@/routers/routerMap";

export interface MenuList {
  name: string;
  icon: string;
  to: string;
  value: string;
  id: string;
}

interface Center {
  actionList: string[];
  menuList: MenuList[];
}

interface Station extends Center {}

interface PremissionConfig {
  center: Center;
  station: Station;
}

export const premissionConfig: PremissionConfig = {
  center: {
    actionList: ["get"],
    // 假设有以下几个菜单
    menuList: [
      {name: "A",to: routerMap.A,id: "A"},
      {name: "B",to: routerMap.B,id: "B"},
      {name: "C",to: routerMap.C,id: "C"},
    ],
  },
  station: {
    actionList: ["post", "delete", "put", "download"],
    menuList: [
      {name: "A",to: routerMap.A,id: "A"},
      {name: "B",to: routerMap.B,id: "B"},
      {name: "C",to: routerMap.C,id: "C"},
      {name: "D",to: routerMap.D,id: "D"},
    ],
  },
};
  • 自定义指令,主要是用于控制不同权限的按钮
import { premissionConfig } from "@/utils/premissionConfig";
let usersPermissions: string[] = [];

usersPermissions = premissionConfig[import.meta.env.MODE].actionList;

const permission = {
  mounted(el: any, binding: any, vnode: any) {
    const { value } = binding;
    const exit = usersPermissions.some((v) => {
      return v.indexOf(value) !== -1;
    });
    if (!exit) {
      el.parentNode && el.parentNode.removeChild(el);
    }
  },
};

const directivesList: any = {
  permission, // 挂载
};

const directives = {
  install: function (app: any) {
    Object.keys(directivesList).forEach((key) => {
      app.directive(key, directivesList[key]); // 注册
    });
  },
};
export default directives;
  • 注册指令
import { createApp } from "vue";
import App from "./App.vue";
import directives from "@/directives/permission";
const app = createApp(App);
app.use(Directives)

❓如何使用

  • 菜单
import { premissionConfig, MenuList } from "@/utils/premissionConfig";
const menuList: Ref<MenuList[]> = ref([]);
menuList.value = premissionConfig[import.meta.env.MODE].menuList;
  • 按钮或功能模块(使用v-permission不显示该按钮或功能)
<el-button icon="DeleteFilled" @click="xxx" v-permission="['delete']">删除</el-button>

🏢使用场景

  • 特定情况下,用户权限的服务器不在统一地方,需要分开运行。
  • 同一套代码,针对不同客户交付不同功能,减少重复性新开项目。
相关文章
|
2月前
|
前端开发 安全 API
前端全栈之路Deno篇(三):一次性搞懂和学会用Deno 2.0 的权限系统详解和多种权限配置权限声明方式
本文深入解析了 Deno 2.0 的权限系统,涵盖主包和第三方包的权限控制机制,探讨了通过命令行参数、权限 API 和配置文件等多种权限授予方式,并提供了代码示例和运行指导,帮助开发者有效管理权限,提升应用安全性。
|
4月前
|
前端开发 Java 编译器
【前端学java】类中的访问权限详解,通俗易懂(5)
【8月更文挑战第9天】类中的访问权限详解,通俗易懂(5)
58 0
|
5月前
|
存储 前端开发 JavaScript
前端菜单及按钮权限拦截,实现方案及思路
此实现方案基于vue框架,并需要依赖vue项目相关的库,router、store等等;前端同学要与后端同学协商,常规是让后端返回一个树结构的菜单数据,并且将所有的涉及权限控制的页面path给到后端,如果是按钮,需要把所有的按钮 code 码统一下,这是前期工作,很重要。
|
前端开发 API
【面试题】:前端怎么实现权限设计及遇到的bug
前端怎么实现权限设计及遇到的bug
219 0
|
前端开发
前端项目实战捌拾贰react-admin+material ui-踩坑-List的用法之useListContext获取权限
前端项目实战捌拾贰react-admin+material ui-踩坑-List的用法之useListContext获取权限
65 0
|
前端开发
前端项目实战捌拾壹react-admin+material ui-踩坑-List的用法之usePermissions获取权限
前端项目实战捌拾壹react-admin+material ui-踩坑-List的用法之usePermissions获取权限
73 0
|
存储 前端开发 JavaScript
VUE路由守卫_前端实现权限验证
VUE路由守卫_前端实现权限验证
187 0
|
前端开发
前端学习笔记202304学习笔记第十七天-vue3.0-导航守卫-结合token控制访问权限
前端学习笔记202304学习笔记第十七天-vue3.0-导航守卫-结合token控制访问权限
69 0
|
前端开发
前端学习笔记202304学习笔记第十八天-vue3.0-导航守卫-全局控制路由的访问权限1
前端学习笔记202304学习笔记第十八天-vue3.0-导航守卫-全局控制路由的访问权限1
67 0
|
2月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
185 2