Commit 9579d532 by yuwei

项目初始化

parent 1891a5c0
...@@ -60,21 +60,21 @@ spring: ...@@ -60,21 +60,21 @@ spring:
args: args:
name: fileHystrix name: fileHystrix
fallbackUri: forward:/fallback fallbackUri: forward:/fallback
# 数据工厂中心 # 元数据管理
- id: datax-service-data-factory - id: datax-service-data-metadata
uri: lb://datax-service-data-factory uri: lb://datax-service-data-metadata
predicates: predicates:
- Path=/data/factory/** - Path=/data/metadata/**
filters: filters:
- SwaggerHeaderFilter - SwaggerHeaderFilter
- StripPrefix=2 - StripPrefix=2
- name: Hystrix - name: Hystrix
args: args:
name: dataFactoryHystrix name: dataMetadataHystrix
fallbackUri: forward:/fallback fallbackUri: forward:/fallback
# 数据SQL工作台 # 数据SQL工作台
- id: datax-service-data-sql-console - id: datax-service-data-console
uri: lb://datax-service-data-sql-console uri: lb://datax-service-data-console
predicates: predicates:
- Path=/data/console/** - Path=/data/console/**
filters: filters:
...@@ -108,17 +108,17 @@ spring: ...@@ -108,17 +108,17 @@ spring:
args: args:
name: dataApiMappingHystrix name: dataApiMappingHystrix
fallbackUri: forward:/fallback fallbackUri: forward:/fallback
# 元数据管理 # 数据可视化
- id: datax-service-data-metadata - id: datax-service-data-visual
uri: lb://datax-service-data-metadata uri: lb://datax-service-data-visual
predicates: predicates:
- Path=/data/metadata/** - Path=/data/visual/**
filters: filters:
- SwaggerHeaderFilter - SwaggerHeaderFilter
- StripPrefix=2 - StripPrefix=2
- name: Hystrix - name: Hystrix
args: args:
name: dataMetadataHystrix name: dataVisualHystrix
fallbackUri: forward:/fallback fallbackUri: forward:/fallback
# 定时任务 # 定时任务
- id: datax-service-quartz - id: datax-service-quartz
......
...@@ -48,7 +48,7 @@ spring: ...@@ -48,7 +48,7 @@ spring:
mybatis-plus: mybatis-plus:
mapper-locations: classpath*:mapper/*Mapper.xml mapper-locations: classpath*:mapper/*Mapper.xml
type-aliases-package: cn.datax.service.data.factory.api.entity type-aliases-package: cn.datax.service.data.metadata.api.entity
global-config: global-config:
db-config: db-config:
id-type: ASSIGN_ID id-type: ASSIGN_ID
......
...@@ -48,7 +48,7 @@ spring: ...@@ -48,7 +48,7 @@ spring:
mybatis-plus: mybatis-plus:
mapper-locations: classpath*:mapper/*Mapper.xml mapper-locations: classpath*:mapper/*Mapper.xml
type-aliases-package: cn.datax.service.data.factory.api.entity type-aliases-package: cn.datax.service.data.visual.api.entity
global-config: global-config:
db-config: db-config:
id-type: ASSIGN_ID id-type: ASSIGN_ID
......
server: server:
port: 8710 port: 8830
spring: spring:
application: application:
......
package cn.datax.service.data.factory.api.dto;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* <p>
* 数据主题信息表 实体DTO
* </p>
*
* @author yuwei
* @since 2020-07-26
*/
@ApiModel(value = "数据主题信息表Model")
@Data
public class DataThemeDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "主题名称")
@NotBlank(message = "主题名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String themeName;
}
package cn.datax.service.data.factory.api.entity;
import cn.datax.common.base.DataScopeBaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 数据主题信息表
* </p>
*
* @author yuwei
* @since 2020-07-26
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("factory_theme")
public class DataThemeEntity extends DataScopeBaseEntity {
private static final long serialVersionUID=1L;
/**
* 数据主题
*/
private String themeName;
}
package cn.datax.service.data.factory.api.feign;
import cn.datax.service.data.factory.api.entity.DataSetEntity;
import cn.datax.service.data.factory.api.feign.factory.DataSetServiceFeignFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(contextId = "dataSetServiceFeign", value = "datax-service-data-factory", fallbackFactory = DataSetServiceFeignFallbackFactory.class)
public interface DataSetServiceFeign {
@GetMapping("/inner/sets/{id}")
DataSetEntity getDataSetById(@PathVariable("id") String id);
}
package cn.datax.service.data.factory.api.feign;
import cn.datax.service.data.factory.api.entity.DataSourceEntity;
import cn.datax.service.data.factory.api.feign.factory.DataSourceServiceFeignFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
@FeignClient(contextId = "dataSourceServiceFeign", value = "datax-service-data-factory", fallbackFactory = DataSourceServiceFeignFallbackFactory.class)
public interface DataSourceServiceFeign {
@GetMapping("/inner/sources/{id}")
DataSourceEntity getDataSourceById(@PathVariable("id") String id);
@PutMapping("/inner/sources/sync/{id}")
void updateDataSourceSyncById(@PathVariable("id") String id);
}
package cn.datax.service.data.factory.api.feign.factory;
import cn.datax.service.data.factory.api.feign.DataSetServiceFeign;
import cn.datax.service.data.factory.api.feign.fallback.DataSetServiceFeignFallbackImpl;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
@Component
public class DataSetServiceFeignFallbackFactory implements FallbackFactory<DataSetServiceFeign> {
@Override
public DataSetServiceFeign create(Throwable throwable) {
DataSetServiceFeignFallbackImpl dataSetServiceFeignFallback = new DataSetServiceFeignFallbackImpl();
dataSetServiceFeignFallback.setCause(throwable);
return dataSetServiceFeignFallback;
}
}
package cn.datax.service.data.factory.api.feign.factory;
import cn.datax.service.data.factory.api.feign.DataSourceServiceFeign;
import cn.datax.service.data.factory.api.feign.fallback.DataSourceServiceFeignFallbackImpl;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
@Component
public class DataSourceServiceFeignFallbackFactory implements FallbackFactory<DataSourceServiceFeign> {
@Override
public DataSourceServiceFeign create(Throwable throwable) {
DataSourceServiceFeignFallbackImpl dataSourceServiceFeignFallback = new DataSourceServiceFeignFallbackImpl();
dataSourceServiceFeignFallback.setCause(throwable);
return dataSourceServiceFeignFallback;
}
}
package cn.datax.service.data.factory.api.feign.fallback;
import cn.datax.service.data.factory.api.entity.DataSetEntity;
import cn.datax.service.data.factory.api.feign.DataSetServiceFeign;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class DataSetServiceFeignFallbackImpl implements DataSetServiceFeign {
@Setter
private Throwable cause;
@Override
public DataSetEntity getDataSetById(String id) {
log.error("feign 调用{}出错", id, cause);
return null;
}
}
package cn.datax.service.data.factory.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 数据主题信息表 查询实体
* </p>
*
* @author yuwei
* @since 2020-07-26
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class DataThemeQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
private String themeName;
}
package cn.datax.service.data.factory.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 数据主题信息表 实体VO
* </p>
*
* @author yuwei
* @since 2020-07-26
*/
@Data
public class DataThemeVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private String status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String remark;
private String themeName;
}
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.datax.service.data.factory.api.feign.factory.DataSourceServiceFeignFallbackFactory,\
cn.datax.service.data.factory.api.feign.fallback.DataSourceServiceFeignFallbackImpl,\
cn.datax.service.data.factory.api.feign.factory.DataSetServiceFeignFallbackFactory,\
cn.datax.service.data.factory.api.feign.fallback.DataSetServiceFeignFallbackImpl
package cn.datax.service.data.factory.controller;
import cn.datax.common.core.DataConstant;
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.data.factory.api.dto.DataSetDto;
import cn.datax.service.data.factory.api.dto.SqlParseDto;
import cn.datax.service.data.factory.api.entity.DataSetEntity;
import cn.datax.service.data.factory.api.vo.DataSetVo;
import cn.datax.service.data.factory.api.query.DataSetQuery;
import cn.datax.service.data.factory.mapstruct.DataSetMapper;
import cn.datax.service.data.factory.service.DataSetService;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import cn.datax.common.base.BaseController;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
* 数据集信息表 前端控制器
* </p>
*
* @author yuwei
* @since 2020-03-20
*/
@Api(tags = {"数据集信息表"})
@RestController
@RequestMapping("/dataSets")
public class DataSetController extends BaseController {
@Autowired
private DataSetService dataSetService;
@Autowired
private DataSetMapper dataSetMapper;
/**
* 通过ID查询信息
*
* @param id
* @return
*/
@ApiOperation(value = "获取详细信息", notes = "根据url的id来获取详细信息")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@GetMapping("/{id}")
public R getDataSetById(@PathVariable String id) {
DataSetEntity dataSetEntity = dataSetService.getDataSetById(id);
return R.ok().setData(dataSetMapper.toVO(dataSetEntity));
}
@ApiOperation(value = "获取列表", notes = "")
@GetMapping("/list")
public R getDataSetList() {
QueryWrapper<DataSetEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", DataConstant.EnableState.ENABLE.getKey());
List<DataSetEntity> list = dataSetService.list(queryWrapper);
List<DataSetVo> collect = list.stream().map(dataSetMapper::toVO).collect(Collectors.toList());
return R.ok().setData(collect);
}
/**
* 分页查询信息
*
* @param dataSetQuery
* @return
*/
@ApiOperation(value = "分页查询", notes = "")
@ApiImplicitParams({
@ApiImplicitParam(name = "dataSetQuery", value = "查询实体dataSetQuery", required = true, dataTypeClass = DataSetQuery.class)
})
@GetMapping("/page")
public R getDataSetPage(DataSetQuery dataSetQuery) {
QueryWrapper<DataSetEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(dataSetQuery.getSetName()), "set_name", dataSetQuery.getSetName());
IPage<DataSetEntity> page = dataSetService.page(new Page<>(dataSetQuery.getPageNum(), dataSetQuery.getPageSize()), queryWrapper);
List<DataSetVo> collect = page.getRecords().stream().map(dataSetMapper::toVO).collect(Collectors.toList());
JsonPage<DataSetVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
return R.ok().setData(jsonPage);
}
/**
* 添加
* @param dataSet
* @return
*/
@ApiOperation(value = "添加信息", notes = "根据dataSet对象添加信息")
@ApiImplicitParam(name = "dataSet", value = "详细实体dataSet", required = true, dataType = "DataSetDto")
@PostMapping()
public R saveDataSet(@RequestBody @Validated({ValidationGroups.Insert.class}) DataSetDto dataSet) {
dataSetService.saveDataSet(dataSet);
return R.ok();
}
/**
* 修改
* @param dataSet
* @return
*/
@ApiOperation(value = "修改信息", notes = "根据url的id来指定修改对象,并根据传过来的信息来修改详细信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "dataSet", value = "详细实体dataSet", required = true, dataType = "DataSetDto")
})
@PutMapping("/{id}")
public R updateDataSet(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) DataSetDto dataSet) {
dataSetService.updateDataSet(dataSet);
return R.ok();
}
/**
* 删除
* @param id
* @return
*/
@ApiOperation(value = "删除", notes = "根据url的id来指定删除对象")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping("/{id}")
public R deleteDataSetById(@PathVariable String id) {
dataSetService.deleteDataSetById(id);
return R.ok();
}
@ApiOperation(value = "批量删除", notes = "根据url的ids来批量删除对象")
@ApiImplicitParam(name = "ids", value = "ID集合", required = true, dataType = "List", paramType = "path")
@DeleteMapping("/batch/{ids}")
public R deleteDataSetBatch(@PathVariable List<String> ids) {
dataSetService.deleteDataSetBatch(ids);
return R.ok();
}
/**
* SQL解析
* @param sqlParseDto
* @return
*/
@ApiOperation(value = "SQL解析")
@ApiImplicitParam(name = "sqlParseDto", value = "SQL解析实体sqlParseDto", required = true, dataType = "SqlParseDto")
@PostMapping("/sql/analyse")
public R sqlAnalyse(@RequestBody @Validated SqlParseDto sqlParseDto) {
List<String> list = dataSetService.sqlAnalyse(sqlParseDto);
return R.ok().setData(list);
}
}
package cn.datax.service.data.factory.controller;
import cn.datax.common.base.BaseController;
import cn.datax.service.data.factory.api.entity.DataSetEntity;
import cn.datax.service.data.factory.api.entity.DataSourceEntity;
import cn.datax.service.data.factory.service.DataSetService;
import cn.datax.service.data.factory.service.DataSourceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/inner")
public class InnerController extends BaseController {
@Autowired
private DataSourceService dataSourceService;
@Autowired
private DataSetService dataSetService;
@GetMapping("/sources/{id}")
public DataSourceEntity getDataSourceById(@PathVariable("id") String id) {
DataSourceEntity dataSourceEntity = dataSourceService.getDataSourceById(id);
return dataSourceEntity;
}
@PutMapping("/sources/sync/{id}")
public void updateDataSourceSyncById(@PathVariable("id") String id) {
dataSourceService.updateDataSourceSyncById(id);
}
@GetMapping("/sets/{id}")
public DataSetEntity getDataSetById(@PathVariable("id") String id) {
DataSetEntity dataSetEntity = dataSetService.getDataSetById(id);
return dataSetEntity;
}
}
package cn.datax.service.data.factory.dao;
import cn.datax.common.base.BaseDao;
import cn.datax.service.data.factory.api.entity.DataThemeEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 数据主题信息表 Mapper 接口
* </p>
*
* @author yuwei
* @since 2020-07-26
*/
@Mapper
public interface DataThemeDao extends BaseDao<DataThemeEntity> {
}
package cn.datax.service.data.factory.mapstruct;
import cn.datax.common.mapstruct.EntityMapper;
import cn.datax.service.data.factory.api.dto.DataThemeDto;
import cn.datax.service.data.factory.api.entity.DataThemeEntity;
import cn.datax.service.data.factory.api.vo.DataThemeVo;
import org.mapstruct.Mapper;
/**
* <p>
* 数据主题信息表 Mapper 实体映射
* </p>
*
* @author yuwei
* @since 2020-07-26
*/
@Mapper(componentModel = "spring")
public interface DataThemeMapper extends EntityMapper<DataThemeDto, DataThemeEntity, DataThemeVo> {
}
package cn.datax.service.data.factory.service;
import cn.datax.service.data.factory.api.entity.DataThemeEntity;
import cn.datax.service.data.factory.api.dto.DataThemeDto;
import cn.datax.common.base.BaseService;
import java.util.List;
/**
* <p>
* 数据主题信息表 服务类
* </p>
*
* @author yuwei
* @since 2020-07-26
*/
public interface DataThemeService extends BaseService<DataThemeEntity> {
DataThemeEntity saveDataTheme(DataThemeDto dataTheme);
DataThemeEntity updateDataTheme(DataThemeDto dataTheme);
DataThemeEntity getDataThemeById(String id);
void deleteDataThemeById(String id);
void deleteDataThemeBatch(List<String> ids);
}
package cn.datax.service.data.factory.service.impl;
import cn.datax.common.core.DataConstant;
import cn.datax.common.database.DataSourceFactory;
import cn.datax.common.database.DbQuery;
import cn.datax.common.database.constants.DbQueryProperty;
import cn.datax.common.database.core.DbColumn;
import cn.datax.common.database.core.DbTable;
import cn.datax.service.data.factory.api.dto.DataSourceDto;
import cn.datax.service.data.factory.api.dto.DbSchema;
import cn.datax.service.data.factory.api.entity.DataSourceEntity;
import cn.datax.service.data.factory.dao.DataSourceDao;
import cn.datax.service.data.factory.service.DataSourceService;
import cn.datax.service.data.factory.mapstruct.DataSourceMapper;
import cn.datax.common.base.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* <p>
* 数据源信息表 服务实现类
* </p>
*
* @author yuwei
* @since 2020-03-14
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class DataSourceServiceImpl extends BaseServiceImpl<DataSourceDao, DataSourceEntity> implements DataSourceService {
@Autowired
private DataSourceDao dataSourceDao;
@Autowired
private DataSourceMapper dataSourceMapper;
@Autowired
private DataSourceFactory dataSourceFactory;
@Override
@Transactional(rollbackFor = Exception.class)
public void saveDataSource(DataSourceDto dataSourceDto) {
DataSourceEntity dataSource = dataSourceMapper.toEntity(dataSourceDto);
dataSource.setSourceSync(Integer.valueOf(DataConstant.TrueOrFalse.FALSE.getKey()));
dataSourceDao.insert(dataSource);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateDataSource(DataSourceDto dataSourceDto) {
DataSourceEntity dataSource = dataSourceMapper.toEntity(dataSourceDto);
dataSourceDao.updateById(dataSource);
}
@Override
public DataSourceEntity getDataSourceById(String id) {
DataSourceEntity dataSourceEntity = super.getById(id);
return dataSourceEntity;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteDataSourceById(String id) {
dataSourceDao.deleteById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteDataSourceBatch(List<String> ids) {
dataSourceDao.deleteBatchIds(ids);
}
@Override
public DbQuery checkConnection(DataSourceDto dataSourceDto) {
DataSourceEntity dataSource = dataSourceMapper.toEntity(dataSourceDto);
DbSchema dbSchema = dataSource.getDbSchema();
DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(),
dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName(), dbSchema.getSid());
DbQuery dbQuery = dataSourceFactory.createDbQuery(dbQueryProperty);
return dbQuery;
}
@Override
public DbQuery getDbQuery(String id) {
DataSourceEntity dataSource = getById(id);
DbSchema dbSchema = dataSource.getDbSchema();
DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(),
dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName(), dbSchema.getSid());
DbQuery dbQuery = dataSourceFactory.createDbQuery(dbQueryProperty);
return dbQuery;
}
@Override
public List<DbTable> getDbTables(String id) {
DataSourceEntity dataSource = getById(id);
DbSchema dbSchema = dataSource.getDbSchema();
DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(),
dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName(), dbSchema.getSid());
DbQuery dbQuery = dataSourceFactory.createDbQuery(dbQueryProperty);
List<DbTable> tables = dbQuery.getTables(dbSchema.getDbName());
return tables;
}
@Override
public List<DbColumn> getDbTableColumns(String id, String tableName) {
DataSourceEntity dataSource = getById(id);
DbSchema dbSchema = dataSource.getDbSchema();
DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(),
dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName(), dbSchema.getSid());
DbQuery dbQuery = dataSourceFactory.createDbQuery(dbQueryProperty);
List<DbColumn> columns = dbQuery.getTableColumns(dbSchema.getDbName(), tableName);
return columns;
}
@Override
public void updateDataSourceSyncById(String id) {
DataSourceEntity dataSource = new DataSourceEntity();
dataSource.setId(id);
dataSource.setSourceSync(Integer.valueOf(DataConstant.TrueOrFalse.TRUE.getKey()));
dataSourceDao.updateById(dataSource);
}
}
package cn.datax.service.data.factory.service.impl;
import cn.datax.service.data.factory.api.entity.DataThemeEntity;
import cn.datax.service.data.factory.api.dto.DataThemeDto;
import cn.datax.service.data.factory.service.DataThemeService;
import cn.datax.service.data.factory.mapstruct.DataThemeMapper;
import cn.datax.service.data.factory.dao.DataThemeDao;
import cn.datax.common.base.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* <p>
* 数据主题信息表 服务实现类
* </p>
*
* @author yuwei
* @since 2020-07-26
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class DataThemeServiceImpl extends BaseServiceImpl<DataThemeDao, DataThemeEntity> implements DataThemeService {
@Autowired
private DataThemeDao dataThemeDao;
@Autowired
private DataThemeMapper dataThemeMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public DataThemeEntity saveDataTheme(DataThemeDto dataThemeDto) {
DataThemeEntity dataTheme = dataThemeMapper.toEntity(dataThemeDto);
dataThemeDao.insert(dataTheme);
return dataTheme;
}
@Override
@Transactional(rollbackFor = Exception.class)
public DataThemeEntity updateDataTheme(DataThemeDto dataThemeDto) {
DataThemeEntity dataTheme = dataThemeMapper.toEntity(dataThemeDto);
dataThemeDao.updateById(dataTheme);
return dataTheme;
}
@Override
public DataThemeEntity getDataThemeById(String id) {
DataThemeEntity dataThemeEntity = super.getById(id);
return dataThemeEntity;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteDataThemeById(String id) {
dataThemeDao.deleteById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteDataThemeBatch(List<String> ids) {
dataThemeDao.deleteBatchIds(ids);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.datax.service.data.factory.dao.DataThemeDao">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.datax.service.data.factory.api.entity.DataThemeEntity">
<result column="id" property="id" />
<result column="status" property="status" />
<result column="create_by" property="createBy" />
<result column="create_time" property="createTime" />
<result column="create_dept" property="createDept" />
<result column="update_by" property="updateBy" />
<result column="update_time" property="updateTime" />
<result column="remark" property="remark" />
<result column="theme_name" property="themeName" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id,
status,
create_by,
create_time,
create_dept,
update_by,
update_time,
remark,
theme_name
</sql>
</mapper>
...@@ -76,7 +76,7 @@ ...@@ -76,7 +76,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>cn.datax</groupId> <groupId>cn.datax</groupId>
<artifactId>data-factory-service-api</artifactId> <artifactId>data-metadata-service-api</artifactId>
<version>2.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
...@@ -84,11 +84,6 @@ ...@@ -84,11 +84,6 @@
<artifactId>datax-common-rabbitmq</artifactId> <artifactId>datax-common-rabbitmq</artifactId>
<version>2.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>${xstream.vsersion}</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
...@@ -6,14 +6,11 @@ import cn.datax.common.database.core.PageResult; ...@@ -6,14 +6,11 @@ import cn.datax.common.database.core.PageResult;
import cn.datax.common.utils.ThrowableUtil; import cn.datax.common.utils.ThrowableUtil;
import cn.datax.service.data.market.api.dto.ApiLogDto; import cn.datax.service.data.market.api.dto.ApiLogDto;
import cn.datax.service.data.market.api.entity.DataApiEntity; import cn.datax.service.data.market.api.entity.DataApiEntity;
import cn.datax.service.data.market.api.enums.ResType;
import cn.datax.service.data.market.api.mapping.service.ApiLogService; import cn.datax.service.data.market.api.mapping.service.ApiLogService;
import cn.datax.service.data.market.api.mapping.service.impl.ApiMappingEngine; import cn.datax.service.data.market.api.mapping.service.impl.ApiMappingEngine;
import cn.datax.service.data.market.api.mapping.utils.ThreadUtil; import cn.datax.service.data.market.api.mapping.utils.ThreadUtil;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.StaxDriver;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
...@@ -86,13 +83,7 @@ public class RequestHandler { ...@@ -86,13 +83,7 @@ public class RequestHandler {
requestInterceptor.postHandle(request, response, api, params, value); requestInterceptor.postHandle(request, response, api, params, value);
ThreadUtil.getInstance().get().setCallerSize(value.getData().size()); ThreadUtil.getInstance().get().setCallerSize(value.getData().size());
ThreadUtil.getInstance().get().setTime(System.currentTimeMillis() - start); ThreadUtil.getInstance().get().setTime(System.currentTimeMillis() - start);
R r = R.ok().setData(value); return R.ok().setData(value);
if (ResType.XML.getDesc().equals(api.getResType())) {
XStream xstream = new XStream(new StaxDriver());
xstream.alias("R", R.class);
return xstream.toXML(r);
}
return r;
} catch (Exception e) { } catch (Exception e) {
log.error("全局异常信息ex={}, StackTrace={}", e.getMessage(), ThrowableUtil.getStackTrace(e)); log.error("全局异常信息ex={}, StackTrace={}", e.getMessage(), ThrowableUtil.getStackTrace(e));
ThreadUtil.getInstance().get().setStatus(DataConstant.EnableState.DISABLE.getKey()); ThreadUtil.getInstance().get().setStatus(DataConstant.EnableState.DISABLE.getKey());
......
...@@ -7,9 +7,6 @@ import cn.datax.common.database.core.PageResult; ...@@ -7,9 +7,6 @@ import cn.datax.common.database.core.PageResult;
import cn.datax.common.exception.DataException; import cn.datax.common.exception.DataException;
import cn.datax.common.utils.PageUtil; import cn.datax.common.utils.PageUtil;
import cn.datax.common.utils.ThrowableUtil; import cn.datax.common.utils.ThrowableUtil;
import cn.datax.service.data.factory.api.dto.DbSchema;
import cn.datax.service.data.factory.api.entity.DataSourceEntity;
import cn.datax.service.data.factory.api.feign.DataSourceServiceFeign;
import cn.datax.service.data.market.api.dto.FieldRule; import cn.datax.service.data.market.api.dto.FieldRule;
import cn.datax.service.data.market.api.entity.ApiMaskEntity; import cn.datax.service.data.market.api.entity.ApiMaskEntity;
import cn.datax.service.data.market.api.entity.DataApiEntity; import cn.datax.service.data.market.api.entity.DataApiEntity;
...@@ -18,6 +15,9 @@ import cn.datax.service.data.market.api.mapping.factory.AbstractFactory; ...@@ -18,6 +15,9 @@ import cn.datax.service.data.market.api.mapping.factory.AbstractFactory;
import cn.datax.service.data.market.api.mapping.factory.FactoryProducer; import cn.datax.service.data.market.api.mapping.factory.FactoryProducer;
import cn.datax.service.data.market.api.mapping.factory.crypto.Crypto; import cn.datax.service.data.market.api.mapping.factory.crypto.Crypto;
import cn.datax.service.data.market.api.mapping.utils.SqlBuilderUtil; import cn.datax.service.data.market.api.mapping.utils.SqlBuilderUtil;
import cn.datax.service.data.metadata.api.dto.DbSchema;
import cn.datax.service.data.metadata.api.entity.MetadataSourceEntity;
import cn.datax.service.data.metadata.api.feign.MetadataSourceServiceFeign;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -34,13 +34,13 @@ public class ApiMappingEngine { ...@@ -34,13 +34,13 @@ public class ApiMappingEngine {
private DataSourceFactory dataSourceFactory; private DataSourceFactory dataSourceFactory;
@Autowired @Autowired
private DataSourceServiceFeign dataSourceServiceFeign; private MetadataSourceServiceFeign metadataSourceServiceFeign;
@Autowired @Autowired
private ApiMaskServiceFeign apiMaskServiceFeign; private ApiMaskServiceFeign apiMaskServiceFeign;
public PageResult<Map<String, Object>> execute(DataApiEntity dataApi, Map<String, Object> params) { public PageResult<Map<String, Object>> execute(DataApiEntity dataApi, Map<String, Object> params) {
DataSourceEntity dataSource = dataSourceServiceFeign.getDataSourceById(dataApi.getExecuteConfig().getSourceId()); MetadataSourceEntity dataSource = metadataSourceServiceFeign.getMetadataSourceById(dataApi.getExecuteConfig().getSourceId());
if (dataSource == null) { if (dataSource == null) {
throw new DataException("API调用查询数据源出错"); throw new DataException("API调用查询数据源出错");
} }
......
server: server:
port: 8819 port: 8823
spring: spring:
application: application:
......
...@@ -76,7 +76,7 @@ ...@@ -76,7 +76,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>cn.datax</groupId> <groupId>cn.datax</groupId>
<artifactId>data-factory-service-api</artifactId> <artifactId>datax-common-office</artifactId>
<version>2.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
......
...@@ -12,6 +12,9 @@ import cn.datax.service.data.market.api.vo.SqlParseVo; ...@@ -12,6 +12,9 @@ import cn.datax.service.data.market.api.vo.SqlParseVo;
import cn.datax.service.data.market.mapstruct.DataApiMapper; import cn.datax.service.data.market.mapstruct.DataApiMapper;
import cn.datax.service.data.market.service.DataApiService; import cn.datax.service.data.market.service.DataApiService;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import com.aspose.words.SaveOptions;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
...@@ -25,6 +28,8 @@ import org.springframework.web.bind.annotation.*; ...@@ -25,6 +28,8 @@ import org.springframework.web.bind.annotation.*;
import cn.datax.common.base.BaseController; import cn.datax.common.base.BaseController;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -186,4 +191,21 @@ public class DataApiController extends BaseController { ...@@ -186,4 +191,21 @@ public class DataApiController extends BaseController {
dataApiService.cancelDataApi(id); dataApiService.cancelDataApi(id);
return R.ok(); return R.ok();
} }
@ApiOperation(value = "接口文档", notes = "根据url的id来指定生成接口文档对象")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@PostMapping("/word/{id}")
public void wordDataApi(@PathVariable String id, HttpServletResponse response) throws Exception {
// 清空response
response.reset();
// 设置response的Header
response.setContentType("application/octet-stream;charset=utf-8");
// 设置content-disposition响应头控制浏览器以下载的形式打开文件
response.addHeader("Content-Disposition", "attachment;filename=" + new String("接口文档.docx".getBytes()));
Document doc = dataApiService.wordDataApi(id);
OutputStream out = response.getOutputStream();
doc.save(out, SaveOptions.createSaveOptions(SaveFormat.DOCX));
out.flush();
out.close();
}
} }
...@@ -5,6 +5,7 @@ import cn.datax.service.data.market.api.entity.DataApiEntity; ...@@ -5,6 +5,7 @@ import cn.datax.service.data.market.api.entity.DataApiEntity;
import cn.datax.service.data.market.api.dto.DataApiDto; import cn.datax.service.data.market.api.dto.DataApiDto;
import cn.datax.common.base.BaseService; import cn.datax.common.base.BaseService;
import cn.datax.service.data.market.api.vo.SqlParseVo; import cn.datax.service.data.market.api.vo.SqlParseVo;
import com.aspose.words.Document;
import java.util.List; import java.util.List;
...@@ -35,4 +36,6 @@ public interface DataApiService extends BaseService<DataApiEntity> { ...@@ -35,4 +36,6 @@ public interface DataApiService extends BaseService<DataApiEntity> {
void releaseDataApi(String id); void releaseDataApi(String id);
void cancelDataApi(String id); void cancelDataApi(String id);
Document wordDataApi(String id) throws Exception;
} }
package cn.datax.service.data.market.service.impl; package cn.datax.service.data.market.service.impl;
import cn.datax.commo.office.word.WordUtil;
import cn.datax.common.core.DataConstant; import cn.datax.common.core.DataConstant;
import cn.datax.common.exception.DataException; import cn.datax.common.exception.DataException;
import cn.datax.common.rabbitmq.config.RabbitMqConstant; import cn.datax.common.rabbitmq.config.RabbitMqConstant;
...@@ -13,6 +14,10 @@ import cn.datax.service.data.market.mapstruct.DataApiMapper; ...@@ -13,6 +14,10 @@ import cn.datax.service.data.market.mapstruct.DataApiMapper;
import cn.datax.service.data.market.dao.DataApiDao; import cn.datax.service.data.market.dao.DataApiDao;
import cn.datax.common.base.BaseServiceImpl; import cn.datax.common.base.BaseServiceImpl;
import cn.datax.service.data.market.utils.SqlBuilderUtil; import cn.datax.service.data.market.utils.SqlBuilderUtil;
import com.aspose.words.Document;
import com.aspose.words.MailMerge;
import com.aspose.words.net.System.Data.DataRow;
import com.aspose.words.net.System.Data.DataTable;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter; import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
...@@ -30,10 +35,13 @@ import net.sf.jsqlparser.util.deparser.ExpressionDeParser; ...@@ -30,10 +35,13 @@ import net.sf.jsqlparser.util.deparser.ExpressionDeParser;
import net.sf.jsqlparser.util.deparser.SelectDeParser; import net.sf.jsqlparser.util.deparser.SelectDeParser;
import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -239,4 +247,55 @@ public class DataApiServiceImpl extends BaseServiceImpl<DataApiDao, DataApiEntit ...@@ -239,4 +247,55 @@ public class DataApiServiceImpl extends BaseServiceImpl<DataApiDao, DataApiEntit
dataApiEntity.setStatus(DataConstant.ApiState.CANCEL.getKey()); dataApiEntity.setStatus(DataConstant.ApiState.CANCEL.getKey());
dataApiDao.updateById(dataApiEntity); dataApiDao.updateById(dataApiEntity);
} }
@Override
public Document wordDataApi(String id) throws Exception {
DataApiEntity dataApiEntity = super.getById(id);
// 合并模版
ClassPathResource classPathResource = new ClassPathResource("templates/api_1.0.0.docx");
InputStream inputStream =classPathResource.getInputStream();
Document doc = WordUtil.getInstance().getDocument(inputStream);
// 提供字段
String[] fieldNames = new String[] {"apiName", "apiVersion", "reqMethod", "resType", "apiUrl", "remark"};
Object[] fieldValues = new Object[] {dataApiEntity.getApiName(), dataApiEntity.getApiVersion(), dataApiEntity.getReqMethod(), dataApiEntity.getResType(), "/services/"+dataApiEntity.getApiVersion()+dataApiEntity.getApiUrl(), dataApiEntity.getRemark()};
MailMerge mailMerge = doc.getMailMerge();
mailMerge.execute(fieldNames, fieldValues);
// 请求参数 TableStart:ReqParamList TableEnd:ReqParamList
DataTable reqParamTable = new DataTable("ReqParamList");
reqParamTable.getColumns().add("paramName");
reqParamTable.getColumns().add("remark");
reqParamTable.getColumns().add("paramType");
reqParamTable.getColumns().add("nullable");
reqParamTable.getColumns().add("exampleValue");
List<ReqParam> reqParamList = dataApiEntity.getReqParams();
for (int i = 0; i < reqParamList.size(); i++) {
DataRow row = reqParamTable.newRow();
ReqParam param = reqParamList.get(i);
row.set(0, param.getParamName());
row.set(1, param.getRemark());
row.set(2, param.getParamType());
row.set(3, "1".equals(param.getNullable()) ? "Y" : "N");
row.set(4, param.getExampleValue());
reqParamTable.getRows().add(row);
}
mailMerge.executeWithRegions(reqParamTable);
// 返回字段 TableStart:ResParamList TableEnd:ResParamList
DataTable resParamTable = new DataTable("ResParamList");
resParamTable.getColumns().add("fieldName");
resParamTable.getColumns().add("dataType");
resParamTable.getColumns().add("remark");
resParamTable.getColumns().add("exampleValue");
List<ResParam> resParamList = dataApiEntity.getResParams();
for (int i = 0; i < resParamList.size(); i++) {
DataRow row = resParamTable.newRow();
ResParam param = resParamList.get(i);
row.set(0, param.getFieldName());
row.set(1, param.getDataType());
row.set(2, param.getRemark());
row.set(3, param.getExampleValue());
resParamTable.getRows().add(row);
}
mailMerge.executeWithRegions(resParamTable);
return doc;
}
} }
server: server:
port: 8818 port: 8822
spring: spring:
application: application:
......
package cn.datax.service.data.factory.api.dto; package cn.datax.service.data.metadata.api.dto;
import cn.datax.common.validate.ValidationGroups; import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
......
...@@ -18,7 +18,7 @@ import java.io.Serializable; ...@@ -18,7 +18,7 @@ import java.io.Serializable;
*/ */
@ApiModel(value = "元数据信息表Model") @ApiModel(value = "元数据信息表Model")
@Data @Data
public class DataMetadataColumnDto implements Serializable { public class MetadataColumnDto implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
......
package cn.datax.service.data.factory.api.dto; package cn.datax.service.data.metadata.api.dto;
import cn.datax.common.validate.ValidationGroups; import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
...@@ -9,6 +9,7 @@ import javax.validation.Valid; ...@@ -9,6 +9,7 @@ import javax.validation.Valid;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.io.Serializable; import java.io.Serializable;
/** /**
* <p> * <p>
* 数据源信息表 实体DTO * 数据源信息表 实体DTO
...@@ -19,7 +20,7 @@ import java.io.Serializable; ...@@ -19,7 +20,7 @@ import java.io.Serializable;
*/ */
@ApiModel(value = "数据源信息表Model") @ApiModel(value = "数据源信息表Model")
@Data @Data
public class DataSourceDto implements Serializable { public class MetadataSourceDto implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
...@@ -32,9 +33,6 @@ public class DataSourceDto implements Serializable { ...@@ -32,9 +33,6 @@ public class DataSourceDto implements Serializable {
@ApiModelProperty(value = "数据源名称") @ApiModelProperty(value = "数据源名称")
@NotBlank(message = "数据源名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class}) @NotBlank(message = "数据源名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String sourceName; private String sourceName;
@ApiModelProperty(value = "数据主题")
@NotBlank(message = "数据主题不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String themeId;
@ApiModelProperty(value = "数据源连接信息") @ApiModelProperty(value = "数据源连接信息")
@Valid @Valid
private DbSchema dbSchema; private DbSchema dbSchema;
......
...@@ -18,7 +18,7 @@ import java.io.Serializable; ...@@ -18,7 +18,7 @@ import java.io.Serializable;
*/ */
@ApiModel(value = "数据库表信息表Model") @ApiModel(value = "数据库表信息表Model")
@Data @Data
public class DataMetadataTableDto implements Serializable { public class MetadataTableDto implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
......
package cn.datax.service.data.factory.api.dto; package cn.datax.service.data.metadata.api.dto;
import cn.datax.common.validate.ValidationGroups; import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
......
...@@ -19,7 +19,7 @@ import java.io.Serializable; ...@@ -19,7 +19,7 @@ import java.io.Serializable;
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
@TableName("metadata_column") @TableName("metadata_column")
public class DataMetadataColumnEntity implements Serializable { public class MetadataColumnEntity implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
......
package cn.datax.service.data.factory.api.entity; package cn.datax.service.data.metadata.api.entity;
import cn.datax.common.base.DataScopeBaseEntity; import cn.datax.common.base.DataScopeBaseEntity;
import cn.datax.service.data.factory.api.dto.DbSchema; import cn.datax.service.data.metadata.api.dto.DbSchema;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
...@@ -20,8 +20,8 @@ import lombok.experimental.Accessors; ...@@ -20,8 +20,8 @@ import lombok.experimental.Accessors;
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Accessors(chain = true) @Accessors(chain = true)
@TableName(value = "factory_source", autoResultMap = true) @TableName(value = "metadata_source", autoResultMap = true)
public class DataSourceEntity extends DataScopeBaseEntity { public class MetadataSourceEntity extends DataScopeBaseEntity {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
......
...@@ -19,7 +19,7 @@ import java.io.Serializable; ...@@ -19,7 +19,7 @@ import java.io.Serializable;
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
@TableName("metadata_table") @TableName("metadata_table")
public class DataMetadataTableEntity implements Serializable { public class MetadataTableEntity implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
......
package cn.datax.service.data.metadata.api.feign;
import cn.datax.service.data.metadata.api.entity.MetadataSourceEntity;
import cn.datax.service.data.metadata.api.feign.factory.MetadataSourceServiceFeignFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.List;
@FeignClient(contextId = "metadataSourceServiceFeign", value = "datax-service-data-metadata", fallbackFactory = MetadataSourceServiceFeignFallbackFactory.class)
public interface MetadataSourceServiceFeign {
@GetMapping("/inner/sources/{id}")
MetadataSourceEntity getMetadataSourceById(@PathVariable("id") String id);
@GetMapping("/inner/sources/list")
List<MetadataSourceEntity> getMetadataSourceList();
}
package cn.datax.service.data.metadata.api.feign.factory;
import cn.datax.service.data.metadata.api.feign.MetadataSourceServiceFeign;
import cn.datax.service.data.metadata.api.feign.fallback.MetadataSourceServiceFeignFallbackImpl;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
@Component
public class MetadataSourceServiceFeignFallbackFactory implements FallbackFactory<MetadataSourceServiceFeign> {
@Override
public MetadataSourceServiceFeign create(Throwable throwable) {
MetadataSourceServiceFeignFallbackImpl metadataSourceServiceFeignFallback = new MetadataSourceServiceFeignFallbackImpl();
metadataSourceServiceFeignFallback.setCause(throwable);
return metadataSourceServiceFeignFallback;
}
}
package cn.datax.service.data.factory.api.feign.fallback; package cn.datax.service.data.metadata.api.feign.fallback;
import cn.datax.service.data.factory.api.entity.DataSourceEntity; import cn.datax.service.data.metadata.api.entity.MetadataSourceEntity;
import cn.datax.service.data.factory.api.feign.DataSourceServiceFeign; import cn.datax.service.data.metadata.api.feign.MetadataSourceServiceFeign;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.List;
@Slf4j @Slf4j
@Component @Component
public class DataSourceServiceFeignFallbackImpl implements DataSourceServiceFeign { public class MetadataSourceServiceFeignFallbackImpl implements MetadataSourceServiceFeign {
@Setter @Setter
private Throwable cause; private Throwable cause;
@Override @Override
public DataSourceEntity getDataSourceById(String id) { public MetadataSourceEntity getMetadataSourceById(String id) {
log.error("feign 调用{}出错", id, cause); log.error("feign 调用{}出错", id, cause);
return null; return null;
} }
@Override @Override
public void updateDataSourceSyncById(String id) { public List<MetadataSourceEntity> getMetadataSourceList() {
log.error("feign 调用{}出错", id, cause); log.error("feign 调用出错", cause);
return null;
} }
} }
...@@ -14,7 +14,7 @@ import lombok.EqualsAndHashCode; ...@@ -14,7 +14,7 @@ import lombok.EqualsAndHashCode;
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class DataMetadataColumnQuery extends BaseQueryParams { public class MetadataColumnQuery extends BaseQueryParams {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
......
package cn.datax.service.data.factory.api.query; package cn.datax.service.data.metadata.api.query;
import cn.datax.common.base.BaseQueryParams; import cn.datax.common.base.BaseQueryParams;
import lombok.Data; import lombok.Data;
...@@ -14,11 +14,9 @@ import lombok.EqualsAndHashCode; ...@@ -14,11 +14,9 @@ import lombok.EqualsAndHashCode;
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class DataSourceQuery extends BaseQueryParams { public class MetadataSourceQuery extends BaseQueryParams {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
private String sourceName; private String sourceName;
private String themeId;
} }
...@@ -14,7 +14,7 @@ import lombok.EqualsAndHashCode; ...@@ -14,7 +14,7 @@ import lombok.EqualsAndHashCode;
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class DataMetadataTableQuery extends BaseQueryParams { public class MetadataTableQuery extends BaseQueryParams {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
......
...@@ -13,7 +13,7 @@ import java.io.Serializable; ...@@ -13,7 +13,7 @@ import java.io.Serializable;
* @since 2020-07-29 * @since 2020-07-29
*/ */
@Data @Data
public class DataMetadataColumnVo implements Serializable { public class MetadataColumnVo implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
......
package cn.datax.service.data.metadata.api.vo;
import java.io.Serializable;
import java.util.List;
public class MetadataDatabase implements Serializable {
private static final long serialVersionUID=1L;
private String database;
private List<MetadataTable> tables;
public String getDatabase() {
return database;
}
public void setDatabase(String database) {
this.database = database;
}
public List<MetadataTable> getTables() {
return tables;
}
public void setTables(List<MetadataTable> tables) {
this.tables = tables;
}
@Override
public String toString() {
return "MetadataDatabase{" +
"database='" + database + '\'' +
", tables=" + tables +
'}';
}
public class MetadataTable implements Serializable {
private static final long serialVersionUID=1L;
private String tableName;
private String tableComment;
private List<MetadataColumn> columns;
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public String getTableComment() {
return tableComment;
}
public void setTableComment(String tableComment) {
this.tableComment = tableComment;
}
public List<MetadataColumn> getColumns() {
return columns;
}
public void setColumns(List<MetadataColumn> columns) {
this.columns = columns;
}
@Override
public String toString() {
return "MetadataTable{" +
"tableName='" + tableName + '\'' +
", tableComment='" + tableComment + '\'' +
", columns=" + columns +
'}';
}
}
public class MetadataColumn implements Serializable {
private static final long serialVersionUID=1L;
private String columnPosition;
private String columnName;
private String dataType;
private String dataLength;
private String dataPrecision;
private String dataScale;
private String columnNullable;
private String columnKey;
private String dataDefault;
private String columnComment;
public String getColumnPosition() {
return columnPosition;
}
public void setColumnPosition(String columnPosition) {
this.columnPosition = columnPosition;
}
public String getColumnName() {
return columnName;
}
public void setColumnName(String columnName) {
this.columnName = columnName;
}
public String getDataType() {
return dataType;
}
public void setDataType(String dataType) {
this.dataType = dataType;
}
public String getDataLength() {
return dataLength;
}
public void setDataLength(String dataLength) {
this.dataLength = dataLength;
}
public String getDataPrecision() {
return dataPrecision;
}
public void setDataPrecision(String dataPrecision) {
this.dataPrecision = dataPrecision;
}
public String getDataScale() {
return dataScale;
}
public void setDataScale(String dataScale) {
this.dataScale = dataScale;
}
public String getColumnNullable() {
return columnNullable;
}
public void setColumnNullable(String columnNullable) {
this.columnNullable = columnNullable;
}
public String getColumnKey() {
return columnKey;
}
public void setColumnKey(String columnKey) {
this.columnKey = columnKey;
}
public String getDataDefault() {
return dataDefault;
}
public void setDataDefault(String dataDefault) {
this.dataDefault = dataDefault;
}
public String getColumnComment() {
return columnComment;
}
public void setColumnComment(String columnComment) {
this.columnComment = columnComment;
}
@Override
public String toString() {
return "MetadataColumn{" +
"columnPosition='" + columnPosition + '\'' +
", columnName='" + columnName + '\'' +
", dataType='" + dataType + '\'' +
", dataLength='" + dataLength + '\'' +
", dataPrecision='" + dataPrecision + '\'' +
", dataScale='" + dataScale + '\'' +
", columnNullable='" + columnNullable + '\'' +
", columnKey='" + columnKey + '\'' +
", dataDefault='" + dataDefault + '\'' +
", columnComment='" + columnComment + '\'' +
'}';
}
}
}
package cn.datax.service.data.factory.api.vo; package cn.datax.service.data.metadata.api.vo;
import cn.datax.service.data.factory.api.dto.DbSchema; import cn.datax.service.data.metadata.api.dto.DbSchema;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data; import lombok.Data;
...@@ -16,7 +16,7 @@ import java.time.LocalDateTime; ...@@ -16,7 +16,7 @@ import java.time.LocalDateTime;
* @since 2020-03-14 * @since 2020-03-14
*/ */
@Data @Data
public class DataSourceVo implements Serializable { public class MetadataSourceVo implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
...@@ -27,7 +27,6 @@ public class DataSourceVo implements Serializable { ...@@ -27,7 +27,6 @@ public class DataSourceVo implements Serializable {
private String remark; private String remark;
private String dbType; private String dbType;
private String sourceName; private String sourceName;
private String themeId;
private DbSchema dbSchema; private DbSchema dbSchema;
private Integer sync; private Integer sync;
} }
...@@ -13,7 +13,7 @@ import java.io.Serializable; ...@@ -13,7 +13,7 @@ import java.io.Serializable;
* @since 2020-07-29 * @since 2020-07-29
*/ */
@Data @Data
public class DataMetadataTableVo implements Serializable { public class MetadataTableVo implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
......
org.springframework.boot.autoconfigure.EnableAutoConfiguration= org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.datax.service.data.metadata.api.feign.factory.MetadataSourceServiceFeignFallbackFactory,\
cn.datax.service.data.metadata.api.feign.fallback.MetadataSourceServiceFeignFallbackImpl
...@@ -3,13 +3,13 @@ ...@@ -3,13 +3,13 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<artifactId>data-factory-service-parent</artifactId> <artifactId>data-metadata-service-parent</artifactId>
<groupId>cn.datax</groupId> <groupId>cn.datax</groupId>
<version>2.0.0</version> <version>2.0.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<version>2.0.0</version> <version>2.0.0</version>
<artifactId>data-factory-service</artifactId> <artifactId>data-metadata-service-console</artifactId>
<dependencies> <dependencies>
<!--web 模块--> <!--web 模块-->
...@@ -71,7 +71,7 @@ ...@@ -71,7 +71,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>cn.datax</groupId> <groupId>cn.datax</groupId>
<artifactId>data-factory-service-api</artifactId> <artifactId>data-metadata-service-api</artifactId>
<version>2.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
</dependencies> </dependencies>
......
package cn.datax.service.data.factory.sql.console; package cn.datax.service.data.metadata.console;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients(basePackages = {"cn.datax.service.system.api.feign", "cn.datax.service.data.factory.api.feign"}) @EnableFeignClients(basePackages = {"cn.datax.service.system.api.feign"})
@SpringCloudApplication @SpringCloudApplication
public class DataxSqlConsoleApplication { public class DataxConsoleApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(DataxSqlConsoleApplication.class); SpringApplication.run(DataxConsoleApplication.class);
} }
} }
package cn.datax.service.data.factory.sql.console.concurrent; package cn.datax.service.data.metadata.console.concurrent;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.sql.SQLException;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
/** /**
......
package cn.datax.service.data.factory.sql.console.concurrent; package cn.datax.service.data.metadata.console.concurrent;
import cn.datax.service.data.factory.api.vo.SqlConsoleVo; import cn.datax.service.data.metadata.api.vo.SqlConsoleVo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.sql.*; import java.sql.*;
......
package cn.datax.service.data.factory.sql.console.config; package cn.datax.service.data.metadata.console.config;
import cn.datax.common.security.handler.DataAccessDeniedHandler; import cn.datax.common.security.handler.DataAccessDeniedHandler;
import cn.datax.common.security.handler.DataAuthExceptionEntryPoint; import cn.datax.common.security.handler.DataAuthExceptionEntryPoint;
......
package cn.datax.service.data.factory.sql.console.config; package cn.datax.service.data.metadata.console.config;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationArguments;
......
package cn.datax.service.data.factory.sql.console.config; package cn.datax.service.data.metadata.console.config;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
......
package cn.datax.service.data.factory.sql.console.config; package cn.datax.service.data.metadata.console.config;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
......
package cn.datax.service.data.factory.sql.console.controller; package cn.datax.service.data.metadata.console.controller;
import cn.datax.common.base.BaseController; import cn.datax.common.base.BaseController;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
......
package cn.datax.service.data.factory.sql.console.controller; package cn.datax.service.data.metadata.console.controller;
import cn.datax.common.base.BaseController; import cn.datax.common.base.BaseController;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups; import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.data.factory.api.dto.SqlConsoleDto; import cn.datax.service.data.metadata.api.dto.SqlConsoleDto;
import cn.datax.service.data.factory.api.vo.SqlConsoleVo; import cn.datax.service.data.metadata.api.vo.SqlConsoleVo;
import cn.datax.service.data.factory.sql.console.service.SqlConsoleService; import cn.datax.service.data.metadata.console.service.SqlConsoleService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
......
package cn.datax.service.data.factory.sql.console.service; package cn.datax.service.data.metadata.console.service;
import cn.datax.service.data.factory.api.dto.SqlConsoleDto; import cn.datax.service.data.metadata.api.dto.SqlConsoleDto;
import cn.datax.service.data.factory.api.vo.SqlConsoleVo; import cn.datax.service.data.metadata.api.vo.SqlConsoleVo;
import java.util.List; import java.util.List;
......
package cn.datax.service.data.factory.sql.console.service.impl; package cn.datax.service.data.metadata.console.service.impl;
import cn.datax.common.database.DataSourceFactory; import cn.datax.common.database.DataSourceFactory;
import cn.datax.common.database.DbQuery; import cn.datax.common.database.DbQuery;
import cn.datax.common.database.constants.DbQueryProperty; import cn.datax.common.database.constants.DbQueryProperty;
import cn.datax.common.exception.DataException; import cn.datax.common.exception.DataException;
import cn.datax.common.utils.ThrowableUtil; import cn.datax.common.utils.ThrowableUtil;
import cn.datax.service.data.factory.api.dto.DbSchema; import cn.datax.service.data.metadata.api.dto.DbSchema;
import cn.datax.service.data.factory.api.dto.SqlConsoleDto; import cn.datax.service.data.metadata.api.dto.SqlConsoleDto;
import cn.datax.service.data.factory.api.entity.DataSourceEntity; import cn.datax.service.data.metadata.api.entity.MetadataSourceEntity;
import cn.datax.service.data.factory.api.feign.DataSourceServiceFeign; import cn.datax.service.data.metadata.api.feign.MetadataSourceServiceFeign;
import cn.datax.service.data.factory.api.vo.SqlConsoleVo; import cn.datax.service.data.metadata.api.vo.SqlConsoleVo;
import cn.datax.service.data.factory.sql.console.concurrent.CallableTemplate; import cn.datax.service.data.metadata.console.concurrent.CallableTemplate;
import cn.datax.service.data.factory.sql.console.concurrent.DateHander; import cn.datax.service.data.metadata.console.concurrent.DateHander;
import cn.datax.service.data.factory.sql.console.service.SqlConsoleService; import cn.datax.service.data.metadata.console.service.SqlConsoleService;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.JSQLParserException;
...@@ -37,7 +37,7 @@ public class SqlConsoleServiceImpl implements SqlConsoleService { ...@@ -37,7 +37,7 @@ public class SqlConsoleServiceImpl implements SqlConsoleService {
private DataSourceFactory dataSourceFactory; private DataSourceFactory dataSourceFactory;
@Autowired @Autowired
private DataSourceServiceFeign dataSourceServiceFeign; private MetadataSourceServiceFeign metadataSourceServiceFeign;
private static Map<String, List<Connection>> connectionMap = new ConcurrentHashMap<>(); private static Map<String, List<Connection>> connectionMap = new ConcurrentHashMap<>();
...@@ -55,7 +55,7 @@ public class SqlConsoleServiceImpl implements SqlConsoleService { ...@@ -55,7 +55,7 @@ public class SqlConsoleServiceImpl implements SqlConsoleService {
if (CollUtil.isEmpty(sqls)) { if (CollUtil.isEmpty(sqls)) {
throw new DataException("未解析到SQL语句"); throw new DataException("未解析到SQL语句");
} }
DataSourceEntity dataSource = dataSourceServiceFeign.getDataSourceById(sqlConsoleDto.getSourceId()); MetadataSourceEntity dataSource = metadataSourceServiceFeign.getMetadataSourceById(sqlConsoleDto.getSourceId());
if(dataSource == null){ if(dataSource == null){
throw new DataException("SQL工作台查询数据源出错"); throw new DataException("SQL工作台查询数据源出错");
} }
......
server: server:
port: 8817 port: 8821
spring: spring:
application: application:
name: datax-service-data-sql-console name: datax-service-data-console
profiles: profiles:
active: dev active: dev
cloud: cloud:
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <configuration scan="true" scanPeriod="60 seconds" debug="false">
<springProperty scope="context" name="springAppName" source="spring.application.name"/> <springProperty scope="context" name="springAppName" source="spring.application.name"/>
<property name="log.path" value="logs/datax-service-data-sql-console"/> <property name="log.path" value="logs/datax-service-data-console"/>
<property name="log.maxHistory" value="15"/> <property name="log.maxHistory" value="15"/>
<property name="log.totalSizeCap" value="500MB"/> <property name="log.totalSizeCap" value="500MB"/>
<property name="log.maxFileSize" value="10MB"/> <property name="log.maxFileSize" value="10MB"/>
......
...@@ -71,12 +71,12 @@ ...@@ -71,12 +71,12 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>cn.datax</groupId> <groupId>cn.datax</groupId>
<artifactId>data-metadata-service-api</artifactId> <artifactId>datax-common-database</artifactId>
<version>2.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>cn.datax</groupId> <groupId>cn.datax</groupId>
<artifactId>data-factory-service-api</artifactId> <artifactId>data-metadata-service-api</artifactId>
<version>2.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
......
package cn.datax.service.data.metadata.async; package cn.datax.service.data.metadata.async;
import cn.datax.common.core.DataConstant;
import cn.datax.common.database.DataSourceFactory; import cn.datax.common.database.DataSourceFactory;
import cn.datax.common.database.DbQuery; import cn.datax.common.database.DbQuery;
import cn.datax.common.database.constants.DbQueryProperty; import cn.datax.common.database.constants.DbQueryProperty;
import cn.datax.common.database.core.DbColumn; import cn.datax.common.database.core.DbColumn;
import cn.datax.common.database.core.DbTable; import cn.datax.common.database.core.DbTable;
import cn.datax.service.data.factory.api.dto.DbSchema; import cn.datax.service.data.metadata.api.dto.DbSchema;
import cn.datax.service.data.factory.api.entity.DataSourceEntity; import cn.datax.service.data.metadata.api.entity.MetadataColumnEntity;
import cn.datax.service.data.factory.api.feign.DataSourceServiceFeign; import cn.datax.service.data.metadata.api.entity.MetadataSourceEntity;
import cn.datax.service.data.metadata.api.entity.DataMetadataColumnEntity; import cn.datax.service.data.metadata.api.entity.MetadataTableEntity;
import cn.datax.service.data.metadata.api.entity.DataMetadataTableEntity; import cn.datax.service.data.metadata.dao.MetadataColumnDao;
import cn.datax.service.data.metadata.dao.DataMetadataColumnDao; import cn.datax.service.data.metadata.dao.MetadataSourceDao;
import cn.datax.service.data.metadata.dao.DataMetadataTableDao; import cn.datax.service.data.metadata.dao.MetadataTableDao;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -32,16 +33,16 @@ public class AsyncTask { ...@@ -32,16 +33,16 @@ public class AsyncTask {
private DataSourceFactory dataSourceFactory; private DataSourceFactory dataSourceFactory;
@Autowired @Autowired
private DataSourceServiceFeign dataSourceServiceFeign; private MetadataSourceDao metadataSourceDao;
@Autowired @Autowired
private DataMetadataTableDao dataMetadataTableDao; private MetadataTableDao metadataTableDao;
@Autowired @Autowired
private DataMetadataColumnDao dataMetadataColumnDao; private MetadataColumnDao metadataColumnDao;
@Async @Async
public void doTask(DataSourceEntity dataSource) { public void doTask(MetadataSourceEntity dataSource) {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
DbSchema dbSchema = dataSource.getDbSchema(); DbSchema dbSchema = dataSource.getDbSchema();
DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(), DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(),
...@@ -49,8 +50,8 @@ public class AsyncTask { ...@@ -49,8 +50,8 @@ public class AsyncTask {
DbQuery dbQuery = dataSourceFactory.createDbQuery(dbQueryProperty); DbQuery dbQuery = dataSourceFactory.createDbQuery(dbQueryProperty);
List<DbTable> tables = dbQuery.getTables(dbSchema.getDbName()); List<DbTable> tables = dbQuery.getTables(dbSchema.getDbName());
if (CollUtil.isNotEmpty(tables)) { if (CollUtil.isNotEmpty(tables)) {
List<DataMetadataTableEntity> metadataTableEntityList = tables.stream().map(table -> { List<MetadataTableEntity> metadataTableEntityList = tables.stream().map(table -> {
DataMetadataTableEntity metadataTable = new DataMetadataTableEntity(); MetadataTableEntity metadataTable = new MetadataTableEntity();
metadataTable.setSourceId(dataSource.getId()); metadataTable.setSourceId(dataSource.getId());
metadataTable.setTableName(table.getTableName()); metadataTable.setTableName(table.getTableName());
metadataTable.setTableComment(table.getTableComment()); metadataTable.setTableComment(table.getTableComment());
...@@ -58,11 +59,11 @@ public class AsyncTask { ...@@ -58,11 +59,11 @@ public class AsyncTask {
}).collect(Collectors.toList()); }).collect(Collectors.toList());
if (CollUtil.isNotEmpty(metadataTableEntityList)) { if (CollUtil.isNotEmpty(metadataTableEntityList)) {
metadataTableEntityList.stream().forEach(table -> { metadataTableEntityList.stream().forEach(table -> {
dataMetadataTableDao.insert(table); metadataTableDao.insert(table);
List<DbColumn> columns = dbQuery.getTableColumns(dbSchema.getDbName(), table.getTableName()); List<DbColumn> columns = dbQuery.getTableColumns(dbSchema.getDbName(), table.getTableName());
if (CollUtil.isNotEmpty(columns)) { if (CollUtil.isNotEmpty(columns)) {
List<DataMetadataColumnEntity> metadataColumnEntityList = columns.stream().map(column -> { List<MetadataColumnEntity> metadataColumnEntityList = columns.stream().map(column -> {
DataMetadataColumnEntity metadataColumn = new DataMetadataColumnEntity(); MetadataColumnEntity metadataColumn = new MetadataColumnEntity();
metadataColumn.setSourceId(dataSource.getId()); metadataColumn.setSourceId(dataSource.getId());
metadataColumn.setTableId(table.getId()); metadataColumn.setTableId(table.getId());
metadataColumn.setColumnName(column.getColName()); metadataColumn.setColumnName(column.getColName());
...@@ -78,13 +79,14 @@ public class AsyncTask { ...@@ -78,13 +79,14 @@ public class AsyncTask {
return metadataColumn; return metadataColumn;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
if (CollUtil.isNotEmpty(metadataColumnEntityList)) { if (CollUtil.isNotEmpty(metadataColumnEntityList)) {
metadataColumnEntityList.stream().forEach(column -> dataMetadataColumnDao.insert(column)); metadataColumnEntityList.stream().forEach(column -> metadataColumnDao.insert(column));
} }
} }
}); });
} }
} }
dataSourceServiceFeign.updateDataSourceSyncById(dataSource.getId()); dataSource.setSourceSync(Integer.valueOf(DataConstant.TrueOrFalse.TRUE.getKey()));
metadataSourceDao.updateById(dataSource);
log.info("异步任务执行完成!耗时{}秒", (System.currentTimeMillis() - start / 1000)); log.info("异步任务执行完成!耗时{}秒", (System.currentTimeMillis() - start / 1000));
} }
} }
\ No newline at end of file
package cn.datax.service.data.metadata.controller;
import cn.datax.common.core.R;
import cn.datax.service.data.metadata.service.DataMetadataService;
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import com.aspose.words.SaveOptions;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
@Api(tags = {"元数据"})
@RestController
@RequestMapping("/databases")
public class DataMetadataController {
@Autowired
private DataMetadataService dataMetadataService;
@ApiOperation(value = "同步", notes = "根据url的id来指定同步对象")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@PostMapping("/sync/{id}")
public R syncMetadata(@PathVariable String id) {
dataMetadataService.syncMetadata(id);
return R.ok();
}
@ApiOperation(value = "数据库设计文档", notes = "根据url的id来指定生成数据库设计文档对象")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@PostMapping("/word/{id}")
public void wordMetadata(@PathVariable String id, HttpServletResponse response) throws Exception {
// 清空response
response.reset();
// 设置response的Header
response.setContentType("application/octet-stream;charset=utf-8");
// 设置content-disposition响应头控制浏览器以下载的形式打开文件
response.addHeader("Content-Disposition", "attachment;filename=" + new String("数据库设计文档.doc".getBytes()));
Document doc = dataMetadataService.wordMetadata(id);
OutputStream out = response.getOutputStream();
doc.save(out, SaveOptions.createSaveOptions(SaveFormat.DOC));
out.flush();
out.close();
}
}
package cn.datax.service.data.metadata.controller; package cn.datax.service.data.metadata.controller;
import cn.datax.common.base.BaseController; import cn.datax.common.base.BaseController;
import cn.datax.common.core.DataConstant;
import cn.datax.common.security.annotation.DataInner;
import cn.datax.service.data.metadata.api.entity.MetadataSourceEntity;
import cn.datax.service.data.metadata.service.MetadataSourceService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController @RestController
@RequestMapping("/inner") @RequestMapping("/inner")
public class InnerController extends BaseController { public class InnerController extends BaseController {
@Autowired
private MetadataSourceService metadataSourceService;
@DataInner
@GetMapping("/sources/{id}")
public MetadataSourceEntity getMetadataSourceById(@PathVariable("id") String id) {
MetadataSourceEntity metadataSourceEntity = metadataSourceService.getMetadataSourceById(id);
return metadataSourceEntity;
}
@DataInner
@GetMapping("/sources/list")
public List<MetadataSourceEntity> getMetadataSourceList() {
QueryWrapper<MetadataSourceEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", DataConstant.EnableState.ENABLE.getKey());
List<MetadataSourceEntity> list = metadataSourceService.list(queryWrapper);
return list;
}
} }
...@@ -3,12 +3,12 @@ package cn.datax.service.data.metadata.controller; ...@@ -3,12 +3,12 @@ package cn.datax.service.data.metadata.controller;
import cn.datax.common.core.JsonPage; import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups; import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.data.metadata.api.dto.DataMetadataColumnDto; import cn.datax.service.data.metadata.api.dto.MetadataColumnDto;
import cn.datax.service.data.metadata.api.entity.DataMetadataColumnEntity; import cn.datax.service.data.metadata.api.entity.MetadataColumnEntity;
import cn.datax.service.data.metadata.api.vo.DataMetadataColumnVo; import cn.datax.service.data.metadata.api.vo.MetadataColumnVo;
import cn.datax.service.data.metadata.api.query.DataMetadataColumnQuery; import cn.datax.service.data.metadata.api.query.MetadataColumnQuery;
import cn.datax.service.data.metadata.mapstruct.DataMetadataColumnMapper; import cn.datax.service.data.metadata.mapstruct.MetadataColumnMapper;
import cn.datax.service.data.metadata.service.DataMetadataColumnService; import cn.datax.service.data.metadata.service.MetadataColumnService;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
...@@ -37,13 +37,13 @@ import java.util.stream.Collectors; ...@@ -37,13 +37,13 @@ import java.util.stream.Collectors;
@Api(tags = {"元数据信息表"}) @Api(tags = {"元数据信息表"})
@RestController @RestController
@RequestMapping("/columns") @RequestMapping("/columns")
public class DataMetadataColumnController extends BaseController { public class MetadataColumnController extends BaseController {
@Autowired @Autowired
private DataMetadataColumnService dataMetadataColumnService; private MetadataColumnService metadataColumnService;
@Autowired @Autowired
private DataMetadataColumnMapper dataMetadataColumnMapper; private MetadataColumnMapper metadataColumnMapper;
/** /**
* 通过ID查询信息 * 通过ID查询信息
...@@ -55,41 +55,41 @@ public class DataMetadataColumnController extends BaseController { ...@@ -55,41 +55,41 @@ public class DataMetadataColumnController extends BaseController {
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@GetMapping("/{id}") @GetMapping("/{id}")
public R getDataMetadataColumnById(@PathVariable String id) { public R getDataMetadataColumnById(@PathVariable String id) {
DataMetadataColumnEntity dataMetadataColumnEntity = dataMetadataColumnService.getDataMetadataColumnById(id); MetadataColumnEntity metadataColumnEntity = metadataColumnService.getMetadataColumnById(id);
return R.ok().setData(dataMetadataColumnMapper.toVO(dataMetadataColumnEntity)); return R.ok().setData(metadataColumnMapper.toVO(metadataColumnEntity));
} }
@ApiOperation(value = "获取列表", notes = "") @ApiOperation(value = "获取列表", notes = "")
@GetMapping("/list") @GetMapping("/list")
public R getDataMetadataColumnList(DataMetadataColumnQuery dataMetadataColumnQuery) { public R getDataMetadataColumnList(MetadataColumnQuery metadataColumnQuery) {
QueryWrapper<DataMetadataColumnEntity> queryWrapper = new QueryWrapper<>(); QueryWrapper<MetadataColumnEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(dataMetadataColumnQuery.getColumnName()), "column_name", dataMetadataColumnQuery.getColumnName()); queryWrapper.like(StrUtil.isNotBlank(metadataColumnQuery.getColumnName()), "column_name", metadataColumnQuery.getColumnName());
queryWrapper.eq(StrUtil.isNotBlank(dataMetadataColumnQuery.getSourceId()), "source_id", dataMetadataColumnQuery.getSourceId()); queryWrapper.eq(StrUtil.isNotBlank(metadataColumnQuery.getSourceId()), "source_id", metadataColumnQuery.getSourceId());
queryWrapper.eq(StrUtil.isNotBlank(dataMetadataColumnQuery.getTableId()), "table_id", dataMetadataColumnQuery.getTableId()); queryWrapper.eq(StrUtil.isNotBlank(metadataColumnQuery.getTableId()), "table_id", metadataColumnQuery.getTableId());
List<DataMetadataColumnEntity> list = dataMetadataColumnService.list(queryWrapper); List<MetadataColumnEntity> list = metadataColumnService.list(queryWrapper);
List<DataMetadataColumnVo> collect = list.stream().map(dataMetadataColumnMapper::toVO).collect(Collectors.toList()); List<MetadataColumnVo> collect = list.stream().map(metadataColumnMapper::toVO).collect(Collectors.toList());
return R.ok().setData(collect); return R.ok().setData(collect);
} }
/** /**
* 分页查询信息 * 分页查询信息
* *
* @param dataMetadataColumnQuery * @param metadataColumnQuery
* @return * @return
*/ */
@ApiOperation(value = "分页查询", notes = "") @ApiOperation(value = "分页查询", notes = "")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "dataMetadataColumnQuery", value = "查询实体dataMetadataColumnQuery", required = true, dataTypeClass = DataMetadataColumnQuery.class) @ApiImplicitParam(name = "dataMetadataColumnQuery", value = "查询实体dataMetadataColumnQuery", required = true, dataTypeClass = MetadataColumnQuery.class)
}) })
@GetMapping("/page") @GetMapping("/page")
public R getDataMetadataColumnPage(DataMetadataColumnQuery dataMetadataColumnQuery) { public R getDataMetadataColumnPage(MetadataColumnQuery metadataColumnQuery) {
QueryWrapper<DataMetadataColumnEntity> queryWrapper = new QueryWrapper<>(); QueryWrapper<MetadataColumnEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(dataMetadataColumnQuery.getColumnName()), "column_name", dataMetadataColumnQuery.getColumnName()); queryWrapper.like(StrUtil.isNotBlank(metadataColumnQuery.getColumnName()), "column_name", metadataColumnQuery.getColumnName());
queryWrapper.eq(StrUtil.isNotBlank(dataMetadataColumnQuery.getSourceId()), "source_id", dataMetadataColumnQuery.getSourceId()); queryWrapper.eq(StrUtil.isNotBlank(metadataColumnQuery.getSourceId()), "source_id", metadataColumnQuery.getSourceId());
queryWrapper.eq(StrUtil.isNotBlank(dataMetadataColumnQuery.getTableId()), "table_id", dataMetadataColumnQuery.getTableId()); queryWrapper.eq(StrUtil.isNotBlank(metadataColumnQuery.getTableId()), "table_id", metadataColumnQuery.getTableId());
IPage<DataMetadataColumnEntity> page = dataMetadataColumnService.page(new Page<>(dataMetadataColumnQuery.getPageNum(), dataMetadataColumnQuery.getPageSize()), queryWrapper); IPage<MetadataColumnEntity> page = metadataColumnService.page(new Page<>(metadataColumnQuery.getPageNum(), metadataColumnQuery.getPageSize()), queryWrapper);
List<DataMetadataColumnVo> collect = page.getRecords().stream().map(dataMetadataColumnMapper::toVO).collect(Collectors.toList()); List<MetadataColumnVo> collect = page.getRecords().stream().map(metadataColumnMapper::toVO).collect(Collectors.toList());
JsonPage<DataMetadataColumnVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect); JsonPage<MetadataColumnVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
return R.ok().setData(jsonPage); return R.ok().setData(jsonPage);
} }
...@@ -101,9 +101,9 @@ public class DataMetadataColumnController extends BaseController { ...@@ -101,9 +101,9 @@ public class DataMetadataColumnController extends BaseController {
@ApiOperation(value = "添加信息", notes = "根据dataMetadataColumn对象添加信息") @ApiOperation(value = "添加信息", notes = "根据dataMetadataColumn对象添加信息")
@ApiImplicitParam(name = "dataMetadataColumn", value = "详细实体dataMetadataColumn", required = true, dataType = "DataMetadataColumnDto") @ApiImplicitParam(name = "dataMetadataColumn", value = "详细实体dataMetadataColumn", required = true, dataType = "DataMetadataColumnDto")
@PostMapping() @PostMapping()
public R saveDataMetadataColumn(@RequestBody @Validated({ValidationGroups.Insert.class}) DataMetadataColumnDto dataMetadataColumn) { public R saveDataMetadataColumn(@RequestBody @Validated({ValidationGroups.Insert.class}) MetadataColumnDto dataMetadataColumn) {
DataMetadataColumnEntity dataMetadataColumnEntity = dataMetadataColumnService.saveDataMetadataColumn(dataMetadataColumn); MetadataColumnEntity metadataColumnEntity = metadataColumnService.saveMetadataColumn(dataMetadataColumn);
return R.ok().setData(dataMetadataColumnMapper.toVO(dataMetadataColumnEntity)); return R.ok().setData(metadataColumnMapper.toVO(metadataColumnEntity));
} }
/** /**
...@@ -117,9 +117,9 @@ public class DataMetadataColumnController extends BaseController { ...@@ -117,9 +117,9 @@ public class DataMetadataColumnController extends BaseController {
@ApiImplicitParam(name = "dataMetadataColumn", value = "详细实体dataMetadataColumn", required = true, dataType = "DataMetadataColumnDto") @ApiImplicitParam(name = "dataMetadataColumn", value = "详细实体dataMetadataColumn", required = true, dataType = "DataMetadataColumnDto")
}) })
@PutMapping("/{id}") @PutMapping("/{id}")
public R updateDataMetadataColumn(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) DataMetadataColumnDto dataMetadataColumn) { public R updateDataMetadataColumn(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) MetadataColumnDto dataMetadataColumn) {
DataMetadataColumnEntity dataMetadataColumnEntity = dataMetadataColumnService.updateDataMetadataColumn(dataMetadataColumn); MetadataColumnEntity metadataColumnEntity = metadataColumnService.updateMetadataColumn(dataMetadataColumn);
return R.ok().setData(dataMetadataColumnMapper.toVO(dataMetadataColumnEntity)); return R.ok().setData(metadataColumnMapper.toVO(metadataColumnEntity));
} }
/** /**
...@@ -131,7 +131,7 @@ public class DataMetadataColumnController extends BaseController { ...@@ -131,7 +131,7 @@ public class DataMetadataColumnController extends BaseController {
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
public R deleteDataMetadataColumnById(@PathVariable String id) { public R deleteDataMetadataColumnById(@PathVariable String id) {
dataMetadataColumnService.deleteDataMetadataColumnById(id); metadataColumnService.deleteMetadataColumnById(id);
return R.ok(); return R.ok();
} }
...@@ -144,7 +144,7 @@ public class DataMetadataColumnController extends BaseController { ...@@ -144,7 +144,7 @@ public class DataMetadataColumnController extends BaseController {
@ApiImplicitParam(name = "ids", value = "ID集合", required = true, dataType = "List", paramType = "path") @ApiImplicitParam(name = "ids", value = "ID集合", required = true, dataType = "List", paramType = "path")
@DeleteMapping("/batch/{ids}") @DeleteMapping("/batch/{ids}")
public R deleteDataMetadataColumnBatch(@PathVariable List<String> ids) { public R deleteDataMetadataColumnBatch(@PathVariable List<String> ids) {
dataMetadataColumnService.deleteDataMetadataColumnBatch(ids); metadataColumnService.deleteMetadataColumnBatch(ids);
return R.ok(); return R.ok();
} }
} }
package cn.datax.service.data.factory.controller; package cn.datax.service.data.metadata.controller;
import cn.datax.common.base.BaseController;
import cn.datax.common.core.DataConstant; import cn.datax.common.core.DataConstant;
import cn.datax.common.core.JsonPage; import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R; import cn.datax.common.core.R;
...@@ -8,14 +9,17 @@ import cn.datax.common.database.core.DbColumn; ...@@ -8,14 +9,17 @@ import cn.datax.common.database.core.DbColumn;
import cn.datax.common.database.core.DbTable; import cn.datax.common.database.core.DbTable;
import cn.datax.common.database.core.PageResult; import cn.datax.common.database.core.PageResult;
import cn.datax.common.validate.ValidationGroups; import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.data.factory.api.dto.DataSourceDto; import cn.datax.service.data.metadata.api.dto.MetadataSourceDto;
import cn.datax.service.data.factory.api.entity.DataSourceEntity; import cn.datax.service.data.metadata.api.entity.MetadataSourceEntity;
import cn.datax.service.data.factory.api.query.DataSourceQuery; import cn.datax.service.data.metadata.api.query.DbDataQuery;
import cn.datax.service.data.factory.api.query.DbDataQuery; import cn.datax.service.data.metadata.api.query.MetadataSourceQuery;
import cn.datax.service.data.factory.api.vo.DataSourceVo; import cn.datax.service.data.metadata.api.vo.MetadataSourceVo;
import cn.datax.service.data.factory.mapstruct.DataSourceMapper; import cn.datax.service.data.metadata.mapstruct.MetadataSourceMapper;
import cn.datax.service.data.factory.service.DataSourceService; import cn.datax.service.data.metadata.service.MetadataSourceService;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import com.aspose.words.SaveOptions;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
...@@ -27,8 +31,8 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -27,8 +31,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import cn.datax.common.base.BaseController; import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -43,14 +47,14 @@ import java.util.stream.Collectors; ...@@ -43,14 +47,14 @@ import java.util.stream.Collectors;
*/ */
@Api(tags = {"数据源信息表"}) @Api(tags = {"数据源信息表"})
@RestController @RestController
@RequestMapping("/dataSources") @RequestMapping("/sources")
public class DataSourceController extends BaseController { public class MetadataSourceController extends BaseController {
@Autowired @Autowired
private DataSourceService dataSourceService; private MetadataSourceService metadataSourceService;
@Autowired @Autowired
private DataSourceMapper dataSourceMapper; private MetadataSourceMapper metadataSourceMapper;
/** /**
* 通过ID查询信息 * 通过ID查询信息
...@@ -61,68 +65,67 @@ public class DataSourceController extends BaseController { ...@@ -61,68 +65,67 @@ public class DataSourceController extends BaseController {
@ApiOperation(value = "获取详细信息", notes = "根据url的id来获取详细信息") @ApiOperation(value = "获取详细信息", notes = "根据url的id来获取详细信息")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@GetMapping("/{id}") @GetMapping("/{id}")
public R getDataSourceById(@PathVariable String id) { public R getMetadataSourceById(@PathVariable String id) {
DataSourceEntity dataSourceEntity = dataSourceService.getDataSourceById(id); MetadataSourceEntity metadataSourceEntity = metadataSourceService.getMetadataSourceById(id);
return R.ok().setData(dataSourceMapper.toVO(dataSourceEntity)); return R.ok().setData(metadataSourceMapper.toVO(metadataSourceEntity));
} }
@ApiOperation(value = "获取列表", notes = "") @ApiOperation(value = "获取列表", notes = "")
@GetMapping("/list") @GetMapping("/list")
public R getDataSourceList() { public R getMetadataSourceList() {
QueryWrapper<DataSourceEntity> queryWrapper = new QueryWrapper<>(); QueryWrapper<MetadataSourceEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", DataConstant.EnableState.ENABLE.getKey()); queryWrapper.eq("status", DataConstant.EnableState.ENABLE.getKey());
List<DataSourceEntity> list = dataSourceService.list(queryWrapper); List<MetadataSourceEntity> list = metadataSourceService.list(queryWrapper);
List<DataSourceVo> collect = list.stream().map(dataSourceMapper::toVO).collect(Collectors.toList()); List<MetadataSourceVo> collect = list.stream().map(metadataSourceMapper::toVO).collect(Collectors.toList());
return R.ok().setData(collect); return R.ok().setData(collect);
} }
/** /**
* 分页查询信息 * 分页查询信息
* *
* @param dataSourceQuery * @param metadataSourceQuery
* @return * @return
*/ */
@ApiOperation(value = "分页查询", notes = "") @ApiOperation(value = "分页查询", notes = "")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "dataSourceQuery", value = "查询实体dataSourceQuery", required = true, dataTypeClass = DataSourceQuery.class) @ApiImplicitParam(name = "metadataSourceQuery", value = "查询实体metadataSourceQuery", required = true, dataTypeClass = MetadataSourceQuery.class)
}) })
@GetMapping("/page") @GetMapping("/page")
public R getDataSourcePage(DataSourceQuery dataSourceQuery) { public R getMetadataSourcePage(MetadataSourceQuery metadataSourceQuery) {
QueryWrapper<DataSourceEntity> queryWrapper = new QueryWrapper<>(); QueryWrapper<MetadataSourceEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(dataSourceQuery.getSourceName()), "source_name", dataSourceQuery.getSourceName()); queryWrapper.like(StrUtil.isNotBlank(metadataSourceQuery.getSourceName()), "source_name", metadataSourceQuery.getSourceName());
queryWrapper.eq(StrUtil.isNotBlank(dataSourceQuery.getThemeId()), "theme_id", dataSourceQuery.getThemeId()); IPage<MetadataSourceEntity> page = metadataSourceService.page(new Page<>(metadataSourceQuery.getPageNum(), metadataSourceQuery.getPageSize()), queryWrapper);
IPage<DataSourceEntity> page = dataSourceService.page(new Page<>(dataSourceQuery.getPageNum(), dataSourceQuery.getPageSize()), queryWrapper); List<MetadataSourceVo> collect = page.getRecords().stream().map(metadataSourceMapper::toVO).collect(Collectors.toList());
List<DataSourceVo> collect = page.getRecords().stream().map(dataSourceMapper::toVO).collect(Collectors.toList()); JsonPage<MetadataSourceVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
JsonPage<DataSourceVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
return R.ok().setData(jsonPage); return R.ok().setData(jsonPage);
} }
/** /**
* 添加 * 添加
* @param dataSource * @param metadataSourceDto
* @return * @return
*/ */
@ApiOperation(value = "添加信息", notes = "根据dataSource对象添加信息") @ApiOperation(value = "添加信息", notes = "根据metadataSourceDto对象添加信息")
@ApiImplicitParam(name = "dataSource", value = "详细实体dataSource", required = true, dataType = "DataSourceDto") @ApiImplicitParam(name = "metadataSourceDto", value = "详细实体metadataSourceDto", required = true, dataType = "MetadataSourceDto")
@PostMapping() @PostMapping()
public R saveDataSource(@RequestBody @Validated({ValidationGroups.Insert.class}) DataSourceDto dataSource) { public R saveMetadataSource(@RequestBody @Validated({ValidationGroups.Insert.class}) MetadataSourceDto metadataSourceDto) {
dataSourceService.saveDataSource(dataSource); metadataSourceService.saveMetadataSource(metadataSourceDto);
return R.ok(); return R.ok();
} }
/** /**
* 修改 * 修改
* @param dataSource * @param metadataSourceDto
* @return * @return
*/ */
@ApiOperation(value = "修改信息", notes = "根据url的id来指定修改对象,并根据传过来的信息来修改详细信息") @ApiOperation(value = "修改信息", notes = "根据url的id来指定修改对象,并根据传过来的信息来修改详细信息")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path"), @ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "dataSource", value = "详细实体dataSource", required = true, dataType = "DataSourceDto") @ApiImplicitParam(name = "metadataSourceDto", value = "详细实体metadataSourceDto", required = true, dataType = "MetadataSourceDto")
}) })
@PutMapping("/{id}") @PutMapping("/{id}")
public R updateDataSource(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) DataSourceDto dataSource) { public R updateMetadataSource(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) MetadataSourceDto metadataSourceDto) {
dataSourceService.updateDataSource(dataSource); metadataSourceService.updateMetadataSource(metadataSourceDto);
return R.ok(); return R.ok();
} }
...@@ -134,29 +137,29 @@ public class DataSourceController extends BaseController { ...@@ -134,29 +137,29 @@ public class DataSourceController extends BaseController {
@ApiOperation(value = "删除", notes = "根据url的id来指定删除对象") @ApiOperation(value = "删除", notes = "根据url的id来指定删除对象")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
public R deleteDataSourceById(@PathVariable String id) { public R deleteMetadataSourceById(@PathVariable String id) {
dataSourceService.deleteDataSourceById(id); metadataSourceService.deleteMetadataSourceById(id);
return R.ok(); return R.ok();
} }
@ApiOperation(value = "批量删除", notes = "根据url的ids来批量删除对象") @ApiOperation(value = "批量删除", notes = "根据url的ids来批量删除对象")
@ApiImplicitParam(name = "ids", value = "ID集合", required = true, dataType = "List", paramType = "path") @ApiImplicitParam(name = "ids", value = "ID集合", required = true, dataType = "List", paramType = "path")
@DeleteMapping("/batch/{ids}") @DeleteMapping("/batch/{ids}")
public R deleteDataSourceBatch(@PathVariable List<String> ids) { public R deleteMetadataSourceBatch(@PathVariable List<String> ids) {
dataSourceService.deleteDataSourceBatch(ids); metadataSourceService.deleteMetadataSourceBatch(ids);
return R.ok(); return R.ok();
} }
/** /**
* 检测数据库连通性 * 检测数据库连通性
* @param dataSource * @param metadataSourceDto
* @return * @return
*/ */
@ApiOperation(value = "数据库连通性", notes = "根据数据库配置信息检测数据库连通性") @ApiOperation(value = "数据库连通性", notes = "根据数据库配置信息检测数据库连通性")
@ApiImplicitParam(name = "dataSource", value = "详细实体dataSource", required = true, dataType = "DataSourceDto") @ApiImplicitParam(name = "dataSource", value = "详细实体dataSource", required = true, dataType = "DataSourceDto")
@PostMapping("/checkConnection") @PostMapping("/checkConnection")
public R checkConnection(@RequestBody @Validated({ValidationGroups.Insert.class}) DataSourceDto dataSource) { public R checkConnection(@RequestBody @Validated({ValidationGroups.Insert.class}) MetadataSourceDto metadataSourceDto) {
DbQuery dbQuery = dataSourceService.checkConnection(dataSource); DbQuery dbQuery = metadataSourceService.checkConnection(metadataSourceDto);
Boolean valid = dbQuery.valid(); Boolean valid = dbQuery.valid();
return valid ? R.ok() : R.error("数据库连接有误,请检查数据库配置是否正确"); return valid ? R.ok() : R.error("数据库连接有误,请检查数据库配置是否正确");
} }
...@@ -172,7 +175,7 @@ public class DataSourceController extends BaseController { ...@@ -172,7 +175,7 @@ public class DataSourceController extends BaseController {
}) })
@GetMapping("/{id}/tables") @GetMapping("/{id}/tables")
public R getDbTables(@PathVariable String id) { public R getDbTables(@PathVariable String id) {
List<DbTable> tables = dataSourceService.getDbTables(id); List<DbTable> tables = metadataSourceService.getDbTables(id);
return R.ok().setData(tables); return R.ok().setData(tables);
} }
...@@ -188,7 +191,7 @@ public class DataSourceController extends BaseController { ...@@ -188,7 +191,7 @@ public class DataSourceController extends BaseController {
}) })
@GetMapping("/{id}/{tableName}/columns") @GetMapping("/{id}/{tableName}/columns")
public R getDbTableColumns(@PathVariable String id, @PathVariable String tableName) { public R getDbTableColumns(@PathVariable String id, @PathVariable String tableName) {
List<DbColumn> columns = dataSourceService.getDbTableColumns(id, tableName); List<DbColumn> columns = metadataSourceService.getDbTableColumns(id, tableName);
return R.ok().setData(columns); return R.ok().setData(columns);
} }
...@@ -196,7 +199,7 @@ public class DataSourceController extends BaseController { ...@@ -196,7 +199,7 @@ public class DataSourceController extends BaseController {
@ApiImplicitParam(name = "dbDataQuery", value = "详细实体dbDataQuery", required = true, dataType = "DbDataQuery") @ApiImplicitParam(name = "dbDataQuery", value = "详细实体dbDataQuery", required = true, dataType = "DbDataQuery")
@PostMapping("/queryList") @PostMapping("/queryList")
public R queryList(@RequestBody @Validated DbDataQuery dbDataQuery) { public R queryList(@RequestBody @Validated DbDataQuery dbDataQuery) {
DbQuery dbQuery = dataSourceService.getDbQuery(dbDataQuery.getDataSourceId()); DbQuery dbQuery = metadataSourceService.getDbQuery(dbDataQuery.getDataSourceId());
List<Map<String, Object>> list = dbQuery.queryList(dbDataQuery.getSql()); List<Map<String, Object>> list = dbQuery.queryList(dbDataQuery.getSql());
return R.ok().setData(list); return R.ok().setData(list);
} }
...@@ -205,9 +208,34 @@ public class DataSourceController extends BaseController { ...@@ -205,9 +208,34 @@ public class DataSourceController extends BaseController {
@ApiImplicitParam(name = "dbDataQuery", value = "详细实体dbDataQuery", required = true, dataType = "DbDataQuery") @ApiImplicitParam(name = "dbDataQuery", value = "详细实体dbDataQuery", required = true, dataType = "DbDataQuery")
@PostMapping("/queryByPage") @PostMapping("/queryByPage")
public R queryByPage(@RequestBody @Validated DbDataQuery dbDataQuery) { public R queryByPage(@RequestBody @Validated DbDataQuery dbDataQuery) {
DbQuery dbQuery = dataSourceService.getDbQuery(dbDataQuery.getDataSourceId()); DbQuery dbQuery = metadataSourceService.getDbQuery(dbDataQuery.getDataSourceId());
PageResult<Map<String, Object>> page = dbQuery.queryByPage(dbDataQuery.getSql(), dbDataQuery.getOffset(), dbDataQuery.getPageSize()); PageResult<Map<String, Object>> page = dbQuery.queryByPage(dbDataQuery.getSql(), dbDataQuery.getOffset(), dbDataQuery.getPageSize());
page.setPageNum(dbDataQuery.getPageNum()).setPageSize(dbDataQuery.getPageSize()); page.setPageNum(dbDataQuery.getPageNum()).setPageSize(dbDataQuery.getPageSize());
return R.ok().setData(page); return R.ok().setData(page);
} }
@ApiOperation(value = "同步", notes = "根据url的id来指定同步对象")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@PostMapping("/sync/{id}")
public R syncMetadata(@PathVariable String id) {
metadataSourceService.syncMetadata(id);
return R.ok();
}
@ApiOperation(value = "数据库设计文档", notes = "根据url的id来指定生成数据库设计文档对象")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@PostMapping("/word/{id}")
public void wordMetadata(@PathVariable String id, HttpServletResponse response) throws Exception {
// 清空response
response.reset();
// 设置response的Header
response.setContentType("application/octet-stream;charset=utf-8");
// 设置content-disposition响应头控制浏览器以下载的形式打开文件
response.addHeader("Content-Disposition", "attachment;filename=" + new String("数据库设计文档.doc".getBytes()));
Document doc = metadataSourceService.wordMetadata(id);
OutputStream out = response.getOutputStream();
doc.save(out, SaveOptions.createSaveOptions(SaveFormat.DOC));
out.flush();
out.close();
}
} }
...@@ -3,12 +3,12 @@ package cn.datax.service.data.metadata.controller; ...@@ -3,12 +3,12 @@ package cn.datax.service.data.metadata.controller;
import cn.datax.common.core.JsonPage; import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups; import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.data.metadata.api.dto.DataMetadataTableDto; import cn.datax.service.data.metadata.api.dto.MetadataTableDto;
import cn.datax.service.data.metadata.api.entity.DataMetadataTableEntity; import cn.datax.service.data.metadata.api.entity.MetadataTableEntity;
import cn.datax.service.data.metadata.api.vo.DataMetadataTableVo; import cn.datax.service.data.metadata.api.vo.MetadataTableVo;
import cn.datax.service.data.metadata.api.query.DataMetadataTableQuery; import cn.datax.service.data.metadata.api.query.MetadataTableQuery;
import cn.datax.service.data.metadata.mapstruct.DataMetadataTableMapper; import cn.datax.service.data.metadata.mapstruct.MetadataTableMapper;
import cn.datax.service.data.metadata.service.DataMetadataTableService; import cn.datax.service.data.metadata.service.MetadataTableService;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
...@@ -37,13 +37,13 @@ import java.util.stream.Collectors; ...@@ -37,13 +37,13 @@ import java.util.stream.Collectors;
@Api(tags = {"数据库表信息表"}) @Api(tags = {"数据库表信息表"})
@RestController @RestController
@RequestMapping("/tables") @RequestMapping("/tables")
public class DataMetadataTableController extends BaseController { public class MetadataTableController extends BaseController {
@Autowired @Autowired
private DataMetadataTableService dataMetadataTableService; private MetadataTableService metadataTableService;
@Autowired @Autowired
private DataMetadataTableMapper dataMetadataTableMapper; private MetadataTableMapper metadataTableMapper;
/** /**
* 通过ID查询信息 * 通过ID查询信息
...@@ -55,39 +55,39 @@ public class DataMetadataTableController extends BaseController { ...@@ -55,39 +55,39 @@ public class DataMetadataTableController extends BaseController {
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@GetMapping("/{id}") @GetMapping("/{id}")
public R getDataMetadataTableById(@PathVariable String id) { public R getDataMetadataTableById(@PathVariable String id) {
DataMetadataTableEntity dataMetadataTableEntity = dataMetadataTableService.getDataMetadataTableById(id); MetadataTableEntity metadataTableEntity = metadataTableService.getMetadataTableById(id);
return R.ok().setData(dataMetadataTableMapper.toVO(dataMetadataTableEntity)); return R.ok().setData(metadataTableMapper.toVO(metadataTableEntity));
} }
@ApiOperation(value = "获取列表", notes = "") @ApiOperation(value = "获取列表", notes = "")
@GetMapping("/list") @GetMapping("/list")
public R getDataMetadataTableList(DataMetadataTableQuery dataMetadataTableQuery) { public R getDataMetadataTableList(MetadataTableQuery metadataTableQuery) {
QueryWrapper<DataMetadataTableEntity> queryWrapper = new QueryWrapper<>(); QueryWrapper<MetadataTableEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(dataMetadataTableQuery.getTableName()), "table_name", dataMetadataTableQuery.getTableName()); queryWrapper.like(StrUtil.isNotBlank(metadataTableQuery.getTableName()), "table_name", metadataTableQuery.getTableName());
queryWrapper.eq(StrUtil.isNotBlank(dataMetadataTableQuery.getSourceId()), "source_id", dataMetadataTableQuery.getSourceId()); queryWrapper.eq(StrUtil.isNotBlank(metadataTableQuery.getSourceId()), "source_id", metadataTableQuery.getSourceId());
List<DataMetadataTableEntity> list = dataMetadataTableService.list(queryWrapper); List<MetadataTableEntity> list = metadataTableService.list(queryWrapper);
List<DataMetadataTableVo> collect = list.stream().map(dataMetadataTableMapper::toVO).collect(Collectors.toList()); List<MetadataTableVo> collect = list.stream().map(metadataTableMapper::toVO).collect(Collectors.toList());
return R.ok().setData(collect); return R.ok().setData(collect);
} }
/** /**
* 分页查询信息 * 分页查询信息
* *
* @param dataMetadataTableQuery * @param metadataTableQuery
* @return * @return
*/ */
@ApiOperation(value = "分页查询", notes = "") @ApiOperation(value = "分页查询", notes = "")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "dataMetadataTableQuery", value = "查询实体dataMetadataTableQuery", required = true, dataTypeClass = DataMetadataTableQuery.class) @ApiImplicitParam(name = "dataMetadataTableQuery", value = "查询实体dataMetadataTableQuery", required = true, dataTypeClass = MetadataTableQuery.class)
}) })
@GetMapping("/page") @GetMapping("/page")
public R getDataMetadataTablePage(DataMetadataTableQuery dataMetadataTableQuery) { public R getDataMetadataTablePage(MetadataTableQuery metadataTableQuery) {
QueryWrapper<DataMetadataTableEntity> queryWrapper = new QueryWrapper<>(); QueryWrapper<MetadataTableEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(dataMetadataTableQuery.getTableName()), "table_name", dataMetadataTableQuery.getTableName()); queryWrapper.like(StrUtil.isNotBlank(metadataTableQuery.getTableName()), "table_name", metadataTableQuery.getTableName());
queryWrapper.eq(StrUtil.isNotBlank(dataMetadataTableQuery.getSourceId()), "source_id", dataMetadataTableQuery.getSourceId()); queryWrapper.eq(StrUtil.isNotBlank(metadataTableQuery.getSourceId()), "source_id", metadataTableQuery.getSourceId());
IPage<DataMetadataTableEntity> page = dataMetadataTableService.page(new Page<>(dataMetadataTableQuery.getPageNum(), dataMetadataTableQuery.getPageSize()), queryWrapper); IPage<MetadataTableEntity> page = metadataTableService.page(new Page<>(metadataTableQuery.getPageNum(), metadataTableQuery.getPageSize()), queryWrapper);
List<DataMetadataTableVo> collect = page.getRecords().stream().map(dataMetadataTableMapper::toVO).collect(Collectors.toList()); List<MetadataTableVo> collect = page.getRecords().stream().map(metadataTableMapper::toVO).collect(Collectors.toList());
JsonPage<DataMetadataTableVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect); JsonPage<MetadataTableVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
return R.ok().setData(jsonPage); return R.ok().setData(jsonPage);
} }
...@@ -99,9 +99,9 @@ public class DataMetadataTableController extends BaseController { ...@@ -99,9 +99,9 @@ public class DataMetadataTableController extends BaseController {
@ApiOperation(value = "添加信息", notes = "根据dataMetadataTable对象添加信息") @ApiOperation(value = "添加信息", notes = "根据dataMetadataTable对象添加信息")
@ApiImplicitParam(name = "dataMetadataTable", value = "详细实体dataMetadataTable", required = true, dataType = "DataMetadataTableDto") @ApiImplicitParam(name = "dataMetadataTable", value = "详细实体dataMetadataTable", required = true, dataType = "DataMetadataTableDto")
@PostMapping() @PostMapping()
public R saveDataMetadataTable(@RequestBody @Validated({ValidationGroups.Insert.class}) DataMetadataTableDto dataMetadataTable) { public R saveDataMetadataTable(@RequestBody @Validated({ValidationGroups.Insert.class}) MetadataTableDto dataMetadataTable) {
DataMetadataTableEntity dataMetadataTableEntity = dataMetadataTableService.saveDataMetadataTable(dataMetadataTable); MetadataTableEntity metadataTableEntity = metadataTableService.saveMetadataTable(dataMetadataTable);
return R.ok().setData(dataMetadataTableMapper.toVO(dataMetadataTableEntity)); return R.ok().setData(metadataTableMapper.toVO(metadataTableEntity));
} }
/** /**
...@@ -115,9 +115,9 @@ public class DataMetadataTableController extends BaseController { ...@@ -115,9 +115,9 @@ public class DataMetadataTableController extends BaseController {
@ApiImplicitParam(name = "dataMetadataTable", value = "详细实体dataMetadataTable", required = true, dataType = "DataMetadataTableDto") @ApiImplicitParam(name = "dataMetadataTable", value = "详细实体dataMetadataTable", required = true, dataType = "DataMetadataTableDto")
}) })
@PutMapping("/{id}") @PutMapping("/{id}")
public R updateDataMetadataTable(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) DataMetadataTableDto dataMetadataTable) { public R updateDataMetadataTable(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) MetadataTableDto dataMetadataTable) {
DataMetadataTableEntity dataMetadataTableEntity = dataMetadataTableService.updateDataMetadataTable(dataMetadataTable); MetadataTableEntity metadataTableEntity = metadataTableService.updateMetadataTable(dataMetadataTable);
return R.ok().setData(dataMetadataTableMapper.toVO(dataMetadataTableEntity)); return R.ok().setData(metadataTableMapper.toVO(metadataTableEntity));
} }
/** /**
...@@ -129,7 +129,7 @@ public class DataMetadataTableController extends BaseController { ...@@ -129,7 +129,7 @@ public class DataMetadataTableController extends BaseController {
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
public R deleteDataMetadataTableById(@PathVariable String id) { public R deleteDataMetadataTableById(@PathVariable String id) {
dataMetadataTableService.deleteDataMetadataTableById(id); metadataTableService.deleteMetadataTableById(id);
return R.ok(); return R.ok();
} }
...@@ -142,7 +142,7 @@ public class DataMetadataTableController extends BaseController { ...@@ -142,7 +142,7 @@ public class DataMetadataTableController extends BaseController {
@ApiImplicitParam(name = "ids", value = "ID集合", required = true, dataType = "List", paramType = "path") @ApiImplicitParam(name = "ids", value = "ID集合", required = true, dataType = "List", paramType = "path")
@DeleteMapping("/batch/{ids}") @DeleteMapping("/batch/{ids}")
public R deleteDataMetadataTableBatch(@PathVariable List<String> ids) { public R deleteDataMetadataTableBatch(@PathVariable List<String> ids) {
dataMetadataTableService.deleteDataMetadataTableBatch(ids); metadataTableService.deleteMetadataTableBatch(ids);
return R.ok(); return R.ok();
} }
} }
package cn.datax.service.data.metadata.dao; package cn.datax.service.data.metadata.dao;
import cn.datax.common.base.BaseDao; import cn.datax.common.base.BaseDao;
import cn.datax.service.data.metadata.api.entity.DataMetadataColumnEntity; import cn.datax.service.data.metadata.api.entity.MetadataColumnEntity;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
/** /**
...@@ -13,6 +13,6 @@ import org.apache.ibatis.annotations.Mapper; ...@@ -13,6 +13,6 @@ import org.apache.ibatis.annotations.Mapper;
* @since 2020-07-29 * @since 2020-07-29
*/ */
@Mapper @Mapper
public interface DataMetadataColumnDao extends BaseDao<DataMetadataColumnEntity> { public interface MetadataColumnDao extends BaseDao<MetadataColumnEntity> {
} }
package cn.datax.service.data.factory.dao; package cn.datax.service.data.metadata.dao;
import cn.datax.common.base.BaseDao; import cn.datax.common.base.BaseDao;
import cn.datax.service.data.factory.api.entity.DataSourceEntity; import cn.datax.service.data.metadata.api.entity.MetadataSourceEntity;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
/** /**
...@@ -13,6 +13,6 @@ import org.apache.ibatis.annotations.Mapper; ...@@ -13,6 +13,6 @@ import org.apache.ibatis.annotations.Mapper;
* @since 2020-03-14 * @since 2020-03-14
*/ */
@Mapper @Mapper
public interface DataSourceDao extends BaseDao<DataSourceEntity> { public interface MetadataSourceDao extends BaseDao<MetadataSourceEntity> {
} }
package cn.datax.service.data.metadata.dao; package cn.datax.service.data.metadata.dao;
import cn.datax.common.base.BaseDao; import cn.datax.common.base.BaseDao;
import cn.datax.service.data.metadata.api.entity.DataMetadataTableEntity; import cn.datax.service.data.metadata.api.entity.MetadataTableEntity;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
/** /**
...@@ -13,6 +13,6 @@ import org.apache.ibatis.annotations.Mapper; ...@@ -13,6 +13,6 @@ import org.apache.ibatis.annotations.Mapper;
* @since 2020-07-29 * @since 2020-07-29
*/ */
@Mapper @Mapper
public interface DataMetadataTableDao extends BaseDao<DataMetadataTableEntity> { public interface MetadataTableDao extends BaseDao<MetadataTableEntity> {
} }
package cn.datax.service.data.metadata.mapstruct; package cn.datax.service.data.metadata.mapstruct;
import cn.datax.common.mapstruct.EntityMapper; import cn.datax.common.mapstruct.EntityMapper;
import cn.datax.service.data.metadata.api.dto.DataMetadataColumnDto; import cn.datax.service.data.metadata.api.dto.MetadataColumnDto;
import cn.datax.service.data.metadata.api.entity.DataMetadataColumnEntity; import cn.datax.service.data.metadata.api.entity.MetadataColumnEntity;
import cn.datax.service.data.metadata.api.vo.DataMetadataColumnVo; import cn.datax.service.data.metadata.api.vo.MetadataColumnVo;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
/** /**
...@@ -15,6 +15,6 @@ import org.mapstruct.Mapper; ...@@ -15,6 +15,6 @@ import org.mapstruct.Mapper;
* @since 2020-07-29 * @since 2020-07-29
*/ */
@Mapper(componentModel = "spring") @Mapper(componentModel = "spring")
public interface DataMetadataColumnMapper extends EntityMapper<DataMetadataColumnDto, DataMetadataColumnEntity, DataMetadataColumnVo> { public interface MetadataColumnMapper extends EntityMapper<MetadataColumnDto, MetadataColumnEntity, MetadataColumnVo> {
} }
package cn.datax.service.data.factory.mapstruct; package cn.datax.service.data.metadata.mapstruct;
import cn.datax.common.mapstruct.EntityMapper; import cn.datax.common.mapstruct.EntityMapper;
import cn.datax.service.data.factory.api.dto.DataSourceDto; import cn.datax.service.data.metadata.api.dto.MetadataSourceDto;
import cn.datax.service.data.factory.api.entity.DataSourceEntity; import cn.datax.service.data.metadata.api.entity.MetadataSourceEntity;
import cn.datax.service.data.factory.api.vo.DataSourceVo; import cn.datax.service.data.metadata.api.vo.MetadataSourceVo;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
/** /**
...@@ -15,6 +15,6 @@ import org.mapstruct.Mapper; ...@@ -15,6 +15,6 @@ import org.mapstruct.Mapper;
* @since 2020-03-14 * @since 2020-03-14
*/ */
@Mapper(componentModel = "spring") @Mapper(componentModel = "spring")
public interface DataSourceMapper extends EntityMapper<DataSourceDto, DataSourceEntity, DataSourceVo> { public interface MetadataSourceMapper extends EntityMapper<MetadataSourceDto, MetadataSourceEntity, MetadataSourceVo> {
} }
package cn.datax.service.data.metadata.mapstruct; package cn.datax.service.data.metadata.mapstruct;
import cn.datax.common.mapstruct.EntityMapper; import cn.datax.common.mapstruct.EntityMapper;
import cn.datax.service.data.metadata.api.dto.DataMetadataTableDto; import cn.datax.service.data.metadata.api.dto.MetadataTableDto;
import cn.datax.service.data.metadata.api.entity.DataMetadataTableEntity; import cn.datax.service.data.metadata.api.entity.MetadataTableEntity;
import cn.datax.service.data.metadata.api.vo.DataMetadataTableVo; import cn.datax.service.data.metadata.api.vo.MetadataTableVo;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
/** /**
...@@ -15,6 +15,6 @@ import org.mapstruct.Mapper; ...@@ -15,6 +15,6 @@ import org.mapstruct.Mapper;
* @since 2020-07-29 * @since 2020-07-29
*/ */
@Mapper(componentModel = "spring") @Mapper(componentModel = "spring")
public interface DataMetadataTableMapper extends EntityMapper<DataMetadataTableDto, DataMetadataTableEntity, DataMetadataTableVo> { public interface MetadataTableMapper extends EntityMapper<MetadataTableDto, MetadataTableEntity, MetadataTableVo> {
} }
package cn.datax.service.data.metadata.service;
import com.aspose.words.Document;
public interface DataMetadataService {
void syncMetadata(String id);
Document wordMetadata(String id) throws Exception;
}
package cn.datax.service.data.metadata.service; package cn.datax.service.data.metadata.service;
import cn.datax.service.data.metadata.api.entity.DataMetadataColumnEntity; import cn.datax.service.data.metadata.api.dto.MetadataColumnDto;
import cn.datax.service.data.metadata.api.dto.DataMetadataColumnDto;
import cn.datax.common.base.BaseService; import cn.datax.common.base.BaseService;
import cn.datax.service.data.metadata.api.entity.MetadataColumnEntity;
import java.util.List; import java.util.List;
...@@ -14,15 +14,15 @@ import java.util.List; ...@@ -14,15 +14,15 @@ import java.util.List;
* @author yuwei * @author yuwei
* @since 2020-07-29 * @since 2020-07-29
*/ */
public interface DataMetadataColumnService extends BaseService<DataMetadataColumnEntity> { public interface MetadataColumnService extends BaseService<MetadataColumnEntity> {
DataMetadataColumnEntity saveDataMetadataColumn(DataMetadataColumnDto dataMetadataColumn); MetadataColumnEntity saveMetadataColumn(MetadataColumnDto metadataColumn);
DataMetadataColumnEntity updateDataMetadataColumn(DataMetadataColumnDto dataMetadataColumn); MetadataColumnEntity updateMetadataColumn(MetadataColumnDto metadataColumn);
DataMetadataColumnEntity getDataMetadataColumnById(String id); MetadataColumnEntity getMetadataColumnById(String id);
void deleteDataMetadataColumnById(String id); void deleteMetadataColumnById(String id);
void deleteDataMetadataColumnBatch(List<String> ids); void deleteMetadataColumnBatch(List<String> ids);
} }
package cn.datax.service.data.factory.service; package cn.datax.service.data.metadata.service;
import cn.datax.common.base.BaseService;
import cn.datax.common.database.DbQuery; import cn.datax.common.database.DbQuery;
import cn.datax.common.database.core.DbColumn; import cn.datax.common.database.core.DbColumn;
import cn.datax.common.database.core.DbTable; import cn.datax.common.database.core.DbTable;
import cn.datax.service.data.factory.api.dto.DataSourceDto; import cn.datax.service.data.metadata.api.dto.MetadataSourceDto;
import cn.datax.service.data.factory.api.entity.DataSourceEntity; import cn.datax.service.data.metadata.api.entity.MetadataSourceEntity;
import cn.datax.common.base.BaseService; import com.aspose.words.Document;
import java.util.List; import java.util.List;
...@@ -17,19 +18,19 @@ import java.util.List; ...@@ -17,19 +18,19 @@ import java.util.List;
* @author yuwei * @author yuwei
* @since 2020-03-14 * @since 2020-03-14
*/ */
public interface DataSourceService extends BaseService<DataSourceEntity> { public interface MetadataSourceService extends BaseService<MetadataSourceEntity> {
void saveDataSource(DataSourceDto dataSource); void saveMetadataSource(MetadataSourceDto metadataSourceDto);
void updateDataSource(DataSourceDto dataSource); void updateMetadataSource(MetadataSourceDto metadataSourceDto);
DataSourceEntity getDataSourceById(String id); MetadataSourceEntity getMetadataSourceById(String id);
void deleteDataSourceById(String id); void deleteMetadataSourceById(String id);
void deleteDataSourceBatch(List<String> ids); void deleteMetadataSourceBatch(List<String> ids);
DbQuery checkConnection(DataSourceDto dataSource); DbQuery checkConnection(MetadataSourceDto metadataSourceDto);
DbQuery getDbQuery(String id); DbQuery getDbQuery(String id);
...@@ -37,5 +38,7 @@ public interface DataSourceService extends BaseService<DataSourceEntity> { ...@@ -37,5 +38,7 @@ public interface DataSourceService extends BaseService<DataSourceEntity> {
List<DbColumn> getDbTableColumns(String id, String tableName); List<DbColumn> getDbTableColumns(String id, String tableName);
void updateDataSourceSyncById(String id); void syncMetadata(String id);
Document wordMetadata(String id) throws Exception;
} }
package cn.datax.service.data.metadata.service; package cn.datax.service.data.metadata.service;
import cn.datax.service.data.metadata.api.entity.DataMetadataTableEntity; import cn.datax.service.data.metadata.api.entity.MetadataTableEntity;
import cn.datax.service.data.metadata.api.dto.DataMetadataTableDto; import cn.datax.service.data.metadata.api.dto.MetadataTableDto;
import cn.datax.common.base.BaseService; import cn.datax.common.base.BaseService;
import java.util.List; import java.util.List;
...@@ -14,15 +14,15 @@ import java.util.List; ...@@ -14,15 +14,15 @@ import java.util.List;
* @author yuwei * @author yuwei
* @since 2020-07-29 * @since 2020-07-29
*/ */
public interface DataMetadataTableService extends BaseService<DataMetadataTableEntity> { public interface MetadataTableService extends BaseService<MetadataTableEntity> {
DataMetadataTableEntity saveDataMetadataTable(DataMetadataTableDto dataMetadataTable); MetadataTableEntity saveMetadataTable(MetadataTableDto metadataTable);
DataMetadataTableEntity updateDataMetadataTable(DataMetadataTableDto dataMetadataTable); MetadataTableEntity updateMetadataTable(MetadataTableDto metadataTable);
DataMetadataTableEntity getDataMetadataTableById(String id); MetadataTableEntity getMetadataTableById(String id);
void deleteDataMetadataTableById(String id); void deleteMetadataTableById(String id);
void deleteDataMetadataTableBatch(List<String> ids); void deleteMetadataTableBatch(List<String> ids);
} }
package cn.datax.service.data.metadata.service.impl;
import cn.datax.commo.office.word.WordUtil;
import cn.datax.common.core.DataConstant;
import cn.datax.common.exception.DataException;
import cn.datax.service.data.factory.api.dto.DbSchema;
import cn.datax.service.data.factory.api.entity.DataSourceEntity;
import cn.datax.service.data.factory.api.feign.DataSourceServiceFeign;
import cn.datax.service.data.metadata.api.entity.DataMetadataColumnEntity;
import cn.datax.service.data.metadata.api.entity.DataMetadataTableEntity;
import cn.datax.service.data.metadata.async.AsyncTask;
import cn.datax.service.data.metadata.dao.DataMetadataColumnDao;
import cn.datax.service.data.metadata.dao.DataMetadataTableDao;
import cn.datax.service.data.metadata.service.DataMetadataService;
import cn.hutool.core.util.StrUtil;
import com.aspose.words.Document;
import com.aspose.words.MailMerge;
import com.aspose.words.net.System.Data.DataRelation;
import com.aspose.words.net.System.Data.DataRow;
import com.aspose.words.net.System.Data.DataSet;
import com.aspose.words.net.System.Data.DataTable;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;
import java.io.InputStream;
import java.util.List;
@Slf4j
@Service
public class DataMetadataServiceImpl implements DataMetadataService {
@Autowired
private DataSourceServiceFeign dataSourceServiceFeign;
@Autowired
private AsyncTask asyncTask;
@Autowired
private DataMetadataTableDao dataMetadataTableDao;
@Autowired
private DataMetadataColumnDao dataMetadataColumnDao;
@Override
public void syncMetadata(String id) {
DataSourceEntity dataSourceEntity = dataSourceServiceFeign.getDataSourceById(id);
if (dataSourceServiceFeign == null) {
throw new DataException("未找到数据源");
}
if (Integer.valueOf(DataConstant.TrueOrFalse.TRUE.getKey()).equals(dataSourceEntity.getSourceSync())) {
throw new DataException("元数据已同步");
}
// 异步执行同步任务
asyncTask.doTask(dataSourceEntity);
}
@Override
public Document wordMetadata(String id) throws Exception {
DataSourceEntity dataSourceEntity = dataSourceServiceFeign.getDataSourceById(id);
if (dataSourceServiceFeign == null) {
throw new DataException("未找到数据源");
}
DbSchema dbSchema = dataSourceEntity.getDbSchema();
String dbName = dbSchema.getDbName();
if (StrUtil.isBlank(dbName)) {
dbName = dbSchema.getUsername();
}
QueryWrapper<DataMetadataTableEntity> tableQueryWrapper = new QueryWrapper<>();
tableQueryWrapper.eq("source_id", id);
List<DataMetadataTableEntity> tableEntityList = dataMetadataTableDao.selectList(tableQueryWrapper);
// 数据表(主表) TableStart:TableList TableEnd:TableList
DataTable tableTable = new DataTable("TableList");
tableTable.getColumns().add("id");
tableTable.getColumns().add("tableName");
tableTable.getColumns().add("tableComment");
for (int i = 0; i < tableEntityList.size(); i++) {
DataRow row = tableTable.newRow();
DataMetadataTableEntity table = tableEntityList.get(i);
row.set(0, table.getId());
row.set(1, table.getTableName());
row.set(2, table.getTableComment());
tableTable.getRows().add(row);
}
QueryWrapper<DataMetadataColumnEntity> columnQueryWrapper = new QueryWrapper<>();
columnQueryWrapper.eq("source_id", id);
columnQueryWrapper.orderByAsc("column_position");
List<DataMetadataColumnEntity> columnEntityList = dataMetadataColumnDao.selectList(columnQueryWrapper);
// 元数据(子表) TableStart:ColumnList TableEnd:ColumnList
DataTable columnTable = new DataTable("ColumnList");
columnTable.getColumns().add("id");
columnTable.getColumns().add("tid");
columnTable.getColumns().add("columnPosition");
columnTable.getColumns().add("columnName");
columnTable.getColumns().add("dataType");
columnTable.getColumns().add("dataLength");
columnTable.getColumns().add("dataPrecision");
columnTable.getColumns().add("dataScale");
columnTable.getColumns().add("columnNullable");
columnTable.getColumns().add("columnKey");
columnTable.getColumns().add("dataDefault");
columnTable.getColumns().add("columnComment");
for (int i = 0; i < columnEntityList.size(); i++) {
DataRow row = columnTable.newRow();
DataMetadataColumnEntity column = columnEntityList.get(i);
row.set(0, column.getId());
row.set(1, column.getTableId());
row.set(2, column.getColumnPosition());
row.set(3, column.getColumnName());
row.set(4, column.getDataType());
row.set(5, column.getDataLength());
row.set(6, column.getDataPrecision());
row.set(7, column.getDataScale());
row.set(8, "1".equals(column.getColumnNullable()) ? "Y" : "N");
row.set(9, "1".equals(column.getColumnKey()) ? "Y" : "N");
row.set(10, column.getDataDefault());
row.set(11, column.getColumnComment());
columnTable.getRows().add(row);
}
// 提供数据源
DataSet dataSet = new DataSet();
dataSet.getTables().add(tableTable);
dataSet.getTables().add(columnTable);
DataRelation dataRelation = new DataRelation("TableColumnRelation", tableTable.getColumns().get("id"), columnTable.getColumns().get("tid"));
dataSet.getRelations().add(dataRelation);
// 合并模版
ClassPathResource classPathResource = new ClassPathResource("templates/metadata_1.0.0.doc");
InputStream inputStream =classPathResource.getInputStream();
Document doc = WordUtil.getInstance().getDocument(inputStream);
// 提供数据源
String[] fieldNames = new String[] {"database"};
Object[] fieldValues = new Object[] {dbName.toUpperCase()};
MailMerge mailMerge = doc.getMailMerge();
mailMerge.execute(fieldNames, fieldValues);
mailMerge.executeWithRegions(dataSet);
return doc;
}
}
package cn.datax.service.data.metadata.service.impl; package cn.datax.service.data.metadata.service.impl;
import cn.datax.service.data.metadata.api.entity.DataMetadataColumnEntity; import cn.datax.service.data.metadata.api.dto.MetadataColumnDto;
import cn.datax.service.data.metadata.api.dto.DataMetadataColumnDto; import cn.datax.service.data.metadata.api.entity.MetadataColumnEntity;
import cn.datax.service.data.metadata.service.DataMetadataColumnService; import cn.datax.service.data.metadata.service.MetadataColumnService;
import cn.datax.service.data.metadata.mapstruct.DataMetadataColumnMapper; import cn.datax.service.data.metadata.mapstruct.MetadataColumnMapper;
import cn.datax.service.data.metadata.dao.DataMetadataColumnDao; import cn.datax.service.data.metadata.dao.MetadataColumnDao;
import cn.datax.common.base.BaseServiceImpl; import cn.datax.common.base.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -23,45 +23,45 @@ import java.util.List; ...@@ -23,45 +23,45 @@ import java.util.List;
*/ */
@Service @Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class) @Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class DataMetadataColumnServiceImpl extends BaseServiceImpl<DataMetadataColumnDao, DataMetadataColumnEntity> implements DataMetadataColumnService { public class MetadataColumnServiceImpl extends BaseServiceImpl<MetadataColumnDao, MetadataColumnEntity> implements MetadataColumnService {
@Autowired @Autowired
private DataMetadataColumnDao dataMetadataColumnDao; private MetadataColumnDao metadataColumnDao;
@Autowired @Autowired
private DataMetadataColumnMapper dataMetadataColumnMapper; private MetadataColumnMapper metadataColumnMapper;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public DataMetadataColumnEntity saveDataMetadataColumn(DataMetadataColumnDto dataMetadataColumnDto) { public MetadataColumnEntity saveMetadataColumn(MetadataColumnDto metadataColumnDto) {
DataMetadataColumnEntity dataMetadataColumn = dataMetadataColumnMapper.toEntity(dataMetadataColumnDto); MetadataColumnEntity metadataColumn = metadataColumnMapper.toEntity(metadataColumnDto);
dataMetadataColumnDao.insert(dataMetadataColumn); metadataColumnDao.insert(metadataColumn);
return dataMetadataColumn; return metadataColumn;
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public DataMetadataColumnEntity updateDataMetadataColumn(DataMetadataColumnDto dataMetadataColumnDto) { public MetadataColumnEntity updateMetadataColumn(MetadataColumnDto metadataColumnDto) {
DataMetadataColumnEntity dataMetadataColumn = dataMetadataColumnMapper.toEntity(dataMetadataColumnDto); MetadataColumnEntity metadataColumn = metadataColumnMapper.toEntity(metadataColumnDto);
dataMetadataColumnDao.updateById(dataMetadataColumn); metadataColumnDao.updateById(metadataColumn);
return dataMetadataColumn; return metadataColumn;
} }
@Override @Override
public DataMetadataColumnEntity getDataMetadataColumnById(String id) { public MetadataColumnEntity getMetadataColumnById(String id) {
DataMetadataColumnEntity dataMetadataColumnEntity = super.getById(id); MetadataColumnEntity metadataColumnEntity = super.getById(id);
return dataMetadataColumnEntity; return metadataColumnEntity;
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteDataMetadataColumnById(String id) { public void deleteMetadataColumnById(String id) {
dataMetadataColumnDao.deleteById(id); metadataColumnDao.deleteById(id);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteDataMetadataColumnBatch(List<String> ids) { public void deleteMetadataColumnBatch(List<String> ids) {
dataMetadataColumnDao.deleteBatchIds(ids); metadataColumnDao.deleteBatchIds(ids);
} }
} }
package cn.datax.service.data.metadata.service.impl;
import cn.datax.commo.office.word.WordUtil;
import cn.datax.common.base.BaseServiceImpl;
import cn.datax.common.core.DataConstant;
import cn.datax.common.database.DataSourceFactory;
import cn.datax.common.database.DbQuery;
import cn.datax.common.database.constants.DbQueryProperty;
import cn.datax.common.database.core.DbColumn;
import cn.datax.common.database.core.DbTable;
import cn.datax.common.exception.DataException;
import cn.datax.service.data.metadata.api.dto.DbSchema;
import cn.datax.service.data.metadata.api.dto.MetadataSourceDto;
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.async.AsyncTask;
import cn.datax.service.data.metadata.dao.MetadataColumnDao;
import cn.datax.service.data.metadata.dao.MetadataSourceDao;
import cn.datax.service.data.metadata.dao.MetadataTableDao;
import cn.datax.service.data.metadata.mapstruct.MetadataSourceMapper;
import cn.datax.service.data.metadata.service.MetadataSourceService;
import cn.hutool.core.util.StrUtil;
import com.aspose.words.Document;
import com.aspose.words.MailMerge;
import com.aspose.words.net.System.Data.DataRelation;
import com.aspose.words.net.System.Data.DataRow;
import com.aspose.words.net.System.Data.DataSet;
import com.aspose.words.net.System.Data.DataTable;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.io.InputStream;
import java.util.List;
/**
* <p>
* 数据源信息表 服务实现类
* </p>
*
* @author yuwei
* @since 2020-03-14
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class MetadataSourceServiceImpl extends BaseServiceImpl<MetadataSourceDao, MetadataSourceEntity> implements MetadataSourceService {
@Autowired
private MetadataSourceDao metadataSourceDao;
@Autowired
private MetadataSourceMapper metadataSourceMapper;
@Autowired
private DataSourceFactory dataSourceFactory;
@Autowired
private AsyncTask asyncTask;
@Autowired
private MetadataTableDao metadataTableDao;
@Autowired
private MetadataColumnDao metadataColumnDao;
@Override
@Transactional(rollbackFor = Exception.class)
public void saveMetadataSource(MetadataSourceDto metadataSourceDto) {
MetadataSourceEntity dataSource = metadataSourceMapper.toEntity(metadataSourceDto);
dataSource.setSourceSync(Integer.valueOf(DataConstant.TrueOrFalse.FALSE.getKey()));
metadataSourceDao.insert(dataSource);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateMetadataSource(MetadataSourceDto metadataSourceDto) {
MetadataSourceEntity dataSource = metadataSourceMapper.toEntity(metadataSourceDto);
metadataSourceDao.updateById(dataSource);
}
@Override
public MetadataSourceEntity getMetadataSourceById(String id) {
MetadataSourceEntity metadataSourceEntity = super.getById(id);
return metadataSourceEntity;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteMetadataSourceById(String id) {
metadataSourceDao.deleteById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteMetadataSourceBatch(List<String> ids) {
metadataSourceDao.deleteBatchIds(ids);
}
@Override
public DbQuery checkConnection(MetadataSourceDto metadataSourceDto) {
MetadataSourceEntity dataSource = metadataSourceMapper.toEntity(metadataSourceDto);
DbSchema dbSchema = dataSource.getDbSchema();
DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(),
dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName(), dbSchema.getSid());
DbQuery dbQuery = dataSourceFactory.createDbQuery(dbQueryProperty);
return dbQuery;
}
@Override
public DbQuery getDbQuery(String id) {
MetadataSourceEntity dataSource = super.getById(id);
DbSchema dbSchema = dataSource.getDbSchema();
DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(),
dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName(), dbSchema.getSid());
DbQuery dbQuery = dataSourceFactory.createDbQuery(dbQueryProperty);
return dbQuery;
}
@Override
public List<DbTable> getDbTables(String id) {
MetadataSourceEntity dataSource = super.getById(id);
DbSchema dbSchema = dataSource.getDbSchema();
DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(),
dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName(), dbSchema.getSid());
DbQuery dbQuery = dataSourceFactory.createDbQuery(dbQueryProperty);
List<DbTable> tables = dbQuery.getTables(dbSchema.getDbName());
return tables;
}
@Override
public List<DbColumn> getDbTableColumns(String id, String tableName) {
MetadataSourceEntity dataSource = super.getById(id);
DbSchema dbSchema = dataSource.getDbSchema();
DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(),
dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName(), dbSchema.getSid());
DbQuery dbQuery = dataSourceFactory.createDbQuery(dbQueryProperty);
List<DbColumn> columns = dbQuery.getTableColumns(dbSchema.getDbName(), tableName);
return columns;
}
@Override
public void syncMetadata(String id) {
MetadataSourceEntity metadataSourceEntity = super.getById(id);
if (Integer.valueOf(DataConstant.TrueOrFalse.TRUE.getKey()).equals(metadataSourceEntity.getSourceSync())) {
throw new DataException("元数据已同步");
}
// 异步执行同步任务
asyncTask.doTask(metadataSourceEntity);
}
@Override
public Document wordMetadata(String id) throws Exception {
MetadataSourceEntity metadataSourceEntity = super.getById(id);
DbSchema dbSchema = metadataSourceEntity.getDbSchema();
String dbName = dbSchema.getDbName();
if (StrUtil.isBlank(dbName)) {
dbName = dbSchema.getUsername();
}
QueryWrapper<MetadataTableEntity> tableQueryWrapper = new QueryWrapper<>();
tableQueryWrapper.eq("source_id", id);
List<MetadataTableEntity> tableEntityList = metadataTableDao.selectList(tableQueryWrapper);
// 数据表(主表) TableStart:TableList TableEnd:TableList
DataTable tableTable = new DataTable("TableList");
tableTable.getColumns().add("id");
tableTable.getColumns().add("tableName");
tableTable.getColumns().add("tableComment");
for (int i = 0; i < tableEntityList.size(); i++) {
DataRow row = tableTable.newRow();
MetadataTableEntity table = tableEntityList.get(i);
row.set(0, table.getId());
row.set(1, table.getTableName());
row.set(2, table.getTableComment());
tableTable.getRows().add(row);
}
QueryWrapper<MetadataColumnEntity> columnQueryWrapper = new QueryWrapper<>();
columnQueryWrapper.eq("source_id", id);
columnQueryWrapper.orderByAsc("column_position");
List<MetadataColumnEntity> columnEntityList = metadataColumnDao.selectList(columnQueryWrapper);
// 元数据(子表) TableStart:ColumnList TableEnd:ColumnList
DataTable columnTable = new DataTable("ColumnList");
columnTable.getColumns().add("id");
columnTable.getColumns().add("tid");
columnTable.getColumns().add("columnPosition");
columnTable.getColumns().add("columnName");
columnTable.getColumns().add("dataType");
columnTable.getColumns().add("dataLength");
columnTable.getColumns().add("dataPrecision");
columnTable.getColumns().add("dataScale");
columnTable.getColumns().add("columnNullable");
columnTable.getColumns().add("columnKey");
columnTable.getColumns().add("dataDefault");
columnTable.getColumns().add("columnComment");
for (int i = 0; i < columnEntityList.size(); i++) {
DataRow row = columnTable.newRow();
MetadataColumnEntity column = columnEntityList.get(i);
row.set(0, column.getId());
row.set(1, column.getTableId());
row.set(2, column.getColumnPosition());
row.set(3, column.getColumnName());
row.set(4, column.getDataType());
row.set(5, column.getDataLength());
row.set(6, column.getDataPrecision());
row.set(7, column.getDataScale());
row.set(8, "1".equals(column.getColumnNullable()) ? "Y" : "N");
row.set(9, "1".equals(column.getColumnKey()) ? "Y" : "N");
row.set(10, column.getDataDefault());
row.set(11, column.getColumnComment());
columnTable.getRows().add(row);
}
// 提供数据源
DataSet dataSet = new DataSet();
dataSet.getTables().add(tableTable);
dataSet.getTables().add(columnTable);
DataRelation dataRelation = new DataRelation("TableColumnRelation", tableTable.getColumns().get("id"), columnTable.getColumns().get("tid"));
dataSet.getRelations().add(dataRelation);
// 合并模版
ClassPathResource classPathResource = new ClassPathResource("templates/metadata_1.0.0.doc");
InputStream inputStream =classPathResource.getInputStream();
Document doc = WordUtil.getInstance().getDocument(inputStream);
// 提供数据源
String[] fieldNames = new String[] {"database"};
Object[] fieldValues = new Object[] {dbName.toUpperCase()};
MailMerge mailMerge = doc.getMailMerge();
mailMerge.execute(fieldNames, fieldValues);
mailMerge.executeWithRegions(dataSet);
return doc;
}
}
package cn.datax.service.data.metadata.service.impl; package cn.datax.service.data.metadata.service.impl;
import cn.datax.service.data.metadata.api.entity.DataMetadataTableEntity; import cn.datax.service.data.metadata.api.entity.MetadataTableEntity;
import cn.datax.service.data.metadata.api.dto.DataMetadataTableDto; import cn.datax.service.data.metadata.api.dto.MetadataTableDto;
import cn.datax.service.data.metadata.service.DataMetadataTableService; import cn.datax.service.data.metadata.service.MetadataTableService;
import cn.datax.service.data.metadata.mapstruct.DataMetadataTableMapper; import cn.datax.service.data.metadata.mapstruct.MetadataTableMapper;
import cn.datax.service.data.metadata.dao.DataMetadataTableDao; import cn.datax.service.data.metadata.dao.MetadataTableDao;
import cn.datax.common.base.BaseServiceImpl; import cn.datax.common.base.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -23,45 +23,45 @@ import java.util.List; ...@@ -23,45 +23,45 @@ import java.util.List;
*/ */
@Service @Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class) @Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class DataMetadataTableServiceImpl extends BaseServiceImpl<DataMetadataTableDao, DataMetadataTableEntity> implements DataMetadataTableService { public class MetadataTableServiceImpl extends BaseServiceImpl<MetadataTableDao, MetadataTableEntity> implements MetadataTableService {
@Autowired @Autowired
private DataMetadataTableDao dataMetadataTableDao; private MetadataTableDao metadataTableDao;
@Autowired @Autowired
private DataMetadataTableMapper dataMetadataTableMapper; private MetadataTableMapper metadataTableMapper;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public DataMetadataTableEntity saveDataMetadataTable(DataMetadataTableDto dataMetadataTableDto) { public MetadataTableEntity saveMetadataTable(MetadataTableDto metadataTableDto) {
DataMetadataTableEntity dataMetadataTable = dataMetadataTableMapper.toEntity(dataMetadataTableDto); MetadataTableEntity metadataTableEntity = metadataTableMapper.toEntity(metadataTableDto);
dataMetadataTableDao.insert(dataMetadataTable); metadataTableDao.insert(metadataTableEntity);
return dataMetadataTable; return metadataTableEntity;
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public DataMetadataTableEntity updateDataMetadataTable(DataMetadataTableDto dataMetadataTableDto) { public MetadataTableEntity updateMetadataTable(MetadataTableDto metadataTableDto) {
DataMetadataTableEntity dataMetadataTable = dataMetadataTableMapper.toEntity(dataMetadataTableDto); MetadataTableEntity metadataTableEntity = metadataTableMapper.toEntity(metadataTableDto);
dataMetadataTableDao.updateById(dataMetadataTable); metadataTableDao.updateById(metadataTableEntity);
return dataMetadataTable; return metadataTableEntity;
} }
@Override @Override
public DataMetadataTableEntity getDataMetadataTableById(String id) { public MetadataTableEntity getMetadataTableById(String id) {
DataMetadataTableEntity dataMetadataTableEntity = super.getById(id); MetadataTableEntity metadataTableEntity = super.getById(id);
return dataMetadataTableEntity; return metadataTableEntity;
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteDataMetadataTableById(String id) { public void deleteMetadataTableById(String id) {
dataMetadataTableDao.deleteById(id); metadataTableDao.deleteById(id);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteDataMetadataTableBatch(List<String> ids) { public void deleteMetadataTableBatch(List<String> ids) {
dataMetadataTableDao.deleteBatchIds(ids); metadataTableDao.deleteBatchIds(ids);
} }
} }
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.datax.service.data.metadata.dao.DataMetadataColumnDao"> <mapper namespace="cn.datax.service.data.metadata.dao.MetadataColumnDao">
<!-- 通用查询映射结果 --> <!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.datax.service.data.metadata.api.entity.DataMetadataColumnEntity"> <resultMap id="BaseResultMap" type="cn.datax.service.data.metadata.api.entity.MetadataColumnEntity">
<result column="id" property="id" /> <result column="id" property="id" />
<result column="source_id" property="sourceId" /> <result column="source_id" property="sourceId" />
<result column="table_id" property="tableId" /> <result column="table_id" property="tableId" />
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.datax.service.data.factory.dao.DataSourceDao"> <mapper namespace="cn.datax.service.data.metadata.dao.MetadataSourceDao">
<!-- 通用查询映射结果 --> <!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.datax.service.data.factory.api.entity.DataSourceEntity"> <resultMap id="BaseResultMap" type="cn.datax.service.data.metadata.api.entity.MetadataSourceEntity">
<result column="id" property="id" /> <result column="id" property="id" />
<result column="status" property="status" /> <result column="status" property="status" />
<result column="create_by" property="createBy" /> <result column="create_by" property="createBy" />
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
<result column="remark" property="remark" /> <result column="remark" property="remark" />
<result column="db_type" property="dbType" /> <result column="db_type" property="dbType" />
<result column="source_name" property="sourceName" /> <result column="source_name" property="sourceName" />
<result column="theme_id" property="themeId" />
<result column="source_sync" property="sourceSync" /> <result column="source_sync" property="sourceSync" />
<result column="db_schema" property="dbSchema" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" /> <result column="db_schema" property="dbSchema" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
</resultMap> </resultMap>
...@@ -29,7 +28,7 @@ ...@@ -29,7 +28,7 @@
update_by, update_by,
update_time, update_time,
remark, remark,
db_type, source_name, theme_id, source_sync, db_schema db_type, source_name, source_sync, db_schema
</sql> </sql>
</mapper> </mapper>
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.datax.service.data.metadata.dao.DataMetadataTableDao"> <mapper namespace="cn.datax.service.data.metadata.dao.MetadataTableDao">
<!-- 通用查询映射结果 --> <!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.datax.service.data.metadata.api.entity.DataMetadataTableEntity"> <resultMap id="BaseResultMap" type="cn.datax.service.data.metadata.api.entity.MetadataTableEntity">
<result column="id" property="id" /> <result column="id" property="id" />
<result column="source_id" property="sourceId" /> <result column="source_id" property="sourceId" />
<result column="table_name" property="tableName" /> <result column="table_name" property="tableName" />
......
...@@ -16,5 +16,6 @@ ...@@ -16,5 +16,6 @@
<modules> <modules>
<module>data-metadata-service</module> <module>data-metadata-service</module>
<module>data-metadata-service-api</module> <module>data-metadata-service-api</module>
<module>data-metadata-service-console</module>
</modules> </modules>
</project> </project>
\ No newline at end of file
...@@ -3,13 +3,13 @@ ...@@ -3,13 +3,13 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<artifactId>data-factory-service-parent</artifactId> <artifactId>data-visual-service-parent</artifactId>
<groupId>cn.datax</groupId> <groupId>cn.datax</groupId>
<version>2.0.0</version> <version>2.0.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<version>2.0.0</version> <version>2.0.0</version>
<artifactId>data-factory-service-api</artifactId> <artifactId>data-visual-service-api</artifactId>
<dependencies> <dependencies>
<dependency> <dependency>
......
package cn.datax.service.data.factory.api.dto; package cn.datax.service.data.visual.api.dto;
import cn.datax.common.validate.ValidationGroups; import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
......
package cn.datax.service.data.factory.api.dto; package cn.datax.service.data.visual.api.dto;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
......
package cn.datax.service.data.factory.api.dto; package cn.datax.service.data.visual.api.dto;
import cn.datax.common.validate.ValidationGroups; import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
...@@ -9,17 +9,18 @@ import javax.validation.Valid; ...@@ -9,17 +9,18 @@ import javax.validation.Valid;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.io.Serializable; import java.io.Serializable;
/** /**
* <p> * <p>
* 数据集信息表 实体DTO * 数据集信息表 实体DTO
* </p> * </p>
* *
* @author yuwei * @author yuwei
* @since 2020-03-20 * @since 2020-07-31
*/ */
@ApiModel(value = "数据集信息表Model") @ApiModel(value = "数据集信息表Model")
@Data @Data
public class DataSetDto implements Serializable { public class VisualDataSetDto implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
......
package cn.datax.service.data.factory.api.entity; package cn.datax.service.data.visual.api.entity;
import cn.datax.common.base.DataScopeBaseEntity; import cn.datax.common.base.DataScopeBaseEntity;
import cn.datax.service.data.factory.api.dto.SchemaConfig; import cn.datax.service.data.visual.api.dto.SchemaConfig;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import cn.datax.common.base.BaseEntity;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
...@@ -15,13 +18,13 @@ import lombok.experimental.Accessors; ...@@ -15,13 +18,13 @@ import lombok.experimental.Accessors;
* </p> * </p>
* *
* @author yuwei * @author yuwei
* @since 2020-03-20 * @since 2020-07-31
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Accessors(chain = true) @Accessors(chain = true)
@TableName(value = "factory_set", autoResultMap = true) @TableName(value = "visual_data_set", autoResultMap = true)
public class DataSetEntity extends DataScopeBaseEntity { public class VisualDataSetEntity extends DataScopeBaseEntity {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
......
package cn.datax.service.data.factory.api.query; package cn.datax.service.data.visual.api.query;
import cn.datax.common.base.BaseQueryParams; import cn.datax.common.base.BaseQueryParams;
import lombok.Data; import lombok.Data;
...@@ -10,11 +10,11 @@ import lombok.EqualsAndHashCode; ...@@ -10,11 +10,11 @@ import lombok.EqualsAndHashCode;
* </p> * </p>
* *
* @author yuwei * @author yuwei
* @since 2020-03-20 * @since 2020-07-31
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class DataSetQuery extends BaseQueryParams { public class VisualDataSetQuery extends BaseQueryParams {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
......
package cn.datax.service.data.factory.api.vo; package cn.datax.service.data.visual.api.vo;
import cn.datax.service.data.factory.api.dto.SchemaConfig; import cn.datax.service.data.visual.api.dto.SchemaConfig;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data; import lombok.Data;
...@@ -13,10 +13,10 @@ import java.time.LocalDateTime; ...@@ -13,10 +13,10 @@ import java.time.LocalDateTime;
* </p> * </p>
* *
* @author yuwei * @author yuwei
* @since 2020-03-20 * @since 2020-07-31
*/ */
@Data @Data
public class DataSetVo implements Serializable { public class VisualDataSetVo implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
......
...@@ -3,14 +3,13 @@ ...@@ -3,14 +3,13 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<artifactId>data-factory-service-parent</artifactId> <artifactId>data-visual-service-parent</artifactId>
<groupId>cn.datax</groupId> <groupId>cn.datax</groupId>
<version>2.0.0</version> <version>2.0.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<version>2.0.0</version> <version>2.0.0</version>
<description>SQL工作台</description> <artifactId>data-visual-service</artifactId>
<artifactId>data-factory-service-sql-console</artifactId>
<dependencies> <dependencies>
<!--web 模块--> <!--web 模块-->
...@@ -72,7 +71,12 @@ ...@@ -72,7 +71,12 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>cn.datax</groupId> <groupId>cn.datax</groupId>
<artifactId>data-factory-service-api</artifactId> <artifactId>datax-common-database</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>data-visual-service-api</artifactId>
<version>2.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
</dependencies> </dependencies>
......
package cn.datax.service.data.factory; package cn.datax.service.data.visual;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients(basePackages = {"cn.datax.service.system.api.feign", "cn.datax.service.data.factory.api.feign"}) @EnableFeignClients(basePackages = {"cn.datax.service.system.api.feign"})
@SpringCloudApplication @SpringCloudApplication
public class DataxFactoryApplication { public class DataxVisualApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(DataxFactoryApplication.class); SpringApplication.run(DataxVisualApplication.class);
} }
} }
package cn.datax.service.data.factory.config; package cn.datax.service.data.visual.config;
import cn.datax.common.security.handler.DataAccessDeniedHandler; import cn.datax.common.security.handler.DataAccessDeniedHandler;
import cn.datax.common.security.handler.DataAuthExceptionEntryPoint; import cn.datax.common.security.handler.DataAuthExceptionEntryPoint;
......
package cn.datax.service.data.factory.config; package cn.datax.service.data.visual.config;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationArguments;
......
package cn.datax.service.data.factory.config; package cn.datax.service.data.visual.config;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
......
package cn.datax.service.data.factory.config; package cn.datax.service.data.visual.config;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
......
package cn.datax.service.data.factory.controller; package cn.datax.service.data.visual.controller;
import cn.datax.common.core.DataConstant; import cn.datax.common.core.DataConstant;
import cn.datax.common.core.JsonPage; import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups; import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.data.factory.api.dto.DataThemeDto; import cn.datax.service.data.visual.api.dto.SqlParseDto;
import cn.datax.service.data.factory.api.entity.DataThemeEntity; import cn.datax.service.data.visual.api.dto.VisualDataSetDto;
import cn.datax.service.data.factory.api.vo.DataThemeVo; import cn.datax.service.data.visual.api.entity.VisualDataSetEntity;
import cn.datax.service.data.factory.api.query.DataThemeQuery; import cn.datax.service.data.visual.api.vo.VisualDataSetVo;
import cn.datax.service.data.factory.mapstruct.DataThemeMapper; import cn.datax.service.data.visual.api.query.VisualDataSetQuery;
import cn.datax.service.data.factory.service.DataThemeService; import cn.datax.service.data.visual.mapstruct.VisualDataSetMapper;
import cn.datax.service.data.visual.service.VisualDataSetService;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
...@@ -29,22 +30,22 @@ import java.util.stream.Collectors; ...@@ -29,22 +30,22 @@ import java.util.stream.Collectors;
/** /**
* <p> * <p>
* 数据主题信息表 前端控制器 * 数据信息表 前端控制器
* </p> * </p>
* *
* @author yuwei * @author yuwei
* @since 2020-07-26 * @since 2020-07-31
*/ */
@Api(tags = {"数据主题信息表"}) @Api(tags = {"数据信息表"})
@RestController @RestController
@RequestMapping("/dataThemes") @RequestMapping("/dataSets")
public class DataThemeController extends BaseController { public class VisualDataSetController extends BaseController {
@Autowired @Autowired
private DataThemeService dataThemeService; private VisualDataSetService visualDataSetService;
@Autowired @Autowired
private DataThemeMapper dataThemeMapper; private VisualDataSetMapper visualDataSetMapper;
/** /**
* 通过ID查询信息 * 通过ID查询信息
...@@ -55,68 +56,68 @@ public class DataThemeController extends BaseController { ...@@ -55,68 +56,68 @@ public class DataThemeController extends BaseController {
@ApiOperation(value = "获取详细信息", notes = "根据url的id来获取详细信息") @ApiOperation(value = "获取详细信息", notes = "根据url的id来获取详细信息")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@GetMapping("/{id}") @GetMapping("/{id}")
public R getDataThemeById(@PathVariable String id) { public R getVisualDataSetById(@PathVariable String id) {
DataThemeEntity dataThemeEntity = dataThemeService.getDataThemeById(id); VisualDataSetEntity visualDataSetEntity = visualDataSetService.getVisualDataSetById(id);
return R.ok().setData(dataThemeMapper.toVO(dataThemeEntity)); return R.ok().setData(visualDataSetMapper.toVO(visualDataSetEntity));
} }
@ApiOperation(value = "获取列表", notes = "") @ApiOperation(value = "获取列表", notes = "")
@GetMapping("/list") @GetMapping("/list")
public R getDataThemeList() { public R getVisualDataSetList() {
QueryWrapper<DataThemeEntity> queryWrapper = new QueryWrapper<>(); QueryWrapper<VisualDataSetEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", DataConstant.EnableState.ENABLE.getKey()); queryWrapper.eq("status", DataConstant.EnableState.ENABLE.getKey());
List<DataThemeEntity> list = dataThemeService.list(queryWrapper); List<VisualDataSetEntity> list = visualDataSetService.list(queryWrapper);
List<DataThemeVo> collect = list.stream().map(dataThemeMapper::toVO).collect(Collectors.toList()); List<VisualDataSetVo> collect = list.stream().map(visualDataSetMapper::toVO).collect(Collectors.toList());
return R.ok().setData(collect); return R.ok().setData(collect);
} }
/** /**
* 分页查询信息 * 分页查询信息
* *
* @param dataThemeQuery * @param visualDataSetQuery
* @return * @return
*/ */
@ApiOperation(value = "分页查询", notes = "") @ApiOperation(value = "分页查询", notes = "")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "dataThemeQuery", value = "查询实体dataThemeQuery", required = true, dataTypeClass = DataThemeQuery.class) @ApiImplicitParam(name = "visualDataSetQuery", value = "查询实体visualDataSetQuery", required = true, dataTypeClass = VisualDataSetQuery.class)
}) })
@GetMapping("/page") @GetMapping("/page")
public R getDataThemePage(DataThemeQuery dataThemeQuery) { public R getVisualDataSetPage(VisualDataSetQuery visualDataSetQuery) {
QueryWrapper<DataThemeEntity> queryWrapper = new QueryWrapper<>(); QueryWrapper<VisualDataSetEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(dataThemeQuery.getThemeName()), "theme_name", dataThemeQuery.getThemeName()); queryWrapper.like(StrUtil.isNotBlank(visualDataSetQuery.getSetName()), "set_name", visualDataSetQuery.getSetName());
IPage<DataThemeEntity> page = dataThemeService.page(new Page<>(dataThemeQuery.getPageNum(), dataThemeQuery.getPageSize()), queryWrapper); IPage<VisualDataSetEntity> page = visualDataSetService.page(new Page<>(visualDataSetQuery.getPageNum(), visualDataSetQuery.getPageSize()), queryWrapper);
List<DataThemeVo> collect = page.getRecords().stream().map(dataThemeMapper::toVO).collect(Collectors.toList()); List<VisualDataSetVo> collect = page.getRecords().stream().map(visualDataSetMapper::toVO).collect(Collectors.toList());
JsonPage<DataThemeVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect); JsonPage<VisualDataSetVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
return R.ok().setData(jsonPage); return R.ok().setData(jsonPage);
} }
/** /**
* 添加 * 添加
* @param dataTheme * @param visualDataSet
* @return * @return
*/ */
@ApiOperation(value = "添加信息", notes = "根据dataTheme对象添加信息") @ApiOperation(value = "添加信息", notes = "根据visualDataSet对象添加信息")
@ApiImplicitParam(name = "dataTheme", value = "详细实体dataTheme", required = true, dataType = "DataThemeDto") @ApiImplicitParam(name = "visualDataSet", value = "详细实体visualDataSet", required = true, dataType = "VisualDataSetDto")
@PostMapping() @PostMapping()
public R saveDataTheme(@RequestBody @Validated({ValidationGroups.Insert.class}) DataThemeDto dataTheme) { public R saveVisualDataSet(@RequestBody @Validated({ValidationGroups.Insert.class}) VisualDataSetDto visualDataSet) {
DataThemeEntity dataThemeEntity = dataThemeService.saveDataTheme(dataTheme); VisualDataSetEntity visualDataSetEntity = visualDataSetService.saveVisualDataSet(visualDataSet);
return R.ok().setData(dataThemeMapper.toVO(dataThemeEntity)); return R.ok().setData(visualDataSetMapper.toVO(visualDataSetEntity));
} }
/** /**
* 修改 * 修改
* @param dataTheme * @param visualDataSet
* @return * @return
*/ */
@ApiOperation(value = "修改信息", notes = "根据url的id来指定修改对象,并根据传过来的信息来修改详细信息") @ApiOperation(value = "修改信息", notes = "根据url的id来指定修改对象,并根据传过来的信息来修改详细信息")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path"), @ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "dataTheme", value = "详细实体dataTheme", required = true, dataType = "DataThemeDto") @ApiImplicitParam(name = "visualDataSet", value = "详细实体visualDataSet", required = true, dataType = "VisualDataSetDto")
}) })
@PutMapping("/{id}") @PutMapping("/{id}")
public R updateDataTheme(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) DataThemeDto dataTheme) { public R updateVisualDataSet(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) VisualDataSetDto visualDataSet) {
DataThemeEntity dataThemeEntity = dataThemeService.updateDataTheme(dataTheme); VisualDataSetEntity visualDataSetEntity = visualDataSetService.updateVisualDataSet(visualDataSet);
return R.ok().setData(dataThemeMapper.toVO(dataThemeEntity)); return R.ok().setData(visualDataSetMapper.toVO(visualDataSetEntity));
} }
/** /**
...@@ -127,8 +128,8 @@ public class DataThemeController extends BaseController { ...@@ -127,8 +128,8 @@ public class DataThemeController extends BaseController {
@ApiOperation(value = "删除", notes = "根据url的id来指定删除对象") @ApiOperation(value = "删除", notes = "根据url的id来指定删除对象")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
public R deleteDataThemeById(@PathVariable String id) { public R deleteVisualDataSetById(@PathVariable String id) {
dataThemeService.deleteDataThemeById(id); visualDataSetService.deleteVisualDataSetById(id);
return R.ok(); return R.ok();
} }
...@@ -140,8 +141,21 @@ public class DataThemeController extends BaseController { ...@@ -140,8 +141,21 @@ public class DataThemeController extends BaseController {
@ApiOperation(value = "批量删除角色", notes = "根据url的ids来批量删除对象") @ApiOperation(value = "批量删除角色", notes = "根据url的ids来批量删除对象")
@ApiImplicitParam(name = "ids", value = "ID集合", required = true, dataType = "List", paramType = "path") @ApiImplicitParam(name = "ids", value = "ID集合", required = true, dataType = "List", paramType = "path")
@DeleteMapping("/batch/{ids}") @DeleteMapping("/batch/{ids}")
public R deleteDataThemeBatch(@PathVariable List<String> ids) { public R deleteVisualDataSetBatch(@PathVariable List<String> ids) {
dataThemeService.deleteDataThemeBatch(ids); visualDataSetService.deleteVisualDataSetBatch(ids);
return R.ok(); return R.ok();
} }
/**
* SQL解析
* @param sqlParseDto
* @return
*/
@ApiOperation(value = "SQL解析")
@ApiImplicitParam(name = "sqlParseDto", value = "SQL解析实体sqlParseDto", required = true, dataType = "SqlParseDto")
@PostMapping("/sql/analyse")
public R sqlAnalyse(@RequestBody @Validated SqlParseDto sqlParseDto) {
List<String> list = visualDataSetService.sqlAnalyse(sqlParseDto);
return R.ok().setData(list);
}
} }
package cn.datax.service.data.factory.dao; package cn.datax.service.data.visual.dao;
import cn.datax.common.base.BaseDao; import cn.datax.common.base.BaseDao;
import cn.datax.service.data.factory.api.entity.DataSetEntity; import cn.datax.service.data.visual.api.entity.VisualDataSetEntity;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
/** /**
...@@ -10,9 +10,9 @@ import org.apache.ibatis.annotations.Mapper; ...@@ -10,9 +10,9 @@ import org.apache.ibatis.annotations.Mapper;
* </p> * </p>
* *
* @author yuwei * @author yuwei
* @since 2020-03-20 * @since 2020-07-31
*/ */
@Mapper @Mapper
public interface DataSetDao extends BaseDao<DataSetEntity> { public interface VisualDataSetDao extends BaseDao<VisualDataSetEntity> {
} }
package cn.datax.service.data.factory.mapstruct; package cn.datax.service.data.visual.mapstruct;
import cn.datax.common.mapstruct.EntityMapper; import cn.datax.common.mapstruct.EntityMapper;
import cn.datax.service.data.factory.api.dto.DataSetDto; import cn.datax.service.data.visual.api.dto.VisualDataSetDto;
import cn.datax.service.data.factory.api.entity.DataSetEntity; import cn.datax.service.data.visual.api.entity.VisualDataSetEntity;
import cn.datax.service.data.factory.api.vo.DataSetVo; import cn.datax.service.data.visual.api.vo.VisualDataSetVo;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
/** /**
...@@ -12,9 +12,9 @@ import org.mapstruct.Mapper; ...@@ -12,9 +12,9 @@ import org.mapstruct.Mapper;
* </p> * </p>
* *
* @author yuwei * @author yuwei
* @since 2020-03-20 * @since 2020-07-31
*/ */
@Mapper(componentModel = "spring") @Mapper(componentModel = "spring")
public interface DataSetMapper extends EntityMapper<DataSetDto, DataSetEntity, DataSetVo> { public interface VisualDataSetMapper extends EntityMapper<VisualDataSetDto, VisualDataSetEntity, VisualDataSetVo> {
} }
package cn.datax.service.data.factory.service; package cn.datax.service.data.visual.service;
import cn.datax.service.data.factory.api.dto.SqlParseDto; import cn.datax.service.data.visual.api.dto.SqlParseDto;
import cn.datax.service.data.factory.api.entity.DataSetEntity; import cn.datax.service.data.visual.api.entity.VisualDataSetEntity;
import cn.datax.service.data.factory.api.dto.DataSetDto; import cn.datax.service.data.visual.api.dto.VisualDataSetDto;
import cn.datax.common.base.BaseService; import cn.datax.common.base.BaseService;
import java.util.List; import java.util.List;
...@@ -13,19 +13,19 @@ import java.util.List; ...@@ -13,19 +13,19 @@ import java.util.List;
* </p> * </p>
* *
* @author yuwei * @author yuwei
* @since 2020-03-20 * @since 2020-07-31
*/ */
public interface DataSetService extends BaseService<DataSetEntity> { public interface VisualDataSetService extends BaseService<VisualDataSetEntity> {
void saveDataSet(DataSetDto dataSet); VisualDataSetEntity saveVisualDataSet(VisualDataSetDto visualDataSet);
void updateDataSet(DataSetDto dataSet); VisualDataSetEntity updateVisualDataSet(VisualDataSetDto visualDataSet);
DataSetEntity getDataSetById(String id); VisualDataSetEntity getVisualDataSetById(String id);
void deleteDataSetById(String id); void deleteVisualDataSetById(String id);
void deleteDataSetBatch(List<String> ids); void deleteVisualDataSetBatch(List<String> ids);
List<String> sqlAnalyse(SqlParseDto sqlParseDto); List<String> sqlAnalyse(SqlParseDto sqlParseDto);
} }
package cn.datax.service.data.factory.service.impl; package cn.datax.service.data.visual.service.impl;
import cn.datax.common.exception.DataException; import cn.datax.common.exception.DataException;
import cn.datax.common.utils.ThrowableUtil; import cn.datax.common.utils.ThrowableUtil;
import cn.datax.service.data.factory.api.dto.DataSetDto; import cn.datax.service.data.visual.api.dto.SqlParseDto;
import cn.datax.service.data.factory.api.dto.SqlParseDto; import cn.datax.service.data.visual.api.entity.VisualDataSetEntity;
import cn.datax.service.data.factory.api.entity.DataSetEntity; import cn.datax.service.data.visual.api.dto.VisualDataSetDto;
import cn.datax.service.data.factory.service.DataSetService; import cn.datax.service.data.visual.service.VisualDataSetService;
import cn.datax.service.data.factory.mapstruct.DataSetMapper; import cn.datax.service.data.visual.mapstruct.VisualDataSetMapper;
import cn.datax.service.data.factory.dao.DataSetDao; import cn.datax.service.data.visual.dao.VisualDataSetDao;
import cn.datax.common.base.BaseServiceImpl; import cn.datax.common.base.BaseServiceImpl;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.JSQLParserException;
...@@ -32,49 +32,51 @@ import java.util.List; ...@@ -32,49 +32,51 @@ import java.util.List;
* </p> * </p>
* *
* @author yuwei * @author yuwei
* @since 2020-03-20 * @since 2020-07-31
*/ */
@Slf4j @Slf4j
@Service @Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class) @Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class DataSetServiceImpl extends BaseServiceImpl<DataSetDao, DataSetEntity> implements DataSetService { public class VisualDataSetServiceImpl extends BaseServiceImpl<VisualDataSetDao, VisualDataSetEntity> implements VisualDataSetService {
@Autowired @Autowired
private DataSetDao dataSetDao; private VisualDataSetDao visualDataSetDao;
@Autowired @Autowired
private DataSetMapper dataSetMapper; private VisualDataSetMapper visualDataSetMapper;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void saveDataSet(DataSetDto dataSetDto) { public VisualDataSetEntity saveVisualDataSet(VisualDataSetDto visualDataSetDto) {
DataSetEntity dataSet = dataSetMapper.toEntity(dataSetDto); VisualDataSetEntity visualDataSet = visualDataSetMapper.toEntity(visualDataSetDto);
dataSetDao.insert(dataSet); visualDataSetDao.insert(visualDataSet);
return visualDataSet;
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateDataSet(DataSetDto dataSetDto) { public VisualDataSetEntity updateVisualDataSet(VisualDataSetDto visualDataSetDto) {
DataSetEntity dataSet = dataSetMapper.toEntity(dataSetDto); VisualDataSetEntity visualDataSet = visualDataSetMapper.toEntity(visualDataSetDto);
dataSetDao.updateById(dataSet); visualDataSetDao.updateById(visualDataSet);
return visualDataSet;
} }
@Override @Override
public DataSetEntity getDataSetById(String id) { public VisualDataSetEntity getVisualDataSetById(String id) {
DataSetEntity dataSetEntity = super.getById(id); VisualDataSetEntity visualDataSetEntity = super.getById(id);
return dataSetEntity; return visualDataSetEntity;
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteDataSetById(String id) { public void deleteVisualDataSetById(String id) {
dataSetDao.deleteById(id); visualDataSetDao.deleteById(id);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteDataSetBatch(List<String> ids) { public void deleteVisualDataSetBatch(List<String> ids) {
dataSetDao.deleteBatchIds(ids); visualDataSetDao.deleteBatchIds(ids);
} }
@Override @Override
......
server: server:
port: 8816 port: 8824
spring: spring:
application: application:
name: datax-service-data-factory name: datax-service-data-visual
profiles: profiles:
active: dev active: dev
cloud: cloud:
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <configuration scan="true" scanPeriod="60 seconds" debug="false">
<springProperty scope="context" name="springAppName" source="spring.application.name"/> <springProperty scope="context" name="springAppName" source="spring.application.name"/>
<property name="log.path" value="logs/datax-service-data-factory"/> <property name="log.path" value="logs/datax-service-data-visual"/>
<property name="log.maxHistory" value="15"/> <property name="log.maxHistory" value="15"/>
<property name="log.totalSizeCap" value="500MB"/> <property name="log.totalSizeCap" value="500MB"/>
<property name="log.maxFileSize" value="10MB"/> <property name="log.maxFileSize" value="10MB"/>
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.datax.service.data.factory.dao.DataSetDao"> <mapper namespace="cn.datax.service.data.visual.dao.VisualDataSetDao">
<!-- 通用查询映射结果 --> <!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.datax.service.data.factory.api.entity.DataSetEntity"> <resultMap id="BaseResultMap" type="cn.datax.service.data.visual.api.entity.VisualDataSetEntity">
<result column="id" property="id" /> <result column="id" property="id" />
<result column="status" property="status" /> <result column="status" property="status" />
<result column="create_by" property="createBy" /> <result column="create_by" property="createBy" />
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
<result column="set_name" property="setName" /> <result column="set_name" property="setName" />
<result column="set_sql" property="setSql" /> <result column="set_sql" property="setSql" />
<result column="schema_json" property="schemaConfig" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/> <result column="schema_json" property="schemaConfig" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
</resultMap> </resultMap>
<!-- 通用查询结果列 --> <!-- 通用查询结果列 -->
......
...@@ -10,12 +10,11 @@ ...@@ -10,12 +10,11 @@
<packaging>pom</packaging> <packaging>pom</packaging>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<version>2.0.0</version> <version>2.0.0</version>
<description>数据工厂</description> <description>数据可视化</description>
<artifactId>data-factory-service-parent</artifactId> <artifactId>data-visual-service-parent</artifactId>
<modules> <modules>
<module>data-factory-service</module> <module>data-visual-service-api</module>
<module>data-factory-service-api</module> <module>data-visual-service</module>
<module>data-factory-service-sql-console</module>
</modules> </modules>
</project> </project>
\ No newline at end of file
...@@ -16,10 +16,10 @@ ...@@ -16,10 +16,10 @@
<module>system-service-parent</module> <module>system-service-parent</module>
<module>file-service-parent</module> <module>file-service-parent</module>
<module>email-service-parent</module> <module>email-service-parent</module>
<module>data-factory-service-parent</module>
<module>data-market-service-parent</module>
<module>quartz-service-parent</module> <module>quartz-service-parent</module>
<module>codegen-service-parent</module> <module>codegen-service-parent</module>
<module>data-metadata-service-parent</module> <module>data-metadata-service-parent</module>
<module>data-market-service-parent</module>
<module>data-visual-service-parent</module>
</modules> </modules>
</project> </project>
\ No newline at end of file
...@@ -82,6 +82,14 @@ export function cancelDataApi (id) { ...@@ -82,6 +82,14 @@ export function cancelDataApi (id) {
}) })
} }
export function word (id) {
return request({
url: '/data/market/dataApis/word/' + id,
method: 'post',
responseType: 'blob'
})
}
export function getApiHeader (id) { export function getApiHeader (id) {
return request({ return request({
url: '/data/api/apis/' + id + '/header', url: '/data/api/apis/' + id + '/header',
......
import request from '@/utils/request'
export function listDataSet (data) {
return request({
url: '/data/visual/dataSets/list',
method: 'get',
params: data
})
}
export function pageDataSet (data) {
return request({
url: '/data/visual/dataSets/page',
method: 'get',
params: data
})
}
export function getDataSet (id) {
return request({
url: '/data/visual/dataSets/' + id,
method: 'get'
})
}
export function delDataSet (id) {
return request({
url: '/data/visual/dataSets/' + id,
method: 'delete'
})
}
export function delDataSets (ids) {
return request({
url: '/data/visual/dataSets/batch/' + ids,
method: 'delete'
})
}
export function addDataSet (data) {
return request({
url: '/data/visual/dataSets',
method: 'post',
data: data
})
}
export function updateDataSet (data) {
return request({
url: '/data/visual/dataSets/' + data.id,
method: 'put',
data: data
})
}
export function sqlAnalyse (data) {
return request({
url: '/data/visual/dataSets/sql/analyse',
method: 'post',
data: data
})
}
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<span>{{ title }}</span> <span>{{ title }}</span>
<el-button-group style="float: right;"> <el-button-group style="float: right;">
<el-button size="mini" icon="el-icon-coin" type="primary" round @click="handleSyncMetadata">元数据同步</el-button> <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="handleWordMetadata">数据库文档</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-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 size="mini" icon="el-icon-back" round @click="showCard">返回</el-button>
</el-button-group> </el-button-group>
...@@ -180,7 +180,7 @@ export default { ...@@ -180,7 +180,7 @@ export default {
}) })
}, },
/** 元数据同步 */ /** 元数据同步 */
handleSyncMetadata () { handleSync () {
sync(this.data.id).then(response => { sync(this.data.id).then(response => {
if (response.success) { if (response.success) {
this.$message.success('元数据正在后台同步中,请到元数据管理中查看结果') this.$message.success('元数据正在后台同步中,请到元数据管理中查看结果')
...@@ -188,7 +188,7 @@ export default { ...@@ -188,7 +188,7 @@ export default {
}) })
}, },
/** 数据库文档 */ /** 数据库文档 */
handleWordMetadata () { handleWord () {
word(this.data.id).then(response => { word(this.data.id).then(response => {
const blob = new Blob([response]) const blob = new Blob([response])
const fileName = '数据库设计文档.doc' const fileName = '数据库设计文档.doc'
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<span>{{ title }}</span> <span>{{ title }}</span>
<el-button-group style="float: right;"> <el-button-group style="float: right;">
<el-button size="mini" icon="el-icon-coin" type="primary" round @click="handleWord">接口文档</el-button>
<el-button size="mini" icon="el-icon-s-data" round @click="apiCall">接口调用</el-button> <el-button size="mini" icon="el-icon-s-data" round @click="apiCall">接口调用</el-button>
<el-button size="mini" icon="el-icon-back" round @click="showCard">返回</el-button> <el-button size="mini" icon="el-icon-back" round @click="showCard">返回</el-button>
</el-button-group> </el-button-group>
...@@ -237,7 +238,7 @@ ...@@ -237,7 +238,7 @@
</template> </template>
<script> <script>
import { getDataApi } from '@/api/market/dataapi' import { getDataApi, word } from '@/api/market/dataapi'
import { listDataSource, getDbTables, getDbTableColumns } from '@/api/factory/datasource' import { listDataSource, getDbTables, getDbTableColumns } from '@/api/factory/datasource'
import SqlEditor from '@/components/SqlEditor' import SqlEditor from '@/components/SqlEditor'
...@@ -433,6 +434,28 @@ export default { ...@@ -433,6 +434,28 @@ export default {
this.showOptions.showDetail = false this.showOptions.showDetail = false
this.showOptions.showCall = true this.showOptions.showCall = true
this.$emit('showCard', this.showOptions) this.$emit('showCard', this.showOptions)
},
/** 接口文档 */
handleWord () {
word(this.data.id).then(response => {
const blob = new Blob([response])
const fileName = '接口文档.docx'
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)
}
})
} }
} }
} }
......
<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-plus" round @click="submitForm" :loading="loadingOptions.loading" :disabled="loadingOptions.isDisabled">{{loadingOptions.loadingText}}</el-button>
<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" :rules="rules" label-width="80px">
<el-form-item label="数据源" prop="sourceId">
<el-select v-model="form.sourceId" placeholder="请选择数据源">
<el-option
v-for="source in sourceOptions"
:key="source.id"
:label="source.sourceName"
:value="source.id"
:disabled="source.status === '0'"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据集名称" prop="setName">
<el-input v-model="form.setName" placeholder="请输入数据集名称" />
</el-form-item>
<el-divider content-position="left">数据集</el-divider>
<el-row>
<el-col :span="24" style="padding: 0 20px;">
<sql-editor
ref="sqleditor"
:value="form.setSql"
@changeTextarea="changeTextarea($event)"
style="height: 300px;"
></sql-editor>
</el-col>
</el-row>
<el-form-item>
<el-button size="mini" type="primary" @click="formaterSql">Sql格式化</el-button>
<el-button size="mini" type="primary" @click="analyseSql">Sql解析</el-button>
<el-button size="mini" type="primary" @click="dataPreview">数据预览</el-button>
</el-form-item>
<el-divider content-position="left">数据模型定义</el-divider>
<el-row style="height: 300px;padding: 0 20px;">
<el-col :span="12" style="border: 1px dashed #999;height: 100%;">
<div class="tag-group" >
<draggable v-model="columnList" :options="{sort: false, group: {name: 'col', pull:'clone', put: false}}">
<el-tag v-for="(item, index) in columnList" :key="index" class="draggable-tag">
{{ item.col }}
</el-tag>
</draggable>
</div>
</el-col>
<el-col :span="12" style="box-shadow: 0 0 1px 1px #ccc;height: 100%;">
<el-row>
<el-divider content-position="left">维度列</el-divider>
<el-col>
<div style="height: 90px; border: 1px dashed #999; margin: 0 10px;">
<draggable group="col" :list="dimensionList">
<div v-for="(item, index) in dimensionList" :key="index" class="draggable-item">
<el-tag>{{ item.alias ? item.alias + '(' + item.col + ')' : item.col }}</el-tag>
<span class="draggable-item-handle" v-if="item.input">
<el-input size="mini" placeholder="请输入内容" v-model="item.alias" @blur="handleDelTagLabel(index, item)">
</el-input>
</span>
<span class="draggable-item-handle" v-else @click="handleTagLabel(index, item)"><i class="el-icon-edit-outline"></i></span>
<span class="draggable-item-handle" @click="handleDimensionTagClose(index, item)"><i class="el-icon-delete"></i></span>
</div>
</draggable>
</div>
</el-col>
</el-row>
<el-row>
<el-divider content-position="left">指标列</el-divider>
<el-col>
<div style="height: 90px; border: 1px dashed #999; margin: 0 10px;">
<draggable group="col" :list="measureList">
<div v-for="(item, index) in measureList" :key="index" class="draggable-item">
<el-tag>{{ item.alias ? item.alias + '(' + item.col + ')' : item.col }}</el-tag>
<span class="draggable-item-handle" v-if="item.input">
<el-input size="mini" placeholder="请输入内容" v-model="item.alias" @blur="handleDelTagLabel(index, item)">
</el-input>
</span>
<span class="draggable-item-handle" v-else @click="handleTagLabel(index, item)"><i class="el-icon-edit-outline"></i></span>
<span class="draggable-item-handle" @click="handleMeasureTagClose(index, item)"><i class="el-icon-delete"></i></span>
</div>
</draggable>
</div>
</el-col>
</el-row>
</el-col>
</el-row>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in statusOptions"
:key="dict.id"
:label="dict.itemText"
>{{dict.itemValue}}</el-radio>
</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>
</div>
<el-drawer
:visible.sync="drawer"
direction="btt"
:with-header="false">
<el-table :data="previewData.dataList" stripe border
:max-height="200"
style="width: 100%; margin: 15px 0;">
<el-table-column label="序号" width="55" align="center">
<template slot-scope="scope">
<span>{{ scope.$index + 1 }}</span>
</template>
</el-table-column>
<template v-for="(column, index) in previewData.columnList">
<el-table-column
:prop="column"
:label="column"
:key="index"
align="center"
show-overflow-tooltip
/>
</template>
</el-table>
<el-pagination
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="previewData.pageNum"
:page-size.sync="previewData.pageSize"
:total="previewData.dataTotal"
></el-pagination>
</el-drawer>
</el-card>
</div>
</template>
<script>
import { addDataSet, sqlAnalyse } from '@/api/visual/dataset'
import { listDataSource, queryByPage } from '@/api/factory/datasource'
import sqlFormatter from 'sql-formatter'
import SqlEditor from '@/components/SqlEditor'
import draggable from 'vuedraggable'
export default {
name: 'DataSetAdd',
components: {
SqlEditor,
draggable
},
props: {
data: {
type: Object,
default: function () {
return {}
}
}
},
data () {
return {
classCardbody: {
overflow: 'auto',
height: document.body.offsetHeight - 240 + 'px'
},
title: '数据集新增',
// 展示切换
showOptions: {
data: {},
showList: true,
showAdd: false,
showEdit: false,
showDetail: false
},
// 保存按钮
loadingOptions: {
loading: false,
loadingText: '保存',
isDisabled: false
},
// 表单参数
form: {
id: undefined,
sourceId: undefined,
setSql: undefined,
status: '1',
remark: undefined
},
// 表单校验
rules: {
sourceId: [
{ required: true, message: '数据源不能为空', trigger: 'change' }
],
setName: [
{ required: true, message: '数据集名称不能为空', trigger: 'blur' }
]
},
// 状态数据字典
statusOptions: [],
// 数据源数据字典
sourceOptions: [],
// 解析字段
columns: [],
columnList: [],
dimensionList: [],
measureList: [],
drawer: false,
previewData: {
dataList: [],
columnList: [],
pageNum: 1,
pageSize: 20,
dataTotal: 0
}
}
},
created () {
this.getDicts('sys_common_status').then(response => {
if (response.success) {
this.statusOptions = response.data
}
})
this.getDataSourceList()
},
methods: {
showCard () {
this.$emit('showCard', this.showOptions)
},
getDataSourceList () {
listDataSource().then(response => {
if (response.success) {
this.sourceOptions = response.data
}
})
},
// 绑定编辑器value值的变化
changeTextarea (val) {
this.$set(this.form, 'setSql', val)
},
formaterSql () {
if (!this.form.setSql) {
return
}
this.$refs.sqleditor.editor.setValue(sqlFormatter.format(this.$refs.sqleditor.editor.getValue()))
},
analyseSql () {
if (!this.form.setSql) {
return
}
let data = {}
data.sqlText = this.form.setSql
sqlAnalyse(data).then(response => {
if (response.success) {
this.columns = response.data
this.columnList = this.columns.map(function (item) {
let json = {}
json.col = item
json.alias = ''
return json
})
this.dimensionList = []
this.measureList = []
}
})
},
handleDimensionTagClose (index, tag) {
this.dimensionList.splice(index, 1)
tag.alias = ''
this.columnList.push(tag)
},
handleMeasureTagClose (index, tag) {
this.measureList.splice(index, 1)
tag.alias = ''
this.columnList.push(tag)
},
handleTagLabel (index, tag) {
this.$set(tag, 'input', true)
},
handleDelTagLabel (index, tag) {
this.$delete(tag, 'input')
},
dataPreview () {
if (!this.form.sourceId) {
return
}
if (!this.form.setSql) {
return
}
let data = {}
data.dataSourceId = this.form.sourceId
data.sql = this.form.setSql
data.pageNum = this.previewData.pageNum
data.pageSize = this.previewData.pageSize
queryByPage(data).then(response => {
if (response.success) {
const { data } = response
let dataList = data.data || []
let columnList = []
if (dataList.length > 0) {
columnList = Object.keys(dataList[0])
}
this.previewData.dataList = dataList
this.previewData.columnList = columnList
this.previewData.dataTotal = data.total
this.drawer = true
}
})
},
handleSizeChange (val) {
this.previewData.pageNum = 1
this.previewData.pageSize = val
this.dataPreview()
},
handleCurrentChange (val) {
this.previewData.pageNum = val
this.dataPreview()
},
/** 提交按钮 */
submitForm: function () {
this.$refs['form'].validate(valid => {
if (valid) {
let schema = {}
schema.columns = this.columns || []
schema.dimensions = this.dimensionList || []
schema.measures = this.measureList || []
this.form.schemaConfig = schema
this.loadingOptions.loading = true
this.loadingOptions.loadingText = '保存中...'
this.loadingOptions.isDisabled = true
addDataSet(this.form).then(response => {
if (response.success) {
this.$message.success('保存成功')
setTimeout(() => {
// 2秒后跳转列表页
this.$emit('showCard', this.showOptions)
}, 2000)
} else {
this.$message.error('保存失败')
this.loadingOptions.loading = false
this.loadingOptions.loadingText = '保存'
this.loadingOptions.isDisabled = false
}
}).catch(error => {
this.$message.error(error.data.msg || '保存失败')
this.loadingOptions.loading = false
this.loadingOptions.loadingText = '保存'
this.loadingOptions.isDisabled = false
})
}
})
}
}
}
</script>
<style lang="scss" scoped>
.draggable-tag {
margin: 10px;
cursor: move;
}
.draggable-item {
cursor: move;
margin: 5px 5px;
display: inline-block;
border: 1px solid #ebecef;
height: 32px;
line-height: 30px;
border-radius: 4px;
.draggable-item-handle {
background-color: #ecf5ff;
border-color: #d9ecff;
display: inline-block;
height: 32px;
padding: 0 10px;
line-height: 30px;
font-size: 12px;
color: #409EFF;
border-width: 1px;
border-style: solid;
box-sizing: border-box;
white-space: nowrap;
cursor: pointer;
margin-left: -5px;
}
}
</style>
<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-s-data" round @click="dataPreview">数据预览</el-button>
<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="sourceId">
<el-select v-model="form.sourceId" placeholder="请选择数据源">
<el-option
v-for="source in sourceOptions"
:key="source.id"
:label="source.sourceName"
:value="source.id"
:disabled="source.status === '0'"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据集名称" prop="setName">
<el-input v-model="form.setName" placeholder="请输入数据集名称" />
</el-form-item>
<el-divider content-position="left">数据集</el-divider>
<el-row>
<el-col :span="24" style="padding: 0 20px;">
<sql-editor
ref="sqleditor"
:value="form.setSql"
:readOnly="true"
style="height: 300px;"
></sql-editor>
</el-col>
</el-row>
<el-divider content-position="left">数据模型定义</el-divider>
<el-row style="height: 300px;padding: 0 20px;">
<el-col :span="12" style="border: 1px dashed #999;height: 100%;">
<div class="tag-group" >
<el-tag v-for="(item, index) in columnList" :key="index" class="draggable-tag">
{{ item.col }}
</el-tag>
</div>
</el-col>
<el-col :span="12" style="box-shadow: 0 0 1px 1px #ccc;height: 100%;">
<el-row>
<el-divider content-position="left">维度列</el-divider>
<el-col>
<div style="height: 90px; border: 1px dashed #999; margin: 0 10px;">
<el-tag v-for="(item, index) in dimensionList" :key="index" class="draggable-item">
{{ item.alias ? item.alias + '(' + item.col + ')' : item.col }}
</el-tag>
</div>
</el-col>
</el-row>
<el-row>
<el-divider content-position="left">指标列</el-divider>
<el-col>
<div style="height: 90px; border: 1px dashed #999; margin: 0 10px;">
<el-tag v-for="(item, index) in measureList" :key="index" class="draggable-item">
{{ item.alias ? item.alias + '(' + item.col + ')' : item.col }}
</el-tag>
</div>
</el-col>
</el-row>
</el-col>
</el-row>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in statusOptions"
:key="dict.id"
:label="dict.itemText"
>{{dict.itemValue}}</el-radio>
</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-drawer
:visible.sync="drawer"
direction="btt"
:with-header="false">
<el-table :data="previewData.dataList" stripe border
:max-height="200"
style="width: 100%; margin: 15px 0;">
<el-table-column label="序号" width="55" align="center">
<template slot-scope="scope">
<span>{{ scope.$index + 1 }}</span>
</template>
</el-table-column>
<template v-for="(column, index) in previewData.columnList">
<el-table-column
:prop="column"
:label="column"
:key="index"
align="center"
show-overflow-tooltip
/>
</template>
</el-table>
<el-pagination
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="previewData.pageNum"
:page-size.sync="previewData.pageSize"
:total="previewData.dataTotal"
></el-pagination>
</el-drawer>
</div>
</el-card>
</div>
</template>
<script>
import { getDataSet } from '@/api/visual/dataset'
import { listDataSource, queryByPage } from '@/api/factory/datasource'
import SqlEditor from '@/components/SqlEditor'
export default {
name: 'DataSetDetail',
components: {
SqlEditor
},
props: {
data: {
type: Object,
default: function () {
return {}
}
}
},
data () {
return {
classCardbody: {
overflow: 'auto',
height: document.body.offsetHeight - 240 + 'px'
},
title: '数据集详情',
// 展示切换
showOptions: {
data: {},
showList: true,
showAdd: false,
showEdit: false,
showDetail: false
},
// 表单参数
form: {},
// 状态数据字典
statusOptions: [],
// 数据源数据字典
sourceOptions: [],
// 解析字段
columns: [],
columnList: [],
dimensionList: [],
measureList: [],
drawer: false,
previewData: {
dataList: [],
columnList: [],
pageNum: 1,
pageSize: 20,
dataTotal: 0
}
}
},
created () {
console.log('id:' + this.data.id)
this.getDicts('sys_common_status').then(response => {
if (response.success) {
this.statusOptions = response.data
}
})
this.getDataSourceList()
},
mounted () {
this.getDataSet(this.data.id)
},
methods: {
showCard () {
this.$emit('showCard', this.showOptions)
},
getDataSourceList () {
listDataSource().then(response => {
if (response.success) {
this.sourceOptions = response.data
}
})
},
/** 获取详情 */
getDataSet: function (id) {
getDataSet(id).then(response => {
if (response.success) {
this.form = response.data
this.columns = this.form.schemaConfig.columns || []
if (this.columns && this.columns.length > 0) {
this.dimensionList = this.form.schemaConfig.dimensions || []
this.measureList = this.form.schemaConfig.measures || []
this.columnList = this.columns.filter(x => [...this.dimensionList, ...this.measureList].every(y => y.col !== x)).map(function (item) {
let json = {}
json.col = item
json.alias = ''
return json
})
}
this.$refs.sqleditor.editor.setValue(this.form.setSql)
}
})
},
dataPreview () {
if (!this.form.sourceId) {
return
}
if (!this.form.setSql) {
return
}
let data = {}
data.dataSourceId = this.form.sourceId
data.sql = this.form.setSql
data.pageNum = this.previewData.pageNum
data.pageSize = this.previewData.pageSize
queryByPage(data).then(response => {
if (response.success) {
const { data } = response
let dataList = data.data || []
let columnList = []
if (dataList.length > 0) {
columnList = Object.keys(dataList[0])
}
this.previewData.dataList = dataList
this.previewData.columnList = columnList
this.previewData.dataTotal = data.total
this.drawer = true
}
})
},
handleSizeChange (val) {
this.previewData.pageNum = 1
this.previewData.pageSize = val
this.dataPreview()
},
handleCurrentChange (val) {
this.previewData.pageNum = val
this.dataPreview()
}
}
}
</script>
<style lang="scss" scoped>
.draggable-tag {
margin: 10px;
cursor: move;
}
.draggable-item {
cursor: move;
margin: 5px 5px;
display: inline-block;
border: 1px solid #ebecef;
height: 32px;
line-height: 30px;
border-radius: 4px;
.draggable-item-handle {
background-color: #ecf5ff;
border-color: #d9ecff;
display: inline-block;
height: 32px;
padding: 0 10px;
line-height: 30px;
font-size: 12px;
color: #409EFF;
border-width: 1px;
border-style: solid;
box-sizing: border-box;
white-space: nowrap;
cursor: pointer;
margin-left: -5px;
}
}
</style>
<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-plus" round @click="submitForm" :loading="loadingOptions.loading" :disabled="loadingOptions.isDisabled">{{loadingOptions.loadingText}}</el-button>
<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" :rules="rules" label-width="80px">
<el-form-item label="数据源" prop="sourceId">
<el-select v-model="form.sourceId" placeholder="请选择数据源">
<el-option
v-for="source in sourceOptions"
:key="source.id"
:label="source.sourceName"
:value="source.id"
:disabled="source.status === '0'"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据集名称" prop="setName">
<el-input v-model="form.setName" placeholder="请输入数据集名称" />
</el-form-item>
<el-divider content-position="left">数据集</el-divider>
<el-row style="padding: 0 20px;">
<el-col :span="24">
<sql-editor
ref="sqleditor"
:value="form.setSql"
@changeTextarea="changeTextarea($event)"
style="height: 300px;"
></sql-editor>
</el-col>
</el-row>
<el-form-item>
<el-button size="mini" type="primary" @click="formaterSql">Sql格式化</el-button>
<el-button size="mini" type="primary" @click="analyseSql">Sql解析</el-button>
<el-button size="mini" type="primary" @click="dataPreview">数据预览</el-button>
</el-form-item>
<el-divider content-position="left">数据模型定义</el-divider>
<el-row style="height: 300px;padding: 0 20px;">
<el-col :span="12" style="border: 1px dashed #999;height: 100%;">
<div class="tag-group" >
<draggable v-model="columnList" :options="{sort: false, group: {name: 'col', pull: true, put: false}}">
<el-tag v-for="(item, index) in columnList" :key="index" class="draggable-tag">
{{ item.col }}
</el-tag>
</draggable>
</div>
</el-col>
<el-col :span="12" style="box-shadow: 0 0 1px 1px #ccc;height: 100%;">
<el-row>
<el-divider content-position="left">维度列</el-divider>
<el-col>
<div style="height: 90px; border: 1px dashed #999; margin: 0 10px;">
<draggable group="col" :list="dimensionList">
<div v-for="(item, index) in dimensionList" :key="index" class="draggable-item">
<el-tag>{{ item.alias ? item.alias + '(' + item.col + ')' : item.col }}</el-tag>
<span class="draggable-item-handle" v-if="item.input">
<el-input size="mini" placeholder="请输入内容" v-model="item.alias" @blur="handleDelTagLabel(index, item)">
</el-input>
</span>
<span class="draggable-item-handle" v-else @click="handleTagLabel(index, item)"><i class="el-icon-edit-outline"></i></span>
<span class="draggable-item-handle" @click="handleDimensionTagClose(index, item)"><i class="el-icon-delete"></i></span>
</div>
</draggable>
</div>
</el-col>
</el-row>
<el-row>
<el-divider content-position="left">指标列</el-divider>
<el-col>
<div style="height: 90px; border: 1px dashed #999; margin: 0 10px;">
<draggable group="col" :list="measureList">
<div v-for="(item, index) in measureList" :key="index" class="draggable-item">
<el-tag>{{ item.alias ? item.alias + '(' + item.col + ')' : item.col }}</el-tag>
<span class="draggable-item-handle" v-if="item.input">
<el-input size="mini" placeholder="请输入内容" v-model="item.alias" @blur="handleDelTagLabel(index, item)">
</el-input>
</span>
<span class="draggable-item-handle" v-else @click="handleTagLabel(index, item)"><i class="el-icon-edit-outline"></i></span>
<span class="draggable-item-handle" @click="handleMeasureTagClose(index, item)"><i class="el-icon-delete"></i></span>
</div>
</draggable>
</div>
</el-col>
</el-row>
</el-col>
</el-row>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in statusOptions"
:key="dict.id"
:label="dict.itemText"
>{{dict.itemValue}}</el-radio>
</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-drawer
:visible.sync="drawer"
direction="btt"
:with-header="false">
<el-table :data="previewData.dataList" stripe border
:max-height="200"
style="width: 100%; margin: 15px 0;">
<el-table-column label="序号" width="55" align="center">
<template slot-scope="scope">
<span>{{ scope.$index + 1 }}</span>
</template>
</el-table-column>
<template v-for="(column, index) in previewData.columnList">
<el-table-column
:prop="column"
:label="column"
:key="index"
align="center"
show-overflow-tooltip
/>
</template>
</el-table>
<el-pagination
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="previewData.pageNum"
:page-size.sync="previewData.pageSize"
:total="previewData.dataTotal"
></el-pagination>
</el-drawer>
</div>
</el-card>
</div>
</template>
<script>
import { getDataSet, updateDataSet, sqlAnalyse } from '@/api/factory/dataset'
import { listDataSource, queryByPage } from '@/api/factory/datasource'
import sqlFormatter from 'sql-formatter'
import SqlEditor from '@/components/SqlEditor'
import draggable from 'vuedraggable'
export default {
name: 'DataSetEdit',
components: {
SqlEditor,
draggable
},
props: {
data: {
type: Object,
default: function () {
return {}
}
}
},
data () {
return {
classCardbody: {
overflow: 'auto',
height: document.body.offsetHeight - 240 + 'px'
},
title: '数据集编辑',
// 展示切换
showOptions: {
data: {},
showList: true,
showAdd: false,
showEdit: false,
showDetail: false
},
// 保存按钮
loadingOptions: {
loading: false,
loadingText: '保存',
isDisabled: false
},
// 表单参数
form: {},
// 表单校验
rules: {
sourceId: [
{ required: true, message: '数据源不能为空', trigger: 'change' }
],
setName: [
{ required: true, message: '数据集名称不能为空', trigger: 'blur' }
]
},
// 状态数据字典
statusOptions: [],
// 数据源数据字典
sourceOptions: [],
// 解析字段
columns: [],
columnList: [],
dimensionList: [],
measureList: [],
drawer: false,
previewData: {
dataList: [],
columnList: [],
pageNum: 1,
pageSize: 20,
dataTotal: 0
}
}
},
created () {
console.log('id:' + this.data.id)
this.getDicts('sys_common_status').then(response => {
if (response.success) {
this.statusOptions = response.data
}
})
this.getDataSourceList()
},
mounted () {
this.getDataSet(this.data.id)
},
methods: {
showCard () {
this.$emit('showCard', this.showOptions)
},
getDataSourceList () {
listDataSource().then(response => {
if (response.success) {
this.sourceOptions = response.data
}
})
},
/** 获取详情 */
getDataSet: function (id) {
getDataSet(id).then(response => {
if (response.success) {
this.form = response.data
this.columns = this.form.schemaConfig.columns || []
if (this.columns && this.columns.length > 0) {
this.dimensionList = this.form.schemaConfig.dimensions || []
this.measureList = this.form.schemaConfig.measures || []
this.columnList = this.columns.filter(x => [...this.dimensionList, ...this.measureList].every(y => y.col !== x)).map(function (item) {
let json = {}
json.col = item
json.alias = ''
return json
})
}
this.$refs.sqleditor.editor.setValue(this.form.setSql)
}
})
},
// 绑定编辑器value值的变化
changeTextarea (val) {
this.$set(this.form, 'setSql', val)
},
formaterSql () {
this.$refs.sqleditor.editor.setValue(sqlFormatter.format(this.$refs.sqleditor.editor.getValue()))
},
analyseSql () {
if (!this.form.setSql) {
return
}
let data = {}
data.sqlText = this.form.setSql
sqlAnalyse(data).then(response => {
if (response.success) {
this.columns = response.data
this.columnList = this.columns.map(function (item) {
let json = {}
json.col = item
json.alias = ''
return json
})
this.dimensionList = []
this.measureList = []
}
})
},
handleDimensionTagClose (index, tag) {
this.dimensionList.splice(index, 1)
tag.alias = ''
this.columnList.push(tag)
},
handleMeasureTagClose (index, tag) {
this.measureList.splice(index, 1)
tag.alias = ''
this.columnList.push(tag)
},
handleTagLabel (index, tag) {
this.$set(tag, 'input', true)
},
handleDelTagLabel (index, tag) {
this.$delete(tag, 'input')
},
dataPreview () {
if (!this.form.sourceId) {
return
}
if (!this.form.setSql) {
return
}
let data = {}
data.dataSourceId = this.form.sourceId
data.sql = this.form.setSql
data.pageNum = this.previewData.pageNum
data.pageSize = this.previewData.pageSize
queryByPage(data).then(response => {
if (response.success) {
const { data } = response
let dataList = data.data || []
let columnList = []
if (dataList.length > 0) {
columnList = Object.keys(dataList[0])
}
this.previewData.dataList = dataList
this.previewData.columnList = columnList
this.previewData.dataTotal = data.total
this.drawer = true
}
})
},
handleSizeChange (val) {
this.previewData.pageNum = 1
this.previewData.pageSize = val
this.dataPreview()
},
handleCurrentChange (val) {
this.previewData.pageNum = val
this.dataPreview()
},
/** 提交按钮 */
submitForm: function () {
this.$refs['form'].validate(valid => {
if (valid) {
let schema = {}
schema.columns = this.columns || []
schema.dimensions = this.dimensionList || []
schema.measures = this.measureList || []
this.form.schemaConfig = schema
this.loadingOptions.loading = true
this.loadingOptions.loadingText = '保存中...'
this.loadingOptions.isDisabled = true
updateDataSet(this.form).then(response => {
if (response.success) {
this.$message.success('保存成功')
setTimeout(() => {
// 2秒后跳转列表页
this.$emit('showCard', this.showOptions)
}, 2000)
} else {
this.$message.error('保存失败')
this.loadingOptions.loading = false
this.loadingOptions.loadingText = '保存'
this.loadingOptions.isDisabled = false
}
}).catch(error => {
this.$message.error(error.data.msg || '保存失败')
this.loadingOptions.loading = false
this.loadingOptions.loadingText = '保存'
this.loadingOptions.isDisabled = false
})
}
})
}
}
}
</script>
<style lang="scss" scoped>
.draggable-tag {
margin: 10px;
cursor: move;
}
.draggable-item {
cursor: move;
margin: 5px 5px;
display: inline-block;
border: 1px solid #ebecef;
height: 32px;
line-height: 30px;
border-radius: 4px;
.draggable-item-handle {
background-color: #ecf5ff;
border-color: #d9ecff;
display: inline-block;
height: 32px;
padding: 0 10px;
line-height: 30px;
font-size: 12px;
color: #409EFF;
border-width: 1px;
border-style: solid;
box-sizing: border-box;
white-space: nowrap;
cursor: pointer;
margin-left: -5px;
}
}
</style>
<template>
<div>
<el-card class="box-card" shadow="always">
<el-form :model="queryParams" ref="queryForm" :inline="true">
<el-form-item label="数据集名称" prop="setName">
<el-input
v-model="queryParams.setName"
placeholder="请输入数据集名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row type="flex" justify="space-between">
<el-col :span="12">
<el-button-group>
<el-button
type="primary"
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPerm="['factory:dataset:add']"
>新增</el-button>
<el-button
type="success"
icon="el-icon-edit-outline"
size="mini"
:disabled="single"
@click="handleEdit"
v-hasPerm="['factory:dataset:edit']"
>修改</el-button>
<el-button
type="info"
icon="el-icon-view"
size="mini"
:disabled="single"
@click="handleDetail"
v-hasPerm="['factory:dataset:detail']"
>详情</el-button>
<el-button
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleBatchDelete"
v-hasPerm="['factory:dataset:remove']"
>删除</el-button>
</el-button-group>
</el-col>
<el-col :span="12">
<div class="right-toolbar">
<el-tooltip content="密度" effect="dark" placement="top">
<el-dropdown trigger="click" @command="handleCommand">
<el-button circle size="mini">
<svg-icon class-name="size-icon" icon-class="colum-height" />
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="medium">正常</el-dropdown-item>
<el-dropdown-item command="small">中等</el-dropdown-item>
<el-dropdown-item command="mini">紧凑</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</el-tooltip>
<el-tooltip content="刷新" effect="dark" placement="top">
<el-button circle size="mini" @click="handleRefresh">
<svg-icon class-name="size-icon" icon-class="shuaxin" />
</el-button>
</el-tooltip>
<el-tooltip content="列设置" effect="dark" placement="top">
<el-popover placement="bottom" width="100" trigger="click">
<el-checkbox-group v-model="checkedTableColumns" @change="handleCheckedColsChange">
<el-checkbox
v-for="(item, index) in tableColumns"
:key="index"
:label="item.prop"
>{{ item.label }}</el-checkbox>
</el-checkbox-group>
<span slot="reference">
<el-button circle size="mini">
<svg-icon class-name="size-icon" icon-class="shezhi" />
</el-button>
</span>
</el-popover>
</el-tooltip>
</div>
</el-col>
</el-row>
<el-table
v-loading="loading"
:data="dataSetList"
@selection-change="handleSelectionChange"
border
tooltip-effect="dark"
:size="tableSize"
:height="tableHeight"
style="width: 100%;margin: 15px 0;"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" width="55" align="center">
<template slot-scope="scope">
<span>{{ scope.$index +1 }}</span>
</template>
</el-table-column>
<template v-for="(item, index) in tableColumns">
<el-table-column
v-if="item.show"
:prop="item.prop"
:label="item.label"
:key="index"
:formatter="item.formatter"
align="center"
show-overflow-tooltip
/>
</template>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-popover
placement="left"
trigger="click">
<el-button
size="mini"
type="text"
icon="el-icon-edit-outline"
@click="handleEdit(scope.row)"
v-hasPerm="['factory:dataset:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-view"
@click="handleDetail(scope.row)"
v-hasPerm="['factory:dataset:detail']"
>详情</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPerm="['factory:dataset:remove']"
>删除</el-button>
<el-button slot="reference">操作</el-button>
</el-popover>
</template>
</el-table-column>
</el-table>
<el-pagination
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="queryParams.pageNum"
:page-size.sync="queryParams.pageSize"
:total="total"
></el-pagination>
</el-card>
</div>
</template>
<script>
import { pageDataSet, delDataSet, delDataSets } from '@/api/visual/dataset'
export default {
name: 'DataSetList',
data () {
return {
tableHeight: document.body.offsetHeight - 340 + 'px',
// 展示切换
showOptions: {
data: {},
showList: true,
showAdd: false,
showEdit: false,
showDetail: false
},
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 表格头
tableColumns: [
{ prop: 'setName', label: '数据集名称', show: true },
{
prop: 'status',
label: '状态',
show: true,
formatter: this.statusFormatter
},
{ prop: 'createTime', label: '创建时间', show: true }
],
// 默认选择中表格头
checkedTableColumns: [],
tableSize: 'medium',
// 状态数据字典
statusOptions: [],
// 数据集表格数据
dataSetList: [],
// 总数据条数
total: 0,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 20,
setName: ''
}
}
},
created () {
this.getDicts('sys_common_status').then(response => {
if (response.success) {
this.statusOptions = response.data
}
})
this.getList()
},
mounted () {
this.initCols()
},
methods: {
/** 查询数据集列表 */
getList () {
this.loading = true
pageDataSet(this.queryParams).then(response => {
this.loading = false
if (response.success) {
const { data } = response
this.dataSetList = data.data
this.total = data.total
}
})
},
initCols () {
this.checkedTableColumns = this.tableColumns.map(col => col.prop)
},
handleCheckedColsChange (val) {
this.tableColumns.forEach(col => {
if (!this.checkedTableColumns.includes(col.prop)) {
col.show = false
} else {
col.show = true
}
})
},
handleCommand (command) {
this.tableSize = command
},
/** 搜索按钮操作 */
handleQuery () {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery () {
this.$refs['queryForm'].resetFields()
this.handleQuery()
},
/** 刷新列表 */
handleRefresh () {
this.getList()
},
/** 多选框选中数据 */
handleSelectionChange (selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd () {
this.showOptions.data = {}
this.showOptions.showList = false
this.showOptions.showAdd = true
this.showOptions.showEdit = false
this.showOptions.showDetail = false
this.$emit('showCard', this.showOptions)
},
/** 修改按钮操作 */
handleEdit (row) {
this.showOptions.data.id = row.id || this.ids[0]
this.showOptions.showList = false
this.showOptions.showAdd = false
this.showOptions.showEdit = true
this.showOptions.showDetail = false
this.$emit('showCard', this.showOptions)
},
/** 详情按钮操作 */
handleDetail (row) {
this.showOptions.data.id = row.id || this.ids[0]
this.showOptions.showList = false
this.showOptions.showAdd = false
this.showOptions.showEdit = false
this.showOptions.showDetail = true
this.$emit('showCard', this.showOptions)
},
/** 删除按钮操作 */
handleDelete (row) {
this.$confirm('选中数据将被永久删除, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
delDataSet(row.id)
}).then(() => {
this.$message.success('删除成功')
this.getList()
}).catch(() => {
})
},
/** 批量删除按钮操作 */
handleBatchDelete () {
if (!this.ids.length) {
this.$message({
message: '请先选择需要操作的数据',
type: 'warning'
})
}
this.$message.warning('不支持批量删除')
},
handleSizeChange (val) {
console.log(`每页 ${val} 条`)
this.queryParams.pageNum = 1
this.queryParams.pageSize = val
this.getList()
},
handleCurrentChange (val) {
console.log(`当前页: ${val}`)
this.queryParams.pageNum = val
this.getList()
},
statusFormatter (row, column, cellValue, index) {
let dictLabel = this.selectDictLabel(this.statusOptions, cellValue)
if (cellValue === '1') {
return <el-tag type="success">{dictLabel}</el-tag>
} else {
return <el-tag type="warning">{dictLabel}</el-tag>
}
}
}
}
</script>
<style lang="scss" scoped>
.right-toolbar {
float: right;
}
</style>
<template>
<div class="app-container">
<transition name="el-zoom-in-center">
<data-set-list v-if="options.showList" @showCard="showCard"></data-set-list>
</transition>
<transition name="el-zoom-in-top">
<data-set-add v-if="options.showAdd" :data="options.data" @showCard="showCard"></data-set-add>
</transition>
<transition name="el-zoom-in-top">
<data-set-edit v-if="options.showEdit" :data="options.data" @showCard="showCard"></data-set-edit>
</transition>
<transition name="el-zoom-in-bottom">
<data-set-detail v-if="options.showDetail" :data="options.data" @showCard="showCard"></data-set-detail>
</transition>
</div>
</template>
<script>
import DataSetList from './DataSetList'
import DataSetAdd from './DataSetAdd'
import DataSetEdit from './DataSetEdit'
import DataSetDetail from './DataSetDetail'
export default {
name: 'DataSet',
components: { DataSetList, DataSetAdd, DataSetEdit, DataSetDetail },
data () {
return {
options: {
data: {},
showList: true,
showAdd: false,
showEdit: false,
showDetail: false
}
}
},
methods: {
showCard (data) {
Object.assign(this.options, data)
}
}
}
</script>
<style lang="scss" scoped>
</style>
...@@ -57,7 +57,6 @@ ...@@ -57,7 +57,6 @@
<jasperreports.version>6.12.2</jasperreports.version> <jasperreports.version>6.12.2</jasperreports.version>
<mybatis-spring.version>2.1.2</mybatis-spring.version> <mybatis-spring.version>2.1.2</mybatis-spring.version>
<bitwalker.version>1.21</bitwalker.version> <bitwalker.version>1.21</bitwalker.version>
<xstream.vsersion>1.4.12</xstream.vsersion>
</properties> </properties>
<modules> <modules>
......
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