数据权限的设计与实现系列6——前端筛选器组件Everright-filter使用探索

linear 功能探索

最终我们是需要使用 API 的方式,调用后端服务拉取数据填充筛选器组件,不过在探索阶段,直接用 API 方式,就需要构造 mock 数据,比较麻烦,因此先使用 Function 方式来进行功能验证。

组件初始化

新建一个页面,复制官方示例,如下:

<script setup>
import { ref } from 'vue'
import { EverrightFilter } from 'everright-filter'
import 'everright-filter/dist/style.css'
const ERfilterRef = ref(null)
const lang = ref('zh-cn')
const handleListener = ({ type, data }) => {console.log(type, data)
}
const getOptions = async () => {return new Promise((resolve, reject) => {resolve({data: {options: [],operators: {}}})})
}
const getConditions = async (params) => {return new Promise((resolve, reject) => {resolve({data: {options: [],operators: {}}})})
}
const getProps = async () => {return new Promise((resolve, reject) => {resolve({data: {}})})
}
const getPropValues = async (params) => {return new Promise((resolve, reject) => {resolve({data: {}})})
}
</script><template><div><EverrightFilter:lang="lang"@listener="handleListener":getOptions="getOptions":getConditions="getConditions":getProps="getProps":getPropValues="getPropValues"ref="ERfilterRef"/></div></template>

页面初始化效果如下:

下拉列表是空的,添加条件点击后,组件显示发生了变化,如下:

大概的界面展示效果出来了,接下来我们摸索下如何添加一个最常用的文本类筛选条件。

文本类筛选条件

经过摸索,筛选条件对应着组件的 option,因此调整 getOptions 方法,模拟一个姓名的筛选条件,如下:

const getOptions = async () => {return new Promise((resolve, reject) => {resolve({data: {options: [{label: '姓名',en_label: 'name',renderType: 'TEXT',operatorKey: 'Text',value: 'name'        }],operators: {Text: [{label: '等于',en_label: 'Equal',style: 'noop'},{label: '等于其中之一',en_label: 'Equal to one of',value: 'one_of',style: 'tags'},{label: '不等于',en_label: 'Not equal',value: 'not_equal',style: 'noop'},{label: '包含',en_label: 'Contains',value: 'contains',style: 'noop'},{label: '不包含',en_label: 'Not contain',value: 'not_contain',style: 'noop'},{label: '为空',en_label: 'Empty',value: 'empty',style: 'none'},{label: '不为空',en_label: 'Not empty',value: 'not_empty',style: 'none'}]}}})})
}

效果如下:

每个筛选条件是一个对象,用{}包裹,对象属性含义如下:

label: 中文语种下的标签名称

en_label:英文语种下的标签名称

value: 筛选条件的英文编码

renderType: 筛选条件值的输入或选择控件,可选值:CASCADER,SELECT,REGION,TEXT,NUMBER,TIME,DATE,NONE

operatorKey: 操作符的键,需要在下面的 operators 中定义,一个键对应一个操作符集合。

还有includeOperator 和 excludeOperator两个属性,可以对操作符集合进行正向或反向选取。

例如,上面姓名例子中,若不希望操作符出现“等于其中之一”,需按如下写法配置:

options: [{label: '姓名',en_label: 'name',renderType: 'TEXT',operatorKey: 'Text',value: 'name',excludeOperator: {operator: ['one_of']}}
]

注意 excludeOperator 后不是直接指定数组,而是加了一层 operator 节点,其中的值 one_of 对应着操作符对象属性中的 value。

调整后就从操作符列表中去除了“等于其中之一”这一项,如下:

数值类筛选条件

参照上述文本类的配置模式,我们添加一个数值类筛选条件:年龄,如下:

