diff --git a/README.md b/README.md index ebc01c885aa31628b42a994eaf7cf4ae5434711c..221b6f21708146a61e0176d5b1e4e2776d331d05 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,22 @@ # data-factory #### 介绍 -为大规模微服务构建而创建的业务模拟数据生成平台,属于天画项目中的基础产品 -天画项目链接:https://gitee.com/sky-painting。 -data-factory 平台对各个相关服务领域的数据源进行聚合,同时基于业务模型帮助构建大规模大数据量的仿真业务数据。 -致力于在分布式微服务等架构落地的同时提供真正的高并发大数据量的实战数据环境。 - -#### 软件架构 +为大规模微服务构建而创建的业务模拟数据生成平台,属于天画项目中的基础产品。本项目依托于API管理和领域模型管理对 +数据模拟和数据mock功能做深度实现和扩展。力图提供一个通用的数据构建和使用平台,本项目也顺带实现了API管理,模型管理的功能。 +所以在此项目中进行集中管理比较有利于发挥企业数据模型的价值,为研发效能和企业提供一定竞争力。 + +适用于如下场景: +1. 支持API First 理念,提供web界面和plantUML导入的方式管理API(HTTP,REST,DUBBO) +2. 提供业务领域模型驱动,数据表结构模型驱动管理可视化功能(plantUML,web界面) +3. 平台对各个相关服务领域的数据源进行聚合,同时基于业务模型帮助构建大规模大数据量的仿真业务数据。 +4. 在分布式微服务等架构落地的同时提供真正的高并发大数据量的实战数据环境 +5. 基于前后端接口数据协议进行数据mock,包括返回值和入参模型 +6. 基于业务数据模型构建大数据平台所需的大量仿真数据 +7. 在线接口调试,将构建的数据直接与微服务的接口进行绑定调试 +8. 为测试平台提供mock数据,比如联调期间mock下游依赖或者写单元测试的时候动态mock下游依赖 + + +#### 软件架构-1.0 1. 功能架构图 ![image](doc/img/天画-数据工厂平台.png) 2. 数据模型图 @@ -17,40 +27,99 @@ data-factory 平台对各个相关服务领域的数据源进行聚合,同时 5. 应用架构图 ![image](doc/img/天画-数据工厂项目功能架构图.png) +#### 软件架构-2.0 +1. 技术架构 +![image](doc/img/数据工厂2.0技术架构.png) +2. 应用架构 +![image](doc/img/数据工厂2.0应用架构图.png) + +#### 安装教程(2.0) +1. 克隆本项目到工作空间 +2. 通过doc/sql/datafactory-db2.0.sql 文件中的sql脚本初始化 +3. 克隆https://gitee.com/codergit.com/javautils 工具类,并install coderman-utils(1.0.5版本) +4. 修改start-local项目中的application.properties的数据库链接配置 +5. 后端项目启动: start-local Application springboot应用 +6. 前端项目启动(需要安装nodejs): 在cmd或者终端下到/webmanager目录,输入node server启动前端,访问链接:http://localhost:3000 + +#### 界面展示 +1. 首页 +![image](doc/img/web/首页1.png) -#### 安装教程 +2. API界面 +![image](doc/img/web/api界面.png) -1. 通过sql文件中的sql脚本初始化 -2. 克隆本项目,并搭建本地nacos集群,进行服务注册调试 -3. 克隆https://gitee.com/codergit.com/javautils 工具类,并install coderman-utils -4. 运行api工程中的DataSourceControllerTest,DataFactoryControllerTest 测试服务即可看到随机数据 +3. 业务模型管理 +![image](doc/img/web/业务模型.png) -#### 使用api +4. 表模型管理 +![image](doc/img/web/表模型管理.png) -1. /data/source/regist 注册数据源 -2. /datafactory/generate/simple 构建简单数据源 -3. xxxx +5. 数据源管理 +![image](doc/img/web/数据源管理.png) +6. 接口出参mock +![image](doc/img/web/接口出参mock.png) -#### 使用场景 +6. 模型后缀配置 +![image](doc/img/web/模型后缀配置.png) -1. xxxx -2. xxxx -3. xxxx +#### 重点api(2.0) -#### 内置数据源列表 +1. 前后端接口联调时接口的数据mock返回: http://localhost:8090/apimock?apiSign=&successData= +2. api接口入参mock: http://localhost:8090/api/reqmock +3. api接口出参mock: http://localhost:8090/api/respmock + + +#### 内置数据源列表(2.0) ##### BankFunction 银行卡号生成 + ##### CardNumberFunction 身份证号生成 + ##### PinYinFunction 汉字转拼音,提取首字母 -##### UserFunction -电话,随机数,日期,姓名 + +##### RandomNumFunc +随机N位整数 + +##### RandomFloatFunc/RandomDoubleFunc +随机浮点数 + +##### TelPhoneFunc +电话 + +##### TelPhoneFunc +邮箱 + +##### ChineseNameFunc +中文姓名(内置数据文件) + ##### PassWordFunction 随机N位密码 +##### UUidFunc +uuid + +##### SnowflakeIdFunc +snowflakeId + +##### CurrentTimeFunc +当前时间戳 + +##### DateFunc +日期(年月日) + +##### DateTimeFunc +时间(年月日 时分秒) + +##### CommentFunc +一段评论(内置数据文件) + +##### OneEnWordFunc +随机英文名单词(内置数据文件) + #### 函数式客户端开发架构 @@ -58,16 +127,22 @@ data-factory 平台对各个相关服务领域的数据源进行聚合,同时 将内置函数实现与内置随机数据文件迁移到client工程,core工程只通过接口依赖client端函数和实现 因此core的迭代和开发不受随机函数的迭代开发影响。随机函数在客户端可以通过下面的步骤进行开发并可快速集成到core中 client端无需感知core端变化,因此服务设计上更加灵活。同时通过接口和门面模式将client与core进行隔离,达到高内聚低耦合的特性。 -##### 二次开发步骤 -1. 在datafactory-client工程中的InnerDataSourceCode定义 -唯一的内置数据源dataSourceCode. -2. 在FileDataEnums增加文件名,描述枚举 -3. 在resources/defaultfactory中增加内置数据源文件.txt -4. 实现com.coderman.tianhua.datafactory.client.function.Function接口,这里可以单独做单元测试 -5. 在接口实现类的随机数据方法上增加DataSourceFunction注解,标注对应的新增的内置数据源 -6. 启动nacos服务,并在datafactory-api中编写单元测试,引入该新增的内置数据源 -7. 测试新增的内置数据源函数是否正常在整个数据构建中生效 - +##### 二次开发场景 +>这里的开发场景有三种,方便集成不同场景形态的数据源内容 +1. 针对于内置函数 + 类似于随机数,时间函数等都相当于无中生有的数据内容。二次开发步骤如下: + 1. 定义数据源编码 + 2. 实现client模块中的Function接口 + 3. 通过web页面注册到数据源中 +2. 针对于文件类的内置函数 + 类似于中国的百家姓和名称,通过数据文件提供数据源。二次开发步骤如下: + 1. 定义数据源编码,文件名 + 2. 实现client模块中的Function接口 + 3. 实现InnerParseService接口解析文件内容 + 4. 通过web页面注册到数据源中 + +4. 把指定的文件当做一种数据源,按照一定格式解析后可以被使用 + 此类场景适用于文件是多个属性的,类似于特定的数据集,目前没完全开发完。 #### 版本发布 @@ -80,6 +155,22 @@ client端无需感知core端变化,因此服务设计上更加灵活。同时 5. 生成随机数据的核心功能完成 6. 生成数据的依赖数据源全面打通(自定义数据源,NACOS,内置数据源,spring boot api) +##### 2.0.0-SNAPSHOT +本次发版在1.0的基础上进行全面升级,主要内容如下: +1. 支持将dubbo 查询api作为数据源接入 +2. 支持将springboot,cloud数据源接入 +3. 代码重构,支持复杂数据模型和大批量数据生成 +4. 基于百度Amis前端低代码框架,增加可视化管理界面 +5. 支持自定义数据集加载(数据加载,数据属性绑定,大文件映射,excel加载,txt加载,json加载) +6. 调整工程模块,适应项目需求 +7. 管理api模型,领域模型,数据库模型,数据库表字段,实现生命周期全管理 +8. 使用field DSL Rule支持复杂对象参数和模型,返回结果的构建 +9. 实现http接口,dubbo接口,service方法的返回参数和入参模型的数据mock +10. 相对1.0版本来说增加了几个常用的内置数据源 +11. 支持复杂对象关联数据生成 + + + #### 参与贡献 1. Fork 本仓库 diff --git a/TODOLIST.md b/TODOLIST.md new file mode 100644 index 0000000000000000000000000000000000000000..5cbc6b55e9020fde4840fed38dc17de11b7aa1f7 --- /dev/null +++ b/TODOLIST.md @@ -0,0 +1,45 @@ +### 2.0.0 交付内容 +1. 支持dubbo服务数据源接入(down) +2. 支持springboot,cloud数据源接入 +3. 优化数据生成速度目前本地测(100条10个字段的模型大概2-3秒)(down) +4. 增加可视化界面配置(down) +5. 支持自定义数据集加载(数据加载,数据属性绑定,大文件映射,excel加载,txt加载,json加载)(down) +6. 调整工程模块(down) +7. 管理api模型,领域模型,数据库模型,数据库表字段,实现生命周期全管理(down) +8. 支持复杂对象参数和模型,返回结果的构建,field dsl rule(数组,图,集合)(down) +9. 实现http接口,返回接口的mock数据(入参为接口签名)(down) +10. 丰富数据源(增加相对常见的数据构建函数)(down) +11. 支持复杂对象关联数据生成(down) + +### 2.1.0 交付内容 +1. 支持构建的数据返回sql,excel,json的数据文本 +2. 基于消息的数据生成(将生成的数据直接通过restTemplate调用远程接口插入,dubbo远程调用),使用SPI+MQ+独立模块的方案 +3. 大数据量异步任务的方式数据生成,使用xxl-job的方案 +4. 开发dubbo接口,为测试平台提供调用接口 +5. 数据统计(支持项目统计,Api统计,参数模型统计,表字段统计,数据构建统计) +6. 对接网关进行数据mock(与测试平台进行同步) +7. client模块独立部署(构建api调用数据工厂远程平台) +8. 实现dubbo接口,返回接口的mock数据(入参为接口签名) +9. 支持多个注册中心,进行服务数据调用(主要spring cloud技术栈) +10. 支持导出各个模型的plantuml文档 +11. 释放kv常量数据配置的能力 +12. 支持随机数据使用加密算法加密 +13. 支持属性间的脚本计算解析 +14. 支持jsonstr的构建特性 +15. 支持属性是枚举数据映射(如xxxType的值指定好之后根据枚举映射关系找到xxxTypeDesc) + +### 2.3.0 交付内容 data-connector +1. 支持生成SQL Insert语句同步到数据库(优先Mysql) +2. 支持生成数据同步到消息中间件(kafka,plusar,rocketmq,es) +3. 支持生成接口入参并调用对应服务(springboot,http,dubbo) + + + +数据工厂的服务职责: +1.对数据源进行管理 +2.快速根据接口模型构建仿真数据 +3.管理api模型,领域模型,数据库模型,数据库表字段模型 +4.将模型参数与api(包括对外接口,服务内部接口和方法)和数据源进行挂钩 +5.统一管理枚举,常量,配置项列表 +6.构建常见数据源(姓名,电话号码) + diff --git a/datafactory-api/pom.xml b/adapter/pom.xml similarity index 55% rename from datafactory-api/pom.xml rename to adapter/pom.xml index 8ac73ded62a064793f8d98970ff8dc460970ea86..5f2b430fe36987700478ce1331022a2e9890f3e2 100644 --- a/datafactory-api/pom.xml +++ b/adapter/pom.xml @@ -4,47 +4,26 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.coderman.tianhua.datafactory - datafactory-api - 1.0.0-SNAPSHOT - org.springframework.boot - spring-boot-starter-parent - 2.1.8.RELEASE - + com.tianhua.datafactory + datafactory-parent + 2.0.0-SNAPSHOT - datafactory-api + + + com.tianhua.datafactory + adapter + 2.0.0-SNAPSHOT + + + adapter http://www.example.com 1.8 - - - - org.springframework.cloud - spring-cloud-dependencies - Greenwich.SR3 - pom - import - - - org.springframework.boot - spring-boot-dependencies - 2.1.8.RELEASE - pom - import - - - com.alibaba.cloud - spring-cloud-alibaba-dependencies - 2.1.0.RELEASE - pom - import - - - + @@ -56,22 +35,12 @@ org.springframework.boot spring-boot-starter-web - - org.springframework.boot - spring-boot-starter-freemarker - org.springframework.boot spring-boot-configuration-processor - - org.mybatis.spring.boot - mybatis-spring-boot-starter - 1.3.2 - - junit junit @@ -79,23 +48,11 @@ test - - org.mybatis.spring.boot - mybatis-spring-boot-starter-test - 1.3.2 - - - - commons-io - commons-io - 2.7 - com.google.guava guava - 29.0-jre @@ -104,12 +61,7 @@ 4.0.1 - - - org.mybatis - mybatis - 3.4.1 - + com.alibaba @@ -118,31 +70,17 @@ - - - org.mybatis - mybatis-spring - 1.3.0 - - com.alibaba fastjson - 1.2.61 org.apache.commons commons-collections4 - 4.3 - - mysql - mysql-connector-java - 8.0.11 - org.slf4j slf4j-api @@ -150,23 +88,17 @@ compile - - org.freemarker - freemarker-gae - 2.3.26-incubating - - cglib cglib - 3.2.6 org.apache.commons commons-lang3 - 3.10 + 3.8.1 + org.springframework spring-test @@ -186,18 +118,35 @@ com.coderman.utils coderman-utils - 1.0.3-SNAPSHOT + org.projectlombok lombok - com.coderman.tianhua.datafactory - datafactory-core - 1.0.0-SNAPSHOT + com.tianhua.datafactory + app + 2.0.0-SNAPSHOT + + + org.springframework + spring-aop + + + + org.aspectj + aspectjrt + 1.6.12 + + + org.aspectj + aspectjweaver + 1.6.12 + + @@ -206,6 +155,14 @@ org.springframework.boot spring-boot-maven-plugin + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + diff --git a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/Application.java b/adapter/src/main/java/com/tianhua/datafactory/Application.java similarity index 80% rename from datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/Application.java rename to adapter/src/main/java/com/tianhua/datafactory/Application.java index 2448a65f817eabbd03416341ffd43e237296622c..e51f104f2e75846f26809fa8581aefd07ddf0a07 100644 --- a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/Application.java +++ b/adapter/src/main/java/com/tianhua/datafactory/Application.java @@ -1,10 +1,10 @@ -package com.coderman.tianhua.datafactory.api; +/* +package com.tianhua.datafactory; import com.coderman.utils.bean.CglibConvertService; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; @@ -12,16 +12,18 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.web.client.RestTemplate; +*/ /** * @Description:应用启动入口 * @Author:fanchunshuai * @CreateTime:2020-12-02 23:07:13 * @version v1.0 -*/ +*//* + @SpringBootApplication @EnableDiscoveryClient -@ComponentScan({"com.coderman.**","com.alibaba.nacos"}) -@MapperScan(value = "com.coderman.tianhua.datafactory.core.mapper") +@ComponentScan({"com.tianhua.**","com.alibaba.nacos"}) +@MapperScan(value = "com.tianhua.datafactory.core.mapper") public class Application { @Bean @@ -40,3 +42,4 @@ public class Application { } } +*/ diff --git a/adapter/src/main/java/com/tianhua/datafactory/advisor/ControllerAdvisor.java b/adapter/src/main/java/com/tianhua/datafactory/advisor/ControllerAdvisor.java new file mode 100644 index 0000000000000000000000000000000000000000..dde2f687d8cae02e8863fc39d57a82e7fd149071 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/advisor/ControllerAdvisor.java @@ -0,0 +1,49 @@ +package com.tianhua.datafactory.advisor; + + +import com.alibaba.fastjson.JSON; +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.vo.ResultAmisVO; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + + +@Component +@Aspect +@Slf4j +public class ControllerAdvisor { + @Around(value = "execution( public * com.tianhua.datafactory.controller.admin..*(..))") + public Object transferException(ProceedingJoinPoint joinPoint) { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + try { + log.info("{}.{} param:{}", method.getDeclaringClass().getName(), method.getName(), JSON.toJSONString(joinPoint.getArgs())); + Object result = joinPoint.proceed(); + log.info("{}.{} result:{}", method.getDeclaringClass().getName(), method.getName(), JSON.toJSONString(result)); + return result; + } catch (Throwable exception) { + if (!method.getReturnType().getName().equals(ResultDataDto.class.getName())) { + log.error("sdfadsfadsfasdfxxx........."); + } + log.warn("{}.{} throw exception:{}", method.getDeclaringClass().getName(), method.getName(), exception); + String msg = "未知错误"; + if (StringUtils.isNotBlank(exception.getMessage())) { + msg = exception.getMessage(); + } + ResultAmisVO resultAmisVO = new ResultAmisVO<>(); + resultAmisVO.setStatus(-1); + resultAmisVO.setMsg(msg); + resultAmisVO.setCode("500"); + log.warn("resultAmisVO = {}", JSON.toJSONString(resultAmisVO)); + + return resultAmisVO; + } + } +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/BaseController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/BaseController.java new file mode 100644 index 0000000000000000000000000000000000000000..5590762231b458e644b467ee3bc970532923deff --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/controller/BaseController.java @@ -0,0 +1,176 @@ +package com.tianhua.datafactory.controller; + +import com.tianhua.datafactory.domain.enums.ApiTypeEnum; +import com.tianhua.datafactory.vo.OptionsVO; +import com.tianhua.datafactory.vo.datasource.DataSourceVO; +import com.tianhua.datafactory.vo.model.FieldVO; +import com.tianhua.datafactory.vo.model.ModelSuffixConfigVO; +import com.tianhua.datafactory.vo.model.ParamModelVO; +import com.tianhua.datafactory.vo.project.ApiVO; +import com.tianhua.datafactory.vo.project.ProjectVO; +import org.apache.commons.collections.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Set; + +/** +* @Description:控制层基础父类 +* @Author:fanchunshuai +* @CreateTime:2020-12-02 23:07:13 +* @version v1.0 +*/ +public class BaseController{ + + protected Logger logger = LoggerFactory.getLogger(this.getClass()); + + + /** + * 包装option适配amis框架 + * @param projectConfigVOList + * @return + */ + public OptionsVO wrapperProject(List projectConfigVOList){ + OptionsVO optionsVO = new OptionsVO(); + if(CollectionUtils.isEmpty(projectConfigVOList)){ + return optionsVO; + } + projectConfigVOList.stream().forEach(projectConfigVO -> { + optionsVO.addOptionItem(projectConfigVO.getProjectDesc(), projectConfigVO.getProjectCode()); + }); + return optionsVO; + } + + + + /** + * 包装option适配amis框架 + * @param dbNameSet + * @return + */ + public OptionsVO wrapperDbNameList(Set dbNameSet){ + OptionsVO optionsVO = new OptionsVO(); + if(CollectionUtils.isEmpty(dbNameSet)){ + return optionsVO; + } + dbNameSet.stream().forEach(dbName -> optionsVO.addOptionItem(dbName, dbName)); + return optionsVO; + } + + /** + * 包装option适配amis框架 + * @param modelSuffixConfigVOList + * @return + */ + public OptionsVO wrapperModelSuffix(List modelSuffixConfigVOList){ + OptionsVO optionsVO = new OptionsVO(); + if(CollectionUtils.isEmpty(modelSuffixConfigVOList)){ + return optionsVO; + } + modelSuffixConfigVOList.stream().forEach(modelSuffixConfigVO -> { + optionsVO.addOptionItem(modelSuffixConfigVO.getSuffix(), modelSuffixConfigVO.getSuffix()); + }); + return optionsVO; + } + + + + /** + * 包装option适配amis框架 + * @param dataSourceVOList + * @return + */ + public OptionsVO wrapperDataSource(List dataSourceVOList){ + OptionsVO optionsVO = new OptionsVO(); + if(CollectionUtils.isEmpty(dataSourceVOList)){ + return optionsVO; + } + dataSourceVOList.stream().forEach(dataSourceVO -> { + optionsVO.addOptionItem(dataSourceVO.getSourceName(), dataSourceVO.getSourceCode()); + }); + return optionsVO; + } + + + /** + * 包装option适配amis框架 + * @param paramModelVOList + * @return + */ + public OptionsVO wrapperParamModel(List paramModelVOList){ + OptionsVO optionsVO = new OptionsVO(); + if(CollectionUtils.isEmpty(paramModelVOList)){ + return optionsVO; + } + paramModelVOList.stream().forEach(paramModelVO -> { + optionsVO.addOptionItem(paramModelVO.getParamClassName()+"("+paramModelVO.getParamClassDesc()+")", paramModelVO.getParamClassName()); + }); + return optionsVO; + } + + /** + * 包装option适配amis框架 + * @param fieldVOList + * @return + */ + public OptionsVO wrapperFieldModel(List fieldVOList){ + OptionsVO optionsVO = new OptionsVO(); + if(CollectionUtils.isEmpty(fieldVOList)){ + return optionsVO; + } + fieldVOList.stream().forEach(fieldVO -> optionsVO.addOptionItem(fieldVO.getFieldType() + " "+ fieldVO.getFieldName(), fieldVO.getFieldName())); + return optionsVO; + } + + + /** + * 包装option适配amis框架 + * @param apiVOList + * @return + */ + public OptionsVO wrapperApiModel(List apiVOList){ + OptionsVO optionsVO = new OptionsVO(); + if(CollectionUtils.isEmpty(apiVOList)){ + return optionsVO; + } + apiVOList.stream().forEach(apiVO -> { + optionsVO.addOptionItem(apiVO.getApiSign(), apiVO.getApiSign()); + }); + return optionsVO; + } + + /** + * 包装option适配amis框架 + * @param apiVOList + * @return + */ + public OptionsVO wrapperApiModelV2(List apiVOList){ + OptionsVO optionsVO = new OptionsVO(); + if(CollectionUtils.isEmpty(apiVOList)){ + return optionsVO; + } + apiVOList.stream().forEach(apiVO -> { + String apiMethod; + if(apiVO.getReturnParam() != null){ + apiMethod = apiVO.getReturnParam().getParamClassName() + " " + apiVO.getApiUrl(); + }else { + apiMethod = "void " + apiVO.getApiUrl(); + } + StringBuilder builder = new StringBuilder(apiMethod); + if(CollectionUtils.isNotEmpty(apiVO.getParamList())){ + builder.append("("); + for (ParamModelVO paramModelVO : apiVO.getParamList()){ + builder.append(paramModelVO.getParamClassName()+","); + } + builder = builder.deleteCharAt(builder.length() - 1); + builder.append(")"); + } + + optionsVO.addOptionItem(builder.toString(), apiVO.getApiSign()); + }); + return optionsVO; + } + + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/FileUploadController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/FileUploadController.java new file mode 100644 index 0000000000000000000000000000000000000000..858438b7bfc5abeb763b32b8a22fc1d8c6270ad0 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/controller/FileUploadController.java @@ -0,0 +1,64 @@ +package com.tianhua.datafactory.controller; + +import com.coderman.utils.response.ResultDataDto; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.ClassUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +/** + * Description: + * date: 2022/4/11 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Controller +@Slf4j +public class FileUploadController { + + @PostMapping(value = "/apidoc/upload") + public @ResponseBody + ResultDataDto upload(MultipartFile file){ + // 1. 获取要上传文件的文件名 + // 1. 获取要上传文件的文件名 + String fileName = file.getOriginalFilename(); + System.out.println(fileName); + // 2. 自定义上传路径 + String basePath = ClassUtils.getDefaultClassLoader().getResource("").getPath(); + + log.info("basePath = {}",basePath); + + String path = basePath + "\\doc"; + // 3. 判断路径是否存在,不存在则新建 + File apiDocFile = new File(path); + if (!apiDocFile.exists()){ + apiDocFile.mkdir(); + } + + // 3.改名,避免重名,定义新文件的名字 + String newName = path + File.separator + System.currentTimeMillis() + + fileName.substring(fileName.lastIndexOf(".")); + + try { + file.transferTo(new File(newName)); + Map map = new HashMap<>(); + map.put("value",newName); + return ResultDataDto.success(map); + } catch (IOException e) { + return ResultDataDto.fail("500","失败"); + } + } + + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ApiController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ApiController.java new file mode 100644 index 0000000000000000000000000000000000000000..e13d9ac3768581c7f5408360efd9bf3ab60334ba --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ApiController.java @@ -0,0 +1,268 @@ +package com.tianhua.datafactory.controller.admin; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.tianhua.datafactory.controller.BaseController; +import com.tianhua.datafactory.convert.ApiConverter; +import com.tianhua.datafactory.convert.ParamConverter; +import com.tianhua.datafactory.core.service.ApiMockDataAdapter; +import com.tianhua.datafactory.core.service.PlantUMLApiModelBuilderService; +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.domain.bo.datafactory.ApiMockBO; +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; +import com.tianhua.datafactory.domain.bo.project.ApiBO; +import com.tianhua.datafactory.domain.bo.project.ProjectBO; +import com.tianhua.datafactory.domain.repository.ProjectQueryRepository; +import com.tianhua.datafactory.domain.repository.ProjectRepository; +import com.tianhua.datafactory.infrast.dataconvert.ApiConvert; +import com.tianhua.datafactory.vo.PageVO; +import com.tianhua.datafactory.vo.StatusChangeVO; +import com.tianhua.datafactory.vo.project.ApiMockVO; +import com.tianhua.datafactory.vo.project.ApiVO; +import com.tianhua.datafactory.vo.query.ApiQueryVO; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import com.coderman.utils.response.ResultDataDto; + + +/** +* @Description:控制层 +* @Author: +* @CreateTime:2022-05-27 17:45:38 +* @version v1.0 +*/ +@RestController +public class ApiController extends BaseController { + + protected Logger logger = LoggerFactory.getLogger(ApiController.class); + + + @Autowired + private ProjectQueryRepository projectQueryRepository; + + @Autowired + private ProjectRepository projectRepository; + + + @Autowired + private PlantUMLApiModelBuilderService plantUMLApiModelBuilderService; + @Autowired + private ApiMockDataAdapter apiMockDataAdapter; + + /** + * + * @Description 新建api信息 + * @param apiVO + * @return Boolean + */ + @RequestMapping(value = "/api/add",method = RequestMethod.POST) + public ResultDataDto add(@RequestBody ApiVO apiVO){ + ApiBO apiBO = ApiConverter.INSTANCE.vo2bo(apiVO); + apiBO.init(); + ParamModelBO returnParamModel = new ParamModelBO(); + returnParamModel.setParamClassName(apiVO.getReturnParamClass()); + apiBO.setReturnParamModel(returnParamModel); + apiBO.setReturnValue(""); + ProjectBO projectBO = ProjectBO.getInstance(); + projectBO.addApiBo(apiBO); + projectRepository.saveProject(projectBO); + return ResultDataDto.success(true); + } + + /** + * + * @Description 分页获取api信息 + * @param apiQueryVO + * @return PageVO + */ + @RequestMapping(value = "/api/pagelist") + public ResultDataDto> getPageList(ApiQueryVO apiQueryVO){ + PageBean pageBean = apiQueryVO.getPageBean(); + pageBean = projectQueryRepository.queryApiPage(pageBean); + List apiVOList = ApiConverter.INSTANCE.BOs2VOs(projectQueryRepository.queryApiPage(pageBean).getRows()); + + apiQueryVO.setRows(apiVOList); + apiQueryVO.setCount(pageBean.getCount()); + return ResultDataDto.success(apiQueryVO); + } + + /** + * + * @Description 修改api信息 + * @param id + * @param apiVO + * @return Boolean + */ + @RequestMapping(value = "/api/update/{id}") + public ResultDataDto update(@PathVariable(value = "id") Long id, @RequestBody ApiVO apiVO){ + ApiBO apiBO = ApiConverter.INSTANCE.vo2bo(apiVO); + apiBO.setId(id); + + ProjectBO projectBO = ProjectBO.getInstance(); + projectBO.addApiBo(apiBO); + projectRepository.updateProject(projectBO); + return ResultDataDto.success(true); + } + + + /** + * + * @Description 修改api状态 + * amis bug, 迷之不好实现 + * @param id + * @return Boolean + */ + @Deprecated + @RequestMapping(value = "/api/status/{id}",method = RequestMethod.POST) + public ResultDataDto updateStatus(@PathVariable(value = "id") Long id,@RequestBody StatusChangeVO statusChangeVO){ + logger.info("id = {}",id); + logger.info("statusChangeVO = {}",JSON.toJSONString(statusChangeVO)); + ApiBO apiBO = projectQueryRepository.getApiById(id); + + apiBO.updateStatus(statusChangeVO.getStatus()); + ProjectBO projectBO = ProjectBO.getInstance(); + projectBO.addApiBo(apiBO); + projectRepository.updateProject(projectBO); + return ResultDataDto.success(true); + } + + + /** + * + * @Description 搜索api信息 + * @param content + * @return List + */ + @RequestMapping(value = "/api/search") + public ResultDataDto> select(@RequestParam(value = "content", required = true) String content){ + List list = projectQueryRepository.searchApi(content); + return ResultDataDto.success(ApiConverter.INSTANCE.BOs2VOs(list)); + } + + @RequestMapping(value = "/api/getById/{id}") + public ResultDataDto getById(@PathVariable(value = "id") Long id){ + ApiBO apiBO = projectQueryRepository.getApiById(id); + return ResultDataDto.success(ApiConverter.INSTANCE.bo2VO(apiBO)); + } + + + /** + * 以文件上传的方式批量构建api模型 + * @param apiVO + * @return + */ + @PostMapping("/api/batchBuild") + public ResultDataDto batchBuild(@RequestBody ApiVO apiVO){ + plantUMLApiModelBuilderService.initPlantUMlModel(apiVO.getProjectCode(), apiVO.getFile()); + return ResultDataDto.success(); + } + + /** + * 根据项目编码查询apiSign + * @param projectCode + * @return + */ + @GetMapping("/api/searchApiSign") + public ResultDataDto searchApiSign(@RequestParam(value = "projectCode", required = false) String projectCode){ + if(StringUtils.isEmpty(projectCode)){ + return ResultDataDto.success(); + } + List list = projectQueryRepository.getApiListByCode(projectCode); + return ResultDataDto.success(wrapperApiModel(ApiConverter.INSTANCE.BOs2VOs(list))); + } + + + + /** + * 根据项目编码查询apiSign + * @param projectCode + * @return + */ + @GetMapping("/api/searchApiSignV2") + public ResultDataDto searchApiSignV2(@RequestParam(value = "projectCode", required = false) String projectCode){ + if(StringUtils.isEmpty(projectCode)){ + return ResultDataDto.success(); + } + List list = projectQueryRepository.getApiListByCode(projectCode); + + return ResultDataDto.success(wrapperApiModelV2(ApiConverter.INSTANCE.BOs2VOs(list))); + } + + + /** + * + * @Description mock api接口出参mock + * @param apiMockVO + * @return Boolean + */ + @RequestMapping(value = "/api/respmock",method = RequestMethod.POST) + public ResultDataDto reqMock(@RequestBody ApiMockVO apiMockVO) throws Exception { + if(StringUtils.isNotEmpty(apiMockVO.getApiMethod())){ + apiMockVO.setApiSign(apiMockVO.getApiMethod()); + } + if(apiMockVO.getMockCount() != null && apiMockVO.getMockCount() > 1000){ + throw new Exception("web请求mock数量不可超过1000"); + } + Object value = apiMockDataAdapter.getApiMockDataResp(ApiConverter.INSTANCE.vo2BOMock(apiMockVO)); + String jsonValue = JSONObject.toJSONString(value, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteNullBooleanAsFalse); + apiMockVO.setMockResultData(jsonValue); + return ResultDataDto.success(apiMockVO); + } + + /** + * + * @Description mock api接口入参mock + * @param apiMockVO + * @return Boolean + */ + @RequestMapping(value = "/api/reqmock",method = RequestMethod.POST) + public ResultDataDto respMock(@RequestBody ApiMockVO apiMockVO) throws Exception { + if(StringUtils.isNotEmpty(apiMockVO.getApiMethod())){ + apiMockVO.setApiSign(apiMockVO.getApiMethod()); + } + if(apiMockVO.getMockCount() != null && apiMockVO.getMockCount() > 1000){ + throw new Exception("web请求mock数量不可超过1000"); + } + Object value = apiMockDataAdapter.getApiMockDataReq(ApiConverter.INSTANCE.vo2BOMock(apiMockVO)); + String jsonValue = JSONObject.toJSONString(value, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteNullBooleanAsFalse); + apiMockVO.setMockResultData(jsonValue); + return ResultDataDto.success(apiMockVO); + } + + @RequestMapping(value = "/api/getparamlist") + public ResultDataDto getFieldListV2(@RequestParam(value = "apiSign", required = false) String apiSign){ + + Map mapResult = new HashMap<>(); + mapResult.put("rows", null); + mapResult.put("count", 0); + if(StringUtils.isEmpty(apiSign)){ + return ResultDataDto.success(mapResult); + } + + ApiBO apiBO = projectQueryRepository.getBySign(apiSign); + + if(CollectionUtils.isEmpty(apiBO.getParamList())){ + return ResultDataDto.success(mapResult); + } + + ApiVO apiVO = ApiConverter.INSTANCE.bo2VO(apiBO); + + //适配amis service组件 使用map封装一层 + mapResult.put("rows", apiVO.getParamList()); + mapResult.put("count",apiVO.getParamList().size()); + + return ResultDataDto.success(mapResult); + } + + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataEnumController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataEnumController.java new file mode 100644 index 0000000000000000000000000000000000000000..93f34d7dec3595e743d4114c645799028da93be5 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataEnumController.java @@ -0,0 +1,84 @@ +package com.tianhua.datafactory.controller.admin; + +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.domain.enums.ReturnWrapClassEnum; +import com.tianhua.datafactory.controller.BaseController; +import com.tianhua.datafactory.domain.enums.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + * Description: + * date: 2022/5/31 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@RestController +@Slf4j +public class DataEnumController extends BaseController { + + /** + * @param enumCode + * @return ResultDataDto 构建结果 + * @Description:根据数据源构建数据 + * @version v1.0 + */ + @RequestMapping(value = "/dataEnum/{enumCode}", method = RequestMethod.GET) + public ResultDataDto generate(@PathVariable(value = "enumCode") String enumCode) { + if(ApiTypeEnum.isApiType(enumCode)){ + return ResultDataDto.success(ApiTypeEnum.getOptionList()); + } + + if(DataSourceTypeEnum.isDataSourceType(enumCode)){ + return ResultDataDto.success(DataSourceTypeEnum.getOptionList()); + } + + if(ModelTypeEnum.isModelType(enumCode)){ + return ResultDataDto.success(ModelTypeEnum.getOptionList()); + } + + if(ModelValueMappingType.isModelValueMapping(enumCode)){ + return ResultDataDto.success(ModelValueMappingType.getOptionList()); + } + + if(VisitStrategyEnums.isVisitStrategy(enumCode)){ + return ResultDataDto.success(VisitStrategyEnums.getOptionList()); + } + + if(MethodTypeEnum.isMethodType(enumCode)){ + return ResultDataDto.success(MethodTypeEnum.getOptionList()); + } + if(RegistServerEnum.isRegistServer(enumCode)){ + return ResultDataDto.success(RegistServerEnum.getOptionList()); + } + + if(ReturnWrapClassEnum.isReturnWrapClass(enumCode)){ + return ResultDataDto.success(ReturnWrapClassEnum.getOptionList()); + } + + if(ReturnTypeEnum.isReturnType(enumCode)){ + return ResultDataDto.success(ReturnTypeEnum.getOptionList()); + } + + if(ApiModelFieldStatusEnum.isApiModelFieldStatus(enumCode)){ + return ResultDataDto.success(ApiModelFieldStatusEnum.getOptionList()); + } + + if(JavaFieldTypeEnum.isJavaFieldTypeEnum(enumCode)){ + return ResultDataDto.success(JavaFieldTypeEnum.getOptionList()); + } + + if(ColumnTypeEnums.isColumnFieldTypeEnum(enumCode)){ + return ResultDataDto.success(ColumnTypeEnums.getOptionList()); + } + + + return ResultDataDto.success(); + } + + + + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataFactoryController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataFactoryController.java new file mode 100644 index 0000000000000000000000000000000000000000..f601025ff280e78a3b0166b0dc4091edf6f86b5b --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataFactoryController.java @@ -0,0 +1,70 @@ +package com.tianhua.datafactory.controller.admin; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.tianhua.datafactory.controller.BaseController; +import com.tianhua.datafactory.convert.DataFactoryConverter; +import com.tianhua.datafactory.core.service.ApiMockDataAdapter; +import com.tianhua.datafactory.core.service.DataFactoryService; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestBO; +import com.tianhua.datafactory.vo.datafactory.DataBuildRequestVo; +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.vo.datasource.DataSourceVO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + + +/** + * description: DataFactoryController
+ * date: 2020/12/2 23:43
+ * author: coderman
+ * version: 1.0
+ */ +@RestController +@Slf4j +public class DataFactoryController extends BaseController { + + @Autowired + private DataFactoryService dataFactoryService; + + /** + * @param dataFactoryRequestVo + * @return ResultDataDto 构建结果 + * @Description:根据数据源构建数据 + * @version v1.0 + */ + @PostMapping(value = "/datafactory/generate") + public ResultDataDto generate(@RequestBody DataBuildRequestVo dataFactoryRequestVo) { + DataBuildRequestBO dataBuildRequestBO = DataFactoryConverter.INSTANCE.convert2BO(dataFactoryRequestVo); + + try { + ResultDataDto>> resultDataDto = dataFactoryService.generateData(dataBuildRequestBO); + + String jsonValue = JSONObject.toJSONString(resultDataDto.getData(), SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteNullBooleanAsFalse); + dataFactoryRequestVo.setMockResultData(jsonValue); + return ResultDataDto.success(dataFactoryRequestVo); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * @param dataFactoryRequestVo + * @return ResultDataDto 构建结果 + * @Description:根据数据源构建数据 适用于单表,或者单模块构建 + * @version v1.0 + */ + @RequestMapping(value = "/datafactory/generate/simple", method = RequestMethod.POST) + public ResultDataDto generateSimple(@RequestBody DataBuildRequestVo dataFactoryRequestVo) { + logger.info("dataFactoryRequestVo = {}", JSON.toJSONString(dataFactoryRequestVo)); + + ResultDataDto resultDataDto = new ResultDataDto(); + return resultDataDto; + } + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataSourceController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataSourceController.java new file mode 100644 index 0000000000000000000000000000000000000000..bb997878039326633ee76d8881422cb42edccd71 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/DataSourceController.java @@ -0,0 +1,154 @@ +package com.tianhua.datafactory.controller.admin; + +import com.tianhua.datafactory.controller.BaseController; +import com.tianhua.datafactory.convert.DataSourceConverter; +import com.coderman.utils.response.ResultDataDto; +import com.coderman.utils.response.ResultDto; +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.domain.enums.DataSourceTypeEnum; +import com.tianhua.datafactory.domain.enums.VisitStrategyEnums; +import com.tianhua.datafactory.domain.repository.DataSourceQueryRepository; +import com.tianhua.datafactory.domain.repository.DataSourceRepository; +import com.tianhua.datafactory.vo.PageVO; +import com.tianhua.datafactory.vo.datasource.DataSourceVO; +import com.tianhua.datafactory.vo.query.DataSourceQueryVO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** +* @Description:数据源管理表控制层 +* @Author:fanchunshuai +* @CreateTime:2020-12-02 23:07:13 +* @version v1.0 +*/ +@RestController +@Slf4j +public class DataSourceController extends BaseController { + + @Autowired + private DataSourceRepository dataSourceRepository; + + + @Autowired + private DataSourceQueryRepository dataSourceQueryRepository; + + /** + * @Description:新增数据源管理表 + * @version v1.0 + * @param dataSourceVo + * @return ResultDto + */ + @RequestMapping(value = "/datasource/regist",method = RequestMethod.POST) + public ResultDto save(@RequestBody DataSourceVO dataSourceVo){ + try { + dataSourceRepository.regist(DataSourceConverter.INSTANCE.vo2bo(dataSourceVo)); + return ResultDto.success(); + } catch (Exception e) { + log.error("保存失败",e); + return ResultDto.fail("500","保存失败"); + } + + } + + /** + * @Description:修改数据源管理表 + * @version v1.0 + * @param dataSourceVo + * @return ResultDto + */ + @RequestMapping(value = "/datasource/update/{id}",method = RequestMethod.POST) + public ResultDto update(@PathVariable(value = "id") Long id, @RequestBody DataSourceVO dataSourceVo){ + try { + dataSourceVo.init(); + dataSourceVo.setId(id); + dataSourceRepository.update(DataSourceConverter.INSTANCE.vo2bo(dataSourceVo)); + return ResultDto.success(); + } catch (Exception e) { + log.error("修改失败",e); + return ResultDto.fail("500","修改失败"); + } + } + + /** + * @Description:根据id删除数据源管理表 + * @version v1.0 + * @param id + * @return ResultDto + */ + @PostMapping(value = "/datasource/delete/{id}") + public ResultDto delete(@PathVariable(value = "id") Long id){ + dataSourceRepository.delete(id); + return ResultDto.success(); + } + + /** + * @Description:根据ID获取数据源管理表单条记录 + * @version v1.0 + * @param id + * @return ResultDataDto + */ + @GetMapping("/datasource/getById/{id}") + public ResultDataDto getById(@PathVariable(value = "id") Long id){ + try { + DataSourceVO dataSourceVO = DataSourceConverter.INSTANCE.bo2VO(dataSourceRepository.getById(id)); + return ResultDataDto.success(dataSourceVO); + } catch (Exception e) { + log.error("查询失败",e); + return ResultDataDto.fail("500","查询失败"); + } + } + + /** + * @Description:分页获取数据源管理表记录 + * @version v1.0 + * @return ResultDataDto + */ + @GetMapping("/datasource/pagelist") + public ResultDataDto> getPage(DataSourceQueryVO pageVO){ + PageBean pageBean = pageVO.getPageBean(); + List dataSourceVOList = DataSourceConverter.INSTANCE.bo2VOs(dataSourceRepository.getPageList(pageBean).getRows()); + dataSourceVOList.stream().forEach(dataSourceVO -> { + dataSourceVO.setSourceTypeDesc(DataSourceTypeEnum.getDesc(dataSourceVO.getSourceType())); + dataSourceVO.setVisitStrategyDesc(VisitStrategyEnums.getDesc(dataSourceVO.getVisitStrategy())); + }); + pageVO.setRows(dataSourceVOList); + pageVO.setCount(pageBean.getCount()); + return ResultDataDto.success(pageVO); + } + + + /** + * @Description:启用数据源 + * @version v1.0 + * @param id + * @return ResultDataDto + */ + @PostMapping("/datasource/enable/{id}") + public ResultDto enable(@PathVariable(name = "id") Long id){ + dataSourceRepository.updateStatus(id,1); + return ResultDto.success(); + } + + /** + * @Description:启用数据源 + * @version v1.0 + * @param id + * @return ResultDataDto + */ + @PostMapping("/datasource/disable/{id}") + public ResultDto disable(@PathVariable(name = "id") Long id){ + dataSourceRepository.updateStatus(id,0); + return ResultDto.success(); + } + + @RequestMapping(value = "/datasource/search",method = RequestMethod.GET) + public ResultDataDto search(String content){ + List dataSourceVOList = DataSourceConverter.INSTANCE.bo2VOs(dataSourceQueryRepository.search(content)); + return ResultDataDto.success(wrapperDataSource(dataSourceVOList)); + } + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ModelMappingController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ModelMappingController.java new file mode 100644 index 0000000000000000000000000000000000000000..8f101fd463f2e34f4189ddd28feea4824a163e12 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ModelMappingController.java @@ -0,0 +1,99 @@ +package com.tianhua.datafactory.controller.admin; + +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.controller.BaseController; +import com.tianhua.datafactory.convert.ModelMappingConverter; +import com.tianhua.datafactory.convert.ModelSuffixConverter; +import com.tianhua.datafactory.core.service.ModelMappingBuilderService; +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.domain.bo.model.ModelSuffixConfigBO; +import com.tianhua.datafactory.domain.repository.ModelQueryRepository; +import com.tianhua.datafactory.domain.repository.ModelRepository; +import com.tianhua.datafactory.vo.model.ModelMappingVO; +import com.tianhua.datafactory.vo.model.ModelSuffixConfigVO; +import com.tianhua.datafactory.vo.query.ModelMappingQueryVO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Optional; + + +/** +* @Description:模型映射控制层 +* @Author: +* @CreateTime:2022-05-27 17:45:38 +* @version v1.0 +*/ +@RestController +public class ModelMappingController extends BaseController { + + protected Logger logger = LoggerFactory.getLogger(ModelMappingController.class); + + + @Autowired + private ModelRepository modelRepository; + + @Autowired + private ModelQueryRepository modelQueryRepository; + + @Autowired + private ModelMappingBuilderService modelMappingBuilderService; + /** + * + * @Description 新建模型映射 + * @param modelMappingVO + * @return Boolean + */ + @RequestMapping(value = "/modelmapping/add",method = RequestMethod.POST) + public ResultDataDto add(@RequestBody ModelMappingVO modelMappingVO){ + modelRepository.saveModelMapping(ModelMappingConverter.INSTANCE.vo2bo(modelMappingVO)); + return ResultDataDto.success(); + } + + /** + * + * @Description 修改模型后缀 + * @param id + * @param modelSuffixConfigVO + * @return Boolean + */ + @RequestMapping(value = "/modelmapping/update/{id}",method = RequestMethod.POST) + public ResultDataDto update(@PathVariable(value = "id") Long id, @RequestBody ModelSuffixConfigVO modelSuffixConfigVO){ + ModelSuffixConfigBO modelSuffixConfigBO = ModelSuffixConverter.INSTANCE.vo2bo(modelSuffixConfigVO); + modelSuffixConfigBO.setId(id); + modelRepository.updateModelSuffix(modelSuffixConfigBO); + return ResultDataDto.success(); + } + + @GetMapping(value = "/modelmapping/pagelist") + public ResultDataDto getList(ModelMappingQueryVO modelMappingQueryVO){ + PageBean pageBean = modelMappingQueryVO.getPageBean(); + List modelSuffixConfigVOList = ModelMappingConverter.INSTANCE.BOs2VOs(modelQueryRepository.queryModelMappingPage(pageBean).getRows()); + modelMappingQueryVO.setRows(modelSuffixConfigVOList); + modelMappingQueryVO.setCount(pageBean.getCount()); + return ResultDataDto.success(modelMappingQueryVO); + } + + + @GetMapping(value = "/modelmapping/getById/{id}") + public ResultDataDto getById(@PathVariable(value = "id") Long id){ + Optional modelSuffixConfigBOOptional = modelQueryRepository.getModelSuffixConfigList().stream().filter(modelSuffixConfigBO -> modelSuffixConfigBO.getId().equals(id)).findFirst(); + return ResultDataDto.success(ModelSuffixConverter.INSTANCE.bo2VO(modelSuffixConfigBOOptional.get())); + } + + + /** + * 快速构建映射模型 + * @param modelMappingVO + * @return + */ + @PostMapping(value = "/modelmapping/fast") + public ResultDataDto fastMapping(@RequestBody ModelMappingVO modelMappingVO){ + modelMappingBuilderService.buildModelMappingBatch(ModelMappingConverter.INSTANCE.vo2bo(modelMappingVO)); + return ResultDataDto.success(); + } + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ModelSuffixController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ModelSuffixController.java new file mode 100644 index 0000000000000000000000000000000000000000..7104633faa9f8d498ba3ee347e75a20418c66c76 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ModelSuffixController.java @@ -0,0 +1,83 @@ +package com.tianhua.datafactory.controller.admin; + +import com.tianhua.datafactory.controller.BaseController; +import com.tianhua.datafactory.convert.ModelSuffixConverter; +import com.tianhua.datafactory.domain.bo.model.ModelSuffixConfigBO; +import com.tianhua.datafactory.domain.repository.ModelQueryRepository; +import com.tianhua.datafactory.domain.repository.ModelRepository; +import com.tianhua.datafactory.vo.model.ModelSuffixConfigVO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import com.coderman.utils.response.ResultDataDto; +import java.util.List; +import java.util.Optional; + + +/** +* @Description:控制层 +* @Author: +* @CreateTime:2022-05-27 17:45:38 +* @version v1.0 +*/ +@RestController +public class ModelSuffixController extends BaseController { + + protected Logger logger = LoggerFactory.getLogger(ModelSuffixController.class); + + + @Autowired + private ModelRepository modelRepository; + + @Autowired + private ModelQueryRepository modelQueryRepository; + + /** + * + * @Description 新建模型后缀 + * @param modelSuffixConfigVO + * @return Boolean + */ + @RequestMapping(value = "/modelsuffix/add",method = RequestMethod.POST) + public ResultDataDto add(@RequestBody ModelSuffixConfigVO modelSuffixConfigVO){ + modelRepository.saveModelSuffix(ModelSuffixConverter.INSTANCE.vo2bo(modelSuffixConfigVO)); + return ResultDataDto.success(); + } + + /** + * + * @Description 修改模型后缀 + * @param id + * @param modelSuffixConfigVO + * @return Boolean + */ + @RequestMapping(value = "/modelsuffix/update/{id}",method = RequestMethod.POST) + public ResultDataDto update(@PathVariable(value = "id") Long id, @RequestBody ModelSuffixConfigVO modelSuffixConfigVO){ + ModelSuffixConfigBO modelSuffixConfigBO = ModelSuffixConverter.INSTANCE.vo2bo(modelSuffixConfigVO); + modelSuffixConfigBO.setId(id); + modelRepository.updateModelSuffix(modelSuffixConfigBO); + return ResultDataDto.success(); + } + + @GetMapping(value = "/modelsuffix/list") + public ResultDataDto> getList(){ + List modelSuffixConfigVOList = ModelSuffixConverter.INSTANCE.BOs2VOs(modelQueryRepository.getModelSuffixConfigList()); + return ResultDataDto.success(modelSuffixConfigVOList); + } + + + @GetMapping(value = "/modelsuffix/getById/{id}") + public ResultDataDto getById(@PathVariable(value = "id") Long id){ + Optional modelSuffixConfigBOOptional = modelQueryRepository.getModelSuffixConfigList().stream().filter(modelSuffixConfigBO -> modelSuffixConfigBO.getId().equals(id)).findFirst(); + return ResultDataDto.success(ModelSuffixConverter.INSTANCE.bo2VO(modelSuffixConfigBOOptional.get())); + } + + + @GetMapping(value = "/modelsuffix/listoption") + public ResultDataDto getListOption(){ + List modelSuffixConfigVOList = ModelSuffixConverter.INSTANCE.BOs2VOs(modelQueryRepository.getModelSuffixConfigList()); + return ResultDataDto.success(wrapperModelSuffix(modelSuffixConfigVOList)); + } +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ParamController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ParamController.java new file mode 100644 index 0000000000000000000000000000000000000000..ddcdded506df7b9f89f5d328957492e487964656 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ParamController.java @@ -0,0 +1,194 @@ +package com.tianhua.datafactory.controller.admin; + +import com.tianhua.datafactory.controller.BaseController; +import com.tianhua.datafactory.convert.FieldConverter; +import com.tianhua.datafactory.convert.ParamConverter; +import com.tianhua.datafactory.core.service.PlantUMLDomainModelBuilderService; +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; +import com.tianhua.datafactory.domain.repository.ModelQueryRepository; +import com.tianhua.datafactory.domain.repository.ModelRepository; +import com.tianhua.datafactory.vo.OptionsVO; +import com.tianhua.datafactory.vo.PageVO; +import com.tianhua.datafactory.vo.model.FieldVO; +import com.tianhua.datafactory.vo.model.ParamModelVO; +import com.tianhua.datafactory.vo.query.ParamModelQueryVO; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; +import com.coderman.utils.response.ResultDataDto; + + +/** +* @Description:模型控制层 +* @Author: +* @CreateTime:2022-05-27 17:45:38 +* @version v1.0 +*/ +@RestController +public class ParamController extends BaseController { + + protected Logger logger = LoggerFactory.getLogger(ParamController.class); + + @Autowired + private ModelRepository modelRepository; + + @Autowired + private ModelQueryRepository modelQueryRepository; + + @Autowired + private PlantUMLDomainModelBuilderService plantUMLDomainModelBuilderService; + + /** + * @param paramModelVO + * @return Boolean + * @Description 新建参数模型 + */ + @RequestMapping(value = "/parammodel/add", method = RequestMethod.POST) + @Transactional(rollbackFor = Exception.class) + public ResultDataDto add(@RequestBody ParamModelVO paramModelVO) { + + ParamModelBO paramModelBO = ParamConverter.INSTANCE.vo2bo(paramModelVO); + modelRepository.saveParamModel(paramModelBO); + return ResultDataDto.success(); + } + + /** + * @param id + * @return Boolean + * @Description 根据code获取参数模型 + */ + @RequestMapping(value = "/parammodel/getById/{id}") + public ResultDataDto getByID(@PathVariable(value = "id") Long id) { + ParamModelBO paramModelBO = modelQueryRepository.getByParamId(id); + return ResultDataDto.success(ParamConverter.INSTANCE.bo2VO(paramModelBO)); + } + + /** + * @param pageVO + * @return PageVO + * @Description 分页获取参数模型 + */ + @RequestMapping(value = "/parammodel/pagelist") + public ResultDataDto> getPageList(ParamModelQueryVO pageVO) { + PageBean pageBean = pageVO.getPageBean(); + List paramModelVOList = ParamConverter.INSTANCE.BOs2VOs(modelQueryRepository.queryParamPage(pageBean).getRows()); + pageVO.setRows(paramModelVOList); + pageVO.setCount(pageBean.getCount()); + return ResultDataDto.success(pageVO); + + } + + /** + * @param id + * @param paramModelVO + * @return Boolean + * @Description 修改参数模型 + */ + @RequestMapping(value = "/parammodel/update/{id}") + public ResultDataDto update(@PathVariable(value = "id") Long id, @RequestBody ParamModelVO paramModelVO) { + ParamModelBO paramModelBO = ParamConverter.INSTANCE.vo2bo(paramModelVO); + paramModelBO.setId(id); + paramModelBO.getFieldBeanList().forEach(fieldBO -> { + fieldBO.setParamClassName(paramModelBO.getParamClassName()); + fieldBO.setProjectCode(paramModelBO.getProjectCode()); + }); + modelRepository.updateParamModel(paramModelBO); + return ResultDataDto.success(); + } + + /** + * @param content + * @return List + * @Description 搜索参数模型 + */ + @RequestMapping(value = "/parammodel/search") + public ResultDataDto> select(@RequestParam(value = "content", required = true) String content) { + List paramModelVOS = ParamConverter.INSTANCE.BOs2VOs(modelQueryRepository.searchParamModel(content)); + return ResultDataDto.success(paramModelVOS); + } + + + /** + * @param projectCode + * @return List + * @Description 搜索参数模型 + */ + @RequestMapping(value = "/parammodel/getByProjectCode") + public ResultDataDto getByProjectCode(@RequestParam(value = "projectCode") String projectCode) { + if (StringUtils.isEmpty(projectCode)) { + return ResultDataDto.success(new OptionsVO()); + } + List paramModelVOS = ParamConverter.INSTANCE.BOs2VOs(modelQueryRepository.getModelByProjectCode(projectCode)); + return ResultDataDto.success(wrapperParamModel(paramModelVOS)); + } + + + /** + * @param projectCode + * @return List + * @Description 搜索参数模型 + */ + @RequestMapping(value = "/parammodel/getFieldList/{projectCode}/{paramClassName}") + public ResultDataDto getFieldList(@RequestParam(value = "projectCode", required = false) String projectCode, @RequestParam(value = "paramClassName", required = false) String paramClassName) { + if (StringUtils.isEmpty(projectCode) || StringUtils.isEmpty(paramClassName)) { + return ResultDataDto.success(new OptionsVO()); + } + + List fieldVOList = FieldConverter.INSTANCE.BOs2VOs(modelQueryRepository.getModelField(projectCode, paramClassName)); + return ResultDataDto.success(wrapperFieldModel(fieldVOList)); + } + + @PostMapping("/parammodel/batchBuild") + public ResultDataDto batchBuild(@RequestBody ParamModelVO paramModelVO) { + plantUMLDomainModelBuilderService.initPlantUMlDomainModel(paramModelVO.getProjectCode(), paramModelVO.getFile()); + return ResultDataDto.success(); + } + + /** + * @param projectCode + * @return List + * @Description 搜索参数模型 + */ + @RequestMapping(value = "/parammodel/getByProjectCodeV2") + public ResultDataDto getByProjectCodeV2(@RequestParam(value = "projectCode", required = false) String projectCode) { + if (StringUtils.isEmpty(projectCode)) { + return ResultDataDto.success(); + } + List paramModelVOS = ParamConverter.INSTANCE.BOs2VOs(modelQueryRepository.getModelByProjectCode(projectCode)); + return ResultDataDto.success(wrapperParamModel(paramModelVOS)); + } + + @RequestMapping(value = "/parammodel/getFieldListV2") + public ResultDataDto getFieldListV2(@RequestParam(value = "projectCode", required = false) String projectCode, @RequestParam(value = "paramClassName", required = false) String paramClassName) { + if (StringUtils.isEmpty(projectCode) || StringUtils.isEmpty(paramClassName)) { + return ResultDataDto.success(); + } + List fieldVOList = FieldConverter.INSTANCE.BOs2VOs(modelQueryRepository.getModelField(projectCode, paramClassName)); + //适配amis service组件 使用map封装一层 + Map mapResult = new HashMap<>(); + mapResult.put("rows", fieldVOList); + mapResult.put("count", fieldVOList.size()); + + return ResultDataDto.success(mapResult); + } + + + @RequestMapping(value = "/parammodel/getFieldListV3") + public ResultDataDto getFieldListV3(@RequestParam(value = "projectCode", required = false) String projectCode, @RequestParam(value = "paramClassName", required = false) String paramClassName) { + if (StringUtils.isEmpty(projectCode) || StringUtils.isEmpty(paramClassName)) { + return ResultDataDto.success(); + } + List fieldVOList = FieldConverter.INSTANCE.BOs2VOs(modelQueryRepository.getModelField(projectCode, paramClassName)); + + return ResultDataDto.success(wrapperFieldModel(fieldVOList)); + } +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ProjectController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ProjectController.java new file mode 100644 index 0000000000000000000000000000000000000000..8fdfdf190e4936d7fd105fb863300d144495f2e6 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/ProjectController.java @@ -0,0 +1,112 @@ +package com.tianhua.datafactory.controller.admin; + +import com.alibaba.fastjson.JSON; +import com.tianhua.datafactory.controller.BaseController; +import com.tianhua.datafactory.convert.ProjectConverter; +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.domain.bo.project.ProjectBO; +import com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum; +import com.tianhua.datafactory.domain.repository.ProjectQueryRepository; +import com.tianhua.datafactory.domain.repository.ProjectRepository; +import com.tianhua.datafactory.vo.PageVO; +import com.tianhua.datafactory.vo.project.ProjectVO; +import com.tianhua.datafactory.vo.query.ProjectQueryVO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; +import com.coderman.utils.response.ResultDataDto; + + +/** +* @Description:控制层 +* @Author: +* @CreateTime:2022-05-27 17:45:38 +* @version v1.0 +*/ +@RestController +public class ProjectController extends BaseController { + + protected Logger logger = LoggerFactory.getLogger(ProjectController.class); + + @Autowired + private ProjectRepository projectRepository; + + + @Autowired + private ProjectQueryRepository projectQueryRepository; + + + /** + * + * @Description 新建项目 + * @param projectVO + * @return Boolean + */ + @RequestMapping(value = "/project/add") + public ResultDataDto add(@RequestBody ProjectVO projectVO){ + projectVO.init(); + projectVO.setStatus(ApiModelFieldStatusEnum.USING.getStatus()); + projectRepository.saveProject(ProjectConverter.INSTANCE.vo2bo(projectVO)); + return ResultDataDto.success(); + } + + /** + * + * @Description 根据code获取项目详情 + * @param projectCode + * @return Boolean + */ + @RequestMapping(value = "/project/getByCode/{projectCode}") + public ResultDataDto getByCode(@PathVariable(value = "projectCode") String projectCode) throws Exception { + ProjectBO projectBO = projectRepository.getByCode(projectCode); + projectBO.setApiList(null); + return ResultDataDto.success(ProjectConverter.INSTANCE.bo2VO(projectBO)); + } + + /** + * + * @Description 分页获取项目信息 + * @param pageVO + * @return PageVO + */ + @RequestMapping(value = "/project/pagelist") + public ResultDataDto> getPageList(ProjectQueryVO pageVO){ + PageBean pageBean = pageVO.getPageBean(); + pageBean = projectQueryRepository.queryProjectPage(pageBean); + logger.info("ProjectQueryVO pageVo = "+ JSON.toJSONString(pageVO)); + List moduleConfigVOList = ProjectConverter.INSTANCE.BOs2VOs(projectQueryRepository.queryProjectPage(pageBean).getRows()); + pageVO.setRows(moduleConfigVOList); + pageVO.setCount(pageBean.getCount()); + return ResultDataDto.success(pageVO); + } + + /** + * + * @Description 修改项目信息 + * @param projectVO + * @return Boolean + */ + @RequestMapping(value = "/project/update/{projectCode}",method = RequestMethod.POST) + @Transactional(rollbackFor = Exception.class) + public ResultDataDto update(@PathVariable(value = "projectCode") String projectCode, @RequestBody ProjectVO projectVO){ + projectRepository.updateProject(ProjectConverter.INSTANCE.vo2bo(projectVO)); + return ResultDataDto.success(); + } + + /** + * + * @Description 搜索项目信息 + * @param content + * @return List + */ + @RequestMapping(value = "/project/search",method = RequestMethod.GET) + public ResultDataDto select(String content){ + List projectBOList = projectQueryRepository.searchProject(content); + return ResultDataDto.success(wrapperProject(ProjectConverter.INSTANCE.BOs2VOs(projectBOList))); + } +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/admin/TableController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/TableController.java new file mode 100644 index 0000000000000000000000000000000000000000..6f406e8a174a2101eb497eded26769b8199cfcba --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/controller/admin/TableController.java @@ -0,0 +1,160 @@ +package com.tianhua.datafactory.controller.admin; + +import com.tianhua.datafactory.controller.BaseController; +import com.tianhua.datafactory.convert.TableConverter; +import com.tianhua.datafactory.core.service.TableModelBuilderService; +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.domain.bo.model.TableBO; +import com.tianhua.datafactory.domain.repository.ModelQueryRepository; +import com.tianhua.datafactory.domain.repository.ModelRepository; +import com.tianhua.datafactory.vo.PageVO; +import com.tianhua.datafactory.vo.model.ColumnVO; +import com.tianhua.datafactory.vo.model.TableVO; +import com.tianhua.datafactory.vo.query.TableQueryVO; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import com.coderman.utils.response.ResultDataDto; + + +/** +* @Description:控制层 +* @Author: +* @CreateTime:2022-05-27 17:45:38 +* @version v1.0 +*/ +@RestController +public class TableController extends BaseController { + + protected Logger logger = LoggerFactory.getLogger(TableController.class); + + @Autowired + private ModelRepository modelRepository; + + @Autowired + private ModelQueryRepository modelQueryRepository; + + @Autowired + private TableModelBuilderService tableModelBuilderService; + + /** + * + * @Description 新建表结构模型 + * @param tableVO + * @return Boolean + */ + @RequestMapping(value = "/table/add",method = RequestMethod.POST) + public ResultDataDto add(@RequestBody TableVO tableVO){ + modelRepository.saveDBModel(TableConverter.INSTANCE.vo2bo(tableVO)); + return ResultDataDto.success(); + } + + /** + * + * @Description 根据code获取表结构模型 + * @param id + * @return Boolean + */ + @RequestMapping(value = "/table/getById/{id}") + public ResultDataDto getByTableId(@PathVariable(value = "id") Long id){ + TableBO tableBO = modelQueryRepository.getByTableId(id); + return ResultDataDto.success(TableConverter.INSTANCE.bo2VO(tableBO)); + } + + /** + * + * @Description 分页获取表结构模型 + * @param pageVO + * @return PageVO + */ + @RequestMapping(value = "/table/pagelist") + public ResultDataDto> getPageList(TableQueryVO pageVO){ + PageBean pageBean = pageVO.getPageBean(); + pageBean = modelQueryRepository.queryTablePage(pageBean); + List tableVOList = TableConverter.INSTANCE.BOs2VOs(modelQueryRepository.queryTablePage(pageBean).getRows()); + pageVO.setRows(tableVOList); + pageVO.setCount(pageBean.getCount()); + return ResultDataDto.success(pageVO); + } + + /** + * + * @Description 修改表结构模型 + * @param id + * @param tableVO + * @return Boolean + */ + @RequestMapping(value = "/table/update/{id}") + public ResultDataDto update(@PathVariable(value = "id") Long id, @RequestBody TableVO tableVO){ + tableVO.init(); + TableBO tableBO = TableConverter.INSTANCE.vo2bo(tableVO); + tableBO.setId(id); + modelRepository.updateDBModel(tableBO); + return ResultDataDto.success(); + } + + /** + * + * @Description 搜索表结构模型 + * @param content + * @return List + */ + @RequestMapping(value = "/table/search") + public ResultDataDto> select(@RequestParam(value = "content", required = true) String content){ + List tableBOList = modelQueryRepository.searchTable(content); + return ResultDataDto.success(TableConverter.INSTANCE.BOs2VOs(tableBOList)); + } + + /** + * + * @Description 搜索表结构模型 + * @param content + * @return List + */ + @RequestMapping(value = "/table/searchdb",method = RequestMethod.GET) + public ResultDataDto searchdb(String content){ + if(StringUtils.isEmpty(content)){ + return ResultDataDto.success(); + } + List tableBOList = modelQueryRepository.searchTable(content); + Set dbNameSet = tableBOList.stream().map(TableBO::getDbName).collect(Collectors.toSet()); + + return ResultDataDto.success(wrapperDbNameList(dbNameSet)); + } + + + + /** + * + * @Description 根据表ID获取表字段列表 + * @param tableId + * @return Boolean + */ + @RequestMapping(value = "/table/columns/{tableId}",method = RequestMethod.GET) + public ResultDataDto> update(@PathVariable(value = "tableId") Long tableId){ + TableBO tableBO = modelQueryRepository.getByTableId(tableId); + TableVO tableVO = TableConverter.INSTANCE.bo2VO(tableBO); + return ResultDataDto.success(tableVO.getColumnList()); + } + + /** + * + * @Description 通过plantUML 文档 构建 表结构模型 + * @param tableVO + * @return Boolean + */ + @RequestMapping(value = "/table/upload",method = RequestMethod.POST) + public ResultDataDto build(@RequestBody TableVO tableVO){ + tableModelBuilderService.buildERModel(TableConverter.INSTANCE.vo2bo(tableVO)); + return ResultDataDto.success(); + } + + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/controller/webmock/WebMockController.java b/adapter/src/main/java/com/tianhua/datafactory/controller/webmock/WebMockController.java new file mode 100644 index 0000000000000000000000000000000000000000..7c664fd3c3741af6daaa23e8d1040782838a268c --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/controller/webmock/WebMockController.java @@ -0,0 +1,74 @@ +package com.tianhua.datafactory.controller.webmock; + +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.client.factory.ReturnWrapClassFactory; +import com.tianhua.datafactory.convert.ApiConverter; +import com.tianhua.datafactory.core.service.ApiMockDataAdapter; +import com.tianhua.datafactory.core.service.DataFactoryService; +import com.tianhua.datafactory.domain.bo.datafactory.ApiMockBO; +import com.tianhua.datafactory.domain.bo.project.ApiBO; +import com.tianhua.datafactory.domain.repository.ProjectQueryRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * Description + * date: 2022/9/4 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@RestController +@Slf4j +public class WebMockController { + + @Autowired + private ProjectQueryRepository projectQueryRepository; + + + @Autowired + private ApiMockDataAdapter apiMockDataAdapter; + + + /** + * 前后端接口联调时接口的数据mock返回 + * @return + */ + @RequestMapping(value = "/apimock",method = RequestMethod.GET) + public Object getApiResponseData(@RequestParam(value = "apiSign") String apiSign,@RequestParam(value = "successData",required = false) Boolean successData){ + try { + ApiMockBO apiMockBO = new ApiMockBO(); + apiMockBO.setApiSign(apiSign); + apiMockBO.setSuccessData(successData); + return apiMockDataAdapter.getApiMockDataResp(apiMockBO); + } catch (Exception e) { + log.error("获取数据失败",e); + } + return ResultDataDto.fail("500","获取mock数据失败,请联系管理员"); + } + + + /** + * 获取基于项目的后端api签名列表 + * @param projectCode + * @return + */ + @RequestMapping(value = "/apisign/{projectCode}",method = RequestMethod.GET) + public ResultDataDto getApiSginData(@PathVariable(value = "projectCode") String projectCode){ + ResultDataDto resultDataDto = new ResultDataDto<>(); + List apiBOList = projectQueryRepository.getApiListByCode(projectCode); + //过滤掉非web接口 + apiBOList = apiBOList.stream().filter(apiBO -> apiBO.getApiSign().contains("/")).collect(Collectors.toList()); + + resultDataDto.setData(ApiConverter.INSTANCE.BOs2VOs(apiBOList)); + return resultDataDto; + } + + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/ApiConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/ApiConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..db9e97ad05571574f45e558fd5c248dcca84e98c --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/convert/ApiConverter.java @@ -0,0 +1,70 @@ +package com.tianhua.datafactory.convert; + +import java.util.List; + +import com.alibaba.fastjson.JSON; +import com.tianhua.datafactory.domain.bo.datafactory.ApiMockBO; +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; +import com.tianhua.datafactory.domain.bo.project.ApiBO; + +import com.tianhua.datafactory.vo.project.ApiMockVO; +import com.tianhua.datafactory.vo.project.ApiVO; +import org.apache.commons.lang3.StringUtils; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +/** +* @Description:ApiConvertervobo接口 +* @Author: +* @CreateTime:2022-05-27 17:45:38 +* @version v1.0 +*/ +@Mapper +public interface ApiConverter{ + ApiConverter INSTANCE = Mappers.getMapper(ApiConverter.class); + + /** + * + * @Description: + * @return ApiVO + */ + @Mappings({ + @Mapping(target = "apiReturnWrapTypeDesc",expression = "java(com.tianhua.datafactory.domain.enums.ReturnWrapClassEnum.getDesc(apiBO.getApiReturnWrapType()))"), + @Mapping(target = "statusDesc",expression = "java(com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum.getStatusDesc(apiBO.getStatus()))"), + @Mapping(target = "returnParam",expression = "java(ParamConverter.INSTANCE.bo2VO(apiBO.getReturnParamModel()))"), + }) + ApiVO bo2VO(ApiBO apiBO); + /** + * + * @Description: + * @return ApiBO + */ + @Mappings({ + @Mapping(target = "returnParamModel",expression = "java(ParamConverter.INSTANCE.vo2bo(apiVO.getReturnParam()))"), + }) + ApiBO vo2bo(ApiVO apiVO); + /** + * + * @Description: + * @return List + */ + List BOs2VOs(List apiBOList); + /** + * + * @Description: + * @return List + */ + List VOs2BOs(List vOList); + + /** + * 接口mock请求 + * @param apiMockVO + * @return + */ + ApiMockBO vo2BOMock(ApiMockVO apiMockVO); + + + +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/DataFactoryConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/DataFactoryConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..357c9dd85c8297cd873b32b4ba6dec8f8b68a9e1 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/convert/DataFactoryConverter.java @@ -0,0 +1,91 @@ +package com.tianhua.datafactory.convert; + +import com.tianhua.datafactory.core.utils.DateUtils; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import com.tianhua.datafactory.domain.enums.JavaFieldTypeEnum; +import com.tianhua.datafactory.vo.datafactory.DataBuildRequestVo; +import com.tianhua.datafactory.vo.model.FieldVO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +import java.util.ArrayList; +import java.util.List; + +/** + * Description + * date: 2022/9/9 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Mapper +public interface DataFactoryConverter { + DataFactoryConverter INSTANCE = Mappers.getMapper(DataFactoryConverter.class); + + + @Mappings({ + @Mapping(target = "fieldBOList",expression = "java(convert2BO(dataBuildRequestVo.getFieldVOList()))"), + }) + DataBuildRequestBO convert2BO(DataBuildRequestVo dataBuildRequestVo); + + @Mappings({ + @Mapping(target = "defaultValueList",expression = "java(getDefaultValueList(fieldVO.getDefaultValueList(),fieldVO.getFieldType()))"), + }) + DataBuildRequestFieldBO convert2BO(FieldVO fieldVO); + + + List convert2BO(List fieldVOList); + + default List getDefaultValueList(String defaultValueListStr,String type){ + if(defaultValueListStr == null || defaultValueListStr == ""){ + return null; + } + List defaultValueList = new ArrayList(); + String [] valueArr = defaultValueListStr.split(","); + if(JavaFieldTypeEnum.isInt(type)){ + for (String value : valueArr){ + defaultValueList.add(Integer.parseInt(value)); + } + }else if(JavaFieldTypeEnum.isLong(type)){ + for (String value : valueArr){ + defaultValueList.add(Long.parseLong(value)); + } + }else if(JavaFieldTypeEnum.isFloat(type)){ + for (String value : valueArr){ + defaultValueList.add(Float.parseFloat(value)); + } + } + else if(JavaFieldTypeEnum.isDouble(type)){ + for (String value : valueArr){ + defaultValueList.add(Double.parseDouble(value)); + } + } + else if(JavaFieldTypeEnum.isString(type)){ + for (String value : valueArr){ + defaultValueList.add(value); + } + } + //yyyy-MM-dd + else if(JavaFieldTypeEnum.isDate(type)){ + for (String value : valueArr){ + defaultValueList.add(DateUtils.string2Date(value,"yyyy-MM-dd")); + } + } + + //yyyy-MM-dd + else if(JavaFieldTypeEnum.isDateTime(type)){ + for (String value : valueArr){ + defaultValueList.add(DateUtils.string2Date(value,"yyyy-MM-dd HH:mm:ss")); + } + } + + return defaultValueList; + + } + + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..26785757202ab9ee851e021e891e1f0eb5c4384d --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceConverter.java @@ -0,0 +1,66 @@ +package com.tianhua.datafactory.convert; + +import com.tianhua.datafactory.domain.bo.datasource.DataSourceBO; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceReqConfigBO; +import com.tianhua.datafactory.vo.datasource.DataSourceReqConfigVO; +import com.tianhua.datafactory.vo.datasource.DataSourceVO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * Description: + * date: 2022/5/30 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Mapper(imports = { + DataSourceRespConverter.class, + DataSourceReqConverter.class, + KVPairConverter.class +}) +public interface DataSourceConverter { + DataSourceConverter INSTANCE = Mappers.getMapper(DataSourceConverter.class); + + /** + * bo聚合对象转换为vo聚合对象 + * @Description: + * @return dataSourceBO + */ + @Mappings({ + @Mapping(target = "dataSourceReqConfigList",expression = "java(DataSourceReqConverter.INSTANCE.bo2VOs(dataSourceBO.getDataSourceReqConfigList()))"), + @Mapping(target = "dataSourceRespConfigList",expression = "java(DataSourceRespConverter.INSTANCE.bo2VOs(dataSourceBO.getDataSourceRespConfigList()))"), + @Mapping(target = "kvPairList",expression = "java(KVPairConverter.INSTANCE.BOs2VOs(dataSourceBO.getKvPairList()))"), + @Mapping(target = "statusDesc",expression = "java(com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum.getStatusDesc(dataSourceBO.getStatus()))"), + @Mapping(target = "visitStrategyDesc",expression = "java(com.tianhua.datafactory.domain.enums.VisitStrategyEnums.getDesc(dataSourceBO.getVisitStrategy()))"), + @Mapping(target = "sourceTypeDesc",expression = "java(com.tianhua.datafactory.domain.enums.DataSourceTypeEnum.getDesc(dataSourceBO.getSourceType()))"), + + }) + DataSourceVO bo2VO(DataSourceBO dataSourceBO); + + /** + * vo聚合对象转换为bo聚合对象 + * @param dataSourceVO + * @return + */ + @Mappings({ + @Mapping(target = "dataSourceReqConfigList",expression = "java(DataSourceReqConverter.INSTANCE.vo2BOs(dataSourceVO.getDataSourceReqConfigList()))"), + @Mapping(target = "dataSourceRespConfigList",expression = "java(DataSourceRespConverter.INSTANCE.vo2BOs(dataSourceVO.getDataSourceRespConfigList()))"), + @Mapping(target = "kvPairList",expression = "java(KVPairConverter.INSTANCE.VOs2BOs(dataSourceVO.getKvPairList()))") + + }) + DataSourceBO vo2bo(DataSourceVO dataSourceVO); + + /** + * + * @Description: + * @return dataSourceBOList + */ + List bo2VOs(List dataSourceBOList); + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceReqConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceReqConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..08e5988a1c1f4a7902521c151da9e9f7ff7123d9 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceReqConverter.java @@ -0,0 +1,49 @@ +package com.tianhua.datafactory.convert; + +import com.tianhua.datafactory.domain.bo.datasource.DataSourceReqConfigBO; +import com.tianhua.datafactory.vo.datasource.DataSourceReqConfigVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * Description: + * date: 2022/5/30 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Mapper +public interface DataSourceReqConverter { + DataSourceReqConverter INSTANCE = Mappers.getMapper(DataSourceReqConverter.class); + + /** + * + * @Description: + * @return dataSourceBO + */ + DataSourceReqConfigVO bo2VO(DataSourceReqConfigBO dataSourceReqConfigBO); + /** + * + * @Description: + * @return dataSourceRespConfigVO + */ + DataSourceReqConfigBO vo2bo(DataSourceReqConfigVO dataSourceRespConfigVO); + + /** + * + * @Description: + * @return dataSourceBOList + */ + List bo2VOs(List dataSourceRespConfigBOList); + + /** + * + * @Description: + * @return dataSourceBOList + */ + List vo2BOs(List dataSourceReqConfigVOList); + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceRespConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceRespConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..099fc8be42229b445b3e1789960550ff5372aecd --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/convert/DataSourceRespConverter.java @@ -0,0 +1,50 @@ +package com.tianhua.datafactory.convert; + +import com.tianhua.datafactory.domain.bo.datasource.DataSourceRespConfigBO; +import com.tianhua.datafactory.vo.datasource.DataSourceRespConfigVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * Description: + * date: 2022/5/30 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Mapper +public interface DataSourceRespConverter { + DataSourceRespConverter INSTANCE = Mappers.getMapper(DataSourceRespConverter.class); + + /** + * + * @Description: + * @return dataSourceBO + */ + DataSourceRespConfigVO bo2VO(DataSourceRespConfigBO dataSourceBO); + /** + * + * @Description: + * @return DataSourceBO + */ + DataSourceRespConfigBO vo2bo(DataSourceRespConfigVO dataSourceRespConfigVO); + + /** + * + * @Description: + * @return dataSourceBOList + */ + List bo2VOs(List dataSourceRespConfigBOList); + + + /** + * + * @Description: + * @return dataSourceBOList + */ + List vo2BOs(List dataSourceRespConfigVOList); + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/FieldConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/FieldConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..56b123712582944538555dd2ca3a583b1d5793a9 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/convert/FieldConverter.java @@ -0,0 +1,109 @@ +package com.tianhua.datafactory.convert; + +import com.tianhua.datafactory.domain.bo.model.FieldBO; +import com.tianhua.datafactory.domain.bo.model.FieldExtBO; +import com.tianhua.datafactory.vo.model.FieldVO; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.assertj.core.util.Lists; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +import java.util.ArrayList; +import java.util.List; + +/** +* @Description:paramConvertervobo接口 +* @Author: +* @CreateTime:2022-05-27 17:45:38 +* @version v1.0 +*/ +@Mapper +public interface FieldConverter { + FieldConverter INSTANCE = Mappers.getMapper(FieldConverter.class); + + /** + * vo列表转换成bo列表 + * @Description: + * @return List + */ + List VOs2BOs(List vOList); + + /** + * vo转换成bo + * @Description: + * @return ParamModelBO + */ + @Mappings({ + @Mapping(target = "fieldExtBO",expression = "java(vo2boExt(fieldVO))"), + }) + FieldBO vo2bo(FieldVO fieldVO); + + /** + * vo转换成bo + * @Description: + * @return ParamModelBO + */ + @Mappings({ + @Mapping(target = "defaultValueList",expression = "java(split(fieldVO.getDefaultValueList()))"), + }) + FieldExtBO vo2boExt(FieldVO fieldVO); + + /** + * bo转换成vo + * @Description: + * @return fieldBO + */ + @Mappings({ + @Mapping(target = "dataSourceCode",expression = "java(fieldBO.getFieldExtBO().getDataSourceCode())"), + @Mapping(target = "bizUnique",expression = "java(fieldBO.getFieldExtBO().getBizUnique())"), + @Mapping(target = "bizIdentifier",expression = "java(fieldBO.getFieldExtBO().getBizIdentifier())"), + @Mapping(target = "complexStruct",expression = "java(fieldBO.getFieldExtBO().getComplexStruct())"), + @Mapping(target = "checkRule",expression = "java(fieldBO.getFieldExtBO().getCheckRule())"), + @Mapping(target = "mappingDBColumn",expression = "java(fieldBO.getFieldExtBO().getMappingDBColumn())"), + @Mapping(target = "defaultValueList",expression = "java(join(fieldBO.getFieldExtBO().getDefaultValueList()))"), + + }) + FieldVO bo2VO(FieldBO fieldBO); + + + + @Mappings({ + @Mapping(target = "defaultValueList",expression = "java(join(fieldExtBO.getDefaultValueList()))"), + }) + FieldVO vo2boExt(FieldExtBO fieldExtBO); + + + + /** + * bo列表转换成vo列表 + * @Description: + * @return List + */ + List BOs2VOs(List fieldBOList); + + default String join(List list){ + if(CollectionUtils.isEmpty(list)){ + return ""; + } + return StringUtils.join(list,","); + } + + + default List split(String str){ + if(StringUtils.isEmpty(str)){ + return Lists.newArrayList(); + } + if(str.contains(",")){ + String [] arr = StringUtils.split(str,","); + List list = new ArrayList<>(); + for (String ele : arr){ + list.add(ele); + } + return list; + } + return Lists.newArrayList(str); + } +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/KVPairConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/KVPairConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..d04ff6fa206e79dcd7aa5e28f9324dc76850b063 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/convert/KVPairConverter.java @@ -0,0 +1,47 @@ +package com.tianhua.datafactory.convert; + +import com.tianhua.datafactory.domain.support.kvpair.KVPairBO; +import com.tianhua.datafactory.vo.datasource.KVPairVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** +* @Description: +* @Author: +* @CreateTime:2022-05-27 17:45:38 +* @version v1.0 +*/ +@Mapper +public interface KVPairConverter { + KVPairConverter INSTANCE = Mappers.getMapper(KVPairConverter.class); + + /** + * vo列表转换成bo列表 + * @Description: + * @return List + */ + List VOs2BOs(List vOList); + + /** + * vo转换成bo + * @Description: + * @return ParamModelBO + */ + KVPairBO vo2bo(KVPairVO KVPairVO); + + /** + * bo转换成vo + * @Description: + * @return KVPairBO + */ + KVPairVO bo2VO(KVPairBO KVPairBO); + + /** + * bo列表转换成vo列表 + * @Description: + * @return List + */ + List BOs2VOs(List KVPairBOList); +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/ModelMappingConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/ModelMappingConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..a952a244e27a552509df905c16ecc42d8a11e6a3 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/convert/ModelMappingConverter.java @@ -0,0 +1,44 @@ +package com.tianhua.datafactory.convert; + +import com.tianhua.datafactory.domain.bo.model.ModelMappingBO; +import com.tianhua.datafactory.vo.model.ModelMappingVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** +* @Description:ModelSuffixConvertervobo接口 +* @Author: +* @CreateTime:2022-05-27 17:45:38 +* @version v1.0 +*/ +@Mapper +public interface ModelMappingConverter { + ModelMappingConverter INSTANCE = Mappers.getMapper(ModelMappingConverter.class); + + /** + * + * @Description: + * @return ModelSuffixConfigBO + */ + ModelMappingBO vo2bo(ModelMappingVO modelMappingVO); + /** + * + * @Description: + * @return List + */ + List BOs2VOs(List modelSuffixConfigBOList); + /** + * + * @Description: + * @return ModelSuffixConfigVO + */ + ModelMappingVO bo2VO(ModelMappingBO modelMappingBO); + /** + * + * @Description: + * @return List + */ + List VOs2BOs(List vOList); +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/ModelSuffixConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/ModelSuffixConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..ec21751265ab6444069ac5809bd24d47c341a6a2 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/convert/ModelSuffixConverter.java @@ -0,0 +1,46 @@ +package com.tianhua.datafactory.convert; + +import java.util.List; +import com.tianhua.datafactory.domain.bo.model.ModelSuffixConfigBO; + +import com.tianhua.datafactory.vo.model.ModelSuffixConfigVO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +/** +* @Description:ModelSuffixConvertervobo接口 +* @Author: +* @CreateTime:2022-05-27 17:45:38 +* @version v1.0 +*/ +@Mapper +public interface ModelSuffixConverter{ + ModelSuffixConverter INSTANCE = Mappers.getMapper(ModelSuffixConverter.class); + + /** + * + * @Description: + * @return ModelSuffixConfigBO + */ + ModelSuffixConfigBO vo2bo(ModelSuffixConfigVO modelSuffixConfigVO); + /** + * + * @Description: + * @return List + */ + List BOs2VOs(List modelSuffixConfigBOList); + /** + * + * @Description: + * @return ModelSuffixConfigVO + */ + ModelSuffixConfigVO bo2VO(ModelSuffixConfigBO modelSuffixConfigBO); + /** + * + * @Description: + * @return List + */ + List VOs2BOs(List vOList); +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/ParamConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/ParamConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..a5c104ec3bc09556ecda18e1702d2788c0b8524f --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/convert/ParamConverter.java @@ -0,0 +1,53 @@ +package com.tianhua.datafactory.convert; + +import java.util.List; +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; + +import com.tianhua.datafactory.vo.model.ParamModelVO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +/** +* @Description:paramConvertervobo接口 +* @Author: +* @CreateTime:2022-05-27 17:45:38 +* @version v1.0 +*/ +@Mapper +public interface ParamConverter{ + ParamConverter INSTANCE = Mappers.getMapper(ParamConverter.class); + + /** + * + * @Description: + * @return List + */ + List VOs2BOs(List vOList); + /** + * + * @Description: + * @return ParamModelBO + */ + @Mappings({ + @Mapping(target = "fieldBeanList",expression = "java(FieldConverter.INSTANCE.VOs2BOs(paramModelVO.getFieldBeanList()))"), + }) + ParamModelBO vo2bo(ParamModelVO paramModelVO); + /** + * + * @Description: + * @return ParamModelVO + */ + @Mappings({ + @Mapping(target = "fieldBeanList",expression = "java(FieldConverter.INSTANCE.BOs2VOs(paramModelBO.getFieldBeanList()))"), + @Mapping(target = "statusDesc",expression = "java(com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum.getStatusDesc(paramModelBO.getStatus()))"), + }) + ParamModelVO bo2VO(ParamModelBO paramModelBO); + /** + * + * @Description: + * @return List + */ + List BOs2VOs(List paramModelBOList); +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/ProjectConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/ProjectConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..a04ff8a0d7909aa0ee10dba01fd2e26a61000451 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/convert/ProjectConverter.java @@ -0,0 +1,49 @@ +package com.tianhua.datafactory.convert; + +import java.util.List; +import com.tianhua.datafactory.domain.bo.project.ProjectBO; + +import com.tianhua.datafactory.vo.project.ProjectVO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +/** +* @Description:projectConvertervobo接口 +* @Author: +* @CreateTime:2022-05-27 17:45:38 +* @version v1.0 +*/ +@Mapper +public interface ProjectConverter{ + ProjectConverter INSTANCE = Mappers.getMapper(ProjectConverter.class); + + /** + * + * @Description: + * @return List + */ + List BOs2VOs(List projectBOList); + /** + * + * @Description: + * @return ProjectVO + */ + @Mappings({ + @Mapping(target = "statusDesc",expression = "java(com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum.getStatusDesc(projectBO.getStatus()))"), + }) + ProjectVO bo2VO(ProjectBO projectBO); + /** + * + * @Description: + * @return ProjectBO + */ + ProjectBO vo2bo(ProjectVO projectVO); + /** + * + * @Description: + * @return List + */ + List VOs2BOs(List vOList); +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/convert/TableConverter.java b/adapter/src/main/java/com/tianhua/datafactory/convert/TableConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..5357da2c11b9bf4c4553e2815cac928f0e78974e --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/convert/TableConverter.java @@ -0,0 +1,49 @@ +package com.tianhua.datafactory.convert; + +import com.tianhua.datafactory.domain.bo.model.TableBO; +import java.util.List; + +import com.tianhua.datafactory.vo.model.TableVO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +/** +* @Description:tableConvertervobo接口 +* @Author: +* @CreateTime:2022-05-27 17:45:38 +* @version v1.0 +*/ +@Mapper +public interface TableConverter{ + TableConverter INSTANCE = Mappers.getMapper(TableConverter.class); + + /** + * + * @Description: + * @return List + */ + List BOs2VOs(List tableBOList); + /** + * + * @Description: + * @return TableBO + */ + TableBO vo2bo(TableVO tableVO); + /** + * + * @Description: + * @return TableVO + */ + @Mappings({ + @Mapping(target = "statusDesc",expression = "java(com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum.getStatusDesc(tableBO.getStatus()))"), + }) + TableVO bo2VO(TableBO tableBO); + /** + * + * @Description: + * @return List + */ + List VOs2BOs(List vOList); +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/package-info.java b/adapter/src/main/java/com/tianhua/datafactory/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..aec72340ba22d5d644b8a6186960c6e61b572bc2 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/package-info.java @@ -0,0 +1 @@ +package com.tianhua.datafactory; \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/BaseVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/BaseVO.java new file mode 100644 index 0000000000000000000000000000000000000000..5f90de0f03edfc562ef328035d0494702a3ca89b --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/BaseVO.java @@ -0,0 +1,86 @@ +package com.tianhua.datafactory.vo; + +import java.util.Date; + +/** + * Description: + * date: 2022/4/24 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class BaseVO { + /** 创建时间 **/ + public Date dateCreate; + /** 修改时间 **/ + public Date dateUpdate; + /** 修改人 **/ + public Long updateUserId; + /** 创建人 **/ + public Long createUserId; + + /** + * 状态 + * @See com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum + */ + private Integer status; + public String statusDesc; + + + + public void init(){ + this.createUserId = 1L; + this.updateUserId = 1L; + this.dateCreate = new Date(); + this.dateUpdate = new Date(); + } + + public Date getDateCreate() { + return dateCreate; + } + + public void setDateCreate(Date dateCreate) { + this.dateCreate = dateCreate; + } + + public Date getDateUpdate() { + return dateUpdate; + } + + public void setDateUpdate(Date dateUpdate) { + this.dateUpdate = dateUpdate; + } + + public Long getUpdateUserId() { + return updateUserId; + } + + public void setUpdateUserId(Long updateUserId) { + this.updateUserId = updateUserId; + } + + public Long getCreateUserId() { + return createUserId; + } + + public void setCreateUserId(Long createUserId) { + this.createUserId = createUserId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getStatusDesc() { + return statusDesc; + } + + public void setStatusDesc(String statusDesc) { + this.statusDesc = statusDesc; + } +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/OptionsVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/OptionsVO.java new file mode 100644 index 0000000000000000000000000000000000000000..e0800b5064bbf46455435ff55da3ec54a33d6f36 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/OptionsVO.java @@ -0,0 +1,32 @@ +package com.tianhua.datafactory.vo; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description: + * date: 2022/5/17 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class OptionsVO { + + private List> options = new ArrayList<>(); + + public void addOptionItem(String label,String value){ + Map optionItem = new HashMap<>(); + optionItem.put("label",label); + optionItem.put("value",value); + this.options.add(optionItem); + } + + + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/PageVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/PageVO.java new file mode 100644 index 0000000000000000000000000000000000000000..4a3a936ae378768a2e3f43bc7c93553dc09c3f1e --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/PageVO.java @@ -0,0 +1,104 @@ +package com.tianhua.datafactory.vo; + +import com.alibaba.fastjson.annotation.JSONField; +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; + +/** + * Description: + * date: 2022/4/24 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class PageVO { + public String orderBy; + public String orderDir; + /** + * 当前页数 + */ + public Integer page; + + /** + * 每页要展示的数量 + */ + public Integer perPage; + + /** + * 分页接口返回的总数量 + */ + public Integer count; + + /** + * 分页接口返回的当前页数据 + */ + public List rows; + + public String getOrderBy() { + return orderBy; + } + + public void setOrderBy(String orderBy) { + this.orderBy = orderBy; + } + + public String getOrderDir() { + return orderDir; + } + + public void setOrderDir(String orderDir) { + this.orderDir = orderDir; + } + + public Integer getPage() { + return page; + } + + public void setPage(Integer page) { + this.page = page; + } + + public Integer getPerPage() { + return perPage; + } + + public void setPerPage(Integer perPage) { + this.perPage = perPage; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + @JSONField(serialize = false) + public PageBean getPageBean(){ + PageBean pageBean = new PageBean(); + pageBean.setPage(page); + pageBean.setPerPage(perPage); + pageBean.setCount(count); + if(StringUtils.isNotEmpty(orderBy) && StringUtils.isNotEmpty(orderDir)){ + pageBean.setOrderBy(orderBy); + pageBean.setOrderDir(orderDir); + } + pageBean.calculateStartAndEndRow(); + pageBean.dealOrderByInfo(); + return pageBean; + } + + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/ResultAmisVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/ResultAmisVO.java new file mode 100644 index 0000000000000000000000000000000000000000..4570361085213f77807c0cdfe1028e03205160f0 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/ResultAmisVO.java @@ -0,0 +1,21 @@ +package com.tianhua.datafactory.vo; + +import com.coderman.utils.response.ResultDataDto; +import lombok.Data; + +/** + * Description + * 适配amis的接口返回契约 + * + * https://baidu.github.io/amis/zh-CN/docs/types/api + * + * date: 2022/9/5 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class ResultAmisVO extends ResultDataDto { + private Integer status; +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/StatusChangeVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/StatusChangeVO.java new file mode 100644 index 0000000000000000000000000000000000000000..0733c9127a3899aa0a87dbd3678f0e8cf2a421e9 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/StatusChangeVO.java @@ -0,0 +1,18 @@ +package com.tianhua.datafactory.vo; + +import lombok.Data; + +/** + * Description + * date: 2022/9/6 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class StatusChangeVO { + private Integer status; + private String moduleName; + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/amis/ComponentVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/amis/ComponentVO.java new file mode 100644 index 0000000000000000000000000000000000000000..2ea447854d71a205d539643e954f98653e1f29c7 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/amis/ComponentVO.java @@ -0,0 +1,18 @@ +package com.tianhua.datafactory.vo.amis; + +import lombok.Data; + +/** + * Description + * date: 2022/9/8 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class ComponentVO { + private String type; + private String name; + private String label; +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/amis/ContainerVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/amis/ContainerVO.java new file mode 100644 index 0000000000000000000000000000000000000000..b7309e983cbce29a5faf4b3eb5abba79b8e5ea1d --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/amis/ContainerVO.java @@ -0,0 +1,27 @@ +package com.tianhua.datafactory.vo.amis; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * Description + * date: 2022/9/8 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class ContainerVO { + + private String type; + + private List body = new ArrayList<>(); + + + public void addComponent(ComponentVO componentVO){ + body.add(componentVO); + } +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/datafactory/DataBuildRequestVo.java b/adapter/src/main/java/com/tianhua/datafactory/vo/datafactory/DataBuildRequestVo.java new file mode 100644 index 0000000000000000000000000000000000000000..f1cf47c597034d51b4cf9c50e732fcde60f40753 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/datafactory/DataBuildRequestVo.java @@ -0,0 +1,57 @@ +package com.tianhua.datafactory.vo.datafactory; + +import com.tianhua.datafactory.vo.model.FieldVO; +import lombok.Data; +import lombok.ToString; + +import java.util.List; + +/** + * description: DataFactoryVo
+ * date: 2020/12/2 23:48
+ * author: coderman
+ * version: 1.0
+ */ +@Data +@ToString +public class DataBuildRequestVo { + /** + * 项目编码 + */ + private String projectCode; + + /** + * 模型类名 + */ + private String paramModelCode; + + /** + * 模型属性名称 + */ + private List fieldVOList; + + /** + * 生成条数 + */ + private Integer buildCount; + + /** + * insert.sql + * json.json(default) + * excel.xlsx + * + */ + private String dataUseType; + + /** + * 模型对应的api签名 + */ + private String apiSign; + + + /** + * mock数据结果 + */ + private String mockResultData; + +} diff --git a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/vo/DataFactoryRequestFieldRuleVo.java b/adapter/src/main/java/com/tianhua/datafactory/vo/datafactory/DataFactoryRequestFieldRuleVo.java similarity index 94% rename from datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/vo/DataFactoryRequestFieldRuleVo.java rename to adapter/src/main/java/com/tianhua/datafactory/vo/datafactory/DataFactoryRequestFieldRuleVo.java index e525b18b18e69a722b2a462114b8935c6f16df75..5e6c0892da332dfab0cda58ab53d83569e830db8 100644 --- a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/vo/DataFactoryRequestFieldRuleVo.java +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/datafactory/DataFactoryRequestFieldRuleVo.java @@ -1,4 +1,4 @@ -package com.coderman.tianhua.datafactory.api.vo; +package com.tianhua.datafactory.vo.datafactory; import lombok.Data; import lombok.ToString; diff --git a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/vo/DataFactoryRequestFieldVo.java b/adapter/src/main/java/com/tianhua/datafactory/vo/datafactory/DataFactoryRequestFieldVo.java similarity index 92% rename from datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/vo/DataFactoryRequestFieldVo.java rename to adapter/src/main/java/com/tianhua/datafactory/vo/datafactory/DataFactoryRequestFieldVo.java index a1e65c450f47675fc5ae34ea8c5545a640e882df..285526c3354fc3f039b53f95557e4412e16f312e 100644 --- a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/vo/DataFactoryRequestFieldVo.java +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/datafactory/DataFactoryRequestFieldVo.java @@ -1,4 +1,4 @@ -package com.coderman.tianhua.datafactory.api.vo; +package com.tianhua.datafactory.vo.datafactory; import lombok.Data; import lombok.ToString; @@ -22,7 +22,8 @@ public class DataFactoryRequestFieldVo { /** * 字段类型 */ - private String fieldTypeStr; + private String fieldType; + /** * 字段值数据源code */ diff --git a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/vo/DataFactoryResponseVo.java b/adapter/src/main/java/com/tianhua/datafactory/vo/datafactory/DataFactoryResponseVo.java similarity index 81% rename from datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/vo/DataFactoryResponseVo.java rename to adapter/src/main/java/com/tianhua/datafactory/vo/datafactory/DataFactoryResponseVo.java index 4f8fa5bdcff569fa7bca85630b66ed0db563004c..016eeba94b57317e2153cb8bebb432d57a5fc52b 100644 --- a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/vo/DataFactoryResponseVo.java +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/datafactory/DataFactoryResponseVo.java @@ -1,4 +1,4 @@ -package com.coderman.tianhua.datafactory.api.vo; +package com.tianhua.datafactory.vo.datafactory; import lombok.Data; import lombok.ToString; diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/vo/DataSourceDetailVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/datasource/DataSourceDetailVO.java similarity index 87% rename from datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/vo/DataSourceDetailVO.java rename to adapter/src/main/java/com/tianhua/datafactory/vo/datasource/DataSourceDetailVO.java index d2acee99c5ce83d5a7597738cb8caa62bb210c51..e81b2ddfb7179b6682e984573b83698ddecc2009 100644 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/vo/DataSourceDetailVO.java +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/datasource/DataSourceDetailVO.java @@ -1,4 +1,4 @@ -package com.coderman.tianhua.datafactory.core.vo; +package com.tianhua.datafactory.vo.datasource; import lombok.Data; import lombok.ToString; diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/datasource/DataSourceReqConfigVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/datasource/DataSourceReqConfigVO.java new file mode 100644 index 0000000000000000000000000000000000000000..97f19945e0b5b48b173c52b56e2cc237edfcb236 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/datasource/DataSourceReqConfigVO.java @@ -0,0 +1,41 @@ +package com.tianhua.datafactory.vo.datasource; + +import lombok.Data; + +/** + * Description: + * date: 2022/6/2 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class DataSourceReqConfigVO { + private Long id; + + /** + * 参数key + */ + private String paramKey; + + /** + * 参数值 + */ + private String paramValue; + + /** + * 参数描述 + */ + private String paramDesc; + + /** + * 是否是可选参数 + */ + private boolean required; + + /** + * 是否是请求接口参数 + */ + private boolean interfaceParam; +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/datasource/DataSourceRespConfigVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/datasource/DataSourceRespConfigVO.java new file mode 100644 index 0000000000000000000000000000000000000000..043be445ba5390c5063349189249bb4707e7b7d9 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/datasource/DataSourceRespConfigVO.java @@ -0,0 +1,34 @@ +package com.tianhua.datafactory.vo.datasource; + +import lombok.Data; + +/** + * Description:数据源响应参数配置 + * date: 2022/6/2 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class DataSourceRespConfigVO { + /** + * + */ + private String fieldKey; + + /** + * 请求路径如a.b.c + */ + private String referPath; + + /** + * 数据描述 + */ + private String fieldDesc; + + /** + * 数据类型 + */ + private String fieldType; +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/datasource/DataSourceVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/datasource/DataSourceVO.java new file mode 100644 index 0000000000000000000000000000000000000000..af68016d248eb380aaf01bd83d5d40418017a1ee --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/datasource/DataSourceVO.java @@ -0,0 +1,79 @@ +package com.tianhua.datafactory.vo.datasource; + +import com.tianhua.datafactory.vo.BaseVO; +import lombok.Data; +import lombok.ToString; + +import java.util.List; + +/** +* @Description:数据源管理表VO类 +* @Author:fanchunshuai +* @CreateTime:2020-12-02 23:07:13 +* @version v1.0 +*/ +@Data +@ToString +public class DataSourceVO extends BaseVO { + + + /** 主键 **/ + private Long id; + + /** 数据源名称 **/ + private String sourceName; + + /** 数据源code,唯一 **/ + private String sourceCode; + + /** 数据源类型/(regist,api,enum,constant) **/ + private Integer sourceType; + /** + * 数据提供来源服务 + */ + private String providerService; + + /** 数据源访问url **/ + private String url; + + + /** 访问策略 **/ + private Integer visitStrategy; + + private String visitStrategyDesc; + private String sourceTypeDesc; + + + /** + * 服务提供者域名 + */ + private String providerDomainUrl; + + /** + * 注册中心类型 + */ + private Integer registServer; + + /** + * 数据源格式 + */ + private String structType; + + /** + * 数据源请求配置参数 + */ + private List dataSourceReqConfigList; + + /** + * 数据源响应配置参数 + */ + private List dataSourceRespConfigList; + + + /** + * 数据列表 + */ + private List kvPairList; + + +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/datasource/KVPairVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/datasource/KVPairVO.java new file mode 100644 index 0000000000000000000000000000000000000000..98d67f3a173a7065edc034cf34d1c3c5cdd5a8aa --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/datasource/KVPairVO.java @@ -0,0 +1,291 @@ +package com.tianhua.datafactory.vo.datasource; + +import com.alibaba.fastjson.annotation.JSONField; +import com.tianhua.datafactory.domain.support.kvpair.KVPair; +import com.tianhua.datafactory.domain.support.kvpair.KVTypeEnum; +import lombok.Data; + +/** + * Description: kv业务实体 + * + * + * date: 2022/1/11 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + * + * 建造者模式 + */ +public class KVPairVO { + private String key; + private String value; + private String groupKey; + private String parentKey; + + /** + * 关联了哪个对象 + */ + private String referObj; + + /** + * 关联对象的标示 + */ + private String referIdentifer; + + /** + * value值类型 + */ + private Integer valueType; + + /** + * key值类型 + */ + private Integer keyType; + + /** + * json格式的对象存储 + */ + private Object valueObject; + + /** + * kv状态,跟着主对象走 + */ + private Integer status; + + + + public KVPairVO(){} + + public KVPairVO(String key, String value){ + this.key = key; + this.value = value; + } + + public KVPairVO(String key, String value, Integer valueType){ + KVPairVO kvPairBO = new KVPairVO(key,value); + kvPairBO.valueType(valueType); + } + + public static KVPairVO instance(String key, String value){ + return new KVPairVO(key,value); + } + + public static KVPairVO instance(){ + return new KVPairVO(); + } + + public String getKey() { + return key; + } + + public KVPairVO Key(String key) { + this.key = key; + return this; + } + + public Integer getStatus() { + return status; + } + + + public KVPairVO status(Integer status){ + this.status = status; + return this; + } + + + public Object getValueObject() { + return valueObject; + } + + public String getValue() { + return value; + } + + public KVPairVO value(String value) { + this.value = value; + return this; + } + + public KVPairVO valueObject(Object valueObject){ + this.valueObject = valueObject; + return this; + } + + public String getGroupKey() { + return groupKey; + } + + public KVPairVO groupKey(String groupKey) { + this.groupKey = groupKey; + return this; + } + + public String getParentKey() { + return parentKey; + } + + public KVPairVO parentKey(String parentKey) { + this.parentKey = parentKey; + return this; + } + + public String getReferObj() { + return referObj; + } + + public KVPairVO referObj(String referObj) { + this.referObj = referObj; + return this; + } + + public String getReferIdentifer() { + return referIdentifer; + } + + public KVPairVO referIdentifer(String referIdentifer) { + this.referIdentifer = referIdentifer; + return this; + } + + public Integer getValueType() { + return valueType; + } + + public Integer getKeyType() { + return keyType; + } + + + public KVPairVO valueType(Integer valueType) { + this.valueType = valueType; + return this; + } + + public KVPairVO keyType(Integer keyType) { + this.keyType = keyType; + return this; + } + + + + private KVPair convert2KVPair(){ + if(KVTypeEnum.isInteger(this.getKeyType()) && KVTypeEnum.isInteger(this.getValueType())){ + return KVPair.build(getIntegerKey(),getIntegerValue()); + } + + if(KVTypeEnum.isInteger(this.getKeyType()) && KVTypeEnum.isLong(this.getValueType())){ + return KVPair.build(getIntegerKey(),getLongValue()); + } + + if(KVTypeEnum.isInteger(this.getKeyType()) && KVTypeEnum.isString(this.getValueType())){ + return KVPair.build(getIntegerKey(),getStringValue()); + } + + if(KVTypeEnum.isInteger(this.getKeyType()) && KVTypeEnum.isJSONObject(this.getValueType())){ + return KVPair.build(getIntegerKey(),getObjectValue()); + } + + + if(KVTypeEnum.isLong(this.getKeyType()) && KVTypeEnum.isInteger(this.getValueType())){ + return KVPair.build(getLongKey(),getIntegerValue()); + } + + if(KVTypeEnum.isLong(this.getKeyType()) && KVTypeEnum.isLong(this.getValueType())){ + return KVPair.build(getLongKey(),getLongValue()); + } + + if(KVTypeEnum.isLong(this.getKeyType()) && KVTypeEnum.isString(this.getValueType())){ + return KVPair.build(getLongKey(),getStringValue()); + } + + if(KVTypeEnum.isLong(this.getKeyType()) && KVTypeEnum.isJSONObject(this.getValueType())){ + return KVPair.build(getLongKey(),getObjectValue()); + } + + return KVPair.build(getStringKey(),getStringValue()); + + } + + + + + @JSONField(serialize = false) + public Integer getIntegerKey(){ + return Integer.parseInt(this.key); + } + + @JSONField(serialize = false) + public Integer getIntegerValue(){ + return Integer.parseInt(this.value); + } + + @JSONField(serialize = false) + public Long getLongKey(){ + return Long.parseLong(this.key); + } + + @JSONField(serialize = false) + public Long getLongValue(){ + return Long.parseLong(this.value); + } + + @JSONField(serialize = false) + public String getStringKey(){ + return this.key; + } + + @JSONField(serialize = false) + public String getStringValue(){ + return this.value; + } + + @JSONField(serialize = false) + public Object getObjectValue(){ + return this.valueObject; + } + + + public void setKey(String key) { + this.key = key; + } + + public void setValue(String value) { + this.value = value; + } + + public void setGroupKey(String groupKey) { + this.groupKey = groupKey; + } + + public void setParentKey(String parentKey) { + this.parentKey = parentKey; + } + + public void setReferObj(String referObj) { + this.referObj = referObj; + } + + public void setReferIdentifer(String referIdentifer) { + this.referIdentifer = referIdentifer; + } + + public void setValueType(Integer valueType) { + this.valueType = valueType; + } + + public void setKeyType(Integer keyType) { + this.keyType = keyType; + } + + public void setValueObject(Object valueObject) { + this.valueObject = valueObject; + } + + public void setStatus(Integer status) { + this.status = status; + } + + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/model/ColumnVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/model/ColumnVO.java new file mode 100644 index 0000000000000000000000000000000000000000..4af676c846d852f528fdd24fb0d9862fdeb4dee5 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/model/ColumnVO.java @@ -0,0 +1,45 @@ +package com.tianhua.datafactory.vo.model; + + +import com.tianhua.datafactory.vo.BaseVO; +import lombok.Data; +import lombok.ToString; + + /** + * @Description:数据库column模型信息类 + * @Author: + * @CreateTime:2022-05-27 16:48:08 + * @version v1.0 + */ +@Data +@ToString +public class ColumnVO extends BaseVO { + + + /** 字段名称 **/ + private String columnName; + + /** 字段描述 **/ + private String columnComment; + + /** 字段长度 **/ + private Integer columnLength; + + /** 字段是否为空 **/ + private boolean notNull; + + /** 字段默认值 **/ + private String defaultValue; + + /** 数据库编码 **/ + private String tableName; + + /** 是否唯一键 **/ + private boolean uniqColumn; + + + /** 字段类型 **/ + private String columnType; + + +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/model/FieldVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/model/FieldVO.java new file mode 100644 index 0000000000000000000000000000000000000000..7e686a619baaacd489936b39ab772f715ea71357 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/model/FieldVO.java @@ -0,0 +1,80 @@ +package com.tianhua.datafactory.vo.model; + +import com.tianhua.datafactory.vo.BaseVO; +import lombok.Data; +import lombok.ToString; + +import java.util.List; + +/** +* @Description:属性信息类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Data +@ToString +public class FieldVO extends BaseVO { + + private Long id; + + /** 属性名称 **/ + private String fieldName; + + /** 属性描述 **/ + private String fieldDesc; + + /** 属性中文注释 **/ + private String fieldDoc; + + /** 关联数据源编码 **/ + private String dataSourceCode; + + /** 参数类名称 **/ + private String paramClassName; + + /** + * 属性类型 + */ + private String fieldType; + + /** + * 是否可以代表业务唯一性 + */ + private Boolean bizUnique; + + /** + * 是否可以作为领域实体标示 + */ + private Boolean bizIdentifier; + + /** + * 是否是复杂数据类型(list,map,set,objrefer) + */ + private Boolean complexStruct; + + + /** + * 本身是否存在特定规则校验(邮箱格式,域名格式,身份证格式,银行卡格式,姓名中文英文等等) + */ + private Boolean checkRule; + + + /** + * 是否对应数据库字段 + */ + private Boolean mappingDBColumn; + + + /** + * 默认值列表(不超过3个,建议常量或者是否之类的,否则使用固定数据源) + */ + private String defaultValueList; + + + /** + * 构建的属性模型DSL描述 + */ + private String buildRuleDSL; + +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/model/ModelMappingVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/model/ModelMappingVO.java new file mode 100644 index 0000000000000000000000000000000000000000..0856c272d9de725704075a7793c5eb7d55cfbf78 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/model/ModelMappingVO.java @@ -0,0 +1,50 @@ +package com.tianhua.datafactory.vo.model; + + +import lombok.Data; +import lombok.ToString; + +/** +* @Description:模型映射信息类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Data +@ToString +public class ModelMappingVO { + + private Long id; + + + /** + * 映射模型类名 or表名 + */ + private String mappingClassFirst; + + /** + * 映射模型属性名 + */ + private String mappingFieldFirst; + + + /** + * 映射模型类名 or表名 + */ + private String mappingClassSecond; + + /** + * 映射模型属性名 + */ + private String mappingFieldSecond; + + + + /** 映射类型 **/ + private String mappingType; + + /** 项目编码 **/ + private String projectCode; + + +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/model/ModelSuffixConfigVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/model/ModelSuffixConfigVO.java new file mode 100644 index 0000000000000000000000000000000000000000..7f492720825c3c8ddd954e84ca755a6e32ddd414 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/model/ModelSuffixConfigVO.java @@ -0,0 +1,29 @@ +package com.tianhua.datafactory.vo.model; + + +import lombok.Data; +import lombok.ToString; + + /** + * @Description:模型后缀信息类 + * @Author: + * @CreateTime:2022-05-27 16:48:08 + * @version v1.0 + */ +@Data +@ToString +public class ModelSuffixConfigVO { + + private Long id; + + /** 模型后缀 **/ + private String suffix; + + /** 模型后缀描述 **/ + private String desc; + + /** 模型类型 **/ + private String modelType; + + +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/model/ParamModelVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/model/ParamModelVO.java new file mode 100644 index 0000000000000000000000000000000000000000..dda93de9ff9b2f45de9277080277a63ec3b924dd --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/model/ParamModelVO.java @@ -0,0 +1,80 @@ +package com.tianhua.datafactory.vo.model; + + +import com.tianhua.datafactory.vo.BaseVO; +import lombok.Data; +import lombok.ToString; + +import java.util.List; + +/** + * @Description:参数模型信息类 + * @Author: + * @CreateTime:2022-05-27 16:48:08 + * @version v1.0 + */ +@Data +@ToString +public class ParamModelVO extends BaseVO { + + /** 模型类名称 **/ + private String paramClassName; + + /** + * 模型参数名称 + * 模型作为api参数使用 + */ + private String paramVarName; + + + /** 参数类描述 **/ + private String classDesc; + + /** 所属项目名称 **/ + private String projectCode; + + /** 主键 **/ + private Long id; + + /** 所属上下文或模块编码 **/ + private String moduleCode; + + /** 参数类描述 **/ + private String paramClassDesc; + + /** 参数属性集合json **/ + private String paramFieldJson; + + /** 是否是泛型参数 **/ + private boolean isGeneralType; + + /** 属性列表 **/ + private List fieldBeanList; + + + /** 模型后缀 **/ + private String modelSuffix; + + /** 参数映射模型 **/ + private List modelMappingBOList; + + + private String file; + + /** + * 接口入参为string,long,integer之类的参数类型,从前端绑定 + * + */ + private String dataSourceCode; + + /** + * 接口 出入参为string,long,integer之类的参数类型, 构建的属性模型DSL描述 + */ + private String buildRuleDSL; + + /** + * 出入参为string,long,integer之类的参数类型, 默认值列表(不超过3个,建议常量或者是否之类的,否则使用固定数据源) + */ + private String defaultValueList; + +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/model/TableVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/model/TableVO.java new file mode 100644 index 0000000000000000000000000000000000000000..29e2b3051ccdc81404fb18f2145e4f2286688bf0 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/model/TableVO.java @@ -0,0 +1,49 @@ +package com.tianhua.datafactory.vo.model; + + +import com.tianhua.datafactory.vo.BaseVO; +import lombok.Data; +import lombok.ToString; + +import java.util.List; + +/** + * @Description:数据库table模型信息类 + * @Author: + * @CreateTime:2022-05-27 16:48:08 + * @version v1.0 + */ +@Data +@ToString +public class TableVO extends BaseVO { + + private Long id; + + /** 数据库表名 **/ + private String tableName; + + /** 数据库表描述 **/ + private String tableComment; + + /** 数据库名称 **/ + private String dbName; + + /** 项目编码 **/ + private String projectCode; + + /** 数据库字段列表 **/ + private List columnList; + + private String file; + + + /** + * 是否快捷构建JavaEntity模型 + */ + private Boolean buildJavaEntity; + + /** 模型后缀 **/ + private String modelSuffix; + + +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/project/ApiMockVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/project/ApiMockVO.java new file mode 100644 index 0000000000000000000000000000000000000000..37547dc0d07d38148d69351c8463807128a83626 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/project/ApiMockVO.java @@ -0,0 +1,61 @@ +package com.tianhua.datafactory.vo.project; + +import com.tianhua.datafactory.vo.BaseVO; +import com.tianhua.datafactory.vo.model.ParamModelVO; +import lombok.Data; + +import java.util.List; + +/** + * Description + * api数据mock + * date: 2022/9/5 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class ApiMockVO extends BaseVO { + + /** + * 项目编码 + */ + private String projectCode; + + /** + * api接口签名 + */ + private String apiSign; + + + /** + * 适用于对外接口返回场景 + */ + private Boolean successData; + + + /** + * mock数据结果 + */ + private String mockResultData; + + /** + * 与api sign一样 + */ + private String apiMethod; + + /** + * 参数模型 + * + */ + private List paramModelList; + + /** + * mock数据的数量 + */ + private Integer mockCount; + + + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/project/ApiVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/project/ApiVO.java new file mode 100644 index 0000000000000000000000000000000000000000..6a6040ef0b8ca4d91a2d087ed470b18296c8ce91 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/project/ApiVO.java @@ -0,0 +1,96 @@ +package com.tianhua.datafactory.vo.project; + +import java.util.List; +import java.util.Map; + +import com.tianhua.datafactory.domain.enums.ReturnWrapClassEnum; +import com.tianhua.datafactory.vo.BaseVO; +import com.tianhua.datafactory.vo.model.ParamModelVO; +import lombok.Data; +import lombok.ToString; + + /** + * @Description:api模型信息类 + * @Author: + * @CreateTime:2022-05-27 16:48:08 + * @version v1.0 + */ +@Data +@ToString +public class ApiVO extends BaseVO { + + + private Long id; + + + /** api类型 **/ + private String apiType; + + /** api签名 **/ + private String apiSign; + + /** api返回类型 **/ + private String returnType; + + /** api请求方式 **/ + private String methodType; + + /** api返回值集合 **/ + private String returnValue; + + /** api参数可选值列表 **/ + private Map> paramDefaultValueList; + + /** api所属项目编码 **/ + private String projectCode; + + /** api 请求参数列表 **/ + private List paramList; + + /** api信息 **/ + private String apiUrl; + + + /** api描述 **/ + private String apiDoc; + + + /** + * 进行接口mock调用的时候接口返回的条数 + * 1条或者多条 + * 模拟后端数据返回 + */ + private Integer mockCount; + + /** + * api返回包装类型 + * @see ReturnWrapClassEnum + */ + private Integer apiReturnWrapType; + + /** + * api返回包装类型名称 + */ + private String apiReturnWrapTypeDesc; + + /** + * 上传的plantuml文件 + */ + private String file; + + /** + * api返回类型 + */ + private String returnParamClass; + + /** + * 请求参数类名 + */ + private String requestParamClasses; + + /** + * api返回参数对象 + */ + private ParamModelVO returnParam; + + } \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/project/ProjectVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/project/ProjectVO.java new file mode 100644 index 0000000000000000000000000000000000000000..cbaae541919d971ca2a42f4c5b9b504fe36a90f0 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/project/ProjectVO.java @@ -0,0 +1,51 @@ +package com.tianhua.datafactory.vo.project; + + +import com.tianhua.datafactory.domain.bo.project.ApiBO; +import com.tianhua.datafactory.vo.BaseVO; +import lombok.Data; +import lombok.ToString; + +import java.util.Date; +import java.util.List; + +/** + * @Description:项目基本信息类 + * @Author: + * @CreateTime:2022-05-27 16:48:08 + * @version v1.0 + */ +@Data +@ToString +public class ProjectVO extends BaseVO { + + + /** 项目应用名 **/ + private String projectCode; + + /** 应用描述 **/ + private String projectDesc; + + /** 业务领域编码 **/ + private String domainCode; + + /** 业务领域描述 **/ + private String domainDesc; + + /** app描述 **/ + private String appDesc; + + /** 所属业务线 **/ + private String busLine; + + /** 所属部门 **/ + private String deptName; + + /** 项目api列表 **/ + private List apiList; + + private Long id; + + private String file; + +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/query/ApiQueryVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/query/ApiQueryVO.java new file mode 100644 index 0000000000000000000000000000000000000000..b2aa0b0d485272e58652e526e87a33e04c450f6c --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/query/ApiQueryVO.java @@ -0,0 +1,62 @@ +package com.tianhua.datafactory.vo.query; + + +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.vo.PageVO; +import lombok.Data; +import lombok.ToString; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Description:查询api模型信息请求VO类 + * @Author:shenshuai + * @CreateTime:2022-05-27 16:48:08 + * @version v1.0 + */ +@Data +@ToString +public class ApiQueryVO extends PageVO { + + /** **/ + String apiType; + + /** **/ + String apiSign; + + /** **/ + String methodType; + + /** **/ + String projectCode; + + /** + * 状态 + * @See com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum + */ + private Integer status; + + public PageBean getPageBean(){ + PageBean pageBean = super.getPageBean(); + Map query = new HashMap<>(); + if(StringUtils.isNotEmpty(apiType)){ + query.put("apiType",apiType); + } + if(StringUtils.isNotEmpty(methodType)){ + query.put("methodType",methodType); + } + if(StringUtils.isNotEmpty(apiSign)){ + query.put("apiSign",apiSign); + } + if(StringUtils.isNotEmpty(projectCode)){ + query.put("projectCode",projectCode); + } + if(status != null){ + query.put("status",status); + } + pageBean.setQuery(query); + return pageBean; + } +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/query/DataSourceQueryVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/query/DataSourceQueryVO.java new file mode 100644 index 0000000000000000000000000000000000000000..d2aaa83e3137ca4f98cf23a11cf4b0f3ae34ad69 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/query/DataSourceQueryVO.java @@ -0,0 +1,66 @@ +package com.tianhua.datafactory.vo.query; + +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.vo.PageVO; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * description: DataSourceQueryDTO
+ * date: 2021/1/27 23:45
+ * author: coderman
+ * version: 1.0
+ */ +@Data +public class DataSourceQueryVO extends PageVO { + /** + * 数据源code + */ + private String dataSourceCode; + /** + * 数据源名称 + */ + private String dataSourceName; + + /** 数据源类型/(regist,api,enum) **/ + private Integer sourceType; + + /** 状态(0正常,1过期) **/ + private Integer status; + + + /** + * 数据源的访问策略 + */ + private Integer visitStrategy; + + public PageBean getPageBean(){ + PageBean pageBean = super.getPageBean(); + Map query = new HashMap<>(); + if(StringUtils.isNotEmpty(dataSourceCode)){ + query.put("dataSourceCode",dataSourceCode); + } + if(StringUtils.isNotEmpty(dataSourceName)){ + query.put("dataSourceName",dataSourceName); + } + + if(sourceType != null){ + query.put("sourceType",sourceType); + } + + if(status != null){ + query.put("status",status); + } + if(visitStrategy != null){ + query.put("visitStrategy",visitStrategy); + } + pageBean.setQuery(query); + return pageBean; + } + + + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/query/ModelMappingQueryVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/query/ModelMappingQueryVO.java new file mode 100644 index 0000000000000000000000000000000000000000..eac7460feea3ec4976c6be2e27c79552e11339ca --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/query/ModelMappingQueryVO.java @@ -0,0 +1,51 @@ +package com.tianhua.datafactory.vo.query; + +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.vo.PageVO; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * Description: + * date: 2022/6/2 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class ModelMappingQueryVO extends PageVO { + + /** **/ + String projectCode; + + /** 映射类型 **/ + String mappingType; + + /** + * 映射模型类名 or表名 + */ + String mappingClass; + + + public PageBean getPageBean(){ + PageBean pageBean = super.getPageBean(); + Map query = new HashMap<>(); + if(StringUtils.isNotEmpty(projectCode)){ + query.put("projectCode",projectCode); + } + if(StringUtils.isNotEmpty(mappingClass)){ + query.put("mappingClass",mappingClass); + } + if(StringUtils.isNotEmpty(mappingType)){ + query.put("mappingType",mappingType); + } + + pageBean.setQuery(query); + return pageBean; + } + +} diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/query/ParamModelQueryVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/query/ParamModelQueryVO.java new file mode 100644 index 0000000000000000000000000000000000000000..0f4834b8885350cd2b0b3ce0628cebe4c8f009e3 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/query/ParamModelQueryVO.java @@ -0,0 +1,51 @@ +package com.tianhua.datafactory.vo.query; + + +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.vo.PageVO; +import lombok.Data; +import lombok.ToString; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Description:查询参数模型信息请求VO类 + * @Author:shenshuai + * @CreateTime:2022-05-27 16:48:08 + * @version v1.0 + */ +@Data +@ToString +public class ParamModelQueryVO extends PageVO { + + + /** **/ + String projectCode; + + /** **/ + String paramClassName; + + /** + * 模型后缀 + */ + String modelSuffix; + + public PageBean getPageBean(){ + PageBean pageBean = super.getPageBean(); + Map query = new HashMap<>(); + if(StringUtils.isNotEmpty(projectCode)){ + query.put("projectCode",projectCode); + } + if(StringUtils.isNotEmpty(paramClassName)){ + query.put("paramClassName",paramClassName); + } + + if(StringUtils.isNotEmpty(modelSuffix)){ + query.put("modelSuffix",modelSuffix); + } + pageBean.setQuery(query); + return pageBean; + } +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/query/ProjectQueryVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/query/ProjectQueryVO.java new file mode 100644 index 0000000000000000000000000000000000000000..336d6a41057b56a5de05e0a40be5845cd3b29b8a --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/query/ProjectQueryVO.java @@ -0,0 +1,46 @@ +package com.tianhua.datafactory.vo.query; + + +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.vo.PageVO; +import lombok.Data; +import lombok.ToString; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Description:查询项目基本信息请求VO类 + * @Author:shenshuai + * @CreateTime:2022-05-27 16:48:08 + * @version v1.0 + */ +@Data +@ToString +public class ProjectQueryVO extends PageVO { + + private String projectCode; + + private String domainCode; + + private Integer status; + + public PageBean getPageBean(){ + PageBean pageBean = super.getPageBean(); + Map query = new HashMap<>(); + if(StringUtils.isNotEmpty(projectCode)){ + query.put("projectCode",projectCode); + } + if(StringUtils.isNotEmpty(domainCode)){ + query.put("domainCode",domainCode); + } + + if(status != null){ + query.put("status",status); + } + pageBean.setQuery(query); + return pageBean; + } + +} \ No newline at end of file diff --git a/adapter/src/main/java/com/tianhua/datafactory/vo/query/TableQueryVO.java b/adapter/src/main/java/com/tianhua/datafactory/vo/query/TableQueryVO.java new file mode 100644 index 0000000000000000000000000000000000000000..927d4f7624a1eaa2b8c33a329f4e1627b391c144 --- /dev/null +++ b/adapter/src/main/java/com/tianhua/datafactory/vo/query/TableQueryVO.java @@ -0,0 +1,55 @@ +package com.tianhua.datafactory.vo.query; + + +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.vo.PageVO; +import lombok.Data; +import lombok.ToString; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Description:查询数据库table模型信息请求VO类 + * @Author:shenshuai + * @CreateTime:2022-05-27 16:48:08 + * @version v1.0 + */ +@Data +@ToString +public class TableQueryVO extends PageVO { + + + /** **/ + String projectCode; + + /** **/ + String tableName; + + String tableComment; + + Integer status; + + + public PageBean getPageBean(){ + PageBean pageBean = super.getPageBean(); + Map query = new HashMap<>(); + if(StringUtils.isNotEmpty(projectCode)){ + query.put("projectCode",projectCode); + } + if(StringUtils.isNotEmpty(tableName)){ + query.put("tableName",tableName); + } + if(StringUtils.isNotEmpty(tableComment)){ + query.put("tableComment",tableComment); + } + + if(status != null){ + query.put("status",status); + } + + pageBean.setQuery(query); + return pageBean; + } +} \ No newline at end of file diff --git a/datafactory-api/src/test/java/com/coderman/tianhua/datafactory/api/test/DataFactoryControllerTest.java b/adapter/src/test/java/com/coderman/tianhua/datafactory/api/test/DataFactoryControllerTest.java similarity index 98% rename from datafactory-api/src/test/java/com/coderman/tianhua/datafactory/api/test/DataFactoryControllerTest.java rename to adapter/src/test/java/com/coderman/tianhua/datafactory/api/test/DataFactoryControllerTest.java index 9056c236849f77e2456fc992350405c9fbc6b3f1..672b40097f02d6c449a2c464ded5dd6eb644e703 100644 --- a/datafactory-api/src/test/java/com/coderman/tianhua/datafactory/api/test/DataFactoryControllerTest.java +++ b/adapter/src/test/java/com/coderman/tianhua/datafactory/api/test/DataFactoryControllerTest.java @@ -1,10 +1,10 @@ +/* package com.coderman.tianhua.datafactory.api.test; import com.alibaba.fastjson.JSON; -import com.coderman.tianhua.datafactory.api.Application; -import com.coderman.tianhua.datafactory.api.vo.DataFactoryRequestFieldRuleVo; -import com.coderman.tianhua.datafactory.api.vo.DataFactoryRequestFieldVo; -import com.coderman.tianhua.datafactory.api.vo.DataFactoryRequestVo; +import com.tianhua.datafactory.vo.datafactory.DataFactoryRequestFieldRuleVo; +import com.tianhua.datafactory.vo.datafactory.DataFactoryRequestFieldVo; +import com.tianhua.datafactory.vo.datafactory.DataFactoryRequestVo; import com.coderman.utils.response.ResultDataDto; import org.junit.Test; import org.junit.runner.RunWith; @@ -16,21 +16,25 @@ import org.springframework.test.context.junit4.SpringRunner; import java.util.ArrayList; import java.util.List; +*/ /** * description: DataFactoryControllerTest
* date: 2020/12/7 23:42
* author: coderman
* version: 1.0
- */ + *//* + @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT,classes = {Application.class}) public class DataFactoryControllerTest { @Autowired private TestRestTemplate restTemplate; - /** + */ +/** * 测试基于内置函数的随机数据生成 - */ + *//* + @Test public void testGenerateFromFunction(){ DataFactoryRequestVo dataFactoryRequestVo = new DataFactoryRequestVo(); @@ -82,9 +86,11 @@ public class DataFactoryControllerTest { } - /** + */ +/** * 测试基于自定义的随机数据生成 - */ + *//* + @Test public void testGenerateFromCustomAndFunction(){ DataFactoryRequestVo dataFactoryRequestVo = new DataFactoryRequestVo(); @@ -200,9 +206,11 @@ public class DataFactoryControllerTest { - /** + */ +/** * 测试基于nacos数据源的数据生成 - */ + *//* + @Test public void testGenerateFromCustomAndFunctionAndNacos(){ DataFactoryRequestVo dataFactoryRequestVo = new DataFactoryRequestVo(); @@ -332,9 +340,11 @@ public class DataFactoryControllerTest { - /** + */ +/** * 测试基于远程服务的数据生成 - */ + *//* + @Test public void testGenerateFromALL(){ DataFactoryRequestVo dataFactoryRequestVo = new DataFactoryRequestVo(); @@ -472,3 +482,4 @@ public class DataFactoryControllerTest { } } +*/ diff --git a/datafactory-api/src/test/java/com/coderman/tianhua/datafactory/api/test/DataSourceControllerTest.java b/adapter/src/test/java/com/coderman/tianhua/datafactory/api/test/DataSourceControllerTest.java similarity index 96% rename from datafactory-api/src/test/java/com/coderman/tianhua/datafactory/api/test/DataSourceControllerTest.java rename to adapter/src/test/java/com/coderman/tianhua/datafactory/api/test/DataSourceControllerTest.java index 5e6a326d9ffe95f607a6658536b2ac89688056aa..82822aa8076534f732989adce8c4b88602a767c6 100644 --- a/datafactory-api/src/test/java/com/coderman/tianhua/datafactory/api/test/DataSourceControllerTest.java +++ b/adapter/src/test/java/com/coderman/tianhua/datafactory/api/test/DataSourceControllerTest.java @@ -1,12 +1,13 @@ +/* package com.coderman.tianhua.datafactory.api.test; import com.alibaba.fastjson.JSON; -import com.coderman.tianhua.datafactory.api.Application; +import com.tianhua.datafactory.Application; import com.coderman.tianhua.datafactory.api.test.dto.DepartmentDTO; import com.coderman.tianhua.datafactory.api.test.dto.StaffType; -import com.coderman.tianhua.datafactory.core.enums.DataSourceTypeEnum; -import com.coderman.tianhua.datafactory.core.enums.VisitStrategyEnums; -import com.coderman.tianhua.datafactory.core.vo.DataSourceVO; +import com.tianhua.datafactory.core.enums.DataSourceTypeEnum; +import com.tianhua.datafactory.core.enums.VisitStrategyEnums; +import com.tianhua.datafactory.core.vo.DataSourceVO; import com.coderman.utils.kvpair.KVPair; import com.coderman.utils.response.ResultDataDto; import com.coderman.utils.response.ResultDto; @@ -23,12 +24,14 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +*/ /** * description: DataSourceControllerTest
* date: 2020/12/8 23:10
* author: coderman
* version: 1.0
- */ + *//* + @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT,classes = {Application.class}) public class DataSourceControllerTest { @@ -148,10 +151,12 @@ public class DataSourceControllerTest { - /** + */ +/** * 构建部门数据 * @return - */ + *//* + public List getDepartmentDTO(){ List departmentDTOList = new ArrayList<>(); DepartmentDTO departmentDTO = new DepartmentDTO(); @@ -199,10 +204,12 @@ public class DataSourceControllerTest { return departmentDTOList; } - /** + */ +/** * 构建员工类型数据 * @return - */ + *//* + public List getStaffTypeList(){ List staffTypeList = new ArrayList<>(); StaffType staffType = new StaffType(); @@ -231,3 +238,4 @@ public class DataSourceControllerTest { } +*/ diff --git a/datafactory-api/src/test/java/com/coderman/tianhua/datafactory/api/test/Main.java b/adapter/src/test/java/com/coderman/tianhua/datafactory/api/test/Main.java similarity index 100% rename from datafactory-api/src/test/java/com/coderman/tianhua/datafactory/api/test/Main.java rename to adapter/src/test/java/com/coderman/tianhua/datafactory/api/test/Main.java diff --git a/datafactory-api/src/test/java/com/coderman/tianhua/datafactory/api/test/dto/DepartmentDTO.java b/adapter/src/test/java/com/coderman/tianhua/datafactory/api/test/dto/DepartmentDTO.java similarity index 100% rename from datafactory-api/src/test/java/com/coderman/tianhua/datafactory/api/test/dto/DepartmentDTO.java rename to adapter/src/test/java/com/coderman/tianhua/datafactory/api/test/dto/DepartmentDTO.java diff --git a/datafactory-api/src/test/java/com/coderman/tianhua/datafactory/api/test/dto/StaffType.java b/adapter/src/test/java/com/coderman/tianhua/datafactory/api/test/dto/StaffType.java similarity index 100% rename from datafactory-api/src/test/java/com/coderman/tianhua/datafactory/api/test/dto/StaffType.java rename to adapter/src/test/java/com/coderman/tianhua/datafactory/api/test/dto/StaffType.java diff --git a/app/pom.xml b/app/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..f6c7714952a4b0c05693a653b7ad494511a5193b --- /dev/null +++ b/app/pom.xml @@ -0,0 +1,207 @@ + + + + 4.0.0 + + com.tianhua.datafactory + datafactory-parent + 2.0.0-SNAPSHOT + + + com.tianhua.datafactory + app + 2.0.0-SNAPSHOT + + app + http://www.example.com + + + jar + + 1.8 + + + + + + org.springframework.boot + spring-boot-configuration-processor + + + + junit + junit + 4.12 + test + + + + + commons-io + commons-io + 2.7 + + + + + com.google.guava + guava + 29.0-jre + + + + javax.servlet + javax.servlet-api + 4.0.1 + + + + com.google.guava + guava + + + + org.apache.dubbo + dubbo-spring-boot-starter + 2.7.8 + + + + org.apache.curator + curator-recipes + 2.8.0 + + + + org.slf4j + slf4j-log4j12 + + + log4j + log4j + + + + + + com.alibaba + fastjson + + + + org.apache.commons + commons-collections4 + + + + + org.slf4j + slf4j-api + 1.7.30 + compile + + + + + org.apache.commons + commons-lang3 + + + org.springframework + spring-test + test + + + org.springframework.boot + spring-boot-test + test + + + + com.coderman.utils + coderman-utils + + + org.projectlombok + lombok + + + + + com.belerweb + pinyin4j + 2.5.1 + + + + + com.github.ben-manes.caffeine + caffeine + + + + org.apache.commons + commons-lang3 + + + + com.tianhua.datafactory + client + 2.0.0-SNAPSHOT + + + + + com.tianhua.datafactory + domain + 2.0.0-SNAPSHOT + + + + + com.tianhua.datafactory + infrast + 2.0.0-SNAPSHOT + + + + com.yomahub + liteflow-spring-boot-starter + + + + org.apache.httpcomponents + httpclient + + + org.apache.httpcomponents + httpmime + + + org.apache.httpcomponents + httpcore + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + + + diff --git a/app/src/main/java/com/tianhua/datafactory/core/adapter/DubboServiceFactory.java b/app/src/main/java/com/tianhua/datafactory/core/adapter/DubboServiceFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..c338a4e5543bffce735501eadcd803c236dfd902 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/adapter/DubboServiceFactory.java @@ -0,0 +1,112 @@ +package com.tianhua.datafactory.core.adapter; + +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.ApplicationConfig; +import org.apache.dubbo.config.ReferenceConfig; +import org.apache.dubbo.config.RegistryConfig; +import org.apache.dubbo.config.utils.ReferenceConfigCache; +import org.apache.dubbo.rpc.service.GenericService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description + * date: 2022/8/1 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +@Slf4j +public class DubboServiceFactory { + + private ApplicationConfig application; + private RegistryConfig registry; + @Value("${dubbox.registry.address}") + private String address; + @Value("${spring.application.name}") + private String name; + + private static class SingletonHolder { + private static DubboServiceFactory INSTANCE = new DubboServiceFactory(); + } + + private DubboServiceFactory() { + try { + ApplicationConfig applicationConfig = new ApplicationConfig(); + name = "datafactory"; + applicationConfig.setName(name); + RegistryConfig registryConfig = new RegistryConfig(); + address= "zookeeper://127.0.0.1:2181"; + registryConfig.setAddress(address); + this.application = applicationConfig; + this.registry = registryConfig; + } catch (Exception e) { + log.error("DubboServiceFactory", e); + e.printStackTrace(); + } + + + } + + public static DubboServiceFactory getInstance() { + return SingletonHolder.INSTANCE; + } + + public Object genericInvoke(String serviceName, String interfaceClass, String methodName, List> parameters) { + try { + + ReferenceConfig reference = new ReferenceConfig<>(); + reference.setServices(serviceName); + reference.setApplication(application); + reference.setRegistry(registry); + reference.setInterface(interfaceClass); // 接口名 + reference.setGeneric(true); // 声明为泛化接口 + + //ReferenceConfig实例很重,封装了与注册中心的连接以及与提供者的连接, + //需要缓存,否则重复生成ReferenceConfig可能造成性能问题并且会有内存和连接泄漏。 + //API方式编程时,容易忽略此问题。 + //这里使用dubbo内置的简单缓存工具类进行缓存 + + ReferenceConfigCache cache = ReferenceConfigCache.getCache(); + GenericService genericService = cache.get(reference); + + if(parameters == null){ + return genericService.$invoke(methodName, new String[]{}, new Object[]{}); + } + int len = parameters.size(); + String[] invokeParamTyeps = new String[len]; + Object[] invokeParams = new Object[len]; + for (int i = 0; i < len; i++) { + invokeParamTyeps[i] = parameters.get(i).get("ParamType") + ""; + invokeParams[i] = parameters.get(i).get("Object"); + } + return genericService.$invoke(methodName, invokeParamTyeps, invokeParams); + } catch (Exception e) { + log.error("genericInvoke", e); + e.printStackTrace(); + } + return "500"; + } + + + public static void main(String[] args) { + DubboServiceFactory dubbo = DubboServiceFactory.getInstance(); + String interfaceName = "com.shenshuai.dubbo.client.HelloWorld"; + String methodName = "sayHello"; + List> parameters = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("ParamType","java.lang.String"); + map.put("Object","shenshuai"); + parameters.add(map); + Object result = dubbo.genericInvoke("datafactory",interfaceName, methodName, parameters); + + } + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/adapter/HttpApiAdapter.java b/app/src/main/java/com/tianhua/datafactory/core/adapter/HttpApiAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..3e02967b73cc5a2f116ea3e36267fa9b60599d7b --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/adapter/HttpApiAdapter.java @@ -0,0 +1,22 @@ +package com.tianhua.datafactory.core.adapter; + +import com.tianhua.datafactory.domain.bo.HttpApiRequestBO; + +import java.util.List; +import java.util.Map; + +/** + * description: ServiceApiAdaptor
+ * date: 2020/12/7 23:50
+ * author: coderman
+ * version: 1.0
+ */ +public interface HttpApiAdapter { + /** + * http协议获取数据 + * @param httpApiRequestBO + * @return + */ + List> getServiceDataFromHttp(HttpApiRequestBO httpApiRequestBO); + +} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/adaptor/EnumDataAdaptor.java b/app/src/main/java/com/tianhua/datafactory/core/adapter/LocalKVDataAdapter.java similarity index 62% rename from datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/adaptor/EnumDataAdaptor.java rename to app/src/main/java/com/tianhua/datafactory/core/adapter/LocalKVDataAdapter.java index d69bc8e00c1e698e2d73faadc8b6f237cff1e2bc..ef11832e70c93cf3154dbec4b3b931bbd373c1d7 100644 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/adaptor/EnumDataAdaptor.java +++ b/app/src/main/java/com/tianhua/datafactory/core/adapter/LocalKVDataAdapter.java @@ -1,4 +1,4 @@ -package com.coderman.tianhua.datafactory.core.adaptor; +package com.tianhua.datafactory.core.adapter; /** * description: EnumDataAdaptor
@@ -6,7 +6,7 @@ package com.coderman.tianhua.datafactory.core.adaptor; * author: coderman
* version: 1.0
*/ -public interface EnumDataAdaptor { +public interface LocalKVDataAdapter { void transform2KV(); } diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/adaptor/NacosDataAdaptor.java b/app/src/main/java/com/tianhua/datafactory/core/adapter/NacosDataAdapter.java similarity index 89% rename from datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/adaptor/NacosDataAdaptor.java rename to app/src/main/java/com/tianhua/datafactory/core/adapter/NacosDataAdapter.java index d52b815a7acca272c11a0ac5a284a7af2a5ce1d8..5603904dfe4d8d0478de832e2118e62398820e2e 100644 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/adaptor/NacosDataAdaptor.java +++ b/app/src/main/java/com/tianhua/datafactory/core/adapter/NacosDataAdapter.java @@ -1,4 +1,4 @@ -package com.coderman.tianhua.datafactory.core.adaptor; +package com.tianhua.datafactory.core.adapter; import com.coderman.utils.kvpair.KVPair; @@ -11,7 +11,9 @@ import java.util.Map; * author: coderman
* version: 1.0
*/ -public interface NacosDataAdaptor { + +@Deprecated +public interface NacosDataAdapter { /** * 获取nacos数据--匹配jsonTemplate * diff --git a/app/src/main/java/com/tianhua/datafactory/core/adapter/ResponseFactory.java b/app/src/main/java/com/tianhua/datafactory/core/adapter/ResponseFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..668c0109d9386e8a2c4560b4b8ba4af8e57f26a4 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/adapter/ResponseFactory.java @@ -0,0 +1,139 @@ +package com.tianhua.datafactory.core.adapter; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.domain.bo.HttpApiRequestBO; +import com.tianhua.datafactory.domain.enums.ReturnTypeEnum; +import lombok.extern.slf4j.Slf4j; +import org.assertj.core.util.Maps; +import org.springframework.stereotype.Service; + +import java.lang.reflect.Field; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description + * date: 2022/9/1 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +@Slf4j +public class ResponseFactory { + + private List getListLong(String response){ + return JSON.parseArray(response,Long.class); + } + + private List getListInteger(String response){ + return JSON.parseArray(response,Integer.class); + } + + private List getListString(String response){ + return JSON.parseArray(response,String.class); + } + + private ResultDataDto getResultDataDto(String response){ + return JSON.parseObject(response,ResultDataDto.class); + } + + /** + * + * @param responseStr + * @param httpApiRequestBO + * @return + */ + public List> getResponseListMap(String responseStr, HttpApiRequestBO httpApiRequestBO){ + List> resultList = new ArrayList<>(); + if(httpApiRequestBO.getReturnType().equals(ReturnTypeEnum.LIST_LONG.getType())){ + List responseList = getListLong(responseStr); + String key = httpApiRequestBO.getParamFieldList().get(0); + responseList.stream().forEach(value-> resultList.add(Maps.newHashMap(key,value))); + } + if(httpApiRequestBO.getReturnType().equals(ReturnTypeEnum.LIST_STRING.getType())){ + List responseList = getListString(responseStr); + String key = httpApiRequestBO.getParamFieldList().get(0); + responseList.stream().forEach(longValue-> resultList.add(Maps.newHashMap(key,longValue))); + } + + if(httpApiRequestBO.getReturnType().equals(ReturnTypeEnum.LIST_INTEGER.getType())){ + List responseList = getListInteger(responseStr); + String key = httpApiRequestBO.getParamFieldList().get(0); + responseList.stream().forEach(value-> resultList.add(Maps.newHashMap(key,value))); + } + + + + if(httpApiRequestBO.getReturnType().equals(ReturnTypeEnum.LIST_DTO.getType())){ + List responseList = JSON.parseArray(responseStr,Map.class); + responseList.stream().forEach(obj -> { + try { + Map jsonObject = obj; + Map objectMap = getObjMapV2(jsonObject, httpApiRequestBO.getParamFieldList()); + resultList.add(objectMap); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } + + + + + if(httpApiRequestBO.getReturnType().equals(ReturnTypeEnum.RESULT_DTO.getType())) { + ResultDataDto resultDataDto = getResultDataDto(responseStr); + if(!resultDataDto.isSuccess()){ + return resultList; + } + List responseDataList = (List) resultDataDto.getData(); + responseDataList.stream().forEach(obj -> { + try { + JSONObject jsonObject = (JSONObject) obj; + Map objectMap = getObjMap(jsonObject, httpApiRequestBO.getParamFieldList()); + resultList.add(objectMap); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } + + return resultList; + } + + + /** + * 根据对应的属性key找到匹配的值map + * @param jsonObject + * @param paramFieldList + * @return + */ + private Map getObjMap(JSONObject jsonObject, List paramFieldList){ + Map map = new HashMap<>(); + for (String fieldName : paramFieldList){ + map.put(fieldName, jsonObject.get(fieldName)); + } + return map; + } + + /** + * 根据对应的属性key找到匹配的值map + * @param map + * @param paramFieldList + * @return + */ + private Map getObjMapV2(Map map, List paramFieldList){ + Map resultMap = new HashMap<>(); + for (String fieldName : paramFieldList){ + resultMap.put(fieldName, map.get(fieldName)); + } + return resultMap; + } +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/adapter/impl/HttpApiAdaptorImpl.java b/app/src/main/java/com/tianhua/datafactory/core/adapter/impl/HttpApiAdaptorImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..ca37c6b7a0fd48bcc6dc2feebd684bf5fa816793 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/adapter/impl/HttpApiAdaptorImpl.java @@ -0,0 +1,79 @@ +package com.tianhua.datafactory.core.adapter.impl; + +import com.alibaba.fastjson.JSON; +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.core.adapter.HttpApiAdapter; +import com.tianhua.datafactory.core.adapter.ResponseFactory; +import com.tianhua.datafactory.core.utils.HttpUtils; +import com.tianhua.datafactory.domain.bo.HttpApiRequestBO; +import lombok.extern.slf4j.Slf4j; +import org.assertj.core.util.Lists; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description + * date: 2022/9/1 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "httpApiAdaptorImpl") +@Slf4j +public class HttpApiAdaptorImpl implements HttpApiAdapter { + + + @Autowired + private ResponseFactory responseFactory; + + @Override + public List> getServiceDataFromHttp(HttpApiRequestBO httpApiRequestBO) { + + //解析url + if (httpApiRequestBO.getUrl().contains("/{")){ + int firstIndex = httpApiRequestBO.getUrl().indexOf("{"); + int secondIndex = httpApiRequestBO.getUrl().lastIndexOf("}"); + String restParamStr = httpApiRequestBO.getUrl().substring(firstIndex + 1, secondIndex); + if (restParamStr.contains("/")) { + String [] params = restParamStr.split("/"); + for (String param : params){ + String tmpParam = param; + if(tmpParam.contains("{")){ + tmpParam = tmpParam.replace("{",""); + } + if(tmpParam.contains("}")){ + tmpParam = tmpParam.replace("}",""); + } + String value = "null"; + if(httpApiRequestBO.getParams().get(tmpParam) != null){ + value = httpApiRequestBO.getParams().get(tmpParam).toString(); + } + String url = httpApiRequestBO.getUrl().replace("{"+restParamStr+"}",value); + httpApiRequestBO.setUrl(url); + } + httpApiRequestBO.setParams(new HashMap<>()); + }else { + String value = httpApiRequestBO.getParams().get(restParamStr).toString(); + String url = httpApiRequestBO.getUrl().replace("{"+restParamStr+"}",value); + httpApiRequestBO.setUrl(url); + httpApiRequestBO.setParams(new HashMap<>()); + } + } + + try { + String jsonStr = HttpUtils.doGet(httpApiRequestBO.getUrl(),httpApiRequestBO.getParams()); + return responseFactory.getResponseListMap(jsonStr, httpApiRequestBO); + }catch (Exception e){ + log.error("请求http接口报错",e); + } + return null; + + } + + +} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/adaptor/impl/ServiceApiAdaptorImpl.java b/app/src/main/java/com/tianhua/datafactory/core/adapter/impl/HttpRestAdaptorImpl.java similarity index 73% rename from datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/adaptor/impl/ServiceApiAdaptorImpl.java rename to app/src/main/java/com/tianhua/datafactory/core/adapter/impl/HttpRestAdaptorImpl.java index 5a13913a9f6abf31e8aa6a556d07beb2f9dda6cf..8917d92239219628f3b37ab0825f40c524a91eda 100644 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/adaptor/impl/ServiceApiAdaptorImpl.java +++ b/app/src/main/java/com/tianhua/datafactory/core/adapter/impl/HttpRestAdaptorImpl.java @@ -1,28 +1,47 @@ -package com.coderman.tianhua.datafactory.core.adaptor.impl; +/* + +package com.tianhua.datafactory.core.adapter.impl; -import com.alibaba.fastjson.JSON; -import com.coderman.tianhua.datafactory.core.adaptor.ServiceApiAdaptor; -import com.coderman.tianhua.datafactory.core.bean.DataSourceBean; import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.core.adapter.HttpApiAdapter; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; -import java.util.ArrayList; import java.util.List; import java.util.Map; + +*/ /** * description: ServiceApiAdaptorImpl
* date: 2020/12/26 23:20
* author: coderman
* version: 1.0
- */ + *//* + + @Service -public class ServiceApiAdaptorImpl implements ServiceApiAdaptor { - @Autowired +public class HttpApiAdaptorImpl implements HttpApiAdapter { + + */ +/** + * 服务名---微服务的方式访问 + *//* + + 服务名---微服务的方式访问 @Autowired private RestTemplate restTemplate; + + */ +/** + * 域名 + * @param url url + * @param params 参数 + * @return + *//* + + @Override public List getServiceDataFromHttp(String url,Map params) { // @@ -43,3 +62,5 @@ public class ServiceApiAdaptorImpl implements ServiceApiAdaptor { return dataList; } } + +*/ diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/adaptor/impl/NacosDataAdaptorImpl.java b/app/src/main/java/com/tianhua/datafactory/core/adapter/impl/NacosDataAdapterImpl.java similarity index 76% rename from datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/adaptor/impl/NacosDataAdaptorImpl.java rename to app/src/main/java/com/tianhua/datafactory/core/adapter/impl/NacosDataAdapterImpl.java index 957587f16ed9734b8c8f8f86f002c89462f3a919..7fcb57795aca6dd55c723b5db060ce28052327a0 100644 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/adaptor/impl/NacosDataAdaptorImpl.java +++ b/app/src/main/java/com/tianhua/datafactory/core/adapter/impl/NacosDataAdapterImpl.java @@ -1,8 +1,8 @@ -package com.coderman.tianhua.datafactory.core.adaptor.impl; +package com.tianhua.datafactory.core.adapter.impl; -import com.coderman.tianhua.datafactory.core.adaptor.NacosDataAdaptor; +import com.tianhua.datafactory.core.adapter.NacosDataAdapter; import com.coderman.utils.kvpair.KVPair; -import com.coderman.utils.kvpair.KVParentPair; +import lombok.Data; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -17,15 +17,15 @@ import java.util.Map; * version: 1.0
*/ @Service -public class NacosDataAdaptorImpl implements NacosDataAdaptor { +@Deprecated +public class NacosDataAdapterImpl implements NacosDataAdapter { @Override public List> getNacosDataMap(String dataContent, String jsonTemplate) { List> mapList = new ArrayList<>(); String[] array = dataContent.split("\n"); - //默认去掉第一行数据 - for (int i = 1; i < array.length; i++) { + for (int i = 0; i < array.length; i++) { String[] kvArr = array[i].replace(" ", "").replace("\r", "").split(","); String[] jsonFieldArr = jsonTemplate.split(","); Map map = new HashMap<>(); @@ -42,9 +42,7 @@ public class NacosDataAdaptorImpl implements NacosDataAdaptor { public List> getNacosDataKV(String dataContent) { String[] array = dataContent.split("\n"); List> kvPairList = new ArrayList<>(); - - //默认去掉第一行数据 - for (int i = 1; i < array.length; i++) { + for (int i = 0; i < array.length; i++) { String[] kvArr = array[i].replace(" ", "").replace("\r", "").split(","); kvPairList.add(KVPair.build(kvArr[0], kvArr[1])); } diff --git a/app/src/main/java/com/tianhua/datafactory/core/eventhandler/DataSourceBindHandler.java b/app/src/main/java/com/tianhua/datafactory/core/eventhandler/DataSourceBindHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..577227fb8e21838d500f8921c8010538e08b1afb --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/eventhandler/DataSourceBindHandler.java @@ -0,0 +1,71 @@ +package com.tianhua.datafactory.core.eventhandler; + +import com.tianhua.datafactory.domain.ability.TransEventHandler; +import com.tianhua.datafactory.domain.bo.model.FieldBO; +import com.tianhua.datafactory.domain.bo.model.ModelMappingBO; +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; +import com.tianhua.datafactory.domain.event.DataSourceBindEvent; +import com.tianhua.datafactory.domain.repository.ModelQueryRepository; +import com.tianhua.datafactory.domain.repository.ModelRepository; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.List; +/** + * Description:在构建数据模型之间的映射过程中,发出模型映射事件, + * 辅助绑定数据源 + * date: 2022/6/10 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Component +public class DataSourceBindHandler implements TransEventHandler { + @Autowired + private ModelQueryRepository modelQueryRepository; + + + @Autowired + private ModelRepository modelRepository; + + + @Override + @EventListener + public void handleTransEvent(DataSourceBindEvent baseEvent) { + ModelMappingBO modelMappingBO = baseEvent.getModelMappingBO(); + List firstFieldBOList = modelQueryRepository.getModelField(modelMappingBO.getProjectCode(),modelMappingBO.getMappingClassFirst()); + List secondFieldBOList = modelQueryRepository.getModelField(modelMappingBO.getProjectCode(),modelMappingBO.getMappingClassSecond()); + + FieldBO firstFieldBO = firstFieldBOList.stream().filter(fieldBO -> fieldBO.getFieldName().equals(modelMappingBO.getMappingFieldFirst())).findFirst().get(); + FieldBO secondFieldBO = secondFieldBOList.stream().filter(fieldBO -> fieldBO.getFieldName().equals(modelMappingBO.getMappingFieldSecond())).findFirst().get(); + + if(!StringUtils.isEmpty(firstFieldBO.getFieldExtBO().getDataSourceCode()) && + !StringUtils.isEmpty(secondFieldBO.getFieldExtBO().getDataSourceCode())) { + return; + } + + + if(!StringUtils.isEmpty(firstFieldBO.getFieldExtBO().getDataSourceCode()) && + StringUtils.isEmpty(secondFieldBO.getFieldExtBO().getDataSourceCode())){ + secondFieldBO.setFieldExtBO(firstFieldBO.getFieldExtBO()); + ParamModelBO paramModelBO = ParamModelBO.getInstance(null); + paramModelBO.setProjectCode(modelMappingBO.getProjectCode()); + paramModelBO.addField(secondFieldBO); + modelRepository.updateParamModel(paramModelBO); + } + + if(StringUtils.isEmpty(firstFieldBO.getFieldExtBO().getDataSourceCode()) && + !StringUtils.isEmpty(secondFieldBO.getFieldExtBO().getDataSourceCode())){ + firstFieldBO.setFieldExtBO(secondFieldBO.getFieldExtBO()); + ParamModelBO paramModelBO = ParamModelBO.getInstance(null); + paramModelBO.setProjectCode(modelMappingBO.getProjectCode()); + paramModelBO.addField(secondFieldBO); + modelRepository.updateParamModel(paramModelBO); + } + + + } +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/filter/CollectionValueProcessor.java b/app/src/main/java/com/tianhua/datafactory/core/filter/CollectionValueProcessor.java new file mode 100644 index 0000000000000000000000000000000000000000..8a0696f134ca73a5fc2fc3230bd69ad399632132 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/filter/CollectionValueProcessor.java @@ -0,0 +1,174 @@ +package com.tianhua.datafactory.core.filter; + +import com.tianhua.datafactory.core.specification.TypeConvertFactory; +import com.tianhua.datafactory.domain.ability.CollectionFactory; +import com.tianhua.datafactory.domain.ability.DataProcessor; +import com.tianhua.datafactory.domain.bo.GenericTypeBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldRuleBO; +import com.tianhua.datafactory.domain.enums.JavaFieldTypeEnum; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.util.*; + +/** + * Description + * + * 集合类的数据处理 + * date: 2022/8/13 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "collectionValueFilter") +@Slf4j +//1代表要在构建变量之后执行 +@Order(value = 1) +public class CollectionValueProcessor implements DataProcessor { + private Random random = new SecureRandom(); + + @Autowired + private TypeConvertFactory typeConvertFactory; + + @Autowired + private CollectionFactory collectionFactory; + + + @Override + public void dataFilt(DataBuildRequestFieldBO dataBuildRequestFieldBO, Map valueMap, List> list) { + DataBuildRequestFieldRuleBO dataBuildRequestFieldRuleBO = dataBuildRequestFieldBO.getDataBuildRequestFieldRuleBO(); + if (dataBuildRequestFieldRuleBO == null){ + return; + } + + String defaultValues = dataBuildRequestFieldRuleBO.getDefaultValues(); + GenericTypeBO genericTypeBO = dataBuildRequestFieldBO.getGenericTypeBO(); + + if(StringUtils.isNotEmpty(defaultValues) && !genericTypeBO.isRealTypeModel()){ + String [] array = getDefaultValuesArray(defaultValues); + int randomSize = random.nextInt(array.length); + + if(JavaFieldTypeEnum.isList(genericTypeBO.getWrapType())){ + List valueList = collectionFactory.buildListValues(array, randomSize, genericTypeBO.getRealType()); + valueMap.put(dataBuildRequestFieldBO.getFieldName(),valueList); + }else if(JavaFieldTypeEnum.isSet(genericTypeBO.getWrapType())){ + Set valueSet = collectionFactory.buildSetValues(array, randomSize, genericTypeBO.getRealType()); + valueMap.put(dataBuildRequestFieldBO.getFieldName(),valueSet); + } + return; + } + + + String relyField = dataBuildRequestFieldRuleBO.getRelyField(); + + //处理list依赖 + if(StringUtils.isNotEmpty(relyField)){ + //依赖的是另外一个属性的集合值,随机取部分数据做集合数据 + if(relyField.startsWith("$") && JavaFieldTypeEnum.isList(genericTypeBO.getWrapType())){ + String relyFieldName = relyField.replace("$",""); + List relyFieldValueList = new ArrayList(); + int randomCount = random.nextInt(100); + for (int i = 0;i < randomCount;i ++ ){ + Map map = list.get(random.nextInt(list.size())); + relyFieldValueList.add(map.get(relyFieldName)); + } + valueMap.put(dataBuildRequestFieldBO.getFieldName(),relyFieldValueList); + return; + } + } + + //处理set依赖 + if(StringUtils.isNotEmpty(relyField)){ + //依赖的是另外一个属性的集合值,随机取部分数据做集合数据 + if(relyField.startsWith("$") && JavaFieldTypeEnum.isSet(genericTypeBO.getWrapType())){ + String relyFieldName = relyField.replace("$",""); + Set relyFieldValueSet = new HashSet(); + int randomCount = random.nextInt(100); + for (int i = 0;i < randomCount;i ++ ){ + Map map = list.get(random.nextInt(list.size())); + relyFieldValueSet.add(map.get(relyFieldName)); + } + valueMap.put(dataBuildRequestFieldBO.getFieldName(),relyFieldValueSet); + return; + } + } + + String relyKeyField = dataBuildRequestFieldRuleBO.getRelyKeyField(); + String relyValueField = dataBuildRequestFieldRuleBO.getRelyValueField(); + + + //处理map 先处理简单的数据类型 + if(JavaFieldTypeEnum.isMap(genericTypeBO.getWrapType()) && StringUtils.isNotEmpty(relyKeyField) && StringUtils.isNotEmpty(relyValueField)){ + String keyType = genericTypeBO.getRealKeyType(); + String valueType = genericTypeBO.getRealValueType(); + + List keyList = new ArrayList(); + //依赖的是另外一个属性的集合值,随机取部分数据做集合数据 + if(relyKeyField.startsWith("$") && JavaFieldTypeEnum.isMap(genericTypeBO.getWrapType())){ + String relyFieldName = relyKeyField.replace("$",""); + int randomCount = random.nextInt(100); + for (int i = 0;i < randomCount;i ++ ){ + Map map = list.get(random.nextInt(list.size())); + keyList.add(map.get(relyFieldName)); + } + }else { + keyList = typeConvertFactory.convertStringToList(relyKeyField, keyType); + } + + + List valueList = new ArrayList(); + //依赖的是另外一个属性的集合值,随机取部分数据做集合数据 + if(relyValueField.startsWith("$") && JavaFieldTypeEnum.isMap(genericTypeBO.getWrapType())){ + String relyFieldName = relyValueField.replace("$",""); + int randomCount = random.nextInt(100); + for (int i = 0;i < randomCount;i ++ ){ + Map map = list.get(random.nextInt(list.size())); + valueList.add(map.get(relyFieldName)); + } + }else { + valueList = typeConvertFactory.convertStringToList(relyValueField, valueType); + } + + Map map = new HashMap<>(); + if(keyList.size() > 0 && valueList.size() > 0){ + int randomSize = random.nextInt(keyList.size()); + if(randomSize == 0){ + randomSize = 1; + } + for (int i = 0;i < randomSize;i++){ + map.put(keyList.get(random.nextInt(keyList.size())), valueList.get(random.nextInt(valueList.size()))); + } + } + + valueMap.put(dataBuildRequestFieldBO.getFieldName(),map); + } + + } + + + /** + * 获取默认值列表 + * @param defaultValues + * @return + */ + private String [] getDefaultValuesArray(String defaultValues){ + String valueListStr = defaultValues; + //依赖的是自己提供的数据集合,支持两种格式 + if(valueListStr.startsWith("{")){ + valueListStr = valueListStr.replace("{","").replace("}",""); + } + + if(valueListStr.startsWith("[")){ + valueListStr = valueListStr.replace("[","").replace("]",""); + } + + return valueListStr.split(","); + } + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/filter/FilterExecutor.java b/app/src/main/java/com/tianhua/datafactory/core/filter/FilterExecutor.java new file mode 100644 index 0000000000000000000000000000000000000000..7f41292570780596bbc09e530f5f050392281093 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/filter/FilterExecutor.java @@ -0,0 +1,56 @@ +package com.tianhua.datafactory.core.filter; + +import com.tianhua.datafactory.client.utils.SpringContextUtil; +import com.tianhua.datafactory.domain.ability.DataProcessor; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * Description + * date: 2022/9/12 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class FilterExecutor { + + /** + * 在获取变量之前执行 + * + * @param dataBuildRequestFieldBO + * @param fieldValueMap + * @param batchResultList + */ + public void exeFilterBefore(DataBuildRequestFieldBO dataBuildRequestFieldBO, Map fieldValueMap, List> batchResultList){ + List dataFilterList = SpringContextUtil.getBeanOfType(DataProcessor.class); + for (DataProcessor dataFilter : dataFilterList){ + Order order = dataFilter.getClass().getAnnotation(Order.class); + if(order.value() < 0){ + dataFilter.dataFilt(dataBuildRequestFieldBO, fieldValueMap, batchResultList); + } + } + } + + /** + * 在获取变量之后执行 + * @param dataBuildRequestFieldBO + * @param fieldValueMap + * @param batchResultList + */ + public void exeFilterAfter(DataBuildRequestFieldBO dataBuildRequestFieldBO, Map fieldValueMap, List> batchResultList){ + List dataFilterList = SpringContextUtil.getBeanOfType(DataProcessor.class); + for (DataProcessor dataFilter : dataFilterList){ + Order order = dataFilter.getClass().getAnnotation(Order.class); + if(order.value() > 0){ + dataFilter.dataFilt(dataBuildRequestFieldBO, fieldValueMap, batchResultList); + } + } + } + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/filter/FuncVarProcessor.java b/app/src/main/java/com/tianhua/datafactory/core/filter/FuncVarProcessor.java new file mode 100644 index 0000000000000000000000000000000000000000..6c2dd4ed3dfc53f9a3d34b105b7609fd4322cb80 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/filter/FuncVarProcessor.java @@ -0,0 +1,44 @@ +package com.tianhua.datafactory.core.filter; + +import com.tianhua.datafactory.domain.ability.DataProcessor; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldRuleBO; +import org.apache.commons.lang3.StringUtils; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * Description + * 如果当前属性依赖另外一个属性的值同时作为内置函数的参数的话需要先过滤 + * 然后再在内置函数使用的时候传入值 + * date: 2022/8/13 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "funcVarFilter") +//-1代表要在构建变量之前执行 +@Order(value = -1) +public class FuncVarProcessor implements DataProcessor { + @Override + public void dataFilt(DataBuildRequestFieldBO dataBuildRequestFieldBO, Map valueMap, List> list) { + DataBuildRequestFieldRuleBO dataBuildRequestFieldRuleBO = dataBuildRequestFieldBO.getDataBuildRequestFieldRuleBO(); + if (dataBuildRequestFieldRuleBO == null){ + return; + } + + String funcVar = dataBuildRequestFieldRuleBO.getFuncVar(); + if(StringUtils.isNotEmpty(funcVar) && funcVar.startsWith("$")){ + String funcField = funcVar.replaceFirst("\\$",""); + Object funcFieldValue = valueMap.get(funcField); + if(funcFieldValue == null){ + return; + } + dataBuildRequestFieldBO.getDataBuildRequestFieldRuleBO().setFuncVar(funcFieldValue.toString()); + } + } +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/filter/PreSufDataProcessor.java b/app/src/main/java/com/tianhua/datafactory/core/filter/PreSufDataProcessor.java new file mode 100644 index 0000000000000000000000000000000000000000..058d4b625d28a4bc66a3d8fad8b46fc175712377 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/filter/PreSufDataProcessor.java @@ -0,0 +1,48 @@ +package com.tianhua.datafactory.core.filter; + +import com.tianhua.datafactory.domain.ability.DataProcessor; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import org.apache.commons.lang3.StringUtils; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * Description + * 属性值类型需要是字符串类型 + * date: 2022/8/13 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "preSufDataFilter") +//1代表要在构建变量之后执行 +@Order(value = 1) +public class PreSufDataProcessor implements DataProcessor { + @Override + public void dataFilt(DataBuildRequestFieldBO dataBuildRequestFieldBO, Map valueMap, List> list) { + if (dataBuildRequestFieldBO.getDataBuildRequestFieldRuleBO() == null){ + return; + } + + String fieldName = dataBuildRequestFieldBO.getFieldName(); + String prefix = dataBuildRequestFieldBO.getDataBuildRequestFieldRuleBO().getPrefix(); + String subfix = dataBuildRequestFieldBO.getDataBuildRequestFieldRuleBO().getSubfix(); + if(valueMap.get(fieldName) == null || (StringUtils.isEmpty(prefix) && StringUtils.isEmpty(subfix))){ + return; + } + String currentValue = valueMap.get(fieldName).toString(); + if(!StringUtils.isEmpty(prefix)){ + currentValue = prefix + currentValue; + } + if(!StringUtils.isEmpty(subfix)){ + currentValue = currentValue + subfix; + } + + valueMap.put(fieldName,currentValue); + + } +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/filter/RelyFieldValueProcessor.java b/app/src/main/java/com/tianhua/datafactory/core/filter/RelyFieldValueProcessor.java new file mode 100644 index 0000000000000000000000000000000000000000..113b487b45cf6746efd0c768d6ab69308e1a3e5a --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/filter/RelyFieldValueProcessor.java @@ -0,0 +1,59 @@ +package com.tianhua.datafactory.core.filter; + +import com.tianhua.datafactory.domain.ability.DataProcessor; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldRuleBO; +import org.apache.commons.lang.StringUtils; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * Description + * date: 2022/8/20 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "relyFieldValueFilter") +//1代表要在构建变量之后执行 +@Order(value = 1) +public class RelyFieldValueProcessor implements DataProcessor { + @Override + public void dataFilt(DataBuildRequestFieldBO dataBuildRequestFieldBO, Map valueMap, List> list) { + DataBuildRequestFieldRuleBO dataBuildRequestFieldRuleBO = dataBuildRequestFieldBO.getDataBuildRequestFieldRuleBO(); + if (dataBuildRequestFieldRuleBO == null ){ + return; + } + String relyField = dataBuildRequestFieldRuleBO.getRelyField(); + if(StringUtils.isEmpty(relyField)){ + return; + } + + if (relyField.contains("$")) { + relyField = relyField.replace("$",""); + } + + Object relyFieldValue = valueMap.get(relyField); + + if(!Objects.isNull(relyFieldValue) && StringUtils.isEmpty(dataBuildRequestFieldBO.getOriginFieldName())){ + valueMap.put(dataBuildRequestFieldBO.getFieldName(),relyFieldValue); + return; + } + + if(!Objects.isNull(relyFieldValue) && StringUtils.isNotEmpty(dataBuildRequestFieldBO.getOriginFieldName())){ + Object originValue = valueMap.get(dataBuildRequestFieldBO.getOriginFieldName()); + if(originValue instanceof HashMap){ + HashMap currentMap = (HashMap) originValue; + currentMap.put(dataBuildRequestFieldBO.getFieldName(), relyFieldValue); + valueMap.put(dataBuildRequestFieldBO.getOriginFieldName(), currentMap); + } + } + + } +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/package-info.java b/app/src/main/java/com/tianhua/datafactory/core/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..4a7fdb9ae21368c83d347a22bbedc1a54501cfd7 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/package-info.java @@ -0,0 +1 @@ +package com.tianhua.datafactory.core; \ No newline at end of file diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/processor/FunctionBeanProcessor.java b/app/src/main/java/com/tianhua/datafactory/core/processor/FunctionBeanProcessor.java similarity index 93% rename from datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/processor/FunctionBeanProcessor.java rename to app/src/main/java/com/tianhua/datafactory/core/processor/FunctionBeanProcessor.java index 95b14677bd14ca1f5c8a81e34ab0b4ef8ccef2b1..662428876cd47954572a293730b0946520841a38 100644 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/processor/FunctionBeanProcessor.java +++ b/app/src/main/java/com/tianhua/datafactory/core/processor/FunctionBeanProcessor.java @@ -1,7 +1,7 @@ -package com.coderman.tianhua.datafactory.core.processor; +package com.tianhua.datafactory.core.processor; -import com.coderman.tianhua.datafactory.client.annotations.DataSourceFunction; -import com.coderman.tianhua.datafactory.core.context.DataSourceFunctionContext; +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.context.DataSourceFunctionContext; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,6 +51,7 @@ public class FunctionBeanProcessor implements BeanPostProcessor { try { //可能需要优化 String classPath = map.get(beanName); + logger.info("classPath = "+classPath); if (StringUtils.isNotEmpty(classPath)) { try { Class tClass = Class.forName(classPath); diff --git a/app/src/main/java/com/tianhua/datafactory/core/scheduler/InnnerFuncRefreshScheduler.java b/app/src/main/java/com/tianhua/datafactory/core/scheduler/InnnerFuncRefreshScheduler.java new file mode 100644 index 0000000000000000000000000000000000000000..da9e5f9f9980ad6fa9148e3fb131e92778bdc346 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/scheduler/InnnerFuncRefreshScheduler.java @@ -0,0 +1,18 @@ +package com.tianhua.datafactory.core.scheduler; + +import org.springframework.stereotype.Service; + +/** + * Description + * 内置函数本地缓存定时清空 + * date: 2022/9/19 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class InnnerFuncRefreshScheduler { + + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/ApiMockDataAdapter.java b/app/src/main/java/com/tianhua/datafactory/core/service/ApiMockDataAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..e751d40bb7b7ae378f932b275834d317738fa016 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/ApiMockDataAdapter.java @@ -0,0 +1,151 @@ +package com.tianhua.datafactory.core.service; + +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.client.factory.ReturnWrapClassFactory; +import com.tianhua.datafactory.domain.bo.datafactory.ApiMockBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; +import com.tianhua.datafactory.domain.bo.project.ApiBO; +import com.tianhua.datafactory.domain.enums.ReturnWrapClassEnum; +import com.tianhua.datafactory.domain.repository.ProjectQueryRepository; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description + * 数据 + * date: 2022/9/5 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class ApiMockDataAdapter { + @Autowired + private DataFactoryService dataFactoryService; + @Autowired + private ReturnWrapClassFactory returnWrapClassFactory; + + @Autowired + private ProjectQueryRepository projectQueryRepository; + + + /** + * apimock场景接口出参适配 + * + * @param apiMockBO api接口签名 + * @return + * @throws Exception + */ + public Object getApiMockDataResp( ApiMockBO apiMockBO) throws Exception { + if (apiMockBO.getSuccessData() == null) { + apiMockBO.setSuccessData(true); + } + + Map resultMap = new HashMap<>(); + ApiBO apiBO = projectQueryRepository.getBySign(apiMockBO.getApiSign()); + if (apiBO == null) { + throw new Exception("根据apiSign找不到对应的API模型"); + } + + ResultDataDto>> randomData = dataFactoryService.generateDataApiRespParam(apiMockBO); + + if (ReturnWrapClassEnum.isOrigin(apiBO.getApiReturnWrapType())) { + if (apiMockBO.getSuccessData()) { + return randomData.getData(); + } + return null; + } + + if (!apiMockBO.getSuccessData()) { + resultMap.put("code", "500"); + resultMap.put("data", null); + resultMap.put("msg", "失败"); + return resultMap; + } + + //这里借助平台自己封装的msg,code,data返回,可以通过公共项目空间定义的ResultDTO进行适配修改 + if (ReturnWrapClassEnum.isResultDTO(apiBO.getApiReturnWrapType())) { + List> randomDataList = randomData.getData(); + if (randomDataList.size() == 1) { + return returnWrapClassFactory.buildSuccessResultDTO(randomDataList.get(0)); + } + return returnWrapClassFactory.buildSuccessResultDTO(randomDataList); + } + + //这里借助平台自己封装的msg,code,data返回,可以通过公共项目空间定义的ResultDTO进行适配修改 + if (ReturnWrapClassEnum.isResultPageDTO(apiBO.getApiReturnWrapType())) { + List> randomDataList = randomData.getData(); + return returnWrapClassFactory.buildSuccessResultPage(randomDataList); + } + return resultMap; + } + + + /** + * 接口入参数据mock + * + * @param apiMockBO + * @return + * @throws Exception + */ + public Object getApiMockDataReq( ApiMockBO apiMockBO) throws Exception { + + ApiBO apiBO = projectQueryRepository.getBySign(apiMockBO.getApiSign()); + if (apiBO == null) { + throw new Exception("根据apiSign找不到对应的API模型"); + } + + DataBuildRequestBO dataBuildRequestBO = new DataBuildRequestBO(); + + dataBuildRequestBO.setBuildCount(1); + + if(apiMockBO.getMockCount() == null || apiMockBO.getMockCount() <= 0){ + dataBuildRequestBO.setBuildCount(1); + }else { + dataBuildRequestBO.setBuildCount(apiMockBO.getMockCount()); + } + + dataBuildRequestBO.setProjectCode(apiBO.getProjectCode()); + dataBuildRequestBO.setApiSign(apiBO.getApiSign()); + + List fieldBOList = new ArrayList<>(); + + if(CollectionUtils.isEmpty(apiMockBO.getParamModelList())){ + for (int i = 0;i < apiBO.getParamList().size();i ++){ + ParamModelBO paramModelBO = apiBO.getParamList().get(i); + DataBuildRequestFieldBO dataBuildRequestFieldBO = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO.setFieldName(paramModelBO.getParamVarName()); + dataBuildRequestFieldBO.setFieldType(paramModelBO.getParamClassName()); + dataBuildRequestFieldBO.setDataSourceCode(paramModelBO.getDataSourceCode()); + fieldBOList.add(dataBuildRequestFieldBO); + } + }else { + for (int i = 0;i < apiBO.getParamList().size();i ++){ + ParamModelBO paramModelBO = apiBO.getParamList().get(i); + DataBuildRequestFieldBO dataBuildRequestFieldBO = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO.setFieldName(apiMockBO.getParamModelList().get(i).getParamVarName()); + dataBuildRequestFieldBO.setFieldType(paramModelBO.getParamClassName()); + dataBuildRequestFieldBO.setDataSourceCode(apiMockBO.getParamModelList().get(i).getDataSourceCode()); + fieldBOList.add(dataBuildRequestFieldBO); + } + } + + + dataBuildRequestBO.setFieldBOList(fieldBOList); + + ResultDataDto>> randomData = dataFactoryService.generateDataApiReqParam(dataBuildRequestBO); + + return randomData.getData(); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/DataFactoryService.java b/app/src/main/java/com/tianhua/datafactory/core/service/DataFactoryService.java new file mode 100644 index 0000000000000000000000000000000000000000..e66d22483abd7afb108f53b062d7c5201063ae31 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/DataFactoryService.java @@ -0,0 +1,64 @@ +package com.tianhua.datafactory.core.service; + +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.domain.bo.datafactory.ApiMockBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; + +import java.util.List; +import java.util.Map; + +/** + * description: DataFactoryservice + * 数据工厂接口,生成仿真数据的入口 + * 有三种模式 + * 1.纯模型的生成 + * 2.根据api签名生成方法入参数据 + * 3.根据api签名生成方法出参数据 + * date: 2020/12/5 23:39
+ * author: coderman
+ * version: 1.0
+ */ +public interface DataFactoryService { + + + // ResultDataDto generateSimplex(List dataFactoryRequestFieldBeanList) throws Exception; + + /** + * 根据数据工作台设置的数据属性生成规则构建一定数量的仿真数据 + * + * 适用于自定义业务模型 + * + * + * @param dataBuildRequestBO + * @return + */ + ResultDataDto>> generateData(DataBuildRequestBO dataBuildRequestBO) throws Exception; + + + /** + * 根据api签名构建api参数值随机列表 + * @param dataBuildRequestBO + * @return + * @throws Exception + */ + ResultDataDto>> generateDataApiReqParam(DataBuildRequestBO dataBuildRequestBO) throws Exception; + + /** + * 根据api签名构建api返回值随机列表 + * @param apiMockBO + * @return + * @throws Exception + */ + ResultDataDto>> generateDataApiRespParam(ApiMockBO apiMockBO) throws Exception; + + + /** + * 通过数据源编码获取单个数据源对应的随机数 + * 主要用于测试 + * @param dataBuildRequestFieldBO + * @return + */ + String buildData(DataBuildRequestFieldBO dataBuildRequestFieldBO) ; + +} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataGenerateService.java b/app/src/main/java/com/tianhua/datafactory/core/service/DataGenerateService.java similarity index 56% rename from datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataGenerateService.java rename to app/src/main/java/com/tianhua/datafactory/core/service/DataGenerateService.java index 5547f5000a6bd7cb0dd479830565bc1885d543fd..af8f014c8e14a2ab5c95234e5cefeaf4ffc48fb5 100644 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataGenerateService.java +++ b/app/src/main/java/com/tianhua/datafactory/core/service/DataGenerateService.java @@ -1,9 +1,10 @@ -package com.coderman.tianhua.datafactory.core.service; +package com.tianhua.datafactory.core.service; -import com.coderman.tianhua.datafactory.core.bean.DataSourceFieldRequestBean; + +import com.tianhua.datafactory.domain.bo.datafactory.DataSourceFieldRequestBean; /** - * description: DataRandomAccessService 随机数据访问服务 + * description: DataGenerateService 随机数据访问服务 * date: 2021/1/17 20:20
* author: coderman
* version: 1.0
@@ -16,5 +17,5 @@ public interface DataGenerateService { * @param dataSourceFieldRequestBean * @return */ - Object getRandomData(DataSourceFieldRequestBean dataSourceFieldRequestBean); + Object getRandomData(DataSourceFieldRequestBean dataSourceFieldRequestBean) throws Exception; } diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/DataGenerateServiceFactory.java b/app/src/main/java/com/tianhua/datafactory/core/service/DataGenerateServiceFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..b14761567e5b48a1b2c9ac4975a24f17a329a2eb --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/DataGenerateServiceFactory.java @@ -0,0 +1,83 @@ +package com.tianhua.datafactory.core.service; + +import com.tianhua.datafactory.domain.enums.DataSourceTypeEnum; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * Description + * date: 2022/7/31 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class DataGenerateServiceFactory { + + @Resource(name = "dataGenerateDefaultServiceImpl") + private DataGenerateService dataGenerateDefaultServiceImpl; + + + @Resource(name = "dataGenerateFunctionServiceImpl") + private DataGenerateService dataGenerateFunctionServiceImpl; + + + @Resource(name = "dataGenerateDubboImpl") + private DataGenerateService dataGenerateDubboImpl; + + @Resource(name = "dataGenerateLocalKVImpl") + private DataGenerateService dataGenerateLocalKVImpl; + + + @Resource(name = "dataGenerateFileDataServiceImpl") + private DataGenerateService dataGenerateFileDataServiceImpl; + + @Resource(name = "dataGenerateHttpApiServiceImpl") + private DataGenerateService dataGenerateHttpApiServiceImpl; + + /** + * 根据类型动态获取数据生成bean + * @param dataSouceType + * @return + * @throws Exception + */ + public DataGenerateService getDataGenerateService(int dataSouceType) throws Exception { + if(DataSourceTypeEnum.FROM_SERVICE_ENUM.getCode() == dataSouceType){ + return dataGenerateLocalKVImpl; + } + + //属性上直接设置的默认值列表 + if(DataSourceTypeEnum.FIELD_DEFAULT.getCode() == dataSouceType){ + return dataGenerateDefaultServiceImpl; + } + + //datafactory内置提供的函数式随机值生成服务 + if(DataSourceTypeEnum.FUNCTION_DATASOURCE.getCode() == dataSouceType){ + return dataGenerateFunctionServiceImpl; + } + + + //从dubbo远程接口中获取随机数据 + if(DataSourceTypeEnum.FROM_DUBBO.getCode() == dataSouceType){ + return dataGenerateDubboImpl; + } + + //从文件中获取数据 + if(DataSourceTypeEnum.FROM_FILE_DATA.getCode() == dataSouceType){ + return dataGenerateFileDataServiceImpl; + } + + //从http api中获取数据 + if(DataSourceTypeEnum.FROM_SERVICE_API_HTTP.getCode() == dataSouceType){ + return dataGenerateHttpApiServiceImpl; + } + + + throw new Exception("不支持的数据源类型"); + + } + + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/DataProcessExecutor.java b/app/src/main/java/com/tianhua/datafactory/core/service/DataProcessExecutor.java new file mode 100644 index 0000000000000000000000000000000000000000..9d2f4160b01332055ba5fc490ff6d4a6f47624ca --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/DataProcessExecutor.java @@ -0,0 +1,131 @@ +package com.tianhua.datafactory.core.service; + +import com.tianhua.datafactory.core.filter.FilterExecutor; +import com.tianhua.datafactory.core.service.FieldValueFactory; +import com.tianhua.datafactory.domain.ability.GenericService; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataSourceFieldRequestBean; +import com.tianhua.datafactory.domain.enums.JavaFieldTypeEnum; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description + * date: 2022/9/12 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class DataProcessExecutor { + @Autowired + private GenericService genericService; + + @Autowired + private FilterExecutor filterExecutor; + @Autowired + private FieldValueFactory fieldValueFactory; + + private static SecureRandom secureRandom = new SecureRandom(); + + + + /** + * + * @param dataSourceFieldRequestBean + * @param fieldBOList + * @param batchResultList + * @throws Exception + */ + public void exeDataGenerateProcess(DataSourceFieldRequestBean dataSourceFieldRequestBean, List fieldBOList, List> batchResultList) throws Exception { + Map fieldValueMap = new HashMap<>(fieldBOList.size()); + + for (DataBuildRequestFieldBO dataBuildRequestFieldBO : fieldBOList) { + dataSourceFieldRequestBean.setFieldValueMap(fieldValueMap); + dataSourceFieldRequestBean.setDataBuildRequestFieldBO(dataBuildRequestFieldBO); + dataSourceFieldRequestBean.setRandom(new SecureRandom()); + dataSourceFieldRequestBean.setVarDependencyMap(dataBuildRequestFieldBO.getVarDependencyMap()); + + //1.前置数据过滤 + filterExecutor.exeFilterBefore(dataBuildRequestFieldBO, fieldValueMap, batchResultList); + //获取随机字段值 + Object fieldValue = fieldValueFactory.getFieldValueWrapper(dataSourceFieldRequestBean); + + fieldValueMap.put(dataBuildRequestFieldBO.getFieldName(), fieldValue); + //2.后置数据过滤 + filterExecutor.exeFilterAfter(dataBuildRequestFieldBO, fieldValueMap, batchResultList); + + List referFieldList = dataBuildRequestFieldBO.getReferFieldList(); + if(CollectionUtils.isEmpty(referFieldList)){ + continue; + } + + Map referMap = buildReferData(dataBuildRequestFieldBO, batchResultList); + fieldValueMap.put(dataBuildRequestFieldBO.getFieldName(), referMap); + + } + batchResultList.add(fieldValueMap); + } + + + /** + * 构建属性为对象类型的引用 + * @param originRequestFieldBO + * @param batchResultList + * @return + * @throws Exception + */ + private Map buildReferData(DataBuildRequestFieldBO originRequestFieldBO, List> batchResultList) throws Exception { + List referFieldList = originRequestFieldBO.getReferFieldList(); + + Map referFieldValueMap = new HashMap<>(referFieldList.size()); + + for (DataBuildRequestFieldBO dataBuildRequestFieldBO : referFieldList){ + DataSourceFieldRequestBean referFieldDataSourcdFieldRequestBean = new DataSourceFieldRequestBean(); + referFieldDataSourcdFieldRequestBean.setFieldValueMap(referFieldValueMap); + referFieldDataSourcdFieldRequestBean.setDataBuildRequestFieldBO(dataBuildRequestFieldBO); + referFieldDataSourcdFieldRequestBean.setRandom(new SecureRandom()); + + if(CollectionUtils.isNotEmpty(dataBuildRequestFieldBO.getReferFieldList())){ + + if(JavaFieldTypeEnum.isCollectionType(dataBuildRequestFieldBO.getGenericTypeBO().getWrapType()) && dataBuildRequestFieldBO.getGenericTypeBO().isRealTypeModel()){ + int randomCount = secureRandom.nextInt(10); + List> list = new ArrayList<>(); + for (int i = 0;i < randomCount ;i++){ + Map referObjectMap = buildReferData(dataBuildRequestFieldBO, batchResultList); + list.add(referObjectMap); + } + referFieldValueMap.put(dataBuildRequestFieldBO.getFieldName(), genericService.buildGenericData(dataBuildRequestFieldBO.getGenericTypeBO().getWrapType(),list)); + }else { + Map referObjectMap = buildReferData(dataBuildRequestFieldBO, batchResultList); + referFieldValueMap.put(dataBuildRequestFieldBO.getFieldName(), referObjectMap); + } + + }else { + //1.前置数据过滤 + filterExecutor.exeFilterBefore(dataBuildRequestFieldBO, referFieldValueMap, batchResultList); + //获取随机字段值 + Object referFieldValue = fieldValueFactory.getFieldValueWrapper(referFieldDataSourcdFieldRequestBean); + + referFieldValueMap.put(dataBuildRequestFieldBO.getFieldName(), referFieldValue); + + //2.后置数据过滤 + filterExecutor.exeFilterAfter(dataBuildRequestFieldBO, referFieldValueMap, batchResultList); + } + } + + return referFieldValueMap; + } + + + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/DataTypeAdapter.java b/app/src/main/java/com/tianhua/datafactory/core/service/DataTypeAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..002843ea4042befec1a6299b4d01eed19d0c7599 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/DataTypeAdapter.java @@ -0,0 +1,26 @@ +package com.tianhua.datafactory.core.service; + +import com.tianhua.datafactory.domain.bo.GenericTypeBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; + +import java.util.List; + +/** + * Description + * 类型转换适配层 + * 对接口入参,出参模型做适配 + * date: 2022/9/11 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public interface DataTypeAdapter { + /** + * 根据类型构建属性数据请求模型列表 + * @param genericTypeBO + * @return + */ + List buildFieldList(GenericTypeBO genericTypeBO) throws Exception; + +} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataValueHandler.java b/app/src/main/java/com/tianhua/datafactory/core/service/DataValueHandler.java similarity index 88% rename from datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataValueHandler.java rename to app/src/main/java/com/tianhua/datafactory/core/service/DataValueHandler.java index 8865b532b09523b96aeb1437e96ac6890d893ce2..c1dc05ce4a9ad1c174781f62246e8c22e66f15e1 100644 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataValueHandler.java +++ b/app/src/main/java/com/tianhua/datafactory/core/service/DataValueHandler.java @@ -1,6 +1,6 @@ -package com.coderman.tianhua.datafactory.core.service; +package com.tianhua.datafactory.core.service; -import com.coderman.tianhua.datafactory.core.bean.DataBuildRequestFieldRuleBean; +import com.tianhua.datafactory.domain.bo.DataBuildRequestFieldRuleBean; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -11,6 +11,7 @@ import org.springframework.stereotype.Service; * version: 1.0
*/ @Service +@Deprecated public class DataValueHandler { /** diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/ERPlantUMLParseService.java b/app/src/main/java/com/tianhua/datafactory/core/service/ERPlantUMLParseService.java new file mode 100644 index 0000000000000000000000000000000000000000..41427de49dea0aa1d85d7a6810d3e9bcff30eeca --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/ERPlantUMLParseService.java @@ -0,0 +1,26 @@ +package com.tianhua.datafactory.core.service; + + +import com.tianhua.datafactory.domain.bo.model.TableBO; + +import java.util.List; + +/** + * Description: + * date: 2021/8/12 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public interface ERPlantUMLParseService { + + /** + * 根据plantuml 内容构建数据库表模型 + * @param contentList + * @return + */ + List getPlantUmlContextBean(List contentList); + + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/FieldValueFactory.java b/app/src/main/java/com/tianhua/datafactory/core/service/FieldValueFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..07705a91b966dac66bfdbf4ce76fda9e042e877b --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/FieldValueFactory.java @@ -0,0 +1,209 @@ +package com.tianhua.datafactory.core.service; + +import com.alibaba.fastjson.JSON; +import com.tianhua.datafactory.domain.ability.GenericService; +import com.tianhua.datafactory.domain.bo.GenericTypeBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataSourceFieldRequestBean; +import com.tianhua.datafactory.domain.enums.JavaFieldTypeEnum; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.security.SecureRandom; +import java.util.*; + +/** + * Description + * date: 2022/8/12 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +@Slf4j +public class FieldValueFactory { + + @Resource(name = "dataGenerateDefaultServiceImpl") + private DataGenerateService dataGenerateDefaultServiceImpl; + + @Autowired + private GenericService genericService; + + + @Autowired + private DataGenerateServiceFactory dataGenerateServiceFactory; + + private static SecureRandom secureRandom = new SecureRandom(); + + + /** + * 根据请求的数据上下文生成随机的数据字段值 + * @param dataSourceFieldRequestBean + * @return + * @throws Exception + */ + public Object getFieldValue(DataSourceFieldRequestBean dataSourceFieldRequestBean) throws Exception { + DataBuildRequestFieldBO dataBuildRequestFieldBO = dataSourceFieldRequestBean.getDataBuildRequestFieldBO(); + + String dataSourceCode = dataBuildRequestFieldBO.getDataSourceCode(); + + //从默认值中获取数据 + if (StringUtils.isEmpty(dataSourceCode) + || CollectionUtils.isNotEmpty(dataBuildRequestFieldBO.getDefaultValueList())) { + return dataGenerateDefaultServiceImpl.getRandomData(dataSourceFieldRequestBean); + } + + if(dataBuildRequestFieldBO.getDataSourceType() == null){ + log.warn("数据源类型为空,dataBuildRequestFieldBO = {}", JSON.toJSONString(dataBuildRequestFieldBO)); + return null; + } + + DataGenerateService dataGenerateService = dataGenerateServiceFactory.getDataGenerateService(dataBuildRequestFieldBO.getDataSourceType().intValue()); + + return dataGenerateService.getRandomData(dataSourceFieldRequestBean); + + } + + + /** + * 根据请求的数据上下文生成随机的数据字段值 + * @param dataSourceFieldRequestBean + * @return + * @throws Exception + */ + public Object getFieldValueWrapper(DataSourceFieldRequestBean dataSourceFieldRequestBean) throws Exception { + DataBuildRequestFieldBO dataBuildRequestFieldBO = dataSourceFieldRequestBean.getDataBuildRequestFieldBO(); + int randomCount = secureRandom.nextInt(10); + + GenericTypeBO genericTypeBO = genericService.getGenericType(dataBuildRequestFieldBO.getFieldType()); + //外部是list类型,内部是java基本类型,则随机生成一定数量的数据当做集合数据 + if(JavaFieldTypeEnum.isList(genericTypeBO.getWrapType()) && JavaFieldTypeEnum.isBasicType(genericTypeBO.getRealType())){ + List list = new ArrayList<>(); + for (int i = 0;i < randomCount;i ++){ + list.add(getFieldValue(dataSourceFieldRequestBean)); + } + return list; + } + + //外部是set类型,内部是java基本类型,则随机生成一定数量的数据当做集合数据 + if(JavaFieldTypeEnum.isSet(genericTypeBO.getWrapType()) && JavaFieldTypeEnum.isBasicType(genericTypeBO.getRealType())){ + Set set = new HashSet(); + for (int i = 0;i < randomCount;i ++){ + set.add(getFieldValue(dataSourceFieldRequestBean)); + } + return set; + } + + //外部是数组类型,内部是java基本类型,则随机生成一定数量的数据当做集合数据 + if(JavaFieldTypeEnum.isArray(genericTypeBO.getWrapType()) && JavaFieldTypeEnum.isBasicType(genericTypeBO.getRealType())){ + if(JavaFieldTypeEnum.isInt(genericTypeBO.getRealType())){ + return buildIntegerArray(randomCount, dataSourceFieldRequestBean); + } + + if(JavaFieldTypeEnum.isLong(genericTypeBO.getRealType())){ + return buildLongArray(randomCount, dataSourceFieldRequestBean); + } + + if(JavaFieldTypeEnum.isString(genericTypeBO.getRealType())){ + return buildStringArray(randomCount, dataSourceFieldRequestBean); + } + + if(JavaFieldTypeEnum.isDate(genericTypeBO.getRealType())){ + return buildDateArray(randomCount, dataSourceFieldRequestBean); + } + } + + //List + if(JavaFieldTypeEnum.isList(genericTypeBO.getWrapType()) && genericTypeBO.isRealTypeModel()) { + List list = new ArrayList<>(); + for (int i = 0;i < randomCount;i ++){ + list.add(getFieldValue(dataSourceFieldRequestBean)); + } + return list; + } + + //Set + if(JavaFieldTypeEnum.isSet(genericTypeBO.getWrapType()) && genericTypeBO.isRealTypeModel()) { + Set set = new HashSet(); + for (int i = 0;i < randomCount;i ++){ + set.add(getFieldValue(dataSourceFieldRequestBean)); + } + return set; + } + + + return getFieldValue(dataSourceFieldRequestBean); + } + + + /** + * integer 数组 + * @param randomCount + * @param dataSourceFieldRequestBean + * @return + * @throws Exception + */ + private Object buildIntegerArray(int randomCount, DataSourceFieldRequestBean dataSourceFieldRequestBean) throws Exception { + Integer [] array = new Integer[randomCount]; + for (int i = 0;i < randomCount;i ++){ + array[i] = Integer.parseInt(getFieldValue(dataSourceFieldRequestBean).toString()); + } + return array; + } + + + + /** + * Long 数组 + * @param randomCount + * @param dataSourceFieldRequestBean + * @return + * @throws Exception + */ + private Object buildLongArray(int randomCount, DataSourceFieldRequestBean dataSourceFieldRequestBean) throws Exception { + Long [] array = new Long[randomCount]; + for (int i = 0;i < randomCount;i ++){ + array[i] = Long.parseLong(getFieldValue(dataSourceFieldRequestBean).toString()); + } + return array; + } + + + /** + * Long 数组 + * @param randomCount + * @param dataSourceFieldRequestBean + * @return + * @throws Exception + */ + private Object buildStringArray(int randomCount, DataSourceFieldRequestBean dataSourceFieldRequestBean) throws Exception { + String [] array = new String[randomCount]; + for (int i = 0;i < randomCount;i ++){ + array[i] = getFieldValue(dataSourceFieldRequestBean).toString(); + } + return array; + } + + + /** + * Long 数组 + * @param randomCount + * @param dataSourceFieldRequestBean + * @return + * @throws Exception + */ + private Object buildDateArray(int randomCount, DataSourceFieldRequestBean dataSourceFieldRequestBean) throws Exception { + Date [] array = new Date[randomCount]; + for (int i = 0;i < randomCount;i ++){ + array[i] = (Date)getFieldValue(dataSourceFieldRequestBean); + } + return array; + } + + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/ModelMappingBuilderService.java b/app/src/main/java/com/tianhua/datafactory/core/service/ModelMappingBuilderService.java new file mode 100644 index 0000000000000000000000000000000000000000..ee718ad5a214529240c33053898a100a8e335181 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/ModelMappingBuilderService.java @@ -0,0 +1,92 @@ +package com.tianhua.datafactory.core.service; + +import com.tianhua.datafactory.domain.bo.model.FieldBO; +import com.tianhua.datafactory.domain.bo.model.ModelMappingBO; +import com.tianhua.datafactory.domain.enums.ModelValueMappingType; +import com.tianhua.datafactory.domain.repository.ModelQueryRepository; +import com.tianhua.datafactory.domain.repository.ModelRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Description: + * date: 2022/6/6 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class ModelMappingBuilderService { + + @Autowired + private ModelRepository modelRepository; + + @Autowired + private ModelQueryRepository modelQueryRepository; + + /** + * 批量构建映射模型 + * + * @param modelMappingBO + */ + @Transactional(rollbackFor = Exception.class) + public void buildModelMappingBatch(ModelMappingBO modelMappingBO) { + List firstFieldBOList = modelQueryRepository.getModelField(modelMappingBO.getProjectCode(), modelMappingBO.getMappingClassFirst()); + List secondFieldBOList = modelQueryRepository.getModelField(modelMappingBO.getProjectCode(), modelMappingBO.getMappingClassSecond()); + List modelMappingBOList = buildModelMappingList(modelMappingBO.getProjectCode(), firstFieldBOList,secondFieldBOList); + + + List modelMappingBOS = modelQueryRepository.getModelMappingListByProjectCode(modelMappingBO.getProjectCode()); + Set mappingSet = new HashSet<>(); + modelMappingBOS.stream().forEach(modelMappingBO1 -> { + mappingSet.addAll(modelMappingBO1.buildMappingKey()); + }); + + for (ModelMappingBO modelMappingBO1 : modelMappingBOList){ + boolean contains = false; + for (String key : modelMappingBO1.buildMappingKey()){ + if(mappingSet.contains(key)){ + contains = true; + } + } + if(!contains){ + modelRepository.saveModelMapping(modelMappingBO1); + } + } + } + + + private List buildModelMappingList(String projectCode, List firstFieldBOList, List secondFieldBOList) { + List modelMappingBOList = new ArrayList<>(); + + for (FieldBO firstFieldBO : firstFieldBOList) { + for (FieldBO secondFieldBO : secondFieldBOList) { + //如果命名不一致则忽略,除非是数据库模型这里需要特殊处理 + if (!firstFieldBO.getFieldName().equals(secondFieldBO.getFieldName())) { + continue; + } + ModelMappingBO modelMappingBO = new ModelMappingBO(); + modelMappingBO.setMappingClassFirst(firstFieldBO.getParamClassName()); + modelMappingBO.setMappingClassSecond(secondFieldBO.getParamClassName()); + modelMappingBO.setMappingFieldFirst(firstFieldBO.getFieldName()); + modelMappingBO.setMappingFieldSecond(secondFieldBO.getFieldName()); + modelMappingBO.setProjectCode(projectCode); + if (firstFieldBO.getFieldType().equals(secondFieldBO.getFieldType())) { + modelMappingBO.setMappingType(ModelValueMappingType.DIRECT_MAPPING.getType()); + } else { + modelMappingBO.setMappingType(ModelValueMappingType.VALUE_MAPPING.getType()); + } + modelMappingBOList.add(modelMappingBO); + } + } + + return modelMappingBOList; + } +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/PlantUMLApiModelBuilderService.java b/app/src/main/java/com/tianhua/datafactory/core/service/PlantUMLApiModelBuilderService.java new file mode 100644 index 0000000000000000000000000000000000000000..5d884b15aa245ec39ac155bba86953b15c94ac93 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/PlantUMLApiModelBuilderService.java @@ -0,0 +1,142 @@ +package com.tianhua.datafactory.core.service; + +import com.tianhua.datafactory.domain.ability.ReadApiPlantUMLDocService; +import com.tianhua.datafactory.domain.bo.EnumBean; +import com.tianhua.datafactory.domain.bo.bean.PlantUMLApiContextBean; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceBO; +import com.tianhua.datafactory.domain.bo.model.FieldExtBO; +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; +import com.tianhua.datafactory.domain.bo.project.ProjectBO; +import com.tianhua.datafactory.domain.enums.*; +import com.tianhua.datafactory.domain.repository.DataSourceQueryRepository; +import com.tianhua.datafactory.domain.repository.DataSourceRepository; +import com.tianhua.datafactory.domain.repository.ModelRepository; +import com.tianhua.datafactory.domain.repository.ProjectRepository; +import com.tianhua.datafactory.domain.support.kvpair.KVPairBO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Description: + * date: 2022/6/6 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +@Slf4j +public class PlantUMLApiModelBuilderService { + + + @Autowired + private ReadApiPlantUMLDocService readApiPlantUMLDocService; + + @Autowired + private ModelRepository modelRepository; + + @Autowired + private ProjectRepository projectRepository; + + + @Autowired + private DataSourceRepository dataSourceRepository; + + @Autowired + private DataSourceQueryRepository dataSourceQueryRepository; + + /** + * 通过导入构建元数据模型 + * + * @param projectCode + * @param plantUMLFilePath + */ + @Transactional(rollbackFor = Exception.class) + public void initPlantUMlModel(String projectCode, String plantUMLFilePath) { + PlantUMLApiContextBean plantUMLApiContextBean = readApiPlantUMLDocService.readDoc(plantUMLFilePath); + for (ParamModelBO paramModelBO : plantUMLApiContextBean.getParamClassBeanList()) { + paramModelBO.setModuleCode(""); + paramModelBO.setModelSuffix(""); + paramModelBO.getFieldBeanList().stream().forEach(fieldBO -> { + fieldBO.setFieldDoc(""); + fieldBO.init(); + fieldBO.setFieldExtBO(new FieldExtBO()); + fieldBO.setProjectCode(projectCode); + fieldBO.setParamClassName(paramModelBO.getParamClassName()); + }); + paramModelBO.setProjectCode(projectCode); + modelRepository.saveParamModel(paramModelBO); + } + + plantUMLApiContextBean.getApiBeanList().stream().forEach(apiBO -> { + apiBO.using(); + apiBO.setProjectCode(projectCode); + if (apiBO.getApiUrl().contains("/")) { + apiBO.setApiType(ApiTypeEnum.HTTP_API.getType()); + } + apiBO.setReturnValue(""); + apiBO.init(); + }); + + //注册枚举数据源 + registEnumDataSource(projectCode,plantUMLApiContextBean); + + ProjectBO projectBO = ProjectBO.getInstance(); + projectBO.setApiList(plantUMLApiContextBean.getApiBeanList()); + projectRepository.saveProject(projectBO); + + } + + + /** + * 注册枚举数据源 + * @param projectCode + * @param plantUMLApiContextBean + */ + private void registEnumDataSource(String projectCode, PlantUMLApiContextBean plantUMLApiContextBean){ + //注册枚举数据源 + Map enumBeanMap = plantUMLApiContextBean.getEnumBeanMap(); + if (enumBeanMap == null || enumBeanMap.isEmpty()) { + return; + } + + for (Map.Entry enumBeanEntry : enumBeanMap.entrySet()) { + EnumBean enumBean = enumBeanEntry.getValue(); + DataSourceBO dataSourceBO = new DataSourceBO(); + String sourceCode = projectCode+":" + enumBean.getClassName(); + dataSourceBO.setSourceCode(sourceCode); + dataSourceBO.setSourceName(enumBean.getClassDesc()); + dataSourceBO.setSourceType(DataSourceTypeEnum.FROM_SERVICE_ENUM.getCode()); + dataSourceBO.setProviderService(projectCode); + dataSourceBO.setProviderDomainUrl(""); + dataSourceBO.setRegistServer(RegistServerEnum.INDEPENDENCY_SERVICE.getCode()); + dataSourceBO.setStructType(""); + dataSourceBO.setVisitStrategy(VisitStrategyEnums.LOCAL_CACHE.getCode()); + dataSourceBO.setUrl(sourceCode); + List> valueList = enumBean.getEnumValueList(); + List kvPairBOList = new ArrayList<>(); + for (Map valueMap : valueList) { + valueMap.forEach((k, v) -> { + KVPairBO kvPairBO = KVPairBO.instance(k, v); + kvPairBO.setGroupKey(sourceCode); + kvPairBO.setParentKey(projectCode); + kvPairBOList.add(kvPairBO); + }); + } + dataSourceBO.setKvPairList(kvPairBOList); + DataSourceBO old = dataSourceQueryRepository.getByDataSourceCode(dataSourceBO.getSourceCode()); + if(old != null){ + continue; + } + //将服务枚举数据当作数据源进行注册,同时枚举值当作数据源的值进行管理 + dataSourceRepository.regist(dataSourceBO); + } + } + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/PlantUMLDomainModelBuilderService.java b/app/src/main/java/com/tianhua/datafactory/core/service/PlantUMLDomainModelBuilderService.java new file mode 100644 index 0000000000000000000000000000000000000000..453c519157adaa123dc399097da36f06ec70ea38 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/PlantUMLDomainModelBuilderService.java @@ -0,0 +1,232 @@ +package com.tianhua.datafactory.core.service; + +import com.tianhua.datafactory.domain.ability.ReadDomainPlantUMLDocService; +import com.tianhua.datafactory.domain.bo.*; +import com.tianhua.datafactory.domain.bo.bean.InterfaceBean; +import com.tianhua.datafactory.domain.bo.bean.MethodBean; +import com.tianhua.datafactory.domain.bo.bean.PlantUmlDomainContextBean; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceBO; +import com.tianhua.datafactory.domain.bo.model.FieldBO; +import com.tianhua.datafactory.domain.bo.model.FieldExtBO; +import com.tianhua.datafactory.domain.bo.model.ModelSuffixConfigBO; +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; +import com.tianhua.datafactory.domain.bo.project.ApiBO; +import com.tianhua.datafactory.domain.bo.project.ProjectBO; +import com.tianhua.datafactory.domain.enums.*; +import com.tianhua.datafactory.domain.repository.*; +import com.tianhua.datafactory.domain.support.kvpair.KVPairBO; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.assertj.core.util.Lists; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * Description: + * date: 2022/6/6 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +@Slf4j +public class PlantUMLDomainModelBuilderService { + + + @Autowired + private ReadDomainPlantUMLDocService readDomainPlantUMLDocService; + + @Autowired + private ModelRepository modelRepository; + + @Autowired + private ProjectRepository projectRepository; + + + @Autowired + private ProjectQueryRepository projectQueryRepository; + + @Autowired + private ModelQueryRepository modelQueryRepository; + + @Autowired + private DataSourceRepository dataSourceRepository; + + @Autowired + private DataSourceQueryRepository dataSourceQueryRepository; + + /** + * 通过导入构建领域模型数据 + * @param projectCode + * @param plantUMLFilePath + */ + @Transactional(rollbackFor = Exception.class) + public void initPlantUMlDomainModel(String projectCode,String plantUMLFilePath){ + PlantUmlDomainContextBean plantUmlDomainContextBean = readDomainPlantUMLDocService.getPlantUmlContextBean(plantUMLFilePath); + List modelSuffixConfigBOList = modelQueryRepository.getModelSuffixConfigList(); + Set modelSuffixSet = modelSuffixConfigBOList.stream().map(ModelSuffixConfigBO::getSuffix).collect(Collectors.toSet()); + for (Map.Entry classBeanEntry : plantUmlDomainContextBean.getClassBeanMap().entrySet()){ + Optional suffixOptional = modelSuffixSet.stream().filter(suffix->classBeanEntry.getKey().toLowerCase().endsWith(suffix.toLowerCase())).findFirst(); + //业务模型类 + if(suffixOptional.isPresent()){ + ParamModelBO paramModelBO = ParamModelBO.getInstance(classBeanEntry.getKey()); + paramModelBO.setProjectCode(projectCode); + paramModelBO.setModuleCode(""); + paramModelBO.setParamClassDesc(classBeanEntry.getValue().getClassDesc()); + paramModelBO.setModelSuffix(suffixOptional.get()); + List fieldBOList = classBeanEntry.getValue().getFieldBeanList(); + fieldBOList.stream().forEach(fieldBO -> { + fieldBO.using(); + fieldBO.setFieldExtBO(new FieldExtBO()); + fieldBO.setProjectCode(projectCode); + fieldBO.setFieldDoc(""); + }); + + paramModelBO.setFieldBeanList(fieldBOList); + + ParamModelBO oldParamModel = modelRepository.getModel(projectCode, paramModelBO.getParamClassName()); + if(oldParamModel == null){ + modelRepository.saveParamModel(paramModelBO); + }else { + paramModelBO.setId(oldParamModel.getId()); + paramModelBO.setStatus(oldParamModel.getStatus()); + modelRepository.updateParamModel(paramModelBO); + } + + }else { + //业务服务api类 + buildApiBatch(projectCode,classBeanEntry.getKey(),classBeanEntry.getValue().getMethodBeanList()); + } + } + + for (Map.Entry interfaceBeanEntry : plantUmlDomainContextBean.getInterfaceBeanMap().entrySet()){ + InterfaceBean interfaceBean = interfaceBeanEntry.getValue(); + if(CollectionUtils.isEmpty(interfaceBean.getMethodBeanList())){ + continue; + } + buildApiBatch(projectCode,interfaceBeanEntry.getKey(),interfaceBeanEntry.getValue().getMethodBeanList()); + } + + //注册枚举数据源 + registEnumDataSource(projectCode,plantUmlDomainContextBean); + + + } + + /** + * 批量构建api + * @param projectCode + * @param className + * @param methodBeanList + */ + private void buildApiBatch(String projectCode, String className,List methodBeanList){ + //业务服务api类 + for (MethodBean methodBean : methodBeanList){ + ApiBO apiBO = ApiBO.getInstance(projectCode,className+"."+methodBean.getSimplMethodName()); + apiBO.setApiType(ApiTypeEnum.SERVICE_API.getType()); + apiBO.init(); + apiBO.setApiDoc(methodBean.getDesc()); + if(methodBean.getParamArr() !=null){ + List paramModelBOList = Lists.newArrayList(); + for (String param : methodBean.getParamArr()){ + String [] paramArr = param.split(" "); + ParamModelBO paramModelBO = ParamModelBO.getInstance(paramArr[0]); + paramModelBO.setModelSuffix(""); + paramModelBO.setProjectCode(projectCode); + paramModelBO.setParamClassDesc(""); + paramModelBO.init(); + paramModelBO.setModuleCode(""); + paramModelBOList.add(paramModelBO); + } + + ParamModelBO returnParamModel = new ParamModelBO(); + returnParamModel.setGeneralType(false); + returnParamModel.setParamClassName(methodBean.getReturnClass()); + apiBO.setReturnParamModel(returnParamModel); + apiBO.setApiReturnWrapType(ReturnWrapClassEnum.RESULT_ORIGIN.getReturnWrapCode()); + + apiBO.setParamList(paramModelBOList); + apiBO.setReturnValue(""); + apiBO.setMethodType(MethodTypeEnum.INNER_SERVICE.getType()); + apiBO.using(); + apiBO.buildApiSign(); + + ApiBO oldApi = projectQueryRepository.getBySign(apiBO.getApiSign()); + if(oldApi == null){ + ProjectBO projectBO = ProjectBO.getInstance(); + projectBO.addApiBo(apiBO); + projectRepository.saveProject(projectBO); + }else { + apiBO.setId(oldApi.getId()); + //部分用户设置好的数据则不更新 + apiBO.setMockCount(oldApi.getMockCount()); + apiBO.setStatus(oldApi.getStatus()); + apiBO.setApiReturnWrapType(oldApi.getApiReturnWrapType()); + apiBO.setModuleCode(oldApi.getModuleCode()); + ProjectBO projectBO = ProjectBO.getInstance(); + projectBO.addApiBo(apiBO); + projectRepository.updateProject(projectBO); + } + + + } + } + } + + /** + * 注册枚举数据源 + * @param projectCode + * @param plantUmlDomainContextBean + */ + private void registEnumDataSource(String projectCode, PlantUmlDomainContextBean plantUmlDomainContextBean){ + //注册枚举数据源 + Map enumBeanMap = plantUmlDomainContextBean.getEnumBeanMap(); + if (enumBeanMap == null || enumBeanMap.isEmpty()) { + return; + } + + for (Map.Entry enumBeanEntry : enumBeanMap.entrySet()) { + EnumBean enumBean = enumBeanEntry.getValue(); + DataSourceBO dataSourceBO = new DataSourceBO(); + String sourceCode = projectCode+":"+ enumBean.getClassName(); + dataSourceBO.setSourceCode(sourceCode); + dataSourceBO.setSourceName(enumBean.getClassDesc()); + dataSourceBO.setSourceType(DataSourceTypeEnum.FROM_SERVICE_ENUM.getCode()); + dataSourceBO.setProviderService(projectCode); + dataSourceBO.setProviderDomainUrl(""); + dataSourceBO.setRegistServer(RegistServerEnum.INDEPENDENCY_SERVICE.getCode()); + dataSourceBO.setStructType(""); + dataSourceBO.setVisitStrategy(VisitStrategyEnums.LOCAL_CACHE.getCode()); + dataSourceBO.setUrl(sourceCode); + List> valueList = enumBean.getEnumValueList(); + List kvPairBOList = new ArrayList<>(); + for (Map valueMap : valueList) { + valueMap.forEach((k, v) -> { + KVPairBO kvPairBO; + if(!k.contains(" ")){ + kvPairBO = KVPairBO.instance(k, v); + }else { + kvPairBO = KVPairBO.instance(k.split(" ")[1], v); + } + kvPairBO.setGroupKey(sourceCode); + kvPairBO.setParentKey(projectCode); + kvPairBOList.add(kvPairBO); + }); + } + dataSourceBO.setKvPairList(kvPairBOList); + + DataSourceBO old = dataSourceQueryRepository.getByDataSourceCode(dataSourceBO.getSourceCode()); + if(old != null){ + continue; + } + //将服务枚举数据当作数据源进行注册,同时枚举值当作数据源的值进行管理 + dataSourceRepository.regist(dataSourceBO); + } + } + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/TableModelBuilderService.java b/app/src/main/java/com/tianhua/datafactory/core/service/TableModelBuilderService.java new file mode 100644 index 0000000000000000000000000000000000000000..8a1790ec6a2d666a3cda5f7631e7a1a9cbcfb02f --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/TableModelBuilderService.java @@ -0,0 +1,217 @@ +package com.tianhua.datafactory.core.service; + +import com.tianhua.datafactory.domain.bo.model.FieldBO; +import com.tianhua.datafactory.domain.bo.model.FieldExtBO; +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; +import com.tianhua.datafactory.domain.bo.model.TableBO; +import com.tianhua.datafactory.domain.repository.ModelRepository; +import com.tianhua.datafactory.domain.util.StringHelperUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * Description: + * date: 2022/6/6 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +@Slf4j +public class TableModelBuilderService { + + @Autowired + private ERPlantUMLParseService erPlantUMLParseService; + + @Autowired + private ModelRepository modelRepository; + + private Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$"); + + + /** + * 批量导入 + * @param tableBO + */ + @Transactional(rollbackFor = Exception.class) + public void buildERModel(TableBO tableBO){ + try { + List contentList = FileUtils.readLines(new File(tableBO.getFile()),"UTF-8"); + List tableBOList = erPlantUMLParseService.getPlantUmlContextBean(contentList); + + + List oldTableBoList = modelRepository.getDbErByProjectCode(tableBO.getProjectCode()); + Map oldTableBOMap = oldTableBoList.stream().collect(Collectors.toMap(TableBO::getTableName, o->o,(k1, k2)->k2)); + + List oldParamModelBOList = modelRepository.getModelByProjectCode(tableBO.getProjectCode()); + + Map oldParamModelMap = oldParamModelBOList.stream().collect(Collectors.toMap(ParamModelBO::getParamClassName,o->o,(k1, k2)->k2)); + + + + for (TableBO table : tableBOList){ + if(oldTableBOMap.containsKey(table.getTableName())){ + + TableBO oldTableBO = oldTableBOMap.get(table.getTableName()); + oldTableBO.setTableComment(table.getTableComment()); + oldTableBO.setColumnList(table.getColumnList()); + modelRepository.updateDBModel(oldTableBO); + continue; + } + table.init(); + table.setDbName(tableBO.getDbName()); + table.setProjectCode(tableBO.getProjectCode()); + modelRepository.saveDBModel(table); + } + //构建javaEntity模型 + if(tableBO.buildJavaEntity()){ + for (TableBO tableBO1 : tableBOList) { + ParamModelBO paramModelBO = new ParamModelBO(); + List fieldBOList = new ArrayList<>(); + String humpTableName = getHumpTableName(tableBO1.getTableName()); + String humpClassName = StringHelperUtils.getHumpClassName(humpTableName); + paramModelBO.setParamClassName(humpClassName+tableBO.getModelSuffix()); + paramModelBO.init(); + paramModelBO.setParamClassDesc(tableBO1.getTableComment()); + paramModelBO.setProjectCode(tableBO.getProjectCode()); + paramModelBO.setModuleCode(""); + paramModelBO.setModelSuffix(tableBO.getModelSuffix()); + + tableBO1.getColumnList().forEach(columnBO -> { + FieldBO fieldBO = new FieldBO(); + String columnFieldName = getHumpTableName(columnBO.getColumnName()); + fieldBO.setFieldName(columnFieldName); + fieldBO.init(); + String columnTypeName = getColumnTypeName(columnBO.getColumnType()); + fieldBO.setFieldType(columnTypeName); + fieldBO.setFieldExtBO(new FieldExtBO()); + fieldBO.setProjectCode(tableBO.getProjectCode()); + fieldBO.setParamClassName(humpClassName); + fieldBO.setFieldDoc(""); + fieldBO.setFieldDesc(columnBO.getColumnComment()); + fieldBOList.add(fieldBO); + }); + + paramModelBO.setFieldBeanList(fieldBOList); + + if(oldParamModelMap.containsKey(paramModelBO.getParamClassName())){ + ParamModelBO oldParamModel = oldParamModelMap.get(paramModelBO.getParamClassName()); + oldParamModel.setFieldBeanList(fieldBOList); + modelRepository.updateParamModel(oldParamModel); + continue; + } + + modelRepository.saveParamModel(paramModelBO); + } + } + + + } catch (IOException e) { + e.printStackTrace(); + } + } + + + /** + * 获取表名对应的变量名 + * eg: user_info->userInfo + * staff_education_info->staffEducationInfo + * + * @param tableName + * @return + */ + private String getHumpTableName(String tableName){ + String resultName = ""; + + if(!tableName.contains("_")){ + resultName = tableName; + }else { + String[] tableNameArr = tableName.split("_"); + int length = tableNameArr.length; + StringBuilder builder = new StringBuilder(); + + if(isNum(tableNameArr[length - 1])){ + if(length == 2){ + resultName = tableNameArr[0]; + }else { + builder.append(tableNameArr[0]); + for (int i = 1;i < length - 1;i++){ + String tag = tableNameArr[i].substring(0,1).toUpperCase().concat(tableNameArr[i].substring(1)); + builder.append(tag); + } + resultName = builder.toString(); + } + }else { + builder.append(tableNameArr[0]); + for (int i = 1;i < length;i++){ + String tag = tableNameArr[i].substring(0,1).toUpperCase().concat(tableNameArr[i].substring(1)); + builder.append(tag); + } + resultName = builder.toString(); + } + + } + return resultName; + } + + + private boolean isNum(String str){ + return pattern.matcher(str).matches(); + } + + /** + * 获取字段类型对应的javaentity的java类型 + * @param columnType + * @return + */ + private String getColumnTypeName(String columnType){ + if(columnType.toLowerCase().contains("blob") || columnType.toLowerCase().contains("text")){ + return "String"; + } + else if(columnType.contains("bigint")){ + return "Long"; + } + else if(columnType.contains("int")){ + return "Integer"; + } + else if(columnType.contains("varchar")){ + return "String"; + } + else if(columnType.contains("boolean")){ + return "Boolean"; + } + else if(columnType.contains("date")){ + return "Date"; + } + else if(columnType.contains("double")){ + return "Double"; + } + else if(columnType.contains("timestamp")){ + return "Date"; + } + else if(columnType.contains("time")){ + return "Date"; + } + else if(columnType.toUpperCase().contains("DECIMAL")){ + return "BigDecimal"; + }else if(columnType.contains("json")){ + return "String"; + } + return null; + } + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataFactoryServiceImpl.java b/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataFactoryServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..924380c97f8af541d106a9082396815228b14f4b --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataFactoryServiceImpl.java @@ -0,0 +1,145 @@ +package com.tianhua.datafactory.core.service.impl; + +import com.alibaba.fastjson.JSON; +import com.tianhua.datafactory.core.service.DataFactoryService; +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.core.service.DataTypeAdapter; +import com.tianhua.datafactory.core.service.FieldValueFactory; +import com.tianhua.datafactory.domain.ability.GenericService; +import com.tianhua.datafactory.domain.GlobalConstant; +import com.tianhua.datafactory.domain.bo.GenericTypeBO; +import com.tianhua.datafactory.domain.bo.datafactory.*; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceBO; +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; +import com.tianhua.datafactory.domain.bo.project.ApiBO; +import com.tianhua.datafactory.domain.repository.DataSourceQueryRepository; +import com.tianhua.datafactory.domain.repository.ProjectQueryRepository; +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.security.SecureRandom; +import java.util.*; + +/** + * description: DataFactoryServiceImpl
+ * date: 2020/12/5 23:40
+ * author: coderman
+ * version: 1.0
+ */ +@Service +@Slf4j +public class DataFactoryServiceImpl implements DataFactoryService { + + private ThreadLocal randomThreadLocal = new ThreadLocal<>(); + + @Autowired + private FieldValueFactory fieldValueFactory; + + + @Autowired + private DataSourceQueryRepository dataSourceQueryRepository; + + @Resource + private FlowExecutor flowExecutor; + + + @Autowired + private ProjectQueryRepository projectQueryRepository; + + + @Autowired + private GenericService genericService; + + @Resource(name = "basicTypeAdapter") + private DataTypeAdapter basicTypeAdapter; + + + @Override + public ResultDataDto>> generateData(DataBuildRequestBO dataBuildRequestBO) throws Exception { + randomThreadLocal.set(new SecureRandom()); + + //1.进入liteflow工作流 + LiteflowResponse liteflowResponse = flowExecutor.execute2Resp(GlobalConstant.CHAIN_FLOW, dataBuildRequestBO, DataBuildResponseBO.class); + + ResultDataDto resultDataDto = new ResultDataDto(); + + DataBuildResponseBO context = liteflowResponse.getContextBean(DataBuildResponseBO.class); + //2.从工作流中获取结果 + resultDataDto.setData(context.getResultList()); + return resultDataDto; + } + + @Override + public ResultDataDto>> generateDataApiReqParam(DataBuildRequestBO dataBuildRequestBO) throws Exception { + randomThreadLocal.set(new SecureRandom()); + + //1.进入liteflow工作流 + LiteflowResponse liteflowResponse = flowExecutor.execute2Resp(GlobalConstant.CHAIN_FLOW, dataBuildRequestBO, DataBuildResponseBO.class); + + ResultDataDto resultDataDto = new ResultDataDto(); + + DataBuildResponseBO context = liteflowResponse.getContextBean(DataBuildResponseBO.class); + //2.从工作流中获取结果 + resultDataDto.setData(context.getResultList()); + return resultDataDto; + } + + @Override + public ResultDataDto>> generateDataApiRespParam(ApiMockBO apiMockBO) throws Exception { + + ApiBO apiBO = projectQueryRepository.getBySign(apiMockBO.getApiSign()); + log.info("构建接口mock数据的apiBO = {}", JSON.toJSONString(apiBO)); + DataBuildRequestBO dataBuildRequestBO = new DataBuildRequestBO(); + dataBuildRequestBO.setApiSign(apiMockBO.getApiSign()); + dataBuildRequestBO.setProjectCode(apiBO.getProjectCode()); + if(apiMockBO.getMockCount() == null || apiMockBO.getMockCount() <= 0){ + if(apiBO.getMockCount() == null || apiBO.getMockCount() == 0){ + dataBuildRequestBO.setBuildCount(1); + }else { + dataBuildRequestBO.setBuildCount(apiBO.getMockCount()); + } + }else { + dataBuildRequestBO.setBuildCount(apiMockBO.getMockCount()); + } + + ParamModelBO paramModelBO = apiBO.getReturnParamModel(); + if(paramModelBO == null){ + throw new Exception("接口返回模型为空,请在接口管理中配置返回模型"); + } + + GenericTypeBO genericTypeBO = genericService.getGenericType(paramModelBO.getParamClassName()); + genericTypeBO.setApiBO(apiBO); + List fieldBOList = basicTypeAdapter.buildFieldList(genericTypeBO); + dataBuildRequestBO.setFieldBOList(fieldBOList); + return generateData(dataBuildRequestBO); + } + + @Override + public String buildData(DataBuildRequestFieldBO dataBuildRequestFieldBO) { + DataSourceFieldRequestBean dataSourceFieldRequestBean = new DataSourceFieldRequestBean(); + String dataSourceCode = dataBuildRequestFieldBO.getDataSourceCode(); + if(dataSourceCode.contains("#")){ + dataSourceCode = dataSourceCode.split("#")[0]; + } + DataSourceBO dataSourceBO = dataSourceQueryRepository.getByDataSourceCode(dataSourceCode); + dataBuildRequestFieldBO.setDataSourceType(dataSourceBO.getSourceType()); + dataBuildRequestFieldBO.setDataSourceBO(dataSourceBO); + dataSourceFieldRequestBean.setDataBuildRequestFieldBO(dataBuildRequestFieldBO); + Object object = null; + try { + object = fieldValueFactory.getFieldValue(dataSourceFieldRequestBean); + if(object == null){ + return ""; + } + return object.toString(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateDefaultServiceImpl.java b/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateDefaultServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..1213ecaa60bc78dc29969688835519b3c3662386 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateDefaultServiceImpl.java @@ -0,0 +1,34 @@ +package com.tianhua.datafactory.core.service.impl; + +import com.tianhua.datafactory.core.service.DataGenerateService; +import com.tianhua.datafactory.core.service.DataValueHandler; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldRuleBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataSourceFieldRequestBean; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; + +/** + * description: DataGenerateDefaultServiceImpl
+ * date: 2021/1/17 20:24
+ * author: coderman
+ * version: 1.0
+ * 处理属性自带的默认值 + * 包括属性依赖关系默认值处理 + */ +@Service(value = "dataGenerateDefaultServiceImpl") +public class DataGenerateDefaultServiceImpl implements DataGenerateService { + + @Override + public Object getRandomData(DataSourceFieldRequestBean dataSourceFieldRequestBean) { + DataBuildRequestFieldBO dataBuildRequestFieldBO = dataSourceFieldRequestBean.getDataBuildRequestFieldBO(); + if (CollectionUtils.isNotEmpty(dataBuildRequestFieldBO.getDefaultValueList())) { + int index = dataBuildRequestFieldBO.getDefaultValueList().size(); + return dataBuildRequestFieldBO.getDefaultValueList().get(dataSourceFieldRequestBean.getCurrentIndex() % index); + } + return null; + } +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateDubboImpl.java b/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateDubboImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..c0cc0fa5c7e8e6e4fce46ddc5eaa2d90af396630 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateDubboImpl.java @@ -0,0 +1,58 @@ +package com.tianhua.datafactory.core.service.impl; + +import com.alibaba.fastjson.JSON; +import com.tianhua.datafactory.core.adapter.DubboServiceFactory; +import com.tianhua.datafactory.core.service.DataGenerateService; +import com.tianhua.datafactory.domain.bo.datafactory.DataSourceFieldRequestBean; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceBO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.util.*; + +/** + * Description + * 对接dubbo rpc 泛华调用 + * date: 2022/7/31 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "dataGenerateDubboImpl") +@Slf4j +public class DataGenerateDubboImpl implements DataGenerateService { + private Random random = new SecureRandom(); + @Override + public Object getRandomData(DataSourceFieldRequestBean dataSourceFieldRequestBean) { + DataSourceBO dataSourceBO = dataSourceFieldRequestBean.getDataBuildRequestFieldBO().getDataSourceBO(); + String [] urlArr = dataSourceBO.getUrl().split("#"); + Object result = DubboServiceFactory.getInstance().genericInvoke(dataSourceBO.getProviderService(),urlArr[0],urlArr[1],null); + + String dataSourceCode = dataSourceFieldRequestBean.getDataBuildRequestFieldBO().getDataSourceCode(); + String targetField = dataSourceCode.split("#")[1]; + + List resultList = new ArrayList<>(); + if(result instanceof HashMap){ + HashMap rootMap = (HashMap)result; + List childList = (List)rootMap.get("data"); + if(childList == null){ + log.warn("查不到dubbo接口数据源.................."); + return null; + } + childList.stream().forEach(val ->{ + HashMap valueMap = (HashMap)val; + resultList.add(valueMap.get(targetField)); + }); + }else if(result instanceof ArrayList){ + ArrayList rootList = (ArrayList)result; + rootList.stream().forEach(val ->{ + HashMap valueMap = (HashMap)val; + resultList.add(valueMap.get(targetField)); + }); + } + + return resultList.get(random.nextInt(resultList.size())); + } +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateFileDataServiceImpl.java b/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateFileDataServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..fab76f2bc6d3ea84c7941c3264f003dc7761c45c --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateFileDataServiceImpl.java @@ -0,0 +1,34 @@ +package com.tianhua.datafactory.core.service.impl; + +import com.tianhua.datafactory.client.service.FileDataService; +import com.tianhua.datafactory.core.service.DataGenerateService; +import com.tianhua.datafactory.domain.bo.datafactory.DataSourceFieldRequestBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * Description + * 从文件数据源中获取数据源 + * date: 2022/9/4 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "dataGenerateFileDataServiceImpl") +public class DataGenerateFileDataServiceImpl implements DataGenerateService { + + @Autowired + private FileDataService fileDataService; + + @Override + public Object getRandomData(DataSourceFieldRequestBean dataSourceFieldRequestBean) { + String dataSourceCode = dataSourceFieldRequestBean.getDataBuildRequestFieldBO().getDataSourceCode(); + if(!dataSourceCode.contains("#")){ + dataSourceCode = dataSourceCode + dataSourceFieldRequestBean.getDataBuildRequestFieldBO().getFieldName(); + } + return fileDataService.getFileData(dataSourceCode); + } + + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateFunctionServiceImpl.java b/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateFunctionServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..5ff32c67a8a8d7616a556a7092643793fe05d7dd --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateFunctionServiceImpl.java @@ -0,0 +1,42 @@ +package com.tianhua.datafactory.core.service.impl; + +import com.tianhua.datafactory.client.function.Function; +import com.tianhua.datafactory.client.function.factory.FunctionFactory; +import com.tianhua.datafactory.core.service.DataGenerateService; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldRuleBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataSourceFieldRequestBean; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * description: DataGenerateFunctionServiceImpl
+ * date: 2021/1/17 20:29
+ * author: coderman
+ * version: 1.0
+ */ +@Service(value = "dataGenerateFunctionServiceImpl") +@Slf4j +public class DataGenerateFunctionServiceImpl implements DataGenerateService { + + @Autowired + private FunctionFactory functionFactory; + + @Override + public Object getRandomData(DataSourceFieldRequestBean dataSourceFieldRequestBean) throws Exception { + DataBuildRequestFieldRuleBO dataBuildRequestFieldRuleBO = dataSourceFieldRequestBean.getDataBuildRequestFieldBO().getDataBuildRequestFieldRuleBO(); + + String dataSourceCode = dataSourceFieldRequestBean.getDataBuildRequestFieldBO().getDataSourceCode(); + Function function = functionFactory.createFunction(dataSourceCode); + + if(function == null){ + log.error("根据dataSourceCode查不到对应的Function bean,dataSourceCode = {}",dataSourceCode); + } + if(dataBuildRequestFieldRuleBO == null){ + return function.createOneData(null); + } + + Object objValue = function.createOneData(dataBuildRequestFieldRuleBO.getFuncVar()); + return objValue; + } +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateHttpApiServiceImpl.java b/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateHttpApiServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..33d653d196068334a374a8f739a51adc826e23d0 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateHttpApiServiceImpl.java @@ -0,0 +1,140 @@ +package com.tianhua.datafactory.core.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.tianhua.datafactory.core.adapter.HttpApiAdapter; +import com.tianhua.datafactory.core.service.DataGenerateService; +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.domain.bo.HttpApiRequestBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataSourceFieldRequestBean; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceBO; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceReqConfigBO; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceRespConfigBO; +import com.tianhua.datafactory.domain.enums.ReturnTypeEnum; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * description: DataGenerateRemoteServiceImpl
+ * date: 2021/1/17 20:29
+ * author: coderman
+ * version: 1.0
+ */ +@Service(value = "dataGenerateHttpApiServiceImpl") +@Slf4j +public class DataGenerateHttpApiServiceImpl implements DataGenerateService { + + @Autowired + private HttpApiAdapter httpApiAdapter; + + /** + * 初始化缓存,key:dataSourceCode数据源编码 + * value:对应的数据源值列表 + */ + private static final Cache> manualCache = Caffeine.newBuilder() + .maximumSize(10_000) + .expireAfterWrite(10 * 60, TimeUnit.SECONDS) + .build(); + + private static SecureRandom secureRandom = new SecureRandom(); + + @Override + public Object getRandomData(DataSourceFieldRequestBean dataSourceFieldRequestBean) { + + DataSourceBO dataSourceBO = dataSourceFieldRequestBean.getDataBuildRequestFieldBO().getDataSourceBO(); + + String dataSourceCode = dataSourceBO.getSourceCode(); + if(!dataSourceCode.contains("#")){ + dataSourceCode = dataSourceCode + "#" + dataSourceFieldRequestBean.getDataBuildRequestFieldBO().getFieldName(); + } + + List list = manualCache.getIfPresent(dataSourceCode); + if(list != null && list.size() > 0){ + return list.get(secureRandom.nextInt(list.size())); + } + + Object value = initCache(dataSourceFieldRequestBean); + return value; + } + + /** + * 缓存接口响应数据 + * @param dataSourceFieldRequestBean + * @return + */ + private synchronized Object initCache(DataSourceFieldRequestBean dataSourceFieldRequestBean){ + DataSourceBO dataSourceBO = dataSourceFieldRequestBean.getDataBuildRequestFieldBO().getDataSourceBO(); + + HttpApiRequestBO httpApiRequestBO = new HttpApiRequestBO(dataSourceBO.getProviderDomainUrl() + dataSourceBO.getUrl()); + httpApiRequestBO.setServiceName(dataSourceBO.getProviderService()); + + httpApiRequestBO.setReturnType(dataSourceBO.getStructType()); + + if(dataSourceBO.getDataSourceReqConfigList() != null){ + for (DataSourceReqConfigBO dataSourceReqConfigBO : dataSourceBO.getDataSourceReqConfigList()){ + httpApiRequestBO.addParam(dataSourceReqConfigBO.getParamKey(),dataSourceReqConfigBO.getParamValue()); + } + } + + + for (DataSourceRespConfigBO dataSourceRespConfigBO : dataSourceBO.getDataSourceRespConfigList()){ + httpApiRequestBO.addParamField(dataSourceRespConfigBO.getFieldKey()); + } + + List> dataList = httpApiAdapter.getServiceDataFromHttp(httpApiRequestBO); + if(CollectionUtils.isEmpty(dataList)){ + return null; + } + + Map> responseMap = new HashMap<>(); + + + String dataSourceCode = dataSourceFieldRequestBean.getDataBuildRequestFieldBO().getDataSourceCode(); + + if(dataSourceCode.contains("#")){ + dataSourceCode = dataSourceCode.split("#")[0]; + } + + String finalDataSourceCode = dataSourceCode; + dataList.forEach(map->{ + for (DataSourceRespConfigBO dataSourceRespConfigBO : dataSourceBO.getDataSourceRespConfigList()){ + String subDataSourceCode = finalDataSourceCode + "#" +dataSourceRespConfigBO.getFieldKey(); + List list = responseMap.get(subDataSourceCode); + if(list == null){ + list = new ArrayList<>(); + } + + Object fieldValue = map.get(dataSourceRespConfigBO.getFieldKey()); + if (fieldValue != null) { + list.add(fieldValue); + } + responseMap.put(subDataSourceCode, list); + } + }); + + + responseMap.forEach((k,v)-> manualCache.put(k, v)); + + String subDataSourceCode = finalDataSourceCode + "#" +dataSourceFieldRequestBean.getDataBuildRequestFieldBO().getFieldName(); + List list = manualCache.getIfPresent(subDataSourceCode); + if(list != null && list.size() > 0){ + return list.get(secureRandom.nextInt(list.size())); + } + + return null; + + } +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateLocalKVImpl.java b/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateLocalKVImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..8f1dc981f9a51bf5b8217b5effa085d1c849e7cb --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateLocalKVImpl.java @@ -0,0 +1,64 @@ +package com.tianhua.datafactory.core.service.impl; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.tianhua.datafactory.core.service.DataGenerateService; +import com.tianhua.datafactory.domain.ability.KVPairService; +import com.tianhua.datafactory.domain.bo.datafactory.DataSourceFieldRequestBean; +import com.tianhua.datafactory.domain.support.kvpair.KVPairBO; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.util.List; +import java.util.Random; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * Description + * 对接本地kv enum + * date: 2022/7/31 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "dataGenerateLocalKVImpl") +@Slf4j +public class DataGenerateLocalKVImpl implements DataGenerateService { + @Autowired + private KVPairService kvPairService; + + public Random random = new SecureRandom(); + + private Cache cache = Caffeine.newBuilder() + .expireAfterWrite(5, TimeUnit.SECONDS) + .maximumSize(5000) + .build(); + + + @Override + public Object getRandomData(DataSourceFieldRequestBean dataSourceFieldRequestBean) { + String sourceCode = dataSourceFieldRequestBean.getDataBuildRequestFieldBO().getDataSourceCode(); + List list = cache.get(sourceCode,code -> initCache(sourceCode)); + return list.get(random.nextInt(list.size())); + } + + private List initCache(String dataSourceCode){ + if(!dataSourceCode.contains("#")){ + log.error("本地kv对应的sourceCode格式错误."); + //todo throw exception + } + String [] array = dataSourceCode.split("#"); + + List list = kvPairService.getList(KVPairBO.instance().groupKey(array[0]).Key(array[1])); + if(CollectionUtils.isEmpty(list)){ + //todo throw exception + return null; + } + return list.stream().map(KVPairBO::getValue).collect(Collectors.toList()); + } +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateSpringCloudServiceImpl.java b/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateSpringCloudServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..57ada3ee9e3901ea05630823b444fa5d6576dfe3 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/impl/DataGenerateSpringCloudServiceImpl.java @@ -0,0 +1,25 @@ +package com.tianhua.datafactory.core.service.impl; + +import com.tianhua.datafactory.core.service.DataGenerateService; +import com.tianhua.datafactory.domain.bo.datafactory.DataSourceFieldRequestBean; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * Description + * + * 支持spring cloud的接口api + * date: 2022/9/2 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "dataGenerateSpringCloudServiceImpl") +@Slf4j +public class DataGenerateSpringCloudServiceImpl implements DataGenerateService { + @Override + public Object getRandomData(DataSourceFieldRequestBean dataSourceFieldRequestBean) { + return null; + } +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/impl/ERPlantUMLParseServiceImpl.java b/app/src/main/java/com/tianhua/datafactory/core/service/impl/ERPlantUMLParseServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..50ccf7279d472f92e022dc3c6f6f346f7e8238b8 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/impl/ERPlantUMLParseServiceImpl.java @@ -0,0 +1,232 @@ +package com.tianhua.datafactory.core.service.impl; + +import com.tianhua.datafactory.core.service.ERPlantUMLParseService; +import com.tianhua.datafactory.domain.GlobalConstant; +import com.tianhua.datafactory.domain.bo.model.ColumnBO; +import com.tianhua.datafactory.domain.bo.model.TableBO; +import com.tianhua.datafactory.domain.enums.ColumnTypeEnums; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Description: + * date: 2021/8/12 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class ERPlantUMLParseServiceImpl implements ERPlantUMLParseService { + + /** + * 解析plantUML文件内容 + * + * @return + */ + public List getPlantUmlContextBean(List contentList) { + if(CollectionUtils.isEmpty(contentList)){ + return null; + } + + List elementList = new ArrayList<>(); + List entityBeanList = new ArrayList<>(); + //对entity进行解析 + for (String str : contentList) { + if (StringUtils.isEmpty(str) || str.contains("@startuml") || str.contains("package")) { + continue; + } + + if (str.trim().contains("{")) { + elementList.add(str.trim()); + continue; + } + + if (str.trim().contains("}")) { + elementList.add(str.trim()); + parseClassElement(elementList, entityBeanList); + elementList.clear(); + continue; + } + if (str.trim().contains(":") || (str.trim().contains("key") && str.trim().contains("extend"))) { + elementList.add(str.trim()); + } + } + + return entityBeanList; + } + + + /** + * 解析文件内容整体路由 + * + * @param elementList + * @param entityBeanList + */ + private void parseClassElement(List elementList, List entityBeanList) { + TableBO tableBO = buildClassBean(elementList); + entityBeanList.add(tableBO); + } + + + /** + * 解析class类型数据 + * + * @param elementList + * @return + */ + private TableBO buildClassBean(List elementList) { + TableBO tableBO = new TableBO(); + + String[] array = elementList.get(0).trim().replace("{", "") + .replace("entity", "") + .replace("as ", "") + .replace("\"", "").trim().split(" "); + + List columnBeanList = getColumnBeanList(elementList.subList(1, elementList.size())); + //List indexBeanList = getIndexBeanList(elementList.subList(1, elementList.size())); + tableBO.setColumnList(columnBeanList); + //entityBean.setIndexBeanList(indexBeanList); + + tableBO.setTableName(array[0]); + tableBO.setTableComment(array[1]); + + return tableBO; + } + + + /** + * 获取表字段信息 + * + * @param elementList + * @return + */ + private List getColumnBeanList(List elementList) { + List columnBOList = new ArrayList<>(); + + for (String fieldStr : elementList) { + if (fieldStr.contains("key") && fieldStr.contains("extend")) { + break; + } + + if (!fieldStr.trim().contains(":")) { + continue; + } + + String[] fieldArr = fieldStr.trim().split(":"); + ColumnBO columnBO = new ColumnBO(); + String[] tagArr = fieldArr[1].split("/"); + + columnBO.setColumnComment(tagArr[0]); + columnBO.setColumnName(fieldArr[0]); + if (tagArr.length == 2) { + if(tagArr[1].contains("(")){ + columnBO.setColumnType(tagArr[1].substring(0,tagArr[1].indexOf("("))); + }else { + columnBO.setColumnType(tagArr[1]); + } + } + if (tagArr.length == 3) { + columnBO.setDefaultValue(tagArr[1]); + if(tagArr[2].contains("(")){ + columnBO.setColumnType(tagArr[2].substring(0,tagArr[2].indexOf("("))); + }else { + columnBO.setColumnType(tagArr[2]); + } + } + if (StringUtils.isEmpty(columnBO.getDefaultValue())) { + if (ColumnTypeEnums.isInt(columnBO.getColumnType())) { + columnBO.setDefaultValue("0"); + } + if (ColumnTypeEnums.isVarchar(columnBO.getColumnType())) { + columnBO.setDefaultValue("''"); + } + + if (ColumnTypeEnums.isJson(columnBO.getColumnType())) { + columnBO.setDefaultValue("{}"); + } + + + if (ColumnTypeEnums.isDate(columnBO.getColumnType())) { + columnBO.setDefaultValue("'2000-01-01 00:00:00'"); + } + } + + if(columnBO.getColumnType().contains("(")){ + String columnLength = columnBO.getColumnType().substring(columnBO.getColumnType().indexOf("(")+1, columnBO.getColumnType().indexOf(")")); + columnBO.setColumnLength(Integer.parseInt(columnLength)); + }else { + columnBO.setColumnLength(0); + } + // entityFieldBean.setNullable(false); + columnBOList.add(columnBO); + } + return columnBOList; + } + + /** + * 获取索引信息 + * + * @param elementList + * @return + */ + private List getIndexBeanList(List elementList) { + List indexBeanList = new ArrayList<>(); + int index = 0; + for (int i = 0; i < elementList.size(); i++) { + + if (elementList.get(i).contains("key") && elementList.get(i).contains("extend")) { + index = i + 1; + break; + } + } + + + for (String fieldStr : elementList.subList(index, elementList.size())) { + ColumnBO indexFieldBean = new ColumnBO(); + if (!fieldStr.contains(":")) { + continue; + } + String[] indexArr = fieldStr.split(":"); + if (indexArr[0].toLowerCase().equals(GlobalConstant.PKEY)) { + //indexFieldBean.setPkey(true); + indexFieldBean.setColumnName(indexArr[1]); + indexBeanList.add(indexFieldBean); + } + if (indexArr[0].toLowerCase().equals(GlobalConstant.UKEY)) { + //indexFieldBean.setUKey(true); + indexFieldBean.setColumnName(indexArr[1]); + indexBeanList.add(indexFieldBean); + } + if (indexArr[0].toLowerCase().equals(GlobalConstant.KEY)) { + indexFieldBean.setColumnName(indexArr[1]); + indexBeanList.add(indexFieldBean); + } + + } + return indexBeanList; + } + + /** + * 判断字符串中是否包含中文 + * + * @param str 待校验字符串 + * @return 是否为中文 + * @warn 不能校验是否为中文标点符号 + */ + public static boolean isContainChinese(String str) { + Pattern p = Pattern.compile("[\u4e00-\u9fa5]"); + Matcher m = p.matcher(str); + if (m.find()) { + return true; + } + return false; + } + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/liteflow/DataPreProcessingCmp.java b/app/src/main/java/com/tianhua/datafactory/core/service/liteflow/DataPreProcessingCmp.java new file mode 100644 index 0000000000000000000000000000000000000000..5093e664e511480c7a147491e506d2d594402537 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/liteflow/DataPreProcessingCmp.java @@ -0,0 +1,203 @@ +package com.tianhua.datafactory.core.service.liteflow; + + +import com.alibaba.fastjson.JSON; +import com.tianhua.datafactory.domain.ability.GenericService; +import com.tianhua.datafactory.domain.bo.GenericTypeBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldRuleBO; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceBO; +import com.tianhua.datafactory.domain.bo.model.FieldBO; +import com.tianhua.datafactory.domain.factory.FieldRuleDslFactory; +import com.tianhua.datafactory.domain.repository.DataSourceQueryRepository; +import com.tianhua.datafactory.domain.repository.ModelQueryRepository; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeComponent; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * Description + * 在批量数据构建的编排任务中,首先对请求数据进行一定的预处理 + * date: 2022/8/13 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@LiteflowComponent(id = "dataPreProcessingCmp", name = "数据构建预处理") +@Slf4j +public class DataPreProcessingCmp extends NodeComponent { + + @Autowired + private DataSourceQueryRepository dataSourceQueryRepository; + + + @Autowired + private FieldRuleDslFactory fieldRuleDslFactory; + + + @Autowired + private GenericService genericService; + + + @Autowired + private ModelQueryRepository modelQueryRepository; + + @Override + public void process() throws Exception { + + DataBuildRequestBO dataBuildRequestBO = this.getRequestData(); + + //1.构建数据源 + bindDataSource(dataBuildRequestBO); + //2.解析构建属性dsl信息 + buildFieldDslRuleBO(dataBuildRequestBO); + } + + /** + * 获取数据源详情 + * @param dataBuildRequestBO + */ + private void bindDataSource(DataBuildRequestBO dataBuildRequestBO) throws Exception { + List dataBuildRequestFieldBeans = dataBuildRequestBO.getFieldBOList(); + + //从项目模型中构建 + if(CollectionUtils.isEmpty(dataBuildRequestFieldBeans)){ + List fieldBOList = modelQueryRepository.getModelField(dataBuildRequestBO.getProjectCode(), dataBuildRequestBO.getParamModelCode()); + + if(CollectionUtils.isEmpty(fieldBOList)){ + throw new Exception("属性模型为空,无法构建数据."); + } + + dataBuildRequestFieldBeans = new ArrayList<>(); + for (FieldBO fieldBO : fieldBOList){ + DataBuildRequestFieldBO dataBuildRequestFieldBO = new DataBuildRequestFieldBO<>(); + dataBuildRequestFieldBO.setFieldName(fieldBO.getFieldName()); + dataBuildRequestFieldBO.setFieldType(fieldBO.getFieldType()); + if(fieldBO.getFieldExtBO() != null){ + dataBuildRequestFieldBO.setDefaultValueList(fieldBO.getFieldExtBO().getDefaultValueList()); + dataBuildRequestFieldBO.setDataSourceCode(fieldBO.getFieldExtBO().getDataSourceCode()); + dataBuildRequestFieldBO.setBuildRuleDSL(fieldBO.getFieldExtBO().getBuildRuleDSL()); + } + dataBuildRequestFieldBeans.add(dataBuildRequestFieldBO); + } + dataBuildRequestBO.setFieldBOList(dataBuildRequestFieldBeans); + } + + for (DataBuildRequestFieldBO dataBuildRequestFieldBO : dataBuildRequestBO.getFieldBOList()){ + if(StringUtils.isEmpty(dataBuildRequestFieldBO.getDataSourceCode())){ + log.warn("当前属性没有绑定数据源,无法生成对应数据值,fieldName = {}, apiSign = {}, paramModelCode = {}",dataBuildRequestFieldBO.getFieldName(),dataBuildRequestBO.getApiSign(),dataBuildRequestBO.getParamModelCode()); + continue; + } + DataSourceBO dataSourceBO = dataSourceQueryRepository.getByDataSourceCode(dataBuildRequestFieldBO.getDataSourceCode()); + if(dataSourceBO == null){ + log.error("当前属性已绑定数据源,但找不到对应的数据源信息,fieldName = {}, dataSourceCode = {}",dataBuildRequestFieldBO.getFieldName(), dataBuildRequestFieldBO.getDataSourceCode()); + continue; + } + dataBuildRequestFieldBO.setDataSourceType(dataSourceBO.getSourceType()); + dataBuildRequestFieldBO.setDataSourceBO(dataSourceBO); + } + } + + /** + * 根据dsl中的关系重新排列依赖关系 + * @param dataBuildRequestBO + */ + private void buildFieldDslRuleBO(DataBuildRequestBO dataBuildRequestBO){ + List dataBuildRequestFieldBOS = dataBuildRequestBO.getFieldBOList(); + Map dataBuildRequestFieldBOMap = dataBuildRequestFieldBOS.stream().collect(Collectors.toMap(DataBuildRequestFieldBO::getFieldName, o->o)); + + List newFieldBOList = new ArrayList<>(); + + Map relationMap = new HashMap<>(); + + + for (DataBuildRequestFieldBO dataBuildRequestFieldBO : dataBuildRequestFieldBOS){ + GenericTypeBO genericTypeBO = genericService.getGenericTypeWrapper(dataBuildRequestFieldBO.getFieldType()); + dataBuildRequestFieldBO.setGenericTypeBO(genericTypeBO); + boolean isModelClassRefer = genericService.checkModelClass(dataBuildRequestFieldBO); + //普通数据类型,同时dsl为空 + if(StringUtils.isEmpty(dataBuildRequestFieldBO.getBuildRuleDSL()) && !isModelClassRefer){ + newFieldBOList.add(dataBuildRequestFieldBO); + continue; + } + List referList = null; + //普通数据类型,同时dsl为空 + if(StringUtils.isEmpty(dataBuildRequestFieldBO.getBuildRuleDSL()) && isModelClassRefer){ + referList = fieldRuleDslFactory.buildReferFieldBOFromDB(dataBuildRequestFieldBO, dataBuildRequestBO.getProjectCode()); + } + + if(StringUtils.isNotEmpty(dataBuildRequestFieldBO.getBuildRuleDSL()) && isModelClassRefer ){ + referList = fieldRuleDslFactory.buildReferFieldBOFromDsl(dataBuildRequestFieldBO, dataBuildRequestBO.getProjectCode()); + Map fieldBOMap = referList.stream().collect(Collectors.toMap(DataBuildRequestFieldBO::getFieldName, o->o)); + + List originReferList = fieldRuleDslFactory.buildReferFieldBOFromDB(dataBuildRequestFieldBO, dataBuildRequestBO.getProjectCode()); + originReferList.stream().forEach(dataBuildRequestFieldBO1 -> { + DataBuildRequestFieldBO dslBO = fieldBOMap.get(dataBuildRequestFieldBO1.getFieldName()); + if(dslBO != null){ + dataBuildRequestFieldBO1.setDataSourceCode(dslBO.getDataSourceCode()); + dataBuildRequestFieldBO1.setDefaultValueList(dslBO.getDefaultValueList()); + } + }); + referList = originReferList; + } + + if(CollectionUtils.isNotEmpty(referList)){ + dataBuildRequestFieldBO.setReferFieldList(referList); + newFieldBOList.add(dataBuildRequestFieldBO); + } + + DataBuildRequestFieldRuleBO dataBuildRequestFieldRuleBO = fieldRuleDslFactory.buildRuleBO(dataBuildRequestFieldBO.getBuildRuleDSL()); + dataBuildRequestFieldBO.setDataBuildRequestFieldRuleBO(dataBuildRequestFieldRuleBO); + + if(StringUtils.isNotEmpty(dataBuildRequestFieldRuleBO.getRelyField())){ + relationMap.put(dataBuildRequestFieldBO.getFieldName(),dataBuildRequestFieldRuleBO.getRelyField()); + } + } + + //循环引用检测 + for (Map.Entry entry : relationMap.entrySet()){ + String relyField = entry.getValue(); + String relyFieldTmp = relyField; + Set relyFieldSet = new HashSet<>(); + while (!StringUtils.isEmpty(relyFieldTmp)){ + relyFieldSet.add(relyFieldTmp); + relyFieldTmp = relationMap.get(relyFieldTmp); + //循环引用检测 + if(relyFieldSet.contains(relyFieldTmp)){ + log.error("存在属性循环引用,请检查field DSL内容。"); + break; + } + String finalRelyFieldTmp = relyFieldTmp; + Optional optionalDataBuildRequestFieldBO = newFieldBOList.stream() + .filter(dataBuildRequestFieldBO -> dataBuildRequestFieldBO.getFieldName().equals(finalRelyFieldTmp)) + .findAny(); + + if(StringUtils.isNotEmpty(relyFieldTmp) && !optionalDataBuildRequestFieldBO.isPresent()){ + DataBuildRequestFieldBO dataBuildRequestFieldBO = dataBuildRequestFieldBOMap.get(relyField); + newFieldBOList.add(dataBuildRequestFieldBO); + } + } + + Optional optionalDataBuildRequestFieldBO = newFieldBOList.stream() + .filter(dataBuildRequestFieldBO -> dataBuildRequestFieldBO.getFieldName().equals(relyField)) + .findAny(); + + if(!optionalDataBuildRequestFieldBO.isPresent()){ + DataBuildRequestFieldBO dataBuildRequestFieldBO = dataBuildRequestFieldBOMap.get(entry.getKey()); + newFieldBOList.add(dataBuildRequestFieldBO); + } + } + + log.info("dataBuildRequestFieldBOS ======= "+ JSON.toJSONString(dataBuildRequestFieldBOS)); + } + + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/liteflow/ParallelProcessingCmp.java b/app/src/main/java/com/tianhua/datafactory/core/service/liteflow/ParallelProcessingCmp.java new file mode 100644 index 0000000000000000000000000000000000000000..2ab1bc4374919e752f5a9d2df7795de34ea14711 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/liteflow/ParallelProcessingCmp.java @@ -0,0 +1,76 @@ +package com.tianhua.datafactory.core.service.liteflow; + +import com.tianhua.datafactory.core.service.DataProcessExecutor; +import com.tianhua.datafactory.core.service.FieldValueFactory; +import com.tianhua.datafactory.core.service.task.DataGenerateTask; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildResponseBO; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeComponent; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.*; + +/** + * Description + * 并行执行数据构建 + * date: 2022/8/13 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@LiteflowComponent(id = "parallelProcessingCmp", name = "并行执行数据构建任务") +@Slf4j +public class ParallelProcessingCmp extends NodeComponent { + + @Autowired + private FieldValueFactory fieldValueFactory; + + @Autowired + private DataProcessExecutor dataProcessExecutor; + + + @Override + public void process() throws Exception { + + int coreNum = Runtime.getRuntime().availableProcessors(); + log.info("coreNum ============================ "+coreNum); + + + ThreadPoolExecutor threadPool = new ThreadPoolExecutor( + 4 * coreNum, + 8 * coreNum, + 10, + TimeUnit.SECONDS, + new LinkedBlockingQueue<>(20), + Executors.defaultThreadFactory(), + new ThreadPoolExecutor.AbortPolicy() + ); + + threadPool.prestartAllCoreThreads(); + + DataBuildRequestBO dataBuildRequestBO = this.getRequestData(); + ArrayList> batchResultList = new ArrayList<>(dataBuildRequestBO.getBuildCount()); + + int taskCount = dataBuildRequestBO.getBuildCount() / 10000; + int leftSize = dataBuildRequestBO.getBuildCount() % 10000; + for ( int i = 0; i < taskCount; i ++) { + int start = i * 10000; + int end = ( i + 1 ) * 10000; + if(leftSize != 0 && i == taskCount - 1){ + end = end + leftSize; + } + Future>> future = threadPool.submit(new DataGenerateTask(start, end, dataBuildRequestBO.getFieldBOList(),dataProcessExecutor)); + batchResultList.addAll(future.get()); + } + + DataBuildResponseBO dataBuildResponseBO = this.getContextBean(DataBuildResponseBO.class); + dataBuildResponseBO.setDataBuildRequestBO(dataBuildRequestBO); + dataBuildResponseBO.setResultList(batchResultList); + } +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/liteflow/SerialProcessingCmp.java b/app/src/main/java/com/tianhua/datafactory/core/service/liteflow/SerialProcessingCmp.java new file mode 100644 index 0000000000000000000000000000000000000000..d2e8f8727c1322e48bbddbaee146aa97f44440e6 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/liteflow/SerialProcessingCmp.java @@ -0,0 +1,46 @@ +package com.tianhua.datafactory.core.service.liteflow; + +import com.tianhua.datafactory.core.service.DataProcessExecutor; +import com.tianhua.datafactory.domain.bo.datafactory.*; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeComponent; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description + * 串行执行数据构建 + * date: 2022/8/13 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@LiteflowComponent(id = "serialProcessingCmp", name = "串行执行数据构建任务") +@Slf4j +public class SerialProcessingCmp extends NodeComponent { + @Autowired + private DataProcessExecutor dataProcessExecutor; + + @Override + public void process() throws Exception { + DataBuildRequestBO dataBuildRequestBO = this.getRequestData(); + List> batchResultList = new ArrayList<>(dataBuildRequestBO.getBuildCount()); + + for (int i = 0; i < dataBuildRequestBO.getBuildCount(); i ++) { + DataSourceFieldRequestBean dataSourceFieldRequestBean = new DataSourceFieldRequestBean(); + dataSourceFieldRequestBean.setCurrentIndex(i); + //内部处理 + dataProcessExecutor.exeDataGenerateProcess(dataSourceFieldRequestBean, dataBuildRequestBO.getFieldBOList(),batchResultList); + } + + DataBuildResponseBO dataBuildResponseBO = this.getFirstContextBean(); + dataBuildResponseBO.setDataBuildRequestBO(dataBuildRequestBO); + dataBuildResponseBO.setResultList(batchResultList); + } + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/liteflow/SwitchProcessingCmp.java b/app/src/main/java/com/tianhua/datafactory/core/service/liteflow/SwitchProcessingCmp.java new file mode 100644 index 0000000000000000000000000000000000000000..36396d67da0fdf64cf0363c2e1ea984fbe70f12d --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/liteflow/SwitchProcessingCmp.java @@ -0,0 +1,41 @@ +package com.tianhua.datafactory.core.service.liteflow; + +import com.alibaba.fastjson.JSON; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestBO; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeSwitchComponent; +import lombok.extern.slf4j.Slf4j; + +/** + * Description + * 根据创建条数判断是否进行并行或者串行的数据构建 + * date: 2022/8/13 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@LiteflowComponent(id = "switchProcessingCmp", name = "数据构建模式选择器") +@Slf4j +public class SwitchProcessingCmp extends NodeSwitchComponent { + + + @Override + public String processSwitch() throws Exception { + + + DataBuildRequestBO dataBuildRequestBO = this.getRequestData(); + + if(dataBuildRequestBO.getBuildCount() == null){ + log.error("当前数据源没有配置构建数量,默认为1,dataBuildRequestBO = {}", JSON.toJSONString(dataBuildRequestBO)); + dataBuildRequestBO.setBuildCount(1); + return "serialProcessingCmp"; + } + + if(dataBuildRequestBO.getBuildCount() > 10000){ + return "parallelProcessingCmp"; + } + + return "serialProcessingCmp"; + } +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/task/DataGenerateTask.java b/app/src/main/java/com/tianhua/datafactory/core/service/task/DataGenerateTask.java new file mode 100644 index 0000000000000000000000000000000000000000..b50963da38d8fec90e584ffe4fe8d92c1c99b080 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/task/DataGenerateTask.java @@ -0,0 +1,62 @@ +package com.tianhua.datafactory.core.service.task; + +import com.tianhua.datafactory.core.service.DataProcessExecutor; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataSourceFieldRequestBean; + +import java.util.*; +import java.util.concurrent.Callable; + +/** + * Description + * date: 2022/8/12 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class DataGenerateTask implements Callable>> { + private Integer start; + private Integer end; + + private List dataFactoryRequestFieldBeanList; + + private DataProcessExecutor dataProcessExecutor; + + public DataGenerateTask(Integer start, Integer end, List dataFactoryRequestFieldBeanList, DataProcessExecutor dataProcessExecutor){ + this.start = start; + this.end = end; + this.dataFactoryRequestFieldBeanList = dataFactoryRequestFieldBeanList; + this.dataProcessExecutor = dataProcessExecutor; + } + + + + @Override + public List> call() throws Exception { + List> batchList = new ArrayList<>(); + for (int s = this.start * 10000; s < (this.start + 1) * 10000 ; s ++) { + DataSourceFieldRequestBean dataSourceFieldRequestBean = new DataSourceFieldRequestBean(); + dataSourceFieldRequestBean.setCurrentIndex(start); + + dataProcessExecutor.exeDataGenerateProcess(dataSourceFieldRequestBean, dataFactoryRequestFieldBeanList, batchList); + + /*for (DataBuildRequestFieldBO dataBuildRequestFieldBO : dataFactoryRequestFieldBeanList) { + dataSourceFieldRequestBean.setFieldValueMap(fieldValueMap); + dataSourceFieldRequestBean.setDataBuildRequestFieldBO(dataBuildRequestFieldBO); + dataSourceFieldRequestBean.setRandom(random); + dataSourceFieldRequestBean.setVarDependencyMap(dataBuildRequestFieldBO.getVarDependencyMap()); + //获取随机字段值 + Object fieldValue = null; + try { + fieldValue = fieldValueFactory.getFieldValue(dataSourceFieldRequestBean); + } catch (Exception e) { + throw new RuntimeException(e); + } + fieldValueMap.put(dataBuildRequestFieldBO.getFieldName(), fieldValue); + } + batchList.add(fieldValueMap);*/ + } + return batchList; + } +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/typeadapter/BasicTypeAdapter.java b/app/src/main/java/com/tianhua/datafactory/core/service/typeadapter/BasicTypeAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..c048d031ab19f14c7c467dab2b50b181a27f7fe6 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/typeadapter/BasicTypeAdapter.java @@ -0,0 +1,93 @@ +package com.tianhua.datafactory.core.service.typeadapter; + +import com.tianhua.datafactory.core.service.DataTypeAdapter; +import com.tianhua.datafactory.domain.bo.GenericTypeBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import com.tianhua.datafactory.domain.enums.JavaFieldTypeEnum; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * Description + * 处理基本数据的类型适配 + * date: 2022/9/11 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "basicTypeAdapter") +public class BasicTypeAdapter implements DataTypeAdapter { + + @Resource(name = "objectTypeAdapter") + private DataTypeAdapter objectTypeAdapter; + + @Override + public List buildFieldList(GenericTypeBO genericTypeBO) throws Exception { + List fieldBOList = new ArrayList<>(); + DataBuildRequestFieldBO dataBuildRequestFieldBO = new DataBuildRequestFieldBO<>(); + + if(!JavaFieldTypeEnum.isBasicType(genericTypeBO.getRealType())){ + return objectTypeAdapter.buildFieldList(genericTypeBO); + } + + dataBuildRequestFieldBO.setFieldType(genericTypeBO.getRealType()); + + if(genericTypeBO.getApiBO().getReturnParamModel() == null){ + dataBuildRequestFieldBO.setFieldName("result"); + }else { + dataBuildRequestFieldBO.setFieldName(genericTypeBO.getApiBO().getReturnParamModel().getParamVarName()); + dataBuildRequestFieldBO.setDataSourceCode(genericTypeBO.getApiBO().getReturnParamModel().getDataSourceCode()); + dataBuildRequestFieldBO.setBuildRuleDSL(genericTypeBO.getApiBO().getReturnParamModel().getBuildRuleDSL()); + if(StringUtils.isNotEmpty(genericTypeBO.getApiBO().getReturnParamModel().getDefaultValueList())){ + buildDefaultValueList(genericTypeBO, dataBuildRequestFieldBO, genericTypeBO.getApiBO().getReturnParamModel().getDefaultValueList()); + } + } + fieldBOList.add(dataBuildRequestFieldBO); + return fieldBOList; + } + + private void buildDefaultValueList(GenericTypeBO genericTypeBO, DataBuildRequestFieldBO dataBuildRequestFieldBO, String defaultValueList){ + List valueList = new ArrayList(); + + if(StringUtils.isEmpty(defaultValueList)){ + return; + } + + String [] arrayList = defaultValueList.split(","); + if(JavaFieldTypeEnum.isInt(genericTypeBO.getRealType())){ + for (String value : arrayList){ + valueList.add(Integer.parseInt(value)); + } + } + + if(JavaFieldTypeEnum.isLong(genericTypeBO.getRealType())){ + for (String value : arrayList){ + valueList.add(Long.parseLong(value)); + } + } + + if(JavaFieldTypeEnum.isBoolean(genericTypeBO.getRealType())){ + for (String value : arrayList){ + valueList.add(Boolean.parseBoolean(value)); + } + } + + if(JavaFieldTypeEnum.isShort(genericTypeBO.getRealType())){ + for (String value : arrayList){ + valueList.add(Short.parseShort(value)); + } + } + if(JavaFieldTypeEnum.isString(genericTypeBO.getRealType())){ + for (String value : arrayList){ + valueList.add(value); + } + } + dataBuildRequestFieldBO.setDefaultValueList(valueList); + + } +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/service/typeadapter/ObjectTypeAdapter.java b/app/src/main/java/com/tianhua/datafactory/core/service/typeadapter/ObjectTypeAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..c340827879a8f2937486599e1f7e0219993d8d98 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/service/typeadapter/ObjectTypeAdapter.java @@ -0,0 +1,48 @@ +package com.tianhua.datafactory.core.service.typeadapter; + +import com.tianhua.datafactory.core.service.DataTypeAdapter; +import com.tianhua.datafactory.domain.bo.GenericTypeBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import com.tianhua.datafactory.domain.bo.model.FieldBO; +import com.tianhua.datafactory.domain.repository.ModelQueryRepository; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * Description + * date: 2022/9/11 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "objectTypeAdapter") +public class ObjectTypeAdapter implements DataTypeAdapter{ + @Autowired + private ModelQueryRepository modelQueryRepository; + + @Override + public List buildFieldList(GenericTypeBO genericTypeBO) throws Exception { + List fieldModelBOList = modelQueryRepository.getModelField(genericTypeBO.getApiBO().getProjectCode(), genericTypeBO.getRealType()); + if(CollectionUtils.isEmpty(fieldModelBOList)){ + throw new Exception("找不到出参对应的对象模型,检查接口声明或者新增对应接口返回模型信息"); + } + + List fieldBOList = new ArrayList<>(); + for (FieldBO fieldBO : fieldModelBOList){ + DataBuildRequestFieldBO dataBuildRequestFieldBO = new DataBuildRequestFieldBO<>(); + dataBuildRequestFieldBO.setFieldType(fieldBO.getFieldType()); + dataBuildRequestFieldBO.setFieldName(fieldBO.getFieldName()); + dataBuildRequestFieldBO.setDataSourceCode(fieldBO.getFieldExtBO().getDataSourceCode()); + dataBuildRequestFieldBO.setDefaultValueList(fieldBO.getFieldExtBO().getDefaultValueList()); + dataBuildRequestFieldBO.setBuildRuleDSL(fieldBO.getFieldExtBO().getBuildRuleDSL()); + fieldBOList.add(dataBuildRequestFieldBO); + } + return fieldBOList; + } + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/specification/AbstractDataSpec.java b/app/src/main/java/com/tianhua/datafactory/core/specification/AbstractDataSpec.java new file mode 100644 index 0000000000000000000000000000000000000000..480f5d4cef271058d57a6d693c6be6708e8cf9a1 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/specification/AbstractDataSpec.java @@ -0,0 +1,22 @@ +package com.tianhua.datafactory.core.specification; + +/** + * Description + * 数据类型规格 + * + * List + * List + * Map + * + * + * date: 2022/8/21 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class AbstractDataSpec { + + + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/specification/TypeConvertFactory.java b/app/src/main/java/com/tianhua/datafactory/core/specification/TypeConvertFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..14ad6ea5fe73427aa54453466f5e8c37ff5f6bc6 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/specification/TypeConvertFactory.java @@ -0,0 +1,120 @@ +package com.tianhua.datafactory.core.specification; + +import com.tianhua.datafactory.domain.enums.JavaFieldTypeEnum; +import org.apache.commons.lang3.StringUtils; +import org.assertj.core.util.Lists; +import org.assertj.core.util.Sets; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Description + * date: 2022/8/21 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class TypeConvertFactory { + + /** + * 将字符串的数据转换成对应数据类型的数据 + * @param valueList + * @param valueType + * @return + */ + public List convertStringToList(String valueList,String valueType ){ + if(StringUtils.isEmpty(valueList) || StringUtils.isEmpty(valueType)){ + return Lists.newArrayList(); + } + String valueListStr = valueList; + if(valueList.startsWith("{")){ + valueListStr = valueList.replace("{","").replace("}",""); + } + + if(valueList.startsWith("[")){ + valueListStr = valueList.replace("[","").replace("]",""); + } + + List list = new ArrayList<>(); + String [] valueArr = valueListStr.split(","); + for (String str : valueArr){ + if(valueType.equals(JavaFieldTypeEnum.INTEGER.getType())){ + list.add(Integer.parseInt(str)); + } + else if(valueType.equals(JavaFieldTypeEnum.LONG.getType())){ + list.add(Long.parseLong(str)); + } + else if(valueType.equals(JavaFieldTypeEnum.SHORT.getType())){ + list.add(Short.parseShort(str)); + } + else if(valueType.equals(JavaFieldTypeEnum.STRING.getType())){ + list.add(str); + } + + else if(valueType.equals(JavaFieldTypeEnum.DOUBLE.getType())){ + list.add(Double.parseDouble(str)); + } + else if(valueType.equals(JavaFieldTypeEnum.FLOAT.getType())){ + list.add(Float.parseFloat(str)); + } + + } + return list; + } + + + /** + * 将字符串的数据转换成对应数据类型的数据 + * @param valueList + * @param valueType + * @return + */ + public Set convertStringToSet(String valueList, String valueType ){ + if(StringUtils.isEmpty(valueList)){ + return Sets.newHashSet(); + } + + String valueListStr = valueList; + if(valueList.startsWith("{")){ + valueListStr = valueList.replace("{","").replace("}",""); + } + + if(valueList.startsWith("[")){ + valueListStr = valueList.replace("[","").replace("]",""); + } + + Set set = new HashSet(); + String [] valueArr = valueListStr.split(","); + for (String str : valueArr){ + if(valueType.equals(JavaFieldTypeEnum.INTEGER.getType())){ + set.add(Integer.parseInt(str)); + } + if(valueType.equals(JavaFieldTypeEnum.LONG.getType())){ + set.add(Long.parseLong(str)); + } + if(valueType.equals(JavaFieldTypeEnum.SHORT.getType())){ + set.add(Short.parseShort(str)); + } + if(valueType.equals(JavaFieldTypeEnum.STRING.getType())){ + set.add(str); + } + + if(valueType.equals(JavaFieldTypeEnum.DOUBLE.getType())){ + set.add(Double.parseDouble(str)); + } + if(valueType.equals(JavaFieldTypeEnum.FLOAT.getType())){ + set.add(Float.parseFloat(str)); + } + } + return set; + } + + + +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/utils/DateUtils.java b/app/src/main/java/com/tianhua/datafactory/core/utils/DateUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..02dc20462e5d4de47a91fc623e85a49882325def --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/utils/DateUtils.java @@ -0,0 +1,71 @@ +package com.tianhua.datafactory.core.utils; + +import com.alibaba.fastjson.JSON; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Description + * date: 2022/9/10 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class DateUtils { + /** 日期对象转Long类型时间戳 */ + public static Long date2Long(Date date) { + return date.getTime(); + } + + /** 时间戳转Date日期类型 */ + public static Date long2Date(Long timeStamp) { + return new Date(timeStamp); + } + + /** 日期转字符串 */ + public static String date2String(Date date, String pattern) { + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + return sdf.format(date); + } + + /** 字符串转日期 */ + public static Date string2Date(String dateStr, String pattern) { + // String dateStr="2018-3-15 14:26:00"; + // String pattern="yyyy-MM-dd HH:mm:ss"; + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + Date date = null; + try { + date = sdf.parse(dateStr); + } catch (ParseException e) { + e.printStackTrace(); + } + return date; + } + + /** Long时间戳转日期字符串 */ + public static String long2String(Long timeStamp) { + Date date = new Date(timeStamp); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return sdf.format(date); + } + + /** 日期字符串转Long时间戳 */ + public static Long string2Long(String dateStr) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = null; + try { + date = sdf.parse(dateStr); + } catch (ParseException e) { + e.printStackTrace(); + } + return date.getTime(); + } + + public static void main(String[] args) { + Date date = DateUtils.string2Date("2000-01-01","yyyy-MM-dd"); + System.out.println(JSON.toJSONString(date)); + } +} diff --git a/app/src/main/java/com/tianhua/datafactory/core/utils/HttpUtils.java b/app/src/main/java/com/tianhua/datafactory/core/utils/HttpUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..a18f7d160b64992f7bba2fea598079034fc31740 --- /dev/null +++ b/app/src/main/java/com/tianhua/datafactory/core/utils/HttpUtils.java @@ -0,0 +1,236 @@ +package com.tianhua.datafactory.core.utils; + + +import org.apache.commons.io.IOUtils; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.HttpClient; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.ssl.SSLContextBuilder; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.net.ssl.SSLContext; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description + * date: 2022/9/1 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class HttpUtils { + private static PoolingHttpClientConnectionManager connMgr; + private static RequestConfig requestConfig; + private static final int MAX_TIMEOUT = 50000; + + private static final Logger logger = LoggerFactory.getLogger(HttpUtils.class); + + static { + // 设置连接池 + connMgr = new PoolingHttpClientConnectionManager(); + // 设置连接池大小 + connMgr.setMaxTotal(100); + connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal()); + // Validate connections after 1 sec of inactivity + connMgr.setValidateAfterInactivity(5000); + RequestConfig.Builder configBuilder = RequestConfig.custom(); + // 设置连接超时 + configBuilder.setConnectTimeout(MAX_TIMEOUT); + // 设置读取超时 + configBuilder.setSocketTimeout(MAX_TIMEOUT); + // 设置从连接池获取连接实例的超时 + configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT); + + requestConfig = configBuilder.build(); + } + + + /** + * 发送 GET 请求(HTTP),不带输入数据 + * + * @param url + * @return + */ + public static String doGet(String url) { + return doGet(url, new HashMap()); + } + + /** + * 发送 GET 请求(HTTP),K-V形式 + * + * @param url + * @param params + * @return + */ + public static String doGet(String url, Map params) { + + String apiUrl = url; + StringBuffer param = new StringBuffer(); + int i = 0; + for (String key : params.keySet()) { + if (i == 0) + param.append("?"); + else + param.append("&"); + param.append(key).append("=").append(params.get(key)); + i++; + } + apiUrl += param; + String result = null; + HttpClient httpClient = null; + if (apiUrl.startsWith("https")) { + httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()) + .setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build(); + } else { + httpClient = HttpClients.createDefault(); + } + try { + HttpGet httpGet = new HttpGet(apiUrl); + HttpResponse response = httpClient.execute(httpGet); + HttpEntity entity = response.getEntity(); + if (entity != null) { + InputStream instream = entity.getContent(); + result = IOUtils.toString(instream, "UTF-8"); + } + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + /** + * 发送 POST 请求(HTTP),不带输入数据 + * + * @param apiUrl + * @return + */ + public static String doPost(String apiUrl) { + return doPost(apiUrl, new HashMap()); + } + + /** + * 发送 POST 请求,K-V形式 + * + * @param apiUrl + * API接口URL + * @param params + * 参数map + * @return + */ + public static String doPost(String apiUrl, Map params) { + CloseableHttpClient httpClient = null; + if (apiUrl.startsWith("https")) { + httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()) + .setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build(); + } else { + httpClient = HttpClients.createDefault(); + } + String httpStr = null; + HttpPost httpPost = new HttpPost(apiUrl); + CloseableHttpResponse response = null; + + try { + httpPost.setConfig(requestConfig); + List pairList = new ArrayList<>(params.size()); + for (Map.Entry entry : params.entrySet()) { + NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry.getValue()!=null?entry.getValue().toString():""); + pairList.add(pair); + } + httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8"))); + response = httpClient.execute(httpPost); + HttpEntity entity = response.getEntity(); + httpStr = EntityUtils.toString(entity, "UTF-8"); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (response != null) { + try { + EntityUtils.consume(response.getEntity()); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return httpStr; + } + + /** + * 发送 POST 请求,JSON形式,接收端需要支持json形式,否则取不到数据 + * + * @param apiUrl + * @param json + * json对象 + * @return + */ + public static String doPost(String apiUrl, String json) { + CloseableHttpClient httpClient = null; + if (apiUrl.startsWith("https")) { + httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build(); + } else { + httpClient = HttpClients.createDefault(); + } + String httpStr = null; + HttpPost httpPost = new HttpPost(apiUrl); + CloseableHttpResponse response = null; + + try { + httpPost.setConfig(requestConfig); + StringEntity stringEntity = new StringEntity(json, "UTF-8");// 解决中文乱码问题 + stringEntity.setContentEncoding("UTF-8"); + stringEntity.setContentType("application/json"); + httpPost.setEntity(stringEntity); + response = httpClient.execute(httpPost); + HttpEntity entity = response.getEntity(); + httpStr = EntityUtils.toString(entity, "UTF-8"); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (response != null) { + try { + EntityUtils.consume(response.getEntity()); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return httpStr; + } + /** + * 创建SSL安全连接 + * + * @return + */ + private static SSLConnectionSocketFactory createSSLConnSocketFactory() { + SSLConnectionSocketFactory sslsf = null; + try { + SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (chain, authType) -> true).build(); + sslsf = new SSLConnectionSocketFactory(sslContext, (arg0, arg1) -> true); + } catch (GeneralSecurityException e) { + e.printStackTrace(); + } + return sslsf; + } + +} diff --git a/datafactory-core/src/main/resources/erpicture/data_factory.puml b/app/src/main/resources/erpicture/data_factory.puml similarity index 100% rename from datafactory-core/src/main/resources/erpicture/data_factory.puml rename to app/src/main/resources/erpicture/data_factory.puml diff --git a/datafactory-core/src/test/java/org/example/Test.java b/app/src/test/java/org/example/Test.java similarity index 100% rename from datafactory-core/src/test/java/org/example/Test.java rename to app/src/test/java/org/example/Test.java diff --git a/datafactory-core/src/test/java/org/example/Test2.java b/app/src/test/java/org/example/Test2.java similarity index 100% rename from datafactory-core/src/test/java/org/example/Test2.java rename to app/src/test/java/org/example/Test2.java diff --git a/changeList.txt b/changeList.txt index 9af407bb116206bf3fd5b4be43a6a6e674f96f28..121715d643856de97b637fb37015d6b088fd72ea 100644 --- a/changeList.txt +++ b/changeList.txt @@ -7,5 +7,72 @@ 4. 内部核心模块解耦,方便二次开发 5. 生成随机数据的核心功能完成 6. 生成数据的依赖数据源全面打通(自定义数据源,NACOS,内置数据源,spring boot api) + +datasource: + +支持常量配置 +支持枚举配置 +支持导入json +支持excel导入 +本地缓存 + + +DataSourceBO +sourceName:数据源名称 +sourceCode:数据源编码 +providerSerivce:数据源提供服务者 +visitStrategy:数据源访问策略 +url:数据源访问接口(http,rpc) +sourceType:数据源类型 +status:数据源状态 +structType:数据格式(kv,json) + + +DataSourceReqConfigBO:数据源访问配置参数(api,nacos,dubbo,apollo) + paramKey:参数key + paramValue:参数值 + paramDesc:参数描述 + paramGroup:参数分组(子数据源,扩展) + +---不建议嵌套数据源 + +DataSourceRespConfigBO:数据源响应配置参数 + fieldKey:数据属性key + referPath:数据访问路径(可选) + fieldDesc:数据描述 + fieldType:数据类型(boolean,string,int,long,object) + +DataSourceKVBO:数据数据配置---componentKV组件 + fieldKey:数据属性key + fieldValue:数据属性value---varchar + fieldgroup:数据属性组(枚举) + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/datafactory-client/pom.xml b/client/pom.xml similarity index 53% rename from datafactory-client/pom.xml rename to client/pom.xml index aca9d0cd9d41030ffbb701c7c6657b9fbb65176c..85b99ea37236308a68853aacba04cfaa21514fd9 100644 --- a/datafactory-client/pom.xml +++ b/client/pom.xml @@ -4,50 +4,26 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.coderman.tianhua.datafactory - datafactory-client - 1.0.0-SNAPSHOT - datafactory-client - - http://www.example.com - org.springframework.boot - spring-boot-starter-parent - 2.1.8.RELEASE - + com.tianhua.datafactory + datafactory-parent + 2.0.0-SNAPSHOT + + com.tianhua.datafactory + client + 2.0.0-SNAPSHOT + + client + + http://www.example.com + UTF-8 - 1.7 - 1.7 + 1.8 + 1.8 - - - - org.springframework.cloud - spring-cloud-dependencies - Greenwich.SR3 - pom - import - - - org.springframework.boot - spring-boot-dependencies - 2.1.8.RELEASE - pom - import - - - com.alibaba.cloud - spring-cloud-alibaba-dependencies - 2.1.0.RELEASE - pom - import - - - - junit @@ -63,14 +39,15 @@ org.apache.commons commons-lang3 - 3.10 + 3.8.1 - org.apache.commons + commons-io commons-io - 1.3.2 + 2.11.0 + com.belerweb @@ -81,6 +58,19 @@ com.github.ben-manes.caffeine caffeine + + + com.alibaba + easyexcel + 3.1.1 + + + + com.google.guava + guava + + + diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/annotations/DataFileSource.java b/client/src/main/java/com/tianhua/datafactory/client/annotations/DataFileSource.java similarity index 69% rename from datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/annotations/DataFileSource.java rename to client/src/main/java/com/tianhua/datafactory/client/annotations/DataFileSource.java index 7d9eeb0348a8e56c3f6bb8da071970bb728b6c72..00bf07d7ca5d64e731dc54264e0843f918e0a425 100644 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/annotations/DataFileSource.java +++ b/client/src/main/java/com/tianhua/datafactory/client/annotations/DataFileSource.java @@ -1,4 +1,4 @@ -package com.coderman.tianhua.datafactory.client.annotations; +package com.tianhua.datafactory.client.annotations; /** * Description: diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/annotations/DataSourceFunction.java b/client/src/main/java/com/tianhua/datafactory/client/annotations/DataSourceFunction.java similarity index 88% rename from datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/annotations/DataSourceFunction.java rename to client/src/main/java/com/tianhua/datafactory/client/annotations/DataSourceFunction.java index e3a4b39178501a15871eadd0ff1d53a2ade8d42c..6e255890d13c0ee7d10cecc0a3d7669308017743 100644 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/annotations/DataSourceFunction.java +++ b/client/src/main/java/com/tianhua/datafactory/client/annotations/DataSourceFunction.java @@ -1,4 +1,4 @@ -package com.coderman.tianhua.datafactory.client.annotations; +package com.tianhua.datafactory.client.annotations; import java.lang.annotation.*; diff --git a/client/src/main/java/com/tianhua/datafactory/client/cache/KVCacheService.java b/client/src/main/java/com/tianhua/datafactory/client/cache/KVCacheService.java new file mode 100644 index 0000000000000000000000000000000000000000..7d0817f82e825070a35c7056e24bbb802fa96005 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/cache/KVCacheService.java @@ -0,0 +1,61 @@ +package com.tianhua.datafactory.client.cache; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * Description: + * date: 2021/1/15 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class KVCacheService { + + private static SecureRandom random = new SecureRandom(); + /** + * 初始化缓存,key:dataSourceCode数据源编码 + * value:对应的数据源值列表 + */ + private static final Cache> manualCache = Caffeine.newBuilder() + .maximumSize(10_000) + .expireAfterWrite(10*60,TimeUnit.SECONDS) + .build(); + + /** + * 设置缓存数据 + * @param dataSourceCode + * @param dataList + */ + public void putCache(String dataSourceCode,List dataList){ + manualCache.put(dataSourceCode,dataList); + } + + /** + * 获取缓存数据 + * @param dataSourceCode 数据源编码 + * @return + */ + public List getCache(String dataSourceCode){ + return manualCache.getIfPresent(dataSourceCode); + } + + + + /** + * 获取缓存数据 + * @param dataSourceCode 数据源编码 + * @return + */ + public Object getCacheOne(String dataSourceCode){ + List dataList = getCache(dataSourceCode); + return dataList.get(random.nextInt(dataList.size())); + } +} diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/constants/InnerDataSourceCode.java b/client/src/main/java/com/tianhua/datafactory/client/constants/InnerDataSourceCode.java similarity index 58% rename from datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/constants/InnerDataSourceCode.java rename to client/src/main/java/com/tianhua/datafactory/client/constants/InnerDataSourceCode.java index 3e3c63bd06d6c1eb0ac59f2a0cb08ee397ce46c3..9b80aaae1271015be28e332ae88f02f2b406aa01 100644 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/constants/InnerDataSourceCode.java +++ b/client/src/main/java/com/tianhua/datafactory/client/constants/InnerDataSourceCode.java @@ -1,4 +1,4 @@ -package com.coderman.tianhua.datafactory.client.constants; +package com.tianhua.datafactory.client.constants; /** * 内建公共数据源-code @@ -23,8 +23,13 @@ public class InnerDataSourceCode { /** * 日期--内置实现 yyyy-MM-dd */ - public static final String DATE = "com.datafactory.user.date"; + public static final String DATE = "com.datafactory.date.date"; + + /** + * 时间--内置实现 yyyy-MM-dd HH:mm:SS + */ + public static final String DATA_TIME = "com.datafactory.date.datetime"; /** * 姓氏--内置实现 */ @@ -50,6 +55,14 @@ public class InnerDataSourceCode { */ public static final String CHINESE_NAME = "com.datafactory.user.chineseName"; + + /** + * 评论内容--内置实现 + */ + public static final String COMMENT = "com.datafactory.user.comment"; + + + /** * 电话号码--内置实现 */ @@ -74,9 +87,43 @@ public class InnerDataSourceCode { /** - * 获取一个随机数---内置实现 + * 获取一个随机整数---内置实现 */ public static final String RANDOM = "com.datafactory.user.getRandom"; + /** + * 获取一个随机浮点数数---内置实现 + */ + public static final String RANDOM_FLOAT = "com.datafactory.random.float"; + /** + * 获取一个随机浮点数数---内置实现 + */ + public static final String RANDOM_DOUBLE = "com.datafactory.random.double"; + + + + /** + * 一个英文名单词 + */ + public static final String ONE_ENGLISH_WORD = "com.datafactory.user.oneEnWord"; + + + /** + * 时间戳 当前时间戳 + */ + public static final String CURRENT_TIME = "com.datafactory.currenttime"; + + + + /** + * 获取一个雪花算法id---内置实现 + */ + public static final String SNOWFLAKE_ID = "com.datafactory.user.snowflakeid"; + + /** + * 获取一个uuid---内置实现 + */ + public static final String UUID = "com.datafactory.user.uuid"; + } diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/context/DataSourceFunctionContext.java b/client/src/main/java/com/tianhua/datafactory/client/context/DataSourceFunctionContext.java similarity index 94% rename from datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/context/DataSourceFunctionContext.java rename to client/src/main/java/com/tianhua/datafactory/client/context/DataSourceFunctionContext.java index ec1c33abc255036b77346e9ed4f2aecde58c88f2..1c292bcfe9f1519aeeef796c72780be4c262ed94 100644 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/context/DataSourceFunctionContext.java +++ b/client/src/main/java/com/tianhua/datafactory/client/context/DataSourceFunctionContext.java @@ -1,4 +1,4 @@ -package com.coderman.tianhua.datafactory.core.context; +package com.tianhua.datafactory.client.context; import org.springframework.stereotype.Component; diff --git a/client/src/main/java/com/tianhua/datafactory/client/context/FieldIndex.java b/client/src/main/java/com/tianhua/datafactory/client/context/FieldIndex.java new file mode 100644 index 0000000000000000000000000000000000000000..f26eab8fad88d2cd96d8a0c50ff364e51c6391c0 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/context/FieldIndex.java @@ -0,0 +1,92 @@ +package com.tianhua.datafactory.client.context; + +import java.util.Locale; + +/** + * Description + * date: 2022/9/2 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ + +public class FieldIndex { + /** + * 属性对应的列的索引编号 + */ + private Integer index; + + /** + * 属性名称 + */ + private String fieldName; + + /** + * 属性类型 + */ + private String fieldType; + + public FieldIndex(){} + public FieldIndex(Integer index,String fieldName, String fieldType){ + this.index= index; + this.fieldName = fieldName; + this.fieldType = fieldType; + } + + + + public Integer getIndex() { + return index; + } + + public void setIndex(Integer index) { + this.index = index; + } + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public String getFieldType() { + return fieldType; + } + + public void setFieldType(String fieldType) { + this.fieldType = fieldType; + } + + public boolean isLong(){ + return this.fieldType.toLowerCase(Locale.ROOT).equals("long"); + } + + public boolean isInteger(){ + return this.fieldType.toLowerCase(Locale.ROOT).equals("integer") || this.fieldType.toLowerCase(Locale.ROOT).equals("int") ; + } + + public boolean isShort(){ + return this.fieldType.toLowerCase(Locale.ROOT).equals("short") || this.fieldType.toLowerCase(Locale.ROOT).equals("short") ; + } + + public boolean isString(){ + return this.fieldType.toLowerCase(Locale.ROOT).equals("string"); + } + + + public boolean isDouble(){ + return this.fieldType.toLowerCase(Locale.ROOT).equals("double"); + } + + + public boolean isDate(){ + return this.fieldType.toLowerCase(Locale.ROOT).equals("date"); + } + + public boolean isDateTime(){ + return this.fieldType.toLowerCase(Locale.ROOT).equals("datetime"); + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/context/FileDataSourceContext.java b/client/src/main/java/com/tianhua/datafactory/client/context/FileDataSourceContext.java new file mode 100644 index 0000000000000000000000000000000000000000..707f6967017e615528b6b3a9d97817f64468ffe4 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/context/FileDataSourceContext.java @@ -0,0 +1,164 @@ +package com.tianhua.datafactory.client.context; + +import java.util.List; + +/** + * Description + * date: 2022/9/2 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class FileDataSourceContext { + + /** + * 方便本地化数据源管理 + * 用用户名作为标识来区分 + */ + private String userName; + + /** + * 数据源编码 + * 全局唯一 + */ + private String dataSourceCode; + + /** + * 数据源名称 + */ + private String dataSourceName; + + + /** + * 文件地址 + */ + private String fileUrl; + + /** + * 文件解析格式 + * 空格,逗号,分号,竖杠 + */ + private String splitTag; + + /** + * txt,json,excel + */ + private String fileType; + + + /** + * 一次加载读取的数量 + * 例如1000w数据,随机取10w数据作为数据内容用来随机生成 + */ + private Integer readCount; + + /** + * 总数量 + */ + private Integer totalCount; + + /** + * 加载的数量 + */ + private Integer loadCount; + + /** + * 要忽略多少条 + */ + private Integer skipCount; + + /** + * 属性模型 + */ + private List fieldIndexBOList; + + + public String getFileUrl() { + return fileUrl; + } + + public void setFileUrl(String fileUrl) { + this.fileUrl = fileUrl; + } + + public String getSplitTag() { + return splitTag; + } + + public void setSplitTag(String splitTag) { + this.splitTag = splitTag; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public List getFieldIndexBOList() { + return fieldIndexBOList; + } + + public void setFieldIndexBOList(List fieldIndexBOList) { + this.fieldIndexBOList = fieldIndexBOList; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getDataSourceCode() { + return dataSourceCode; + } + + public void setDataSourceCode(String dataSourceCode) { + this.dataSourceCode = dataSourceCode; + } + + public String getDataSourceName() { + return dataSourceName; + } + + public void setDataSourceName(String dataSourceName) { + this.dataSourceName = dataSourceName; + } + + public Integer getReadCount() { + return readCount; + } + + public void setReadCount(Integer readCount) { + this.readCount = readCount; + } + + public Integer getTotalCount() { + return totalCount; + } + + public void setTotalCount(Integer totalCount) { + this.totalCount = totalCount; + } + + public Integer getLoadCount() { + return loadCount; + } + + public void setLoadCount(Integer loadCount) { + this.loadCount = loadCount; + } + + public Integer getSkipCount() { + return skipCount; + } + + public void setSkipCount(Integer skipCount) { + this.skipCount = skipCount; + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/context/ReturnWrapClassContext.java b/client/src/main/java/com/tianhua/datafactory/client/context/ReturnWrapClassContext.java new file mode 100644 index 0000000000000000000000000000000000000000..1e17b1f0eff7875054281792863289a8a9a52dd4 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/context/ReturnWrapClassContext.java @@ -0,0 +1,99 @@ +package com.tianhua.datafactory.client.context; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description + * date: 2022/9/4 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ + +public class ReturnWrapClassContext { + + + + /** + * 返回包装类型 + */ + private String returnWrapClass; + + /** + * 包装类中的属性模型 + */ + private Map classFieldMap = new HashMap<>(); + + /** + * 承载数据的属性名 + */ + private String dataField; + + + /** + * 包装类中的部分属性的默认值 + */ + private Map> fieldDefaultValueMap = new HashMap<>(); + + + public ReturnWrapClassContext(String returnWrapClass, String dataField){ + this.returnWrapClass = returnWrapClass; + this.dataField = dataField; + } + + + public String getReturnWrapClass() { + return returnWrapClass; + } + + public void setReturnWrapClass(String returnWrapClass) { + this.returnWrapClass = returnWrapClass; + } + + public Map getClassFieldMap() { + return classFieldMap; + } + + public void setClassFieldMap(Map classFieldMap) { + this.classFieldMap = classFieldMap; + } + + public String getDataField() { + return dataField; + } + + public void setDataField(String dataField) { + this.dataField = dataField; + } + + public Map> getFieldDefaultValueMap() { + return fieldDefaultValueMap; + } + + public void setFieldDefaultValueMap(Map> fieldDefaultValueMap) { + this.fieldDefaultValueMap = fieldDefaultValueMap; + } + + /** + * 增加属性 + * @param fieldName + * @param fieldType + */ + public void addField(String fieldName, String fieldType){ + classFieldMap.put(fieldName, fieldType); + } + + + /** + * 增加属性默认值列表 + * @param fieldName + * @param defaultValueList + */ + public void addFieldDefaultValueList(String fieldName, List defaultValueList){ + fieldDefaultValueMap.put(fieldName, defaultValueList); + } + +} diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/enums/FileDataEnums.java b/client/src/main/java/com/tianhua/datafactory/client/enums/FileDataEnums.java similarity index 81% rename from datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/enums/FileDataEnums.java rename to client/src/main/java/com/tianhua/datafactory/client/enums/FileDataEnums.java index 984522d6a43384a10dafa3173561c4c60db3ff7f..bd24c6a657ae40dc9c562fc6be8194e7f96c30a9 100644 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/enums/FileDataEnums.java +++ b/client/src/main/java/com/tianhua/datafactory/client/enums/FileDataEnums.java @@ -1,9 +1,8 @@ -package com.coderman.tianhua.datafactory.client.enums; - -import java.io.File; +package com.tianhua.datafactory.client.enums; /** * Description: + * 内置注册的文件数据源 * date: 2021/1/14 * * @author fanchunshuai @@ -20,6 +19,16 @@ public enum FileDataEnums { */ LAST_NAME("lastname.txt","中国名称","parseLastNameServiceImpl"), + + /** + * + */ + COMMENT("comment.txt","评论","parseCommentServiceImpl"), + + /** + * + */ + EN_WORD("enword.txt","英文名单词","parseEnWordServiceImpl"), ; FileDataEnums(String fileName,String desc,String parseBeanName){ diff --git a/client/src/main/java/com/tianhua/datafactory/client/enums/FileTypeEnum.java b/client/src/main/java/com/tianhua/datafactory/client/enums/FileTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..02ff4d8a9bd09a590f6d73a914639adca353cf21 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/enums/FileTypeEnum.java @@ -0,0 +1,25 @@ +package com.tianhua.datafactory.client.enums; + +/** + * Description + * date: 2022/9/4 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public enum FileTypeEnum { + TXT("txt"), + JSON("json"), + EXCEL("excel"), + + ; + String type; + FileTypeEnum(String fileType){ + this.type = fileType; + } + + public String getType() { + return type; + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/factory/ReturnWrapClassFactory.java b/client/src/main/java/com/tianhua/datafactory/client/factory/ReturnWrapClassFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..cf3eefa9f20bd93c225aefaee06b09764e2240ac --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/factory/ReturnWrapClassFactory.java @@ -0,0 +1,69 @@ +package com.tianhua.datafactory.client.factory; + +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +/** + * Description + * 接口返回值包装工厂配置类 + * 可能需要根据不同公司进行二次改造 + * date: 2022/9/4 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class ReturnWrapClassFactory { + + /** + * 构建成功的返回包装类 + * @return + */ + public Map buildSuccessResultDTO(Object data){ + Map resultDataMap = new HashMap<>(); + resultDataMap.put("code", "200"); + resultDataMap.put("msg", "成功"); + resultDataMap.put("data", data); + + return resultDataMap; + } + + /** + * 构建失败的返回包装类 + * @return + */ + public Map buildFairResultDTO(){ + Map resultDataMap = new HashMap<>(); + resultDataMap.put("code", "500"); + resultDataMap.put("msg", "失败"); + resultDataMap.put("data", null); + return resultDataMap; + } + + /** + * 构建通用resultdto返回对象包装上下文 + * @return + */ + public Map buildSuccessResultPage(Object data){ + Map pageResultMap = new HashMap<>(); + Random random = new Random(); + pageResultMap.put("currentPageNum",random.nextInt(10)+1); + pageResultMap.put("nextPageNum",Integer.valueOf(pageResultMap.get("currentPageNum").toString()) + 1); + pageResultMap.put("prePageNum",Integer.valueOf(pageResultMap.get("currentPageNum").toString()) - 1); + pageResultMap.put("pageSize", 10); + pageResultMap.put("startRow", Integer.valueOf(pageResultMap.get("currentPageNum").toString()) * Integer.valueOf(pageResultMap.get("pageSize").toString())); + pageResultMap.put("endRow", Integer.valueOf(pageResultMap.get("startRow").toString()) + Integer.valueOf(pageResultMap.get("pageSize").toString()) ); + + pageResultMap.put("totalRows", Integer.valueOf(pageResultMap.get("currentPageNum").toString())*(10+2)); + pageResultMap.put("totalPages", Integer.valueOf(pageResultMap.get("currentPageNum").toString()) + 2); + pageResultMap.put("Items", data); + + return buildSuccessResultDTO(pageResultMap); + } + + +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/filedata/AbstractParseService.java b/client/src/main/java/com/tianhua/datafactory/client/filedata/AbstractParseService.java new file mode 100644 index 0000000000000000000000000000000000000000..bed93e3cd6d0df4e5b1f2bec40bd48780290e428 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/filedata/AbstractParseService.java @@ -0,0 +1,153 @@ +package com.tianhua.datafactory.client.filedata; + +import com.tianhua.datafactory.client.context.FieldIndex; + +import java.security.SecureRandom; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * Description + * date: 2022/9/4 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class AbstractParseService { + + private static SecureRandom secureRandom = new SecureRandom(); + + private static SimpleDateFormat formatWithLine = new SimpleDateFormat("yyyy-MM-dd"); + + private static SimpleDateFormat formatWithSplit = new SimpleDateFormat("yyyy/MM/dd"); + + private static SimpleDateFormat formatDataTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + + + + /** + * 从一个集合中随机获取一部分子集 + * 尽量高效 + * + * @param contentList 集合元素 + * @param count 取出子集的数量 + * @return + */ + public List getRandomList(List contentList, Integer count ){ + if(count > contentList.size()){ + return contentList; + } + + List resultList = new ArrayList<>(); + + Set integerSet = new HashSet<>(); + + Set totalSet = new HashSet<>(); + + for (int i = 0 ;i < contentList.size();i++) { + totalSet.add(i); + } + + + while (resultList.size() < count){ + Integer index = secureRandom.nextInt(contentList.size()); + + double currentRate = (double) resultList.size() / (double) count; + + if(currentRate > 0.75f){ + totalSet.removeAll(integerSet); + totalSet.stream().forEach(integer -> { + if(resultList.size() < count){ + resultList.add(contentList.get(integer)); + } + }); + break; + } + + while (integerSet.contains(index) && index >= 0){ + index --; + } + if(index >= 0 ){ + resultList.add(contentList.get(index)); + integerSet.add(index); + continue; + } + + + while (integerSet.contains(index) && index < contentList.size()){ + index ++; + } + if(index < contentList.size() && index >= 0 ){ + resultList.add(contentList.get(index)); + integerSet.add(index); + } + } + + return resultList; + } + + + /** + * 收集单个元素 + * @param fieldIndex + * @param value + * @param rowMap + */ + public void buildRowMap(FieldIndex fieldIndex, String value, Map rowMap) throws ParseException { + + if(fieldIndex.isLong()){ + rowMap.put(fieldIndex.getFieldName(), Long.valueOf(value)); + } + else if(fieldIndex.isInteger()){ + rowMap.put(fieldIndex.getFieldName(), Integer.valueOf(value)); + } + + else if(fieldIndex.isShort()){ + rowMap.put(fieldIndex.getFieldName(), Short.valueOf(value)); + } + + else if(fieldIndex.isString()){ + rowMap.put(fieldIndex.getFieldName(), value); + } + + else if(fieldIndex.isDate()){ + Date date = new Date(); + if(value.contains("-")){ + date = formatWithLine.parse(value); + } + if(value.contains("/")){ + date = formatWithSplit.parse(value); + } + rowMap.put(fieldIndex.getFieldName(), date); + } + else if(fieldIndex.isDateTime()){ + rowMap.put(fieldIndex.getFieldName(), formatDataTime.parse(value)); + } + } + + + + + public static void main(String[] args) { + AbstractParseService abstractParseService = new AbstractParseService(); + + + + List list = new ArrayList<>(); + int length = 1000000; + for (int i = 0;i < length;i ++){ + list.add(i+""); + } + + long startTime = System.currentTimeMillis(); + List resultList = abstractParseService.getRandomList(list,100000); + long endTime = System.currentTimeMillis(); + + Set set = new HashSet<>(resultList); + System.out.println("set.size = "+set.size()+",listsize = "+resultList.size()+",endTime - startTime = "+(endTime - startTime)+"ms"); + + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/filedata/CommonParseService.java b/client/src/main/java/com/tianhua/datafactory/client/filedata/CommonParseService.java new file mode 100644 index 0000000000000000000000000000000000000000..b7940f9f31c1ffe165a0dd17a6bd06f032b35e37 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/filedata/CommonParseService.java @@ -0,0 +1,26 @@ +package com.tianhua.datafactory.client.filedata; + +import com.tianhua.datafactory.client.context.FileDataSourceContext; + +import java.io.IOException; +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + * Description + * date: 2022/9/2 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public interface CommonParseService { + /** + * 从文件中解析数据源 + * @param fileDataSourceContext + * @return + * @throws IOException + */ + List> parseData(FileDataSourceContext fileDataSourceContext) throws IOException, ParseException; +} diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/filedata/FileReadService.java b/client/src/main/java/com/tianhua/datafactory/client/filedata/FileReadService.java similarity index 92% rename from datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/filedata/FileReadService.java rename to client/src/main/java/com/tianhua/datafactory/client/filedata/FileReadService.java index 8d1dc7a763bc6251aa2fb9bd767797c7e03295cd..63cd488c0406305437b38917bcb330b5d99f6923 100644 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/filedata/FileReadService.java +++ b/client/src/main/java/com/tianhua/datafactory/client/filedata/FileReadService.java @@ -1,4 +1,4 @@ -package com.coderman.tianhua.datafactory.client.filedata; +package com.tianhua.datafactory.client.filedata; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; @@ -53,9 +53,6 @@ public class FileReadService { // ClassPathResource类的构造方法接收路径名称,自动去classpath路径下找文件 String path = FACTORY_PATH+"/"+fileName; ClassPathResource classPathResource = new ClassPathResource(path); - - // 获得File对象,当然也可以获取输入流对象 - File file = null; try { return classPathResource.getFile(); } catch (IOException e) { diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/filedata/ParseService.java b/client/src/main/java/com/tianhua/datafactory/client/filedata/InnerParseService.java similarity index 64% rename from datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/filedata/ParseService.java rename to client/src/main/java/com/tianhua/datafactory/client/filedata/InnerParseService.java index 0f900a6069c46a74ec33e54629afd22904d36963..76c8d244947389dd1e21d1fc82bab437b211a4ed 100644 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/filedata/ParseService.java +++ b/client/src/main/java/com/tianhua/datafactory/client/filedata/InnerParseService.java @@ -1,4 +1,4 @@ -package com.coderman.tianhua.datafactory.client.filedata; +package com.tianhua.datafactory.client.filedata; import java.util.List; @@ -10,11 +10,12 @@ import java.util.List; * @version 1.0.0 * @since JDK 1.8 */ -public interface ParseService { +public interface InnerParseService { /** * 通过文件名解析文件内容并返回文件数据 * @return */ - List parseFileData(); + List parseFileData(); + } diff --git a/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/common/ExcelParseServiceImpl.java b/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/common/ExcelParseServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..d8c32356e50c5380fe2abf784d78a70eb95890f2 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/common/ExcelParseServiceImpl.java @@ -0,0 +1,55 @@ +package com.tianhua.datafactory.client.filedata.impl.common; + +import com.alibaba.excel.EasyExcel; +import com.tianhua.datafactory.client.context.FieldIndex; +import com.tianhua.datafactory.client.context.FileDataSourceContext; +import com.tianhua.datafactory.client.filedata.AbstractParseService; +import com.tianhua.datafactory.client.filedata.CommonParseService; +import com.tianhua.datafactory.client.filedata.listener.NoModelDataListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description + * date: 2022/9/4 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "excelParseServiceImpl") +public class ExcelParseServiceImpl extends AbstractParseService implements CommonParseService { + private Logger logger = LoggerFactory.getLogger(ExcelParseServiceImpl.class); + + @Override + public List> parseData(FileDataSourceContext fileDataSourceContext) throws ParseException { + File file = new File(fileDataSourceContext.getFileUrl()); + if(!file.exists()){ + logger.error("文件不存在."); + return null; + } + List> list = new ArrayList<>(); + NoModelDataListener modelDataListener = new NoModelDataListener(fileDataSourceContext.getSkipCount()); + EasyExcel.read(file.getAbsolutePath(), modelDataListener).sheet().doRead(); + List> mapList = modelDataListener.getDataList(); + + + for (Map map : mapList){ + Map rowMap = new HashMap<>(); + for (FieldIndex fieldIndex : fileDataSourceContext.getFieldIndexBOList()){ + buildRowMap(fieldIndex, map.get(fieldIndex.getIndex()), rowMap); + } + list.add(rowMap); + } + return list; + } + +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/common/JSONParseServiceImpl.java b/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/common/JSONParseServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..b49bafa384ecf98460157aaeadaa2634b1c5d6e2 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/common/JSONParseServiceImpl.java @@ -0,0 +1,88 @@ +package com.tianhua.datafactory.client.filedata.impl.common; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.tianhua.datafactory.client.context.FieldIndex; +import com.tianhua.datafactory.client.context.FileDataSourceContext; +import com.tianhua.datafactory.client.filedata.CommonParseService; +import com.tianhua.datafactory.client.filedata.AbstractParseService; +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.IOException; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description + * date: 2022/9/2 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "jSONParseServiceImpl") +public class JSONParseServiceImpl extends AbstractParseService implements CommonParseService { + + private Logger logger = LoggerFactory.getLogger(JSONParseServiceImpl.class); + + @Override + public List> parseData(FileDataSourceContext fileDataSourceContext) throws IOException, ParseException { + File file = new File(fileDataSourceContext.getFileUrl()); + if(!file.exists()){ + logger.error("文件不存在."); + return null; + } + + long size = FileUtils.sizeOf(file); + //如果是大文件可能需要特殊的处理逻辑来访问数据 + FileUtils.byteCountToDisplaySize(size); + List> list = new ArrayList<>(); + + List contentList = FileUtils.readLines(file,"utf-8"); + if(fileDataSourceContext.getSkipCount() > 0){ + contentList = contentList.subList(fileDataSourceContext.getSkipCount(),contentList.size()); + } + //获取随机子集合 + List currentList = getRandomList(contentList, fileDataSourceContext.getLoadCount()); + + buildResultList(currentList, fileDataSourceContext, list); + + return list; + } + + /** + * 解析数据文件内容, + * @param contentList + * @param fileDataSourceContext + * @param list + */ + private void buildResultList(List contentList, FileDataSourceContext fileDataSourceContext, List> list) throws ParseException { + int errorCount = 0; + for (String str : contentList){ + JSONObject jsonObject = JSON.parseObject(str); + if(jsonObject == null){ + errorCount++; + continue; + } + Map rowMap = new HashMap<>(); + for (FieldIndex fieldIndex : fileDataSourceContext.getFieldIndexBOList()){ + buildRowMap(fieldIndex, jsonObject.getString(fieldIndex.getFieldName()), rowMap); + } + list.add(rowMap); + } + if(errorCount > 0){ + logger.error("解析错误次数:{}",errorCount); + } + } + + + + +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/common/TxtParseServiceImpl.java b/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/common/TxtParseServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..05a49f012c09025bd2f4d66ed777ec1df49a3b04 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/common/TxtParseServiceImpl.java @@ -0,0 +1,88 @@ +package com.tianhua.datafactory.client.filedata.impl.common; + +import com.tianhua.datafactory.client.context.FieldIndex; +import com.tianhua.datafactory.client.context.FileDataSourceContext; +import com.tianhua.datafactory.client.filedata.CommonParseService; +import com.tianhua.datafactory.client.filedata.AbstractParseService; +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.IOException; +import java.text.ParseException; +import java.util.*; +import java.util.stream.Collectors; + +/** + * Description + * date: 2022/9/2 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "txtParseServiceImpl") +public class TxtParseServiceImpl extends AbstractParseService implements CommonParseService { + + private Logger logger = LoggerFactory.getLogger(TxtParseServiceImpl.class); + + @Override + public List> parseData(FileDataSourceContext fileDataSourceContext) throws IOException, ParseException { + File file = new File(fileDataSourceContext.getFileUrl()); + if(!file.exists()){ + logger.error("文件不存在."); + return null; + } + + long size = FileUtils.sizeOf(file); + //如果是大文件可能需要特殊的处理逻辑来访问数据 + FileUtils.byteCountToDisplaySize(size); + List> list = new ArrayList<>(); + + List contentList = FileUtils.readLines(file,"utf-8"); + if(fileDataSourceContext.getSkipCount() > 0){ + contentList = contentList.subList(fileDataSourceContext.getSkipCount(),contentList.size()); + } + //获取随机子集合 + List currentList = getRandomList(contentList, fileDataSourceContext.getLoadCount()); + + buildResultList(currentList, fileDataSourceContext, list); + return list; + } + + + /** + * 解析数据文件内容, + * @param contentList + * @param fileDataSourceContext + * @param list + */ + private void buildResultList(List contentList, FileDataSourceContext fileDataSourceContext, List> list) throws ParseException { + int errorCount = 0; + Map fieldIndexMap = fileDataSourceContext.getFieldIndexBOList().stream().collect(Collectors.toMap(FieldIndex::getIndex,o->o)); + + for (String str : contentList){ + + String [] array = str.split(fileDataSourceContext.getSplitTag()); + if(array == null || array.length == 0){ + errorCount++; + continue; + } + Map rowMap = new HashMap<>(); + for (int i = 0;i < array.length;i ++){ + FieldIndex fieldIndex = fieldIndexMap.get(i); + if(fieldIndex == null){ + continue; + } + buildRowMap(fieldIndex,array[i],rowMap); + } + list.add(rowMap); + } + if(errorCount > 0){ + logger.error("解析错误次数:{}",errorCount); + } + } + +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/inner/ParseCommentServiceImpl.java b/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/inner/ParseCommentServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..e8323dc5e3e0ba78621029d16542ed5b2876b2ac --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/inner/ParseCommentServiceImpl.java @@ -0,0 +1,60 @@ +package com.tianhua.datafactory.client.filedata.impl.inner; + +import com.tianhua.datafactory.client.cache.KVCacheService; +import com.tianhua.datafactory.client.enums.FileDataEnums; +import com.tianhua.datafactory.client.filedata.FileReadService; +import com.tianhua.datafactory.client.filedata.InnerParseService; +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * Description + * date: 2022/9/12 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "parseCommentServiceImpl") +public class ParseCommentServiceImpl implements InnerParseService { + private static Logger logger = LoggerFactory.getLogger(ParseCommentServiceImpl.class); + + @Autowired + private KVCacheService cacheService; + + @Autowired + private FileReadService fileReadService; + + + @Override + public List parseFileData() { + List list = new ArrayList<>(); + + File dataFile = fileReadService.getDataFile(FileDataEnums.COMMENT.getFileName()); + if (dataFile == null) { + logger.error("查不到对应的内置文件数据源:fileName = {}",FileDataEnums.COMMENT.getFileName()); + return null; + } + try { + List fileDataList = FileUtils.readLines(dataFile, "UTF-8"); + for (String str : fileDataList){ + String[] group = str.split(","); + for (String gStr : group) { + list.add(gStr); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + return list; + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/inner/ParseEnWordServiceImpl.java b/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/inner/ParseEnWordServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..2cb0a96b02a8aacaeb9b857627423a935a26e6fc --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/inner/ParseEnWordServiceImpl.java @@ -0,0 +1,61 @@ +package com.tianhua.datafactory.client.filedata.impl.inner; + +import com.tianhua.datafactory.client.cache.KVCacheService; +import com.tianhua.datafactory.client.enums.FileDataEnums; +import com.tianhua.datafactory.client.filedata.FileReadService; +import com.tianhua.datafactory.client.filedata.InnerParseService; +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * Description + * date: 2022/9/12 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "parseEnWordServiceImpl") +public class ParseEnWordServiceImpl implements InnerParseService { + + private static Logger logger = LoggerFactory.getLogger(ParseEnWordServiceImpl.class); + + @Autowired + private KVCacheService cacheService; + + @Autowired + private FileReadService fileReadService; + + @Override + public List parseFileData() { + List list = new ArrayList<>(); + + File dataFile = fileReadService.getDataFile(FileDataEnums.EN_WORD.getFileName()); + if (dataFile == null) { + logger.error("查不到对应的内置文件数据源:fileName = {}",FileDataEnums.EN_WORD.getFileName()); + return null; + } + + try { + List fileDataList = FileUtils.readLines(dataFile, "UTF-8"); + for (String str : fileDataList){ + String[] group = str.split(","); + for (String gStr : group) { + list.add(gStr); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + return list; + } +} diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/filedata/impl/ParseFirstNameServiceImpl.java b/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/inner/ParseFirstNameServiceImpl.java similarity index 51% rename from datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/filedata/impl/ParseFirstNameServiceImpl.java rename to client/src/main/java/com/tianhua/datafactory/client/filedata/impl/inner/ParseFirstNameServiceImpl.java index bcf81992e03a70b66716bb54bfae3ab37b920c4b..c0583674f78798a47457ce83f3e573fa609679cf 100644 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/filedata/impl/ParseFirstNameServiceImpl.java +++ b/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/inner/ParseFirstNameServiceImpl.java @@ -1,24 +1,21 @@ -package com.coderman.tianhua.datafactory.client.filedata.impl; +package com.tianhua.datafactory.client.filedata.impl.inner; -import com.coderman.tianhua.datafactory.client.cache.CacheService; -import com.coderman.tianhua.datafactory.client.enums.FileDataEnums; -import com.coderman.tianhua.datafactory.client.filedata.FileReadService; -import com.coderman.tianhua.datafactory.client.filedata.ParseService; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; +import com.tianhua.datafactory.client.cache.KVCacheService; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.enums.FileDataEnums; +import com.tianhua.datafactory.client.filedata.FileReadService; +import com.tianhua.datafactory.client.filedata.InnerParseService; import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; -import java.io.BufferedReader; import java.io.File; -import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.TimeUnit; /** * Description: @@ -29,23 +26,26 @@ import java.util.concurrent.TimeUnit; * @since JDK 1.8 */ @Service(value = "parseFirstNameServiceImpl") -public class ParseFirstNameServiceImpl implements ParseService { +public class ParseFirstNameServiceImpl implements InnerParseService { + private static Logger logger = LoggerFactory.getLogger(ParseFirstNameServiceImpl.class); @Autowired - private CacheService cacheService; + private KVCacheService cacheService; @Autowired private FileReadService fileReadService; @Override - public List parseFileData() { - String fileName = FileDataEnums.FIRST_NAME.getFileName(); - List list = cacheService.getCache(fileName); + public List parseFileData() { + String dataSourceCode = InnerDataSourceCode.FIRST_NAME; + + List list = cacheService.getCache(dataSourceCode); if (CollectionUtils.isEmpty(list)) { list = new ArrayList<>(); - File dataFile = fileReadService.getDataFile(fileName); + File dataFile = fileReadService.getDataFile(FileDataEnums.FIRST_NAME.getFileName()); if (dataFile == null) { + logger.error("查不到对应的内置文件数据源:fileName = {}",FileDataEnums.FIRST_NAME.getFileName()); return null; } try { @@ -56,7 +56,7 @@ public class ParseFirstNameServiceImpl implements ParseService { list.add(gStr); } } - cacheService.putCache(fileName, list); + cacheService.putCache(dataSourceCode, list); } catch (IOException e) { e.printStackTrace(); } diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/filedata/impl/ParseLastNameServiceImpl.java b/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/inner/ParseLastNameServiceImpl.java similarity index 54% rename from datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/filedata/impl/ParseLastNameServiceImpl.java rename to client/src/main/java/com/tianhua/datafactory/client/filedata/impl/inner/ParseLastNameServiceImpl.java index d3a51bc2e71437223029ebacc9b0a05fe9d87a63..34b3bc8268e2215d518565b060df16cfa00ba3bc 100644 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/filedata/impl/ParseLastNameServiceImpl.java +++ b/client/src/main/java/com/tianhua/datafactory/client/filedata/impl/inner/ParseLastNameServiceImpl.java @@ -1,24 +1,19 @@ -package com.coderman.tianhua.datafactory.client.filedata.impl; +package com.tianhua.datafactory.client.filedata.impl.inner; -import com.coderman.tianhua.datafactory.client.cache.CacheService; -import com.coderman.tianhua.datafactory.client.enums.FileDataEnums; -import com.coderman.tianhua.datafactory.client.filedata.FileReadService; -import com.coderman.tianhua.datafactory.client.filedata.ParseService; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; +import com.tianhua.datafactory.client.cache.KVCacheService; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.enums.FileDataEnums; +import com.tianhua.datafactory.client.filedata.FileReadService; +import com.tianhua.datafactory.client.filedata.InnerParseService; import org.apache.commons.io.FileUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; -import java.io.BufferedReader; import java.io.File; -import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.TimeUnit; /** * Description: @@ -29,21 +24,21 @@ import java.util.concurrent.TimeUnit; * @since JDK 1.8 */ @Service(value = "parseLastNameServiceImpl") -public class ParseLastNameServiceImpl implements ParseService { +public class ParseLastNameServiceImpl implements InnerParseService { @Autowired - private CacheService cacheService; + private KVCacheService cacheService; @Autowired private FileReadService fileReadService; @Override - public List parseFileData() { - String fileName = FileDataEnums.LAST_NAME.getFileName(); - List list = cacheService.getCache(fileName); + public List parseFileData() { + String dataSourceCode = InnerDataSourceCode.LAST_NAME; + List list = cacheService.getCache(dataSourceCode); if (CollectionUtils.isEmpty(list)) { list = new ArrayList<>(); - File dataFile = fileReadService.getDataFile(fileName); + File dataFile = fileReadService.getDataFile(FileDataEnums.LAST_NAME.getFileName()); if (dataFile == null) { return null; } @@ -55,7 +50,7 @@ public class ParseLastNameServiceImpl implements ParseService { list.add(gStr); } } - cacheService.putCache(fileName, list); + cacheService.putCache(dataSourceCode, list); } catch (IOException e) { e.printStackTrace(); } diff --git a/client/src/main/java/com/tianhua/datafactory/client/filedata/listener/NoModelDataListener.java b/client/src/main/java/com/tianhua/datafactory/client/filedata/listener/NoModelDataListener.java new file mode 100644 index 0000000000000000000000000000000000000000..6981c4f285e32db54a03b869f33d3d324703542f --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/filedata/listener/NoModelDataListener.java @@ -0,0 +1,57 @@ +package com.tianhua.datafactory.client.filedata.listener; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.util.ListUtils; +import com.alibaba.fastjson.JSON; +import com.tianhua.datafactory.client.filedata.impl.common.ExcelParseServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Map; + +/** + * Description + * date: 2022/9/4 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class NoModelDataListener extends AnalysisEventListener> { + + private Logger logger = LoggerFactory.getLogger(NoModelDataListener.class); + + private Integer skipRow; + + + public NoModelDataListener(){} + + public NoModelDataListener(Integer skipRow){ + this.skipRow = skipRow; + } + + private static final int BATCH_COUNT = 50000; + private List> dataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); + + @Override + public void invoke(Map data, AnalysisContext context) { + int rowIndex = context.readRowHolder().getRowIndex(); + if(rowIndex < skipRow){ + return; + } + + logger.info("解析到一条数据:{}", JSON.toJSONString(data)); + dataList.add(data); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + logger.info("所有数据解析完成!"); + } + + public List> getDataList() { + return dataList; + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/function/CacheFunction.java b/client/src/main/java/com/tianhua/datafactory/client/function/CacheFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..b551c71fb985f8ddcd505f1dffbc996d6d5e5600 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/function/CacheFunction.java @@ -0,0 +1,22 @@ +package com.tianhua.datafactory.client.function; + +/** + * Description + * 缓存函数 + * date: 2022/8/9 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public interface CacheFunction extends Function{ + + /** + * 构建count条缓存记录 + * 实现需要加锁 + * @param count 缓存条数 + */ + void buildCache(Integer count) throws Exception; + + +} diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/Function.java b/client/src/main/java/com/tianhua/datafactory/client/function/Function.java similarity index 51% rename from datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/Function.java rename to client/src/main/java/com/tianhua/datafactory/client/function/Function.java index 173e96c0775515fddff17c3869b43da94106b6ac..0f9f3453e90b7ac8870231715ad7c07d50db42a4 100644 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/Function.java +++ b/client/src/main/java/com/tianhua/datafactory/client/function/Function.java @@ -1,4 +1,4 @@ -package com.coderman.tianhua.datafactory.client.function; +package com.tianhua.datafactory.client.function; /** * description: Function 生成随机数据的函数接口 @@ -9,9 +9,9 @@ package com.coderman.tianhua.datafactory.client.function; public interface Function { /** * 创建一个数据 - * @param methodName 方法名,一个function类中有多个method,如果没有的话默认传空 + * @param params 参数列表,控制随机函数可以依赖的参数 * @return */ - T createOneData(String methodName, String... params); + T createOneData(String... params) throws Exception; } diff --git a/client/src/main/java/com/tianhua/datafactory/client/function/FunctionProxy.java b/client/src/main/java/com/tianhua/datafactory/client/function/FunctionProxy.java new file mode 100644 index 0000000000000000000000000000000000000000..d38a86ac561971a3676ecd87ba9afb7dd2695f81 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/function/FunctionProxy.java @@ -0,0 +1,15 @@ +package com.tianhua.datafactory.client.function; + +/** + * Description + * date: 2022/8/9 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public interface FunctionProxy{ + + public T createOneData(String dataSource, String... params); + +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/function/FunctionProxyImpl.java b/client/src/main/java/com/tianhua/datafactory/client/function/FunctionProxyImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..c96b1b51f87a876e514dc06f879e4111075dbf0c --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/function/FunctionProxyImpl.java @@ -0,0 +1,35 @@ +package com.tianhua.datafactory.client.function; + +import com.tianhua.datafactory.client.function.factory.FunctionFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * Description + * + * 基于缓存构建 + * + * 函数代理 + * 内置函数 + * 文件 + * kv配置 + * date: 2022/8/9 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class FunctionProxyImpl implements FunctionProxy{ + + @Autowired + private FunctionFactory functionFactory; + + @Override + public Object createOneData(String dataSource, String... params) { + functionFactory.createFunction(dataSource); + return null; + } + + +} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/functionfactory/FunctionFactory.java b/client/src/main/java/com/tianhua/datafactory/client/function/factory/FunctionFactory.java similarity index 83% rename from datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/functionfactory/FunctionFactory.java rename to client/src/main/java/com/tianhua/datafactory/client/function/factory/FunctionFactory.java index 5924712fba4fa54990465b63380f774afe816f98..5efc2779ad66ae22041c78100f58a78b19498518 100644 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/functionfactory/FunctionFactory.java +++ b/client/src/main/java/com/tianhua/datafactory/client/function/factory/FunctionFactory.java @@ -1,6 +1,6 @@ -package com.coderman.tianhua.datafactory.core.functionfactory; +package com.tianhua.datafactory.client.function.factory; -import com.coderman.tianhua.datafactory.client.function.Function; +import com.tianhua.datafactory.client.function.Function; /** * description: FunctionFactory
diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/functionfactory/FunctionFactoryImpl.java b/client/src/main/java/com/tianhua/datafactory/client/function/factory/FunctionFactoryImpl.java similarity index 58% rename from datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/functionfactory/FunctionFactoryImpl.java rename to client/src/main/java/com/tianhua/datafactory/client/function/factory/FunctionFactoryImpl.java index edf2d239658bd48231823e0dc451339669011d3a..9991babc9985255246d5b3d17a92111747d80fc3 100644 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/functionfactory/FunctionFactoryImpl.java +++ b/client/src/main/java/com/tianhua/datafactory/client/function/factory/FunctionFactoryImpl.java @@ -1,9 +1,11 @@ -package com.coderman.tianhua.datafactory.core.functionfactory; +package com.tianhua.datafactory.client.function.factory; -import com.coderman.tianhua.datafactory.client.function.Function; -import com.coderman.tianhua.datafactory.core.context.DataSourceFunctionContext; -import com.coderman.tianhua.datafactory.core.utils.SpringContextUtil; +import com.tianhua.datafactory.client.context.DataSourceFunctionContext; +import com.tianhua.datafactory.client.function.Function; +import com.tianhua.datafactory.client.utils.SpringContextUtil; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -16,6 +18,8 @@ import javax.annotation.Resource; */ @Service public class FunctionFactoryImpl implements FunctionFactory { + + private static Logger logger = LoggerFactory.getLogger(FunctionFactoryImpl.class); @Resource private DataSourceFunctionContext dataSourceFunctionContext; @Override @@ -24,6 +28,7 @@ public class FunctionFactoryImpl implements FunctionFactory { if(StringUtils.isNotEmpty(beanName)){ return (Function) SpringContextUtil.getBean(beanName); } + logger.error("根据数据源code找不到对应的函数对象,dataSourceCode = {}",dataSourceCode); return null; } } diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/impl/BankFunction.java b/client/src/main/java/com/tianhua/datafactory/client/function/impl/BankFunction.java similarity index 89% rename from datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/impl/BankFunction.java rename to client/src/main/java/com/tianhua/datafactory/client/function/impl/BankFunction.java index c4ba9734dcc4281bb4cc5341c2e045237d4f4bfa..a41162db1adc3bf1134323e513fdd1b5c145d494 100644 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/impl/BankFunction.java +++ b/client/src/main/java/com/tianhua/datafactory/client/function/impl/BankFunction.java @@ -1,8 +1,8 @@ -package com.coderman.tianhua.datafactory.client.function.impl; +package com.tianhua.datafactory.client.function.impl; -import com.coderman.tianhua.datafactory.client.annotations.DataSourceFunction; -import com.coderman.tianhua.datafactory.client.constants.InnerDataSourceCode; -import com.coderman.tianhua.datafactory.client.function.Function; +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.function.Function; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -107,7 +107,7 @@ public class BankFunction implements Function { } @Override - public String createOneData(String methodName,String ... params) { + public String createOneData(String ... params) { return bankNumber(); } } diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/impl/CardNumberFunction.java b/client/src/main/java/com/tianhua/datafactory/client/function/impl/CardNumberFunction.java similarity index 61% rename from datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/impl/CardNumberFunction.java rename to client/src/main/java/com/tianhua/datafactory/client/function/impl/CardNumberFunction.java index d666987cf22023e3f3d6b11c53a2199c11d5a1bf..f47e95a44a0deeaf443d1adbab63033f3f4360a2 100644 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/impl/CardNumberFunction.java +++ b/client/src/main/java/com/tianhua/datafactory/client/function/impl/CardNumberFunction.java @@ -1,14 +1,17 @@ -package com.coderman.tianhua.datafactory.client.function.impl; +package com.tianhua.datafactory.client.function.impl; -import com.coderman.tianhua.datafactory.client.annotations.DataSourceFunction; -import com.coderman.tianhua.datafactory.client.constants.InnerDataSourceCode; -import com.coderman.tianhua.datafactory.client.function.Function; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.function.CacheFunction; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; +import java.security.SecureRandom; import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.Random; +import java.util.*; +import java.util.concurrent.TimeUnit; /** * @author 陈小哥cw @@ -17,7 +20,19 @@ import java.util.Random; */ @Service(value = "cardNumberFunction") @DataSourceFunction(dataSourceCode = InnerDataSourceCode.CARD_NUMBER) -public class CardNumberFunction implements Function { +public class CardNumberFunction implements CacheFunction { + private static SecureRandom random = new SecureRandom(); + + /** + * caffine缓存 + */ + private static final Cache manualCache = Caffeine.newBuilder() + .maximumSize(10) + .expireAfterWrite(10*60, TimeUnit.SECONDS) + .build(); + + + private static Integer count = 100000; // 18位身份证号码各位的含义: // 1-2位省、自治区、直辖市代码; @@ -39,6 +54,8 @@ public class CardNumberFunction implements Function { * 获取一个随机生成的身份证号码 */ public String cardNumber() { + Random random = new SecureRandom(); + String id = "421022199703149999"; // 随机生成省、自治区、直辖市代码 1-2 String provinces[] = {"11", "12", "13", "14", "15", "21", "22", "23", @@ -53,7 +70,7 @@ public class CardNumberFunction implements Function { // 随机生成出生年月 7-14 String birth = randomBirth(20, 50); // 随机生成顺序号 15-17(随机性别) - String no = new Random().nextInt(899) + 100 + ""; + String no = random.nextInt(899) + 100 + ""; // 随机生成校验码 18 String checks[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "X"}; @@ -67,14 +84,16 @@ public class CardNumberFunction implements Function { * 从String[] 数组中随机取出其中一个String字符串 */ private static String randomOne(String s[]) { - return s[new Random().nextInt(s.length - 1)]; + Random random = new SecureRandom(); + return s[random.nextInt(s.length - 1)]; } /** * 随机生成两位数的字符串(01-max),不足两位的前面补0 */ private static String randomCityCode(int max) { - int i = new Random().nextInt(max) + 1; + Random random = new SecureRandom(); + int i = random.nextInt(max) + 1; return i > 9 ? i + "" : "0" + i; } @@ -85,18 +104,48 @@ public class CardNumberFunction implements Function { * @param maxAge */ private static String randomBirth(int minAge, int maxAge) { + Random random = new SecureRandom(); + SimpleDateFormat dft = new SimpleDateFormat("yyyyMMdd");// 设置日期格式 Calendar date = Calendar.getInstance(); date.setTime(new Date());// 设置当前日期 // 随机设置日期为前maxAge年到前minAge年的任意一天 int randomDay = 365 * minAge - + new Random().nextInt(365 * (maxAge - minAge)); + + random.nextInt(365 * (maxAge - minAge)); date.set(Calendar.DATE, date.get(Calendar.DATE) - randomDay); return dft.format(date.getTime()); } @Override - public String createOneData(String methodName,String ... params) { - return cardNumber(); + public String createOneData(String ... params) { + List list = manualCache.getIfPresent(InnerDataSourceCode.CARD_NUMBER); + if(CollectionUtils.isEmpty(list)){ + buildCache(count); + } + list = manualCache.getIfPresent(InnerDataSourceCode.CARD_NUMBER); + + return list.get(random.nextInt(list.size())).toString(); + } + + + @Override + public synchronized void buildCache(Integer count) { + this.count = count; + initCache(count); + } + + + private void initCache(Integer count){ + if(manualCache.getIfPresent(InnerDataSourceCode.CARD_NUMBER) != null){ + return; + } + + + List list = new ArrayList<>(count); + for (int i =0;i < count;i++){ + list.add(cardNumber()); + } + + manualCache.put(InnerDataSourceCode.CARD_NUMBER,list); } } diff --git a/client/src/main/java/com/tianhua/datafactory/client/function/impl/ChineseNameFunc.java b/client/src/main/java/com/tianhua/datafactory/client/function/impl/ChineseNameFunc.java new file mode 100644 index 0000000000000000000000000000000000000000..9419d05599883837faa236d399bd7f3c3c9d3207 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/function/impl/ChineseNameFunc.java @@ -0,0 +1,73 @@ +package com.tianhua.datafactory.client.function.impl; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.enums.FileDataEnums; +import com.tianhua.datafactory.client.function.CacheFunction; +import com.tianhua.datafactory.client.service.FileDataService; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * Description + * date: 2022/8/5 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "chineseNameFunc") +@DataSourceFunction(dataSourceCode = InnerDataSourceCode.CHINESE_NAME) +public class ChineseNameFunc implements CacheFunction { + @Autowired + private FileDataService fileDataService; + private static SecureRandom random = new SecureRandom(); + + private static Integer count = 100000; + + /** + * caffine缓存 + */ + private static final Cache manualCache = Caffeine.newBuilder() + .maximumSize(10) + .expireAfterWrite(10*60, TimeUnit.SECONDS) + .build(); + + @Override + public String createOneData(String... params) throws Exception { + List list = manualCache.getIfPresent(InnerDataSourceCode.CHINESE_NAME); + if(CollectionUtils.isEmpty(list)){ + buildCache(count); + } + list = manualCache.getIfPresent(InnerDataSourceCode.CHINESE_NAME); + return list.get(random.nextInt(list.size())).toString(); + } + + @Override + public synchronized void buildCache(Integer count) throws Exception { + this.count = count; + initCache(count); + } + + private void initCache(Integer count) throws Exception { + if(manualCache.getIfPresent(InnerDataSourceCode.CHINESE_NAME) != null){ + return; + } + List firstNameList = fileDataService.getFileDataList(FileDataEnums.FIRST_NAME.getFileName()); + List lastNameList = fileDataService.getFileDataList(FileDataEnums.LAST_NAME.getFileName()); + List list = new ArrayList<>(count); + for (int i =0;i < count;i++){ + String chineseName = firstNameList.get(random.nextInt(firstNameList.size())).toString() + lastNameList.get(random.nextInt(lastNameList.size())).toString(); + list.add(chineseName); + } + manualCache.put(InnerDataSourceCode.CHINESE_NAME, list); + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/function/impl/CommentFunc.java b/client/src/main/java/com/tianhua/datafactory/client/function/impl/CommentFunc.java new file mode 100644 index 0000000000000000000000000000000000000000..2e110aa69fd15cbd13e2e2fd27038bdd72f5d504 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/function/impl/CommentFunc.java @@ -0,0 +1,40 @@ +package com.tianhua.datafactory.client.function.impl; + +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.enums.FileDataEnums; +import com.tianhua.datafactory.client.function.CacheFunction; +import com.tianhua.datafactory.client.function.Function; +import com.tianhua.datafactory.client.service.FileDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.util.List; + +/** + * Description + * 一段评论中文 + * todo 先简单实现,后面加入缓存逻辑 + * date: 2022/9/12 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "commentFunc") +@DataSourceFunction(dataSourceCode = InnerDataSourceCode.COMMENT) +public class CommentFunc implements Function { + @Autowired + private FileDataService fileDataService; + + private SecureRandom secureRandom = new SecureRandom(); + + @Override + public Object createOneData(String... params) throws Exception { + + List commentList = fileDataService.getFileDataList(FileDataEnums.COMMENT.getFileName()); + + return commentList.get(secureRandom.nextInt(commentList.size())); + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/function/impl/CurrentTimeFunc.java b/client/src/main/java/com/tianhua/datafactory/client/function/impl/CurrentTimeFunc.java new file mode 100644 index 0000000000000000000000000000000000000000..a6f2f8d2a73b5ce36300119c159965e70ecaeb61 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/function/impl/CurrentTimeFunc.java @@ -0,0 +1,24 @@ +package com.tianhua.datafactory.client.function.impl; + +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.function.Function; +import org.springframework.stereotype.Service; + +/** + * Description + * date: 2022/8/5 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +@DataSourceFunction(dataSourceCode = InnerDataSourceCode.CURRENT_TIME) +public class CurrentTimeFunc implements Function { + + @Override + public Long createOneData(String... params) { + return System.currentTimeMillis(); + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/function/impl/DateFunc.java b/client/src/main/java/com/tianhua/datafactory/client/function/impl/DateFunc.java new file mode 100644 index 0000000000000000000000000000000000000000..93fe1527fc4855908cb8aabcd69928863c6d950c --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/function/impl/DateFunc.java @@ -0,0 +1,55 @@ +package com.tianhua.datafactory.client.function.impl; + +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.function.Function; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Date; + +/** + * Description + * date: 2022/8/5 + * + * @author shenshuai + * @version 1.0.0 + * + * @since JDK 1.8 + */ +@DataSourceFunction(dataSourceCode = InnerDataSourceCode.DATE) +@Service +public class DateFunc implements Function { + private static SecureRandom random = new SecureRandom(); + private static final int MAX_YEAR = 2030; + private static final int MIN_YEAR = 1970; + private static final int MAX_MONTH = 12; + private static final int MIN_MONTH = 1; + private static final int MAX_DAY = 1; + private static final int MIN_DAY = 28; + + @Override + public Date createOneData( String... params) { + int year = random.nextInt(MAX_YEAR) % (MAX_YEAR - MIN_YEAR + 1) + MIN_YEAR; + int month = random.nextInt(MAX_MONTH) % (MAX_MONTH - MIN_MONTH + 1) + MIN_MONTH; + int day = random.nextInt(MAX_DAY) % (MAX_DAY - MIN_DAY + 1) + MIN_DAY; + return localDate2Date(LocalDate.of(year, month, day)); + } + + /** + * LocalDate转Date + * + * @param localDate + * @return + */ + private Date localDate2Date(LocalDate localDate) { + if (null == localDate) { + return null; + } + ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault()); + return Date.from(zonedDateTime.toInstant()); + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/function/impl/DateTimeFunc.java b/client/src/main/java/com/tianhua/datafactory/client/function/impl/DateTimeFunc.java new file mode 100644 index 0000000000000000000000000000000000000000..e835fbc6b0288ff00fca27289bcd30ae41fd2a60 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/function/impl/DateTimeFunc.java @@ -0,0 +1,63 @@ +package com.tianhua.datafactory.client.function.impl; + +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.function.Function; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.text.DateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Date; + +/** + * Description + * date: 2022/8/8 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "dateTimeFunc") +@DataSourceFunction(dataSourceCode = InnerDataSourceCode.DATA_TIME) +public class DateTimeFunc implements Function { + private static SecureRandom random = new SecureRandom(); + private static final int MIN_YEAR = 1999; + private static final int MAX_MONTH = 11; + + private static final int SECOND = 59; + + private static final int HOUR = 23; + @Override + public Object createOneData(String... params) { + int year = random.nextInt(30) + MIN_YEAR; + int month = random.nextInt(MAX_MONTH) + 1; + int day; + + if(month == 2){ + day = random.nextInt(27) + 1; + }else if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 12) { + day = random.nextInt(30) + 1; + }else { + day = random.nextInt(29) + 1; + } + return localDate2Date(LocalDateTime.of(year, month, day, random.nextInt(HOUR), random.nextInt(SECOND), random.nextInt(SECOND))); + + } + + + /** + * localDateTime转Date + * + * @param localDateTime + * @return + */ + private Date localDate2Date(LocalDateTime localDateTime) { + ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault()); + Date date = Date.from(zonedDateTime.toInstant()); + return date; + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/function/impl/EmailFunc.java b/client/src/main/java/com/tianhua/datafactory/client/function/impl/EmailFunc.java new file mode 100644 index 0000000000000000000000000000000000000000..24a3f57f797f43aaf60e7804a99956135c5455f1 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/function/impl/EmailFunc.java @@ -0,0 +1,41 @@ +package com.tianhua.datafactory.client.function.impl; + + +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.function.Function; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.security.SecureRandom; + +/** + * description: UserFunction
+ * date: 2020/12/15 23:15
+ * author: coderman
+ * version: 1.0
+ * 用户相关的数据工厂工具类生成 + */ +@Service(value = "emailFunc") +@DataSourceFunction(dataSourceCode = InnerDataSourceCode.EMAIL_NAME) +public class EmailFunc implements Function { + + private static SecureRandom random = new SecureRandom(); + + public static final String BASE_CHAR = "abcdefghijklmnopqrstuvwxyz0123456789"; + + private static final String[] EMAIL_SUFFIX = "@gmail.com,@yahoo.com,@msn.com,@hotmail.com,@aol.com,@ask.com,@live.com,@qq.com,@0355.net,@163.com,@163.net,@263.net,@3721.net,@yeah.net,@googlemail.com,@126.com,@sina.com,@sohu.com,@yahoo.com.cn".split(","); + + @Resource(name = "randomNumFunc") + private Function randomNumFunc; + + @Override + public String createOneData(String... params) throws Exception { + Integer randomSize = (Integer) randomNumFunc.createOneData("2"); + StringBuilder stringBuilder = new StringBuilder(); + for(int i = 0;i < randomSize;i++){ + stringBuilder.append(BASE_CHAR.charAt(random.nextInt(BASE_CHAR.length()))); + } + return stringBuilder.append(EMAIL_SUFFIX[random.nextInt(EMAIL_SUFFIX.length)]).toString(); + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/function/impl/OneEnWordFunc.java b/client/src/main/java/com/tianhua/datafactory/client/function/impl/OneEnWordFunc.java new file mode 100644 index 0000000000000000000000000000000000000000..5fa1ee6207645de8a6d301290aa78329692fd712 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/function/impl/OneEnWordFunc.java @@ -0,0 +1,48 @@ +package com.tianhua.datafactory.client.function.impl; + +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.enums.FileDataEnums; +import com.tianhua.datafactory.client.function.Function; +import com.tianhua.datafactory.client.service.FileDataService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.security.SecureRandom; +import java.util.List; + +/** + * Description + * + * todo 先简单实现,后面加入缓存逻辑 + * date: 2022/9/12 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "oneEnWordFunc") +@DataSourceFunction(dataSourceCode = InnerDataSourceCode.ONE_ENGLISH_WORD) +public class OneEnWordFunc implements Function { + + private Logger logger = LoggerFactory.getLogger(OneEnWordFunc.class); + + + @Autowired + private FileDataService fileDataService; + + private SecureRandom secureRandom = new SecureRandom(); + + @Override + public Object createOneData(String... params) throws Exception { + List commentList = fileDataService.getFileDataList(FileDataEnums.EN_WORD.getFileName()); + if(CollectionUtils.isEmpty(commentList)){ + logger.error("数据文件内容读取为空,请检查,fileName = {}",FileDataEnums.EN_WORD.getFileName()); + return null; + } + return commentList.get(secureRandom.nextInt(commentList.size())); + } +} diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/impl/PassWordFunction.java b/client/src/main/java/com/tianhua/datafactory/client/function/impl/PassWordFunc.java similarity index 65% rename from datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/impl/PassWordFunction.java rename to client/src/main/java/com/tianhua/datafactory/client/function/impl/PassWordFunc.java index b87ad7455467023c3a2150574fae3f3dd5ada8f5..50330221d1ce70af7f46462d9a7b26e84b87e5a3 100644 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/impl/PassWordFunction.java +++ b/client/src/main/java/com/tianhua/datafactory/client/function/impl/PassWordFunc.java @@ -1,8 +1,8 @@ -package com.coderman.tianhua.datafactory.client.function.impl; +package com.tianhua.datafactory.client.function.impl; -import com.coderman.tianhua.datafactory.client.annotations.DataSourceFunction; -import com.coderman.tianhua.datafactory.client.constants.InnerDataSourceCode; -import com.coderman.tianhua.datafactory.client.function.Function; +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.function.Function; import org.springframework.stereotype.Service; import java.security.SecureRandom; @@ -15,7 +15,8 @@ import java.util.Random; * version: 1.0
*/ @Service(value = "passWordFunction") -public class PassWordFunction implements Function { +@DataSourceFunction(dataSourceCode = InnerDataSourceCode.PASS_WORD) +public class PassWordFunc implements Function { private static String reference = "QWERTYUIOPASDFGHJKLZXCVBNM1234567890qwertyuiopasdfghjklzxcvbnm!@#$%^.,-&*(~)"; private static Random random = new SecureRandom(); @@ -24,7 +25,6 @@ public class PassWordFunction implements Function { * * @param length */ - @DataSourceFunction(dataSourceCode = InnerDataSourceCode.PASS_WORD) private static String passWord(int length) { StringBuffer buffer = new StringBuffer(); char [] arr = reference.toCharArray(); @@ -35,7 +35,7 @@ public class PassWordFunction implements Function { } @Override - public String createOneData(String methodName, String... params) { + public String createOneData(String... params) { int length = Integer.parseInt(params[0]); return passWord(length); } diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/impl/PinYinFunction.java b/client/src/main/java/com/tianhua/datafactory/client/function/impl/PinYinFunction.java similarity index 86% rename from datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/impl/PinYinFunction.java rename to client/src/main/java/com/tianhua/datafactory/client/function/impl/PinYinFunction.java index 496bae111f87dc0d7de63884553573ce3ce6508a..ebf61690a9aaf2e5f7638dbc1ec381f153385f8f 100644 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/impl/PinYinFunction.java +++ b/client/src/main/java/com/tianhua/datafactory/client/function/impl/PinYinFunction.java @@ -1,14 +1,16 @@ -package com.coderman.tianhua.datafactory.client.function.impl; +package com.tianhua.datafactory.client.function.impl; -import com.coderman.tianhua.datafactory.client.annotations.DataSourceFunction; -import com.coderman.tianhua.datafactory.client.constants.InnerDataSourceCode; -import com.coderman.tianhua.datafactory.client.function.Function; +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.function.Function; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; /** @@ -22,6 +24,8 @@ import org.springframework.stereotype.Service; @Service public class PinYinFunction implements Function { + private Logger logger = LoggerFactory.getLogger(PinYinFunction.class); + /** * 将汉字转换为全拼 * @@ -52,8 +56,7 @@ public class PinYinFunction implements Function { } } } catch (BadHanyuPinyinOutputFormatCombination e) { - // TODO Auto-generated catch block - e.printStackTrace(); + logger.error("格式化异常", e); } return t4; } @@ -83,7 +86,6 @@ public class PinYinFunction implements Function { *//** * 将字符串转换成ASCII码 * - * @param cnStr * @return String *//* public String cnascii(String cnStr) { @@ -98,7 +100,7 @@ public class PinYinFunction implements Function { }*/ @Override - public String createOneData(String methodName, String... params) { + public String createOneData(String... params) { return null; } } diff --git a/client/src/main/java/com/tianhua/datafactory/client/function/impl/RandomDoubleFunc.java b/client/src/main/java/com/tianhua/datafactory/client/function/impl/RandomDoubleFunc.java new file mode 100644 index 0000000000000000000000000000000000000000..ac899970d8cd3ee7e5122751289269a2780d604d --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/function/impl/RandomDoubleFunc.java @@ -0,0 +1,43 @@ +package com.tianhua.datafactory.client.function.impl; + +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.function.Function; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.security.SecureRandom; + +/** + * Description + * date: 2022/9/18 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "randomDoubleFunc") +@DataSourceFunction(dataSourceCode = InnerDataSourceCode.RANDOM_DOUBLE) +public class RandomDoubleFunc implements Function { + @Resource(name = "randomNumFunc") + private Function randomNumFunc; + + private static SecureRandom secureRandom = new SecureRandom(); + + @Override + public Double createOneData(String... params) throws Exception { + //小数点后两位 + int len = 2; + if(params != null && StringUtils.isNotEmpty(params[0])){ + len = Integer.parseInt(params[0]); + } + + String first = randomNumFunc.createOneData((secureRandom.nextInt(5)+1)+"").toString(); + String second = randomNumFunc.createOneData(len + "").toString(); + + String floatValue = first + "." + second; + + return Double.parseDouble(floatValue); + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/function/impl/RandomFloatFunc.java b/client/src/main/java/com/tianhua/datafactory/client/function/impl/RandomFloatFunc.java new file mode 100644 index 0000000000000000000000000000000000000000..06d4e7d7e9220d9255dc72bff3ecfd105dba0a60 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/function/impl/RandomFloatFunc.java @@ -0,0 +1,47 @@ +package com.tianhua.datafactory.client.function.impl; + +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.function.Function; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.security.SecureRandom; + +/** + * Description + * + * 随机浮点数 + * date: 2022/9/12 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "randomFloatFunc") +@DataSourceFunction(dataSourceCode = InnerDataSourceCode.RANDOM_FLOAT) +public class RandomFloatFunc implements Function { + + @Resource(name = "randomNumFunc") + private Function randomNumFunc; + + private static SecureRandom secureRandom = new SecureRandom(); + + @Override + public Float createOneData(String... params) throws Exception { + //小数点后两位 + int len = 2; + if(params != null && StringUtils.isNotEmpty(params[0])){ + len = Integer.parseInt(params[0]); + } + + String first = randomNumFunc.createOneData((secureRandom.nextInt(5)+1)+"").toString(); + String second = randomNumFunc.createOneData(len + "").toString(); + + String floatValue = first + "." + second; + + return Float.parseFloat(floatValue); + + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/function/impl/RandomNumFunc.java b/client/src/main/java/com/tianhua/datafactory/client/function/impl/RandomNumFunc.java new file mode 100644 index 0000000000000000000000000000000000000000..d102cc37d009a3f051dd84aebcce90b44f535d2e --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/function/impl/RandomNumFunc.java @@ -0,0 +1,32 @@ +package com.tianhua.datafactory.client.function.impl; + +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.function.Function; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +/** + * Description + * 获取一个指定位数的随机数--可以当做密码,or验证码 + * date: 2022/8/5 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "randomNumFunc") +@DataSourceFunction(dataSourceCode = InnerDataSourceCode.RANDOM) +public class RandomNumFunc implements Function { + + @Override + public Integer createOneData(String... params) { + int len = 6; + + if(params != null && StringUtils.isNotEmpty(params[0])){ + len = Integer.parseInt(params[0]); + } + int rs = (int) ((Math.random() * 9 + 1) * Math.pow(10, len - 1)); + return rs; + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/function/impl/SnowflakeIdFunc.java b/client/src/main/java/com/tianhua/datafactory/client/function/impl/SnowflakeIdFunc.java new file mode 100644 index 0000000000000000000000000000000000000000..8a098f5c1b4ea6b082e3179c27109f34caa64fb6 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/function/impl/SnowflakeIdFunc.java @@ -0,0 +1,73 @@ +package com.tianhua.datafactory.client.function.impl; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.function.CacheFunction; +import com.tianhua.datafactory.client.utils.SnowflakeIdWorker; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * Description + * date: 2022/8/8 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "snowflakeIdFunc") +@DataSourceFunction(dataSourceCode = InnerDataSourceCode.SNOWFLAKE_ID) +public class SnowflakeIdFunc implements CacheFunction { + + private static SecureRandom random = new SecureRandom(); + + + /** + * caffine缓存 + */ + private static final Cache manualCache = Caffeine.newBuilder() + .maximumSize(10) + .expireAfterWrite(5*60, TimeUnit.SECONDS) + .build(); + + + private Integer count = 10000; + @Override + public String createOneData(String... params) { + + List list = manualCache.getIfPresent(InnerDataSourceCode.SNOWFLAKE_ID); + + if(CollectionUtils.isEmpty(list)){ + buildCache(count); + } + list = manualCache.getIfPresent(InnerDataSourceCode.SNOWFLAKE_ID); + + return list.get(random.nextInt(list.size())).toString(); + } + + @Override + public synchronized void buildCache(Integer count) { + this.count = count; + initCache(count); + } + + + private void initCache(Integer count){ + + if(manualCache.getIfPresent(InnerDataSourceCode.SNOWFLAKE_ID) != null){ + return; + } + List list = new ArrayList<>(count); + for (int i =0;i < count;i++){ + list.add(SnowflakeIdWorker.getNextId()); + } + manualCache.put(InnerDataSourceCode.SNOWFLAKE_ID, list); + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/function/impl/TelPhoneFunc.java b/client/src/main/java/com/tianhua/datafactory/client/function/impl/TelPhoneFunc.java new file mode 100644 index 0000000000000000000000000000000000000000..9572f4700486ea89f139f637661292dc4bdfb4ab --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/function/impl/TelPhoneFunc.java @@ -0,0 +1,88 @@ +package com.tianhua.datafactory.client.function.impl; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.function.CacheFunction; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * Description + * 获取电话号码 + * date: 2022/8/5 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "telPhoneFunc") +@DataSourceFunction(dataSourceCode = InnerDataSourceCode.TEL_PHONE) +public class TelPhoneFunc implements CacheFunction { + /** + * 返回手机号码 + */ + private static String[] telFirst = "130,134,135,136,137,138,139,150,151,152,157,158,159,130,131,132,155,156,133,153,175,176,177,180,182,183,188,189,191,186".split(","); + private static SecureRandom random = new SecureRandom(); + + + /** + * caffine缓存 + */ + private static final Cache manualCache = Caffeine.newBuilder() + .maximumSize(10) + .expireAfterWrite(10*60, TimeUnit.SECONDS) + .build(); + + + + private Integer count = 100000; + + @Override + public String createOneData(String... params) { + + List list = manualCache.getIfPresent(InnerDataSourceCode.TEL_PHONE); + + if(CollectionUtils.isEmpty(list)){ + buildCache(count); + } + list = manualCache.getIfPresent(InnerDataSourceCode.TEL_PHONE); + + return list.get(random.nextInt(list.size())).toString(); + + } + + private int getNum(int start, int end) { + return (int) (Math.random() * (end - start + 1) + start); + } + + + @Override + public synchronized void buildCache(Integer count) { + this.count = count; + initCache(count); + } + + + private void initCache(Integer count){ + + if(manualCache.getIfPresent(InnerDataSourceCode.TEL_PHONE) != null){ + return; + } + List list = new ArrayList<>(count); + for (int i =0;i < count;i++){ + int index = getNum(0, telFirst.length - 1); + String first = telFirst[index]; + String second = String.valueOf(getNum(1, 888) + 10000).substring(1); + String third = String.valueOf(getNum(1, 9100) + 10000).substring(1); + list.add(first + second + third); + } + manualCache.put(InnerDataSourceCode.TEL_PHONE, list); + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/function/impl/UUidFunc.java b/client/src/main/java/com/tianhua/datafactory/client/function/impl/UUidFunc.java new file mode 100644 index 0000000000000000000000000000000000000000..7a301658c5ed969b39b6ff1474a3d815ae753007 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/function/impl/UUidFunc.java @@ -0,0 +1,72 @@ +package com.tianhua.datafactory.client.function.impl; + +import cn.hutool.core.lang.UUID; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.tianhua.datafactory.client.annotations.DataSourceFunction; +import com.tianhua.datafactory.client.constants.InnerDataSourceCode; +import com.tianhua.datafactory.client.function.CacheFunction; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * Description + * date: 2022/9/18 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "uUidFunc") +@DataSourceFunction(dataSourceCode = InnerDataSourceCode.UUID) +public class UUidFunc implements CacheFunction { + private static SecureRandom random = new SecureRandom(); + + private Integer count = 10000; + + /** + * caffine缓存 + */ + private static final Cache manualCache = Caffeine.newBuilder() + .maximumSize(10) + .expireAfterWrite(5*60, TimeUnit.SECONDS) + .build(); + + + + @Override + public synchronized void buildCache(Integer count) throws Exception { + this.count = count; + initCache(count); + } + + @Override + public Object createOneData(String... params) throws Exception { + + List list = manualCache.getIfPresent(InnerDataSourceCode.UUID); + + if(CollectionUtils.isEmpty(list)){ + buildCache(count); + } + list = manualCache.getIfPresent(InnerDataSourceCode.UUID); + + return list.get(random.nextInt(list.size())).toString(); + } + + private void initCache(Integer count){ + if(manualCache.getIfPresent(InnerDataSourceCode.UUID) != null){ + return; + } + + List list = new ArrayList<>(count); + for (int i =0;i < count;i++){ + list.add(UUID.fastUUID().toString()); + } + manualCache.put(InnerDataSourceCode.UUID, list); + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/listener/FuncCacheListener.java b/client/src/main/java/com/tianhua/datafactory/client/listener/FuncCacheListener.java new file mode 100644 index 0000000000000000000000000000000000000000..3dea3062cd2d5389db73ea54e3d05a7a8a80e895 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/listener/FuncCacheListener.java @@ -0,0 +1,25 @@ +package com.tianhua.datafactory.client.listener; + +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.stereotype.Service; + +/** + * Description + * 监听容器启动事件,可预先func缓存 + * 默认走延迟缓存 + * date: 2022/8/9 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class FuncCacheListener implements ApplicationListener { + + + @Override + public void onApplicationEvent(ApplicationReadyEvent event) { + + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/package-info.java b/client/src/main/java/com/tianhua/datafactory/client/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..0ee7f336ca8661284a37abef553070759be89831 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/package-info.java @@ -0,0 +1 @@ +package com.tianhua.datafactory.client; \ No newline at end of file diff --git a/client/src/main/java/com/tianhua/datafactory/client/service/FileDataService.java b/client/src/main/java/com/tianhua/datafactory/client/service/FileDataService.java new file mode 100644 index 0000000000000000000000000000000000000000..076d352bf4e2b8157d2f381c5553b3d81b0db3eb --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/service/FileDataService.java @@ -0,0 +1,60 @@ +package com.tianhua.datafactory.client.service; + +import com.tianhua.datafactory.client.context.FileDataSourceContext; + +import java.io.IOException; +import java.util.List; + +/** + * Description: + * + * 支持从数据文件中读取数据源作为数据生成构建的来源 + * 实现方案 + * 1. 注册文件数据源和文件规则(文件存储,文件内部单行的解析规则,属性模型) + * 2. 解析加载数据源到缓存中 + * 3. 根据数据源获取数据 + * date: 2021/1/14 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public interface FileDataService { + /** + * 从内置数据文件中获取随机数据列表 + * @param fileName + * @return + */ + List getFileDataList(String fileName) throws Exception; + + /** + * 注册文件数据源 + * 从外部加载文件数据源 + * + * 本地文件 + * web控制台上传的文件 + * @param fileDataSourceContext + * @return + */ + boolean registFileDataSource(FileDataSourceContext fileDataSourceContext) throws IOException; + + + /** + * 从文件中加载一定量的数据信息到缓存中 + * 按数据源编码#属性名的格式来加载 + * @param dataSourceCode 数据源编码 + * @param loadCount 加载数量 + * @return + * @throws IOException + */ + boolean loadFileData(String dataSourceCode, Integer loadCount) throws Exception; + + + /** + * 根据数据源编码获取一个数据源对应的值信息 + * @param dataSourceCode + * @return + */ + Object getFileData(String dataSourceCode); + +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/service/FileDataServiceImpl.java b/client/src/main/java/com/tianhua/datafactory/client/service/FileDataServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..b74f744de20576deef8ea1d286061692ea7b2096 --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/service/FileDataServiceImpl.java @@ -0,0 +1,122 @@ +package com.tianhua.datafactory.client.service; + +import com.alibaba.fastjson.JSON; +import com.tianhua.datafactory.client.cache.KVCacheService; +import com.tianhua.datafactory.client.context.FileDataSourceContext; +import com.tianhua.datafactory.client.enums.FileDataEnums; +import com.tianhua.datafactory.client.enums.FileTypeEnum; +import com.tianhua.datafactory.client.filedata.CommonParseService; +import com.tianhua.datafactory.client.filedata.InnerParseService; +import com.tianhua.datafactory.client.utils.SpringUtil; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description: + * 文件数据服务 + * date: 2021/1/14 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class FileDataServiceImpl implements FileDataService{ + private static final String DATA_SOURCE = "datasource"; + + public CommonParseService getCommonParseService(String fileType) throws Exception { + if(fileType.equals(FileTypeEnum.TXT.getType())){ + return (CommonParseService) SpringUtil.getBean("txtParseServiceImpl"); + } + + if(fileType.equals(FileTypeEnum.JSON.getType())){ + return (CommonParseService) SpringUtil.getBean("jSONParseServiceImpl"); + } + + if(fileType.equals(FileTypeEnum.JSON.getType())){ + return (CommonParseService) SpringUtil.getBean("jSONParseServiceImpl"); + } + throw new Exception("不支持的解析策略"); + } + + + @Autowired + private KVCacheService kvCacheService; + + @Override + public List getFileDataList(String fileName) throws Exception { + String beanName = FileDataEnums.getBeanName(fileName); + if(StringUtils.isEmpty(beanName)){ + throw new Exception("根据文件名找不到配置对应的处理bean"); + } + InnerParseService parseService = (InnerParseService)SpringUtil.getBean(beanName); + return parseService.parseFileData(); + } + + @Override + public boolean registFileDataSource(FileDataSourceContext fileDataSourceContext) throws IOException { + // ClassPathResource类的构造方法接收路径名称,自动去classpath路径下找文件 + String jsonPath = DATA_SOURCE+"/"+fileDataSourceContext.getDataSourceCode()+".json"; + + ClassPathResource classPathResource = new ClassPathResource(jsonPath); + classPathResource.getPath(); + + File file = classPathResource.getFile(); + if(!file.exists()){ + file.mkdir(); + } + //将规则信息写入本地resource 目录下 + FileUtils.writeStringToFile(file, JSON.toJSONString(fileDataSourceContext), "utf-8"); + return true; + } + + @Override + public boolean loadFileData(String dataSourceCode, Integer loadCount) throws Exception { + String jsonPath = DATA_SOURCE+"/"+dataSourceCode+".json"; + File file = new File(jsonPath); + if(!file.exists()){ + return false; + } + String jsonStr = FileUtils.readFileToString(new File(jsonPath),"utf-8"); + FileDataSourceContext fileDataSourceContext = JSON.parseObject(jsonStr, FileDataSourceContext.class); + + CommonParseService commonParseService = getCommonParseService(fileDataSourceContext.getFileType()); + + List> resultList = commonParseService.parseData(fileDataSourceContext); + Map> dataSourceMap = new HashMap<>(); + + for (Map map : resultList){ + for (Map.Entry entry : map.entrySet()){ + String subDataSourceCode = fileDataSourceContext.getDataSourceCode() + "#" + entry.getKey(); + List list = dataSourceMap.get(subDataSourceCode); + if(list == null){ + list = new ArrayList<>(); + } + list.add(entry.getValue()); + dataSourceMap.put(subDataSourceCode, list); + } + } + + //构建内存缓存 + dataSourceMap.forEach((k,v) -> kvCacheService.putCache(k,v)); + + return true; + } + + @Override + public Object getFileData(String dataSourceCode) { + //直接从缓存中获取一个随机数 + return kvCacheService.getCacheOne(dataSourceCode); + } +} diff --git a/client/src/main/java/com/tianhua/datafactory/client/utils/SnowflakeIdWorker.java b/client/src/main/java/com/tianhua/datafactory/client/utils/SnowflakeIdWorker.java new file mode 100644 index 0000000000000000000000000000000000000000..f7c0b1b84bb3d771af13631ad2c9efb26f47219f --- /dev/null +++ b/client/src/main/java/com/tianhua/datafactory/client/utils/SnowflakeIdWorker.java @@ -0,0 +1,236 @@ +package com.tianhua.datafactory.client.utils; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.LockSupport; + +/** + * Description + * date: 2022/8/1 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class SnowflakeIdWorker { + + + // ==============================Fields=========================================== + /** + * 开始时间截 (2021-01-19) + */ + private final long twepoch = 1611043703161L; + + /** + * 机器id所占的位数 + */ + private final long workerIdBits = 5L; + + /** + * 数据标识id所占的位数 + */ + private final long dataCenterIdBits = 5L; + + /** + * 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) + */ + private final long maxWorkerId = -1L ^ (-1L << workerIdBits); + + /** + * 支持的最大数据标识id,结果是31 + */ + private final long maxDataCenterId = -1L ^ (-1L << dataCenterIdBits); + + /** + * 序列在id中占的位数 + */ + private final long sequenceBits = 12L; + + /** + * 机器ID向左移12位 + */ + private final long workerIdShift = sequenceBits; + + /** + * 数据标识id向左移17位(12+5) + */ + private final long dataCenterIdShift = sequenceBits + workerIdBits; + + /** + * 时间截向左移22位(5+5+12) + */ + private final long timestampLeftShift = sequenceBits + workerIdBits + dataCenterIdBits; + + /** + * 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) + */ + private final long sequenceMask = -1L ^ (-1L << sequenceBits); + + /** + * 工作机器ID(0~31) + */ + private long workerId; + + /** + * 数据中心ID(0~31) + */ + private long dataCenterId; + + /** + * 备用的数据中心ID(0~31),当时钟回拨时,为了不抛异常,启用备用ID + */ + private long standbyDatacenterId; + + /** + * 毫秒内序列(0~4095) + */ + private long sequence = 0L; + + /** + * 上次生成ID的时间截 + */ + private long lastTimestamp = -1L; + + /** + * 是否时钟回拨 + */ + private boolean isTimestampBack = false; + + // ==============================Constructors===================================== + /** + * 最大容忍时间, 单位毫秒, 即如果时钟只是回拨了该变量指定的时间, 那么等待相应的时间即可; + * 考虑到sequence服务的高性能, 这个值不易过大 + */ + private static final long MAX_BACKWARD_MS = 3; + + /** + * 构造函数 + * + * @param workerId 工作ID (0~31) + * @param datacenterId 数据中心ID (0~31) + */ + SnowflakeIdWorker(long workerId, long datacenterId, long standbyDatacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDataCenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDataCenterId)); + } + if (standbyDatacenterId > maxDataCenterId || standbyDatacenterId < 0) { + throw new IllegalArgumentException(String.format("standby datacenter Id can't be greater than %d or less than 0", maxDataCenterId)); + } + if (datacenterId == standbyDatacenterId) { + throw new IllegalArgumentException("datacenter Id can't equal to standby datacenter Id."); + } + this.workerId = workerId; + this.dataCenterId = datacenterId; + this.standbyDatacenterId = standbyDatacenterId; + } + + // ==============================Methods========================================== + + /** + * 获得下一个ID (该方法是线程安全的) + * + * @return SnowflakeId + */ + synchronized long nextId() { + long timestamp = timeGen(); + + // 如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过 + if (timestamp < lastTimestamp) { + // 如果时钟回拨在可接受范围内, 等待即可 + long offset = lastTimestamp - timestamp; + if (offset <= MAX_BACKWARD_MS) { + try { + //睡(lastTimestamp - currentTimestamp)ms让其追上 + LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(offset)); + + timestamp = timeGen(); + //如果当前时间还是小于上一次ID生成的时间戳,这时启用备用的datacenterId + if (timestamp < lastTimestamp) { + isTimestampBack = true; + //服务器时钟被调整了 + //log.error(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + //throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } else { + isTimestampBack = false; + } + } catch (Exception e) { + //log.error(e); + } + } + } + + // 如果是同一时间生成的,则进行毫秒内序列 + if (lastTimestamp == timestamp) { + sequence = (sequence + 1) & sequenceMask; + // 毫秒内序列溢出 + if (sequence == 0) { + // 阻塞到下一个毫秒,获得新的时间戳 + timestamp = tilNextMillis(lastTimestamp); + } + } + // 时间戳改变,毫秒内序列重置 + else { + sequence = 0L; + } + + // 上次生成ID的时间截 + lastTimestamp = timestamp; + + //要使用的datacenterId + long datacenterIdToUse = isTimestampBack ? standbyDatacenterId : dataCenterId; + + // 移位并通过或运算拼到一起组成64位的ID + return ((timestamp - twepoch) << timestampLeftShift) // + | (datacenterIdToUse << dataCenterIdShift) // + | (workerId << workerIdShift) // + | sequence; + } + + /** + * 阻塞到下一个毫秒,直到获得新的时间戳 + * + * @param lastTimestamp 上次生成ID的时间截 + * @return 当前时间戳 + */ + private long tilNextMillis(long lastTimestamp) { + long timestamp = timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = timeGen(); + } + return timestamp; + } + + /** + * 返回以毫秒为单位的当前时间 + * + * @return 当前时间(毫秒) + */ + protected long timeGen() { + return System.currentTimeMillis(); + } + + private volatile static SnowflakeIdWorker snowflakeIdWorker; + + public static SnowflakeIdWorker getInstance() { + if (snowflakeIdWorker == null) { + synchronized (SnowflakeIdWorker.class) { + if (snowflakeIdWorker == null) { + snowflakeIdWorker = new SnowflakeIdWorker(1, 0,11); + } + } + } + return snowflakeIdWorker; + } + + /** + * 获得下一个ID (该方法是线程安全的) + * + * @return SnowflakeId + */ + public static String getNextId() { + return String.valueOf(getInstance().nextId()); + } + } + + diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/utils/SpringContextUtil.java b/client/src/main/java/com/tianhua/datafactory/client/utils/SpringContextUtil.java similarity index 56% rename from datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/utils/SpringContextUtil.java rename to client/src/main/java/com/tianhua/datafactory/client/utils/SpringContextUtil.java index 15eb4319ba7661f37c52ca907355c73dbb167f4f..1d2aafe6b90dd870217766d05daee985cdeb8dd2 100644 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/utils/SpringContextUtil.java +++ b/client/src/main/java/com/tianhua/datafactory/client/utils/SpringContextUtil.java @@ -1,8 +1,5 @@ -package com.coderman.tianhua.datafactory.core.utils; +package com.tianhua.datafactory.client.utils; -import org.apache.ibatis.session.ExecutorType; -import org.apache.ibatis.session.SqlSession; -import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -10,6 +7,8 @@ import org.springframework.stereotype.Component; import java.sql.Connection; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * @Author fanchunshuai @@ -42,35 +41,21 @@ public class SpringContextUtil implements ApplicationContextAware { public static Object getBean(String name) { try { return applicationContext.getBean(name); + } catch (BeansException e) { return null; } } - - - - public int updateBatch(List list){ - if(list ==null || list.size() <= 0){ - return -1; + public static List getBeanOfType(Class T){ + Map beanMap = applicationContext.getBeansOfType(T); + if(beanMap == null){ + return null; } - SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) SpringContextUtil.getBean("sqlSessionFactory"); - SqlSession sqlSession = null; - try { - sqlSession = sqlSessionFactory.openSession(ExecutorType.SIMPLE); - Connection connection = sqlSession.getConnection(); - // connection.prepareStatement("sql").; + return beanMap.values().stream().collect(Collectors.toList()); + } + - return 0; - }catch (Exception e){ - sqlSession.rollback(); - return -2; - }finally { - if(sqlSession != null){ - sqlSession.close(); - } - } - } } \ No newline at end of file diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/utils/SpringUtil.java b/client/src/main/java/com/tianhua/datafactory/client/utils/SpringUtil.java similarity index 90% rename from datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/utils/SpringUtil.java rename to client/src/main/java/com/tianhua/datafactory/client/utils/SpringUtil.java index e846d06cafdcac6bce565e2e337ddf58ce6462a2..e1123f9b50fc85011f426bd59b1939e6640a10e6 100644 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/utils/SpringUtil.java +++ b/client/src/main/java/com/tianhua/datafactory/client/utils/SpringUtil.java @@ -1,13 +1,10 @@ -package com.coderman.tianhua.datafactory.client.utils; +package com.tianhua.datafactory.client.utils; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; -import java.sql.Connection; -import java.util.List; - /** * @Author fanchunshuai * @Date 2019/11/18 00 diff --git a/client/src/main/resources/defaultfactory/comment.txt b/client/src/main/resources/defaultfactory/comment.txt new file mode 100644 index 0000000000000000000000000000000000000000..527da4941e3379f69f89e8f7a54f3fa15ca45e73 --- /dev/null +++ b/client/src/main/resources/defaultfactory/comment.txt @@ -0,0 +1,2 @@ +太好了,完美。,产品真烂,下次还买 +不喜欢,太实用了,好用但是价格贵了 \ No newline at end of file diff --git a/client/src/main/resources/defaultfactory/enword.txt b/client/src/main/resources/defaultfactory/enword.txt new file mode 100644 index 0000000000000000000000000000000000000000..2890cd463c07332363811b09566f25ca3c6938cf --- /dev/null +++ b/client/src/main/resources/defaultfactory/enword.txt @@ -0,0 +1,3 @@ +projectCode,className,dataSourceCode +dataFactory,xxxService,itemCode,fieldName +projectName,xxxFactory,orderCode,xxxId \ No newline at end of file diff --git a/datafactory-client/src/main/resources/defaultfactory/firstname.txt b/client/src/main/resources/defaultfactory/firstname.txt similarity index 100% rename from datafactory-client/src/main/resources/defaultfactory/firstname.txt rename to client/src/main/resources/defaultfactory/firstname.txt diff --git a/datafactory-client/src/main/resources/defaultfactory/lastname.txt b/client/src/main/resources/defaultfactory/lastname.txt similarity index 100% rename from datafactory-client/src/main/resources/defaultfactory/lastname.txt rename to client/src/main/resources/defaultfactory/lastname.txt diff --git a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/controller/BaseController.java b/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/controller/BaseController.java deleted file mode 100644 index bca7bc2e396e5b9b806e0d4f8cd0b474c0387b83..0000000000000000000000000000000000000000 --- a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/controller/BaseController.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coderman.tianhua.datafactory.api.controller; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** -* @Description:控制层基础父类 -* @Author:fanchunshuai -* @CreateTime:2020-12-02 23:07:13 -* @version v1.0 -*/ -public class BaseController{ - - protected Logger logger = LoggerFactory.getLogger(this.getClass()); - - /** - * 从request中获取指定的字符串 - * @param parameterName - * @return - */ - protected String getParameterString(String parameterName) { - //return RequestUtil.getParameterString(parameterName); - return ""; - } - - /** - * 从request中获取指定的整型 - * @param parameterName - * @return - */ - protected Integer getParameterInteger(String parameterName) { - // return RequestUtil.getParameterInteger(parameterName); - return 0; - } - - /** - * 从request中获取指定的长整型 - * @param parameterName - * @return - */ - protected Long getParameterLong(String parameterName) { - //return RequestUtil.getParameterLong(parameterName); - return 0L; - } -} diff --git a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/controller/DataFactoryController.java b/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/controller/DataFactoryController.java deleted file mode 100644 index 9d578af43cd469928babf76426161369c9860063..0000000000000000000000000000000000000000 --- a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/controller/DataFactoryController.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.coderman.tianhua.datafactory.api.controller; - -import com.alibaba.fastjson.JSON; -import com.coderman.tianhua.datafactory.api.vo.DataFactoryRequestVo; -import com.coderman.tianhua.datafactory.core.bean.DataBuildRequestBean; -import com.coderman.tianhua.datafactory.core.bean.DataBuildRequestFieldBean; -import com.coderman.tianhua.datafactory.core.bean.DataBuildRequestFieldRuleBean; -import com.coderman.tianhua.datafactory.core.service.DataFactoryService; -import com.coderman.tianhua.datafactory.core.vo.DataSourceVO; -import com.coderman.utils.bean.CglibConvertService; -import com.coderman.utils.response.ResultDataDto; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -import java.util.ArrayList; -import java.util.List; - - -/** - * description: DataFactoryController
- * date: 2020/12/2 23:43
- * author: coderman
- * version: 1.0
- */ -@RestController -@Slf4j -public class DataFactoryController extends BaseController { - - @Autowired - private DataFactoryService dataFactoryService; - - @Autowired - private CglibConvertService cglibConvertService; - - /** - * @param dataSourceVo - * @return ResultDataDto 构建结果 - * @Description:根据数据源构建数据 - * @version v1.0 - */ - @RequestMapping(value = "/datafactory/generate", method = RequestMethod.GET) - public ResultDataDto generate(@RequestBody DataSourceVO dataSourceVo) { - return null; - } - - /** - * @param dataFactoryRequestVo - * @return ResultDataDto 构建结果 - * @Description:根据数据源构建数据 适用于单表,或者单模块构建 - * @version v1.0 - */ - @RequestMapping(value = "/datafactory/generate/simple", method = RequestMethod.POST) - public ResultDataDto generateSimple(@RequestBody DataFactoryRequestVo dataFactoryRequestVo) { - logger.info("dataFactoryRequestVo = {}", JSON.toJSONString(dataFactoryRequestVo)); - ResultDataDto resultDataDto = new ResultDataDto(); - try { - DataBuildRequestBean dataFactoryRequestBean = cglibConvertService.copyPropertity(DataBuildRequestBean.class, dataFactoryRequestVo); - - List dataFactoryRequestFieldBeanList = new ArrayList<>(); - - dataFactoryRequestVo.getDataFactoryRequestFieldVoList().stream().forEach(dataFactoryRequestFieldVo -> { - try { - DataBuildRequestFieldBean dataFactoryRequestFieldBean = cglibConvertService.copyPropertity(DataBuildRequestFieldBean.class, dataFactoryRequestFieldVo); - if(dataFactoryRequestFieldVo.getDataFactoryRequestFieldRuleVo() != null){ - DataBuildRequestFieldRuleBean dataFactoryRequestFieldRuleBean = cglibConvertService.copyPropertity(DataBuildRequestFieldRuleBean.class, dataFactoryRequestFieldVo.getDataFactoryRequestFieldRuleVo()); - dataFactoryRequestFieldBean.setDataFactoryRequestFieldRuleBean(dataFactoryRequestFieldRuleBean); - } - dataFactoryRequestFieldBeanList.add(dataFactoryRequestFieldBean); - - } catch (Exception e) { - e.printStackTrace(); - } - - }); - - dataFactoryRequestBean.setDataFactoryRequestFieldBeanList(dataFactoryRequestFieldBeanList); - - logger.info("dataFactoryRequestBean = {}", JSON.toJSONString(dataFactoryRequestVo)); - resultDataDto = dataFactoryService.generateSimple(dataFactoryRequestBean); - } catch (Exception e) { - resultDataDto.setInvokeErrorMsg("构建失败"); - logger.error("构建失败 ", e); - } - - return resultDataDto; - } - - -} diff --git a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/controller/DataSourceController.java b/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/controller/DataSourceController.java deleted file mode 100644 index 628d9ea2163d0359a50a3bf1c1040a3fd573da93..0000000000000000000000000000000000000000 --- a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/controller/DataSourceController.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.coderman.tianhua.datafactory.api.controller; - -import com.coderman.tianhua.datafactory.core.bean.DataSourceQueryDTO; -import com.coderman.tianhua.datafactory.core.service.DataSourceService; -import com.coderman.tianhua.datafactory.core.vo.DataSourceVO; -import com.coderman.utils.response.ResultDataDto; -import com.coderman.utils.response.ResultDto; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - - -/** -* @Description:数据源管理表控制层 -* @Author:fanchunshuai -* @CreateTime:2020-12-02 23:07:13 -* @version v1.0 -*/ -@RestController -@Slf4j -public class DataSourceController extends BaseController{ - - @Autowired - private DataSourceService dataSourceService; - - - /** - * @Description:新增数据源管理表 - * @version v1.0 - * @param dataSourceVo - * @return ResultDto - */ - @RequestMapping(value = "/data/source/regist",method = RequestMethod.POST) - public ResultDto save(@RequestBody DataSourceVO dataSourceVo){ - try { - return dataSourceService.save(dataSourceVo); - } catch (Exception e) { - log.error("保存失败",e); - return ResultDto.setErrorCodeMsg("保存失败"); - } - - } - - /** - * @Description:修改数据源管理表 - * @version v1.0 - * @param dataSourceVo - * @return ResultDto - */ - @RequestMapping(value = "/data/source/update",method = RequestMethod.POST) - public ResultDto update(@RequestBody DataSourceVO dataSourceVo){ - try { - return dataSourceService.update(dataSourceVo); - } catch (Exception e) { - log.error("修改失败",e); - return ResultDto.setErrorCodeMsg("修改失败"); - } - } - - /** - * @Description:根据id删除数据源管理表 - * @version v1.0 - * @param id - * @return ResultDto - */ - @PostMapping("/dataSource/delete") - public ResultDto delete(@RequestParam(name = "id") Long id){ - return dataSourceService.delete(id); - } - - /** - * @Description:根据ID获取数据源管理表单条记录 - * @version v1.0 - * @param id - * @return ResultDataDto - */ - @GetMapping("/data/source/get") - public ResultDataDto getById(@RequestParam(name = "id") Long id){ - try { - return dataSourceService.getById(id); - } catch (Exception e) { - log.error("获取数据失败",e); - return ResultDataDto.setErrorCodeMsg("获取数据失败"); - } - } - - /** - * @Description:分页获取数据源管理表记录 - * @version v1.0 - * @return ResultDataDto - */ - @GetMapping("/dataSource/getpage") - public ResultDataDto getPage(DataSourceQueryDTO dataSourceQueryDTO){ - return dataSourceService.getPage(dataSourceQueryDTO); - } - - - /** - * @Description:分页获取数据源管理表记录 - * @version v1.0 - * @return ResultDataDto - */ - @GetMapping("/dataSource/getall") - public ResultDataDto getAll(){ - try { - return dataSourceService.getAll(); - } catch (Exception e) { - logger.error("查询失败",e); - } - return ResultDataDto.setErrorCodeMsg("查询失败"); - } - - /** - * @Description:修改数据源管理表状态 - * @version v1.0 - * @param id - * @param status - * @return ResultDataDto - */ - @PostMapping("/data/source/changestatus") - public ResultDto changeStatus(@RequestParam(name = "id") Long id,@RequestParam(name = "status") int status){ - return dataSourceService.updateStatus(id,status); - } - -} diff --git a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/package-info.java b/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/package-info.java deleted file mode 100644 index e5582482ac6b962955fe6b1c4b5e06aa8fe65d11..0000000000000000000000000000000000000000 --- a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.coderman.tianhua.datafactory.api; \ No newline at end of file diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/cache/CacheService.java b/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/cache/CacheService.java deleted file mode 100644 index e3a416f72eff9d0813e9981f62488acae3fc9180..0000000000000000000000000000000000000000 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/cache/CacheService.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.coderman.tianhua.datafactory.client.cache; - -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - -import java.util.List; -import java.util.concurrent.TimeUnit; - -/** - * Description: - * date: 2021/1/15 - * - * @author fanchunshuai - * @version 1.0.0 - * @since JDK 1.8 - */ -@Service -public class CacheService { - /** - * 初始化缓存,key:对应的配置文件名 - * value:对应的配置内容列表 - */ - private static final Cache> manualCache = Caffeine.newBuilder() - .expireAfterWrite(10, TimeUnit.MINUTES) - .maximumSize(10_000) - .build(); - - /** - * 设置缓存数据 - * @param fileName - * @param dataList - */ - public void putCache(String fileName,List dataList){ - manualCache.put(fileName,dataList); - } - - /** - * 获取缓存数据 - * @param fileName 文件名 - * @return - */ - public List getCache(String fileName){ - return manualCache.getIfPresent(fileName); - } - -} diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/impl/UserFunction.java b/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/impl/UserFunction.java deleted file mode 100644 index 24165562a711360bbc67629363da5f5f441166fb..0000000000000000000000000000000000000000 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/function/impl/UserFunction.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.coderman.tianhua.datafactory.client.function.impl; - - -import com.coderman.tianhua.datafactory.client.annotations.DataSourceFunction; -import com.coderman.tianhua.datafactory.client.constants.InnerDataSourceCode; -import com.coderman.tianhua.datafactory.client.enums.FileDataEnums; -import com.coderman.tianhua.datafactory.client.function.Function; -import com.coderman.tianhua.datafactory.client.service.FileDataService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.security.SecureRandom; -import java.time.LocalDate; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.util.Date; -import java.util.List; -import java.util.Random; - -/** - * description: UserFunction
- * date: 2020/12/15 23:15
- * author: coderman
- * version: 1.0
- * 用户相关的数据工厂工具类生成 - */ -@Service -public class UserFunction implements Function { - - @Autowired - private FileDataService fileDataService; - private static SecureRandom random = new SecureRandom(); - - public static final String BASE_CHAR = "abcdefghijklmnopqrstuvwxyz0123456789"; - - - /** - * 返回手机号码 - */ - private static String[] telFirst = "134,135,136,137,138,139,150,151,152,157,158,159,130,131,132,155,156,133,153".split(","); - - private static final String[] EMAIL_SUFFIX = "@gmail.com,@yahoo.com,@msn.com,@hotmail.com,@aol.com,@ask.com,@live.com,@qq.com,@0355.net,@163.com,@163.net,@263.net,@3721.net,@yeah.net,@googlemail.com,@126.com,@sina.com,@sohu.com,@yahoo.com.cn".split(","); - - private static final int MAX_YEAR = 2030; - private static final int MIN_YEAR = 1949; - private static final int MAX_MONTH = 12; - private static final int MIN_MONTH = 1; - private static final int MAX_DAY = 1; - private static final int MIN_DAY = 28; - - /** - * 获取一个电话号码 - * - * @return - */ - @DataSourceFunction(dataSourceCode = InnerDataSourceCode.TEL_PHONE) - public String tel() { - int index = getNum(0, telFirst.length - 1); - String first = telFirst[index]; - String second = String.valueOf(getNum(1, 888) + 10000).substring(1); - String third = String.valueOf(getNum(1, 9100) + 10000).substring(1); - return first + second + third; - } - - - /** - * 获取一个日期 - * - * @return - */ - @DataSourceFunction(dataSourceCode = InnerDataSourceCode.DATE) - public Date date() { - int year = random.nextInt(MAX_YEAR) % (MAX_YEAR - MIN_YEAR + 1) + MIN_YEAR; - int month = random.nextInt(MAX_MONTH) % (MAX_MONTH - MIN_MONTH + 1) + MIN_MONTH; - int day = random.nextInt(MAX_DAY) % (MAX_DAY - MIN_DAY + 1) + MIN_DAY; - return localDate2Date(LocalDate.of(year, month, day)); - } - - /** - * 获取一个邮箱----邮箱函数需要重新定义 - * - * @param lMin 最小长度 - * @param lMax 最大长度 - * @return - */ - public String email(int lMin, int lMax) { - int length = getNum(lMin, lMax); - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < length; i++) { - int number = (int) (Math.random() * BASE_CHAR.length()); - sb.append(BASE_CHAR.charAt(number)); - } - sb.append(EMAIL_SUFFIX[(int) (Math.random() * EMAIL_SUFFIX.length)]); - return sb.toString(); - } - - /** - * 获取一个指定位数的随机数--可以当做密码,or验证码 - * @param len - * @return - */ - @DataSourceFunction(dataSourceCode = InnerDataSourceCode.RANDOM) - public String random(int len) { - int rs = (int) ((Math.random() * 9 + 1) * Math.pow(10, len - 1)); - return String.valueOf(rs); - } - - - /** - * LocalDate转Date - * - * @param localDate - * @return - */ - private Date localDate2Date(LocalDate localDate) { - if (null == localDate) { - return null; - } - ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault()); - return Date.from(zonedDateTime.toInstant()); - } - - @DataSourceFunction(dataSourceCode = InnerDataSourceCode.CHINESE_NAME) - private String chineseName(){ - List firstNameList = fileDataService.getFileDataList(FileDataEnums.FIRST_NAME.getFileName()); - List lastNameList = fileDataService.getFileDataList(FileDataEnums.LAST_NAME.getFileName()); - return firstNameList.get(random.nextInt(firstNameList.size())) + lastNameList.get(random.nextInt(lastNameList.size())); - } - - - private int getNum(int start, int end) { - return (int) (Math.random() * (end - start + 1) + start); - } - - @Override - public String createOneData(String methodName, String... params) { - if(methodName.equals("tel")){ - return tel(); - }else if(methodName.equals("chineseName")){ - return chineseName(); - }else if(methodName.equals("random")){ - int length = Integer.parseInt(params[0]); - return random(length); - } - return null; - } -} diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/package-info.java b/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/package-info.java deleted file mode 100644 index 8eb302d03f157128eaaa4ca328ce9cb38e67ecbd..0000000000000000000000000000000000000000 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.coderman.tianhua.datafactory.client; \ No newline at end of file diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/service/FileDataService.java b/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/service/FileDataService.java deleted file mode 100644 index aba93259b14961b6d68d2f280316dfb67c240433..0000000000000000000000000000000000000000 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/service/FileDataService.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.coderman.tianhua.datafactory.client.service; - -import java.util.List; - -/** - * Description: - * date: 2021/1/14 - * - * @author fanchunshuai - * @version 1.0.0 - * @since JDK 1.8 - */ -public interface FileDataService { - /** - * 从内置数据文件中获取随机数据列表 - * @param fileName - * @return - */ - List getFileDataList(String fileName); -} diff --git a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/service/FileDataServiceImpl.java b/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/service/FileDataServiceImpl.java deleted file mode 100644 index c8594f6861a6571c5cf07d79d5648b18167ad0cf..0000000000000000000000000000000000000000 --- a/datafactory-client/src/main/java/com/coderman/tianhua/datafactory/client/service/FileDataServiceImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.coderman.tianhua.datafactory.client.service; - -import com.coderman.tianhua.datafactory.client.enums.FileDataEnums; -import com.coderman.tianhua.datafactory.client.filedata.ParseService; -import com.coderman.tianhua.datafactory.client.utils.SpringUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * Description: - * date: 2021/1/14 - * - * @author fanchunshuai - * @version 1.0.0 - * @since JDK 1.8 - */ -@Service -public class FileDataServiceImpl implements FileDataService{ - - @Override - public List getFileDataList(String fileName) { - - String beanName = FileDataEnums.getBeanName(fileName); - if(StringUtils.isEmpty(beanName)){ - //todo throw exception - return null; - } - ParseService parseService = (ParseService)SpringUtil.getBean(beanName); - return parseService.parseFileData(); - } -} diff --git a/datafactory-core/pom.xml b/datafactory-core/pom.xml deleted file mode 100644 index 6d4140b97669a99ba537965e651d228b9bdb8cd3..0000000000000000000000000000000000000000 --- a/datafactory-core/pom.xml +++ /dev/null @@ -1,251 +0,0 @@ - - - - 4.0.0 - - com.coderman.tianhua.datafactory - datafactory-core - 1.0.0-SNAPSHOT - - org.springframework.boot - spring-boot-starter-parent - 2.1.8.RELEASE - - - datafactory-core - - http://www.example.com - - - jar - - 1.8 - - - - - org.springframework.cloud - spring-cloud-dependencies - Greenwich.SR3 - pom - import - - - org.springframework.boot - spring-boot-dependencies - 2.1.8.RELEASE - pom - import - - - com.alibaba.cloud - spring-cloud-alibaba-dependencies - 2.1.0.RELEASE - pom - import - - - - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-freemarker - - - - org.springframework.boot - spring-boot-configuration-processor - - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - 1.3.2 - - - - junit - junit - 4.12 - test - - - - org.mybatis.spring.boot - mybatis-spring-boot-starter-test - 1.3.2 - - - - commons-io - commons-io - 2.7 - - - - - com.google.guava - guava - 29.0-jre - - - - javax.servlet - javax.servlet-api - 4.0.1 - - - - - org.mybatis - mybatis - 3.4.1 - - - - com.alibaba - druid - 1.1.17 - - - - - - org.mybatis - mybatis-spring - 1.3.0 - - - - - com.alibaba - fastjson - 1.2.61 - - - - org.apache.commons - commons-collections4 - 4.3 - - - - mysql - mysql-connector-java - 8.0.11 - - - org.slf4j - slf4j-api - 1.7.30 - compile - - - - org.freemarker - freemarker-gae - 2.3.26-incubating - - - - cglib - cglib - 3.2.6 - - - - org.apache.commons - commons-lang3 - 3.10 - - - org.springframework - spring-test - test - - - org.springframework.boot - spring-boot-test - test - - - org.springframework.boot - spring-boot-test - test - - - - com.coderman.utils - coderman-utils - 1.0.3-SNAPSHOT - - - org.projectlombok - lombok - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - - com.belerweb - pinyin4j - 2.5.1 - - - - - com.github.ben-manes.caffeine - caffeine - 2.8.0 - - - - org.apache.commons - commons-lang3 - - - - - com.belerweb - pinyin4j - 2.5.0 - - - - com.coderman.tianhua.datafactory - datafactory-client - 1.0.0-SNAPSHOT - - - - - - - - - diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/adaptor/ServiceApiAdaptor.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/adaptor/ServiceApiAdaptor.java deleted file mode 100644 index c93463f2068152bd17e89e3388e8057ab48ce543..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/adaptor/ServiceApiAdaptor.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderman.tianhua.datafactory.core.adaptor; - -import com.coderman.tianhua.datafactory.core.bean.DataSourceBean; -import com.coderman.utils.kvpair.KVPair; - -import java.util.List; -import java.util.Map; - -/** - * description: ServiceApiAdaptor
- * date: 2020/12/7 23:50
- * author: coderman
- * version: 1.0
- */ -public interface ServiceApiAdaptor { - /** - * 动态获取服务类--api数据 - * @param url url - * @param params 参数 - * @return - */ - List getServiceDataFromHttp(String url, Map params); -} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataBuildRequestBean.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataBuildRequestBean.java deleted file mode 100644 index a89ad5cc344707535fac2408d0320e25ad52735e..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataBuildRequestBean.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.coderman.tianhua.datafactory.core.bean; - -import lombok.Data; -import lombok.ToString; - -import java.util.List; - -/** - * description: DataFactoryVo
- * date: 2020/12/2 23:48
- * author: coderman
- * version: 1.0
- */ -@Data -@ToString -public class DataBuildRequestBean { - /** - * 项目名称--中文 - */ - private String projectName; - - /** - * 服务名称--英文 - */ - private String serviceName; - - /** - * 模块名称--英文 - */ - private String moduleName; - - /** - * 模块名称--中文 - */ - private String moduleDesc; - - /** - * 创建多少条数据 max 100w - */ - private int generateCount; - - /** - * 属性的解析顺序 - * 元素值为字段数据源code,这么做的目的是降低程序对依赖数据的检索, - * 由用户控制相关字段的依赖顺序,且保证被依赖的数据源code在依赖方前面,否则无法正确处理 - * - * 如果生成的数据字段中没有依赖关系则可为空 - */ - private List dataFactoryRequestFieldOrderList; - - /** - * 模块变量 - */ - private List dataFactoryRequestFieldBeanList; - - /** - * 是否持久化数据构建请求以复用 - */ - private int persistRequest; - -} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataBuildRequestFieldBean.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataBuildRequestFieldBean.java deleted file mode 100644 index 4dee39c99cde4b4be2ed905ca1a9196aaf501557..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataBuildRequestFieldBean.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.coderman.tianhua.datafactory.core.bean; - -import lombok.Data; -import lombok.ToString; - -import java.util.List; -import java.util.Map; - -/** - * description: DataFactoryRequestFieldVo
- * date: 2020/12/5 23:31
- * author: coderman
- * version: 1.0
- */ -@Data -@ToString -public class DataBuildRequestFieldBean { - /** - * 字段名 - */ - private String fieldName; - /** - * 字段类型 - */ - private String fieldTypeStr; - /** - * 字段数据源code - */ - private String dataSourceCode; - - /** - * 字段数据源code对应的值如果是JSON情况,则存在多重包装,因此需要取到对应的子JSON串的field - * eg:data.id - * data.list[0].id - * - * 当defaultValueList不为空时或者是依赖默认内置Function生成数据时可不传此值 - */ - private String dataSourceField; - - /** - * 字段默认值列表 - */ - private List defaultValueList; - - /** - * 用于具有一对多的数据依赖关系场景,当存在这种情况时多方不必定义 - * dataSourceCode,dataSourceField 多方取值根据一方的实际值进行路由,然后随机取一个值作为最终的值 - * - * 数据字段依赖规则 - * map.key = 字段被依赖方k-字段被依赖方value - * map.value= 字段依赖方k-字段依赖方value(有多个字段kd依赖k的值) - * - * k:字段被依赖方 - * kd:字段依赖方(有多个字段kd依赖k的值) - * map> - * - * 这里举例,假设k对应的value为1的时候 kd1对应的值有1,2,3 kd2对应的值有3,4,5 - * k对应的value为2的时候 kd1对应的值有6,7,8 kd2对应的值有1,2 - * - * 这里依赖的是静态值 - */ - private Map> varDependencyMap; - - /** - * 字段值生成规则 - */ - private DataBuildRequestFieldRuleBean dataFactoryRequestFieldRuleBean; - -} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataSourceBean.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataSourceBean.java deleted file mode 100644 index bd55727c01be58d52c8c6e8e2974ae7e1c33d817..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataSourceBean.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.coderman.tianhua.datafactory.core.bean; - -import lombok.Data; -import lombok.ToString; - -/** - * description: DataSourceBean
- * date: 2020/12/5 23:47
- * author: coderman
- * version: 1.0
- */ -@Data -@ToString -public class DataSourceBean { - /** 主键 **/ - private Long id; - - /** 数据源内容 **/ - private String dataContentJson; - - /** 数据源名称 **/ - private String sourceName; - - /** 数据源code,唯一 **/ - private String sourceCode; - - /** 数据源类型/(nacos,api,enum) **/ - private Integer sourceType; - - /** 数据源提供来源 **/ - private String providerSrc; - - /** 访问token **/ - private String token; - - /** 数据源访问url **/ - private String url; - - /** 状态(0正常,1过期) **/ - private Integer status; - - /** 访问策略(0动态获取/1本地缓存) **/ - private Integer visitStrategy; - - -} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataSourceQueryDTO.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataSourceQueryDTO.java deleted file mode 100644 index 74e268f8a6e2d426ece3f9ca778ada09e7b60ac9..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataSourceQueryDTO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coderman.tianhua.datafactory.core.bean; - -import lombok.Data; - -/** - * description: DataSourceQueryDTO
- * date: 2021/1/27 23:45
- * author: coderman
- * version: 1.0
- */ -@Data -public class DataSourceQueryDTO { - /** - * 数据源code - */ - private String dataSourceCode; - /** - * 数据源名称 - */ - private String dataSourceName; - - /** 数据源类型/(nacos,api,enum) **/ - private Integer sourceType; - - /** 状态(0正常,1过期) **/ - private Integer status; -} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/enums/DataSourceTypeEnum.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/enums/DataSourceTypeEnum.java deleted file mode 100644 index b8f39bd56c2b92f848cce2ecde9c2ce8fccbdfe6..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/enums/DataSourceTypeEnum.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coderman.tianhua.datafactory.core.enums; - - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum DataSourceTypeEnum { - //动态获取策略 - FROM_NACOS(0,"NACOS"), - //看情况 - FROM_SERVICE_API(1,"API"), - //枚举则保存在数据库中 - FROM_ENUM(2,"ENUM"), - //自定义则保存在数据库中 - FROM_CUSTOM(3,"自定义"), - ; - private int code; - private String desc; - -} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/enums/VisitStrategyEnums.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/enums/VisitStrategyEnums.java deleted file mode 100644 index 1a3c3673253945702316bcee46784d8a2314a11d..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/enums/VisitStrategyEnums.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coderman.tianhua.datafactory.core.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum VisitStrategyEnums { - /** - * 这里指数据工厂平台会通过定时任务获取数据源更新到数据工厂平台本身的数据库中 - */ - LOCAL_CACHE(1,"本地缓存"), - /** - * 这里则每次使用都会通过url的方式获取最新数据 - * - */ - DYNAMIC_ACCESS(0,"动态获取"), - ; - private int code; - private String desc; - -} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/mapper/DataSourceDetailMapper.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/mapper/DataSourceDetailMapper.java deleted file mode 100644 index 60b6fe1d1c470144e5697ec564dad2a298b9cfd8..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/mapper/DataSourceDetailMapper.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.coderman.tianhua.datafactory.core.mapper; - - -import com.coderman.tianhua.datafactory.core.entity.DataSourceDetailEntity; - -import java.util.List; - - -/** - * @Description:数据源详情表mapperDAO接口 - * @Author:fanchunshuai - * @CreateTime:2020-12-02 23:07:13 - * @version v1.0 - */ -public interface DataSourceDetailMapper{ - - /** - * - * @Title: save - * @Description:新增或修改 - * @author: - * @param @param dataSourceDetailEntity - * @return int - * @throws - */ - public int insert(DataSourceDetailEntity dataSourceDetailEntity); - - /** - * - * @Title: delete - * @Description: 通过id删除数据 - * @author: - * @param @param id - * @return int - * @throws - */ - public int deleteById(Long id); - - /** - * - * @Title: getById - * @Description: 通过id查询 - * @author: - * @param @param id - * @return ResultDataDto 返回类型 - * @throws - */ - public DataSourceDetailEntity getById(Long id); - - /** - * - * @Title: getAll - * @Description:查询所有数据 - * @author: - * @return List getAll(); - - /** - * - * @Title: update - * @Description:新增或修改 - * @author: - * @param @param dataSourceDetailEntity - * @return int - * @throws - */ - public int update(DataSourceDetailEntity dataSourceDetailEntity); - - - /** - * - * @Title: getBydataSourceId - * @Description: 通过dataSourceId查询 - * @author: - * @param @param dataSourceId - * @return ResultDataDto 返回类型 - * @throws - */ - public DataSourceDetailEntity getByDataSourceId(Long dataSourceId); - -} \ No newline at end of file diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/package-info.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/package-info.java deleted file mode 100644 index 235f1696d80a1f58ba91e83eb36c9735e64107c8..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.coderman.tianhua.datafactory.core; \ No newline at end of file diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/scheduler/DataSourceUpdateScheduler.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/scheduler/DataSourceUpdateScheduler.java deleted file mode 100644 index bfa8f9724bd59c6c3d694db9f95b2bb2b2206639..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/scheduler/DataSourceUpdateScheduler.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.coderman.tianhua.datafactory.core.scheduler; - -/** - * Description: 数据源本地更新定时任务 - * date: 2021/1/16 - * - * @author fanchunshuai - * @version 1.0.0 - * @since JDK 1.8 - */ -public class DataSourceUpdateScheduler { -} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/ConfigServiceWrapper.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/ConfigServiceWrapper.java deleted file mode 100644 index e056e531b63ee8e4855ed0c08769bf2e7526887a..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/ConfigServiceWrapper.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.coderman.tianhua.datafactory.core.service; - -import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.nacos.api.NacosFactory; -import com.alibaba.nacos.api.PropertyKeyConst; -import com.alibaba.nacos.api.config.ConfigService; -import com.alibaba.nacos.api.exception.NacosException; -import com.coderman.tianhua.datafactory.core.adaptor.NacosDataAdaptor; -import com.coderman.utils.kvpair.KVPair; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Map; -import java.util.Properties; - -/** - * description: ConfigServiceWrapper nacos 服务 - * date: 2020/12/10 23:15
- * author: coderman
- * version: 1.0
- */ -@Service -@Slf4j -public class ConfigServiceWrapper { - @Autowired - private NacosDiscoveryProperties nacosDiscoveryProperties; - private ConfigService configService; - - @Autowired - private NacosDataAdaptor nacosDataAdaptor; - /** - * 通过原生Java方式获取ConfigService - * @return - * @throws NacosException - */ - public synchronized ConfigService getConfigService() throws NacosException { - if(configService == null){ - Properties properties = new Properties(); - properties.put(PropertyKeyConst.SERVER_ADDR, nacosDiscoveryProperties.getServerAddr()); - configService = NacosFactory.createConfigService(properties); - } - return configService; - } - - /** - * 获取nacos配置 - * @param dataId - * @param groupId - * @return - */ - public String getConfig(String dataId,String groupId){ - ConfigService configService = null; - try { - configService = this.getConfigService(); - //默认3秒 - return configService.getConfig(dataId,groupId,3000); - - } catch (NacosException e) { - log.error("链接nacos失败!",e); - } - return null; - } - - /** - * 对nacos content进行预处理 - * @param dataId - * @param groupId - * @return - */ - public List> getConfigList(String dataId,String groupId){ - String content = getConfig(dataId, groupId); - if(StringUtils.isEmpty(content)){ - //todo throw null exception - return null; - } - return nacosDataAdaptor.getNacosDataKV(content); - } - - - /** - * 对nacos content进行预处理 - * @param dataId - * @param groupId - * @return - */ - public List> getConfigList(String dataId, String groupId, String jsonTemplate){ - String content = getConfig(dataId, groupId); - if(StringUtils.isEmpty(content)){ - //todo throw null exception - return null; - } - return nacosDataAdaptor.getNacosDataMap(content,jsonTemplate); - } - - - -} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataFactoryService.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataFactoryService.java deleted file mode 100644 index 29eabecb1153f3bdeeb0321b0a5d9c458a1a7daa..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataFactoryService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coderman.tianhua.datafactory.core.service; - -import com.coderman.tianhua.datafactory.core.bean.DataBuildRequestBean; -import com.coderman.utils.response.ResultDataDto; - -/** - * description: DataFactoryservice
- * date: 2020/12/5 23:39
- * author: coderman
- * version: 1.0
- */ -public interface DataFactoryService { - - - // ResultDataDto generateSimplex(List dataFactoryRequestFieldBeanList) throws Exception; - - /** - * 生成简单数据列表 - * @param dataFactoryRequestBean - * @return - */ - ResultDataDto generateSimple(DataBuildRequestBean dataFactoryRequestBean) throws Exception; - - -} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataSourceDetailService.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataSourceDetailService.java deleted file mode 100644 index ce31f1d113ee10a3741ec0f4042dbe50e0e2bfdc..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataSourceDetailService.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.coderman.tianhua.datafactory.core.service; - -import com.coderman.utils.response.ResultDataDto; -import com.coderman.utils.response.ResultDto; -import com.coderman.tianhua.datafactory.core.vo.DataSourceDetailVO; - -import java.util.List; - -/** - * @Description:数据源详情表Service接口 - * @Author:fanchunshuai - * @CreateTime:2020-12-02 23:07:13 - * @version v1.0 - */ -public interface DataSourceDetailService{ - - /** - * - * @Title: save - * @Description:新增 - * @author: - * @param @param dto - * @param @param userId - * @return ResultDto 返回类型 - * @throws - */ - public ResultDto save(DataSourceDetailVO dataSourceDetailVo) throws Exception; - - /** - * - * @Title: delete - * @Description: 通过id删除数据 - * @author: - * @param @param id - * @return ResultDto 返回类型 - * @throws - */ - public ResultDto delete(Long id); - - /** - * - * @Title: getById - * @Description: 通过id查询 - * @author: - * @param @param id - * @return ResultDataDto - * @throws - */ - public ResultDataDto getById(Long id) throws Exception; - - /** - * - * @Title: getAll - * @Description:查询所有数据 - * @author: - * @return ResultDataDto> - * @throws - */ - public ResultDataDto> getAll() throws Exception; - - /** - * - * @Title: update - * @Description:修改 - * @author: - * @param @param dataSourceDetailEntity - * @return int - * @throws - */ - public ResultDto update(DataSourceDetailVO dataSourceDetailVo) throws Exception; - -} \ No newline at end of file diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataSourceFactoryService.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataSourceFactoryService.java deleted file mode 100644 index 216d6f4cab8cde09d7e957176c0a8d41519d89c7..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataSourceFactoryService.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coderman.tianhua.datafactory.core.service; - -/** - * description: DataSourceFactoryService
- * date: 2020/12/5 23:50
- * author: coderman
- * version: 1.0
- */ -public class DataSourceFactoryService { -} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataSourceService.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataSourceService.java deleted file mode 100644 index 168a03254bdfeb233fca1cd9c4ddddb64ff80235..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/DataSourceService.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.coderman.tianhua.datafactory.core.service; - -import com.coderman.tianhua.datafactory.core.bean.DataSourceQueryDTO; -import com.coderman.utils.response.ResultDataDto; -import com.coderman.utils.response.ResultDto; -import com.coderman.tianhua.datafactory.core.vo.DataSourceVO; - -import java.util.List; - -/** - * @Description:数据源管理表Service接口 - * @Author:fanchunshuai - * @CreateTime:2020-12-02 23:07:13 - * @version v1.0 - */ -public interface DataSourceService{ - - /** - * - * @Title: save - * @Description:新增 - * @author: - * @param @param dto - * @param @param userId - * @return ResultDto 返回类型 - * @throws - */ - public ResultDto save(DataSourceVO dataSourceVo) throws Exception; - - /** - * - * @Title: delete - * @Description: 通过id删除数据 - * @author: - * @param @param id - * @return ResultDto 返回类型 - * @throws - */ - public ResultDto delete(Long id); - - /** - * - * @Title: getById - * @Description: 通过id查询 - * @author: - * @param @param id - * @return ResultDataDto - * @throws - */ - public ResultDataDto getById(Long id) throws Exception; - - /** - * - * @Title: getAll - * @Description:查询所有数据 - * @author: - * @return ResultDataDto> - * @throws - */ - public ResultDataDto> getAll() throws Exception; - - /** - * - * @Title: update - * @Description:修改 - * @author: - * @param @param dataSourceEntity - * @return int - * @throws - */ - public ResultDto update(DataSourceVO dataSourceVo) throws Exception; - - /** - * 根据数据源code获取数据源详情-包括数据源信息 - * @param dataSourceCode - * @return - * @throws Exception - */ - public ResultDataDto getDataSourceDetail(String dataSourceCode) throws Exception; - - - /** - * 修改数据源状态 - * @param id - * @param status - * @return - */ - public ResultDto updateStatus(Long id,Integer status); - - /** - * 分页查询 - * @param dataSourceQueryDTO - * @return - */ - public ResultDataDto> getPage(DataSourceQueryDTO dataSourceQueryDTO); - -} \ No newline at end of file diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataFactoryServiceImpl.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataFactoryServiceImpl.java deleted file mode 100644 index fe89654852bde463aadde2b7d50e5577aa804cab..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataFactoryServiceImpl.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.coderman.tianhua.datafactory.core.service.impl; - -import com.coderman.tianhua.datafactory.client.constants.InnerDataSourceCode; -import com.coderman.tianhua.datafactory.client.function.Function; -import com.coderman.tianhua.datafactory.core.bean.DataBuildRequestBean; -import com.coderman.tianhua.datafactory.core.bean.DataBuildRequestFieldBean; -import com.coderman.tianhua.datafactory.core.bean.DataBuildRequestFieldRuleBean; - -import com.coderman.tianhua.datafactory.core.bean.DataSourceFieldRequestBean; -import com.coderman.tianhua.datafactory.core.functionfactory.FunctionFactory; -import com.coderman.tianhua.datafactory.core.service.DataFactoryService; -import com.coderman.tianhua.datafactory.core.service.DataGenerateService; -import com.coderman.tianhua.datafactory.core.service.DataSourceService; -import com.coderman.utils.response.ResultDataDto; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.security.SecureRandom; -import java.util.*; - -/** - * description: DataFactoryServiceImpl
- * date: 2020/12/5 23:40
- * author: coderman
- * version: 1.0
- */ -@Service -@Slf4j -public class DataFactoryServiceImpl implements DataFactoryService { - - private ThreadLocal randomThreadLocal = new ThreadLocal<>(); - - @Autowired - private DataSourceService dataSourceService; - - @Autowired - private FunctionFactory functionFactory; - - - @Resource(name = "dataGenerateDefaultServiceImpl") - private DataGenerateService dataGenerateDefaultServiceImpl; - - - @Resource(name = "dataGenerateFunctionServiceImpl") - private DataGenerateService dataGenerateFunctionServiceImpl; - - - @Resource(name = "dataGenerateRemoteServiceImpl") - private DataGenerateService dataGenerateRemoteServiceImpl; - - /** - * 根据请求的数据上下文生成随机的数据字段值 - * @param dataSourceFieldRequestBean - * @return - * @throws Exception - */ - private Object getRandomValue(DataSourceFieldRequestBean dataSourceFieldRequestBean) throws Exception { - DataBuildRequestFieldBean dataFactoryRequestFieldBean = dataSourceFieldRequestBean.getDataFactoryRequestFieldBean(); - - String dataSourceCode = dataFactoryRequestFieldBean.getDataSourceCode(); - //从默认值中获取数据 - if (StringUtils.isEmpty(dataSourceCode) || CollectionUtils.isNotEmpty(dataFactoryRequestFieldBean.getDefaultValueList())) { - return dataGenerateDefaultServiceImpl.getRandomData(dataSourceFieldRequestBean); - } - //如果是内置数据源则从内置数据源工厂中的Function中构建随机数据 - if (dataSourceCode.startsWith(InnerDataSourceCode.DEFAULT_PREFIX)) { - return dataGenerateFunctionServiceImpl.getRandomData(dataSourceFieldRequestBean); - }else { - //从远程数据源获取随机数据 - return dataGenerateRemoteServiceImpl.getRandomData(dataSourceFieldRequestBean); - } - - } - - @Override - public ResultDataDto generateSimple(DataBuildRequestBean dataFactoryRequestBean) throws Exception { - randomThreadLocal.set(new SecureRandom()); - List dataFactoryRequestFieldBeanList = dataFactoryRequestBean.getDataFactoryRequestFieldBeanList(); - List> batchResultList = new ArrayList<>(dataFactoryRequestBean.getGenerateCount() * 2); - ResultDataDto resultDataDto = new ResultDataDto(); - - Map functionMap = new HashMap<>(); - - for (DataBuildRequestFieldBean dataFactoryRequestFieldBean : dataFactoryRequestFieldBeanList) { - String dataSourceCode = dataFactoryRequestFieldBean.getDataSourceCode(); - if (StringUtils.isNotBlank(dataSourceCode) && dataSourceCode.startsWith(InnerDataSourceCode.DEFAULT_PREFIX)) { - Function function = functionFactory.createFunction(dataSourceCode); - functionMap.put(dataSourceCode,function); - } - } - - for (int i = 0; i < dataFactoryRequestBean.getGenerateCount(); i++) { - Map fieldValueMap = new HashMap<>(dataFactoryRequestFieldBeanList.size()); - DataSourceFieldRequestBean dataSourceFieldRequestBean = new DataSourceFieldRequestBean(); - - for (DataBuildRequestFieldBean dataFactoryRequestFieldBean : dataFactoryRequestFieldBeanList) { - Object fieldValue = fieldValueMap.get(dataFactoryRequestFieldBean.getFieldName()); - if(fieldValue != null){ - continue; - } - dataSourceFieldRequestBean.setFunction(functionMap.get(dataFactoryRequestFieldBean.getDataSourceCode())); - dataSourceFieldRequestBean.setFieldValueMap(fieldValueMap); - dataSourceFieldRequestBean.setDataFactoryRequestFieldBean(dataFactoryRequestFieldBean); - dataSourceFieldRequestBean.setRandom(randomThreadLocal.get()); - dataSourceFieldRequestBean.setVarDependencyMap(dataFactoryRequestFieldBean.getVarDependencyMap()); - //获取随机字段值 - Object object = getRandomValue(dataSourceFieldRequestBean); - fieldValueMap.put(dataFactoryRequestFieldBean.getFieldName(), object); - } - batchResultList.add(fieldValueMap); - } - resultDataDto.setData(batchResultList); - return resultDataDto; - } - - /** - * 对随机数进行后置处理 - * - * @param factoryRequestFieldBean - * @param randomValue - * @return - */ - private String getPostValueString(DataBuildRequestFieldBean factoryRequestFieldBean, Object randomValue) { - DataBuildRequestFieldRuleBean dataFactoryRequestFieldRuleBean2 = factoryRequestFieldBean.getDataFactoryRequestFieldRuleBean(); - String value = randomValue.toString(); - //字符串型随机数据的后置处理 - if (factoryRequestFieldBean.getFieldTypeStr().equals("String")) { - if (StringUtils.isNotEmpty(dataFactoryRequestFieldRuleBean2.getPrefixStr())) { - value = dataFactoryRequestFieldRuleBean2.getPrefixStr() + value; - } - if (StringUtils.isNotEmpty(dataFactoryRequestFieldRuleBean2.getSubfixStr())) { - value = value + dataFactoryRequestFieldRuleBean2.getSubfixStr(); - } - } - return value; - } - - -} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataGenerateDefaultServiceImpl.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataGenerateDefaultServiceImpl.java deleted file mode 100644 index 64eb4f2f14469e184fb02759ddc464c8df080690..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataGenerateDefaultServiceImpl.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.coderman.tianhua.datafactory.core.service.impl; - -import com.coderman.tianhua.datafactory.core.bean.DataBuildRequestFieldBean; -import com.coderman.tianhua.datafactory.core.bean.DataSourceFieldRequestBean; -import com.coderman.tianhua.datafactory.core.service.DataGenerateService; -import com.coderman.tianhua.datafactory.core.service.DataValueHandler; -import org.apache.commons.collections4.CollectionUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.security.SecureRandom; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * description: DataGenerateDefaultServiceImpl
- * date: 2021/1/17 20:24
- * author: coderman
- * version: 1.0
- */ -@Service(value = "dataGenerateDefaultServiceImpl") -public class DataGenerateDefaultServiceImpl implements DataGenerateService { - private static SecureRandom secureRandom = new SecureRandom(); - @Autowired - private DataValueHandler dataValueHandler; - @Override - public Object getRandomData(DataSourceFieldRequestBean dataSourceFieldRequestBean) { - DataBuildRequestFieldBean dataFactoryRequestFieldBean = dataSourceFieldRequestBean.getDataFactoryRequestFieldBean(); - - if (CollectionUtils.isNotEmpty(dataFactoryRequestFieldBean.getDefaultValueList())) { - int size = dataFactoryRequestFieldBean.getDefaultValueList().size(); - Object value = dataFactoryRequestFieldBean.getDefaultValueList().get(secureRandom.nextInt(size)); - Map> varDependencyMap = dataSourceFieldRequestBean.getVarDependencyMap(); - if(varDependencyMap == null || varDependencyMap.isEmpty()){ - return dataValueHandler.handleValue(value,dataFactoryRequestFieldBean.getDataFactoryRequestFieldRuleBean()); - } - String key = dataFactoryRequestFieldBean.getFieldName()+"-"+value.toString(); - List dependencyList = varDependencyMap.get(key); - if(CollectionUtils.isNotEmpty(dependencyList)){ - Map> kvDependencyMap = new HashMap<>(); - //对依赖方进行处理 - dependencyList.forEach(dependencyValue->{ - String [] kvArr = dependencyValue.split("-"); - - List valueList = kvDependencyMap.get(kvArr[0]); - if(valueList == null){ - valueList = new ArrayList<>(); - } - valueList.add(kvArr[1]); - kvDependencyMap.put(key, valueList); - }); - - //依赖方按当前被依赖方的值确定自己的值 - kvDependencyMap.forEach((k,vList)->{ - dataSourceFieldRequestBean.getFieldValueMap().put(key, vList.get(secureRandom.nextInt(vList.size()))); - }); - } - - - return value; - } - return null; - } -} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataGenerateFunctionServiceImpl.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataGenerateFunctionServiceImpl.java deleted file mode 100644 index 2b12ec399e727b9ba7bd856592c8e077c2a3b8b8..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataGenerateFunctionServiceImpl.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.coderman.tianhua.datafactory.core.service.impl; - -import com.coderman.tianhua.datafactory.client.function.Function; -import com.coderman.tianhua.datafactory.core.bean.DataBuildRequestFieldRuleBean; -import com.coderman.tianhua.datafactory.core.bean.DataSourceFieldRequestBean; -import com.coderman.tianhua.datafactory.core.service.DataGenerateService; -import com.coderman.tianhua.datafactory.core.service.DataValueHandler; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -/** - * description: DataGenerateFunctionServiceImpl
- * date: 2021/1/17 20:29
- * author: coderman
- * version: 1.0
- */ -@Service(value = "dataGenerateFunctionServiceImpl") -public class DataGenerateFunctionServiceImpl implements DataGenerateService { - - @Autowired - private DataValueHandler dataValueHandler; - - @Override - public Object getRandomData(DataSourceFieldRequestBean dataSourceFieldRequestBean) { - Function function = dataSourceFieldRequestBean.getFunction(); - DataBuildRequestFieldRuleBean dataFactoryRequestFieldRuleBean = dataSourceFieldRequestBean.getDataFactoryRequestFieldBean().getDataFactoryRequestFieldRuleBean(); - if (dataFactoryRequestFieldRuleBean == null) { - return function.createOneData(null, null); - } else { - Object value = function.createOneData(dataFactoryRequestFieldRuleBean.getDepencyFunctionMethod(), dataFactoryRequestFieldRuleBean.getDepencyFunctionMethodParam()); - return dataValueHandler.handleValue(value,dataFactoryRequestFieldRuleBean); - } - } -} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataGenerateRemoteServiceImpl.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataGenerateRemoteServiceImpl.java deleted file mode 100644 index 020c160285d6fbabd65db1a0afcb8c20b7e3a86c..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataGenerateRemoteServiceImpl.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.coderman.tianhua.datafactory.core.service.impl; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.coderman.tianhua.datafactory.core.bean.DataBuildRequestFieldBean; -import com.coderman.tianhua.datafactory.core.bean.DataSourceFieldRequestBean; -import com.coderman.tianhua.datafactory.core.service.DataGenerateService; -import com.coderman.tianhua.datafactory.core.service.DataSourceService; -import com.coderman.utils.response.ResultDataDto; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.security.SecureRandom; - -/** - * description: DataGenerateRemoteServiceImpl
- * date: 2021/1/17 20:29
- * author: coderman
- * version: 1.0
- */ -@Service(value = "dataGenerateRemoteServiceImpl") -@Slf4j -public class DataGenerateRemoteServiceImpl implements DataGenerateService { - - @Autowired - private DataSourceService dataSourceService; - - @Override - public Object getRandomData(DataSourceFieldRequestBean dataSourceFieldRequestBean ) { - String dataSourceCode = dataSourceFieldRequestBean.getDataFactoryRequestFieldBean().getDataSourceCode(); -//从远程数据工厂-数据源获取数据 - ResultDataDto resultDataDto = null; - try { - resultDataDto = dataSourceService.getDataSourceDetail(dataSourceCode); - } catch (Exception e) { - e.printStackTrace(); - } - if (resultDataDto == null || !resultDataDto.isSuccess()) { - log.error("从数据工厂-数据源获取数据 = {}", JSON.toJSONString(resultDataDto)); - return null; - } - - String jsonValue = resultDataDto.getData(); - - //通过json字段解析,这里提供的数据源必须是数组形式 - JSONArray jsonArray = JSONObject.parseArray(jsonValue); - DataBuildRequestFieldBean dataFactoryRequestFieldBean = dataSourceFieldRequestBean.getDataFactoryRequestFieldBean(); - String dataSourceField = dataFactoryRequestFieldBean.getDataSourceField(); - //数组循环解析 - if (dataSourceField.contains("\\.")) { - - } else { - SecureRandom secureRandom = dataSourceFieldRequestBean.getRandom(); - int index = secureRandom.nextInt(jsonArray.size()); - JSONObject jsonObject = jsonArray.getJSONObject(index); - String fieldType = dataFactoryRequestFieldBean.getFieldTypeStr(); - switch (fieldType) { - case "short": - return jsonObject.getShortValue(dataSourceField); - case "Short": - return jsonObject.getShort(dataSourceField); - case "int": - return jsonObject.getIntValue(dataSourceField); - case "Integer": - return jsonObject.getInteger(dataSourceField); - case "long": - return jsonObject.getLongValue(dataSourceField); - case "Long": - return jsonObject.getLong(dataSourceField); - case "String": - return jsonObject.getString(dataSourceField); - case "list": - break; - case "set": - break; - case "map": - break; - default: - - } - } - return null; - } -} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataSourceDetailServiceImpl.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataSourceDetailServiceImpl.java deleted file mode 100644 index fc358e2df0718b4e51bf63dd7d14d1fd5484b133..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataSourceDetailServiceImpl.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.coderman.tianhua.datafactory.core.service.impl; - -import com.coderman.utils.bean.CglibConvertService; -import com.coderman.utils.response.ResultDataDto; -import com.coderman.utils.response.ResultDto; -import com.coderman.tianhua.datafactory.core.entity.DataSourceDetailEntity; -import com.coderman.tianhua.datafactory.core.mapper.DataSourceDetailMapper; -import com.coderman.tianhua.datafactory.core.service.DataSourceDetailService; -import com.coderman.tianhua.datafactory.core.vo.DataSourceDetailVO; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; - - -/** - * @Description:数据源详情表Service接口实现类 - * @Author:fanchunshuai - * @CreateTime:2020-12-02 23:07:13 - * @version v1.0 - */ -@Service -@Slf4j -public class DataSourceDetailServiceImpl implements DataSourceDetailService { - - - @Resource - private DataSourceDetailMapper dataSourceDetailMapper; - - @Autowired - private CglibConvertService cglibConvertService; - - @Override - public ResultDto save(DataSourceDetailVO dataSourceDetailVo) throws Exception{ - ResultDto resultDto = new ResultDto(); - DataSourceDetailEntity dataSourceDetailEntity = cglibConvertService.copyPropertity(DataSourceDetailEntity.class,dataSourceDetailVo); - dataSourceDetailMapper.insert(dataSourceDetailEntity); - return resultDto; - } - - @Override - public ResultDto delete(Long id) { - ResultDto resultDto = new ResultDto(); - log.info("dataSourceDetailService.delete,id="+id); - dataSourceDetailMapper.deleteById(id); - return resultDto; - } - - @Override - public ResultDataDto getById(Long id) throws Exception { - ResultDataDto resultDataDto = new ResultDataDto(); - DataSourceDetailEntity dataSourceDetailEntity = dataSourceDetailMapper.getById(id); - DataSourceDetailVO dataSourceDetailVo = cglibConvertService.copyPropertity(DataSourceDetailVO.class,dataSourceDetailEntity); - resultDataDto.setData(dataSourceDetailVo); - return resultDataDto; - } - - @Override - public ResultDataDto> getAll() throws Exception { - ResultDataDto> resultDataDto = new ResultDataDto>(); - //todo impl code - return resultDataDto; - } - - @Override - public ResultDto update(DataSourceDetailVO dataSourceDetailVo) throws Exception { - ResultDto resultDto = new ResultDto(); - DataSourceDetailEntity dataSourceDetailEntity = cglibConvertService.copyPropertity(DataSourceDetailEntity.class,dataSourceDetailVo); - dataSourceDetailMapper.update(dataSourceDetailEntity); - return resultDto; - } - -} \ No newline at end of file diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataSourceServiceImpl.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataSourceServiceImpl.java deleted file mode 100644 index c4630811e70df94b7b21a5ef521dea08e63471df..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/service/impl/DataSourceServiceImpl.java +++ /dev/null @@ -1,225 +0,0 @@ -package com.coderman.tianhua.datafactory.core.service.impl; - -import com.alibaba.fastjson.JSON; -import com.coderman.tianhua.datafactory.core.bean.DataSourceQueryDTO; -import com.coderman.tianhua.datafactory.core.entity.DataSourceDetailEntity; -import com.coderman.tianhua.datafactory.core.entity.DataSourceEntity; -import com.coderman.tianhua.datafactory.core.enums.DataSourceTypeEnum; -import com.coderman.tianhua.datafactory.core.enums.VisitStrategyEnums; -import com.coderman.tianhua.datafactory.core.mapper.DataSourceDetailMapper; -import com.coderman.tianhua.datafactory.core.mapper.DataSourceMapper; -import com.coderman.tianhua.datafactory.core.service.ConfigServiceWrapper; -import com.coderman.tianhua.datafactory.core.service.DataSourceService; -import com.coderman.tianhua.datafactory.core.vo.DataSourceVO; -import com.coderman.utils.bean.CglibConvertService; -import com.coderman.utils.kvpair.KVPair; -import com.coderman.utils.response.ResultDataDto; -import com.coderman.utils.response.ResultDto; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.client.RestTemplate; - -import javax.annotation.Resource; -import java.util.List; -import java.util.concurrent.TimeUnit; - - -/** - * @version v1.0 - * @Description:数据源管理表Service接口实现类 - * @Author:fanchunshuai - * @CreateTime:2020-12-02 23:07:13 - */ -@Service -@Slf4j -public class DataSourceServiceImpl implements DataSourceService { - - - @Resource - private DataSourceMapper dataSourceMapper; - - @Autowired - private CglibConvertService cglibConvertService; - - @Resource - private DataSourceDetailMapper dataSourceDetailMapper; - - @Autowired - private ConfigServiceWrapper configServiceWrapper; - - @Autowired - private RestTemplate restTemplate; - - - /** - * 初始化缓存,key:datasource - * value:对应的数据内容,json字符串 - */ - private static final Cache dataSourceCache = Caffeine.newBuilder() - .expireAfterWrite(15, TimeUnit.SECONDS) - .maximumSize(10_000) - .build(); - - @Override - @Transactional(rollbackFor = Exception.class) - public ResultDto save(DataSourceVO dataSourceVo) throws Exception { - - if (dataSourceVo.getSourceType().intValue() == DataSourceTypeEnum.FROM_NACOS.getCode()) { - dataSourceVo.setSourceCode(dataSourceVo.getDataId() + "." + dataSourceVo.getGroupId()); - } - //check - DataSourceEntity oldEntity = dataSourceMapper.getBySourceCode(dataSourceVo.getSourceCode()); - if (oldEntity != null) { - return ResultDto.setParamErrorMsg("sourceCode重复!"); - } - - ResultDto resultDto = new ResultDto(); - DataSourceEntity dataSourceEntity = cglibConvertService.copyPropertity(DataSourceEntity.class, dataSourceVo); - //本地缓存 - if (dataSourceEntity.getVisitStrategy().intValue() == VisitStrategyEnums.LOCAL_CACHE.getCode()) { - //存储--枚举类型 - if (dataSourceEntity.getSourceType().intValue() == DataSourceTypeEnum.FROM_ENUM.getCode() - || dataSourceEntity.getSourceType().intValue() == DataSourceTypeEnum.FROM_CUSTOM.getCode()) { - dataSourceMapper.insert(dataSourceEntity); - DataSourceDetailEntity dataSourceDetailEntity = new DataSourceDetailEntity(); - dataSourceDetailEntity.setDataContentJson(dataSourceVo.getDataContentJson()); - dataSourceDetailEntity.setDataSourceId(dataSourceEntity.getId()); - dataSourceDetailMapper.insert(dataSourceDetailEntity); - return resultDto; - } - } - - dataSourceMapper.insert(dataSourceEntity); - return resultDto; - } - - @Override - public ResultDto delete(Long id) { - ResultDto resultDto = new ResultDto(); - log.info("dataSourceService.delete,id=" + id); - dataSourceMapper.deleteById(id); - return resultDto; - } - - @Override - public ResultDataDto getById(Long id) throws Exception { - ResultDataDto resultDataDto = new ResultDataDto(); - DataSourceEntity dataSourceEntity = dataSourceMapper.getById(id); - if (dataSourceEntity == null) { - return resultDataDto.setInvokeErrorMsg("查询数据为空!"); - } - DataSourceVO dataSourceVo = cglibConvertService.copyPropertity(DataSourceVO.class, dataSourceEntity); - if (dataSourceEntity.getVisitStrategy().intValue() == VisitStrategyEnums.LOCAL_CACHE.getCode()) { - //存储--枚举类型 - if (dataSourceEntity.getSourceType().intValue() == DataSourceTypeEnum.FROM_ENUM.getCode() - || dataSourceEntity.getSourceType().intValue() == DataSourceTypeEnum.FROM_CUSTOM.getCode()) { - DataSourceDetailEntity dataSourceDetailEntity = dataSourceDetailMapper.getByDataSourceId(dataSourceEntity.getId()); - dataSourceVo.setDataContentJson(dataSourceDetailEntity.getDataContentJson()); - } - } - - if (dataSourceEntity.getSourceType().intValue() == DataSourceTypeEnum.FROM_NACOS.getCode()) { - String sourceCode = dataSourceEntity.getSourceCode(); - String groupId = sourceCode.substring(sourceCode.lastIndexOf(".") + 1); - String dataId = sourceCode.substring(0, sourceCode.lastIndexOf(".")); - String content = configServiceWrapper.getConfig(dataId, groupId); - dataSourceVo.setDataContentJson(content); - } - - resultDataDto.setData(dataSourceVo); - return resultDataDto; - } - - @Override - public ResultDataDto> getAll() throws Exception { - ResultDataDto> resultDataDto = new ResultDataDto>(); - List dataSourceEntityList = dataSourceMapper.getAll(); - List dataSourceVOList = cglibConvertService.copyPropertities(DataSourceVO.class, dataSourceEntityList); - resultDataDto.setData(dataSourceVOList); - return resultDataDto; - } - - @Override - public ResultDto update(DataSourceVO dataSourceVo) throws Exception { - ResultDto resultDto = new ResultDto(); - DataSourceEntity dataSourceEntity = cglibConvertService.copyPropertity(DataSourceEntity.class, dataSourceVo); - dataSourceMapper.update(dataSourceEntity); - return resultDto; - } - - @Override - public ResultDataDto getDataSourceDetail(String dataSourceCode) throws Exception { - ResultDataDto resultDataDto = new ResultDataDto(); - - String dataContent = dataSourceCache.getIfPresent(dataSourceCode); - if(StringUtils.isNotBlank(dataContent)){ - resultDataDto.setData(dataContent); - return resultDataDto; - } - DataSourceEntity dataSourceEntity = dataSourceMapper.getBySourceCode(dataSourceCode); - if (dataSourceEntity == null) { - return ResultDataDto.setNullErrorMsg("查询数据为空!"); - } - - //本地持久化 - if (dataSourceEntity.getVisitStrategy().intValue() == VisitStrategyEnums.LOCAL_CACHE.getCode()) { - DataSourceDetailEntity dataSourceDetailEntity = dataSourceDetailMapper.getByDataSourceId(dataSourceEntity.getId()); - if (dataSourceDetailEntity == null || StringUtils.isEmpty(dataSourceDetailEntity.getDataContentJson())) { - return ResultDataDto.setNullErrorMsg("查询数据为空!"); - } - dataSourceCache.put(dataSourceCode,dataSourceDetailEntity.getDataContentJson()); - return resultDataDto.setData(dataSourceDetailEntity.getDataContentJson()); - } - //todo 远程动态获取---springboot http协议优先支持 dubbo泛化调用支持tcp协议 - //这里配置的数据源默认时全量,如果需要参数则需要DataFactoryRequestFieldRuleBean2定义远程访问接口的参数和value进行动态获取, - // 暂时先不支持 - //这里先支持全量数据的动态获取,默认进行缓存 - - //todo 2.service api对接 - else { - //nacos数据源 - if (dataSourceEntity.getSourceType().intValue() == DataSourceTypeEnum.FROM_NACOS.getCode()) { - String groupId = dataSourceCode.substring(dataSourceCode.lastIndexOf(".") + 1); - String dataId = dataSourceCode.substring(0, dataSourceCode.lastIndexOf(".")); - List> list = configServiceWrapper.getConfigList(dataId, groupId); - dataSourceCache.put(dataSourceCode,JSON.toJSONString(list)); - return resultDataDto.setData(JSON.toJSONString(list)); - } else if (dataSourceEntity.getSourceType().intValue() == DataSourceTypeEnum.FROM_SERVICE_API.getCode()) { - ResultDataDto remoteResultDataDto = restTemplate.getForObject(dataSourceEntity.getUrl(), ResultDataDto.class); - dataSourceCache.put(dataSourceCode,JSON.toJSONString(remoteResultDataDto.getData())); - return resultDataDto.setData(JSON.toJSONString(remoteResultDataDto.getData())); - } - } - - return ResultDataDto.setNullErrorMsg("查询数据为空!"); - } - - @Override - public ResultDto updateStatus(Long id, Integer status) { - int rows = dataSourceMapper.updateStatus(id, status); - if(rows == 1){ - return new ResultDto(); - }else { - return ResultDto.setErrorCodeMsg("更新失败"); - } - } - - @Override - public ResultDataDto> getPage(DataSourceQueryDTO dataSourceQueryDTO) { - List dataSourceEntityList = dataSourceMapper.getPage(dataSourceQueryDTO); - ResultDataDto> resultDataDto = new ResultDataDto(); - try { - List dataSourceVOList = cglibConvertService.copyPropertities(DataSourceVO.class,dataSourceEntityList); - return resultDataDto.setData(dataSourceVOList); - } catch (Exception e) { - e.printStackTrace(); - } - return resultDataDto.setInvokeErrorMsg("查询失败"); - } - -} \ No newline at end of file diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/vo/DataSourceVO.java b/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/vo/DataSourceVO.java deleted file mode 100644 index 3dacb22d0807277beab5fedd684a19c34f87ee4e..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/vo/DataSourceVO.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.coderman.tianhua.datafactory.core.vo; - -import lombok.Data; -import lombok.ToString; - -import java.util.Date; -import java.util.List; - -/** -* @Description:数据源管理表VO类 -* @Author:fanchunshuai -* @CreateTime:2020-12-02 23:07:13 -* @version v1.0 -*/ -@Data -@ToString -public class DataSourceVO{ - - - /** 主键 **/ - private Long id; - - /** 数据源名称 **/ - private String sourceName; - - /** 数据源code,唯一 **/ - private String sourceCode; - - /** 数据源类型/(nacos,api,enum) **/ - private Integer sourceType; - - /** 数据源提供来源 **/ - private String providerSrc; - - /** 访问token **/ - private String token; - - /** 数据源访问url **/ - private String url; - - /** 状态(0正常,1过期) **/ - private Integer status; - - /** 访问策略(0动态获取/1本地缓存) **/ - private Integer visitStrategy; - - /** 创建时间 **/ - private Date createTime; - - /** 修改时间 **/ - private Date updateTime; - - /** 创建人id **/ - private Long createUserId; - - /** 修改人id **/ - private Long updateUserId; - - - /** 数据源内容 **/ - private String dataContentJson; - - - /** - * nacos - */ - private String groupId; - private String dataId; - - -} \ No newline at end of file diff --git a/datafactory-core/src/main/resources/mapper/DataSourceDetailMapper.xml b/datafactory-core/src/main/resources/mapper/DataSourceDetailMapper.xml deleted file mode 100644 index cf89e91bd6edd17c3343dc1c1d1492833474d19a..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/resources/mapper/DataSourceDetailMapper.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - id,data_source_id,data_content_json - - - - insert into data_source_detail( - data_source_id,data_content_json - ) - values( - #{dataSourceId},#{dataContentJson} - ) - - - - update data_source_detail - set - data_source_id=#{dataSourceId},data_content_json=#{dataContentJson} - where id = #{id} - - - - - - - - delete from data_source_detail where id = #{id} - - - - - diff --git a/datafactory-core/src/main/resources/mapper/DataSourceMapper.xml b/datafactory-core/src/main/resources/mapper/DataSourceMapper.xml deleted file mode 100644 index 6b34fd0393d14cd664cea1152c238d5056a0db0a..0000000000000000000000000000000000000000 --- a/datafactory-core/src/main/resources/mapper/DataSourceMapper.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - id,source_name,source_code,source_type,provider_src,token,url,status,visit_strategy,create_time,update_time,create_user_id,update_user_id - - - - insert into data_source( - source_name , source_code, source_type,provider_src,token,url,status,visit_strategy,create_time,update_time,create_user_id,update_user_id) - values (#{sourceName},#{sourceCode},#{sourceType},#{providerSrc},#{token},#{url},#{status},#{visitStrategy},#{createTime},#{updateTime},#{createUserId},#{updateUserId}) - - - - update data_source - set - source_name=#{sourceName},source_code=#{sourceCode},source_type=#{sourceType},provider_src=#{providerSrc},token=#{token},url=#{url},status=#{status},visit_strategy=#{visitStrategy},create_time=#{createTime},update_time=#{updateTime},create_user_id=#{createUserId},update_user_id=#{updateUserId} - where id = #{id} - - - - - - - - delete from data_source where id = #{id} - - - - - - update data_source set - status=#{status} where id = #{id} - - - - - - diff --git "a/doc/img/web/api\347\225\214\351\235\242.png" "b/doc/img/web/api\347\225\214\351\235\242.png" new file mode 100644 index 0000000000000000000000000000000000000000..3ac91e0d62ac601f5566481f3ac94fa561c16a61 Binary files /dev/null and "b/doc/img/web/api\347\225\214\351\235\242.png" differ diff --git "a/doc/img/web/\344\270\232\345\212\241\346\250\241\345\236\213.png" "b/doc/img/web/\344\270\232\345\212\241\346\250\241\345\236\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..437d63fc57f45caf15eec75aa06b1c50e5a505ef Binary files /dev/null and "b/doc/img/web/\344\270\232\345\212\241\346\250\241\345\236\213.png" differ diff --git "a/doc/img/web/\346\216\245\345\217\243\345\207\272\345\217\202mock.png" "b/doc/img/web/\346\216\245\345\217\243\345\207\272\345\217\202mock.png" new file mode 100644 index 0000000000000000000000000000000000000000..36054145a20d34843f9ff380eb0a5b3a93491fe7 Binary files /dev/null and "b/doc/img/web/\346\216\245\345\217\243\345\207\272\345\217\202mock.png" differ diff --git "a/doc/img/web/\346\225\260\346\215\256\346\272\220\347\256\241\347\220\206.png" "b/doc/img/web/\346\225\260\346\215\256\346\272\220\347\256\241\347\220\206.png" new file mode 100644 index 0000000000000000000000000000000000000000..b734d8518cbc23908a39053cb0abdaea5c3adc49 Binary files /dev/null and "b/doc/img/web/\346\225\260\346\215\256\346\272\220\347\256\241\347\220\206.png" differ diff --git "a/doc/img/web/\346\250\241\345\236\213\345\220\216\347\274\200\351\205\215\347\275\256.png" "b/doc/img/web/\346\250\241\345\236\213\345\220\216\347\274\200\351\205\215\347\275\256.png" new file mode 100644 index 0000000000000000000000000000000000000000..c2a4d875b239f9c64d98a82d1ca22c944ab7657e Binary files /dev/null and "b/doc/img/web/\346\250\241\345\236\213\345\220\216\347\274\200\351\205\215\347\275\256.png" differ diff --git "a/doc/img/web/\350\241\250\346\250\241\345\236\213\347\256\241\347\220\206.png" "b/doc/img/web/\350\241\250\346\250\241\345\236\213\347\256\241\347\220\206.png" new file mode 100644 index 0000000000000000000000000000000000000000..b438ab4c54a9435bfd59308696a13092d36122d6 Binary files /dev/null and "b/doc/img/web/\350\241\250\346\250\241\345\236\213\347\256\241\347\220\206.png" differ diff --git "a/doc/img/web/\351\246\226\351\241\2651.png" "b/doc/img/web/\351\246\226\351\241\2651.png" new file mode 100644 index 0000000000000000000000000000000000000000..746d35145f644c4f36268b6db536d349336326fa Binary files /dev/null and "b/doc/img/web/\351\246\226\351\241\2651.png" differ diff --git "a/doc/img/\346\225\260\346\215\256\345\267\245\345\216\2022.0\345\272\224\347\224\250\346\236\266\346\236\204\345\233\276.png" "b/doc/img/\346\225\260\346\215\256\345\267\245\345\216\2022.0\345\272\224\347\224\250\346\236\266\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..f0705fa285714e72cd5efb9b8da7eef79594eec9 Binary files /dev/null and "b/doc/img/\346\225\260\346\215\256\345\267\245\345\216\2022.0\345\272\224\347\224\250\346\236\266\346\236\204\345\233\276.png" differ diff --git "a/doc/img/\346\225\260\346\215\256\345\267\245\345\216\2022.0\346\212\200\346\234\257\346\236\266\346\236\204.png" "b/doc/img/\346\225\260\346\215\256\345\267\245\345\216\2022.0\346\212\200\346\234\257\346\236\266\346\236\204.png" new file mode 100644 index 0000000000000000000000000000000000000000..1ea9a46e8e8cb75ff68f859d228a367658745b9b Binary files /dev/null and "b/doc/img/\346\225\260\346\215\256\345\267\245\345\216\2022.0\346\212\200\346\234\257\346\236\266\346\236\204.png" differ diff --git a/sql/data-factory.sql b/doc/sql/data-factory1.0.sql similarity index 100% rename from sql/data-factory.sql rename to doc/sql/data-factory1.0.sql diff --git a/doc/sql/datafactory-db2.0.sql b/doc/sql/datafactory-db2.0.sql new file mode 100644 index 0000000000000000000000000000000000000000..ac83844f38a7ba2336464d653b1911f71d513c2e --- /dev/null +++ b/doc/sql/datafactory-db2.0.sql @@ -0,0 +1,253 @@ +/* +SQLyog Ultimate v11.24 (32 bit) +MySQL - 5.7.21-log : Database - data_factory +********************************************************************* +*/ + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +CREATE DATABASE /*!32312 IF NOT EXISTS*/`data_factory` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; + +USE `data_factory`; + +/*Table structure for table `api_model` */ + +CREATE TABLE `api_model` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `project_code` varchar(50) NOT NULL DEFAULT '' COMMENT '项目名称', + `api_url` varchar(500) NOT NULL DEFAULT '' COMMENT 'api信息', + `api_type` varchar(50) NOT NULL DEFAULT '' COMMENT 'api信息', + `api_return_value` varchar(500) NOT NULL DEFAULT '' COMMENT 'api返回值集合', + `api_sign` varchar(500) NOT NULL DEFAULT '' COMMENT 'api签名信息', + `api_doc` varchar(500) NOT NULL DEFAULT '' COMMENT 'api描述', + `return_wrap_type` int(11) DEFAULT '0' COMMENT 'api包装返回类型', + `mock_count` int(11) DEFAULT '1' COMMENT '进行接口mock数据的时候接口返回的数据条数', + `method_type` varchar(500) NOT NULL DEFAULT '' COMMENT '请求方式', + `request_param` json DEFAULT NULL COMMENT '请求参数元信息', + `return_param` json DEFAULT NULL COMMENT '响应参数元信息', + `status` int(11) NOT NULL DEFAULT '0' COMMENT 'api状态', + `date_create` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00' COMMENT '创建时间', + `date_update` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00' COMMENT '修改时间', + `update_user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '修改人', + `create_user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='API数据表'; + +/*Data for the table `api_model` */ + +/*Table structure for table `column_model` */ + +CREATE TABLE `column_model` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `table_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属数据库', + `column_name` varchar(50) NOT NULL DEFAULT '' COMMENT '字段名称', + `column_comment` varchar(500) NOT NULL DEFAULT '' COMMENT '字段描述', + `column_length` int(11) NOT NULL DEFAULT '0' COMMENT '字段长度', + `column_type` varchar(50) NOT NULL DEFAULT '' COMMENT '字段类型', + `not_null` int(11) NOT NULL DEFAULT '0' COMMENT '是否可为空', + `default_value` varchar(500) NOT NULL DEFAULT '' COMMENT '默认值', + `status` int(11) NOT NULL DEFAULT '0' COMMENT '状态', + `uniq_column` int(11) NOT NULL DEFAULT '0' COMMENT '是否是唯一键', + `date_create` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00' COMMENT '创建时间', + `date_update` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00' COMMENT '修改时间', + `update_user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '修改人', + `create_user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建人', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_t_c` (`table_id`,`column_name`) COMMENT '联合唯一索引' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='字段模型'; + +/*Data for the table `column_model` */ + +/*Table structure for table `data_source` */ + +CREATE TABLE `data_source` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `source_name` varchar(200) NOT NULL DEFAULT '' COMMENT '数据源名称', + `source_code` varchar(200) NOT NULL DEFAULT '' COMMENT '数据源code,唯一', + `source_type` int(11) NOT NULL DEFAULT '0' COMMENT '数据源类型/(nacos,api,enum)', + `provider_service` varchar(200) NOT NULL DEFAULT '' COMMENT '数据源提供来源', + `struct_type` varchar(400) DEFAULT '' COMMENT '数据源返回格式', + `url` varchar(400) NOT NULL DEFAULT '' COMMENT '数据源访问url', + `status` int(11) NOT NULL DEFAULT '0' COMMENT '状态(0正常,1过期)', + `regist_server` varchar(200) NOT NULL DEFAULT '' COMMENT '注册中心', + `provider_domain_url` varchar(200) NOT NULL DEFAULT '' COMMENT '服务提供者域名', + `visit_strategy` int(11) NOT NULL DEFAULT '0' COMMENT '访问策略(0动态获取/1本地缓存)', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + `create_user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建人id', + `update_user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '修改人id', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8mb4 COMMENT='数据源管理表'; + +/*Data for the table `data_source` */ + +insert into `data_source`(`id`,`source_name`,`source_code`,`source_type`,`provider_service`,`struct_type`,`url`,`status`,`regist_server`,`provider_domain_url`,`visit_strategy`,`create_time`,`update_time`,`create_user_id`,`update_user_id`) values (15,'身份证号','com.datafactory.user.cardnumber',5,'data-factory',NULL,'datafactory',0,'0','datafactory',3,'2022-09-06 21:25:53','2022-09-06 21:25:53',1,1),(16,'日期','com.datafactory.date.date',5,'data-factory',NULL,'datafactory',0,'0','datafactory',3,'2022-09-06 21:26:01','2022-09-06 21:26:01',1,1),(17,'姓名','com.datafactory.user.chineseName',5,'data-factory',NULL,'datafactory',0,'0','datafactory',3,'2022-09-06 21:26:07','2022-09-06 21:26:07',1,1),(24,'电话号码','com.datafactory.user.telphone',5,'data-factory','','datafactory',0,'0','datafactory',3,'2022-09-06 22:27:03','2022-09-06 22:27:03',1,1),(25,'随机数','com.datafactory.user.getRandom',5,'data-factory','','datafactory',0,'0','datafactory',3,'2022-09-06 22:27:16','2022-09-06 22:27:16',1,1),(26,'星期','com.datafactory.common.week',3,'data-factory','','datafactory',0,'0','datafactory',1,'2022-09-12 16:13:36','2022-09-12 16:13:36',1,1),(27,'评论信息','com.datafactory.user.comment',5,'data-factory',NULL,'data-factory',0,'0','data-factory',3,'2022-09-12 16:12:25','2022-09-12 16:12:25',1,1),(28,'英文名单词','com.datafactory.user.oneEnWord',5,'data-factory',NULL,'data-factory',0,'0','data-factory',3,'2022-09-12 16:13:18','2022-09-12 16:13:18',1,1),(30,'随机浮点数','com.datafactory.random.float',5,'data-factory','VOID','xxxx',0,'0','xxx',3,'2022-09-17 23:13:03','2022-09-17 23:13:03',1,1),(31,'银行卡号','com.datafactory.bank.cardNumber',5,'data-factory','VOID','xxxx',0,'0','xxx',3,'2022-09-17 23:14:58','2022-09-17 23:14:58',1,1),(32,'时间','com.datafactory.date.datetime',5,'data-factory','VOID','xxxxx',0,'0','xxxxx',3,'2022-09-18 16:10:58','2022-09-18 16:10:58',1,1),(33,'UUID','com.datafactory.user.uuid',5,'data-factory','VOID','xxxx',0,'0','xxxx',3,'2022-09-19 22:21:01','2022-09-19 22:21:01',1,1),(34,'SnowflakeId','com.datafactory.user.snowflakeid',5,'data-factory','VOID','xxxx',0,'0','xxx',3,'2022-09-19 22:21:43','2022-09-19 22:21:43',1,1); + +/*Table structure for table `data_source_req_config` */ + +CREATE TABLE `data_source_req_config` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `data_source_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属数据源id', + `param_key` varchar(100) DEFAULT NULL COMMENT '参数key', + `param_value` varchar(500) DEFAULT NULL COMMENT '参数值', + `param_desc` varchar(500) DEFAULT NULL COMMENT '参数描述', + `required` int(11) DEFAULT NULL COMMENT '是否是可选参数', + `interface_param` int(11) DEFAULT NULL COMMENT '是否是接口参数', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COMMENT='数据源请求参数配置'; + + +/*Table structure for table `data_source_resp_config` */ + +CREATE TABLE `data_source_resp_config` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `data_source_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属数据源id', + `field_key` varchar(50) DEFAULT NULL COMMENT '响应id', + `refer_path` varchar(100) DEFAULT NULL COMMENT '请求路径如a.b.c', + `field_desc` varchar(50) DEFAULT NULL COMMENT '数据类型', + `field_type` varchar(50) DEFAULT NULL COMMENT '数据描述', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COMMENT='数据源响应参数配置'; + + +/*Table structure for table `field_model` */ + +CREATE TABLE `field_model` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `field_name` varchar(50) NOT NULL DEFAULT '' COMMENT '属性名称', + `field_type` varchar(50) NOT NULL DEFAULT '' COMMENT '属性类型', + `field_desc` varchar(500) NOT NULL DEFAULT '' COMMENT '属性描述', + `status` int(11) NOT NULL DEFAULT '0' COMMENT '状态', + `field_doc` varchar(500) DEFAULT '' COMMENT '属性中文注释', + `field_ext_json` json DEFAULT NULL COMMENT '关联数据源编码', + `param_class_name` varchar(100) NOT NULL DEFAULT '' COMMENT '参数类名称', + `project_code` varchar(50) NOT NULL DEFAULT '' COMMENT '项目编码', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_p_p_f` (`project_code`,`param_class_name`,`field_name`) COMMENT '联合唯一索引' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='属性模型'; + +/*Data for the table `field_model` */ + +/*Table structure for table `kv_instance` */ + +CREATE TABLE `kv_instance` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `k` varchar(64) NOT NULL DEFAULT '' COMMENT 'key', + `v` tinytext NOT NULL COMMENT 'value值', + `value_json` json DEFAULT NULL, + `group_key` varchar(64) DEFAULT '' COMMENT '分组key', + `parent_key` varchar(64) DEFAULT '' COMMENT '父级key', + `refer_key` varchar(64) DEFAULT '' COMMENT '引用对象key', + `refer_id` varchar(64) DEFAULT '' COMMENT '引用对象实例ID', + `value_type` int(11) DEFAULT '0' COMMENT 'value的Java数据类型', + `key_type` int(11) DEFAULT '0' COMMENT 'key的Java数据类型', + `status` int(11) DEFAULT NULL COMMENT '状态,跟着主对象走', + PRIMARY KEY (`id`), + KEY `idx_key` (`k`), + KEY `idx_group_key` (`group_key`), + KEY `idx_refer_id` (`refer_id`) +) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4; + + +/*Table structure for table `model_mapping_config` */ + +CREATE TABLE `model_mapping_config` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `mapping_class_first` varchar(100) NOT NULL DEFAULT '' COMMENT '对外api参数属性', + `mapping_field_first` varchar(100) NOT NULL DEFAULT '' COMMENT '服务参数属性', + `mapping_class_second` varchar(100) NOT NULL DEFAULT '' COMMENT '数据库实体属性', + `mapping_field_second` varchar(100) NOT NULL DEFAULT '' COMMENT '数据库表字段', + `mapping_type` varchar(50) NOT NULL DEFAULT '' COMMENT '映射类型', + `project_code` varchar(50) NOT NULL DEFAULT '' COMMENT '项目编码', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_a_s_e_c` (`mapping_class_first`,`mapping_field_first`,`mapping_class_second`,`mapping_field_second`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='模型映射表'; + +/*Data for the table `model_mapping_config` */ + +/*Table structure for table `model_suffix_config` */ + +CREATE TABLE `model_suffix_config` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `suffix` varchar(50) NOT NULL DEFAULT '' COMMENT '模型后缀', + `suffix_desc` varchar(500) NOT NULL DEFAULT '' COMMENT '模型后缀描述', + `model_type` varchar(50) NOT NULL DEFAULT '' COMMENT '模型类型', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_s` (`suffix`) COMMENT '联合唯一索引' +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COMMENT='后缀配置表'; + +/*Data for the table `model_suffix_config` */ + +insert into `model_suffix_config`(`id`,`suffix`,`suffix_desc`,`model_type`) values (1,'BO','领域层业务模型','serviceModel'),(2,'DTO','RPC参数模型','apiModel'),(3,'VO','http请求响应模型','apiModel'),(4,'DO','数据库模型','entityModel'),(5,'Event','领域事件','serviceModel'); + +/*Table structure for table `param_model` */ + +CREATE TABLE `param_model` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `project_code` varchar(50) NOT NULL DEFAULT '' COMMENT '项目编码', + `param_class_name` varchar(50) NOT NULL DEFAULT '' COMMENT '参数类名', + `param_class_desc` varchar(500) NOT NULL DEFAULT '' COMMENT '参数类描述', + `module_code` varchar(50) NOT NULL DEFAULT '' COMMENT '所属上下文或模块编码', + `model_suffix` varchar(50) NOT NULL DEFAULT '' COMMENT '模型后缀', + `date_create` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00' COMMENT '创建时间', + `date_update` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00' COMMENT '修改时间', + `update_user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '修改人', + `create_user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建人', + `param_var_name` varchar(50) DEFAULT '' COMMENT '参数模型名称,api引用的时候会用到', + `status` int(11) NOT NULL COMMENT '状态', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_p_p` (`project_code`,`param_class_name`) COMMENT '联合唯一索引' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='参数模型表'; + +/*Data for the table `param_model` */ + +/*Table structure for table `project_config` */ + +CREATE TABLE `project_config` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `project_code` varchar(50) NOT NULL DEFAULT '' COMMENT '项目应用名', + `project_desc` varchar(500) NOT NULL DEFAULT '' COMMENT '应用描述', + `domain_code` varchar(50) NOT NULL DEFAULT '' COMMENT '业务领域编码', + `domain_desc` varchar(50) NOT NULL DEFAULT '' COMMENT '业务领域描述', + `bus_line` varchar(50) NOT NULL DEFAULT '' COMMENT '所属业务线', + `dept_name` varchar(50) NOT NULL DEFAULT '' COMMENT '所属部门', + `date_create` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00' COMMENT '创建时间', + `date_update` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00' COMMENT '修改时间', + `update_user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '修改人', + `create_user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建人', + `status` int(11) NOT NULL DEFAULT '0' COMMENT '状态', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_p` (`project_code`) COMMENT '联合唯一索引' +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='项目配置'; + +/*Data for the table `project_config` */ + +insert into `project_config`(`id`,`project_code`,`project_desc`,`domain_code`,`domain_desc`,`bus_line`,`dept_name`,`date_create`,`date_update`,`update_user_id`,`create_user_id`,`status`) values (1,'data-factory','数据工厂','tianhua','数据工厂平台','tech','技术部','2022-10-05 05:45:47','2022-10-05 05:45:47',1,1,0); + +/*Table structure for table `table_model` */ + +CREATE TABLE `table_model` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `table_name` varchar(50) NOT NULL DEFAULT '' COMMENT '数据库表名', + `table_comment` varchar(500) NOT NULL DEFAULT '' COMMENT '数据库表描述', + `status` int(11) NOT NULL DEFAULT '0' COMMENT '状态', + `db_name` varchar(50) NOT NULL DEFAULT '' COMMENT '数据库名称', + `project_code` varchar(50) NOT NULL DEFAULT '' COMMENT '项目编码', + `date_create` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00' COMMENT '创建时间', + `date_update` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00' COMMENT '修改时间', + `update_user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '修改人', + `create_user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建人', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_p_t` (`project_code`,`table_name`) COMMENT '联合唯一索引' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='表模型'; + +/*Data for the table `table_model` */ + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/doc/sql/truncate-sql.sql b/doc/sql/truncate-sql.sql new file mode 100644 index 0000000000000000000000000000000000000000..607dbbf91f8fc29fa3ae1d1101dc04ce4b8a5a97 --- /dev/null +++ b/doc/sql/truncate-sql.sql @@ -0,0 +1,12 @@ +truncate api_model; +truncate column_model; +truncate field_model; +truncate project_config; +truncate param_model; +truncate table_model; +truncate model_mapping_config; + + +TRUNCATE api_model; +TRUNCATE field_model; +TRUNCATE param_model; \ No newline at end of file diff --git a/doc/uml/datafactory-apimodel.puml b/doc/uml/datafactory-apimodel.puml new file mode 100644 index 0000000000000000000000000000000000000000..c67f5446503d6512503b02e58963947f5e84612d --- /dev/null +++ b/doc/uml/datafactory-apimodel.puml @@ -0,0 +1,160 @@ +@startuml + +package http.api{ + class ApiApi{ + 所属模块名称-api管理:api + 新建api: boolean /api/add(ApiVO apiVO).post + 修改api信息: Boolean /api/update/{id}(ApiVO apiVO).post + 分页查询api信息: List /api/pagelist(ApiQueryVO apiQueryVO).get + 禁用api: Boolean /api/disable/{id}(Long id).post + 启用api: Boolean /api/enable/{id}(Long id).post + 查询api列表: List /api/search(String content ).get + .. extend info .. + templateJsonKey:String modulecrud + } + + class DataSourceApi{ + 所属模块名称-数据源管理:dataSource + 注册数据源: Boolean /datasource/regist(DataSourceVO dataSourceVO).post + 修改数据源: Boolean /datasource/update/{id}(Long id,DataSourceVO dataSourceVO).post + 删除数据源: Boolean /datasource/delete/{id}(Long id).post + 获取单条数据源详情: DataSourceVO /datasource/get/{id}(Long id).get + 分页获取数据源: List /datasource/getpage(DataSourceQueryVO pageVO).get + 启用数据源: Boolean /datasource/enable/{id}(Long id).post + 禁用数据源: Boolean /datasource/disable/{id}(Long id).post + + .. extend info .. + templateJsonKey:String modulecrud + } + + class ModelSuffixConfigApi{ + 所属模块名称-模型后缀管理:moduelSuffix + 新建模型后缀: Boolean /modelsuffix/add(ModelSuffixConfigVO modelSuffixConfigVO).post + 修改模型后缀: Boolean /modelsuffix/update/{id}(Long id).post + 查询列表: List /modelsuffix/list().get + .. extend info .. + templateJsonKey:String modulecrud + } + + class ParamApi{ + 所属模块名称-参数模型管理:paramModel + 新建参数模型: Boolean /parammodel/add(ParamModelVO paramModelVO).post + 获取单条参数模型: ParamModelVO /parammodel/get/{id}(Long id).get + 分页查询参数模型: List /parammodel/pagelist(ParamModelQueryVO pageVO).get + 修改参数模型: Boolean /parammodel/update/{id}(Long id,ParamModelVO paramModelVO).post + .. extend info .. + templateJsonKey:String modulecrud + } + + class ProjectApi{ + 所属模块名称-项目管理:project + 新建项目: Boolean /project/add(ProjectVO projectVO).post + 根据项目编码获取详情: Boolean /project/getByCode/{projectCode}(String projectCode).get + 分页获取项目列表: List /project/pagelist(ProjectQueryVO pageVO).get + 修改项目信息: Boolean /project/update/{id}(Long id, ProjectVO projectVO).post + 搜索项目列表: List /project/search(String content).get + .. extend info .. + templateJsonKey:String modulecrud + } + + + class TableApi{ + 所属模块名称-er数据模型管理:erModel + 新建表结构: Boolean /table/add(TableVO tableVO).post + 根据ID获取详情: TableVO /table/getById/{id}(Long id).get + 分页获取列表: List /table/pagelist(TableQueryVO pageVO).get + 修改er模型: Boolean /table/update/{id}(Long id, TableVO tableVO).post + .. extend info .. + templateJsonKey:String modulecrud + } + + +} + +package http.vo{ + class "表结构模型-TableVO" as TableVO{ + 表名称:String tableName + 表描述:String tableComment + 数据库名称:String dbName + 项目编码:String projectCode + 表字段列表:List columnList + .. extend info .. + searchKeyList:String projectCode,tableName + input-text:String tableName,dbName,tableComment + select:String projectCode + excludeUpdate:String id + excludeInsert:String id + excludePage:String id + excludeDetail:String id + } + + + class "项目信息-ProjectVO" as ProjectVO{ + 项目编码:String projectCode + 项目描述: String projectDesc + 业务领域编码: String domainCode + 业务领域描述: String domainDesc + 所属业务线: String busLine + 所属部门: String deptName + + .. extend info .. + searchKeyList:String projectCode,domainCode,busLine,deptName + input-text:String projectCode,domainCode,busLine,deptName + excludeUpdate:String id + excludeInsert:String id + excludePage:String id + excludeDetail:String id + } + + + class "模型后缀配置-ModelSuffixConfigVO" as ModelSuffixConfigVO{ + 项目编码:String suffix + 项目描述: String desc + 模型类型: String modelType + + .. extend info .. + select: modelType + input-text:String suffix,desc + excludeUpdate:String id + excludeInsert:String id + excludePage:String id + excludeDetail:String id + } + + + class "参数模型-ParamModelVO" as ParamModelVO{ + 模型类名称:String paramClassName + 参数类描述: String classDesc + 所属项目编码: String projectCode + 所属上下文: String moduleCode + 模型后缀:String suffix + + .. extend info .. + select: String suffix,projectCode + input-text:String paramClassName,classDesc + excludeUpdate:String id + excludeInsert:String id + excludePage:String id + excludeDetail:String id + } + + class "api模型-ApiVO" as ApiVO{ + api类型:String apiType + api签名:String apiSign + api返回类型:String returnType + api请求方式:String methodType + api所属项目编码: String projectCode + + .. extend info .. + select: String apiType,projectCode + input-text:String paramClassName,classDesc + excludeUpdate:String id,apiSign + excludeInsert:String id,apiSign + excludePage:String id + excludeDetail:String id + } + + +} + +@enduml \ No newline at end of file diff --git a/doc/uml/datafactory-db.puml b/doc/uml/datafactory-db.puml new file mode 100644 index 0000000000000000000000000000000000000000..d8dc9d6ee2198ef3bb8d6a16d0db8bacf7a1bc10 --- /dev/null +++ b/doc/uml/datafactory-db.puml @@ -0,0 +1,179 @@ +@startuml +' hide the spot +hide circle + +' avoid problems with angled crows feet +skinparam linetype ortho + +entity "project_config 项目配置" as project_config { + id: 主键/bigint(20) unsigned + project_code: 项目应用名/varchar(50) + project_desc: 应用描述/varchar(500) + domain_code: 业务领域编码/varchar(50) + domain_desc: 业务领域描述/varchar(50) + bus_line: 所属业务线/varchar(50) + dept_name: 所属部门/varchar(50) + + date_create: 创建时间/timestamp + date_update: 修改时间/timestamp + update_user_id: 修改人/bigint(20) + create_user_id: 创建人/bigint(20) + --key extend -- + PKey:id + UKey:project_code +} + + + +entity "api_model API数据表" as api_model { + id: 主键/bigint(20) unsigned + project_code: 项目名称/varchar(50) + api_url: api信息/varchar(500) + api_type: api信息/varchar(50) + api_return_value: api返回值集合/varchar(500) + api_sign: api签名信息/varchar(500) + api_doc: api描述/varchar(500) + method_type: 请求方式/varchar(500) + request_param: 请求参数元信息/json + status: api状态/int(11) + date_create: 创建时间/timestamp + date_update: 修改时间/timestamp + update_user_id: 修改人/bigint(20) + create_user_id: 创建人/bigint(20) + --key extend -- + PKey:id + +} + + +entity "param_model 参数模型表" as param_model { + id: 主键/bigint(20) unsigned + project_code: 项目名称/varchar(50) + param_class_name: 参数类名/varchar(50) + param_class_desc: 参数类描述/varchar(500) + module_code: 所属上下文或模块编码/varchar(50) + model_suffix: 模型后缀/varchar(50) + + date_create: 创建时间/timestamp + date_update: 修改时间/timestamp + update_user_id: 修改人/bigint(20) + create_user_id: 创建人/bigint(20) + --key extend -- + PKey:id + UKey:project_code,param_class_name + +} + +entity "table_model 表模型" as table_model{ + id: 主键/bigint(20) unsigned + table_name: 数据库表名/varchar(50) + table_comment: 数据库表描述/varchar(500) + db_name: 数据库名称/varchar(50) + project_code: 项目编码/varchar(50) + + date_create: 创建时间/timestamp + date_update: 修改时间/timestamp + update_user_id: 修改人/bigint(20) + create_user_id: 创建人/bigint(20) + --key extend -- + PKey:id + UKey:project_code,table_name +} + + +entity "column_model 字段模型" as column_model{ + id: 主键/bigint(20) unsigned + table_id: 所属数据库/bigint(20) + + column_name: 字段名称/varchar(50) + column_comment: 字段描述/varchar(500) + column_length: 字段长度/int(11) + column_type: 字段类型/varchar(50) + not_null: 是否可为空/int(11) + default_value: 默认值/varchar(500) + uniq_column: 是否是唯一键/int(11) + + + date_create: 创建时间/timestamp + date_update: 修改时间/timestamp + update_user_id: 修改人/bigint(20) + create_user_id: 创建人/bigint(20) + --key extend -- + PKey:id + UKey:table_id,column_name +} + +entity "model_suffix_config 后缀配置表" as model_suffix_config{ + id: 主键/bigint(20) unsigned + + suffix: 模型后缀/varchar(50) + desc: 模型后缀描述/varchar(500) + model_type: 模型类型/varchar(50) + --key extend -- + PKey:id + UKey:suffix +} + + +entity "model_mapping_config 模型映射表" as model_mapping_config{ + id: 主键/bigint(20) unsigned + + api_param_field: 对外api参数属性/varchar(100) + service_param_field: 服务参数属性/varchar(100) + entity_param_field: 数据库实体属性/varchar(100) + column_field: 数据库表字段/varchar(100) + mapping_type: 映射类型/varchar(50) + project_code: 项目编码/varchar(50) + --key extend -- + PKey:id + UKey:api_param_field,service_param_field,entity_param_field,column_field +} + + +entity "field_model 属性模型" as field_model{ + + id: 主键/bigint(20) unsigned + field_name: 属性名称/varchar(50) + field_desc: 属性描述/varchar(500) + field_doc: 属性中文注释/varchar(500) + data_source_code: 关联数据源编码/varchar(100) + param_class_name: 参数类名称/varchar(100) + project_code: 项目编码/varchar(50) + --key extend -- + PKey:id + UKey:project_code,param_class_name,field_name +} + +entity " data_source_detail 数据源详情表" as data_source_detail { + id: 主键/bigint(20) unsigned + data_source_id: 所属数据源id/bigint(20) + data_content_json: 数据源内容/text + --key extend -- + PKey:id +} + +entity " data_source 数据源管理表" as data_source { + id: 主键/bigint(20) unsigned + source_name: 数据源名称/varchar(200) + source_code: 数据源code,唯一/varchar(200) + source_type: 数据源类型/(nacos,api,enum)/int(11) + provider_src: 数据源提供来源/varchar(200) + tokent: 访问token/varchar(400) + url: 数据源访问url/varchar(400) + status: 状态(0正常,1过期)/int(11) + visit_strategy: 访问策略(0动态获取/1本地缓存)/int(11) + create_time: 创建时间/timestamp + update_time: 修改时间/timestamp + create_user_id: 创建人id/bigint(20) + update_user_id: 修改人id/bigint(20) + --key extend -- + PKey:id + UKey:source_code +} + + + +data_source ||--o{ data_source_detail + + +@enduml \ No newline at end of file diff --git a/doc/uml/datafactory-domain.puml b/doc/uml/datafactory-domain.puml new file mode 100644 index 0000000000000000000000000000000000000000..e322002e8c0309d97c553f46b4c6ad1eb70d7336 --- /dev/null +++ b/doc/uml/datafactory-domain.puml @@ -0,0 +1,169 @@ +@startuml + +package domain.bo{ + + class "项目基本信息-ProjectBO" as ProjectBO{ + 项目应用名: String projectCode + 应用描述: String projectDesc + 业务领域编码: String domainCode + 业务领域描述: String domainDesc + app描述: String appDesc + 所属业务线: String busLine + 所属部门: String deptName + 项目api列表: List apiList + } + + class "参数模型信息-ParamModelBO" as ParamModelBO{ + 模型类名称: String paramClassName + 参数类描述: String classDesc + 所属项目名称: String projectCode + 属性列表: List fieldBeanList + 主键: Long id + 所属上下文或模块编码: String moduleCode + 参数类描述: String paramClassDesc + 参数属性集合json: String paramFieldJson + 模型基本信息: ModelSuffixConfigBO modelSuffixConfigBO + 是否是模型参数:boolean isModelType() + 是否是泛型参数:boolean isGeneralType + 参数映射模型: List modelMappingBOList + + + } + + + class "数据库table模型信息-TableBO" as TableBO{ + 数据库表名: String tableName + 数据库表描述: String tableComment + 数据库名称: String dbName + 项目编码: String projectCode + 数据库字段列表: List columnList + } + + class "数据库column模型信息-ColumnBO" as ColumnBO{ + 字段名称: String columnName + 字段描述: String columnComment + 字段长度: String length + 字段类型:String columnType + 字段是否为空: boolean isnull + 字段默认值: String defaultValue + 数据库编码: String tableName + 是否唯一键:boolean uniqColumn + } + + class "api模型信息-ApiBO" as ApiBO{ + api类型:String apiType + api签名:String apiSign + api返回类型:String returnType + api请求方式:String methodType + api返回值集合:List returnValueList + api参数列表:List paramList + api参数可选值列表:Map> paramDefaultValueList + api状态:Integer status + api所属项目编码:String projectCode + + } + + class "模型后缀信息-ModelSuffixConfigBO" as ModelSuffixConfigBO{ + 模型后缀: String suffix + 模型后缀描述: String desc + 模型类型: String modelType + } + + class "模型映射信息-ModelMappingBO" as ModelMappingBO{ + 对外api参数属性: String apiParamField + 服务参数属性: String serviceParamField + 数据库实体属性: String entityParamField + 数据库表字段: String columnField + 映射类型: String mappingType + 项目编码: String projectCode + } + + class "属性基本信息-FieldBO" as FieldBO { + 属性名称: String fieldName + 属性描述: String fieldDesc + 属性中文注释: String fieldDoc + 关联数据源编码:String dataSourceCode + 参数类名称: String paramClassName + 默认值列表: List defaultValueList + + } +} + +package domain.enums{ + enum "api类型-ApiTypeEnum" as ApiTypeEnum{ + HTTP_API("httpApi","对外开放的http协议接口") + RPC_API("rpcApi","对外开放的rpc协议的接口") + SERVICE_API("serviceApi","服务内部的Service接口,包括所有方法") + api类型code:String type + api类型描述:String desc + + } + + enum "模型类型-ModelTypeEnum" as ModelTypeEnum{ + API_MODEL("apiModel","api请求响应模型"), + SERVICE_MODEL("serviceModel","服务内部模型"), + ENTITY_MODEL("entityModel","数据库实体模型"), + DB_MODEL("dbModel","数据库er模型"); + 模型类型code:String type + 模型类型描述:String desc + + } + + enum "模型映射类型-ModelValueMappingType" as ModelValueMappingType{ + JSON_MAPPING("jsonMapping","json结构映射"), + ENUM_MAPPING("enumMapping","enum映射"), + KEY_MAPPING("keyMapping","map数据结构的key映射"), + VALUE_MAPPING("valueMapping","map数据结构的value映射,或者set,list映射到一个字段,或者一个字段映射到set,list"), + DIRECT_MAPPING("directMapping","直接映射,前提是类型相同"), + + 模型类型code:String type + 模型类型描述:String desc + + } +} + + +package domain.repository { + + interface "项目api仓库-ProjectRepository" as ProjectRepository{ + 保存项目&api:boolean save(ProjectBO projectBO) + 修改项目&api:boolean update(ProjectBO projectBO) + 获取项目信息聚合接口:ProjectBO getByCode(String projectCode) + } + + interface "项目api查询仓库-ProjectQueryRepository" as ProjectRepository{ + 获取api信息:List getApiListByCode(String projectCode) + 搜索api信息:List searchApi(String projectCode) + 分页查询api列表:List queryApiPage(PageBO pageBO) + 获取单条api: ApiBO getBySign(String methodSign) + + 获取项目信息:ProjectBO getProjectByCode(String projectCode) + 搜索项目信息:List searchProject(String projectCode) + 分页查询项目列表:List queryProjectPage(PageBO pageBO) + + } + + interface "项目模型仓库-ModelRepository" as ModelRepository{ + 保存数据库模型: boolean saveDBModel(TableBO tableBO) + 修改数据库模型: boolean updateDBModel(TableBO tableBO) + 获取数据库模型聚合接口:List getDbErByProjectCode(String projectCode) + + 保存参数模型: boolean saveParamModel(ParamModelBO paramModelBO) + 修改参数模型: boolean updateParamModel(ParamModelBO paramModelBO) + 获取参数模型聚合接口:List getModelByProjectCode(String projectCode) + + 保存模型后缀信息: boolean saveModelSuffix(ModelSuffixConfigBO modelSuffixConfigBO) + 修改模型后缀信息: boolean updateModelSuffix(ModelSuffixConfigBO modelSuffixConfigBO) + + } + + interface "项目模型查询仓库-ModelQueryRepository" as ModelRepository{ + 获取单条参数信息: ParamModelBO getByParamClassName(String paramClassName) + 根据项目和表名获取数据库字段列表: List getByCode(String projectCode, String tableName) + 分页查询表结构列表:List queryTablePage(PageBO pageBO) + } + +} + + +@enduml \ No newline at end of file diff --git a/domain/domain.iml b/domain/domain.iml new file mode 100644 index 0000000000000000000000000000000000000000..1daccaecae3ab24e7e50f4f9b8c005ab764100d2 --- /dev/null +++ b/domain/domain.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/domain/pom.xml b/domain/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..22022a128ef8c30bddf3d3ba55fd80a17e50a805 --- /dev/null +++ b/domain/pom.xml @@ -0,0 +1,61 @@ + + + + 4.0.0 + + com.tianhua.datafactory + datafactory-parent + 2.0.0-SNAPSHOT + + + com.tianhua.datafactory + domain + 2.0.0-SNAPSHOT + + datafactory-domain + + http://www.example.com + + + UTF-8 + 1.8 + 1.8 + + + + + + org.projectlombok + lombok + + + + + org.springframework + spring-context + + + + com.tianhua.datafactory + client + 2.0.0-SNAPSHOT + + + com.google.guava + guava + 29.0-jre + compile + + + com.alibaba + fastjson + compile + + + + + + + + diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/GlobalConstant.java b/domain/src/main/java/com/tianhua/datafactory/domain/GlobalConstant.java new file mode 100644 index 0000000000000000000000000000000000000000..2b9eff21ea24d929ed4d610cc19c4ba7971a2824 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/GlobalConstant.java @@ -0,0 +1,60 @@ +package com.tianhua.datafactory.domain; + + +/** + * Description: + * date: 2021/7/12 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class GlobalConstant { + /** + * 以!开头的则忽略解析 + */ + public static final String PLANT_DOC_IGNORE = "!"; + + /** + * plantUML的API类描述 + */ + public static final String API = "api"; + + + public static final String DTO = "dto"; + + public static final String VO = "vo"; + + public static final String ENUM = "enum"; + + /** + * 存放api文档的地方 + */ + public static final String PLANT_UML_FILE_DIR = "webapp-model"; + /** + * 主键ID + */ + public static final String PKEY = "pkey"; + /** + * 是否是联合索引 + */ + public static final String UKEY = "ukey"; + + /** + * 是否是普通索引 + */ + public static final String KEY = "key"; + + /** + * liteflow 构建的chain + */ + public static final String CHAIN_FLOW = "dataProcessingFlowChain"; + + /** + * 数据源编码分隔符 + */ + public static final String SPLIT_FLAG = "#"; + + +} + diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/ability/CollectionFactory.java b/domain/src/main/java/com/tianhua/datafactory/domain/ability/CollectionFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..e914c47c1327cc5868cf603c540dbab4ebb36552 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/ability/CollectionFactory.java @@ -0,0 +1,92 @@ +package com.tianhua.datafactory.domain.ability; + +import com.tianhua.datafactory.domain.enums.JavaFieldTypeEnum; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Description + * date: 2022/9/12 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class CollectionFactory { + + private static SecureRandom random = new SecureRandom(); + + /** + * 构建list数据 + * @param valueArray + * @param randomCount + * @param realType + * @return + */ + public List buildListValues(String [] valueArray, int randomCount, String realType){ + List valueList = new ArrayList<>(); + + //处理List + if(JavaFieldTypeEnum.isInt(realType)){ + for (int i = 0;i < randomCount;i++){ + valueList.add(Integer.parseInt(valueArray[random.nextInt(valueArray.length)])); + } + } + + //处理List + else if(JavaFieldTypeEnum.isString(realType)){ + for (int i = 0;i < randomCount;i++){ + valueList.add(valueArray[random.nextInt(valueArray.length)]); + } + } + + //处理List + else if(JavaFieldTypeEnum.isLong(realType)){ + for (int i = 0;i < randomCount;i++){ + valueList.add(Long.parseLong(valueArray[random.nextInt(valueArray.length)])); + } + } + return valueList; + } + + /** + * 构建set数据 + * @param valueArray + * @param randomCount + * @param realType + * @return + */ + public Set buildSetValues(String [] valueArray, int randomCount, String realType){ + //处理Set + Set set = new HashSet(); + + if(JavaFieldTypeEnum.isInt(realType)){ + for (int i = 0;i < randomCount;i++){ + set.add(Integer.parseInt(valueArray[random.nextInt(valueArray.length)])); + } + } + + //处理Set + else if(JavaFieldTypeEnum.isString(realType)){ + for (int i = 0;i < randomCount;i++){ + set.add(valueArray[random.nextInt(valueArray.length)]); + } + } + + //处理Set + else if(JavaFieldTypeEnum.isLong(realType)){ + for (int i = 0;i < randomCount;i++){ + set.add(Long.parseLong(valueArray[random.nextInt(valueArray.length)])); + } + } + + return set; + } + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/ability/DataProcessor.java b/domain/src/main/java/com/tianhua/datafactory/domain/ability/DataProcessor.java new file mode 100644 index 0000000000000000000000000000000000000000..9d42debba01d971e6c34593daafe6163bbb0c626 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/ability/DataProcessor.java @@ -0,0 +1,26 @@ +package com.tianhua.datafactory.domain.ability; + +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; + +import java.util.List; +import java.util.Map; + +/** + * Description + * + * 数据过滤处理接口 + * date: 2022/8/13 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public interface DataProcessor { + /** + * 数据过滤接口 + * @param dataBuildRequestFieldBO + * @param valueMap + * @param list + */ + void dataFilt(DataBuildRequestFieldBO dataBuildRequestFieldBO, Map valueMap, List> list); +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/ability/GenericService.java b/domain/src/main/java/com/tianhua/datafactory/domain/ability/GenericService.java new file mode 100644 index 0000000000000000000000000000000000000000..91c56e279bae98e70da42203ed947cf2ece18cdf --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/ability/GenericService.java @@ -0,0 +1,195 @@ +package com.tianhua.datafactory.domain.ability; + +import com.alibaba.fastjson.JSON; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.tianhua.datafactory.domain.bo.GenericTypeBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import com.tianhua.datafactory.domain.bo.model.ModelSuffixConfigBO; +import com.tianhua.datafactory.domain.enums.JavaFieldTypeEnum; +import com.tianhua.datafactory.domain.repository.ModelQueryRepository; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * Description + * date: 2022/8/28 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class GenericService { + + @Autowired + private ModelQueryRepository modelQueryRepository; + + + /** + * 获取属性类型中的泛型对象 + * + * List + * List> + * @param fieldType + * @return + */ + public GenericTypeBO getGenericType(String fieldType){ + GenericTypeBO genericTypeBO = new GenericTypeBO(); + + if(fieldType.contains("[]")){ + genericTypeBO.setRealType(fieldType.replace("[]","").trim()); + genericTypeBO.setWrapType("Array"); + return genericTypeBO; + } + + if(!fieldType.contains("<")){ + genericTypeBO.setRealType(fieldType); + return genericTypeBO; + } + + + if(fieldType.contains(",")){ + String [] fieldTypeArr = fieldType.split(","); + String keyWrapper = fieldTypeArr[0]; + String valueWrapper = fieldTypeArr[1]; + genericTypeBO.setWrapType(keyWrapper.split("<")[0]); + genericTypeBO.setRealKeyType(keyWrapper.split("<")[1]); + if(valueWrapper.contains(">>")){ + genericTypeBO.setRealValueType(valueWrapper.replace(">>", ">")); + }else { + genericTypeBO.setRealValueType(valueWrapper.replace(">", "")); + + } + return genericTypeBO; + } + + String [] array = fieldType.split("<"); + if(array.length == 2){ + genericTypeBO.setWrapType(array[0]); + genericTypeBO.setRealType(array[1].replace(">","")); + return genericTypeBO; + } + + if(array.length == 3){ + GenericTypeBO realTypeBO = new GenericTypeBO(); + realTypeBO.setRealType(array[2].replace(">","")); + realTypeBO.setWrapType(array[1]); + GenericTypeBO superTypeBO = new GenericTypeBO(); + superTypeBO.setRealType(array[1] + "<" + array[2].replace(">","")+">"); + superTypeBO.setWrapType(array[1]); + Map genericTypeBOMap = new HashMap<>(); + genericTypeBOMap.put("realType",realTypeBO); + superTypeBO.setSubGenericTypeMap(genericTypeBOMap); + return superTypeBO; + } + + return genericTypeBO; + } + + /** + * 获取属性类型中的泛型对象 + * + * List + * List> + * @param fieldType + * @return + */ + public GenericTypeBO getGenericTypeWrapper(String fieldType){ + GenericTypeBO genericTypeBO = getGenericType(fieldType); + List modelSuffixConfigBOList = modelQueryRepository.getModelSuffixConfigList(); + Optional optional = modelSuffixConfigBOList.stream().filter(modelSuffixConfigBO -> StringUtils.isNotEmpty(genericTypeBO.getRealType()) && genericTypeBO.getRealType().endsWith(modelSuffixConfigBO.getSuffix())).findAny(); + if(optional.isPresent()){ + genericTypeBO.setRealTypeModel(true); + } + + return genericTypeBO; + } + + + + /** + * 检查属性是否是模型属性 + * @param dataBuildRequestFieldBO + * @return + */ + public boolean checkModelClass(DataBuildRequestFieldBO dataBuildRequestFieldBO){ + + List modelSuffixConfigBOList = modelQueryRepository.getModelSuffixConfigList(); + + dataBuildRequestFieldBO.setRealFieldType(dataBuildRequestFieldBO.getFieldType()); + + if(CollectionUtils.isEmpty(modelSuffixConfigBOList)){ + return false; + } + + GenericTypeBO genericTypeBO = getGenericType(dataBuildRequestFieldBO.getRealFieldType()); + + if(StringUtils.isNotEmpty(genericTypeBO.getRealType())){ + dataBuildRequestFieldBO.setRealFieldType(genericTypeBO.getRealType()); + } + + else if(StringUtils.isNotEmpty(genericTypeBO.getRealValueType())){ + dataBuildRequestFieldBO.setRealFieldType(genericTypeBO.getRealValueType()); + } + + Optional optional = modelSuffixConfigBOList.stream().filter(modelSuffixConfigBO -> StringUtils.isNotEmpty(genericTypeBO.getRealType()) && genericTypeBO.getRealType().endsWith(modelSuffixConfigBO.getSuffix())).findAny(); + if(optional.isPresent()){ + genericTypeBO.setRealTypeModel(true); + return true; + } + + if(StringUtils.isNotEmpty(genericTypeBO.getRealValueType())){ + optional = modelSuffixConfigBOList.stream().filter(modelSuffixConfigBO -> genericTypeBO.getRealValueType().endsWith(modelSuffixConfigBO.getSuffix())).findAny(); + if(optional.isPresent()){ + genericTypeBO.setRealValueTypeModel(true); + return true; + } + } + return false; + } + + + public Object buildGenericData(String wrapClass, List> list) { + if(JavaFieldTypeEnum.isList(wrapClass)){ + return list; + } + if(JavaFieldTypeEnum.isSet(wrapClass)){ + return Sets.newHashSet(list); + } + + if(JavaFieldTypeEnum.isArray(wrapClass)){ + Object [] array = new Object[list.size()]; + for (int i = 0;i < array.length;i++){ + array[i] = list.get(i); + } + return array; + } + + return list; + } + + + + + public static void main(String[] args) { + GenericService genericService = new GenericService(); + System.out.println(JSON.toJSONString(genericService.getGenericType("Integer []"))); + System.out.println(JSON.toJSONString(genericService.getGenericType("String []"))); + + System.out.println(JSON.toJSONString(genericService.getGenericType("List"))); + System.out.println(JSON.toJSONString(genericService.getGenericType("List>>>"))); + + System.out.println(JSON.toJSONString(genericService.getGenericType("Map"))); + System.out.println(JSON.toJSONString(genericService.getGenericType("Map>"))); + + } + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/ability/KVPairService.java b/domain/src/main/java/com/tianhua/datafactory/domain/ability/KVPairService.java new file mode 100644 index 0000000000000000000000000000000000000000..c801261e95158f783529f0bc23a34a6d5bfb620f --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/ability/KVPairService.java @@ -0,0 +1,82 @@ +package com.tianhua.datafactory.domain.ability; + + +import com.tianhua.datafactory.domain.support.kvpair.KVPairBO; + +import java.util.List; + +/** + * Description:kv键值对的增删改查操作 + * date: 2022/1/11 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public interface KVPairService { + + /** + * 获取所有kv对象 + * @return + */ + List getAll(); + + /** + * 通过kv模型的条件获取一个kv对象实例 + * @param kv + * @return + */ + KVPairBO get(KVPairBO kv); + + /** + * 通过kv模型的条件获取多个个kv对象实例 + * @param kv + * @return + */ + List getList(KVPairBO kv); + + + /** + * 插入一个kv对象 + * @param kv + * @return + */ + boolean insert(KVPairBO kv); + + /** + * 批量插入 + * @param kvList + * @return + */ + boolean batchInsert(List kvList); + + /** + * 通过多个kv条件获取kv对象实例 + * @param kvList + * @return + */ + List getByKey(List kvList); + + /** + * 修改kv + * @param kv + * @return + */ + boolean update(KVPairBO kv); + + /** + * 根据key实例删除 + * @param kv + * @return + */ + boolean delete(KVPairBO kv); + + + /** + * 判断kv是否存在 + * @param kv + * @return + */ + boolean contains(KVPairBO kv); + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/ability/ReadApiPlantUMLDocService.java b/domain/src/main/java/com/tianhua/datafactory/domain/ability/ReadApiPlantUMLDocService.java new file mode 100644 index 0000000000000000000000000000000000000000..987e06ece3b12cf386e32f351dea32cea77e4256 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/ability/ReadApiPlantUMLDocService.java @@ -0,0 +1,423 @@ +package com.tianhua.datafactory.domain.ability; + +import com.alibaba.fastjson.JSON; +import com.google.common.collect.Lists; +import com.tianhua.datafactory.domain.GlobalConstant; +import com.tianhua.datafactory.domain.bo.EnumBean; +import com.tianhua.datafactory.domain.bo.bean.MethodBean; +import com.tianhua.datafactory.domain.bo.bean.PlantUMLApiContextBean; +import com.tianhua.datafactory.domain.bo.model.FieldBO; +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; +import com.tianhua.datafactory.domain.bo.project.ApiBO; +import com.tianhua.datafactory.domain.enums.ClassRelationEnum; +import com.tianhua.datafactory.domain.enums.VisibilityEnum; +import com.tianhua.datafactory.domain.util.StringHandleUtils; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description: + * date: 2022/4/8 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class ReadApiPlantUMLDocService { + + @Autowired + private ReadPlantUMLDocService readPlantUMLDocService; + + //@Autowired + //private RefreshService refreshService; + + private RefreshService refreshService = new RefreshService(); + + /** + * 适用于web上传方式 + * @param filePath + * @return + */ + public PlantUMLApiContextBean readDoc(String filePath){ + try { + List contentList = FileUtils.readLines(new File(filePath),"utf-8"); + PlantUMLApiContextBean plantUMLApiContextBean = exeParse(contentList); + refreshService.refresh(plantUMLApiContextBean); + return plantUMLApiContextBean; + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + + private PlantUMLApiContextBean exeParse(List contentList){ + List elementList = new ArrayList<>(); + PlantUMLApiContextBean plantUmlContextBean = new PlantUMLApiContextBean(); + + String currentPackage= ""; + //对class,enum,interface进行解析 + for(String str : contentList){ + String content = str.trim(); + if(StringUtils.isEmpty(content) || content.contains("@startuml") || content.startsWith(GlobalConstant.PLANT_DOC_IGNORE)){ + continue; + } + + if(content.contains("package")){ + currentPackage = content.replace("package","").replace("{","").trim(); + continue; + } + + if(content.contains("{")){ + elementList.add(content); + continue; + } + if(content.contains("}")){ + elementList.add(content); + parseClassElement(elementList,plantUmlContextBean,currentPackage); + elementList.clear(); + continue; + } + elementList.add(content); + } + + //对类与类的关系进行解析 + Map> relationListMap = new HashMap<>(); + for(String str : contentList){ + if(StringUtils.isEmpty(str) || str.contains("@startuml") + || str.contains("package") || str.trim().contains("{") || str.trim().contains("}")){ + continue; + } + + Map relationMap = ClassRelationEnum.parseRelation(str); + if(relationMap == null || relationMap.size()<2){ + continue; + } + List relationList = relationListMap.get(relationMap.get("class")); + if(CollectionUtils.isEmpty(relationList)){ + relationList = new ArrayList<>(); + } + relationList.add(relationMap.get("relation")); + relationListMap.put(relationMap.get("class").trim(),relationList); + } + + return plantUmlContextBean; + } + + + /** + * 解析文件内容整体路由 + * @param elementList + * @param plantUMLApiContextBean + */ + private void parseClassElement(List elementList, PlantUMLApiContextBean plantUMLApiContextBean, String currentPackage){ + String className = getClassName(elementList.get(0)); + if(className.toLowerCase().endsWith(GlobalConstant.API)){ + List apiBeanList = buildApiBean(elementList); + plantUMLApiContextBean.addBatchApiBean(apiBeanList); + } + + if(className.toLowerCase().endsWith(GlobalConstant.DTO) || className.toLowerCase().endsWith(GlobalConstant.VO)){ + ParamModelBO paramClassbean = buildClassBean(elementList); + plantUMLApiContextBean.addParamClassBean(paramClassbean); + } + else if(className.toLowerCase().endsWith("enum")){ + EnumBean enumBean = builEnumBean(elementList); + enumBean.buildPlantUMLPackage(currentPackage); + plantUMLApiContextBean.addEnumBean(enumBean); + } + + } + + /** + * 解析enum类型数据 + * @param elementList + * @return + */ + private EnumBean builEnumBean(List elementList ){ + + String[] array = elementList.get(0).trim().replace("{","").trim().split("\""); + + String classMetaInfoArr = array[1]; + List fieldBeanList = getFieldBeanList(elementList.subList(1,elementList.size())); + EnumBean enumBean = new EnumBean(); + enumBean.setFieldBeanList(fieldBeanList); + enumBean.setClassName(classMetaInfoArr.split("-")[1].replace("\"","")); + enumBean.setClassDesc(classMetaInfoArr.split("-")[0].replace("\"","")); + if(StringHandleUtils.isContainChinese(enumBean.getClassName())){ + String className = enumBean.getClassDesc(); + enumBean.setClassDesc(enumBean.getClassName()); + enumBean.setClassName(className); + } + dealEnumMethodBeanList(elementList,enumBean); + return enumBean; + } + /** + * 获取类的方法列表 + * @param elementList + * @return + */ + private void dealEnumMethodBeanList(List elementList, EnumBean enumBean){ + List methodBeanList = new ArrayList<>(); + List> enumValueList = new ArrayList<>(); + for (String fieldStr : elementList){ + if(!fieldStr.contains("()") && !fieldStr.contains("(") && !fieldStr.contains(")")){ + continue; + } + + //处理枚举值 + String valueCode = fieldStr.substring(0,fieldStr.indexOf("(")); + if(!StringUtils.isEmpty(valueCode) && !valueCode.contains(" ")){ + enumValueList.add(buildEnumValueMap(enumBean,fieldStr)); + continue; + } + + MethodBean methodBean =new MethodBean(); + + if(fieldStr.contains(":")){ + String[] fieldArr = fieldStr.trim().split(":"); + methodBean.setVisibility(VisibilityEnum.getVisibilityStr(fieldArr[0])); + methodBean.setDesc(fieldArr[0]); + methodBean.setReturnClass(fieldArr[1].trim().split(" ")[0]); + methodBean.setMethodName(fieldArr[1].trim().split(" ")[1]); + }else { + String[] fieldArr = fieldStr.trim().split(" "); + //没有注释--->中文校验 + if(fieldArr.length ==2){ + methodBean.setVisibility(VisibilityEnum.getVisibilityStr(fieldStr.trim())); + methodBean.setReturnClass(fieldStr.trim().split(" ")[0]); + methodBean.setMethodName(fieldStr.trim().split(" ")[1]); + }else{ + methodBean.setDesc(fieldArr[0]); + methodBean.setVisibility(VisibilityEnum.getVisibilityStr(fieldStr.trim())); + methodBean.setReturnClass(fieldArr[1]); + StringBuilder builder = new StringBuilder(); + for (int i = 2;i elementList ){ + + String[] array = elementList.get(0).trim().replace("{","").trim().split("\""); + + String classMetaInfoArr = array[1]; + List fieldBeanList = getFieldBeanList(elementList.subList(1,elementList.size())); + ParamModelBO classBean = new ParamModelBO(); + classBean.setFieldBeanList(fieldBeanList); + + classBean.setParamClassName(classMetaInfoArr.split("-")[1].replace("\"","")); + classBean.setParamClassDesc(classMetaInfoArr.split("-")[0].replace("\"","")); + + return classBean; + } + + + private String getClassName(String ele){ + String [] classArr = ele.trim().replace("{","").split(" "); + return classArr[classArr.length - 1]; + } + + /** + * 解析class类型数据 + * @param elementList + * @return + */ + private List buildApiBean(List elementList ){ + + List apiBeanList = new ArrayList<>(); + String moduleCode = ""; + String moduleName = ""; + for (String fieldStr : elementList.subList(1,elementList.size())){ + + if(fieldStr.trim().contains("extend info")){ + break; + } + if(!fieldStr.trim().contains(":")){ + continue; + } + + if(!fieldStr.contains("(") && StringUtils.isEmpty(moduleName)){ + String [] fieldArr = fieldStr.trim().split("-"); + String moduleInfo = fieldArr[1]; + moduleName = moduleInfo.split(":")[0].trim(); + moduleCode = moduleInfo.split(":")[1].trim(); + continue; + } + String[] fieldArr = fieldStr.trim().split(":"); + ApiBO apiBean = new ApiBO(); + apiBean.setApiDoc(fieldArr[0]); + String [] methodArr = fieldArr[1].trim().split("\\."); + apiBean.setMethodType(methodArr[1]); + String [] methodReturnArr = methodArr[0].split("\\("); + String returnParam = methodReturnArr[0].split(" ")[0]; + ParamModelBO returnParamBean = new ParamModelBO(); + returnParamBean.setParamClassName(returnParam); + apiBean.setReturnParamModel(returnParamBean); + + apiBean.setApiUrl(methodReturnArr[0].split(" ")[1]); + String param = methodReturnArr[1].replace(")",""); + + apiBean.setParamList(buildParamBean(param)); + apiBean.setModuleCode(moduleCode); + apiBean.setModuleName(moduleName); + apiBeanList.add(apiBean); + } + + return apiBeanList; + } + + + /** + * 构建枚举 + * @param enumBean + * @param valueStr + * @return + */ + private Map buildEnumValueMap(EnumBean enumBean,String valueStr){ + List fieldBOList = enumBean.getFieldBeanList(); + + String [] valueArr = valueStr.split("\\("); + String valueSegment = valueArr[1]; + String valueSeg = valueSegment.substring(0,valueSegment.indexOf(")")); + Map valueMap = new HashMap<>(); + + if(!valueSeg.contains(",")){ + if(valueSeg.contains("\"")){ + valueSeg = valueSeg.replace("\"",""); + } + valueMap.put(fieldBOList.get(0).getFieldName(),valueSeg); + } + String [] valueSegArr = valueSeg.split(","); + + for (int i = 0;i < fieldBOList.size();i ++){ + valueSeg = valueSegArr[i]; + if(valueSeg.contains("\"")){ + valueSeg = valueSeg.replace("\"",""); + } + valueMap.put(fieldBOList.get(i).getFieldName(),valueSeg); + } + return valueMap; + } + + + /** + * 构建参数模型 + * @param param + * @return + */ + private List buildParamBean(String param){ + if(StringUtils.isEmpty(param.trim())){ + return Lists.newArrayList(); + } + List paramBeanList = new ArrayList<>(); + if(!param.contains(",")){ + if(param.contains(" ")){ + String [] paramArr = param.split(" "); + ParamModelBO paramBean = ParamModelBO.getInstance(paramArr[0], paramArr[1]); + paramBeanList.add(paramBean); + } + return paramBeanList; + } + + String [] paramArr = param.split(","); + for (String paramStr : paramArr){ + if(paramStr.contains(" ")){ + String [] paramStrArr = paramStr.split(" "); + if(StringUtils.isEmpty(paramStrArr[0])){ + ParamModelBO paramBean = ParamModelBO.getInstance(paramStrArr[1],paramStrArr[1]); + paramBeanList.add(paramBean); + }else { + ParamModelBO paramBean = ParamModelBO.getInstance(paramStrArr[0],paramStrArr[1]); + paramBeanList.add(paramBean); + } + } + } + return paramBeanList; + } + + + /** + * 获取类的属性列表 + * @param elementList + * @return + */ + private List getFieldBeanList(List elementList){ + List fieldBeanList = new ArrayList<>(); + int extendIndex = 0; + + for (int i = 0 ;i< elementList.size();i ++){ + String fieldStr = elementList.get(i); + if(isExtendLine(fieldStr)){ + extendIndex = i; + } + if(fieldStr.contains("(") || fieldStr.contains(")")){ + continue; + } + if(!fieldStr.trim().contains(":")){ + continue; + } + + String[] fieldArr = fieldStr.trim().split(":"); + FieldBO fieldBean = new FieldBO(); + if(i > extendIndex && extendIndex > 0){ + fieldBean.setExtendFieldTag(true); + } + fieldBean.buildDesc(fieldArr[0]); + if(fieldArr[1].trim().contains(" ")){ + String [] fields = fieldArr[1].trim().split(" "); + fieldBean.setFieldName(fields[1]); + fieldBean.setFieldType(fields[0]); + }else { + fieldBean.setFieldName(fieldArr[1]); + } + fieldBeanList.add(fieldBean); + } + return fieldBeanList; + } + + /** + * 判断是否是扩展标示 + * @param content + * @return + */ + private boolean isExtendLine(String content){ + return content.contains("..") && content.contains("extend") && content.contains("info"); + } + + + public static void main(String[] args) { + ReadApiPlantUMLDocService readApiPlantUMLDocService = new ReadApiPlantUMLDocService(); + String path = "/Users/dasouche/Documents/api-model.puml"; + PlantUMLApiContextBean plantUMLApiContextBean = readApiPlantUMLDocService.readDoc(path); + System.out.println(JSON.toJSONString(plantUMLApiContextBean)); + } +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/ability/ReadDomainPlantUMLDocService.java b/domain/src/main/java/com/tianhua/datafactory/domain/ability/ReadDomainPlantUMLDocService.java new file mode 100644 index 0000000000000000000000000000000000000000..c3f0e9674b7fec9a5fe6d15196d8ec26b0ba7799 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/ability/ReadDomainPlantUMLDocService.java @@ -0,0 +1,486 @@ +package com.tianhua.datafactory.domain.ability; + +import com.tianhua.datafactory.domain.GlobalConstant; +import com.tianhua.datafactory.domain.bo.*; +import com.tianhua.datafactory.domain.bo.bean.InterfaceBean; +import com.tianhua.datafactory.domain.bo.bean.MethodBean; +import com.tianhua.datafactory.domain.bo.bean.PlantUmlDomainContextBean; +import com.tianhua.datafactory.domain.bo.model.FieldBO; +import com.tianhua.datafactory.domain.enums.ClassEnum; +import com.tianhua.datafactory.domain.enums.ClassRelationEnum; +import com.tianhua.datafactory.domain.enums.VisibilityEnum; +import com.tianhua.datafactory.domain.util.StringHandleUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.io.File; +import java.io.IOException; +import java.util.*; + +/** + * Description: 读文件服务 + * 读取plantUML类图 + * date: 2021/6/28 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + * + */ +@Service +@Slf4j +public class ReadDomainPlantUMLDocService { + + /** + * 解析plantUML文件内容 + * @param filePath + * @return + */ + public PlantUmlDomainContextBean getPlantUmlContextBean(String filePath){ + List contentList = null; + try { + contentList = FileUtils.readLines(new File(filePath),"utf-8"); + } catch (IOException e) { + e.printStackTrace(); + } + + if(CollectionUtils.isEmpty(contentList)){ + return null; + } + List elementList = new ArrayList<>(); + PlantUmlDomainContextBean plantUmlContextBean = new PlantUmlDomainContextBean(); + + String currentPackage= ""; + //对class,enum,interface进行解析 + for(String str : contentList){ + String content = str.trim(); + if(StringUtils.isEmpty(content) || content.contains("@startuml") || content.startsWith(GlobalConstant.PLANT_DOC_IGNORE)){ + continue; + } + + if(content.contains("package")){ + currentPackage = content.replace("package","").replace("{","").trim(); + continue; + } + + if(content.contains("{")){ + elementList.add(content); + continue; + } + if(content.contains("}")){ + elementList.add(content); + parseClassElement(elementList,plantUmlContextBean,currentPackage); + elementList.clear(); + continue; + } + elementList.add(content); + } + + //对类与类的关系进行解析 + Map> relationListMap = new HashMap<>(); + for(String str : contentList){ + if(StringUtils.isEmpty(str) || str.contains("@startuml") + || str.contains("package") || str.trim().contains("{") || str.trim().contains("}")){ + continue; + } + + Map relationMap = ClassRelationEnum.parseRelation(str); + if(relationMap == null || relationMap.size()<2){ + continue; + } + List relationList = relationListMap.get(relationMap.get("class")); + if(CollectionUtils.isEmpty(relationList)){ + relationList = new ArrayList<>(); + } + relationList.add(relationMap.get("relation")); + relationListMap.put(relationMap.get("class").trim(),relationList); + } + + plantUmlContextBean.getEnumBeanMap().forEach((k,v)->{ + v.getFieldBeanList().forEach(fieldBO -> fieldBO.buildFieldDetail()); + }); + + + plantUmlContextBean.getClassBeanMap().forEach((className,classBean)->{ + List relationList = relationListMap.get(className); + if(!CollectionUtils.isEmpty(relationList)){ + classBean.setRelationClassStr(StringUtils.join(relationList,",")); + } + }); + + + //统一对解析内容进行校验,提前暴露 + plantUmlContextBean.getClassBeanMap().forEach((className,classBean)->{ + List fieldBeanList = classBean.getFieldBeanList(); + Set fieldNameSet = new HashSet<>(); + Set fieldSimpleNameSet = new HashSet<>(); + fieldBeanList.forEach(fieldBean -> { + fieldBean.buildFieldDetail(); + /* if(fieldBean.isSimpleField()){ + if(fieldNameSet.contains(fieldBean.getFieldName()) || fieldSimpleNameSet.contains(fieldBean.getFieldSimpleName())){ + log.error("属性重复,类名{},属性信息:{}",className, fieldBean.toString()); + } + }*/ + fieldSimpleNameSet.add(fieldBean.getFieldName()); + fieldNameSet.add(fieldBean.getFieldName()); + }); + + List methodBeanList = classBean.getMethodBeanList(); + Set methodNameSet = new HashSet<>(); + methodBeanList.forEach(methodBean -> { + if(fieldNameSet.contains(methodBean.getMethodName())){ + log.error("方法重复,类名{},属性名:{}",className,methodBean.getMethodName()); + } + methodNameSet.add(methodBean.getMethodName()); + }); + + }); + + plantUmlContextBean.getInterfaceBeanMap().forEach((className,interfaceBean)->{ + List methodBeanList = interfaceBean.getMethodBeanList(); + Set methodNameSet = new HashSet<>(); + methodBeanList.forEach(methodBean -> { + if(methodNameSet.contains(methodBean.getMethodName())){ + log.error("方法重复,类名{},属性名:{}",className,methodBean.getMethodName()); + } + methodNameSet.add(methodBean.getMethodName()); + }); + }); + + return plantUmlContextBean; + } + + /** + * 解析文件内容整体路由 + * @param elementList + * @param plantUmlContextBean + */ + private void parseClassElement(List elementList, PlantUmlDomainContextBean plantUmlContextBean, String currentPackage){ + String classType = getClassType(elementList.get(0)); + if(classType.equals(ClassEnum.CLASS.getClassType())){ + ClassBean classBean = buildClassBean(elementList); + classBean.buildPlantUMLPackage(currentPackage); + plantUmlContextBean.addClassBean(classBean); + } + else if(classType.equals(ClassEnum.ENUM.getClassType())){ + EnumBean enumBean = builEnumBean(elementList); + enumBean.buildPlantUMLPackage(currentPackage); + plantUmlContextBean.addEnumBean(enumBean); + } + else if(classType.equals(ClassEnum.INTERFACE.getClassType())){ + InterfaceBean interfaceBean = buildInterfaceBean(elementList); + interfaceBean.buildPlantUMLPackage(currentPackage); + plantUmlContextBean.addInterfaceBean(interfaceBean); + } + + } + + + private String getClassType(String ele){ + return ele.split(" ")[0]; + } + + /** + * 解析class类型数据 + * @param elementList + * @return + */ + private ClassBean buildClassBean(List elementList ){ + + String[] array = elementList.get(0).trim().replace("{","").trim().split("\""); + log.info("elementList.get(0) = "+elementList.get(0)); + String classMetaInfoArr = array[1]; + List fieldBeanList = getFieldBeanList(elementList.subList(1,elementList.size())); + List methodBeanList = getMethodBeanList(elementList.subList(1,elementList.size())); + ClassBean classBean = new ClassBean(); + classBean.setFieldBeanList(fieldBeanList); + + classBean.setClassName(classMetaInfoArr.split("-")[1].replace("\"","")); + classBean.setClassDesc(classMetaInfoArr.split("-")[0].replace("\"","")); + + if(StringHandleUtils.isContainChinese(classBean.getClassName())){ + String className = classBean.getClassDesc(); + classBean.setClassDesc(classBean.getClassName()); + classBean.setClassName(className); + } + + if(classBean.getClassName().contains("@")){ + List annoTagList = new ArrayList<>(); + String [] annoArr = classBean.getClassName().split("\\."); + for (String annoTag : annoArr){ + if(annoTag.contains("@")){ + annoTagList.add(annoTag); + } + } + classBean.setClassName(annoArr[0]); + classBean.setAnnotationTagList(annoTagList); + } + + methodBeanList.forEach(methodBean -> methodBean.setClassName(classBean.getClassName())); + classBean.setMethodBeanList(methodBeanList); + + return classBean; + } + + /** + * 解析接口类型数据 + * @param elementList + * @return + */ + private InterfaceBean buildInterfaceBean(List elementList ){ + + String[] array = elementList.get(0).trim().replace("{","").trim().split("\""); + + String classMetaInfoArr = array[1]; + List methodBeanList = getMethodBeanList(elementList.subList(1,elementList.size())); + InterfaceBean interfaceBean = new InterfaceBean(); + + interfaceBean.setClassName(classMetaInfoArr.split("-")[1].replace("\"","")); + interfaceBean.setClassDesc(classMetaInfoArr.split("-")[0].replace("\"","")); + if(StringHandleUtils.isContainChinese(interfaceBean.getClassName())){ + String className = interfaceBean.getClassDesc(); + interfaceBean.setClassDesc(interfaceBean.getClassName()); + interfaceBean.setClassName(className); + } + methodBeanList.stream().forEach(methodBean -> methodBean.setClassName(interfaceBean.getClassName())); + interfaceBean.setMethodBeanList(methodBeanList); + + return interfaceBean; + } + + /** + * 解析enum类型数据 + * @param elementList + * @return + */ + private EnumBean builEnumBean(List elementList ){ + + String[] array = elementList.get(0).trim().replace("{","").trim().split("\""); + + String classMetaInfoArr = array[1]; + List fieldBeanList = getFieldBeanList(elementList.subList(1,elementList.size())); + EnumBean enumBean = new EnumBean(); + enumBean.setFieldBeanList(fieldBeanList); + enumBean.setClassName(classMetaInfoArr.split("-")[1].replace("\"","")); + enumBean.setClassDesc(classMetaInfoArr.split("-")[0].replace("\"","")); + if(StringHandleUtils.isContainChinese(enumBean.getClassName())){ + String className = enumBean.getClassDesc(); + enumBean.setClassDesc(enumBean.getClassName()); + enumBean.setClassName(className); + } + dealEnumMethodBeanList(elementList,enumBean); + return enumBean; + } + + /** + * 获取类的属性列表 + * @param elementList + * @return + */ + private List getFieldBeanList(List elementList){ + List fieldBeanList = new ArrayList<>(); + + for (String fieldStr : elementList){ + if(fieldStr.contains("(") || fieldStr.contains(")")){ + continue; + } + if(!fieldStr.trim().contains(":")){ + continue; + } + String[] fieldArr = fieldStr.trim().split(":"); + FieldBO fieldBean = new FieldBO(); + fieldBean.buildDesc(fieldArr[0]); + fieldBean.setFieldName(fieldArr[1]); + + fieldBeanList.add(fieldBean); + } + return fieldBeanList; + } + + /** + * 获取类的方法列表 + * @param elementList + * @return + */ + private List getMethodBeanList(List elementList){ + List methodBeanList = new ArrayList<>(); + int extendIndex = 0; + + for (int i = 0;i < elementList.size();i ++){ + String fieldStr = elementList.get(i); + if(isExtendLine(fieldStr)){ + extendIndex = i; + } + if(!fieldStr.contains("()") && !fieldStr.contains("(") && !fieldStr.contains(")")){ + continue; + } + + MethodBean methodBean = new MethodBean(); + if(i > extendIndex && extendIndex > 0){ + methodBean.setModelExtendMethod(true); + } + + if(fieldStr.contains(":")){ + String[] fieldArr = fieldStr.trim().split(":"); + methodBean.setVisibility(VisibilityEnum.getVisibilityStr(fieldArr[0])); + methodBean.buildDesc(fieldArr[0]); + + String[] arr = fieldArr[1].trim().split(" "); + if(arr.length == 2){ + methodBean.setReturnClass(arr[0]); + methodBean.setMethodName(arr[1]); + }else{ + methodBean.setReturnClass(arr[0]); + methodBean.setMethodName(fieldArr[1].trim().replaceFirst(arr[0],"").trim()); + } + }else { + String[] fieldArr = fieldStr.trim().split(" "); + //没有注释--->中文校验 + if(fieldArr.length ==2){ + methodBean.setVisibility(VisibilityEnum.getVisibilityStr(fieldStr.trim())); + methodBean.setReturnClass(fieldStr.trim().split(" ")[0]); + methodBean.setMethodName(fieldStr.trim().split(" ")[1]); + }else{ + methodBean.buildDesc(fieldArr[0]); + methodBean.setVisibility(VisibilityEnum.getVisibilityStr(fieldStr.trim())); + methodBean.setReturnClass(fieldArr[1]); + StringBuilder builder = new StringBuilder(); + for (int j = 2;j methodSegList = new ArrayList<>(); + String [] annoArr = methodAnnoTag.split("\\."); + List annoTagList = new ArrayList<>(); + for (String annoTag : annoArr){ + if(annoTag.contains("@")){ + annoTagList.add(annoTag); + }else { + methodSegList.add(annoTag); + } + } + if(methodSegList.size() == 1){ + methodBean.setMethodName(methodSegList.get(0)); + }else if(methodSegList.size() > 1){ + methodBean.setMethodName(StringUtils.join(methodSegList,".")); + } + methodBean.setAnnotationTagList(annoTagList); + } + + + methodBean.buildParamArr(); + methodBeanList.add(methodBean); + } + + return methodBeanList; + } + + + /** + * 获取类的方法列表 + * @param elementList + * @return + */ + private void dealEnumMethodBeanList(List elementList, EnumBean enumBean){ + List methodBeanList = new ArrayList<>(); + List> enumValueList = new ArrayList<>(); + for (String fieldStr : elementList){ + if(!fieldStr.contains("()") && !fieldStr.contains("(") && !fieldStr.contains(")")){ + continue; + } + + //处理枚举值 + String valueCode = fieldStr.substring(0,fieldStr.indexOf("(")); + if(!StringUtils.isEmpty(valueCode) && !valueCode.contains(" ")){ + enumValueList.add(buildEnumValueMap(enumBean,fieldStr)); + continue; + } + + MethodBean methodBean =new MethodBean(); + + if(fieldStr.contains(":")){ + String[] fieldArr = fieldStr.trim().split(":"); + methodBean.setVisibility(VisibilityEnum.getVisibilityStr(fieldArr[0])); + methodBean.setDesc(fieldArr[0]); + methodBean.setReturnClass(fieldArr[1].trim().split(" ")[0]); + methodBean.setMethodName(fieldArr[1].trim().split(" ")[1]); + }else { + String[] fieldArr = fieldStr.trim().split(" "); + //没有注释--->中文校验 + if(fieldArr.length ==2){ + methodBean.setVisibility(VisibilityEnum.getVisibilityStr(fieldStr.trim())); + methodBean.setReturnClass(fieldStr.trim().split(" ")[0]); + methodBean.setMethodName(fieldStr.trim().split(" ")[1]); + }else{ + methodBean.setDesc(fieldArr[0]); + methodBean.setVisibility(VisibilityEnum.getVisibilityStr(fieldStr.trim())); + methodBean.setReturnClass(fieldArr[1]); + StringBuilder builder = new StringBuilder(); + for (int i = 2;i buildEnumValueMap(EnumBean enumBean,String valueStr){ + List fieldBOList = enumBean.getFieldBeanList(); + + String [] valueArr = valueStr.split("\\("); + String valueSegment = valueArr[1]; + String valueSeg = valueSegment.substring(0,valueSegment.indexOf(")")); + Map valueMap = new HashMap<>(); + + if(!valueSeg.contains(",")){ + if(valueSeg.contains("\"")){ + valueSeg = valueSeg.replace("\"",""); + } + valueMap.put(fieldBOList.get(0).getFieldName(),valueSeg); + } + String [] valueSegArr = valueSeg.split(","); + + for (int i = 0;i < fieldBOList.size();i ++){ + + valueSeg = valueSegArr[i]; + if(valueSeg.contains("\"")){ + valueSeg = valueSeg.replace("\"",""); + } + valueMap.put(fieldBOList.get(i).getFieldName(),valueSeg); + } + return valueMap; + } + + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/ability/ReadPlantUMLDocService.java b/domain/src/main/java/com/tianhua/datafactory/domain/ability/ReadPlantUMLDocService.java new file mode 100644 index 0000000000000000000000000000000000000000..54caecfc6f8ac7c8fd81be82762a1b107d5d50f9 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/ability/ReadPlantUMLDocService.java @@ -0,0 +1,57 @@ +package com.tianhua.datafactory.domain.ability; + +import com.tianhua.datafactory.domain.GlobalConstant; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +/** + * Description: 读取plantUML类图统一处理类 + * date: 2021/10/25 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class ReadPlantUMLDocService { + + @Autowired + private ResourceLoader resourceLoader; + + + + + + /** + * 读取plantUMl文件通用方法 + * @param plantUMLFileDir + * @param applicationName + * @param plantUMLFileName + * @return + */ + private List readPlantUMLContent(String plantUMLFileDir,String applicationName,String plantUMLFileName){ + if(StringUtils.isEmpty(plantUMLFileName)){ + System.out.println("plantUMLFileName is empty,can't read content----------------!!!!!!!!!!"); + return null; + } + try { + Resource resource = resourceLoader.getResource("classpath:"+plantUMLFileDir+"/"+applicationName+"/"+plantUMLFileName); + File file = resource.getFile(); + //File file = ResourceUtils.getFile("classpath:"+plantUMLFileDir+"/"+applicationName+"/"+plantUMLFileName); + return FileUtils.readLines(file,"UTF-8"); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/ability/RefreshService.java b/domain/src/main/java/com/tianhua/datafactory/domain/ability/RefreshService.java new file mode 100644 index 0000000000000000000000000000000000000000..c0a6d5a9d7420fe1aaa596511048cfcbb3ded7a2 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/ability/RefreshService.java @@ -0,0 +1,91 @@ +package com.tianhua.datafactory.domain.ability; + +import com.tianhua.datafactory.domain.GlobalConstant; +import com.tianhua.datafactory.domain.bo.bean.PlantUMLApiContextBean; +import com.tianhua.datafactory.domain.bo.model.FieldBO; +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * Description:对扩展属性进行校验刷新 + * date: 2022/4/28 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class RefreshService { + /** + * 刷新属性内容,对apiParam进行属性区分 + * @param plantUMLApiContextBean + */ + public void refresh(PlantUMLApiContextBean plantUMLApiContextBean){ + //将扩展字段内容提取出来 + plantUMLApiContextBean.getParamClassBeanList().forEach(paramBean -> { + List fieldList = paramBean.getFieldBeanList().stream().filter(fieldBean -> !fieldBean.isExtendFieldTag()).collect(Collectors.toList()); + paramBean.setFieldBeanList(fieldList); + }); + + Map paramBeanMap = plantUMLApiContextBean.getParamClassBeanList().stream().collect(Collectors.toMap(ParamModelBO::getParamClassName, o -> o)); + + + /** + * 针对提取的扩展字段信息更新参数模型 + */ + plantUMLApiContextBean.getApiBeanList().forEach(apiBean -> { + ParamModelBO returnParamBean = apiBean.getReturnParamModel(); + if(returnParamBean != null){ + ParamModelBO newReturnParamBean = getParamModel(returnParamBean.getParamClassName(), plantUMLApiContextBean); + if(newReturnParamBean != null){ + apiBean.setReturnParamModel(newReturnParamBean); + } + } + + List paramBeanList = apiBean.getParamList(); + List newParamBeanList = new ArrayList<>(); + for (ParamModelBO oldParam : paramBeanList){ + ParamModelBO newParam = paramBeanMap.get(oldParam.getParamClassName()); + if(newParam != null){ + oldParam.setFieldBeanList(newParam.getFieldBeanList()); + newParamBeanList.add(oldParam); + }else { + newParamBeanList.add(oldParam); + } + } + apiBean.setParamList(newParamBeanList); + }); + } + + /** + * 根据api返回的参数来获取返回参数对象模型 + * @param paramClassName + * @param plantUMLApiContextBean + * @return + */ + private ParamModelBO getParamModel(String paramClassName,PlantUMLApiContextBean plantUMLApiContextBean){ + if(paramClassName.contains("<")){ + if(paramClassName.endsWith(">")){ + paramClassName = paramClassName.replace(">",""); + } + String [] paramClassArr = paramClassName.split("<"); + paramClassName = paramClassArr[1]; + } + + if(paramClassName.toLowerCase().endsWith(GlobalConstant.DTO) + || paramClassName.toLowerCase().endsWith(GlobalConstant.VO)){ + String finalParamClassName = paramClassName; + List paramBeanList = plantUMLApiContextBean.getParamClassBeanList().stream().filter(paramBean -> paramBean.getParamClassName().equals(finalParamClassName)).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(paramBeanList)){ + return paramBeanList.get(0); + } + } + return null; + } +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/ability/TransEventHandler.java b/domain/src/main/java/com/tianhua/datafactory/domain/ability/TransEventHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..d9d8c94f4803a5f465fb453a7682450591b5db76 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/ability/TransEventHandler.java @@ -0,0 +1,23 @@ +package com.tianhua.datafactory.domain.ability; + + +import com.tianhua.datafactory.domain.event.BaseEvent; + +/** + * Description:事务处理接口 + * date: 2022/1/8 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public interface TransEventHandler { + /** + * 抽象事务处理接口 + * 实现此接口的类方法上需要加 + * @TransactionalEventListener(fallbackExecution = true) + * + * @param baseEvent + */ + void handleTransEvent(T baseEvent); +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/AbstractClassBean.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/AbstractClassBean.java new file mode 100644 index 0000000000000000000000000000000000000000..3189a119dac16a18cbcb62c9482d7ebc01919120 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/AbstractClassBean.java @@ -0,0 +1,211 @@ +package com.tianhua.datafactory.domain.bo; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.tianhua.datafactory.domain.bo.bean.InterfaceBean; +import com.tianhua.datafactory.domain.bo.bean.MethodBean; +import com.tianhua.datafactory.domain.bo.model.FieldBO; +import lombok.Data; +import org.springframework.util.CollectionUtils; + +import java.util.*; + +/** + * Description: + * 抽象plantuml 类 + * date: 2021/6/28 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public abstract class AbstractClassBean { + + + /** + * 类名 + */ + protected String className; + + /** + * 所在包 + */ + protected String packageName; + /** + * 所属模块 + */ + protected String belongModel; + + /** + * 类描述 + */ + protected String classDesc; + + /** + * 方法 + */ + private List methodBeanList; + + + /** + * 父类方法列表 + */ + private List superMethodBeanList; + + /** + * 父类属性列表 + * + */ + private List superFieldBeanList; + + /** + * 需要引入的class包名 + */ + private List importClassList; + /** + * 属性列表 + * + */ + private List fieldBeanList; + + + + /** + * 实现接口 + */ + private InterfaceBean implInterfaceBean; + + /** + * 继承类列表 + */ + private String relationClassStr; + /** + * 项目作者 + */ + private String author; + + /** + * 所在plantUML的包名 + */ + private String plantUMLPackage; + + /** + * 是否是派生类 + */ + private boolean isDerived; + + /** + * 组件名称 + * 根据该标示判断是否是plantUML类图中的还是组件扫描引入的 + */ + private String compName; + + + private String bodtoConvertInterface; + + private String bodoConvertInterface; + + private String bovoConvertInterface; + + /** + * 在动态调用中产生的引用包 + */ + private List dynamicImportPackageList = new ArrayList<>(); + + + private List thisClassImportPackageList = new ArrayList<>(); + + /** + * 子类需要导入的包 + */ + private List childClassImportPackageList = new ArrayList<>(); + + + /** + * 枚举值列表 + */ + private List> enumValueList; + + /** + * 派生类链路 + * 如bo派生dto + * dto的派生链路里就有boclass + * 用来记录派生过程中的关联关系 + */ + private List derivedChainClassList; + + + /** + * 类上的注释 + */ + private String annotation; + + /** + * 所属上下文 + */ + private String context = ""; + + /** + * plantUML的扩展注解标示 + */ + private List annotationTagList; + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AbstractClassBean that = (AbstractClassBean) o; + return Objects.equals(className, that.className) && + Objects.equals(packageName, that.packageName); + } + + @Override + public int hashCode() { + return Objects.hash(className, packageName); + } + + + public void buildPlantUMLPackage(String plantUMLPackage){ + if(plantUMLPackage.contains("\"")){ + String content = plantUMLPackage.split("\"")[1]; + if(content.contains("-")){ + String [] arr = content.split("-"); + if(arr[1].contains(".")){ + this.setPlantUMLPackage(arr[1].trim()); + return; + } + if(arr[0].contains(".")){ + this.setPlantUMLPackage(arr[0].trim()); + return; + } + + } + } + + this.setPlantUMLPackage(plantUMLPackage.trim().trim()); + } + + /** + * 合并引用包, + * 接口的引用包与实现的引用包合并 + * @param importClassList + */ + public void mergeImportClass(List importClassList){ + if(CollectionUtils.isEmpty(importClassList)){ + return; + } + if(CollectionUtils.isEmpty(this.getImportClassList())){ + this.setImportClassList(importClassList); + }else { + Set newHashSet = Sets.newHashSet(importClassList); + for (String importClassName : this.getImportClassList()){ + newHashSet.remove(importClassName); + } + this.getImportClassList().addAll(Lists.newArrayList(newHashSet)); + } + } + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/BaseBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/BaseBO.java new file mode 100644 index 0000000000000000000000000000000000000000..15110029ec9ca38451142b5ee243fbdb03bc62d2 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/BaseBO.java @@ -0,0 +1,124 @@ +package com.tianhua.datafactory.domain.bo; + +import com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum; + +import java.util.Date; + +/** + * Description: + * date: 2022/4/24 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class BaseBO { + /** 创建时间 **/ + public Date dateCreate; + /** 修改时间 **/ + public Date dateUpdate; + /** 修改人 **/ + public Long updateUserId; + /** 创建人 **/ + public Long createUserId; + + public Integer status; + + private String statusDesc; + public void init(){ + this.status = ApiModelFieldStatusEnum.USING.getStatus(); + this.createUserId = 1L; + this.updateUserId = 1L; + this.dateCreate = new Date(); + this.dateUpdate = new Date(); + } + + public Date getDateCreate() { + return dateCreate; + } + + public void setDateCreate(Date dateCreate) { + this.dateCreate = dateCreate; + } + + public Date getDateUpdate() { + return dateUpdate; + } + + public void setDateUpdate(Date dateUpdate) { + this.dateUpdate = dateUpdate; + } + + public Long getUpdateUserId() { + return updateUserId; + } + + public void setUpdateUserId(Long updateUserId) { + this.updateUserId = updateUserId; + } + + public Long getCreateUserId() { + return createUserId; + } + + public void setCreateUserId(Long createUserId) { + this.createUserId = createUserId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + + public String getStatusDesc() { + return statusDesc; + } + + public void setStatusDesc(String statusDesc) { + this.statusDesc = statusDesc; + } + + public void willDeprecate() { + this.setStatus(ApiModelFieldStatusEnum.WILL_DEPRECATED.getStatus()); + } + + public void deprecate() { + this.setStatus(ApiModelFieldStatusEnum.DEPRECATED.getStatus()); + } + + public void using() { + this.setStatus(ApiModelFieldStatusEnum.USING.getStatus()); + } + + public void delete() { + this.setStatus(ApiModelFieldStatusEnum.DELETEED.getStatus()); + } + + + /** + * 状态行为封装 + * @param status + */ + public void updateStatus(Integer status){ + if(status == null){ + return; + } + if(ApiModelFieldStatusEnum.DELETEED.getStatus().intValue() == status.intValue()){ + this.delete(); + } + if(ApiModelFieldStatusEnum.USING.getStatus().intValue() == status.intValue()){ + this.using(); + } + if(ApiModelFieldStatusEnum.DEPRECATED.getStatus().intValue() == status.intValue()){ + this.deprecate(); + } + if(ApiModelFieldStatusEnum.WILL_DEPRECATED.getStatus().intValue() == status.intValue()){ + this.willDeprecate(); + } + } + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/ClassBean.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/ClassBean.java new file mode 100644 index 0000000000000000000000000000000000000000..78856fce61343de9fe17eaf3f8c72396e5dd3f31 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/ClassBean.java @@ -0,0 +1,15 @@ +package com.tianhua.datafactory.domain.bo; + + +/** + * Description: + * class 类信息 + * date: 2021/6/28 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class ClassBean extends AbstractClassBean { + +} diff --git a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/vo/DataFactoryRequestVo.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/DataBuildRequestBean.java similarity index 50% rename from datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/vo/DataFactoryRequestVo.java rename to domain/src/main/java/com/tianhua/datafactory/domain/bo/DataBuildRequestBean.java index 28627bd248deb1178e13f48a2bc051d9a52da4be..da0cb30af2c881c2ed7e71884891d87e11334c0e 100644 --- a/datafactory-api/src/main/java/com/coderman/tianhua/datafactory/api/vo/DataFactoryRequestVo.java +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/DataBuildRequestBean.java @@ -1,5 +1,6 @@ -package com.coderman.tianhua.datafactory.api.vo; +package com.tianhua.datafactory.domain.bo; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; import lombok.Data; import lombok.ToString; @@ -13,36 +14,25 @@ import java.util.List; */ @Data @ToString -public class DataFactoryRequestVo { +@Deprecated +public class DataBuildRequestBean { /** - * 项目名称--中文 + * 项目编码 */ - private String projectName; + private String projectCode; - /** - * 服务名称--英文 - */ - private String serviceName; - - /** - * 模块名称--英文 - */ - private String moduleName; - - /** - * 模块名称--中文 - */ - private String moduleDesc; /** * 创建多少条数据 max 100w */ private int generateCount; + + /** * 模块变量 */ - private List dataFactoryRequestFieldVoList; + private List dataFactoryRequestFieldBeanList; /** * 是否持久化数据构建请求以复用 diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataBuildRequestFieldRuleBean.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/DataBuildRequestFieldRuleBean.java similarity index 91% rename from datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataBuildRequestFieldRuleBean.java rename to domain/src/main/java/com/tianhua/datafactory/domain/bo/DataBuildRequestFieldRuleBean.java index 4174e9608c8c85e037b21bb9804c67d136fd439f..288424af38a2c319486720f1e5446c88890b029c 100644 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataBuildRequestFieldRuleBean.java +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/DataBuildRequestFieldRuleBean.java @@ -1,4 +1,4 @@ -package com.coderman.tianhua.datafactory.core.bean; +package com.tianhua.datafactory.domain.bo; import lombok.Data; import lombok.ToString; @@ -10,9 +10,11 @@ import lombok.ToString; * author: coderman
* version: 1.0
* 字段生成的特殊规则 + * 暂时先不支持 */ @Data @ToString +@Deprecated public class DataBuildRequestFieldRuleBean { /** * 值前缀--适用于str类型 diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/EnumBean.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/EnumBean.java new file mode 100644 index 0000000000000000000000000000000000000000..d0425cf9dd7f2433efc65a58609831348d22f3fd --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/EnumBean.java @@ -0,0 +1,24 @@ +package com.tianhua.datafactory.domain.bo; + +import lombok.Data; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description: 枚举类 + * date: 2021/6/28 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class EnumBean extends AbstractClassBean { + + + + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/GenericTypeBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/GenericTypeBO.java new file mode 100644 index 0000000000000000000000000000000000000000..bd14465d15689121d18e97073784a1b08efe511a --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/GenericTypeBO.java @@ -0,0 +1,67 @@ +package com.tianhua.datafactory.domain.bo; + +import com.tianhua.datafactory.domain.bo.project.ApiBO; +import lombok.Data; + +import java.util.Map; + +/** + * Description + * + * java泛型模型 + * date: 2022/8/28 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class GenericTypeBO { + + /** + * 泛型外部包装类型 + */ + private String wrapType; + + /** + * 泛型被包裹的类型 + */ + private String realType; + + /** + * map-key的类型 + */ + private String realKeyType; + /** + * map-value的类型 + */ + private String realValueType; + + /** + * 泛型子类型 + */ + private Map subGenericTypeMap; + + /** + * 对应的api模型 + */ + private ApiBO apiBO; + + + /** + * 泛型被包裹的类型是否是模型对象 + */ + private boolean realTypeModel; + + /** + * map-key的类型是否是模型对象 + */ + private boolean realKeyTypeModel; + /** + * map-value的类型是否是模型对象 + */ + private boolean realValueTypeModel; + + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/HttpApiRequestBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/HttpApiRequestBO.java new file mode 100644 index 0000000000000000000000000000000000000000..1d8ad27ab2659b166f0fe0699f79f0c5f8072a7d --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/HttpApiRequestBO.java @@ -0,0 +1,91 @@ +package com.tianhua.datafactory.domain.bo; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description + * date: 2022/9/1 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class HttpApiRequestBO { + private String url; + /** + * get post? + */ + private String methodType; + + private String serviceName; + + /** + * 参数列表 + */ + private Map params; + + + private Map HeadParams; + + /** + * 返回类型 + * + * list + * set + * ResultDto + */ + private String returnType; + + /** + * 接口返回的参数模型中,有哪些参数可以作为数据源 + */ + private List paramFieldList; + + /** + * 数据提取规则 + */ + private Map fieldExtractRuleMap; + + /** + * 数据源 + */ + private String dataSourceCode; + + + public HttpApiRequestBO(String url){ + this.url = url; + this.params = new HashMap<>(); + } + + public HttpApiRequestBO(String url,Map paramMap){ + this.url = url; + this.params = paramMap; + } + public void addParam(String key,Object value){ + if(params == null) { + params = new HashMap<>(); + } + + params.put(key,value); + } + + public void addParamField(String fieldName){ + if(this.paramFieldList == null){ + this.paramFieldList = new ArrayList<>(); + } + + this.paramFieldList.add(fieldName); + } + + + + + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/PageBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/PageBO.java new file mode 100644 index 0000000000000000000000000000000000000000..9964eb0ccb654e785df6487067bcbbf20a8812af --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/PageBO.java @@ -0,0 +1,115 @@ +package com.tianhua.datafactory.domain.bo; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** +* Description:参考Mybatis_PageHelper的Page对象封装的DTO +* date: 2021/10/26 +* +* @author shenshuai +* @version 1.0.0 +* @since JDK 1.8 +*/ +public class PageBO implements Serializable { + + private static final long serialVersionUID = -2470832822882514457L; + /** + * 页码,从1开始 + */ + private int currentPageNum; + + /** + * 当前页的下一页 + */ + private int nextPageNum; + + /** + * 当前页的上一页 + */ + private int prePageNum; + /** + * 页面大小 + */ + private int pageSize; + /** + * 起始行 + */ + private int startRow; + /** + * 末行 + */ + private int endRow; + /** + * 总数 + */ + private long totalRows; + /** + * 总页数 + */ + private int totalPages; + /** + * 包含count查询 + */ + private boolean count = true; + /** + * 分页合理化 + */ + private Boolean reasonable; + /** + * 当设置为true的时候,如果pagesize设置为0(或RowBounds的limit=0),就不执行分页,返回全部结果 + */ + private Boolean pageSizeZero; + /** + * 进行count查询的列名 + */ + private String countColumn; + /** + * 排序 + */ + private String orderBy; + /** + * 只增加排序 + */ + private boolean orderByOnly; + + private List Items; + + + /** + * 针对简单场景 参数的查询map处理 + */ + private Map queryMap; + + /** + * 针对复杂场景 参数的查询queryDTO对象处理 + */ + private Object queryDTO; + + + public Map getQueryMap() { + return queryMap; + } + + public void setQueryMap(Map queryMap) { + this.queryMap = queryMap; + } + + public Object getQueryDTO() { + return queryDTO; + } + + public void setQueryDTO(Object queryDTO) { + this.queryDTO = queryDTO; + } + + public List getItems() { + return Items; + } + + public PageBO setItems(List items) { + Items = items; + return this; + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/InterfaceBean.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/InterfaceBean.java new file mode 100644 index 0000000000000000000000000000000000000000..623ac01ff9c57d9f66540ab47a65ee9fe45514b0 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/InterfaceBean.java @@ -0,0 +1,18 @@ +package com.tianhua.datafactory.domain.bo.bean; + + +import com.tianhua.datafactory.domain.bo.AbstractClassBean; + +/** + * Description: + * + * 领域接口 + * date: 2021/6/28 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class InterfaceBean extends AbstractClassBean { + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/MethodBean.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/MethodBean.java new file mode 100644 index 0000000000000000000000000000000000000000..2a946674d29ea5f7b91cb3b6ed27199a99c43a7f --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/MethodBean.java @@ -0,0 +1,229 @@ +package com.tianhua.datafactory.domain.bo.bean; + +import com.tianhua.datafactory.domain.enums.VisibilityEnum; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.CollectionUtils; + +import java.util.*; + +/** + * Description: + * date: 2021/6/28 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class MethodBean { + + public MethodBean(){} + public MethodBean(String methodName, String returnClass){ + this.methodName = methodName; + this.returnClass = returnClass; + } + + public MethodBean(String methodName, String returnClass, String desc){ + this.methodName = methodName; + this.returnClass = returnClass; + this.desc = desc; + } + /** + * 方法名称, + * 包括参数,括号 + */ + private String methodName; + /** + * 访问权限 + */ + private String visibility; + + /** + * 方法描述 + */ + private String desc; + + /** + * 是否是静态属性 + */ + private boolean isStatic; + + /** + * 方法返回值 + */ + private String returnClass; + + /** + * 方法返回对象所在包 + */ + private String returnClassPackage; + + + /** + * 方法内容 + */ + private String methodContent; + + /** + * 方法返回体 + */ + private String returnBody; + + /** + * controller方法的请求路径 + */ + private String pathValue; + + + /** + * 方法调用内容,根据调用流程图-plantUML解析而来 + */ + private LinkedList invokeMethodList = new LinkedList<>(); + + + /** + * 方法文档 + */ + private String doc; + + /** + * 解析出来的方法参数列表 + */ + private String [] paramArr; + + /** + * 参数列表 + */ + private List paramBeanList; + + /** + * list 扩展性比较强 + * 对于mapper和controller需要增加参数注解的进行动态构建参数注解 + */ + private List paramAnnotationList = new ArrayList<>(5); + + /** + * 所属类名 + */ + private String className; + + /** + * 方法上的注解 + */ + private String annotation; + + /** + * 方法的范型返回值 + */ + private String genericReturnType; + + /** + * 方法的范型参数 + */ + private List genericParamList; + + /** + * 是否是bo模型定义的扩展接口 + */ + private boolean modelExtendMethod; + + /** + * plantUML的扩展注解标示 + */ + private List annotationTagList; + + + + private String simpleMethodNameInfo; + + /** + * 优化方法接口注释 + * @param desc + */ + public void buildDesc(String desc){ + if(desc.startsWith(VisibilityEnum.PUBLIC.getTag()) + || desc.startsWith(VisibilityEnum.PRIVATE.getTag()) + || desc.startsWith(VisibilityEnum.PROTECT.getTag())){ + String newDesc = desc.substring(1); + this.setDesc(newDesc); + }else { + this.setDesc(desc); + } + } + + + /** + * 从方法名称中解析到方法参数 + */ + public void buildParamArr(){ + if(this.getParamArr() != null){ + return; + } + if(!this.getMethodName().contains("(") && !this.getMethodName().contains(")")){ + return; + } + if (!this.getMethodName().contains("()")){ + String [] paramArr = this.getMethodName().replace(")","").split("\\(")[1].split(","); + + if(paramArr != null && paramArr.length>=1){ + this.setParamArr(paramArr); + } + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MethodBean that = (MethodBean) o; + return Objects.equals(methodName, that.methodName) && + Objects.equals(returnClass, that.returnClass) && + Objects.equals(className, that.className); + } + + @Override + public int hashCode() { + return Objects.hash(methodName, returnClass, className); + } + + /** + * 刷新方法声明,注入方法参数注解,也可能是方法注解,后续可扩展 + * @return + */ + public String refreshMethodName(){ + if(CollectionUtils.isEmpty(this.paramAnnotationList)){ + return this.getMethodName(); + } + String preMethod = this.getMethodName().split("\\(")[0]; + StringBuilder builder = new StringBuilder(preMethod); + List paramList = new ArrayList<>(); + for (int i = 0;i < this.getParamArr().length;i ++){ + String annotation = this.paramAnnotationList.get(i); + String param = this.getParamArr()[i]; + paramList.add(annotation + " " + param); + } + builder.append("("); + builder.append(StringUtils.join(paramList,", ")); + builder.append(")"); + + return builder.toString(); + } + + /** + * 将方法中的参数信息去掉,仅仅获取方法名 + * @return + */ + public String getSimplMethodName(){ + if(this.getMethodName().contains("()")){ + this.simpleMethodNameInfo = this.getMethodName().replace("()",""); + return this.simpleMethodNameInfo; + } + else { + this.simpleMethodNameInfo = this.getMethodName().split("\\(")[0]; + return this.simpleMethodNameInfo; + } + } + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/PageBean.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/PageBean.java new file mode 100644 index 0000000000000000000000000000000000000000..a6f052f0cdbcb3abd942dc266feb2e62f4829a8f --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/PageBean.java @@ -0,0 +1,147 @@ +package com.tianhua.datafactory.domain.bo.bean; + +import java.util.List; +import java.util.Map; + +/** + * Description: + * date: 2022/4/24 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class PageBean{ + private String orderBy; + private String orderDir; + /** + * 当前页数 + */ + private Integer page = 1; + + /** + * 每页要展示的数量 + */ + private Integer perPage = 5; + + /** + * 分页接口返回的总数量 + */ + private Integer count; + + /** + * 分页接口返回的当前页数据 + */ + private List rows; + + /** + * 起始行 + */ + private Integer startRow; + /** + * 末行 + */ + private Integer endRow; + + private String orderByInfo; + + private Map query; + + public Map getQuery() { + return query; + } + + public void setQuery(Map query) { + this.query = query; + } + + public String getOrderByInfo() { + return orderByInfo; + } + + public void setOrderByInfo(String orderByInfo) { + this.orderByInfo = orderByInfo; + } + + public Integer getStartRow() { + return startRow; + } + + public void setStartRow(Integer startRow) { + this.startRow = startRow; + } + + public Integer getEndRow() { + return endRow; + } + + public void setEndRow(Integer endRow) { + this.endRow = endRow; + } + + /** + * 计算起止行号 + */ + public void calculateStartAndEndRow() { + this.startRow = this.page > 0 ? (this.page - 1) * this.perPage : 0; + this.endRow = this.perPage; + } + + public void dealOrderByInfo(){ + if(this.orderBy != null && this.orderDir != null){ + this.orderByInfo = " order by "+ orderBy + " "+ this.orderDir; + } + } + + + public String getOrderBy() { + return orderBy; + } + + public void setOrderBy(String orderBy) { + this.orderBy = orderBy; + } + + public String getOrderDir() { + return orderDir; + } + + public void setOrderDir(String orderDir) { + this.orderDir = orderDir; + } + + public Integer getPage() { + return page; + } + + public void setPage(Integer page) { + this.page = page; + } + + public Integer getPerPage() { + return perPage; + } + + public void setPerPage(Integer perPage) { + this.perPage = perPage; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/ParamBean.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/ParamBean.java new file mode 100644 index 0000000000000000000000000000000000000000..866fffd14c888b396d61b0a0829ee5a83b83a7a7 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/ParamBean.java @@ -0,0 +1,67 @@ +package com.tianhua.datafactory.domain.bo.bean; + +/** + * Description: + * date: 2022/3/14 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class ParamBean { + + + public ParamBean(){} + public ParamBean(String paramClass, String paramName){ + this.paramClass = paramClass; + this.paramName = paramName; + } + + /** + * 参数类型 + */ + private String paramClass; + + /** + * 参数类型 + */ + private String paramName; + + + /** + * 是否是范型参数 + */ + private boolean genericType; + + + public String getParamName() { + return paramName; + } + + public void setParamName(String paramName) { + this.paramName = paramName; + } + + public String getParamClass() { + return paramClass; + } + + public void setParamClass(String paramClass) { + this.paramClass = paramClass; + } + + + public boolean isGenericType() { + return genericType; + } + + public void setGenericType(boolean genericType) { + this.genericType = genericType; + } + + public static ParamBean getInstance(String paramClass, String paramName, Boolean genericType){ + ParamBean paramBean = new ParamBean(paramClass,paramName); + paramBean.setGenericType(genericType); + return paramBean; + } +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/PlantUMLApiContextBean.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/PlantUMLApiContextBean.java new file mode 100644 index 0000000000000000000000000000000000000000..49b917976366159d5bc08028c7c267a5933cda95 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/PlantUMLApiContextBean.java @@ -0,0 +1,76 @@ +package com.tianhua.datafactory.domain.bo.bean; + +import com.coderman.utils.kvpair.KVPair; +import com.tianhua.datafactory.domain.bo.EnumBean; +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; +import com.tianhua.datafactory.domain.bo.project.ApiBO; +import lombok.Data; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description: + * date: 2022/4/7 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class PlantUMLApiContextBean { + + /** + * 目标项目的项目编码 + */ + private String projectCode; + + + /** + * api模型列表 + */ + private List apiBeanList = new ArrayList<>(); + + + private List paramClassBeanList = new ArrayList<>(); + + + private Map enumBeanMap = new HashMap<>(); + + + /** + * 添加API-Bean + * @param apiBean + */ + public void addApiBean(ApiBO apiBean){ + apiBeanList.add(apiBean); + } + + /** + * 添加API-Bean + * @param apiBeanList + */ + public void addBatchApiBean(List apiBeanList){ + if(apiBeanList == null || apiBeanList.isEmpty()){ + return; + } + + for (ApiBO apiBO : apiBeanList){ + addApiBean(apiBO); + } + } + + public void addParamClassBean(ParamModelBO paramModelBO){ + this.paramClassBeanList.add(paramModelBO); + } + + + + public void addEnumBean(EnumBean enumBean) { + this.enumBeanMap.put(enumBean.getClassName(), enumBean); + } + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/PlantUmlDomainContextBean.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/PlantUmlDomainContextBean.java new file mode 100644 index 0000000000000000000000000000000000000000..bb46b771e8aa8aa6dcdaf105da8a0d25be267cc8 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/bean/PlantUmlDomainContextBean.java @@ -0,0 +1,56 @@ +package com.tianhua.datafactory.domain.bo.bean; + + +import com.tianhua.datafactory.domain.bo.ClassBean; +import com.tianhua.datafactory.domain.bo.EnumBean; +import lombok.Data; + +import java.util.*; + +/** + * Description: + * date: 2021/6/28 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class PlantUmlDomainContextBean { + + private Map classBeanMap = new HashMap<>(); + + private Map enumBeanMap = new HashMap<>(); + + private Map interfaceBeanMap = new HashMap<>(); + + + /** + * 派生类上下文 + */ + private PlantUmlDomainContextBean derivedPlantUmlContextBean; + + + /** + * app应用名称 + */ + private String appName; + + + + public void addClassBean(ClassBean classBean) { + this.classBeanMap.put(classBean.getClassName(), classBean); + } + + public void addInterfaceBean(InterfaceBean interfaceBean) { + + this.interfaceBeanMap.put(interfaceBean.getClassName(), interfaceBean); + } + + + public void addEnumBean(EnumBean enumBean) { + this.enumBeanMap.put(enumBean.getClassName(), enumBean); + } + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/ApiMockBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/ApiMockBO.java new file mode 100644 index 0000000000000000000000000000000000000000..97fa259e189621cabd5d8faaeb26a77046331cb9 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/ApiMockBO.java @@ -0,0 +1,56 @@ +package com.tianhua.datafactory.domain.bo.datafactory; + +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; +import lombok.Data; + +import java.util.List; + +/** + * Description + * date: 2022/9/11 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class ApiMockBO { + + /** + * 项目编码 + */ + private String projectCode; + + /** + * api接口签名 + */ + private String apiSign; + + + /** + * 适用于对外接口返回场景 + */ + private Boolean successData; + + + /** + * mock数据结果 + */ + private String mockResultData; + + /** + * 与api sign一样 + */ + private String apiMethod; + + /** + * 参数模型 + * + */ + private List paramModelList; + + /** + * mock数据的数量 + */ + private Integer mockCount; +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/DataBuildRequestBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/DataBuildRequestBO.java new file mode 100644 index 0000000000000000000000000000000000000000..ff0eed8e194eca7d629c4ce01124caceb56d4c9a --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/DataBuildRequestBO.java @@ -0,0 +1,74 @@ +package com.tianhua.datafactory.domain.bo.datafactory; + +import com.tianhua.datafactory.client.function.Function; +import com.tianhua.datafactory.domain.bo.BaseBO; +import lombok.Data; +import lombok.ToString; + +import java.util.List; +import java.util.Map; + +@Data +@ToString +public class DataBuildRequestBO extends BaseBO { + + /** + * 项目编码 + */ + private String projectCode; + + /** + * 模型类名 + */ + private String paramModelCode; + + /** + * 数据属性列表 + */ + private List fieldBOList; + + /** + * 生成条数 + */ + private Integer buildCount; + + /** + * insert.sql + * json.json(default) + * excel.xlsx + * + */ + private String dataUseType; + + + /** + * 模型对应的api签名 + */ + private String apiSign; + + + /** + * 是否使用ResultDTO进行api 参数结果包装 + */ + private Boolean useResultDtoWrapper; + + /** + * api返回值对应的数据源编码 + * 适用场景:非业务模型返回值如 + * String + * Long + * Integer + * List + * Set + * Boolean + * Map + * + * + */ + private String apiRespDataSourceCode; + + /** + * api返回值对应的数据规则 + */ + private DataBuildRequestFieldRuleBO dataBuildRequestFieldRuleBO; +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/DataBuildRequestFieldBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/DataBuildRequestFieldBO.java new file mode 100644 index 0000000000000000000000000000000000000000..5aa911a4153499691a986f0c3aa1644b60745e2e --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/DataBuildRequestFieldBO.java @@ -0,0 +1,160 @@ +package com.tianhua.datafactory.domain.bo.datafactory; + +import com.tianhua.datafactory.client.function.Function; +import com.tianhua.datafactory.domain.bo.DataBuildRequestFieldRuleBean; +import com.tianhua.datafactory.domain.bo.GenericTypeBO; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceBO; +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; +import lombok.Data; +import lombok.ToString; + +import java.util.List; +import java.util.Map; + +/** + * description: DataFactoryRequestFieldVo
+ * date: 2020/12/5 23:31
+ * author: coderman
+ * version: 1.0
+ */ +@Data +@ToString +public class DataBuildRequestFieldBO { + /** + * 字段名 + */ + private String fieldName; + + /** + * 字段类型 + */ + + private String fieldType; + + /** + * 字段数据源code + */ + private String dataSourceCode; + + /** + * 字段数据源类型 + */ + private Integer dataSourceType; + + + /** + * 字段默认值列表 + */ + private List defaultValueList; + + + /** + * 是否可以代表业务唯一性 + */ + private Boolean bizUnique; + + /** + * 是否可以作为领域实体标示 + */ + private Boolean bizIdentifier; + + + /** + * 用于具有一对多的数据依赖关系场景,当存在这种情况时多方不必定义 + * dataSourceCode,dataSourceField 多方取值根据一方的实际值进行路由,然后随机取一个值作为最终的值 + * + * 数据字段依赖规则 + * map.key = 字段被依赖方k-字段被依赖方value + * map.value= 字段依赖方k-字段依赖方value(有多个字段kd依赖k的值) + * + * k:字段被依赖方 + * kd:字段依赖方(有多个字段kd依赖k的值) + * map> + * + * 这里举例,假设k对应的value为1的时候 kd1对应的值有1,2,3 kd2对应的值有3,4,5 + * k对应的value为2的时候 kd1对应的值有6,7,8 kd2对应的值有1,2 + * + * 这里依赖的是静态值 + */ + private Map> varDependencyMap; + + /** + * 内置的生成数据的随机函数 + */ + private Function function; + + /** + * 数据源 + */ + private DataSourceBO dataSourceBO; + + /** + * 构建的属性模型DSL描述 + */ + private String buildRuleDSL; + + + /** + * 属性值生成规则 + */ + private DataBuildRequestFieldRuleBO dataBuildRequestFieldRuleBO; + + + /** + * 属性是模型类型如: + * a引用的b属性是xxBO,xxDTO,或者List + */ + private List referFieldList; + + + /** + * 源属性名称 + */ + private String originFieldName; + + /** + * 如果集合类的业务模型属性如List + * 或者Map + * 则realFieldType为XxxBO + * + */ + private String realFieldType; + + + /** + * 如果是api参数则需要属性与api参数模型绑定 + */ + private ParamModelBO paramModelBO; + + /** + * 泛型信息 + */ + private GenericTypeBO genericTypeBO; + + /** + * 获取属性的泛型类型 + * @return + */ + public String getGenerics(){ + + if(fieldType.contains("List<")){ + String genericType = fieldType.replaceFirst("List<",""); + if(genericType.contains(">>")){ + return genericType.replace(">>",">"); + } + return genericType.replace(">",""); + } + + if(fieldType.contains("Set<")){ + String genericType = fieldType.replaceFirst("Set<",""); + if(genericType.contains(">>")){ + return genericType.replace(">>",">"); + } + return genericType.replace(">",""); + } + return null; + + } + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/DataBuildRequestFieldRuleBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/DataBuildRequestFieldRuleBO.java new file mode 100644 index 0000000000000000000000000000000000000000..de2fdfa8ed44f20bedc7fbd2538b8fecaf5854f6 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/DataBuildRequestFieldRuleBO.java @@ -0,0 +1,74 @@ +package com.tianhua.datafactory.domain.bo.datafactory; + +import lombok.Data; + +import java.util.List; + +import java.util.Set; + +/** + * Description + * date: 2022/8/12 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class DataBuildRequestFieldRuleBO { + + /** + * 当前属性值的默认前缀 + */ + private String prefix; + + /** + * 当前属性值的默认后缀 + */ + private String subfix; + + + /** + * 当前属性依赖的另外一个属性名称 + * a.b.c.xxFieldValue = currentFieldValue + */ + private String relyField; + + /** + * 当前依赖的List,属性要生成多少条 + */ + private Integer genCount; + + /** + * 属性值需要的数据源编码 + */ + private String dataSourceCode; + + /** + * 当前属性值依赖的脚本计算内容 + */ + private String relyScript; + + /** + * 当前属性如果依赖具体函数,但是需要传入参数灵活控制则可以使用这个 + * 如果是依赖某个属性的值作为内置函数的参数则可以使用$fieldName + */ + private String funcVar; + + + /** + * 如果是map结构,则标示key对应的规则 + */ + private String relyKeyField; + /** + * 如果是map结构,则标示value对应的规则 + */ + private String relyValueField; + + /** + * 配置的默认值列表 + */ + private String defaultValues; + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/DataBuildResponseBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/DataBuildResponseBO.java new file mode 100644 index 0000000000000000000000000000000000000000..764aebaf2f55befa8bb1d312325d9ba4a98fd496 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/DataBuildResponseBO.java @@ -0,0 +1,26 @@ +package com.tianhua.datafactory.domain.bo.datafactory; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * Description + * date: 2022/8/13 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class DataBuildResponseBO { + /** + * 数据构建请求对象 + */ + private DataBuildRequestBO dataBuildRequestBO; + /** + * 数据构建结果集 + */ + private List> resultList; +} diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataSourceFieldRequestBean.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/DataSourceFieldRequestBean.java similarity index 81% rename from datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataSourceFieldRequestBean.java rename to domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/DataSourceFieldRequestBean.java index 91f281492554ebbd0fa1ba492727a77a3a7e473a..32d8c1fe4feb89db936b2bc3a7070612102de5e3 100644 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/bean/DataSourceFieldRequestBean.java +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/DataSourceFieldRequestBean.java @@ -1,6 +1,7 @@ -package com.coderman.tianhua.datafactory.core.bean; +package com.tianhua.datafactory.domain.bo.datafactory; -import com.coderman.tianhua.datafactory.client.function.Function; +import com.tianhua.datafactory.client.function.Function; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; import lombok.Data; import java.security.SecureRandom; @@ -21,7 +22,7 @@ public class DataSourceFieldRequestBean { /** * 当前请求的字段 */ - private DataBuildRequestFieldBean dataFactoryRequestFieldBean; + private DataBuildRequestFieldBO dataBuildRequestFieldBO; /** * 随机数对象 */ @@ -30,10 +31,6 @@ public class DataSourceFieldRequestBean { //当前请求数据源code 列表对应的value的集合 private Map fieldValueMap; - /** - * 内置的生成数据的随机函数 - */ - private Function function; /** * 用于具有一对多的数据依赖关系场景,当存在这种情况时多方不必定义 * dataSourceCode,dataSourceField 多方取值根据一方的实际值进行路由,然后随机取一个值作为最终的值 @@ -52,4 +49,10 @@ public class DataSourceFieldRequestBean { * 这里依赖的是静态值 */ private Map> varDependencyMap; + + + /** + * 当前生成记录的索引 + */ + private Integer currentIndex; } diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/FieldDSLKeyConstant.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/FieldDSLKeyConstant.java new file mode 100644 index 0000000000000000000000000000000000000000..d87456df5137d97f7467a789a5ccc35a7bf87d96 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datafactory/FieldDSLKeyConstant.java @@ -0,0 +1,55 @@ +package com.tianhua.datafactory.domain.bo.datafactory; + +/** + * Description + * + * 属性值相关的领域特定语言DSL + * date: 2022/8/13 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class FieldDSLKeyConstant { + /** + * 属性值前缀 + */ + public static final String PREFIX = "prefix"; + + /** + * 属性值后缀 + */ + public static final String SUBFIX = "subfix"; + /** + * 属性值依赖另外一个属性值 + */ + public static final String RELY_FIELD = "relyField"; + + /** + * 属性值依赖特定的数据源编码 + */ + public static final String DATA_SOURCE_CODE = "dataSourceCode"; + + /** + * 如果是集合类型的属性则需要生成多少条作为随机值集合 + */ + public static final String GEN_COUNT = "genCount"; + + /** + * 函数变量值 + */ + public static final String FUNC_VAR = "funcVar"; + + /** + * 如果属性是map kv的则需要定义key,value相关依赖 + */ + public static final String RELY_MAP_KEY_FIELD = "relyKeyField"; + + + public static final String RELY_MAP_VALUE_FIELD = "relyValueField"; + + /** + * 默认值配置 + */ + public static final String DEFAULT_VALUES = "defaultValues"; +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/datasource/DataSourceBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datasource/DataSourceBO.java new file mode 100644 index 0000000000000000000000000000000000000000..9da8ea9ea030fe781cd2612fd1bc54332e8c385d --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datasource/DataSourceBO.java @@ -0,0 +1,89 @@ +package com.tianhua.datafactory.domain.bo.datasource; + +import com.tianhua.datafactory.domain.bo.BaseBO; +import com.tianhua.datafactory.domain.enums.DataSourceTypeEnum; +import com.tianhua.datafactory.domain.support.kvpair.KVPairBO; +import lombok.Data; +import lombok.ToString; + +import java.util.Date; +import java.util.List; + +/** +* @Description:数据源管理表VO类 +* @Author:fanchunshuai +* @CreateTime:2020-12-02 23:07:13 +* @version v1.0 +*/ +@Data +@ToString +public class DataSourceBO extends BaseBO { + + + /** 主键 **/ + private Long id; + + /** 数据源名称 **/ + private String sourceName; + + /** 数据源code,全局唯一 **/ + /** + * 格式如下: + * 服务名:com.xxx.xxx.服务名.模块名.模型名 + */ + private String sourceCode; + + /** + * + * 数据源类型 + * @See DataSourceTypeEnum + */ + private Integer sourceType; + + /** + * 服务提供者域名 + */ + private String providerDomainUrl; + + /** + * 注册中心类型 + */ + private Integer registServer; + + + /** + * 数据提供来源服务 + */ + private String providerService; + + /** 数据源访问url **/ + private String url; + + /** 访问策略 **/ + private Integer visitStrategy; + + /** + * 数据源返回格式 + */ + private String structType; + + /** + * 数据源请求配置参数 + */ + private List dataSourceReqConfigList; + + /** + * 数据源响应配置参数 + */ + private List dataSourceRespConfigList; + + + private List kvPairList; + + + public boolean isLocalEnum(){ + return sourceType == DataSourceTypeEnum.FROM_SERVICE_ENUM.getCode(); + + } + +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/datasource/DataSourceDetailBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datasource/DataSourceDetailBO.java new file mode 100644 index 0000000000000000000000000000000000000000..23cf936f4289f3a3ee0e871f48329b4b78e89581 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datasource/DataSourceDetailBO.java @@ -0,0 +1,27 @@ +package com.tianhua.datafactory.domain.bo.datasource; + +import lombok.Data; +import lombok.ToString; + +/** +* @Description:数据源详情表VO类 +* @Author:fanchunshuai +* @CreateTime:2020-12-02 23:07:13 +* @version v1.0 +*/ +@Data +@ToString +public class DataSourceDetailBO { + + + /** 主键 **/ + private Long id; + + /** 所属数据源id **/ + private Long dataSourceId; + + /** 数据源内容 **/ + private String dataContentJson; + + +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/datasource/DataSourceReqConfigBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datasource/DataSourceReqConfigBO.java new file mode 100644 index 0000000000000000000000000000000000000000..5c128e4b79557135f66751b4cc6aef003ee480f3 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datasource/DataSourceReqConfigBO.java @@ -0,0 +1,49 @@ +package com.tianhua.datafactory.domain.bo.datasource; + +import lombok.Data; + +/** + * Description: + * date: 2022/6/2 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class DataSourceReqConfigBO { + + /** + * 参数key + */ + private String paramKey; + + /** + * 参数值 + */ + private String paramValue; + + /** + * 参数描述 + */ + private String paramDesc; + + /** + * 是否是可选参数 + */ + private boolean required; + + /** + * 是否是请求接口参数 + */ + private boolean interfaceParam; + + + public DataSourceReqConfigBO(){} + + public DataSourceReqConfigBO(String paramKey, String paramValue){ + this.paramKey = paramKey; + this.paramValue = paramValue; + } + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/datasource/DataSourceRespConfigBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datasource/DataSourceRespConfigBO.java new file mode 100644 index 0000000000000000000000000000000000000000..cc39262c70f6d0dea7a819e978cd52f796352ccc --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/datasource/DataSourceRespConfigBO.java @@ -0,0 +1,40 @@ +package com.tianhua.datafactory.domain.bo.datasource; + +import lombok.Data; + +/** + * Description:数据源响应参数配置 + * date: 2022/6/2 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class DataSourceRespConfigBO { + /** + * + */ + private String fieldKey; + + /** + * 请求路径如a.b.c + */ + private String referPath; + + /** + * 数据描述 + */ + private String fieldDesc; + + /** + * 数据类型 + */ + private String fieldType; + + public DataSourceRespConfigBO (){} + public DataSourceRespConfigBO(String fieldKey, String fieldType){ + this.fieldKey = fieldKey; + this.fieldType = fieldType; + } +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/filedatasource/FieldIndexBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/filedatasource/FieldIndexBO.java new file mode 100644 index 0000000000000000000000000000000000000000..8b4dc8df2763813283883d2968716e8eab96bb64 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/filedatasource/FieldIndexBO.java @@ -0,0 +1,53 @@ +package com.tianhua.datafactory.domain.bo.filedatasource; + +import lombok.Data; + +/** + * Description + * date: 2022/9/2 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class FieldIndexBO { + /** + * 属性对应的列的索引编号 + */ + private Integer index; + + /** + * 属性名称 + */ + private String fieldName; + + /** + * 属性类型 + */ + private String fieldType; + + public Integer getIndex() { + return index; + } + + public void setIndex(Integer index) { + this.index = index; + } + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public String getFieldType() { + return fieldType; + } + + public void setFieldType(String fieldType) { + this.fieldType = fieldType; + } +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/filedatasource/FileDataSourceBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/filedatasource/FileDataSourceBO.java new file mode 100644 index 0000000000000000000000000000000000000000..7d609bb06b945894b2975a022e6cedf930e8d5d1 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/filedatasource/FileDataSourceBO.java @@ -0,0 +1,81 @@ +package com.tianhua.datafactory.domain.bo.filedatasource; + +import com.tianhua.datafactory.client.context.FieldIndex; +import lombok.Data; + +import java.util.List; + +/** + * Description + * 文件资源模型 + * date: 2022/9/2 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class FileDataSourceBO { + /** + * 方便本地化数据源管理 + * 用用户名作为标识来区分 + */ + private String userName; + + /** + * 数据源编码 + * 全局唯一 + */ + private String dataSourceCode; + + /** + * 数据源名称 + */ + private String dataSourceName; + + + /** + * 文件地址 + */ + private String fileUrl; + + /** + * 文件解析格式 + * 空格,逗号,分号,竖杠 + */ + private String splitTag; + + /** + * txt,json,excel + */ + private String fileType; + + + /** + * 一次加载读取的数量 + * 例如1000w数据,随机取10w数据作为数据内容用来随机生成 + */ + private Integer readCount; + + /** + * 总数量 + */ + private Integer totalCount; + + /** + * 加载的数量 + */ + private Integer loadCount; + + /** + * 要忽略多少条 + */ + private Integer skipCount; + + + /** + * 属性模型 + */ + private List fieldIndexBOList; + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/ColumnBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/ColumnBO.java new file mode 100644 index 0000000000000000000000000000000000000000..3c3ba5af4b9debc193694344e652fe7ab7be99ce --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/ColumnBO.java @@ -0,0 +1,46 @@ +package com.tianhua.datafactory.domain.bo.model; + + +import com.tianhua.datafactory.domain.bo.BaseBO; +import lombok.Data; +import lombok.ToString; + +/** +* @Description:数据库column模型信息类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Data +@ToString +public class ColumnBO extends BaseBO { + + + private Long tableId; + + /** 字段名称 **/ + private String columnName; + + /** 字段描述 **/ + private String columnComment; + + /** 字段长度 **/ + private Integer columnLength; + + /** 字段是否为空 **/ + private boolean notNull; + + /** 字段默认值 **/ + private String defaultValue; + + /** 数据库编码 **/ + private String tableName; + + /** 是否唯一键 **/ + private boolean uniqColumn; + + + /** 字段类型 **/ + private String columnType; + +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/FieldBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/FieldBO.java new file mode 100644 index 0000000000000000000000000000000000000000..66774d31ca8b90e0bc8d24ac65afefab9a4f6f92 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/FieldBO.java @@ -0,0 +1,79 @@ +package com.tianhua.datafactory.domain.bo.model; + +import com.tianhua.datafactory.domain.bo.BaseBO; +import com.tianhua.datafactory.domain.enums.VisibilityEnum; +import lombok.Data; +import lombok.ToString; + +import java.util.List; + +/** +* @Description:属性信息类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Data +@ToString +public class FieldBO extends BaseBO { + + private Long id; + + /** 属性名称 **/ + private String fieldName; + + /** 属性描述 **/ + private String fieldDesc; + + /** 属性中文注释 + * + * **/ + private String fieldDoc; + + + /** 参数类名称 **/ + private String paramClassName; + + + /** 项目编码 **/ + private String projectCode; + + /** + * 属性类型(java) + */ + private String fieldType; + + + private boolean extendFieldTag = false; + + + /** + * 扩展字段 + */ + private FieldExtBO fieldExtBO; + + + /** + * 构建属性注释 + * @param desc + */ + public void buildDesc(String desc){ + if(desc.startsWith(VisibilityEnum.PUBLIC.getTag()) + || desc.startsWith(VisibilityEnum.PRIVATE.getTag()) + || desc.startsWith(VisibilityEnum.PROTECT.getTag())){ + String newDesc = desc.substring(1); + this.setFieldDesc(newDesc); + }else { + this.setFieldDesc(desc); + } + } + + public void buildFieldDetail(){ + if(this.getFieldName().trim().contains(" ")){ + String [] fieldArr = this.getFieldName().trim().split(" "); + this.setFieldType(fieldArr[0]); + this.setFieldName(fieldArr[fieldArr.length - 1]); + } + } + +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/FieldExtBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/FieldExtBO.java new file mode 100644 index 0000000000000000000000000000000000000000..93b041ca3a792d7a149ada45ba8f54c0f5be042a --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/FieldExtBO.java @@ -0,0 +1,73 @@ +package com.tianhua.datafactory.domain.bo.model; + +import lombok.Data; + +import java.util.List; + +/** + * Description:属性扩展字段 + * date: 2022/6/13 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class FieldExtBO { + + /** + * 属性关联的数据源 + */ + private String dataSourceCode; + + /** + * 是否可以代表业务唯一性 + */ + private Boolean bizUnique; + + /** + * 是否可以作为领域实体标示 + */ + private Boolean bizIdentifier; + + /** + * 是否是复杂数据类型(list,map,set,objrefer) + */ + private Boolean complexStruct; + + + /** + * 本身是否存在特定规则校验(邮箱格式,域名格式,身份证格式,银行卡格式,姓名中文英文等等) + */ + private Boolean checkRule; + + + /** + * 是否对应数据库字段 + */ + private Boolean mappingDBColumn; + + + /** + * 默认值列表(不超过3个,建议常量或者是否之类的,否则使用固定数据源) + */ + private List defaultValueList; + + + /** + * 值前缀--适用于str类型 + */ + private String prefixStr; + + /** + * 值后缀--适用于str类型 + */ + private String subfixStr; + + + /** + * 构建的属性模型DSL描述 + */ + private String buildRuleDSL; + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/ModelMappingBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/ModelMappingBO.java new file mode 100644 index 0000000000000000000000000000000000000000..c0354b754d9ee2295f6e4af0371fc820005b85a1 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/ModelMappingBO.java @@ -0,0 +1,66 @@ +package com.tianhua.datafactory.domain.bo.model; + + +import lombok.Data; +import lombok.ToString; + +import java.util.ArrayList; +import java.util.List; + +/** +* @Description:模型映射信息类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Data +@ToString +public class ModelMappingBO { + + private Long id; + + /** + * 映射模型类名 or表名 + */ + private String mappingClassFirst; + + /** + * 映射模型属性名 + */ + private String mappingFieldFirst; + + + /** + * 映射模型类名 or表名 + */ + private String mappingClassSecond; + + /** + * 映射模型属性名 + */ + private String mappingFieldSecond; + + + /** 映射类型 **/ + private String mappingType; + + /** 项目编码 **/ + private String projectCode; + + /** + * 关联的映射模型关系 + */ + List referMappingList; + + + public List buildMappingKey(){ + List keyList = new ArrayList<>(); + String key1 = mappingClassFirst+"."+mappingFieldFirst+":"+mappingClassSecond+"."+mappingFieldSecond; + keyList.add(key1); + String key2 = mappingClassSecond+"."+mappingFieldSecond+":"+mappingClassFirst+"."+mappingFieldFirst; + keyList.add(key2); + + return keyList; + } + +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/ModelSuffixConfigBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/ModelSuffixConfigBO.java new file mode 100644 index 0000000000000000000000000000000000000000..1acff16031b5d183162158de6e48243cfbdd5d5f --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/ModelSuffixConfigBO.java @@ -0,0 +1,28 @@ +package com.tianhua.datafactory.domain.bo.model; + + +import lombok.Data; +import lombok.ToString; + +/** +* @Description:模型后缀信息类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Data +@ToString +public class ModelSuffixConfigBO { + + private Long id; + + /** 模型后缀 **/ + private String suffix; + + /** 模型后缀描述 **/ + private String desc; + + /** 模型类型 **/ + private String modelType; + +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/ParamModelBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/ParamModelBO.java new file mode 100644 index 0000000000000000000000000000000000000000..569a65a45ea615fc8b23e5aa31dc753879e68490 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/ParamModelBO.java @@ -0,0 +1,110 @@ +package com.tianhua.datafactory.domain.bo.model; + +import java.util.ArrayList; +import java.util.List; + +import com.tianhua.datafactory.domain.bo.BaseBO; +import com.tianhua.datafactory.domain.bo.GenericTypeBO; +import lombok.Data; +import lombok.ToString; + +/** +* @Description:参数模型信息类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Data +@ToString +public class ParamModelBO extends BaseBO { + + + /** 模型类名称 **/ + private String paramClassName; + + /** + * 模型参数名称 + * 模型作为api参数使用 + */ + private String paramVarName; + + + /** 所属项目名称 **/ + private String projectCode; + + /** 属性列表 **/ + private List fieldBeanList; + + /** 主键 **/ + private Long id; + + private String moduleCode; + + /** 参数类描述 **/ + private String paramClassDesc; + + /** 参数属性集合json **/ + private String paramFieldJson; + + /** 模型后缀 **/ + private String modelSuffix; + + /** 是否是泛型参数 **/ + private boolean isGeneralType; + + + /** + * 接口 出入参为string,long,integer之类的参数类型,从前端绑定 + * + */ + private String dataSourceCode; + + + + /** + * 接口 出入参为string,long,integer之类的参数类型, 构建的属性模型DSL描述 + */ + private String buildRuleDSL; + + /** + * 出入参为string,long,integer之类的参数类型, 默认值列表(不超过3个,建议常量或者是否之类的,否则使用固定数据源) + */ + private String defaultValueList; + + + + /** 参数映射模型 **/ + private List modelMappingBOList; + + + public ParamModelBO(){} + + public ParamModelBO(String paramClassName){ + this.paramClassName = paramClassName; + } + + public ParamModelBO(String paramClassName, String paramVarName){ + this.paramClassName = paramClassName; + this.paramVarName = paramVarName; + } + + + public static ParamModelBO getInstance(String paramClassName){ + return new ParamModelBO(paramClassName); + } + + + public static ParamModelBO getInstance(String paramClassName, String paramVarName){ + return new ParamModelBO(paramClassName, paramVarName); + } + + + public void addField(FieldBO fieldBO){ + if(this.fieldBeanList == null){ + fieldBeanList = new ArrayList<>(); + } + fieldBeanList.add(fieldBO); + } + + +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/TableBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/TableBO.java new file mode 100644 index 0000000000000000000000000000000000000000..88c813f2bebea70c0b7bf9279ea5a080c2285518 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/model/TableBO.java @@ -0,0 +1,56 @@ +package com.tianhua.datafactory.domain.bo.model; + +import java.util.List; + +import com.tianhua.datafactory.domain.bo.BaseBO; +import lombok.Data; +import lombok.ToString; + +/** +* @Description:数据库table模型信息类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Data +@ToString +public class TableBO extends BaseBO { + + + private Long id; + + + /** 数据库表名 **/ + private String tableName; + + /** 数据库表描述 **/ + private String tableComment; + + /** 数据库名称 **/ + private String dbName; + + /** 项目编码 **/ + private String projectCode; + + /** 数据库字段列表 **/ + private List columnList; + + + private String file; + + + /** + * 是否快捷构建JavaEntity模型 + */ + private Boolean buildJavaEntity; + + + /** 模型后缀 **/ + private String modelSuffix; + + public boolean buildJavaEntity(){ + return buildJavaEntity != null && buildJavaEntity == true; + } + + +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/project/ApiBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/project/ApiBO.java new file mode 100644 index 0000000000000000000000000000000000000000..800ea8899241a832bc7796b5d8fcf8d2a7d4a5ea --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/project/ApiBO.java @@ -0,0 +1,183 @@ +package com.tianhua.datafactory.domain.bo.project; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSON; +import com.tianhua.datafactory.domain.enums.ReturnWrapClassEnum; +import com.tianhua.datafactory.domain.bo.BaseBO; +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; + +import com.tianhua.datafactory.domain.enums.ApiTypeEnum; +import lombok.Data; +import lombok.ToString; +import org.apache.commons.lang3.StringUtils; + +/** + * @version v1.0 + * @Description:api模型信息类 + * @Author:shenshuai + * @CreateTime:2022-05-27 16:05:26 + */ +@Data +@ToString +public class ApiBO extends BaseBO { + + private Long id; + + /** + * api类型 + **/ + private String apiType; + + /** + * api信息 + **/ + private String apiUrl; + + /** + * api签名 + **/ + private String apiSign; + + /** + * api返回类型 + **/ + private String returnType; + + /** + * 请求参数元信息 + **/ + private String requestParam; + + + /** + * api描述 + **/ + private String apiDoc; + + + /** + * api请求方式 + **/ + private String methodType; + + /** + * api返回值集合 + **/ + private String returnValue; + + /** + * api 请求参数列表 + **/ + private List paramList; + + /** + * api参数可选值列表 + **/ + private Map> paramDefaultValueList; + + + /** + * api所属项目编码 + **/ + private String projectCode; + /** + * api返回参数对象 + */ + private ParamModelBO returnParamModel; + + + /** + * api返回参数类名 + */ + private String returnParamClass; + /** + * 请求参数列表 + */ + private String requestParamClasses; + + /** + * 所属模块 + */ + private String moduleCode; + + /** + * 所属模块名称 + */ + private String moduleName; + + /** + * 进行接口mock调用的时候接口返回的条数 + * 1条或者多条 + * 模拟后端数据返回 + */ + private Integer mockCount; + + + /** + * api返回包装类型 + * @see ReturnWrapClassEnum + */ + private Integer apiReturnWrapType; + + + + + + public ApiBO() { + } + + public ApiBO(String projectCode, String apiUrl) { + this.projectCode = projectCode; + this.apiUrl = apiUrl; + } + + + public static ApiBO getInstance(String projectCode, String apiUrl) { + return new ApiBO(projectCode, apiUrl); + } + + + + /** + * 构建api签名 + */ + public void buildApiSign() { + if (ApiTypeEnum.HTTP_API.getType().equals(apiType)) { + if(apiUrl.contains("{")){ + apiUrl = apiUrl.replace("{","").replace("}",""); + } + this.apiSign = projectCode + ":" + apiUrl.replace("/",".") + "." + methodType; + } else { + this.apiSign = projectCode + ":" + apiUrl; + } + + if (this.paramList != null && !this.paramList.isEmpty()) { + this.apiSign = this.apiSign + "." + this.paramList.size(); + for (ParamModelBO paramModelBO : this.paramList){ + if (Objects.isNull(paramModelBO.getParamClassName())) { + this.apiSign = this.apiSign + "." + paramModelBO.getParamVarName().substring(0,1); + }else { + this.apiSign = this.apiSign + "." + paramModelBO.getParamClassName().substring(0,1); + } + } + } + } + + /** + * 构建请求参数模型 + */ + public void buildRequestParam() { + if (StringUtils.isNotEmpty(requestParam)) { + this.paramList = JSON.parseArray(requestParam,ParamModelBO.class); + if(this.paramList == null || this.paramList.isEmpty()){ + return; + } + List requestParamClassList = this.paramList.stream().map(ParamModelBO::getParamClassName).collect(Collectors.toList()); + this.requestParamClasses = StringUtils.join(requestParamClassList,","); + } + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/bo/project/ProjectBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/bo/project/ProjectBO.java new file mode 100644 index 0000000000000000000000000000000000000000..910ddc79ab3d5ad9a12284ebe8feffe1e3f5500b --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/bo/project/ProjectBO.java @@ -0,0 +1,76 @@ +package com.tianhua.datafactory.domain.bo.project; + +import java.util.ArrayList; +import java.util.List; + +import com.tianhua.datafactory.domain.bo.BaseBO; +import lombok.Data; +import lombok.ToString; + +/** +* @Description:项目基本信息类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Data +@ToString +public class ProjectBO extends BaseBO { + + private Long id; + + /** 项目应用名 **/ + private String projectCode; + + /** 应用描述 **/ + private String projectDesc; + + /** 业务领域编码 **/ + private String domainCode; + + /** 业务领域描述 **/ + private String domainDesc; + + /** app描述 **/ + private String appDesc; + + /** 所属业务线 **/ + private String busLine; + + /** 所属部门 **/ + private String deptName; + + /** 项目api列表 **/ + private List apiList; + + /** + * 状态 + * @See com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum + */ + private Integer status; + + private String statusDesc; + + public ProjectBO(){} + + public ProjectBO(String projectCode){ + this.projectCode = projectCode; + } + + public static ProjectBO getInstance(){ + return new ProjectBO(); + } + + public static ProjectBO getInstance(String projectCode){ + return new ProjectBO(projectCode); + } + + + public void addApiBo(ApiBO apiBO){ + if(this.apiList == null){ + this.apiList = new ArrayList<>(); + } + this.apiList.add(apiBO); + } + +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/enums/ApiModelFieldStatusEnum.java b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ApiModelFieldStatusEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..f1da2aec788f522aed771c6170a3a798777032c1 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ApiModelFieldStatusEnum.java @@ -0,0 +1,66 @@ +package com.tianhua.datafactory.domain.enums; + +import com.tianhua.datafactory.domain.support.OptionsBO; +import lombok.Getter; + +/** + * Description + * api模型,参数模型,属性模型的生命周期状态管理 + * date: 2022/9/5 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + * + * 状态跳转 0->2->1->-1的规则 + */ +@Getter +public enum ApiModelFieldStatusEnum { + USING(0,"使用中"), + WILL_DEPRECATED(1,"即将过期"), + DEPRECATED(2,"已过期"), + DELETEED(-1,"已删除"), + + ; + private Integer status; + private String desc; + + ApiModelFieldStatusEnum(Integer status, String desc){ + this.status = status; + this.desc = desc; + } + + + /** + * 数据枚举路由 + * @param enumCode + * @return + */ + public static boolean isApiModelFieldStatus(String enumCode){ + return "apiModelFieldStatus".equals(enumCode); + } + + public static OptionsBO getOptionList(){ + OptionsBO optionsBO = new OptionsBO(); + for (ApiModelFieldStatusEnum apiModelFieldStatusEnum : ApiModelFieldStatusEnum.values()){ + optionsBO.addOptionItem(apiModelFieldStatusEnum.getDesc(), apiModelFieldStatusEnum.getStatus()+""); + } + return optionsBO; + } + + + public static String getStatusDesc(Integer status){ + if(status == null){ + status = 0; + } + for (ApiModelFieldStatusEnum apiModelFieldStatusEnum : ApiModelFieldStatusEnum.values()){ + if(apiModelFieldStatusEnum.getStatus().intValue() == status.intValue()){ + return apiModelFieldStatusEnum.getDesc(); + } + } + return ApiModelFieldStatusEnum.USING.getDesc(); + } + + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/enums/ApiTypeEnum.java b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ApiTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..ad056b38986528a8ae000d1ce6fbee87d8f19875 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ApiTypeEnum.java @@ -0,0 +1,51 @@ +package com.tianhua.datafactory.domain.enums; + +import com.tianhua.datafactory.domain.support.OptionsBO; +import lombok.Getter; + +/** +* @Description:api类型类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Getter +public enum ApiTypeEnum{ + + /** + * + */ + HTTP_API("httpApi","对外开放的http协议接口"), + RPC_API("rpcApi","对外开放的rpc协议的接口"), + SERVICE_API("serviceApi","服务内部的Service接口,包括所有方法"), + ; + + /** api类型code **/ + private String type; + /** api类型描述 **/ + private String desc; + + + ApiTypeEnum(String type,String desc){ + this.type = type; + this.desc = desc; + } + + public static OptionsBO getOptionList(){ + OptionsBO optionsBO = new OptionsBO(); + for (ApiTypeEnum apiTypeEnum : ApiTypeEnum.values()){ + optionsBO.addOptionItem(apiTypeEnum.getDesc(), apiTypeEnum.getType()); + } + return optionsBO; + } + + /** + * 数据枚举路由 + * @param enumCode + * @return + */ + public static boolean isApiType(String enumCode){ + return "apiType".equals(enumCode); + } + +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/enums/ClassEnum.java b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ClassEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..09263fbe80f1b9fc5323f8c841f28ae9b8d35981 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ClassEnum.java @@ -0,0 +1,49 @@ +package com.tianhua.datafactory.domain.enums; + +import java.util.Objects; + +/** + * Description: + * date: 2021/6/28 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public enum ClassEnum { + ENTITY("entity"), + CLASS("class"), + INTERFACE("interface"), + ENUM("enum"), + POM("pom"), + PROPERTIES("properties"), + YML("YML"), + + ; + private String classType; + ClassEnum(String classType){ + this.classType = classType; + } + + public String getClassType() { + return classType; + } + + public static boolean isClass(String classType){ + return Objects.equals(classType,ClassEnum.CLASS.getClassType()); + } + + public static boolean isInterface(String classType){ + return Objects.equals(classType,ClassEnum.INTERFACE.getClassType()); + } + + public static boolean isEnum(String classType){ + return Objects.equals(classType,ClassEnum.ENUM.getClassType()); + } + + public static boolean isPom(String classType){ + return Objects.equals(classType,ClassEnum.POM.getClassType()); + } + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/enums/ClassRelationEnum.java b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ClassRelationEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..39023ba014eb37a04d5d274c840205582ffbb0a8 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ClassRelationEnum.java @@ -0,0 +1,119 @@ +package com.tianhua.datafactory.domain.enums; + +import com.google.common.collect.Sets; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; + +/** + * Description: + * date: 2021/6/28 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public enum ClassRelationEnum { + + /** + * GENERALIZATION + */ + GENERALIZATION("泛化-继承", Sets.newHashSet("<|--","--|>")), + REALIZE("实现",Sets.newHashSet("..|>","<|..")), + ; + + private String desc; + private Set tagSet; + ClassRelationEnum(String desc, Set tagSet){ + this.desc = desc; + this.tagSet = tagSet; + } + + public String getDesc() { + return desc; + } + + public Set getTagSet() { + return tagSet; + } + + /** + * 解析类间关系 + * @param content + * @return + */ + public static Map parseRelation(String content){ + AtomicReference classRelationEnum = new AtomicReference<>(); + for (ClassRelationEnum relationEnum : ClassRelationEnum.values()){ + relationEnum.getTagSet().forEach(tag->{ + if(content.contains(tag)){ + classRelationEnum.set(relationEnum); + } + }); + } + ClassRelationEnum relationEnum = classRelationEnum.get(); + if(relationEnum == null){ + return null; + } + Map map = new HashMap<>(); + String className = getChild(content); + if (!StringUtils.isEmpty(className)) { + map.put("class",className); + } + if(relationEnum.name().equals(ClassRelationEnum.GENERALIZATION.name())){ + map.put("relation"," extends "+getSuper(content)); + } + if(relationEnum.name().equals(ClassRelationEnum.REALIZE.name())){ + map.put("relation"," implements "+getSuper(content)); + } + + return map; + } + + /** + * 获取父类或者接口 + * @param content + * @return + */ + private static String getSuper(String content){ + if(content.contains("<|--")){ + return content.trim().split("<\\|--")[0]; + } + if(content.contains("--|>")){ + return content.trim().split("--\\|>")[1]; + } + if(content.contains("..|>")){ + return content.trim().split("..\\|>")[1]; + } + if(content.contains("<|..")){ + return content.trim().split("<\\|..")[0]; + } + return null; + } + + + /** + * 获取父类或者接口 + * @param content + * @return + */ + private static String getChild(String content){ + if(content.contains("<|--")){ + return content.trim().split("<\\|--")[1]; + } + if(content.contains("--|>")){ + return content.trim().split("--\\|>")[0]; + } + if(content.contains("..|>")){ + return content.trim().split("..\\|>")[0]; + } + if(content.contains("<|..")){ + return content.trim().split("<\\|..")[1]; + } + return null; + } + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/enums/ColumnTypeEnums.java b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ColumnTypeEnums.java new file mode 100644 index 0000000000000000000000000000000000000000..d7548d471425d206f3869425154485be1b3ecee0 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ColumnTypeEnums.java @@ -0,0 +1,91 @@ +package com.tianhua.datafactory.domain.enums; + +import com.tianhua.datafactory.domain.support.OptionsBO; + +/** + * Description: + * date: 2021/8/13 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public enum ColumnTypeEnums { + VARCHAR("varchar"), + TINYINT("tinyint"), + SMALLINT("smallint"), + MEDIUMINT("mediumint"), + BIGINT("bigint"), + FLOAT("float"), + DOUBLE("double"), + DECIMAL("decimal"), + CHAR("char"), + TINYBLOD("tinyblob"), + TINYTEXT("tinytext"), + BLOB("blob"), + TEXT("text"), + MEDIUMBLOB("mediumblob"), + MEDIUMTEXT("mediumtext"), + LONGBLOB("longblob"), + LONGTEXT("longtext"), + ENUM("enum"), + SET("set") + + ; + private String columnType; + ColumnTypeEnums(String columnType){ + this.columnType = columnType; + } + + + public String getColumnType() { + return columnType; + } + + public static Boolean contains(String columnTypeTag){ + for (ColumnTypeEnums columnTypeEnums : ColumnTypeEnums.values()){ + if(columnTypeTag.startsWith(columnTypeEnums.getColumnType())){ + return true; + } + } + return false; + } + + public static Boolean isInt(String columnTypeTag){ + return columnTypeTag.contains("int"); + } + + public static Boolean isVarchar(String columnTypeTag){ + return columnTypeTag.contains("varchar") || columnTypeTag.contains("text"); + } + + public static Boolean isDate(String columnTypeTag){ + return columnTypeTag.contains("timestamp") || columnTypeTag.contains("date"); + } + + public static Boolean isJson(String columnTypeTag){ + return columnTypeTag.contains("json") || columnTypeTag.contains("JSON"); + } + + + + + + /** + * 数据枚举路由 + * @param enumCode + * @return + */ + public static boolean isColumnFieldTypeEnum(String enumCode){ + return "columnTypeEnum".equals(enumCode); + } + + public static OptionsBO getOptionList(){ + OptionsBO optionsBO = new OptionsBO(); + for (ColumnTypeEnums columnFieldTypeEnum : ColumnTypeEnums.values()){ + optionsBO.addOptionItem(columnFieldTypeEnum.getColumnType(), columnFieldTypeEnum.getColumnType()+""); + } + return optionsBO; + } + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/enums/ConfigServerEnum.java b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ConfigServerEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..4b311f45e2eb32afe08c8669c0020f31b1384cb7 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ConfigServerEnum.java @@ -0,0 +1,36 @@ +package com.tianhua.datafactory.domain.enums; + +import com.tianhua.datafactory.domain.support.OptionsBO; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * Description: + * date: 2022/5/30 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Getter +@AllArgsConstructor +public enum ConfigServerEnum { + + //nacos + NACOS("0","nacos"), + //apollo + APOLLO("1","apollo"), + + ; + private String code; + private String desc; + + public static OptionsBO getOptionList(){ + OptionsBO optionsBO = new OptionsBO(); + for (ConfigServerEnum configServerEnum : ConfigServerEnum.values()){ + optionsBO.addOptionItem(configServerEnum.getDesc(), configServerEnum.getCode()); + } + return optionsBO; + } + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/enums/DataExportTypeEnum.java b/domain/src/main/java/com/tianhua/datafactory/domain/enums/DataExportTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..0bbbbc9d091bb313efd18aa681387cbe10997985 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/enums/DataExportTypeEnum.java @@ -0,0 +1,19 @@ +package com.tianhua.datafactory.domain.enums; + +/** + * Description + * 数据导出类型 + * + * 数据使用方式(在线接口导入,导出insert.sql,导出json,导出excel) + * date: 2022/9/9 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public enum DataExportTypeEnum { + + + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/enums/DataSourceTypeEnum.java b/domain/src/main/java/com/tianhua/datafactory/domain/enums/DataSourceTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..283ce789ef9f5bab30ce66bf3ea06eccf1d39770 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/enums/DataSourceTypeEnum.java @@ -0,0 +1,66 @@ +package com.tianhua.datafactory.domain.enums; + + +import com.tianhua.datafactory.domain.support.OptionsBO; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum DataSourceTypeEnum { + UN_KNOWN(-1,"UN_KNOWN(未知)"), + + //服务获取 + FROM_SERVICE_API_HTTP(1,"API_HTTP(http接口数据源)"), + + //服务获取 + FROM_DUBBO(2,"DUBBO_RPC(dubbo接口数据源)"), + + //服务本身自带枚举-->plantUMl解析到KV表中 + FROM_SERVICE_ENUM(3,"ENUM(项目枚举)"), + + //来自文件数据源的数据 + FROM_FILE_DATA(4,"FILE_DATA(文件上传数据源)"), + + //函数式数据源,datafactory内置提供 + FUNCTION_DATASOURCE(5,"INNER_FUNCTION(内置数据生成函数)"), + + + + /** + * 属性默认值 + */ + FIELD_DEFAULT(6,"DEFAULT_VALUE(默认值作为数据源)"), + ; + private int code; + private String desc; + + + public static OptionsBO getOptionList(){ + OptionsBO optionsBO = new OptionsBO(); + for (DataSourceTypeEnum dataSourceTypeEnum : DataSourceTypeEnum.values()){ + optionsBO.addOptionItem(dataSourceTypeEnum.getDesc(), dataSourceTypeEnum.getCode() +""); + } + return optionsBO; + } + + public static String getDesc(Integer enumCode){ + if(enumCode == null){ + return ""; + } + for (DataSourceTypeEnum dataSourceTypeEnum : DataSourceTypeEnum.values()){ + if(dataSourceTypeEnum.getCode() == enumCode.intValue()){ + return dataSourceTypeEnum.getDesc(); + } + } + return "未知类型"; + } + + + + + public static boolean isDataSourceType(String enumCode){ + return "dataSourceType".equals(enumCode); + } + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/enums/JavaFieldTypeEnum.java b/domain/src/main/java/com/tianhua/datafactory/domain/enums/JavaFieldTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..9cebc955f8f3767df7141a9309e417bb837ffe3f --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/enums/JavaFieldTypeEnum.java @@ -0,0 +1,164 @@ +package com.tianhua.datafactory.domain.enums; + +import com.tianhua.datafactory.domain.support.OptionsBO; +import org.apache.commons.lang3.StringUtils; + +import java.time.LocalDate; + +/** + * Description + * date: 2022/8/14 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public enum JavaFieldTypeEnum { + INTEGER("Integer"), + INT("int"), + LONG("Long"), + LONG_BASIC("long"), + BOOLEAN("Boolean"), + BOOLEAN_BASIC("boolean"), + SHORT("Short"), + SHORT_BASIC("short"), + STRING("String"), + DOUBLE("Double"), + DOUBLE_BASIC("double"), + FLOAT("Float"), + FLOAT_BASIC("float"), + DATE("Date"), + DATE_TIME("DateTime"), + + LOCALDATE ("LocalDate"), + + OBJECT ("Object"), + + BYTE_BASIC("byte"), + + BYTE("Byte"), + + + LIST("List"), + + SET("Set"), + + ARRAY("Array"), + + Map("Map"), + + BigDecimal("BigDecimal"), + + ; + + String type; + JavaFieldTypeEnum(String type){ + this.type = type; + } + + + public String getType() { + return type; + } + + public static boolean isInt(String type){ + return StringUtils.isNotEmpty(type) && (JavaFieldTypeEnum.INTEGER.getType().equals(type) || JavaFieldTypeEnum.INT.getType().equals(type)); + } + + public static boolean isLong(String type){ + return StringUtils.isNotEmpty(type) && (JavaFieldTypeEnum.LONG.getType().equals(type) || JavaFieldTypeEnum.LONG_BASIC.getType().equals(type)); + } + + public static boolean isShort(String type){ + return StringUtils.isNotEmpty(type) && (JavaFieldTypeEnum.SHORT.getType().equals(type) || JavaFieldTypeEnum.SHORT_BASIC.getType().equals(type)); + } + + public static boolean isDouble(String type){ + return StringUtils.isNotEmpty(type) && (JavaFieldTypeEnum.DOUBLE.getType().equals(type) || JavaFieldTypeEnum.DOUBLE_BASIC.getType().equals(type)); + } + + public static boolean isFloat(String type){ + return StringUtils.isNotEmpty(type) && (JavaFieldTypeEnum.FLOAT.getType().equals(type) || JavaFieldTypeEnum.FLOAT_BASIC.getType().equals(type)); + } + + public static boolean isString(String type){ + return StringUtils.isNotEmpty(type) && JavaFieldTypeEnum.STRING.getType().toLowerCase().equals(type.toLowerCase()); + } + + public static boolean isBoolean(String type){ + return StringUtils.isNotEmpty(type) && JavaFieldTypeEnum.BOOLEAN_BASIC.getType().equals(type.toLowerCase()); + } + + + public static boolean isDate(String type){ + return StringUtils.isNotEmpty(type) && JavaFieldTypeEnum.DATE.getType().toLowerCase().equals(type.toLowerCase()); + } + + + public static boolean isDateTime(String type){ + return StringUtils.isNotEmpty(type) && JavaFieldTypeEnum.DATE_TIME.getType().toLowerCase().equals(type.toLowerCase()); + } + + + public static boolean isLocalDate(String type){ + return StringUtils.isNotEmpty(type) && JavaFieldTypeEnum.LOCALDATE.getType().toLowerCase().equals(type.toLowerCase()); + } + + + public static boolean isList(String type){ + return StringUtils.isNotEmpty(type) && JavaFieldTypeEnum.LIST.getType().toLowerCase().equals(type.toLowerCase()); + } + + public static boolean isSet(String type){ + return StringUtils.isNotEmpty(type) && JavaFieldTypeEnum.SET.getType().toLowerCase().equals(type.toLowerCase()); + } + + public static boolean isMap(String type){ + return StringUtils.isNotEmpty(type) && JavaFieldTypeEnum.Map.getType().toLowerCase().equals(type.toLowerCase()); + } + + + public static boolean isArray(String type){ + return StringUtils.isNotEmpty(type) && JavaFieldTypeEnum.ARRAY.getType().toLowerCase().equals(type.toLowerCase()); + } + + /** + * 数据枚举路由 + * @param enumCode + * @return + */ + public static boolean isJavaFieldTypeEnum(String enumCode){ + return "javaFieldType".equals(enumCode); + } + + public static OptionsBO getOptionList(){ + OptionsBO optionsBO = new OptionsBO(); + for (JavaFieldTypeEnum javaFieldTypeEnum : JavaFieldTypeEnum.values()){ + optionsBO.addOptionItem(javaFieldTypeEnum.getType(), javaFieldTypeEnum.getType()+""); + } + return optionsBO; + } + + /** + * 是否是基础类型 + * @param type + * @return + */ + public static boolean isBasicType(String type){ + return isInt(type) || isString(type) || isShort(type) + || isLong(type) || isDate(type) || isBoolean(type) + || isDouble(type) || isFloat(type) || isLocalDate(type) || isDateTime(type); + } + + /** + * 是否是集合类型 + * @param type + * @return + */ + public static boolean isCollectionType(String type){ + return isSet(type) || isList(type) || isArray(type) ; + } + + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/enums/MethodTypeEnum.java b/domain/src/main/java/com/tianhua/datafactory/domain/enums/MethodTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..81218b1b50a0672aa38eed191249745850a1fc41 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/enums/MethodTypeEnum.java @@ -0,0 +1,62 @@ +package com.tianhua.datafactory.domain.enums; + +import com.tianhua.datafactory.domain.support.OptionsBO; +import lombok.Getter; + +/** + * Description: + * date: 2022/6/7 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Getter +public enum MethodTypeEnum { + /** + * + */ + HTTP_POST("post","http-post方法"), + HTTP_GET("get","http-get方法"), + HTTP_PUT("put","http-put方法"), + HTTP_DELETE("delete","http-delete方法"), + + DUBBO("DUBBO","dubbo服务接口"), + SPRING_CLOUD("SPRING_CLOUD","spring_cloud服务接口"), + INNER_SERVICE("INNER_SERVICE","内部服务方法"), + + ; + + /** api类型code **/ + private String type; + /** api类型描述 **/ + private String desc; + + + MethodTypeEnum(String type,String desc){ + this.type = type; + this.desc = desc; + } + + + public static boolean isMethodType(String enumCode){ + return "methodType".equals(enumCode); + } + + + + + public static OptionsBO getOptionList(){ + OptionsBO optionsBO = new OptionsBO(); + for (MethodTypeEnum apiTypeEnum : MethodTypeEnum.values()){ + optionsBO.addOptionItem(apiTypeEnum.getDesc(), apiTypeEnum.getType()); + } + return optionsBO; + } + + + public static boolean isApiType(String enumCode){ + return "apiType".equals(enumCode); + } + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/enums/ModelTypeEnum.java b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ModelTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..fc99aa86aa51a8c860b0a797a49713269e1e4d44 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ModelTypeEnum.java @@ -0,0 +1,55 @@ +package com.tianhua.datafactory.domain.enums; + +import com.tianhua.datafactory.domain.support.OptionsBO; +import lombok.Getter; + +/** +* @Description:模型类型类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Getter +public enum ModelTypeEnum{ + + /** + * + */ + API_MODEL("apiModel","api请求响应模型"), + SERVICE_MODEL("serviceModel","服务内部模型"), + ENTITY_MODEL("entityModel","数据库实体模型"), + DB_MODEL("dbModel","数据库er模型"), + ; + + /** 模型类型code **/ + private String type; + /** 模型类型描述 **/ + private String desc; + + + ModelTypeEnum(String type,String desc){ + this.type = type; + this.desc = desc; + } + + public static OptionsBO getOptionList(){ + OptionsBO optionsBO = new OptionsBO(); + for (ModelTypeEnum modelTypeEnum : ModelTypeEnum.values()){ + optionsBO.addOptionItem(modelTypeEnum.getDesc(), modelTypeEnum.getType()); + } + return optionsBO; + } + + /** + * 数据枚举路由 + * @param enumCode + * @return + */ + public static boolean isModelType(String enumCode){ + return "modelType".equals(enumCode); + } + + + + +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/enums/ModelValueMappingType.java b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ModelValueMappingType.java new file mode 100644 index 0000000000000000000000000000000000000000..626178ca007102c9870f308a78ed0f702cbbb9d0 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ModelValueMappingType.java @@ -0,0 +1,52 @@ +package com.tianhua.datafactory.domain.enums; + +import com.tianhua.datafactory.domain.support.OptionsBO; +import lombok.Getter; + +/** +* @Description:模型映射类型类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Getter +public enum ModelValueMappingType{ + + /** + * + */ + JSON_MAPPING("jsonMapping","json结构映射"), + ENUM_MAPPING("enumMapping","enum映射"), + KEY_MAPPING("keyMapping","map数据结构的key映射"), + VALUE_MAPPING("valueMapping","名称一样,类型不一样"), + DIRECT_MAPPING("directMapping","直接映射,类型与名称相同"), + ; + + /** 模型类型code **/ + private String type; + /** 模型类型描述 **/ + private String desc; + + + ModelValueMappingType(String type,String desc){ + this.type = type; + this.desc = desc; + } + + + + public static OptionsBO getOptionList(){ + OptionsBO optionsBO = new OptionsBO(); + for (ModelValueMappingType modelValueMappingType : ModelValueMappingType.values()){ + optionsBO.addOptionItem(modelValueMappingType.getDesc(), modelValueMappingType.getType()); + } + return optionsBO; + } + + public static boolean isModelValueMapping(String enumCode){ + return "modelValueMapping".equals(enumCode); + } + + + +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/enums/RegistServerEnum.java b/domain/src/main/java/com/tianhua/datafactory/domain/enums/RegistServerEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..0af8811aa1be1725ea8eec646212a1587dbb7505 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/enums/RegistServerEnum.java @@ -0,0 +1,50 @@ +package com.tianhua.datafactory.domain.enums; + +import com.tianhua.datafactory.domain.support.OptionsBO; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * Description: + * date: 2022/6/9 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Getter +@AllArgsConstructor +public enum RegistServerEnum { + //独立服务--无注册中心 + INDEPENDENCY_SERVICE(0,"Independency Service"), + + //nacos + NACOS(1,"Nacos"), + //apollo + ZOOKEEPER(2,"Apollo"), + //Eureka + EUREKA(3,"Eureka"), + //Consul + CONSUL(4,"Consul"), + + //第三方服务 + THIRD_PARTY_SERVICE(5,"Third Party Service"), + + + ; + private Integer code; + private String desc; + + public static OptionsBO getOptionList(){ + OptionsBO optionsBO = new OptionsBO(); + for (RegistServerEnum registServerEnum : RegistServerEnum.values()){ + optionsBO.addOptionItem(registServerEnum.getDesc(), registServerEnum.getCode()+""); + } + return optionsBO; + } + + public static boolean isRegistServer(String enumCode){ + return "registServer".equals(enumCode); + } + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/enums/ReturnTypeEnum.java b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ReturnTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..91ecc48de61950070334d4a9d2c6ce263d816ed2 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ReturnTypeEnum.java @@ -0,0 +1,65 @@ +package com.tianhua.datafactory.domain.enums; + +import com.tianhua.datafactory.domain.support.OptionsBO; + +/** + * Description + * date: 2022/9/1 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public enum ReturnTypeEnum { + /** + * + */ + LIST_LONG("LIST_LONG","List"), + LIST_INTEGER("LIST_INTEGER","List"), + LIST_STRING("LIST_STRING","List"), + LIST_OBJECT("LIST_OBJECT","List"), + LIST_DTO("LIST_DTO","List"), + + SET_LONG("SET_LONG","Set"), + + VOID("VOID","void"), + RESULT_DTO("RESULT_DTO","ResultDTO"), + RESULT_PAGE_DTO("PageDTO", "PageDTO"); + + ; + + /** api类型code **/ + private String type; + /** api类型描述 **/ + private String desc; + + + ReturnTypeEnum(String type,String desc){ + this.type = type; + this.desc = desc; + } + + + + public static OptionsBO getOptionList(){ + OptionsBO optionsBO = new OptionsBO(); + for (ReturnTypeEnum returnTypeEnum : ReturnTypeEnum.values()){ + optionsBO.addOptionItem(returnTypeEnum.getDesc(), returnTypeEnum.getType()); + } + return optionsBO; + } + + public String getType() { + return type; + } + + public String getDesc() { + return desc; + } + + + public static boolean isReturnType(String enumCode){ + return "returnType".equals(enumCode); + } + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/enums/ReturnWrapClassEnum.java b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ReturnWrapClassEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..40c4f2e5145344cb8f2eaaba856e301bff00b235 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/enums/ReturnWrapClassEnum.java @@ -0,0 +1,99 @@ +package com.tianhua.datafactory.domain.enums; + +import com.tianhua.datafactory.domain.support.OptionsBO; + +/** + * Description + * date: 2022/9/4 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public enum ReturnWrapClassEnum { + RESULT_ORIGIN(0,"Origin", "使用原方法的返回值作为返回结果"), + RESULT_DTO(1,"ResultDTO", "通用接口返回包装类"), + RESULT_PAGE_DTO(2,"PageDTO", "在通用接口返回包装类的基础上增加PageDTO包装类"); + + /** + * 返回包装类名称 + */ + private Integer returnWrapCode; + + /** + * 返回包装类 + */ + private String returnWrapClass; + + /** + * 返回包装类描述 + */ + private String returnWrapDesc; + + + ReturnWrapClassEnum(Integer returnWrapCode, String returnWrapClass, String returnWrapDesc){ + this.returnWrapCode = returnWrapCode; + this.returnWrapClass = returnWrapClass; + this.returnWrapDesc = returnWrapDesc; + } + + public static boolean isReturnWrapClass(String enumCode){ + return "returnWrapClass".equals(enumCode); + } + + public static OptionsBO getOptionList(){ + OptionsBO optionsBO = new OptionsBO(); + for (ReturnWrapClassEnum returnWrapClassEnum : ReturnWrapClassEnum.values()){ + optionsBO.addOptionItem(returnWrapClassEnum.getReturnWrapClass(), returnWrapClassEnum.getReturnWrapCode()+""); + } + return optionsBO; + } + + public Integer getReturnWrapCode() { + return returnWrapCode; + } + + public String getReturnWrapClass() { + return returnWrapClass; + } + + public String getReturnWrapDesc() { + return returnWrapDesc; + } + + + public static String getDesc(Integer returnWrapCode){ + if(returnWrapCode == null){ + returnWrapCode = 0; + } + for (ReturnWrapClassEnum returnWrapClassEnum : ReturnWrapClassEnum.values()){ + if(returnWrapClassEnum.getReturnWrapCode().intValue() == returnWrapCode.intValue()){ + return returnWrapClassEnum.getReturnWrapDesc(); + } + } + return ""; + } + + public static boolean isOrigin(Integer returnWrapCode){ + if(returnWrapCode == null){ + return true; + } + return ReturnWrapClassEnum.RESULT_ORIGIN.getReturnWrapCode().intValue() == returnWrapCode.intValue(); + } + + public static boolean isResultDTO(Integer returnWrapCode){ + if(returnWrapCode == null){ + return false; + } + return ReturnWrapClassEnum.RESULT_DTO.getReturnWrapCode().intValue() == returnWrapCode.intValue(); + } + + public static boolean isResultPageDTO(Integer returnWrapCode){ + if(returnWrapCode == null){ + return false; + } + return ReturnWrapClassEnum.RESULT_PAGE_DTO.getReturnWrapCode().intValue() == returnWrapCode.intValue(); + } + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/enums/VisibilityEnum.java b/domain/src/main/java/com/tianhua/datafactory/domain/enums/VisibilityEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..99f980347590271ee86281840b2f940128e4be80 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/enums/VisibilityEnum.java @@ -0,0 +1,57 @@ +package com.tianhua.datafactory.domain.enums; + +/** + * Description: + * date: 2021/6/28 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public enum VisibilityEnum { + + PRIVATE("private","-"), + PROTECT("protected","#"), + PUBLIC("public","+"), + PACKAGE_PRIVATE("package private","~"), + ; + private String visibility; + private String tag; + VisibilityEnum(String visibility, String tag){ + this.visibility = visibility; + this.tag = tag; + } + + public String getVisibility() { + return visibility; + } + + public String getTag() { + return tag; + } + + /** + * 获取修饰符 + * @param content + * @return + */ + public static String getVisibilityStr(String content) { + if (content.startsWith(VisibilityEnum.PUBLIC.tag)) { + return VisibilityEnum.PUBLIC.visibility; + } + + if (content.startsWith(VisibilityEnum.PRIVATE.tag)) { + return VisibilityEnum.PRIVATE.visibility; + } + + if (content.startsWith(VisibilityEnum.PROTECT.tag)) { + return VisibilityEnum.PROTECT.visibility; + } + + if (content.startsWith(VisibilityEnum.PACKAGE_PRIVATE.tag)) { + return VisibilityEnum.PACKAGE_PRIVATE.visibility; + } + return VisibilityEnum.PRIVATE.visibility; + } + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/enums/VisitStrategyEnums.java b/domain/src/main/java/com/tianhua/datafactory/domain/enums/VisitStrategyEnums.java new file mode 100644 index 0000000000000000000000000000000000000000..713d067be762daddfa212e7f0bd9327cbfd1bfc6 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/enums/VisitStrategyEnums.java @@ -0,0 +1,66 @@ +package com.tianhua.datafactory.domain.enums; + +import com.tianhua.datafactory.domain.support.OptionsBO; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum VisitStrategyEnums { + + /** + * 内置数据源或者导入的数据源文件,json,excel等 + */ + LOCAL_FILE(2,"文件数据源"), + /** + * 内置数据源或者导入的数据源文件,json,excel等 + */ + INNER_FUNCTION(3,"内置函数数据源"), + + /** + * 这里指数据工厂平台会通过定时任务获取数据源更新到数据工厂平台本身的数据库中 + */ + LOCAL_CACHE(1,"项目数据源"), + /** + * 这里则每次使用都会通过url的方式获取最新数据 + * + */ + DYNAMIC_ACCESS(0,"远程API数据源"), + ; + private int code; + private String desc; + + + + public static OptionsBO getOptionList(){ + OptionsBO optionsBO = new OptionsBO(); + for (VisitStrategyEnums visitStrategyEnums : VisitStrategyEnums.values()){ + optionsBO.addOptionItem(visitStrategyEnums.getDesc(), visitStrategyEnums.getCode() +""); + } + return optionsBO; + } + /** + * 数据枚举路由 + * @param enumCode + * @return + */ + public static boolean isVisitStrategy(String enumCode){ + return "visiteStrategy".equals(enumCode); + } + + public static String getDesc(Integer visit){ + if(visit == null){ + return ""; + } + for (VisitStrategyEnums visitStrategyEnums : VisitStrategyEnums.values()){ + if(visitStrategyEnums.getCode() == visit.intValue()){ + return visitStrategyEnums.getDesc(); + } + } + return "未知类型"; + } + + + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/event/BaseEvent.java b/domain/src/main/java/com/tianhua/datafactory/domain/event/BaseEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..3649e6decd607364d693566ead58376cfb4059b0 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/event/BaseEvent.java @@ -0,0 +1,9 @@ +package com.tianhua.datafactory.domain.event; + +import org.springframework.context.ApplicationEvent; + +public class BaseEvent extends ApplicationEvent { + public BaseEvent(Object source) { + super(source); + } +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/event/DataSourceBindEvent.java b/domain/src/main/java/com/tianhua/datafactory/domain/event/DataSourceBindEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..da2d4ba6b8aa17976443c38022c445a1e2c3c725 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/event/DataSourceBindEvent.java @@ -0,0 +1,27 @@ +package com.tianhua.datafactory.domain.event; + +import com.tianhua.datafactory.domain.bo.model.ModelMappingBO; +import lombok.Data; + +/** + * Description:模型映射事件 + * date: 2022/6/10 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ + +public class DataSourceBindEvent extends BaseEvent { + + private ModelMappingBO modelMappingBO; + + public DataSourceBindEvent(Object source, ModelMappingBO modelMappingBO) { + super(source); + this.modelMappingBO = modelMappingBO; + } + + public ModelMappingBO getModelMappingBO() { + return modelMappingBO; + } +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/factory/CollectionValueConvertFactory.java b/domain/src/main/java/com/tianhua/datafactory/domain/factory/CollectionValueConvertFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..821744524c1c4902c4e0d7c20833ef7ad8f9b0d5 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/factory/CollectionValueConvertFactory.java @@ -0,0 +1,28 @@ +package com.tianhua.datafactory.domain.factory; + +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * Description + * date: 2022/8/14 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class CollectionValueConvertFactory { + + public List convert2List(String valueList,Integer fieldType){ + valueList = valueList.trim(); + String [] array = valueList.split(","); + for (String value : array){ + + } + return null; + + } + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/factory/FieldRuleDslFactory.java b/domain/src/main/java/com/tianhua/datafactory/domain/factory/FieldRuleDslFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..a122854bf3fedbbef197619902e5fd387400acf8 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/factory/FieldRuleDslFactory.java @@ -0,0 +1,265 @@ +package com.tianhua.datafactory.domain.factory; + +import com.tianhua.datafactory.domain.ability.GenericService; +import com.tianhua.datafactory.domain.bo.GenericTypeBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldRuleBO; +import com.tianhua.datafactory.domain.bo.datafactory.FieldDSLKeyConstant; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceBO; +import com.tianhua.datafactory.domain.bo.model.FieldBO; +import com.tianhua.datafactory.domain.enums.DataSourceTypeEnum; +import com.tianhua.datafactory.domain.repository.DataSourceQueryRepository; +import com.tianhua.datafactory.domain.repository.ModelQueryRepository; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * Description + * + * 属性规则dsl解析工厂 + * + * date: 2022/8/12 + * orderCode: + * prefix=BRAND_; + * subfix=000x; + * + * orderDetailBOList: + * orderCode.relyField=orderCode + * itemId.relySourceCode=com.item.skuFacade(10)#skuid (依赖商品服务的skuid) + * count.relySourceCode=com.datafactory.random(10) (随机数函数,10以内) + * price.relySourceCode=com.datafactory.random(1000) (随机数函数,1000以内) + * relyCount=100 (随机生成100条orderDetailBO使用) + * funcVar + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +@Slf4j +public class FieldRuleDslFactory { + + + @Autowired + private ModelQueryRepository modelQueryRepository; + + @Autowired + private DataSourceQueryRepository dataSourceQueryRepository; + + @Autowired + private GenericService genericService; + + /** + * 根据属性dsl规则解析成规则对象 + * @param fieldBuildRuleDSL + * @return + */ + public DataBuildRequestFieldRuleBO buildRuleBO(String fieldBuildRuleDSL){ + DataBuildRequestFieldRuleBO dataBuildRequestFieldRuleBO = new DataBuildRequestFieldRuleBO(); + if(StringUtils.isEmpty(fieldBuildRuleDSL)){ + return dataBuildRequestFieldRuleBO; + } + String [] array = fieldBuildRuleDSL.trim().split(";"); + for (String dslStr : array){ + String [] kvArr = dslStr.trim().split("="); + + if(kvArr[0].trim().equals(FieldDSLKeyConstant.PREFIX)){ + dataBuildRequestFieldRuleBO.setPrefix(kvArr[1].trim()); + } + + if(kvArr[0].trim().equals(FieldDSLKeyConstant.SUBFIX)){ + dataBuildRequestFieldRuleBO.setSubfix(kvArr[1].trim()); + } + if(kvArr[0].trim().equals(FieldDSLKeyConstant.RELY_FIELD)){ + dataBuildRequestFieldRuleBO.setRelyField(kvArr[1].trim()); + } + + if(kvArr[0].trim().equals(FieldDSLKeyConstant.DEFAULT_VALUES)){ + dataBuildRequestFieldRuleBO.setDefaultValues(kvArr[1].trim()); + } + + if(kvArr[0].trim().equals(FieldDSLKeyConstant.GEN_COUNT)){ + dataBuildRequestFieldRuleBO.setGenCount(Integer.valueOf(kvArr[1].trim())); + } + + if(kvArr[0].trim().equals(FieldDSLKeyConstant.FUNC_VAR)){ + dataBuildRequestFieldRuleBO.setFuncVar(kvArr[1].trim()); + } + + if(kvArr[0].trim().equals(FieldDSLKeyConstant.DATA_SOURCE_CODE)){ + dataBuildRequestFieldRuleBO.setDataSourceCode(kvArr[1].trim()); + } + + if(kvArr[0].trim().equals(FieldDSLKeyConstant.RELY_MAP_KEY_FIELD)){ + dataBuildRequestFieldRuleBO.setRelyKeyField(kvArr[1].trim()); + } + + if(kvArr[0].trim().equals(FieldDSLKeyConstant.RELY_MAP_VALUE_FIELD)){ + dataBuildRequestFieldRuleBO.setRelyValueField(kvArr[1].trim()); + } + } + + return dataBuildRequestFieldRuleBO; + } + + /** + * 根据dsl文件构建对象类型的引用关系 + * @param dataBuildRequestFieldBO + * @param projectCode + * @return + */ + public List buildReferFieldBOFromDsl(DataBuildRequestFieldBO dataBuildRequestFieldBO, String projectCode){ + + String [] array = dataBuildRequestFieldBO.getBuildRuleDSL().trim().split(";"); + + List fieldBOList = modelQueryRepository.getModelField(projectCode, dataBuildRequestFieldBO.getRealFieldType()); + Map fieldBOMap = fieldBOList.stream().collect(Collectors.toMap(FieldBO::getFieldName,o->o)); + + Map dataBuildRequestFieldBOMap = new HashMap<>(); + + for (String dslStr : array){ + String [] kvArr = dslStr.trim().split("="); + String [] fieldArr = kvArr[0].split("\\."); + + if(kvArr[0].trim().equals(FieldDSLKeyConstant.GEN_COUNT)){ + if(dataBuildRequestFieldBO.getDataBuildRequestFieldRuleBO() == null){ + dataBuildRequestFieldBO.setDataBuildRequestFieldRuleBO(new DataBuildRequestFieldRuleBO()); + } + dataBuildRequestFieldBO.getDataBuildRequestFieldRuleBO().setGenCount(Integer.valueOf(kvArr[1].trim())); + continue; + + } + + + FieldBO fieldBO = fieldBOMap.get(fieldArr[0]); + + if(fieldBO == null){ + log.warn("属性不存在,请检查dsl内容.....dslStr : {}",dslStr); + continue; + } + + DataBuildRequestFieldBO referRequestFieldBO = dataBuildRequestFieldBOMap.getOrDefault(fieldArr[0],new DataBuildRequestFieldBO<>()); + + referRequestFieldBO.setFieldName(fieldBO.getFieldName()); + referRequestFieldBO.setFieldType(fieldBO.getFieldType()); + referRequestFieldBO.setOriginFieldName(dataBuildRequestFieldBO.getFieldName()); + + + if(referRequestFieldBO.getDataBuildRequestFieldRuleBO() == null){ + referRequestFieldBO.setDataBuildRequestFieldRuleBO(new DataBuildRequestFieldRuleBO()); + } + + DataBuildRequestFieldRuleBO referRequestFieldRuleBO = referRequestFieldBO.getDataBuildRequestFieldRuleBO(); + + if(fieldArr[1].trim().equals(FieldDSLKeyConstant.PREFIX)){ + referRequestFieldRuleBO.setPrefix(kvArr[1].trim()); + } + + if(fieldArr[1].trim().equals(FieldDSLKeyConstant.SUBFIX)){ + referRequestFieldRuleBO.setSubfix(kvArr[1].trim()); + } + if(fieldArr[1].trim().equals(FieldDSLKeyConstant.RELY_FIELD)){ + referRequestFieldRuleBO.setRelyField(kvArr[1].trim()); + } + + if(fieldArr[1].trim().equals(FieldDSLKeyConstant.GEN_COUNT)){ + referRequestFieldRuleBO.setGenCount(Integer.valueOf(kvArr[1].trim())); + } + + if(fieldArr[1].trim().equals(FieldDSLKeyConstant.FUNC_VAR)){ + referRequestFieldRuleBO.setFuncVar(kvArr[1].trim()); + } + + if(fieldArr[1].trim().equals(FieldDSLKeyConstant.DATA_SOURCE_CODE)){ + if( kvArr[1].contains("(")){ + String dataSourceCode = kvArr[1].trim().split("\\(")[0]; + String funcVar = kvArr[1].trim().split("\\(")[1].replace(")",""); + if(funcVar.contains("#")){ + funcVar = funcVar.split("#")[0]; + referRequestFieldRuleBO.setRelyField(funcVar.split("#")[1]); + } + referRequestFieldRuleBO.setDataSourceCode(dataSourceCode); + referRequestFieldBO.setDataSourceCode(dataSourceCode); + referRequestFieldRuleBO.setFuncVar(funcVar); + }else { + referRequestFieldRuleBO.setDataSourceCode(kvArr[1]); + referRequestFieldBO.setDataSourceCode(kvArr[1]); + } + + DataSourceBO dataSourceBO = dataSourceQueryRepository.getByDataSourceCode(referRequestFieldBO.getDataSourceCode()); + if(dataSourceBO == null){ + log.error("根据数据源查不到对应的数据源对象,dataSourceCode = {}",referRequestFieldBO.getDataSourceCode()); + referRequestFieldBO.setDataSourceType(DataSourceTypeEnum.UN_KNOWN.getCode()); + continue; + } + + referRequestFieldBO.setDataSourceType(dataSourceBO.getSourceType()); + } + + referRequestFieldBO.setDataBuildRequestFieldRuleBO(referRequestFieldRuleBO); + + dataBuildRequestFieldBOMap.put(fieldArr[0], referRequestFieldBO); + } + + return dataBuildRequestFieldBOMap.values().stream().collect(Collectors.toList()); + } + + /** + * 根据配置好的对象类型的引用关系 + * @param dataBuildRequestFieldBO + * @param projectCode + * @return + */ + public List buildReferFieldBOFromDB(DataBuildRequestFieldBO dataBuildRequestFieldBO, String projectCode){ + + List fieldBOList = modelQueryRepository.getModelField(projectCode, dataBuildRequestFieldBO.getRealFieldType()); + + Map dataBuildRequestFieldBOMap = new HashMap<>(); + + for (FieldBO fieldBO : fieldBOList){ + + DataBuildRequestFieldBO referRequestFieldBO = dataBuildRequestFieldBOMap.getOrDefault(fieldBO.getFieldName(),new DataBuildRequestFieldBO<>()); + + referRequestFieldBO.setFieldName(fieldBO.getFieldName()); + referRequestFieldBO.setFieldType(fieldBO.getFieldType()); + referRequestFieldBO.setOriginFieldName(dataBuildRequestFieldBO.getFieldName()); + GenericTypeBO genericTypeBO = genericService.getGenericTypeWrapper(fieldBO.getFieldType()); + referRequestFieldBO.setGenericTypeBO(genericTypeBO); + + if(referRequestFieldBO.getDataBuildRequestFieldRuleBO() == null){ + referRequestFieldBO.setDataBuildRequestFieldRuleBO(new DataBuildRequestFieldRuleBO()); + } + + //如果是业务模型类型则进行引用属性的构建 + if(referRequestFieldBO.getGenericTypeBO().isRealTypeModel()){ + referRequestFieldBO.setRealFieldType(referRequestFieldBO.getGenericTypeBO().getRealType()); + List referFieldList = buildReferFieldBOFromDB(referRequestFieldBO, projectCode); + referRequestFieldBO.setReferFieldList(referFieldList); + dataBuildRequestFieldBOMap.put(fieldBO.getFieldName(), referRequestFieldBO); + continue; + } + DataSourceBO dataSourceBO = dataSourceQueryRepository.getByDataSourceCode(fieldBO.getFieldExtBO().getDataSourceCode()); + if(dataSourceBO == null){ + log.error("根据数据源查不到对应的数据源对象,dataSourceCode = {}, fieldName = {}, fieldType = {}",referRequestFieldBO.getDataSourceCode(),fieldBO.getFieldName(),fieldBO.getFieldType()); + referRequestFieldBO.setDataSourceType(DataSourceTypeEnum.UN_KNOWN.getCode()); + continue; + } + + referRequestFieldBO.setDataSourceCode(fieldBO.getFieldExtBO().getDataSourceCode()); + referRequestFieldBO.setDataSourceType(dataSourceBO.getSourceType()); + referRequestFieldBO.setDataSourceBO(dataSourceBO); + dataBuildRequestFieldBOMap.put(fieldBO.getFieldName(), referRequestFieldBO); + } + + return dataBuildRequestFieldBOMap.values().stream().collect(Collectors.toList()); + } + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/factory/PlantUMLModelFactory.java b/domain/src/main/java/com/tianhua/datafactory/domain/factory/PlantUMLModelFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..f94cfb80f0e440bd25da4b734dcbe8d2aa1cad86 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/factory/PlantUMLModelFactory.java @@ -0,0 +1,18 @@ +package com.tianhua.datafactory.domain.factory; + +import org.springframework.stereotype.Service; + +/** + * Description: + * date: 2022/6/6 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class PlantUMLModelFactory { + + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/package-info.java b/domain/src/main/java/com/tianhua/datafactory/domain/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..2715190e22fa79c7f98349171ab9f8df5f45b9f9 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/package-info.java @@ -0,0 +1 @@ +package com.tianhua.datafactory.domain; \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/repository/DataSourceQueryRepository.java b/domain/src/main/java/com/tianhua/datafactory/domain/repository/DataSourceQueryRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..cba2560a1fa1b20a9cdea0129a322f8d1632fb84 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/repository/DataSourceQueryRepository.java @@ -0,0 +1,39 @@ +package com.tianhua.datafactory.domain.repository; + +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceBO; + +import java.util.List; + +/** + * Description: + * date: 2022/5/29 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public interface DataSourceQueryRepository { + + /** + * 分页查询 + * @param pageBean + * @return + */ + public PageBean getDataSourcePage(PageBean pageBean); + + /** + * 搜索并重新组织子数据源 + * @param content + * @return + */ + public List search(String content); + + /** + * 根据数据源编码获取数据源信息 + * @param dataSourceCode + * @return + */ + public DataSourceBO getByDataSourceCode(String dataSourceCode); + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/repository/DataSourceRepository.java b/domain/src/main/java/com/tianhua/datafactory/domain/repository/DataSourceRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..5390eb353dd4404f828771af96960691a0c34acb --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/repository/DataSourceRepository.java @@ -0,0 +1,92 @@ +package com.tianhua.datafactory.domain.repository; + +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceBO; + +import java.util.List; + +/** + * Description: + * date: 2022/5/29 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public interface DataSourceRepository { + + + /** + * + * @Title: save + * @Description:新增 + * @author: + * @param @param dto + * @param @param userId + * @return ResultDto 返回类型 + * @throws + */ + public Boolean regist(DataSourceBO dataSourceBO); + + /** + * + * @Title: delete + * @Description: 通过id删除数据 + * @author: + * @param @param id + * @return ResultDto 返回类型 + * @throws + */ + public Boolean delete(Long id); + + /** + * + * @Title: getById + * @Description: 通过id查询 + * @author: + * @param @param id + * @return ResultDataDto + * @throws + */ + public DataSourceBO getById(Long id) throws Exception; + + /** + * + * @Title: getAll + * @Description:查询所有数据 + * @author: + * @return ResultDataDto> + * @throws + */ + public List getAll() throws Exception; + + /** + * + * @Title: update + * @Description:修改 + * @author: + * @param dataSourceBO + * @return Boolean + * @throws + */ + public Boolean update(DataSourceBO dataSourceBO) throws Exception; + + + /** + * 修改数据源状态 + * @param id + * @param status + * @return + */ + public Boolean updateStatus(Long id, Integer status); + + + /** + * 分页获取数据源 + * @param pageBean + * @return + */ + public PageBean getPageList(PageBean pageBean); + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/repository/ModelQueryRepository.java b/domain/src/main/java/com/tianhua/datafactory/domain/repository/ModelQueryRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..78b67344d2160509d96c0cc128c0a234fb93a11f --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/repository/ModelQueryRepository.java @@ -0,0 +1,115 @@ +package com.tianhua.datafactory.domain.repository; + +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.domain.bo.model.*; + +import java.util.List; + + +/** + * @Description:项目模型查询仓库接口 + * @Author:shenshuai + * @CreateTime:2022-05-27 16:05:26 + * @version v1.0 + */ +public interface ModelQueryRepository{ + + /** + * + * @Description 获取单条参数信息 + * @param paramClassName + * @return ParamModelBO + */ + ParamModelBO getByParamClassName(String paramClassName); + + /** + * + * @Description 根据项目和表名获取数据库字段列表 + * @param projectCode + * @param tableName + * @return List + */ + List getColumnListByCode(String projectCode, String tableName); + + /** + * + * @Description 分页查询表结构列表 + * @param pageBean + * @return PageBean + */ + PageBean queryTablePage(PageBean pageBean ); + + + /** + * + * @Description 分页查询业务模型 + * @param pageBean + * @return PageBean + */ + PageBean queryParamPage(PageBean pageBean ); + + + + TableBO getByTableId(Long id); + + + ParamModelBO getByParamId(Long id); + + + /** + * 搜索表模型 + * @param content + * @return + */ + List searchTable(String content); + + /** + * 搜索业务模型 + * @param content + * @return + */ + List searchParamModel(String content); + + + /** + * 获取项目模型配置 + * @return + */ + List getModelSuffixConfigList(); + + + /** + * + * @Description 分页查询模型映射关系 + * @param pageBean + * @return PageBean + */ + PageBean queryModelMappingPage(PageBean pageBean ); + + + /** + * 表模型+参数模型 + * @param projectCode + * @return + */ + List getModelByProjectCode(String projectCode); + + + /** + * 表模型+参数模型 + * @param projectCode + * @param modelName + * @return + */ + List getModelField(String projectCode, String modelName); + + + /** + * 根据项目获取modelmapping映射列表 + * @param projectCode + * @return + */ + List getModelMappingListByProjectCode(String projectCode); + + +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/repository/ModelRepository.java b/domain/src/main/java/com/tianhua/datafactory/domain/repository/ModelRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..af0201c747b1bef04a55e129a2b43b17ffcc619e --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/repository/ModelRepository.java @@ -0,0 +1,103 @@ +package com.tianhua.datafactory.domain.repository; + +import com.tianhua.datafactory.domain.bo.model.ModelMappingBO; +import com.tianhua.datafactory.domain.bo.model.ModelSuffixConfigBO; +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; +import com.tianhua.datafactory.domain.bo.model.TableBO; + +import java.util.List; + + +/** + * @Description:项目模型仓库接口 + * @Author:shenshuai + * @CreateTime:2022-05-27 16:05:26 + * @version v1.0 + */ +public interface ModelRepository{ + + /** + * + * @Description 保存数据库模型 + * @param tableBO + * @return boolean + */ + boolean saveDBModel(TableBO tableBO); + + /** + * + * @Description 修改数据库模型 + * @param tableBO + * @return boolean + */ + boolean updateDBModel(TableBO tableBO); + + /** + * + * @Description 获取数据库模型聚合接口 + * @param projectCode + * @return List + */ + List getDbErByProjectCode(String projectCode); + + /** + * + * @Description 保存参数模型 + * @param paramModelBO + * @return boolean + */ + boolean saveParamModel(ParamModelBO paramModelBO); + + /** + * + * @Description 修改参数模型 + * @param paramModelBO + * @return boolean + */ + boolean updateParamModel(ParamModelBO paramModelBO); + + /** + * + * @Description 获取参数模型聚合接口 + * @param projectCode + * @return List + */ + List getModelByProjectCode(String projectCode); + + + /** + * + * @Description 获取参数模型 模型维度接口 + * @param projectCode + * @return List + */ + ParamModelBO getModel(String projectCode, String paramClassName); + + + + /** + * + * @Description 保存模型后缀信息 + * @param modelSuffixConfigBO + * @return boolean + */ + boolean saveModelSuffix(ModelSuffixConfigBO modelSuffixConfigBO); + + /** + * + * @Description 修改模型后缀信息 + * @param modelSuffixConfigBO + * @return boolean + */ + boolean updateModelSuffix(ModelSuffixConfigBO modelSuffixConfigBO); + + + /** + * 保存模型映射关系 + * @param modelMappingBO + * @return + */ + boolean saveModelMapping(ModelMappingBO modelMappingBO); + + +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/repository/ProjectQueryRepository.java b/domain/src/main/java/com/tianhua/datafactory/domain/repository/ProjectQueryRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..49c1672ab8ab6f3d764727f8c825cc02cb17d6f7 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/repository/ProjectQueryRepository.java @@ -0,0 +1,81 @@ +package com.tianhua.datafactory.domain.repository; + +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.domain.bo.project.ApiBO; +import com.tianhua.datafactory.domain.bo.project.ProjectBO; + +import java.util.List; + + +/** + * @Description:项目api查询仓库接口 + * @Author:shenshuai + * @CreateTime:2022-05-27 16:05:26 + * @version v1.0 + */ +public interface ProjectQueryRepository{ + + /** + * + * @Description 获取api信息 + * @param projectCode + * @return List + */ + List getApiListByCode(String projectCode); + + /** + * + * @Description 搜索api信息 + * @param content + * @return List + */ + List searchApi(String content); + + /** + * + * @Description 分页查询api列表 + * @param pageBean + * @return PageBean + */ + PageBean queryApiPage(PageBean pageBean ); + + /** + * + * @Description 获取单条api + * @param apiSign api签名,全局唯一 + * @return ApiBO + */ + ApiBO getBySign(String apiSign); + + /** + * + * @Description 获取项目信息 + * @param projectCode + * @return ProjectBO + */ + ProjectBO getProjectByCode(String projectCode); + + /** + * + * @Description 搜索项目信息 + * @param content + * @return List + */ + List searchProject(String content); + + /** + * + * @Description 分页查询项目列表 + * @param pageBean + * @return List + */ + PageBean queryProjectPage(PageBean pageBean); + + + /** + * 根据id查询api + * @param id + * @return + */ + ApiBO getApiById(Long id); +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/repository/ProjectRepository.java b/domain/src/main/java/com/tianhua/datafactory/domain/repository/ProjectRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..26db4984fc6892abcbf5cea36c0b52fbb3919bb2 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/repository/ProjectRepository.java @@ -0,0 +1,40 @@ +package com.tianhua.datafactory.domain.repository; + +import com.tianhua.datafactory.domain.bo.project.ProjectBO; + + +/** + * @Description:项目api仓库接口 + * @Author:shenshuai + * @CreateTime:2022-05-27 16:05:26 + * @version v1.0 + */ +public interface ProjectRepository{ + + /** + * + * @Description 保存项目&api + * @param projectBO + * @return boolean + */ + boolean saveProject(ProjectBO projectBO); + + /** + * + * @Description 修改项目&api + * @param projectBO + * @return boolean + */ + boolean updateProject(ProjectBO projectBO); + + /** + * + * @Description 获取项目信息聚合接口 + * @param projectCode + * @return ProjectBO + */ + ProjectBO getByCode(String projectCode) throws Exception; + + + +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/support/OptionsBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/support/OptionsBO.java new file mode 100644 index 0000000000000000000000000000000000000000..f33186baa271e5b5f467ee31b970997eae5d12e5 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/support/OptionsBO.java @@ -0,0 +1,32 @@ +package com.tianhua.datafactory.domain.support; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description: + * date: 2022/5/17 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class OptionsBO { + + private List> options = new ArrayList<>(); + + public void addOptionItem(String label,String value){ + Map optionItem = new HashMap<>(); + optionItem.put("label",label); + optionItem.put("value",value); + this.options.add(optionItem); + } + + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVGroupPair.java b/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVGroupPair.java new file mode 100644 index 0000000000000000000000000000000000000000..bacd24ba9d5018010f5dd8c2614aa04ca8d9f61f --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVGroupPair.java @@ -0,0 +1,69 @@ +package com.tianhua.datafactory.domain.support.kvpair; + +import java.util.Objects; + +/** + * Description:带有分组特性的kv对象 + * date: 2022/1/11 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class KVGroupPair extends KVPair { + private G g; + public KVGroupPair(){} + + public KVGroupPair(K k,V v ,G g){ + super(k,v); + this.g = g; + } + + public G getG() { + return g; + } + + public String getGStr() { + return g.toString(); + } + + public void setG(G p) { + this.g = p; + } + + public static KVGroupPair KVGroupPair(K k, V v,G g) { + return new KVGroupPair<>(k, v, g); + } + + //提供构建k-v实例的静态方法 + public static KVGroupPair build(K k, V v,G g) { + return new KVGroupPair<>(k, v, g); + } + + @Override + public boolean equals(Object o) { + if (this == o){ + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + KVGroupPair kvGroupPair = (KVGroupPair) o; + return Objects.equals(kvGroupPair.k, super.k) && + Objects.equals(kvGroupPair.v, super.v) && Objects.equals(kvGroupPair.g,this.g); + } + + @Override + public int hashCode() { + return Objects.hash(super.k, super.v,g); + } + + @Override + public String toString() { + return "KVGroupPair{" + + "g=" + g + + ", k=" + k + + ", v=" + v + + '}'; + } +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVJSONPair.java b/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVJSONPair.java new file mode 100644 index 0000000000000000000000000000000000000000..4b3b971401b8a4d8254df0f9aadf55ffc2452fa6 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVJSONPair.java @@ -0,0 +1,14 @@ +package com.tianhua.datafactory.domain.support.kvpair; + +/** + * Description:支持value为json对象的kv模型 + * date: 2022/1/11 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class KVJSONPair extends KVReferPair { + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVPair.java b/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVPair.java new file mode 100644 index 0000000000000000000000000000000000000000..190976d26a2c110f8cd5de3cf048a2cd8a611910 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVPair.java @@ -0,0 +1,65 @@ +package com.tianhua.datafactory.domain.support.kvpair; + +import java.util.Objects; + +/** + * Description:抽象KV对象 + * date: 2022/1/11 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class KVPair { + public KVPair(){ + + } + public KVPair(K k, V v){ + this.k = k; + this.v = v; + } + protected K k; + protected V v; + + public K getK() { + return k; + } + + public void setK(K k) { + this.k = k; + } + + public V getV() { + return v; + } + + public void setV(V v) { + this.v = v; + } + + //提供构建k-v实例的静态方法 + public static KVPair build(K k, V v) { + return new KVPair<>(k, v); + } + + //提供判断k-v对象是否相同的能力 + @Override + public boolean equals(Object o) { + if (this == o){ + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + KVPair kvPair = (KVPair) o; + return Objects.equals(k, kvPair.k) && + Objects.equals(v, kvPair.v); + } + + @Override + public int hashCode() { + return Objects.hash(k, v); + } + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVPairBO.java b/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVPairBO.java new file mode 100644 index 0000000000000000000000000000000000000000..61cbc4db16ce05dbe6de98617b7c9bcc32fc636e --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVPairBO.java @@ -0,0 +1,308 @@ +package com.tianhua.datafactory.domain.support.kvpair; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * Description: kv业务实体 + * + * + * date: 2022/1/11 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + * + * 建造者模式 + */ +@Data +public class KVPairBO { + private String key; + private String value; + private String groupKey; + private String parentKey; + + /** + * 关联了哪个对象 + */ + private String referObj; + + /** + * 关联对象的标示 + */ + private String referIdentifer; + + /** + * value值类型 + */ + private Integer valueType; + + /** + * key值类型 + */ + private Integer keyType; + + /** + * json格式的对象存储 + */ + private Object valueObject; + + /** + * kv状态,跟着主对象走 + */ + private Integer status; + + + + public KVPairBO(){} + + public KVPairBO(String key,String value){ + this.key = key; + this.value = value; + } + + public KVPairBO(String key,String value, Integer valueType){ + KVPairBO kvPairBO = new KVPairBO(key,value); + kvPairBO.valueType(valueType); + } + + public static KVPairBO instance(String key,String value){ + return new KVPairBO(key,value); + } + + public static KVPairBO instance(){ + return new KVPairBO(); + } + + public String getKey() { + return key; + } + + public KVPairBO Key(String key) { + this.key = key; + return this; + } + + public Integer getStatus() { + return status; + } + + + public KVPairBO status(Integer status){ + this.status = status; + return this; + } + + + public Object getValueObject() { + return valueObject; + } + + public String getValue() { + return value; + } + + public KVPairBO value(String value) { + this.value = value; + return this; + } + + public KVPairBO valueObject(Object valueObject){ + this.valueObject = valueObject; + return this; + } + + public String getGroupKey() { + return groupKey; + } + + public KVPairBO groupKey(String groupKey) { + this.groupKey = groupKey; + return this; + } + + public String getParentKey() { + return parentKey; + } + + public KVPairBO parentKey(String parentKey) { + this.parentKey = parentKey; + return this; + } + + public String getReferObj() { + return referObj; + } + + public KVPairBO referObj(String referObj) { + this.referObj = referObj; + return this; + } + + public String getReferIdentifer() { + return referIdentifer; + } + + public KVPairBO referIdentifer(String referIdentifer) { + this.referIdentifer = referIdentifer; + return this; + } + + public Integer getValueType() { + return valueType; + } + + public Integer getKeyType() { + return keyType; + } + + + public KVPairBO valueType(Integer valueType) { + this.valueType = valueType; + return this; + } + + public KVPairBO keyType(Integer keyType) { + this.keyType = keyType; + return this; + } + + + /** + * 转换为refer kv + * @return + */ + public KVReferPair convert2ReferPair(){ + KVPair kvPair = convert2KVPair(); + return KVReferPair.build(kvPair.k,kvPair.v,groupKey,referObj,referIdentifer); + } + + + /** + * 转换为parent kv + * @return + */ + public KVParentPair convert2ParentPair(){ + KVPair kvPair = convert2KVPair(); + return KVParentPair.build(kvPair.k,kvPair.v,groupKey,parentKey); + } + + + + private KVPair convert2KVPair(){ + if(KVTypeEnum.isInteger(this.getKeyType()) && KVTypeEnum.isInteger(this.getValueType())){ + return KVPair.build(getIntegerKey(),getIntegerValue()); + } + + if(KVTypeEnum.isInteger(this.getKeyType()) && KVTypeEnum.isLong(this.getValueType())){ + return KVPair.build(getIntegerKey(),getLongValue()); + } + + if(KVTypeEnum.isInteger(this.getKeyType()) && KVTypeEnum.isString(this.getValueType())){ + return KVPair.build(getIntegerKey(),getStringValue()); + } + + if(KVTypeEnum.isInteger(this.getKeyType()) && KVTypeEnum.isJSONObject(this.getValueType())){ + return KVPair.build(getIntegerKey(),getObjectValue()); + } + + + if(KVTypeEnum.isLong(this.getKeyType()) && KVTypeEnum.isInteger(this.getValueType())){ + return KVPair.build(getLongKey(),getIntegerValue()); + } + + if(KVTypeEnum.isLong(this.getKeyType()) && KVTypeEnum.isLong(this.getValueType())){ + return KVPair.build(getLongKey(),getLongValue()); + } + + if(KVTypeEnum.isLong(this.getKeyType()) && KVTypeEnum.isString(this.getValueType())){ + return KVPair.build(getLongKey(),getStringValue()); + } + + if(KVTypeEnum.isLong(this.getKeyType()) && KVTypeEnum.isJSONObject(this.getValueType())){ + return KVPair.build(getLongKey(),getObjectValue()); + } + + return KVPair.build(getStringKey(),getStringValue()); + + } + + + + + @JSONField(serialize = false) + public Integer getIntegerKey(){ + return Integer.parseInt(this.key); + } + + @JSONField(serialize = false) + public Integer getIntegerValue(){ + return Integer.parseInt(this.value); + } + + @JSONField(serialize = false) + public Long getLongKey(){ + return Long.parseLong(this.key); + } + + @JSONField(serialize = false) + public Long getLongValue(){ + return Long.parseLong(this.value); + } + + @JSONField(serialize = false) + public String getStringKey(){ + return this.key; + } + + @JSONField(serialize = false) + public String getStringValue(){ + return this.value; + } + + @JSONField(serialize = false) + public Object getObjectValue(){ + return this.valueObject; + } + + + public void setKey(String key) { + this.key = key; + } + + public void setValue(String value) { + this.value = value; + } + + public void setGroupKey(String groupKey) { + this.groupKey = groupKey; + } + + public void setParentKey(String parentKey) { + this.parentKey = parentKey; + } + + public void setReferObj(String referObj) { + this.referObj = referObj; + } + + public void setReferIdentifer(String referIdentifer) { + this.referIdentifer = referIdentifer; + } + + public void setValueType(Integer valueType) { + this.valueType = valueType; + } + + public void setKeyType(Integer keyType) { + this.keyType = keyType; + } + + public void setValueObject(Object valueObject) { + this.valueObject = valueObject; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVParentPair.java b/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVParentPair.java new file mode 100644 index 0000000000000000000000000000000000000000..5e551f01a3bdbdcd21832f02a0ea1206f7640910 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVParentPair.java @@ -0,0 +1,62 @@ +package com.tianhua.datafactory.domain.support.kvpair; + +import java.util.Objects; + +/** + * Description:具有父子级关系的KV对象,继承 KVGroupPair 对象,这里是把组看成对象的节点深度 + * + * + * date: 2022/1/11 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class KVParentPair extends KVGroupPair { + private P p; + public KVParentPair(){} + + public KVParentPair(K k,V v,G g,P p){ + super(k,v,g); + this.p = p; + } + + public P getP() { + return p; + } + + public void setP(P p) { + this.p = p; + } + + public String getPstr(){ + return p.toString(); + } + + public static KVParentPair build(K k, V v, G g, P p) { + return new KVParentPair<>(k, v, g, p); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + KVParentPair that = (KVParentPair) o; + return Objects.equals(p, that.p); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), p); + } + + @Override + public String toString() { + return "KVParentPair{" + + "k=" + k + + ", v=" + v + + ", p=" + p + + '}'; + } +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVReferPair.java b/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVReferPair.java new file mode 100644 index 0000000000000000000000000000000000000000..91bd373d7737d4dcbda95d52e15423147d6876a6 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVReferPair.java @@ -0,0 +1,44 @@ +package com.tianhua.datafactory.domain.support.kvpair; + +/** + * Description:带有关联对象关联关系的kv + * date: 2022/1/11 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class KVReferPair extends KVGroupPair { + + public KVReferPair(){ + + } + + public KVReferPair(K k, V v , G g){ + super(k,v,g); + } + + public KVReferPair(K k, V v , G g, String referObj, String referIdentifer){ + super(k,v,g); + this.referObj = referObj; + this.referIdentifer = referIdentifer; + } + + + /** + * 关联了哪个对象 + */ + public String referObj; + + /** + * 关联对象的标示 + */ + public String referIdentifer; + + //提供构建k-v实例的静态方法 + public static KVReferPair build(K k, V v, G g, String referObj, String referIdentifer) { + return new KVReferPair<>(k, v, g, referObj, referIdentifer); + } + + +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVTypeEnum.java b/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..06359f55bf380b4eb3de42278a43161adbaadd6f --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/support/kvpair/KVTypeEnum.java @@ -0,0 +1,52 @@ +package com.tianhua.datafactory.domain.support.kvpair; + +import java.util.Objects; + +/** + * Description: + * date: 2022/1/11 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public enum KVTypeEnum { + //默认k-v都是string + STRING(0,"string字符串类型"), + INTEGER(1,"integer整数类型"), + LONG(2,"Long整数类型"), + JSON_OBJECT(3,"对象json str类型-value_json使用"), + + ; + private Integer type; + private String desc; + KVTypeEnum(Integer type, String desc){ + this.type = type; + this.desc = desc; + } + + public Integer getType() { + return type; + } + + public String getDesc() { + return desc; + } + + public static boolean isInteger(Integer integer){ + return Objects.equals(KVTypeEnum.INTEGER.type,integer); + } + + public static boolean isLong(Integer lon){ + return Objects.equals(KVTypeEnum.LONG.type,lon); + } + + public static boolean isString(Integer str){ + return Objects.equals(KVTypeEnum.STRING.type,str); + } + + + public static boolean isJSONObject(Integer obj){ + return Objects.equals(KVTypeEnum.JSON_OBJECT.type,obj); + } +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/util/AppEventPublisher.java b/domain/src/main/java/com/tianhua/datafactory/domain/util/AppEventPublisher.java new file mode 100644 index 0000000000000000000000000000000000000000..261b8954ef5f480c3a1189b6113e9e9440b48829 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/util/AppEventPublisher.java @@ -0,0 +1,21 @@ +package com.tianhua.datafactory.domain.util; + +import com.tianhua.datafactory.domain.event.BaseEvent; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +@Component +public class AppEventPublisher { + + @Autowired + private ApplicationContext applicationContext; + + /** + * 发送spring容器事件入口方法 + */ + public void publish(T t) { + applicationContext.publishEvent(t); + } + +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/util/SpringApplicationContext.java b/domain/src/main/java/com/tianhua/datafactory/domain/util/SpringApplicationContext.java new file mode 100644 index 0000000000000000000000000000000000000000..f2e0e0fa3d9854a40683896c3cb23b170eb93b30 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/util/SpringApplicationContext.java @@ -0,0 +1,25 @@ +package com.tianhua.datafactory.domain.util; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.BeanFactoryAware; +import org.springframework.stereotype.Component; + +@Component +public class SpringApplicationContext implements BeanFactoryAware { + + private static BeanFactory springBeanFactory; + + @Override + public synchronized void setBeanFactory(BeanFactory beanFactory) throws BeansException { + springBeanFactory = beanFactory; + } + + public synchronized static T getBean(Class klass) { + return springBeanFactory.getBean(klass); + } + + public synchronized static Object getBean(String beanName) { + return springBeanFactory.getBean(beanName); + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/util/StringHandleUtils.java b/domain/src/main/java/com/tianhua/datafactory/domain/util/StringHandleUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..dd11c04a9ce478591c5fe7cb1ed431c8fe5a11fc --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/util/StringHandleUtils.java @@ -0,0 +1,133 @@ +package com.tianhua.datafactory.domain.util; + +import com.google.common.collect.Sets; +import org.apache.commons.lang3.StringUtils; + +import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Description: + * date: 2021/10/12 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class StringHandleUtils { + + private static Set basicTypeSet = Sets.newHashSet("Integer","int" + ,"long","Long" + ,"String", + "Float","float", + "Boolean","boolean", + "Short","short" + ,"Double","double","[]","Object"); + + /** + * 严格基本数据类型 + */ + private static Set strictBasicTypeSet = Sets.newHashSet("int" + ,"long" + ,"float" + ,"boolean" + ,"short" + ,"double"); + + + /** + * 判断字符串中是否包含中文 + * @param str + * 待校验字符串 + * @return 是否为中文 + * @warn 不能校验是否为中文标点符号 + */ + public static boolean isContainChinese(String str) { + Pattern p = Pattern.compile("[\u4e00-\u9fa5]"); + Matcher m = p.matcher(str); + if (m.find()) { + return true; + } + return false; + } + + /** + * 通过变量类型获取变量对应的变量名 + * @param paramType + * @return + */ + public static String getParamVar(String paramType){ + if(StringUtils.isEmpty(paramType.trim())){ + return "null"; + } + if(paramType.contains("List<")){ + String paramModel = paramType.trim().replace("List<","").replace(">",""); + return paramModel.trim().substring(0,1).toLowerCase()+paramModel.substring(1)+"List"; + } + if(paramType.contains("Set<")){ + String paramModel = paramType.trim().replace("List<","").replace(">",""); + return paramModel.trim().substring(0,1).toLowerCase()+paramModel.substring(1)+"Set"; + } + + return paramType.trim().substring(0,1).toLowerCase()+paramType.substring(1); + } + + /** + * 判断参数是不是基本类型 + * @param paramType + * @return + */ + public static boolean isBasicType(String paramType){ + AtomicBoolean basicType = new AtomicBoolean(false); + basicTypeSet.forEach(str->{ + if(paramType.contains(str)){ + basicType.set(true); + } + }); + return basicType.get(); + } + + /** + * 判断参数是不是严格的基本类型 + * @param paramType + * @return + */ + public static boolean isStrictBasicType(String paramType){ + AtomicBoolean basicType = new AtomicBoolean(false); + strictBasicTypeSet.forEach(str->{ + if(paramType.contains(str)){ + basicType.set(true); + } + }); + return basicType.get(); + } + + + /** + * 将返回参数包装类型去掉 + * Result + * ResultDto + * ResultDataDto + * SdkResponse + * Response + * ResultDto + * ResultDto> + * SdkResponse + * @param paramType + * @return + */ + public static String getParamTypeNoWrapper(String paramType){ + boolean wrapper = paramType.contains("Result") || paramType.equals("Response"); + //如果是包装类型,但是却没有范型声明则返回null + if(wrapper){ + if(!paramType.contains("<")){ + return null; + } + String result = paramType.substring(paramType.indexOf("<")+1); + return result.substring(0,result.length() - 1); + } + return paramType; + } +} diff --git a/domain/src/main/java/com/tianhua/datafactory/domain/util/StringHelperUtils.java b/domain/src/main/java/com/tianhua/datafactory/domain/util/StringHelperUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..c1cc6b93c65c1e2295f6b039eb99808597d439e0 --- /dev/null +++ b/domain/src/main/java/com/tianhua/datafactory/domain/util/StringHelperUtils.java @@ -0,0 +1,88 @@ +package com.tianhua.datafactory.domain.util; + +import java.util.regex.Pattern; + +/** + * Description: + * date: 2021/10/21 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class StringHelperUtils { + + private static Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$"); + + + /** + * 根据表名获取对应类名 + * @param tableName + * @return + */ + public static String getClassDOName(String tableName){ + String humpTableName = getHumpTableName(tableName); + return getHumpClassName(humpTableName); + } + + /** + * 获取表名对应的类名 + * eg: user_info->UserInfo + * staff_education_info->StaffEducationInfo + * + * @param humpTableName + * @return + */ + public static String getHumpClassName(String humpTableName){ + String resultName = humpTableName.substring(0,1).toUpperCase().concat(humpTableName.substring(1)); + return resultName; + } + + /** + * 获取表名对应的变量名 + * eg: user_info->userInfo + * staff_education_info->staffEducationInfo + * + * @param tableName + * @return + */ + private static String getHumpTableName(String tableName){ + String resultName = ""; + + if(!tableName.contains("_")){ + resultName = tableName; + }else { + String[] tableNameArr = tableName.split("_"); + int length = tableNameArr.length; + StringBuilder builder = new StringBuilder(); + + if(isNum(tableNameArr[length - 1])){ + if(length == 2){ + resultName = tableNameArr[0]; + }else { + builder.append(tableNameArr[0]); + for (int i = 1;i < length - 1;i++){ + String tag = tableNameArr[i].substring(0,1).toUpperCase().concat(tableNameArr[i].substring(1)); + builder.append(tag); + } + resultName = builder.toString(); + } + }else { + builder.append(tableNameArr[0]); + for (int i = 1;i < length;i++){ + String tag = tableNameArr[i].substring(0,1).toUpperCase().concat(tableNameArr[i].substring(1)); + builder.append(tag); + } + resultName = builder.toString(); + } + + } + return resultName; + } + + + private static boolean isNum(String str){ + return pattern.matcher(str).matches(); + } + +} diff --git a/infrast/pom.xml b/infrast/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..8a5f96787a251ecad98c178768012bdaaf36ea80 --- /dev/null +++ b/infrast/pom.xml @@ -0,0 +1,121 @@ + + + + 4.0.0 + + + com.tianhua.datafactory + datafactory-parent + 2.0.0-SNAPSHOT + + + + com.tianhua.datafactory + infrast + 2.0.0-SNAPSHOT + + infrast + + http://www.example.com + + + UTF-8 + 1.8 + 1.8 + + + + + junit + junit + 4.12 + test + + + + + + org.mybatis + mybatis + 3.4.1 + + + + com.alibaba + druid + 1.1.17 + + + + + + org.mybatis + mybatis-spring + 1.3.0 + + + + mysql + mysql-connector-java + 8.0.20 + + + + + com.coderman.utils + coderman-utils + + + + com.tianhua.datafactory + domain + 2.0.0-SNAPSHOT + + + + org.projectlombok + lombok + + + org.slf4j + slf4j-api + + + org.springframework + spring-tx + + + com.github.ben-manes.caffeine + caffeine + + + org.springframework + spring-web + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 1.3.2 + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter-test + 1.3.2 + + + + + commons-collections + commons-collections + 3.2.2 + + + + + + + + + diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ApiModelDO.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ApiModelDO.java new file mode 100644 index 0000000000000000000000000000000000000000..ab1c1045c97470502faf1230cc408892cc6a0d5e --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ApiModelDO.java @@ -0,0 +1,84 @@ +package com.tianhua.datafactory.infrast.dao.dataobject; + +import java.util.Date; + +import com.tianhua.datafactory.domain.enums.ReturnWrapClassEnum; +import lombok.Data; +import lombok.ToString; + +/** +* @Description:API数据表DO类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Data +@ToString +public class ApiModelDO{ + + + /** 主键 **/ + private Long id; + + /** 项目名称 **/ + private String projectCode; + + /** api信息 **/ + private String apiUrl; + + /** api类型 **/ + private String apiType; + + /** api返回值集合 **/ + private String returnValue; + + /** api签名信息 **/ + private String apiSign; + + /** api描述 **/ + private String apiDoc; + + /** 请求方式 **/ + private String methodType; + + /** 请求参数元信息 **/ + private String requestParam; + + + /** + * 进行接口mock调用的时候接口返回的条数 + * 1条或者多条 + * 模拟后端数据返回 + */ + private Integer mockCount; + + /** + * api返回包装类型 + * @see ReturnWrapClassEnum + */ + private Integer apiReturnWrapType; + + + + /** + * 响应参数元信息 + */ + private String returnParam; + + /** api状态 **/ + private Integer status; + + /** 创建时间 **/ + private Date dateCreate; + + /** 修改时间 **/ + private Date dateUpdate; + + /** 修改人 **/ + private Long updateUserId; + + /** 创建人 **/ + private Long createUserId; + + +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ColumnModelDO.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ColumnModelDO.java new file mode 100644 index 0000000000000000000000000000000000000000..e23b57e7b85829e67bcf88d15363c5b0404a5668 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ColumnModelDO.java @@ -0,0 +1,62 @@ +package com.tianhua.datafactory.infrast.dao.dataobject; + +import java.util.Date; +import java.math.BigDecimal; +import lombok.Data; +import lombok.ToString; + +/** +* @Description:字段模型DO类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Data +@ToString +public class ColumnModelDO{ + + + /** 主键 **/ + private Long id; + + /** 所属数据库 **/ + private Long tableId; + + /** 字段名称 **/ + private String columnName; + + /** 字段描述 **/ + private String columnComment; + + /** 字段长度 **/ + private Integer columnLength; + + /** 字段类型 **/ + private String columnType; + + /** 是否可为空 **/ + private Boolean notNull; + + /** 默认值 **/ + private String defaultValue; + + /** 是否是唯一键 **/ + private Boolean uniqColumn; + + /** 创建时间 **/ + private Date dateCreate; + + /** 修改时间 **/ + private Date dateUpdate; + + /** 修改人 **/ + private Long updateUserId; + + /** 创建人 **/ + private Long createUserId; + + /** + * 状态 + */ + private Integer status; +} \ No newline at end of file diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/entity/DataSourceEntity.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/DataSourceDO.java similarity index 66% rename from datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/entity/DataSourceEntity.java rename to infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/DataSourceDO.java index b25adc9b7a99ba6a10c3f7ac65e6ac2692418329..2f5297992d5824be36175192c0045ef1450409db 100644 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/entity/DataSourceEntity.java +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/DataSourceDO.java @@ -1,10 +1,10 @@ -package com.coderman.tianhua.datafactory.core.entity; +package com.tianhua.datafactory.infrast.dao.dataobject; -import java.util.Date; -import java.math.BigDecimal; import lombok.Data; import lombok.ToString; +import java.util.Date; + /** * @Description:数据源管理表Entity类 * @Author:fanchunshuai @@ -13,7 +13,7 @@ import lombok.ToString; */ @Data @ToString -public class DataSourceEntity{ +public class DataSourceDO { /** 主键 **/ @@ -28,11 +28,20 @@ public class DataSourceEntity{ /** 数据源类型/(nacos,api,enum) **/ private Integer sourceType; - /** 数据源提供来源 **/ - private String providerSrc; + /** 数据源提供来源服务名 **/ + private String providerService; + + /** + * 服务提供者域名 + */ + private String providerDomainUrl; + + /** + * 注册中心类型 + */ + private Integer registServer; + - /** 访问token **/ - private String token; /** 数据源访问url **/ private String url; @@ -40,9 +49,23 @@ public class DataSourceEntity{ /** 状态(0正常,1过期) **/ private Integer status; - /** 访问策略(0动态获取/1本地缓存) **/ + /** 访问策略 **/ private Integer visitStrategy; + + /** + * 数据源格式 + */ + private String structType; + + + + + + + + + /** 创建时间 **/ private Date createTime; diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/entity/DataSourceDetailEntity.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/DataSourceDetailDO.java similarity index 50% rename from datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/entity/DataSourceDetailEntity.java rename to infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/DataSourceDetailDO.java index 29ba923826f51be280887dd3c025db78e9fdf716..67a0d0eea3adde465f400f603925a9967baa5eab 100644 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/entity/DataSourceDetailEntity.java +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/DataSourceDetailDO.java @@ -1,19 +1,17 @@ -package com.coderman.tianhua.datafactory.core.entity; +package com.tianhua.datafactory.infrast.dao.dataobject; -import java.util.Date; -import java.math.BigDecimal; import lombok.Data; import lombok.ToString; /** -* @Description:数据源详情表Entity类 -* @Author:fanchunshuai -* @CreateTime:2020-12-02 23:07:13 +* @Description:数据源详情表DO类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 * @version v1.0 */ @Data @ToString -public class DataSourceDetailEntity{ +public class DataSourceDetailDO{ /** 主键 **/ diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/DataSourceReqConfigDO.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/DataSourceReqConfigDO.java new file mode 100644 index 0000000000000000000000000000000000000000..77582ff8790393f84147c0903e6ccdd6846e42ee --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/DataSourceReqConfigDO.java @@ -0,0 +1,50 @@ +package com.tianhua.datafactory.infrast.dao.dataobject; + +import lombok.Data; + +/** + * Description: + * date: 2022/6/2 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class DataSourceReqConfigDO { + + private Long id; + + /** + * 参数key + */ + private String paramKey; + + /** + * 参数值 + */ + private String paramValue; + + /** + * 参数描述 + */ + private String paramDesc; + + /** + * 是否是可选参数?? + */ + private boolean required; + + /** + * 是否是请求接口参数?? + */ + private boolean interfaceParam; + + /** + * 所属数据源ID + */ + private Long dataSourceId; + + + +} diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/DataSourceRespConfigDO.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/DataSourceRespConfigDO.java new file mode 100644 index 0000000000000000000000000000000000000000..36e41f31d8fecd00e065af0cbf996008788e0d5b --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/DataSourceRespConfigDO.java @@ -0,0 +1,43 @@ +package com.tianhua.datafactory.infrast.dao.dataobject; + +import lombok.Data; + +/** + * Description:数据源响应参数配置 + * date: 2022/6/2 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class DataSourceRespConfigDO { + + private Long id; + + /** + * + */ + private String fieldKey; + + /** + * 请求路径如a.b.c + */ + private String referPath; + + /** + * 数据描述 + */ + private String fieldDesc; + + /** + * 数据类型 + */ + private String fieldType; + + + /** + * 所属数据源ID + */ + private Long dataSourceId; +} diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/FieldModelDO.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/FieldModelDO.java new file mode 100644 index 0000000000000000000000000000000000000000..6074f5fbf2a93e8ade2a703b2de75e73a45f4a3e --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/FieldModelDO.java @@ -0,0 +1,51 @@ +package com.tianhua.datafactory.infrast.dao.dataobject; + +import lombok.Data; +import lombok.ToString; + +/** +* @Description:属性模型DO类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Data +@ToString +public class FieldModelDO{ + + + /** 主键 **/ + private Long id; + + /** 属性名称 **/ + private String fieldName; + + /** 属性描述 **/ + private String fieldDesc; + + /** 属性中文注释 **/ + private String fieldDoc; + + + /** 所属类模型名称 **/ + private String paramClassName; + + /** 项目编码 **/ + private String projectCode; + /** + * 属性类型 + */ + private String fieldType; + + + /** + * 属性扩展字段集合 + */ + private String fieldExtJsonStr; + + + /** + * 状态 + */ + private Integer status; +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/KVPairDO.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/KVPairDO.java new file mode 100644 index 0000000000000000000000000000000000000000..86327f8cbc6ff8757293c59bd2dd4f39ad89afd2 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/KVPairDO.java @@ -0,0 +1,52 @@ +package com.tianhua.datafactory.infrast.dao.dataobject; + +import lombok.Data; + +/** + * Description:数据库实体 + * date: 2022/1/11 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class KVPairDO { + private Long id; + private String key; + private String value; + private String groupKey; + private String parentKey; + + /** + * 关联了哪个对象 + */ + private String referKey; + + /** + * 关联对象的标示 + */ + private String referId; + + /** + * value值类型 + */ + private Integer valueType; + + + /** + * key值类型 + */ + private Integer keyType; + + /** + * json格式的对象存储 + */ + private String valueJson; + + /** + * kv状态,跟着主对象走 + */ + private Integer status; + +} diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ModelMappingConfigDO.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ModelMappingConfigDO.java new file mode 100644 index 0000000000000000000000000000000000000000..3d815ef740fc4367330e0cef23ab753d4448c2ed --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ModelMappingConfigDO.java @@ -0,0 +1,48 @@ +package com.tianhua.datafactory.infrast.dao.dataobject; + +import java.util.Date; +import java.math.BigDecimal; +import lombok.Data; +import lombok.ToString; + +/** +* @Description:模型映射表DO类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Data +@ToString +public class ModelMappingConfigDO{ + + private Long id; + + /** + * 映射模型类名 or表名 + */ + private String mappingClassFirst; + + /** + * 映射模型属性名 + */ + private String mappingFieldFirst; + + + /** + * 映射模型类名 or表名 + */ + private String mappingClassSecond; + + /** + * 映射模型属性名 + */ + private String mappingFieldSecond; + + + /** 映射类型 **/ + private String mappingType; + + /** 项目编码 **/ + private String projectCode; + +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ModelSuffixConfigDO.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ModelSuffixConfigDO.java new file mode 100644 index 0000000000000000000000000000000000000000..bc9e375bab7a4d6543a52a912a7cc17751456adc --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ModelSuffixConfigDO.java @@ -0,0 +1,31 @@ +package com.tianhua.datafactory.infrast.dao.dataobject; + +import java.util.Date; +import java.math.BigDecimal; +import lombok.Data; +import lombok.ToString; + +/** +* @Description:后缀配置表DO类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Data +@ToString +public class ModelSuffixConfigDO{ + + + /** 主键 **/ + private Long id; + + /** 模型后缀 **/ + private String suffix; + + /** 模型后缀描述 **/ + private String desc; + + /** 模型类型 **/ + private String modelType; + +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ParamModelDO.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ParamModelDO.java new file mode 100644 index 0000000000000000000000000000000000000000..ac35124f1c7d0bd3b749044747fbab766fdff5b9 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ParamModelDO.java @@ -0,0 +1,65 @@ +package com.tianhua.datafactory.infrast.dao.dataobject; + +import java.util.Date; +import java.math.BigDecimal; +import lombok.Data; +import lombok.ToString; + +/** +* @Description:参数模型表DO类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Data +@ToString +public class ParamModelDO{ + + + /** 主键 **/ + private Long id; + + /** 项目名称 **/ + private String projectCode; + + /** 参数类名 **/ + private String paramClassName; + + + /** + * 模型参数名称 + * 模型作为api参数使用 + */ + private String paramVarName; + + + + /** 参数类描述 **/ + private String paramClassDesc; + + /** 所属上下文或模块编码 **/ + private String moduleCode; + + /** 模型后缀 **/ + private String modelSuffix; + + + + /** 创建时间 **/ + private Date dateCreate; + + /** 修改时间 **/ + private Date dateUpdate; + + /** 修改人 **/ + private Long updateUserId; + + /** 创建人 **/ + private Long createUserId; + + /** + * 状态 + */ + private Integer status; + +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ProjectConfigDO.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ProjectConfigDO.java new file mode 100644 index 0000000000000000000000000000000000000000..2396d7efe832cfa1c9b1051d9f23f332c28a7ab4 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/ProjectConfigDO.java @@ -0,0 +1,56 @@ +package com.tianhua.datafactory.infrast.dao.dataobject; + +import java.util.Date; +import java.math.BigDecimal; +import lombok.Data; +import lombok.ToString; + +/** +* @Description:项目配置DO类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Data +@ToString +public class ProjectConfigDO{ + + + /** 主键 **/ + private Long id; + + /** 项目应用名 **/ + private String projectCode; + + /** 应用描述 **/ + private String projectDesc; + + /** 业务领域编码 **/ + private String domainCode; + + /** 业务领域描述 **/ + private String domainDesc; + + /** 所属业务线 **/ + private String busLine; + + /** 所属部门 **/ + private String deptName; + + /** 创建时间 **/ + private Date dateCreate; + + /** 修改时间 **/ + private Date dateUpdate; + + /** 修改人 **/ + private Long updateUserId; + + /** 创建人 **/ + private Long createUserId; + + /** + * 状态 + */ + private Integer status; +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/TableModelDO.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/TableModelDO.java new file mode 100644 index 0000000000000000000000000000000000000000..3e2bdbd6c99aa53efe1743d305b0817597310de0 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/dataobject/TableModelDO.java @@ -0,0 +1,50 @@ +package com.tianhua.datafactory.infrast.dao.dataobject; + +import java.util.Date; +import java.math.BigDecimal; +import lombok.Data; +import lombok.ToString; + +/** +* @Description:表模型DO类 +* @Author:shenshuai +* @CreateTime:2022-05-27 16:05:26 +* @version v1.0 +*/ +@Data +@ToString +public class TableModelDO{ + + + /** 主键 **/ + private Long id; + + /** 数据库表名 **/ + private String tableName; + + /** 数据库表描述 **/ + private String tableComment; + + /** 数据库名称 **/ + private String dbName; + + /** 项目编码 **/ + private String projectCode; + + /** 创建时间 **/ + private Date dateCreate; + + /** 修改时间 **/ + private Date dateUpdate; + + /** 修改人 **/ + private Long updateUserId; + + /** 创建人 **/ + private Long createUserId; + + /** + * 状态 + */ + private Integer status; +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ApiModelMapper.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ApiModelMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..521468a227542c3d49890f9a1fe1dc06d9ebb94f --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ApiModelMapper.java @@ -0,0 +1,77 @@ +package com.tianhua.datafactory.infrast.dao.mapper; + +import java.util.List; + +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.infrast.dao.dataobject.ApiModelDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + + +/** + * @Description:API数据表mapperDAO接口 + * @Author:shenshuai + * @CreateTime:2022-05-27 16:29:46 + * @version v1.0 + */ +@Mapper +public interface ApiModelMapper{ + + /** + * @Description:新增或修改 + * @param apiModelDO + * @return int + */ + public long insert(ApiModelDO apiModelDO); + + /** + * @Description: 通过id删除数据 + * @param id + * @return int + */ + public int deleteById(Long id); + + /** + * @Description: 通过id查询 + * @param id + * @return ResultDataDto + */ + public ApiModelDO getById(Long id); + + /** + * @Description:查询所有数据 + * @return List getAll(); + + /** + * @Description:新增或修改 + * @param apiModelDO + * @return int + */ + public int update(ApiModelDO apiModelDO); + + /** + * @Description:查询所有数据 + * @return List getPageList(@Param(value = "page") PageBean page ); + + + /** + * @Description:查询数量 + * @return int + */ + public int getPageCount(@Param(value = "page") PageBean page ); + + + public List getByProjectCode(String projectCode); + + + + public void deleteByProjectCode(String projectCode); + + + public ApiModelDO getByApiSign(String apiSign); + +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ColumnModelMapper.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ColumnModelMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..d56fbc6144d27d67a849873c3ce9592b0cae9a97 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ColumnModelMapper.java @@ -0,0 +1,68 @@ +package com.tianhua.datafactory.infrast.dao.mapper; + +import java.util.List; +import com.tianhua.datafactory.infrast.dao.dataobject.ColumnModelDO; +import org.apache.ibatis.annotations.Mapper; + + +/** + * @Description:字段模型mapperDAO接口 + * @Author:shenshuai + * @CreateTime:2022-05-27 16:29:46 + * @version v1.0 + */ +@Mapper +public interface ColumnModelMapper{ + + /** + * @Description:新增或修改 + * @param columnModelDO + * @return int + */ + public long insert(ColumnModelDO columnModelDO); + + /** + * @Description: 通过id删除数据 + * @param id + * @return int + */ + public int deleteById(Long id); + + /** + * @Description: 通过id查询 + * @param id + * @return ResultDataDto + */ + public ColumnModelDO getById(Long id); + + /** + * @Description:查询所有数据 + * @return List getAll(); + + /** + * @Description:新增或修改 + * @param columnModelDO + * @return int + */ + public int update(ColumnModelDO columnModelDO); + + /** + * @Description:查询所有数据 + * @return List getPageList(); + + + /** + * @Description:查询数量 + * @return int + */ + public int getCount(); + + void deleteByTableId(Long tableId); + + + List getByTableId(Long tableId); +} \ No newline at end of file diff --git a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/mapper/DataSourceMapper.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/DataSourceMapper.java similarity index 64% rename from datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/mapper/DataSourceMapper.java rename to infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/DataSourceMapper.java index 3c7003c659ce0d17526470d928f2399c936acf16..d1aeb10803c55b7256a585698eb0f7c94285d5f2 100644 --- a/datafactory-core/src/main/java/com/coderman/tianhua/datafactory/core/mapper/DataSourceMapper.java +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/DataSourceMapper.java @@ -1,8 +1,8 @@ -package com.coderman.tianhua.datafactory.core.mapper; +package com.tianhua.datafactory.infrast.dao.mapper; -import com.coderman.tianhua.datafactory.core.bean.DataSourceQueryDTO; -import com.coderman.tianhua.datafactory.core.entity.DataSourceEntity; +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.infrast.dao.dataobject.DataSourceDO; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -21,11 +21,11 @@ public interface DataSourceMapper{ * @Title: save * @Description:新增或修改 * @author: - * @param @param dataSourceEntity + * @param @param dataSourceDO * @return int * @throws */ - public long insert(DataSourceEntity dataSourceEntity); + public long insert(DataSourceDO dataSourceDO); /** * @@ -47,7 +47,7 @@ public interface DataSourceMapper{ * @return ResultDataDto 返回类型 * @throws */ - public DataSourceEntity getById(@Param(value = "id") Long id); + public DataSourceDO getById(@Param(value = "id") Long id); /** * @@ -57,7 +57,7 @@ public interface DataSourceMapper{ * @return List getAll(); + public List getAll(); /** * @@ -68,7 +68,7 @@ public interface DataSourceMapper{ * @return int * @throws */ - public int update(DataSourceEntity dataSourceEntity); + public int update(DataSourceDO dataSourceEntity); /** @@ -80,7 +80,7 @@ public interface DataSourceMapper{ * @return ResultDataDto 返回类型 * @throws */ - public DataSourceEntity getBySourceCode(String sourceCode); + public DataSourceDO getBySourceCode(String sourceCode); /** * 修改状态 @@ -92,9 +92,21 @@ public interface DataSourceMapper{ /** * 分页查询 - * @param dataSourceQueryDTO + * @param page * @return */ - public List getPage(DataSourceQueryDTO dataSourceQueryDTO); - + public List getPage(@Param(value = "page") PageBean page); + + + /** + * @Description:查询数量 + * @return int + */ + public int getPageCount(@Param(value = "page") PageBean page); + + + public List search(@Param(value = "content") String content); + + + } \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/DataSourceReqConfigMapper.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/DataSourceReqConfigMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..4d9e0de8e4fa9d0239fb9ba68c48212bcb0d946d --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/DataSourceReqConfigMapper.java @@ -0,0 +1,85 @@ +package com.tianhua.datafactory.infrast.dao.mapper; + + + +import com.tianhua.datafactory.infrast.dao.dataobject.DataSourceReqConfigDO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + + +/** + * @Description:数据源请求配置表 + * @Author:fanchunshuai + * @CreateTime:2020-12-02 23:07:13 + * @version v1.0 + */ +public interface DataSourceReqConfigMapper { + + /** + * + * @Title: save + * @Description:新增或修改 + * @author: + * @param dataSourceReqConfigDO + * @return int + * @throws + */ + public int insert(DataSourceReqConfigDO dataSourceReqConfigDO); + + /** + * + * @Title: delete + * @Description: 通过id删除数据 + * @author: + * @param @param id + * @return int + * @throws + */ + public int deleteByDataSourceId(@Param(value = "dataSourceId") Long dataSourceId); + + /** + * + * @Title: getById + * @Description: 通过id查询 + * @author: + * @param @param id + * @return ResultDataDto 返回类型 + * @throws + */ + public DataSourceReqConfigDO getById(Long id); + + /** + * + * @Title: getAll + * @Description:查询所有数据 + * @author: + * @return List getAll(); + + /** + * + * @Title: update + * @Description:新增或修改 + * @author: + * @param @param DataSourceDetailDO + * @return int + * @throws + */ + public int update(DataSourceReqConfigDO dataSourceReqConfigDO); + + + /** + * + * @Title: getBydataSourceId + * @Description: 通过dataSourceId查询 + * @author: + * @param @param dataSourceId + * @return ResultDataDto 返回类型 + * @throws + */ + public List getByDataSourceId(Long dataSourceId); + +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/DataSourceResConfigMapper.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/DataSourceResConfigMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..1c8b0a489d34d93a51e84ee79b599827492ebdf9 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/DataSourceResConfigMapper.java @@ -0,0 +1,85 @@ +package com.tianhua.datafactory.infrast.dao.mapper; + + + +import com.tianhua.datafactory.infrast.dao.dataobject.DataSourceRespConfigDO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + + +/** + * @Description:数据源响应配置表 + * @Author:fanchunshuai + * @CreateTime:2020-12-02 23:07:13 + * @version v1.0 + */ +public interface DataSourceResConfigMapper { + + /** + * + * @Title: save + * @Description:新增或修改 + * @author: + * @param dataSourceRespConfigDO + * @return int + * @throws + */ + public int insert(DataSourceRespConfigDO dataSourceRespConfigDO); + + /** + * + * @Title: delete + * @Description: 通过id删除数据 + * @author: + * @param @param id + * @return int + * @throws + */ + public int deleteByDataSourceId(@Param(value = "dataSourceId") Long dataSourceId); + + /** + * + * @Title: getById + * @Description: 通过id查询 + * @author: + * @param @param id + * @return ResultDataDto 返回类型 + * @throws + */ + public DataSourceRespConfigDO getById(Long id); + + /** + * + * @Title: getAll + * @Description:查询所有数据 + * @author: + * @return List getAll(); + + /** + * + * @Title: update + * @Description:新增或修改 + * @author: + * @param @param DataSourceDetailDO + * @return int + * @throws + */ + public int update(DataSourceRespConfigDO dataSourceRespConfigDO); + + + /** + * + * @Title: getBydataSourceId + * @Description: 通过dataSourceId查询 + * @author: + * @param dataSourceId + * @return ResultDataDto 返回类型 + * @throws + */ + public List getByDataSourceId(Long dataSourceId); + +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/FieldModelMapper.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/FieldModelMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..825a90791b259d51c7b13ee5ca1cadabb466491c --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/FieldModelMapper.java @@ -0,0 +1,84 @@ +package com.tianhua.datafactory.infrast.dao.mapper; + +import java.util.List; +import com.tianhua.datafactory.infrast.dao.dataobject.FieldModelDO; +import com.tianhua.datafactory.infrast.dao.dataobject.ParamModelDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + + +/** + * @Description:属性模型mapperDAO接口 + * @Author:shenshuai + * @CreateTime:2022-05-27 16:29:46 + * @version v1.0 + */ +@Mapper +public interface FieldModelMapper{ + + /** + * @Description:新增或修改 + * @param fieldModelDO + * @return int + */ + public long insert(FieldModelDO fieldModelDO); + + /** + * @Description: 通过id删除数据 + * @param id + * @return int + */ + public int deleteById(Long id); + + /** + * @Description: 通过id查询 + * @param id + * @return ResultDataDto + */ + public FieldModelDO getById(Long id); + + /** + * @Description:查询所有数据 + * @return List getAll(); + + /** + * @Description:新增或修改 + * @param fieldModelDO + * @return int + */ + public int update(FieldModelDO fieldModelDO); + + /** + * @Description:查询所有数据 + * @return List getPageList(); + + + /** + * @Description:查询数量 + * @return int + */ + public int getCount(); + + public int deleteByProjectCodeAndParamClassName(@Param(value = "projectCode") String projectCode,@Param(value = "paramClassName") String paramClassName); + + + /** + * 根据项目名称和模型名称获取属性列表 + * @param projectCode + * @param paramClassName + * @return + */ + public List getByCode(String projectCode, String paramClassName); + + /** + * 根据项目名称和模型名称获取属性列表 + * @param projectCode + * @param paramClassName + * @return + */ + public FieldModelDO getByCodeField(String projectCode, String paramClassName,String fieldName); +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/KVMapper.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/KVMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..da3b5e9148e00db869a1c10ce83e12f9ef9b1bf9 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/KVMapper.java @@ -0,0 +1,72 @@ +package com.tianhua.datafactory.infrast.dao.mapper; + + +import com.tianhua.datafactory.infrast.dao.dataobject.KVPairDO; + +import java.util.List; + +/** + * Description: + * date: 2022/1/11 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public interface KVMapper { + /** + * 插入 + * @param kvPairDO + * @return + */ + int insert(KVPairDO kvPairDO); + + /** + * 插入 + * @param list + * @return + */ + int insertBatch(List list); + + + + /** + * 根据条件查询单条数据 + * @param kvPairDO + * @return + */ + KVPairDO selectOne(KVPairDO kvPairDO); + + /** + * 判断是否存在kv信息 + * @param kvPairDO + * @return + */ + int count(KVPairDO kvPairDO); + + /** + * 根据条件修改v + * @param kvPairDO + * @return + */ + int update(KVPairDO kvPairDO); + + + /** + * 根据条件查询多条记录 + * @param kvPairDO + * @return + */ + List selectList(KVPairDO kvPairDO); + + + List selectAll(); + + /** + * 建议使用逻辑删除 + * @param kvPairDO + * @return + */ + int delete(KVPairDO kvPairDO); + +} diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ModelMappingConfigMapper.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ModelMappingConfigMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..c8a66684c6931734fd390f4a82899c1210978142 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ModelMappingConfigMapper.java @@ -0,0 +1,70 @@ +package com.tianhua.datafactory.infrast.dao.mapper; + +import java.util.List; + +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.infrast.dao.dataobject.ModelMappingConfigDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + + +/** + * @Description:模型映射表mapperDAO接口 + * @Author:shenshuai + * @CreateTime:2022-05-27 16:29:46 + * @version v1.0 + */ +@Mapper +public interface ModelMappingConfigMapper{ + + /** + * @Description:新增或修改 + * @param modelMappingConfigDO + * @return int + */ + public long insert(ModelMappingConfigDO modelMappingConfigDO); + + /** + * @Description: 通过id删除数据 + * @param id + * @return int + */ + public int deleteById(Long id); + + /** + * @Description: 通过id查询 + * @param id + * @return ResultDataDto + */ + public ModelMappingConfigDO getById(Long id); + + + List getListByProjectCode(@Param(value = "projectCode") String projectCode); + + /** + * @Description:查询所有数据 + * @return List getAll(); + + /** + * @Description:新增或修改 + * @param modelMappingConfigDO + * @return int + */ + public int update(ModelMappingConfigDO modelMappingConfigDO); + + /** + * @Description:查询所有数据 + * @return List getPageList(@Param(value = "page")PageBean page); + + + /** + * @Description:查询数量 + * @return int + */ + public int getPageCount(@Param(value = "page")PageBean page); + +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ModelSuffixConfigMapper.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ModelSuffixConfigMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..c3ea699af2319015df01d0c609e63099c69e6262 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ModelSuffixConfigMapper.java @@ -0,0 +1,64 @@ +package com.tianhua.datafactory.infrast.dao.mapper; + +import java.util.List; +import com.tianhua.datafactory.infrast.dao.dataobject.ModelSuffixConfigDO; +import org.apache.ibatis.annotations.Mapper; + + +/** + * @Description:后缀配置表mapperDAO接口 + * @Author:shenshuai + * @CreateTime:2022-05-27 16:29:46 + * @version v1.0 + */ +@Mapper +public interface ModelSuffixConfigMapper{ + + /** + * @Description:新增或修改 + * @param modelSuffixConfigDO + * @return int + */ + public long insert(ModelSuffixConfigDO modelSuffixConfigDO); + + /** + * @Description: 通过id删除数据 + * @param id + * @return int + */ + public int deleteById(Long id); + + /** + * @Description: 通过id查询 + * @param id + * @return ResultDataDto + */ + public ModelSuffixConfigDO getById(Long id); + + /** + * @Description:查询所有数据 + * @return List getAll(); + + /** + * @Description:新增或修改 + * @param modelSuffixConfigDO + * @return int + */ + public int update(ModelSuffixConfigDO modelSuffixConfigDO); + + /** + * @Description:查询所有数据 + * @return List getPageList(); + + + /** + * @Description:查询数量 + * @return int + */ + public int getCount(); + +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ParamModelMapper.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ParamModelMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..cff2c12ead563707ee115bb42d82697ac27b88a0 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ParamModelMapper.java @@ -0,0 +1,75 @@ +package com.tianhua.datafactory.infrast.dao.mapper; + +import java.util.List; + +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.infrast.dao.dataobject.ParamModelDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + + +/** + * @Description:参数模型表mapperDAO接口 + * @Author:shenshuai + * @CreateTime:2022-05-27 16:29:46 + * @version v1.0 + */ +@Mapper +public interface ParamModelMapper{ + + /** + * @Description:新增或修改 + * @param paramModelDO + * @return int + */ + public long insert(ParamModelDO paramModelDO); + + /** + * @Description: 通过id删除数据 + * @param id + * @return int + */ + public int deleteById(Long id); + + /** + * @Description: 通过id查询 + * @param id + * @return ResultDataDto + */ + public ParamModelDO getById(Long id); + + /** + * @Description:查询所有数据 + * @return List getAll(); + + /** + * @Description:新增或修改 + * @param paramModelDO + * @return int + */ + public int update(ParamModelDO paramModelDO); + + /** + * @Description:查询所有数据 + * @return List getPageList(@Param(value = "page") PageBean page); + + + /** + * @Description:查询数量 + * @return int + */ + public int getPageCount(@Param(value = "page") PageBean page); + + + public List getByProjectCode(String projectCode); + + + public List search(String content); + + + public ParamModelDO getByParamClassName(@Param(value = "projectCode") String projectCode, @Param(value = "paramClassName") String paramClassName); +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ProjectConfigMapper.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ProjectConfigMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..1c168da7d78148e718cd8d9b01286b927213ef2c --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/ProjectConfigMapper.java @@ -0,0 +1,72 @@ +package com.tianhua.datafactory.infrast.dao.mapper; + +import java.util.List; + +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.infrast.dao.dataobject.ProjectConfigDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + + +/** + * @Description:项目配置mapperDAO接口 + * @Author:shenshuai + * @CreateTime:2022-05-27 16:29:46 + * @version v1.0 + */ +@Mapper +public interface ProjectConfigMapper{ + + /** + * @Description:新增或修改 + * @param projectConfigDO + * @return int + */ + public long insert(ProjectConfigDO projectConfigDO); + + /** + * @Description: 通过id删除数据 + * @param id + * @return int + */ + public int deleteById(Long id); + + /** + * @Description: 通过id查询 + * @param id + * @return ResultDataDto + */ + public ProjectConfigDO getById(Long id); + + /** + * @Description:查询所有数据 + * @return List getAll(); + + /** + * @Description:新增或修改 + * @param projectConfigDO + * @return int + */ + public int update(ProjectConfigDO projectConfigDO); + + /** + * @Description:查询所有数据 + * @return List getPageList(@Param(value = "page") PageBean page ); + + + /** + * @Description:查询数量 + * @return int + */ + public int getPageCount(@Param(value = "page") PageBean page ); + + + public ProjectConfigDO getByCode(String projectCode); + + + public List search(@Param(value = "content") String content); +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/TableModelMapper.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/TableModelMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..498c40b200eba1181e797e772eb91e9b82d7f68c --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dao/mapper/TableModelMapper.java @@ -0,0 +1,73 @@ +package com.tianhua.datafactory.infrast.dao.mapper; + +import java.util.List; + +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.infrast.dao.dataobject.TableModelDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + + +/** + * @Description:表模型mapperDAO接口 + * @Author:shenshuai + * @CreateTime:2022-05-27 16:29:46 + * @version v1.0 + */ +@Mapper +public interface TableModelMapper{ + + /** + * @Description:新增或修改 + * @param tableModelDO + * @return int + */ + public long insert(TableModelDO tableModelDO); + + /** + * @Description: 通过id删除数据 + * @param id + * @return int + */ + public int deleteById(Long id); + + /** + * @Description: 通过id查询 + * @param id + * @return ResultDataDto + */ + public TableModelDO getById(Long id); + + /** + * @Description:查询所有数据 + * @return List getAll(); + + + public List getByProjectCode(String projectCode); + + /** + * @Description:新增或修改 + * @param tableModelDO + * @return int + */ + public int update(TableModelDO tableModelDO); + + /** + * + * @param page + * @return + */ + public List getPageList(@Param(value = "page") PageBean page); + + + /** + * @Description:查询数量 + * @return int + */ + public int getPageCount(@Param(value = "page") PageBean page); + + + List search(@Param(value = "content") String content); +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ApiConvert.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ApiConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..127d3222b03760c6c215775901faf056617dbeed --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ApiConvert.java @@ -0,0 +1,54 @@ +package com.tianhua.datafactory.infrast.dataconvert; + +import java.util.List; +import com.tianhua.datafactory.infrast.dao.dataobject.ApiModelDO; +import com.tianhua.datafactory.domain.bo.project.ApiBO; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +/** +* @Description:api模型信息接口 +* @Author: +* @CreateTime:2022-05-27 18:08:06 +* @version v1.0 +*/ +@Mapper +public interface ApiConvert{ + ApiConvert INSTANCE = Mappers.getMapper(ApiConvert.class); + + /** + * + * @Description: + * @return ApiBO + */ + @Mappings({ + @Mapping(target = "paramList",expression = "java(com.alibaba.fastjson.JSON.parseArray(apiModelDO.getRequestParam(),com.tianhua.datafactory.domain.bo.model.ParamModelBO.class))"), + @Mapping(target = "returnParamModel",expression = "java(com.alibaba.fastjson.JSON.parseObject(apiModelDO.getReturnParam(),com.tianhua.datafactory.domain.bo.model.ParamModelBO.class))"), + }) + ApiBO do2bo(ApiModelDO apiModelDO); + /** + * + * @Description: + * @return List + */ + List doList2boList(List apiModelDOList); + /** + * + * @Description: + * @return ApiModelDO + */ + @Mappings({ + @Mapping(target = "requestParam",expression = "java(com.alibaba.fastjson.JSON.toJSONString(apiBO.getParamList()))"), + @Mapping(target = "returnParam",expression = "java(com.alibaba.fastjson.JSON.toJSONString(apiBO.getReturnParamModel()))"), + }) + ApiModelDO bo2do(ApiBO apiBO); + /** + * + * @Description: + * @return List + */ + List boList2doList(List apiBOList); +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ColumnConvert.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ColumnConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..dfec76f925d247b82d23b5a08aa9b9bee849506d --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ColumnConvert.java @@ -0,0 +1,46 @@ +package com.tianhua.datafactory.infrast.dataconvert; + +import java.util.List; +import com.tianhua.datafactory.infrast.dao.dataobject.ColumnModelDO; +import com.tianhua.datafactory.domain.bo.model.ColumnBO; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +/** +* @Description:数据库column模型信息接口 +* @Author: +* @CreateTime:2022-05-27 18:08:06 +* @version v1.0 +*/ +@Mapper +public interface ColumnConvert{ + ColumnConvert INSTANCE = Mappers.getMapper(ColumnConvert.class); + + /** + * + * @Description: + * @return ColumnBO + */ + ColumnBO do2bo(ColumnModelDO columnModelDO); + /** + * + * @Description: + * @return List + */ + List doList2boList(List columnModelDOList); + /** + * + * @Description: + * @return ColumnModelDO + */ + ColumnModelDO bo2do(ColumnBO columnBO); + /** + * + * @Description: + * @return List + */ + List boList2doList(List columnBOList); +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/DataSourceConvert.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/DataSourceConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..4e9eecf74fcd0c79334afe1f14f5bccd0e8d760f --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/DataSourceConvert.java @@ -0,0 +1,43 @@ +package com.tianhua.datafactory.infrast.dataconvert; + +import com.tianhua.datafactory.domain.bo.datasource.DataSourceBO; +import com.tianhua.datafactory.infrast.dao.dataobject.DataSourceDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * Description: + * date: 2022/5/29 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Mapper +public interface DataSourceConvert { + DataSourceConvert INSTANCE = Mappers.getMapper(DataSourceConvert.class); + + + /** + * + * @Description: + * @return ColumnBO + */ + DataSourceBO do2bo(DataSourceDO dataSourceDO); + /** + * + * @Description: + * @return List + */ + List doList2boList(List dataSourceDOS); + /** + * + * @Description: + * @return ColumnModelDO + */ + DataSourceDO bo2do(DataSourceBO dataSourceBO); + + +} diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/DataSourceReqConvert.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/DataSourceReqConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..fa47ac47e1d10fd4c3bc607dbbc50b0797e8bfc5 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/DataSourceReqConvert.java @@ -0,0 +1,47 @@ +package com.tianhua.datafactory.infrast.dataconvert; + +import com.tianhua.datafactory.domain.bo.datasource.DataSourceReqConfigBO; +import com.tianhua.datafactory.infrast.dao.dataobject.DataSourceReqConfigDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * Description: + * date: 2022/5/29 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Mapper +public interface DataSourceReqConvert { + DataSourceReqConvert INSTANCE = Mappers.getMapper(DataSourceReqConvert.class); + + /** + * + * @Description: + * @return ColumnBO + */ + DataSourceReqConfigBO do2bo(DataSourceReqConfigDO dataSourceReqConfigDO); + /** + * + * @Description: + * @return List + */ + List doList2boList(List dataSourceReqConfigDOList); + /** + * + * @Description: + * @return ColumnModelDO + */ + DataSourceReqConfigDO bo2do(DataSourceReqConfigBO dataSourceReqConfigBO); + /** + * + * @Description: + * @return List + */ + List boList2doList(List dataSourceReqConfigDOList); + +} diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/DataSourceRespConvert.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/DataSourceRespConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..aec095bf267feb9e11e00803f46735cba50b8ecb --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/DataSourceRespConvert.java @@ -0,0 +1,47 @@ +package com.tianhua.datafactory.infrast.dataconvert; + +import com.tianhua.datafactory.domain.bo.datasource.DataSourceRespConfigBO; +import com.tianhua.datafactory.infrast.dao.dataobject.DataSourceRespConfigDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * Description: + * date: 2022/5/29 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Mapper +public interface DataSourceRespConvert { + DataSourceRespConvert INSTANCE = Mappers.getMapper(DataSourceRespConvert.class); + + /** + * + * @Description: + * @return ColumnBO + */ + DataSourceRespConfigBO do2bo(DataSourceRespConfigDO dataSourceRespConfigDO); + /** + * + * @Description: + * @return List + */ + List doList2boList(List dataSourceRespConfigDOList); + /** + * + * @Description: + * @return ColumnModelDO + */ + DataSourceRespConfigDO bo2do(DataSourceRespConfigBO dataSourceRespConfigBO); + + /** + * + * @Description: + * @return List + */ + List boList2doList(List dataSourceRespConfigBOList); +} diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/FieldModelConvert.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/FieldModelConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..f69da8fb819d5021f93822d15693541db41bed57 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/FieldModelConvert.java @@ -0,0 +1,54 @@ +package com.tianhua.datafactory.infrast.dataconvert; + +import com.tianhua.datafactory.domain.bo.model.FieldBO; +import com.tianhua.datafactory.infrast.dao.dataobject.FieldModelDO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * Description: + * date: 2022/5/31 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Mapper +public interface FieldModelConvert { + FieldModelConvert INSTANCE = Mappers.getMapper(FieldModelConvert.class); + + /** + * + * @Description: + * @return FieldBO + */ + @Mappings({ + @Mapping(target = "fieldExtBO",expression = "java(org.apache.commons.lang3.StringUtils.isEmpty(fieldModelDO.getFieldExtJsonStr()) ? new com.tianhua.datafactory.domain.bo.model.FieldExtBO() : com.alibaba.fastjson.JSON.parseObject(fieldModelDO.getFieldExtJsonStr(),com.tianhua.datafactory.domain.bo.model.FieldExtBO.class))"), + }) + FieldBO do2bo(FieldModelDO fieldModelDO); + /** + * + * @Description: + * @return List + */ + List doList2boList(List fieldModelDOS); + /** + * + * @Description: + * @return FieldModelDO + */ + @Mappings({ + @Mapping(target = "fieldExtJsonStr",expression = "java(com.alibaba.fastjson.JSON.toJSONString(fieldBO.getFieldExtBO()))"), + }) + FieldModelDO bo2do(FieldBO fieldBO); + /** + * + * @Description: + * @return List + */ + List boList2doList(List fieldBOList); +} diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/KVPairModelConvert.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/KVPairModelConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..04f0976de699571df24bf7f24bedd85949c72a40 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/KVPairModelConvert.java @@ -0,0 +1,46 @@ +package com.tianhua.datafactory.infrast.dataconvert; + +import com.tianhua.datafactory.domain.support.kvpair.KVPairBO; +import com.tianhua.datafactory.infrast.dao.dataobject.KVPairDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * Description: + * date: 2022/5/31 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Mapper +public interface KVPairModelConvert { + KVPairModelConvert INSTANCE = Mappers.getMapper(KVPairModelConvert.class); + + /** + * + * @Description: + * @return FieldBO + */ + KVPairBO do2bo(KVPairDO kvPairDO); + /** + * + * @Description: + * @return List + */ + List doList2boList(List kvPairDOList); + /** + * + * @Description: + * @return KVPairDO + */ + KVPairDO bo2do(KVPairBO kvPairBO); + /** + * + * @Description: + * @return List + */ + List boList2doList(List kvPairBOS); +} diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ModelMappingConvert.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ModelMappingConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..471eee36725df72fe5e726de09fb375b4022a135 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ModelMappingConvert.java @@ -0,0 +1,46 @@ +package com.tianhua.datafactory.infrast.dataconvert; + +import java.util.List; +import com.tianhua.datafactory.infrast.dao.dataobject.ModelMappingConfigDO; +import com.tianhua.datafactory.domain.bo.model.ModelMappingBO; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +/** +* @Description:模型映射信息接口 +* @Author: +* @CreateTime:2022-05-27 18:08:06 +* @version v1.0 +*/ +@Mapper +public interface ModelMappingConvert{ + ModelMappingConvert INSTANCE = Mappers.getMapper(ModelMappingConvert.class); + + /** + * + * @Description: + * @return ModelMappingBO + */ + ModelMappingBO do2bo(ModelMappingConfigDO modelMappingConfigDO); + /** + * + * @Description: + * @return List + */ + List doList2boList(List modelMappingConfigDOList); + /** + * + * @Description: + * @return ModelMappingConfigDO + */ + ModelMappingConfigDO bo2do(ModelMappingBO modelMappingBO); + /** + * + * @Description: + * @return List + */ + List boList2doList(List modelMappingBOList); +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ModelSuffixConfigConvert.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ModelSuffixConfigConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..aee5f392d364a38a34b259566adf7870fd8e30ef --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ModelSuffixConfigConvert.java @@ -0,0 +1,46 @@ +package com.tianhua.datafactory.infrast.dataconvert; + +import java.util.List; +import com.tianhua.datafactory.domain.bo.model.ModelSuffixConfigBO; +import com.tianhua.datafactory.infrast.dao.dataobject.ModelSuffixConfigDO; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +/** +* @Description:模型后缀信息接口 +* @Author: +* @CreateTime:2022-05-27 18:08:06 +* @version v1.0 +*/ +@Mapper +public interface ModelSuffixConfigConvert{ + ModelSuffixConfigConvert INSTANCE = Mappers.getMapper(ModelSuffixConfigConvert.class); + + /** + * + * @Description: + * @return ModelSuffixConfigBO + */ + ModelSuffixConfigBO do2bo(ModelSuffixConfigDO modelSuffixConfigDO); + /** + * + * @Description: + * @return List + */ + List doList2boList(List modelSuffixConfigDOList); + /** + * + * @Description: + * @return ModelSuffixConfigDO + */ + ModelSuffixConfigDO bo2do(ModelSuffixConfigBO modelSuffixConfigBO); + /** + * + * @Description: + * @return List + */ + List boList2doList(List modelSuffixConfigBOList); +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ParamModelConvert.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ParamModelConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..f039aff8c38e30453d87d232cf41d68a62fd2b80 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ParamModelConvert.java @@ -0,0 +1,46 @@ +package com.tianhua.datafactory.infrast.dataconvert; + +import java.util.List; +import com.tianhua.datafactory.infrast.dao.dataobject.ParamModelDO; +import com.tianhua.datafactory.domain.bo.model.ParamModelBO; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +/** +* @Description:参数模型信息接口 +* @Author: +* @CreateTime:2022-05-27 18:08:06 +* @version v1.0 +*/ +@Mapper +public interface ParamModelConvert{ + ParamModelConvert INSTANCE = Mappers.getMapper(ParamModelConvert.class); + + /** + * + * @Description: + * @return ParamModelBO + */ + ParamModelBO do2bo(ParamModelDO paramModelDO); + /** + * + * @Description: + * @return List + */ + List doList2boList(List paramModelDOList); + /** + * + * @Description: + * @return ParamModelDO + */ + ParamModelDO bo2do(ParamModelBO paramModelBO); + /** + * + * @Description: + * @return List + */ + List boList2doList(List paramModelBOList); +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ProjectConvert.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ProjectConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..73e55f0d36f6cef707a6730f3f3994337741060f --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/ProjectConvert.java @@ -0,0 +1,46 @@ +package com.tianhua.datafactory.infrast.dataconvert; + +import com.tianhua.datafactory.infrast.dao.dataobject.ProjectConfigDO; +import java.util.List; +import com.tianhua.datafactory.domain.bo.project.ProjectBO; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +/** +* @Description:项目基本信息接口 +* @Author: +* @CreateTime:2022-05-27 18:08:06 +* @version v1.0 +*/ +@Mapper +public interface ProjectConvert{ + ProjectConvert INSTANCE = Mappers.getMapper(ProjectConvert.class); + + /** + * + * @Description: + * @return ProjectBO + */ + ProjectBO do2bo(ProjectConfigDO projectConfigDO); + /** + * + * @Description: + * @return List + */ + List doList2boList(List projectConfigDOList); + /** + * + * @Description: + * @return ProjectConfigDO + */ + ProjectConfigDO bo2do(ProjectBO projectBO); + /** + * + * @Description: + * @return List + */ + List boList2doList(List projectBOList); +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/TableConvert.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/TableConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..9c68c9208fa27ee1153f4d170c5555bb8b38bec3 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/dataconvert/TableConvert.java @@ -0,0 +1,46 @@ +package com.tianhua.datafactory.infrast.dataconvert; + +import com.tianhua.datafactory.infrast.dao.dataobject.TableModelDO; +import com.tianhua.datafactory.domain.bo.model.TableBO; +import java.util.List; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +/** +* @Description:数据库table模型信息接口 +* @Author: +* @CreateTime:2022-05-27 18:08:06 +* @version v1.0 +*/ +@Mapper +public interface TableConvert{ + TableConvert INSTANCE = Mappers.getMapper(TableConvert.class); + + /** + * + * @Description: + * @return TableBO + */ + TableBO do2bo(TableModelDO tableModelDO); + /** + * + * @Description: + * @return List + */ + List doList2boList(List tableModelDOList); + /** + * + * @Description: + * @return TableModelDO + */ + TableModelDO bo2do(TableBO tableBO); + /** + * + * @Description: + * @return List + */ + List boList2doList(List tableBOList); +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/package-info.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..e711404f0aa1bac6e2c7135421e5f488253dd149 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/package-info.java @@ -0,0 +1 @@ +package com.tianhua.datafactory.infrast; \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/DataSourceQueryRepositoryImpl.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/DataSourceQueryRepositoryImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..c73af58736ef8b18e0e7e8f89b34d92079e5e1b1 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/DataSourceQueryRepositoryImpl.java @@ -0,0 +1,127 @@ +package com.tianhua.datafactory.infrast.repositoryimpl; + +import com.tianhua.datafactory.domain.ability.KVPairService; +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceBO; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceReqConfigBO; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceRespConfigBO; +import com.tianhua.datafactory.domain.repository.DataSourceQueryRepository; +import com.tianhua.datafactory.domain.support.kvpair.KVPairBO; +import com.tianhua.datafactory.infrast.dao.dataobject.DataSourceDO; +import com.tianhua.datafactory.infrast.dao.mapper.DataSourceMapper; +import com.tianhua.datafactory.infrast.dao.mapper.DataSourceReqConfigMapper; +import com.tianhua.datafactory.infrast.dao.mapper.DataSourceResConfigMapper; +import com.tianhua.datafactory.infrast.dataconvert.DataSourceConvert; +import com.tianhua.datafactory.infrast.dataconvert.DataSourceReqConvert; +import com.tianhua.datafactory.infrast.dataconvert.DataSourceRespConvert; +import org.apache.commons.collections.CollectionUtils; +import org.assertj.core.util.Lists; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Description: + * date: 2022/5/31 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class DataSourceQueryRepositoryImpl implements DataSourceQueryRepository { + + @Resource + private DataSourceMapper dataSourceMapper; + + + @Resource + private DataSourceReqConfigMapper dataSourceReqConfigMapper; + + @Resource + private DataSourceResConfigMapper dataSourceResConfigMapper; + + @Autowired + private KVPairService kvPairService; + + @Override + public PageBean getDataSourcePage(PageBean pageBean) { + List dataSourceDOList = dataSourceMapper.getPage(pageBean); + pageBean.setRows(DataSourceConvert.INSTANCE.doList2boList(dataSourceDOList)); + // pageBean.setPage(); + return pageBean; + } + + + @Override + public List search(String content) { + List dataSourceDOList = dataSourceMapper.search(content); + if (CollectionUtils.isEmpty(dataSourceDOList)) { + return Lists.newArrayList(); + } + + List resultList = new ArrayList<>(); + List dataSourceBOList = DataSourceConvert.INSTANCE.doList2boList(dataSourceDOList); + Set dataSourceCodeSet = new HashSet<>(); + for (DataSourceBO dataSourceBO : dataSourceBOList) { + List dataSourceRespConfigBOList = DataSourceRespConvert.INSTANCE.doList2boList(dataSourceResConfigMapper.getByDataSourceId(dataSourceBO.getId())); + if (CollectionUtils.isNotEmpty(dataSourceRespConfigBOList)) { + //构建子数据源编码,辅助数据定位 + for (DataSourceRespConfigBO dataSourceRespConfigBO : dataSourceRespConfigBOList) { + DataSourceBO dataSubSourceBO = new DataSourceBO(); + dataSubSourceBO.setSourceName(dataSourceBO.getSourceName()+"#"+dataSourceRespConfigBO.getFieldDesc()); + dataSubSourceBO.setSourceCode(dataSourceBO.getSourceCode()+"#"+dataSourceRespConfigBO.getFieldKey()); + resultList.add(dataSubSourceBO); + } + }else { + if(dataSourceBO.isLocalEnum()){ + KVPairBO kvPairBO = KVPairBO.instance(); + kvPairBO.setParentKey(dataSourceBO.getProviderService()); + List kvPairBOList = kvPairService.getList(kvPairBO); + if(CollectionUtils.isNotEmpty(kvPairBOList)){ + for (KVPairBO kvPairBO1 : kvPairBOList){ + DataSourceBO dataSubSourceBO = new DataSourceBO(); + String dataSourceCode = kvPairBO1.getGroupKey()+"#"+kvPairBO1.getKey(); + if(dataSourceCodeSet.contains(dataSourceCode)){ + continue; + } + dataSourceCodeSet.add(dataSourceCode); + dataSubSourceBO.setSourceName(dataSourceCode); + dataSubSourceBO.setSourceCode(dataSourceCode); + resultList.add(dataSubSourceBO); + } + } + }else { + resultList.add(dataSourceBO); + } + } + } + + return resultList; + } + + @Override + public DataSourceBO getByDataSourceCode(String dataSourceCode) { + if(dataSourceCode == null){ + return null; + } + if(dataSourceCode.contains("#")){ + dataSourceCode = dataSourceCode.split("#")[0]; + } + + DataSourceBO dataSourceBO = DataSourceConvert.INSTANCE.do2bo(dataSourceMapper.getBySourceCode(dataSourceCode)); + List dataSourceRespConfigBOList = DataSourceRespConvert.INSTANCE.doList2boList(dataSourceResConfigMapper.getByDataSourceId(dataSourceBO.getId())); + dataSourceBO.setDataSourceRespConfigList(dataSourceRespConfigBOList); + + List dataSourceReqConfigBOList = DataSourceReqConvert.INSTANCE.doList2boList(dataSourceReqConfigMapper.getByDataSourceId(dataSourceBO.getId())); + dataSourceBO.setDataSourceReqConfigList(dataSourceReqConfigBOList); + + return dataSourceBO; + } + +} diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/DataSourceRepositoryImpl.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/DataSourceRepositoryImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..cbf6fa78385a02c52c711d965bf60485ef1cd966 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/DataSourceRepositoryImpl.java @@ -0,0 +1,160 @@ +package com.tianhua.datafactory.infrast.repositoryimpl; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.tianhua.datafactory.domain.ability.KVPairService; +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceBO; +import com.tianhua.datafactory.domain.repository.DataSourceRepository; +import com.tianhua.datafactory.domain.support.kvpair.KVPairBO; +import com.tianhua.datafactory.infrast.dao.dataobject.*; +import com.tianhua.datafactory.infrast.dao.mapper.DataSourceMapper; +import com.tianhua.datafactory.infrast.dao.mapper.DataSourceReqConfigMapper; +import com.tianhua.datafactory.infrast.dao.mapper.DataSourceResConfigMapper; +import com.tianhua.datafactory.infrast.dataconvert.DataSourceConvert; +import com.tianhua.datafactory.infrast.dataconvert.DataSourceReqConvert; +import com.tianhua.datafactory.infrast.dataconvert.DataSourceRespConvert; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * Description: + * date: 2022/5/29 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +@Slf4j +public class DataSourceRepositoryImpl implements DataSourceRepository { + + @Resource + private DataSourceMapper dataSourceMapper; + + + @Resource + private DataSourceReqConfigMapper dataSourceReqConfigMapper; + + @Resource + private DataSourceResConfigMapper dataSourceResConfigMapper; + + @Autowired + private KVPairService kvPairService; + + /** + * 初始化缓存,key:datasource + * value:对应的数据内容,json字符串 + */ + private static final Cache dataSourceCache = Caffeine.newBuilder() + .expireAfterWrite(15, TimeUnit.SECONDS) + .maximumSize(10_000) + .build(); + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean regist(DataSourceBO dataSourceBO) { + dataSourceBO.init(); + DataSourceDO dataSourceDO = DataSourceConvert.INSTANCE.bo2do(dataSourceBO); + dataSourceMapper.insert(dataSourceDO); + if (CollectionUtils.isNotEmpty(dataSourceBO.getDataSourceReqConfigList())) { + List dataSourceReqConfigDOList = DataSourceReqConvert.INSTANCE.boList2doList(dataSourceBO.getDataSourceReqConfigList()); + for (DataSourceReqConfigDO dataSourceReqConfigDO : dataSourceReqConfigDOList) { + dataSourceReqConfigDO.setDataSourceId(dataSourceDO.getId()); + dataSourceReqConfigMapper.insert(dataSourceReqConfigDO); + } + } + + if (CollectionUtils.isNotEmpty(dataSourceBO.getDataSourceRespConfigList())) { + List dataSourceRespConfigDOList = DataSourceRespConvert.INSTANCE.boList2doList(dataSourceBO.getDataSourceRespConfigList()); + for (DataSourceRespConfigDO dataSourceRespConfigDO : dataSourceRespConfigDOList) { + dataSourceRespConfigDO.setDataSourceId(dataSourceDO.getId()); + dataSourceResConfigMapper.insert(dataSourceRespConfigDO); + } + } + + if(CollectionUtils.isNotEmpty(dataSourceBO.getKvPairList())){ + kvPairService.batchInsert(dataSourceBO.getKvPairList()); + } + return true; + } + + @Override + public Boolean delete(Long id) { + log.info("dataSourceService.delete,id=" + id); + dataSourceMapper.deleteById(id); + return true; + } + + @Override + public DataSourceBO getById(Long id) throws Exception { + + DataSourceBO dataSourceBO = DataSourceConvert.INSTANCE.do2bo(dataSourceMapper.getById(id)); + dataSourceBO.setDataSourceReqConfigList(DataSourceReqConvert.INSTANCE.doList2boList(dataSourceReqConfigMapper.getByDataSourceId(id))); + dataSourceBO.setDataSourceRespConfigList(DataSourceRespConvert.INSTANCE.doList2boList(dataSourceResConfigMapper.getByDataSourceId(id))); + + KVPairBO kvPairBO = KVPairBO.instance(); + kvPairBO.setParentKey(dataSourceBO.getProviderService()); + dataSourceBO.setKvPairList(kvPairService.getList(kvPairBO)); + + return dataSourceBO; + } + + @Override + public List getAll() throws Exception { + List dataSourceDOList = dataSourceMapper.getAll(); + return DataSourceConvert.INSTANCE.doList2boList(dataSourceDOList); + } + + @Override + public Boolean update(DataSourceBO dataSourceBO) throws Exception { + DataSourceDO dataSourceDO = DataSourceConvert.INSTANCE.bo2do(dataSourceBO); + dataSourceMapper.update(dataSourceDO); + if (CollectionUtils.isNotEmpty(dataSourceBO.getDataSourceReqConfigList())) { + dataSourceReqConfigMapper.deleteByDataSourceId(dataSourceBO.getId()); + + List dataSourceReqConfigDOList = DataSourceReqConvert.INSTANCE.boList2doList(dataSourceBO.getDataSourceReqConfigList()); + for (DataSourceReqConfigDO dataSourceReqConfigDO : dataSourceReqConfigDOList) { + dataSourceReqConfigDO.setDataSourceId(dataSourceDO.getId()); + dataSourceReqConfigMapper.insert(dataSourceReqConfigDO); + } + } + + if (CollectionUtils.isNotEmpty(dataSourceBO.getDataSourceRespConfigList())) { + + dataSourceResConfigMapper.deleteByDataSourceId(dataSourceBO.getId()); + + List dataSourceRespConfigDOList = DataSourceRespConvert.INSTANCE.boList2doList(dataSourceBO.getDataSourceRespConfigList()); + for (DataSourceRespConfigDO dataSourceRespConfigDO : dataSourceRespConfigDOList) { + dataSourceRespConfigDO.setDataSourceId(dataSourceDO.getId()); + dataSourceResConfigMapper.insert(dataSourceRespConfigDO); + } + } + return false; + } + + + + @Override + public Boolean updateStatus(Long id, Integer status) { + int rows = dataSourceMapper.updateStatus(id, status); + return rows == 1; + } + + @Override + public PageBean getPageList(PageBean pageBean) { + List dataSourceDOList = dataSourceMapper.getPage(pageBean); + pageBean.setRows(DataSourceConvert.INSTANCE.doList2boList(dataSourceDOList)); + pageBean.setCount(dataSourceMapper.getPageCount(pageBean)); + return pageBean; + } + + +} diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/ModelQueryRepositoryImpl.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/ModelQueryRepositoryImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..569db163757b086b84abe637f3aec85084398b46 --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/ModelQueryRepositoryImpl.java @@ -0,0 +1,169 @@ +package com.tianhua.datafactory.infrast.repositoryimpl; + +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.domain.bo.model.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import com.tianhua.datafactory.domain.repository.ModelQueryRepository; + +import com.tianhua.datafactory.infrast.dao.dataobject.*; +import com.tianhua.datafactory.infrast.dao.mapper.*; +import com.tianhua.datafactory.infrast.dataconvert.*; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + + +/** + * @Description:接口实现类 + * @Author: + * @CreateTime:2022-05-27 17:45:38 + * @version v1.0 + */ +@Service +public class ModelQueryRepositoryImpl implements ModelQueryRepository{ + + @Autowired + private TableModelMapper tableModelMapper; + + + @Autowired + private ColumnModelMapper columnModelMapper; + + + @Autowired + private ParamModelMapper paramModelMapper; + + + @Autowired + private ModelSuffixConfigMapper modelSuffixConfigMapper; + + @Autowired + private FieldModelMapper fieldModelMapper; + + + @Autowired + private ModelMappingConfigMapper modelMappingConfigMapper; + + @Override + public ParamModelBO getByParamClassName(String paramClassName){ + + return null; + } + + @Override + public List getColumnListByCode(String projectCode, String tableName){ + + return null; + } + + @Override + public PageBean queryTablePage(PageBean pageBean){ + List tableModelDOList = tableModelMapper.getPageList(pageBean); + pageBean.setRows(TableConvert.INSTANCE.doList2boList(tableModelDOList)); + pageBean.setCount(tableModelMapper.getPageCount(pageBean)); + return pageBean; + } + + @Override + public PageBean queryParamPage(PageBean pageBean) { + List paramModelDOList = paramModelMapper.getPageList(pageBean); + pageBean.setRows(ParamModelConvert.INSTANCE.doList2boList(paramModelDOList)); + pageBean.setCount(paramModelMapper.getPageCount(pageBean)); + return pageBean; + } + + @Override + public TableBO getByTableId(Long id) { + TableBO tableBO = TableConvert.INSTANCE.do2bo(tableModelMapper.getById(id)); + List columnModelDOS = columnModelMapper.getByTableId(id); + tableBO.setColumnList(ColumnConvert.INSTANCE.doList2boList(columnModelDOS)); + return tableBO; + } + + @Override + public ParamModelBO getByParamId(Long id) { + ParamModelDO paramModelDO = paramModelMapper.getById(id); + ParamModelBO paramModelBO = ParamModelConvert.INSTANCE.do2bo(paramModelDO); + List fieldModelDOList = fieldModelMapper.getByCode(paramModelDO.getProjectCode(), paramModelDO.getParamClassName()); + paramModelBO.setFieldBeanList(FieldModelConvert.INSTANCE.doList2boList(fieldModelDOList)); + return paramModelBO; + } + + @Override + public List searchTable(String content) { + List tableModelDOList = tableModelMapper.search(content); + return TableConvert.INSTANCE.doList2boList(tableModelDOList); + } + + @Override + public List searchParamModel(String content) { + return ParamModelConvert.INSTANCE.doList2boList(paramModelMapper.search(content)); + } + + @Override + public List getModelSuffixConfigList() { + List modelSuffixConfigDOList = modelSuffixConfigMapper.getAll(); + return ModelSuffixConfigConvert.INSTANCE.doList2boList(modelSuffixConfigDOList); + } + + @Override + public PageBean queryModelMappingPage(PageBean pageBean) { + List modelMappingConfigDOList = modelMappingConfigMapper.getPageList(pageBean); + pageBean.setRows(ModelMappingConvert.INSTANCE.doList2boList(modelMappingConfigDOList)); + pageBean.setCount(modelMappingConfigMapper.getPageCount(pageBean)); + return pageBean; + } + + @Override + public List getModelByProjectCode(String projectCode) { + List paramModelBOList = ParamModelConvert.INSTANCE.doList2boList(paramModelMapper.getByProjectCode(projectCode)); + List tableBOList = TableConvert.INSTANCE.doList2boList(tableModelMapper.getByProjectCode(projectCode)); + if(CollectionUtils.isNotEmpty(tableBOList)){ + for (TableBO tableBO : tableBOList){ + ParamModelBO paramModelBO = new ParamModelBO(); + paramModelBO.setProjectCode(projectCode); + paramModelBO.setParamClassName(tableBO.getTableName()); + paramModelBO.setParamClassDesc(tableBO.getTableComment()); + paramModelBOList.add(paramModelBO); + } + } + + return paramModelBOList; + } + + @Override + public List getModelField(String projectCode, String modelName) { + + List fieldBOList = FieldModelConvert.INSTANCE.doList2boList(fieldModelMapper.getByCode(projectCode,modelName)); + + if(CollectionUtils.isNotEmpty(fieldBOList)){ + return fieldBOList; + } + + fieldBOList = new ArrayList<>(); + List tableModelDOList = tableModelMapper.getByProjectCode(projectCode); + if(CollectionUtils.isNotEmpty(tableModelDOList)){ + Optional tableModelDOOptional = tableModelDOList.stream().filter(tableModelDO -> tableModelDO.getTableName().equals(modelName)).findFirst(); + if(tableModelDOOptional.isPresent()){ + List columnBOList = ColumnConvert.INSTANCE.doList2boList(columnModelMapper.getByTableId(tableModelDOOptional.get().getId())); + for (ColumnBO columnBO : columnBOList){ + FieldBO fieldBO = new FieldBO(); + fieldBO.setFieldName(columnBO.getColumnName()); + fieldBO.setFieldDesc(columnBO.getColumnComment()); + fieldBOList.add(fieldBO); + } + } + } + + return fieldBOList; + } + + @Override + public List getModelMappingListByProjectCode(String projectCode) { + return ModelMappingConvert.INSTANCE.doList2boList(modelMappingConfigMapper.getListByProjectCode(projectCode)); + } +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/ModelRepositoryImpl.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/ModelRepositoryImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..d0bc2bb9c44cbd20d464f2f8649b783b24da7afe --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/ModelRepositoryImpl.java @@ -0,0 +1,193 @@ +package com.tianhua.datafactory.infrast.repositoryimpl; + +import com.alibaba.fastjson.JSON; +import com.tianhua.datafactory.domain.bo.model.*; + +import java.util.List; + +import com.tianhua.datafactory.domain.enums.ApiModelFieldStatusEnum; +import com.tianhua.datafactory.domain.event.DataSourceBindEvent; +import com.tianhua.datafactory.domain.repository.ModelRepository; + +import com.tianhua.datafactory.domain.util.AppEventPublisher; +import com.tianhua.datafactory.infrast.dao.dataobject.FieldModelDO; +import com.tianhua.datafactory.infrast.dao.dataobject.ParamModelDO; +import com.tianhua.datafactory.infrast.dao.dataobject.TableModelDO; +import com.tianhua.datafactory.infrast.dao.mapper.*; +import com.tianhua.datafactory.infrast.dataconvert.*; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; + + +/** + * @Description:接口实现类 + * @Author: + * @CreateTime:2022-05-27 17:45:38 + * @version v1.0 + */ +@Service +public class ModelRepositoryImpl implements ModelRepository{ + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private TableModelMapper tableModelMapper; + + + @Autowired + private ColumnModelMapper columnModelMapper; + + + @Autowired + private ParamModelMapper paramModelMapper; + + + @Autowired + private ModelSuffixConfigMapper modelSuffixConfigMapper; + + @Autowired + private FieldModelMapper fieldModelMapper; + + @Autowired + private ModelMappingConfigMapper modelMappingConfigMapper; + + + @Autowired + private AppEventPublisher appEventPublisher; + + + + @Override + public boolean saveDBModel(TableBO tableBO){ + tableBO.init(); + tableBO.setStatus(ApiModelFieldStatusEnum.USING.getStatus()); + TableModelDO tableModelDO = TableConvert.INSTANCE.bo2do(tableBO); + tableModelMapper.insert(tableModelDO); + if(!CollectionUtils.isEmpty(tableBO.getColumnList())){ + for (ColumnBO columnBO : tableBO.getColumnList()){ + columnBO.setTableId(tableModelDO.getId()); + columnBO.init(); + columnBO.setStatus(ApiModelFieldStatusEnum.USING.getStatus()); + columnModelMapper.insert(ColumnConvert.INSTANCE.bo2do(columnBO)); + } + } + + return true; + } + + @Override + public boolean updateDBModel(TableBO tableBO){ + tableModelMapper.update(TableConvert.INSTANCE.bo2do(tableBO)); + if(org.apache.commons.collections.CollectionUtils.isNotEmpty(tableBO.getColumnList())){ + columnModelMapper.deleteByTableId(tableBO.getId()); + for (ColumnBO columnBO : tableBO.getColumnList()){ + columnBO.setTableId(tableBO.getId()); + columnBO.init(); + columnModelMapper.insert(ColumnConvert.INSTANCE.bo2do(columnBO)); + } + } + return true; + } + + @Override + public List getDbErByProjectCode(String projectCode){ + List tableModelDOList = tableModelMapper.getByProjectCode(projectCode); + List tableBOList = TableConvert.INSTANCE.doList2boList(tableModelDOList); + for (TableBO tableBO : tableBOList){ + List columnBOS = ColumnConvert.INSTANCE.doList2boList(columnModelMapper.getByTableId(tableBO.getId())); + tableBO.setColumnList(columnBOS); + } + return tableBOList; + } + + @Override + public boolean saveParamModel(ParamModelBO paramModelBO){ + paramModelBO.init(); + paramModelBO.using(); + paramModelMapper.insert(ParamModelConvert.INSTANCE.bo2do(paramModelBO)); + + List fieldBOList = paramModelBO.getFieldBeanList(); + if(org.apache.commons.collections.CollectionUtils.isNotEmpty(fieldBOList)){ + for (FieldBO fieldBO : fieldBOList){ + fieldBO.init(); + fieldBO.setProjectCode(paramModelBO.getProjectCode()); + fieldBO.setParamClassName(paramModelBO.getParamClassName()); + fieldModelMapper.insert(FieldModelConvert.INSTANCE.bo2do(fieldBO)); + } + } + + return true; + } + + @Override + public boolean updateParamModel(ParamModelBO paramModelBO){ + if(StringUtils.isNotEmpty(paramModelBO.getParamClassName())){ + paramModelBO.init(); + paramModelMapper.update(ParamModelConvert.INSTANCE.bo2do(paramModelBO)); + } + + List fieldBOList = paramModelBO.getFieldBeanList(); + if(org.apache.commons.collections.CollectionUtils.isNotEmpty(fieldBOList)){ + for (FieldBO fieldBO : fieldBOList){ + FieldModelDO fieldModelDO = fieldModelMapper.getByCodeField(paramModelBO.getProjectCode(), fieldBO.getParamClassName(), fieldBO.getFieldName()); + if(fieldModelDO == null){ + fieldBO.init(); + fieldModelMapper.insert(FieldModelConvert.INSTANCE.bo2do(fieldBO)); + }else { + //导入的话不会存在fieldExtBO,页面修改的时候可能会存在 + if(StringUtils.isNotEmpty(fieldBO.getFieldExtBO().getDataSourceCode())){ + fieldModelDO.setFieldExtJsonStr(JSON.toJSONString(fieldBO.getFieldExtBO())); + } + fieldModelDO.setFieldType(fieldBO.getFieldType()); + fieldModelDO.setFieldDesc(fieldBO.getFieldDesc()); + fieldModelMapper.update(fieldModelDO); + } + } + } + + return true; + } + + @Override + public List getModelByProjectCode(String projectCode){ + List paramModelDOList = paramModelMapper.getByProjectCode(projectCode); + List paramModelBOS = ParamModelConvert.INSTANCE.doList2boList(paramModelDOList); + + return paramModelBOS; + } + + @Override + public ParamModelBO getModel(String projectCode, String paramClassName) { + ParamModelDO paramModelDO = paramModelMapper.getByParamClassName(projectCode, paramClassName); + + return ParamModelConvert.INSTANCE.do2bo(paramModelDO); + } + + @Override + public boolean saveModelSuffix(ModelSuffixConfigBO modelSuffixConfigBO){ + modelSuffixConfigMapper.insert(ModelSuffixConfigConvert.INSTANCE.bo2do(modelSuffixConfigBO)); + return true; + } + + @Override + public boolean updateModelSuffix(ModelSuffixConfigBO modelSuffixConfigBO){ + int effect = modelSuffixConfigMapper.update(ModelSuffixConfigConvert.INSTANCE.bo2do(modelSuffixConfigBO)); + return effect == 1; + } + + @Override + public boolean saveModelMapping(ModelMappingBO modelMappingBO) { + + modelMappingConfigMapper.insert(ModelMappingConvert.INSTANCE.bo2do(modelMappingBO)); + //发布模型映射事件 + appEventPublisher.publish(new DataSourceBindEvent(this,modelMappingBO)); + + return true; + } + + +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/ProjectQueryRepositoryImpl.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/ProjectQueryRepositoryImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..17ac7108a9c6e9b5f80308aa60817f6d245bc83b --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/ProjectQueryRepositoryImpl.java @@ -0,0 +1,108 @@ +package com.tianhua.datafactory.infrast.repositoryimpl; + +import java.util.List; + +import com.tianhua.datafactory.domain.bo.bean.PageBean; +import com.tianhua.datafactory.domain.repository.ProjectQueryRepository; +import com.tianhua.datafactory.domain.bo.project.ApiBO; +import com.tianhua.datafactory.domain.bo.project.ProjectBO; + +import com.tianhua.datafactory.infrast.dao.dataobject.ApiModelDO; +import com.tianhua.datafactory.infrast.dao.dataobject.ProjectConfigDO; +import com.tianhua.datafactory.infrast.dao.mapper.ApiModelMapper; +import com.tianhua.datafactory.infrast.dao.mapper.ProjectConfigMapper; +import com.tianhua.datafactory.infrast.dataconvert.ApiConvert; +import com.tianhua.datafactory.infrast.dataconvert.ProjectConvert; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + + +/** + * @Description:接口实现类 + * @Author: + * @CreateTime:2022-05-27 17:45:38 + * @version v1.0 + */ +@Service +public class ProjectQueryRepositoryImpl implements ProjectQueryRepository{ + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private ProjectConfigMapper projectConfigMapper; + + @Autowired + private ApiModelMapper apiModelMapper; + + + @Override + public List getApiListByCode(String projectCode){ + List apiModelDOList = apiModelMapper.getByProjectCode(projectCode); + List apiBOList = ApiConvert.INSTANCE.doList2boList(apiModelDOList); + apiBOList.stream().forEach(apiBO -> { + apiBO.buildRequestParam(); + }); + return apiBOList; + } + + @Override + public List searchApi(String projectCode){ + return null; + } + + @Override + public PageBean queryApiPage(PageBean pageBean ){ + List apiModelDOList = apiModelMapper.getPageList(pageBean); + List apiBOList = ApiConvert.INSTANCE.doList2boList(apiModelDOList); + apiBOList.stream().forEach(apiBO -> { + apiBO.buildRequestParam(); + }); + pageBean.setRows(apiBOList); + pageBean.setCount(apiModelMapper.getPageCount(pageBean)); + return pageBean; + } + + @Override + public ApiBO getBySign(String methodSign){ + ApiModelDO apiModelDO = apiModelMapper.getByApiSign(methodSign); + ApiBO apiBO = ApiConvert.INSTANCE.do2bo(apiModelDO); + if(apiBO == null){ + return null; + } + apiBO.buildRequestParam(); + return apiBO; + } + + @Override + public ProjectBO getProjectByCode(String projectCode){ + return ProjectConvert.INSTANCE.do2bo(projectConfigMapper.getByCode(projectCode)); + } + + @Override + public List searchProject(String content){ + List projectConfigDOList = projectConfigMapper.search(content); + return ProjectConvert.INSTANCE.doList2boList(projectConfigDOList); + } + + @Override + public PageBean queryProjectPage(PageBean pageBean ){ + List projectConfigDOList = projectConfigMapper.getPageList(pageBean); + pageBean.setRows(ProjectConvert.INSTANCE.doList2boList(projectConfigDOList)); + pageBean.setCount(projectConfigMapper.getPageCount(pageBean)); + return pageBean; + } + + @Override + public ApiBO getApiById(Long id) { + ApiModelDO apiModelDO = apiModelMapper.getById(id); + ApiBO apiBO = ApiConvert.INSTANCE.do2bo(apiModelDO); + if(apiBO == null){ + return null; + } + apiBO.buildRequestParam(); + return apiBO; + } + +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/ProjectRepositoryImpl.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/ProjectRepositoryImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..4ab5805761eb04c2a39a1cb9a5108d4318b100cd --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/repositoryimpl/ProjectRepositoryImpl.java @@ -0,0 +1,102 @@ +package com.tianhua.datafactory.infrast.repositoryimpl; + +import com.alibaba.fastjson.JSON; +import com.tianhua.datafactory.domain.bo.project.ApiBO; +import com.tianhua.datafactory.domain.repository.ModelRepository; +import com.tianhua.datafactory.domain.repository.ProjectRepository; +import com.tianhua.datafactory.domain.bo.project.ProjectBO; + +import com.tianhua.datafactory.infrast.dao.dataobject.ApiModelDO; +import com.tianhua.datafactory.infrast.dao.dataobject.ProjectConfigDO; +import com.tianhua.datafactory.infrast.dao.mapper.ApiModelMapper; +import com.tianhua.datafactory.infrast.dao.mapper.ProjectConfigMapper; +import com.tianhua.datafactory.infrast.dataconvert.ApiConvert; +import com.tianhua.datafactory.infrast.dataconvert.ProjectConvert; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + + +/** + * @Description:接口实现类 + * @Author: + * @CreateTime:2022-05-27 17:45:38 + * @version v1.0 + */ +@Service +public class ProjectRepositoryImpl implements ProjectRepository{ + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private ProjectConfigMapper projectConfigMapper; + + @Autowired + private ApiModelMapper apiModelMapper; + + @Autowired + private ModelRepository modelRepository; + + + @Override + public boolean saveProject(ProjectBO projectBO){ + projectBO.init(); + if(StringUtils.isNotEmpty(projectBO.getProjectCode())){ + ProjectConfigDO projectConfigDO = ProjectConvert.INSTANCE.bo2do(projectBO); + projectConfigMapper.insert(projectConfigDO); + } + + List apiBOList = projectBO.getApiList(); + if(CollectionUtils.isNotEmpty(apiBOList)){ + for (ApiBO apiBO : apiBOList){ + apiBO.using(); + apiBO.buildApiSign(); + ApiModelDO apiModelDO = ApiConvert.INSTANCE.bo2do(apiBO); + apiModelDO.setRequestParam(JSON.toJSONString(apiBO.getParamList())); + apiModelDO.setReturnParam(JSON.toJSONString(apiBO.getReturnParamModel())); + apiModelMapper.insert(apiModelDO); + } + } + return true; + } + + @Override + public boolean updateProject(ProjectBO projectBO){ + if(StringUtils.isNotEmpty(projectBO.getProjectCode())){ + ProjectConfigDO projectConfigDO = ProjectConvert.INSTANCE.bo2do(projectBO); + projectConfigMapper.update(projectConfigDO); + } + + List apiBOList = projectBO.getApiList(); + if(CollectionUtils.isNotEmpty(apiBOList)){ + for (ApiBO apiBO : apiBOList){ + if(apiBO.getId() == null) { + apiModelMapper.insert(ApiConvert.INSTANCE.bo2do(apiBO)); + }else { + apiModelMapper.update(ApiConvert.INSTANCE.bo2do(apiBO)); + } + } + } + + return true; + } + + @Override + public ProjectBO getByCode(String projectCode) throws Exception { + ProjectBO projectBO = ProjectConvert.INSTANCE.do2bo(projectConfigMapper.getByCode(projectCode)); + if(projectBO == null){ + throw new Exception("查询数据源模型为空"); + } + + List apiModelDOList = apiModelMapper.getByProjectCode(projectCode); + projectBO.setApiList(ApiConvert.INSTANCE.doList2boList(apiModelDOList)); + + return projectBO; + } + +} \ No newline at end of file diff --git a/infrast/src/main/java/com/tianhua/datafactory/infrast/serviceiml/KVDBPersistServiceImpl.java b/infrast/src/main/java/com/tianhua/datafactory/infrast/serviceiml/KVDBPersistServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..3102c73158c8d6dd618480e981265795538870ea --- /dev/null +++ b/infrast/src/main/java/com/tianhua/datafactory/infrast/serviceiml/KVDBPersistServiceImpl.java @@ -0,0 +1,83 @@ +package com.tianhua.datafactory.infrast.serviceiml; + +import com.tianhua.datafactory.domain.ability.KVPairService; +import com.tianhua.datafactory.domain.support.kvpair.KVPairBO; +import com.tianhua.datafactory.infrast.dao.dataobject.KVPairDO; +import com.tianhua.datafactory.infrast.dao.mapper.KVMapper; +import com.tianhua.datafactory.infrast.dataconvert.KVPairModelConvert; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * Description:走数据库的配置服务 + * date: 2022/1/11 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Component(value = "kVDBPersistService") +public class KVDBPersistServiceImpl implements KVPairService { + + @Resource + private KVMapper kvMapper; + + @Override + public List getAll() { + List kvPairDOList = kvMapper.selectAll(); + if(kvPairDOList == null || kvPairDOList.isEmpty()){ + return new ArrayList<>(); + } + return KVPairModelConvert.INSTANCE.doList2boList(kvPairDOList); + } + + @Override + public KVPairBO get(KVPairBO kv) { + return null; + } + + @Override + public List getList(KVPairBO kv) { + List kvPairDOList = kvMapper.selectList(KVPairModelConvert.INSTANCE.bo2do(kv)); + return KVPairModelConvert.INSTANCE.doList2boList(kvPairDOList); + } + + @Override + public boolean insert(KVPairBO kv) { + int count = kvMapper.insert(KVPairModelConvert.INSTANCE.bo2do(kv)); + if(count > 0){ + return true; + } + return false; + } + + @Override + public boolean batchInsert(List kvList) { + List kvDOList = KVPairModelConvert.INSTANCE.boList2doList(kvList); + kvMapper.insertBatch(kvDOList); + return true; + } + + @Override + public List getByKey(List kvList) { + return null; + } + + @Override + public boolean update(KVPairBO kv) { + return false; + } + + @Override + public boolean delete(KVPairBO kv) { + return false; + } + + @Override + public boolean contains(KVPairBO kv) { + return false; + } +} diff --git a/infrast/src/main/resources/mapper/ApiModelMapper.xml b/infrast/src/main/resources/mapper/ApiModelMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..25a7b131f522d5d2d22a6ccb24660e6bb8acc750 --- /dev/null +++ b/infrast/src/main/resources/mapper/ApiModelMapper.xml @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,project_code,api_url,api_type,api_return_value,api_sign,api_doc,method_type,mock_count,return_wrap_type,request_param,return_param,status,date_create,date_update,update_user_id,create_user_id + + + + insert into api_model( + project_code,api_url,api_type,api_return_value,api_sign,api_doc,method_type,mock_count,return_wrap_type,request_param,return_param,status,date_create,date_update,update_user_id,create_user_id + ) + values( + #{projectCode},#{apiUrl},#{apiType},#{returnValue},#{apiSign},#{apiDoc},#{methodType},#{mockCount},#{apiReturnWrapType},#{requestParam},#{returnParam},#{status},#{dateCreate},#{dateUpdate},#{updateUserId},#{createUserId} + ) + + + + update api_model + set + project_code=#{projectCode},api_url=#{apiUrl},api_type=#{apiType},api_return_value=#{returnValue},api_sign=#{apiSign},api_doc=#{apiDoc},method_type=#{methodType},mock_count=#{mockCount},return_wrap_type=#{apiReturnWrapType},request_param=#{requestParam},return_param=#{returnParam},status=#{status},date_create=#{dateCreate},date_update=#{dateUpdate},update_user_id=#{updateUserId},create_user_id=#{createUserId} + where id = #{id} + + + + + + + + delete from api_model where id = #{id} + + + + + + + + + + delete from api_model where project_code = #{projectCode} + + + + + diff --git a/infrast/src/main/resources/mapper/ColumnModelMapper.xml b/infrast/src/main/resources/mapper/ColumnModelMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..50ded8d184e0cd74bde98db58aeb42b66348f160 --- /dev/null +++ b/infrast/src/main/resources/mapper/ColumnModelMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,table_id,column_name,column_comment,status,column_length,column_type,not_null,default_value,uniq_column,date_create,date_update,update_user_id,create_user_id + + + + insert into column_model( + table_id,column_name,column_comment,status,column_length,column_type,not_null,default_value,uniq_column,date_create,date_update,update_user_id,create_user_id + ) + values( + #{tableId},#{columnName},#{columnComment},#{status},#{columnLength},#{columnType},#{notNull},#{defaultValue},#{uniqColumn},#{dateCreate},#{dateUpdate},#{updateUserId},#{createUserId} + ) + + + + update column_model + set + table_id=#{tableId},column_name=#{columnName},column_comment=#{columnComment},status=#{status},column_length=#{columnLength},column_type=#{columnType},not_null=#{notNull},default_value=#{defaultValue},uniq_column=#{uniqColumn},date_create=#{dateCreate},date_update=#{dateUpdate},update_user_id=#{updateUserId},create_user_id=#{createUserId} + where id = #{id} + + + + + + + + + + + delete from column_model where id = #{id} + + + + + + + + delete from column_model where table_id = #{tableId} + + diff --git a/infrast/src/main/resources/mapper/DataSourceMapper.xml b/infrast/src/main/resources/mapper/DataSourceMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..373540b17bbb86caee22052c75dfcef7af92ad00 --- /dev/null +++ b/infrast/src/main/resources/mapper/DataSourceMapper.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,source_name,source_code,source_type,provider_service,struct_type,url,status,visit_strategy,regist_server,provider_domain_url,create_time,update_time,create_user_id,update_user_id + + + + insert into data_source( + source_name , source_code, source_type,struct_type,provider_service,url,status,visit_strategy,regist_server,provider_domain_url,create_time,update_time,create_user_id,update_user_id) + values (#{sourceName},#{sourceCode},#{sourceType},#{structType},#{providerService},#{url},#{status},#{visitStrategy},#{registServer},#{providerDomainUrl},#{createTime},#{updateTime},#{createUserId},#{updateUserId}) + + + + update data_source + set + source_name=#{sourceName},source_code=#{sourceCode},source_type=#{sourceType},struct_type=#{structType},provider_service=#{providerService},url=#{url},status=#{status},visit_strategy=#{visitStrategy},regist_server=#{registServer},provider_domain_url=#{providerDomainUrl},create_time=#{createTime},update_time=#{updateTime},create_user_id=#{createUserId},update_user_id=#{updateUserId} + where id = #{id} + + + + + + + + delete from data_source where id = #{id} + + + + + + update data_source set + status=#{status} where id = #{id} + + + + + + + + + + + + diff --git a/infrast/src/main/resources/mapper/DataSourceReqMapper.xml b/infrast/src/main/resources/mapper/DataSourceReqMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..8200203cbeb1b7b476cd61447976b13176b6db68 --- /dev/null +++ b/infrast/src/main/resources/mapper/DataSourceReqMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + id,data_source_id,param_key,param_value,param_desc,required,interface_param + + + + insert into data_source_req_config( + data_source_id,param_key,param_value,param_desc,required,interface_param + ) + values( + #{dataSourceId},#{paramKey},#{paramValue},#{paramDesc},#{required},#{interfaceParam} + ) + + + + update data_source_req_config + set + data_source_id=#{dataSourceId},param_key=#{paramKey},param_value=#{paramValue},param_desc=#{paramDesc},required=#{required},interface_param=#{interfaceParam} + where id = #{id} + + + + + + + + delete from data_source_req_config where data_source_id = #{dataSourceId} + + + + + diff --git a/infrast/src/main/resources/mapper/DataSourceResMapper.xml b/infrast/src/main/resources/mapper/DataSourceResMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..5e4751d8e620cc6c8e57ea0c30bc30646861f382 --- /dev/null +++ b/infrast/src/main/resources/mapper/DataSourceResMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + id,data_source_id,field_key,refer_path,field_desc,field_type + + + + insert into data_source_resp_config( + data_source_id,field_key,refer_path,field_desc,field_type + ) + values( + #{dataSourceId},#{fieldKey},#{referPath},#{fieldDesc},#{fieldType} + ) + + + + update data_source_resp_config + set + data_source_id=#{dataSourceId},field_key=#{fieldKey},refer_path=#{referPath},field_desc=#{fieldDesc},field_type=#{fieldType} + where id = #{id} + + + + + + + + delete from data_source_resp_config where data_source_id = #{dataSourceId} + + + + + diff --git a/infrast/src/main/resources/mapper/FieldModelMapper.xml b/infrast/src/main/resources/mapper/FieldModelMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..325767a3d64ccf5c5867dc704507d829af967888 --- /dev/null +++ b/infrast/src/main/resources/mapper/FieldModelMapper.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,field_name,field_type,field_desc,field_doc,status,field_ext_json,param_class_name,project_code + + + + insert into field_model( + field_name,field_type,field_desc,field_doc,status,field_ext_json,param_class_name,project_code + ) + values( + #{fieldName},#{fieldType},#{fieldDesc},#{fieldDoc},#{status},#{fieldExtJsonStr},#{paramClassName},#{projectCode} + ) + + + + update field_model + set + field_name=#{fieldName},field_type=#{fieldType},field_desc=#{fieldDesc},field_doc=#{fieldDoc},status=#{status},field_ext_json=#{fieldExtJsonStr},param_class_name=#{paramClassName},project_code=#{projectCode} + where id = #{id} + + + + + + + + delete from field_model where id = #{id} + + + + + + + + delete from field_model where project_code=#{projectCode} and param_class_name=#{paramClassName} + + + + + + + diff --git a/infrast/src/main/resources/mapper/KVMapper.xml b/infrast/src/main/resources/mapper/KVMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..d117edc1eadb48bcb3bf80fb7138421f01b577eb --- /dev/null +++ b/infrast/src/main/resources/mapper/KVMapper.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,k,v,value_json,group_key,parent_key,refer_key,refer_id, key_type, value_type,status + + + + insert into kv_instance( + k,v,value_json,group_key,parent_key,refer_key,refer_id,value_type,key_type,status) + values( + #{key},#{value},#{valueJson},#{groupKey},#{parentKey},#{referKey},#{referId},#{valueType},#{keyType},#{status} + ) + + + + + insert into kv_instance(k,v,value_json,group_key,parent_key,refer_key,refer_id,value_type,key_type,status) + values + + (#{kv.key},#{kv.value},#{kv.valueJson},#{kv.groupKey},#{kv.parentKey},#{kv.referKey},#{kv.referId},#{kv.valueType},#{kv.keyType},#{kv.status}) + + + + + + + + update kv_instance + set v=#{value} + + v=#{value}, + value_json=#{valueJson}, + group_key=#{groupKey}, + parent_key=#{parentKey}, + refer_key=#{referKey}, + refer_id=#{referId}, + value_type=#{valueType}, + key_type=#{keyType}, + status=#{status}, + + where k = #{key} + + + + + + + + + + + + + delete from kv_instance + + + + AND k = #{key} + + + + AND v = #{value} + + + + AND group_key = #{groupKey} + + + + AND parent_key = #{parentKey} + + + + AND refer_key = #{referKey} + + + + AND refer_id = #{referKey} + + + + + + + diff --git a/infrast/src/main/resources/mapper/ModelMappingConfigMapper.xml b/infrast/src/main/resources/mapper/ModelMappingConfigMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..aac42359848bc18d542a9a1ba22ecc689305c715 --- /dev/null +++ b/infrast/src/main/resources/mapper/ModelMappingConfigMapper.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + id,mapping_class_first,mapping_field_first,mapping_class_second,mapping_field_second,mapping_type,project_code + + + + insert into model_mapping_config( + mapping_class_first,mapping_field_first,mapping_class_second,mapping_field_second,mapping_type,project_code + ) + values( + #{mappingClassFirst},#{mappingFieldFirst},#{mappingClassSecond},#{mappingFieldSecond},#{mappingType},#{projectCode} + ) + + + + update model_mapping_config + set + mapping_class_first=#{mappingClassFirst},mapping_field_first=#{mappingFieldFirst},mapping_class_second=#{mappingClassSecond},mapping_field_second=#{mappingFieldSecond},mapping_type=#{mappingType},project_code=#{projectCode} + where id = #{id} + + + + + + + + + + delete from model_mapping_config where id = #{id} + + + + + + + diff --git a/infrast/src/main/resources/mapper/ModelSuffixConfigMapper.xml b/infrast/src/main/resources/mapper/ModelSuffixConfigMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..b5653380eeedf6ea880d0bc12c722f42571d9ae5 --- /dev/null +++ b/infrast/src/main/resources/mapper/ModelSuffixConfigMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + id,suffix,suffix_desc,model_type + + + + insert into model_suffix_config( + suffix,suffix_desc,model_type + ) + values( + #{suffix},#{desc},#{modelType} + ) + + + + update model_suffix_config + set + suffix=#{suffix},suffix_desc=#{desc},model_type=#{modelType} + where id = #{id} + + + + + + + + delete from model_suffix_config where id = #{id} + + + + + + + diff --git a/infrast/src/main/resources/mapper/ParamModelMapper.xml b/infrast/src/main/resources/mapper/ParamModelMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..b3984aadcfb77cc54adfc70a61e8c510cfcddfd5 --- /dev/null +++ b/infrast/src/main/resources/mapper/ParamModelMapper.xml @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,project_code,param_class_name,param_class_desc,status,module_code,model_suffix,date_create,date_update,update_user_id,create_user_id + + + + insert into param_model( + project_code,param_class_name,param_class_desc,status,module_code,model_suffix,date_create,date_update,update_user_id,create_user_id + ) + values( + #{projectCode},#{paramClassName},#{paramClassDesc},#{status},#{moduleCode},#{modelSuffix},#{dateCreate},#{dateUpdate},#{updateUserId},#{createUserId} + ) + + + + update param_model + set + project_code=#{projectCode},param_class_name=#{paramClassName},param_class_desc=#{paramClassDesc},status=#{status},module_code=#{moduleCode},model_suffix=#{modelSuffix},date_create=#{dateCreate},date_update=#{dateUpdate},update_user_id=#{updateUserId},create_user_id=#{createUserId} + where id = #{id} + + + + + + + + + + + + delete from param_model where id = #{id} + + + + + + + + + diff --git a/infrast/src/main/resources/mapper/ProjectConfigMapper.xml b/infrast/src/main/resources/mapper/ProjectConfigMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..6a98c4e8833b32abe071f2e68438a2ddf7824a60 --- /dev/null +++ b/infrast/src/main/resources/mapper/ProjectConfigMapper.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,project_code,project_desc,domain_code,status,domain_desc,bus_line,dept_name,date_create,date_update,update_user_id,create_user_id + + + + insert into project_config( + project_code,project_desc,domain_code,domain_desc,status,bus_line,dept_name,date_create,date_update,update_user_id,create_user_id + ) + values( + #{projectCode},#{projectDesc},#{domainCode},#{domainDesc},#{status},#{busLine},#{deptName},#{dateCreate},#{dateUpdate},#{updateUserId},#{createUserId} + ) + + + + update project_config + set + project_desc=#{projectDesc},domain_code=#{domainCode},domain_desc=#{domainDesc},status=#{status},bus_line=#{busLine},dept_name=#{deptName},date_create=#{dateCreate},date_update=#{dateUpdate},update_user_id=#{updateUserId},create_user_id=#{createUserId} + where project_code = #{projectCode} + + + + + + + + delete from project_config where id = #{id} + + + + + + + + + + + + + diff --git a/infrast/src/main/resources/mapper/TableModelMapper.xml b/infrast/src/main/resources/mapper/TableModelMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..e3bff573bb79da636f1073cfe1566ce3c2585a54 --- /dev/null +++ b/infrast/src/main/resources/mapper/TableModelMapper.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,table_name,table_comment,db_name,project_code,status,date_create,date_update,update_user_id,create_user_id + + + + insert into table_model( + table_name,table_comment,db_name,project_code,status,date_create,date_update,update_user_id,create_user_id + ) + values( + #{tableName},#{tableComment},#{dbName},#{projectCode},#{status},#{dateCreate},#{dateUpdate},#{updateUserId},#{createUserId} + ) + + + + update table_model + set + table_name=#{tableName},table_comment=#{tableComment},db_name=#{dbName},project_code=#{projectCode},status=#{status},date_create=#{dateCreate},date_update=#{dateUpdate},update_user_id=#{updateUserId},create_user_id=#{createUserId} + where id = #{id} + + + + + + + + + + delete from table_model where id = #{id} + + + + + + + + + diff --git a/infrast/src/main/resources/mybatis-config.xml b/infrast/src/main/resources/mybatis-config.xml new file mode 100644 index 0000000000000000000000000000000000000000..51d0a7ad7220505f91f4be99d4fb38d816866e12 --- /dev/null +++ b/infrast/src/main/resources/mybatis-config.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..d69373a0297ac6aed818702f27f6265542e56da0 --- /dev/null +++ b/pom.xml @@ -0,0 +1,146 @@ + + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.1.8.RELEASE + + + + pom + + com.tianhua.datafactory + datafactory-parent + 2.0.0-SNAPSHOT + + parent + https://gitee.com/sky-painting/data-factory + + + adapter + client + app + domain + infrast + start-local + service-example + service-example/springboot + service-example/springcloud + start-cloud + + + + UTF-8 + 1.7 + 1.7 + + + + + + com.coderman.utils + coderman-utils + 1.0.5-SNAPSHOT + + + + cglib + cglib + 3.2.6 + + + com.alibaba + fastjson + 1.2.70 + + + + org.apache.commons + commons-collections4 + 4.3 + + + + com.google.guava + guava + 18.0 + + + + com.yomahub + liteflow-spring-boot-starter + 2.8.3 + + + + org.apache.httpcomponents + httpclient + 4.5 + + + org.apache.httpcomponents + httpmime + 4.5 + + + org.apache.httpcomponents + httpcore + 4.4.1 + + + + + + + + junit + junit + 4.12 + test + + + + org.mapstruct + mapstruct-processor + 1.2.0.Final + + + + org.mapstruct + mapstruct-jdk8 + 1.2.0.Final + + + + org.mapstruct + mapstruct + 1.2.0.Final + + + + + + com.coderman.utils + coderman-utils + 1.0.5-SNAPSHOT + + + cglib + cglib + + + + com.yomahub + liteflow-spring-boot-starter + + + + + + + + + diff --git a/service-example/dubb-api-provider/pom.xml b/service-example/dubb-api-provider/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..bb7b0909c7a99e210261d7c6f3bd6658f210a630 --- /dev/null +++ b/service-example/dubb-api-provider/pom.xml @@ -0,0 +1,98 @@ + + + + + service-example + com.tianhua.datafactory + 2.0.0-SNAPSHOT + + 4.0.0 + + dubb-api-provider + + dubb-api-provider + + http://www.example.com + + + UTF-8 + 1.7 + 1.7 + + + + + junit + junit + 4.12 + test + + + + dubbo-api-client + com.tianhua.datafactory + 2.0.0-SNAPSHOT + + + + + org.apache.dubbo + dubbo-spring-boot-starter + 2.7.8 + + + + org.springframework.boot + spring-boot + + + org.springframework.boot + spring-boot-autoconfigure + + + + org.projectlombok + lombok + + + + + com.github.sgroschupf + zkclient + 0.1 + + + + + + org.apache.curator + curator-framework + 2.12.0 + + + org.apache.curator + curator-recipes + 2.12.0 + + + + org.apache.zookeeper + zookeeper + 3.5.9 + + + + org.slf4j + slf4j-log4j12 + + + + + + + + + diff --git a/service-example/dubb-api-provider/src/main/java/com/tianhua/datafactory/provider/App.java b/service-example/dubb-api-provider/src/main/java/com/tianhua/datafactory/provider/App.java new file mode 100644 index 0000000000000000000000000000000000000000..1a3e6096d644740b0d4374a10fdf943f50a24319 --- /dev/null +++ b/service-example/dubb-api-provider/src/main/java/com/tianhua/datafactory/provider/App.java @@ -0,0 +1,19 @@ +package com.tianhua.datafactory.provider; + +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Hello world! + * + */ +@SpringBootApplication(scanBasePackages = {"com.tianhua.datafactory.provider"}) +@EnableDubbo +public class App +{ + public static void main( String[] args ) + { + SpringApplication.run(App.class, args); + } +} diff --git a/service-example/dubb-api-provider/src/main/java/com/tianhua/datafactory/provider/facadeimpl/DepartFacadeImpl.java b/service-example/dubb-api-provider/src/main/java/com/tianhua/datafactory/provider/facadeimpl/DepartFacadeImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..2f4c128c5c868cf502eef76c1c6fb4c30597fae8 --- /dev/null +++ b/service-example/dubb-api-provider/src/main/java/com/tianhua/datafactory/provider/facadeimpl/DepartFacadeImpl.java @@ -0,0 +1,56 @@ +package com.tianhua.datafactory.provider.facadeimpl; + +import com.alibaba.fastjson.JSON; +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.DepartFacade; +import com.tianhua.datafactory.dto.DepartmentDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboService; + +import java.util.ArrayList; +import java.util.List; + +/** + * Description + * date: 2022/9/14 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@DubboService +@Slf4j +public class DepartFacadeImpl implements DepartFacade { + @Override + public ResultDataDto> searchDepart(Long departId) { + log.info("departId = {}", departId); + return ResultDataDto.success(getDepartmentList()); + } + + @Override + public ResultDataDto saveDepart(DepartmentDTO departmentDTO) { + log.info("departmentDTO = {}", JSON.toJSONString(departmentDTO)); + return ResultDataDto.success(true); + } + + + /** + * demo 数据 + * @return + */ + private List getDepartmentList(){ + List list = new ArrayList<>(); + + for (int i = 0;i < 10;i ++){ + DepartmentDTO departmentDTO = new DepartmentDTO(); + departmentDTO.setDepartName("技术部" + i); + departmentDTO.setManagerId(10L + i); + departmentDTO.setGrade(i+1); + departmentDTO.setSuperId(1L + i); + departmentDTO.setId(0L + i); + list.add(departmentDTO); + } + + return list; + } +} diff --git a/service-example/dubb-api-provider/src/main/java/com/tianhua/datafactory/provider/facadeimpl/UserFacadeImpl.java b/service-example/dubb-api-provider/src/main/java/com/tianhua/datafactory/provider/facadeimpl/UserFacadeImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..d8d021a71f6184fc7fe390bcc4341602f1c33987 --- /dev/null +++ b/service-example/dubb-api-provider/src/main/java/com/tianhua/datafactory/provider/facadeimpl/UserFacadeImpl.java @@ -0,0 +1,84 @@ +package com.tianhua.datafactory.provider.facadeimpl; + +import com.alibaba.fastjson.JSON; +import com.coderman.utils.page.PageDTO; +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.UserFacade; +import com.tianhua.datafactory.dto.UserDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * Description + * date: 2022/9/14 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@DubboService +@Slf4j +public class UserFacadeImpl implements UserFacade { + @Override + public ResultDataDto saveUser(UserDTO userDTO) { + log.info("userDTO = {}", JSON.toJSONString(userDTO)); + return ResultDataDto.success(true); + } + + @Override + public ResultDataDto getUserListPage(PageDTO pageDTO) { + log.info("pageDTO = {}", JSON.toJSONString(pageDTO)); + pageDTO.setTotal(1000); + pageDTO.setItems(getUserList()); + return ResultDataDto.success(pageDTO); + } + + @Override + public ResultDataDto> getAllUserList() { + return ResultDataDto.success(getUserList()); + } + + + /** + * demo 数据 + * @return + */ + private List getUserList(){ + List list = new ArrayList<>(); + for (int i = 0;i < 10 ;i++){ + UserDTO userDTO = new UserDTO(); + userDTO.setAge(10+i); + userDTO.setChineseName("神帅"+i); + userDTO.setUserName("神帅"+i); + userDTO.setChineseName("shenshuai"+i); + userDTO.setBankCount("2324099749204"+i); + userDTO.setBankMoney(3000.23+i); + userDTO.setCardNumber("3483985395898989"+i); + userDTO.setDepartId(0L + i); + userDTO.setCompanyName("xxx科技有限公司"+i); + userDTO.setEmail("shenshai"+i+"@email.com"); + userDTO.setBankName("xxx银行"+i); + userDTO.setHight(170.00d + i); + userDTO.setId(1L + i); + userDTO.setPassword("sdf23kdsjdn132dasdf"+i); + userDTO.setUpdateTime(new Date()); + userDTO.setCreateTime(new Date()); + userDTO.setJoinDate(new Date()); + userDTO.setSchoolName("xxx大学"+i); + userDTO.setStatus((short)i); + + + list.add(userDTO); + } + + return list; + } + + + +} diff --git a/service-example/dubb-api-provider/src/main/resources/application.properties b/service-example/dubb-api-provider/src/main/resources/application.properties new file mode 100644 index 0000000000000000000000000000000000000000..37568b6db30a8f2f9fdbfeb02c31f052b0b3271e --- /dev/null +++ b/service-example/dubb-api-provider/src/main/resources/application.properties @@ -0,0 +1,14 @@ +spring.application.name=dubbo-provider +server.port=8055 + +#?????? +#??????? +dubbo.application.name=dubbo-provider +#???????????? +dubbo.registry.address=localhost:2181 +dubbo.registry.protocol=zookeeper +#??dubbo???????????8001 +dubbo.protocol.name=dubbo +dubbo.protocol.port=8001 +#????? +dubbo.scan.base-packages=com.tianhua.datafactory.provider diff --git a/service-example/dubb-api-provider/src/main/resources/log4j.properties b/service-example/dubb-api-provider/src/main/resources/log4j.properties new file mode 100644 index 0000000000000000000000000000000000000000..9602da681fabd1d071959c4cfa3f24328b1b76ed --- /dev/null +++ b/service-example/dubb-api-provider/src/main/resources/log4j.properties @@ -0,0 +1,10 @@ +log4j.rootLogger=info, ServerDailyRollingFile, stdout +log4j.appender.ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender +log4j.appender.ServerDailyRollingFile.DatePattern='.'yyyy-MM-dd +log4j.appender.ServerDailyRollingFile.File=logs/notify-subscription.log +log4j.appender.ServerDailyRollingFile.layout=org.apache.log4j.PatternLayout +log4j.appender.ServerDailyRollingFile.layout.ConversionPattern=%d - %m%n +log4j.appender.ServerDailyRollingFile.Append=true +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} %p [%c] %m%n \ No newline at end of file diff --git a/service-example/dubb-api-provider/src/test/java/com/tianhua/datafactory/AppTest.java b/service-example/dubb-api-provider/src/test/java/com/tianhua/datafactory/AppTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ceb0fc30e4acd1fa88c9de241d7ddf48ac29b4a6 --- /dev/null +++ b/service-example/dubb-api-provider/src/test/java/com/tianhua/datafactory/AppTest.java @@ -0,0 +1,20 @@ +package com.tianhua.datafactory; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/service-example/dubbo-api-client/pom.xml b/service-example/dubbo-api-client/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..31ff50114ce62bf9af3b89387af8c55468f2318c --- /dev/null +++ b/service-example/dubbo-api-client/pom.xml @@ -0,0 +1,50 @@ + + + + + service-example + com.tianhua.datafactory + 2.0.0-SNAPSHOT + + 4.0.0 + + dubbo-api-client + com.tianhua.datafactory + 2.0.0-SNAPSHOT + + + dubbo-api-client + + http://www.example.com + + + UTF-8 + 1.7 + 1.7 + + + + + junit + junit + 4.11 + test + + + + org.projectlombok + lombok + + + + com.coderman.utils + coderman-utils + + + + + + + + diff --git a/service-example/dubbo-api-client/src/main/java/com/tianhua/datafactory/DepartFacade.java b/service-example/dubbo-api-client/src/main/java/com/tianhua/datafactory/DepartFacade.java new file mode 100644 index 0000000000000000000000000000000000000000..55d1931951c9a50843ffcc5bc0867845d8d4773b --- /dev/null +++ b/service-example/dubbo-api-client/src/main/java/com/tianhua/datafactory/DepartFacade.java @@ -0,0 +1,38 @@ +package com.tianhua.datafactory; + +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.dto.DepartmentDTO; + +import java.util.List; + +/** + * Description + * date: 2022/9/11 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public interface DepartFacade { + /** + * 获取部门数据信息 + * + * 将此接口注册为数据源接口 + * 并从此接口获取部门数据 + * @param departId + * @return + */ + ResultDataDto> searchDepart(Long departId); + + + /** + * 保存部门数据信息 + * + * 模拟数据入参mock,或者直接调用 + * @param departmentDTO + * @return + */ + ResultDataDto saveDepart(DepartmentDTO departmentDTO); + + +} diff --git a/service-example/dubbo-api-client/src/main/java/com/tianhua/datafactory/UserFacade.java b/service-example/dubbo-api-client/src/main/java/com/tianhua/datafactory/UserFacade.java new file mode 100644 index 0000000000000000000000000000000000000000..15abe4601bace044c1b06bc06466401b9b63abf5 --- /dev/null +++ b/service-example/dubbo-api-client/src/main/java/com/tianhua/datafactory/UserFacade.java @@ -0,0 +1,42 @@ +package com.tianhua.datafactory; + +import com.coderman.utils.page.PageDTO; +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.dto.UserDTO; + +import java.util.List; + +/** + * Description + * date: 2022/9/12 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public interface UserFacade { + + /** + * 保存用户信息 + * 进行接口数据mock模拟 + * @param userDTO + * @return + */ + ResultDataDto saveUser(UserDTO userDTO); + + /** + * 分页获取用户信息 + * @return + */ + ResultDataDto getUserListPage(PageDTO pageDTO); + + /** + * 获取全量用户信息 + * + * 将此接口注册为数据源, + * 在其他数据模型构建的时候从此数据源中获取用户数据信息 + * @return + */ + ResultDataDto> getAllUserList(); + +} diff --git a/service-example/dubbo-api-client/src/main/java/com/tianhua/datafactory/dto/DepartmentDTO.java b/service-example/dubbo-api-client/src/main/java/com/tianhua/datafactory/dto/DepartmentDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..53732098a3e52a23f66457334692e7c6726da6c3 --- /dev/null +++ b/service-example/dubbo-api-client/src/main/java/com/tianhua/datafactory/dto/DepartmentDTO.java @@ -0,0 +1,28 @@ +package com.tianhua.datafactory.dto; + +import lombok.Data; + +import java.util.List; + +/** + * Description + * date: 2022/9/11 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class DepartmentDTO { + private Long id; + + private String departName; + + private Long managerId; + + private Long superId; + + private Integer grade; + + private List subDepartList; +} diff --git a/service-example/dubbo-api-client/src/main/java/com/tianhua/datafactory/dto/UserDTO.java b/service-example/dubbo-api-client/src/main/java/com/tianhua/datafactory/dto/UserDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..0c7dc54aeda0f6c04fdfd02f409c9de5bc06c737 --- /dev/null +++ b/service-example/dubbo-api-client/src/main/java/com/tianhua/datafactory/dto/UserDTO.java @@ -0,0 +1,66 @@ +package com.tianhua.datafactory.dto; + +import lombok.Data; + +import java.util.Date; + +/** + * Description + * date: 2022/9/12 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class UserDTO { + private Long id; + + private String userName; + + private String chineseName; + + private Integer age; + //身高 + private Double hight; + + private String cardNumber; + + //银行卡号 + private String bankCount; + + //开户行名称 + private String bankName; + + //公司名称 + private String companyName; + + //毕业学校 + private String schoolName; + + //银行卡余额 + private Double bankMoney; + + private String password; + + private String email; + + private Long departId; + + //用户状态 + private Short status; + + //记录创建时间 + private Date createTime; + + + //记录修改时间 + private Date updateTime; + + //入职时间 + private Date joinDate; + + +} + + diff --git a/service-example/dubbo-api-client/src/main/java/com/tianhua/datafactory/dto/UserQueryDTO.java b/service-example/dubbo-api-client/src/main/java/com/tianhua/datafactory/dto/UserQueryDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..089a3c908de8170d63d4f7a872aae372284461a1 --- /dev/null +++ b/service-example/dubbo-api-client/src/main/java/com/tianhua/datafactory/dto/UserQueryDTO.java @@ -0,0 +1,17 @@ +package com.tianhua.datafactory.dto; + +/** + * Description + * date: 2022/9/13 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class UserQueryDTO { + + private String userName; + + private String phone; + +} diff --git a/service-example/dubbo-api-client/src/test/java/com/tianhua/datafactory/AppTest.java b/service-example/dubbo-api-client/src/test/java/com/tianhua/datafactory/AppTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ceb0fc30e4acd1fa88c9de241d7ddf48ac29b4a6 --- /dev/null +++ b/service-example/dubbo-api-client/src/test/java/com/tianhua/datafactory/AppTest.java @@ -0,0 +1,20 @@ +package com.tianhua.datafactory; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/service-example/pom.xml b/service-example/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..71e177c697e13b53d6a905aa64791797f44a5b89 --- /dev/null +++ b/service-example/pom.xml @@ -0,0 +1,83 @@ + + + + + datafactory-parent + com.tianhua.datafactory + 2.0.0-SNAPSHOT + + 4.0.0 + + service-example + pom + + service-example + + http://www.example.com + + dubbo-api-client + dubb-api-provider + + + + UTF-8 + 1.7 + 1.7 + + + + + junit + junit + 4.11 + test + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + diff --git a/service-example/springboot/pom.xml b/service-example/springboot/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..92f0b268ff8d2ee0cdeee94f19ba5074191d9e1a --- /dev/null +++ b/service-example/springboot/pom.xml @@ -0,0 +1,49 @@ + + + + + service-example + com.tianhua.datafactory + 2.0.0-SNAPSHOT + + + 4.0.0 + + springboot + + springboot + + http://www.example.com + + + UTF-8 + 8 + 8 + + + + + junit + junit + 4.11 + test + + + org.springframework.boot + spring-boot-autoconfigure + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + + + diff --git a/service-example/springboot/src/main/java/com/tianhua/springboot/App.java b/service-example/springboot/src/main/java/com/tianhua/springboot/App.java new file mode 100644 index 0000000000000000000000000000000000000000..bab5040d6c087bac00538802aad4a3a91eaf1cc8 --- /dev/null +++ b/service-example/springboot/src/main/java/com/tianhua/springboot/App.java @@ -0,0 +1,17 @@ +package com.tianhua.springboot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Hello world! + * + */ +@SpringBootApplication(scanBasePackages = {"com.tianhua.springboot"}) +public class App +{ + public static void main( String[] args ) + { + SpringApplication.run(App.class, args); + } +} diff --git a/service-example/springboot/src/main/java/com/tianhua/springboot/controller/DepartmentController.java b/service-example/springboot/src/main/java/com/tianhua/springboot/controller/DepartmentController.java new file mode 100644 index 0000000000000000000000000000000000000000..521e47fee5fbdd65e55cf1945f6623af433faea5 --- /dev/null +++ b/service-example/springboot/src/main/java/com/tianhua/springboot/controller/DepartmentController.java @@ -0,0 +1,65 @@ +package com.tianhua.springboot.controller; + +import com.alibaba.fastjson.JSON; +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.springboot.dto.DepartmentDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +/** + * Description + * date: 2022/9/16 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@RestController +@Slf4j +public class DepartmentController { + + @RequestMapping(value = "/depart/search/{departId}") + public ResultDataDto> searchDepart(@PathVariable(value = "departId") Long departId){ + log.info("departId = {}", departId); + return ResultDataDto.success(getDepartmentList()); + } + + + @RequestMapping(value = "/depart/search2/{departId}") + public List searchDepartV2(@PathVariable(value = "departId") Long departId){ + log.info("departId = {}", departId); + return getDepartmentList(); + } + + @RequestMapping(value = "/depart/save", method = RequestMethod.POST) + public ResultDataDto saveDepart(@RequestBody DepartmentDTO departmentDTO){ + log.info("departmentDTO = {}", JSON.toJSONString(departmentDTO)); + return ResultDataDto.success(true); + } + + + /** + * demo 数据 + * @return + */ + private List getDepartmentList(){ + List list = new ArrayList<>(); + + for (int i = 0;i < 10;i ++){ + DepartmentDTO departmentDTO = new DepartmentDTO(); + departmentDTO.setDepartName("技术部" + i); + departmentDTO.setManagerId(10L + i); + departmentDTO.setGrade(i+1); + departmentDTO.setSuperId(1L + i); + departmentDTO.setId(0L + i); + list.add(departmentDTO); + } + + return list; + } + + +} diff --git a/service-example/springboot/src/main/java/com/tianhua/springboot/controller/UserController.java b/service-example/springboot/src/main/java/com/tianhua/springboot/controller/UserController.java new file mode 100644 index 0000000000000000000000000000000000000000..066fc40846b3c03386e947b36ed73012fb870829 --- /dev/null +++ b/service-example/springboot/src/main/java/com/tianhua/springboot/controller/UserController.java @@ -0,0 +1,84 @@ +package com.tianhua.springboot.controller; + +import com.alibaba.fastjson.JSON; +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.springboot.dto.UserDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +/** + * Description + * date: 2022/9/1 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@RestController +@Slf4j +public class UserController { + + @RequestMapping(value = "/user/save", method = RequestMethod.POST) + public ResultDataDto save(@RequestBody UserDTO userDTO){ + log.info("userDTO = {}", JSON.toJSONString(userDTO)); + return ResultDataDto.success(true); + } + + + @RequestMapping(value = "getlistobjectdto") + public ResultDataDto getListDto(){ + ResultDataDto resultDataDto = new ResultDataDto(); + + List list = new ArrayList<>(); + list.add(new UserDTO("zhangsan","张三ss","中国1")); + list.add(new UserDTO("lisi","李四","中国2")); + list.add(new UserDTO("wangwu","王五","中国3")); + list.add(new UserDTO("zhouxxsi","周四","中国4")); + list.add(new UserDTO("zhangxxsaxn","张三xxss","中国5")); + list.add(new UserDTO("zhangsaxxn","张xx三ss","中国6")); + list.add(new UserDTO("zhangxxsaxn","张三xxss","中国5")); + for (int i =0 ;i < 1000; i++){ + list.add(new UserDTO("wangwu"+i,"王五"+i,"中国3"+i)); + } + resultDataDto.setData(list); + return resultDataDto; + } + + + + @RequestMapping(value = "getlistobjectdtoparam") + public ResultDataDto getListDtoParam(@RequestParam(value = "page") Integer page,@RequestParam(value = "pageSize") Integer pageSize ){ + log.info("page = {},pageSize = {}",page,pageSize); + ResultDataDto resultDataDto = new ResultDataDto(); + + List list = new ArrayList<>(); + list.add(new UserDTO("zhangsan","张三ss","中国1")); + list.add(new UserDTO("lisi","李四","中国2")); + list.add(new UserDTO("wangwu","王五","中国3")); + list.add(new UserDTO("zhouxxsi","周四","中国4")); + list.add(new UserDTO("zhangxxsaxn","张三xxss","中国5")); + list.add(new UserDTO("zhangsaxxn","张xx三ss","中国6")); + list.add(new UserDTO("zhangxxsaxn","张三xxss","中国5")); + for (int i =0 ;i < 1000; i++){ + list.add(new UserDTO("wangwu"+i,"王五"+i,"中国3"+i)); + } + resultDataDto.setData(list); + return resultDataDto; + } + + + @RequestMapping(value = "getlist") + public List getList(){ + List list = new ArrayList<>(); + list.add("a"); + list.add("b"); + list.add("c"); + list.add("e"); + list.add("f"); + + return list; + } +} diff --git a/service-example/springboot/src/main/java/com/tianhua/springboot/dto/DepartmentDTO.java b/service-example/springboot/src/main/java/com/tianhua/springboot/dto/DepartmentDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..b5fd66a7719e0b58512c9d81f162fdfbe5f67e26 --- /dev/null +++ b/service-example/springboot/src/main/java/com/tianhua/springboot/dto/DepartmentDTO.java @@ -0,0 +1,28 @@ +package com.tianhua.springboot.dto; + +import lombok.Data; + +import java.util.List; + +/** + * Description + * date: 2022/9/15 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class DepartmentDTO { + private Long id; + + private String departName; + + private Long managerId; + + private Long superId; + + private Integer grade; + + private List subDepartList; +} diff --git a/service-example/springboot/src/main/java/com/tianhua/springboot/dto/UserDTO.java b/service-example/springboot/src/main/java/com/tianhua/springboot/dto/UserDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..e504d56878de9a6f2594b18bbe74c1c33953089b --- /dev/null +++ b/service-example/springboot/src/main/java/com/tianhua/springboot/dto/UserDTO.java @@ -0,0 +1,76 @@ +package com.tianhua.springboot.dto; + +import lombok.Data; + +import java.util.Date; + +/** + * Description + * date: 2022/9/2 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +public class UserDTO { + public UserDTO(String userName,String aliasName,String country){ + this.userName = userName; + this.aliasName = aliasName; + this.country = country; + this.currentAddress = country + aliasName; + this.id = 100000L; + this.age = 19; + } + + private String userName; + private String aliasName; + private String country; + private String currentAddress; + private Long id; + private int age; + + private String company; + + private String chineseName; + + //身高 + private Double hight; + + private String cardNumber; + + //银行卡号 + private String bankCount; + + //开户行名称 + private String bankName; + + //公司名称 + private String companyName; + + //毕业学校 + private String schoolName; + + //银行卡余额 + private Double bankMoney; + + private String password; + + private String email; + + private Long departId; + + //用户状态 + private Short status; + + //记录创建时间 + private Date createTime; + + + //记录修改时间 + private Date updateTime; + + //入职时间 + private Date joinDate; + +} diff --git a/service-example/springboot/src/main/resources/application.properties b/service-example/springboot/src/main/resources/application.properties new file mode 100644 index 0000000000000000000000000000000000000000..450f5b04055adb9571effc414dda6cad1bd4a276 --- /dev/null +++ b/service-example/springboot/src/main/resources/application.properties @@ -0,0 +1,2 @@ +server.port=8088 +spring.application.name=springboot \ No newline at end of file diff --git a/service-example/springboot/src/test/java/com/tianhua/datafactory/AppTest.java b/service-example/springboot/src/test/java/com/tianhua/datafactory/AppTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ceb0fc30e4acd1fa88c9de241d7ddf48ac29b4a6 --- /dev/null +++ b/service-example/springboot/src/test/java/com/tianhua/datafactory/AppTest.java @@ -0,0 +1,20 @@ +package com.tianhua.datafactory; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/service-example/springcloud/pom.xml b/service-example/springcloud/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..ea04a56ec9615b27bbdc6f2574dd2822872f4e75 --- /dev/null +++ b/service-example/springcloud/pom.xml @@ -0,0 +1,49 @@ + + + + + datafactory-parent + com.tianhua.datafactory + 2.0.0-SNAPSHOT + + + 4.0.0 + + springcloud + + springcloud + + http://www.example.com + + + UTF-8 + 1.8 + 1.8 + + + + + junit + junit + 4.11 + test + + + org.springframework.boot + spring-boot-autoconfigure + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + + + diff --git a/service-example/springcloud/src/main/java/com/tianhua/datafactory/App.java b/service-example/springcloud/src/main/java/com/tianhua/datafactory/App.java new file mode 100644 index 0000000000000000000000000000000000000000..88e176c39b438178a18bd70436702125a0814c62 --- /dev/null +++ b/service-example/springcloud/src/main/java/com/tianhua/datafactory/App.java @@ -0,0 +1,17 @@ +package com.tianhua.datafactory; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Hello world! + * + */ +@SpringBootApplication(scanBasePackages = {"com.tianhua.springboot"}) +public class App +{ + public static void main( String[] args ) + { + SpringApplication.run(App.class, args); + } +} diff --git a/service-example/springcloud/src/test/java/com/tianhua/datafactory/AppTest.java b/service-example/springcloud/src/test/java/com/tianhua/datafactory/AppTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ceb0fc30e4acd1fa88c9de241d7ddf48ac29b4a6 --- /dev/null +++ b/service-example/springcloud/src/test/java/com/tianhua/datafactory/AppTest.java @@ -0,0 +1,20 @@ +package com.tianhua.datafactory; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/start-cloud/pom.xml b/start-cloud/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..39eccc879cec63384547dbd1398eb6391fc5de6a --- /dev/null +++ b/start-cloud/pom.xml @@ -0,0 +1,60 @@ + + + + + datafactory-parent + com.tianhua.datafactory + 2.0.0-SNAPSHOT + + 4.0.0 + + start-cloud + + start-cloud + + http://www.example.com + + + UTF-8 + 1.7 + 1.7 + + + + + junit + junit + 4.12 + test + + + + com.tianhua.datafactory + adapter + 2.0.0-SNAPSHOT + + + + + com.tianhua.datafactory + app + 2.0.0-SNAPSHOT + + + + com.tianhua.datafactory + infrast + 2.0.0-SNAPSHOT + + + + com.yomahub + liteflow-spring-boot-starter + + + + + + + diff --git a/start-cloud/src/main/java/com/tianhua/datafactory/App.java b/start-cloud/src/main/java/com/tianhua/datafactory/App.java new file mode 100644 index 0000000000000000000000000000000000000000..070104788333baf6f4ba05e7bd8d2c67fbe7f0e6 --- /dev/null +++ b/start-cloud/src/main/java/com/tianhua/datafactory/App.java @@ -0,0 +1,13 @@ +package com.tianhua.datafactory; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + } +} diff --git a/start-cloud/src/main/java/com/tianhua/datafactory/config/CorsConfig.java b/start-cloud/src/main/java/com/tianhua/datafactory/config/CorsConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..f5dc0624f8054ceef8ac40c05d7f4c159e7b2e68 --- /dev/null +++ b/start-cloud/src/main/java/com/tianhua/datafactory/config/CorsConfig.java @@ -0,0 +1,29 @@ +package com.tianhua.datafactory.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * Description + * date: 2022/9/5 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Configuration +public class CorsConfig implements WebMvcConfigurer { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + //是否发送Cookie + .allowCredentials(true) + //放行哪些原始域 + .allowedOrigins("*") + .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"}) + .allowedHeaders("*") + .exposedHeaders("Content-Type","X-Requested-With","accept","Origin","Access-Control-Request-Method","Access-Control-Request-Headers"); + } + +} diff --git a/start-cloud/src/test/java/com/tianhua/datafactory/AppTest.java b/start-cloud/src/test/java/com/tianhua/datafactory/AppTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ceb0fc30e4acd1fa88c9de241d7ddf48ac29b4a6 --- /dev/null +++ b/start-cloud/src/test/java/com/tianhua/datafactory/AppTest.java @@ -0,0 +1,20 @@ +package com.tianhua.datafactory; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/start-local/pom.xml b/start-local/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..addab91c88339d58cc98d376546f32800562821c --- /dev/null +++ b/start-local/pom.xml @@ -0,0 +1,63 @@ + + + + 4.0.0 + + com.tianhua.datafactory + datafactory-parent + 2.0.0-SNAPSHOT + + + com.tianhua.datafactory + start-local + 2.0.0-SNAPSHOT + + start + + http://www.example.com + + + UTF-8 + 1.8 + 1.8 + + + + + junit + junit + 4.12 + test + + + + com.tianhua.datafactory + adapter + 2.0.0-SNAPSHOT + + + + + com.tianhua.datafactory + app + 2.0.0-SNAPSHOT + + + + com.tianhua.datafactory + infrast + 2.0.0-SNAPSHOT + + + + com.yomahub + liteflow-spring-boot-starter + + + + + + + + diff --git a/start-local/src/main/java/com/tianhua/datafactory/Application.java b/start-local/src/main/java/com/tianhua/datafactory/Application.java new file mode 100644 index 0000000000000000000000000000000000000000..a06deca4fd74cad7ef66c4ee86c56d7baf6eb410 --- /dev/null +++ b/start-local/src/main/java/com/tianhua/datafactory/Application.java @@ -0,0 +1,38 @@ +package com.tianhua.datafactory; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.MultipartConfigFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.util.unit.DataSize; + +import javax.servlet.MultipartConfigElement; + +/** + * Description: + * date: 2022/3/21 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@SpringBootApplication(scanBasePackages = {"com.tianhua.datafactory"}) +@MapperScan(value = "com.tianhua.datafactory.infrast.dao.mapper") +public class Application { + // 文件上传配置类 + @Bean + public MultipartConfigElement multipartConfigElement() { + MultipartConfigFactory factory = new MultipartConfigFactory(); + //文件最大2M + factory.setMaxFileSize(DataSize.parse("10240KB")); //KB,MB + /// 设置总上传数据总大小5M + factory.setMaxRequestSize(DataSize.parse("102400KB")); + return factory.createMultipartConfig(); + } + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/start-local/src/main/java/com/tianhua/datafactory/config/CorsConfig.java b/start-local/src/main/java/com/tianhua/datafactory/config/CorsConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..0081a7ac57cf7947bfcdfbfe83e768dff47c7b14 --- /dev/null +++ b/start-local/src/main/java/com/tianhua/datafactory/config/CorsConfig.java @@ -0,0 +1,28 @@ +package com.tianhua.datafactory.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * Description: + * date: 2022/5/16 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Configuration +public class CorsConfig implements WebMvcConfigurer { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + //是否发送Cookie + .allowCredentials(true) + //放行哪些原始域 + .allowedOrigins("*") + .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"}) + .allowedHeaders("*") + .exposedHeaders("Content-Type","X-Requested-With","accept","Origin","Access-Control-Request-Method","Access-Control-Request-Headers"); + } +} \ No newline at end of file diff --git a/start-local/src/main/java/com/tianhua/datafactory/config/SpringWebMvcConfigurer.java b/start-local/src/main/java/com/tianhua/datafactory/config/SpringWebMvcConfigurer.java new file mode 100644 index 0000000000000000000000000000000000000000..bbfb5748a4d713243a93987c152a1ba359b9627f --- /dev/null +++ b/start-local/src/main/java/com/tianhua/datafactory/config/SpringWebMvcConfigurer.java @@ -0,0 +1,58 @@ +package com.tianhua.datafactory.config; + +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.alibaba.fastjson.support.config.FastJsonConfig; +import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.nio.charset.Charset; +import java.util.List; + +/** + * Description + * 解决jacksonxml无法进行json转换的问题,这里使用fastjson的解决方案 + * date: 2022/9/6 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Configuration +public class SpringWebMvcConfigurer implements WebMvcConfigurer { + + private final Logger logger = LoggerFactory.getLogger(SpringWebMvcConfigurer.class); + + //使用阿里 FastJson 作为JSON MessageConverter + @Override + public void configureMessageConverters(List> converters) { + + /* + 先把JackSon的消息转换器删除. + 备注: (1)源码分析可知,返回json的过程为: + Controller调用结束后返回一个数据对象,for循环遍历conventers,找到支持application/json的HttpMessageConverter,然后将返回的数据序列化成json。 + 具体参考org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor的writeWithMessageConverters方法 + (2)由于是list结构,我们添加的fastjson在最后。因此必须要将jackson的转换器删除,不然会先匹配上jackson,导致没使用fastjson + */ + for (int i = converters.size() - 1; i >= 0; i--) { + if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) { + converters.remove(i); + } + } + + FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); + FastJsonConfig config = new FastJsonConfig(); + config.setSerializerFeatures( + SerializerFeature.WriteMapNullValue,//保留空的字段 + SerializerFeature.WriteNullStringAsEmpty,//String null -> "" + SerializerFeature.WriteNullNumberAsZero,//Number null -> 0 + SerializerFeature.WriteDateUseDateFormat);//日期格式化 + converter.setFastJsonConfig(config); + converter.setDefaultCharset(Charset.forName("UTF-8")); + converters.add(converter); + } +} diff --git a/datafactory-api/src/main/resources/application.properties b/start-local/src/main/resources/application.properties similarity index 51% rename from datafactory-api/src/main/resources/application.properties rename to start-local/src/main/resources/application.properties index 16e86cd1036391b0ae00815f839fcc16c4895caa..99eb84522f2b7e4727197ebf69a5da0222afdf2a 100644 --- a/datafactory-api/src/main/resources/application.properties +++ b/start-local/src/main/resources/application.properties @@ -1,21 +1,30 @@ server.port=8090 -management.port=8073 +spring.application.name=datafactory +spring.mvc.view.suffix=.html + +spring.devtools.restart.enabled=false + -# -endpoints.cors.allowed-origins=http://127.0.0.1:8083 -endpoints.cors.allowed-methods=GET,POST -#ݿ +#????? spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/data_factory?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=root -#.xmlļ· +#??.xml???? mybatis.config-locations=classpath:mybatis-config.xml mybatis.mapper-locations=classpath:mapper/*.xml -#ģ· -mybatis.type-aliases-package=com.coderman.tianhu.datafactory.core.entity -spring.application.name=datafactory -spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 \ No newline at end of file +#?????? +mybatis.type-aliases-package=com.tianhua.datafactory.infrast.dao.dataobject +#mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl + +#???dubbo???,????dubbo????? +dubbox.registry.address=127.0.0.1:2181 + +#liteflow????? +liteflow.rule-source=config/dataprocessingflow.el.xml + + + diff --git a/start-local/src/main/resources/config/dataprocessingflow.el.xml b/start-local/src/main/resources/config/dataprocessingflow.el.xml new file mode 100644 index 0000000000000000000000000000000000000000..c79a448e629af3259fe6f6add8791e05fe649ad6 --- /dev/null +++ b/start-local/src/main/resources/config/dataprocessingflow.el.xml @@ -0,0 +1,12 @@ + + + + THEN( + dataPreProcessingCmp, + SWITCH(switchProcessingCmp).to( + parallelProcessingCmp, + serialProcessingCmp + ) + ); + + \ No newline at end of file diff --git a/start-local/src/main/resources/log4j.properties b/start-local/src/main/resources/log4j.properties new file mode 100644 index 0000000000000000000000000000000000000000..9602da681fabd1d071959c4cfa3f24328b1b76ed --- /dev/null +++ b/start-local/src/main/resources/log4j.properties @@ -0,0 +1,10 @@ +log4j.rootLogger=info, ServerDailyRollingFile, stdout +log4j.appender.ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender +log4j.appender.ServerDailyRollingFile.DatePattern='.'yyyy-MM-dd +log4j.appender.ServerDailyRollingFile.File=logs/notify-subscription.log +log4j.appender.ServerDailyRollingFile.layout=org.apache.log4j.PatternLayout +log4j.appender.ServerDailyRollingFile.layout.ConversionPattern=%d - %m%n +log4j.appender.ServerDailyRollingFile.Append=true +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} %p [%c] %m%n \ No newline at end of file diff --git a/start-local/src/main/resources/mybatis-config.xml b/start-local/src/main/resources/mybatis-config.xml new file mode 100644 index 0000000000000000000000000000000000000000..51d0a7ad7220505f91f4be99d4fb38d816866e12 --- /dev/null +++ b/start-local/src/main/resources/mybatis-config.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/start-local/src/test/java/com/tianhua/datafactory/CommonParseServiceTest.java b/start-local/src/test/java/com/tianhua/datafactory/CommonParseServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..e2099c4cf7f32809376755cf0f0d945a72850d6c --- /dev/null +++ b/start-local/src/test/java/com/tianhua/datafactory/CommonParseServiceTest.java @@ -0,0 +1,169 @@ +package com.tianhua.datafactory; + +import com.alibaba.fastjson.JSON; +import com.tianhua.datafactory.client.context.FieldIndex; +import com.tianhua.datafactory.client.context.FileDataSourceContext; +import com.tianhua.datafactory.client.enums.FileTypeEnum; +import com.tianhua.datafactory.client.filedata.CommonParseService; +import com.tianhua.datafactory.demomodel.UserInfo; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.io.IOException; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Description + * date: 2022/9/4 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT,classes = {Application.class}) +@Slf4j +public class CommonParseServiceTest { + + @Resource(name = "txtParseServiceImpl") + private CommonParseService txtParseServiceImpl; + + + @Resource(name = "jSONParseServiceImpl") + private CommonParseService jSONParseServiceImpl; + + @Resource(name = "excelParseServiceImpl") + private CommonParseService excelParseServiceImpl; + + + + @Test + public void testParseTxt(){ + FileDataSourceContext fileDataSourceContext = new FileDataSourceContext(); + + String url = "E:\\myspace2\\myspace\\data-factory\\start-local\\src\\test\\resources\\demodata\\userInfo.txt"; + fileDataSourceContext.setFileUrl(url); + fileDataSourceContext.setFileType(FileTypeEnum.TXT.getType()); + fileDataSourceContext.setSplitTag(","); + fileDataSourceContext.setDataSourceCode("com.snail.user.basinfo"); + fileDataSourceContext.setDataSourceName("轻蜗牛租房产品用户基本信息"); + fileDataSourceContext.setLoadCount(10); + fileDataSourceContext.setReadCount(8); + + + List fieldIndexList = new ArrayList<>(); + + fieldIndexList.add(new FieldIndex(1,"userName","String")); + fieldIndexList.add(new FieldIndex(2,"age","Integer")); + fieldIndexList.add(new FieldIndex(3,"city","String")); + fieldIndexList.add(new FieldIndex(4,"company","String")); + + fileDataSourceContext.setFieldIndexBOList(fieldIndexList); + + try { + List> mapList = txtParseServiceImpl.parseData(fileDataSourceContext); + mapList.stream().forEach(v-> log.info("map = {}", JSON.toJSONString(v))); + } catch (IOException e) { + throw new RuntimeException(e); + } catch (ParseException e) { + throw new RuntimeException(e); + } + + } + + + @Test + public void testParseJSON(){ + FileDataSourceContext fileDataSourceContext = new FileDataSourceContext(); + + String url = "E:\\myspace2\\myspace\\data-factory\\start-local\\src\\test\\resources\\demodata\\userInfojson.txt"; + fileDataSourceContext.setFileUrl(url); + fileDataSourceContext.setFileType(FileTypeEnum.JSON.getType()); + fileDataSourceContext.setDataSourceCode("com.snail.user.basinfo"); + fileDataSourceContext.setDataSourceName("轻蜗牛租房产品用户基本信息"); + fileDataSourceContext.setLoadCount(10); + fileDataSourceContext.setReadCount(8); + + + List fieldIndexList = new ArrayList<>(); + + fieldIndexList.add(new FieldIndex(1,"userName","String")); + fieldIndexList.add(new FieldIndex(2,"age","Integer")); + fieldIndexList.add(new FieldIndex(3,"city","String")); + fieldIndexList.add(new FieldIndex(4,"company","String")); + + fileDataSourceContext.setFieldIndexBOList(fieldIndexList); + + try { + List> mapList = jSONParseServiceImpl.parseData(fileDataSourceContext); + mapList.stream().forEach(v-> log.info("map = {}", JSON.toJSONString(v))); + } catch (IOException e) { + throw new RuntimeException(e); + } catch (ParseException e) { + throw new RuntimeException(e); + } + + } + + + + @Test + public void testParseExcel(){ + FileDataSourceContext fileDataSourceContext = new FileDataSourceContext(); + + String url = "E:\\myspace2\\myspace\\data-factory\\start-local\\src\\test\\resources\\demodata\\userInfo.xlsx"; + fileDataSourceContext.setFileUrl(url); + fileDataSourceContext.setFileType(FileTypeEnum.EXCEL.getType()); + fileDataSourceContext.setDataSourceCode("com.snail.user.basinfo"); + fileDataSourceContext.setDataSourceName("轻蜗牛租房产品用户基本信息"); + fileDataSourceContext.setLoadCount(10); + fileDataSourceContext.setReadCount(8); + + + List fieldIndexList = new ArrayList<>(); + + fieldIndexList.add(new FieldIndex(1,"userName","String")); + fieldIndexList.add(new FieldIndex(2,"age","Integer")); + fieldIndexList.add(new FieldIndex(3,"city","String")); + fieldIndexList.add(new FieldIndex(4,"company","String")); + + fileDataSourceContext.setFieldIndexBOList(fieldIndexList); + + try { + List> mapList = excelParseServiceImpl.parseData(fileDataSourceContext); + mapList.stream().forEach(v-> log.info("map = {}", JSON.toJSONString(v))); + } catch (IOException e) { + throw new RuntimeException(e); + } catch (ParseException e) { + throw new RuntimeException(e); + } + + } + + + + + @Test + public void generate(){ + for (int i =0;i< 11;i++){ + UserInfo userInfo = UserInfo.builder() + .userName("zhangsan"+i) + .age(i) + .city("北京市"+i) + .company("xxx公司"+i) + .id((long) i+1) + .build(); + log.info(JSON.toJSONString(userInfo)); + } + } + + + +} diff --git a/start-local/src/test/java/com/tianhua/datafactory/DataFactoryApiParamTest.java b/start-local/src/test/java/com/tianhua/datafactory/DataFactoryApiParamTest.java new file mode 100644 index 0000000000000000000000000000000000000000..0b9d5e9812d5da7748a026e96a75beec10f78a26 --- /dev/null +++ b/start-local/src/test/java/com/tianhua/datafactory/DataFactoryApiParamTest.java @@ -0,0 +1,162 @@ +package com.tianhua.datafactory; + +import com.alibaba.fastjson.JSON; +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.client.function.Function; +import com.tianhua.datafactory.core.service.DataFactoryService; +import com.tianhua.datafactory.domain.bo.datafactory.ApiMockBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Description + * date: 2022/8/29 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT,classes = {Application.class}) +@Slf4j +public class DataFactoryApiParamTest { + @Resource(name = "cardNumberFunction") + private Function cardNumberFunction; + + @Resource(name = "telPhoneFunc") + private Function telPhoneFunc; + + @Resource(name = "chineseNameFunc") + private Function chineseNameFunc; + + @Resource(name = "randomNumFunc") + private Function randomNumFunc; + + @Autowired + private DataFactoryService dataFactoryService; + + @Test + public void testDataFactoryApiRequestParam(){ + DataBuildRequestBO dataBuildRequestBO = new DataBuildRequestBO(); + dataBuildRequestBO.setBuildCount(10); + dataBuildRequestBO.setProjectCode("sdfasdf"); + dataBuildRequestBO.setApiSign(""); + + List fieldBOList = new ArrayList<>(); + + + + DataBuildRequestFieldBO dataBuildRequestFieldBO = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO.setFieldName("apiBO"); + dataBuildRequestFieldBO.setFieldType("ApiBO"); + String ruleDsl = "apiSign.relySourceCode=com.datafactory.user.chineseName;projectCode.relySourceCode=com.datafactory.user.getRandom(6)"; + dataBuildRequestFieldBO.setBuildRuleDSL(ruleDsl); + fieldBOList.add(dataBuildRequestFieldBO); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO2 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO2.setFieldName("validate"); + dataBuildRequestFieldBO2.setFieldType("Boolean"); + List list = new ArrayList<>(); + list.add(true); + dataBuildRequestFieldBO2.setDefaultValueList(list); + fieldBOList.add(dataBuildRequestFieldBO2); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO3 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO3.setFieldName("projectCode"); + dataBuildRequestFieldBO3.setFieldType("String"); + dataBuildRequestFieldBO3.setDataSourceCode("com.datafactory.user.chineseName"); + fieldBOList.add(dataBuildRequestFieldBO3); + + + + dataBuildRequestBO.setFieldBOList(fieldBOList); + + ResultDataDto>> result = null; + try { + long startTime = System.currentTimeMillis(); + result = dataFactoryService.generateDataApiReqParam(dataBuildRequestBO); + long endTime = System.currentTimeMillis(); + log.info("useTime = "+(endTime - startTime)+"ms,size = "+result.getData().size()); + for (Map map : result.getData()){ + log.info("apiBO = "+ JSON.toJSONString(map.get("apiBO"))); + log.info("validate = "+ JSON.toJSONString(map.get("validate"))); + log.info("projectCode = "+ JSON.toJSONString(map.get("projectCode"))); + } + + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + @Test + public void testDataFactoryApiResponseParam(){ + DataBuildRequestBO dataBuildRequestBO = new DataBuildRequestBO(); + dataBuildRequestBO.setBuildCount(10); + dataBuildRequestBO.setProjectCode("sdfasdf"); + dataBuildRequestBO.setApiSign(""); + + List fieldBOList = new ArrayList<>(); + + + + DataBuildRequestFieldBO dataBuildRequestFieldBO = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO.setFieldName("apiBO"); + dataBuildRequestFieldBO.setFieldType("ApiBO"); + String ruleDsl = "apiSign.relySourceCode=com.datafactory.user.chineseName;projectCode.relySourceCode=com.datafactory.user.getRandom(6)"; + dataBuildRequestFieldBO.setBuildRuleDSL(ruleDsl); + fieldBOList.add(dataBuildRequestFieldBO); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO2 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO2.setFieldName("validate"); + dataBuildRequestFieldBO2.setFieldType("Boolean"); + List list = new ArrayList<>(); + list.add(true); + dataBuildRequestFieldBO2.setDefaultValueList(list); + fieldBOList.add(dataBuildRequestFieldBO2); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO3 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO3.setFieldName("projectCode"); + dataBuildRequestFieldBO3.setFieldType("String"); + dataBuildRequestFieldBO3.setDataSourceCode("com.datafactory.user.chineseName"); + fieldBOList.add(dataBuildRequestFieldBO3); + + + + dataBuildRequestBO.setFieldBOList(fieldBOList); + + ResultDataDto>> result = null; + try { + long startTime = System.currentTimeMillis(); + String apiSign = ""; + ApiMockBO apiMockBO = new ApiMockBO(); + result = dataFactoryService.generateDataApiRespParam(apiMockBO); + long endTime = System.currentTimeMillis(); + log.info("useTime = "+(endTime - startTime)+"ms,size = "+result.getData().size()); + for (Map map : result.getData()){ + log.info("apiBO = "+ JSON.toJSONString(map.get("apiBO"))); + log.info("validate = "+ JSON.toJSONString(map.get("validate"))); + log.info("projectCode = "+ JSON.toJSONString(map.get("projectCode"))); + } + + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/start-local/src/test/java/com/tianhua/datafactory/DataFactoryTest.java b/start-local/src/test/java/com/tianhua/datafactory/DataFactoryTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ae39b8928707937e4aaccf0e4782787a39db822b --- /dev/null +++ b/start-local/src/test/java/com/tianhua/datafactory/DataFactoryTest.java @@ -0,0 +1,409 @@ +package com.tianhua.datafactory; + +import com.alibaba.fastjson.JSON; +import com.coderman.utils.response.ResultDataDto; +import com.tianhua.datafactory.client.function.Function; +import com.tianhua.datafactory.core.service.DataFactoryService; +import com.tianhua.datafactory.domain.bo.datafactory.ApiMockBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import lombok.extern.slf4j.Slf4j; +import org.assertj.core.util.Lists; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Description + * 数据工厂构建过程,整体测试内容 + * date: 2022/8/5 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT,classes = {Application.class}) +@Slf4j +public class DataFactoryTest { + @Autowired + private DataFactoryService dataFactoryService; + + @Resource(name = "cardNumberFunction") + private Function cardNumberFunction; + + @Resource(name = "telPhoneFunc") + private Function telPhoneFunc; + + @Resource(name = "chineseNameFunc") + private Function chineseNameFunc; + + @Resource(name = "randomNumFunc") + private Function randomNumFunc; + + @Test + public void testDataFactory3(){ + String dataSourceCode = "sdfasdf:ModelTypeEnum#type"; + DataBuildRequestFieldBO dataBuildRequestFieldBO = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO.setDataSourceType(3); + dataBuildRequestFieldBO.setDataSourceCode(dataSourceCode); + String result = dataFactoryService.buildData(dataBuildRequestFieldBO); + log.info("result = "+result); + } + @Test + public void testDataFactory4(){ + String dataSourceCode = "com.datafactory.user.cardnumber"; + DataBuildRequestFieldBO dataBuildRequestFieldBO = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO.setDataSourceType(4); + dataBuildRequestFieldBO.setDataSourceCode(dataSourceCode); + dataBuildRequestFieldBO.setFunction(cardNumberFunction); + String result = dataFactoryService.buildData(dataBuildRequestFieldBO); + log.info("result = "+result); + } + + + @Test + public void testDataFactory42(){ + String dataSourceCode = "com.datafactory.user.telphone"; + DataBuildRequestFieldBO dataBuildRequestFieldBO = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO.setDataSourceType(4); + dataBuildRequestFieldBO.setDataSourceCode(dataSourceCode); + dataBuildRequestFieldBO.setFunction(telPhoneFunc); + String result = dataFactoryService.buildData(dataBuildRequestFieldBO); + log.info("result = "+result); + } + @Test + public void testDataFactory2(){ + String dataSourceCode = "com.lightsnail.infosys.department#departName"; + DataBuildRequestFieldBO dataBuildRequestFieldBO = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO.setDataSourceType(2); + dataBuildRequestFieldBO.setDataSourceCode(dataSourceCode); + String result = dataFactoryService.buildData(dataBuildRequestFieldBO); + log.info("result = "+result); + } + + + @Test + public void testDataFactoryHugeCount(){ + DataBuildRequestBO dataBuildRequestBO = new DataBuildRequestBO(); + dataBuildRequestBO.setBuildCount(100000); + dataBuildRequestBO.setProjectCode("xxxx"); + dataBuildRequestBO.setParamModelCode("XxxModel"); + + List fieldBOList = new ArrayList<>(); + DataBuildRequestFieldBO dataBuildRequestFieldBO = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO.setDataSourceCode("com.datafactory.user.chineseName"); + dataBuildRequestFieldBO.setFieldName("chinseName"); + dataBuildRequestFieldBO.setFunction(chineseNameFunc); + dataBuildRequestFieldBO.setFieldType("String"); + fieldBOList.add(dataBuildRequestFieldBO); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO2 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO2.setDataSourceCode("com.datafactory.user.telphone"); + dataBuildRequestFieldBO2.setFieldName("handPhone"); + dataBuildRequestFieldBO2.setFunction(telPhoneFunc); + dataBuildRequestFieldBO2.setFieldType("String"); + fieldBOList.add(dataBuildRequestFieldBO2); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO3 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO3.setDataSourceCode("com.datafactory.user.cardnumber"); + dataBuildRequestFieldBO3.setFieldName("cardNumber"); + dataBuildRequestFieldBO3.setFunction(cardNumberFunction); + dataBuildRequestFieldBO3.setFieldType("String"); + fieldBOList.add(dataBuildRequestFieldBO3); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO4 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO4.setFieldName("userType"); + dataBuildRequestFieldBO4.setFieldType("Integer"); + dataBuildRequestFieldBO4.setDefaultValueList(Lists.newArrayList(1,2,3,4,5)); + fieldBOList.add(dataBuildRequestFieldBO4); + + DataBuildRequestFieldBO dataBuildRequestFieldBO5 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO5.setFieldName("userId"); + dataBuildRequestFieldBO5.setFieldType("Long"); + dataBuildRequestFieldBO5.setDataSourceCode("com.datafactory.user.getRandom"); + dataBuildRequestFieldBO5.setFunction(randomNumFunc); + fieldBOList.add(dataBuildRequestFieldBO5); + + + + + + + dataBuildRequestBO.setFieldBOList(fieldBOList); + + ResultDataDto>> result = null; + try { + for (int i =0;i< 10;i++){ + long startTime = System.currentTimeMillis(); + result = dataFactoryService.generateData(dataBuildRequestBO); + long endTime = System.currentTimeMillis(); + log.info("useTime = "+(endTime - startTime)+"ms,size = "+result.getData().size()); + } + + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + @Test + public void testDataFactoryFieldDSL(){ + DataBuildRequestBO dataBuildRequestBO = new DataBuildRequestBO(); + dataBuildRequestBO.setBuildCount(1); + dataBuildRequestBO.setProjectCode("sdfasdf"); + dataBuildRequestBO.setParamModelCode("XxxBO"); + + List fieldBOList = new ArrayList<>(); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO0 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO0.setDataSourceCode("com.datafactory.user.getRandom"); + dataBuildRequestFieldBO0.setFieldName("id"); + dataBuildRequestFieldBO0.setFunction(randomNumFunc); + dataBuildRequestFieldBO0.setFieldType("Long"); + String ruleDsl0 = "funcVar=6;"; + dataBuildRequestFieldBO0.setBuildRuleDSL(ruleDsl0); + fieldBOList.add(dataBuildRequestFieldBO0); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO.setDataSourceCode("com.datafactory.user.chineseName"); + dataBuildRequestFieldBO.setFieldName("chineseName"); + dataBuildRequestFieldBO.setFunction(chineseNameFunc); + dataBuildRequestFieldBO.setFieldType("String"); + String ruleDsl = "prefix=abc;subfix=bdff;"; + dataBuildRequestFieldBO.setBuildRuleDSL(ruleDsl); + fieldBOList.add(dataBuildRequestFieldBO); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO2 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO2.setFieldName("userIdList"); + dataBuildRequestFieldBO2.setFieldType("List"); + String ruleDsl2 = "defaultValues={1,2,3,4,5,6,7,8}"; + dataBuildRequestFieldBO2.setBuildRuleDSL(ruleDsl2); + fieldBOList.add(dataBuildRequestFieldBO2); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO3 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO3.setFieldName("departIdSet"); + dataBuildRequestFieldBO3.setFieldType("Set"); + String ruleDsl3 = "defaultValues={1,2,3,4,5,6,7,8}"; + dataBuildRequestFieldBO3.setBuildRuleDSL(ruleDsl3); + fieldBOList.add(dataBuildRequestFieldBO3); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO4 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO4.setFieldName("chineseNameV2"); + dataBuildRequestFieldBO4.setFieldType("String"); + String ruleDsl4 = "relyField=$chineseName;"; + dataBuildRequestFieldBO4.setBuildRuleDSL(ruleDsl4); + fieldBOList.add(dataBuildRequestFieldBO4); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO5 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO5.setFieldName("fieldBO"); + dataBuildRequestFieldBO5.setFieldType("FieldBO"); + String ruleDsl5 = "fieldName.dataSourceCode=com.datafactory.user.chineseName;paramClassName.dataSourceCode=com.datafactory.user.getRandom(6)"; + dataBuildRequestFieldBO5.setBuildRuleDSL(ruleDsl5); + fieldBOList.add(dataBuildRequestFieldBO5); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO6 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO6.setFieldName("xxxMapping"); + dataBuildRequestFieldBO6.setFieldType("Map"); + String ruleDsl6 = "relyKeyField={a,b,c,d};relyValueField={1,2,3,4,5,6,7}"; + dataBuildRequestFieldBO6.setBuildRuleDSL(ruleDsl6); + fieldBOList.add(dataBuildRequestFieldBO6); + + + dataBuildRequestBO.setFieldBOList(fieldBOList); + + ResultDataDto>> result = null; + try { + long startTime = System.currentTimeMillis(); + result = dataFactoryService.generateData(dataBuildRequestBO); + long endTime = System.currentTimeMillis(); + log.info("useTime = "+(endTime - startTime)+"ms,size = "+result.getData().size()); + for (Map map : result.getData()){ + log.info("id = "+JSON.toJSONString(map.get("id"))); + log.info("chineseName = "+JSON.toJSONString(map.get("chineseName"))); + + log.info("userIdList = "+JSON.toJSONString(map.get("userIdList"))); + log.info("departIdSet = "+JSON.toJSONString(map.get("departIdSet"))); + log.info("chineseNameV2 = "+JSON.toJSONString(map.get("chineseNameV2"))); + log.info("xxxMapping = "+JSON.toJSONString(map.get("xxxMapping"))); + } + + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + @Test + public void testDataFactoryDataSourceRefer(){ + DataBuildRequestBO dataBuildRequestBO = new DataBuildRequestBO(); + dataBuildRequestBO.setBuildCount(10); + dataBuildRequestBO.setProjectCode("sdfasdf"); + dataBuildRequestBO.setParamModelCode("XxxBO"); + + List fieldBOList = new ArrayList<>(); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO2 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO2.setFieldName("userIdList"); + dataBuildRequestFieldBO2.setFieldType("List"); + String ruleDsl2 = "defaultValues={1,2,3,4,5,6,7,8}"; + dataBuildRequestFieldBO2.setBuildRuleDSL(ruleDsl2); + fieldBOList.add(dataBuildRequestFieldBO2); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO3 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO3.setFieldName("departIdSet"); + dataBuildRequestFieldBO3.setFieldType("Set"); + String ruleDsl3 = "defaultValues={1,2,3,4,5,6,7,8}"; + dataBuildRequestFieldBO3.setBuildRuleDSL(ruleDsl3); + fieldBOList.add(dataBuildRequestFieldBO3); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO5 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO5.setFieldName("fieldBO"); + dataBuildRequestFieldBO5.setFieldType("List"); + String ruleDsl5 = "genCount=10;fieldName.dataSourceCode=com.datafactory.user.chineseName;paramClassName.dataSourceCode=com.datafactory.user.getRandom(6)"; + dataBuildRequestFieldBO5.setBuildRuleDSL(ruleDsl5); + fieldBOList.add(dataBuildRequestFieldBO5); + + + dataBuildRequestBO.setFieldBOList(fieldBOList); + + ResultDataDto>> result = null; + try { + long startTime = System.currentTimeMillis(); + result = dataFactoryService.generateData(dataBuildRequestBO); + long endTime = System.currentTimeMillis(); + log.info("useTime = "+(endTime - startTime)+"ms,size = "+result.getData().size()); + for (Map map : result.getData()){ + log.info("fieldBO = "+JSON.toJSONString(map.get("fieldBO"))); + } + + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + public void testDataFactory7(){ + DataBuildRequestBO dataBuildRequestBO = new DataBuildRequestBO(); + dataBuildRequestBO.setBuildCount(20000); + dataBuildRequestBO.setProjectCode("sdfasdf"); + dataBuildRequestBO.setParamModelCode("XxxBO"); + + List fieldBOList = new ArrayList<>(); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO2 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO2.setFieldName("userIdList"); + dataBuildRequestFieldBO2.setFieldType("List"); + String ruleDsl2 = "defaultValues={1,2,3,4,5,6,7,8}"; + dataBuildRequestFieldBO2.setBuildRuleDSL(ruleDsl2); + fieldBOList.add(dataBuildRequestFieldBO2); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO3 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO3.setFieldName("departIdSet"); + dataBuildRequestFieldBO3.setFieldType("Set"); + String ruleDsl3 = "defaultValues={1,2,3,4,5,6,7,8}"; + dataBuildRequestFieldBO3.setBuildRuleDSL(ruleDsl3); + fieldBOList.add(dataBuildRequestFieldBO3); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO5 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO5.setFieldName("apiBO"); + dataBuildRequestFieldBO5.setFieldType("ApiBO"); + String ruleDsl5 = "genCount=10;fieldName.dataSourceCode=com.datafactory.user.chineseName;paramClassName.dataSourceCode=com.datafactory.user.getRandom(6)"; + dataBuildRequestFieldBO5.setBuildRuleDSL(ruleDsl5); + fieldBOList.add(dataBuildRequestFieldBO5); + + dataBuildRequestBO.setFieldBOList(fieldBOList); + + ResultDataDto>> result = null; + try { + long startTime = System.currentTimeMillis(); + result = dataFactoryService.generateData(dataBuildRequestBO); + long endTime = System.currentTimeMillis(); + log.info("useTime = "+(endTime - startTime)+"ms,size = "+result.getData().size()); + + + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + @Test + public void testgenerateDataApiRespParam(){ + String apiSign = "sdfasdf:/api/pagelist.get.1"; + try { + ApiMockBO apiMockBO = new ApiMockBO(); + apiMockBO.setApiSign(apiSign); + ResultDataDto>> resultDataDto = dataFactoryService.generateDataApiRespParam(apiMockBO); + log.info("resultDataDto = {}",JSON.toJSONString(resultDataDto)); + + } catch (Exception e) { + throw new RuntimeException(e); + } + + + } + + /** + * 测试多层嵌套数据生成 + */ + @Test + public void testDataFactoryMultModel(){ + DataBuildRequestBO dataBuildRequestBO = new DataBuildRequestBO(); + dataBuildRequestBO.setBuildCount(20000); + dataBuildRequestBO.setProjectCode("sdfasdf"); + dataBuildRequestBO.setParamModelCode("XxxBO"); + + List fieldBOList = new ArrayList<>(); + + + DataBuildRequestFieldBO dataBuildRequestFieldBO5 = new DataBuildRequestFieldBO(); + dataBuildRequestFieldBO5.setFieldName("apiBO"); + dataBuildRequestFieldBO5.setFieldType("ApiBO"); + String ruleDsl5 = "projectCode.dataSourceCode=com.datafactory.user.chineseName;apiSign.dataSourceCode=com.datafactory.user.getRandom(6)"; + dataBuildRequestFieldBO5.setBuildRuleDSL(ruleDsl5); + fieldBOList.add(dataBuildRequestFieldBO5); + + dataBuildRequestBO.setFieldBOList(fieldBOList); + + ResultDataDto>> result = null; + try { + long startTime = System.currentTimeMillis(); + result = dataFactoryService.generateData(dataBuildRequestBO); + long endTime = System.currentTimeMillis(); + log.info("useTime = "+(endTime - startTime)+"ms,size = "+result.getData().size()); + /* for (Map map : result.getData()){ + log.info("apiBO = "+JSON.toJSONString(map.get("apiBO"))); + } +*/ + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + +} diff --git a/start-local/src/test/java/com/tianhua/datafactory/DataGenerateHttpApiServiceTest.java b/start-local/src/test/java/com/tianhua/datafactory/DataGenerateHttpApiServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ff78a757eef290e90b05af62f43e6d676ae37682 --- /dev/null +++ b/start-local/src/test/java/com/tianhua/datafactory/DataGenerateHttpApiServiceTest.java @@ -0,0 +1,81 @@ +package com.tianhua.datafactory; + +import com.tianhua.datafactory.core.service.DataGenerateService; +import com.tianhua.datafactory.domain.bo.datafactory.DataBuildRequestFieldBO; +import com.tianhua.datafactory.domain.bo.datafactory.DataSourceFieldRequestBean; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceBO; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceReqConfigBO; +import com.tianhua.datafactory.domain.bo.datasource.DataSourceRespConfigBO; +import com.tianhua.datafactory.domain.enums.ReturnTypeEnum; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.stereotype.Service; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * Description + * date: 2022/9/4 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT,classes = {Application.class}) +@Slf4j +public class DataGenerateHttpApiServiceTest { + + @Resource(name = "dataGenerateHttpApiServiceImpl") + private DataGenerateService dataGenerateService; + + + @Test + public void testGet(){ + + DataSourceFieldRequestBean dataSourceFieldRequestBean = new DataSourceFieldRequestBean(); + DataBuildRequestFieldBO dataBuildRequestFieldBO = new DataBuildRequestFieldBO<>(); + dataBuildRequestFieldBO.setFieldName("userName"); + dataBuildRequestFieldBO.setFieldType("String"); + dataBuildRequestFieldBO.setDataSourceCode("userService:com.snail.user.baseinfo"); + + DataSourceBO dataSourceBO = new DataSourceBO(); + dataSourceBO.setSourceCode("userService:com.snail.user.baseinfo"); + dataSourceBO.setProviderDomainUrl("http://127.0.0.1:8088"); + dataSourceBO.setUrl("/getlistobjectdtoparam"); + dataSourceBO.setProviderService("userService"); + dataSourceBO.setStructType(ReturnTypeEnum.RESULT_DTO.getType()); + + List dataSourceRespConfigList = new ArrayList<>(); + dataSourceRespConfigList.add(new DataSourceRespConfigBO("userName","String")); + dataSourceRespConfigList.add(new DataSourceRespConfigBO("country","String")); + dataSourceRespConfigList.add(new DataSourceRespConfigBO("age","Integer")); + dataSourceRespConfigList.add(new DataSourceRespConfigBO("aliasName","String")); + + dataSourceBO.setDataSourceRespConfigList(dataSourceRespConfigList); + + + List dataSourceReqConfigBOList = new ArrayList<>(); + dataSourceReqConfigBOList.add(new DataSourceReqConfigBO("page","2")); + dataSourceReqConfigBOList.add(new DataSourceReqConfigBO("pageSize","100")); + + dataSourceBO.setDataSourceReqConfigList(dataSourceReqConfigBOList); + + dataBuildRequestFieldBO.setDataSourceBO(dataSourceBO); + dataSourceFieldRequestBean.setDataBuildRequestFieldBO(dataBuildRequestFieldBO); + + try { + dataGenerateService.getRandomData(dataSourceFieldRequestBean); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } + +} diff --git a/start-local/src/test/java/com/tianhua/datafactory/DateTimeTest.java b/start-local/src/test/java/com/tianhua/datafactory/DateTimeTest.java new file mode 100644 index 0000000000000000000000000000000000000000..44acc58af1141fa4b55f5ed651e2baf4d8acd538 --- /dev/null +++ b/start-local/src/test/java/com/tianhua/datafactory/DateTimeTest.java @@ -0,0 +1,42 @@ +package com.tianhua.datafactory; + +import com.tianhua.datafactory.client.function.impl.DateTimeFunc; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Date; + +/** + * Description + * date: 2022/9/18 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT,classes = {Application.class}) +@Slf4j +public class DateTimeTest { + + @Resource + private DateTimeFunc dateTimeFunc; + + + @Test + public void testDateTime(){ + Date date = (Date) dateTimeFunc.createOneData(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//定义新的日期格式 + + String dateString = formatter.format(date); + log.info("dateString = {}",dateString); + } +} diff --git a/start-local/src/test/java/com/tianhua/datafactory/HttpApiAdaptorTest.java b/start-local/src/test/java/com/tianhua/datafactory/HttpApiAdaptorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..31e681654cb851b061d729091a06a5ca448d390c --- /dev/null +++ b/start-local/src/test/java/com/tianhua/datafactory/HttpApiAdaptorTest.java @@ -0,0 +1,49 @@ +package com.tianhua.datafactory; + +import com.alibaba.fastjson.JSON; +import com.tianhua.datafactory.core.adapter.HttpApiAdapter; +import com.tianhua.datafactory.domain.bo.HttpApiRequestBO; +import com.tianhua.datafactory.domain.enums.ReturnTypeEnum; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Description + * date: 2022/9/1 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT,classes = {Application.class}) +@Slf4j +public class HttpApiAdaptorTest { + @Resource(name = "httpApiAdaptorImpl") + private HttpApiAdapter httpApiAdapter; + + @Test + public void testHttpGetList(){ + String url = "http://127.0.0.1:8088/getlistobjectdto"; + + HttpApiRequestBO httpApiRequestBO = new HttpApiRequestBO(url); + httpApiRequestBO.setReturnType(ReturnTypeEnum.RESULT_DTO.getType()); + List paramFieldList = new ArrayList<>(); + paramFieldList.add("userName"); + paramFieldList.add("aliasName"); + paramFieldList.add("country"); + paramFieldList.add("age"); + httpApiRequestBO.setParamFieldList(paramFieldList); + List> resultList = httpApiAdapter.getServiceDataFromHttp(httpApiRequestBO); + System.out.println(JSON.toJSONString(resultList)); + } + +} diff --git a/start-local/src/test/java/com/tianhua/datafactory/JSONEnumTest.java b/start-local/src/test/java/com/tianhua/datafactory/JSONEnumTest.java new file mode 100644 index 0000000000000000000000000000000000000000..873d598602041941e73d5e270f31e1f6ca642cec --- /dev/null +++ b/start-local/src/test/java/com/tianhua/datafactory/JSONEnumTest.java @@ -0,0 +1,29 @@ +package com.tianhua.datafactory; + +import com.alibaba.fastjson.JSON; +import com.tianhua.datafactory.demomodel.UserInfo; +import com.tianhua.datafactory.domain.enums.ReturnTypeEnum; + +/** + * Description + * date: 2022/9/5 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class JSONEnumTest { + public static void main(String[] args) { + UserInfo userInfo = UserInfo.builder() + .id(1L).company("ssdsdsd") + .city("sdsd").age(12) + .userName("sdfsa").returnTypeEnum(ReturnTypeEnum.LIST_DTO).build(); + System.out.println(JSON.toJSONString(userInfo)); + + String x = "{\"age\":12,\"city\":\"sdsd\",\"company\":\"ssdsdsd\",\"id\":1,\"returnTypeEnum\":\"LIST_DTO\",\"userName\":\"sdfsa\"}"; + + UserInfo userInfo2 = JSON.parseObject(x,UserInfo.class); + System.out.println("type = "+userInfo2.getReturnTypeEnum().getType()); + + } +} diff --git a/start-local/src/test/java/com/tianhua/datafactory/demomodel/UserInfo.java b/start-local/src/test/java/com/tianhua/datafactory/demomodel/UserInfo.java new file mode 100644 index 0000000000000000000000000000000000000000..e97031d38b160c979b024c485794cf423c2be885 --- /dev/null +++ b/start-local/src/test/java/com/tianhua/datafactory/demomodel/UserInfo.java @@ -0,0 +1,27 @@ +package com.tianhua.datafactory.demomodel; + +import com.tianhua.datafactory.domain.enums.ReturnTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +/** + * Description + * date: 2022/9/4 + * + * @author shenshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Data +@Builder +@AllArgsConstructor +public class UserInfo { + private Long id; + private String userName; + private Integer age; + private String city; + private String company; + + private ReturnTypeEnum returnTypeEnum; +} diff --git a/start-local/src/test/resources/demodata/userInfo.txt b/start-local/src/test/resources/demodata/userInfo.txt new file mode 100644 index 0000000000000000000000000000000000000000..6999c4413f79d1d6216e4b56924bb7decccccfb0 --- /dev/null +++ b/start-local/src/test/resources/demodata/userInfo.txt @@ -0,0 +1,12 @@ +1,zhangsan2,29,北京市,xx公司 +2,zhangsan,27,北京市,xx研究院 +3,zhangsasn,35,北京市,xx公司 +4,zhangsan,22,北京市,xx公司 +5,zhangssan,53,北京市,xx大学 +6,zhangdsan,23,北京市,xx公司 +7,zhang3san,53,北京市,xx研究所 +8,zhangssan,23,北京市,xx公司 +9,zhan2wgsan,23,北京市,xx公司 +10,zhansdgsan,20,北京市,xx公司 +11,zhangsdsan,67,北京市,xx公司 +12,zhangsdsan,44,北京市,xx公司 \ No newline at end of file diff --git a/start-local/src/test/resources/demodata/userInfojson.txt b/start-local/src/test/resources/demodata/userInfojson.txt new file mode 100644 index 0000000000000000000000000000000000000000..36ad4731849ca5bf5d94a252baadc2414c585cba --- /dev/null +++ b/start-local/src/test/resources/demodata/userInfojson.txt @@ -0,0 +1,11 @@ +{"age":0,"city":"北京市0","company":"xxx公司0","id":1,"userName":"zhangsan0"} +{"age":1,"city":"北京市1","company":"xxx公司1","id":2,"userName":"zhangsan1"} +{"age":2,"city":"北京市2","company":"xxx公司2","id":3,"userName":"zhangsan2"} +{"age":3,"city":"北京市3","company":"xxx公司3","id":4,"userName":"zhangsan3"} +{"age":4,"city":"北京市4","company":"xxx公司4","id":5,"userName":"zhangsan4"} +{"age":5,"city":"北京市5","company":"xxx公司5","id":6,"userName":"zhangsan5"} +{"age":6,"city":"北京市6","company":"xxx公司6","id":7,"userName":"zhangsan6"} +{"age":7,"city":"北京市7","company":"xxx公司7","id":8,"userName":"zhangsan7"} +{"age":8,"city":"北京市8","company":"xxx公司8","id":9,"userName":"zhangsan8"} +{"age":9,"city":"北京市9","company":"xxx公司9","id":10,"userName":"zhangsan9"} +{"age":10,"city":"北京市10","company":"xxx公司10","id":11,"userName":"zhangsan10"} \ No newline at end of file diff --git a/start-local/src/test/resources/demodata/userinfo.xlsx b/start-local/src/test/resources/demodata/userinfo.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ade35a0a13dcf87c2dff2cb2f965ee1b5e32d3b4 Binary files /dev/null and b/start-local/src/test/resources/demodata/userinfo.xlsx differ diff --git a/todoList.txt b/todoList.txt deleted file mode 100644 index c83a20713483559968ab27a2ed1425a4edb06e01..0000000000000000000000000000000000000000 --- a/todoList.txt +++ /dev/null @@ -1,5 +0,0 @@ -1.支持dubbo服务数据源接入 -2.优化数据生成速度目前本地测(100条10个字段的模型大概2-3秒) -3.增加可视化界面配置 -4.返回sql,excel的数据文本 -5.实时数据生成(将生成的数据直接通过restTemplate调用远程接口插入) \ No newline at end of file diff --git a/webmanager/README.md b/webmanager/README.md new file mode 100644 index 0000000000000000000000000000000000000000..a911db2dc1ae1493d690e41faa848459e0fff489 --- /dev/null +++ b/webmanager/README.md @@ -0,0 +1,19 @@ +# amis admin 模板 + +基于 [amis](https://github.com/baidu/amis) 渲染器,快速搭建自己的管理系统。 + +## 快速开始 + +其实这个项目直接双击 `index.html` 都能看大部分效果,不过为了更完整体验,请运行下面的命令: + +```bash + +# 安装依赖 +npm i +# 打开服务 +npm start +``` + +## 部署上线 + +这个例子中的 amis 等依赖使用外部 cdn,为了稳定请在自己部署的时候将文件下载到本地。 \ No newline at end of file diff --git a/webmanager/index.html b/webmanager/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b13ef7ebb6f9198019d8797a713361b0afc27014 --- /dev/null +++ b/webmanager/index.html @@ -0,0 +1,216 @@ + + + + + amis admin + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/webmanager/nodemon.json b/webmanager/nodemon.json new file mode 100644 index 0000000000000000000000000000000000000000..367a5054ae8bc063aa29f387473e3cb94e43b300 --- /dev/null +++ b/webmanager/nodemon.json @@ -0,0 +1,4 @@ +{ + "verbose": true, + "ignore": ["node_modules/*"] +} diff --git a/webmanager/package.json b/webmanager/package.json new file mode 100644 index 0000000000000000000000000000000000000000..d25caa26867bbace81431f50254ebedf917a0c23 --- /dev/null +++ b/webmanager/package.json @@ -0,0 +1,27 @@ +{ + "name": "amis-boilerplate", + "version": "1.0.0", + "description": "基于 amis 的项目模板", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js", + "gh-pages": "rm -rf gh-pages && fis3 release gh-pages -c", + "deploy-gh-pages": "git subtree push --prefix gh-pages origin gh-pages" + }, + "keywords": [ + "amis", + "boilerplate", + "admin", + "react" + ], + "author": "fex", + "license": "MIT", + "devDependencies": { + "body-parser": "^1.19.0", + "express": "^4.17.1", + "morgan": "^1.10.0", + "nodemon": "^2.0.7", + "reload": "^3.1.1" + } +} diff --git a/webmanager/pages/api-edit.json b/webmanager/pages/api-edit.json new file mode 100644 index 0000000000000000000000000000000000000000..4409e49cadc18cdcb7d4aefc6b145d259eb345e5 --- /dev/null +++ b/webmanager/pages/api-edit.json @@ -0,0 +1,216 @@ +{ + "type": "page", + "title": "修改api信息", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/api/list", + "label": "返回列表" + } + ], + "body": [ + { + "type": "form", + "mode": "horizontal", + "redirect": "/api/list", + "api": "http://127.0.0.1:8090/api/update/${params.id}", + "initApi": "http://127.0.0.1:8090/api/getById/${params.id}", + "actions": [ + { + "type": "submit", + "label": "提交", + "primary": true + } + ], + "title": "修改api信息", + "body": [ + { + "type": "input-text", + "name": "apiUrl", + "label": "api请求路径(方法签名)", + "required": true + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "apiType", + "label": "api类型", + "required": true, + "searchable": true, + "source": "http://127.0.0.1:8090/dataEnum/apiType" + }, + + { + "type": "divider" + }, + { + "type": "input-text", + "name": "methodType", + "label": "api请求方式", + "required": true, + "options": [ + { + "label": "post", + "value": "post" + }, + { + "label": "get", + "value": "get" + }, + { + "label": "put", + "value": "put" + }, + { + "label": "delete", + "value": "delete" + }, + { + "label": "rpc-dubbo", + "value": "rpc-dubbo" + }, + { + "label": "rpc-grpc", + "value": "rpc-grpc" + }, + { + "label": "serviceInvoke", + "value": "serviceInvoke" + } + ] + + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "projectCode", + "label": "api所属项目编码", + "required": true, + "searchable": true, + "source": "http://127.0.0.1:8090/project/search?content=${projectCode}" + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "status", + "label": "状态", + "required": true, + "source": "http://127.0.0.1:8090/dataEnum/apiModelFieldStatus" + }, + { + "type": "divider" + }, + { + "type": "textarea", + "name": "apiDoc", + "label": "api文档", + "maxRows": 500, + "showCounter": true, + "required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "mockCount", + "label": "接口返回值mock数量" + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "apiReturnWrapType", + "label": "api返回包装类型", + "required": true, + "source": "http://127.0.0.1:8090/dataEnum/returnWrapClass" + }, + { + "type": "divider" + }, + { + "label": "入参列表", + "type": "input-table", + "name": "paramList", + "multiple": true, + "addable": true, + "editable": true, + "columns": [ + { + "name": "paramClassName", + "type": "input-text", + "label": "参数类型", + "source": "http://127.0.0.1:8090/dataEnum/javaFieldType" + + }, + { + "name": "paramVarName", + "type": "input-text", + "label": "参数变量名" + }, + { + "name": "dataSourceCode", + "type": "select", + "label": "数据源编码", + "autoComplete": "http://127.0.0.1:8090/datasource/search" + } + ] + }, + { + "type": "divider" + }, + { + "type": "group", + "label": "api出参信息", + "body": [ + { + "type": "input-text", + "name": "returnParam.paramClassName", + "label": "出参类型", + "required": true + }, + { + "type": "input-text", + "name": "returnParam.paramVarName", + "label": "出参变量名" + }, + { + "name": "returnParam.dataSourceCode", + "type": "select", + "label": "数据源编码", + "autoComplete": "http://127.0.0.1:8090/datasource/search" + } + ] + }, + { + "type": "divider" + }, + { + "type": "group", + "label": "api出参信息", + "body": [ + { + "type": "textarea", + "name": "returnParam.defaultValueList", + "label": "api出参默认值列表" + }, + { + "type": "textarea", + "name": "returnParam.buildRuleDSL", + "label": "api出参dsl配置" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/api-list.json b/webmanager/pages/api-list.json new file mode 100644 index 0000000000000000000000000000000000000000..e80fc770eebc91899e2f520ea77406a33a3be260 --- /dev/null +++ b/webmanager/pages/api-list.json @@ -0,0 +1,207 @@ +{ + "type": "page", + "title": "api管理", + "remark": null, + "name": "api", + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/api/new", + "label": "新增", + "primary": true + }, + { + "type": "button", + "label": "上传plantUML-API模型文档", + "primary": true, + "actionType": "dialog", + "dialog": { + "title": "构建领域模型", + "body": { + "type": "form", + "api": "http://127.0.0.1:8090/api/batchBuild", + "body": [ + { + "type": "select", + "name": "projectCode", + "required": true, + "placeholder": "请选择项目", + "label": "项目编码", + "source": "http://127.0.0.1:8090/project/search?content=${projectCode}" + }, + { + "type": "input-file", + "name": "file", + "label": "plantUML-领域模型文档", + "accept": ".puml", + "receiver": "http://127.0.0.1:8090/apidoc/upload" + } + ] + } + } + } + ], + "body": [ + { + "type": "crud", + "name": "sample", + "api": "http://127.0.0.1:8090/api/pagelist", + "perPage": 5, + "keepItemSelectionOnPageChange": true, + "maxKeepItemSelectionLength": 11, + "labelTpl": "${id} ${engine}", + "orderBy": "id", + "orderDir": "asc", + "autoGenerateFilter": true, + "filterTogglable": false, + "headerToolbar": [ + "filter-toggler", + "bulkActions", + { + "type": "tpl", + "tpl": "定制内容示例:当前有 ${count} 条数据。", + "className": "v-middle" + }, + { + "type": "columns-toggler", + "align": "right" + }, + { + "type": "drag-toggler", + "align": "right" + }, + { + "type": "pagination", + "align": "right" + } + ], + "footerToolbar": [ + "statistics", + "switch-per-page", + "pagination" + ], + "columns": [ + { + "name": "id", + "label": "ID", + "width": 20, + "sortable": true + }, + { + "type": "text", + "name": "apiType", + "label": "api类型", + "searchable": { + "type": "select", + "name": "apiType", + "placeholder": "选择api类型", + "source": "http://127.0.0.1:8090/dataEnum/apiType" + + } + }, + { + "type": "text", + "name": "projectCode", + "label": "api所属项目编码", + "searchable": { + "type": "input-text", + "name": "projectCode", + "placeholder": "输入项目编码", + "searchable": true, + "source": "http://127.0.0.1:8090/project/search?content=${projectCode}" + } + }, + { + "type": "text", + "name": "apiSign", + "label": "api签名", + "searchable": { + "type": "input-text", + "name": "apiSign", + "placeholder": "输入api签名" + } + }, + { + "type": "text", + "name": "statusDesc", + "label": "api状态", + "searchable": { + "type": "select", + "name": "status", + "placeholder": "选择状态", + "source": "http://127.0.0.1:8090/dataEnum/apiModelFieldStatus" + } + }, + { + "type": "text", + "name": "apiDoc", + "label": "api描述" + }, + { + "type": "text", + "name": "requestParamClasses", + "label": "请求参数列表" + }, + { + "type": "text", + "name": "returnParam.paramClassName", + "label": "返回参数类型" + }, + { + "type": "text", + "name": "apiReturnWrapTypeDesc", + "label": "api返回包装类型" + }, + { + "type": "text", + "name": "methodType", + "label": "api请求方式", + "searchable": { + "type": "select", + "name": "methodType", + "placeholder": "选择请求方式", + "source": "http://127.0.0.1:8090/dataEnum/methodType" + } + }, + { + "type": "operation", + "label": "操作", + "width": "", + "buttons": [ + { + "type": "button-group", + "buttons": [ + { + "type": "button", + "label": "查看", + "level": "primary", + "actionType": "link", + "link": "/api/${id}" + }, + { + "type": "button", + "label": "修改", + "level": "info", + "actionType": "link", + "link": "/api/${id}/edit" + } + ] + } + ], + "placeholder": "-", + "fixed": "right" + } + ], + "affixHeader": true, + "columnsTogglable": "auto", + "placeholder": "暂无数据", + "tableClassName": "table-db table-striped", + "headerClassName": "crud-table-header", + "footerClassName": "crud-table-footer", + "toolbarClassName": "crud-table-toolbar", + "combineNum": 0, + "bodyClassName": "panel-default" + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/api-new.json b/webmanager/pages/api-new.json new file mode 100644 index 0000000000000000000000000000000000000000..7c96817c4f6aa98ce99a7d865bdbe08e687e06c8 --- /dev/null +++ b/webmanager/pages/api-new.json @@ -0,0 +1,135 @@ +{ + "type": "page", + "title": "新增", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/api/list", + "label": "返回列表" + } + ], + "body": [ + { + "type": "form", + "mode": "horizontal", + "api": "http://127.0.0.1:8090/api/add", + "redirect": "/api/list", + + "actions": [ + { + "type": "submit", + "label": "提交", + "primary": true + } + ], + "collapsable": true, + "title": "", + "body": [ + { + "type": "input-text", + "name": "apiUrl", + "label": "api请求路径(方法签名)", + "required": true + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "apiType", + "label": "api类型", + "required": true, + "searchable": true, + "source": "http://127.0.0.1:8090/dataEnum/apiType" + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "methodType", + "label": "api请求方式", + "required": true, + "source": "http://127.0.0.1:8090/dataEnum/methodType" + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "projectCode", + "label": "api所属项目编码", + "required": true, + "searchable": true, + "source": "http://127.0.0.1:8090/project/search?content=${projectCode}" + }, + { + "type": "divider" + }, + { + "type": "textarea", + "name": "apiDoc", + "label": "api文档", + "maxRows": 500, + "showCounter": true, + "required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "mockCount", + "label": "接口返回值mock数量" + }, + + { + "type": "divider" + }, + { + "label": "入参列表", + "type": "input-table", + "name": "paramList", + "multiple": true, + "addable": true, + "editable": true, + "columns": [ + { + "name": "paramClassName", + "type": "input-text", + "label": "参数类型", + "source": "http://127.0.0.1:8090/dataEnum/javaFieldType" + }, + { + "name": "paramVarName", + "type": "input-text", + "label": "参数变量名" + } + ] + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "apiReturnWrapType", + "label": "api出参包装类型", + "required": true, + "source": "http://127.0.0.1:8090/dataEnum/returnWrapClass" + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "returnParamClass", + "label": "api出参", + "required": true + } + + ] + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/api-view.json b/webmanager/pages/api-view.json new file mode 100644 index 0000000000000000000000000000000000000000..366005dffef9bb47ccadde2afc74a0ba1d0044a7 --- /dev/null +++ b/webmanager/pages/api-view.json @@ -0,0 +1,133 @@ +{ + "type": "page", + "title": "查看api详情${params.id}", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/api/list", + "label": "返回列表" + } + ], + "body": [ + { + "type": "page", + "initApi": "http://127.0.0.1:8090/api/getById/${params.id}", + "controls": [ + { + "type": "static", + "name": "apiUrl", + "label": "api请求路径(方法签名)" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "apiType", + "label": "api类型" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "methodType", + "label": "api请求方式" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "projectCode", + "label": "api所属项目编码" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "apiDoc", + "label": "api文档" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "mockCount", + "label": "接口返回值mock数量" + }, + { + "type": "divider" + }, + { + "label": "入参列表", + "type": "input-table", + "name": "paramList", + "multiple": false, + "addable": false, + "editable": false, + "columns": [ + { + "name": "paramClassName", + "type": "text", + "label": "参数类名" + }, + { + "name": "paramVarName", + "type": "text", + "label": "参数变量名" + } + ] + }, + { + "type": "divider" + }, + { + "type": "group", + "label": "api出参信息", + "body": [ + { + "type": "static", + "name": "returnParam.paramClassName", + "label": "出参类型" + }, + { + "type": "static", + "name": "returnParam.paramVarName", + "label": "出参变量名" + }, + { + "name": "returnParam.dataSourceCode", + "type": "static", + "label": "数据源编码" + } + ] + }, + { + "type": "divider" + }, + { + "type": "group", + "label": "api出参信息", + "body": [ + { + "type": "static", + "name": "returnParam.defaultValueList", + "label": "api出参默认值列表" + }, + { + "type": "static", + "name": "returnParam.buildRuleDSL", + "label": "api出参dsl配置" + } + ] + } + + ] + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/apirespmock.json b/webmanager/pages/apirespmock.json new file mode 100644 index 0000000000000000000000000000000000000000..217d3ff2062f435baf3b426744c226b414c63c3f --- /dev/null +++ b/webmanager/pages/apirespmock.json @@ -0,0 +1,58 @@ +{ + "type": "page", + "title": "接口入参mock", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/index/1", + "label": "返回列表" + } + ], + "body": [ + { + "type": "form", + "mode": "horizontal", + "api": "http://127.0.0.1:8090/api/respmock", + "actions": [ + { + "type": "submit", + "label": "提交", + "primary": true + } + ], + "collapsable": true, + "title": "", + "body": [ + { + "type": "select", + "name": "projectCode", + "label": "所属项目编码", + "required": true, + "searchable": true, + "source": "http://127.0.0.1:8090/project/search?content=${projectCode}" + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "apiSign", + "label": "Api签名", + "source": "http://127.0.0.1:8090/api/searchApiSign?projectCode=${projectCode}", + "required": false + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "mockResultData", + "visibleOn": "typeof data.mockResultData !== 'undefined'", + "label": "数据mock结果" + } + ] + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/datasource-edit.json b/webmanager/pages/datasource-edit.json new file mode 100644 index 0000000000000000000000000000000000000000..a4e4712d0c9085df8fdefc565ed7c0e7c1f7b48c --- /dev/null +++ b/webmanager/pages/datasource-edit.json @@ -0,0 +1,261 @@ +{ + "type": "page", + "title": "新增", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/datasource/list", + "label": "返回列表" + } + ], + "body": [{ + "type": "form", + "mode": "horizontal", + "redirect": "/datasource/list", + "initApi": "http://127.0.0.1:8090/datasource/getById/${params.id}", + "api": "http://127.0.0.1:8090/datasource/update/${params.id}", + "actions": [{ + "type": "submit", + "label": "提交", + "primary": true + }], + "collapsable": true, + "title": "", + "body": [ + { + "type": "input-text", + "name": "sourceName", + "label": "数据源名称", + "required": true + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "sourceCode", + "label": "数据源编码", + "required": true + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "status", + "label": "状态", + "required": true, + "source": "http://127.0.0.1:8090/dataEnum/apiModelFieldStatus" + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "visitStrategy", + "label": "数据源访问策略", + "required": true, + "source": "http://127.0.0.1:8090/dataEnum/visiteStrategy" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "providerService", + "label": "数据源所属服务", + "required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "providerDomainUrl", + "label": "服务提供者域名", + "value": "", + "required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "url", + "label": "数据源访问URL" + ,"required": true + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "sourceType", + "label": "数据源类型", + "required": true, + "source": "http://127.0.0.1:8090/dataEnum/dataSourceType" + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "structType", + "label": "数据源接口返回格式", + "source": "http://127.0.0.1:8090/dataEnum/returnType" + }, + { + "type": "divider" + }, + { + "label": "数据源请求参数配置", + "type": "input-table", + "name": "dataSourceReqConfigList", + "multiple": true, + "addable": true, + "editable": true, + "removable": true, + "columns": [ + { + "name": "paramKey", + "type": "input-text", + "label": "参数属性key" + }, + { + "name": "paramValue", + "type": "input-text", + "label": "参数值" + }, + { + "name": "paramDesc", + "type": "input-text", + "label": "参数描述" + }, + { + "name": "required", + "type": "select", + "label": "是否必填", + "options": [ + { + "label": "true", + "value": "true" + }, + { + "label": "false", + "value": "false" + } + ] + } + , + { + "name": "interfaceParam", + "type": "select", + "label": "是否是请求接口参数", + "options": [ + { + "label": "true", + "value": "true" + }, + { + "label": "false", + "value": "false" + } + ] + } + ] + }, + { + "type": "divider" + }, + { + "label": "数据源响应参数配置", + "type": "input-table", + "name": "dataSourceRespConfigList", + "multiple": true, + "addable": true, + "editable": true, + "removable": true, + "columns": [ + { + "name": "fieldKey", + "type": "input-text", + "label": "参数属性key" + }, + { + "name": "referPath", + "type": "input-text", + "label": "引用路径" + }, + { + "name": "fieldDesc", + "type": "input-text", + "label": "数据描述描述" + }, + { + "name": "fieldType", + "type": "select", + "label": "数据类型", + "options": [ + { + "label": "String", + "value": "String" + }, + { + "label": "Integer", + "value": "Integer" + }, + { + "label": "Integer", + "value": "Integer" + }, + { + "label": "Boolean", + "value": "Boolean" + }, + { + "label": "Long", + "value": "Long" + } + ] + + } + ] + }, + { + "type": "divider" + }, + { + "label": "数据kv列表", + "type": "input-table", + "name": "kvPairList", + "multiple": true, + "addable": true, + "editable": true, + "columns": [ + { + "name": "key", + "type": "input-text", + "label": "数据key" + }, + { + "name": "value", + "type": "input-text", + "label": "数据value" + }, + { + "name": "groupKey", + "type": "input-text", + "label": "数据所属分组" + }, + { + "name": "parentKey", + "type": "input-text", + "label": "数据父类key" + } + ] + } + ] + }] +} \ No newline at end of file diff --git a/webmanager/pages/datasource-list.json b/webmanager/pages/datasource-list.json new file mode 100644 index 0000000000000000000000000000000000000000..6ad946c66a6b12789d230ce8724c2c9ea4d7dfc6 --- /dev/null +++ b/webmanager/pages/datasource-list.json @@ -0,0 +1,160 @@ +{ + "type": "page", + "title": "数据源管理", + "remark": null, + "name": "api", + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/datasource/new", + "label": "新增", + "primary": true + } + ], + "body": [ + { + "type": "crud", + "name": "sample", + "api": "http://127.0.0.1:8090/datasource/pagelist", + "perPage": 5, + "keepItemSelectionOnPageChange": true, + "maxKeepItemSelectionLength": 11, + "labelTpl": "${id} ${engine}", + "orderBy": "id", + "orderDir": "asc", + "autoGenerateFilter": true, + "filterTogglable": false, + "headerToolbar": [ + "filter-toggler", + "bulkActions", + { + "type": "tpl", + "tpl": "定制内容示例:当前有 ${count} 条数据。", + "className": "v-middle" + }, + { + "type": "columns-toggler", + "align": "right" + }, + { + "type": "drag-toggler", + "align": "right" + }, + { + "type": "pagination", + "align": "right" + } + ], + "footerToolbar": [ + "statistics", + "switch-per-page", + "pagination" + ], + "columns": [ + { + "name": "id", + "label": "ID", + "width": 20, + "sortable": true + }, + { + "type": "text", + "name": "sourceName", + "label": "数据源名称", + "searchable": { + "type": "input-text", + "name": "sourceName", + "placeholder": "输入数据源名称" + } + }, + { + "type": "text", + "name": "sourceCode", + "label": "数据源编码", + "searchable": { + "type": "input-text", + "name": "sourceCode", + "placeholder": "输入数据源编码" + } + }, + { + "type": "text", + "name": "statusDesc", + "label": "api状态", + "searchable": { + "type": "select", + "name": "status", + "placeholder": "选择状态", + "source": "http://127.0.0.1:8090/dataEnum/apiModelFieldStatus" + } + }, + { + "type": "text", + "name": "providerService", + "label": "数据源所属服务", + "searchable": { + "type": "input-text", + "name": "providerService", + "placeholder": "输入服务名称" + } + }, + { + "type": "text", + "name": "sourceTypeDesc", + "label": "数据源类型" + }, + { + "type": "text", + "name": "visitStrategyDesc", + "label": "访问策略", + "searchable": { + "type": "select", + "name": "visitStrategy", + "placeholder": "选择访问策略", + "source": "http://127.0.0.1:8090/dataEnum/visiteStrategy" + + } + }, + + { + "type": "operation", + "label": "操作", + "width": "", + "buttons": [ + { + "type": "button-group", + "buttons": [ + { + "type": "button", + "label": "查看", + "level": "primary", + "actionType": "link", + "link": "/datasource/${id}" + }, + { + "type": "button", + "label": "修改", + "level": "info", + "actionType": "link", + "link": "/datasource/${id}/edit" + } + ] + } + ], + "placeholder": "-", + "fixed": "right" + } + ], + "affixHeader": true, + "columnsTogglable": "auto", + "placeholder": "暂无数据", + "tableClassName": "table-db table-striped", + "headerClassName": "crud-table-header", + "footerClassName": "crud-table-footer", + "toolbarClassName": "crud-table-toolbar", + "combineNum": 0, + "bodyClassName": "panel-default" + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/datasource-new.json b/webmanager/pages/datasource-new.json new file mode 100644 index 0000000000000000000000000000000000000000..491f0549e06bb8730c0b83686d72ce8fbd584f7e --- /dev/null +++ b/webmanager/pages/datasource-new.json @@ -0,0 +1,253 @@ +{ + "type": "page", + "title": "新增", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/datasource/list", + "label": "返回列表" + } + ], + "body": [{ + "type": "form", + "mode": "horizontal", + "redirect": "/datasource/list", + "api": "http://127.0.0.1:8090/datasource/regist", + "actions": [{ + "type": "submit", + "label": "提交", + "primary": true + }], + "collapsable": true, + "title": "", + "body": [ + { + "type": "input-text", + "name": "sourceName", + "label": "数据源名称", + "required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "sourceCode", + "label": "数据源编码", + "required": true + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "visitStrategy", + "label": "数据源访问策略", + "required": true, + "source": "http://127.0.0.1:8090/dataEnum/visiteStrategy" + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "providerService", + "label": "数据源所属服务", + "required": true + }, + { + "type": "input-text", + "name": "providerDomainUrl", + "label": "服务提供者域名", + "value": "", + "required": true + }, + { + "type": "select", + "name": "registServer", + "label": "服务注册中心类型", + "source": "http://127.0.0.1:8090/dataEnum/registServer" + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "url", + "label": "数据源接口", + "required": true + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "sourceType", + "label": "数据源类型", + "required": true, + "source": "http://127.0.0.1:8090/dataEnum/dataSourceType" + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "structType", + "label": "数据源接口返回格式", + "source": "http://127.0.0.1:8090/dataEnum/returnType" + }, + { + "type": "divider" + }, + { + "label": "数据源请求参数配置", + "type": "input-table", + "name": "dataSourceReqConfigList", + "multiple": true, + "addable": true, + "editable": true, + "removable": true, + "columns": [ + { + "name": "paramKey", + "type": "input-text", + "label": "参数属性key" + }, + { + "name": "paramValue", + "type": "input-text", + "label": "参数值" + }, + { + "name": "paramDesc", + "type": "input-text", + "label": "参数描述" + }, + { + "name": "required", + "type": "select", + "label": "是否必填", + "options": [ + { + "label": "true", + "value": "true" + }, + { + "label": "false", + "value": "false" + } + ] + } + , + { + "name": "interfaceParam", + "type": "select", + "label": "是否是请求接口参数", + "options": [ + { + "label": "true", + "value": "true" + }, + { + "label": "false", + "value": "false" + } + ] + } + ] + }, + { + "type": "divider" + }, + { + "label": "数据源响应参数配置", + "type": "input-table", + "name": "dataSourceRespConfigList", + "multiple": true, + "addable": true, + "editable": true, + "columns": [ + { + "name": "fieldKey", + "type": "input-text", + "label": "参数属性key" + }, + { + "name": "referPath", + "type": "input-text", + "label": "引用路径" + }, + { + "name": "fieldDesc", + "type": "input-text", + "label": "数据描述描述" + }, + { + "name": "fieldType", + "type": "select", + "label": "数据类型", + "options": [ + { + "label": "String", + "value": "String" + }, + { + "label": "Integer", + "value": "Integer" + }, + { + "label": "Integer", + "value": "Integer" + }, + { + "label": "Boolean", + "value": "Boolean" + }, + { + "label": "Long", + "value": "Long" + } + ] + + } + ] + }, + + { + "type": "divider" + }, + { + "label": "数据kv列表", + "type": "input-table", + "name": "kvPairList", + "multiple": true, + "addable": true, + "editable": true, + "columns": [ + { + "name": "key", + "type": "input-text", + "label": "数据key" + }, + { + "name": "value", + "type": "input-text", + "label": "数据value" + }, + { + "name": "groupKey", + "type": "input-text", + "label": "数据所属分组" + }, + { + "name": "parentKey", + "type": "input-text", + "label": "数据父类key" + } + ] + } + ] + }] +} \ No newline at end of file diff --git a/webmanager/pages/datasource-view.json b/webmanager/pages/datasource-view.json new file mode 100644 index 0000000000000000000000000000000000000000..14fd2e7e5dfeddff581317f7ccd496d40dd16e3e --- /dev/null +++ b/webmanager/pages/datasource-view.json @@ -0,0 +1,181 @@ +{ + "type": "page", + "title": "查看详情", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/datasource/list", + "label": "返回列表" + } + ], + "body": [{ + "type": "page", + "mode": "horizontal", + "redirect": "/datasource/list", + "initApi": "http://127.0.0.1:8090/datasource/getById/${params.id}", + "collapsable": true, + "title": "", + "body": [ + { + "type": "static", + "name": "sourceName", + "label": "数据源名称" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "sourceCode", + "label": "数据源编码" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "statusDesc", + "label": "状态" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "visitStrategyDesc", + "label": "数据源访问策略" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "providerService", + "label": "数据源所属服务" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "url", + "label": "数据源访问URL" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "sourceTypeDesc", + "label": "数据源类型" + }, + { + "type": "divider" + }, + { + "label": "数据源请求参数配置", + "type": "input-table", + "name": "dataSourceReqConfigList", + "multiple": false, + "addable": false, + "editable": false, + "columns": [ + { + "name": "paramKey", + "type": "static", + "label": "参数属性key" + }, + { + "name": "paramValue", + "type": "static", + "label": "参数值" + }, + { + "name": "paramDesc", + "type": "static", + "label": "参数描述" + }, + { + "name": "required", + "type": "static", + "label": "是否必填" + } + , + { + "name": "interfaceParam", + "type": "static", + "label": "是否是请求接口参数" + } + ] + }, + { + "type": "divider" + }, + { + "label": "数据源响应参数配置", + "type": "input-table", + "name": "dataSourceRespConfigList", + "multiple": false, + "addable": false, + "editable": false, + "columns": [ + { + "name": "fieldKey", + "type": "static", + "label": "参数属性key" + }, + { + "name": "referPath", + "type": "static", + "label": "引用路径" + }, + { + "name": "fieldDesc", + "type": "static", + "label": "数据描述描述" + }, + { + "name": "fieldType", + "type": "static", + "label": "数据类型" + } + ] + }, + { + "type": "divider" + }, + { + "label": "数据kv列表", + "type": "input-table", + "name": "kvPairList", + "multiple": true, + "addable": true, + "editable": true, + "columns": [ + { + "name": "key", + "type": "static", + "label": "数据key" + }, + { + "name": "value", + "type": "static", + "label": "数据value" + }, + { + "name": "groupKey", + "type": "static", + "label": "数据所属分组" + }, + { + "name": "parentKey", + "type": "static", + "label": "数据父类key" + } + ] + } + ] + }] +} \ No newline at end of file diff --git a/webmanager/pages/jsonp.js b/webmanager/pages/jsonp.js new file mode 100644 index 0000000000000000000000000000000000000000..9612fb8872ab28ff13ca192b8b9bf3f7ab6a4761 --- /dev/null +++ b/webmanager/pages/jsonp.js @@ -0,0 +1,12 @@ +(function() { + const response = { + data: { + type: "page", + title: "标题", + body: "this result is from jsonp" + }, + status: 0 + } + + window.jsonpCallback && window.jsonpCallback(response); +})(); diff --git a/webmanager/pages/modelmapping-list.json b/webmanager/pages/modelmapping-list.json new file mode 100644 index 0000000000000000000000000000000000000000..c0fb2843d3f1e1a0399e346eae48e795eb551eb3 --- /dev/null +++ b/webmanager/pages/modelmapping-list.json @@ -0,0 +1,180 @@ +{ + "type": "page", + "title": "模型映射配置", + "remark": null, + "name": "api", + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/modelmapping/new", + "label": "新增", + "primary": true + }, + { + "type": "button", + "label": "模型快捷映射", + "primary": true, + "actionType": "dialog", + "dialog": { + "title": "模型映射配置", + "body": { + "type": "form", + "api": "http://127.0.0.1:8090/modelmapping/fast", + "body": [ + { + "type": "input-text", + "name": "projectCode", + "required": true, + "placeholder": "请选择项目", + "label": "项目编码", + "searchable": true, + "source": "http://127.0.0.1:8090/project/search?content=${projectCode}" + }, + { + "type": "select", + "name": "mappingClassFirst", + "label": "选择模型名称-1", + "required": true, + "source": "http://127.0.0.1:8090/parammodel/getByProjectCode?projectCode=${projectCode}" + }, + { + "type": "select", + "name": "mappingClassSecond", + "label": "选择模型名称-2", + "required": true, + "source": "http://127.0.0.1:8090/parammodel/getByProjectCode?projectCode=${projectCode}" + } + ] + } + } + } + ], + "body": [ + { + "type": "crud", + "name": "sample", + "api": "http://127.0.0.1:8090/modelmapping/pagelist", + "perPage": 5, + "keepItemSelectionOnPageChange": true, + "maxKeepItemSelectionLength": 11, + "labelTpl": "${id} ${engine}", + "orderBy": "id", + "orderDir": "asc", + "autoGenerateFilter": true, + "filterTogglable": false, + "headerToolbar": [ + "filter-toggler", + "bulkActions", + { + "type": "tpl", + "tpl": "定制内容示例:当前有 ${count} 条数据。", + "className": "v-middle" + }, + { + "type": "columns-toggler", + "align": "right" + }, + { + "type": "drag-toggler", + "align": "right" + }, + { + "type": "pagination", + "align": "right" + } + ], + "footerToolbar": [ + "statistics", + "switch-per-page", + "pagination" + ], + "columns": [ + { + "name": "id", + "label": "ID", + "width": 20, + "sortable": true + }, + { + "type": "text", + "name": "projectCode", + "label": "项目编码", + "searchable": { + "type": "input-text", + "name": "projectCode", + "placeholder": "输入项目编码", + "searchable": true, + "source": "http://127.0.0.1:8090/project/search?content=${projectCode}" + } + }, + { + "type": "text", + "name": "mappingClassFirst", + "label": "模型映射名称/表名称-1", + "searchable": { + "type": "input-text", + "name": "mappingClass", + "placeholder": "输入模型或者表名称" + } + }, + { + "type": "text", + "name": "mappingFieldFirst", + "label": "模型属性名称/字段名-1" + }, + { + "type": "text", + "name": "mappingClassSecond", + "label": "模型映射名称/表名称-2" + }, + { + "type": "text", + "name": "mappingFieldSecond", + "label": "模型属性名称/字段名-2" + }, + { + "type": "text", + "name": "mappingType", + "label": "映射类型", + "searchable": { + "type": "select", + "name": "mappingType", + "placeholder": "选择请求方式", + "source": "http://127.0.0.1:8090/dataEnum/modelValueMapping" + } + }, + { + "type": "operation", + "label": "操作", + "width": "", + "buttons": [ + { + "type": "button-group", + "buttons": [ + { + "type": "button", + "label": "修改", + "level": "info", + "actionType": "link", + "link": "/modelmapping/${id}/edit" + } + ] + } + ], + "placeholder": "-", + "fixed": "right" + } + ], + "affixHeader": true, + "columnsTogglable": "auto", + "placeholder": "暂无数据", + "tableClassName": "table-db table-striped", + "headerClassName": "crud-table-header", + "footerClassName": "crud-table-footer", + "toolbarClassName": "crud-table-toolbar", + "combineNum": 0, + "bodyClassName": "panel-default" + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/modelmapping-new.json b/webmanager/pages/modelmapping-new.json new file mode 100644 index 0000000000000000000000000000000000000000..cb95298b1765a9780a637eb670af454ec3aa0186 --- /dev/null +++ b/webmanager/pages/modelmapping-new.json @@ -0,0 +1,87 @@ +{ + "type": "page", + "title": "新增", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/modelmapping/list", + "label": "返回列表" + } + ], + "body": [{ + "type": "form", + "mode": "horizontal", + "redirect": "/modelmapping/list", + "api": "http://127.0.0.1:8090/modelmapping/add", + "actions": [{ + "type": "submit", + "label": "提交", + "primary": true + }], + "collapsable": true, + "title": "", + "body": [ + { + "type": "input-text", + "name": "projectCode", + "label": "项目编码", + "required": true, + "searchable": true, + "source": "http://127.0.0.1:8090/project/search?content=${projectCode}" + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "mappingClassFirst", + "label": "模型映射类名称/表名称", + "required": true, + "source": "http://127.0.0.1:8090/parammodel/getByProjectCode?projectCode=${projectCode}" + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "mappingFieldFirst", + "label": "模型属性名称(或者字段名)", + "required": true, + "source": "http://127.0.0.1:8090/parammodel/getFieldListV3?projectCode=${projectCode}¶mClassName=${mappingClassFirst}" + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "mappingClassSecond", + "label": "模型映射类名称/表名称", + "required": true, + "source": "http://127.0.0.1:8090/parammodel/getByProjectCode?projectCode=${projectCode}" + + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "mappingFieldSecond", + "label": "模型属性名称(或者字段名)", + "required": true, + "source": "http://127.0.0.1:8090/parammodel/getFieldListV3?projectCode=${projectCode}¶mClassName=${mappingClassSecond}" + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "mappingType", + "label": "映射类型", + "required": true, + "source": "http://127.0.0.1:8090/dataEnum/modelValueMapping" + } + ] + }] +} \ No newline at end of file diff --git a/webmanager/pages/modelsuffix-edit.json b/webmanager/pages/modelsuffix-edit.json new file mode 100644 index 0000000000000000000000000000000000000000..865c2451f6a7d9b8a6046751842fc30818595489 --- /dev/null +++ b/webmanager/pages/modelsuffix-edit.json @@ -0,0 +1,54 @@ +{ + "type": "page", + "title": "新增", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/modelsuffix/list", + "label": "返回列表" + } + ], + "body": [{ + "type": "form", + "mode": "horizontal", + "redirect": "/modelsuffix/list", + "initApi": "http://127.0.0.1:8090/modelsuffix/getById/${params.id}", + "api": "http://127.0.0.1:8090/modelsuffix/update/${params.id}", + "actions": [{ + "type": "submit", + "label": "提交", + "primary": true + }], + "collapsable": true, + "title": "", + "body": [ + { + "type": "input-text", + "name": "suffix", + "label": "模型后缀", + "required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "desc", + "label": "模型后缀描述", + "required": true + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "modelType", + "label": "模型类型", + "required": true, + "source": "http://127.0.0.1:8090/dataEnum/modelType" + } + ] + }] +} \ No newline at end of file diff --git a/webmanager/pages/modelsuffix-list.json b/webmanager/pages/modelsuffix-list.json new file mode 100644 index 0000000000000000000000000000000000000000..0d31c30576c7eefe0711cfb4883c39cc51a47730 --- /dev/null +++ b/webmanager/pages/modelsuffix-list.json @@ -0,0 +1,80 @@ +{ + "type": "page", + "title": "模型后缀配置", + "remark": null, + "name": "api", + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/modelsuffix/new", + "label": "新增", + "primary": true + } + ], + "body": [ + { + "type": "crud", + "name": "sample", + "api": "http://127.0.0.1:8090/modelsuffix/list", + "perPage": 5, + "keepItemSelectionOnPageChange": true, + "maxKeepItemSelectionLength": 11, + "labelTpl": "${id} ${engine}", + "orderBy": "id", + "columns": [ + { + "name": "id", + "label": "ID", + "width": 20, + "sortable": true + }, + { + "type": "text", + "name": "suffix", + "label": "模型后缀" + }, + { + "type": "text", + "name": "desc", + "label": "模型后缀描述" + }, + { + "type": "text", + "name": "modelType", + "label": "模型类型" + }, + { + "type": "operation", + "label": "操作", + "width": "", + "buttons": [ + { + "type": "button-group", + "buttons": [ + { + "type": "button", + "label": "修改", + "level": "info", + "actionType": "link", + "link": "/modelsuffix/${id}/edit" + } + ] + } + ], + "placeholder": "-", + "fixed": "right" + } + ], + "affixHeader": true, + "columnsTogglable": "auto", + "placeholder": "暂无数据", + "tableClassName": "table-db table-striped", + "headerClassName": "crud-table-header", + "footerClassName": "crud-table-footer", + "toolbarClassName": "crud-table-toolbar", + "combineNum": 0, + "bodyClassName": "panel-default" + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/modelsuffix-new.json b/webmanager/pages/modelsuffix-new.json new file mode 100644 index 0000000000000000000000000000000000000000..7380224c8e9e987c7021d1df79f86fdbb76649aa --- /dev/null +++ b/webmanager/pages/modelsuffix-new.json @@ -0,0 +1,53 @@ +{ + "type": "page", + "title": "新增", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/modelsuffix/list", + "label": "返回列表" + } + ], + "body": [{ + "type": "form", + "mode": "horizontal", + "redirect": "/modelsuffix/list", + "api": "http://127.0.0.1:8090/modelsuffix/add", + "actions": [{ + "type": "submit", + "label": "提交", + "primary": true + }], + "collapsable": true, + "title": "", + "body": [ + { + "type": "input-text", + "name": "suffix", + "label": "模型后缀", + "required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "desc", + "label": "模型后缀描述", + "required": true + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "modelType", + "label": "模型类型", + "required": true, + "source": "http://127.0.0.1:8090/dataEnum/modelType" + } + ] + }] +} \ No newline at end of file diff --git a/webmanager/pages/param-edit.json b/webmanager/pages/param-edit.json new file mode 100644 index 0000000000000000000000000000000000000000..47069fdfae602f2115859d7e760632cf893fc250 --- /dev/null +++ b/webmanager/pages/param-edit.json @@ -0,0 +1,146 @@ +{ + "title": "修改参数模型", + "type": "page", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/param/list", + "label": "返回列表" + } + ], + "body": [ + { + "type": "form", + "mode": "horizontal", + "redirect": "/param/list", + "api": "http://127.0.0.1:8090/parammodel/update/${params.id}", + "initApi": "http://127.0.0.1:8090/parammodel/getById/${params.id}", + "actions": [ + { + "type": "submit", + "label": "提交", + "primary": true + } + ], + "collapsable": true, + "title": "修改参数模型", + "body": [ + { + "type": "input-text", + "name": "paramClassName", + "label": "模型类名称", + "required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "paramClassDesc", + "label": "参数类描述", + "required": true + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "projectCode", + "label": "所属项目编码", + "required": true, + "searchable": true, + "source": "http://127.0.0.1:8090/project/search?content=${projectCode}" + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "moduleCode", + "label": "所属上下文", + "required": true + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "status", + "label": "状态", + "required": true, + "source": "http://127.0.0.1:8090/dataEnum/apiModelFieldStatus" + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "modelSuffix", + "label": "模型后缀", + "required": true, + "source": "http://127.0.0.1:8090/modelsuffix/listoption" + }, + { + "type": "divider" + }, + { + "label": "属性列表", + "type": "input-table", + "name": "fieldBeanList", + "multiple": true, + "addable": true, + "editable": true, + "removable": true, + "columns": [ + { + "name": "id", + "type": "static", + "label": "ID" + }, + { + "name": "fieldName", + "type": "input-text", + "label": "属性名称" + }, + { + "name": "fieldDesc", + "type": "input-text", + "label": "属性描述" + }, + { + "name": "fieldType", + "type": "input-text", + "label": "属性类型", + "required": true, + "source": "http://127.0.0.1:8090/dataEnum/javaFieldType" + }, + { + "name": "dataSourceCode", + "type": "select", + "label": "数据源编码", + "autoComplete": "http://127.0.0.1:8090/datasource/search", + "width": 240 + }, + { + "name": "bizUnique", + "type": "switch", + "label": "是否代表业务唯一性" + }, + { + "name": "defaultValueList", + "type": "textarea", + "label": "默认值列表" + }, + { + "name": "buildRuleDSL", + "type": "textarea", + "label": "属性dsl" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/param-list.json b/webmanager/pages/param-list.json new file mode 100644 index 0000000000000000000000000000000000000000..8923be966ee0e5c7c3f4766263200d74913fda59 --- /dev/null +++ b/webmanager/pages/param-list.json @@ -0,0 +1,184 @@ +{ + "type": "page", + "title": "业务领域模型管理", + "remark": null, + "name": "api", + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/param/new", + "label": "新增", + "primary": true + }, + { + "type": "button", + "label": "上传plantUML-领域模型文档", + "primary": true, + "actionType": "dialog", + "dialog": { + "title": "构建领域模型", + "body": { + "type": "form", + "api": "http://127.0.0.1:8090/parammodel/batchBuild", + "body": [ + { + "type": "select", + "name": "projectCode", + "required": true, + "placeholder": "请选择项目", + "label": "项目编码", + "source": "http://127.0.0.1:8090/project/search?content=${projectCode}" + }, + { + "type": "input-file", + "name": "file", + "label": "plantUML-领域模型文档", + "accept": ".puml", + "receiver": "http://127.0.0.1:8090/apidoc/upload" + } + ] + } + } + } + ], + "body": [ + { + "type": "crud", + "name": "sample", + "api": "http://127.0.0.1:8090/parammodel/pagelist", + "perPage": 5, + "keepItemSelectionOnPageChange": true, + "maxKeepItemSelectionLength": 11, + "labelTpl": "${id} ${engine}", + "orderBy": "id", + "orderDir": "asc", + "autoGenerateFilter": true, + "filterTogglable": false, + "headerToolbar": [ + "filter-toggler", + "bulkActions", + { + "type": "tpl", + "tpl": "定制内容示例:当前有 ${count} 条数据。", + "className": "v-middle" + }, + { + "type": "columns-toggler", + "align": "right" + }, + { + "type": "drag-toggler", + "align": "right" + }, + { + "type": "pagination", + "align": "right" + } + ], + "footerToolbar": [ + "statistics", + "switch-per-page", + "pagination" + ], + "columns": [ + { + "name": "id", + "label": "ID", + "width": 20, + "sortable": true + }, + { + "type": "text", + "name": "paramClassName", + "label": "模型类名称", + "searchable": { + "type": "input-text", + "name": "paramClassName", + "placeholder": "输入类名称" + } + }, + { + "type": "text", + "name": "paramClassDesc", + "label": "参数类描述" + }, + { + "type": "text", + "name": "statusDesc", + "label": "模型状态", + "searchable": { + "type": "select", + "name": "status", + "placeholder": "选择状态", + "source": "http://127.0.0.1:8090/dataEnum/apiModelFieldStatus" + } + }, + { + "type": "text", + "name": "projectCode", + "label": "所属项目编码", + "searchable": { + "type": "input-text", + "name": "projectCode", + "placeholder": "输入项目编码" + } + }, + { + "type": "text", + "name": "moduleCode", + "label": "所属上下文" + }, + { + "type": "text", + "name": "modelSuffix", + "label": "模型后缀", + "searchable": { + "type": "select", + "name": "modelSuffix", + "placeholder": "模型后缀", + "source": "http://127.0.0.1:8090/modelsuffix/listoption" + + } + }, + { + "type": "operation", + "label": "操作", + "width": "", + "buttons": [ + { + "type": "button-group", + "buttons": [ + { + "type": "button", + "label": "查看", + "level": "primary", + "actionType": "link", + "link": "/param/${id}" + }, + { + "type": "button", + "label": "修改", + "level": "info", + "actionType": "link", + "link": "/param/${id}/edit" + } + ] + } + ], + "placeholder": "-", + "fixed": "right" + } + ], + "affixHeader": true, + "columnsTogglable": "auto", + "placeholder": "暂无数据", + "tableClassName": "table-db table-striped", + "headerClassName": "crud-table-header", + "footerClassName": "crud-table-footer", + "toolbarClassName": "crud-table-toolbar", + "combineNum": 0, + "bodyClassName": "panel-default" + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/param-new.json b/webmanager/pages/param-new.json new file mode 100644 index 0000000000000000000000000000000000000000..0579ccd225337401bff72faf3b46150d94e9643c --- /dev/null +++ b/webmanager/pages/param-new.json @@ -0,0 +1,149 @@ +{ + "type": "page", + "title": "新增", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/param/list", + "label": "返回列表" + } + ], + "body": [ + { + "type": "form", + "mode": "horizontal", + "api": "http://127.0.0.1:8090/parammodel/add", + "redirect": "/param/list", + + "actions": [ + { + "type": "submit", + "label": "提交", + "primary": true + } + ], + "collapsable": true, + "title": "", + "body": [ + { + "type": "input-text", + "name": "paramClassName", + "label": "模型类名称", + "required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "paramClassDesc", + "label": "参数类描述", + "required": true + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "projectCode", + "label": "所属项目编码", + "required": true, + "searchable": true, + "source": "http://127.0.0.1:8090/project/search?content=${projectCode}" + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "moduleCode", + "label": "所属上下文", + "required": true + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "modelSuffix", + "label": "模型后缀", + "required": true, + "source": "http://127.0.0.1:8090/modelsuffix/listoption" + }, + { + "type": "divider" + }, + { + "label": "属性列表", + "type": "input-table", + "name": "fieldBeanList", + "multiple": true, + "addable": true, + "editable": true, + "columns": [ + { + "name": "fieldName", + "type": "input-text", + "label": "属性名称" + }, + { + "name": "fieldDesc", + "type": "input-text", + "label": "属性描述" + }, + { + "name": "fieldType", + "type": "input-text", + "label": "属性类型", + "source": "http://127.0.0.1:8090/dataEnum/javaFieldType" + }, + { + "name": "dataSourceCode", + "type": "input-text", + "label": "数据源编码", + "source": "http://127.0.0.1:8090/datasource/search?content=${dataSourceCode}" + }, + { + "name": "bizUnique", + "type": "switch", + "label": "是否代表业务唯一性" + }, + { + "name": "bizIdentifier", + "type": "switch", + "label": "是否作为领域实体标示" + }, + { + "name": "complexStruct", + "type": "switch", + "label": "是否是复杂数据类型" + }, + { + "name": "checkRule", + "type": "switch", + "label": "否存在特定规则校验" + }, + { + "name": "mappingDBColumn", + "type": "switch", + "label": "是否对应数据库字段" + }, + { + "name": "defaultValueList", + "type": "textarea", + "label": "默认值列表" + }, + { + "name": "buildRuleDSL", + "type": "textarea", + "label": "属性dsl" + } + + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/param-view.json b/webmanager/pages/param-view.json new file mode 100644 index 0000000000000000000000000000000000000000..ac0fa26c7f477b041a5ba73c94305930f9511d62 --- /dev/null +++ b/webmanager/pages/param-view.json @@ -0,0 +1,132 @@ +{ + "type": "page", + "title": "查看参数模型详情", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/param/list", + "label": "返回列表" + } + ], + "body": [ + { + "type": "page", + "initApi": "http://127.0.0.1:8090/parammodel/getById/${params.id}", + "controls": [ + { + "type": "static", + "name": "paramClassName", + "label": "模型类名称" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "paramClassDesc", + "label": "参数类描述" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "projectCode", + "label": "所属项目编码" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "statusDesc", + "label": "状态" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "moduleCode", + "label": "所属上下文" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "modelSuffix", + "label": "模型后缀" + },{ + "type": "divider" + }, + { + "label": "属性列表", + "type": "input-table", + "name": "fieldBeanList", + "multiple": false, + "addable": false, + "editable": false, + "columns": [ + { + "name": "fieldName", + "type": "static", + "label": "属性名称" + }, + { + "name": "fieldDesc", + "type": "static", + "label": "属性描述" + }, + { + "name": "fieldType", + "type": "static", + "label": "属性类型" + }, + { + "name": "dataSourceCode", + "type": "static", + "label": "数据源编码" + },{ + "name": "bizUnique", + "type": "static", + "label": "是否代表业务唯一性" + }, + { + "name": "bizIdentifier", + "type": "static", + "label": "是否作为领域实体标示" + }, + { + "name": "complexStruct", + "type": "static", + "label": "是否是复杂数据类型" + }, + { + "name": "checkRule", + "type": "static", + "label": "否存在特定规则校验" + }, + { + "name": "mappingDBColumn", + "type": "static", + "label": "是否对应数据库字段" + }, + { + "name": "defaultValueList", + "type": "static", + "label": "默认值列表" + }, + { + "name": "buildRuleDSL", + "type": "static", + "label": "属性dsl" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/project-edit.json b/webmanager/pages/project-edit.json new file mode 100644 index 0000000000000000000000000000000000000000..29ab347486885d0bd0c57fc8a282c5bf7c1d1073 --- /dev/null +++ b/webmanager/pages/project-edit.json @@ -0,0 +1,94 @@ +{ + "title": "修改项目信息${params.id}", + "type": "page", + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/project/list", + "label": "返回列表" + } + ], + "body": [ + { + "type": "form", + "mode": "horizontal", + "redirect": "/project/list", + "initApi": "http://127.0.0.1:8090/project/getByCode/${params.id}", + + "api": "http://127.0.0.1:8090/project/update/${params.id}", + "actions": [ + { + "type": "submit", + "label": "提交", + "primary": true + } + ], + "collapsable": true, + "title": "修改项目信息", + "body": [ + { + "type": "static", + "name": "projectCode", + "label": "项目编码", + "required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "projectDesc", + "label": "项目描述", + "required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "domainCode", + "label": "业务领域编码", + "required": true + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "status", + "label": "项目状态", + "required": true, + "source": "http://127.0.0.1:8090/dataEnum/apiModelFieldStatus" + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "domainDesc", + "label": "业务领域描述" + ,"required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "busLine", + "label": "所属业务线" + ,"required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "deptName", + "label": "所属部门" + ,"required": true + } + ] + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/project-list.json b/webmanager/pages/project-list.json new file mode 100644 index 0000000000000000000000000000000000000000..4461eae612a95819e6d19531d887afd00e6670fb --- /dev/null +++ b/webmanager/pages/project-list.json @@ -0,0 +1,153 @@ +{ + "type": "page", + "title": "项目管理", + "remark": null, + "name": "project", + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/project/new", + "label": "新增", + "primary": true + } + ], + "body": [ + { + "type": "crud", + "name": "sample", + "api": "http://127.0.0.1:8090/project/pagelist", + "perPage": 5, + "keepItemSelectionOnPageChange": true, + "maxKeepItemSelectionLength": 11, + "labelTpl": "${id} ${engine}", + "orderBy": "id", + "orderDir": "asc", + "autoGenerateFilter": true, + "filterTogglable": false, + "headerToolbar": [ + "filter-toggler", + "bulkActions", + { + "type": "tpl", + "tpl": "定制内容示例:当前有 ${count} 条数据。", + "className": "v-middle" + }, + { + "type": "columns-toggler", + "align": "right" + }, + { + "type": "drag-toggler", + "align": "right" + }, + { + "type": "pagination", + "align": "right" + } + ], + "footerToolbar": [ + "statistics", + "switch-per-page", + "pagination" + ], + "columns": [ + { + "name": "id", + "label": "ID", + "width": 20, + "sortable": true + }, + { + "type": "text", + "name": "projectCode", + "label": "项目编码", + "searchable": { + "type": "input-text", + "name": "projectCode", + "placeholder": "输入项目编码" + } + }, + { + "type": "text", + "name": "projectDesc", + "label": "项目描述" + }, + { + "type": "text", + "name": "statusDesc", + "label": "项目状态", + "searchable": { + "type": "select", + "name": "status", + "placeholder": "请选择状态", + "source": "http://127.0.0.1:8090/dataEnum/apiModelFieldStatus" + } + }, + { + "type": "text", + "name": "domainCode", + "label": "业务领域编码", + "searchable": { + "type": "input-text", + "name": "domainCode", + "placeholder": "输入业务领域编码" + } + }, + { + "type": "text", + "name": "domainDesc", + "label": "业务领域描述" + }, + { + "type": "text", + "name": "busLine", + "label": "所属业务线" + }, + { + "type": "text", + "name": "deptName", + "label": "所属部门" + }, + + { + "type": "operation", + "label": "操作", + "width": "", + "buttons": [ + { + "type": "button-group", + "buttons": [ + { + "type": "button", + "label": "查看", + "level": "primary", + "actionType": "link", + "link": "/project/${projectCode}" + }, + { + "type": "button", + "label": "修改", + "level": "info", + "actionType": "link", + "link": "/project/${projectCode}/edit" + } + ] + } + ], + "placeholder": "-", + "fixed": "right" + } + ], + "affixHeader": true, + "columnsTogglable": "auto", + "placeholder": "暂无数据", + "tableClassName": "table-db table-striped", + "headerClassName": "crud-table-header", + "footerClassName": "crud-table-footer", + "toolbarClassName": "crud-table-toolbar", + "combineNum": 0, + "bodyClassName": "panel-default" + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/project-new.json b/webmanager/pages/project-new.json new file mode 100644 index 0000000000000000000000000000000000000000..0535f509a134b6d7d8ac2af52ff5db94e94feea8 --- /dev/null +++ b/webmanager/pages/project-new.json @@ -0,0 +1,79 @@ +{ + "type": "page", + "title": "新增", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/project/list", + "label": "返回列表" + } + ], + "body": [{ + "type": "form", + "mode": "horizontal", + "redirect": "/project/list", + "api": "http://127.0.0.1:8090/project/add", + "actions": [{ + "type": "submit", + "label": "提交", + "primary": true + }], + "collapsable": true, + "title": "", + "body": [ + { + "type": "input-text", + "name": "projectCode", + "label": "项目编码", + "required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "projectDesc", + "label": "项目描述", + "required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "domainCode", + "label": "业务领域编码", + "required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "domainDesc", + "label": "业务领域描述" + ,"required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "busLine", + "label": "所属业务线" + ,"required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "deptName", + "label": "所属部门" + ,"required": true + } + ] + }] +} \ No newline at end of file diff --git a/webmanager/pages/project-view.json b/webmanager/pages/project-view.json new file mode 100644 index 0000000000000000000000000000000000000000..3d3d779f84e5c4fc3373363c919f725f78bcda7c --- /dev/null +++ b/webmanager/pages/project-view.json @@ -0,0 +1,74 @@ +{ + "type": "page", + "title": "根据项目编码获取详情${params.id}", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/project/list", + "label": "返回列表" + } + ], + "body": [ + { + "type": "page", + "initApi": "http://127.0.0.1:8090/project/getByCode/${params.id}", + "controls": [ + { + "type": "static", + "name": "projectCode", + "label": "项目编码" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "projectDesc", + "label": "项目描述" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "domainCode", + "label": "业务领域编码" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "statusDesc", + "label": "项目状态" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "domainDesc", + "label": "业务领域描述" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "busLine", + "label": "所属业务线" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "deptName", + "label": "所属部门" + } + ] + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/site.json b/webmanager/pages/site.json new file mode 100644 index 0000000000000000000000000000000000000000..c28c0ec3394508748e612d77b6d6599d0f961f7a --- /dev/null +++ b/webmanager/pages/site.json @@ -0,0 +1,248 @@ +{ + "status": 0, + "msg": "", + "data": { + "pages": [ + { + "label": "Home", + "url": "/", + "redirect": "/index/1" + }, + { + "children": [ + { + "label": "项目管理", + "url": "/project", + "rewrite": "/project/list", + "icon": "fa fa-cube", + "children": [ + { + "label": "列表", + "url": "/project/list", + "icon": "fa fa-list", + "schemaApi": "get:/pages/project-list.json" + }, + { + "label": "新增", + "url": "/project/new", + "icon": "fa fa-plus", + "schemaApi": "get:/pages/project-new.json" + }, + { + "label": "查看", + "url": "/project/:id", + "schemaApi": "get:/pages/project-view.json" + }, + { + "label": "修改", + "url": "/project/:id/edit", + "schemaApi": "get:/pages/project-edit.json" + } + ] + }, + { + "label": "API管理", + "url": "/api", + "rewrite": "/api/list", + "icon": "fa fa-cube", + "children": [ + { + "label": "列表", + "url": "/api/list", + "icon": "fa fa-list", + "schemaApi": "get:/pages/api-list.json" + }, + { + "label": "新增", + "url": "/api/new", + "icon": "fa fa-plus", + "schemaApi": "get:/pages/api-new.json" + }, + { + "label": "查看", + "url": "/api/:id", + "schemaApi": "get:/pages/api-view.json" + }, + { + "label": "修改", + "url": "/api/:id/edit", + "schemaApi": "get:/pages/api-edit.json" + } + ] + }, + { + "label": "业务参数模型管理", + "url": "/param", + "rewrite": "/param/list", + "icon": "fa fa-cube", + "children": [ + { + "label": "列表", + "url": "/param/list", + "icon": "fa fa-list", + "schemaApi": "get:/pages/param-list.json" + }, + { + "label": "新增", + "url": "/param/new", + "icon": "fa fa-plus", + "schemaApi": "get:/pages/param-new.json" + }, + { + "label": "查看", + "url": "/param/:id", + "schemaApi": "get:/pages/param-view.json" + }, + { + "label": "修改", + "url": "/param/:id/edit", + "schemaApi": "get:/pages/param-edit.json" + } + ] + }, + { + "label": "表结构模型管理", + "url": "/table", + "rewrite": "/table/list", + "icon": "fa fa-cube", + "children": [ + { + "label": "列表", + "url": "/table/list", + "icon": "fa fa-list", + "schemaApi": "get:/pages/table-list.json" + }, + { + "label": "新增", + "url": "/table/new", + "icon": "fa fa-plus", + "schemaApi": "get:/pages/table-new.json" + }, + { + "label": "查看", + "url": "/table/:id", + "schemaApi": "get:/pages/table-view.json" + }, + { + "label": "修改", + "url": "/table/:id/edit", + "schemaApi": "get:/pages/table-edit.json" + } + ] + }, + { + "label": "模型后缀配置", + "url": "/modelsuffix", + "rewrite": "/modelsuffix/list", + "icon": "fa fa-cube", + "children": [ + { + "label": "列表", + "url": "/modelsuffix/list", + "icon": "fa fa-list", + "schemaApi": "get:/pages/modelsuffix-list.json" + }, + { + "label": "新增", + "url": "/modelsuffix/new", + "icon": "fa fa-plus", + "schemaApi": "get:/pages/modelsuffix-new.json" + }, + { + "label": "修改", + "url": "/modelsuffix/:id/edit", + "schemaApi": "get:/pages/modelsuffix-edit.json" + } + ] + }, + { + "label": "数据源管理", + "url": "/datasource", + "rewrite": "/datasource/list", + "icon": "fa fa-cube", + "children": [ + { + "label": "列表", + "url": "/datasource/list", + "icon": "fa fa-list", + "schemaApi": "get:/pages/datasource-list.json" + }, + { + "label": "新增", + "url": "/datasource/new", + "icon": "fa fa-plus", + "schemaApi": "get:/pages/datasource-new.json" + }, + { + "label": "查看", + "url": "/datasource/:id", + "schemaApi": "get:/pages/datasource-view.json" + }, + { + "label": "修改", + "url": "/datasource/:id/edit", + "schemaApi": "get:/pages/datasource-edit.json" + } + ] + }, + { + "label": "模型映射管理", + "url": "/modelmapping", + "rewrite": "/modelmapping/list", + "icon": "fa fa-cube", + "children": [ + { + "label": "列表", + "url": "/modelmapping/list", + "icon": "fa fa-list", + "schemaApi": "get:/pages/modelmapping-list.json" + }, + { + "label": "新增", + "url": "/modelmapping/new", + "icon": "fa fa-plus", + "schemaApi": "get:/pages/modelmapping-new.json" + }, + { + "label": "查看", + "url": "/modelmapping/:id", + "schemaApi": "get:/pages/modelmapping-view.json" + }, + { + "label": "修改", + "url": "/modelmapping/:id/edit", + "schemaApi": "get:/pages/modelmapping-edit.json" + } + ] + }, + { + "label": "数据工作台", + "url": "/workspace", + "rewrite": "/workspace/new", + "icon": "fa fa-cube", + "children": [ + { + "label": "数据模型构建", + "url": "/workspace/new", + "icon": "fa fa-list", + "schemaApi": "get:/pages/workspace-new.json" + }, + { + "label": "接口入参mock", + "url": "/workspace/apireqmock", + "icon": "fa fa-list", + "schemaApi": "get:/pages/workspace-apireqmock.json" + }, + { + "label": "接口出参mock", + "url": "/workspace/apirespmock", + "icon": "fa fa-list", + "schemaApi": "get:/pages/workspace-apirespmock.json" + } + ] + } + ] + } + ] + } +} diff --git a/webmanager/pages/table-edit.json b/webmanager/pages/table-edit.json new file mode 100644 index 0000000000000000000000000000000000000000..242e659b4736019c95e9407233893e6d131f2ec0 --- /dev/null +++ b/webmanager/pages/table-edit.json @@ -0,0 +1,141 @@ +{ + "title": "修改er模型", + "type": "page", + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/table/list", + "label": "返回列表" + } + ], + "body": [ + { + "type": "form", + "mode": "horizontal", + "redirect": "/table/list", + "initApi": "http://127.0.0.1:8090/table/getById/${params.id}", + "api": "http://127.0.0.1:8090/table/update/${params.id}", + "actions": [ + { + "type": "submit", + "label": "提交", + "primary": true + } + ], + "collapsable": true, + "title": "修改er模型", + "body": [ + { + "type": "input-text", + "name": "tableName", + "label": "表名称", + "required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "tableComment", + "label": "表描述", + "required": true + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "dbName", + "label": "数据库名称" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "projectCode", + "label": "项目编码" + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "status", + "label": "状态", + "required": true, + "source": "http://127.0.0.1:8090/dataEnum/apiModelFieldStatus" + }, + { + "type": "divider" + }, + { + "label": "表字段列表", + "type": "input-table", + "name": "columnList", + "multiple": true, + "addable": true, + "editable": true, + "columns": [ + { + "name": "columnName", + "type": "input-text", + "label": "字段名称" + }, + { + "name": "columnType", + "type": "select", + "label": "字段类型", + "source": "http://127.0.0.1:8090/dataEnum/columnTypeEnum" + + }, + { + "name": "columnComment", + "type": "input-text", + "label": "字段描述" + }, + { + "name": "columnLength", + "type": "input-text", + "label": "字段长度" + }, + { + "name": "notNull", + "type": "select", + "label": "是否可为空", + "options": [ + { + "label": "true", + "value": "true" + }, + { + "label": "false", + "value": "false" + } + ] + },{ + "name": "defaultValue", + "type": "input-text", + "label": "默认值" + },{ + "name": "uniqColumn", + "type": "select", + "label": "是否唯一", + "options": [ + { + "label": "true", + "value": "true" + }, + { + "label": "false", + "value": "false" + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/table-list.json b/webmanager/pages/table-list.json new file mode 100644 index 0000000000000000000000000000000000000000..6093048761e78db6b1485476d20b622d69e6df4e --- /dev/null +++ b/webmanager/pages/table-list.json @@ -0,0 +1,192 @@ +{ + "type": "page", + "title": "数据模型管理", + "remark": null, + "name": "table", + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/table/new", + "label": "新增", + "primary": true + }, + { + "type": "button", + "label": "上传表结构模型文档", + "primary": true, + "actionType": "dialog", + "dialog": { + "title": "构建表结构模型", + "body": { + "type": "form", + "api": "http://127.0.0.1:8090/table/upload", + "body": [ + { + "type": "select", + "name": "projectCode", + "required": true, + "placeholder": "请选择项目", + "label": "项目编码", + "source": "http://127.0.0.1:8090/project/search?content=${projectCode}" + }, + { + "type": "input-text", + "name": "dbName", + "label": "数据库名称", + "required": true + }, + { + "type": "switch", + "name": "buildJavaEntity", + "label": "是否快捷构建JavaEntity模型" + }, + { + "type": "select", + "name": "modelSuffix", + "label": "选择javaEntity后缀", + "source": "http://127.0.0.1:8090/modelsuffix/listoption" + }, + { + "type": "input-file", + "name": "file", + "label": "表模型plantuml文档", + "accept": ".puml", + "receiver": "http://127.0.0.1:8090/apidoc/upload" + } + ] + } + } + } + ], + "body": [ + { + "type": "crud", + "name": "sample", + "api": "http://127.0.0.1:8090/table/pagelist", + "perPage": 5, + "keepItemSelectionOnPageChange": true, + "maxKeepItemSelectionLength": 11, + "labelTpl": "${id} ${engine}", + "orderBy": "id", + "orderDir": "asc", + "autoGenerateFilter": true, + "filterTogglable": false, + "headerToolbar": [ + "filter-toggler", + "bulkActions", + { + "type": "tpl", + "tpl": "定制内容示例:当前有 ${count} 条数据。", + "className": "v-middle" + }, + { + "type": "columns-toggler", + "align": "right" + }, + { + "type": "drag-toggler", + "align": "right" + }, + { + "type": "pagination", + "align": "right" + } + ], + "footerToolbar": [ + "statistics", + "switch-per-page", + "pagination" + ], + "columns": [ + { + "name": "id", + "label": "ID", + "width": 20, + "sortable": true + }, + { + "type": "text", + "name": "tableName", + "label": "表名称", + "searchable": { + "type": "input-text", + "name": "tableName", + "placeholder": "输入表名称" + } + }, + { + "type": "text", + "name": "tableComment", + "label": "表描述" + }, + { + "type": "text", + "name": "dbName", + "label": "数据库名称" + }, + { + "type": "text", + "name": "statusDesc", + "label": "模型状态", + "searchable": { + "type": "select", + "name": "status", + "placeholder": "选择状态", + "source": "http://127.0.0.1:8090/dataEnum/apiModelFieldStatus" + } + }, + { + "type": "text", + "name": "projectCode", + "label": "项目编码", + "searchable": { + "type": "select", + "name": "projectCode", + "placeholder": "输入项目编码", + "searchable": true, + "source": "http://127.0.0.1:8090/project/search?content=${projectCode}" + + } + }, + { + "type": "operation", + "label": "操作", + "width": "", + "buttons": [ + { + "type": "button-group", + "buttons": [ + { + "type": "button", + "label": "查看", + "level": "primary", + "actionType": "link", + "link": "/table/${id}" + }, + { + "type": "button", + "label": "修改", + "level": "info", + "actionType": "link", + "link": "/table/${id}/edit" + } + ] + } + ], + "placeholder": "-", + "fixed": "right" + } + ], + "affixHeader": true, + "columnsTogglable": "auto", + "placeholder": "暂无数据", + "tableClassName": "table-db table-striped", + "headerClassName": "crud-table-header", + "footerClassName": "crud-table-footer", + "toolbarClassName": "crud-table-toolbar", + "combineNum": 0, + "bodyClassName": "panel-default" + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/table-new.json b/webmanager/pages/table-new.json new file mode 100644 index 0000000000000000000000000000000000000000..6fb313a13d88a0038a5597f92510b9f23acd2676 --- /dev/null +++ b/webmanager/pages/table-new.json @@ -0,0 +1,138 @@ +{ + "type": "page", + "title": "新增", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/table/list", + "label": "返回列表" + } + ], + "body": [ + { + "type": "form", + "mode": "horizontal", + "api": "http://127.0.0.1:8090/table/add", + "redirect": "/table/list", + + "actions": [ + { + "type": "submit", + "label": "提交", + "primary": true + } + ], + "collapsable": true, + "title": "", + "body": [ + { + "type": "input-text", + "name": "tableName", + "label": "表名称", + "required": true + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "tableComment", + "label": "表描述", + "required": true + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "projectCode", + "label": "项目编码", + "required": true, + "searchable": true, + "source": "http://127.0.0.1:8090/project/search?content=${projectCode}" + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "dbName", + "label": "数据库名称", + "required": true, + "source": "http://127.0.0.1:8090/table/searchdb?content=${projectCode}" + + }, + { + "type": "divider" + }, + { + "label": "表字段列表", + "type": "input-table", + "name": "columnList", + "multiple": true, + "addable": true, + "editable": true, + "columns": [ + { + "name": "columnName", + "type": "input-text", + "label": "字段名称" + }, + { + "name": "columnType", + "type": "select", + "label": "字段类型", + "source": "http://127.0.0.1:8090/dataEnum/columnTypeEnum" + }, + { + "name": "columnComment", + "type": "input-text", + "label": "字段描述" + }, + { + "name": "columnLength", + "type": "input-text", + "label": "字段长度" + }, + { + "name": "notNull", + "type": "select", + "label": "是否可为空", + "options": [ + { + "label": "true", + "value": "true" + }, + { + "label": "false", + "value": "false" + } + ] + },{ + "name": "defaultValue", + "type": "input-text", + "label": "默认值" + },{ + "name": "uniqColumn", + "type": "select", + "label": "是否唯一", + "options": [ + { + "label": "true", + "value": "true" + }, + { + "label": "false", + "value": "false" + } + ] + } + ] + } + + ] + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/table-view.json b/webmanager/pages/table-view.json new file mode 100644 index 0000000000000000000000000000000000000000..1b25855ff4501c8bb9c911b7db158a9afd6999fb --- /dev/null +++ b/webmanager/pages/table-view.json @@ -0,0 +1,104 @@ +{ + "type": "page", + "title": "根据ID获取详情", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/table/list", + "label": "返回列表" + } + ], + "body": [ + { + "type": "page", + "initApi": "http://127.0.0.1:8090/table/getById/${params.id}", + "controls": [ + { + "type": "static", + "name": "tableName", + "label": "表名称" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "tableComment", + "label": "表描述" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "dbName", + "label": "数据库名称" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "projectCode", + "label": "项目编码" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "statusDesc", + "label": "状态" + }, + { + "type": "divider" + }, + { + "label": "表字段列表", + "type": "input-table", + "name": "columnList", + "multiple": false, + "addable": false, + "editable": false, + "columns": [ + { + "name": "columnName", + "type": "static", + "label": "字段名称" + }, + { + "name": "columnType", + "type": "static", + "label": "字段类型" + }, + { + "name": "columnComment", + "type": "static", + "label": "字段描述" + }, + { + "name": "columnLength", + "type": "static", + "label": "字段长度" + }, + { + "name": "notNull", + "type": "static", + "label": "是否可为空" + },{ + "name": "defaultValue", + "type": "static", + "label": "默认值" + },{ + "name": "uniqColumn", + "type": "static", + "label": "是否唯一" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/workspace-apireqmock.json b/webmanager/pages/workspace-apireqmock.json new file mode 100644 index 0000000000000000000000000000000000000000..f5179a58c05c43d3287a25a7114a80f66bf99354 --- /dev/null +++ b/webmanager/pages/workspace-apireqmock.json @@ -0,0 +1,102 @@ +{ + "type": "page", + "title": "接口入参mock", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/index/1", + "label": "返回列表" + } + ], + "body": [ + { + "type": "form", + "mode": "horizontal", + "api": "http://127.0.0.1:8090/api/reqmock", + "actions": [ + { + "type": "submit", + "label": "提交", + "primary": true + } + ], + "collapsable": true, + "title": "", + "body": [ + { + "type": "select", + "name": "projectCode", + "label": "所属项目编码", + "required": true, + "searchable": true, + "source": "http://127.0.0.1:8090/project/search?content=${projectCode}" + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "apiMethod", + "label": "Api方法", + "source": "http://127.0.0.1:8090/api/searchApiSignV2?projectCode=${projectCode}", + "required": false + }, + + { + "type": "divider" + }, + { + "label": "属性列表", + "type": "input-table", + "name": "paramModelVOList", + "multiple": true, + "addable": true, + "editable": true, + "removable": true, + "columns": [ + { + "name": "paramVarName", + "type": "input-text", + "label": "参数名" + }, + { + "name": "dataSourceCode", + "type": "select", + "label": "数据源编码", + "autoComplete": "http://127.0.0.1:8090/datasource/search" + } + ] + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "mockCount", + "label": "mock数据的数量" + }, + { + "type": "divider" + }, + { + "type": "json", + "name": "mockResultData", + "visibleOn": "typeof data.mockResultData !== 'undefined'", + "json": "data.mockResultData", + "label": "数据mock结果json" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "mockResultData", + "visibleOn": "typeof data.mockResultData !== 'undefined'", + "label": "数据mock结果" + } + ] + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/workspace-apirespmock.json b/webmanager/pages/workspace-apirespmock.json new file mode 100644 index 0000000000000000000000000000000000000000..8970cbbbd16ba360a822a96bc9c980d59e346f5b --- /dev/null +++ b/webmanager/pages/workspace-apirespmock.json @@ -0,0 +1,76 @@ +{ + "type": "page", + "title": "接口出参mock", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/index/1", + "label": "返回列表" + } + ], + "body": [ + { + "type": "form", + "mode": "horizontal", + "api": "http://127.0.0.1:8090/api/respmock", + "actions": [ + { + "type": "submit", + "label": "提交", + "primary": true + } + ], + "collapsable": true, + "title": "", + "body": [ + { + "type": "select", + "name": "projectCode", + "label": "所属项目编码", + "required": true, + "searchable": true, + "source": "http://127.0.0.1:8090/project/search?content=${projectCode}" + }, + { + "type": "divider" + }, + { + "type": "select", + "name": "apiMethod", + "label": "Api方法", + "source": "http://127.0.0.1:8090/api/searchApiSignV2?projectCode=${projectCode}", + "required": false + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "mockCount", + "label": "mock数据的数量" + }, + { + "type": "divider" + }, + { + "type": "json", + "name": "mockResultData", + "visibleOn": "typeof data.mockResultData !== 'undefined'", + "json": "data.mockResultData", + "label": "数据mock结果json" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "mockResultData", + "visibleOn": "typeof data.mockResultData !== 'undefined'", + "label": "数据mock结果txt" + } + ] + } + ] +} \ No newline at end of file diff --git a/webmanager/pages/workspace-new.json b/webmanager/pages/workspace-new.json new file mode 100644 index 0000000000000000000000000000000000000000..76999dcbc3184b1de623f089bcb3d309f3ba2930 --- /dev/null +++ b/webmanager/pages/workspace-new.json @@ -0,0 +1,139 @@ +{ + "type": "page", + "title": "新增", + "remark": null, + "toolbar": [ + { + "type": "button", + "actionType": "link", + "link": "/index/1", + "label": "返回列表" + } + ], + "body": [ + { + "type": "form", + "mode": "horizontal", + "api": "http://127.0.0.1:8090/datafactory/generate", + "actions": [ + { + "type": "submit", + "label": "提交", + "primary": true + } + ], + "collapsable": true, + "title": "", + "body": [ + { + "type": "select", + "name": "projectCode", + "label": "所属项目编码", + "required": true, + "searchable": true, + "source": "http://127.0.0.1:8090/project/search?content=${projectCode}" + }, + { + "type": "divider" + }, + { + "type": "input-text", + "name": "paramModelCode", + "label": "模型名称", + "required": true, + "source": "http://127.0.0.1:8090/parammodel/getByProjectCodeV2?projectCode=${projectCode}" + }, + { + "type": "divider" + }, + { + "label": "属性列表", + "type": "input-table", + "name": "fieldVOList", + "source": "${rows}", + "multiple": true, + "addable": true, + "editable": true, + "columns": [ + { + "name": "fieldName", + "type": "input-text", + "label": "属性名称", + "required": true + }, + { + "name": "fieldDesc", + "type": "input-text", + "label": "属性描述" + }, + { + "name": "fieldType", + "type": "input-text", + "label": "属性类型", + "required": true, + "source": "http://127.0.0.1:8090/dataEnum/javaFieldType" + }, + { + "name": "dataSourceCode", + "type": "select", + "label": "数据源编码", + "autoComplete": "http://127.0.0.1:8090/datasource/search" + }, + { + "name": "bizUnique", + "type": "switch", + "label": "是否代表业务唯一性" + }, + { + "name": "defaultValueList", + "type": "textarea", + "label": "默认值列表" + }, + { + "name": "buildRuleDSL", + "type": "textarea", + "label": "规则DSL" + } + ] + } + , + { + "type": "divider" + }, + { + "type": "input-text", + "name": "buildCount", + "label": "生成条数", + "required": true + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "dataUseType", + "label": "数据使用方式", + "required": false + },{ + "type": "divider" + }, + { + "type": "json", + "name": "mockResultData", + "visibleOn": "typeof data.mockResultData !== 'undefined'", + "json": "data.mockResultData", + "label": "数据mock结果json" + }, + { + "type": "divider" + }, + { + "type": "static", + "name": "mockResultData", + "visibleOn": "typeof data.mockResultData !== 'undefined'", + "label": "数据mock结果txt" + } + ] + } + ] +} \ No newline at end of file diff --git a/webmanager/public/logo.png b/webmanager/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c9ea77efc0fa29c8b19473270cbc35858c0e0e82 Binary files /dev/null and b/webmanager/public/logo.png differ diff --git a/webmanager/server.js b/webmanager/server.js new file mode 100644 index 0000000000000000000000000000000000000000..1dbb830d729fe14a38c1b3f42326b3c8ff3571d8 --- /dev/null +++ b/webmanager/server.js @@ -0,0 +1,40 @@ +const express = require('express'); +const http = require('http'); +const path = require('path'); +const reload = require('reload'); +const bodyParser = require('body-parser'); +const logger = require('morgan'); + +const app = express(); + +app.set('port', process.env.PORT || 3000); +app.use(logger('dev')); +app.use(bodyParser.json()); // Parses json, multi-part (file), url-encoded + +app.use('/public', express.static('public')); +app.use('/pages', express.static('pages')); + +app.get('/*', function (req, res) { + res.sendFile(path.join(__dirname, 'index.html')); +}); + +const server = http.createServer(app); + +// Reload code here +reload(app) + .then(function (reloadReturned) { + // reloadReturned is documented in the returns API in the README + + // Reload started, start web server + server.listen(app.get('port'), function () { + console.log( + 'Web server listening on port http://localhost:' + app.get('port') + ); + }); + }) + .catch(function (err) { + console.error( + 'Reload could not start, could not start server/sample app', + err + ); + }); diff --git "a/\345\261\236\346\200\247\344\276\235\350\265\226\350\247\204\345\210\231DSL\346\217\217\350\277\260\345\256\236\347\216\260\346\226\271\346\241\210.txt" "b/\345\261\236\346\200\247\344\276\235\350\265\226\350\247\204\345\210\231DSL\346\217\217\350\277\260\345\256\236\347\216\260\346\226\271\346\241\210.txt" new file mode 100644 index 0000000000000000000000000000000000000000..4e08135677d529d3bb45824ef4899131e37265a0 --- /dev/null +++ "b/\345\261\236\346\200\247\344\276\235\350\265\226\350\247\204\345\210\231DSL\346\217\217\350\277\260\345\256\236\347\216\260\346\226\271\346\241\210.txt" @@ -0,0 +1,50 @@ +说明 +属性.prefix:标示属性值前缀是什么 +属性.subfix:标示属性值后缀是什么 +属性.relyField:标示属性值依赖于另外一个属性值 +属性.子属性.relyField:标示列表属性如List userList, userList.staffId=staffId +属性.子属性.dataSourceCode:标示如列表属性中的UserBO的某个属性依赖的数据源编码 + +属性.mapKey.relyKeyField:标示map属性如Map KVMap的key值是父类属性的某个属性值 +属性.mapValue.relyValueField:标示map属性如Map KVMap的value值是父类属性的某个属性值/或者某些属性 +属性.funcVar:当前属性的随机数函数需要另外一个属性的值作为参数传入 +属性.defaultValues: 默认值列表 + +属性.genCount:列表类属性如List userList,需要生成多少UserBO对象可以随机组成随机大小的userList 或者 set,array大小 + +属性.prefix=xxx +属性.subfix=xxx + +属性.relyKeyField=$属性 or valueList{} +属性.relyValueField=$属性 or valueList{} +属性.relyMapKVField={k:1=v:1,123,345644;} + + +属性.funcVar=$属性 or 10(如果使用随机函数需要传入的参数,或者依赖其他属性的值) + + + +例如订单Order和订单详情OrderDetailBO + +OrderBO + String orderCode; //订单号 + String userId; //用户id + List orderDetailBOList; //订单详情 + Long orderPayCount; //订单总金额 + + +比如orderCode的dsl内容描述: +prefix=BRAND_XXX_; +subfix=000x; + + +比如orderDetailBOList的dsl内容描述: +orderCode.relyField=orderCode +itemId.relySourceCode=com.item.skuFacade.getxxx(a,bc,ddd)#skuid (依赖商品服务的skuid) +count.relySourceCode=com.datafactory.random(10) (随机数函数,10以内) +price.relySourceCode=com.datafactory.random(1000) (随机数函数,1000以内) + + + + +orderCode.relyField=sum(orderDetailBOList.)--->数学计算,脚本表达式? diff --git "a/\346\225\260\346\215\256\346\272\220\345\210\227\350\241\250.txt" "b/\346\225\260\346\215\256\346\272\220\345\210\227\350\241\250.txt" new file mode 100644 index 0000000000000000000000000000000000000000..b5f4ee98225b6d6b1351ad02a5754bb5b4cbafce --- /dev/null +++ "b/\346\225\260\346\215\256\346\272\220\345\210\227\350\241\250.txt" @@ -0,0 +1,21 @@ +数据源=服务名:数据资源定位符 + +1.datafactory内置下: +服务名=datafactory + + +身份证号=datafactory:com.datafactory.user.cardnumber +日期(yyyy-mm-dd)=datafactory:com.datafactory.user.date +姓名=datafactory:com.datafactory.user.chineseName +邮箱=datafactory:com.datafactory.user.email +电话号码=datafactory:com.datafactory.user.telphone +密码=datafactory:com.datafactory.user.password +银行卡号=com.datafactory.bank.cardNumber +随机数=datafactory:com.datafactory.user.getRandom +姓名=datafactory:com.datafactory.user.chineseName + +时间(yyyy-mm-dd HH:mm:ss)= +单号= +时间戳= +商品名称= +业务线= \ No newline at end of file