diff --git a/common/common-code/src/main/java/cn/fateverse/common/code/console/MultiThreadedCapture.java b/common/common-code/src/main/java/cn/fateverse/common/code/console/MultiThreadedCapture.java index a0f4ddf..491b792 100644 --- a/common/common-code/src/main/java/cn/fateverse/common/code/console/MultiThreadedCapture.java +++ b/common/common-code/src/main/java/cn/fateverse/common/code/console/MultiThreadedCapture.java @@ -27,6 +27,9 @@ public class MultiThreadedCapture { try { result = task.execute(); } catch (Exception e) { + if (e instanceof CustomException){ + throw (CustomException) e; + } throw new RuntimeException(e); } finally { System.setOut(oldOut); diff --git a/common/common-code/src/main/java/cn/fateverse/common/code/engine/JavaScriptEngine.java b/common/common-code/src/main/java/cn/fateverse/common/code/engine/JavaScriptEngine.java index c54dc58..e75db28 100644 --- a/common/common-code/src/main/java/cn/fateverse/common/code/engine/JavaScriptEngine.java +++ b/common/common-code/src/main/java/cn/fateverse/common/code/engine/JavaScriptEngine.java @@ -47,10 +47,17 @@ public class JavaScriptEngine { return MultiThreadedCapture.capture(() -> { Context context = Context.newBuilder() .allowAllAccess(true) - .allowHostClassLoading(true) - .allowIO(true) - .allowNativeAccess(true).build(); - context.eval("js", script); +// .allowHostClassLoading(true) +// .allowIO(true) +// .allowNativeAccess(true) + .build(); + try { + context.eval("js", script); + } catch (Exception e) { + String message = e.getMessage(); + message = message.replace("java.lang.RuntimeException: org.graalvm.polyglot.PolyglotException: SyntaxError:", ""); + throw new CustomException("js has error : " + message); + } Value executeFunction = context.getBindings("js").getMember(functionName); Value javaObjectAsValue = Value.asValue(args); Value result = executeFunction.execute(javaObjectAsValue); diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/controller/PortalController.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/controller/PortalController.java index 0e50a59..f254e0e 100644 --- a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/controller/PortalController.java +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/controller/PortalController.java @@ -5,6 +5,7 @@ import cn.fateverse.common.core.result.page.TableDataInfo; import cn.fateverse.common.core.utils.ObjectUtils; import cn.fateverse.common.decrypt.annotation.Encrypt; import cn.fateverse.common.decrypt.annotation.EncryptField; +import cn.fateverse.query.entity.dto.DataAdapterCodeDto; import cn.fateverse.query.entity.dto.MockParam; import cn.fateverse.query.entity.dto.PortalDto; import cn.fateverse.query.entity.query.PortalQuery; @@ -107,6 +108,14 @@ public class PortalController { return Result.ok(result); } + @ApiOperation("保存代码") + @PostMapping("/save/code") + @PreAuthorize("@ss.hasPermission('query:portal:edit')") + public Result saveCode(@RequestBody @Validated DataAdapterCodeDto dataAdapterCodeDto) { + portalService.saveCode(dataAdapterCodeDto); + return Result.ok(); + } + @ApiOperation("撤销发布") @Encrypt diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/entity/dto/DataAdapterCodeDto.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/entity/dto/DataAdapterCodeDto.java new file mode 100644 index 0000000..a07659e --- /dev/null +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/entity/dto/DataAdapterCodeDto.java @@ -0,0 +1,21 @@ +package cn.fateverse.query.entity.dto; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author Clay + * @date 2024/4/24 8:57 + */ +@Data +public class DataAdapterCodeDto { + + @NotNull(message = "id不能为空") + private Long portalId; + + @NotBlank(message = "代码内容不能为空!") + private String code; + +} diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/entity/query/DataAdapterQuery.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/entity/query/DataAdapterQuery.java index 5ad8d3c..2a65503 100644 --- a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/entity/query/DataAdapterQuery.java +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/entity/query/DataAdapterQuery.java @@ -31,7 +31,6 @@ public class DataAdapterQuery { @ApiModelProperty("数据适配器代码类型 Java or Js") private DataAdapterType type; - @ApiModelProperty("是否通用") private Boolean common; } \ No newline at end of file diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/entity/vo/SimplePortalVo.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/entity/vo/SimplePortalVo.java index 9131023..b75566d 100644 --- a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/entity/vo/SimplePortalVo.java +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/entity/vo/SimplePortalVo.java @@ -10,7 +10,6 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import org.springframework.util.ObjectUtils; import java.util.Date; @@ -66,9 +65,12 @@ public class SimplePortalVo { /** * 数据适配器名称 */ - @ApiModelProperty("数据适配器名称") - @Excel("数据适配器名称") - private String adapterName; + @ApiModelProperty("数据适配器类型") + @Excel("数据适配器类型") + private String adapterCodeType; + + + private Boolean createDataAdapter; /** @@ -127,6 +129,7 @@ public class SimplePortalVo { .anonymity(portal.getAnonymity()) .queryId(portal.getQueryId()) .adapterId(portal.getAdapterId()) + .createDataAdapter(portal.getCreateDataAdapter()) .type(portal.getType()) .path(portal.getPath()) .state(portal.getState()) diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/enums/DataAdapterType.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/enums/DataAdapterType.java index a52aa44..fc4d238 100644 --- a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/enums/DataAdapterType.java +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/enums/DataAdapterType.java @@ -2,7 +2,7 @@ package cn.fateverse.query.enums; public enum DataAdapterType { - JAVA("java"), + JAVA("Java"), JAVA_SCRIPT("JavaScript"); diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/handler/adapter/impl/ExternalDataAdapterHandler.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/handler/adapter/impl/ExternalDataAdapterHandler.java index 2682ec4..0c0c857 100644 --- a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/handler/adapter/impl/ExternalDataAdapterHandler.java +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/handler/adapter/impl/ExternalDataAdapterHandler.java @@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; import org.springframework.web.client.RestTemplate; import javax.servlet.http.HttpServletRequest; @@ -59,10 +60,10 @@ public class ExternalDataAdapterHandler extends AbstractDataAdapterHandler { default: throw new CustomException("请求方式错误"); } - if (portal.getCreateDataAdapter()) { - return super.execute(portal.getAdapterId(), response, true); - } else { + if (ObjectUtils.isEmpty(portal.getAdapterId()) || !portal.getCreateDataAdapter()) { return response; + } else { + return super.mockExecute(portal.getAdapterId(), mockParam.getCode(), response, true); } } diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/handler/adapter/impl/LocalDataAdapterHandler.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/handler/adapter/impl/LocalDataAdapterHandler.java index 556de02..eca8562 100644 --- a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/handler/adapter/impl/LocalDataAdapterHandler.java +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/handler/adapter/impl/LocalDataAdapterHandler.java @@ -66,10 +66,10 @@ public class LocalDataAdapterHandler extends AbstractDataAdapterHandler { } //根据设置的参数动态调整当前是否需要分页操作 TableDataInfo> tableDataInfo = dynamicDataSearchService.searchData(uniConList, query, null, Boolean.TRUE); - if (portal.getCreateDataAdapter()) { - return super.mockExecute(portal.getAdapterId(), mockParam.getCode(), tableDataInfo.getRows(), true); - } else { + if (ObjectUtils.isEmpty(portal.getAdapterId()) || !portal.getCreateDataAdapter()) { return tableDataInfo.getRows(); + } else { + return super.mockExecute(portal.getAdapterId(), mockParam.getCode(), tableDataInfo.getRows(), true); } } @@ -86,13 +86,13 @@ public class LocalDataAdapterHandler extends AbstractDataAdapterHandler { UniConDto uniCon = new UniConDto(); String mappingValue = portalMapping.getMappingValue(); String mappingKey = portalMapping.getMappingKey(); - uniCon.setUcId(Long.parseLong(mappingValue)); + uniCon.setUcId(Long.parseLong(mappingKey)); if (portalMapping.getMappingType() == 0) { - uniCon.setQuery(request.getParameter(mappingKey)); + uniCon.setQuery(request.getParameter(mappingValue)); } else if (portalMapping.getMappingType() == 1) { - uniCon.setQuery(request.getHeaders(mappingKey)); + uniCon.setQuery(request.getHeaders(mappingValue)); } else { - uniCon.setQuery(request.getParameter(mappingKey)); + uniCon.setQuery(request.getParameter(mappingValue)); } uniConList.add(uniCon); } diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/PortalService.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/PortalService.java index c5a870d..91d5bf0 100644 --- a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/PortalService.java +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/PortalService.java @@ -1,6 +1,7 @@ package cn.fateverse.query.service; import cn.fateverse.common.core.result.page.TableDataInfo; +import cn.fateverse.query.entity.dto.DataAdapterCodeDto; import cn.fateverse.query.entity.dto.MockParam; import cn.fateverse.query.entity.dto.PortalDto; import cn.fateverse.query.entity.query.PortalQuery; @@ -50,11 +51,18 @@ public interface PortalService { /** * 获取到模拟数据 * - * @param mockParam - * @return + * @param mockParam 模拟参数 + * @return 执行结果 */ Object mockData(MockParam mockParam); + /** + * 保存代码 + * + * @param dataAdapterCodeDto 数据适配器代码 + */ + void saveCode(DataAdapterCodeDto dataAdapterCodeDto); + /** * 保存接口信息 * diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/impl/DataAdapterServiceImpl.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/impl/DataAdapterServiceImpl.java index 2f0adf5..9f1f81c 100644 --- a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/impl/DataAdapterServiceImpl.java +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/impl/DataAdapterServiceImpl.java @@ -50,6 +50,7 @@ public class DataAdapterServiceImpl implements DataAdapterService { @Override public TableDataInfo searchList(DataAdapterQuery query) { PageUtils.startPage(); + query.setCommon(true); List list = dataAdapterMapper.selectList(query); return PageUtils.convertDataTable(list, DataAdapterVo::toDataAdapterVo); } @@ -87,6 +88,8 @@ public class DataAdapterServiceImpl implements DataAdapterService { @Transactional(rollbackFor = Exception.class) public int save(DataAdapterDto dataAdapter) { DataAdapter info = dataAdapter.toDataAdapter(); + info.setCommon(Boolean.TRUE); + info.init(); info.setCreateBy(SecurityUtils.getUsername()); return dataAdapterMapper.insert(info); } diff --git a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/impl/PortalServiceImpl.java b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/impl/PortalServiceImpl.java index 0b3ad93..4cddbb1 100644 --- a/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/impl/PortalServiceImpl.java +++ b/custom-query/custom-query-biz/src/main/java/cn/fateverse/query/service/impl/PortalServiceImpl.java @@ -5,6 +5,7 @@ import cn.fateverse.common.core.result.page.TableDataInfo; import cn.fateverse.common.mybatis.utils.PageUtils; import cn.fateverse.query.entity.*; import cn.fateverse.query.entity.bo.PortalBo; +import cn.fateverse.query.entity.dto.DataAdapterCodeDto; import cn.fateverse.query.entity.dto.MockParam; import cn.fateverse.query.entity.vo.DataAdapterVo; import cn.fateverse.query.entity.vo.PortalIdWrapper; @@ -109,6 +110,9 @@ public class PortalServiceImpl implements PortalService { @Override public PortalVo searchById(Long portalId) { Portal portal = portalMapper.selectById(portalId); + if (!QueryConstant.PORTAL_DEV.equals(portal.getState())) { + throw new CustomException("当前状态不允许查询"); + } PortalVo portalVo = PortalVo.toPortalVo(portal); List portalMappings = portalMappingMapper.selectByPortalId(portalId); if (ObjectUtils.isEmpty(portalMappings)) { @@ -118,6 +122,12 @@ public class PortalServiceImpl implements PortalService { UniQuery uniQuery = queryMapper.selectById(portal.getQueryId()); portalVo.setQueryType(uniQuery.getType()); } + if (portal.getCreateDataAdapter()) { + DataAdapter dataAdapter = adapterMapper.selectById(portal.getAdapterId()); + if (!ObjectUtils.isEmpty(dataAdapter)) { + portalVo.setAdapterCodeType(dataAdapter.getType().name()); + } + } portalVo.setMappings(portalMappings); return portalVo; } @@ -166,7 +176,7 @@ public class PortalServiceImpl implements PortalService { if (!ObjectUtils.isEmpty(adapterIds)) { List adapterList = adapterMapper.selectListByIds(adapterIds); for (DataAdapter adapter : adapterList) { - adapterMap.put(adapter.getAdapterId(), adapter.getAdapterName()); + adapterMap.put(adapter.getAdapterId(), adapter.getType().name()); } } //映射重组 @@ -177,7 +187,7 @@ public class PortalServiceImpl implements PortalService { simplePortalVo.setQueryName(uniQuery.getUqName()); simplePortalVo.setQueryType(uniQuery.getType()); } - simplePortalVo.setAdapterName(adapterMap.getOrDefault(portal.getAdapterId(), null)); + simplePortalVo.setAdapterCodeType(adapterMap.getOrDefault(portal.getAdapterId(), null)); return simplePortalVo; }); } @@ -185,6 +195,9 @@ public class PortalServiceImpl implements PortalService { @Override public Object mockExecute(MockParam mockParam) { Portal portal = portalMapper.selectById(mockParam.getPortalId()); + if (!QueryConstant.PORTAL_DEV.equals(portal.getState())) { + throw new CustomException("当前状态不允许执行"); + } PortalBo portalBo = PortalBo.toPortalBo(portal, null); return handlerReader.mockExecute(portalBo, mockParam); } @@ -198,6 +211,24 @@ public class PortalServiceImpl implements PortalService { return handlerReader.mockExecute(portalBo, mockParam); } + @Override + public void saveCode(DataAdapterCodeDto dataAdapterCodeDto) { + Portal portal = portalMapper.selectById(dataAdapterCodeDto.getPortalId()); + if (ObjectUtils.isEmpty(portal)) { + throw new CustomException("未找到对应的接口"); + } + if (!QueryConstant.PORTAL_DEV.equals(portal.getState())) { + throw new CustomException("当前状态不允许保存"); + } + if (ObjectUtils.isEmpty(portal.getAdapterId()) || !portal.getCreateDataAdapter()) { + throw new CustomException("未找到数据适配器"); + } + DataAdapter dataAdapter = new DataAdapter(); + dataAdapter.setAdapterId(portal.getAdapterId()); + dataAdapter.setCode(dataAdapterCodeDto.getCode()); + adapterMapper.update(dataAdapter); + } + @Override @Transactional(rollbackFor = Exception.class) public PortalIdWrapper save(PortalDto portalDto) { @@ -243,6 +274,9 @@ public class PortalServiceImpl implements PortalService { Portal portal = portalDto.toPortal(); checkPortalType(portal); Portal old = portalMapper.selectByPath(portal.getPath(), portal.getRequestMethod()); + if (!QueryConstant.PORTAL_DEV.equals(old.getState())) { + throw new CustomException("当前状态不允许修改"); + } if (!ObjectUtils.isEmpty(old) && !old.getPortalId().equals(portal.getPortalId())) { throw new CustomException("系统中存在当前请求路径"); }