wujun728 / jun_amis_lowcode

jun_amis_lowcode是基于百度amis前端低代码框架+后端SpringBoot在线接口开发平台(jun_api_online)构建的低代码开发框架。其可使用JSON 配置来生成页面(不仅仅是表单引擎),使用动态mapping及动态生成bean的方式执行SQL脚本及JVM脚本来动态生成接口。
10 stars 10 forks source link
adminlte bootstrap druid java jpa jwt mybatis mybatis-plus rocketmq shiro shiro-security spring spring-boot spring-email spring-mvc springboot ssm swagger thymeleaf

jun_api_service

jun_springboot_api_service是一个基于我另外一个自定义的starter的动态API框架。项目本身使用技术有SpringBoot+字节码生成执行+动态脚本+动态SQL可以实时动态生成RESTAPI并动态发布或者热加载。且发布后可动态执行java源码、groovy脚本及SQL脚本的API服务项目。提供在线执行动态程序脚热加载本及动态生成API并执行的功能。支持动态注册RequestMapping,动态生成类及源码并动态编译生成类并注入Spring容器生成Bean,可动态生成HTTP接口。支持在线编辑写好SQL或者Java源码、Groovy源码、Python源码(TODO),JavaScript源码(TODO)、Shell脚本,后即可快速生成Rest接口对外提供服务,同时支持服务在线热加载在线编辑替换逻辑,提供了一键生成CRUD通用接口方法,减少通用接口的SQL编写,让开发人员专注更复杂的业务逻辑实现。

说明:目前没有前端页面,都是Postman调用生成的,准备适当新增部分前端页面功能。

特征&提供

1、可在线写Java、编译Java源码生成字节码、生成对象、动态注册Bean实例;

2、可动态生成RequestMapping的Restfull接口;

3、可动态加载Groovy脚本源码、解析并执行Groovy源码;

4、支持Mybatis的XML的SQL解析,支持各种标签的SQL的解析;

5、无需硬编码,可实现任何硬编码实现的功能(在Jar包依赖范围内);

6、动态生成代码(基于Freemarker的String模板生成StringWriter),一键生成CRUD的代码及SQL接口,普通通用逻辑不用写代码;

7、如果这个项目对你有用,不妨Star一下;(没有性能问题,编译后的源码还是字节码)

说明:本项目jun_springboot_api_service依赖本人自定义starter(jun-groovy-api-spring-boot-starter)才能运行,Starter已发布中央仓库,另源码starter也已开源。

The project is based on SpringBoot+Groovy to dynamically generate APIs and publish them, and can dynamically execute Groovy scripts and SQL scripts' Staters after publication. Provide online execution of dynamic scripts class and hot loader and dynamic API generation and execution functions.

使用教程

核心api说明

// SQL源码执行(SQL脚本支持mybatis写法及原生写法) SqlMeta sqlMeta = JdbcUtil.getEngine().parse(apiSql.getSqlText(), sqlParam); Object data = JdbcUtil.executeSql(connection, sqlMeta.getSql(), sqlMeta.getJdbcParamValues()); dataList.add(data);

// Java源码执行(实现IExecutor接口,支持定制不同的接口,一般情况下也够用了) String beanName = GroovyInnerCache.getByPath(config.getPath());//请求Path映射Bean名称 Map<String, Object> params = getParams(request, config);//获取Request参数转Map IExecutor bean = SpringUtil.getBean(beanName);//调用Bean return bean.execute(params);//返回Bean结果集

//其他源码执行(使用ScriptEngineManager来执行),举例JS如下,其他的还没来得及整,TODO中 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); //向engine中存值 engine.put("str", "jsEnginePutTest"); engine.eval("var output ='' ;for (i = 0; i <= str.length; i++) { output = str.charAt(i) + output }");


# 示例

**Step1-启动的时候会读取api_config表中的记录并注册为Bean**

开始解析groovy脚本... c.g.w.e.g.core.bean.GroovyDynamicLoader : 当前groovyInfo加载完成,className-testdataresult,path-/api/test/testdataresult,beanName-testdataresult,BeanType-Class: c.g.w.e.g.core.bean.GroovyDynamicLoader : 当前groovyInfo加载完成,className-test22Bean1,path-/mobile/api/test22,beanName-test22Bean1,BeanType-Class: 结束解析groovy脚本...,耗时:1398



- **Step2,择取上面启动的两个示例:SQL示例(api_config里面插一条SQL类型的接口数据就可以了)**
### SQL开发及定义

**Step1,在数据库新增SQL接口**

![img_1.png](doc/sql1.png)

**Step2,执行SQL接口**

![img_1.png](doc/sql2.png)

**Step3、在线编辑接口及测试接口(TODO)**

![img_1.png](doc/sql3.png)

#### Java源码接口开发

**Step1,在API_CONFIG表中新增一条数据映射成下面的类的解析,SQLyog数据及类的源码展示,具体如下**

![img_2.png](doc/java1.png)
这个是接口执行类的源码:
![img_2.png](doc/java1-1.png)

**Step2,在POSTMAN中通过PATH,调用这个类,并Java源码解析后执行结果集返回的数据**

![img_2.png](doc/java2.png)

**Step3,不重启JVM,手动修改源码**(即使修改幅度非常大也没问题,只要能编译成功就可以)

![img_2.png](doc/java21.png)

**Step4,调用缓存刷新Refresh接口,重新初始化Bean及缓存**

![img_2.png](doc/java3.png)

**Step5,在POSTMAN中通过PATH,再次调用这个类,执行结果集返回的数据是最新编译的**

![img_2.png](doc/java4.png)