数据权限的设计与实现系列8——前端筛选器组件Everright-filter集成框架开发1

news2024/12/25 12:46:29

背景

前面我们对筛选器组件进行了功能探索和技术验证,接下来就开始着手集成工作,融入一二三开发平台,打通前后端,最终让数据权限控制功能落地。
整体集成工作比较复杂,我们遵循由易到难的原则,先搭建出完整框架,再具体完善各组成部分。‍

实体配置

首先,是需要新建一个业务实体,来维护实体与数据权限规则对应关系,使用平台的低代码配置功能完成。

创建实体

新建一个实体,放在实体配置功能模块下,如下图:

平台根据实体配置的属性,自动生成一个同名的数据模型,如下图:

配置模型

点击“配置属性”按钮,为其配置模型属性,如下图:

这里面的属性只有 5 个,简单说一下。
模型标识:对应关系的关键属性,用来标记该数据权限规则对应着哪个实体模型。
表名:MybatisPlus 的数据权限插件,拦截 SQL 语句解析后能获取到表名,通过该属性来获取到具体的数据权限规则。
规则:对应着数据筛选器配置产生的规则,通过组件的 getData 方法获取,一方面,这里的规则用于解析处理后转换为数据权限控制的 SQL 语句;另一方面,如某个业务实体已配置了数据权限规则,需要通过组件的 setData 来加载后让用户查看或修改。
sql 片段:根据数据筛选器配置产生的规则解析处理后的 SQL 片段,即将解析转换工作放到数据权限规则配置阶段完成,解析一次,多次使用。
备注:对数据权限规则进行友好性描述,便于规则的维护。

配置视图

数据权限规则的维护,将会嵌入到实体模型中,因此不需要列表视图,因此只需要添加一个详情视图,如下图所示:


完成上述基本配置后,遵循平台配置流程,进行生成库表、生成代码、拷贝代码、配置权限项操作后,完成实体配置工作。这些基本操作在平台实体配置部分有详细说明,在此不再赘述。

功能实现

新增功能按钮

访问平台的实体配置功能模块下的实体功能菜单,列出平台中的已配置的业务实体,如下图:

我们选一个相对简单的系统参数实体作为框架开发的目标对象,点击对应的行记录后的配置按钮,打开实体配置页面,默认显示实体模型,我们在行记录上增加一个新按钮,命名为“数据权限”,如下图所示:

点击该按钮,打开上一章节,我们为实体模型数据权限对应表这个实体配置的详情视图,如下:

注:还有两个属性,模型标识和表名由系统自动生成,并不需要用户维护,因此做了隐藏处理。

添加数据筛选器组件

在平台生成的代码基础上,手工添加数据筛选器组件,把先前的功能探索的验证页面,改写成 vue2 的风格,集成到系统中来。
首先是引入组件和样式表:

import { EverrightFilter } from 'everright-filter'
import 'everright-filter/dist/style.css'

然后,如下图:

关于组件属性的设置,因为暂时不考虑多语言支持,因此语种 lang 直接固化为中文 zh-cn,类型 type 指定为 matrix(多维),采用函数的方式,绑定筛选条件。

远程获取筛选条件

这里我们将原来测试的静态数据(姓名、年龄),调整为请求后端服务,如下:

async getOptions() {
      const options = await this.$api.entityconfig.entityModelProperty.getFullPropertyListForFilter(
        this.entityData.modelId
      )
   
      return new Promise((resolve, reject) => {
        resolve({
          data: {
            options: options.data,
            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'
                }
              ]
            }
          }
        })
      })
    }

后端服务是从平台的实体配置中拿到数据模型的属性元数据,转换成数据筛选器组件需要的格式,如下:

 /**
     * 获取完整属性列表,转换为过滤器需要的格式
     * 只取数据库存储的属性
     *
     * @param entityModelId 实体模型id
     * @return {@link ResponseEntity}<{@link Result}>
     */
    @GetMapping("/{entityModelId}/getFullPropertyListForFilter")
    @SystemLog(value = "实体模型属性-完整列表,转换为筛选器格式")
    @PreAuthorize("hasPermission(null,'entityconfig:entityModelProperty:query')")
    public ResponseEntity<Result> getFullPropertyListForFilter(@PathVariable String entityModelId) {
        // 构造查询条件

        List<EntityModelProperty> list = entityModelPropertyService.getFullPropertyByEntityModelId(entityModelId);
        // 转换vo
        List<EntityModelPropertyForFilterVO> entityModelPropertyVOList = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            // 非库表存储属性直接跳过
            if (list.get(i).getDatabaseStoreFlag().equals(YesOrNoEnum.NO.name())) {
                continue;
            }
            EntityModelPropertyForFilterVO vo = new EntityModelPropertyForFilterVO();
            vo.setLabel(list.get(i).getName());
            vo.setValue(list.get(i).getCode());
            vo.setRenderType("TEXT");
            vo.setOperatorKey("Text");
            entityModelPropertyVOList.add(vo);
        }
        return ResultUtil.success(entityModelPropertyVOList);
    }

