Commit 40183ee2 by yuwei

项目初始化

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