feat: js引擎调试成功

This commit is contained in:
clay
2024-04-24 10:48:14 +08:00
parent 450ed63e60
commit f3c2ef4cd9
12 changed files with 112 additions and 24 deletions

View File

@@ -27,6 +27,9 @@ public class MultiThreadedCapture {
try { try {
result = task.execute(); result = task.execute();
} catch (Exception e) { } catch (Exception e) {
if (e instanceof CustomException){
throw (CustomException) e;
}
throw new RuntimeException(e); throw new RuntimeException(e);
} finally { } finally {
System.setOut(oldOut); System.setOut(oldOut);

View File

@@ -47,10 +47,17 @@ public class JavaScriptEngine {
return MultiThreadedCapture.capture(() -> { return MultiThreadedCapture.capture(() -> {
Context context = Context.newBuilder() Context context = Context.newBuilder()
.allowAllAccess(true) .allowAllAccess(true)
.allowHostClassLoading(true) // .allowHostClassLoading(true)
.allowIO(true) // .allowIO(true)
.allowNativeAccess(true).build(); // .allowNativeAccess(true)
context.eval("js", script); .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 executeFunction = context.getBindings("js").getMember(functionName);
Value javaObjectAsValue = Value.asValue(args); Value javaObjectAsValue = Value.asValue(args);
Value result = executeFunction.execute(javaObjectAsValue); Value result = executeFunction.execute(javaObjectAsValue);

View File

@@ -5,6 +5,7 @@ import cn.fateverse.common.core.result.page.TableDataInfo;
import cn.fateverse.common.core.utils.ObjectUtils; import cn.fateverse.common.core.utils.ObjectUtils;
import cn.fateverse.common.decrypt.annotation.Encrypt; import cn.fateverse.common.decrypt.annotation.Encrypt;
import cn.fateverse.common.decrypt.annotation.EncryptField; 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.MockParam;
import cn.fateverse.query.entity.dto.PortalDto; import cn.fateverse.query.entity.dto.PortalDto;
import cn.fateverse.query.entity.query.PortalQuery; import cn.fateverse.query.entity.query.PortalQuery;
@@ -107,6 +108,14 @@ public class PortalController {
return Result.ok(result); return Result.ok(result);
} }
@ApiOperation("保存代码")
@PostMapping("/save/code")
@PreAuthorize("@ss.hasPermission('query:portal:edit')")
public Result<Void> saveCode(@RequestBody @Validated DataAdapterCodeDto dataAdapterCodeDto) {
portalService.saveCode(dataAdapterCodeDto);
return Result.ok();
}
@ApiOperation("撤销发布") @ApiOperation("撤销发布")
@Encrypt @Encrypt

View File

@@ -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;
}

View File

@@ -31,7 +31,6 @@ public class DataAdapterQuery {
@ApiModelProperty("数据适配器代码类型 Java or Js") @ApiModelProperty("数据适配器代码类型 Java or Js")
private DataAdapterType type; private DataAdapterType type;
@ApiModelProperty("是否通用")
private Boolean common; private Boolean common;
} }

View File

@@ -10,7 +10,6 @@ import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.springframework.util.ObjectUtils;
import java.util.Date; import java.util.Date;
@@ -66,9 +65,12 @@ public class SimplePortalVo {
/** /**
* 数据适配器名称 * 数据适配器名称
*/ */
@ApiModelProperty("数据适配器名称") @ApiModelProperty("数据适配器类型")
@Excel("数据适配器名称") @Excel("数据适配器类型")
private String adapterName; private String adapterCodeType;
private Boolean createDataAdapter;
/** /**
@@ -127,6 +129,7 @@ public class SimplePortalVo {
.anonymity(portal.getAnonymity()) .anonymity(portal.getAnonymity())
.queryId(portal.getQueryId()) .queryId(portal.getQueryId())
.adapterId(portal.getAdapterId()) .adapterId(portal.getAdapterId())
.createDataAdapter(portal.getCreateDataAdapter())
.type(portal.getType()) .type(portal.getType())
.path(portal.getPath()) .path(portal.getPath())
.state(portal.getState()) .state(portal.getState())

View File

@@ -2,7 +2,7 @@ package cn.fateverse.query.enums;
public enum DataAdapterType { public enum DataAdapterType {
JAVA("java"), JAVA("Java"),
JAVA_SCRIPT("JavaScript"); JAVA_SCRIPT("JavaScript");

View File

@@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@@ -59,10 +60,10 @@ public class ExternalDataAdapterHandler extends AbstractDataAdapterHandler {
default: default:
throw new CustomException("请求方式错误"); throw new CustomException("请求方式错误");
} }
if (portal.getCreateDataAdapter()) { if (ObjectUtils.isEmpty(portal.getAdapterId()) || !portal.getCreateDataAdapter()) {
return super.execute(portal.getAdapterId(), response, true);
} else {
return response; return response;
} else {
return super.mockExecute(portal.getAdapterId(), mockParam.getCode(), response, true);
} }
} }

View File

@@ -66,10 +66,10 @@ public class LocalDataAdapterHandler extends AbstractDataAdapterHandler {
} }
//根据设置的参数动态调整当前是否需要分页操作 //根据设置的参数动态调整当前是否需要分页操作
TableDataInfo<Map<String, Object>> tableDataInfo = dynamicDataSearchService.searchData(uniConList, query, null, Boolean.TRUE); TableDataInfo<Map<String, Object>> tableDataInfo = dynamicDataSearchService.searchData(uniConList, query, null, Boolean.TRUE);
if (portal.getCreateDataAdapter()) { if (ObjectUtils.isEmpty(portal.getAdapterId()) || !portal.getCreateDataAdapter()) {
return super.mockExecute(portal.getAdapterId(), mockParam.getCode(), tableDataInfo.getRows(), true);
} else {
return tableDataInfo.getRows(); 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(); UniConDto uniCon = new UniConDto();
String mappingValue = portalMapping.getMappingValue(); String mappingValue = portalMapping.getMappingValue();
String mappingKey = portalMapping.getMappingKey(); String mappingKey = portalMapping.getMappingKey();
uniCon.setUcId(Long.parseLong(mappingValue)); uniCon.setUcId(Long.parseLong(mappingKey));
if (portalMapping.getMappingType() == 0) { if (portalMapping.getMappingType() == 0) {
uniCon.setQuery(request.getParameter(mappingKey)); uniCon.setQuery(request.getParameter(mappingValue));
} else if (portalMapping.getMappingType() == 1) { } else if (portalMapping.getMappingType() == 1) {
uniCon.setQuery(request.getHeaders(mappingKey)); uniCon.setQuery(request.getHeaders(mappingValue));
} else { } else {
uniCon.setQuery(request.getParameter(mappingKey)); uniCon.setQuery(request.getParameter(mappingValue));
} }
uniConList.add(uniCon); uniConList.add(uniCon);
} }

View File

@@ -1,6 +1,7 @@
package cn.fateverse.query.service; package cn.fateverse.query.service;
import cn.fateverse.common.core.result.page.TableDataInfo; 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.MockParam;
import cn.fateverse.query.entity.dto.PortalDto; import cn.fateverse.query.entity.dto.PortalDto;
import cn.fateverse.query.entity.query.PortalQuery; import cn.fateverse.query.entity.query.PortalQuery;
@@ -50,11 +51,18 @@ public interface PortalService {
/** /**
* 获取到模拟数据 * 获取到模拟数据
* *
* @param mockParam * @param mockParam 模拟参数
* @return * @return 执行结果
*/ */
Object mockData(MockParam mockParam); Object mockData(MockParam mockParam);
/**
* 保存代码
*
* @param dataAdapterCodeDto 数据适配器代码
*/
void saveCode(DataAdapterCodeDto dataAdapterCodeDto);
/** /**
* 保存接口信息 * 保存接口信息
* *

View File

@@ -50,6 +50,7 @@ public class DataAdapterServiceImpl implements DataAdapterService {
@Override @Override
public TableDataInfo<DataAdapterVo> searchList(DataAdapterQuery query) { public TableDataInfo<DataAdapterVo> searchList(DataAdapterQuery query) {
PageUtils.startPage(); PageUtils.startPage();
query.setCommon(true);
List<DataAdapter> list = dataAdapterMapper.selectList(query); List<DataAdapter> list = dataAdapterMapper.selectList(query);
return PageUtils.convertDataTable(list, DataAdapterVo::toDataAdapterVo); return PageUtils.convertDataTable(list, DataAdapterVo::toDataAdapterVo);
} }
@@ -87,6 +88,8 @@ public class DataAdapterServiceImpl implements DataAdapterService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public int save(DataAdapterDto dataAdapter) { public int save(DataAdapterDto dataAdapter) {
DataAdapter info = dataAdapter.toDataAdapter(); DataAdapter info = dataAdapter.toDataAdapter();
info.setCommon(Boolean.TRUE);
info.init();
info.setCreateBy(SecurityUtils.getUsername()); info.setCreateBy(SecurityUtils.getUsername());
return dataAdapterMapper.insert(info); return dataAdapterMapper.insert(info);
} }

View File

@@ -5,6 +5,7 @@ import cn.fateverse.common.core.result.page.TableDataInfo;
import cn.fateverse.common.mybatis.utils.PageUtils; import cn.fateverse.common.mybatis.utils.PageUtils;
import cn.fateverse.query.entity.*; import cn.fateverse.query.entity.*;
import cn.fateverse.query.entity.bo.PortalBo; 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.dto.MockParam;
import cn.fateverse.query.entity.vo.DataAdapterVo; import cn.fateverse.query.entity.vo.DataAdapterVo;
import cn.fateverse.query.entity.vo.PortalIdWrapper; import cn.fateverse.query.entity.vo.PortalIdWrapper;
@@ -109,6 +110,9 @@ public class PortalServiceImpl implements PortalService {
@Override @Override
public PortalVo searchById(Long portalId) { public PortalVo searchById(Long portalId) {
Portal portal = portalMapper.selectById(portalId); Portal portal = portalMapper.selectById(portalId);
if (!QueryConstant.PORTAL_DEV.equals(portal.getState())) {
throw new CustomException("当前状态不允许查询");
}
PortalVo portalVo = PortalVo.toPortalVo(portal); PortalVo portalVo = PortalVo.toPortalVo(portal);
List<PortalMapping> portalMappings = portalMappingMapper.selectByPortalId(portalId); List<PortalMapping> portalMappings = portalMappingMapper.selectByPortalId(portalId);
if (ObjectUtils.isEmpty(portalMappings)) { if (ObjectUtils.isEmpty(portalMappings)) {
@@ -118,6 +122,12 @@ public class PortalServiceImpl implements PortalService {
UniQuery uniQuery = queryMapper.selectById(portal.getQueryId()); UniQuery uniQuery = queryMapper.selectById(portal.getQueryId());
portalVo.setQueryType(uniQuery.getType()); 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); portalVo.setMappings(portalMappings);
return portalVo; return portalVo;
} }
@@ -166,7 +176,7 @@ public class PortalServiceImpl implements PortalService {
if (!ObjectUtils.isEmpty(adapterIds)) { if (!ObjectUtils.isEmpty(adapterIds)) {
List<DataAdapter> adapterList = adapterMapper.selectListByIds(adapterIds); List<DataAdapter> adapterList = adapterMapper.selectListByIds(adapterIds);
for (DataAdapter adapter : adapterList) { 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.setQueryName(uniQuery.getUqName());
simplePortalVo.setQueryType(uniQuery.getType()); simplePortalVo.setQueryType(uniQuery.getType());
} }
simplePortalVo.setAdapterName(adapterMap.getOrDefault(portal.getAdapterId(), null)); simplePortalVo.setAdapterCodeType(adapterMap.getOrDefault(portal.getAdapterId(), null));
return simplePortalVo; return simplePortalVo;
}); });
} }
@@ -185,6 +195,9 @@ public class PortalServiceImpl implements PortalService {
@Override @Override
public Object mockExecute(MockParam mockParam) { public Object mockExecute(MockParam mockParam) {
Portal portal = portalMapper.selectById(mockParam.getPortalId()); Portal portal = portalMapper.selectById(mockParam.getPortalId());
if (!QueryConstant.PORTAL_DEV.equals(portal.getState())) {
throw new CustomException("当前状态不允许执行");
}
PortalBo portalBo = PortalBo.toPortalBo(portal, null); PortalBo portalBo = PortalBo.toPortalBo(portal, null);
return handlerReader.mockExecute(portalBo, mockParam); return handlerReader.mockExecute(portalBo, mockParam);
} }
@@ -198,6 +211,24 @@ public class PortalServiceImpl implements PortalService {
return handlerReader.mockExecute(portalBo, mockParam); 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 @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public PortalIdWrapper save(PortalDto portalDto) { public PortalIdWrapper save(PortalDto portalDto) {
@@ -243,6 +274,9 @@ public class PortalServiceImpl implements PortalService {
Portal portal = portalDto.toPortal(); Portal portal = portalDto.toPortal();
checkPortalType(portal); checkPortalType(portal);
Portal old = portalMapper.selectByPath(portal.getPath(), portal.getRequestMethod()); 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())) { if (!ObjectUtils.isEmpty(old) && !old.getPortalId().equals(portal.getPortalId())) {
throw new CustomException("系统中存在当前请求路径"); throw new CustomException("系统中存在当前请求路径");
} }