This commit is contained in:
mxd 2020-07-18 18:13:54 +08:00
parent 8fa08a2e96
commit cb321cf55e
9 changed files with 89 additions and 43 deletions

View File

@ -37,7 +37,7 @@
<dependency>
<groupId>org.ssssssss</groupId>
<artifactId>magic-api-spring-boot-starter</artifactId>
<version>0.2.2</version>
<version>0.3.0</version>
</dependency>
```
## 修改application.properties

View File

@ -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;

22
db/v0.2.x-v0.3.sql Normal file
View File

@ -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;

View File

@ -11,7 +11,7 @@
</parent>
<groupId>org.ssssssss</groupId>
<artifactId>magic-api</artifactId>
<version>0.2.2</version>
<version>0.3.0</version>
<packaging>jar</packaging>
<name>magic-api</name>
<description>auto generate http api</description>

View File

@ -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);

View File

@ -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);
/**
* 添加接口信息

View File

@ -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<Long> 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;
}

View File

@ -2,7 +2,7 @@
<html>
<head>
<meta charset="UTF-8">
<title>MagicAPI v0.2.2 - Powered by ssssssss-team</title>
<title>MagicAPI v0.3.0 - Powered by ssssssss-team</title>
<link rel="icon" href="images/favicon.png" />
<style type="text/css">.loading-wrapper{position:fixed;top:0;bottom:0;left:0;right:0;z-index:2147483647;text-align:center;background:#fff}.loading{position:absolute;top:50%;left:50%;width:500px;height:100px;margin-left:-250px;margin-top:-50px;text-align:center}.loading .title{font-size:0;color:#0075ff;letter-spacing:0}.loading .title label{font-size:36px;display:inline-block;margin-top:5px;vertical-align:top}.loading .title span{font-size:72px;display:inline-block;padding:0 3px;animation:stretch 1s infinite}.loading .title span:nth-child(1){animation-delay:calc(1s / 8 * 0 / 2)}.loading .title span:nth-child(2){animation-delay:calc(1s / 8 * 1 / 2)}.loading .title span:nth-child(3){animation-delay:calc(1s / 8 * 2 / 2)}.loading .title span:nth-child(4){animation-delay:calc(1s / 8 * 3 / 2)}.loading .title span:nth-child(5){animation-delay:calc(1s / 8 * 4 / 2)}.loading .title span:nth-child(6){animation-delay:calc(1s / 8 * 5 / 2)}.loading .title span:nth-child(7){animation-delay:calc(1s / 8 * 6 / 2)}.loading .title span:nth-child(8){animation-delay:calc(1s / 8 * 7 / 2)}.loading .loading-text{text-align:center;font-weight:bolder;font-style:italic;color:#889aa4;font-size:32px;animation:blink-loading 2s ease-in infinite}@keyframes stretch{0%{transform:scale(1)}25%{transform:scale(1.2)}50%{transform:scale(1)}100%{transform:scale(1)}}@keyframes blink-loading{0%{opacity:100%}50%{opacity:50%}100%{opacity:100%}}</style>
<link rel="stylesheet" href="css/index.css" />
@ -25,7 +25,7 @@
<span>A</span>
<span>P</span>
<span>I</span>
<label>v0.2.2</label>
<label>v0.3.0</label>
</div>
<div class="loading-text">Loading...</div>
</div>
@ -34,7 +34,7 @@
<div class="header">
<img src="images/logo.png"/>
<label>magic-api</label>
<label class="version">v0.2.2</label>
<label class="version">v0.3.0</label>
</div>
<span class="button-run" title="运行Ctrl+Q"><i class="iconfont icon-run"></i></span>
<span class="button-save" title="保存Ctrl+S"><i class="iconfont icon-save"></i></span>

View File

@ -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 : '更新提示',