feat: js引擎调试成功
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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())
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 保存接口信息
|
* 保存接口信息
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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("系统中存在当前请求路径");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user