低代码信创开发核心技术(四)动态元数据系统设计

一、概述

在当今快速发展的信息技术领域,动态元数据系统扮演着至关重要的角色。它不仅能够提供数据的描述信息,还能动态地适应业务需求的变化,从而提高系统的灵活性和可扩展性。构建一个动态元数据系统意味着我们可以在不重启系统的情况下,对数据模型进行实时更新和维护,而且通过与前端同步传递元数据,可以在不动用开发资源的情况下建立新的界面。

意义

动态元数据系统的核心意义在于其能够提供一种机制,允许系统在运行时自动调整其数据结构,以适应不断变化的数据需求。这种系统对于需要快速迭代和频繁更新数据模型的业务场景尤为重要。结合大模型技术,可以实现自生成底层操作系统、应用界面,是不是更像《流浪地球2》里面550W的设定呢?

标准与规范

为了确保系统的互操作性和可维护性,动态元数据系统的设计和实现应遵循以下标准和规范:

  • 开放性:系统应支持开放的标准,以便于与其他系统集成。所以在基于OAuth2.0标准的接口验证通过后,外部系统可以通过交换元数据快速解析出与本系统之间数据交换的格式和方法。
  • 一致性:元数据的定义和使用应保持一致,避免歧义。传统元数据技术属于静态元数据,无法做到随业务更新,因此需要做元数据版本管理,而动态元数据完全不需要考虑这个问题,始终保持一致。
  • 可扩展性:系统设计应考虑到未来的扩展需求,允许无缝添加新的元数据类型。
  • 安全性:保护元数据不被未授权访问或篡改,或与物理表脱敏。

二、元数据系统设计步骤

1、规划元数据表设计

在设计元数据系统时,我们需要构建几个关键的表来存储元数据信息:
基于您提供的表结构,以下是每个表的数据字典:

当然,以下是整理好的表格格式的数据字典:

实体表 (Entity Table)

字段名描述
主键实体的唯一标识
编码实体的编码
名称实体的名称
物理表实体对应的物理表名
上级实体上级实体的标识
主键字段编码主键字段的编码

字段表 (Field Table)

字段名描述
主键字段的唯一标识
编码字段的编码
名称字段的名称
物理字段字段对应的物理字段名
所属实体关联的实体标识
排序字段的排序
必填是否必填
长度字段的长度
精度字段的精度
是否主键是否为主键
是否显示是否在界面上显示
默认值字段的默认值
字段类型关联的字段类型标识
引用字典字段关联的字典标识

动态字典表 (Dynamic Dictionary Table)

字段名描述
主键动态字典的唯一标识
编码字典的编码
实体编码关联的实体编码
值字段字典的值字段
显示字段字典的显示字段
弹窗组件弹窗组件的编码

字段类型表 (Field Type Table)

字段名描述
主键字段类型的唯一标识
编码字段类型的编码
名称字段类型的名称
前端组件编码对应的前端组件编码

静态枚举表 (Static Enumeration Table)

字段名描述
主键静态枚举的唯一标识
编码枚举的编码
名称枚举的名称
排序枚举的排序

静态枚举值表 (Static Enumeration Value Table)

字段名描述
主键枚举值的唯一标识
枚举键关联的静态枚举标识
枚举值枚举的具体值

2、设计读取元数据并展现增删改查的界面

为了使系统用户能够方便地操作元数据,我们需要设计一个用户界面,它应该包含以下元素:

  • 基本控件:提供输入、选择等基本功能。
  • Vue的Component-Is动态渲染:利用Vue.js的动态组件特性,根据元数据类型渲染不同的表单控件。
    比如在Vite里,我们很轻松就能用Vite特性把组件全局注册上,然后用component标签的is属性来制定渲染的组件,如果你要加一些全局配置,不妨可以在字段类型表里再放一个JSON类型的字段用来初始化组件:
const modules = import.meta.glob('/src/components/**/**.vue', {eager: true})
for (const path in modules) {
    const componentConfig = modules[path]
    const componentName = path
        .split("/")
        .pop()
        .replace(/\.\w+$/, "");
    app.component(componentName, componentConfig.default || componentConfig);
}
  • 后台元数据动作处理:后端服务应能够响应前端的增删改查请求,并更新元数据表。
    具体设计需要读者自行完成,这里我写一下后端递归查询聚合实体伪代码,用来示意如何做增删改查,为了更方便的管理动态元数据,这里仅做示意,省略了一些步骤,比如字典和枚举值的翻译等等。
