Commit b07012f4 by yuwei

项目初始化

parent 592d0294
package cn.datax.service.data.market.api.mapping.config;
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.hutool.core.collection.CollUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ConfigurableApplicationContext;
......@@ -9,6 +14,7 @@ import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
@Component
@RequiredArgsConstructor
......@@ -17,6 +23,12 @@ public class StartedUpRunner implements ApplicationRunner {
private final ConfigurableApplicationContext context;
private final Environment environment;
@Autowired
private DataApiServiceFeign dataApiServiceFeign;
@Autowired
private MappingHandlerMapping mappingHandlerMapping;
@Override
public void run(ApplicationArguments args) {
if (context.isActive()) {
......@@ -26,6 +38,12 @@ public class StartedUpRunner implements ApplicationRunner {
"端口号:" + environment.getProperty("server.port") + "\n" +
"-----------------------------------------";
System.out.println(banner);
// 项目启动时,初始化已发布的接口
List<DataApiEntity> releaseDataApiList = dataApiServiceFeign.getReleaseDataApiList();
if (CollUtil.isNotEmpty(releaseDataApiList)) {
releaseDataApiList.stream().forEach(api -> mappingHandlerMapping.registerMapping(api));
}
}
}
}
......@@ -91,7 +91,10 @@ public class RequestHandler {
return R.error(e.getMessage());
} finally {
ApiLogDto apiLogDto = ThreadUtil.getInstance().get();
apiLogService.saveApiLog(apiLogDto);
log.info("ApiLogDto信息={}", apiLogDto);
if (apiLogDto != null) {
apiLogService.saveApiLog(apiLogDto);
}
ThreadUtil.getInstance().remove();
}
}
......
......@@ -45,15 +45,31 @@ public class RequestInterceptor {
log.info("getRequestURI的值:" + uri);
String ipAddr = IPUtil.getIpAddr(request);
log.info("ipAddr的值:" + ipAddr);
// 记录日志
ApiLogDto log = new ApiLogDto();
log.setCallerIp(ipAddr);
log.setCallerUrl(uri);
log.setCallerParams(new ObjectMapper().writeValueAsString(params));
log.setCallerDate(LocalDateTime.now());
log.setStatus(DataConstant.EnableState.ENABLE.getKey());
ThreadUtil.getInstance().set(log);
// 密钥校验
String apiKey = request.getHeader("api_key");
String secretKey = request.getHeader("secret_key");
if (StrUtil.isBlank(apiKey) || StrUtil.isBlank(secretKey)) {
ThreadUtil.getInstance().get().setStatus(DataConstant.EnableState.DISABLE.getKey());
ThreadUtil.getInstance().get().setMsg("api_key或secret_key空");
return R.error("api_key或secret_key空");
}
MD5Util mt = MD5Util.getInstance();
String apiId = mt.decode(apiKey);
String userId = mt.decode(secretKey);
ThreadUtil.getInstance().get().setApiId(apiId);
ThreadUtil.getInstance().get().setCallerId(userId);
// 黑名单校验
String deny = api.getDeny();
if (StrUtil.isNotBlank(deny)) {
......@@ -61,6 +77,8 @@ public class RequestInterceptor {
if (CollUtil.isNotEmpty(denyList)) {
for (String ip : denyList) {
if(ip.equals(ipAddr)){
ThreadUtil.getInstance().get().setStatus(DataConstant.EnableState.DISABLE.getKey());
ThreadUtil.getInstance().get().setMsg("此IP已被加入API调用黑名单");
return R.error("此IP已被加入API调用黑名单");
}
}
......@@ -68,15 +86,24 @@ public class RequestInterceptor {
}
// 参数校验
if (MapUtil.isNotEmpty(params)) {
api.getReqParams().stream().forEach(param -> {
if (params.containsKey(param.getParamName())) {
// 参数类型是否正确
ParamType.parse(ParamType.getParamType(param.getParamType()), params.get(param.getParamName()));
}
});
try {
api.getReqParams().stream().forEach(param -> {
if (params.containsKey(param.getParamName())) {
// 参数类型是否正确
ParamType.parse(ParamType.getParamType(param.getParamType()), params.get(param.getParamName()));
}
});
} catch (Exception e) {
ThreadUtil.getInstance().get().setStatus(DataConstant.EnableState.DISABLE.getKey());
ThreadUtil.getInstance().get().setMsg(e.getMessage());
return R.error(e.getMessage());
}
}
// 限流校验
String apiName = api.getApiName();
ThreadUtil.getInstance().get().setApiName(apiName);
String rateLimit = api.getRateLimit();
rateLimit = Optional.ofNullable(rateLimit).orElse(DataConstant.TrueOrFalse.TRUE.getKey());
if (DataConstant.TrueOrFalse.TRUE.getKey().equals(rateLimit)) {
......@@ -97,20 +124,11 @@ public class RequestInterceptor {
redisTemplate.opsForValue().set(key, maxTimes + 1, seconds, TimeUnit.SECONDS);
} else {
// 请求过于频繁
ThreadUtil.getInstance().get().setStatus(DataConstant.EnableState.DISABLE.getKey());
ThreadUtil.getInstance().get().setMsg("API调用过于频繁");
return R.error("API调用过于频繁");
}
}
// 记录日志
ApiLogDto log = new ApiLogDto();
log.setApiId(apiId);
log.setApiName(apiName);
log.setCallerId(userId);
log.setCallerIp(ipAddr);
log.setCallerUrl(uri);
log.setCallerParams(new ObjectMapper().writeValueAsString(params));
log.setCallerDate(LocalDateTime.now());
log.setStatus(DataConstant.EnableState.ENABLE.getKey());
ThreadUtil.getInstance().set(log);
return null;
}
......
......@@ -25,7 +25,6 @@ import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@Slf4j
@Service
......@@ -50,8 +49,8 @@ public class ApiMappingEngine {
dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName(), dbSchema.getSid());
DbQuery dbQuery = dataSourceFactory.createDbQuery(dbQueryProperty);
// 参数
Integer pageNum = Optional.ofNullable(params).map(map -> Integer.parseInt(String.valueOf(map.get("pageNum")))).orElse(1);
Integer pageSize = Optional.ofNullable(params).map(map -> Integer.parseInt(String.valueOf(map.get("pageSize")))).orElse(20);
Integer pageNum = (Integer) params.getOrDefault("pageNum", 1);
Integer pageSize = (Integer) params.getOrDefault("pageSize", 20);
PageUtil pageUtil = new PageUtil(pageNum, pageSize);
Integer offset = pageUtil.getOffset();
SqlBuilderUtil.SqlFilterResult sqlFilterResult;
......
......@@ -6,9 +6,14 @@ import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.List;
@FeignClient(contextId = "dataApiServiceFeign", value = "datax-service-data-market", fallbackFactory = DataApiServiceFeignFallbackFactory.class)
public interface DataApiServiceFeign {
@GetMapping("/inner/apis/{id}")
DataApiEntity getDataApiById(@PathVariable("id") String id);
@GetMapping("/inner/apis/release/list")
List<DataApiEntity> getReleaseDataApiList();
}
......@@ -6,6 +6,8 @@ import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
@Slf4j
@Component
public class DataApiServiceFeignFallbackImpl implements DataApiServiceFeign {
......@@ -18,4 +20,10 @@ public class DataApiServiceFeignFallbackImpl implements DataApiServiceFeign {
log.error("feign 调用{}出错", id, cause);
return null;
}
@Override
public List<DataApiEntity> getReleaseDataApiList() {
log.error("feign 调用出错", cause);
return null;
}
}
package cn.datax.service.data.market.config;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ConfigurableApplicationContext;
......
package cn.datax.service.data.market.controller;
import cn.datax.common.base.BaseController;
import cn.datax.common.core.DataConstant;
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.service.ApiMaskService;
import cn.datax.service.data.market.service.DataApiService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/inner")
public class InnerController extends BaseController {
......@@ -29,6 +33,16 @@ public class InnerController extends BaseController {
return dataApiEntity;
}
@DataInner
@GetMapping("/apis/release/list")
public List<DataApiEntity> getReleaseDataApiList() {
QueryWrapper<DataApiEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", DataConstant.ApiState.RELEASE.getKey());
List<DataApiEntity> dataApiEntityList = dataApiService.list(queryWrapper);
return dataApiEntityList;
}
@DataInner
@GetMapping("/apiMasks/api/{id}")
public ApiMaskEntity getApiMaskByApiId(@PathVariable("id") String id) {
ApiMaskEntity apiMaskEntity = apiMaskService.getApiMaskByApiId(id);
......
......@@ -225,10 +225,18 @@ public class DataApiServiceImpl extends BaseServiceImpl<DataApiDao, DataApiEntit
@Override
public void releaseDataApi(String id) {
rabbitTemplate.convertAndSend(RabbitMqConstant.FANOUT_EXCHANGE_API_RELEASE_NAME, "", id);
DataApiEntity dataApiEntity = new DataApiEntity();
dataApiEntity.setId(id);
dataApiEntity.setStatus(DataConstant.ApiState.RELEASE.getKey());
dataApiDao.updateById(dataApiEntity);
}
@Override
public void cancelDataApi(String id) {
rabbitTemplate.convertAndSend(RabbitMqConstant.FANOUT_EXCHANGE_API_CANCEL_NAME, "", id);
DataApiEntity dataApiEntity = new DataApiEntity();
dataApiEntity.setId(id);
dataApiEntity.setStatus(DataConstant.ApiState.CANCEL.getKey());
dataApiDao.updateById(dataApiEntity);
}
}
......@@ -202,6 +202,8 @@ export default {
// 默认选择中表格头
checkedTableColumns: [],
tableSize: 'medium',
// 状态数据字典
statusOptions: [],
// 主题表格数据
dataThemeList: [],
// 总数据条数
......@@ -215,6 +217,11 @@ export default {
}
},
created () {
this.getDicts('sys_common_status').then(response => {
if (response.success) {
this.statusOptions = response.data
}
})
this.getList()
},
mounted () {
......@@ -331,11 +338,11 @@ export default {
this.getList()
},
statusFormatter (row, column, cellValue, index) {
let dictText = row.status_dictText
let dictLabel = this.selectDictLabel(this.statusOptions, cellValue)
if (cellValue === '1') {
return <el-tag type="success">{dictText}</el-tag>
return <el-tag type="success">{dictLabel}</el-tag>
} else {
return <el-tag type="warning">{dictText}</el-tag>
return <el-tag type="warning">{dictLabel}</el-tag>
}
}
}
......
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