diff --git a/README.md b/README.md
index 1ef8d65d..31179f92 100644
--- a/README.md
+++ b/README.md
@@ -37,7 +37,7 @@
org.ssssssss
magic-api-spring-boot-starter
- 0.2.2
+ 0.3.0
```
## 修改application.properties
diff --git a/db/magic-api.sql b/db/magic-api.sql
index b4ef5152..8228dfcb 100644
--- a/db/magic-api.sql
+++ b/db/magic-api.sql
@@ -1,35 +1,56 @@
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-
-- ----------------------------
-- Table structure for magic_api_info
-- ----------------------------
DROP TABLE IF EXISTS `magic_api_info`;
CREATE TABLE `magic_api_info` (
- `id` varchar(32) NOT NULL,
- `api_method` varchar(12) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求方法',
- `api_path` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求路径',
- `api_script` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '接口脚本',
- `api_parameter` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '接口参数',
- `api_option` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '接口选项',
- `api_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '接口名称',
- `api_group_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '接口分组',
+ `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `api_method` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方法',
+ `api_path` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求路径',
+ `api_script` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '接口脚本',
+ `api_parameter` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '接口参数',
+ `api_option` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '接口选项',
+ `api_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '接口名称',
+ `api_group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '接口分组',
+ `api_group_prefix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分组前缀',
+ `api_output` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '输出结果',
`api_create_time` bigint(20) NULL DEFAULT NULL COMMENT '创建时间',
`api_update_time` bigint(20) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'MagicAPI接口信息' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for magic_api_info_his
+-- ----------------------------
+CREATE TABLE `magic_api_info_his` (
+ `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'api_id',
+ `api_method` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方法',
+ `api_path` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求路径',
+ `api_script` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '接口脚本',
+ `api_parameter` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '接口参数',
+ `api_option` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '接口选项',
+ `api_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '接口名称',
+ `api_group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '接口分组',
+ `api_group_prefix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分组前缀',
+ `api_output` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '输出结果',
+ `api_create_time` bigint(20) NULL DEFAULT NULL COMMENT '创建时间',
+ `api_update_time` bigint(20) NULL DEFAULT NULL COMMENT '修改时间'
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'MagicAPI接口历史记录' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of magic_api_info
-- ----------------------------
-INSERT INTO `magic_api_info` VALUES ('180524e850124de7956d855bc94bcac9', 'GET', '/test/if', '/*\r\n if 测试\r\n*/\r\nif(a == 1){\r\n return 1;\r\n}else if(a == 2){\r\n return 2;\r\n}else{\r\n return 0;\r\n}', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', 'if测试', '未分组', 1593514724505, 1593514950491);
-INSERT INTO `magic_api_info` VALUES ('6cf9a1ad659f4707be704528632778c5', 'GET', '/test/loop/map', '/*\r\n 测试循环Map\r\n*/\r\nvar map = {\r\n key1 : 1,\r\n key2 : 2,\r\n key3 : 3\r\n};\r\nvar sum = 0;\r\nvar keys = \'\';\r\nfor(key,value in map){\r\n sum = sum + value;\r\n keys = keys + key\r\n}\r\nreturn keys + \'-\' + sum;', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '测试循环Map', '未分组', 1593515248339, 1593515248339);
-INSERT INTO `magic_api_info` VALUES ('9815c54b31f64a9cb3a068934df21c25', 'GET', '/test/var', '/*\r\n 测试变量定义\r\n*/\r\nvar int = 1; \r\nvar double = 2.0d; //2.0D \r\nvar long = 3L; // 3l\r\nvar float = 4f; // 4F\r\nvar byte = 5b; // 5B;\r\nvar short = 6s; //6S\r\nvar boolean = true; //true or false;\r\nvar nullValue = null; // null\r\nvar list = [1,2,3,4,5]; //定义list\r\nvar map = {\r\n k1 : 123,\r\n k2 : \"456\",\r\n k3 : 789L,\r\n k4 : {\r\n k5 : \'...\'\r\n }\r\n}; //定义map\r\nvar string1 = \"str\"; //定义字符串\r\nvar string2 = \'str2\'; // \\t \\n \\r \\\' \\\" \\\\ 转义符是支持的,其它的不支持\r\n//文本块,主要用于定义SQL\r\nvar string3 = \"\"\" \r\n select \r\n * \r\n from table t1\r\n join table2 t2 on t2.xx = t1.xx\r\n where t1.id in (1,2,3,4,5,6)\r\n\"\"\"\r\n\r\nvar lambda = e=>e+1; //定义lambda', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '测试定义变量', '未分组', 1593519576351, 1593520303156);
-INSERT INTO `magic_api_info` VALUES ('b7df52ff308e481abceda07d7d3ef62c', 'GET', '/test/binary', '/*\r\n 各种操作符测试\r\n*/\r\nimport \'java.lang.System\' as system;\r\nvar a = 1;\r\nvar b = 2;\r\nsystem.out.println(\"a = \" + a + \", b = \" + b);\r\nvar c = a + b;\r\nsystem.out.println(\"a + b = \" + c);\r\nc = a - b;\r\nsystem.out.println(\"a - b = \" + c);\r\nc = a * b;\r\nsystem.out.println(\"a * b = \" + c);\r\nc = a / b;\r\nsystem.out.println(\"a / b = \" + c);\r\nc = a % b;\r\nsystem.out.println(\"a % b = \" + c);\r\nc = a > b;\r\nsystem.out.println(\"a > b = \" + c);\r\nc = a >= b;\r\nsystem.out.println(\"a >= b = \" + c);\r\nc = a == b;\r\nsystem.out.println(\"a == b = \" + c);\r\nc = a < b;\r\nsystem.out.println(\"a < b = \" + c);\r\nc = a <= b;\r\nsystem.out.println(\"a <= b = \" + c);\r\nc = a != b;\r\nsystem.out.println(\"a != b = \" + c);', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '操作符测试', '未分组', 1593514691506, 1593514691506);
-INSERT INTO `magic_api_info` VALUES ('cd3c9e4c09fc44fdb82c0f1b783f59af', 'GET', '/test/loop/list', '/*\r\n 测试循环List\r\n*/\r\nvar list = [1,2,3,4,5];\r\nvar sum = 0;\r\nfor(val in list){\r\n sum = sum + val;\r\n}\r\nreturn sum;', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '测试循环List', '未分组', 1593515155753, 1593515155753);
-INSERT INTO `magic_api_info` VALUES ('d338de01930f4149b4ea85c9f1f88387', 'GET', '/test/lambda', '/*\r\n 测试Lambda\r\n*/\r\nvar lambda1 = e => e + 1; //单参数单行代码,省略括号,省略{}\r\nvar lambda2 = (e) => e +1; //单参数单行代码,不省略括号,省略{} 作用同上\r\nvar lambda4 = e => {e + 1};//单参数无返回值,不能省略{}\r\nvar lambda5 = e => {return e + 1};//单参数有返回值,省略括号,不省略{}\r\nvar lambda6 = (e) => {return e + 1};//单参数有返回值,不省略括号,不省略{},作用同上\r\nvar lambda7 = (a,b) => a + b; //多参数单行代码,省略{}\r\nvar lambda7 = (a,b) => {return a + b}; //多参数单行代码,有返回值,作用同上\r\nvar lambda8 = (a,b) =>{ //多参数多行代码, 无法省略括号和{}\r\n a = a + 1;\r\n return a + b;\r\n}\r\nvar v1 = lambda1(1); //返回2\r\nvar v2 = lambda2(v1); //返回3\r\nreturn lambda8(v1,lambda7(v1,v2)); //返回8\r\n', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '测试lambda', '未分组', 1593518831250, 1593519140773);
-INSERT INTO `magic_api_info` VALUES ('dccb42bc1d974d99b0ebd9a12d42c47b', 'GET', '/test/new', 'import \'java.util.Date\' as Date;\r\nimport \'java.text.SimpleDateFormat\' as SimpleDateFormat;\r\nvar now = new Date();\r\nvar df = new SimpleDateFormat(\'yyyy-MM-dd\');\r\nreturn df.format(now);', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '测试创建对象', '未分组', 1593525594254, 1593525594254);
-INSERT INTO `magic_api_info` VALUES ('ee45724999ad400c927f5a267f6b8676', 'GET', '/test/for', '/*\r\n 测试循环\r\n*/\r\nvar sum = 0;\r\nfor(val in range(0,100)){ //包括0 包括100\r\n if(val > 90){\r\n break; //跳出循环\r\n }\r\n if(val % 3 == 0){\r\n continue; //进入下一次循环\r\n }\r\n sum = sum + val;\r\n}\r\nreturn sum;', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '测试for循环', '未分组', 1593515005267, 1593520147849);
-INSERT INTO `magic_api_info` VALUES ('ff2135698c6e4d1bad0db59195dfe706', 'GET', '/test/sql', 'var sql = \"\"\"\r\n select \'${message}\' as user_name,#{id} as user_id\r\n\"\"\"\r\nreturn db.select(sql);', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '测试执行SQL', '未分组', 1593005960511, 1593870914503);
+INSERT INTO `magic_api_info` VALUES ('033239e63a2a42b987567a37a2efdd32', 'GET', '/download', 'import response;\r\nreturn response.download(\'中文测试\',\'str.txt\');', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"body\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '文件下载', '自定义结果', '/custom', '', 1595050133467, 1595050258418);
+INSERT INTO `magic_api_info` VALUES ('180524e850124de7956d855bc94bcac9', 'GET', '/if', '/*\r\n if 测试\r\n*/\r\nif(a == 1){\r\n return 1;\r\n}else if(a == 2){\r\n return 2;\r\n}else{\r\n return 0;\r\n}', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', 'if测试', '语法测试', '/test', NULL, 1593514724505, 1594736129503);
+INSERT INTO `magic_api_info` VALUES ('48095f19fa3a455296bf96b244a3c60c', 'GET', '/image', 'import \'java.awt.image.BufferedImage\' as BufferedImage;\r\nimport \'java.awt.Color\' as Color;\r\nimport \'java.awt.Font\' as Font;\r\nimport \'java.io.ByteArrayOutputStream\' as ByteArrayOutputStream;\r\nimport \'java.util.Random\' as Random;\r\nimport \'javax.imageio.ImageIO\' as ImageIO;\r\nimport response;\r\nimport log;\r\n\r\nvar width = 200;\r\nvar height = 69;\r\nvar image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);\r\nvar graphics = image.getGraphics();\r\ngraphics.setColor(Color.WHITE);\r\ngraphics.fillRect(0,0,width,height);\r\ngraphics.setFont(new Font(\"微软雅黑\", Font.BOLD, 40));\r\nvar letter = \'123456789abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ\';\r\nvar random = new Random();\r\nvar randomColor = ()=>new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256));\r\nvar x = 10;\r\nvar code = \'\';\r\nfor (i in range(0, 3)){ //验证码\r\n graphics.setColor(randomColor());\r\n var degree = random.nextInt() % 30;\r\n var ch = letter.charAt(random.nextInt(letter.length()));\r\n code = code + ch;\r\n graphics.rotate(degree * 3.1415926535d / 180, x, 45);\r\n graphics.drawString(ch + \'\', x, 45);\r\n graphics.rotate(-degree * 3.1415926535d / 180, x, 45);\r\n x = x + 48;\r\n}\r\nlog.info(\'生成的验证码:{}\',code)\r\nfor (i in range(0, 6)) { //干扰线\r\n graphics.setColor(randomColor());\r\n graphics.drawLine(random.nextInt(width), random.nextInt(height),random.nextInt(width), random.nextInt(height));\r\n}\r\n\r\nfor(i in range(0, 30)){ //噪点\r\n graphics.setColor(randomColor());\r\n graphics.fillRect(random.nextInt(width), random.nextInt(height), 2,2);\r\n\r\n}\r\ngraphics.dispose();\r\nvar baos = new ByteArrayOutputStream();\r\nImageIO.write(image,\"png\",baos);\r\nbaos.flush();\r\nbaos.close();\r\nreturn response.image(baos.toByteArray(),\'image/png\');\r\n', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"body\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '生成验证码', '自定义结果', '/custom', '\"iVBORw0KGgoAAAANSUhEUgAAAMgAAABFCAIAAACAFD7PAAAE4klEQVR42u3cO2gWQRAA4GtEQdQINhpQjFZClCgWImpjUBDFQhALO0UQrSRgEwsLtVMQFQQRA6Yy2qmFEQtL0ygWFj4wEBubNBY+OAcOjmX3/s3sY/Zm72aYIvlzSST/x8zs3p5F6Rgfb86qWUpINEUR+P2aMwFHGsOrj0L2ApYrODEnsEox5xS7ni8X+m3C6mRjFVWsYWVa5ERVrrA4Fzkmqmbn5iAFVgpwr/bOQFKbE1j9ggVRwSJtrNya4L3jE5ACK+/GynC0ElgdAefXWEfnX0LK8C5hq1Ue4AQW65jevhaS7eZCz+89CKwWpvU+mJNWyGsZGAvcvqFHWrpej/kugZVO1c4NV8xMX+SciKiXnb/0KVyVwIpfq1RPC1umIBupRdFmN4e3pV1W2ZJWyKsD4mGRasMXOdOfwOI4VzkxIuVlqVgWc7UtgcVrWs8CluWaWKsHgUW4BmQOy74M1IqWq7OMYd06+ETNjDYX0oxZdlhL7i8EdkMd1pvpC5CcAblKmt92U0sOW1YJhncTzfLrX5HlKtwWI1jegEw6KqD608vnLkIiYaVXNfXtFyQpLHgRbEEi90JjwmpLj3cvG6SqtuUBq5ValQZW9brJa9AP8bZVcCs/EVXZK1kaVZPlYwwsirfAAqvujJhNdj9bRRaAIqpSYR2aeQbZSVWDYFUf3B4+DFmXLvvPSQRLA3R3ZKFOoj/Q2OIBSLwq5AUmLCJV+zetgkwzsGPWfSosdfCKayu0YqmwiHjhYSGrWoImqNaqClZiVXZYjR3QYosFLLrS5ccFeSWRqmSbC36wTFuDeLnaKrJT5bo1hVFYqfqy5zNkN1ThYZmTeyMvLrBIqbku9OzX17UqHBYfVfbhHbOJZfJyslXEVWXJ8L/Un6n7kHFhda8D4rcbMKe1VFtMYYXbig4rliogxU1VLFha6ULaevhjY5FMVcS2GAVWRFXmi62rKq03oT1OuNe8MLYiw0Li6xIstqrK4NMNg3ghi1ZBpIp02Ri+Kuy8KgusycXNkGXAkzkYW3FgBS4bXcEF7mOlV5UXrCVtkcByKkJEQxgeVqMq/JGsfFWVvkeTIY+NvIUMtFXQlat3J09DprSlihnUAZ3O+uWrqkQ/WsgClpMDb1gYWx6HGmpVIbByUVW6PLNK0RAJYSHRRC9ajWf9VFXesBpVlYiHJjKFFXJOqyBSFbh4DJniG4/QhMPyVsXnXqHTxYFFKzKsf1tPQIbXtsAVonnfxu95CkxEeZCQwlm7/y9IECzzmvSwTGHa66YqgZXAVhGxXHlboTt7U21ZkcKKJazsVhQRy1XEGT87VeHaKH772LIJSNawTATal/7u+A5JrTBcVWJYeG29hmWJGhZp09SGKg9VHGD1IeI/V5isXFmgNA7soipjWMnKlaUgaap+flgDKaq6BotuusKoUmHJm80I1viKs1qSwvLbuLKokg6YTcUyqZns0iwGkarkPe5CK7SzUwte3C2GKPeYJVivCpHyhkYfQDr1WfvmQp/j/frfkL2GVZerCpZWrpDVrkVY41efQgosjrC8p6tGaonLFU9Y0gojD1jSBAWWjZeoElgkvESVwGIRokpgiSqBJbAkegtLVAksUeUQ61begGz9n/HiyB1IRrCunboOKaoEVn6wJKQVSrCIM7tfQ7b12/8DhLAaxgXV4u4AAAAASUVORK5CYII=\"', 1595051666872, 1595052398138);
+INSERT INTO `magic_api_info` VALUES ('6cf9a1ad659f4707be704528632778c5', 'GET', '/loop/map', '/*\r\n 测试循环Map\r\n*/\r\nvar map = {\r\n key1 : 1,\r\n key2 : 2,\r\n key3 : 3\r\n};\r\nvar sum = 0;\r\nvar keys = \'\';\r\nfor(key,value in map){\r\n sum = sum + value;\r\n keys = keys + key\r\n}\r\nreturn keys + \'-\' + sum;', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '测试循环Map', '语法测试', '/test', NULL, 1593515248339, 1594736134584);
+INSERT INTO `magic_api_info` VALUES ('9815c54b31f64a9cb3a068934df21c25', 'GET', '/var', '/*\r\n 测试变量定义\r\n*/\r\nvar int = 1; \r\nvar double = 2.0d; //2.0D \r\nvar long = 3L; // 3l\r\nvar float = 4f; // 4F\r\nvar byte = 5b; // 5B;\r\nvar short = 6s; //6S\r\nvar boolean = true; //true or false;\r\nvar nullValue = null; // null\r\nvar list = [1,2,3,4,5]; //定义list\r\nvar map = {\r\n k1 : 123,\r\n k2 : \"456\",\r\n k3 : 789L,\r\n k4 : {\r\n k5 : \'...\'\r\n }\r\n}; //定义map\r\nvar string1 = \"str\"; //定义字符串\r\nvar string2 = \'str2\'; // \\t \\n \\r \\\' \\\" \\\\ 转义符是支持的,其它的不支持\r\n//文本块,主要用于定义SQL\r\nvar string3 = \"\"\" \r\n select \r\n * \r\n from table t1\r\n join table2 t2 on t2.xx = t1.xx\r\n where t1.id in (1,2,3,4,5,6)\r\n\"\"\"\r\n\r\nvar lambda = e=>e+1; //定义lambda', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '测试定义变量', '语法测试', '/test', NULL, 1593519576351, 1594736110904);
+INSERT INTO `magic_api_info` VALUES ('b7df52ff308e481abceda07d7d3ef62c', 'GET', '/binary', '/*\r\n 各种操作符测试\r\n*/\r\nimport \'java.lang.System\' as system;\r\nvar a = 1;\r\nvar b = 2;\r\nsystem.out.println(\"a = \" + a + \", b = \" + b);\r\nvar c = a + b;\r\nsystem.out.println(\"a + b = \" + c);\r\nc = a - b;\r\nsystem.out.println(\"a - b = \" + c);\r\nc = a * b;\r\nsystem.out.println(\"a * b = \" + c);\r\nc = a / b;\r\nsystem.out.println(\"a / b = \" + c);\r\nc = a % b;\r\nsystem.out.println(\"a % b = \" + c);\r\nc = a > b;\r\nsystem.out.println(\"a > b = \" + c);\r\nc = a >= b;\r\nsystem.out.println(\"a >= b = \" + c);\r\nc = a == b;\r\nsystem.out.println(\"a == b = \" + c);\r\nc = a < b;\r\nsystem.out.println(\"a < b = \" + c);\r\nc = a <= b;\r\nsystem.out.println(\"a <= b = \" + c);\r\nc = a != b;\r\nsystem.out.println(\"a != b = \" + c);', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '操作符测试', '语法测试', '/test', NULL, 1593514691506, 1594903771663);
+INSERT INTO `magic_api_info` VALUES ('cd3c9e4c09fc44fdb82c0f1b783f59af', 'GET', '/loop/list', '/*\r\n 测试循环List\r\n*/\r\nvar list = [1,2,3,4,5];\r\nvar sum = 0;\r\nfor(val in list){\r\n sum = sum + val;\r\n}\r\nreturn sum;', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '测试循环List', '语法测试', '/test', '{\n \"code\": 1,\n \"message\": \"success\",\n \"data\": 15,\n \"timestamp\": 1594915393436\n}', 1593515155753, 1594915394105);
+INSERT INTO `magic_api_info` VALUES ('d338de01930f4149b4ea85c9f1f88387', 'GET', '/lambda', '/*\r\n 测试Lambda\r\n*/\r\nvar lambda1 = e => e + 1; //单参数单行代码,省略括号,省略{}\r\nvar lambda2 = (e) => e +1; //单参数单行代码,不省略括号,省略{} 作用同上\r\nvar lambda4 = e => {e + 1};//单参数无返回值,不能省略{}\r\nvar lambda5 = e => {return e + 1};//单参数有返回值,省略括号,不省略{}\r\nvar lambda6 = (e) => {return e + 1};//单参数有返回值,不省略括号,不省略{},作用同上\r\nvar lambda7 = (a,b) => a + b; //多参数单行代码,省略{}\r\nvar lambda7 = (a,b) => {return a + b}; //多参数单行代码,有返回值,作用同上\r\nvar lambda8 = (a,b) =>{ //多参数多行代码, 无法省略括号和{}\r\n a = a + 1;\r\n return a + b;\r\n}\r\nvar v1 = lambda1(1); //返回2\r\nvar v2 = lambda2(v1); //返回3\r\nreturn lambda8(v1,lambda7(v1,v2)); //返回8\r\n', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '测试lambda', '语法测试', '/test', '{\n \"code\": 1,\n \"message\": \"success\",\n \"data\": 8,\n \"timestamp\": 1594915477773\n}', 1593518831250, 1594915478585);
+INSERT INTO `magic_api_info` VALUES ('dccb42bc1d974d99b0ebd9a12d42c47b', 'GET', '/new', 'import \'java.util.Date\' as Date;\r\nimport \'java.text.SimpleDateFormat\' as SimpleDateFormat;\r\nvar now = new Date();\r\nvar df = new SimpleDateFormat(\'yyyy-MM-dd\');\r\nreturn df.format(now);', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '测试创建对象', '语法测试', '/test', '{\n \"code\": 1,\n \"message\": \"success\",\n \"data\": \"2020-07-18\",\n \"timestamp\": 1595040221517\n}', 1593525594254, 1595040241898);
+INSERT INTO `magic_api_info` VALUES ('ee45724999ad400c927f5a267f6b8676', 'GET', '/test/for', '/*\r\n 测试循环\r\n*/\r\nvar sum = 0;\r\nfor(val in range(0,100)){ //包括0 包括100\r\n if(val > 90){\r\n break; //跳出循环\r\n }\r\n if(val % 3 == 0){\r\n continue; //进入下一次循环\r\n }\r\n sum = sum + val;\r\n}\r\nreturn sum;', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '测试for循环', '语法测试', '/test', NULL, 1593515005267, 1594735986968);
+INSERT INTO `magic_api_info` VALUES ('ff2135698c6e4d1bad0db59195dfe706', 'GET', '/select', 'var sql = \"\"\"\r\n select \r\n \'${message}\' as user_name,\r\n #{id} as user_id\r\n\"\"\";\r\nreturn db.select(sql);', '{\r\n \"request\" : {\r\n \"message\" : \"Hello MagicAPI!\"\r\n },\r\n \"path\" : {\r\n \"id\" : \"123456\"\r\n },\r\n \"header\" : {\r\n \"token\" : \"tokenValue\"\r\n },\r\n \"cookie\" : {\r\n \"cookieName\" : \"cookieValue\"\r\n },\r\n \"session\" : {\r\n \"userId\" : \"123\"\r\n }\r\n}', '{\r\n}', '测试执行SQL', 'SQL测试', '/sql', '', 1593005960511, 1594990967188);
SET FOREIGN_KEY_CHECKS = 1;
diff --git a/db/v0.2.x-v0.3.sql b/db/v0.2.x-v0.3.sql
new file mode 100644
index 00000000..b765db94
--- /dev/null
+++ b/db/v0.2.x-v0.3.sql
@@ -0,0 +1,22 @@
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+ALTER TABLE `magic_api_info` ADD COLUMN `api_group_prefix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分组前缀' AFTER `api_group_name`;
+ALTER TABLE `magic_api_info` ADD COLUMN `api_output` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '输出结果' AFTER `api_group_prefix`;
+-- ----------------------------
+-- Table structure for magic_api_info_his
+-- ----------------------------
+CREATE TABLE `magic_api_info_his` (
+ `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'api_id',
+ `api_method` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方法',
+ `api_path` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求路径',
+ `api_script` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '接口脚本',
+ `api_parameter` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '接口参数',
+ `api_option` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '接口选项',
+ `api_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '接口名称',
+ `api_group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '接口分组',
+ `api_group_prefix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分组前缀',
+ `api_output` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '输出结果',
+ `api_create_time` bigint(20) NULL DEFAULT NULL COMMENT '创建时间',
+ `api_update_time` bigint(20) NULL DEFAULT NULL COMMENT '修改时间'
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'MagicAPI接口历史记录' ROW_FORMAT = Dynamic;
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 83d4a497..b71b7966 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,7 +11,7 @@
org.ssssssss
magic-api
- 0.2.2
+ 0.3.0
jar
magic-api
auto generate http api
diff --git a/src/main/java/org/ssssssss/magicapi/config/WebUIController.java b/src/main/java/org/ssssssss/magicapi/config/WebUIController.java
index 28556004..c97f4d31 100644
--- a/src/main/java/org/ssssssss/magicapi/config/WebUIController.java
+++ b/src/main/java/org/ssssssss/magicapi/config/WebUIController.java
@@ -7,7 +7,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.core.io.InputStreamSource;
-import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -296,7 +295,7 @@ public class WebUIController {
if (sessionId != null) {
context.setId(sessionId.toString());
context.onComplete(() -> MagicLoggerContext.remove(sessionId.toString()));
- logger.info("Start Console Session : {},{}", sessionId, this.getClass().getClassLoader().getClass().getName());
+ logger.info("Start Console Session : {}", sessionId);
context.onStart(() -> MDC.put(MagicLoggerContext.MAGIC_CONSOLE_SESSION, sessionId.toString()));
}
Object result = MagicScriptEngine.execute(MagicScriptCompiler.compile(script.toString()), context);
@@ -313,6 +312,9 @@ public class WebUIController {
response.addHeader("MA-" + key, value);
}
}
+ if(entity.getHeaders().isEmpty()){
+ return ResponseEntity.ok(new JsonBean<>(entity.getBody()));
+ }
return ResponseEntity.ok(new JsonBean<>(convertToBase64(entity.getBody())));
}
return new JsonBean<>(resultProvider.buildResult(result));
@@ -347,7 +349,7 @@ public class WebUIController {
do {
if (parent instanceof MagicScriptAssertException) {
MagicScriptAssertException sae = (MagicScriptAssertException) parent;
- return new JsonBean<>(sae.getCode(), sae.getMessage(), resultProvider.buildResult(sae.getCode(), sae.getMessage()));
+ return new JsonBean<>(resultProvider.buildResult(sae.getCode(), sae.getMessage()));
}
if (parent instanceof MagicScriptException) {
se = (MagicScriptException) parent;
@@ -422,13 +424,13 @@ public class WebUIController {
}
if (StringUtils.isBlank(info.getId())) {
// 先判断接口是否存在
- if (magicApiService.exists(info.getMethod(), info.getPath())) {
+ if (magicApiService.exists(info.getGroupPrefix(), info.getMethod(), info.getPath())) {
return new JsonBean<>(0, String.format("接口%s:%s已存在", info.getMethod(), info.getPath()));
}
magicApiService.insert(info);
} else {
// 先判断接口是否存在
- if (magicApiService.existsWithoutId(info.getMethod(), info.getPath(), info.getId())) {
+ if (magicApiService.existsWithoutId(info.getGroupPrefix(), info.getMethod(), info.getPath(), info.getId())) {
return new JsonBean<>(0, String.format("接口%s:%s已存在", info.getMethod(), info.getPath()));
}
magicApiService.update(info);
diff --git a/src/main/java/org/ssssssss/magicapi/provider/ApiServiceProvider.java b/src/main/java/org/ssssssss/magicapi/provider/ApiServiceProvider.java
index a37fa2fa..55e87422 100644
--- a/src/main/java/org/ssssssss/magicapi/provider/ApiServiceProvider.java
+++ b/src/main/java/org/ssssssss/magicapi/provider/ApiServiceProvider.java
@@ -40,11 +40,11 @@ public interface ApiServiceProvider {
/**
* 判断接口是否存在
- *
+ * @param groupPrefix 分组前缀
* @param method 请求方法
* @param path 请求路径
*/
- boolean exists(String method, String path);
+ boolean exists(String groupPrefix, String method, String path);
/**
* 修改分组信息
@@ -57,12 +57,13 @@ public interface ApiServiceProvider {
/**
* 判断接口是否存在
*
+ * @param groupPrefix 分组前缀
* @param method 请求方法
* @param path 请求路径
* @param id 排除接口
* @return
*/
- boolean existsWithoutId(String method, String path, String id);
+ boolean existsWithoutId(String groupPrefix, String method, String path, String id);
/**
* 添加接口信息
diff --git a/src/main/java/org/ssssssss/magicapi/provider/impl/DefaultApiServiceProvider.java b/src/main/java/org/ssssssss/magicapi/provider/impl/DefaultApiServiceProvider.java
index 5a6b989a..b5c20065 100644
--- a/src/main/java/org/ssssssss/magicapi/provider/impl/DefaultApiServiceProvider.java
+++ b/src/main/java/org/ssssssss/magicapi/provider/impl/DefaultApiServiceProvider.java
@@ -64,9 +64,9 @@ public class DefaultApiServiceProvider implements ApiServiceProvider {
return info;
}
- public boolean exists(String method, String path) {
- String exists = "select count(*) from magic_api_info where api_method = ? and api_path = ?";
- return template.queryForObject(exists, Integer.class, method, path) > 0;
+ public boolean exists(String groupPrefix, String method, String path) {
+ String exists = "select count(*) from magic_api_info where api_method = ? and api_path = ? and api_group_prefix = ?";
+ return template.queryForObject(exists, Integer.class, method, path, groupPrefix) > 0;
}
@Override
@@ -75,9 +75,9 @@ public class DefaultApiServiceProvider implements ApiServiceProvider {
return template.update(updateGroup, groupName, groupPrefix, System.currentTimeMillis(), oldGroupName) > 0;
}
- public boolean existsWithoutId(String method, String path, String id) {
- String existsWithoutId = "select count(*) from magic_api_info where api_method = ? and api_path = ? and id !=?";
- return template.queryForObject(existsWithoutId, Integer.class, method, path, id) > 0;
+ public boolean existsWithoutId(String groupPrefix, String method, String path, String id) {
+ String existsWithoutId = "select count(*) from magic_api_info where api_method = ? and api_path = ? and api_group_prefix = ? and id !=?";
+ return template.queryForObject(existsWithoutId, Integer.class, method, path, groupPrefix, id) > 0;
}
public boolean insert(ApiInfo info) {
@@ -102,13 +102,13 @@ public class DefaultApiServiceProvider implements ApiServiceProvider {
@Override
public List backupList(String apiId) {
- return template.queryForList("select api_update_time from magic_api_info_his where id = ? order by api_update_time desc",Long.class,apiId);
+ return template.queryForList("select api_update_time from magic_api_info_his where id = ? order by api_update_time desc", Long.class, apiId);
}
@Override
public ApiInfo backupInfo(String apiId, Long timestamp) {
String selectOne = "select " + COMMON_COLUMNS + "," + SCRIPT_COLUMNS + " from magic_api_info_his where id = ? and api_update_time = ? limit 1";
- ApiInfo info = template.queryForObject(selectOne, rowMapper, apiId,timestamp);
+ ApiInfo info = template.queryForObject(selectOne, rowMapper, apiId, timestamp);
unwrap(info);
return info;
}
diff --git a/src/main/resources/magicapi-support/index.html b/src/main/resources/magicapi-support/index.html
index 8cb72790..fadd9f6d 100644
--- a/src/main/resources/magicapi-support/index.html
+++ b/src/main/resources/magicapi-support/index.html
@@ -2,7 +2,7 @@
- MagicAPI v0.2.2 - Powered by ssssssss-team
+ MagicAPI v0.3.0 - Powered by ssssssss-team
@@ -25,7 +25,7 @@
A
P
I
-
+
Loading...
@@ -34,7 +34,7 @@
diff --git a/src/main/resources/magicapi-support/js/index.js b/src/main/resources/magicapi-support/js/index.js
index 8eebf04b..53441e63 100644
--- a/src/main/resources/magicapi-support/js/index.js
+++ b/src/main/resources/magicapi-support/js/index.js
@@ -634,7 +634,7 @@ var MagicEditor = {
})
}
_this.setStatusBar('保存成功!');
- _this.renderApiList();
+ _this.loadAPI();
}
})
},
@@ -700,7 +700,7 @@ var MagicEditor = {
a.href = window.URL.createObjectURL(new Blob([u8arr]));
a.click();
MagicEditor.report('output_blob');
- }else if(contentType.indexOf('image') == 0){ //image开头
+ }else if(contentType && contentType.indexOf('image') == 0){ //image开头
outputJson = this.formatJson(json.data);
this.createDialog({
title : '图片结果',
@@ -773,7 +773,7 @@ var MagicEditor = {
url : 'https://img.shields.io/maven-central/v/org.ssssssss/magic-api.json',
dataType : 'json',
success : function(data){
- if(data.value != 'v0.2.2'){
+ if(data.value != 'v0.3.0'){
if(ignoreVersion != data.value){
_this.createDialog({
title : '更新提示',