Explorar o código

自定义json结果,自定义分页结果

mxd %!s(int64=5) %!d(string=hai) anos
pai
achega
054ade14e3

+ 11 - 5
src/main/java/org/ssssssss/magicapi/config/RequestHandler.java

@@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.ssssssss.magicapi.context.CookieContext;
 import org.ssssssss.magicapi.context.HeaderContext;
 import org.ssssssss.magicapi.context.SessionContext;
-import org.ssssssss.magicapi.model.JsonBean;
+import org.ssssssss.magicapi.provider.ResultProvider;
 import org.ssssssss.script.MagicScriptContext;
 import org.ssssssss.script.MagicScriptEngine;
 import org.ssssssss.script.exception.MagicScriptAssertException;
@@ -30,6 +30,12 @@ public class RequestHandler {
 
 	private boolean throwException = false;
 
+	private ResultProvider resultProvider;
+
+	public void setResultProvider(ResultProvider resultProvider) {
+		this.resultProvider = resultProvider;
+	}
+
 	public void addRequestInterceptor(RequestInterceptor requestInterceptor) {
 		requestInterceptors.add(requestInterceptor);
 	}
@@ -71,7 +77,7 @@ public class RequestHandler {
 					return target;
 				}
 			}
-			return new JsonBean<>(value);
+			return resultProvider.buildResult(value);
 		} catch (Throwable root) {
 			if (throwException) {
 				throw root;
@@ -81,7 +87,7 @@ public class RequestHandler {
 			do {
 				if (parent instanceof MagicScriptAssertException) {
 					MagicScriptAssertException sae = (MagicScriptAssertException) parent;
-					return new JsonBean<>(sae.getCode(), sae.getMessage());
+					return resultProvider.buildResult(sae.getCode(), sae.getMessage());
 				}
 				if (parent instanceof MagicScriptException) {
 					se = (MagicScriptException) parent;
@@ -89,9 +95,9 @@ public class RequestHandler {
 			} while ((parent = parent.getCause()) != null);
 			logger.error("执行接口出错", root);
 			if (se != null) {
-				return new JsonBean<>(-1, se.getSimpleMessage());
+				return resultProvider.buildResult(-1, se.getSimpleMessage());
 			}
-			return new JsonBean<>(-1, root.getMessage());
+			return resultProvider.buildResult(-1, root.getMessage());
 		}
 
 	}

+ 17 - 9
src/main/java/org/ssssssss/magicapi/config/WebUIController.java

@@ -8,6 +8,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.ssssssss.magicapi.functions.DatabaseQuery;
 import org.ssssssss.magicapi.model.JsonBean;
+import org.ssssssss.magicapi.model.JsonBodyBean;
+import org.ssssssss.magicapi.provider.ResultProvider;
 import org.ssssssss.script.*;
 import org.ssssssss.script.exception.MagicScriptAssertException;
 import org.ssssssss.script.exception.MagicScriptException;
@@ -28,10 +30,16 @@ public class WebUIController {
 
 	private MagicApiService magicApiService;
 
+	private ResultProvider resultProvider;
+
 	public WebUIController() {
 		MagicScriptEngine.addScriptClass(DatabaseQuery.class);
 	}
 
+	public void setResultProvider(ResultProvider resultProvider) {
+		this.resultProvider = resultProvider;
+	}
+
 	public void setDebugTimeout(int debugTimeout) {
 		this.debugTimeout = debugTimeout;
 	}
@@ -100,7 +108,7 @@ public class WebUIController {
 	public JsonBean<Object> debugContinue(String id) {
 		MagicScriptDebugContext context = MagicScriptDebugContext.getDebugContext(id);
 		if (context == null) {
-			return new JsonBean<>(0, "debug session not found!");
+			return new JsonBean<>(0, "debug session not found!", resultProvider.buildResult(0, "debug session not found!"));
 		}
 		try {
 			context.singal();
@@ -108,11 +116,11 @@ public class WebUIController {
 			e.printStackTrace();
 		}
 		if (context.isRunning()) {
-			return new JsonBean<>(1000, context.getId(), context.getDebugInfo());
+			return new JsonBodyBean<>(1000, context.getId(), resultProvider.buildResult(1000, context.getId()), context.getDebugInfo());
 		} else if (context.isException()) {
 			return resolveThrowable((Throwable) context.getReturnValue());
 		}
-		return new JsonBean<>(context.getReturnValue());
+		return new JsonBodyBean<>(resultProvider.buildResult(context.getReturnValue()), context.getReturnValue());
 	}
 
 	@RequestMapping("/classes")
@@ -145,23 +153,23 @@ public class WebUIController {
 				context.set("session", request.get("session"));
 				context.set("header", request.get("header"));
 			} catch (Exception e) {
-				return new JsonBean<>(0, "请求参数填写错误");
+				return new JsonBean<>(0, "请求参数填写错误", resultProvider.buildResult(0, "请求参数填写错误"));
 			}
 			try {
 				context.setBreakpoints((List<Integer>) breakpoints);
 				context.setTimeout(this.debugTimeout);
 				Object result = MagicScriptEngine.execute(script.toString(), context);
 				if (context.isRunning()) {
-					return new JsonBean<>(1000, context.getId(), result);
+					return new JsonBodyBean<>(1000, context.getId(), resultProvider.buildResult(1000, context.getId(), result), result);
 				} else if (context.isException()) {
 					return resolveThrowable((Throwable) context.getReturnValue());
 				}
-				return new JsonBean<>(result);
+				return new JsonBean<>(resultProvider.buildResult(result));
 			} catch (Exception e) {
 				return resolveThrowable(e);
 			}
 		}
-		return new JsonBean<>(0, "脚本不能为空");
+		return new JsonBean<>(resultProvider.buildResult(0, "脚本不能为空"));
 	}
 
 	private JsonBean<Object> resolveThrowable(Throwable root) {
@@ -179,9 +187,9 @@ public class WebUIController {
 		logger.error("测试脚本出错", root);
 		if (se != null) {
 			Span.Line line = se.getLine();
-			return new JsonBean<>(-1000, se.getSimpleMessage(), line == null ? null : Arrays.asList(line.getLineNumber(), line.getEndLineNumber(), line.getStartCol(), line.getEndCol()));
+			return new JsonBodyBean<>(-1000, se.getSimpleMessage(), resultProvider.buildResult(-1000, se.getSimpleMessage()), line == null ? null : Arrays.asList(line.getLineNumber(), line.getEndLineNumber(), line.getStartCol(), line.getEndCol()));
 		}
-		return new JsonBean<>(-1, root.getMessage());
+		return new JsonBean<>(-1, root.getMessage(), resultProvider.buildResult(-1, root.getMessage()));
 	}
 
 	@RequestMapping("/get")

+ 14 - 4
src/main/java/org/ssssssss/magicapi/functions/DatabaseQuery.java

@@ -11,6 +11,7 @@ import org.ssssssss.magicapi.exception.MagicAPIException;
 import org.ssssssss.magicapi.model.Page;
 import org.ssssssss.magicapi.model.PageResult;
 import org.ssssssss.magicapi.provider.PageProvider;
+import org.ssssssss.magicapi.provider.ResultProvider;
 import org.ssssssss.script.MagicScriptContext;
 import org.ssssssss.script.annotation.UnableCall;
 import org.ssssssss.script.functions.StreamExtension;
@@ -34,6 +35,9 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> {
 	@UnableCall
 	private PageProvider pageProvider;
 
+	@UnableCall
+	private ResultProvider resultProvider;
+
 	@UnableCall
 	private RowMapper<Map<String, Object>> rowMapper;
 
@@ -60,6 +64,11 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> {
 		this.pageProvider = pageProvider;
 	}
 
+	@UnableCall
+	public void setResultProvider(ResultProvider resultProvider) {
+		this.resultProvider = resultProvider;
+	}
+
 	@UnableCall
 	public void setRowMapper(RowMapper<Map<String, Object>> rowMapper) {
 		this.rowMapper = rowMapper;
@@ -99,6 +108,7 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> {
 		query.setRowMapper(this.rowMapper);
 		query.setSqlCache(this.sqlCache);
 		query.setTtl(this.ttl);
+		query.setResultProvider(this.resultProvider);
 		return query;
 	}
 
@@ -175,13 +185,13 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> {
 		}
 		int count = (int) boundSql.getCacheValue(this.sqlCache, this.cacheName)
 				.orElseGet(() -> putCacheValue(template.queryForObject(dialect.getCountSql(boundSql.getSql()), Integer.class, boundSql.getParameters()), boundSql));
-		result.setTotal(count);
+		List<Object> list = null;
 		if (count > 0) {
 			String pageSql = dialect.getPageSql(boundSql.getSql(), boundSql, offset, limit);
-			result.setList((List<Map<String, Object>>) boundSql.removeCacheKey().getCacheValue(this.sqlCache, this.cacheName)
-					.orElseGet(() -> putCacheValue(template.query(pageSql, this.rowMapper, boundSql.getParameters()), boundSql)));
+			list = (List<Object>) boundSql.removeCacheKey().getCacheValue(this.sqlCache, this.cacheName)
+					.orElseGet(() -> putCacheValue(template.query(pageSql, this.rowMapper, boundSql.getParameters()), boundSql));
 		}
-		return result;
+		return resultProvider.buildPageResult(count, list);
 	}
 
 	public Integer selectInt(String sql) {

+ 1 - 1
src/main/java/org/ssssssss/magicapi/model/JsonBean.java

@@ -16,7 +16,7 @@ public class JsonBean<T> {
     private String message = "success";
 
     /**
-     * 实际逻辑
+     * 实际数据
      */
     private T data;
 

+ 24 - 0
src/main/java/org/ssssssss/magicapi/model/JsonBodyBean.java

@@ -0,0 +1,24 @@
+package org.ssssssss.magicapi.model;
+
+public class JsonBodyBean<T> extends JsonBean<T> {
+
+	private Object body;
+
+	public JsonBodyBean(int code, String message, T data, Object body) {
+		super(code, message, data);
+		this.body = body;
+	}
+
+	public JsonBodyBean(T data, Object body) {
+		super(data);
+		this.body = body;
+	}
+
+	public Object getBody() {
+		return body;
+	}
+
+	public void setBody(Object body) {
+		this.body = body;
+	}
+}

+ 46 - 0
src/main/java/org/ssssssss/magicapi/provider/ResultProvider.java

@@ -0,0 +1,46 @@
+package org.ssssssss.magicapi.provider;
+
+import org.ssssssss.magicapi.model.PageResult;
+
+import java.util.List;
+
+public interface ResultProvider {
+
+	/**
+	 * 构建JSON返回结果(默认状态码和状态说明)
+	 * @param data	数据内容,状态码和状态说明默认为1 "success"
+	 * @return
+	 */
+	default Object buildResult(Object data) {
+		return buildResult(1, "success", data);
+	}
+
+	/**
+	 * 构建JSON返回结果(无数据内容)
+	 * @param code	状态码
+	 * @param message	状态说明
+	 * @return
+	 */
+	default Object buildResult(int code, String message) {
+		return buildResult(code, message, null);
+	}
+
+	/**
+	 * 构建JSON返回结果
+	 * @param code	状态码
+	 * @param message	状态说明
+	 * @param data	数据内容,可以通过data的类型判断是否是分页结果进行区分普通结果集和分页结果集
+	 * @return
+	 */
+	Object buildResult(int code, String message, Object data);
+
+	/**
+	 *
+	 * @param total	总数
+	 * @param data	数据内容
+	 * @return
+	 */
+	default Object buildPageResult(long total, List<Object> data) {
+		return new PageResult<>(total, data);
+	}
+}

+ 12 - 0
src/main/java/org/ssssssss/magicapi/provider/impl/DefaultResultProvider.java

@@ -0,0 +1,12 @@
+package org.ssssssss.magicapi.provider.impl;
+
+import org.ssssssss.magicapi.model.JsonBean;
+import org.ssssssss.magicapi.provider.ResultProvider;
+
+public class DefaultResultProvider implements ResultProvider {
+
+	@Override
+	public Object buildResult(int code, String message, Object data) {
+		return new JsonBean<>(code, message, data);
+	}
+}

+ 5 - 6
src/main/resources/magicapi-support/js/index.js

@@ -236,11 +236,10 @@ $(function(){
         debugDecorations = null;
         if(code === -1000){
             layui.element.tabChange('output-container', 'output');
-            if(json.data){
-                var data = json.data;
-                delete json.data;
+            if (json.body) {
+                var line = json.body;
                 var decorations = editor&&editor.deltaDecorations([],[{
-                    range :  new monaco.Range(data[0],data[2],data[1],data[3] + 1),
+                    range: new monaco.Range(line[0], line[2], line[1], line[3] + 1),
                     options : {
                         hoverMessage : {
                             value : message
@@ -254,11 +253,11 @@ $(function(){
             }
         }else if(code === 1000){ // debug断点
             layui.element.tabChange('output-container', 'debug');
-            debugIn(message,json.data);
+            debugIn(message, json.body);
             return;
         }
         layui.element.tabChange('output-container', 'output');
-        outputEditor.setValue(formatJson(json))
+        outputEditor.setValue(formatJson(json.data))
     }
     // 窗口改变大小时,刷新编辑器
     $(window).resize(editorLayout);