Commit d48a0fea by yuwei

项目初始化

parent 4b7521e7
......@@ -2,10 +2,6 @@ package cn.datax.common.core;
public interface RedisConstant {
String FACTORY_SOURCE_KEY = "data:factory:sources";
String FACTORY_SET_KEY = "data:factory:sets";
String MARKET_API_KEY = "data:market:apis";
String MARKET_API_MASK_KEY = "data:market:api:masks";
......@@ -13,4 +9,12 @@ public interface RedisConstant {
String SYSTEM_DICT_KEY = "data:system:dicts";
String SYSTEM_CONFIG_KEY = "data:system:configs";
String METADATA_SOURCE_KEY = "data:metadata:sources";
String METADATA_TABLE_KEY = "data:metadata:tables";
String METADATA_COLUMN_KEY = "data:metadata:columns";
String VISUAL_SET_KEY = "data:visual:sets";
}
......@@ -24,10 +24,5 @@
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>${redisson.version}</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package cn.datax.common.redis.config;
import cn.datax.common.redis.service.impl.RedissonLocker;
import cn.datax.common.redis.utils.LockUtil;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
public class RedissonConfig {
@Value("${spring.redis.database}")
private int database;
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private String port;
@Value("${spring.redis.password}")
private String password;
/**
* RedissonClient,单机模式
*
* @return
*/
@Bean(destroyMethod = "shutdown")
public RedissonClient redissonClient() {
Config config = new Config();
SingleServerConfig singleServerConfig = config.useSingleServer();
singleServerConfig.setAddress("redis://" + host + ":" + port);
singleServerConfig.setDatabase(database);
if (password != null && !"".equals(password)) {
singleServerConfig.setPassword(password);
}
return Redisson.create(config);
}
@Bean
public RedissonLocker redissonLocker(RedissonClient redissonClient) {
RedissonLocker locker = new RedissonLocker(redissonClient);
// 设置LockUtil的锁处理对象
LockUtil.setLocker(locker);
return locker;
}
}
package cn.datax.common.redis.service;
import java.util.concurrent.TimeUnit;
/**
* 锁接口
*/
public interface Locker {
/**
* 获取锁,如果锁不可用,则当前线程处于休眠状态,直到获得锁为止。
*
* @param lockKey
*/
void lock(String lockKey);
/**
* 释放锁
*
* @param lockKey
*/
void unlock(String lockKey);
/**
* 获取锁,如果锁不可用,则当前线程处于休眠状态,直到获得锁为止。如果获取到锁后,执行结束后解锁或达到超时时间后会自动释放锁
*
* @param lockKey
* @param timeout
*/
void lock(String lockKey, int timeout);
/**
* 获取锁,如果锁不可用,则当前线程处于休眠状态,直到获得锁为止。如果获取到锁后,执行结束后解锁或达到超时时间后会自动释放锁
*
* @param lockKey
* @param unit
* @param timeout
*/
void lock(String lockKey, TimeUnit unit, int timeout);
/**
* 尝试获取锁,获取到立即返回true,未获取到立即返回false
*
* @param lockKey
* @return
*/
boolean tryLock(String lockKey);
/**
* 尝试获取锁,在等待时间内获取到锁则返回true,否则返回false,如果获取到锁,则要么执行完后程序释放锁,
* 要么在给定的超时时间leaseTime后释放锁
*
* @param lockKey
* @param waitTime
* @param leaseTime
* @param unit
* @return
*/
boolean tryLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException;
/**
* 锁是否被任意一个线程锁持有
*
* @param lockKey
* @return
*/
boolean isLocked(String lockKey);
}
package cn.datax.common.redis.service.impl;
import cn.datax.common.redis.service.Locker;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import java.util.concurrent.TimeUnit;
/**
* 基于Redisson的分布式锁
*/
public class RedissonLocker implements Locker {
private RedissonClient redissonClient;
public RedissonLocker(RedissonClient redissonClient) {
super();
this.redissonClient = redissonClient;
}
@Override
public void lock(String lockKey) {
RLock lock = redissonClient.getLock(lockKey);
lock.lock();
}
@Override
public void unlock(String lockKey) {
RLock lock = redissonClient.getLock(lockKey);
lock.unlock();
}
@Override
public void lock(String lockKey, int leaseTime) {
RLock lock = redissonClient.getLock(lockKey);
lock.lock(leaseTime, TimeUnit.SECONDS);
}
@Override
public void lock(String lockKey, TimeUnit unit, int timeout) {
RLock lock = redissonClient.getLock(lockKey);
lock.lock(timeout, unit);
}
public void setRedissonClient(RedissonClient redissonClient) {
this.redissonClient = redissonClient;
}
@Override
public boolean tryLock(String lockKey) {
RLock lock = redissonClient.getLock(lockKey);
return lock.tryLock();
}
@Override
public boolean tryLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException {
RLock lock = redissonClient.getLock(lockKey);
return lock.tryLock(waitTime, leaseTime, unit);
}
@Override
public boolean isLocked(String lockKey) {
RLock lock = redissonClient.getLock(lockKey);
return lock.isLocked();
}
}
package cn.datax.common.redis.utils;
import cn.datax.common.redis.service.Locker;
import java.util.concurrent.TimeUnit;
/**
* redis分布式锁工具类
*/
public final class LockUtil {
private static Locker locker;
/**
* 设置工具类使用的locker
*
* @param locker
*/
public static void setLocker(Locker locker) {
LockUtil.locker = locker;
}
/**
* 获取锁
*
* @param lockKey
*/
public static void lock(String lockKey) {
locker.lock(lockKey);
}
/**
* 释放锁
*
* @param lockKey
*/
public static void unlock(String lockKey) {
locker.unlock(lockKey);
}
/**
* 获取锁,超时释放
*
* @param lockKey
* @param timeout
*/
public static void lock(String lockKey, int timeout) {
locker.lock(lockKey, timeout);
}
/**
* 获取锁,超时释放,指定时间单位
*
* @param lockKey
* @param unit
* @param timeout
*/
public static void lock(String lockKey, TimeUnit unit, int timeout) {
locker.lock(lockKey, unit, timeout);
}
/**
* 尝试获取锁,获取到立即返回true,获取失败立即返回false
*
* @param lockKey
* @return
*/
public static boolean tryLock(String lockKey) {
return locker.tryLock(lockKey);
}
/**
* 尝试获取锁,在给定的waitTime时间内尝试,获取到返回true,获取失败返回false,获取到后再给定的leaseTime时间超时释放
*
* @param lockKey
* @param waitTime
* @param leaseTime
* @param unit
* @return
* @throws InterruptedException
*/
public static boolean tryLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException {
return locker.tryLock(lockKey, waitTime, leaseTime, unit);
}
/**
* 锁释放被任意一个线程持有
*
* @param lockKey
* @return
*/
public static boolean isLocked(String lockKey) {
return locker.isLocked(lockKey);
}
}
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.datax.common.redis.config.RedisConfig,\
cn.datax.common.redis.config.RedissonConfig,\
cn.datax.common.redis.aspectj.RedisCacheAspect
......@@ -50,6 +50,7 @@ security:
# Swagger界面内容配置
swagger:
enable: true
title: API接口文档
description: Api Documentation
version: 1.0.0
......
......@@ -55,6 +55,7 @@ security:
# Swagger界面内容配置
swagger:
enable: true
title: API接口文档
description: Api Documentation
version: 1.0.0
......
......@@ -50,6 +50,7 @@ security:
# Swagger界面内容配置
swagger:
enable: true
title: API接口文档
description: Api Documentation
version: 1.0.0
......
......@@ -55,6 +55,7 @@ security:
# Swagger界面内容配置
swagger:
enable: true
title: API接口文档
description: Api Documentation
version: 1.0.0
......
......@@ -50,6 +50,7 @@ security:
# Swagger界面内容配置
swagger:
enable: true
title: API接口文档
description: Api Documentation
version: 1.0.0
......
......@@ -50,6 +50,7 @@ security:
# Swagger界面内容配置
swagger:
enable: true
title: API接口文档
description: Api Documentation
version: 1.0.0
......
......@@ -62,6 +62,7 @@ security:
# Swagger界面内容配置
swagger:
enable: true
title: API接口文档
description: Api Documentation
version: 1.0.0
......
......@@ -51,6 +51,7 @@ security:
# Swagger界面内容配置
swagger:
enable: true
title: API接口文档
description: Api Documentation
version: 1.0.0
......
......@@ -82,6 +82,7 @@ security:
# Swagger界面内容配置
swagger:
enable: true
title: API接口文档
description: Api Documentation
version: 1.0.0
......
......@@ -50,6 +50,7 @@ security:
# Swagger界面内容配置
swagger:
enable: true
title: API接口文档
description: Api Documentation
version: 1.0.0
......
......@@ -23,19 +23,30 @@
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-ui</artifactId>
<version>${knife4j.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
<version>${springfox.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>${swagger2.version}</version>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
<artifactId>springfox-bean-validators</artifactId>
<version>${springfox.version}</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
......
......@@ -15,7 +15,7 @@ import java.util.List;
@Component
@Primary
@AllArgsConstructor
public class SwaggerProvider implements SwaggerResourcesProvider {
public class SwaggerResourceConfig implements SwaggerResourcesProvider {
public static final String API_URI = "/v2/api-docs";
private final RouteLocator routeLocator;
......@@ -33,7 +33,8 @@ public class SwaggerProvider implements SwaggerResourcesProvider {
routeDefinition.getPredicates().stream()
.filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName()))
.filter(predicateDefinition -> !"datax-auth".equalsIgnoreCase(routeDefinition.getId()) ||
!"datax-service-data-api-call".equalsIgnoreCase(routeDefinition.getId()))
!"datax-service-data-api-mapping".equalsIgnoreCase(routeDefinition.getId()) ||
!"datax-service-data-console".equalsIgnoreCase(routeDefinition.getId()))
.forEach(predicateDefinition -> resources.add(swaggerResource(routeDefinition.getId(),
predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0")
.replace("/**", API_URI))));
......
package cn.datax.gateway.filter;
import cn.datax.gateway.config.SwaggerProvider;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
......@@ -10,17 +9,20 @@ import org.springframework.web.server.ServerWebExchange;
@Component
public class SwaggerHeaderFilter extends AbstractGatewayFilterFactory {
private static final String HEADER_NAME = "X-Forwarded-Prefix";
private static final String URI = "/v2/api-docs";
@Override
public GatewayFilter apply(Object config) {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
String path = request.getURI().getPath();
if (!StringUtils.endsWithIgnoreCase(path, SwaggerProvider.API_URI)) {
if (!StringUtils.endsWithIgnoreCase(path,URI )) {
return chain.filter(exchange);
}
String basePath = path.substring(0, path.lastIndexOf(SwaggerProvider.API_URI));
String basePath = path.substring(0, path.lastIndexOf(URI));
ServerHttpRequest newRequest = request.mutate().header(HEADER_NAME, basePath).build();
ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();
return chain.filter(newExchange);
......
......@@ -4,7 +4,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
import springfox.documentation.swagger.web.*;
......@@ -12,13 +11,14 @@ import springfox.documentation.swagger.web.*;
import java.util.Optional;
@RestController
@RequestMapping("/swagger-resources")
public class SwaggerHandler {
@Autowired(required = false)
private SecurityConfiguration securityConfiguration;
@Autowired(required = false)
private UiConfiguration uiConfiguration;
private final SwaggerResourcesProvider swaggerResources;
@Autowired
......@@ -27,19 +27,19 @@ public class SwaggerHandler {
}
@GetMapping("/configuration/security")
@GetMapping("/swagger-resources/configuration/security")
public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() {
return Mono.just(new ResponseEntity<>(
Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK));
}
@GetMapping("/configuration/ui")
@GetMapping("/swagger-resources/configuration/ui")
public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {
return Mono.just(new ResponseEntity<>(
Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));
}
@GetMapping("")
@GetMapping("/swagger-resources")
public Mono<ResponseEntity> swaggerResources() {
return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
}
......
......@@ -13,20 +13,25 @@
<dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-micro-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger2</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-bean-validators</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger-ui</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!--feign 依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
......
package cn.datax.service.codegen.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.bind.annotation.RequestMethod;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.*;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.*;
......@@ -20,6 +23,8 @@ import java.util.List;
@ConditionalOnProperty(prefix = "swagger", name = "enable", havingValue = "true")
@EnableConfigurationProperties(SwaggerProperties.class)
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfig {
@Autowired
......
package cn.datax.service.data.market.api.mapping.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.bind.annotation.RequestMethod;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.*;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.*;
......@@ -20,6 +23,8 @@ import java.util.List;
@ConditionalOnProperty(prefix = "swagger", name = "enable", havingValue = "true")
@EnableConfigurationProperties(SwaggerProperties.class)
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfig {
@Autowired
......
......@@ -13,20 +13,25 @@
<dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-micro-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger2</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-bean-validators</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger-ui</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!--feign 依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
......
package cn.datax.service.data.market.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.bind.annotation.RequestMethod;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.*;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.*;
......@@ -20,6 +23,8 @@ import java.util.List;
@ConditionalOnProperty(prefix = "swagger", name = "enable", havingValue = "true")
@EnableConfigurationProperties(SwaggerProperties.class)
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfig {
@Autowired
......
......@@ -13,20 +13,25 @@
<dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-micro-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger2</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-bean-validators</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger-ui</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!--feign 依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
......
package cn.datax.service.data.metadata.api.enums;
public enum DataLevel {
DATABASE("database", 1),
TABLE("table", 2),
COLUMN("column", 3);
private final String key;
private final Integer level;
DataLevel(String key, Integer level) {
this.key = key;
this.level = level;
}
public String getKey() {
return key;
}
public Integer getLevel() {
return level;
}
public static DataLevel getLevel(String key) {
for (DataLevel type : DataLevel.values()) {
if (type.key.equals(key)) {
return type;
}
}
return DATABASE;
}
}
......@@ -12,7 +12,7 @@ public class MetadataTreeVo implements Serializable {
private String id;
/**
* 数据类型 database、table、column
* 数据层级 database、table、column
*/
private String type;
private String label;
......
package cn.datax.service.data.metadata.console.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.bind.annotation.RequestMethod;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.*;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.*;
......@@ -20,6 +23,8 @@ import java.util.List;
@ConditionalOnProperty(prefix = "swagger", name = "enable", havingValue = "true")
@EnableConfigurationProperties(SwaggerProperties.class)
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfig {
@Autowired
......
package cn.datax.service.data.metadata.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.bind.annotation.RequestMethod;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.*;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.*;
......@@ -20,6 +23,8 @@ import java.util.List;
@ConditionalOnProperty(prefix = "swagger", name = "enable", havingValue = "true")
@EnableConfigurationProperties(SwaggerProperties.class)
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfig {
@Autowired
......
......@@ -150,12 +150,15 @@ public class MetadataColumnController extends BaseController {
}
/**
* 获取结构树
* 获取层级树
* @param level 层级database、table、column
* @return
*/
@GetMapping("/tree")
public R getDataMetadataTree() {
List<MetadataTreeVo> list = metadataColumnService.getDataMetadataTree();
@ApiOperation(value = "获取层级树", notes = "根据url的层级来获取树对象")
@ApiImplicitParam(name = "level", value = "层级", required = true, dataType = "String", paramType = "path")
@GetMapping("/tree/{level}")
public R getDataMetadataTree(@PathVariable String level) {
List<MetadataTreeVo> list = metadataColumnService.getDataMetadataTree(level);
return R.ok().setData(list);
}
}
......@@ -27,5 +27,5 @@ public interface MetadataColumnService extends BaseService<MetadataColumnEntity>
void deleteMetadataColumnBatch(List<String> ids);
List<MetadataTreeVo> getDataMetadataTree();
List<MetadataTreeVo> getDataMetadataTree(String level);
}
......@@ -4,6 +4,8 @@ import cn.datax.common.core.DataConstant;
import cn.datax.service.data.metadata.api.dto.MetadataColumnDto;
import cn.datax.service.data.metadata.api.entity.MetadataColumnEntity;
import cn.datax.service.data.metadata.api.entity.MetadataSourceEntity;
import cn.datax.service.data.metadata.api.entity.MetadataTableEntity;
import cn.datax.service.data.metadata.api.enums.DataLevel;
import cn.datax.service.data.metadata.api.vo.MetadataTreeVo;
import cn.datax.service.data.metadata.dao.MetadataSourceDao;
import cn.datax.service.data.metadata.dao.MetadataTableDao;
......@@ -11,9 +13,7 @@ import cn.datax.service.data.metadata.service.MetadataColumnService;
import cn.datax.service.data.metadata.mapstruct.MetadataColumnMapper;
import cn.datax.service.data.metadata.dao.MetadataColumnDao;
import cn.datax.common.base.BaseServiceImpl;
import cn.datax.service.system.api.entity.UserRoleEntity;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -21,6 +21,8 @@ import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* <p>
......@@ -81,14 +83,48 @@ public class MetadataColumnServiceImpl extends BaseServiceImpl<MetadataColumnDao
}
@Override
public List<MetadataTreeVo> getDataMetadataTree() {
// 参考分布式锁
// https://blog.csdn.net/qq_32099833/article/details/103848016
// metadataSourceDao.selectList(Wrappers.<MetadataSourceEntity>lambdaQuery()
// .eq(MetadataSourceEntity::getStatus, DataConstant.EnableState.ENABLE.getKey()));
public List<MetadataTreeVo> getDataMetadataTree(String level) {
List<MetadataSourceEntity> sourceList = metadataSourceDao.selectList(Wrappers.emptyWrapper());
// 参考递归
// https://blog.csdn.net/qq_19244927/article/details/106481777
return null;
List<MetadataTableEntity> tableList = metadataTableDao.selectList(Wrappers.emptyWrapper());
List<MetadataColumnEntity> columnList = metadataColumnDao.selectList(Wrappers.emptyWrapper());
List<MetadataTreeVo> list = sourceList.stream().filter(s -> DataConstant.EnableState.ENABLE.getKey().equals(s.getStatus()))
.map(m -> {
MetadataTreeVo tree = new MetadataTreeVo();
tree.setId(m.getId());
tree.setType(DataLevel.DATABASE.getKey());
tree.setLabel(m.getSourceName());
if (DataLevel.getLevel(level).getLevel() >= DataLevel.TABLE.getLevel()) {
tree.setChildren(getTableChildrens(m.getId(), level, tableList, columnList));
}
return tree;
}).collect(Collectors.toList());
return list;
}
private List<MetadataTreeVo> getTableChildrens(String id, String level, List<MetadataTableEntity> tableList, List<MetadataColumnEntity> columnList) {
List<MetadataTreeVo> children = tableList.stream().filter(m -> Objects.equals(id, m.getSourceId()))
.map(m -> {
MetadataTreeVo tree = new MetadataTreeVo();
tree.setId(m.getId());
tree.setType(DataLevel.TABLE.getKey());
tree.setLabel(StrUtil.isBlank(m.getTableComment()) ? m.getTableName() : m.getTableComment());
if (DataLevel.getLevel(level).getLevel() >= DataLevel.COLUMN.getLevel()) {
tree.setChildren(getColumnChildrens(m.getId(), columnList));
}
return tree;
}).collect(Collectors.toList());
return children;
}
private List<MetadataTreeVo> getColumnChildrens(String id, List<MetadataColumnEntity> columnList) {
List<MetadataTreeVo> children = columnList.stream().filter(m -> Objects.equals(id, m.getTableId()))
.map(m -> {
MetadataTreeVo tree = new MetadataTreeVo();
tree.setId(m.getId());
tree.setType(DataLevel.TABLE.getKey());
tree.setLabel(StrUtil.isBlank(m.getColumnComment()) ? m.getColumnName() : m.getColumnComment());
return tree;
}).collect(Collectors.toList());
return children;
}
}
......@@ -13,20 +13,25 @@
<dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-micro-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger2</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-bean-validators</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger-ui</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!--feign 依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
......
package cn.datax.service.data.visual.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.bind.annotation.RequestMethod;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.*;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.*;
......@@ -20,6 +23,8 @@ import java.util.List;
@ConditionalOnProperty(prefix = "swagger", name = "enable", havingValue = "true")
@EnableConfigurationProperties(SwaggerProperties.class)
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfig {
@Autowired
......
......@@ -13,20 +13,25 @@
<dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-micro-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger2</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-bean-validators</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger-ui</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!--feign 依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
......
package cn.datax.service.email.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.bind.annotation.RequestMethod;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.*;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.*;
......@@ -20,6 +23,8 @@ import java.util.List;
@ConditionalOnProperty(prefix = "swagger", name = "enable", havingValue = "true")
@EnableConfigurationProperties(SwaggerProperties.class)
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfig {
@Autowired
......
......@@ -13,20 +13,25 @@
<dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-micro-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger2</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-bean-validators</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger-ui</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!--feign 依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
......
package cn.datax.service.file.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.bind.annotation.RequestMethod;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.*;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.*;
......@@ -20,6 +23,8 @@ import java.util.List;
@ConditionalOnProperty(prefix = "swagger", name = "enable", havingValue = "true")
@EnableConfigurationProperties(SwaggerProperties.class)
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfig {
@Autowired
......
......@@ -13,20 +13,25 @@
<dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-micro-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger2</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-bean-validators</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger-ui</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!--feign 依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
......
package cn.datax.service.quartz.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.bind.annotation.RequestMethod;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.*;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.*;
......@@ -20,6 +23,8 @@ import java.util.List;
@ConditionalOnProperty(prefix = "swagger", name = "enable", havingValue = "true")
@EnableConfigurationProperties(SwaggerProperties.class)
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfig {
@Autowired
......
......@@ -13,20 +13,25 @@
<dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-micro-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger2</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-bean-validators</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger-ui</artifactId>-->
<!-- <version>${swagger2.version}</version>-->
<!-- </dependency>-->
<!--feign 依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
......
package cn.datax.service.system.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.bind.annotation.RequestMethod;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.*;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.*;
......@@ -20,6 +23,8 @@ import java.util.List;
@ConditionalOnProperty(prefix = "swagger", name = "enable", havingValue = "true")
@EnableConfigurationProperties(SwaggerProperties.class)
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfig {
@Autowired
......
......@@ -52,3 +52,10 @@ export function updateDataColumn (data) {
data: data
})
}
export function getDataMetadataTree (level) {
return request({
url: '/data/metadata/columns/tree/' + level,
method: 'get'
})
}
......@@ -9,23 +9,21 @@
</el-button-group>
</div>
<div :style="classCardbody">
<el-steps :active="active" finish-status="success" align-center>
<el-step title="数据源信息"></el-step>
<el-step title="连接信息"></el-step>
</el-steps>
<el-form ref="form" :model="form" :rules="rules" label-width="80px" v-if="active == 1">
<el-form-item label="数据源类型" prop="dbType">
<el-select v-model="form.dbType">
<el-option
v-for="item in dbTypeOptions"
:key="item.id"
:label="item.itemValue"
:value="item.itemText"
></el-option>
</el-select>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="源数据表主键" prop="objectId">
<el-input v-model="form.objectId" placeholder="请输入源数据表主键" />
</el-form-item>
<el-form-item label="数据源名称" prop="sourceName">
<el-input v-model="form.sourceName" placeholder="请输入数据源名称" />
<el-form-item label="源数据表的字段名" prop="fieldName">
<el-input v-model="form.fieldName" placeholder="请输入源数据表的字段名" />
</el-form-item>
<el-form-item label="原来的值" prop="fieldOldValue">
<el-input v-model="form.fieldOldValue" placeholder="请输入原来的值" />
</el-form-item>
<el-form-item label="最新的值" prop="fieldNewValue">
<el-input v-model="form.fieldNewValue" placeholder="请输入最新的值" />
</el-form-item>
<el-form-item label="版本号" prop="version">
<el-input v-model="form.version" placeholder="请输入版本号" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
......@@ -40,38 +38,13 @@
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<el-form ref="form2" :model="form2" :rules="rules2" label-width="80px" v-if="active == 2">
<el-form-item label="主机" prop="host">
<el-input v-model="form2.host" placeholder="请输入主机" />
</el-form-item>
<el-form-item label="端口" prop="port">
<el-input v-model="form2.port" placeholder="请输入端口" />
</el-form-item>
<el-form-item label="服务名" prop="sid" v-if="form.dbType === '3' || form.dbType === '4'">
<el-input v-model="form2.sid" placeholder="请输入服务名" />
</el-form-item>
<el-form-item label="数据库" prop="dbName" v-if="form.dbType !== '3' && form.dbType !== '4'">
<el-input v-model="form2.dbName" placeholder="请输入数据库" />
</el-form-item>
<el-form-item label="用户名" prop="username">
<el-input v-model="form2.username" placeholder="请输入用户名" />
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="form2.password" placeholder="请输入密码" />
</el-form-item>
<el-form-item>
<el-button size="mini" type="primary" @click="handleCheckConnection">连通性检测</el-button>
</el-form-item>
</el-form>
<el-button style="margin-top: 12px;" @click="handleNextStep" v-if="active == 1">下一步</el-button>
<el-button style="margin-top: 12px;" @click="handleLastStep" v-if="active == 2">上一步</el-button>
</div>
</el-card>
</div>
</template>
<script>
import { addDataSource, checkConnection } from '@/api/metadata/datasource'
import { addChangeRecord } from '@/api/metadata/changerecord'
export default {
name: 'ChangeRecordAdd',
......@@ -104,58 +77,30 @@ export default {
loadingText: '保存',
isDisabled: false
},
active: 1,
// 表单参数
form: {
id: undefined,
dbType: undefined,
themeId: undefined,
sourceName: undefined,
dbSchema: {},
status: '1',
remark: undefined
status: '1'
},
// 表单校验
rules: {
dbType: [
{ required: true, message: '数据源类型不能为空', trigger: 'change' }
],
sourceName: [
{ required: true, message: '数据源名称不能为空', trigger: 'blur' }
]
},
form2: {
host: undefined,
port: undefined,
dbName: undefined,
username: undefined,
password: undefined,
sid: undefined
},
rules2: {
host: [
{ required: true, message: '主机不能为空', trigger: 'blur' }
objectId: [
{ required: true, message: '源数据表主键不能为空', trigger: 'blur' }
],
port: [
{ required: true, message: '端口不能为空', trigger: 'blur' }
fieldName: [
{ required: true, message: '数据表的字段名不能为空', trigger: 'blur' }
],
sid: [
{ required: true, message: '服务名不能为空', trigger: 'blur' }
fieldOldValue: [
{ required: true, message: '原来的值不能为空', trigger: 'blur' }
],
dbName: [
{ required: true, message: '数据库不能为空', trigger: 'blur' }
fieldNewValue: [
{ required: true, message: '最新的值不能为空', trigger: 'blur' }
],
username: [
{ required: true, message: '用户名不能为空', trigger: 'blur' }
],
password: [
{ required: true, message: '密码不能为空', trigger: 'blur' }
version: [
{ required: true, message: '版本号不能为空', trigger: 'blur' }
]
},
// 状态数据字典
statusOptions: [],
// 数据源类型数据字典
dbTypeOptions: []
statusOptions: []
}
},
created () {
......@@ -164,50 +109,19 @@ export default {
this.statusOptions = response.data
}
})
this.getDicts('data_db_type').then(response => {
if (response.success) {
this.dbTypeOptions = response.data
}
})
},
methods: {
showCard () {
this.$emit('showCard', this.showOptions)
},
/** 步骤条下一步 */
handleNextStep () {
this.$refs['form'].validate(valid => {
if (valid) {
this.active++
}
})
},
/** 步骤条上一步 */
handleLastStep () {
this.active--
},
/** 检测数据库连通性 */
handleCheckConnection () {
this.$refs['form2'].validate(valid => {
if (valid) {
this.form.dbSchema = this.form2
checkConnection(this.form).then(response => {
if (response.success) {
this.$message.success('连接成功')
}
})
}
})
},
/** 提交按钮 */
submitForm: function () {
this.$refs['form2'].validate(valid => {
this.$refs['form'].validate(valid => {
if (valid) {
this.form.dbSchema = this.form2
this.loadingOptions.loading = true
this.loadingOptions.loadingText = '保存中...'
this.loadingOptions.isDisabled = true
addDataSource(this.form).then(response => {
addChangeRecord(this.form).then(response => {
if (response.success) {
this.$message.success('保存成功')
setTimeout(() => {
......
......@@ -4,30 +4,25 @@
<div slot="header" class="clearfix">
<span>{{ title }}</span>
<el-button-group style="float: right;">
<el-button size="mini" icon="el-icon-coin" type="primary" round @click="handleSync">元数据同步</el-button>
<el-button size="mini" icon="el-icon-coin" type="primary" round @click="handleWord">数据库文档</el-button>
<el-button size="mini" icon="el-icon-coin" type="primary" round @click="handleCheckConnection" v-if="active == 2">连通性检测</el-button>
<el-button size="mini" icon="el-icon-back" round @click="showCard">返回</el-button>
</el-button-group>
</div>
<div :style="classCardbody">
<el-steps :active="active" finish-status="success" align-center>
<el-step title="数据源信息"></el-step>
<el-step title="连接信息"></el-step>
</el-steps>
<el-form ref="form" :model="form" label-width="80px" v-if="active == 1" disabled>
<el-form-item label="数据源类型" prop="dbType">
<el-select v-model="form.dbType">
<el-option
v-for="item in dbTypeOptions"
:key="item.id"
:label="item.itemValue"
:value="item.itemText"
></el-option>
</el-select>
<el-form ref="form" :model="form" label-width="80px" disabled>
<el-form-item label="源数据表主键" prop="objectId">
<el-input v-model="form.objectId" />
</el-form-item>
<el-form-item label="数据源名称" prop="sourceName">
<el-input v-model="form.sourceName" placeholder="请输入数据源名称" />
<el-form-item label="源数据表的字段名" prop="fieldName">
<el-input v-model="form.fieldName" />
</el-form-item>
<el-form-item label="原来的值" prop="fieldOldValue">
<el-input v-model="form.fieldOldValue" />
</el-form-item>
<el-form-item label="最新的值" prop="fieldNewValue">
<el-input v-model="form.fieldNewValue" />
</el-form-item>
<el-form-item label="版本号" prop="version">
<el-input v-model="form.version" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
......@@ -39,38 +34,16 @@
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<el-form ref="form2" :model="form2" label-width="80px" v-if="active == 2" disabled>
<el-form-item label="主机" prop="host">
<el-input v-model="form2.host" placeholder="请输入主机" />
</el-form-item>
<el-form-item label="端口" prop="port">
<el-input v-model="form2.port" placeholder="请输入端口" />
</el-form-item>
<el-form-item label="服务名" prop="sid" v-if="form.dbType === '3' || form.dbType === '4'">
<el-input v-model="form2.sid" placeholder="请输入服务名" />
</el-form-item>
<el-form-item label="数据库" prop="dbName" v-if="form.dbType !== '3' || form.dbType !== '4'">
<el-input v-model="form2.dbName" placeholder="请输入数据库" />
</el-form-item>
<el-form-item label="用户名" prop="username">
<el-input v-model="form2.username" placeholder="请输入用户名" />
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="form2.password" placeholder="请输入密码" />
<el-input v-model="form.remark" type="textarea" />
</el-form-item>
</el-form>
<el-button style="margin-top: 12px;" @click="handleNextStep" v-if="active == 1">下一步</el-button>
<el-button style="margin-top: 12px;" @click="handleLastStep" v-if="active == 2">上一步</el-button>
</div>
</el-card>
</div>
</template>
<script>
import { getDataSource, checkConnection, sync, word } from '@/api/metadata/datasource'
import { getChangeRecord } from '@/api/metadata/changerecord'
export default {
name: 'ChangeRecordDetail',
......@@ -97,14 +70,10 @@ export default {
showEdit: false,
showDetail: false
},
active: 1,
// 表单参数
form: {},
form2: {},
// 状态数据字典
statusOptions: [],
// 数据源类型数据字典
dbTypeOptions: []
statusOptions: []
}
},
created () {
......@@ -114,75 +83,19 @@ export default {
this.statusOptions = response.data
}
})
this.getDicts('data_db_type').then(response => {
if (response.success) {
this.dbTypeOptions = response.data
}
})
},
mounted () {
this.getDataSource(this.data.id)
this.getChangeRecord(this.data.id)
},
methods: {
showCard () {
this.$emit('showCard', this.showOptions)
},
/** 获取详情 */
getDataSource: function (id) {
getDataSource(id).then(response => {
getChangeRecord: function (id) {
getChangeRecord(id).then(response => {
if (response.success) {
this.form = response.data
this.form2 = this.form.dbSchema
}
})
},
/** 步骤条下一步 */
handleNextStep () {
this.$refs['form'].validate(valid => {
if (valid) {
this.active++
}
})
},
/** 步骤条上一步 */
handleLastStep () {
this.active--
},
/** 检测数据库连通性 */
handleCheckConnection () {
checkConnection(this.form).then(response => {
if (response.success) {
this.$message.success('连接成功')
}
})
},
/** 元数据同步 */
handleSync () {
sync(this.data.id).then(response => {
if (response.success) {
this.$message.success('元数据正在后台同步中,请到元数据管理中查看结果')
}
})
},
/** 数据库文档 */
handleWord () {
word(this.data.id).then(response => {
const blob = new Blob([response])
const fileName = '数据库设计文档.doc'
if ('download' in document.createElement('a')) {
// 非IE下载
const elink = document.createElement('a')
elink.download = fileName
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href)
// 释放URL 对象
document.body.removeChild(elink)
} else {
// IE10+下载
navigator.msSaveBlob(blob, fileName)
}
})
}
......
......@@ -9,23 +9,21 @@
</el-button-group>
</div>
<div :style="classCardbody">
<el-steps :active="active" finish-status="success" align-center>
<el-step title="数据源信息"></el-step>
<el-step title="连接信息"></el-step>
</el-steps>
<el-form ref="form" :model="form" :rules="rules" label-width="80px" v-if="active == 1">
<el-form-item label="数据源类型" prop="dbType">
<el-select v-model="form.dbType">
<el-option
v-for="item in dbTypeOptions"
:key="item.id"
:label="item.itemValue"
:value="item.itemText"
></el-option>
</el-select>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="源数据表主键" prop="objectId">
<el-input v-model="form.objectId" placeholder="请输入源数据表主键" />
</el-form-item>
<el-form-item label="数据源名称" prop="sourceName">
<el-input v-model="form.sourceName" placeholder="请输入数据源名称" />
<el-form-item label="源数据表的字段名" prop="fieldName">
<el-input v-model="form.fieldName" placeholder="请输入源数据表的字段名" />
</el-form-item>
<el-form-item label="原来的值" prop="fieldOldValue">
<el-input v-model="form.fieldOldValue" placeholder="请输入原来的值" />
</el-form-item>
<el-form-item label="最新的值" prop="fieldNewValue">
<el-input v-model="form.fieldNewValue" placeholder="请输入最新的值" />
</el-form-item>
<el-form-item label="版本号" prop="version">
<el-input v-model="form.version" placeholder="请输入版本号" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
......@@ -40,38 +38,13 @@
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<el-form ref="form2" :model="form2" :rules="rules2" label-width="80px" v-if="active == 2">
<el-form-item label="主机" prop="host">
<el-input v-model="form2.host" placeholder="请输入主机" />
</el-form-item>
<el-form-item label="端口" prop="port">
<el-input v-model="form2.port" placeholder="请输入端口" />
</el-form-item>
<el-form-item label="服务名" prop="sid" v-if="form.dbType === '3' || form.dbType === '4'">
<el-input v-model="form2.sid" placeholder="请输入服务名" />
</el-form-item>
<el-form-item label="数据库" prop="dbName" v-if="form.dbType !== '3' && form.dbType !== '4'">
<el-input v-model="form2.dbName" placeholder="请输入数据库" />
</el-form-item>
<el-form-item label="用户名" prop="username">
<el-input v-model="form2.username" placeholder="请输入用户名" />
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="form2.password" placeholder="请输入密码" />
</el-form-item>
<el-form-item>
<el-button size="mini" type="primary" @click="handleCheckConnection">连通性检测</el-button>
</el-form-item>
</el-form>
<el-button style="margin-top: 12px;" @click="handleNextStep" v-if="active == 1">下一步</el-button>
<el-button style="margin-top: 12px;" @click="handleLastStep" v-if="active == 2">上一步</el-button>
</div>
</el-card>
</div>
</template>
<script>
import { getDataSource, updateDataSource, checkConnection } from '@/api/metadata/datasource'
import { getChangeRecord, updateChangeRecord } from '@/api/metadata/changerecord'
export default {
name: 'ChangeRecordEdit',
......@@ -104,43 +77,28 @@ export default {
loadingText: '保存',
isDisabled: false
},
active: 1,
// 表单参数
form: {},
// 表单校验
rules: {
dbType: [
{ required: true, message: '数据源类型不能为空', trigger: 'change' }
],
sourceName: [
{ required: true, message: '数据源名称不能为空', trigger: 'blur' }
]
},
form2: {},
rules2: {
host: [
{ required: true, message: '主机不能为空', trigger: 'blur' }
objectId: [
{ required: true, message: '源数据表主键不能为空', trigger: 'blur' }
],
port: [
{ required: true, message: '端口不能为空', trigger: 'blur' }
fieldName: [
{ required: true, message: '数据表的字段名不能为空', trigger: 'blur' }
],
sid: [
{ required: true, message: '服务名不能为空', trigger: 'blur' }
fieldOldValue: [
{ required: true, message: '原来的值不能为空', trigger: 'blur' }
],
dbName: [
{ required: true, message: '数据库不能为空', trigger: 'blur' }
fieldNewValue: [
{ required: true, message: '最新的值不能为空', trigger: 'blur' }
],
username: [
{ required: true, message: '用户名不能为空', trigger: 'blur' }
],
password: [
{ required: true, message: '密码不能为空', trigger: 'blur' }
version: [
{ required: true, message: '版本号不能为空', trigger: 'blur' }
]
},
// 状态数据字典
statusOptions: [],
// 数据源类型数据字典
dbTypeOptions: []
statusOptions: []
}
},
created () {
......@@ -150,50 +108,19 @@ export default {
this.statusOptions = response.data
}
})
this.getDicts('data_db_type').then(response => {
if (response.success) {
this.dbTypeOptions = response.data
}
})
},
mounted () {
this.getDataSource(this.data.id)
this.getChangeRecord(this.data.id)
},
methods: {
showCard () {
this.$emit('showCard', this.showOptions)
},
/** 获取详情 */
getDataSource: function (id) {
getDataSource(id).then(response => {
getChangeRecord: function (id) {
getChangeRecord(id).then(response => {
if (response.success) {
this.form = response.data
this.form2 = this.form.dbSchema
}
})
},
/** 步骤条下一步 */
handleNextStep () {
this.$refs['form'].validate(valid => {
if (valid) {
this.active++
}
})
},
/** 步骤条上一步 */
handleLastStep () {
this.active--
},
/** 检测数据库连通性 */
handleCheckConnection () {
this.$refs['form2'].validate(valid => {
if (valid) {
this.form.dbSchema = this.form2
checkConnection(this.form).then(response => {
if (response.success) {
this.$message.success('连接成功')
}
})
}
})
},
......@@ -201,11 +128,10 @@ export default {
submitForm: function () {
this.$refs['form2'].validate(valid => {
if (valid) {
this.form.dbSchema = this.form2
this.loadingOptions.loading = true
this.loadingOptions.loadingText = '保存中...'
this.loadingOptions.isDisabled = true
updateDataSource(this.form).then(response => {
updateChangeRecord(this.form).then(response => {
if (response.success) {
this.$message.success('保存成功')
setTimeout(() => {
......
......@@ -2,10 +2,10 @@
<div>
<el-card class="box-card" shadow="always">
<el-form :model="queryParams" ref="queryForm" :inline="true">
<el-form-item label="数据源名称" prop="sourceName">
<el-form-item label="字段名称" prop="fieldName">
<el-input
v-model="queryParams.sourceName"
placeholder="请输入数据源名称"
v-model="queryParams.fieldName"
placeholder="请输入字段名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
......@@ -90,7 +90,7 @@
<el-table
v-loading="loading"
:data="dataSourceList"
:data="changeRecordList"
@selection-change="handleSelectionChange"
border
tooltip-effect="dark"
......@@ -158,7 +158,7 @@
</template>
<script>
import { pageDataSource, delDataSource, delDataSources } from '@/api/metadata/datasource'
import { pageChangeRecord, delChangeRecord, delChangeRecords } from '@/api/metadata/changerecord'
export default {
name: 'ChangeRecordList',
......@@ -183,7 +183,11 @@ export default {
multiple: true,
// 表格头
tableColumns: [
{ prop: 'sourceName', label: '数据源名称', show: true },
{ prop: 'objectId', label: '源数据表主键', show: true },
{ prop: 'fieldName', label: '源数据表的字段名', show: true },
{ prop: 'fieldOldValue', label: '原来的值', show: true },
{ prop: 'fieldNewValue', label: '最新的值', show: true },
{ prop: 'version', label: '版本号', show: true },
{
prop: 'status',
label: '状态',
......@@ -197,15 +201,15 @@ export default {
tableSize: 'medium',
// 状态数据字典
statusOptions: [],
// 数据源表格数据
dataSourceList: [],
// 表格数据
changeRecordList: [],
// 总数据条数
total: 0,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 20,
sourceName: ''
fieldName: ''
}
}
},
......@@ -224,11 +228,11 @@ export default {
/** 查询数据源列表 */
getList () {
this.loading = true
pageDataSource(this.queryParams).then(response => {
pageChangeRecord(this.queryParams).then(response => {
this.loading = false
if (response.success) {
const { data } = response
this.dataSourceList = data.data
this.changeRecordList = data.data
this.total = data.total
}
})
......@@ -302,7 +306,7 @@ export default {
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
delDataSource(row.id)
delChangeRecord(row.id)
}).then(() => {
this.$message.success('删除成功')
this.getList()
......
<template>
<div>
<el-card class="box-card" shadow="always">
<div slot="header" class="clearfix">
<span>{{ title }}</span>
<el-button-group style="float: right;">
<el-button size="mini" icon="el-icon-back" round @click="showCard">返回</el-button>
</el-button-group>
</div>
<div :style="classCardbody">
<el-form ref="form" :model="form" label-width="80px" disabled>
<el-form-item label="字段名称" prop="columnName">
<el-input v-model="form.columnName" />
</el-form-item>
<el-form-item label="字段注释" prop="columnComment">
<el-input v-model="form.columnComment" />
</el-form-item>
<el-form-item label="是否主键" prop="columnKey">
<el-input v-model="form.columnKey" />
</el-form-item>
<el-form-item label="是否允许为空" prop="columnNullable">
<el-input v-model="form.columnNullable" />
</el-form-item>
<el-form-item label="数据类型" prop="dataType">
<el-input v-model="form.dataType" />
</el-form-item>
<el-form-item label="数据长度" prop="dataLength">
<el-input v-model="form.dataLength" />
</el-form-item>
<el-form-item label="数据精度" prop="dataPrecision">
<el-input v-model="form.dataPrecision" />
</el-form-item>
<el-form-item label="数据小数位" prop="dataScale">
<el-input v-model="form.dataScale" />
</el-form-item>
<el-form-item label="数据默认值" prop="dataDefault">
<el-input v-model="form.dataDefault" />
</el-form-item>
</el-form>
</div>
</el-card>
</div>
</template>
<script>
import { getDataColumn } from '@/api/metadata/datacolumn'
export default {
name: 'DataColumnDetail',
props: {
data: {
type: Object,
default: function () {
return {}
}
}
},
data () {
return {
classCardbody: {
overflow: 'auto',
height: document.body.offsetHeight - 240 + 'px'
},
title: '元数据详情',
// 展示切换
showOptions: {
data: {},
showList: true,
showDetail: false
},
// 表单参数
form: {}
}
},
created () {
console.log('id:' + this.data.id)
},
mounted () {
this.getDataColumn(this.data.id)
},
methods: {
showCard () {
this.$emit('showCard', this.showOptions)
},
/** 获取详情 */
getDataColumn: function (id) {
getDataColumn(id).then(response => {
if (response.success) {
this.form = response.data
}
})
}
}
}
</script>
<style lang="scss" scoped>
</style>
<template>
<div class="app-container">
DataColumn
<transition name="el-zoom-in-center">
<data-column-list v-if="options.showList" @showCard="showCard"></data-column-list>
</transition>
<transition name="el-zoom-in-bottom">
<data-column-detail v-if="options.showDetail" :data="options.data" @showCard="showCard"></data-column-detail>
</transition>
</div>
</template>
<script>
import DataColumnList from './DataColumnList'
import DataColumnDetail from './DataColumnDetail'
export default {
name: 'DataColumn'
name: 'DataColumn',
components: { DataColumnList, DataColumnDetail },
data () {
return {
options: {
data: {},
showList: true,
showDetail: false
}
}
},
methods: {
showCard (data) {
Object.assign(this.options, data)
}
}
}
</script>
......
<template>
<div class="app-container">
DataMap
</div>
</template>
<script>
export default {
name: 'DataMap'
}
</script>
<style lang="scss" scoped>
</style>
......@@ -42,7 +42,9 @@
<commons.codec.version>1.13</commons.codec.version>
<commons.beanutils.version>1.9.4</commons.beanutils.version>
<common-pool.version>2.7.0</common-pool.version>
<swagger2.version>2.9.2</swagger2.version>
<knife4j.version>2.0.4</knife4j.version>
<swagger.version>1.6.2</swagger.version>
<springfox.version>2.9.2</springfox.version>
<mapstruct.version>1.3.1.Final</mapstruct.version>
<aliyun-sdk-oss.version>3.6.0</aliyun-sdk-oss.version>
<qiniu-java-sdk.version>7.2.25</qiniu-java-sdk.version>
......@@ -53,7 +55,7 @@
<sqlserver.version>8.2.1.jre8</sqlserver.version>
<zxing.version>3.4.0</zxing.version>
<aspose.version>20.3</aspose.version>
<redisson.version>3.12.5</redisson.version>
<redisson.version>3.13.3</redisson.version>
<jasperreports.version>6.12.2</jasperreports.version>
<mybatis-spring.version>2.1.2</mybatis-spring.version>
<bitwalker.version>1.21</bitwalker.version>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment