全栈低码开源框架 json-script-rule 配置说明

article/2025/5/3 2:38:29

说明

配置主要分为映射信息配置和spring配置文件application的配置

映射信息

映射信息通常指的是所配置的po类与映射表的相关信息,通过相关注解来获取相关的静态信息,当然这里也可以通过其它的渠道来加载这些配置信息,如数据库、xml文件等,通过框架内部提供的自定义处理器来加载这些信息,下面就接着说明如何配置一个po类,先附上一个例子

@JSRuleTable(name= "zs_test")
@Data
public class ZsTestPO {@JSRuleField(pk=true)private String id;private String name;@JSRuleField(name= " create_date ")private Date create_date;@JSRuleField(name= "birth_day")private Date birthDay;private double salary;private String remark;private Double bonus;@JSRuleField(name= "test_field",alias="sum_test_field")private String test_field;@JSRuleField(name= "sum1_salary",alias="lbv_salary")private String sumSalary;@JSRuleField(name= "qian",imports= {"qian"})private String qian;
}

@JSRuleTable(name="zs_test_son2")
public class ZsTestSon2 {@JSRuleField(pk=true)public String id;@JSRuleField(name= "zs_test_id",fk="ZsTestPO",dependent= "ZsTestPO.id")public String zs_test_id;@JSRuleField(name= "zs_test_id",fk="view.neibu.ZsTestPOView",dependent= "view.neibu.ZsTestPOView.id")public String zs_test_id2;@JSRuleField(name= "zs_test_id",fk="ZsTestPOCopy")public String zs_test_id3;@JSRuleField(name= "zs_test_son1_id",fk="ZsTestUpdate")public String zs_test_son_id;@JSRuleField(name="zs_test_son1_id",fk= "view.ZsTestView")public String zs_test_son1_id2;@JSRuleField(name= "oh_yes")public String ohYes;public String test_field_a;@JSRuleField(dependent= "ZsTestPO.name")public String name;
}
相关注解说明
  • @JSRuleTable:如果当前类是在locations路径下,那么类上必须要有这个注解
    name:所关联的数据库表的名字
    view:所关联的是一个视图,该属性需要指定一个sql语句,若指定了该属性,则name属性将会成为该sql视图的别名,若是不确定所要查询的字段都有哪些,此时可以用#符号代替具体的字段,where条件的具体值可用?符号代替,后续可在json中确定这些参数,这些将在后续的高级查询中进行详细说明,例子

@JSRuleTable(name="suibian",view="select # from zs_test_son1 where oh_no=? and id like ?")
  • @JSRuleField:当字段没有加注该注解时采用默认值,如字段名默认就是数据库表字段名
    name:所关联的数据库表的字段的名字
    pk:是否为主键字段,仅支持单主键,默认为false
    fk:表示当前字段是一个外键,需指定所要关联的类的名称
    alias:字段的别名,用于返回结果集时所最终展示的名称
    imports:使用导入插件时,指定当前字段对应导入excel时sheet中数据列头的值,这里可以是中文,也可以定义多个值,表示某一列的数据是对应当前字段的
    export:使用导出插件时,当json中未指定模板时该配置为默认的导出列头,这里的值为列头的显示值,可以是中文
    dependent:使用主子表插件时,当某一个子表的字段需要从主表的某一个字段取值时,如主外键(默认),此时这里应配置对应的某个主类的某个字段
    ignore:忽略对于当前字段的加载,默认为false

spring配置文件说明

配置文件所对应的java对象为edi.rule.config.JSRuleProperties,先上一个application的例子

edi:rule:locations: test.business.po,test.business.po2,test.business.po3#processor: test.myrule.JSRuleDBProcessor#intercepts: /asdqwe/zxc/**,/json/script/**mybatis: #showNull: truepagehelper:#dialect: mysqlpageSizeZero: truehttp: #connectTimeout: 10000readTimeout: 10000open:sql: trueengineDuration: true#replenishColumns: true#close:models: test.business.rule.model.JSRuleGetCustomModel#config:dateFormat: yyyy-MM-dd HH:mm:ss,yyyy/MM/dd HH:mm:ss#encrypt:type: sm2sm2PublicKey: 04a14dd8d62e90d5cfd7b59ce89e346e0e7def05281361f7ef47676c1e534ca85b3d88839b02e9b57b2818f46beeea4eb88a3e5abe429d0e866ddea9c8c7756f7asm2PrivateKey: 00f8d5d53f123f1a001403a27acb16b8408dff48f249b2ed7d2429b3394628bc36poi:excel:importFilterEmptyRow: true

下面是application-mysql.yml

edi:rule:database: mysql

提示:application-mysql.yml会覆盖掉application已存在的配置属性
注意:框架采用ConfigurationProperties封装配置属性,其内部结构采用多层次的内部类进行映射,如果一个类属性下的所有属性都被注释掉了,那么有可能会引发ConfigurationProperties封装报错问题导致无法启动。这时可以注释其类的本身来屏蔽掉所有属性即可,如注释掉poi或者注释掉excel都可以,而不是注释掉其内部类下的唯一属性importFilterEmptyRow,如果excel下还有其它属性,那么不会引发此问题

  • locations:映射po类的包的根路径,该配置用于对数据库表的操作,不配置该属性还可通过扩展类JSRuleDefaultExtend进行配置,3.2.4版本之后允许有多个路径,多个路径下的包名+类名应尽量避免重复,如果重复则需要写出相应的全路径类名
  • processor:自定义处理器,如果你的映射信息来自于非java的po类(如数据库、xml文件等),那么需要配置一个处理器,该属性指定处理器的位置,该处理器应当继承edi.rule.extend.classes.JSRuleInitByExtend
  • database:这里有4个属性,分别是postgresql、mysql、oracle,kingbase,根据自己数据库的类型对应选择即可,默认为mysql
  • intercept:json rule拦截器路径配置,该配置用于拦截json rule的请求,将请求的json初始化成JSBody对象参数并放入threadLocal中,它默认与请求框架控制器中的路径是一致的,因此在不自定义控制器的情况下是不需要配置的
  • open.sql:是否打印框架内部查询功能拼装的最终sql语句到日志中,默认是不打印的,通常用于调试,也可以使用mybatis内置的sql打印功能,不相冲突
  • open.superProp:当po类继承父类时是否加载po类的继承属性,默认为false
  • open.engineDuration:是否开启执行时间计算,默认为false,打开后会在返回结果的log中展示此次请求耗费的时间(毫秒)
  • open.replenishColumns:默认为false,这个配置只针对mysql数据库,它表示是否补全空的列为null值,mysql批量插入时如果数据一和数据二的列数不一致,则将会导致数据库报错,这里如果配置为true则会保证数据列的一致性,缺失的列会以null的形式注入。如果传输到后端的每一条数据都能够保证数据列数一致,那么这里就可以节约一定的资源消耗,否则将注意该属性的配置
  • close.engineController:是否关闭内置Controller,默认是开启的,该Controller用于接受并处理前端json请求,通常在自定义Controller后可关闭此默认的内置Controller
  • close.models:禁用某些插件,如内置的查询插件edi.rule.model.JSRuleGet,需写全类名,多个用逗号进行分割,如下

edi:rule:close:models: test.business.rule.model.JSRuleGetCustomModel,edi.rule.model.JSRuleGet
  • config.dateFormat:用于配置日期格式,凡是日期格式的字符串会在后端自动转化为日期类型进行处理,这包括插入数据时,查询日期区间时,以及断言里判断时间范围等,配置多个日期格式时需用逗号分割开,未配置时则采用默认格式,系统默认日期格式如下

dateFormat: yyyy-MM-dd,yyyy-MM-dd HH:mm:ss
  • http.engineControllerUrl:用于配置远程请求时对方的引擎地址,没有start和end后缀,如

http://ip:port/context-path/json/script
  • http.connectTimeout:连接超时配置,参考SimpleClientHttpRequestFactory
  • http.readTimeout:读取超时配置,参考SimpleClientHttpRequestFactory
  • mybatis.showNull:json rule框架mybatis的设置,它与开发者实际项目中的mybatis完全分离,showNull属性对应的是mybatis的CallSettersOnNulls属性,意思为如果列为null是否返回
  • mybatis.pagehelper:这里配置的就是pagehelper的属性,它在mybatis下,同样与开发者实际项目中的pagehelper完全分离,配置属性互不影响
  • poi.excel.importFilterEmptyRow:导入时是否启用过滤器,默认为false,目前过滤器只做了空行的过滤,也就是当你使用excel进行导入的时候,如果有空行,那么就会跳过这一行不进行导入动作,但有些特殊场景所插入的数据有可能存在空行,因此需要区别对待
  • encrypt:加密处理,目前框架只支持国密非对称加密sm2,所以此处暂时只能写sm2,相对于国际标准的sha等sm2有更高的效率,更强的加密性,sm2也是国家推荐的加密方式,适用于很多国企项目。底层实现逻辑基于hutool工具,如果不配置则不使用加密,接下来用一个完整的示例顺便把如何加密解密也一起展示了,java代码如下:

  public static void main(String[] args) throws Exception {String publicKey = "04a14dd8d62e90d5cfd7b59ce89e346e0e7def05281361f7ef47676c1e534ca85b3d88839b02e9b57b2818f46beeea4eb88a3e5abe429d0e866ddea9c8c7756f7a";String privateKey = "00f8d5d53f123f1a001403a27acb16b8408dff48f249b2ed7d2429b3394628bc36";ZSEncrypt.initSM2(publicKey, privateKey);String text = "{\r\n" + "   \"rule\":{\r\n" + "       \"actions\":[\r\n" + "           {\r\n" + "               \"name\": \"delete\",\r\n" + "               \"delete\":{\r\n" + "                   \"class\":\"ZsTestPO\",\r\n" + "                    \"matches\": {\r\n" + "                        \"equal\": {\r\n" + "                            \"test_field\": [\"ppp\"]\r\n" + "                        }\r\n" + "                    }\r\n" + "               }\r\n" + "           }\r\n" + "       ]\r\n" + "   }\r\n" + "}";String encrypt = ZSEncrypt.sm2Encrypt(text);System.out.println(encrypt);System.out.println(ZSEncrypt.sm2Decrypt(encrypt));
}

ZSEncrypt位置在edi.rule.util包下,是一个工具类,如上代码所示,publicKey和privateKey可以通过ZSEncrypt类打印出来,代码片段如下:

  public static void printSM2Key() {log.info("pubQKeyStr="+SM2Param.pubQKeyStr);log.info("prvDKeyStr="+SM2Param.prvDKeyStr);}private static class SM2Param {private static SM2 sm2;private static String pubQKeyStr;private static String prvDKeyStr;static {sm2 = SmUtil.sm2();sm2.setMode(SM2Engine.Mode.C1C3C2);pubQKeyStr = HexUtil.encodeHexStr(((BCECPublicKey) sm2.getPublicKey()).getQ().getEncoded(false));prvDKeyStr = HexUtil.encodeHexStr(BCUtil.encodeECPrivateKey(sm2.getPrivateKey()));}}

上面的publicKey和privateKey是生成出来后写入到配置文件中的,也就是我在最上面展示的配置文件中的sm2PublicKey属性和sm2PrivateKey属性。接下来是初始化对象,通过publicKey和privateKey调用ZSEncrypt.initSM2(publicKey, privateKey),然后是将上一篇的json的delete指令直接复制粘贴过来,通过ZSEncrypt.sm2Encrypt(text)进行加密打印,最后再将解密的文本打印出来,结果如下所示:

04CC788580480F26FAF1A84F759715AC586514CB448C970CACDB0F5364F77E9B0FD2AC8441AD15AD277AC376FF50A41B9B256232F4882840D628B024F805674E700354A85CB995F2769480A60B424050550368C21789C3BF373D3FE6054ACEE81ED2B5ACD5214AEE1BB420759FD16643EFFB6212293FA117515BA4963EDF97269FF1BA14AABBC8E486E327227F1F9EA1C17C0A88676AF946C50F873B47D337D430777981E6A5C2430A34D875B99705B07F66987FA26D212A3BCE7BF75754346010926AA80CEBCA538256631BCB3ACCF236E666FC5B0D96FAB2E33485CF1D3F7F801E0C36BE3775671FBE52382938BDA2F3265D02A430BA02357E7A0DC3F41DE01BEB09A158601BFBF94BBD52FE486C1A6C8193721C71E4FF81D26D1AA7677890FA0D7907A46EA6489DDFD6249DB2F9A111BE3EA1A34E908D626AC64DA7FD18547218EFEE9FBADFD2ADDE8901D35FD7C717FA0443F4710E7F6EAECF83D4418633C7FFDC596289300B79A6009671986F30F6AC4EDA47192ECC4F5E03000458117FBAEE35F97ACB17
{"rule":{"actions":[{"name": "delete","delete":{"class":"ZsTestPO","matches": {"equal": {"test_field": ["ppp"]}}}}]}
}

