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

路由上传一个ui_control参数(uint32类型)控制页面UI显隐

前言:传一个uint32类型的值,通过 按位或操作符(|)来设置ui_control的值,通过按位与操作符(&)来检测是否显示或隐藏

简单介绍一下两个概念:

按位与操作符和按位或操作符都是二进制位运算符。

  1. 按位与操作符(&):对于每一个二进制位,只有当两个操作数的对应位都为1时,结果的对应位才为1,否则为0。例如,5(二进制101) & 3(二进制011)的结果是1(二进制001)。

  2. 按位或操作符(|):对于每一个二进制位,只要两个操作数的对应位有一个为1时,结果的对应位就为1,否则为0。例如,5(二进制101) | 3(二进制011)的结果是7(二进制111)。

这两种操作符在计算机编程中常用于位操作,如设置位标志、清除位标志、切换位标志等。

一、demo1:路由传一个ui_control,用高16位设置允许修改,修改位用第17位检测

var ui_control = 0;
ui_control = (ui_control | (1 << 17));
console.log(ui_control) // 131072

这时候ui_control参数传131072,在页面中做检测看是否允许修改

var uiControl = Number(new URLSearchParams(location.search).get('uiControl'))
if ((control & (1 << 17)) !== 0) {console.log("1 表示允许修改");
} else {console.log("0 表示不允许修改");
}

二、demo2:路由传一个ui_control,同时控制修改和导出权限,修改位用第17位检测,导出位用第16位检测

既允许修改也允许导出

var ui_control = 0;
ui_control = (ui_control | (1 << 17));
ui_control = (ui_control | (1 << 16));console.log(ui_control) // 196608

这时候ui_control参数传196608,通过与运算检测第16位导出是否为1,第17位修改是否为1,就能知道是否有对应权限了

咱们封装一个方法出来

