Commit 40183ee2 by yuwei

项目初始化

parent f2707f70
...@@ -24,5 +24,9 @@ ...@@ -24,5 +24,9 @@
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId> <artifactId>commons-pool2</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>
...@@ -12,7 +12,6 @@ public class ApiLogDto implements Serializable { ...@@ -12,7 +12,6 @@ public class ApiLogDto implements Serializable {
private String id; private String id;
private String apiId; private String apiId;
private String apiName;
private String callerId; private String callerId;
private String callerIp; private String callerIp;
private String callerUrl; private String callerUrl;
......
...@@ -28,8 +28,6 @@ public class ServiceLogDto implements Serializable { ...@@ -28,8 +28,6 @@ public class ServiceLogDto implements Serializable {
private String id; private String id;
@ApiModelProperty(value = "服务id") @ApiModelProperty(value = "服务id")
private String serviceId; private String serviceId;
@ApiModelProperty(value = "服务名称")
private String serviceName;
@ApiModelProperty(value = "调用者id") @ApiModelProperty(value = "调用者id")
private String callerId; private String callerId;
@ApiModelProperty(value = "调用者ip") @ApiModelProperty(value = "调用者ip")
......
...@@ -11,6 +11,10 @@ public class SqlParseDto implements Serializable { ...@@ -11,6 +11,10 @@ public class SqlParseDto implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
@ApiModelProperty(value = "数据源")
@NotBlank(message = "数据源不能为空")
private String sourceId;
@ApiModelProperty(value = "SQL文本") @ApiModelProperty(value = "SQL文本")
@NotBlank(message = "SQL不能为空") @NotBlank(message = "SQL不能为空")
private String sqlText; private String sqlText;
......
...@@ -27,6 +27,7 @@ public class ApiLogEntity implements Serializable { ...@@ -27,6 +27,7 @@ public class ApiLogEntity implements Serializable {
/** /**
* api名称 * api名称
*/ */
@TableField(exist = false)
private String apiName; private String apiName;
/** /**
* 调用者id * 调用者id
......
package cn.datax.service.data.market.api.entity; package cn.datax.service.data.market.api.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import cn.datax.common.base.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
/** /**
...@@ -41,6 +40,7 @@ public class ServiceLogEntity implements Serializable { ...@@ -41,6 +40,7 @@ public class ServiceLogEntity implements Serializable {
/** /**
* 服务名称 * 服务名称
*/ */
@TableField(exist = false)
private String serviceName; private String serviceName;
/** /**
......
...@@ -2,7 +2,13 @@ package cn.datax.service.data.market.integration.dao; ...@@ -2,7 +2,13 @@ package cn.datax.service.data.market.integration.dao;
import cn.datax.common.base.BaseDao; import cn.datax.common.base.BaseDao;
import cn.datax.service.data.market.api.entity.ServiceLogEntity; import cn.datax.service.data.market.api.entity.ServiceLogEntity;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.io.Serializable;
/** /**
* <p> * <p>
...@@ -15,4 +21,9 @@ import org.apache.ibatis.annotations.Mapper; ...@@ -15,4 +21,9 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface ServiceLogDao extends BaseDao<ServiceLogEntity> { public interface ServiceLogDao extends BaseDao<ServiceLogEntity> {
@Override
ServiceLogEntity selectById(Serializable id);
@Override
<E extends IPage<ServiceLogEntity>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<ServiceLogEntity> queryWrapper);
} }
...@@ -22,7 +22,30 @@ ...@@ -22,7 +22,30 @@
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id, id,
status, status,
service_id, service_name, caller_id, caller_ip, caller_date, caller_header, caller_param, caller_soap, time, msg service_id, caller_id, caller_ip, caller_date, caller_header, caller_param, caller_soap, time, msg
</sql> </sql>
<sql id="Log_Column_List">
${alias}.id,
${alias}.status,
${alias}.service_id, ${alias}.caller_id, ${alias}.caller_ip, ${alias}.caller_date,
${alias}.caller_header, ${alias}.caller_param, ${alias}.caller_soap, ${alias}.time, ${alias}.msg
</sql>
<select id="selectById" resultMap="BaseResultMap">
SELECT service.service_name,
<include refid="Log_Column_List"><property name="alias" value="log"/></include>
FROM market_service_log log
LEFT JOIN market_service_integration service ON service.id = log.service_id
WHERE 1 = 1 AND log.id = #{id}
</select>
<select id="selectPage" resultMap="BaseResultMap">
SELECT service.service_name,
<include refid="Log_Column_List"><property name="alias" value="log"/></include>
FROM market_service_log log
LEFT JOIN market_service_integration service ON service.id = log.service_id
${ew.customSqlSegment}
</select>
</mapper> </mapper>
...@@ -72,7 +72,7 @@ public class ApiLogController extends BaseController { ...@@ -72,7 +72,7 @@ public class ApiLogController extends BaseController {
@GetMapping("/page") @GetMapping("/page")
public R getApiLogPage(ApiLogQuery apiLogQuery) { public R getApiLogPage(ApiLogQuery apiLogQuery) {
QueryWrapper<ApiLogEntity> queryWrapper = new QueryWrapper<>(); QueryWrapper<ApiLogEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(apiLogQuery.getApiName()), "api_name", apiLogQuery.getApiName()); queryWrapper.like(StrUtil.isNotBlank(apiLogQuery.getApiName()), "api.api_name", apiLogQuery.getApiName());
IPage<ApiLogEntity> page = apiLogService.page(new Page<>(apiLogQuery.getPageNum(), apiLogQuery.getPageSize()), queryWrapper); IPage<ApiLogEntity> page = apiLogService.page(new Page<>(apiLogQuery.getPageNum(), apiLogQuery.getPageSize()), queryWrapper);
List<ApiLogVo> collect = page.getRecords().stream().map(apiLogMapper::toVO).collect(Collectors.toList()); List<ApiLogVo> collect = page.getRecords().stream().map(apiLogMapper::toVO).collect(Collectors.toList());
JsonPage<ApiLogVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect); JsonPage<ApiLogVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
......
...@@ -2,8 +2,20 @@ package cn.datax.service.data.market.mapping.dao; ...@@ -2,8 +2,20 @@ package cn.datax.service.data.market.mapping.dao;
import cn.datax.common.base.BaseDao; import cn.datax.common.base.BaseDao;
import cn.datax.service.data.market.api.entity.ApiLogEntity; import cn.datax.service.data.market.api.entity.ApiLogEntity;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.io.Serializable;
@Mapper @Mapper
public interface ApiLogDao extends BaseDao<ApiLogEntity> { public interface ApiLogDao extends BaseDao<ApiLogEntity> {
@Override
ApiLogEntity selectById(Serializable id);
@Override
<E extends IPage<ApiLogEntity>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<ApiLogEntity> queryWrapper);
} }
...@@ -5,6 +5,7 @@ import cn.datax.common.exception.DataException; ...@@ -5,6 +5,7 @@ import cn.datax.common.exception.DataException;
import cn.datax.common.utils.IPUtil; import cn.datax.common.utils.IPUtil;
import cn.datax.common.utils.MD5Util; import cn.datax.common.utils.MD5Util;
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.dto.RateLimit;
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.ParamType; import cn.datax.service.data.market.api.enums.ParamType;
import cn.datax.service.data.market.mapping.utils.ThreadUtil; import cn.datax.service.data.market.mapping.utils.ThreadUtil;
...@@ -80,11 +81,10 @@ public class RequestInterceptor { ...@@ -80,11 +81,10 @@ public class RequestInterceptor {
} }
// 限流校验 // 限流校验
String rateLimit = api.getRateLimit(); RateLimit rateLimit = api.getRateLimit();
rateLimit = Optional.ofNullable(rateLimit).orElse(DataConstant.TrueOrFalse.TRUE.getKey()); if (DataConstant.TrueOrFalse.TRUE.getKey().equals(rateLimit.getEnable())) {
if (DataConstant.TrueOrFalse.TRUE.getKey().equals(rateLimit)) { Integer times = rateLimit.getTimes();
Integer times = api.getTimes(); Integer seconds = rateLimit.getSeconds();
Integer seconds = api.getSeconds();
// 请求次数 // 请求次数
times = Optional.ofNullable(times).orElse(5); times = Optional.ofNullable(times).orElse(5);
// 请求时间范围60秒 // 请求时间范围60秒
......
<?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.market.api.call.dao.ApiLogDao"> <mapper namespace="cn.datax.service.data.market.mapping.dao.ApiLogDao">
<!-- 通用查询映射结果 --> <!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.datax.service.data.market.api.entity.ApiLogEntity"> <resultMap id="BaseResultMap" type="cn.datax.service.data.market.api.entity.ApiLogEntity">
...@@ -22,7 +22,29 @@ ...@@ -22,7 +22,29 @@
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id, id,
status, status,
api_id, api_name, caller_id, caller_ip, caller_url, caller_params, caller_date, callerSize, time, msg api_id, caller_id, caller_ip, caller_url, caller_params, caller_date, caller_size, time, msg
</sql> </sql>
<sql id="Log_Column_List">
${alias}.id,
${alias}.status,
${alias}.api_id, ${alias}.caller_id, ${alias}.caller_ip, ${alias}.caller_url, ${alias}.caller_params,
${alias}.caller_date, ${alias}.caller_size, ${alias}.time, ${alias}.msg
</sql>
<select id="selectById" resultMap="BaseResultMap">
SELECT api.api_name,
<include refid="Log_Column_List"><property name="alias" value="log"/></include>
FROM market_api_log log
LEFT JOIN market_api api ON api.id = log.api_id
WHERE 1 = 1 AND log.id = #{id}
</select>
<select id="selectPage" resultMap="BaseResultMap">
SELECT api.api_name,
<include refid="Log_Column_List"><property name="alias" value="log"/></include>
FROM market_api_log log
LEFT JOIN market_api api ON api.id = log.api_id
${ew.customSqlSegment}
</select>
</mapper> </mapper>
...@@ -84,6 +84,11 @@ ...@@ -84,6 +84,11 @@
<artifactId>datax-common-rabbitmq</artifactId> <artifactId>datax-common-rabbitmq</artifactId>
<version>2.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>data-metadata-service-api</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
...@@ -3,8 +3,10 @@ package cn.datax.service.data.market.service.impl; ...@@ -3,8 +3,10 @@ package cn.datax.service.data.market.service.impl;
import cn.datax.commo.office.word.WordUtil; import cn.datax.commo.office.word.WordUtil;
import cn.datax.common.core.DataConstant; import cn.datax.common.core.DataConstant;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.core.RedisConstant;
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;
import cn.datax.common.redis.service.RedisService;
import cn.datax.common.utils.MD5Util; import cn.datax.common.utils.MD5Util;
import cn.datax.common.utils.SecurityUtil; import cn.datax.common.utils.SecurityUtil;
import cn.datax.common.utils.ThrowableUtil; import cn.datax.common.utils.ThrowableUtil;
...@@ -17,6 +19,10 @@ import cn.datax.service.data.market.mapstruct.DataApiMapper; ...@@ -17,6 +19,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 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.hutool.core.util.StrUtil;
import com.aspose.words.Document; import com.aspose.words.Document;
import com.aspose.words.MailMerge; import com.aspose.words.MailMerge;
import com.aspose.words.net.System.Data.DataRow; import com.aspose.words.net.System.Data.DataRow;
...@@ -77,6 +83,9 @@ public class DataApiServiceImpl extends BaseServiceImpl<DataApiDao, DataApiEntit ...@@ -77,6 +83,9 @@ public class DataApiServiceImpl extends BaseServiceImpl<DataApiDao, DataApiEntit
@Autowired @Autowired
private ObjectMapper objectMapper; private ObjectMapper objectMapper;
@Autowired
private RedisService redisService;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void saveDataApi(DataApiDto dataApiDto) { public void saveDataApi(DataApiDto dataApiDto) {
...@@ -125,6 +134,7 @@ public class DataApiServiceImpl extends BaseServiceImpl<DataApiDao, DataApiEntit ...@@ -125,6 +134,7 @@ public class DataApiServiceImpl extends BaseServiceImpl<DataApiDao, DataApiEntit
@Override @Override
public SqlParseVo sqlParse(SqlParseDto sqlParseDto) { public SqlParseVo sqlParse(SqlParseDto sqlParseDto) {
String sourceId = sqlParseDto.getSourceId();
String sql = sqlParseDto.getSqlText(); String sql = sqlParseDto.getSqlText();
sql = sql.replace(SqlBuilderUtil.getInstance().MARK_KEY_START, ""); sql = sql.replace(SqlBuilderUtil.getInstance().MARK_KEY_START, "");
sql = sql.replace(SqlBuilderUtil.getInstance().MARK_KEY_END, ""); sql = sql.replace(SqlBuilderUtil.getInstance().MARK_KEY_END, "");
...@@ -157,21 +167,35 @@ public class DataApiServiceImpl extends BaseServiceImpl<DataApiDao, DataApiEntit ...@@ -157,21 +167,35 @@ public class DataApiServiceImpl extends BaseServiceImpl<DataApiDao, DataApiEntit
return reqParam; return reqParam;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
sqlParseVo.setReqParams(reqParams); sqlParseVo.setReqParams(reqParams);
List<ResParam> resParams = new ArrayList<>();
List<MetadataSourceEntity> sourceEntityList = (List<MetadataSourceEntity>) redisService.get(RedisConstant.METADATA_SOURCE_KEY);
MetadataSourceEntity sourceEntity = sourceEntityList.stream().filter(s -> sourceId.equals(s.getId())).findFirst().orElse(null);
if (sourceEntity != null) {
List<MetadataTableEntity> tableEntityList = (List<MetadataTableEntity>) redisService.hget(RedisConstant.METADATA_TABLE_KEY, sourceEntity.getId());
Map<String, List<Map<String, String>>> map = cols.stream().collect(Collectors.groupingBy(e -> e.get("tableName").toString())); Map<String, List<Map<String, String>>> map = cols.stream().collect(Collectors.groupingBy(e -> e.get("tableName").toString()));
for (Map.Entry<String, List<Map<String, String>>> entry : map.entrySet()) { for (Map.Entry<String, List<Map<String, String>>> entry : map.entrySet()) {
String entryKey = entry.getKey().toLowerCase(); String entryKey = entry.getKey().toLowerCase();
// 根据entryKey找到数据库表
List<Map<String, String>> entryValue = entry.getValue(); List<Map<String, String>> entryValue = entry.getValue();
entryValue.stream().map(m -> m.get("columnName")); MetadataTableEntity tableEntity = tableEntityList.stream().filter(t -> entryKey.equals(t.getTableName().toLowerCase())).findFirst().orElse(null);
} if (tableEntity != null) {
// List<ResParam> resParams = cols.stream().map(s -> { List<MetadataColumnEntity> columnEntityList = (List<MetadataColumnEntity>) redisService.hget(RedisConstant.METADATA_COLUMN_KEY, tableEntity.getId());
// ResParam resParam = new ResParam(); entryValue.stream().forEach(m -> {
// resParam.setFieldName(s); String columnName = m.get("columnName").toLowerCase();
// return resParam; String columnAliasName = m.get("columnAliasName");
// }).collect(Collectors.toList()); MetadataColumnEntity columnEntity = columnEntityList.stream().filter(c -> columnName.equals(c.getColumnName().toLowerCase())).findFirst().orElse(null);
// sqlParseVo.setResParams(resParams); if (columnEntity != null) {
ResParam resParam = new ResParam();
resParam.setFieldName(columnEntity.getColumnName());
resParam.setFieldComment(StrUtil.isNotBlank(columnEntity.getColumnComment()) ? columnEntity.getColumnComment() : "");
resParam.setDataType(StrUtil.isNotBlank(columnEntity.getDataType()) ? columnEntity.getDataType() : "");
resParam.setFieldAliasName(StrUtil.isNotBlank(columnAliasName) ? columnAliasName : "");
resParams.add(resParam);
}
});
}
}
}
sqlParseVo.setResParams(resParams);
return sqlParseVo; return sqlParseVo;
} }
......
package cn.datax.service.data.metadata.config; package cn.datax.service.data.metadata.config;
import cn.datax.common.core.RedisConstant;
import cn.datax.common.redis.service.RedisService;
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.dao.MetadataColumnDao;
import cn.datax.service.data.metadata.dao.MetadataSourceDao;
import cn.datax.service.data.metadata.dao.MetadataTableDao;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner; import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
...@@ -17,6 +31,21 @@ public class StartedUpRunner implements ApplicationRunner { ...@@ -17,6 +31,21 @@ public class StartedUpRunner implements ApplicationRunner {
private final ConfigurableApplicationContext context; private final ConfigurableApplicationContext context;
private final Environment environment; private final Environment environment;
@Autowired
private MetadataSourceDao metadataSourceDao;
@Autowired
private MetadataTableDao metadataTableDao;
@Autowired
private MetadataColumnDao metadataColumnDao;
@Autowired
private RedisService redisService;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Override @Override
public void run(ApplicationArguments args) { public void run(ApplicationArguments args) {
if (context.isActive()) { if (context.isActive()) {
...@@ -26,6 +55,30 @@ public class StartedUpRunner implements ApplicationRunner { ...@@ -26,6 +55,30 @@ public class StartedUpRunner implements ApplicationRunner {
"端口号:" + environment.getProperty("server.port") + "\n" + "端口号:" + environment.getProperty("server.port") + "\n" +
"-----------------------------------------"; "-----------------------------------------";
System.out.println(banner); System.out.println(banner);
// 项目启动时,初始化缓存
String sourceKey = RedisConstant.METADATA_SOURCE_KEY;
Boolean hasSourceKey = redisService.hasKey(sourceKey);
if (!hasSourceKey) {
List<MetadataSourceEntity> sourceEntityList = metadataSourceDao.selectList(Wrappers.emptyWrapper());
redisService.set(sourceKey, sourceEntityList);
}
String tableKey = RedisConstant.METADATA_TABLE_KEY;
Boolean hasTableKey = redisService.hasKey(tableKey);
if (!hasTableKey) {
List<MetadataTableEntity> tableEntityList = metadataTableDao.selectList(Wrappers.emptyWrapper());
Map<String, List<MetadataTableEntity>> tableListMap = tableEntityList.stream().collect(Collectors.groupingBy(MetadataTableEntity::getSourceId));
redisTemplate.opsForHash().putAll(tableKey, tableListMap);
}
String columnKey = RedisConstant.METADATA_COLUMN_KEY;
Boolean hasColumnKey = redisService.hasKey(columnKey);
if (!hasColumnKey) {
List<MetadataColumnEntity> columnEntityList = metadataColumnDao.selectList(Wrappers.emptyWrapper());
Map<String, List<MetadataColumnEntity>> columnListMap = columnEntityList.stream().collect(Collectors.groupingBy(MetadataColumnEntity::getTableId));
redisTemplate.opsForHash().putAll(columnKey, columnListMap);
}
} }
} }
} }
...@@ -238,4 +238,15 @@ public class MetadataSourceController extends BaseController { ...@@ -238,4 +238,15 @@ public class MetadataSourceController extends BaseController {
out.flush(); out.flush();
out.close(); out.close();
} }
/**
* 刷新参数缓存
*
* @return
*/
@GetMapping("/refresh")
public R refreshMetadata() {
metadataSourceService.refreshMetadata();
return R.ok();
}
} }
...@@ -41,4 +41,6 @@ public interface MetadataSourceService extends BaseService<MetadataSourceEntity> ...@@ -41,4 +41,6 @@ public interface MetadataSourceService extends BaseService<MetadataSourceEntity>
void syncMetadata(String id); void syncMetadata(String id);
Document wordMetadata(String id) throws Exception; Document wordMetadata(String id) throws Exception;
void refreshMetadata();
} }
...@@ -3,12 +3,14 @@ package cn.datax.service.data.metadata.service.impl; ...@@ -3,12 +3,14 @@ package cn.datax.service.data.metadata.service.impl;
import cn.datax.commo.office.word.WordUtil; import cn.datax.commo.office.word.WordUtil;
import cn.datax.common.base.BaseServiceImpl; import cn.datax.common.base.BaseServiceImpl;
import cn.datax.common.core.DataConstant; import cn.datax.common.core.DataConstant;
import cn.datax.common.core.RedisConstant;
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.common.exception.DataException; import cn.datax.common.exception.DataException;
import cn.datax.common.redis.service.RedisService;
import cn.datax.common.utils.SecurityUtil; import cn.datax.common.utils.SecurityUtil;
import cn.datax.service.data.metadata.api.dto.DbSchema; 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.dto.MetadataSourceDto;
...@@ -29,14 +31,18 @@ import com.aspose.words.net.System.Data.DataRow; ...@@ -29,14 +31,18 @@ import com.aspose.words.net.System.Data.DataRow;
import com.aspose.words.net.System.Data.DataSet; import com.aspose.words.net.System.Data.DataSet;
import com.aspose.words.net.System.Data.DataTable; import com.aspose.words.net.System.Data.DataTable;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.RedisTemplate;
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.InputStream; import java.io.InputStream;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/** /**
* <p> * <p>
...@@ -68,6 +74,12 @@ public class MetadataSourceServiceImpl extends BaseServiceImpl<MetadataSourceDao ...@@ -68,6 +74,12 @@ public class MetadataSourceServiceImpl extends BaseServiceImpl<MetadataSourceDao
@Autowired @Autowired
private MetadataColumnDao metadataColumnDao; private MetadataColumnDao metadataColumnDao;
@Autowired
private RedisService redisService;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void saveMetadataSource(MetadataSourceDto metadataSourceDto) { public void saveMetadataSource(MetadataSourceDto metadataSourceDto) {
...@@ -231,4 +243,33 @@ public class MetadataSourceServiceImpl extends BaseServiceImpl<MetadataSourceDao ...@@ -231,4 +243,33 @@ public class MetadataSourceServiceImpl extends BaseServiceImpl<MetadataSourceDao
WordUtil.getInstance().insertWatermarkText(doc, SecurityUtil.getUserName()); WordUtil.getInstance().insertWatermarkText(doc, SecurityUtil.getUserName());
return doc; return doc;
} }
@Override
public void refreshMetadata() {
String sourceKey = RedisConstant.METADATA_SOURCE_KEY;
Boolean hasSourceKey = redisService.hasKey(sourceKey);
if (hasSourceKey) {
redisService.del(sourceKey);
}
List<MetadataSourceEntity> sourceEntityList = metadataSourceDao.selectList(Wrappers.emptyWrapper());
redisService.set(sourceKey, sourceEntityList);
String tableKey = RedisConstant.METADATA_TABLE_KEY;
Boolean hasTableKey = redisService.hasKey(tableKey);
if (hasTableKey) {
redisService.del(tableKey);
}
List<MetadataTableEntity> tableEntityList = metadataTableDao.selectList(Wrappers.emptyWrapper());
Map<String, List<MetadataTableEntity>> tableListMap = tableEntityList.stream().collect(Collectors.groupingBy(MetadataTableEntity::getSourceId));
redisTemplate.opsForHash().putAll(tableKey, tableListMap);
String columnKey = RedisConstant.METADATA_COLUMN_KEY;
Boolean hasColumnKey = redisService.hasKey(columnKey);
if (hasColumnKey) {
redisService.del(columnKey);
}
List<MetadataColumnEntity> columnEntityList = metadataColumnDao.selectList(Wrappers.emptyWrapper());
Map<String, List<MetadataColumnEntity>> columnListMap = columnEntityList.stream().collect(Collectors.groupingBy(MetadataColumnEntity::getTableId));
redisTemplate.opsForHash().putAll(columnKey, columnListMap);
}
} }
...@@ -2,7 +2,6 @@ package cn.datax.service.system.dao; ...@@ -2,7 +2,6 @@ package cn.datax.service.system.dao;
import cn.datax.service.system.api.entity.DeptRelationEntity; import cn.datax.service.system.api.entity.DeptRelationEntity;
import cn.datax.common.base.BaseDao; import cn.datax.common.base.BaseDao;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List; import java.util.List;
...@@ -20,6 +19,5 @@ public interface DeptRelationDao extends BaseDao<DeptRelationEntity> { ...@@ -20,6 +19,5 @@ public interface DeptRelationDao extends BaseDao<DeptRelationEntity> {
void insertBatch(List<DeptRelationEntity> list); void insertBatch(List<DeptRelationEntity> list);
@Delete("delete from sys_dept_relation where ancestor = #{id}")
void deleteByAncestor(String id); void deleteByAncestor(String id);
} }
...@@ -2,7 +2,6 @@ package cn.datax.service.system.dao; ...@@ -2,7 +2,6 @@ package cn.datax.service.system.dao;
import cn.datax.service.system.api.entity.RoleDeptEntity; import cn.datax.service.system.api.entity.RoleDeptEntity;
import cn.datax.common.base.BaseDao; import cn.datax.common.base.BaseDao;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List; import java.util.List;
...@@ -20,11 +19,7 @@ public interface RoleDeptDao extends BaseDao<RoleDeptEntity> { ...@@ -20,11 +19,7 @@ public interface RoleDeptDao extends BaseDao<RoleDeptEntity> {
void insertBatch(List<RoleDeptEntity> list); void insertBatch(List<RoleDeptEntity> list);
@Delete("delete from sys_role_dept where role_id = #{id}")
void deleteByRoleId(String id); void deleteByRoleId(String id);
@Delete("<script>" +
"delete from sys_role_dept where role_id in <foreach collection='list' item='id' open='(' separator=',' close=')'>#{id}</foreach>" +
"</script>")
void deleteByRoleIds(List<String> ids); void deleteByRoleIds(List<String> ids);
} }
...@@ -2,7 +2,6 @@ package cn.datax.service.system.dao; ...@@ -2,7 +2,6 @@ package cn.datax.service.system.dao;
import cn.datax.service.system.api.entity.RoleMenuEntity; import cn.datax.service.system.api.entity.RoleMenuEntity;
import cn.datax.common.base.BaseDao; import cn.datax.common.base.BaseDao;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List; import java.util.List;
...@@ -20,11 +19,7 @@ public interface RoleMenuDao extends BaseDao<RoleMenuEntity> { ...@@ -20,11 +19,7 @@ public interface RoleMenuDao extends BaseDao<RoleMenuEntity> {
void insertBatch(List<RoleMenuEntity> list); void insertBatch(List<RoleMenuEntity> list);
@Delete("delete from sys_role_menu where role_id = #{id}")
void deleteByRoleId(String id); void deleteByRoleId(String id);
@Delete("<script>" +
"delete from sys_role_menu where role_id in <foreach collection='list' item='id' open='(' separator=',' close=')'>#{id}</foreach>" +
"</script>")
void deleteByRoleIds(List<String> ids); void deleteByRoleIds(List<String> ids);
} }
...@@ -2,7 +2,6 @@ package cn.datax.service.system.dao; ...@@ -2,7 +2,6 @@ package cn.datax.service.system.dao;
import cn.datax.service.system.api.entity.UserPostEntity; import cn.datax.service.system.api.entity.UserPostEntity;
import cn.datax.common.base.BaseDao; import cn.datax.common.base.BaseDao;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List; import java.util.List;
...@@ -20,11 +19,7 @@ public interface UserPostDao extends BaseDao<UserPostEntity> { ...@@ -20,11 +19,7 @@ public interface UserPostDao extends BaseDao<UserPostEntity> {
void insertBatch(List<UserPostEntity> list); void insertBatch(List<UserPostEntity> list);
@Delete("delete from sys_user_post where user_id = #{id}")
void deleteByUserId(String id); void deleteByUserId(String id);
@Delete("<script>" +
"delete from sys_user_post where user_id in <foreach collection='list' item='id' open='(' separator=',' close=')'>#{id}</foreach>" +
"</script>")
void deleteByUserIds(List<String> ids); void deleteByUserIds(List<String> ids);
} }
...@@ -2,7 +2,6 @@ package cn.datax.service.system.dao; ...@@ -2,7 +2,6 @@ package cn.datax.service.system.dao;
import cn.datax.common.base.BaseDao; import cn.datax.common.base.BaseDao;
import cn.datax.service.system.api.entity.UserRoleEntity; import cn.datax.service.system.api.entity.UserRoleEntity;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List; import java.util.List;
...@@ -20,11 +19,7 @@ public interface UserRoleDao extends BaseDao<UserRoleEntity> { ...@@ -20,11 +19,7 @@ public interface UserRoleDao extends BaseDao<UserRoleEntity> {
void insertBatch(List<UserRoleEntity> list); void insertBatch(List<UserRoleEntity> list);
@Delete("delete from sys_user_role where user_id = #{id}")
void deleteByUserId(String id); void deleteByUserId(String id);
@Delete("<script>" +
"delete from sys_user_role where user_id in <foreach collection='list' item='id' open='(' separator=',' close=')'>#{id}</foreach>" +
"</script>")
void deleteByUserIds(List<String> ids); void deleteByUserIds(List<String> ids);
} }
...@@ -24,4 +24,8 @@ ...@@ -24,4 +24,8 @@
</foreach> </foreach>
</insert> </insert>
<delete id="deleteByAncestor">
DELETE FROM sys_dept_relation WHERE ancestor = #{id}
</delete>
</mapper> </mapper>
...@@ -24,4 +24,15 @@ ...@@ -24,4 +24,15 @@
</foreach> </foreach>
</insert> </insert>
<delete id="deleteByRoleId">
DELETE FROM sys_role_dept WHERE role_id = #{id}
</delete>
<delete id="deleteByRoleIds">
DELETE FROM sys_role_dept WHERE role_id IN
<foreach collection='list' item='id' open='(' separator=',' close=')'>
#{id}
</foreach>
</delete>
</mapper> </mapper>
...@@ -24,4 +24,15 @@ ...@@ -24,4 +24,15 @@
</foreach> </foreach>
</insert> </insert>
<delete id="deleteByRoleId">
DELETE FROM sys_role_menu WHERE role_id = #{id}
</delete>
<delete id="deleteByRoleIds">
DELETE FROM sys_role_menu WHERE role_id in
<foreach collection='list' item='id' open='(' separator=',' close=')'>
#{id}
</foreach>
</delete>
</mapper> </mapper>
...@@ -24,4 +24,15 @@ ...@@ -24,4 +24,15 @@
</foreach> </foreach>
</insert> </insert>
<delete id="deleteByUserId">
DELETE FROM sys_user_post WHERE user_id = #{id}
</delete>
<delete id="deleteByUserIds">
DELETE FROM sys_user_post WHERE user_id in
<foreach collection='list' item='id' open='(' separator=',' close=')'>
#{id}
</foreach>
</delete>
</mapper> </mapper>
...@@ -24,4 +24,15 @@ ...@@ -24,4 +24,15 @@
</foreach> </foreach>
</insert> </insert>
<delete id="deleteByUserId">
DELETE FROM sys_user_role WHERE user_id = #{id}
</delete>
<delete id="deleteByUserIds">
DELETE FROM sys_user_role WHERE user_id in
<foreach collection='list' item='id' open='(' separator=',' close=')'>
#{id}
</foreach>
</delete>
</mapper> </mapper>
...@@ -23,7 +23,9 @@ ...@@ -23,7 +23,9 @@
<div class="right-menu"> <div class="right-menu">
<screenfull id="screenfull" class="right-menu-btn" /> <screenfull id="screenfull" class="right-menu-btn" />
<span class="right-menu-btn"> <span class="right-menu-btn">
<el-badge is-dot class="badge">
<i class="el-icon-bell"></i> <i class="el-icon-bell"></i>
</el-badge>
</span> </span>
<el-dropdown> <el-dropdown>
<span class="right-menu-btn"> <span class="right-menu-btn">
......
...@@ -47,6 +47,11 @@ ...@@ -47,6 +47,11 @@
cursor: pointer; cursor: pointer;
padding: 0 14px; padding: 0 14px;
color: #fff; color: #fff;
.badge {
.el-badge__content {
margin-top: 10px;
}
}
&:hover { &:hover {
background-color: mix(#000, #0086f1, 10%); background-color: mix(#000, #0086f1, 10%);
} }
......
...@@ -48,6 +48,7 @@ service.interceptors.response.use( ...@@ -48,6 +48,7 @@ service.interceptors.response.use(
}, },
error => { error => {
loadingInstance.close() loadingInstance.close()
console.log(error.response)
if (error.response.status) { if (error.response.status) {
switch (error.response.status) { switch (error.response.status) {
// 401: 未登录 // 401: 未登录
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="IP黑名单" prop="deny"> <el-form-item label="IP黑名单" prop="deny">
<el-input v-model="form1.deny" type="textarea" placeholder="请输入IP黑名单多个用隔开" /> <el-input v-model="form1.deny" type="textarea" placeholder="请输入IP黑名单多个用英文,隔开" />
</el-form-item> </el-form-item>
<el-form-item label="是否限流" prop="rateLimit"> <el-form-item label="是否限流" prop="rateLimit">
<el-radio-group v-model="form1.rateLimit.enable"> <el-radio-group v-model="form1.rateLimit.enable">
...@@ -56,11 +56,9 @@ ...@@ -56,11 +56,9 @@
>{{ dict.itemValue }}</el-radio> >{{ dict.itemValue }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item v-if="form1.rateLimit.enable === '1'" label="请求次数" prop="times"> <el-form-item v-if="form1.rateLimit.enable === '1'" label="限流配置">
<el-input-number v-model="form1.rateLimit.times" controls-position="right" :min="1" /> <el-input-number v-model="form1.rateLimit.seconds" controls-position="right" :min="1" />秒内限制请求
</el-form-item> <el-input-number v-model="form1.rateLimit.times" controls-position="right" :min="1" />
<el-form-item v-if="form1.rateLimit.enable === '1'" label="请求时间范围" prop="seconds">
<el-input-number v-model="form1.rateLimit.seconds" controls-position="right" :min="1" />
</el-form-item> </el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-radio-group v-model="form1.status" disabled> <el-radio-group v-model="form1.status" disabled>
...@@ -500,23 +498,13 @@ export default { ...@@ -500,23 +498,13 @@ export default {
return return
} }
const data = {} const data = {}
data.sourceId = this.form2.sourceId
data.sqlText = this.form2.sqlText data.sqlText = this.form2.sqlText
sqlParse(data).then(response => { sqlParse(data).then(response => {
if (response.success) { if (response.success) {
const { data } = response const { data } = response
const reqParams = data.reqParams this.form3.reqParams = data.reqParams
const resParams = data.resParams this.form3.resParams = data.resParams
this.form3.reqParams = reqParams.map(function(item) {
const json = {}
json.paramName = item.paramName
json.nullable = '0'
return json
})
this.form3.resParams = resParams.map(function(item) {
const json = {}
json.fieldName = item.fieldName
return json
})
this.$message.success('解析成功,请进行下一步') this.$message.success('解析成功,请进行下一步')
} }
}) })
......
...@@ -11,11 +11,11 @@ ...@@ -11,11 +11,11 @@
</div> </div>
<div :style="classCardbody"> <div :style="classCardbody">
<el-steps :active="active" finish-status="success" align-center> <el-steps :active="active" finish-status="success" align-center>
<el-step title="属性配置"></el-step> <el-step title="属性配置" />
<el-step title="执行配置"></el-step> <el-step title="执行配置" />
<el-step title="参数配置"></el-step> <el-step title="参数配置" />
</el-steps> </el-steps>
<el-form ref="form1" :model="form1" label-width="80px" v-if="active == 1" disabled> <el-form v-if="active == 1" ref="form1" :model="form1" label-width="80px" disabled>
<el-form-item label="API名称" prop="apiName"> <el-form-item label="API名称" prop="apiName">
<el-input v-model="form1.apiName" placeholder="请输入API名称" /> <el-input v-model="form1.apiName" placeholder="请输入API名称" />
</el-form-item> </el-form-item>
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
:key="dict.id" :key="dict.id"
:label="dict.itemValue" :label="dict.itemValue"
:value="dict.itemText" :value="dict.itemText"
></el-option> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="返回格式" prop="resType"> <el-form-item label="返回格式" prop="resType">
...@@ -42,11 +42,11 @@ ...@@ -42,11 +42,11 @@
:key="dict.id" :key="dict.id"
:label="dict.itemValue" :label="dict.itemValue"
:value="dict.itemText" :value="dict.itemText"
></el-option> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="IP黑名单" prop="deny"> <el-form-item label="IP黑名单" prop="deny">
<el-input v-model="form1.deny" type="textarea" placeholder="请输入IP黑名单多个用隔开" /> <el-input v-model="form1.deny" type="textarea" placeholder="请输入IP黑名单多个用英文,隔开" />
</el-form-item> </el-form-item>
<el-form-item label="是否限流" prop="rateLimit"> <el-form-item label="是否限流" prop="rateLimit">
<el-radio-group v-model="form1.rateLimit.enable"> <el-radio-group v-model="form1.rateLimit.enable">
...@@ -57,11 +57,9 @@ ...@@ -57,11 +57,9 @@
>{{ dict.itemValue }}</el-radio> >{{ dict.itemValue }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item v-if="form1.rateLimit.enable === '1'" label="请求次数" prop="times"> <el-form-item v-if="form1.rateLimit.enable === '1'" label="限流配置">
<el-input-number v-model="form1.rateLimit.times" controls-position="right" :min="1" /> <el-input-number v-model="form1.rateLimit.seconds" controls-position="right" :min="1" />秒内限制请求
</el-form-item> <el-input-number v-model="form1.rateLimit.times" controls-position="right" :min="1" />
<el-form-item v-if="form1.rateLimit.enable === '1'" label="请求时间范围" prop="seconds">
<el-input-number v-model="form1.rateLimit.seconds" controls-position="right" :min="1" />
</el-form-item> </el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-radio-group v-model="form1.status"> <el-radio-group v-model="form1.status">
...@@ -69,14 +67,14 @@ ...@@ -69,14 +67,14 @@
v-for="dict in statusOptions" v-for="dict in statusOptions"
:key="dict.id" :key="dict.id"
:label="dict.itemText" :label="dict.itemText"
>{{dict.itemValue}}</el-radio> >{{ dict.itemValue }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="form1.remark" type="textarea" placeholder="请输入内容" /> <el-input v-model="form1.remark" type="textarea" placeholder="请输入内容" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-form ref="form2" :model="form2" label-width="80px" v-if="active == 2" disabled> <el-form v-if="active == 2" ref="form2" :model="form2" label-width="80px" disabled>
<el-form-item label="配置方式" prop="configType"> <el-form-item label="配置方式" prop="configType">
<el-select v-model="form2.configType" placeholder="请选择配置方式"> <el-select v-model="form2.configType" placeholder="请选择配置方式">
<el-option <el-option
...@@ -84,7 +82,7 @@ ...@@ -84,7 +82,7 @@
:key="dict.id" :key="dict.id"
:label="dict.itemValue" :label="dict.itemValue"
:value="dict.itemText" :value="dict.itemText"
></el-option> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="数据源" prop="sourceId"> <el-form-item label="数据源" prop="sourceId">
...@@ -95,59 +93,55 @@ ...@@ -95,59 +93,55 @@
:label="source.sourceName" :label="source.sourceName"
:value="source.id" :value="source.id"
:disabled="source.status === '0'" :disabled="source.status === '0'"
></el-option> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="数据库表" prop="tableName" v-if="form2.configType === '1'"> <el-form-item v-if="form2.configType === '1'" label="数据库表" prop="tableName">
<el-select v-model="form2.table" value-key="id" placeholder="请选择数据库表"> <el-select v-model="form2.table" value-key="id" placeholder="请选择数据库表">
<el-option <el-option
v-for="item in tableOptions" v-for="item in tableOptions"
:key="item.id" :key="item.id"
:label="item.tableComment ? item.tableComment : item.tableName" :label="item.tableComment ? item.tableComment : item.tableName"
:value="item"> :value="item"
</el-option> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="字段列表" v-if="form2.configType === '1'"> <el-form-item v-if="form2.configType === '1'" label="字段列表">
<el-table :data="form2.fieldParams" stripe border <el-table
:data="form2.fieldParams"
stripe
border
:max-height="300" :max-height="300"
style="width: 100%; margin: 15px 0;"> style="width: 100%; margin: 15px 0;"
<el-table-column prop="columnPosition" label="序号" width="55" align="center" > >
</el-table-column> <el-table-column prop="columnPosition" label="序号" width="55" align="center" />
<el-table-column prop="columnName" label="列名" align="center" show-overflow-tooltip > <el-table-column prop="columnName" label="列名" align="center" show-overflow-tooltip />
</el-table-column> <el-table-column prop="dataType" label="数据类型" align="center" show-overflow-tooltip />
<el-table-column prop="dataType" label="数据类型" align="center" show-overflow-tooltip > <el-table-column prop="dataLength" label="数据长度" align="center" show-overflow-tooltip />
</el-table-column> <el-table-column prop="dataPrecision" label="数据精度" align="center" show-overflow-tooltip />
<el-table-column prop="dataLength" label="数据长度" align="center" show-overflow-tooltip > <el-table-column prop="dataScale" label="数据小数位" align="center" show-overflow-tooltip />
</el-table-column> <el-table-column prop="columnKey" label="是否主键" align="center" show-overflow-tooltip>
<el-table-column prop="dataPrecision" label="数据精度" align="center" show-overflow-tooltip >
</el-table-column>
<el-table-column prop="dataScale" label="数据小数位" align="center" show-overflow-tooltip >
</el-table-column>
<el-table-column prop="columnKey" label="是否主键" align="center" show-overflow-tooltip >
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.columnKey === '1'">Y</span> <span v-if="scope.row.columnKey === '1'">Y</span>
<span v-if="scope.row.columnKey === '0'">N</span> <span v-if="scope.row.columnKey === '0'">N</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="columnNullable" label="是否允许为空" align="center" show-overflow-tooltip > <el-table-column prop="columnNullable" label="是否允许为空" align="center" show-overflow-tooltip>
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.columnNullable === '1'">Y</span> <span v-if="scope.row.columnNullable === '1'">Y</span>
<span v-if="scope.row.columnNullable === '0'">N</span> <span v-if="scope.row.columnNullable === '0'">N</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="dataDefault" label="列默认值" align="center" show-overflow-tooltip > <el-table-column prop="dataDefault" label="列默认值" align="center" show-overflow-tooltip />
</el-table-column> <el-table-column prop="columnComment" label="列注释" align="center" show-overflow-tooltip />
<el-table-column prop="columnComment" label="列注释" align="center" show-overflow-tooltip > <el-table-column prop="reqable" label="是否作为请求参数" align="center" width="50">
</el-table-column>
<el-table-column prop="reqable" label="是否作为请求参数" align="center" width="50" >
<template slot-scope="scope"> <template slot-scope="scope">
<el-checkbox v-model="scope.row.reqable" true-label="1" false-label="0"></el-checkbox> <el-checkbox v-model="scope.row.reqable" true-label="1" false-label="0" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="resable" label="是否作为返回参数" align="center" width="50" > <el-table-column prop="resable" label="是否作为返回参数" align="center" width="50">
<template slot-scope="scope"> <template slot-scope="scope">
<el-checkbox v-model="scope.row.resable" true-label="1" false-label="0"></el-checkbox> <el-checkbox v-model="scope.row.resable" true-label="1" false-label="0" />
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
...@@ -157,32 +151,34 @@ ...@@ -157,32 +151,34 @@
<sql-editor <sql-editor
ref="sqleditor" ref="sqleditor"
:value="form2.sqlText" :value="form2.sqlText"
:readOnly="true" :read-only="true"
style="height: 300px;margin: 10px 10px;" style="height: 300px;margin: 10px 10px;"
></sql-editor> />
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
<el-form ref="form3" :model="form3" label-width="80px" v-if="active == 3" disabled> <el-form v-if="active == 3" ref="form3" :model="form3" label-width="80px" disabled>
<el-divider content-position="left">请求参数</el-divider> <el-divider content-position="left">请求参数</el-divider>
<el-table :data="form3.reqParams" stripe border <el-table
:data="form3.reqParams"
stripe
border
:max-height="300" :max-height="300"
style="width: 100%; margin: 15px 0;"> style="width: 100%; margin: 15px 0;"
>
<el-table-column label="序号" width="55" align="center"> <el-table-column label="序号" width="55" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ scope.$index +1 }}</span> <span>{{ scope.$index +1 }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="paramName" label="参数名称" align="center" show-overflow-tooltip > <el-table-column prop="paramName" label="参数名称" align="center" show-overflow-tooltip />
</el-table-column> <el-table-column prop="nullable" label="是否允许为空" align="center" show-overflow-tooltip>
<el-table-column prop="nullable" label="是否允许为空" align="center" show-overflow-tooltip >
<template slot-scope="scope"> <template slot-scope="scope">
<el-checkbox v-model="scope.row.nullable" true-label="1" false-label="0"></el-checkbox> <el-checkbox v-model="scope.row.nullable" true-label="1" false-label="0" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="paramComment" label="描述" align="center" show-overflow-tooltip > <el-table-column prop="paramComment" label="描述" align="center" show-overflow-tooltip />
</el-table-column> <el-table-column prop="paramType" label="参数类型" align="center" show-overflow-tooltip>
<el-table-column prop="paramType" label="参数类型" align="center" show-overflow-tooltip >
<template slot-scope="scope"> <template slot-scope="scope">
<el-select v-model="scope.row.paramType" placeholder="请选择参数类型"> <el-select v-model="scope.row.paramType" placeholder="请选择参数类型">
<el-option <el-option
...@@ -190,11 +186,11 @@ ...@@ -190,11 +186,11 @@
:key="dict.id" :key="dict.id"
:label="dict.itemValue" :label="dict.itemValue"
:value="dict.itemText" :value="dict.itemText"
></el-option> />
</el-select> </el-select>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="whereType" label="操作符" align="center" show-overflow-tooltip > <el-table-column prop="whereType" label="操作符" align="center" show-overflow-tooltip>
<template slot-scope="scope"> <template slot-scope="scope">
<el-select v-model="scope.row.whereType" placeholder="请选择操作符"> <el-select v-model="scope.row.whereType" placeholder="请选择操作符">
<el-option <el-option
...@@ -202,36 +198,34 @@ ...@@ -202,36 +198,34 @@
:key="dict.id" :key="dict.id"
:label="dict.itemValue" :label="dict.itemValue"
:value="dict.itemText" :value="dict.itemText"
></el-option> />
</el-select> </el-select>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="exampleValue" label="示例值" align="center" show-overflow-tooltip > <el-table-column prop="exampleValue" label="示例值" align="center" show-overflow-tooltip />
</el-table-column> <el-table-column prop="defaultValue" label="默认值" align="center" show-overflow-tooltip />
<el-table-column prop="defaultValue" label="默认值" align="center" show-overflow-tooltip >
</el-table-column>
</el-table> </el-table>
<el-divider content-position="left">返回字段</el-divider> <el-divider content-position="left">返回字段</el-divider>
<el-table :data="form3.resParams" stripe border <el-table
:data="form3.resParams"
stripe
border
:max-height="300" :max-height="300"
style="width: 100%; margin: 15px 0;"> style="width: 100%; margin: 15px 0;"
>
<el-table-column label="序号" width="55" align="center"> <el-table-column label="序号" width="55" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ scope.$index +1 }}</span> <span>{{ scope.$index +1 }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="fieldName" label="字段名称" align="center" show-overflow-tooltip > <el-table-column prop="fieldName" label="字段名称" align="center" show-overflow-tooltip />
</el-table-column> <el-table-column prop="fieldComment" label="描述" align="center" show-overflow-tooltip />
<el-table-column prop="fieldComment" label="描述" align="center" show-overflow-tooltip > <el-table-column prop="dataType" label="数据类型" align="center" show-overflow-tooltip />
</el-table-column> <el-table-column prop="exampleValue" label="示例值" align="center" show-overflow-tooltip />
<el-table-column prop="dataType" label="数据类型" align="center" show-overflow-tooltip >
</el-table-column>
<el-table-column prop="exampleValue" label="示例值" align="center" show-overflow-tooltip >
</el-table-column>
</el-table> </el-table>
</el-form> </el-form>
<el-button style="margin-top: 12px;" @click="handleNextStep" v-if="active < 3">下一步</el-button> <el-button v-if="active < 3" style="margin-top: 12px;" @click="handleNextStep">下一步</el-button>
<el-button style="margin-top: 12px;" @click="handleLastStep" v-if="active > 1">上一步</el-button> <el-button v-if="active > 1" style="margin-top: 12px;" @click="handleLastStep">上一步</el-button>
</div> </div>
</el-card> </el-card>
</div> </div>
...@@ -241,7 +235,6 @@ ...@@ -241,7 +235,6 @@
import { getDataApi, word } from '@/api/market/dataapi' import { getDataApi, word } from '@/api/market/dataapi'
import { listDataSource } from '@/api/metadata/datasource' import { listDataSource } from '@/api/metadata/datasource'
import { listDataTable } from '@/api/metadata/datatable' import { listDataTable } from '@/api/metadata/datatable'
import { listDataColumn } from '@/api/metadata/datacolumn'
import SqlEditor from '@/components/SqlEditor' import SqlEditor from '@/components/SqlEditor'
export default { export default {
...@@ -252,12 +245,12 @@ export default { ...@@ -252,12 +245,12 @@ export default {
props: { props: {
data: { data: {
type: Object, type: Object,
default: function () { default: function() {
return {} return {}
} }
} }
}, },
data () { data() {
return { return {
classCardbody: { classCardbody: {
overflow: 'auto', overflow: 'auto',
...@@ -354,7 +347,7 @@ export default { ...@@ -354,7 +347,7 @@ export default {
paramTypeOptions: [] paramTypeOptions: []
} }
}, },
created () { created() {
console.log('id:' + this.data.id) console.log('id:' + this.data.id)
this.getDicts('data_req_method').then(response => { this.getDicts('data_req_method').then(response => {
if (response.success) { if (response.success) {
...@@ -393,14 +386,14 @@ export default { ...@@ -393,14 +386,14 @@ export default {
} }
}) })
}, },
mounted () { mounted() {
this.getDataApi(this.data.id) this.getDataApi(this.data.id)
}, },
methods: { methods: {
showCard () { showCard() {
this.$emit('showCard', this.showOptions) this.$emit('showCard', this.showOptions)
}, },
getDataSourceList () { getDataSourceList() {
listDataSource().then(response => { listDataSource().then(response => {
if (response.success) { if (response.success) {
this.sourceOptions = response.data this.sourceOptions = response.data
...@@ -408,33 +401,33 @@ export default { ...@@ -408,33 +401,33 @@ export default {
}) })
}, },
/** 步骤条下一步 */ /** 步骤条下一步 */
handleNextStep () { handleNextStep() {
this.active++ this.active++
}, },
/** 步骤条上一步 */ /** 步骤条上一步 */
handleLastStep () { handleLastStep() {
this.active-- this.active--
}, },
/** 获取详情 */ /** 获取详情 */
async getDataApi (id) { async getDataApi(id) {
this.form1 = await getDataApi(id).then(response => { this.form1 = await getDataApi(id).then(response => {
if (response.success) { if (response.success) {
return response.data return response.data
} }
}) || {} }) || {}
this.form2 = this.form1.executeConfig this.form2 = this.form1.executeConfig
this.form2.table = {id: this.form2.tableId} this.form2.table = { id: this.form2.tableId }
this.form3.reqParams = this.form1.reqParams this.form3.reqParams = this.form1.reqParams
this.form3.resParams = this.form1.resParams this.form3.resParams = this.form1.resParams
if (this.form2.configType === '1') { if (this.form2.configType === '1') {
this.tableOptions = await listDataTable({sourceId: this.form2.sourceId}).then(response => { this.tableOptions = await listDataTable({ sourceId: this.form2.sourceId }).then(response => {
if (response.success) { if (response.success) {
return response.data return response.data
} }
}) || [] }) || []
} }
}, },
apiTry () { apiTry() {
this.showOptions.data.id = this.data.id this.showOptions.data.id = this.data.id
this.showOptions.showList = false this.showOptions.showList = false
this.showOptions.showAdd = false this.showOptions.showAdd = false
...@@ -444,7 +437,7 @@ export default { ...@@ -444,7 +437,7 @@ export default {
this.$emit('showCard', this.showOptions) this.$emit('showCard', this.showOptions)
}, },
/** 接口文档 */ /** 接口文档 */
handleWord () { 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 = '接口文档.docx' const fileName = '接口文档.docx'
......
...@@ -4,17 +4,17 @@ ...@@ -4,17 +4,17 @@
<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-plus" round @click="submitForm" :loading="loadingOptions.loading" :disabled="loadingOptions.isDisabled">{{loadingOptions.loadingText}}</el-button> <el-button size="mini" icon="el-icon-plus" round :loading="loadingOptions.loading" :disabled="loadingOptions.isDisabled" @click="submitForm">{{ loadingOptions.loadingText }}</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>
</div> </div>
<div :style="classCardbody"> <div :style="classCardbody">
<el-steps :active="active" finish-status="success" align-center> <el-steps :active="active" finish-status="success" align-center>
<el-step title="属性配置"></el-step> <el-step title="属性配置" />
<el-step title="执行配置"></el-step> <el-step title="执行配置" />
<el-step title="参数配置"></el-step> <el-step title="参数配置" />
</el-steps> </el-steps>
<el-form ref="form1" :model="form1" :rules="rules1" label-width="80px" v-if="active == 1"> <el-form v-if="active == 1" ref="form1" :model="form1" :rules="rules1" label-width="80px">
<el-form-item label="API名称" prop="apiName"> <el-form-item label="API名称" prop="apiName">
<el-input v-model="form1.apiName" placeholder="请输入API名称" /> <el-input v-model="form1.apiName" placeholder="请输入API名称" />
</el-form-item> </el-form-item>
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
:key="dict.id" :key="dict.id"
:label="dict.itemValue" :label="dict.itemValue"
:value="dict.itemText" :value="dict.itemText"
></el-option> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="返回格式" prop="resType"> <el-form-item label="返回格式" prop="resType">
...@@ -41,11 +41,11 @@ ...@@ -41,11 +41,11 @@
:key="dict.id" :key="dict.id"
:label="dict.itemValue" :label="dict.itemValue"
:value="dict.itemText" :value="dict.itemText"
></el-option> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="IP黑名单" prop="deny"> <el-form-item label="IP黑名单" prop="deny">
<el-input v-model="form1.deny" type="textarea" placeholder="请输入IP黑名单多个用隔开" /> <el-input v-model="form1.deny" type="textarea" placeholder="请输入IP黑名单多个用英文,隔开" />
</el-form-item> </el-form-item>
<el-form-item label="是否限流" prop="rateLimit"> <el-form-item label="是否限流" prop="rateLimit">
<el-radio-group v-model="form1.rateLimit.enable"> <el-radio-group v-model="form1.rateLimit.enable">
...@@ -56,11 +56,9 @@ ...@@ -56,11 +56,9 @@
>{{ dict.itemValue }}</el-radio> >{{ dict.itemValue }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item v-if="form1.rateLimit.enable === '1'" label="请求次数" prop="times"> <el-form-item v-if="form1.rateLimit.enable === '1'" label="限流配置">
<el-input-number v-model="form1.rateLimit.times" controls-position="right" :min="1" /> <el-input-number v-model="form1.rateLimit.seconds" controls-position="right" :min="1" />秒内限制请求
</el-form-item> <el-input-number v-model="form1.rateLimit.times" controls-position="right" :min="1" />
<el-form-item v-if="form1.rateLimit.enable === '1'" label="请求时间范围" prop="seconds">
<el-input-number v-model="form1.rateLimit.seconds" controls-position="right" :min="1" />
</el-form-item> </el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-radio-group v-model="form1.status" disabled> <el-radio-group v-model="form1.status" disabled>
...@@ -68,14 +66,14 @@ ...@@ -68,14 +66,14 @@
v-for="dict in statusOptions" v-for="dict in statusOptions"
:key="dict.id" :key="dict.id"
:label="dict.itemText" :label="dict.itemText"
>{{dict.itemValue}}</el-radio> >{{ dict.itemValue }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="form1.remark" type="textarea" placeholder="请输入内容" /> <el-input v-model="form1.remark" type="textarea" placeholder="请输入内容" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-form ref="form2" :model="form2" :rules="rules2" label-width="80px" v-if="active == 2"> <el-form v-if="active == 2" ref="form2" :model="form2" :rules="rules2" label-width="80px">
<el-form-item label="配置方式" prop="configType"> <el-form-item label="配置方式" prop="configType">
<el-select v-model="form2.configType" placeholder="请选择配置方式" @change="configTypeSelectChanged"> <el-select v-model="form2.configType" placeholder="请选择配置方式" @change="configTypeSelectChanged">
<el-option <el-option
...@@ -83,7 +81,7 @@ ...@@ -83,7 +81,7 @@
:key="dict.id" :key="dict.id"
:label="dict.itemValue" :label="dict.itemValue"
:value="dict.itemText" :value="dict.itemText"
></el-option> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="数据源" prop="sourceId"> <el-form-item label="数据源" prop="sourceId">
...@@ -94,59 +92,55 @@ ...@@ -94,59 +92,55 @@
:label="source.sourceName" :label="source.sourceName"
:value="source.id" :value="source.id"
:disabled="source.status === '0'" :disabled="source.status === '0'"
></el-option> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="数据库表" prop="tableName" v-if="form2.configType === '1'"> <el-form-item v-if="form2.configType === '1'" label="数据库表" prop="tableName">
<el-select v-model="form2.table" value-key="id" placeholder="请选择数据库表" @change="tableSelectChanged"> <el-select v-model="form2.table" value-key="id" placeholder="请选择数据库表" @change="tableSelectChanged">
<el-option <el-option
v-for="item in tableOptions" v-for="item in tableOptions"
:key="item.id" :key="item.id"
:label="item.tableComment ? item.tableComment : item.tableName" :label="item.tableComment ? item.tableComment : item.tableName"
:value="item"> :value="item"
</el-option> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="字段列表" v-if="form2.configType === '1'"> <el-form-item v-if="form2.configType === '1'" label="字段列表">
<el-table :data="form2.fieldParams" stripe border <el-table
:data="form2.fieldParams"
stripe
border
:max-height="300" :max-height="300"
style="width: 100%; margin: 15px 0;"> style="width: 100%; margin: 15px 0;"
<el-table-column prop="columnPosition" label="序号" width="55" align="center" > >
</el-table-column> <el-table-column prop="columnPosition" label="序号" width="55" align="center" />
<el-table-column prop="columnName" label="列名" align="center" show-overflow-tooltip > <el-table-column prop="columnName" label="列名" align="center" show-overflow-tooltip />
</el-table-column> <el-table-column prop="dataType" label="数据类型" align="center" show-overflow-tooltip />
<el-table-column prop="dataType" label="数据类型" align="center" show-overflow-tooltip > <el-table-column prop="dataLength" label="数据长度" align="center" show-overflow-tooltip />
</el-table-column> <el-table-column prop="dataPrecision" label="数据精度" align="center" show-overflow-tooltip />
<el-table-column prop="dataLength" label="数据长度" align="center" show-overflow-tooltip > <el-table-column prop="dataScale" label="数据小数位" align="center" show-overflow-tooltip />
</el-table-column> <el-table-column prop="columnKey" label="是否主键" align="center" show-overflow-tooltip>
<el-table-column prop="dataPrecision" label="数据精度" align="center" show-overflow-tooltip >
</el-table-column>
<el-table-column prop="dataScale" label="数据小数位" align="center" show-overflow-tooltip >
</el-table-column>
<el-table-column prop="columnKey" label="是否主键" align="center" show-overflow-tooltip >
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.columnKey === '1'">Y</span> <span v-if="scope.row.columnKey === '1'">Y</span>
<span v-if="scope.row.columnKey === '0'">N</span> <span v-if="scope.row.columnKey === '0'">N</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="columnNullable" label="是否允许为空" align="center" show-overflow-tooltip > <el-table-column prop="columnNullable" label="是否允许为空" align="center" show-overflow-tooltip>
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.columnNullable === '1'">Y</span> <span v-if="scope.row.columnNullable === '1'">Y</span>
<span v-if="scope.row.columnNullable === '0'">N</span> <span v-if="scope.row.columnNullable === '0'">N</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="dataDefault" label="列默认值" align="center" show-overflow-tooltip > <el-table-column prop="dataDefault" label="列默认值" align="center" show-overflow-tooltip />
</el-table-column> <el-table-column prop="columnComment" label="列注释" align="center" show-overflow-tooltip />
<el-table-column prop="columnComment" label="列注释" align="center" show-overflow-tooltip > <el-table-column prop="reqable" label="是否作为请求参数" align="center" width="50">
</el-table-column>
<el-table-column prop="reqable" label="是否作为请求参数" align="center" width="50" >
<template slot-scope="scope"> <template slot-scope="scope">
<el-checkbox v-model="scope.row.reqable" true-label="1" false-label="0" @change="checked=>reqCheckChange(scope.row, checked)"></el-checkbox> <el-checkbox v-model="scope.row.reqable" true-label="1" false-label="0" @change="checked=>reqCheckChange(scope.row, checked)" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="resable" label="是否作为返回参数" align="center" width="50" > <el-table-column prop="resable" label="是否作为返回参数" align="center" width="50">
<template slot-scope="scope"> <template slot-scope="scope">
<el-checkbox v-model="scope.row.resable" true-label="1" false-label="0" @change="checked=>resCheckChange(scope.row, checked)"></el-checkbox> <el-checkbox v-model="scope.row.resable" true-label="1" false-label="0" @change="checked=>resCheckChange(scope.row, checked)" />
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
...@@ -156,35 +150,41 @@ ...@@ -156,35 +150,41 @@
<sql-editor <sql-editor
ref="sqleditor" ref="sqleditor"
:value="form2.sqlText" :value="form2.sqlText"
@changeTextarea="changeTextarea($event)"
style="height: 300px;margin: 10px 10px;" style="height: 300px;margin: 10px 10px;"
></sql-editor> @changeTextarea="changeTextarea($event)"
/>
</el-col> </el-col>
</el-row> </el-row>
<el-form-item v-if="form2.configType === '2'"> <el-form-item v-if="form2.configType === '2'">
<el-button size="mini" type="primary" @click="sqlParse">SQL解析</el-button> <el-button size="mini" type="primary" @click="sqlParse">SQL解析</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-form ref="form3" :model="form3" label-width="80px" v-if="active == 3"> <el-form v-if="active == 3" ref="form3" :model="form3" label-width="80px">
<el-divider content-position="left">请求参数</el-divider> <el-divider content-position="left">请求参数</el-divider>
<el-table :data="form3.reqParams" stripe border <el-table
:data="form3.reqParams"
stripe
border
:max-height="300" :max-height="300"
style="width: 100%; margin: 15px 0;"> style="width: 100%; margin: 15px 0;"
>
<el-table-column label="序号" width="55" align="center"> <el-table-column label="序号" width="55" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ scope.$index +1 }}</span> <span>{{ scope.$index +1 }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="paramName" label="参数名称" align="center" show-overflow-tooltip > <el-table-column prop="paramName" label="参数名称" align="center" show-overflow-tooltip />
</el-table-column> <el-table-column prop="nullable" label="是否允许为空" align="center" show-overflow-tooltip>
<el-table-column prop="nullable" label="是否允许为空" align="center" show-overflow-tooltip >
<template slot-scope="scope"> <template slot-scope="scope">
<el-checkbox v-model="scope.row.nullable" true-label="1" false-label="0"></el-checkbox> <el-checkbox v-model="scope.row.nullable" true-label="1" false-label="0" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="paramComment" label="描述" align="center" show-overflow-tooltip > <el-table-column prop="paramComment" label="描述" align="center" show-overflow-tooltip>
<template slot-scope="scope">
<el-input v-model="scope.row.paramComment" placeholder="请输入描述" />
</template>
</el-table-column> </el-table-column>
<el-table-column prop="paramType" label="参数类型" align="center" show-overflow-tooltip > <el-table-column prop="paramType" label="参数类型" align="center" show-overflow-tooltip>
<template slot-scope="scope"> <template slot-scope="scope">
<el-select v-model="scope.row.paramType" placeholder="请选择参数类型"> <el-select v-model="scope.row.paramType" placeholder="请选择参数类型">
<el-option <el-option
...@@ -192,11 +192,11 @@ ...@@ -192,11 +192,11 @@
:key="dict.id" :key="dict.id"
:label="dict.itemValue" :label="dict.itemValue"
:value="dict.itemText" :value="dict.itemText"
></el-option> />
</el-select> </el-select>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="whereType" label="操作符" align="center" show-overflow-tooltip > <el-table-column prop="whereType" label="操作符" align="center" show-overflow-tooltip>
<template slot-scope="scope"> <template slot-scope="scope">
<el-select v-model="scope.row.whereType" placeholder="请选择操作符"> <el-select v-model="scope.row.whereType" placeholder="请选择操作符">
<el-option <el-option
...@@ -204,45 +204,54 @@ ...@@ -204,45 +204,54 @@
:key="dict.id" :key="dict.id"
:label="dict.itemValue" :label="dict.itemValue"
:value="dict.itemText" :value="dict.itemText"
></el-option> />
</el-select> </el-select>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="exampleValue" label="示例值" align="center" show-overflow-tooltip > <el-table-column prop="exampleValue" label="示例值" align="center" show-overflow-tooltip>
<template slot-scope="scope"> <template slot-scope="scope">
<el-input v-model="scope.row.exampleValue" placeholder="请输入示例值" /> <el-input v-model="scope.row.exampleValue" placeholder="请输入示例值" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="defaultValue" label="默认值" align="center" show-overflow-tooltip > <el-table-column prop="defaultValue" label="默认值" align="center" show-overflow-tooltip>
<template slot-scope="scope"> <template slot-scope="scope">
<el-input v-model="scope.row.defaultValue" placeholder="请输入默认值" /> <el-input v-model="scope.row.defaultValue" placeholder="请输入默认值" />
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<el-divider content-position="left">返回字段</el-divider> <el-divider content-position="left">返回字段</el-divider>
<el-table :data="form3.resParams" stripe border <el-table
:data="form3.resParams"
stripe
border
:max-height="300" :max-height="300"
style="width: 100%; margin: 15px 0;"> style="width: 100%; margin: 15px 0;"
>
<el-table-column label="序号" width="55" align="center"> <el-table-column label="序号" width="55" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ scope.$index +1 }}</span> <span>{{ scope.$index +1 }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="fieldName" label="字段名称" align="center" show-overflow-tooltip > <el-table-column prop="fieldName" label="字段名称" align="center" show-overflow-tooltip />
</el-table-column> <el-table-column prop="fieldComment" label="描述" align="center" show-overflow-tooltip>
<el-table-column prop="fieldComment" label="描述" align="center" show-overflow-tooltip > <template slot-scope="scope">
<el-input v-model="scope.row.fieldComment" placeholder="请输入描述" />
</template>
</el-table-column> </el-table-column>
<el-table-column prop="dataType" label="数据类型" align="center" show-overflow-tooltip > <el-table-column prop="dataType" label="数据类型" align="center" show-overflow-tooltip>
<template slot-scope="scope">
<el-input v-model="scope.row.dataType" placeholder="请输入数据类型" />
</template>
</el-table-column> </el-table-column>
<el-table-column prop="exampleValue" label="示例值" align="center" show-overflow-tooltip > <el-table-column prop="exampleValue" label="示例值" align="center" show-overflow-tooltip>
<template slot-scope="scope"> <template slot-scope="scope">
<el-input v-model="scope.row.exampleValue" placeholder="请输入示例值" /> <el-input v-model="scope.row.exampleValue" placeholder="请输入示例值" />
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</el-form> </el-form>
<el-button style="margin-top: 12px;" @click="handleNextStep" v-if="active < 3">下一步</el-button> <el-button v-if="active < 3" style="margin-top: 12px;" @click="handleNextStep">下一步</el-button>
<el-button style="margin-top: 12px;" @click="handleLastStep" v-if="active > 1">上一步</el-button> <el-button v-if="active > 1" style="margin-top: 12px;" @click="handleLastStep">上一步</el-button>
</div> </div>
</el-card> </el-card>
</div> </div>
...@@ -263,12 +272,12 @@ export default { ...@@ -263,12 +272,12 @@ export default {
props: { props: {
data: { data: {
type: Object, type: Object,
default: function () { default: function() {
return {} return {}
} }
} }
}, },
data () { data() {
return { return {
classCardbody: { classCardbody: {
overflow: 'auto', overflow: 'auto',
...@@ -371,7 +380,7 @@ export default { ...@@ -371,7 +380,7 @@ export default {
paramTypeOptions: [] paramTypeOptions: []
} }
}, },
created () { created() {
console.log('id:' + this.data.id) console.log('id:' + this.data.id)
this.getDicts('data_req_method').then(response => { this.getDicts('data_req_method').then(response => {
if (response.success) { if (response.success) {
...@@ -410,14 +419,14 @@ export default { ...@@ -410,14 +419,14 @@ export default {
} }
}) })
}, },
mounted () { mounted() {
this.getDataApi(this.data.id) this.getDataApi(this.data.id)
}, },
methods: { methods: {
showCard () { showCard() {
this.$emit('showCard', this.showOptions) this.$emit('showCard', this.showOptions)
}, },
getDataSourceList () { getDataSourceList() {
listDataSource().then(response => { listDataSource().then(response => {
if (response.success) { if (response.success) {
this.sourceOptions = response.data this.sourceOptions = response.data
...@@ -425,7 +434,7 @@ export default { ...@@ -425,7 +434,7 @@ export default {
}) })
}, },
/** 步骤条下一步 */ /** 步骤条下一步 */
handleNextStep () { handleNextStep() {
if (this.active === 1) { if (this.active === 1) {
this.$refs['form1'].validate(valid => { this.$refs['form1'].validate(valid => {
if (valid) { if (valid) {
...@@ -442,15 +451,15 @@ export default { ...@@ -442,15 +451,15 @@ export default {
} }
}, },
/** 步骤条上一步 */ /** 步骤条上一步 */
handleLastStep () { handleLastStep() {
this.active-- this.active--
}, },
changeTextarea (val) { changeTextarea(val) {
this.form2.sqlText = val this.form2.sqlText = val
}, },
configTypeSelectChanged (val) { configTypeSelectChanged(val) {
if (this.form2.configType === '1' && this.form2.sourceId && this.tableOptions.length <= 0) { if (this.form2.configType === '1' && this.form2.sourceId && this.tableOptions.length <= 0) {
let data = {} const data = {}
data.sourceId = this.form2.sourceId data.sourceId = this.form2.sourceId
listDataTable(data).then(response => { listDataTable(data).then(response => {
if (response.success) { if (response.success) {
...@@ -460,9 +469,9 @@ export default { ...@@ -460,9 +469,9 @@ export default {
}) })
} }
}, },
sourceSelectChanged (val) { sourceSelectChanged(val) {
if (this.form2.configType && this.form2.configType === '1') { if (this.form2.configType && this.form2.configType === '1') {
let data = {} const data = {}
data.sourceId = val data.sourceId = val
listDataTable(data).then(response => { listDataTable(data).then(response => {
if (response.success) { if (response.success) {
...@@ -472,8 +481,8 @@ export default { ...@@ -472,8 +481,8 @@ export default {
}) })
} }
}, },
tableSelectChanged (item) { tableSelectChanged(item) {
let data = {} const data = {}
data.sourceId = item.sourceId data.sourceId = item.sourceId
data.tableId = item.id data.tableId = item.id
this.form2.tableId = item.id this.form2.tableId = item.id
...@@ -486,7 +495,7 @@ export default { ...@@ -486,7 +495,7 @@ export default {
} }
}) })
}, },
sqlParse () { sqlParse() {
if (!this.form2.sourceId) { if (!this.form2.sourceId) {
this.$message.error('数据源不能为空') this.$message.error('数据源不能为空')
return return
...@@ -495,30 +504,20 @@ export default { ...@@ -495,30 +504,20 @@ export default {
this.$message.error('解析SQL不能为空') this.$message.error('解析SQL不能为空')
return return
} }
let data = {} const data = {}
data.sourceId = this.form2.sourceId
data.sqlText = this.form2.sqlText data.sqlText = this.form2.sqlText
sqlParse(data).then(response => { sqlParse(data).then(response => {
if (response.success) { if (response.success) {
const { data } = response const { data } = response
let reqParams = data.reqParams this.form3.reqParams = data.reqParams
let resParams = data.resParams this.form3.resParams = data.resParams
this.form3.reqParams = reqParams.map(function (item) {
let json = {}
json.paramName = item.paramName
json.nullable = '0'
return json
})
this.form3.resParams = resParams.map(function (item) {
let json = {}
json.fieldName = item.fieldName
return json
})
this.$message.success('解析成功,请进行下一步') this.$message.success('解析成功,请进行下一步')
} }
}) })
}, },
/** 获取详情 */ /** 获取详情 */
async getDataApi (id) { async getDataApi(id) {
this.form1 = await getDataApi(id).then(response => { this.form1 = await getDataApi(id).then(response => {
if (response.success) { if (response.success) {
return response.data return response.data
...@@ -541,9 +540,9 @@ export default { ...@@ -541,9 +540,9 @@ export default {
// }) || [] // }) || []
} }
}, },
reqCheckChange (row, checked) { reqCheckChange(row, checked) {
if (checked === '1') { if (checked === '1') {
let json = {} const json = {}
json.paramName = row.columnName json.paramName = row.columnName
json.paramComment = row.columnComment || undefined json.paramComment = row.columnComment || undefined
json.nullable = '0' json.nullable = '0'
...@@ -552,9 +551,9 @@ export default { ...@@ -552,9 +551,9 @@ export default {
this.form3.reqParams.splice(this.form3.reqParams.findIndex(item => item.paramName === row.columnName), 1) this.form3.reqParams.splice(this.form3.reqParams.findIndex(item => item.paramName === row.columnName), 1)
} }
}, },
resCheckChange (row, checked) { resCheckChange(row, checked) {
if (checked === '1') { if (checked === '1') {
let json = {} const json = {}
json.fieldName = row.columnName json.fieldName = row.columnName
json.fieldComment = row.columnComment || undefined json.fieldComment = row.columnComment || undefined
json.dataType = row.dataType || undefined json.dataType = row.dataType || undefined
...@@ -564,7 +563,7 @@ export default { ...@@ -564,7 +563,7 @@ export default {
} }
}, },
/** 提交按钮 */ /** 提交按钮 */
submitForm: function () { submitForm: function() {
this.$refs['form3'].validate(valid => { this.$refs['form3'].validate(valid => {
if (valid) { if (valid) {
if (this.form3.reqParams.length <= 0) { if (this.form3.reqParams.length <= 0) {
......
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