Commit 23336f6e by yuwei

项目初始化

parent 12d3492e
...@@ -3,15 +3,11 @@ package cn.datax.auth.service; ...@@ -3,15 +3,11 @@ package cn.datax.auth.service;
import cn.datax.common.core.DataConstant; import cn.datax.common.core.DataConstant;
import cn.datax.common.core.DataRole; import cn.datax.common.core.DataRole;
import cn.datax.common.core.DataUser; import cn.datax.common.core.DataUser;
import cn.datax.common.core.R;
import cn.datax.service.system.api.feign.UserServiceFeign; import cn.datax.service.system.api.feign.UserServiceFeign;
import cn.datax.service.system.api.vo.*; import cn.datax.service.system.api.vo.*;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
...@@ -31,22 +27,13 @@ public class DataUserDetailService implements UserDetailsService { ...@@ -31,22 +27,13 @@ public class DataUserDetailService implements UserDetailsService {
@Autowired @Autowired
private UserServiceFeign userServiceFeign; private UserServiceFeign userServiceFeign;
@Autowired
private ObjectMapper objectMapper;
@Override @Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
//远程获取用户 // 远程获取用户
R result = userServiceFeign.loginByUsername(s); UserInfo userInfo = userServiceFeign.loginByUsername(s);
if(result == null || !result.isSuccess() || ObjectUtil.isEmpty(result.getData())){ if(userInfo == null){
throw new UsernameNotFoundException(StrUtil.format("{}用户不存在", s)); throw new UsernameNotFoundException(StrUtil.format("{}用户不存在", s));
} }
UserInfo userInfo;
try {
userInfo = objectMapper.readValue(objectMapper.writeValueAsString(result.getData()), UserInfo.class);
} catch (JsonProcessingException e) {
throw new UsernameNotFoundException(StrUtil.format("{}用户解析出错", s));
}
// 可用性 :true:可用 false:不可用 // 可用性 :true:可用 false:不可用
boolean enabled = true; boolean enabled = true;
// 过期性 :true:没过期 false:过期 // 过期性 :true:没过期 false:过期
......
...@@ -96,8 +96,7 @@ public class LogAspect { ...@@ -96,8 +96,7 @@ public class LogAspect {
.setClassName(className).setMethodName(methodName); .setClassName(className).setMethodName(methodName);
try { try {
logDto.setParams(objectMapper.writeValueAsString(getRequestParams(joinPoint))); logDto.setParams(objectMapper.writeValueAsString(getRequestParams(joinPoint)));
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {}
}
// 保存数据库 // 保存数据库
logServiceFeign.saveLog(logDto); logServiceFeign.saveLog(logDto);
} }
......
...@@ -51,10 +51,12 @@ public class DataSecurityProtectConfig { ...@@ -51,10 +51,12 @@ public class DataSecurityProtectConfig {
requestTemplate.header(DataConstant.Security.TOKENHEADER.getVal(), gatewayToken); requestTemplate.header(DataConstant.Security.TOKENHEADER.getVal(), gatewayToken);
// 请求头中添加原请求头中的 Token // 请求头中添加原请求头中的 Token
Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Object details = authentication.getDetails(); if (authentication != null) {
if (details instanceof OAuth2AuthenticationDetails) { Object details = authentication.getDetails();
String authorizationToken = ((OAuth2AuthenticationDetails) details).getTokenValue(); if (details instanceof OAuth2AuthenticationDetails) {
requestTemplate.header(DataConstant.Security.AUTHORIZATION.getVal(), DataConstant.Security.TOKENTYPE.getVal() + authorizationToken); String authorizationToken = ((OAuth2AuthenticationDetails) details).getTokenValue();
requestTemplate.header(DataConstant.Security.AUTHORIZATION.getVal(), DataConstant.Security.TOKENTYPE.getVal() + authorizationToken);
}
} }
}; };
} }
......
package cn.datax.service.data.factory.api.feign;
import cn.datax.service.data.factory.api.entity.DataSetEntity;
import cn.datax.service.data.factory.api.feign.factory.DataSetServiceFeignFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(contextId = "dataSetServiceFeign", value = "datax-service-data-factory", fallbackFactory = DataSetServiceFeignFallbackFactory.class)
public interface DataSetServiceFeign {
@GetMapping("/inner/sets/{id}")
DataSetEntity getDataSetById(@PathVariable("id") String id);
}
package cn.datax.service.data.factory.api.feign; package cn.datax.service.data.factory.api.feign;
import cn.datax.common.core.R; import cn.datax.service.data.factory.api.entity.DataSourceEntity;
import cn.datax.service.data.factory.api.feign.factory.DataSourceServiceFeignFallbackFactory; import cn.datax.service.data.factory.api.feign.factory.DataSourceServiceFeignFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
...@@ -9,6 +9,6 @@ import org.springframework.web.bind.annotation.PathVariable; ...@@ -9,6 +9,6 @@ import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(contextId = "dataSourceServiceFeign", value = "datax-service-data-factory", fallbackFactory = DataSourceServiceFeignFallbackFactory.class) @FeignClient(contextId = "dataSourceServiceFeign", value = "datax-service-data-factory", fallbackFactory = DataSourceServiceFeignFallbackFactory.class)
public interface DataSourceServiceFeign { public interface DataSourceServiceFeign {
@GetMapping("/dataSources/{id}") @GetMapping("/inner/sources/{id}")
R getDataSourceById(@PathVariable("id") String id); DataSourceEntity getDataSourceById(@PathVariable("id") String id);
} }
package cn.datax.service.data.factory.api.feign.factory;
import cn.datax.service.data.factory.api.feign.DataSetServiceFeign;
import cn.datax.service.data.factory.api.feign.fallback.DataSetServiceFeignFallbackImpl;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
@Component
public class DataSetServiceFeignFallbackFactory implements FallbackFactory<DataSetServiceFeign> {
@Override
public DataSetServiceFeign create(Throwable throwable) {
DataSetServiceFeignFallbackImpl dataSetServiceFeignFallback = new DataSetServiceFeignFallbackImpl();
dataSetServiceFeignFallback.setCause(throwable);
return dataSetServiceFeignFallback;
}
}
package cn.datax.service.data.factory.api.feign.fallback;
import cn.datax.service.data.factory.api.entity.DataSetEntity;
import cn.datax.service.data.factory.api.feign.DataSetServiceFeign;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class DataSetServiceFeignFallbackImpl implements DataSetServiceFeign {
@Setter
private Throwable cause;
@Override
public DataSetEntity getDataSetById(String id) {
log.error("feign 调用{}出错", id, cause);
return null;
}
}
package cn.datax.service.data.factory.api.feign.fallback; package cn.datax.service.data.factory.api.feign.fallback;
import cn.datax.common.core.R; import cn.datax.service.data.factory.api.entity.DataSourceEntity;
import cn.datax.service.data.factory.api.feign.DataSourceServiceFeign; import cn.datax.service.data.factory.api.feign.DataSourceServiceFeign;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -14,7 +14,7 @@ public class DataSourceServiceFeignFallbackImpl implements DataSourceServiceFeig ...@@ -14,7 +14,7 @@ public class DataSourceServiceFeignFallbackImpl implements DataSourceServiceFeig
private Throwable cause; private Throwable cause;
@Override @Override
public R getDataSourceById(String id) { public DataSourceEntity getDataSourceById(String id) {
log.error("feign 调用{}出错", id, cause); log.error("feign 调用{}出错", id, cause);
return null; return null;
} }
......
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.datax.service.data.factory.api.feign.factory.DataSourceServiceFeignFallbackFactory,\ cn.datax.service.data.factory.api.feign.factory.DataSourceServiceFeignFallbackFactory,\
cn.datax.service.data.factory.api.feign.fallback.DataSourceServiceFeignFallbackImpl cn.datax.service.data.factory.api.feign.fallback.DataSourceServiceFeignFallbackImpl,\
cn.datax.service.data.factory.api.feign.factory.DataSetServiceFeignFallbackFactory,\
cn.datax.service.data.factory.api.feign.fallback.DataSetServiceFeignFallbackImpl
package cn.datax.service.data.factory.sql.console.service.impl; package cn.datax.service.data.factory.sql.console.service.impl;
import cn.datax.common.core.R;
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;
...@@ -15,9 +14,6 @@ import cn.datax.service.data.factory.sql.console.concurrent.CallableTemplate; ...@@ -15,9 +14,6 @@ import cn.datax.service.data.factory.sql.console.concurrent.CallableTemplate;
import cn.datax.service.data.factory.sql.console.concurrent.DateHander; import cn.datax.service.data.factory.sql.console.concurrent.DateHander;
import cn.datax.service.data.factory.sql.console.service.SqlConsoleService; import cn.datax.service.data.factory.sql.console.service.SqlConsoleService;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.parser.CCJSqlParserUtil;
...@@ -43,9 +39,6 @@ public class SqlConsoleServiceImpl implements SqlConsoleService { ...@@ -43,9 +39,6 @@ public class SqlConsoleServiceImpl implements SqlConsoleService {
@Autowired @Autowired
private DataSourceServiceFeign dataSourceServiceFeign; private DataSourceServiceFeign dataSourceServiceFeign;
@Autowired
private ObjectMapper objectMapper;
private static Map<String, List<Connection>> connectionMap = new ConcurrentHashMap<>(); private static Map<String, List<Connection>> connectionMap = new ConcurrentHashMap<>();
@Override @Override
...@@ -62,15 +55,10 @@ public class SqlConsoleServiceImpl implements SqlConsoleService { ...@@ -62,15 +55,10 @@ public class SqlConsoleServiceImpl implements SqlConsoleService {
if (CollUtil.isEmpty(sqls)) { if (CollUtil.isEmpty(sqls)) {
throw new DataException("未解析到SQL语句"); throw new DataException("未解析到SQL语句");
} }
R sourceResult = dataSourceServiceFeign.getDataSourceById(sqlConsoleDto.getSourceId()); DataSourceEntity dataSource = dataSourceServiceFeign.getDataSourceById(sqlConsoleDto.getSourceId());
if(sourceResult == null || !sourceResult.isSuccess() || ObjectUtil.isEmpty(sourceResult.getData())){ if(dataSource == null){
throw new DataException("SQL工作台查询数据源出错"); throw new DataException("SQL工作台查询数据源出错");
} }
DataSourceEntity dataSource = null;
try {
dataSource = objectMapper.readValue(objectMapper.writeValueAsString(sourceResult.getData()), DataSourceEntity.class);
} catch (JsonProcessingException e) {
}
DbSchema dbSchema = dataSource.getDbSchema(); DbSchema dbSchema = dataSource.getDbSchema();
DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(), DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(),
dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName(), dbSchema.getSid()); dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName(), dbSchema.getSid());
......
...@@ -5,9 +5,7 @@ import cn.datax.common.core.JsonPage; ...@@ -5,9 +5,7 @@ import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups; import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.data.factory.api.dto.DataThemeDto; import cn.datax.service.data.factory.api.dto.DataThemeDto;
import cn.datax.service.data.factory.api.entity.DataSourceEntity;
import cn.datax.service.data.factory.api.entity.DataThemeEntity; import cn.datax.service.data.factory.api.entity.DataThemeEntity;
import cn.datax.service.data.factory.api.vo.DataSourceVo;
import cn.datax.service.data.factory.api.vo.DataThemeVo; import cn.datax.service.data.factory.api.vo.DataThemeVo;
import cn.datax.service.data.factory.api.query.DataThemeQuery; import cn.datax.service.data.factory.api.query.DataThemeQuery;
import cn.datax.service.data.factory.mapstruct.DataThemeMapper; import cn.datax.service.data.factory.mapstruct.DataThemeMapper;
......
package cn.datax.service.data.factory.controller; package cn.datax.service.data.factory.controller;
import cn.datax.common.base.BaseController; import cn.datax.common.base.BaseController;
import cn.datax.service.data.factory.api.entity.DataSetEntity;
import cn.datax.service.data.factory.api.entity.DataSourceEntity;
import cn.datax.service.data.factory.service.DataSetService;
import cn.datax.service.data.factory.service.DataSourceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
...@@ -8,4 +15,21 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -8,4 +15,21 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/inner") @RequestMapping("/inner")
public class InnerController extends BaseController { public class InnerController extends BaseController {
@Autowired
private DataSourceService dataSourceService;
@Autowired
private DataSetService dataSetService;
@GetMapping("/sources/{id}")
public DataSourceEntity getDataSourceById(@PathVariable("id") String id) {
DataSourceEntity dataSourceEntity = dataSourceService.getDataSourceById(id);
return dataSourceEntity;
}
@GetMapping("/sets/{id}")
public DataSetEntity getDataSetById(@PathVariable("id") String id) {
DataSetEntity dataSetEntity = dataSetService.getDataSetById(id);
return dataSetEntity;
}
} }
package cn.datax.service.data.market.api.mapping.config; package cn.datax.service.data.market.api.mapping.config;
import cn.datax.service.data.market.api.mapping.handler.MappingHandlerMapping;
import cn.datax.service.data.market.api.mapping.handler.RequestHandler;
import cn.datax.service.data.market.api.mapping.handler.RequestInterceptor;
import cn.datax.service.data.market.api.mapping.service.ApiLogService; import cn.datax.service.data.market.api.mapping.service.ApiLogService;
import cn.datax.service.data.market.api.mapping.service.impl.ApiMappingEngine; import cn.datax.service.data.market.api.mapping.service.impl.ApiMappingEngine;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
......
...@@ -59,7 +59,9 @@ public class DataResourceServerConfig extends ResourceServerConfigurerAdapter { ...@@ -59,7 +59,9 @@ public class DataResourceServerConfig extends ResourceServerConfigurerAdapter {
"/swagger-resources/**", "/swagger-resources/**",
"/webjars/**", "/webjars/**",
// feign 内部调用不用授权 // feign 内部调用不用授权
"/inner/**" "/inner/**",
// 注册接口 不用授权
"/services/**"
).permitAll() ).permitAll()
.anyRequest().authenticated() .anyRequest().authenticated()
.and().csrf().disable(); .and().csrf().disable();
......
...@@ -2,9 +2,7 @@ package cn.datax.service.data.market.api.mapping.config; ...@@ -2,9 +2,7 @@ package cn.datax.service.data.market.api.mapping.config;
import cn.datax.common.rabbitmq.config.RabbitMqConstant; import cn.datax.common.rabbitmq.config.RabbitMqConstant;
import cn.datax.common.utils.ThrowableUtil; import cn.datax.common.utils.ThrowableUtil;
import cn.datax.service.data.market.api.entity.DataApiEntity; import cn.datax.service.data.market.api.mapping.service.QueueHandlerService;
import cn.datax.service.data.market.api.feign.DataApiServiceFeign;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.rabbitmq.client.Channel; import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message; import org.springframework.amqp.core.Message;
...@@ -15,18 +13,12 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener; ...@@ -15,18 +13,12 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component
@Slf4j @Slf4j
@Component
public class RabbitMqListenerConfig { public class RabbitMqListenerConfig {
@Autowired @Autowired
private DataApiServiceFeign dataApiServiceFeign; private QueueHandlerService queueHandlerService;
@Autowired
private MappingHandlerMapping mappingHandlerMapping;
@Autowired
private ObjectMapper objectMapper;
/** /**
* Fanout 交换机 * Fanout 交换机
...@@ -36,11 +28,8 @@ public class RabbitMqListenerConfig { ...@@ -36,11 +28,8 @@ public class RabbitMqListenerConfig {
value = @Queue(value = RabbitMqConstant.FANOUT_EXCHANGE_QUEUE_TOPIC_API_RELEASE1, durable = "true", exclusive = "false", autoDelete = "false"))) value = @Queue(value = RabbitMqConstant.FANOUT_EXCHANGE_QUEUE_TOPIC_API_RELEASE1, durable = "true", exclusive = "false", autoDelete = "false")))
public void fanoutQueueRelease(String id, Channel channel, Message message) throws Exception { public void fanoutQueueRelease(String id, Channel channel, Message message) throws Exception {
try { try {
System.out.println("fanoutQueueRelease接收到了:" + id); log.info("fanoutQueueRelease接收到了:{}", id);
DataApiEntity dataApiEntity = dataApiServiceFeign.getDataApiById(id); queueHandlerService.handlerRelease(id);
if(dataApiEntity != null){
log.info("api={}", dataApiEntity);
}
}catch (Exception e){ }catch (Exception e){
log.error("全局异常信息ex={}, StackTrace={}", e.getMessage(), ThrowableUtil.getStackTrace(e)); log.error("全局异常信息ex={}, StackTrace={}", e.getMessage(), ThrowableUtil.getStackTrace(e));
} }
...@@ -54,7 +43,8 @@ public class RabbitMqListenerConfig { ...@@ -54,7 +43,8 @@ public class RabbitMqListenerConfig {
value = @Queue(value = RabbitMqConstant.FANOUT_EXCHANGE_QUEUE_TOPIC_API_CANCEL1, durable = "true", exclusive = "false", autoDelete = "false"))) value = @Queue(value = RabbitMqConstant.FANOUT_EXCHANGE_QUEUE_TOPIC_API_CANCEL1, durable = "true", exclusive = "false", autoDelete = "false")))
public void fanoutQueueCancel(String id, Channel channel, Message message) throws Exception { public void fanoutQueueCancel(String id, Channel channel, Message message) throws Exception {
try { try {
System.out.println("fanoutQueueCancel接收到了:" + id); log.info("fanoutQueueCancel接收到了:{}", id);
queueHandlerService.handlerCancel(id);
}catch (Exception e){ }catch (Exception e){
log.error("全局异常信息ex={}, StackTrace={}", e.getMessage(), ThrowableUtil.getStackTrace(e)); log.error("全局异常信息ex={}, StackTrace={}", e.getMessage(), ThrowableUtil.getStackTrace(e));
} }
......
package cn.datax.service.data.market.controller; package cn.datax.service.data.market.api.mapping.controller;
import cn.datax.common.base.BaseController; import cn.datax.common.base.BaseController;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.service.data.market.api.mapping.service.ApiExecuteService;
import cn.datax.service.data.market.api.vo.ApiHeader; import cn.datax.service.data.market.api.vo.ApiHeader;
import cn.datax.service.data.market.service.ApiExecuteService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@RequestMapping("/apis") @RequestMapping("/apis")
......
...@@ -4,7 +4,6 @@ import cn.datax.common.base.BaseController; ...@@ -4,7 +4,6 @@ import cn.datax.common.base.BaseController;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@RequestMapping("/inner") @RequestMapping("/inner")
public class InnerController extends BaseController { public class InnerController extends BaseController {
......
package cn.datax.service.data.market.api.mapping.config; package cn.datax.service.data.market.api.mapping.handler;
import cn.datax.service.data.market.api.entity.DataApiEntity; import cn.datax.service.data.market.api.entity.DataApiEntity;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -31,7 +31,8 @@ public class MappingHandlerMapping { ...@@ -31,7 +31,8 @@ public class MappingHandlerMapping {
} }
} }
private String prefix = "v1"; private String ignore = "services";
private String prefix = "v1.0.0";
private String separator = "/"; private String separator = "/";
public MappingHandlerMapping() {} public MappingHandlerMapping() {}
...@@ -99,10 +100,16 @@ public class MappingHandlerMapping { ...@@ -99,10 +100,16 @@ public class MappingHandlerMapping {
return RequestMappingInfo.paths(getRequestPath(api.getApiVersion(), api.getApiUrl())).methods(RequestMethod.valueOf(api.getReqMethod().toUpperCase())).build(); return RequestMappingInfo.paths(getRequestPath(api.getApiVersion(), api.getApiUrl())).methods(RequestMethod.valueOf(api.getReqMethod().toUpperCase())).build();
} }
/**
* 调用接口 /services/v1.0.0/user/1
* @param version
* @param path
* @return
*/
private String getRequestPath(String version, String path) { private String getRequestPath(String version, String path) {
if (version != null) { if (version != null) {
prefix = version; prefix = version;
} }
return separator + prefix + (path.startsWith(separator) ? path : (separator + path)); return separator + ignore + separator + prefix + (path.startsWith(separator) ? path : (separator + path));
} }
} }
package cn.datax.service.data.market.api.mapping.config; package cn.datax.service.data.market.api.mapping.handler;
import cn.datax.common.core.DataConstant; import cn.datax.common.core.DataConstant;
import cn.datax.common.core.R; import cn.datax.common.core.R;
......
package cn.datax.service.data.market.api.mapping.config; package cn.datax.service.data.market.api.mapping.handler;
import cn.datax.common.core.DataConstant; import cn.datax.common.core.DataConstant;
import cn.datax.common.core.R; import cn.datax.common.core.R;
......
package cn.datax.service.data.market.service; package cn.datax.service.data.market.api.mapping.service;
import cn.datax.service.data.market.api.vo.ApiHeader; import cn.datax.service.data.market.api.vo.ApiHeader;
......
package cn.datax.service.data.market.api.mapping.service;
public interface QueueHandlerService {
void handlerRelease(String id);
void handlerCancel(String id);
}
package cn.datax.service.data.market.service.impl; package cn.datax.service.data.market.api.mapping.service.impl;
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.service.data.market.api.mapping.service.ApiExecuteService;
import cn.datax.service.data.market.api.vo.ApiHeader; import cn.datax.service.data.market.api.vo.ApiHeader;
import cn.datax.service.data.market.service.ApiExecuteService; import lombok.extern.slf4j.Slf4j;
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;
@Slf4j
@Service @Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class) @Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class ApiExecuteServiceImpl implements ApiExecuteService { public class ApiExecuteServiceImpl implements ApiExecuteService {
@Override @Override
public ApiHeader getApiHeader(String id) { public ApiHeader getApiHeader(String id) {
ApiHeader apiHeader = new ApiHeader();
try { try {
ApiHeader apiHeader = new ApiHeader();
MD5Util mt = MD5Util.getInstance(); MD5Util mt = MD5Util.getInstance();
apiHeader.setApiKey(mt.encode(id)); apiHeader.setApiKey(mt.encode(id));
apiHeader.setSecretKey(mt.encode(SecurityUtil.getUserId())); apiHeader.setSecretKey(mt.encode(SecurityUtil.getUserId()));
return apiHeader;
} catch (Exception e) { } catch (Exception e) {
log.error("全局异常信息ex={}, StackTrace={}", e.getMessage(), ThrowableUtil.getStackTrace(e));
return null;
} }
return apiHeader;
} }
} }
package cn.datax.service.data.market.api.mapping.service.impl; package cn.datax.service.data.market.api.mapping.service.impl;
import cn.datax.common.core.R;
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;
...@@ -20,9 +19,6 @@ import cn.datax.service.data.market.api.mapping.factory.FactoryProducer; ...@@ -20,9 +19,6 @@ import cn.datax.service.data.market.api.mapping.factory.FactoryProducer;
import cn.datax.service.data.market.api.mapping.factory.crypto.Crypto; import cn.datax.service.data.market.api.mapping.factory.crypto.Crypto;
import cn.datax.service.data.market.api.mapping.utils.SqlBuilderUtil; import cn.datax.service.data.market.api.mapping.utils.SqlBuilderUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -44,19 +40,11 @@ public class ApiMappingEngine { ...@@ -44,19 +40,11 @@ public class ApiMappingEngine {
@Autowired @Autowired
private ApiMaskServiceFeign apiMaskServiceFeign; private ApiMaskServiceFeign apiMaskServiceFeign;
@Autowired
private ObjectMapper objectMapper;
public PageResult<Map<String, Object>> execute(DataApiEntity dataApi, Map<String, Object> params) { public PageResult<Map<String, Object>> execute(DataApiEntity dataApi, Map<String, Object> params) {
R sourceResult = dataSourceServiceFeign.getDataSourceById(dataApi.getExecuteConfig().getSourceId()); DataSourceEntity dataSource = dataSourceServiceFeign.getDataSourceById(dataApi.getExecuteConfig().getSourceId());
if(sourceResult == null || !sourceResult.isSuccess() || ObjectUtil.isEmpty(sourceResult.getData())){ if (dataSource == null) {
throw new DataException("API调用查询数据源出错"); throw new DataException("API调用查询数据源出错");
} }
DataSourceEntity dataSource = null;
try {
dataSource = objectMapper.readValue(objectMapper.writeValueAsString(sourceResult.getData()), DataSourceEntity.class);
} catch (JsonProcessingException e) {
}
DbSchema dbSchema = dataSource.getDbSchema(); DbSchema dbSchema = dataSource.getDbSchema();
DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(), DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(),
dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName(), dbSchema.getSid()); dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName(), dbSchema.getSid());
...@@ -75,17 +63,11 @@ public class ApiMappingEngine { ...@@ -75,17 +63,11 @@ public class ApiMappingEngine {
} }
Map<String, Object> acceptedFilters = sqlFilterResult.getAcceptedFilters(); Map<String, Object> acceptedFilters = sqlFilterResult.getAcceptedFilters();
// 数据脱敏 // 数据脱敏
List<FieldRule> rules = null; List<FieldRule> rules;
R apiMaskResult = apiMaskServiceFeign.getApiMaskByApiId(dataApi.getId()); ApiMaskEntity apiMaskEntity = apiMaskServiceFeign.getApiMaskByApiId(dataApi.getId());
if(apiMaskResult == null || !apiMaskResult.isSuccess() || ObjectUtil.isEmpty(apiMaskResult.getData())){ if (apiMaskEntity == null) {
throw new DataException("API调用查询数据脱敏出错"); throw new DataException("API调用查询数据脱敏出错");
} } else {
ApiMaskEntity apiMaskEntity = null;
try {
apiMaskEntity = objectMapper.readValue(objectMapper.writeValueAsString(apiMaskResult.getData()), ApiMaskEntity.class);
} catch (JsonProcessingException e) {
}
if (apiMaskEntity != null) {
rules = apiMaskEntity.getRules(); rules = apiMaskEntity.getRules();
} }
PageResult<Map<String, Object>> pageResult; PageResult<Map<String, Object>> pageResult;
......
package cn.datax.service.data.market.api.mapping.service.impl;
import cn.datax.service.data.market.api.entity.DataApiEntity;
import cn.datax.service.data.market.api.feign.DataApiServiceFeign;
import cn.datax.service.data.market.api.mapping.handler.MappingHandlerMapping;
import cn.datax.service.data.market.api.mapping.service.QueueHandlerService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class QueueHandlerServiceImpl implements QueueHandlerService {
@Autowired
private DataApiServiceFeign dataApiServiceFeign;
@Autowired
private MappingHandlerMapping mappingHandlerMapping;
@Override
public void handlerRelease(String id) {
DataApiEntity dataApiEntity = dataApiServiceFeign.getDataApiById(id);
if (dataApiEntity != null) {
mappingHandlerMapping.registerMapping(dataApiEntity);
}
}
@Override
public void handlerCancel(String id) {
DataApiEntity dataApiEntity = dataApiServiceFeign.getDataApiById(id);
if (dataApiEntity != null) {
mappingHandlerMapping.unregisterMapping(dataApiEntity);
}
}
}
package cn.datax.service.data.market.api.feign; package cn.datax.service.data.market.api.feign;
import cn.datax.common.core.R; import cn.datax.service.data.market.api.entity.ApiMaskEntity;
import cn.datax.service.data.market.api.feign.factory.ApiMaskServiceFeignFallbackFactory; import cn.datax.service.data.market.api.feign.factory.ApiMaskServiceFeignFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
...@@ -9,6 +9,6 @@ import org.springframework.web.bind.annotation.PathVariable; ...@@ -9,6 +9,6 @@ import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(contextId = "apiMaskServiceFeign", value = "datax-service-data-market", fallbackFactory = ApiMaskServiceFeignFallbackFactory.class) @FeignClient(contextId = "apiMaskServiceFeign", value = "datax-service-data-market", fallbackFactory = ApiMaskServiceFeignFallbackFactory.class)
public interface ApiMaskServiceFeign { public interface ApiMaskServiceFeign {
@GetMapping("/apiMasks/api/{apiId}") @GetMapping("/inner/apiMasks/api/{id}")
R getApiMaskByApiId(@PathVariable("apiId") String apiId); ApiMaskEntity getApiMaskByApiId(@PathVariable("id") String id);
} }
package cn.datax.service.data.market.api.feign.fallback; package cn.datax.service.data.market.api.feign.fallback;
import cn.datax.common.core.R; import cn.datax.service.data.market.api.entity.ApiMaskEntity;
import cn.datax.service.data.market.api.feign.ApiMaskServiceFeign; import cn.datax.service.data.market.api.feign.ApiMaskServiceFeign;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -14,7 +14,7 @@ public class ApiMaskServiceFeignFallbackImpl implements ApiMaskServiceFeign { ...@@ -14,7 +14,7 @@ public class ApiMaskServiceFeignFallbackImpl implements ApiMaskServiceFeign {
private Throwable cause; private Throwable cause;
@Override @Override
public R getApiMaskByApiId(String id) { public ApiMaskEntity getApiMaskByApiId(String id) {
log.error("feign 调用{}出错", id, cause); log.error("feign 调用{}出错", id, cause);
return null; return null;
} }
......
package cn.datax.service.data.market.controller; package cn.datax.service.data.market.controller;
import cn.datax.common.base.BaseController; import cn.datax.common.base.BaseController;
import cn.datax.common.core.R;
import cn.datax.common.security.annotation.DataInner; import cn.datax.common.security.annotation.DataInner;
import cn.datax.service.data.market.api.entity.ApiMaskEntity;
import cn.datax.service.data.market.api.entity.DataApiEntity; import cn.datax.service.data.market.api.entity.DataApiEntity;
import cn.datax.service.data.market.mapstruct.DataApiMapper; import cn.datax.service.data.market.service.ApiMaskService;
import cn.datax.service.data.market.service.DataApiService; import cn.datax.service.data.market.service.DataApiService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
...@@ -19,11 +19,19 @@ public class InnerController extends BaseController { ...@@ -19,11 +19,19 @@ public class InnerController extends BaseController {
@Autowired @Autowired
private DataApiService dataApiService; private DataApiService dataApiService;
@Autowired
private ApiMaskService apiMaskService;
@DataInner @DataInner
@GetMapping("/apis/{id}") @GetMapping("/apis/{id}")
public DataApiEntity getDataApiById(@PathVariable String id) { public DataApiEntity getDataApiById(@PathVariable("id") String id) {
DataApiEntity dataApiEntity = dataApiService.getDataApiById(id); DataApiEntity dataApiEntity = dataApiService.getDataApiById(id);
return dataApiEntity; return dataApiEntity;
} }
@GetMapping("/apiMasks/api/{id}")
public ApiMaskEntity getApiMaskByApiId(@PathVariable("id") String id) {
ApiMaskEntity apiMaskEntity = apiMaskService.getApiMaskByApiId(id);
return apiMaskEntity;
}
} }
package cn.datax.service.email.api.feign;
import cn.datax.common.core.R;
import cn.datax.service.email.api.dto.EmailDto;
import cn.datax.service.email.api.entity.EmailEntity;
import cn.datax.service.email.api.feign.factory.EmailServiceFeignFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(contextId = "emailServiceFeign", value = "datax-service-email", fallbackFactory = EmailServiceFeignFallbackFactory.class)
public interface EmailServiceFeign {
@PostMapping("/inner/sendMail")
R sendMail(@RequestBody EmailDto mail);
}
package cn.datax.service.email.api.feign.factory;
import cn.datax.service.email.api.feign.EmailServiceFeign;
import cn.datax.service.email.api.feign.fallback.EmailServiceFeignFallbackImpl;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
@Component
public class EmailServiceFeignFallbackFactory implements FallbackFactory<EmailServiceFeign> {
@Override
public EmailServiceFeign create(Throwable throwable) {
return new EmailServiceFeignFallbackImpl(throwable);
}
}
package cn.datax.service.email.api.feign.fallback;
import cn.datax.common.core.R;
import cn.datax.service.email.api.dto.EmailDto;
import cn.datax.service.email.api.feign.EmailServiceFeign;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@AllArgsConstructor
public class EmailServiceFeignFallbackImpl implements EmailServiceFeign {
private final Throwable cause;
@Override
public R sendMail(EmailDto mail) {
log.error("feign 调用邮件出错,信息:{}", cause.getLocalizedMessage());
return null;
}
}
package cn.datax.service.email.controller; package cn.datax.service.email.controller;
import cn.datax.common.base.BaseController; import cn.datax.common.base.BaseController;
import cn.datax.common.core.R;
import cn.datax.common.utils.ThrowableUtil;
import cn.datax.service.email.api.dto.EmailDto;
import cn.datax.service.email.api.entity.EmailEntity;
import cn.datax.service.email.mapstruct.EmailMapper;
import cn.datax.service.email.utils.EmailUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
...@@ -19,21 +10,4 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -19,21 +10,4 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/inner") @RequestMapping("/inner")
public class InnerController extends BaseController { public class InnerController extends BaseController {
@Autowired
private EmailMapper emailMapper;
@Autowired
private EmailUtil emailUtil;
@PostMapping("/sendMail")
public R sendMail(@RequestBody EmailDto mail) {
EmailEntity emailEntity = emailMapper.toEntity(mail);
try {
emailUtil.sendEmail(emailEntity);
return R.ok();
} catch (Exception e) {
log.error("全局异常信息ex={}, StackTrace={}", e.getMessage(), ThrowableUtil.getStackTrace(e));
return R.error(e.getMessage());
}
}
} }
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<springProperty scope="context" name="springAppName" source="spring.application.name"/>
<property name="log.path" value="logs/datax-service-email"/>
<property name="log.maxHistory" value="15"/>
<property name="log.totalSizeCap" value="500MB"/>
<property name="log.maxFileSize" value="10MB"/>
<property name="log.colorPattern"
value="%magenta(%d{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %boldCyan(${springAppName:-}) %yellow(%thread) %green(%logger) %msg%n"/>
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5level ${springAppName:-} %thread %logger %msg%n"/>
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.colorPattern}</pattern>
</encoder>
</appender>
<!--输出到文件-->
<!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
<!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是project_info.log -->
<!-- 2.如果日期没有发生变化,但是当前日志的文件大小超过10MB时,对当前日志进行分割 重命名-->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志文件路径和名称-->
<File>${log.path}/info/info.log</File>
<!--是否追加到文件末尾,默认为true-->
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 日志文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
<!-- 文件名:logs/project_info.2017-12-05.0.log -->
<!-- 注意:SizeAndTimeBasedRollingPolicy中 %i和%d令牌都是强制性的,必须存在,要不会报错 -->
<fileNamePattern>${log.path}/info/info.%d.%i.log</fileNamePattern>
<!-- 每产生一个日志文件,该日志文件的保存期限为30天, ps:maxHistory的单位是根据fileNamePattern中的翻转策略自动推算出来的,例如上面选用了yyyy-MM-dd,则单位为天
如果上面选用了yyyy-MM,则单位为月,另外上面的单位默认为yyyy-MM-dd-->
<MaxHistory>${log.maxHistory}</MaxHistory>
<!-- 每个日志文件到2mb的时候开始切分,最多保留30天,但最大到500MB,哪怕没到30天也要删除多余的日志 -->
<totalSizeCap>${log.totalSizeCap}</totalSizeCap>
<!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成5KB看效果 -->
<maxFileSize>${log.maxFileSize}</maxFileSize>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log.path}/error/error.log</File>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.%d.%i.log</fileNamePattern>
<MaxHistory>${log.maxHistory}</MaxHistory>
<totalSizeCap>${log.totalSizeCap}</totalSizeCap>
<maxFileSize>${log.maxFileSize}</maxFileSize>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<root level="debug">
<appender-ref ref="console"/>
</root>
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
</configuration>
\ No newline at end of file
<?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.email.dao.EmailDao">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.datax.service.email.api.entity.EmailEntity">
<result column="id" property="id" />
<result column="status" property="status" />
<result column="create_by" property="createBy" />
<result column="create_time" property="createTime" />
<result column="update_by" property="updateBy" />
<result column="update_time" property="updateTime" />
<result column="remark" property="remark" />
<result column="subject" property="subject" />
<result column="text" property="text" />
<result column="tos" property="tos" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
<result column="ccs" property="ccs" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
<result column="bccs" property="bccs" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id,
status,
create_by,
create_time,
update_by,
update_time,
remark,
subject, text, tos, ccs, bccs
</sql>
</mapper>
package cn.datax.service.system.api.feign; package cn.datax.service.system.api.feign;
import cn.datax.common.core.R;
import cn.datax.service.system.api.dto.LogDto; import cn.datax.service.system.api.dto.LogDto;
import cn.datax.service.system.api.feign.factory.LogServiceFeignFallbackFactory; import cn.datax.service.system.api.feign.factory.LogServiceFeignFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
...@@ -11,5 +10,5 @@ import org.springframework.web.bind.annotation.RequestBody; ...@@ -11,5 +10,5 @@ import org.springframework.web.bind.annotation.RequestBody;
public interface LogServiceFeign { public interface LogServiceFeign {
@PostMapping("/inner/logs") @PostMapping("/inner/logs")
R saveLog(@RequestBody LogDto logDto); void saveLog(@RequestBody LogDto logDto);
} }
package cn.datax.service.system.api.feign; package cn.datax.service.system.api.feign;
import cn.datax.common.core.R;
import cn.datax.service.system.api.feign.factory.UserServiceFeignFallbackFactory; import cn.datax.service.system.api.feign.factory.UserServiceFeignFallbackFactory;
import cn.datax.service.system.api.vo.UserInfo;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
...@@ -10,5 +10,5 @@ import org.springframework.web.bind.annotation.PathVariable; ...@@ -10,5 +10,5 @@ import org.springframework.web.bind.annotation.PathVariable;
public interface UserServiceFeign { public interface UserServiceFeign {
@GetMapping("/login/username/{username}") @GetMapping("/login/username/{username}")
R loginByUsername(@PathVariable("username") String username); UserInfo loginByUsername(@PathVariable("username") String username);
} }
package cn.datax.service.system.api.feign.fallback; package cn.datax.service.system.api.feign.fallback;
import cn.datax.common.core.R;
import cn.datax.service.system.api.dto.LogDto; import cn.datax.service.system.api.dto.LogDto;
import cn.datax.service.system.api.feign.LogServiceFeign; import cn.datax.service.system.api.feign.LogServiceFeign;
import lombok.Setter; import lombok.Setter;
...@@ -15,8 +14,7 @@ public class LogServiceFeignFallbackImpl implements LogServiceFeign { ...@@ -15,8 +14,7 @@ public class LogServiceFeignFallbackImpl implements LogServiceFeign {
private Throwable cause; private Throwable cause;
@Override @Override
public R saveLog(LogDto logDto) { public void saveLog(LogDto logDto) {
log.error("feign 调用出错", cause); log.error("feign 调用出错", cause);
return null;
} }
} }
package cn.datax.service.system.api.feign.fallback; package cn.datax.service.system.api.feign.fallback;
import cn.datax.common.core.R;
import cn.datax.service.system.api.feign.UserServiceFeign; import cn.datax.service.system.api.feign.UserServiceFeign;
import cn.datax.service.system.api.vo.UserInfo;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -14,7 +14,7 @@ public class UserServiceFeignFallbackImpl implements UserServiceFeign { ...@@ -14,7 +14,7 @@ public class UserServiceFeignFallbackImpl implements UserServiceFeign {
private Throwable cause; private Throwable cause;
@Override @Override
public R loginByUsername(String username) { public UserInfo loginByUsername(String username) {
log.error("feign 调用{}出错", username, cause); log.error("feign 调用{}出错", username, cause);
return null; return null;
} }
......
package cn.datax.service.system.controller; package cn.datax.service.system.controller;
import cn.datax.common.base.BaseController; import cn.datax.common.base.BaseController;
import cn.datax.common.core.R;
import cn.datax.common.security.annotation.DataInner; import cn.datax.common.security.annotation.DataInner;
import cn.datax.service.system.api.dto.LogDto; import cn.datax.service.system.api.dto.LogDto;
import cn.datax.service.system.async.AsyncTask; import cn.datax.service.system.async.AsyncTask;
...@@ -17,8 +16,7 @@ public class InnerController extends BaseController { ...@@ -17,8 +16,7 @@ public class InnerController extends BaseController {
@DataInner @DataInner
@PostMapping("/logs") @PostMapping("/logs")
public R saveLog(@RequestBody LogDto log) { public void saveLog(@RequestBody LogDto log) {
asyncTask.doTask(log); asyncTask.doTask(log);
return R.ok();
} }
} }
...@@ -8,18 +8,10 @@ import cn.datax.service.system.service.UserService; ...@@ -8,18 +8,10 @@ import cn.datax.service.system.service.UserService;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.security.oauth2.common.OAuth2AccessToken; import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.common.OAuth2RefreshToken; import org.springframework.security.oauth2.common.OAuth2RefreshToken;
import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.util.Map;
@Slf4j @Slf4j
@RestController @RestController
...@@ -31,40 +23,11 @@ public class LoginController extends BaseController { ...@@ -31,40 +23,11 @@ public class LoginController extends BaseController {
@Autowired @Autowired
private TokenStore tokenStore; private TokenStore tokenStore;
@Autowired
private RestTemplate restTemplate;
@Value("${security.oauth2.client.access-token-uri}")
private String accessTokenUri;
@Value("${security.oauth2.client.client-id}")
private String clientId;
@Value("${security.oauth2.client.client-secret}")
private String clientSecret;
@Value("${security.oauth2.client.scope}")
private String scope;
@DataInner @DataInner
@GetMapping("/login/username/{username}") @GetMapping("/login/username/{username}")
public R loginByUsername(@PathVariable String username) { public UserInfo loginByUsername(@PathVariable String username) {
UserInfo userInfo = userService.getUserByUsername(username); UserInfo userInfo = userService.getUserByUsername(username);
return R.ok().setData(userInfo); return userInfo;
}
@PostMapping("/login")
public R login(String username, String password) {
MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
paramsMap.set("username", username);
paramsMap.set("password", password);
paramsMap.set("grant_type", "password");
paramsMap.set("scope", scope);
paramsMap.set("client_id", clientId);
paramsMap.set("client_secret", clientSecret);
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity(paramsMap, null);
Object object = restTemplate.postForObject(accessTokenUri, request, Object.class);
if(null != object){
return R.ok().setData(object);
}
return R.error();
} }
@DeleteMapping("/logout/{token}") @DeleteMapping("/logout/{token}")
......
...@@ -53,6 +53,7 @@ ...@@ -53,6 +53,7 @@
<foreach collection="roleIds" index="index" item="item" open="(" separator="," close=")"> <foreach collection="roleIds" index="index" item="item" open="(" separator="," close=")">
#{item} #{item}
</foreach> </foreach>
ORDER BY m.menu_sort ASC
</select> </select>
<select id="selectMenuByUserId" parameterType="java.lang.String" resultMap="BaseResultMap"> <select id="selectMenuByUserId" parameterType="java.lang.String" resultMap="BaseResultMap">
...@@ -63,6 +64,7 @@ ...@@ -63,6 +64,7 @@
LEFT JOIN sys_role_menu rm ON m.id = rm.menu_id LEFT JOIN sys_role_menu rm ON m.id = rm.menu_id
LEFT JOIN sys_user_role ur ON rm.role_id = ur.role_id LEFT JOIN sys_user_role ur ON rm.role_id = ur.role_id
WHERE m.status = 1 AND ur.user_id = #{userId} WHERE m.status = 1 AND ur.user_id = #{userId}
ORDER BY m.menu_sort ASC
</select> </select>
</mapper> </mapper>
...@@ -84,28 +84,14 @@ export function cancelDataApi (id) { ...@@ -84,28 +84,14 @@ export function cancelDataApi (id) {
export function getApiHeader (id) { export function getApiHeader (id) {
return request({ return request({
url: '/data/market/apis/' + id + '/header', url: '/data/api/apis/' + id + '/header',
method: 'get' method: 'get'
}) })
} }
export function apiRegister (id) {
return request({
url: '/data/market/apis/' + id + '/register',
method: 'post'
})
}
export function apiUnRegister (id) {
return request({
url: '/data/market/apis/' + id + '/unregister',
method: 'post'
})
}
export function getApiCall (url, header, data) { export function getApiCall (url, header, data) {
return request({ return request({
url: '/data/market/' + url, url: '/data/api/' + url,
method: 'get', method: 'get',
headers: header, headers: header,
params: data params: data
...@@ -114,7 +100,7 @@ export function getApiCall (url, header, data) { ...@@ -114,7 +100,7 @@ export function getApiCall (url, header, data) {
export function postApiCall (url, header, data) { export function postApiCall (url, header, data) {
return request({ return request({
url: '/data/market/' + url, url: '/data/api/' + url,
method: 'post', method: 'post',
headers: header, headers: header,
data: data data: data
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
<el-input v-model="form1.apiName" placeholder="请输入API名称" /> <el-input v-model="form1.apiName" placeholder="请输入API名称" />
</el-form-item> </el-form-item>
<el-form-item label="API版本" prop="apiVersion"> <el-form-item label="API版本" prop="apiVersion">
<el-input v-model="form1.apiVersion" placeholder="请输入API版本" /> <el-input v-model="form1.apiVersion" placeholder="请输入API版本,如v1.0.0" />
</el-form-item> </el-form-item>
<el-form-item label="API路径" prop="apiUrl"> <el-form-item label="API路径" prop="apiUrl">
<el-input v-model="form1.apiUrl" placeholder="请输入API路径" /> <el-input v-model="form1.apiUrl" placeholder="请输入API路径" />
......
...@@ -9,15 +9,39 @@ ...@@ -9,15 +9,39 @@
</el-button-group> </el-button-group>
</div> </div>
<div :style="classCardbody"> <div :style="classCardbody">
<el-row> <el-form ref="form1" :model="form" label-width="80px" :disabled="true">
<el-col :span="8">API名称:{{form.apiName}}</el-col> <el-row>
<el-col :span="8">API版本:{{form.apiVersion}}</el-col> <el-col :span="8">
</el-row> <el-form-item label="API名称">
<el-row> <el-input v-model="form.apiName" />
<el-col :span="8">API路径:{{form.apiUrl}}</el-col> </el-form-item>
<el-col :span="8">请求类型:{{form.reqMethod}}</el-col> </el-col>
<el-col :span="8">返回格式:{{form.resType}}</el-col> <el-col :span="8">
</el-row> <el-form-item label="API版本">
<el-input v-model="form.apiVersion" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="请求类型">
<el-input v-model="form.reqMethod" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="返回格式">
<el-input v-model="form.resType" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="16">
<el-form-item label="调用路径">
<el-input v-model="'/services/' + form.apiVersion + form.apiUrl" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-divider content-position="left">请求数据</el-divider> <el-divider content-position="left">请求数据</el-divider>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
...@@ -130,7 +154,6 @@ ...@@ -130,7 +154,6 @@
<script> <script>
import { getDataApi, getApiHeader, getApiCall, postApiCall } from '@/api/market/dataapi' import { getDataApi, getApiHeader, getApiCall, postApiCall } from '@/api/market/dataapi'
import storage from '@/utils/storage'
export default { export default {
name: 'DataApiCall', name: 'DataApiCall',
...@@ -209,8 +232,6 @@ export default { ...@@ -209,8 +232,6 @@ export default {
if (response.success) { if (response.success) {
let data = response.data let data = response.data
this.apiHeader = data this.apiHeader = data
let token = storage.ss.get('vue_template_token')
this.apiHeaderList.push({ 'KEY': 'Authorization', 'VALUE': 'Bearer ' + token, 'DESCRIPTION': '' })
this.apiHeaderList.push({ 'KEY': 'api_key', 'VALUE': this.apiHeader.apiKey, 'DESCRIPTION': '' }) this.apiHeaderList.push({ 'KEY': 'api_key', 'VALUE': this.apiHeader.apiKey, 'DESCRIPTION': '' })
this.apiHeaderList.push({ 'KEY': 'secret_key', 'VALUE': this.apiHeader.secretKey, 'DESCRIPTION': '' }) this.apiHeaderList.push({ 'KEY': 'secret_key', 'VALUE': this.apiHeader.secretKey, 'DESCRIPTION': '' })
} }
...@@ -226,7 +247,7 @@ export default { ...@@ -226,7 +247,7 @@ export default {
this.apiDataCall() this.apiDataCall()
}, },
apiDataCall () { apiDataCall () {
let url = this.form.apiVersion + this.form.apiUrl let url = 'services/' + this.form.apiVersion + this.form.apiUrl
let header = { api_key: this.apiHeader.apiKey, secret_key: this.apiHeader.secretKey } let header = { api_key: this.apiHeader.apiKey, secret_key: this.apiHeader.secretKey }
let data = {} let data = {}
data.pageNum = this.callData.pageNum data.pageNum = this.callData.pageNum
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
<el-input v-model="form1.apiName" placeholder="请输入API名称" /> <el-input v-model="form1.apiName" placeholder="请输入API名称" />
</el-form-item> </el-form-item>
<el-form-item label="API版本" prop="apiVersion"> <el-form-item label="API版本" prop="apiVersion">
<el-input v-model="form1.apiVersion" placeholder="请输入API版本" /> <el-input v-model="form1.apiVersion" placeholder="请输入API版本,如v1.0.0" />
</el-form-item> </el-form-item>
<el-form-item label="API路径" prop="apiUrl"> <el-form-item label="API路径" prop="apiUrl">
<el-input v-model="form1.apiUrl" placeholder="请输入API路径" /> <el-input v-model="form1.apiUrl" placeholder="请输入API路径" />
......
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