public 动态VO 封装动态VO(String 实体编码,Map<String,Object> 数据){
    动态VO vo= new 动态VO();
    vo.set实体编码(实体编码);
    vo.set数据(数据);
    vo.set子实例清单(new Map<String,List<动态VO>>);
    return vo;
}

public List<动态VO> 查询(String 实体编码,Map<String,Object> 查询条件){
    // 探明当前层结构
    Map<String,Object> 当前实体 = 读一行("SELECT * FROM 实体 WHERE 编码=? AND 上级实体 IS NULL",实体编码);
    List<Map<String,Object>> 子实体= 读多行("SELECT * FROM 实体 WHERE 上级实体=?",当前实体.get("主键"));
    List<Map<String,Object>> 实体字段 = 读多行("SELECT * FROM 字段 WHERE 所属实体=?",当前实体.get("主键"));
    String 当前实体主键字段=读值("SELECT 物理字段 FROM 字段 WHERE 所属实体=? AND 是否主键='是'",当前实体.get("编码"));
    
    // 读取当前实体
    String 查询语句="SELECT * FROM "+当前实体.get("物理表")+" WHERE TRUE ";
    if(查询条件!=null){
        for(Map<String,Object> 字段:实体字段){
            if(查询条件.containsKey(字段.get("编码"))){
                查询语句+="AND " + 字段.get("物理字段") + "=" + 查询条件.get(字段.get("编码"));
            }
        }
    }
    // 读取查询结果
    List<Map<String,Object>> 查询结果 = 读多行(查询语句);
    
    // 封装动态VO
    List<动态VO> 返回结果=new ArrayList<>();
    for (Map<String, Object> 数据行 : 查询结果) {
        动态VO vo = 封装动态VO(数据行);
        // 处理子实体
        for (Map<String, Object> 子实体 : 子实体) {
            String 子实体外键字段 = 读值("SELECT 物理字段 FROM 字段 WHERE 所属实体=? AND 字段类型='外键' AND 引用类型=?",子实体.get("编码"),当前实体.get("编码"));
            Map<String,Object> 子实体查询条件=new HashMap<>();
            子实体查询条件.put(子实体外键字段,数据行.get(当前实体主键字段));
            vo.get子实例清单().add(子实体.get("编码"), 查询(子实体.get("编码"), 子实体查询条件));
        }
        返回结果.add(vo);
    }
    return 返回结果;
}

3、用增删改查界面动态创建表并同步更新字段

为了实现元数据的动态管理,我们需要规划以下机制:

  • 元数据动作前后事件规划:定义在执行元数据操作前后需要触发的事件。这里就是AOP+策略模式+反射,从架构角度来说实现还是很简单的。
  • 触发创建及修改表动作:根据用户的增删改查操作,动态地创建或修改数据库中的表结构。

4、将元数据表字段信息保存至元数据表

最后一步是将用户通过界面操作的元数据信息保存回元数据表,这一步骤是实现自举元数据闭环的关键:

  • 自举元数据闭环:系统能够使用自身的元数据信息来管理和更新元数据表,实现自我管理和维护。就像是C语言编译器其实是用C语言写的一样,我们也要在手动创建元数据体系之后,使元数据体系能自我迭代和自我解释,实现可以用当前版本元数据系统造下一版本元数据系统,包括实体、字段、动态字典这些表的结构也可以实时修改、增加特性,从你能够用元数据系统来修改元数据系统的功能开始,后续你再加的所有需要编码的功能其实都是元数据系统的插件而已,本质上元数据系统是可以无需修改即可自行拼装SQL进行CURD并且能自动指挥前端组装界面的。

三、典型案例

在这里插入图片描述
这个是本人所做的一个某大型社区物业报修系统的前端报文格式,运用了动态元数据技术,开发时仅需在低代码平台拖拉拽,配置一下字段的属性,像使用原型设计软件一样,即可在30秒内完成需求修改、5分钟内完成功能设计、最快1小时全套管理系统的初版上线。别的公司销售人员和客户见面还没喝完茶,我们即可完成订单。

四、总结

构建一个动态元数据系统是一个复杂但值得追求的目标。它能够极大地提升系统的灵活性和适应性,使得数据管理更加高效和自动化。通过遵循设计原则,我们可以创建一个既强大又易于维护的元数据系统,以支持不断变化的业务需求。而且未来在面对大数据应用、CI/CD场景、ETL自动化的落地时,动态元数据系统、自举元数据是每一位高级架构师无法绕过的一个门槛,即使是最富有经验的架构师,仍需几个月时间才能独立完成一套可用的元数据系统。只有有了动态元数据系统,才有可能有后续的开放平台、数据交换中心,BPM、OA、ERP等等灵活的系统形态。
本篇文章的出现是因为有些朋友私信想了解低代码开发如何实现,普遍反馈上一篇讲的太粗浅了,所以这一篇相当于保姆级教程了,至少可以支撑各位架构们迈出第一步,原理其实并不难,只是每天面对硬编码的环境很少有人能想到系统可以这么设计,即使想到了也并不确定能不能达到想要的效果而从未开始,即使开始了也因为周期超出预期太多,从而中途放弃了。所以我这里可以肯定的说:一个全栈架构师全职去做(设计模式/数据结构熟练、算法水平能达到轻松解CSP-J试题,前后端双修,10年以上码龄即可,这个技能水平要求其实并不高),48小时内可跑通最基本的动态元数据体系,用时3个月可以出雏形,用时6个月可做出1.0版本商用级产品。但要注意的是这种东西最初版本的研发一定是一个人独立完成的,哪怕只加了半个人这事都很难成(包括老板,除非这位全栈架构自己就是老板)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第三十八天|动态规划理论基础、509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯

动态规划理论基础 1.什么是动态规划&#xff1a; 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&…

buuctf re 45-48

[BJDCTF2020]BJD hamburger competition 参考&#xff1a;http://t.csdnimg.cn/cJOSi 参考&#xff1a;http://t.csdnimg.cn/g9dA7 这是一堆&#xff0c;仔细看&#xff0c;是个游戏 安装ILSPY 下载失败 思路还是比较简单的 对所给进行sha1解密&#xff0c;在进行md5加密…

Vuforia AR篇(四)— AR虚拟按钮

目录 前言一、创建虚拟按钮二、创建脚本三、效果 前言 在当今互联网和移动设备普及的背景下&#xff0c;**增强现实&#xff08;AR&#xff09;**技术正迅速成为连接现实世界与数字信息的重要桥梁。AR虚拟按钮作为这一技术的创新应用&#xff0c;不仅提供了一种全新的用户交互…

智能穿戴终端设备安卓主板方案_MTK平台智能手表PCBA定制开发

新移科技智能手表方案兼容WiFi、BLE、2~5G等多种通信能力。支持多个功能模块&#xff0c;包括&#xff1a;通话、计步、定位、睡眠监测、心率监测、血氧监测等。智能手表通过滑动与功能性按键提供高度直观的体验感受&#xff0c;从腕间即可掌控日常生活。形态支持定制包括&…

线性代数 --- 计算斐波那契数列第n项的快速算法(矩阵的n次幂)

计算斐波那契数列第n项的快速算法(矩阵的n次幂) The n-th term of Fibonacci Numbers&#xff1a; 斐波那契数列的是一个古老而又经典的数学数列&#xff0c;距今已经有800多年了。关于斐波那契数列的计算方法不难&#xff0c;只是当我们希望快速求出其数列中的第100&#xff0…

关于SSL加密,您应该知道什么?

SSL加密&#xff0c;全称为安全套接字层加密&#xff0c;是一种网络安全协议&#xff0c;主要用于在网络通信中提供隐私和数据完整性。它通过在客户端和服务器之间建立一个加密的通道&#xff0c;确保数据在传输过程中不被窃取或篡改。随着互联网的普及和电子商务的快速发展&am…

边OTG边充电芯片LDR6500

随着科技的飞速发展&#xff0c;智能移动设备已成为我们生活中不可或缺的一部分。而在这些设备的连接与数据传输中&#xff0c;Type-C接口以其高效、便捷的特性逐渐占据了主导地位。OTG&#xff08;On-The-Go&#xff09;技术则进一步扩展了Type-C接口的功能&#xff0c;使得设…

uniapp 微信小程序 获取openid,手机号进行登录,配合后端

流程&#xff1a;登录注册功能,通过uni.getUserProfile获取wxcode,通过wxcode传给后端获取openid,sessionkey,unionid。 通过<u-button type"success" open-type"getPhoneNumber" getphonenumber"decryptPhoneNumber">一键登录</u-butt…

Spark-机器学习(5)分类学习之朴素贝叶斯算法

在之前的文章中&#xff0c;我们学习了回归中的逻辑回归&#xff0c;并带来简单案例&#xff0c;学习用法&#xff0c;并带来了简单案例。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵…

合合信息引领AI场景化革新,供应链金融智能化审核全面升级!

官.网地址&#xff1a;合合TextIn - 合合信息旗下OCR云服务产品 随着供给侧结构性改革的深入推进和产业结构的不断升级&#xff0c;金融机构在监管部门的指导下&#xff0c;积极拓展供应链金融业务&#xff0c;取得了显著成效。这一举措有效缓解了上下游中小企业的融资困难&a…

你的网站还在使用HTTP? 免费升级至HTTPS吧

如果您的网站还在使用老的http协议&#xff0c;可以申请一个免费的SSL证书升级至https&#xff01; 具体步骤如下&#xff1a; 1 申请免费SSL证书 根据你的需求选择合适的SSL证书类型&#xff0c;如单域名证书&#xff0c;多域名证书、通配符证书 登录免费供应商JoySSL官网&…

中电金信:深度解析|数字化营销运营体系搭建

如何更好更快地梳理好体系搭建思路&#xff0c;稳步实现落地&#xff1f;下文将为大家明确搭建的推进步骤、执行要点&#xff0c;帮助商业银行理顺数字化营销运营体系的“点”“线”“面”~ 与所有转型的曲折、阵痛等特征一样&#xff0c;商业银行构建数字化营销运营体系过程中…

数据结构与算法解题-20240426

这里写目录标题 面试题 08.04. 幂集367. 有效的完全平方数192. 统计词频747. 至少是其他数字两倍的最大数718. 最长重复子数组 面试题 08.04. 幂集 中等 幂集。编写一种方法&#xff0c;返回某集合的所有子集。集合中不包含重复的元素。 说明&#xff1a;解集不能包含重复的子…

DSP开发实战教程--EPWM模块的影子寄存器详细讲解原理和代码实例

EPWM模块影子寄存器的原理 在TI&#xff08;Texas Instruments&#xff09;的DSP28335中&#xff0c;EPWM&#xff08;Enhanced Pulse Width Modulator&#xff09;模块提供了高精度、高灵活性的PWM信号生成功能。为了能在不影响当前PWM波形输出的情况下预装载新的PWM参数&…

电源小白入门学习6——锂离子电池特性及充电电路

锂离子电池特性及充电电路 锂离子电池18650电池锂聚合物电池锂电池的放电曲线 锂离子电池充电方法常见的充电方案 锂离子电池 锂离子电池是一种常见的可充电电池类型&#xff0c;主要依靠锂离子在正极和负极之间的移动来工作。在充放电过程中&#xff0c;锂离子在两个电极之间…

表情识别 | LBP+SVM实现脸部动态特征的人脸表情识别程序(Matlab)

表情识别 | LBPSVM实现脸部动态特征的人脸表情识别程序&#xff08;Matlab&#xff09; 目录 表情识别 | LBPSVM实现脸部动态特征的人脸表情识别程序&#xff08;Matlab&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1 运行环境 程序运行在Windows系统下&am…

不同技术实现鼠标滚动图片的放大缩小

摘要&#xff1a; 最近弄PC端的需求时&#xff0c;要求在layui技术下实现鼠标滚动图片的放大缩小的功能&#xff01;下面来总结一下不同框架剩下这功能&#xff01; layui: 看了一下layui文档&#xff0c;其实这有自带的组件的&#xff01;但是又版本要求的!并且layui的官方文档…

让ThreadPoolExecutor无所遁形:Java线程池运行原理详解

ThreadPoolExecutor的核心工作原理 当我们在Java中讨论并发和多线程时&#xff0c;ThreadPoolExecutor 是不可或缺的一个类。在 java.util.concurrent 包下&#xff0c;该类负责管理线程池内的线程&#xff0c;包括线程的创建、执行、管理以及线程池的监控等。理解 ThreadPool…

玩转手机在AidLux上安装宝塔面板

AidLux&#xff0c;手机不用刷机、不用root&#xff0c;直接在手机应用市场就能下载使用。 1.4G的应用包&#xff0c;看起来挺大的&#xff0c;那是因为内嵌了一套完整的AIoT应用开发和部署平台。 不仅Android手机可以玩&#xff0c;华为的Harmony系统也可以使用。 使用它最主…

websocket爬虫

人群看板需求分析 先找到策略中心具体的数据。对应数据库中的数据 看看接口是否需要被逆向 点开消费者细分&#xff0c;可以找到人群包&#xff08;人群名称&#xff09; 点击查看透视 label字段分类: 在这里插入图片描述 预测年龄&#xff1a;tagTitle 苹果id&#x…