mxd 4 lat temu
rodzic
commit
0d09b506a2

+ 183 - 0
src/main/java/org/ssssssss/magicapi/config/MagicAPIController.java

@@ -0,0 +1,183 @@
+package org.ssssssss.magicapi.config;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.ssssssss.magicapi.interceptor.RequestInterceptor;
+import org.ssssssss.magicapi.model.ApiInfo;
+import org.ssssssss.magicapi.model.JsonBean;
+import org.ssssssss.magicapi.provider.ApiServiceProvider;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * 接口相关操作
+ */
+public class MagicAPIController extends MagicController {
+
+	private static Logger logger = LoggerFactory.getLogger(MagicAPIController.class);
+
+	private ApiServiceProvider magicApiService;
+
+	public MagicAPIController(MagicConfiguration configuration) {
+		super(configuration);
+		this.magicApiService = configuration.getMagicApiService();
+	}
+
+	/**
+	 * 删除接口
+	 *
+	 * @param id 接口ID
+	 */
+	@RequestMapping("/delete")
+	@ResponseBody
+	public JsonBean<Boolean> delete(String id, HttpServletRequest request) {
+		if (!allowVisit(request, RequestInterceptor.Authorization.DELETE)) {
+			return new JsonBean<>(-10, "无权限执行删除方法");
+		}
+		try {
+			boolean success = magicApiService.delete(id);
+			if (success) {    //删除成功时在取消注册
+				configuration.getMappingHandlerMapping().unregisterMapping(id, true);
+			}
+			return new JsonBean<>(success);
+		} catch (Exception e) {
+			logger.error("删除接口出错", e);
+			return new JsonBean<>(-1, e.getMessage());
+		}
+	}
+
+	/**
+	 * 查询所有接口
+	 */
+	@RequestMapping("/list")
+	@ResponseBody
+	public JsonBean<List<ApiInfo>> list() {
+		try {
+			return new JsonBean<>(magicApiService.list());
+		} catch (Exception e) {
+			logger.error("查询接口列表失败", e);
+			return new JsonBean<>(-1, e.getMessage());
+		}
+	}
+
+	/**
+	 * 查询接口详情
+	 *
+	 * @param id 接口ID
+	 */
+	@RequestMapping("/get")
+	@ResponseBody
+	public JsonBean<ApiInfo> get(HttpServletRequest request, String id) {
+		if (!allowVisit(request, RequestInterceptor.Authorization.DETAIL)) {
+			return new JsonBean<>(-10, "无权限执行查看详情方法");
+		}
+		try {
+			return new JsonBean<>(magicApiService.get(id));
+		} catch (Exception e) {
+			logger.error("查询接口出错");
+			return new JsonBean<>(-1, e.getMessage());
+		}
+	}
+
+	/**
+	 * 查询历史记录
+	 *
+	 * @param id 接口ID
+	 */
+	@RequestMapping("/backups")
+	@ResponseBody
+	public JsonBean<List<Long>> backups(String id) {
+		return new JsonBean<>(magicApiService.backupList(id));
+	}
+
+	/**
+	 * 获取历史记录
+	 *
+	 * @param id        接口ID
+	 * @param timestamp 时间点
+	 */
+	@RequestMapping("/backup/get")
+	@ResponseBody
+	public JsonBean<ApiInfo> backups(String id, Long timestamp) {
+		return new JsonBean<>(magicApiService.backupInfo(id, timestamp));
+	}
+
+	/**
+	 * 移动接口
+	 */
+	@RequestMapping("/api/move")
+	@ResponseBody
+	public JsonBean<Boolean> apiMove(String id, String groupId, HttpServletRequest request) {
+		if (!allowVisit(request, RequestInterceptor.Authorization.SAVE)) {
+			return new JsonBean<>(-10, "无权限执行保存方法");
+		}
+		if (!configuration.getGroupServiceProvider().contains(groupId)) {
+			return new JsonBean<>(0, "找不到分组信息");
+		}
+		try {
+			if (!configuration.getMappingHandlerMapping().move(id, groupId)) {
+				return new JsonBean<>(0, "移动接口失败!");
+			} else {
+				return new JsonBean<>(magicApiService.move(id, groupId));
+			}
+		} catch (Exception e) {
+			logger.error("移动接口出错", e);
+			return new JsonBean<>(-1, e.getMessage());
+		}
+	}
+
+	/**
+	 * 保存接口
+	 *
+	 * @param info 接口信息
+	 */
+	@RequestMapping("/save")
+	@ResponseBody
+	public JsonBean<String> save(HttpServletRequest request, ApiInfo info) {
+		if (!allowVisit(request, RequestInterceptor.Authorization.SAVE)) {
+			return new JsonBean<>(-10, "无权限执行保存方法");
+		}
+		try {
+			if (StringUtils.isBlank(info.getMethod())) {
+				return new JsonBean<>(0, "请求方法不能为空");
+			}
+			if (StringUtils.isBlank(info.getPath())) {
+				return new JsonBean<>(0, "请求路径不能为空");
+			}
+			if (StringUtils.isBlank(info.getName())) {
+				return new JsonBean<>(0, "接口名称不能为空");
+			}
+			if (StringUtils.isBlank(info.getScript())) {
+				return new JsonBean<>(0, "脚本内容不能为空");
+			}
+			if (configuration.getMappingHandlerMapping().hasRegisterMapping(info)) {
+				return new JsonBean<>(0, "该路径已被映射,请换一个请求方法或路径");
+			}
+			if (StringUtils.isBlank(info.getId())) {
+				// 先判断接口是否存在
+				if (magicApiService.exists(info.getGroupId(), info.getMethod(), info.getPath())) {
+					return new JsonBean<>(0, String.format("接口%s:%s已存在", info.getMethod(), info.getPath()));
+				}
+				magicApiService.insert(info);
+			} else {
+				// 先判断接口是否存在
+				if (magicApiService.existsWithoutId(info.getGroupId(), info.getMethod(), info.getPath(), info.getId())) {
+					return new JsonBean<>(0, String.format("接口%s:%s已存在", info.getMethod(), info.getPath()));
+				}
+				magicApiService.update(info);
+			}
+			magicApiService.backup(info.getId());
+			// 注册接口
+			configuration.getMappingHandlerMapping().registerMapping(info, true);
+			return new JsonBean<>(info.getId());
+		} catch (Exception e) {
+			logger.error("保存接口出错", e);
+			return new JsonBean<>(-1, e.getMessage());
+		}
+	}
+
+}