这里新建了数据筛选器的视图对象 vo,如下:

package tech.abc.platform.entityconfig.vo;


import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 专用于数据筛选器的实体模型属性 视图对象类
 *
 * @author wqliu
 * @date 2024-08-05
 */
@Data
@Accessors(chain = true)
public class EntityModelPropertyForFilterVO {
    /**
     * 标签
     */
    private String label;

    /**
     * 编码
     */
    private String value;

    /**
     * 控件类型
     */
    private String renderType;

    /**
     * 操作符
     */
    private String operatorKey;

}

注:目前我们的核心任务是搭建框架,把整体串起来,运转起来后再完善细节,因此各部分设计和实现从简,比如所有的模型属性的展示控件暂都按文本类处理。

实现效果如下:

下拉列表中可以正常显示通过远程服务拿到的实体属性列表了,并可以作为筛选条件来使用了,如下图:

生成规则

在表单上添加一个按钮,命名为“生成规则”,点击后,调用筛选器组件的 getData 方法,生成规则 json,如下:

generateRule() {   
   this.entityData.rule = JSON.stringify(this.$refs.everrightFilter.getData(), null, '\t')
}

效果如下:

注:该地方曾尝试做成筛选器任何调整自动生成规则的方式,通过组件的 listener 机制,监听 triggerChange 事件,如下图所示

  handleListener({ type, data }) { 
    if (type == 'triggerChange') {
      this.generateRule()
    }   
  }

当添加条件时,控制台会报错,如下:

进一步打印 console.log(this.$refs.everrightFilter),发现能拿到筛选器对象,且 getData 方法也存在,如下图:

但是实际会报找不到 getData 方法,原因不明。
考虑到规则配置环节本身条件配置就是所见即所得模式,并不需要对规则结果也同步实时显示出来,因此通过点击按钮主动触发也没问题的。

开源平台资料

平台名称:一二三开发平台
简介: 企业级通用开发平台
设计资料:[csdn专栏]
开源地址:[Gitee]
开源协议:MIT
如果您在阅读本文时获得了帮助或受到了启发,希望您能够喜欢并收藏这篇文章,为它点赞~
请在评论区与我分享您的想法和心得,一起交流学习,不断进步,遇见更加优秀的自己!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IPv6理论基础

IPV6 地址介绍 地址标识方法 格式 : XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX&#xff0c;128bit&#xff0c;8个16位&#xff0c;16进制 X表示十六进制的一个字符&#xff0c;可以是0 - 9,A -F 字母大小写不敏感&#xff0c;最终设备上显示均为大写 一个地址由8个字段构成…

Leetcode3266. K 次乘运算后的最终数组 II

Every day a Leetcode 题目来源&#xff1a;3266. K 次乘运算后的最终数组 II 解法1&#xff1a;3266. K 次乘运算后的最终数组 II 用最小堆手动模拟操作&#xff0c;直到原数组的最大值 mx 成为这 n 个数的最小值。 设此时还剩下 k 次操作&#xff0c;那么&#xff1a; 对…

HarmonyOs DevEco Studio小技巧11--AI插件

AI智能辅助编程工具 CodeGenie 简介 DevEco AI辅助编程工具&#xff08;CodeGenie&#xff09;为开发者提供高效的应用/服务AI辅助编程工具&#xff0c;支持HarmonyOS NEXT领域的智能知识问答、ArkTS代码补全/生成和万能卡片生成能力&#xff0c;提高开发者编码效率。 文档中…

mysql整体架构描述

文章目录 数据库架构示意图1. 连接层2. 服务层3. 存储引擎层4. 文件系统层5. 系统层主要特性 数据库文件格式InnoDB 存储引擎文件类型及用途 MyISAM 存储引擎文件类型及用途 其他文件类型文件内容示例表结构文件示例 (.frm)InnoDB 数据文件示例&#xff08;.ibd&#xff09;MyI…

(十四)、为 SpringCloud 项目生成 Docker 镜像

文章目录 1、原理2、最佳实践2.1、获得 SpringCloud 微服务启动模块的 jar 文件2.2、准备文件夹和 Dockerfile 文件2.3、 Dockerfile 文件的内容2.4、通过命令行构件新镜像 3、异常情况和处理&#xff1a;failed to create LLB definition3.1、现象3.2、解决配置国内镜像仓库清…

【Python报错已解决】 ModuleNotFoundError: No module named ‘tensorboard‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;使用pip安装TensorBoard…

vue3.0 使用echarts与echarts-gl 实现3D饼图