接下来我们把配置放开,重新启动,可以看到多了两行日志,sm2PublicKey和sm2PrivateKey,接下来我们将刚刚在main函数中打印出来的密文粘贴到postman中,如图所示

加密.png

这时点击发送,最终产生的sql与先前的delete一样


总结:关于可配置的项后续版本的更新中会逐步增加,至于有哪些可以配置的,可参考上面提到的edi.rule.config.JSRuleProperties这个类。

 


http://chatgpt.dhexx.cn/article/pwtO227V.shtml

相关文章

全栈低码开源框架 json-script-rule 导入

说明 导入功能是将带有数据的excel文件上传后再通过程序导入到数据库&#xff0c;创建模型如下 Data public class JSRuleImport<A extends JSRuleAction<A>> implements IJSRuleActionModel<A>{/*** <p>导入excel对象&#xff0c;别名e* */JsonAlias…

Vue3 —— to 全家桶及源码学习

该文章是在学习 小满vue3 课程的随堂记录示例均采用 <script setup>&#xff0c;且包含 typescript 的基础用法 前言 本篇主要学习几个 api 及相关源码&#xff1a; toReftoRefstoRaw 一、toRef toRef(reactiveObj, key) 接收两个参数&#xff0c;第一个是 响应式对象…

vue框架安装mock

mock是&#xff1a;通过随机数据,模拟各种场景。 开发无侵入 不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响应数据。 用法简单 符合直觉的接口。 1、安装mock前先安装axios请求 &#xff1a;** npm install axios --save** 安装成功axios的链接&#xff1a; 2、安装mo…

【甄选靶场】Vulnhub百个项目渗透——项目十六:FristiLeaks_1.3(文件上传,py脚本改写,sudo提权,脏牛提权,源码获取)

Vulnhub百个项目渗透 Vulnhub百个项目渗透——项目十六&#xff1a;FristiLeaks_1.3&#xff08;文件上传&#xff0c;py脚本改写&#xff0c;sudo提权&#xff0c;脏牛提权&#xff0c;源码获取&#xff09; 靶场地址 &#x1f525;系列专栏&#xff1a;Vulnhub百个项目渗透…

vue全家桶——vuex

本文主要介绍vuex【状态管理模式】&#xff0c;在介绍vuex前&#xff0c;需要重点说下一些概念 vue最大的特点之一。数据驱动视图&#xff0c;可以吧数据理解成状态&#xff0c;视图-view可以理解成用户看到的页面&#xff0c;页面是动态变化的&#xff0c;而这个变化必须是有…

博客园滑块验证码破解

极验最初的滑块验证码是两张图&#xff0c;首先出现的是原图&#xff0c;点一下出现凹槽&#xff0c;然后拖动滑块进去&#xff0c;注意拖拽速度就可以破解成功。 原理&#xff1a; 分别遍历扫描原图和有凹槽的图片像素&#xff0c;进行对比&#xff0c;像素不一致的位置就是凹…

尚硅谷Vue2.0+Vue3.0全套教程视频笔记 + 代码 [P001-050]

视频链接&#xff1a;尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通_哔哩哔哩_bilibili P1-50&#xff1a;当前页面。 P51-100&#xff1a;尚硅谷Vue2.0Vue3.0全套教程视频笔记 代码 [P051-100]_小白桶子的博客-CSDN博客 P101-135&#xff1a;尚硅谷Vue2.0Vue3.0全套教程视…

【Vue】Mock.js的使用教程,入门级(附代码和案例)

Mock.js的使用&#xff08;附代码和案例&#xff09; 1、什么是mockjs 生成随机数据&#xff0c;拦截Ajax请求 了解一项技术&#xff0c;官网当然要知道 Mock.js 官网 2、程序 前端&#xff1a;访问后端接口&#xff0c;展示数据后端&#xff1a;后端负责业务逻辑&#xff0c…

YDOOK:vue3.0: vue-cli4.5: 引入 Element PLUS 的正确方法 Vue-cli4.5 引入 element+ plus

YDOOK&#xff1a;vue3.0: vue-cli4.5: 引入 Element PLUS 的正确方法 Vue-cli4.5 引入 element plus 1. 官网的指导安装使用方式尚未更新&#xff0c;显示的是&#xff1a; 2. 如果使用的是 npm 安装, 输入的代码为&#xff1a; npm install element-plus --save大陆建议使用…

