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

本文主要是介绍数据权限的设计与实现系列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

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

这篇关于数据权限的设计与实现系列6——前端筛选器组件Everright-filter使用探索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138239

相关文章

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF