Nop入门: 如何创造性的扩展GraphQL

Nop平台没有使用graphql-java等常用的GraphQL开源库,而是选择从零开始实现NopGraphQL引擎。NopGraphQL引擎创造了很多崭新的实现方案,拓宽了GraphQL的应用范围,提高了GraphQL的实用性。

详细文档参见 graphql/index.md

一. 利用Fragment定义简化GraphQL查询

GraphQL要求在前端调用时指定返回的字段,对于字段比较多的情况会显得比较繁琐。此时我们可以利用GraphQL语言的Fragment功能来定义一些常用的字段集合,然后在查询时引用这些Fragment,从而简化查询。

1.1 在XMeta中增加selection定义,并以F_为前缀

Nop平台中每一个后台服务对象都有一个相关联的XMeta元数据模型文件,在其中可以通过为GraphQL类型补充元数据信息。

<meta><selections><selection id="F_defaults">userId, userName, status, relatedRoleList{ roleName}</selection></selections>
</meta>
  • 这里约定了必须用F_为前缀才是前台可以访问的Fragment定义。selection还有其他的用处。
  • 如果不配置F_defaults,它会根据GraphQL类型的所有非lazy字段自动推定。如果明确指定了,则以指定的内容为准

1.2 在前台查询时引用Fragment

使用GraphQL方式调用后台服务时可以使用Fragment

query{NopAuthUser__findList{...F_defaults, groupMappings{...F_defaults}}
}

或者使用REST方式来调用后台服务,通过@selection参数使用Fragment

/r/NopAuthUser__findList?@selection=...F_defaults,groupMappings
  • REST方式调用时,如果不传@selection参数,则等价于返回F_defaults

REST方式下的selection如果只表达到对象层级,则会自动向下展开。

二. 通过@TreeChildren指令简化树形结构查询

对于单位树、菜单树这样的树形结构的获取,NopGraphQL通过Directive机制提供了一个扩展语法,可以直接表达递归拉取数据,例如

NopAuthDept_findList{value: id,label: displayNamechildren @TreeChildren(max=5)
}
  • @TreeChildren(max=5)表示按照本层的结构最多嵌套5层。

三. Map类型

GraphQL是一种强类型的框架,它要求所有数据都有明确的类型定义,这在某些动态场景中使用时并不方便。例如有的时候我们可能需要把一个扩展集合返回到前端。

NopGraphQL引入了一个特殊的Scalar类型: Map,可以利用它来描述那些动态数据结构。例如

type QueryBean{filter: MaporderBy: [OrderFieldBean]
}

四. XMeta元数据模型

利用XMeta元数据模型可以通过配置实现很多功能。

4.1 通过mapToProp映射到已有属性

<prop name="a" mapToProp="b.a">
</prop>
  • 通过mapToProp属性可以为已有属性指定一个别名。当前台访问属性a时,实际获取的是关联对象b上的属性a

4.2 通过getter直接指定计算表达式

在NopGraphQL中可以在BizModel服务类中通过@BizLoader注解来引入动态计算的字段。

@BizModel("LoginApi")
public class LoginApiBizModelDelta {@BizLoader(autoCreateField = true, forType = LoginResult.class)@LazyLoadpublic String location(@ContextSource LoginResult result,IServiceContext context) {return "loc:" + result.getUserInfo().getUserId();}
}

对于一些轻量级的计算表达式,这种定义服务函数的方式显得有些过于复杂,此时我们可以直接在XMeta中通过getter表达式来定义

<prop name="myValue"><getter>return entity.name + 'Ext'</getter>
</prop>

4.3 字段级别的权限控制

在xmeta文件中,可以为prop指定auth设置


<prop name="xx"><auth permissions="NopAuthUser:query" roles="admin" for="read"/><auth permissions="NopAuthUser:mutation" roles="hr" for="write"/>
</prop>
  • 通过这里的配置可以实现字段级别的读写权限控制. for="read"表示控制字段读权限,for="write"控制字段写权限,而for="all"同时允许读和写
  • NopGraphQL引擎在执行实际动作之前会检查SelectionSet中每个字段的访问权限,因此不会出现执行完业务操作后才发现无权访问某个结果字段的情况。
  • 关于数据权限和关联子表的过滤条件配置,参见4-complex-query.md

4.4 自动生成数据字典文本字段

业务开发中一个非常常见的需求是将后台业务字段的值根据某个数据字典配置翻译为显示文本。在Nop平台中,XMeta模型文件在加载阶段会利用元编程机制动态判断是否配置了数据字典。
如果是,则会自动生成一个字典翻译字段。


<prop name="status"><schema type="Integer" dict="auth/user-status"/>
</prop>

经过元编程转换后实际生成如下字段定义


<prop name="status" graphql:labelProp="status_label"><schema type="Integer" dict="auth/user-status"/>
</prop>
<prop name="status_label" internal="true" graphql:dictName="auth/user-status"graphql:dictValueProp="status"><schema type="String"/>
</prop>

4.5 掩码显示

处于安全性考虑,一些敏感的用户信息不允许打印到日志文件中,返回给前台演示的时候也需要进行掩码处理,不能显示全部内容,只能显示前几位、后几位等,
例如信用卡卡号,用户的电话号码等。

通过ui:maskPattern可以指定掩码显示模式,当GraphQL返回字段值时会自动按照此模式进行处理。

<prop name="email" ui:maskPattern="3*4"></prop>
  • ui:maskPattern="3*4" 表示保留前3位以及后4位字符,其他用*来替换。

基于可逆计算理论设计的低代码平台NopPlatform已开源:

  • gitee: canonical-entropy/nop-entropy
  • github: entropy-cloud/nop-entropy
  • 开发示例:docs/tutorial/tutorial.md
  • 可逆计算原理和Nop平台介绍及答疑_哔哩哔哩_bilibili

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

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

相关文章

一个记事本(可复制源码)

htmlcssjs做了一个记事本&#xff0c;可复制源码 html <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0">…

川大华西团队发表关于早期癌症研究的综述,探索AI在预测癌症进展的应用|顶刊精析·24-11-05

小罗碎碎念 这篇文章于2024-10-21发表在《Nature Reviews Cancer》&#xff0c;是一篇关于早期癌症研究的综述文章&#xff0c;标题为《Emerging strategies to investigate the biology of early cancer》。 作者角色姓名单位名称&#xff08;中文&#xff09;第一作者Ran Zho…

AI 翻唱

本文记录用 So-vits-svc 4.1 训练模型全过程。 需要用到的工具 UVR&#xff1a;用于人声歌声分离&#xff0c;降噪。 (项目传送门) Slicer-gui(Audio-Slicer)&#xff1a;用于音频裁剪。(项目传送门) So-vits-svc 4.1&#xff1a;训练模型&#xff0c;GitHub项目中详细介绍…

讲讲⾼可用的原则?

大家好&#xff0c;我是锋哥。今天分享关于【讲讲⾼可用的原则&#xff1f;】面试题。希望对大家有帮助&#xff1b; 讲讲⾼可用的原则&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在当今信息化时代&#xff0c;随着互联网技术的快速发展&#xff0…

Java 基于SpringBoot+Vue 的公交智能化系统,附源码、文档

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Leetcode 二叉树中的最大路径和

算法思想 这道题要求在一棵二叉树中找到路径和最大的路径。路径可以从树中任意一个节点开始&#xff0c;到任意一个节点结束&#xff0c;但路径上的节点必须是连续的。 算法使用递归的方式来遍历树中的每个节点&#xff0c;并在遍历过程中计算包含当前节点的最大路径和。具体…

《2024中国城市音乐产业发展指数报告》重磅发布

11月4日,《2024中国城市音乐产业发展指数研究报告》(以下简称“报告”)在成都首次公开发布。该报告由中国音像与数字出版协会音乐产业促进工作委员会指导编制,道略产业研究院、四川音乐学院孙洪斌教授团队深度参与。 该指数评价对象涵盖直辖市、副省级城市和省会城市等共36个城…

解锁金融未来,Python带你玩转大数据!

厌倦了复杂的金融报表&#xff0c;想用数据驱动投资决策&#xff0c;却不知从何下手&#xff1f; 别担心&#xff01; 《Python金融大数据分析快速入门与案例详解》带你轻松入门&#xff0c;掌握数据分析利器&#xff0c;成为金融领域的弄潮儿&#xff01; 为什么选择这本书&…

STM32 + CubeMX + 硬件SPI + W5500 +TcpClient

这篇文章记录一下STM32W5500TCP_Client的调试过程&#xff0c;实现TCP客户端数据的接收与发送。 目录 一、W5500模块介绍二、Stm32CubeMx配置三、Keil代码编写1、添加W5500驱动代码到工程&#xff08;添加方法不赘述&#xff0c;驱动代码可以在官网找&#xff09;2、在工程中增…

