当前位置: 首页 > article >正文

前端权限控制代码

使用场景:

前端页面根据权限码,对页面模块、组件的显示控制。支持场景:

  1. 在js代码里,进行同步、异步权限判断、拦截登操作;
  2. 在templete里通过v-if指令,控制组件、元素的显示;

API说明:

  // 从服务端获取权限数据

  getAuthData:  () => void;

  // 【同步】检查是否具备权限函数

  checkHasAuth: (auth: AuthKey, data?: AuthRecords) => boolean;

  // 【异步】检查是否具备权限函数(会等待权限数据,适合在js同步代码里做权限判断、拦截)

  asyncCheckHasAuth: (auth: AuthKey, data?: AuthRecords) => Promise<boolean>;

  // 【computed函数计算】是否具备权限

  computedHasAuth: ComputedRef<(auth: AuthKey, data?: AuthRecords) => boolean>;

  // 设置权限数据

  setAuthData: (authData: AuthRecords) => void;

  // 清除权限数据

  clearAuthData: () => void;

完整代码:

import { watch, ref, type Ref, type ComputedRef } from "vue";

type AuthRecords = string[] | undefined;
type AuthKey = string | string[];
interface Auth {
  // 从服务端获取权限数据
  getAuthData:  () => void;
  // 【同步】检查是否具备权限函数
  checkHasAuth: (auth: AuthKey, data?: AuthRecords) => boolean;
  // 【异步】检查是否具备权限函数(会等待权限数据,适合在js同步代码里做权限判断、拦截)
  asyncCheckHasAuth: (auth: AuthKey, data?: AuthRecords) => Promise<boolean>;
  // 【computed函数计算】是否具备权限
  computedHasAuth: ComputedRef<(auth: AuthKey, data?: AuthRecords) => boolean>;
  // 设置权限数据
  setAuthData: (authData: AuthRecords) => void;
  // 清除权限数据
  clearAuthData: () => void;
}


function useAuth() {
    // 权限记录表
    const authData: Ref<AuthRecords> = ref<AuthRecords>();

    /**
     * 获取权限数据
     */
    async function getAuthData() {
        // reset data
        setAuthData(undefined);
        
        // TODO
        // const data = await ****
        // authData.value = data;
    }

    /**
     * 同步检查是否具备权限函数
     * @param auth 
     * @returns boolean
    */
    function checkHasAuth(auth: AuthKey, data?: AuthRecords) {
        const authdata = data || authData.value;

        // 权限数据未赋值时,都视为没有权限
        if (authdata === undefined || authData === null) return false;

        if (typeof auth === 'string') return authdata?.includes(auth)
        if (Array.isArray(auth)){
            for(const key of auth) {
                if (!authdata?.includes(key)) return false;
            }
        }
        return true;
    }

    /**
     * 异步检查是否具备权限函数(会等待权限数据,适合在js同步代码里做权限判断、拦截)
     * @param auth 
     * @returns boolean
    */
    function asyncCheckHasAuth(auth: AuthKey, data?: AuthRecords): Promise<boolean> {
        if (authData.value) {
            return Promise.resolve(checkHasAuth(auth, data));
        }

        return new Promise((reslove) => {
            const stopWatch = watch(authData, (value: any) => {
                if (value){
                    reslove(checkHasAuth(auth, data))
                    stopWatch();
                }
            }, {
                immediate: true,
                deep: true
            })
        })
    }

    /**
     * 计算是否具备权限
     * @param auth 
     * @returns 
     */
    const computedHasAuth = computed(() => (auth: AuthKey) => checkHasAuth(auth, authData.value));

    /**
     * 设置同步权限数据
     * @param authData 
     */
    function setAuthData(data: AuthRecords) {
        authData.value = data;
    }

    /**
     * 清除权限数据
     */
    function clearAuthData(){
        authData.value = []
    }

    return {
        checkHasAuth,
        asyncCheckHasAuth,
        computedHasAuth,
        setAuthData,
        clearAuthData,
        getAuthData
    }
}

案例:

在js里同步、异步判断:
....
// 同步判断
const hasAuth = checkHasAuth('string'); 
....


....
// 异步判断
const hasAuth = await asyncCheckHasAuth('string'); 
....
多种权限组合判断:
....
const hasAuth = checkHasAuth(['abc', 'bcd']);
....
在templete里:
<templete>
    ....
    <div v-if="computedHasAuth('string')">
        ........
    </div>
    ....
</templete>


http://www.kler.cn/a/394753.html

相关文章:

  • 从0学习React(11)
  • StarRocks Summit Asia 2024 全部议程公布!
  • uniapp在app模式下组件传值
  • WordPress 6.7 “Rollins”发布
  • Diffusion Policy——斯坦福机器人UMI所用的扩散策略:从原理到其编码实现(含Diff-Control、ControlNet详解)
  • 代码随想录第二十一天| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
  • 计算机毕业设计 | SpringBoot社区物业管理系统 小区管理(附源码)
  • 14.最长公共前缀-力扣(LeetCode)
  • CSS:怎么把网站都变成灰色
  • uniapp解析蓝牙设备响应数据bug
  • 3588 yolov8 onnx 量化转 rknn 并运行
  • spark的学习-06
  • k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储
  • leveldb存储token的简单实现
  • 数据结构-布隆过滤器和可逆布隆过滤器
  • vue中 通过cropperjs 实现图片裁剪
  • 开源项目低代码表单设计器FcDesigner扩展右侧组件的配置规则
  • Spring Cloud Gateway(分发请求)
  • 边缘提取函数 [OPENCV--2]
  • 数据结构的时间复杂度和空间复杂度
  • 推荐一款CFD/CAE可视化分析软件:Tecplot 360 EX
  • Unity 中使用 C# 对 Vector2 向量朝向进行顺时针排序及复杂排序场景处理
  • Leetcode 存在重复元素II
  • 深入探索:Scrapy深度爬取策略与实践
  • Linux(文件特殊属性 + FACL 图片+大白话)
  • 机器学习基础04