效果 安装echarts npm install echarts npm install echarts-gl 3d饼图组件&#xff1a; <template><div style"width: 100%; height: 100%" ref"echart"></div> </template><script setup> import { reactive, ref, onMou…

docker部署FastDFS文件系统详细记录,每个步骤都有详细记录。含linux和windows双系统安装教程

docker部署FastDFS文件系统详细记录 参考文章docker搭建FastDFS文件系统&#xff08;最详细版&#xff09; 文章里所有步骤由作者亲自测试&#xff0c;所以和 原文有不少差异 文章里所有步骤由作者亲自测试&#xff0c;所以和 原文有不少差异 文章里所有步骤由作者亲自测试&…

HTML + CSS - 网页布局之一般布局浮动布局

1. 一般布局 1.1 一般布局相关参数 元素内容常常可以想像为放在一个盒子里&#xff0c;然后在周边加上内边距&#xff0c;边框和外边距&#xff0c;是盒子模型 默认一个块级区域会填充父类所有的行向空间&#xff0c;并且沿着块伸长容纳其内容&#xff0c;可以为块状体设置某…

18、公司信贷管理|贷款额度的测算|贷款期限及其定价的设定逻辑!

银行在综合权衡贷款的第一还款来源和第二还款来源、风险和收益的基础上&#xff0c;应明确提出贷与不贷的意见。经调查审查同意的贷款&#xff0c;应提出最终的融资方案。 合理的融资方案既要有利于提升本行的竞争力&#xff0c;又要有利于控制贷款风险。完整的融资方案一般包…

苹果的“AI茅”之路只走了一半

今年苹果发布会最大的亮点&#xff0c;也许是和华为“撞档”&#xff0c;又或者是替腾讯“发布”新手游&#xff0c;但肯定不是iPhone 16。 9月10日&#xff0c;苹果秋季新品发布会与华为见非凡品牌盛典相继举行&#xff0c;iPhone 16系列也与HUAWEI Mate XT同日发布。 不过&…

性能测试-jmeter脚本录制(十五)

一、jmeter脚本录制&#xff08;不推荐&#xff09;简介&#xff1a; 二、jmeter脚本录制步骤 1、添加代理服务器和线程组 2、配置http代理服务器的端口和目标线程组 3修改本机浏览器代理 4、点击启动 5、每次操作页面前&#xff0c;修改提示文字

html 中如何使用 uniapp 的部分方法

示例代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><…

2024年,最新 OKR 优秀案例集(建议收藏)

我们发现&#xff0c;在你学习 OKR 的例子之前&#xff0c;先回顾一下 OKR 是如何写的&#xff0c;会有帮助。这样&#xff0c;你就能更好地理解下面描述的目标和关键结果的例子。 好消息是&#xff0c;Tita 的 OKR案例库有很多例子可以学习&#xff0c;它们从公司的 OKR 开始…

离散时域和连续频谱之间的傅里叶

要得到虚假的时域离散点&#xff0c;要用频域一个周期的积分

对接开源大模型应用开发平台最佳实践

本文以Dify为例介绍如何使用OpenSearch LLM智能问答版对接大模型应用开发平台构建RAG系统。 背景 随着AIGC技术日新月异的发展&#xff0c;LLM应用也在持续迭代。基于LLM、Agent框架、工作流编排能力等&#xff0c;可以搭建不同场景下丰富的应用服务。其中&#xff0c;检索增…

基于node.js koa2模拟快递柜存储取出快递微信小程序

本文介绍了一个基于Node.js Koa2框架的快递柜存储和取出快递的微信小程序。首先&#xff0c;我们使用Koa2框架搭建了一个简单的后端服务器&#xff0c;用于处理微信小程序发送的请求。然后&#xff0c;我们实现了快递柜的存储和取出功能&#xff0c;用户可以通过微信小程序扫描…

【包教包会】CocosCreator3.x拖尾MotionStreak威力加强版(支持3.x、支持原生、可合批)

将去年写的2.x拖尾升级到3.x 完美适配Web、原生平台&#xff08;其余平台没测过&#xff09;。 保留原版功能&#xff08;拖尾会跟随节点位移、缩放、受节点透明度影响&#xff0c;但不会跟随节点旋转&#xff09; 支持世界坐标 / 本地坐标切换&#xff08;至于为什么需要这…

中国老年社会追踪调查(2011-2020年)

中国老年社会追踪调查&#xff08;CLASS&#xff09;是一项全国性、连续性、系统性、长期性的社会调查项目&#xff0c;它通过定期、系统地收集中国老年人群的社会、经济背景数据&#xff0c;以掌握老年人在衰老过程中面临的各种问题和挑战。这些数据评估了各项社会政策措施在提…

精通PostgreSQL:解锁高效数据库管理的十大必备技巧与最佳实践

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…