+ 59 - 0
src/main/java/org/ssssssss/magicapi/config/MagicConfigController.java

@@ -0,0 +1,59 @@
+package org.ssssssss.magicapi.config;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.ssssssss.magicapi.model.JsonBean;
+import org.ssssssss.magicapi.modules.SQLModule;
+import org.ssssssss.magicapi.provider.MagicAPIService;
+import org.ssssssss.script.MagicModuleLoader;
+import org.ssssssss.script.MagicScriptEngine;
+import org.ssssssss.script.ScriptClass;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class MagicConfigController extends MagicController {
+
+	public MagicConfigController(MagicConfiguration configuration) {
+		super(configuration);
+		// 给前端添加代码提示
+		MagicScriptEngine.addScriptClass(SQLModule.class);
+		MagicScriptEngine.addScriptClass(MagicAPIService.class);
+	}
+
+	/**
+	 * 获取所有class
+	 */
+	@RequestMapping("/classes")
+	@ResponseBody
+	public JsonBean<Map<String, Map<String, ScriptClass>>> classes() {
+		Map<String, ScriptClass> classMap = MagicScriptEngine.getScriptClassMap();
+		classMap.putAll(MagicModuleLoader.getModules());
+		ScriptClass db = classMap.get(SQLModule.class.getName());
+		if (db != null) {
+			List<ScriptClass.ScriptAttribute> attributes = new ArrayList<>();
+			// 给与前台动态数据源提示
+			configuration.getMagicDynamicDataSource().datasources().stream().filter(StringUtils::isNotBlank)
+					.forEach(item -> attributes.add(new ScriptClass.ScriptAttribute("db", item)));
+			db.setAttributes(attributes);
+		}
+		Map<String, Map<String, ScriptClass>> values = new HashMap<>();
+		values.put("classes", classMap);
+		values.put("extensions", MagicScriptEngine.getExtensionScriptClass());
+		return new JsonBean<>(values);
+	}
+
+	/**
+	 * 获取单个class
+	 *
+	 * @param className 类名
+	 */
+	@RequestMapping("/class")
+	@ResponseBody
+	public JsonBean<List<ScriptClass>> clazz(String className) {
+		return new JsonBean<>(MagicScriptEngine.getScriptClass(className));
+	}
+}

+ 184 - 0
src/main/java/org/ssssssss/magicapi/config/MagicConfiguration.java