const getOptions = async () => {return new Promise((resolve, reject) => {resolve({data: {options: [{label: '姓名',en_label: 'name',renderType: 'TEXT',operatorKey: 'Text',value: 'name',excludeOperator: {operator: ['one_of']}},{label: '年龄',en_label: 'age',renderType: 'NUMBER',operatorKey: 'Number',value: 'age'}],operators: {Text: [{label: '等于',en_label: 'Equal',style: 'noop'},{label: '等于其中之一',en_label: 'Equal to one of',value: 'one_of',style: 'tags'},{label: '不等于',en_label: 'Not equal',value: 'not_equal',style: 'noop'},{label: '包含',en_label: 'Contains',value: 'contains',style: 'noop'},{label: '不包含',en_label: 'Not contain',value: 'not_contain',style: 'noop'},{label: '为空',en_label: 'Empty',value: 'empty',style: 'none'},{label: '不为空',en_label: 'Not empty',value: 'not_empty',style: 'none'}],Number: [{label: '等于',en_label: 'Equal',value: 'equal',style: 'noop'},{label: '不等于',en_label: 'Not equal',value: 'not_equal',style: 'noop'},{label: '大于',en_label: 'Greater than',value: 'greater_than',style: 'noop'},{label: '大于等于',en_label: 'Greater than or equal to',value: 'greater_than_equal',style: 'noop'},{label: '小于',en_label: 'Less than',value: 'less_than',style: 'noop'},{label: '小于等于',en_label: 'Less than or equal to',value: 'less_than_equal',style: 'noop'},{label: '区间',en_label: 'Between',value: 'between',style: 'range'},{label: '为空',en_label: 'Empty',value: 'empty',style: 'none'},{label: '不为空',en_label: 'Not empty',value: 'not_empty',style: 'none'}]}}})})
}

效果如下:

‍其他数据类型,如日期、时间等也大同小异,先不管细节,优先看看整体,继续说一下操作符。

操作符

在上面的探索过程中,实际已经涉及到了操作符,再具体说明下。

示例