// keys 传一个检测权限的key,比如下面Edit编辑,Export导出
const getUiControlBinaryContent = (keys) => {var uicontrol = Number(new URLSearchParams(location.search).get('uiControl'))let uint32 = new Uint32Array(1);uint32[0] = uicontrol;const action = new Map<string, any>([['Edit', checkUnitBuffer(uint32[0], 17)], // 第17位['Export', checkUnitBuffer(uint32[0], 16)], // 第16位]);return keys ? action.get(keys) : 0;
};// 与或位控制
const checkUnitBuffer = (control: number, idx: number) => {if (!idx) return 0; if ((control & (1 << idx)) !== 0) {return 1; // 表示有该操作权限} else {return 0; // 表示没有该操作权限}
};

这样的话在这些操作的地方就直接能调用getUiControlBinaryContent方法传对应key值就可以知道是否有权限了

上面的demo1和demo2是高16位的检测,接下来我们简单说一下低16位的检测

三、举个例子:低0,1,2,3,4位控制,高16,17位控制总结

1、设置ui_control:我这里用简单的html元素来展示,你们按照自己的库来做就行,最终的UI_Control就是路由上要传的参数

/*** unit32 生成 ui_control*  ● 是否修改:ui_control & (1 << 17)● 是否导出:ui_control & (1 << 16)● 是否显示思维导图:ui_control & (1 << 4)● 是否显示原文:ui_control & (1 << 3)● 是否显示章节概率:ui_control & (1 << 2)● 是否显示全文总结:ui_control & (1 << 1)● 是否显示视频:ui_control & 1*/
function onCreateUiControl() {var ui_control = 0;const Edit = document.getElementById("Edit");const Export1 = document.getElementById("Export");const VideoPre = document.getElementById("VideoPre");const MindMap = document.getElementById("MindMap");const AllText = document.getElementById("AllText");const ChapterOverviewt = document.getElementById("ChapterOverviewt");const FullTextSummary = document.getElementById("FullTextSummary");if (Edit.checked) ui_control = (ui_control | (1 << 17));if (Export1.checked) ui_control = (ui_control | (1 << 16));if (VideoPre.checked) ui_control = (ui_control | 1);if (MindMap.checked) ui_control = (ui_control | (1 << 4));if (AllText.checked) ui_control = (ui_control | (1 << 3));if (ChapterOverviewt.checked) ui_control = (ui_control | (1 << 2));if (FullTextSummary.checked) ui_control = (ui_control | (1 << 1));document.getElementById("ui_control").value = ui_control;// TODO 这个最终的ui_control就是你设置的上面某些功能的权限了console.log("ui_control", ui_control);
}

2、检测ui_control权限:调用getUiControlBinaryContent(key)传对应keys值做检测

/*** UI控制使用16位位运算 https://tool.oschina.net/hexconvert* 每一位可以看作一个开关,1表示开,0表示关。* 右移操作符>>和按位与操作符&来获取每一位的值。如果某一位的值为1,那么对应的开关就是开,如果某一位的值为0,那么对应的开关就是关。* 	● 是否修改:ui_control & (1 << 17)● 是否导出:ui_control & (1 << 16)● 是否显示思维导图:ui_control & (1 << 4)● 是否显示原文:ui_control & (1 << 3)● 是否显示章节概率:ui_control & (1 << 2)● 是否显示全文总结:ui_control & (1 << 1)● 是否显示视频:ui_control & 1*/
const getUiControlBinaryContent = (keys) => {var uicontrol = Number(new URLSearchParams(location.search).get('uiControl'))let uint32 = new Uint32Array(1);uint32[0] = uicontrol;const action = new Map<string, any>([['Edit', checkUnitBuffer(uint32[0], 17)],['Export', checkUnitBuffer(uint32[0], 16)],['VideoPre', checkUnitVideo(uint32[0], 1)],['MindMap', checkUnitBuffer(uint32[0], 4)],['AllText', checkUnitBuffer(uint32[0], 3)],['ChapterOverviewt', checkUnitBuffer(uint32[0], 2)],['FullTextSummary', checkUnitBuffer(uint32[0], 1)]]);return keys ? action.get(keys) : 0;
};// 与或位控制
const checkUnitBuffer = (control: number, idx: number) => {if (!idx) return 0; if ((control & (1 << idx)) !== 0) {return 1;} else {return 0;}
};

总结:路由上设置ui_control,通过第几位用按位或来设置具体值,用按位与来解析是否有权限

相关文章:

  • firefly rk3288 ubuntu23.10 网卡名为end0 改为eth0
  • 【webpack开发环境下的配置】
  • 原码、补码、反码、移码是什么?
  • 如何理解 Composition API 和 Options API
  • Linux C++ realpath函数crash的解决方法
  • Spock单元测试框架使用介绍和实践
  • linux中当前目录、上级目录、上上级目录表示方法
  • python—爬虫爬取电影页面实例
  • AI 绘画|Midjourney设计Logo提示词
  • Unity | AssetBundle
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 卢小姐的生日礼物(200分) - 三语言AC题解(Python/Java/Cpp)
  • 哪些企业适合做ISO27001信息安全管理体系?
  • 定制QCustomPlot 带有ListView的QCustomPlot 全网唯一份
  • SpringAI简单使用(本地模型+自定义知识库)
  • Linux处理文件sed
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • es的写入过程
  • in typeof instanceof ===这些运算符有什么作用
  • JAVA之继承和多态
  • tweak 支持第三方库
  • vue.js框架原理浅析
  • 半理解系列--Promise的进化史
  • 分享一份非常强势的Android面试题
  • 给初学者:JavaScript 中数组操作注意点
  • 后端_ThinkPHP5
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 世界上最简单的无等待算法(getAndIncrement)
  • 以太坊客户端Geth命令参数详解
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 正则学习笔记
  • UI设计初学者应该如何入门?
  • 阿里云重庆大学大数据训练营落地分享
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #pragma data_seg 共享数据区(转)
  • $ git push -u origin master 推送到远程库出错
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (ros//EnvironmentVariables)ros环境变量
  • (搬运以学习)flask 上下文的实现
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (四)Android布局类型(线性布局LinearLayout)
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)一些感悟
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .form文件_一篇文章学会文件上传
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET MVC 验证码
  • .net打印*三角形
  • .pub是什么文件_Rust 模块和文件 - 「译」