使用Xposed对软件进行破解

入门 去AS里面新建一个NoActivity项目&#xff0c;最好把minimum版本调小 <!-- 加载Xposed模块--><meta-dataandroid:name"xposedmodule"android:value"true" /> <!-- 模块描述--><meta-dataandroid:name"xpose…

破解root密码精简版

破解root密码精简版&#xff1a; 1、重启虚拟机 2、在linux16末尾加上 rd.break,ctrlx执行 3、mount -o remount,rw /sysroot 把根以读写的方式挂载 挂在系统的根sysroot 4、chroot /sysroot 5、passwd root 6、输入新密码&#xff1a; 7、确认密码 8、touch /.autorelabel 标…

【word论文排版教程4】样式的应用

【word论文排版教程4】样式的应用 在使用样式处选择相应样式&#xff0c;同样可以使用之前设置的快捷键 标题比较长&#xff0c;使用软回车进行换行

【word论文排版教程2】论文章节安排及分节

【word论文排版教程2】论文章节安排及分节 论文章节可分为如下8个章节&#xff1a; 封面 中文摘要 英文摘要 目录 正文 参考文献 附录 致谢 输入封面&#xff0c;添加分解符 添加分解符效果 同样方法为其它章节添加分解符。

【word论文排版教程1】页面设置

【word论文排版教程1】页面设置 页面设置要求如下&#xff1a; 页面格式&#xff1a;纸张A4&#xff0c;上2.6cm&#xff0c;下2.6cm&#xff0c;左2.5cm&#xff0c;右2cm&#xff0c;装订线位置左侧&#xff0c;装订线0cm&#xff0c;无文档网格 页面布局->页面设置

毕业必备!推荐收藏的学位论文排版教程(word完整版)

本文将介绍学位论文的页面布局&#xff0c;标题格式&#xff0c;文档生成列表&#xff0c;插入公式&#xff0c;页眉页脚&#xff0c;生成目录、表格和图片的交叉引用、插入参考文献、英语翻译校对等内容和技巧&#xff0c;学习内容偏多&#xff0c;同学们可以先收藏下来&#…

毕业论文word文档排版教程(动图的方式演示,针对wps)

很久之前写好的文章&#xff0c;不知不觉毕业了那么久了 目录 1 常用快捷键 2 显示全部格式标记 3 因有手动换行符无法实现首行缩进 4 利用表格制作矩阵 5 因有英文(代码)和中文而导致空隙过大 6 设置页码和目录 xx 参考文献自动编号并更新文章中的序号 xxx 页…

Latex基本使用:论文排版

文章目录 前言一、参考文献引用二、插入符号1.插入希腊字母2.插入符号 三、插入公式三、插入图片总结 前言 记录使用Latex排版论文的方法。 一、参考文献引用 引用参考文献使用的是bib文件&#xff0c;首先在tex文件所在目录下新建txt文件&#xff0c;修改后缀为bib。 在谷歌…

texlive2020 + vscode 论文排版教程

这是我准备公开的第二篇技术博客&#xff0c;之前也写过一些简单的&#xff08;拿不出手的&#xff09;博文&#xff0c;但一直没信心公开&#xff0c;不过最后觉得也没啥&#xff0c;大家可以交流嘛&#xff0c;万一你写的有错&#xff0c;有好心人看见了指出的话那也是极好的…

毕业论文排版教程(word)桂林电子科技大学

摘要&#xff1a;满心欢喜地给导数发去初稿&#xff0c;换来了一句“格式乱起八糟”&#xff0c;你是否还在为论文排版而苦不堪言&#xff0c;认真看完这份教程&#xff0c;让你轻松搞定毕业论文排版。 毕业论文排版教程&#xff08;word&#xff09;桂林电子科技大学 样式图片…

【word论文排版教程3】制作样式和列表

【word论文排版教程3】制作样式和列表 一级标题&#xff1a;黑体小二&#xff0c;居中&#xff0c;行距“固定值:20磅”&#xff0c;段前、段后均1行。 二级标题&#xff1a;黑体小三&#xff0c;无缩进&#xff0c;行距“固定值:20磅”&#xff0c;段前、段后均0.5行。 三级及…