Commit 23336f6e by yuwei

项目初始化

parent 12d3492e
......@@ -3,15 +3,11 @@ package cn.datax.auth.service;
import cn.datax.common.core.DataConstant;
import cn.datax.common.core.DataRole;
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.vo.*;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
......@@ -31,22 +27,13 @@ public class DataUserDetailService implements UserDetailsService {
@Autowired
private UserServiceFeign userServiceFeign;
@Autowired
private ObjectMapper objectMapper;
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
//远程获取用户
R result = userServiceFeign.loginByUsername(s);
if(result == null || !result.isSuccess() || ObjectUtil.isEmpty(result.getData())){
// 远程获取用户
UserInfo userInfo = userServiceFeign.loginByUsername(s);
if(userInfo == null){
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:不可用
boolean enabled = true;
// 过期性 :true:没过期 false:过期
......
......@@ -96,8 +96,7 @@ public class LogAspect {
.setClassName(className).setMethodName(methodName);
try {
logDto.setParams(objectMapper.writeValueAsString(getRequestParams(joinPoint)));
} catch (JsonProcessingException e) {
}
} catch (JsonProcessingException e) {}
// 保存数据库
logServiceFeign.saveLog(logDto);
}
......
......@@ -51,10 +51,12 @@ public class DataSecurityProtectConfig {
requestTemplate.header(DataConstant.Security.TOKENHEADER.getVal(), gatewayToken);
// 请求头中添加原请求头中的 Token
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Object details = authentication.getDetails();
if (details instanceof OAuth2AuthenticationDetails) {
String authorizationToken = ((OAuth2AuthenticationDetails) details).getTokenValue();
requestTemplate.header(DataConstant.Security.AUTHORIZATION.getVal(), DataConstant.Security.TOKENTYPE.getVal() + authorizationToken);
if (authentication != null) {
Object details = authentication.getDetails();
if (details instanceof OAuth2AuthenticationDetails) {
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;
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 org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
......@@ -9,6 +9,6 @@ import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(contextId = "dataSourceServiceFeign", value = "datax-service-data-factory", fallbackFactory = DataSourceServiceFeignFallbackFactory.class)
public interface DataSourceServiceFeign {
@GetMapping("/dataSources/{id}")
R getDataSourceById(@PathVariable("id") String id);
@GetMapping("/inner/sources/{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;
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 lombok.Setter;
import lombok.extern.slf4j.Slf4j;
......@@ -14,7 +14,7 @@ public class DataSourceServiceFeignFallbackImpl implements DataSourceServiceFeig
private Throwable cause;
@Override
public R getDataSourceById(String id) {
public DataSourceEntity getDataSourceById(String id) {
log.error("feign 调用{}出错", id, cause);
return null;
}
......
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.datax.service.data.factory.api.feign.factory.DataSourceServiceFeignFallbackFactory,\
cn.datax.service.data.factory.api.feign.fallback.DataSourceServiceFeignFallbackImpl
cn.datax.service.data.factory.api.feign.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;
import cn.datax.common.core.R;
import cn.datax.common.database.DataSourceFactory;
import cn.datax.common.database.DbQuery;
import cn.datax.common.database.constants.DbQueryProperty;
......@@ -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.service.SqlConsoleService;
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 net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
......@@ -43,9 +39,6 @@ public class SqlConsoleServiceImpl implements SqlConsoleService {
@Autowired
private DataSourceServiceFeign dataSourceServiceFeign;
@Autowired
private ObjectMapper objectMapper;
private static Map<String, List<Connection>> connectionMap = new ConcurrentHashMap<>();
@Override
......@@ -62,15 +55,10 @@ public class SqlConsoleServiceImpl implements SqlConsoleService {
if (CollUtil.isEmpty(sqls)) {
throw new DataException("未解析到SQL语句");
}
R sourceResult = dataSourceServiceFeign.getDataSourceById(sqlConsoleDto.getSourceId());
if(sourceResult == null || !sourceResult.isSuccess() || ObjectUtil.isEmpty(sourceResult.getData())){
DataSourceEntity dataSource = dataSourceServiceFeign.getDataSourceById(sqlConsoleDto.getSourceId());
if(dataSource == null){
throw new DataException("SQL工作台查询数据源出错");
}
DataSourceEntity dataSource = null;
try {
dataSource = objectMapper.readValue(objectMapper.writeValueAsString(sourceResult.getData()), DataSourceEntity.class);
} catch (JsonProcessingException e) {
}
DbSchema dbSchema = dataSource.getDbSchema();
DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(),
dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName(), dbSchema.getSid());
......
......@@ -5,9 +5,7 @@ import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.data.factory.api.dto.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.vo.DataSourceVo;
import cn.datax.service.data.factory.api.vo.DataThemeVo;
import cn.datax.service.data.factory.api.query.DataThemeQuery;
import cn.datax.service.data.factory.mapstruct.DataThemeMapper;
......
package cn.datax.service.data.factory.controller;
import cn.datax.common.base.BaseController;
import cn.datax.service.data.factory.api.entity.DataSetEntity;
import cn.datax.service.data.factory.api.entity.DataSourceEntity;
import cn.datax.service.data.factory.service.DataSetService;
import cn.datax.service.data.factory.service.DataSourceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
......@@ -8,4 +15,21 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/inner")
public class InnerController extends BaseController {
@Autowired
private DataSourceService dataSourceService;
@Autowired
private DataSetService dataSetService;
@GetMapping("/sources/{id}")
public DataSourceEntity getDataSourceById(@PathVariable("id") String id) {
DataSourceEntity dataSourceEntity = dataSourceService.getDataSourceById(id);
return dataSourceEntity;
}
@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;
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.impl.ApiMappingEngine;
import com.fasterxml.jackson.databind.ObjectMapper;
......
......@@ -59,7 +59,9 @@ public class DataResourceServerConfig extends ResourceServerConfigurerAdapter {
"/swagger-resources/**",
"/webjars/**",
// feign 内部调用不用授权
"/inner/**"
"/inner/**",
// 注册接口 不用授权
"/services/**"
).permitAll()
.anyRequest().authenticated()
.and().csrf().disable();
......
......@@ -2,9 +2,7 @@ package cn.datax.service.data.market.api.mapping.config;
import cn.datax.common.rabbitmq.config.RabbitMqConstant;
import cn.datax.common.utils.ThrowableUtil;
import cn.datax.service.data.market.api.entity.DataApiEntity;
import cn.datax.service.data.market.api.feign.DataApiServiceFeign;
import com.fasterxml.jackson.databind.ObjectMapper;
import cn.datax.service.data.market.api.mapping.service.QueueHandlerService;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
......@@ -15,18 +13,12 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@Component
public class RabbitMqListenerConfig {
@Autowired
private DataApiServiceFeign dataApiServiceFeign;
@Autowired
private MappingHandlerMapping mappingHandlerMapping;
@Autowired
private ObjectMapper objectMapper;
private QueueHandlerService queueHandlerService;
/**
* Fanout 交换机
......@@ -36,11 +28,8 @@ public class RabbitMqListenerConfig {
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 {
try {
System.out.println("fanoutQueueRelease接收到了:" + id);
DataApiEntity dataApiEntity = dataApiServiceFeign.getDataApiById(id);
if(dataApiEntity != null){
log.info("api={}", dataApiEntity);
}
log.info("fanoutQueueRelease接收到了:{}", id);
queueHandlerService.handlerRelease(id);
}catch (Exception e){
log.error("全局异常信息ex={}, StackTrace={}", e.getMessage(), ThrowableUtil.getStackTrace(e));
}
......@@ -54,7 +43,8 @@ public class RabbitMqListenerConfig {
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 {
try {
System.out.println("fanoutQueueCancel接收到了:" + id);
log.info("fanoutQueueCancel接收到了:{}", id);
queueHandlerService.handlerCancel(id);
}catch (Exception 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.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.service.ApiExecuteService;
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
@RequestMapping("/apis")
......
......@@ -4,7 +4,6 @@ import cn.datax.common.base.BaseController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/inner")
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 lombok.extern.slf4j.Slf4j;
......@@ -31,7 +31,8 @@ public class MappingHandlerMapping {
}
}
private String prefix = "v1";
private String ignore = "services";
private String prefix = "v1.0.0";
private String separator = "/";
public MappingHandlerMapping() {}
......@@ -99,10 +100,16 @@ public class MappingHandlerMapping {
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) {
if (version != null) {
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.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.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.service.ApiExecuteService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Slf4j
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class ApiExecuteServiceImpl implements ApiExecuteService {
@Override
public ApiHeader getApiHeader(String id) {
ApiHeader apiHeader = new ApiHeader();
try {
ApiHeader apiHeader = new ApiHeader();
MD5Util mt = MD5Util.getInstance();
apiHeader.setApiKey(mt.encode(id));
apiHeader.setSecretKey(mt.encode(SecurityUtil.getUserId()));
return apiHeader;
} 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;
import cn.datax.common.core.R;
import cn.datax.common.database.DataSourceFactory;
import cn.datax.common.database.DbQuery;
import cn.datax.common.database.constants.DbQueryProperty;
......@@ -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.utils.SqlBuilderUtil;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -44,19 +40,11 @@ public class ApiMappingEngine {
@Autowired
private ApiMaskServiceFeign apiMaskServiceFeign;
@Autowired
private ObjectMapper objectMapper;
public PageResult<Map<String, Object>> execute(DataApiEntity dataApi, Map<String, Object> params) {
R sourceResult = dataSourceServiceFeign.getDataSourceById(dataApi.getExecuteConfig().getSourceId());
if(sourceResult == null || !sourceResult.isSuccess() || ObjectUtil.isEmpty(sourceResult.getData())){
DataSourceEntity dataSource = dataSourceServiceFeign.getDataSourceById(dataApi.getExecuteConfig().getSourceId());
if (dataSource == null) {
throw new DataException("API调用查询数据源出错");
}
DataSourceEntity dataSource = null;
try {
dataSource = objectMapper.readValue(objectMapper.writeValueAsString(sourceResult.getData()), DataSourceEntity.class);
} catch (JsonProcessingException e) {
}
DbSchema dbSchema = dataSource.getDbSchema();
DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(),
dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName(), dbSchema.getSid());
......@@ -75,17 +63,11 @@ public class ApiMappingEngine {
}
Map<String, Object> acceptedFilters = sqlFilterResult.getAcceptedFilters();
// 数据脱敏
List<FieldRule> rules = null;
R apiMaskResult = apiMaskServiceFeign.getApiMaskByApiId(dataApi.getId());
if(apiMaskResult == null || !apiMaskResult.isSuccess() || ObjectUtil.isEmpty(apiMaskResult.getData())){
List<FieldRule> rules;
ApiMaskEntity apiMaskEntity = apiMaskServiceFeign.getApiMaskByApiId(dataApi.getId());
if (apiMaskEntity == null) {
throw new DataException("API调用查询数据脱敏出错");
}
ApiMaskEntity apiMaskEntity = null;
try {
apiMaskEntity = objectMapper.readValue(objectMapper.writeValueAsString(apiMaskResult.getData()), ApiMaskEntity.class);
} catch (JsonProcessingException e) {
}
if (apiMaskEntity != null) {
} else {
rules = apiMaskEntity.getRules();
}
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;
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 org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
......@@ -9,6 +9,6 @@ import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(contextId = "apiMaskServiceFeign", value = "datax-service-data-market", fallbackFactory = ApiMaskServiceFeignFallbackFactory.class)
public interface ApiMaskServiceFeign {
@GetMapping("/apiMasks/api/{apiId}")
R getApiMaskByApiId(@PathVariable("apiId") String apiId);
@GetMapping("/inner/apiMasks/api/{id}")
ApiMaskEntity getApiMaskByApiId(@PathVariable("id") String id);
}
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 lombok.Setter;
import lombok.extern.slf4j.Slf4j;
......@@ -14,7 +14,7 @@ public class ApiMaskServiceFeignFallbackImpl implements ApiMaskServiceFeign {
private Throwable cause;
@Override
public R getApiMaskByApiId(String id) {
public ApiMaskEntity getApiMaskByApiId(String id) {
log.error("feign 调用{}出错", id, cause);
return null;
}
......
package cn.datax.service.data.market.controller;
import cn.datax.common.base.BaseController;
import cn.datax.common.core.R;
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.mapstruct.DataApiMapper;
import cn.datax.service.data.market.service.ApiMaskService;
import cn.datax.service.data.market.service.DataApiService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
......@@ -19,11 +19,19 @@ public class InnerController extends BaseController {
@Autowired
private DataApiService dataApiService;
@Autowired
private ApiMaskService apiMaskService;
@DataInner
@GetMapping("/apis/{id}")
public DataApiEntity getDataApiById(@PathVariable String id) {
public DataApiEntity getDataApiById(@PathVariable("id") String id) {
DataApiEntity dataApiEntity = dataApiService.getDataApiById(id);
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;
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 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.RestController;
......@@ -19,21 +10,4 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/inner")
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;
import cn.datax.common.core.R;
import cn.datax.service.system.api.dto.LogDto;
import cn.datax.service.system.api.feign.factory.LogServiceFeignFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
......@@ -11,5 +10,5 @@ import org.springframework.web.bind.annotation.RequestBody;
public interface LogServiceFeign {
@PostMapping("/inner/logs")
R saveLog(@RequestBody LogDto logDto);
void saveLog(@RequestBody LogDto logDto);
}
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.vo.UserInfo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
......@@ -10,5 +10,5 @@ import org.springframework.web.bind.annotation.PathVariable;
public interface UserServiceFeign {
@GetMapping("/login/username/{username}")
R loginByUsername(@PathVariable("username") String username);
UserInfo loginByUsername(@PathVariable("username") String username);
}
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.feign.LogServiceFeign;
import lombok.Setter;
......@@ -15,8 +14,7 @@ public class LogServiceFeignFallbackImpl implements LogServiceFeign {
private Throwable cause;
@Override
public R saveLog(LogDto logDto) {
public void saveLog(LogDto logDto) {
log.error("feign 调用出错", cause);
return null;
}
}
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.vo.UserInfo;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
......@@ -14,7 +14,7 @@ public class UserServiceFeignFallbackImpl implements UserServiceFeign {
private Throwable cause;
@Override
public R loginByUsername(String username) {
public UserInfo loginByUsername(String username) {
log.error("feign 调用{}出错", username, cause);
return null;
}
......
package cn.datax.service.system.controller;
import cn.datax.common.base.BaseController;
import cn.datax.common.core.R;
import cn.datax.common.security.annotation.DataInner;
import cn.datax.service.system.api.dto.LogDto;
import cn.datax.service.system.async.AsyncTask;
......@@ -17,8 +16,7 @@ public class InnerController extends BaseController {
@DataInner
@PostMapping("/logs")
public R saveLog(@RequestBody LogDto log) {
public void saveLog(@RequestBody LogDto log) {
asyncTask.doTask(log);
return R.ok();
}
}
......@@ -8,18 +8,10 @@ import cn.datax.service.system.service.UserService;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
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.OAuth2RefreshToken;
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.client.RestTemplate;
import java.util.Map;
@Slf4j
@RestController
......@@ -31,40 +23,11 @@ public class LoginController extends BaseController {
@Autowired
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
@GetMapping("/login/username/{username}")
public R loginByUsername(@PathVariable String username) {
public UserInfo loginByUsername(@PathVariable String username) {
UserInfo userInfo = userService.getUserByUsername(username);
return R.ok().setData(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();
return userInfo;
}
@DeleteMapping("/logout/{token}")
......
......@@ -53,6 +53,7 @@
<foreach collection="roleIds" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
ORDER BY m.menu_sort ASC
</select>
<select id="selectMenuByUserId" parameterType="java.lang.String" resultMap="BaseResultMap">
......@@ -63,6 +64,7 @@
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
WHERE m.status = 1 AND ur.user_id = #{userId}
ORDER BY m.menu_sort ASC
</select>
</mapper>
......@@ -84,28 +84,14 @@ export function cancelDataApi (id) {
export function getApiHeader (id) {
return request({
url: '/data/market/apis/' + id + '/header',
url: '/data/api/apis/' + id + '/header',
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) {
return request({
url: '/data/market/' + url,
url: '/data/api/' + url,
method: 'get',
headers: header,
params: data
......@@ -114,7 +100,7 @@ export function getApiCall (url, header, data) {
export function postApiCall (url, header, data) {
return request({
url: '/data/market/' + url,
url: '/data/api/' + url,
method: 'post',
headers: header,
data: data
......
......@@ -19,7 +19,7 @@
<el-input v-model="form1.apiName" placeholder="请输入API名称" />
</el-form-item>
<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 label="API路径" prop="apiUrl">
<el-input v-model="form1.apiUrl" placeholder="请输入API路径" />
......
......@@ -9,15 +9,39 @@
</el-button-group>
</div>
<div :style="classCardbody">
<el-row>
<el-col :span="8">API名称:{{form.apiName}}</el-col>
<el-col :span="8">API版本:{{form.apiVersion}}</el-col>
</el-row>
<el-row>
<el-col :span="8">API路径:{{form.apiUrl}}</el-col>
<el-col :span="8">请求类型:{{form.reqMethod}}</el-col>
<el-col :span="8">返回格式:{{form.resType}}</el-col>
</el-row>
<el-form ref="form1" :model="form" label-width="80px" :disabled="true">
<el-row>
<el-col :span="8">
<el-form-item label="API名称">
<el-input v-model="form.apiName" />
</el-form-item>
</el-col>
<el-col :span="8">
<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-row>
<el-col :span="24">
......@@ -130,7 +154,6 @@
<script>
import { getDataApi, getApiHeader, getApiCall, postApiCall } from '@/api/market/dataapi'
import storage from '@/utils/storage'
export default {
name: 'DataApiCall',
......@@ -209,8 +232,6 @@ export default {
if (response.success) {
let data = response.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': 'secret_key', 'VALUE': this.apiHeader.secretKey, 'DESCRIPTION': '' })
}
......@@ -226,7 +247,7 @@ export default {
this.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 data = {}
data.pageNum = this.callData.pageNum
......
......@@ -19,7 +19,7 @@
<el-input v-model="form1.apiName" placeholder="请输入API名称" />
</el-form-item>
<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 label="API路径" prop="apiUrl">
<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