数据权限的设计与实现系列6——前端筛选器组件Everright-filter使用探索
创始人
2024-09-25 05:18:07
0

linear 功能探索

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

组件初始化

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

    

页面初始化效果如下:

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

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

文本类筛选条件

经过摸索,筛选条件对应着组件的 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

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

相关内容

热门资讯

原生安卓系统哪个最好使,探寻最... 亲爱的手机控们,你是否在寻找一款能让你爱不释手的原生安卓系统呢?今天,就让我带你一起探索,看看哪个原...
安卓系统扫描仪软件,轻松捕捉每... 你有没有想过,手机也能变成强大的扫描仪?没错,就是那个你每天不离手的安卓手机!今天,就让我带你一起探...
安卓系统webview要更新吗... 你有没有发现,你的安卓手机最近是不是有点儿“慢吞吞”的?别急,这可能是你的安卓系统WebView需要...
安卓哪个系统最帅气,探寻最帅气... 你有没有发现,手机系统就像是个人的风格,有的低调内敛,有的张扬个性。今天,咱们就来聊聊安卓系统里哪个...
闪耀暖暖安卓系统卡,探寻解决之... 最近是不是有很多小伙伴在玩《闪耀暖暖》这款游戏呢?不过,有些小伙伴在体验过程中遇到了一个让人头疼的问...
酷开系统装安卓app,畅享海量... 你有没有发现,家里的电视突然变得聪明起来?没错,就是那个酷开系统,它现在可是装安卓app的高手呢!今...
安卓系统通话息屏,通话无忧 你有没有遇到过这种情况:手机屏幕熄灭了,但电话却还在响个不停?是不是觉得有点尴尬,又有点无奈?别担心...
支持安卓系统的导航,支持安卓系... 你有没有想过,在手机上安装一款支持安卓系统的导航软件,就像是给你的出行装上了“顺风耳”和“千里眼”呢...
安卓系统启动机制,揭秘启动流程... 你有没有想过,当你按下那个小小的开机键,安卓系统是如何从沉睡中苏醒,开始它的一天呢?今天,就让我带你...
安卓装系统用什么软件,精选软件... 你有没有想过,你的安卓手机或者平板,有一天突然想要换换口味,换一个全新的操作系统呢?别急,今天就来给...
wps安卓系统如何横屏,文章的... 你有没有发现,用WPS在安卓系统上办公的时候,横屏模式简直太方便了!想象屏幕宽广,文字清晰,是不是瞬...
TCL电视搭载安卓系统,畅享智... 亲爱的读者们,你是否在寻找一款既时尚又实用的电视呢?今天,我要给你介绍一款特别受欢迎的电视——TCL...
安卓系统qq动态怎么删,一键操... 你是不是也有过这样的烦恼?手机里QQ动态堆得像小山,想删又不知道怎么下手?别急,今天就来手把手教你如...
安卓手机的系统游戏,解锁手机游... 你有没有发现,安卓手机的系统游戏越来越丰富了呢?没错,现在就让我带你一起探索这个充满乐趣的世界吧!一...
安卓系统ui流畅排名,谁才是流... 你有没有发现,手机用久了,有时候操作起来就像蜗牛爬行一样慢吞吞的?这不,最近我在网上闲逛,无意间发现...
安卓系统怎么连接音响蓝牙,安卓... 你家的安卓手机是不是已经更新到了最新的系统,音响也换成了那个高大上的蓝牙款?但是,连接起来却有点小麻...
炸金花如何开好友房间房卡/嫦娥... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:8488009许多玩家在游戏中会购买房卡来享受...
微信链接炸金花房卡怎样买/欢乐... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:33903369许多玩家在游戏中会购买房卡来享...
微信牛牛房卡自建房间/战皇大厅... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:55051770许多玩家在游戏中会购买房卡来享受...
微信牛牛房卡如何购买/美猴王大... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:8488009许多玩家在游戏中会购买房卡来享受更...