template advanced

一.仿函数再探 stl_stack/queue-CSDN博客 在priority_queue中&#xff0c;我们介绍了仿函数作为第三个参数来改变堆的类型&#xff0c;而仿函数还有其他的用处。 那么我们是否可以借助优先级队列来对日期类进行排序呢&#xff1f; 答案是可以的&#xff0c;但前提是该日期…

spring源码[spring启动流程]

spring启动流程 AnnotationConfigApplicationContext的构造方法 1.父类构造方法&#xff0c;构造一个DefaultListableBeanFactory 在调用AnnotationConfigApplicationContext的构造方法之前&#xff0c;会调用父类GenericApplicationContext的无参构造方法&#xff0c;会构造…

使用Python做一个微信机器人

使用Python制作微信机器人是一个有趣且实用的项目&#xff0c;它可以让您自动化处理微信消息、监控微信群、甚至实现智能聊天等功能。 请求参数 Header 参数 export interface ApifoxModel {"X-GEWE-TOKEN": string;[property: string]: any; } Body 参数applicat…

Python-创建并调用自定义文件中的模块/函数

背景&#xff1a;在Python编程中&#xff0c;我们常常需要创建自己的专属文件&#xff0c;以便帮助我们更高效&#xff0c;快捷地完成任务。那么在Python中我们怎么创建并调用自己文件中的模块/函数呢? 在Python中调用自定义文件&#xff0c;通常是指调用自己编写的Python模块…

【C++】C++17结构化绑定、std::optional、std::variant、std::any

二十二、C17中的结构化绑定、std::optional、std::variant、std::any 本部分是一个小系列&#xff0c;介绍C17中新引入的、用来解决各种不同返回情况的、标准库新组件。 1、C的结构化绑定 结构化绑定structured bindings是C17中引入的一项特性&#xff0c;它允许开发者方便地…

ntkrnlmp.exe导致蓝屏死机的解决方法

在使用Windows操作系统的过程中&#xff0c;用户可能会遇到由ntkrnlmp.exe文件错误引发的蓝屏死机&#xff08;Blue Screen of Death, BSOD&#xff09;问题&#xff0c;这不仅影响了日常的工作效率&#xff0c;也可能造成数据丢失的风险。本文将为您提供一系列即时排查与修复n…

U3D游戏开发之骨骼动画相关

目录 1 作为U3D程序如何制作骨骼动画 2 骨骼动画程序代码相关 这个内容我在很久之前就想写了&#xff0c;很多项目也与骨骼动画挂钩&#xff0c;今天我们揭秘的是2D骨骼动画。来聊一聊大家可能非常关注的两个问题&#xff1a;作为程序如何制作骨骼动画&#xff1f;接到美术的骨…

java:题目:用Java实现简单的自取取款操作

import java.util.Scanner; public class ATM {public static void main(String[] args){//自主取款主类Scanner scnew Scanner(System.in);System.out.println("请输入账户号码&#xff1a;");String BankAccoutsrsc.nextLine();/BankAccout3 newBankAccoutnew Bank…

VLAN 高级技术 ——QinQ的配置

QinQ的概述&#xff1a; QinQ技术是一种扩展虚拟局域网&#xff08;VLAN&#xff09;数量空间的技术&#xff0c;通过在802.1Q标签报文的基础上再增加一层802.1Q的Tag来实现。以下是对QinQ技术的详细概述&#xff1a; QinQ技术的定义与背景 定义&#xff1a;QinQ&#xff08…

不得不承认供电公司信息宣传向媒体投稿的好方法找到了

初入国网供电公司,我被分配到了信息宣传部门,负责每月的信息宣传投稿任务。这项任务看似简单,实则充满挑战。一开始,我满怀热情,以为只要写出高质量的文章,就能顺利发表。然而,现实给了我当头一棒。传统的邮箱投稿方式,不仅竞争压力大,审核严格,而且周期漫长。每次投稿后,我总是…

『YOLOV5』| 一文搞定训练过程中的意外终止、以及想继续增加训练轮数!

文章目录 情况一&#xff1a;意外训练中断&#xff08;程序未训练完成&#xff0c;想完成目标训练轮数&#xff09;情况二&#xff1a;自动训练完成&#xff08;程序已完成训练&#xff0c;想增加训练轮数&#xff09; 情况一&#xff1a;意外训练中断&#xff08;程序未训练完…