Merge pull request 'feat: js引擎调试成功' (#75) from portal into master
Reviewed-on: http://git.feashow.cn/clay/fateverse/pulls/75
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -47,10 +47,17 @@ public class JavaScriptEngine {
|
||||
return MultiThreadedCapture.capture(() -> {
|
||||
Context context = Context.newBuilder()
|
||||
.allowAllAccess(true)
|
||||
.allowHostClassLoading(true)
|
||||
.allowIO(true)
|
||||
.allowNativeAccess(true).build();
|
||||
// .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);
|
||||
|
||||
@@ -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<Void> saveCode(@RequestBody @Validated DataAdapterCodeDto dataAdapterCodeDto) {
|
||||
portalService.saveCode(dataAdapterCodeDto);
|
||||
return Result.ok();
|
||||
}
|
||||
|
||||
|
||||
@ApiOperation("撤销发布")
|
||||
@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")
|
||||
private DataAdapterType type;
|
||||
|
||||
@ApiModelProperty("是否通用")
|
||||
private Boolean common;
|
||||
|
||||
}
|
||||
@@ -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())
|
||||
|
||||
@@ -2,7 +2,7 @@ package cn.fateverse.query.enums;
|
||||
|
||||
|
||||
public enum DataAdapterType {
|
||||
JAVA("java"),
|
||||
JAVA("Java"),
|
||||
JAVA_SCRIPT("JavaScript");
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -66,10 +66,10 @@ public class LocalDataAdapterHandler extends AbstractDataAdapterHandler {
|
||||
}
|
||||
//根据设置的参数动态调整当前是否需要分页操作
|
||||
TableDataInfo<Map<String, Object>> 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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
/**
|
||||
* 保存接口信息
|
||||
*
|
||||
|
||||
@@ -50,6 +50,7 @@ public class DataAdapterServiceImpl implements DataAdapterService {
|
||||
@Override
|
||||
public TableDataInfo<DataAdapterVo> searchList(DataAdapterQuery query) {
|
||||
PageUtils.startPage();
|
||||
query.setCommon(true);
|
||||
List<DataAdapter> 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);
|
||||
}
|
||||
|
||||
@@ -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<PortalMapping> 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<DataAdapter> 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("系统中存在当前请求路径");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user