@@ -0,0 +1,184 @@
+package org.ssssssss.magicapi.config;
+
+import org.springframework.http.converter.HttpMessageConverter;
+import org.ssssssss.magicapi.interceptor.RequestInterceptor;
+import org.ssssssss.magicapi.provider.ApiServiceProvider;
+import org.ssssssss.magicapi.provider.GroupServiceProvider;
+import org.ssssssss.magicapi.provider.ResultProvider;
+import org.ssssssss.magicapi.utils.MD5Utils;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+public class MagicConfiguration {
+
+	/**
+	 * 接口映射
+	 */
+	private MappingHandlerMapping mappingHandlerMapping;
+
+	/**
+	 * 用户名
+	 */
+	private String username;
+
+	/**
+	 * 密码
+	 */
+	private String password;
+
+	private final String tokenKey = "MAGICTOKEN";
+
+	/**
+	 * 拦截器
+	 */
+	private List<RequestInterceptor> requestInterceptors = new ArrayList<>();
+
+	/**
+	 * 接口查询Service
+	 */
+	private ApiServiceProvider magicApiService;
+
+	/**
+	 * 分组查询Service
+	 */
+	private GroupServiceProvider groupServiceProvider;
+
+	/**
+	 * 动态数据源
+	 */
+	private MagicDynamicDataSource magicDynamicDataSource;
+
+	/**
+	 * 请求出错时,是否抛出异常
+	 */
+	private boolean throwException = false;
+
+	/**
+	 * 结果处理器
+	 */
+	private ResultProvider resultProvider;
+
+	private List<HttpMessageConverter<?>> httpMessageConverters = new ArrayList<>();
+
+	/**
+	 * debug 超时时间
+	 */
+	private int debugTimeout;
+
+	private boolean enableWeb = false;
+
+	public void setEnableWeb(boolean enableWeb) {
+		this.enableWeb = enableWeb;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public void addRequestInterceptor(RequestInterceptor requestInterceptor) {
+		this.requestInterceptors.add(requestInterceptor);
+	}
+
+	public void setMappingHandlerMapping(MappingHandlerMapping mappingHandlerMapping) {
+		this.mappingHandlerMapping = mappingHandlerMapping;
+	}
+
+	public void setMagicApiService(ApiServiceProvider magicApiService) {
+		this.magicApiService = magicApiService;
+	}
+
+	public void setGroupServiceProvider(GroupServiceProvider groupServiceProvider) {
+		this.groupServiceProvider = groupServiceProvider;
+	}
+
+	public void setResultProvider(ResultProvider resultProvider) {
+		this.resultProvider = resultProvider;
+	}
+
+	public void setThrowException(boolean throwException) {
+		this.throwException = throwException;
+	}
+
+	public void setHttpMessageConverters(List<HttpMessageConverter<?>> httpMessageConverters) {
+		this.httpMessageConverters = httpMessageConverters;
+	}
+
+	public void setDebugTimeout(int debugTimeout) {
+		this.debugTimeout = debugTimeout;
+	}
+
+	public void setMagicDynamicDataSource(MagicDynamicDataSource magicDynamicDataSource) {
+		this.magicDynamicDataSource = magicDynamicDataSource;
+	}
+
+	public MappingHandlerMapping getMappingHandlerMapping() {
+		return mappingHandlerMapping;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public String getTokenKey() {
+		return tokenKey;
+	}
+
+	public List<RequestInterceptor> getRequestInterceptors() {
+		return requestInterceptors;
+	}
+
+	public ApiServiceProvider getMagicApiService() {
+		return magicApiService;
+	}
+
+	public GroupServiceProvider getGroupServiceProvider() {
+		return groupServiceProvider;
+	}
+
+	public MagicDynamicDataSource getMagicDynamicDataSource() {
+		return magicDynamicDataSource;
+	}
+
+	public boolean isThrowException() {
+		return throwException;
+	}
+
+	public ResultProvider getResultProvider() {
+		return resultProvider;
+	}
+
+	public List<HttpMessageConverter<?>> getHttpMessageConverters() {
+		return httpMessageConverters;
+	}
+
+	public int getDebugTimeout() {
+		return debugTimeout;
+	}
+
+	public boolean isEnableWeb() {
+		return enableWeb;
+	}
+
+	/**
+	 * 打印banner
+	 */
+	public void printBanner() {
+		System.out.println("  __  __                _           _     ____  ___ ");
+		System.out.println(" |  \\/  |  __ _   __ _ (_)  ___    / \\   |  _ \\|_ _|");
+		System.out.println(" | |\\/| | / _` | / _` || | / __|  / _ \\  | |_) || | ");
+		System.out.println(" | |  | || (_| || (_| || || (__  / ___ \\ |  __/ | | ");
+		System.out.println(" |_|  |_| \\__,_| \\__, ||_| \\___|/_/   \\_\\|_|   |___|");
+		System.out.println("                  |___/                        " + RequestHandler.class.getPackage().getImplementationVersion());
+	}
+}

+ 54 - 0
src/main/java/org/ssssssss/magicapi/config/MagicController.java

@@ -0,0 +1,54 @@
+package org.ssssssss.magicapi.config;
+
+import org.ssssssss.magicapi.interceptor.RequestInterceptor;
+import org.ssssssss.magicapi.utils.MD5Utils;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+
+public class MagicController {
+
+
+	final String HEADER_REQUEST_SESSION = "Magic-Request-Session";
+
+	final String HEADER_REQUEST_BREAKPOINTS = "Magic-Request-Breakpoints";
+
+	final String HEADER_REQUEST_CONTINUE = "Magic-Request-Continue";
+
+	final String HEADER_REQUEST_STEP_INTO = "Magic-Request-Step-Into";
+
+	final String HEADER_RESPONSE_WITH_MAGIC_API = "Response-With-Magic-API";
+
+	MagicConfiguration configuration;
+
+	public MagicController(MagicConfiguration configuration) {
+		this.configuration = configuration;
+	}
+
+	/**
+	 * 判断是否有权限访问按钮
+	 */
+	boolean allowVisit(HttpServletRequest request, RequestInterceptor.Authorization authorization) {
+		if (authorization == null) {
+			if (configuration.getUsername()!= null && configuration.getUsername() != null) {
+				Cookie[] cookies = request.getCookies();
+				if (cookies != null) {
+					for (Cookie cookie : cookies) {
+						if (configuration.getTokenKey().equals(cookie.getName())) {
+							return cookie.getValue().equals(MD5Utils.encrypt(String.format("%s||%s", configuration.getUsername(), configuration.getPassword())));
+						}
+					}
+				}
+				return false;
+			}
+			return true;
+		}
+		for (RequestInterceptor requestInterceptor : configuration.getRequestInterceptors()) {
+			if (!requestInterceptor.allowVisit(request, authorization)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+}

+ 122 - 0
src/main/java/org/ssssssss/magicapi/config/MagicGroupController.java

@@ -0,0 +1,122 @@
+package org.ssssssss.magicapi.config;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.ssssssss.magicapi.interceptor.RequestInterceptor;
+import org.ssssssss.magicapi.model.Group;
+import org.ssssssss.magicapi.model.JsonBean;
+import org.ssssssss.magicapi.provider.GroupServiceProvider;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+public class MagicGroupController extends MagicController {
+
+	private static Logger logger = LoggerFactory.getLogger(MagicGroupController.class);
+
+	private GroupServiceProvider groupServiceProvider;
+
+	public MagicGroupController(MagicConfiguration configuration) {
+		super(configuration);
+		this.groupServiceProvider = configuration.getGroupServiceProvider();
+	}
+
+	/**
+	 * 删除分组
+	 */
+	@RequestMapping("/group/delete")
+	@ResponseBody
+	public JsonBean<Boolean> deleteGroup(String groupId, HttpServletRequest request) {
+		if (!allowVisit(request, RequestInterceptor.Authorization.DELETE)) {
+			return new JsonBean<>(-10, "无权限执行删除方法");
+		}
+		try {
+			boolean success = configuration.getMagicApiService().deleteGroup(groupId) && this.groupServiceProvider.delete(groupId);
+			if (success) {    //删除成功时取消注册
+				configuration.getMappingHandlerMapping().deleteGroup(groupId);
+			}
+			return new JsonBean<>(success);
+		} catch (Exception e) {
+			logger.error("删除分组出错", e);
+			return new JsonBean<>(-1, e.getMessage());
+		}
+	}
+
+	/**
+	 * 修改分组
+	 */
+	@RequestMapping("/group/update")
+	@ResponseBody
+	public synchronized JsonBean<Boolean> groupUpdate(Group group, HttpServletRequest request) {
+		if (!allowVisit(request, RequestInterceptor.Authorization.SAVE)) {
+			return new JsonBean<>(-10, "无权限执行删除方法");
+		}
+		if (StringUtils.isBlank(group.getParentId())) {
+			group.setParentId("0");
+		}
+		if (StringUtils.isBlank(group.getName())) {
+			return new JsonBean<>(0, "分组名称不能为空");
+		}
+		if (StringUtils.isBlank(group.getType())) {
+			return new JsonBean<>(0, "分组类型不能为空");
+		}
+		try {
+			boolean isApiGroup = "1".equals(group.getType());
+			if (!isApiGroup || configuration.getMappingHandlerMapping().checkGroup(group)) {
+				boolean success = groupServiceProvider.update(group);
+				if (success && isApiGroup) {    // 如果数据库修改成功,则修改接口路径
+					configuration.getMappingHandlerMapping().updateGroup(group);
+				}
+				return new JsonBean<>(success);
+			}
+			return new JsonBean<>(-20, "修改分组后,接口路径会有冲突,请检查!");
+		} catch (Exception e) {
+			logger.error("修改分组出错", e);
+			return new JsonBean<>(-1, e.getMessage());
+		}
+	}
+
+	/**
+	 * 查询所有分组
+	 */
+	@RequestMapping("/group/list")
+	@ResponseBody
+	public JsonBean<List<Group>> groupList() {
+		try {
+			return new JsonBean<>(groupServiceProvider.groupList());
+		} catch (Exception e) {
+			logger.error("查询分组列表失败", e);
+			return new JsonBean<>(-1, e.getMessage());
+		}
+	}
+
+	/**
+	 * 创建分组
+	 */
+	@RequestMapping("/group/create")
+	@ResponseBody
+	public JsonBean<String> createGroup(Group group, HttpServletRequest request) {
+		if (!allowVisit(request, RequestInterceptor.Authorization.SAVE)) {
+			return new JsonBean<>(-10, "无权限执行保存方法");
+		}
+		if (StringUtils.isBlank(group.getParentId())) {
+			group.setParentId("0");
+		}
+		if (StringUtils.isBlank(group.getName())) {
+			return new JsonBean<>(0, "分组名称不能为空");
+		}
+		if (StringUtils.isBlank(group.getType())) {
+			return new JsonBean<>(0, "分组类型不能为空");
+		}
+		try {
+			groupServiceProvider.insert(group);
+			return new JsonBean<>(group.getId());
+		} catch (Exception e) {
+			logger.error("保存分组出错", e);
+			return new JsonBean<>(-1, e.getMessage());
+		}
+	}
+}

+ 59 - 0
src/main/java/org/ssssssss/magicapi/config/MagicWorkbenchController.java

@@ -0,0 +1,59 @@
+package org.ssssssss.magicapi.config;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
+import org.ssssssss.magicapi.logging.MagicLoggerContext;
+import org.ssssssss.magicapi.model.JsonBean;
+import org.ssssssss.magicapi.model.Options;
+import org.ssssssss.magicapi.utils.MD5Utils;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class MagicWorkbenchController extends MagicController {
+
+	public MagicWorkbenchController(MagicConfiguration configuration) {
+		super(configuration);
+	}
+
+	/**
+	 * 登录
+	 */
+	@RequestMapping("/login")
+	@ResponseBody
+	public JsonBean<Boolean> login(String username, String password, HttpServletRequest request, HttpServletResponse response) {
+		if (username != null && password != null && Objects.equals(username, configuration.getUsername()) && Objects.equals(password, configuration.getPassword())) {
+			Cookie cookie = new Cookie(configuration.getTokenKey(), MD5Utils.encrypt(String.format("%s||%s", username, password)));
+			cookie.setHttpOnly(true);
+			response.addCookie(cookie);
+			return new JsonBean<>(true);
+		} else if (allowVisit(request, null)) {
+			return new JsonBean<>(true);
+		}
+		return new JsonBean<>(false);
+	}
+
+
+	/**
+	 * 创建控制台输出
+	 */
+	@RequestMapping("/console")
+	public SseEmitter console() throws IOException {
+		String sessionId = UUID.randomUUID().toString().replace("-", "");
+		SseEmitter emitter = MagicLoggerContext.createEmitter(sessionId);
+		emitter.send(SseEmitter.event().data(sessionId).name("create"));
+		return emitter;
+	}
+
+	@RequestMapping("/options")
+	@ResponseBody
+	public JsonBean<List<Map<String, String>>> options() {
+		return new JsonBean<>(Stream.of(Options.values()).map(item -> Collections.singletonMap(item.getValue(), item.getName())).collect(Collectors.toList()));
+	}
+}

+ 8 - 3
src/main/java/org/ssssssss/magicapi/config/MappingHandlerMapping.java

@@ -3,6 +3,7 @@ package org.ssssssss.magicapi.config;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.context.request.NativeWebRequest;
 import org.springframework.web.context.request.RequestAttributes;
@@ -47,7 +48,7 @@ public class MappingHandlerMapping {
 	/**
 	 * 请求处理器
 	 */
-	private RequestHandler handler;
+	private Object handler;
 
 	/**
 	 * 请求到达时处理的方法
@@ -131,7 +132,7 @@ public class MappingHandlerMapping {
 		this.requestMappingHandlerMapping = requestMappingHandlerMapping;
 	}
 
-	public void setHandler(RequestHandler handler) {
+	public void setHandler(Object handler) {
 		this.handler = handler;
 	}
 
@@ -332,13 +333,17 @@ public class MappingHandlerMapping {
 		logger.info("注册接口:{},{}", info.getName(), newMappingKey);
 		mappings.put(info.getId(), info);
 		mappings.put(newMappingKey, info);
-		requestMappingHandlerMapping.registerMapping(requestMapping, handler, method);
+		registerMapping(requestMapping, handler, method);
 		if (delete) {   // 刷新缓存
 			apiInfos.removeIf(i -> i.getId().equalsIgnoreCase(info.getId()));
 			apiInfos.add(info);
 		}
 	}
 
+	public void registerMapping(RequestMappingInfo requestMapping,Object handler,Method method){
+		requestMappingHandlerMapping.registerMapping(requestMapping, handler, method);
+	}
+
 	/**
 	 * 取消注册请求映射
 	 */

+ 13 - 75
src/main/java/org/ssssssss/magicapi/config/RequestHandler.java

@@ -43,78 +43,15 @@ import java.io.InputStream;
 import java.util.*;
 import java.util.stream.Collectors;
 
-public class RequestHandler {
+public class RequestHandler extends MagicController {
 
 	private static Logger logger = LoggerFactory.getLogger(RequestHandler.class);
 
-	/**
-	 * 请求拦截器
-	 */
-	private List<RequestInterceptor> requestInterceptors = new ArrayList<>();
-
-	/**
-	 * 请求出错时,是否抛出异常
-	 */
-	private boolean throwException = false;
-
-	/**
-	 * 结果处理器
-	 */
 	private ResultProvider resultProvider;
 
-	private WebUIController webUIController;
-
-	private final String HEADER_REQUEST_SESSION = "Magic-Request-Session";
-
-	private final String HEADER_REQUEST_BREAKPOINTS = "Magic-Request-Breakpoints";
-
-	private final String HEADER_REQUEST_CONTINUE = "Magic-Request-Continue";
-
-	private final String HEADER_REQUEST_STEP_INTO = "Magic-Request-Step-Into";
-
-	private final String HEADER_RESPONSE_WITH_MAGIC_API = "Response-With-Magic-API";
-
-	/**
-	 * debug 超时时间
-	 */
-	private int debugTimeout;
-
-	public void setDebugTimeout(int debugTimeout) {
-		this.debugTimeout = debugTimeout;
-	}
-
-	public void setWebUIController(WebUIController webUIController) {
-		this.webUIController = webUIController;
-	}
-
-	public void setResultProvider(ResultProvider resultProvider) {
-		this.resultProvider = resultProvider;
-	}
-
-	public void addRequestInterceptor(RequestInterceptor requestInterceptor) {
-		requestInterceptors.add(requestInterceptor);
-	}
-
-	public void setThrowException(boolean throwException) {
-		this.throwException = throwException;
-	}
-
-	private List<HttpMessageConverter<?>> httpMessageConverters;
-
-	public void setHttpMessageConverters(List<HttpMessageConverter<?>> httpMessageConverters) {
-		this.httpMessageConverters = httpMessageConverters;
-	}
-
-	/**
-	 * 打印banner
-	 */
-	public void printBanner() {
-		System.out.println("  __  __                _           _     ____  ___ ");
-		System.out.println(" |  \\/  |  __ _   __ _ (_)  ___    / \\   |  _ \\|_ _|");
-		System.out.println(" | |\\/| | / _` | / _` || | / __|  / _ \\  | |_) || | ");
-		System.out.println(" | |  | || (_| || (_| || || (__  / ___ \\ |  __/ | | ");
-		System.out.println(" |_|  |_| \\__,_| \\__, ||_| \\___|/_/   \\_\\|_|   |___|");
-		System.out.println("                  |___/                        " + RequestHandler.class.getPackage().getImplementationVersion());
+	public RequestHandler(MagicConfiguration configuration) {
+		super(configuration);
+		this.resultProvider = configuration.getResultProvider();
 	}
 
 	@ResponseBody
@@ -124,7 +61,7 @@ public class RequestHandler {
 		boolean requestedFromTest = isRequestedFromTest(request);
 		ApiInfo info = MappingHandlerMapping.getMappingApiInfo(request);
 		if (requestedFromTest) {
-			if (!webUIController.allowVisit(request, RequestInterceptor.Authorization.RUN)) {
+			if (!allowVisit(request, RequestInterceptor.Authorization.RUN)) {
 				return new JsonBean<>(-10, "无权限执行测试方法");
 			}
 		}
@@ -213,7 +150,7 @@ public class RequestHandler {
 					return resultProvider.buildResult(sae.getCode(), sae.getMessage());
 				}
 			} while ((parent = parent.getCause()) != null);
-			if (throwException) {
+			if (configuration.isThrowException()) {
 				throw root;
 			}
 			logger.error("接口{}请求出错", request.getRequestURI(),root);
@@ -303,7 +240,7 @@ public class RequestHandler {
 		String sessionId = getRequestedSessionId(request);
 		// 设置断点
 		context.setBreakpoints(getRequestedBreakpoints(request));
-		context.setTimeout(this.debugTimeout);
+		context.setTimeout(configuration.getDebugTimeout());
 		context.setId(sessionId);
 		context.onComplete(() -> {
 			logger.info("Close Console Session : {}", sessionId);
@@ -318,7 +255,7 @@ public class RequestHandler {
 	}
 
 	private boolean isRequestedFromTest(HttpServletRequest request) {
-		return webUIController != null && request.getHeader(HEADER_REQUEST_SESSION) != null;
+		return configuration.isEnableWeb() && request.getHeader(HEADER_REQUEST_SESSION) != null;
 	}
 
 	private boolean isRequestedFromContinue(HttpServletRequest request) {
@@ -340,10 +277,10 @@ public class RequestHandler {
 	}
 
 	private Object readRequestBody(HttpServletRequest request) throws IOException {
-		if (httpMessageConverters != null && request.getContentType() != null) {
+		if (configuration.getHttpMessageConverters() != null && request.getContentType() != null) {
 			MediaType mediaType = MediaType.valueOf(request.getContentType());
 			Class clazz = Map.class;
-			for (HttpMessageConverter<?> converter : httpMessageConverters) {
+			for (HttpMessageConverter<?> converter : configuration.getHttpMessageConverters()) {
 				if (converter.canRead(clazz, mediaType)) {
 					return converter.read(clazz, new ServletServerHttpRequest(request));
 				}
@@ -391,7 +328,7 @@ public class RequestHandler {
 	 * 执行后置拦截器
 	 */
 	private Object doPostHandle(ApiInfo info, MagicScriptContext context, Object value) throws Exception {
-		for (RequestInterceptor requestInterceptor : requestInterceptors) {
+		for (RequestInterceptor requestInterceptor : configuration.getRequestInterceptors()) {
 			Object target = requestInterceptor.postHandle(info, context, value);
 			if (target != null) {
 				return target;
@@ -404,7 +341,7 @@ public class RequestHandler {
 	 * 执行前置拦截器
 	 */
 	private Object doPreHandle(ApiInfo info, MagicScriptContext context) throws Exception {
-		for (RequestInterceptor requestInterceptor : requestInterceptors) {
+		for (RequestInterceptor requestInterceptor : configuration.getRequestInterceptors()) {
 			Object value = requestInterceptor.preHandle(info, context);
 			if (value != null) {
 				return value;
@@ -412,4 +349,5 @@ public class RequestHandler {
 		}
 		return null;
 	}
+
 }

+ 0 - 445
src/main/java/org/ssssssss/magicapi/config/WebUIController.java

@@ -1,445 +0,0 @@
-package org.ssssssss.magicapi.config;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
-import org.ssssssss.magicapi.interceptor.RequestInterceptor;
-import org.ssssssss.magicapi.logging.MagicLoggerContext;
-import org.ssssssss.magicapi.model.ApiInfo;
-import org.ssssssss.magicapi.model.Group;
-import org.ssssssss.magicapi.model.JsonBean;
-import org.ssssssss.magicapi.modules.SQLModule;
-import org.ssssssss.magicapi.provider.ApiServiceProvider;
-import org.ssssssss.magicapi.provider.GroupServiceProvider;
-import org.ssssssss.magicapi.provider.MagicAPIService;
-import org.ssssssss.magicapi.utils.MD5Utils;
-import org.ssssssss.script.MagicModuleLoader;
-import org.ssssssss.script.MagicScriptEngine;
-import org.ssssssss.script.ScriptClass;
-
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.*;
-
-/**
- * 页面UI对应的Controller
- */
-public class WebUIController {
-
-	private static Logger logger = LoggerFactory.getLogger(WebUIController.class);
-
-
-	/**
-	 * 接口映射
-	 */
-	private MappingHandlerMapping mappingHandlerMapping;
-
-	/**
-	 * 接口查询Service
-	 */
-	private ApiServiceProvider magicApiService;
-
-	/**
-	 * 分组查询Service
-	 */
-	private GroupServiceProvider groupServiceProvider;
-
-
-	/**
-	 * 拦截器
-	 */
-	private List<RequestInterceptor> requestInterceptors = new ArrayList<>();
-
-	/**
-	 * 动态数据源
-	 */
-	private MagicDynamicDataSource magicDynamicDataSource;
-
-	/**
-	 * 用户名
-	 */
-	private String username;
-
-	/**
-	 * 密码
-	 */
-	private String password;
-
-	private final String tokenKey = "MAGICTOKEN";
-
-	public WebUIController() {
-		// 给前端添加代码提示
-		MagicScriptEngine.addScriptClass(SQLModule.class);
-		MagicScriptEngine.addScriptClass(MagicAPIService.class);
-	}
-
-	public void setGroupServiceProvider(GroupServiceProvider groupServiceProvider) {
-		this.groupServiceProvider = groupServiceProvider;
-	}
-
-	public void setMagicDynamicDataSource(MagicDynamicDataSource magicDynamicDataSource) {
-		this.magicDynamicDataSource = magicDynamicDataSource;
-	}
-
-	public void addRequestInterceptor(RequestInterceptor requestInterceptor) {
-		this.requestInterceptors.add(requestInterceptor);
-	}
-
-	public void setMappingHandlerMapping(MappingHandlerMapping mappingHandlerMapping) {
-		this.mappingHandlerMapping = mappingHandlerMapping;
-	}
-
-	public void setMagicApiService(ApiServiceProvider magicApiService) {
-		this.magicApiService = magicApiService;
-	}
-
-	public void setUsername(String username) {
-		this.username = username;
-	}
-
-	public void setPassword(String password) {
-		this.password = password;
-	}
-
-
-	/**
-	 * 删除接口
-	 *
-	 * @param id 接口ID
-	 */
-	@RequestMapping("/delete")
-	@ResponseBody
-	public JsonBean<Boolean> delete(String id, HttpServletRequest request) {
-		if (!allowVisit(request, RequestInterceptor.Authorization.DELETE)) {
-			return new JsonBean<>(-10, "无权限执行删除方法");
-		}
-		try {
-			boolean success = this.magicApiService.delete(id);
-			if (success) {    //删除成功时在取消注册
-				mappingHandlerMapping.unregisterMapping(id, true);
-			}
-			return new JsonBean<>(success);
-		} catch (Exception e) {
-			logger.error("删除接口出错", e);
-			return new JsonBean<>(-1, e.getMessage());
-		}
-	}
-
-	/**
-	 * 创建分组
-	 */
-	@RequestMapping("/group/create")
-	@ResponseBody
-	public JsonBean<String> createGroup(Group group, HttpServletRequest request) {
-		if (!allowVisit(request, RequestInterceptor.Authorization.SAVE)) {
-			return new JsonBean<>(-10, "无权限执行保存方法");
-		}
-		if (StringUtils.isBlank(group.getParentId())) {
-			group.setParentId("0");
-		}
-		if (StringUtils.isBlank(group.getName())) {
-			return new JsonBean<>(0, "分组名称不能为空");
-		}
-		if (StringUtils.isBlank(group.getType())) {
-			return new JsonBean<>(0, "分组类型不能为空");
-		}
-		try {
-			groupServiceProvider.insert(group);
-			return new JsonBean<>(group.getId());
-		} catch (Exception e) {
-			logger.error("保存分组出错", e);
-			return new JsonBean<>(-1, e.getMessage());
-		}
-	}
-
-	/**
-	 * 删除分组
-	 */
-	@RequestMapping("/group/delete")
-	@ResponseBody
-	public JsonBean<Boolean> deleteGroup(String groupId, HttpServletRequest request) {
-		if (!allowVisit(request, RequestInterceptor.Authorization.DELETE)) {
-			return new JsonBean<>(-10, "无权限执行删除方法");
-		}
-		try {
-			boolean success = this.magicApiService.deleteGroup(groupId) && this.groupServiceProvider.delete(groupId);
-			if (success) {    //删除成功时取消注册
-				mappingHandlerMapping.deleteGroup(groupId);
-			}
-			return new JsonBean<>(success);
-		} catch (Exception e) {
-			logger.error("删除接口出错", e);
-			return new JsonBean<>(-1, e.getMessage());
-		}
-	}
-
-	/**
-	 * 修改分组
-	 */
-	@RequestMapping("/group/update")
-	@ResponseBody
-	public synchronized JsonBean<Boolean> groupUpdate(Group group, HttpServletRequest request) {
-		if (!allowVisit(request, RequestInterceptor.Authorization.SAVE)) {
-			return new JsonBean<>(-10, "无权限执行删除方法");
-		}
-		if (StringUtils.isBlank(group.getParentId())) {
-			group.setParentId("0");
-		}
-		if (StringUtils.isBlank(group.getName())) {
-			return new JsonBean<>(0, "分组名称不能为空");
-		}
-		if (StringUtils.isBlank(group.getType())) {
-			return new JsonBean<>(0, "分组类型不能为空");
-		}
-		try {
-			boolean isApiGroup = "1".equals(group.getType());
-			if (!isApiGroup || mappingHandlerMapping.checkGroup(group)) {
-				boolean success = groupServiceProvider.update(group);
-				if (success && isApiGroup) {    // 如果数据库修改成功,则修改接口路径
-					mappingHandlerMapping.updateGroup(group);
-				}
-				return new JsonBean<>(success);
-			}
-			return new JsonBean<>(-20, "修改分组后,接口路径会有冲突,请检查!");
-		} catch (Exception e) {
-			logger.error("修改分组出错", e);
-			return new JsonBean<>(-1, e.getMessage());
-		}
-	}
-
-	/**
-	 * 查询所有分组
-	 */
-	@RequestMapping("/group/list")
-	@ResponseBody
-	public JsonBean<List<Group>> groupList() {
-		try {
-			return new JsonBean<>(groupServiceProvider.groupList());
-		} catch (Exception e) {
-			logger.error("查询分组列表失败", e);
-			return new JsonBean<>(-1, e.getMessage());
-		}
-	}
-
-	/**
-	 * 查询所有接口
-	 */
-	@RequestMapping("/list")
-	@ResponseBody
-	public JsonBean<List<ApiInfo>> list() {
-		try {
-			return new JsonBean<>(magicApiService.list());
-		} catch (Exception e) {
-			logger.error("查询接口列表失败", e);
-			return new JsonBean<>(-1, e.getMessage());
-		}
-	}
-
-	/**
-	 * 登录
-	 */
-	@RequestMapping("/login")
-	@ResponseBody
-	public JsonBean<Boolean> login(String username, String password, HttpServletRequest request, HttpServletResponse response) {
-		if (username != null && password != null && Objects.equals(username, this.username) && Objects.equals(password, this.password)) {
-			Cookie cookie = new Cookie(tokenKey, MD5Utils.encrypt(String.format("%s||%s", username, password)));
-			cookie.setHttpOnly(true);
-			response.addCookie(cookie);
-			return new JsonBean<>(true);
-		} else if (allowVisit(request, null)) {
-			return new JsonBean<>(true);
-		}
-		return new JsonBean<>(false);
-	}
-
-	/**
-	 * 获取所有class
-	 */
-	@RequestMapping("/classes")
-	@ResponseBody
-	public JsonBean<Map<String, Map<String, ScriptClass>>> classes() {
-		Map<String, ScriptClass> classMap = MagicScriptEngine.getScriptClassMap();
-		classMap.putAll(MagicModuleLoader.getModules());
-		ScriptClass db = classMap.get(SQLModule.class.getName());
-		if (db != null) {
-			List<ScriptClass.ScriptAttribute> attributes = new ArrayList<>();
-			// 给与前台动态数据源提示
-			magicDynamicDataSource.datasources().stream().filter(StringUtils::isNotBlank)
-					.forEach(item -> attributes.add(new ScriptClass.ScriptAttribute("db", item)));
-			db.setAttributes(attributes);
-		}
-		Map<String, Map<String, ScriptClass>> values = new HashMap<>();
-		values.put("classes", classMap);
-		values.put("extensions", MagicScriptEngine.getExtensionScriptClass());
-		return new JsonBean<>(values);
-	}
-
-	/**
-	 * 创建控制台输出
-	 */
-	@RequestMapping("/console")
-	public SseEmitter console() throws IOException {
-		String sessionId = UUID.randomUUID().toString().replace("-", "");
-		SseEmitter emitter = MagicLoggerContext.createEmitter(sessionId);
-		emitter.send(SseEmitter.event().data(sessionId).name("create"));
-		return emitter;
-	}
-
-	/**
-	 * 获取单个class
-	 *
-	 * @param className 类名
-	 */
-	@RequestMapping("/class")
-	@ResponseBody
-	public JsonBean<List<ScriptClass>> clazz(String className) {
-		return new JsonBean<>(MagicScriptEngine.getScriptClass(className));
-	}
-
-	/**
-	 * 查询接口详情
-	 *
-	 * @param id 接口ID
-	 */
-	@RequestMapping("/get")
-	@ResponseBody
-	public JsonBean<ApiInfo> get(HttpServletRequest request, String id) {
-		if (!allowVisit(request, RequestInterceptor.Authorization.DETAIL)) {
-			return new JsonBean<>(-10, "无权限执行查看详情方法");
-		}
-		try {
-			return new JsonBean<>(this.magicApiService.get(id));
-		} catch (Exception e) {
-			logger.error("查询接口出错");
-			return new JsonBean<>(-1, e.getMessage());
-		}
-	}
-
-	/**
-	 * 查询历史记录
-	 *
-	 * @param id 接口ID
-	 */
-	@RequestMapping("/backups")
-	@ResponseBody
-	public JsonBean<List<Long>> backups(String id) {
-		return new JsonBean<>(magicApiService.backupList(id));
-	}
-
-	/**
-	 * 获取历史记录
-	 *
-	 * @param id        接口ID
-	 * @param timestamp 时间点
-	 */
-	@RequestMapping("/backup/get")
-	@ResponseBody
-	public JsonBean<ApiInfo> backups(String id, Long timestamp) {
-		return new JsonBean<>(magicApiService.backupInfo(id, timestamp));
-	}
-
-	/**
-	 * 移动接口
-	 */
-	@RequestMapping("/api/move")
-	@ResponseBody
-	public JsonBean<Boolean> apiMove(String id, String groupId, HttpServletRequest request) {
-		if (!allowVisit(request, RequestInterceptor.Authorization.SAVE)) {
-			return new JsonBean<>(-10, "无权限执行保存方法");
-		}
-		if (!groupServiceProvider.contains(groupId)) {
-			return new JsonBean<>(0, "找不到分组信息");
-		}
-		try {
-			if (!mappingHandlerMapping.move(id, groupId)) {
-				return new JsonBean<>(0, "移动接口失败!");
-			} else {
-				return new JsonBean<>(magicApiService.move(id, groupId));
-			}
-		} catch (Exception e) {
-			logger.error("移动接口出错", e);
-			return new JsonBean<>(-1, e.getMessage());
-		}
-	}
-
-	/**
-	 * 保存接口
-	 *
-	 * @param info 接口信息
-	 */
-	@RequestMapping("/save")
-	@ResponseBody
-	public JsonBean<String> save(HttpServletRequest request, ApiInfo info) {
-		if (!allowVisit(request, RequestInterceptor.Authorization.SAVE)) {
-			return new JsonBean<>(-10, "无权限执行保存方法");
-		}
-		try {
-			if (StringUtils.isBlank(info.getMethod())) {
-				return new JsonBean<>(0, "请求方法不能为空");
-			}
-			if (StringUtils.isBlank(info.getPath())) {
-				return new JsonBean<>(0, "请求路径不能为空");
-			}
-			if (StringUtils.isBlank(info.getName())) {
-				return new JsonBean<>(0, "接口名称不能为空");
-			}
-			if (StringUtils.isBlank(info.getScript())) {
-				return new JsonBean<>(0, "脚本内容不能为空");
-			}
-			if (mappingHandlerMapping.hasRegisterMapping(info)) {
-				return new JsonBean<>(0, "该路径已被映射,请换一个请求方法或路径");
-			}
-			if (StringUtils.isBlank(info.getId())) {
-				// 先判断接口是否存在
-				if (magicApiService.exists(info.getGroupId(), info.getMethod(), info.getPath())) {
-					return new JsonBean<>(0, String.format("接口%s:%s已存在", info.getMethod(), info.getPath()));
-				}
-				magicApiService.insert(info);
-			} else {
-				// 先判断接口是否存在
-				if (magicApiService.existsWithoutId(info.getGroupId(), info.getMethod(), info.getPath(), info.getId())) {
-					return new JsonBean<>(0, String.format("接口%s:%s已存在", info.getMethod(), info.getPath()));
-				}
-				magicApiService.update(info);
-			}
-			magicApiService.backup(info.getId());
-			// 注册接口
-			mappingHandlerMapping.registerMapping(info, true);
-			return new JsonBean<>(info.getId());
-		} catch (Exception e) {
-			logger.error("保存接口出错", e);
-			return new JsonBean<>(-1, e.getMessage());
-		}
-	}
-
-	/**
-	 * 判断是否有权限访问按钮
-	 */
-	boolean allowVisit(HttpServletRequest request, RequestInterceptor.Authorization authorization) {
-		if (authorization == null) {
-			if (this.username != null && this.password != null) {
-				Cookie[] cookies = request.getCookies();
-				if (cookies != null) {
-					for (Cookie cookie : cookies) {
-						if (tokenKey.equals(cookie.getName())) {
-							return cookie.getValue().equals(MD5Utils.encrypt(String.format("%s||%s", username, password)));
-						}
-					}
-				}
-				return false;
-			}
-			return true;
-		}
-		for (RequestInterceptor requestInterceptor : requestInterceptors) {
-			if (!requestInterceptor.allowVisit(request, authorization)) {
-				return false;
-			}
-		}
-		return true;
-	}
-}

+ 22 - 8
src/main/java/org/ssssssss/magicapi/model/ApiInfo.java

@@ -55,7 +55,12 @@ public class ApiInfo {
 	/**
 	 * 输出结果
 	 */
-	private String output;
+	private String responseBody;
+
+	/**
+	 * 输出Header
+	 */
+	private String responseHeader;
 
 	/**
 	 * 接口选项json->map
@@ -110,12 +115,20 @@ public class ApiInfo {
 		this.parameter = parameter;
 	}
 
-	public String getOutput() {
-		return output;
+	public String getResponseBody() {
+		return responseBody;
+	}
+
+	public void setResponseBody(String responseBody) {
+		this.responseBody = responseBody;
+	}
+
+	public String getResponseHeader() {
+		return responseHeader;
 	}
 
-	public void setOutput(String output) {
-		this.output = output;
+	public void setResponseHeader(String responseHeader) {
+		this.responseHeader = responseHeader;
 	}
 
 	public String getGroupId() {
@@ -138,7 +151,7 @@ public class ApiInfo {
 		return option;
 	}
 
-	public void setOptionValue(String optionValue){
+	public void setOptionValue(String optionValue) {
 		this.setOption(optionValue);
 	}
 
@@ -167,11 +180,12 @@ public class ApiInfo {
 				Objects.equals(groupId, apiInfo.groupId) &&
 				Objects.equals(parameter, apiInfo.parameter) &&
 				Objects.equals(option, apiInfo.option) &&
-				Objects.equals(output, apiInfo.output);
+				Objects.equals(responseBody, apiInfo.responseBody) &&
+				Objects.equals(responseHeader, apiInfo.responseHeader);
 	}
 
 	@Override
 	public int hashCode() {
-		return Objects.hash(id, method, path, script, name, groupId, parameter, option, output);
+		return Objects.hash(id, method, path, script, name, groupId, parameter, option, responseBody, responseHeader);
 	}
 }

+ 6 - 5
src/main/java/org/ssssssss/magicapi/provider/impl/DefaultApiServiceProvider.java

@@ -18,7 +18,8 @@ public class DefaultApiServiceProvider extends BeanPropertyRowMapper<ApiInfo> im
 
 	private final String SCRIPT_COLUMNS = "api_script,\n" +
 			"api_parameter,\n" +
-			"api_output,\n" +
+			"api_response_body,\n" +
+			"api_response_header,\n" +
 			"api_option\n";
 
 	private JdbcTemplate template;
@@ -80,14 +81,14 @@ public class DefaultApiServiceProvider extends BeanPropertyRowMapper<ApiInfo> im
 		info.setId(UUID.randomUUID().toString().replace("-", ""));
 		wrap(info);
 		long time = System.currentTimeMillis();
-		String insert = "insert into magic_api_info(id,api_method,api_path,api_script,api_name,api_group_id,api_parameter,api_option,api_output,api_create_time,api_update_time) values(?,?,?,?,?,?,?,?,?,?,?,?)";
-		return template.update(insert, info.getId(), info.getMethod(), info.getPath(), info.getScript(), info.getName(), info.getGroupId(), info.getParameter(), info.getOption(), info.getOutput(), time, time) > 0;
+		String insert = "insert into magic_api_info(id,api_method,api_path,api_script,api_name,api_group_id,api_parameter,api_option,api_response_body,api_response_header,api_create_time,api_update_time) values(?,?,?,?,?,?,?,?,?,?,?,?,?)";
+		return template.update(insert, info.getId(), info.getMethod(), info.getPath(), info.getScript(), info.getName(), info.getGroupId(), info.getParameter(), info.getOption(), info.getResponseBody(), info.getResponseHeader(), time, time) > 0;
 	}
 
 	public boolean update(ApiInfo info) {
 		wrap(info);
-		String update = "update magic_api_info set api_method = ?,api_path = ?,api_script = ?,api_name = ?,api_group_id = ?,api_parameter = ?,api_option = ?,api_output = ?,api_update_time = ? where id = ?";
-		return template.update(update, info.getMethod(), info.getPath(), info.getScript(), info.getName(), info.getGroupId(), info.getParameter(), info.getOption(), info.getOutput(), System.currentTimeMillis(), info.getId()) > 0;
+		String update = "update magic_api_info set api_method = ?,api_path = ?,api_script = ?,api_name = ?,api_group_id = ?,api_parameter = ?,api_option = ?,api_response_body = ?,api_response_header = ?,api_update_time = ? where id = ?";
+		return template.update(update, info.getMethod(), info.getPath(), info.getScript(), info.getName(), info.getGroupId(), info.getParameter(), info.getOption(), info.getResponseBody(), info.getResponseHeader(), System.currentTimeMillis(), info.getId()) > 0;
 	}
 
 	@Override

+ 1 - 1
src/main/java/org/ssssssss/magicapi/swagger/SwaggerProvider.java

@@ -69,7 +69,7 @@ public class SwaggerProvider {
 			SwaggerEntity.Path path = new SwaggerEntity.Path();
 			path.addTag(groupName);
 			try {
-				path.addResponse("200", mapper.readValue(Objects.toString(info.getOutput(), "{}"), Object.class));
+				path.addResponse("200", mapper.readValue(Objects.toString(info.getResponseBody(), "{}"), Object.class));
 			} catch (IOException ignored) {
 			}
 			path.addConsume("*/*");