[{label: '等于',en_label: 'Equal',value: 'equal',style: 'noop' // 无意义},{label: '等于其中之一',en_label: 'Equal to one of',value: 'one_of',style: 'tags' // 由操作符控制value为多选类型,适用于renderType CASCADER、SELECT、REGION、TEXT},{label: '为空',en_label: 'Empty',value: 'empty',style: 'none' // 不显示 value},{label: '区间',en_label: 'Between',value: 'between',style: 'range' // 由操作符控制value为区间类型,适用于renderType NUMBER、TIME、DATE}]

属性说明

label: ‘为空’,
en_label: ‘Empty’,
value: 操作符的编码,自定义
style: 样式,内置了四种

  • none:不显示值控件,用于不需要值的地方,如为空、不为空等
  • noop:单个值,如等于、不等于
  • tags:由操作符控制 value 为多选类型,适用于 renderType 为CASCADER、SELECT、REGION、TEXT类型之一时
  • range:由操作符控制 value 为区间类型,适用于 renderType 为 NUMBER、TIME、DATE 类型之一时

组件方法

我们使用数据筛选器进行灵活的自定义条件组合,最终还是需要将筛选器的结果拿到后,作为参数传给后端服务的。

这时候就需要使用组件提供的 getData 方法了。

在页面中新加一个按钮,调用组件的获取数据方法,将数据 json 格式化后输出到控制台,如下:

我们输入两个查询条件,界面如下:

点击按钮,输出数据如下:

{"filters": [{"conditions": [{"property": "name","value": "张三"},{"operator": "greater_than","property": "age","value": 24}],"logicalOperator": "and"}],"logicalOperator": "and"
}

注意该 json 的数据结构以及最终数据和 option 和 operater 的对应关系,筛选条件 option 的 value 对应着 conditions 中的 property,操作符 operation 的 value 对应着 conditions 中的 operator,筛选条件输入的值,最终对应着 conditions 中的 vaule,然后就是组内和组件的关系设定,是 and 还是 or。

后端拿到该 json 语句后,进行解析和处理,转换成最终的 sql 语句来执行。‍

matrix 功能探索

有了上面 linear 的基础,matrix 就简单多了。

逻辑组的数量,类型为 linear 时默认只有 1 个,类型matrix则调整为了可以动态添加多个。

在原 demo 代码基础上,为筛选器组件新增一个属性 type="matrix"(默认是 linear)即可,刷新页面,效果如下:

获取到 data 结构如下:

{"filters": [{"conditions": [{"property": "name","value": "张三"},{"operator": "greater_than","property": "age","value": 24}],"logicalOperator": "and"},{"conditions": [{"operator": "equal","property": "age","value": 30}],"logicalOperator": "and"}],"logicalOperator": "and"
}

可以看到,数据结构并没有变化,只是多个逻辑分组的情况下,数据看上去更复杂了一些而已。

开源平台资料

平台名称:一二三开发平台

简介: 企业级通用开发平台

设计资料:[csdn专栏]

开源地址:[Gitee]

开源协议:MIT

如果您在阅读本文时获得了帮助或受到了启发,希望您能够喜欢并收藏这篇文章,为它点赞~
请在评论区与我分享您的想法和心得,一起交流学习,不断进步,遇见更加优秀的自己!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代理模式详解

1.基本介绍 代理模式&#xff1a;为一个对象提供一个替身&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能;被代理的对象可以是远程对象、创建开销大的对象或需要安全控制…

记录:uniapp直播的弹幕的样式修改与发送弹幕会自动滚动到底部两个技巧

1、在直播页面的弹幕评论中&#xff0c;我们希望的样式是&#xff1a; 观众名字&#xff1a;评论 而且颜色有所区分&#xff0c;并在同一行显示 2、我们希望在发弹幕的时候可以回自动滚动到自己发的内容那里 一&#xff1a;弹幕样式修改 因为是小白&#xff0c;前端对于样式这…

苹果手机照片被删除?如何通过不同的方法来恢复照片

手机已经成为我们生活中不可或缺的一部分&#xff0c;它不仅仅是通讯工具&#xff0c;更是我们记录生活点滴的重要工具之一。然而&#xff0c;正如其他任何设备一样&#xff0c;iPhone上存储的照片有时也会不小心被删除或丢失。 别担心&#xff0c;即使你误删了重要的照片&…

重头开始嵌入式第三十四天(数据库二)

sqlite3的一些补充 目录 sqlite3的一些补充 1.事物 2.连接&#xff0c;联合 3.触发器 4.子查询 1.事物 数据库事务是数据库管理系统执行过程中的一个逻辑单位&#xff0c;它由一系列对数据库的操作组成。 一、事务的特性 1. 原子性&#xff08;Atomicity&#xff09…

Linux:目录及文件管理

目录及文件管理 cd的命令使用 . 当前目录 .. 父目录&#xff08;上一层&#xff09; ~ 表示家目录 家目录&#xff1a;专门存放用户个性化信息的目录 ~user&#xff1a;用户user的家目录 /root: 是Linux管理员的家目录 /home: 存放所有普通用户的家目录]# cd ~root #去…

大模型LLM算法工程师技术面试指南

大模型LLM算法工程师技术面试指南 AI大模型全套学习资料 “最先掌握AI的人&#xff0c;将会比较晚掌握AI的人有竞争优势”。 这句话&#xff0c;放在计算机、互联网、移动互联网的开局时期&#xff0c;都是一样的道理。 我在一线互联网企业工作十余年里&#xff0c;指导过不少…

Java异常类

目录 Java异常类 Java中的异常体系 抛出异常 处理异常 处理异常的两种方式 try...catch和throws的区别 finally关键字 抛出异常注意事项 自定义异常类 Java异常类 Java中的异常体系 在Java中&#xff0c;异常类的父类为Throwable类&#xff0c;在Throwable下&#x…

记一次高版本view-design的组件迁移到自身项目的低版本

背景 npm i -S view-design当前老项目使用view-design这个组件库&#xff0c;但是当我们去官网查看该组件库最新版本&#xff0c;竟然发现没有博主想用的image/ImagePreivew这两个基础组件 说实话&#xff0c;有点离谱了哈&#xff01;&#xff01; 自己造轮子&#xff1f; …

数据结构基本知识

一、什么是数据结构 1.1、组织存储数据 ---------》内存&#xff08;存储&#xff09; 1.2、研究目的 如何存储数据&#xff08;变量&#xff0c;数组....)程序数据结构算法 1.3、常见保存数据的方法 数组&#xff1a;保存自己的数据指针&#xff1a;是间接访问已经存在的…

分库分表核心理念

文章目录 分库&#xff0c;分表&#xff0c;分库分表什么时候分库&#xff1f;什么时候分表&#xff1f;什么时候既分库又分表&#xff1f;横向拆分 & 纵向拆分 分表算法Range 范围Hash 取模一致性 Hash斐波那契散列 严格雪崩标准&#xff08;SAC&#xff09;订单分库分表实…

【880高数】高等数学一刷错题整理

第一章 函数、极限、连续 2024.8.11日 1. 2. 3. 4. 5. 2024.8.12日 1. 2. 3. 4. 5. 6. 7. 8. 2024.8.13日 1. 2. 3. 4. 2024.8.14日 1. 2. 3. 4. 5. 第二章 一元函数微分学及其应用 2024.8.15日 1. 2. 3. 4. 5. 6. 2024.8.16日 1. 2. 3. 4. 5. 2024.8.17日 1. 2. 3. 4…

个人简历 (自己设计的)

欢迎大家来观看。 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" co…

相亲交友系统背后的科技力量:智能匹配的秘密

随着互联网技术的发展&#xff0c;相亲交友系统已经成为许多人寻找另一半的重要工具。这些相亲交友系统不仅仅是一个简单的社交平台&#xff0c;它们背后隐藏着强大的科技力量&#xff0c;尤其是智能匹配技术&#xff0c;使得用户能够更加高效地找到适合自己的伴侣。 相亲交友…

信息学奥赛初赛天天练-87-NOIP2014普及组-完善程序-矩阵、子矩阵、最大子矩阵和、前缀和、打擂台求最大值

1 完善程序 最大子矩阵和 给出 m行 n列的整数矩阵&#xff0c;求最大的子矩阵和(子矩阵不能为空)。 输入第一行包含两个整数 m和 n&#xff0c;即矩阵的行数和列数。之后 m行&#xff0c;每行 n个整数&#xff0c;描述整个矩阵。程序最终输出最大的子矩阵和。 &#xff08;最…

C语言俄罗斯方块(VS2022版)

C语言俄罗斯方块 演示视频一、前置知识1.Win32 API 的使用2.宽字符的使用 二、封装核心数据与框架介绍三、核心操作介绍旋转操作检测操作水平检测竖直检测代码化简 四、源码展示在 tetris.h 中&#xff1a;在 tetris.c 中&#xff1a;在 test.c 中&#xff1a; 以下代码环境为 …

码上进阶_刷题模块测试_用例设计

码上进阶_刷题模块测试_用例设计 系统概述&#xff1a; 码上进阶是为程序员专门打造的交流平台&#xff0c;采用主流的微服务框架和C端技术栈作为技术基础。在这个平台上&#xff0c;程序员 可以通过刷题、练习和模拟面试来提升自己的面试能力。 功能测试&#xff1a; 登录…

SpringBoot OAuth2自定义登陆/授权页

背景 5 月份的时候&#xff0c;我实践并整理了一篇博客&#xff1a;SpringBoot搭建OAuth2&#xff0c;该博客完成之后&#xff0c;很长一段时间里我都有种意犹未尽的感觉。诚然&#xff0c;我把OAuth2搭起来了&#xff0c;各种场景的用例也跑通了&#xff0c;甚至源码也看了&am…

99.WEB渗透测试-信息收集-网络空间搜索引擎shodan(1)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;98.WEB渗透测试-信息收集-Google语法&#xff08;12&#xff09; 信息收集方向-网络空间…

【IDEA配置一个maven项目(详细操作流程)】

目录 一、安装Maven 1、官网下载maven链接地址&#xff1a;Maven – Download Apache Maven 2、下载完成后&#xff0c;解压到某一路径下。E:\JavaTools\apache-maven-3.9.8为例&#xff0c;实际配置环境变量时以自己安装的路径为准。 二、配置环境变量 1、右键此电脑–&g…

springboot、flowable 生成图片发布到Docker乱码问题

flowable自带的方法生成图片时&#xff0c;如设置字体为宋体&#xff0c;则本地测试没有问题&#xff0c;因为windows自带宋体字体库&#xff0c;但是如果发布到Docker&#xff0c;则会出现乱码问题&#xff0c;因为大部分Docker并不包含宋体字体库&#xff1b; 通过Java代码&a…