浏览代码

代码优化

mxd 3 年之前
父节点
当前提交
982f9f43bd
共有 100 个文件被更改,包括 941 次插入247 次删除
  1. 2 2
      magic-api/pom.xml
  2. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/adapter/ColumnMapperAdapter.java
  3. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/adapter/DialectAdapter.java
  4. 75 3
      magic-api/src/main/java/org/ssssssss/magicapi/adapter/Resource.java
  5. 7 2
      magic-api/src/main/java/org/ssssssss/magicapi/adapter/ResourceAdapter.java
  6. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/adapter/resource/DatabaseResource.java
  7. 8 3
      magic-api/src/main/java/org/ssssssss/magicapi/adapter/resource/FileResource.java
  8. 8 5
      magic-api/src/main/java/org/ssssssss/magicapi/adapter/resource/JarResource.java
  9. 20 2
      magic-api/src/main/java/org/ssssssss/magicapi/adapter/resource/KeyValueResource.java
  10. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/adapter/resource/RedisResource.java
  11. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/adapter/resource/ZipResource.java
  12. 6 2
      magic-api/src/main/java/org/ssssssss/magicapi/cache/DefaultSqlCache.java
  13. 2 0
      magic-api/src/main/java/org/ssssssss/magicapi/cache/SqlCache.java
  14. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/config/MagicConfiguration.java
  15. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/config/MagicCorsFilter.java
  16. 6 1
      magic-api/src/main/java/org/ssssssss/magicapi/config/MagicDynamicDataSource.java
  17. 2 0
      magic-api/src/main/java/org/ssssssss/magicapi/config/MagicFunction.java
  18. 25 20
      magic-api/src/main/java/org/ssssssss/magicapi/config/MagicFunctionManager.java
  19. 5 1
      magic-api/src/main/java/org/ssssssss/magicapi/config/MagicModule.java
  20. 5 1
      magic-api/src/main/java/org/ssssssss/magicapi/config/MagicWebRequestInterceptor.java
  21. 28 22
      magic-api/src/main/java/org/ssssssss/magicapi/config/MappingHandlerMapping.java
  22. 6 1
      magic-api/src/main/java/org/ssssssss/magicapi/config/Message.java
  23. 4 2
      magic-api/src/main/java/org/ssssssss/magicapi/config/MessageType.java
  24. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/config/Valid.java
  25. 6 1
      magic-api/src/main/java/org/ssssssss/magicapi/config/WebSocketSessionManager.java
  26. 2 0
      magic-api/src/main/java/org/ssssssss/magicapi/context/CookieContext.java
  27. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/context/RequestContext.java
  28. 2 0
      magic-api/src/main/java/org/ssssssss/magicapi/context/SessionContext.java
  29. 6 3
      magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicController.java
  30. 6 2
      magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicDataSourceController.java
  31. 6 1
      magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicDebugHandler.java
  32. 17 0
      magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicExceptionHandler.java
  33. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicFunctionController.java
  34. 7 2
      magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicGroupController.java
  35. 25 21
      magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicWebSocketDispatcher.java
  36. 7 2
      magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicWorkbenchHandler.java
  37. 18 7
      magic-api/src/main/java/org/ssssssss/magicapi/controller/RequestHandler.java
  38. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/dialect/ClickhouseDialect.java
  39. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/dialect/DB2Dialect.java
  40. 22 1
      magic-api/src/main/java/org/ssssssss/magicapi/dialect/Dialect.java
  41. 6 0
      magic-api/src/main/java/org/ssssssss/magicapi/dialect/KingbaseSQLDialect.java
  42. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/dialect/MySQLDialect.java
  43. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/dialect/OracleDialect.java
  44. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/dialect/PostgreSQLDialect.java
  45. 6 0
      magic-api/src/main/java/org/ssssssss/magicapi/dialect/SQLServer2005Dialect.java
  46. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/dialect/SQLServerDialect.java
  47. 6 1
      magic-api/src/main/java/org/ssssssss/magicapi/exception/InvalidArgumentException.java
  48. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/exception/MagicAPIException.java
  49. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/exception/MagicLoginException.java
  50. 13 0
      magic-api/src/main/java/org/ssssssss/magicapi/exception/MagicResourceNotFoundException.java
  51. 0 8
      magic-api/src/main/java/org/ssssssss/magicapi/exception/MagicServiceException.java
  52. 6 1
      magic-api/src/main/java/org/ssssssss/magicapi/exception/ValidateException.java
  53. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/interceptor/Authorization.java
  54. 45 1
      magic-api/src/main/java/org/ssssssss/magicapi/interceptor/AuthorizationInterceptor.java
  55. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/interceptor/DefaultAuthorizationInterceptor.java
  56. 8 3
      magic-api/src/main/java/org/ssssssss/magicapi/interceptor/DefaultSqlInterceptor.java
  57. 9 4
      magic-api/src/main/java/org/ssssssss/magicapi/interceptor/MagicUser.java
  58. 28 3
      magic-api/src/main/java/org/ssssssss/magicapi/interceptor/RequestInterceptor.java
  59. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/interceptor/SQLInterceptor.java
  60. 2 0
      magic-api/src/main/java/org/ssssssss/magicapi/logging/Log4j2LoggerContext.java
  61. 2 0
      magic-api/src/main/java/org/ssssssss/magicapi/logging/Log4jLoggerContext.java
  62. 2 0
      magic-api/src/main/java/org/ssssssss/magicapi/logging/LogInfo.java
  63. 2 0
      magic-api/src/main/java/org/ssssssss/magicapi/logging/LogbackLoggerContext.java
  64. 8 3
      magic-api/src/main/java/org/ssssssss/magicapi/logging/LoggerManager.java
  65. 12 0
      magic-api/src/main/java/org/ssssssss/magicapi/logging/MagicLoggerContext.java
  66. 43 35
      magic-api/src/main/java/org/ssssssss/magicapi/model/ApiInfo.java
  67. 7 1
      magic-api/src/main/java/org/ssssssss/magicapi/model/Attributes.java
  68. 3 1
      magic-api/src/main/java/org/ssssssss/magicapi/model/Backup.java
  69. 11 2
      magic-api/src/main/java/org/ssssssss/magicapi/model/BaseDefinition.java
  70. 24 28
      magic-api/src/main/java/org/ssssssss/magicapi/model/Constants.java
  71. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/model/DataSourceInfo.java
  72. 49 0
      magic-api/src/main/java/org/ssssssss/magicapi/model/DataType.java
  73. 13 3
      magic-api/src/main/java/org/ssssssss/magicapi/model/FunctionInfo.java
  74. 23 0
      magic-api/src/main/java/org/ssssssss/magicapi/model/Group.java
  75. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/model/Header.java
  76. 2 0
      magic-api/src/main/java/org/ssssssss/magicapi/model/JsonBean.java
  77. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/model/JsonBodyBean.java
  78. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/model/JsonCode.java
  79. 23 0
      magic-api/src/main/java/org/ssssssss/magicapi/model/JsonCodeConstants.java
  80. 20 15
      magic-api/src/main/java/org/ssssssss/magicapi/model/MagicConsoleSession.java
  81. 6 0
      magic-api/src/main/java/org/ssssssss/magicapi/model/MagicEntity.java
  82. 6 1
      magic-api/src/main/java/org/ssssssss/magicapi/model/MagicNotify.java
  83. 24 0
      magic-api/src/main/java/org/ssssssss/magicapi/model/Options.java
  84. 2 0
      magic-api/src/main/java/org/ssssssss/magicapi/model/Page.java
  85. 2 0
      magic-api/src/main/java/org/ssssssss/magicapi/model/PageResult.java
  86. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/model/Parameter.java
  87. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/model/Path.java
  88. 12 15
      magic-api/src/main/java/org/ssssssss/magicapi/model/RequestEntity.java
  89. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/model/SelectedResource.java
  90. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/model/TreeNode.java
  91. 2 0
      magic-api/src/main/java/org/ssssssss/magicapi/modules/AssertModule.java
  92. 13 9
      magic-api/src/main/java/org/ssssssss/magicapi/modules/BoundSql.java
  93. 5 0
      magic-api/src/main/java/org/ssssssss/magicapi/modules/EnvModule.java
  94. 4 3
      magic-api/src/main/java/org/ssssssss/magicapi/modules/HttpModule.java
  95. 2 0
      magic-api/src/main/java/org/ssssssss/magicapi/modules/MongoCollectionExtension.java
  96. 2 0
      magic-api/src/main/java/org/ssssssss/magicapi/modules/MongoFindIterableExtension.java
  97. 2 2
      magic-api/src/main/java/org/ssssssss/magicapi/modules/MongoModule.java
  98. 2 0
      magic-api/src/main/java/org/ssssssss/magicapi/modules/RedisModule.java
  99. 2 0
      magic-api/src/main/java/org/ssssssss/magicapi/modules/RequestModule.java
  100. 4 1
      magic-api/src/main/java/org/ssssssss/magicapi/modules/ResponseModule.java

+ 2 - 2
magic-api/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/adapter/ColumnMapperAdapter.java

@@ -8,6 +8,11 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.function.Function;
 
+/**
+ * 列名转换适配器
+ *
+ * @author mxd
+ */
 public class ColumnMapperAdapter {
 
 	private final Map<String, RowMapper<Map<String, Object>>> columnMapRowMappers = new HashMap<>();

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/adapter/DialectAdapter.java

@@ -9,6 +9,11 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
 
+/**
+ * 方言适配器
+ *
+ * @author mxd
+ */
 public class DialectAdapter {
 
 	private static final Logger logger = LoggerFactory.getLogger(DialectAdapter.class);

+ 75 - 3
magic-api/src/main/java/org/ssssssss/magicapi/adapter/Resource.java

@@ -7,24 +7,35 @@ import java.util.List;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
+/**
+ * 资源对象接口
+ *
+ * @author mxd
+ */
 public interface Resource {
 
 	/**
-	 * 是否是只读
+	 * 判断是否是只读
+	 *
+	 * @return 返回资源是否是只读
 	 */
 	default boolean readonly() {
 		return false;
 	}
 
 	/**
-	 * 是否存在
+	 * 判断是否存在
+	 *
+	 * @return 返回资源是否存在
 	 */
 	default boolean exists() {
 		return false;
 	}
 
 	/**
-	 * 是否是目录
+	 * 判断是否是目录
+	 *
+	 * @return 返回资源是否是目录
 	 */
 	default boolean isDirectory() {
 		return false;
@@ -32,6 +43,8 @@ public interface Resource {
 
 	/**
 	 * 删除
+	 *
+	 * @return 返回是否删除成功
 	 */
 	default boolean delete() {
 		return false;
@@ -39,6 +52,8 @@ public interface Resource {
 
 	/**
 	 * 创建目录
+	 *
+	 * @return 返回是否创建成功
 	 */
 	default boolean mkdir() {
 		return false;
@@ -46,6 +61,9 @@ public interface Resource {
 
 	/**
 	 * 重命名
+	 *
+	 * @param resource 目标资源
+	 * @return 是否重命名成功
 	 */
 	default boolean renameTo(Resource resource) {
 		return false;
@@ -53,6 +71,9 @@ public interface Resource {
 
 	/**
 	 * 写入
+	 *
+	 * @param content 写入的内容
+	 * @return 是否写入成功
 	 */
 	default boolean write(String content) {
 		return false;
@@ -60,15 +81,33 @@ public interface Resource {
 
 	/**
 	 * 写入
+	 *
+	 * @param bytes 写入的内容
+	 * @return 是否写入成功
 	 */
 	default boolean write(byte[] bytes) {
 		return false;
 	}
 
+	/**
+	 * 获取分隔符
+	 *
+	 * @return 返回分隔符
+	 */
 	default String separator() {
 		return null;
 	}
 
+	/**
+	 * 处理导出
+	 *
+	 * @param zos       zip 输出流
+	 * @param path      路径
+	 * @param directory 目录资源对象
+	 * @param resources 资源集合
+	 * @param excludes  排除的目录
+	 * @throws IOException 处理过程中抛出的异常
+	 */
 	default void processExport(ZipOutputStream zos, String path, Resource directory, List<Resource> resources, List<String> excludes) throws IOException {
 		for (Resource resource : resources) {
 			String fullName = directory.getAbsolutePath();
@@ -94,6 +133,13 @@ public interface Resource {
 		}
 	}
 
+	/**
+	 * 处理导出
+	 *
+	 * @param os       输出流
+	 * @param excludes 排除的目录
+	 * @throws IOException 处理过程中抛出的异常
+	 */
 	default void export(OutputStream os, String... excludes) throws IOException {
 		ZipOutputStream zos = new ZipOutputStream(os);
 		processExport(zos, "", this, resources(), Arrays.asList(excludes == null ? new String[0] : excludes));
@@ -102,6 +148,8 @@ public interface Resource {
 
 	/**
 	 * 读取
+	 *
+	 * @return 读取的资源内容
 	 */
 	byte[] read();
 
@@ -113,6 +161,9 @@ public interface Resource {
 
 	/**
 	 * 获取子目录
+	 *
+	 * @param name 目录名称
+	 * @return 返回资源对象
 	 */
 	default Resource getDirectory(String name) {
 		return getResource(name);
@@ -120,39 +171,60 @@ public interface Resource {
 
 	/**
 	 * 获取子资源
+	 *
+	 * @param name 文件名称
+	 * @return 返回资源对象
 	 */
 	Resource getResource(String name);
 
 	/**
 	 * 获取资源名
+	 *
+	 * @return 返回资源名称
 	 */
 	String name();
 
 	/**
 	 * 获取子资源集合
+	 *
+	 * @return 返回资源集合
 	 */
 	List<Resource> resources();
 
 	/**
 	 * 父级资源
+	 *
+	 * @return 返回父级资源
 	 */
 	Resource parent();
 
 	/**
 	 * 目录
+	 *
+	 * @return 返回当前资源下的目录
 	 */
 	List<Resource> dirs();
 
 	/**
 	 * 遍历文件
+	 *
+	 * @param suffix 文件名后缀
+	 * @return 返回当前资源下的文件
 	 */
 	List<Resource> files(String suffix);
 
 	/**
 	 * 获取所在位置
+	 *
+	 * @return 获取绝对路径
 	 */
 	String getAbsolutePath();
 
+	/**
+	 * 获取文件路径
+	 *
+	 * @return 返回文件路径
+	 */
 	String getFilePath();
 
 }

+ 7 - 2
magic-api/src/main/java/org/ssssssss/magicapi/adapter/ResourceAdapter.java

@@ -14,7 +14,12 @@ import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 import java.util.stream.Collectors;
 
-public abstract class ResourceAdapter {
+/**
+ * 资源适配器
+ *
+ * @author mxd
+ */
+public class ResourceAdapter {
 
 	public static final String SPRING_BOOT_CLASS_PATH = "BOOT-INF/classes/";
 	private static PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
@@ -44,7 +49,7 @@ public abstract class ResourceAdapter {
 		URL url = resource.getURI().toURL();
 		if (url.getProtocol().equals(ResourceUtils.URL_PROTOCOL_JAR)) {
 			JarURLConnection connection = (JarURLConnection) url.openConnection();
-			boolean springBootClassPath = connection.getClass().getName().equals("org.springframework.boot.loader.jar.JarURLConnection");
+			boolean springBootClassPath = "org.springframework.boot.loader.jar.JarURLConnection".equals(connection.getClass().getName());
 			String entryName = (springBootClassPath ? SPRING_BOOT_CLASS_PATH : "") + connection.getEntryName();
 			JarFile jarFile = connection.getJarFile();
 			List<JarEntry> entries = jarFile.stream().filter(it -> it.getName().startsWith(entryName)).collect(Collectors.toList());

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/adapter/resource/DatabaseResource.java

@@ -19,6 +19,11 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+/**
+ * 数据库资源存储
+ *
+ * @author mxd
+ */
 public class DatabaseResource extends KeyValueResource {
 
 	private static final Logger logger = LoggerFactory.getLogger(DatabaseResource.class);

+ 8 - 3
magic-api/src/main/java/org/ssssssss/magicapi/adapter/resource/FileResource.java

@@ -12,6 +12,11 @@ import java.util.stream.Collectors;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
+/**
+ * 文件存储实现
+ *
+ * @author mxd
+ */
 public class FileResource implements Resource {
 
 	private final boolean readonly;
@@ -138,13 +143,13 @@ public class FileResource implements Resource {
 	@Override
 	public String getFilePath() {
 		Resource parent = parent();
-		while (parent.parent() != null){
+		while (parent.parent() != null) {
 			parent = parent.parent();
 		}
 		String path = this.getAbsolutePath()
 				.replace(parent.getAbsolutePath(), "")
-				.replace("\\","/");
-		if(isDirectory() && !path.endsWith("/")){
+				.replace("\\", "/");
+		if (isDirectory() && !path.endsWith("/")) {
 			path += "/";
 		}
 		return path.startsWith("/") ? path.substring(1) : path;

+ 8 - 5
magic-api/src/main/java/org/ssssssss/magicapi/adapter/resource/JarResource.java

@@ -13,6 +13,11 @@ import java.util.jar.JarFile;
 import java.util.stream.Collectors;
 import java.util.zip.ZipEntry;
 
+/**
+ * Jar存储实现
+ *
+ * @author mxd
+ */
 public class JarResource implements Resource {
 
 	private final JarFile jarFile;
@@ -24,11 +29,9 @@ public class JarResource implements Resource {
 	private final String entryName;
 
 	private final boolean inSpringBoot;
-
+	private final String rootName;
 	private JarResource parent = null;
 
-	private String rootName;
-
 	public JarResource(JarFile jarFile, String entryName, List<JarEntry> entries, boolean inSpringBoot) {
 		this.jarFile = jarFile;
 		this.entryName = entryName;
@@ -122,7 +125,7 @@ public class JarResource implements Resource {
 				.filter(it -> it.getName().startsWith(prefix))
 				.map(entry -> new JarResource(jarFile, entry.getName(), entries.stream()
 						.filter(item -> item.getName().startsWith(PathUtils.replaceSlash(entry.getName() + "/")))
-						.collect(Collectors.toList()), this,this.inSpringBoot)
+						.collect(Collectors.toList()), this, this.inSpringBoot)
 				)
 				.collect(Collectors.toList());
 	}
@@ -140,7 +143,7 @@ public class JarResource implements Resource {
 	@Override
 	public String getFilePath() {
 		JarResource root = this;
-		while(root.parent != null){
+		while (root.parent != null) {
 			root = root.parent;
 		}
 		String path = this.entryName.substring(root.rootName.length());

+ 20 - 2
magic-api/src/main/java/org/ssssssss/magicapi/adapter/resource/KeyValueResource.java

@@ -7,6 +7,11 @@ import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+/**
+ * Key-Value形式的存储
+ *
+ * @author mxd
+ */
 public abstract class KeyValueResource implements Resource {
 
 	protected String separator;
@@ -86,6 +91,9 @@ public abstract class KeyValueResource implements Resource {
 
 	/**
 	 * 需要做修改的key,原key: 新key
+	 *
+	 * @param renameKeys 需重命名的key
+	 * @return 是否修改成功
 	 */
 	protected abstract boolean renameTo(Map<String, String> renameKeys);
 
@@ -133,8 +141,18 @@ public abstract class KeyValueResource implements Resource {
 		return keys().stream().map(mappedFunction()).collect(Collectors.toList());
 	}
 
+	/**
+	 * mapped函数,用于根据路径创建资源对象
+	 *
+	 * @return mapped函数
+	 */
 	protected abstract Function<String, Resource> mappedFunction();
 
+	/**
+	 * 该资源下的keys
+	 *
+	 * @return 返回该资源下的keys
+	 */
 	protected abstract Set<String> keys();
 
 	@Override
@@ -155,12 +173,12 @@ public abstract class KeyValueResource implements Resource {
 	@Override
 	public String getFilePath() {
 		Resource parent = parent();
-		while (parent.parent() != null){
+		while (parent.parent() != null) {
 			parent = parent.parent();
 		}
 		String path = this.getAbsolutePath()
 				.replace(parent.getAbsolutePath(), "")
-				.replace("\\","/")
+				.replace("\\", "/")
 				.replace(this.separator, "/");
 		return path.startsWith("/") ? path.substring(1) : path;
 	}

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/adapter/resource/RedisResource.java

@@ -14,6 +14,11 @@ import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
 
+/**
+ * Redis 资源存储实现
+ *
+ * @author mxd
+ */
 public class RedisResource extends KeyValueResource {
 
 	private static final Logger logger = LoggerFactory.getLogger(RedisResource.class);

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/adapter/resource/ZipResource.java

@@ -13,6 +13,11 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+/**
+ * Zip 存储实现
+ *
+ * @author mxd
+ */
 public class ZipResource implements Resource {
 
 	private final Map<String, byte[]> cachedContent;

+ 6 - 2
magic-api/src/main/java/org/ssssssss/magicapi/cache/DefaultSqlCache.java

@@ -5,6 +5,11 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
+/**
+ * 默认SQL缓存实现
+ *
+ * @author mxd
+ */
 public class DefaultSqlCache extends LinkedHashMap<String, DefaultSqlCache.ExpireNode<Object>> implements SqlCache {
 
 	private final String separator = ":";
@@ -31,8 +36,7 @@ public class DefaultSqlCache extends LinkedHashMap<String, DefaultSqlCache.Expir
 
 	@Override
 	public void put(String name, String key, Object value, long ttl) {
-		long expireTime = ttl > 0 ? (System.currentTimeMillis() + ttl) :
-				(this.expire > -1 ? System.currentTimeMillis() + this.expire : Long.MAX_VALUE);
+		long expireTime = ttl > 0 ? (System.currentTimeMillis() + ttl) : (this.expire > -1 ? System.currentTimeMillis() + this.expire : Long.MAX_VALUE);
 		lock.writeLock().lock();
 		try {
 			// 封装成过期时间节点

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/cache/SqlCache.java

@@ -6,6 +6,8 @@ import java.util.Arrays;
 
 /**
  * SQL缓存接口
+ *
+ * @author mxd
  */
 public interface SqlCache {
 

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/config/MagicConfiguration.java

@@ -10,6 +10,11 @@ import org.ssssssss.magicapi.provider.*;
 import java.util.ArrayList;
 import java.util.List;
 
+/**
+ * 配置信息
+ *
+ * @author mxd
+ */
 public class MagicConfiguration {
 
 	/**

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/config/MagicCorsFilter.java

@@ -9,6 +9,11 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 
+/**
+ * 接口跨域处理
+ *
+ * @author mxd
+ */
 public class MagicCorsFilter implements Filter {
 
 	@Override

+ 6 - 1
magic-api/src/main/java/org/ssssssss/magicapi/config/MagicDynamicDataSource.java

@@ -16,6 +16,11 @@ import javax.sql.DataSource;
 import java.sql.Connection;
 import java.util.*;
 
+/**
+ * 动态数据源对象
+ *
+ * @author mxd
+ */
 public class MagicDynamicDataSource {
 
 	private static final Logger logger = LoggerFactory.getLogger(MagicDynamicDataSource.class);
@@ -83,7 +88,7 @@ public class MagicDynamicDataSource {
 		return new ArrayList<>(this.dataSourceMap.keySet());
 	}
 
-	public boolean isEmpty(){
+	public boolean isEmpty() {
 		return this.dataSourceMap.isEmpty();
 	}
 

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/config/MagicFunction.java

@@ -2,6 +2,8 @@ package org.ssssssss.magicapi.config;
 
 /**
  * 函数,主要用于脚本中直接可使用的函数,如 now();
+ *
+ * @author mxd
  */
 public interface MagicFunction {
 }

+ 25 - 20
magic-api/src/main/java/org/ssssssss/magicapi/config/MagicFunctionManager.java

@@ -23,10 +23,15 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+/**
+ * 函数映射管理
+ *
+ * @author mxd
+ */
 public class MagicFunctionManager {
 
 	private static final Logger logger = LoggerFactory.getLogger(MagicFunctionManager.class);
-	private static final Map<String, FunctionInfo> mappings = new ConcurrentHashMap<>();
+	private static final Map<String, FunctionInfo> MAPPINGS = new ConcurrentHashMap<>();
 	private final GroupServiceProvider groupServiceProvider;
 	private final FunctionServiceProvider functionServiceProvider;
 	private TreeNode<Group> groups;
@@ -38,7 +43,7 @@ public class MagicFunctionManager {
 
 	public void registerFunctionLoader() {
 		MagicResourceLoader.addFunctionLoader((path) -> {
-			FunctionInfo info = mappings.get(path);
+			FunctionInfo info = MAPPINGS.get(path);
 			String scriptName = groupServiceProvider.getScriptName(info.getId(), info.getName(), info.getPath());
 			if (info != null) {
 				List<Parameter> parameters = info.getParameters();
@@ -53,8 +58,8 @@ public class MagicFunctionManager {
 								functionContext.set(parameters.get(i).getName(), objects[i]);
 							}
 						}
-						Object value =  ScriptManager.executeScript(info.getScript(), functionContext);
-						if(value instanceof ExitValue){
+						Object value = ScriptManager.executeScript(info.getScript(), functionContext);
+						if (value instanceof ExitValue) {
 							throw new MagicExitException((ExitValue) value);
 						}
 						return value;
@@ -83,24 +88,24 @@ public class MagicFunctionManager {
 
 	public boolean hasRegister(FunctionInfo info) {
 		String path = PathUtils.replaceSlash(Objects.toString(groupServiceProvider.getFullPath(info.getGroupId()), "") + "/" + info.getPath());
-		FunctionInfo functionInfo = mappings.get(path);
+		FunctionInfo functionInfo = MAPPINGS.get(path);
 		return functionInfo != null && !Objects.equals(info.getId(), functionInfo.getId());
 	}
 
 	public boolean hasRegister(Set<String> paths) {
-		return paths.stream().anyMatch(mappings::containsKey);
+		return paths.stream().anyMatch(MAPPINGS::containsKey);
 	}
 
 	/**
 	 * 函数移动
 	 */
 	public boolean move(String id, String groupId) {
-		FunctionInfo info = mappings.get(id);
+		FunctionInfo info = MAPPINGS.get(id);
 		if (info == null) {
 			return false;
 		}
 		String path = Objects.toString(groupServiceProvider.getFullPath(groupId), "");
-		FunctionInfo functionInfo = mappings.get(PathUtils.replaceSlash(path + "/" + info.getPath()));
+		FunctionInfo functionInfo = MAPPINGS.get(PathUtils.replaceSlash(path + "/" + info.getPath()));
 		if (functionInfo != null && !Objects.equals(functionInfo.getId(), id)) {
 			return false;
 		}
@@ -115,7 +120,7 @@ public class MagicFunctionManager {
 		if (functionInfo == null) {
 			return;
 		}
-		FunctionInfo oldFunctionInfo = mappings.get(functionInfo.getId());
+		FunctionInfo oldFunctionInfo = MAPPINGS.get(functionInfo.getId());
 		if (oldFunctionInfo != null) {
 			// 完全一致时不用注册
 			if (functionInfo.equals(oldFunctionInfo)) {
@@ -127,30 +132,30 @@ public class MagicFunctionManager {
 			}
 		}
 		String path = Objects.toString(groupServiceProvider.getFullPath(functionInfo.getGroupId()), "");
-		mappings.put(functionInfo.getId(), functionInfo);
+		MAPPINGS.put(functionInfo.getId(), functionInfo);
 		path = PathUtils.replaceSlash(path + "/" + functionInfo.getPath());
 		functionInfo.setMappingPath(path);
-		mappings.put(path, functionInfo);
+		MAPPINGS.put(path, functionInfo);
 		logger.info("注册函数:[{}:{}]", functionInfo.getName(), path);
 	}
 
 	public List<FunctionInfo> getFunctionInfos() {
-		return mappings.values().stream().distinct().collect(Collectors.toList());
+		return MAPPINGS.values().stream().distinct().collect(Collectors.toList());
 	}
 
 	public FunctionInfo getFunctionInfo(String path) {
-		return mappings.get(path);
+		return MAPPINGS.get(path);
 	}
 
 	private boolean hasConflict(TreeNode<Group> group, String newPath) {
 		// 获取要移动的接口
-		List<FunctionInfo> infos = mappings.values().stream()
+		List<FunctionInfo> infos = MAPPINGS.values().stream()
 				.filter(info -> Objects.equals(info.getGroupId(), group.getNode().getId()))
 				.distinct()
 				.collect(Collectors.toList());
 		// 判断是否有冲突
 		for (FunctionInfo info : infos) {
-			if (mappings.containsKey(PathUtils.replaceSlash(newPath + "/" + info.getPath()))) {
+			if (MAPPINGS.containsKey(PathUtils.replaceSlash(newPath + "/" + info.getPath()))) {
 				return true;
 			}
 		}
@@ -162,7 +167,7 @@ public class MagicFunctionManager {
 		return false;
 	}
 
-	public TreeNode<Group> findGroupTree(String groupId){
+	public TreeNode<Group> findGroupTree(String groupId) {
 		return groups.findTreeNode(it -> it.getId().equals(groupId));
 	}
 
@@ -180,7 +185,7 @@ public class MagicFunctionManager {
 	}
 
 	private void recurseUpdateGroup(TreeNode<Group> node, boolean updateGroupId) {
-		mappings.values().stream()
+		MAPPINGS.values().stream()
 				.filter(info -> Objects.equals(info.getGroupId(), node.getNode().getId()))
 				.distinct()
 				.collect(Collectors.toList())
@@ -204,7 +209,7 @@ public class MagicFunctionManager {
 	}
 
 	public void deleteGroup(List<String> groupIds) {
-		mappings.values().stream()
+		MAPPINGS.values().stream()
 				.filter(info -> groupIds.contains(info.getGroupId()))
 				.distinct()
 				.collect(Collectors.toList())
@@ -214,9 +219,9 @@ public class MagicFunctionManager {
 	}
 
 	public void unregister(String id) {
-		FunctionInfo functionInfo = mappings.remove(id);
+		FunctionInfo functionInfo = MAPPINGS.remove(id);
 		if (functionInfo != null) {
-			mappings.remove(functionInfo.getMappingPath());
+			MAPPINGS.remove(functionInfo.getMappingPath());
 			logger.info("取消注册函数:[{},{}]", functionInfo.getName(), functionInfo.getMappingPath());
 		}
 	}

+ 5 - 1
magic-api/src/main/java/org/ssssssss/magicapi/config/MagicModule.java

@@ -3,12 +3,16 @@ package org.ssssssss.magicapi.config;
 import org.ssssssss.script.annotation.UnableCall;
 
 /**
- * 模块,主要用于import指令,import时根据模块名获取当前类如:import assert;
+ * 模块,主要用于import指令,import时根据模块名获取当前类如:<code>import assert</code>;
+ *
+ * @author mxd
  */
 public interface MagicModule {
 
 	/**
 	 * 获取模块名
+	 *
+	 * @return 返回模块名称
 	 */
 	@UnableCall
 	String getModuleName();

+ 5 - 1
magic-api/src/main/java/org/ssssssss/magicapi/config/MagicWebRequestInterceptor.java

@@ -12,6 +12,8 @@ import javax.servlet.http.HttpServletResponse;
 
 /**
  * /magic/web相关接口的拦截器
+ *
+ * @author mxd
  */
 public class MagicWebRequestInterceptor implements HandlerInterceptor {
 
@@ -35,7 +37,9 @@ public class MagicWebRequestInterceptor implements HandlerInterceptor {
 					magicCorsFilter.process(request, response);
 				}
 				Valid valid = handlerMethod.getMethodAnnotation(Valid.class);
-				if (authorizationInterceptor.requireLogin() && (valid == null || valid.requireLogin())) {
+				boolean requiredLogin = authorizationInterceptor.requireLogin();
+				boolean validRequiredLogin = (valid == null || valid.requireLogin());
+				if (requiredLogin && validRequiredLogin) {
 					request.setAttribute(Constants.ATTRIBUTE_MAGIC_USER, authorizationInterceptor.getUserByToken(request.getHeader(Constants.MAGIC_TOKEN_HEADER)));
 				}
 				((MagicController) handler).doValid(request, valid);

+ 28 - 22
magic-api/src/main/java/org/ssssssss/magicapi/config/MappingHandlerMapping.java

@@ -14,6 +14,7 @@ import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
 import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
 import org.ssssssss.magicapi.controller.RequestHandler;
 import org.ssssssss.magicapi.model.ApiInfo;
+import org.ssssssss.magicapi.model.Constants;
 import org.ssssssss.magicapi.model.Group;
 import org.ssssssss.magicapi.model.TreeNode;
 import org.ssssssss.magicapi.provider.ApiServiceProvider;
@@ -31,13 +32,15 @@ import java.util.stream.Stream;
 
 /**
  * 请求映射
+ *
+ * @author mxd
  */
 public class MappingHandlerMapping {
 
 	/**
 	 * 已缓存的映射信息
 	 */
-	private static final Map<String, MappingNode> mappings = new ConcurrentHashMap<>();
+	private static final Map<String, MappingNode> MAPPINGS = new ConcurrentHashMap<>();
 
 	private static final Logger logger = LoggerFactory.getLogger(MappingHandlerMapping.class);
 	/**
@@ -95,7 +98,7 @@ public class MappingHandlerMapping {
 	 * 根据绑定的key获取接口信息
 	 */
 	private static ApiInfo getMappingApiInfo(String key) {
-		return mappings.get(key).getInfo();
+		return MAPPINGS.get(key).getInfo();
 	}
 
 	/**
@@ -119,14 +122,14 @@ public class MappingHandlerMapping {
 	public static List<Group> findGroups(String groupId) {
 		List<Group> groups = new ArrayList<>();
 		Group group;
-		while (!"0".equals(groupId) && (group = MappingHandlerMapping.findGroup(groupId)) != null) {
+		while (!Constants.ROOT_ID.equals(groupId) && (group = MappingHandlerMapping.findGroup(groupId)) != null) {
 			groups.add(group);
 			groupId = group.getParentId();
 		}
 		return groups;
 	}
 
-	public TreeNode<Group> findGroupTree(String groupId){
+	public TreeNode<Group> findGroupTree(String groupId) {
 		return groups.findTreeNode(it -> it.getId().equals(groupId));
 	}
 
@@ -197,7 +200,7 @@ public class MappingHandlerMapping {
 	 * @param requestMapping 请求路径
 	 */
 	public ApiInfo getApiInfo(String method, String requestMapping) {
-		MappingNode mappingNode = mappings.get(buildMappingKey(method, concatPath("", requestMapping)));
+		MappingNode mappingNode = MAPPINGS.get(buildMappingKey(method, concatPath("", requestMapping)));
 		return mappingNode == null ? null : mappingNode.getInfo();
 	}
 
@@ -208,7 +211,7 @@ public class MappingHandlerMapping {
 		for (ApiInfo info : infos) {
 			String path = concatPath(newPath, "/" + info.getPath());
 			String mappingKey = buildMappingKey(info.getMethod(), path);
-			MappingNode mappingNode = mappings.get(mappingKey);
+			MappingNode mappingNode = MAPPINGS.get(mappingKey);
 			if (mappingNode != null) {
 				if (mappingNode.getInfo().equals(info)) {
 					continue;
@@ -242,7 +245,8 @@ public class MappingHandlerMapping {
 			return nameEquals || !groupServiceProvider.exists(group);
 		}
 		// 检测名字是否冲突
-		if ((!parentIdEquals || !nameEquals) && groupServiceProvider.exists(group)) {
+		boolean requiredChecked = (!parentIdEquals || !nameEquals);
+		if (requiredChecked && groupServiceProvider.exists(group)) {
 			return false;
 		}
 		// 新的接口分组路径
@@ -252,7 +256,7 @@ public class MappingHandlerMapping {
 	}
 
 	public boolean hasRegister(Set<String> paths) {
-		return paths.stream().anyMatch(mappings::containsKey);
+		return paths.stream().anyMatch(MAPPINGS::containsKey);
 	}
 
 	/**
@@ -298,7 +302,7 @@ public class MappingHandlerMapping {
 	 */
 	public boolean hasRegisterMapping(ApiInfo info) {
 		if (info.getId() != null) {
-			MappingNode mappingNode = mappings.get(info.getId());
+			MappingNode mappingNode = MAPPINGS.get(info.getId());
 			ApiInfo oldInfo = mappingNode == null ? null : mappingNode.getInfo();
 			if (oldInfo != null
 					&& Objects.equals(oldInfo.getGroupId(), info.getGroupId())
@@ -308,8 +312,8 @@ public class MappingHandlerMapping {
 			}
 		}
 		String mappingKey = getMappingKey(info);
-		if (mappings.containsKey(mappingKey)) {
-			return !mappings.get(mappingKey).getInfo().getId().equals(info.getId());
+		if (MAPPINGS.containsKey(mappingKey)) {
+			return !MAPPINGS.get(mappingKey).getInfo().getId().equals(info.getId());
 		}
 		if (!allowOverride) {
 			Map<RequestMappingInfo, HandlerMethod> handlerMethods = this.mappingHelper.getHandlerMethods();
@@ -322,7 +326,7 @@ public class MappingHandlerMapping {
 	 * 接口移动
 	 */
 	public boolean move(String id, String groupId) {
-		MappingNode mappingNode = mappings.get(id);
+		MappingNode mappingNode = MAPPINGS.get(id);
 		if (mappingNode == null) {
 			return false;
 		}
@@ -340,11 +344,11 @@ public class MappingHandlerMapping {
 	 * 注册请求映射
 	 */
 	public void registerMapping(ApiInfo info, boolean delete) {
-		if(info == null){
+		if (info == null) {
 			return;
 		}
 		// 先判断是否已注册,如果已注册,则先取消注册在进行注册。
-		MappingNode mappingNode = mappings.get(info.getId());
+		MappingNode mappingNode = MAPPINGS.get(info.getId());
 		String newMappingKey = getMappingKey(info);
 		if (mappingNode != null) {
 			ApiInfo oldInfo = mappingNode.getInfo();
@@ -353,7 +357,7 @@ public class MappingHandlerMapping {
 			if (Objects.equals(oldMappingKey, newMappingKey)) {
 				if (!info.equals(oldInfo)) {
 					mappingNode.setInfo(info);
-					mappings.get(newMappingKey).setInfo(info);
+					MAPPINGS.get(newMappingKey).setInfo(info);
 					if (delete) {
 						refreshCache(info);
 					}
@@ -364,7 +368,7 @@ public class MappingHandlerMapping {
 			// URL不一致时,需要取消注册旧接口,重新注册新接口
 			logger.info("取消注册接口:{},{}", oldInfo.getName(), oldMappingKey);
 			// 取消注册
-			mappings.remove(oldMappingKey);
+			MAPPINGS.remove(oldMappingKey);
 			mappingHelper.unregister(getRequestMapping(oldInfo));
 		}
 		mappingNode = new MappingNode(info);
@@ -379,10 +383,11 @@ public class MappingHandlerMapping {
 			return;
 		}
 		logger.info("注册接口:{},{}", info.getName(), newMappingKey);
-		mappings.put(info.getId(), mappingNode);
-		mappings.put(newMappingKey, mappingNode);
+		MAPPINGS.put(info.getId(), mappingNode);
+		MAPPINGS.put(newMappingKey, mappingNode);
 		registerMapping(requestMapping, handler, method);
-		if (delete) {   // 刷新缓存
+		if (delete) {
+			// 刷新缓存
 			refreshCache(info);
 		}
 	}
@@ -400,13 +405,14 @@ public class MappingHandlerMapping {
 	 * 取消注册请求映射
 	 */
 	public void unregisterMapping(String id, boolean delete) {
-		MappingNode mappingNode = mappings.remove(id);
+		MappingNode mappingNode = MAPPINGS.remove(id);
 		if (mappingNode != null) {
 			ApiInfo info = mappingNode.getInfo();
 			logger.info("取消注册接口:{}", info.getName());
-			mappings.remove(mappingNode.getMappingKey());
+			MAPPINGS.remove(mappingNode.getMappingKey());
 			mappingHelper.unregister(mappingNode.getRequestMappingInfo());
-			if (delete) {   //刷新缓存
+			if (delete) {
+				// 刷新缓存
 				apiInfos.removeIf(i -> i.getId().equalsIgnoreCase(info.getId()));
 			}
 		}

+ 6 - 1
magic-api/src/main/java/org/ssssssss/magicapi/config/Message.java

@@ -2,13 +2,18 @@ package org.ssssssss.magicapi.config;
 
 import java.lang.annotation.*;
 
+/**
+ * WebSocket 消息
+ *
+ * @author mxd
+ */
 @Target({ElementType.METHOD})
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 public @interface Message {
 
 	/**
-	 * 消息类型
+	 * @return 消息类型
 	 */
 	MessageType value();
 }

+ 4 - 2
magic-api/src/main/java/org/ssssssss/magicapi/config/MessageType.java

@@ -1,8 +1,10 @@
 package org.ssssssss.magicapi.config;
 
 /**
- * 消息类型
- * */
+ * WebSocket 消息类型
+ *
+ * @author mxd
+ */
 public enum MessageType {
 	/* S -> C message */
 	/* 日志消息 */

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/config/Valid.java

@@ -4,6 +4,11 @@ import org.ssssssss.magicapi.interceptor.Authorization;
 
 import java.lang.annotation.*;
 
+/**
+ * 接口验证信息
+ *
+ * @author mxd
+ */
 @Target({ElementType.METHOD})
 @Retention(RetentionPolicy.RUNTIME)
 @Documented

+ 6 - 1
magic-api/src/main/java/org/ssssssss/magicapi/config/WebSocketSessionManager.java

@@ -15,6 +15,11 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
 
+/**
+ * WebSocket Session 管理
+ *
+ * @author mxd
+ */
 public class WebSocketSessionManager {
 
 	private static final Logger logger = LoggerFactory.getLogger(WebSocketSessionManager.class);
@@ -59,7 +64,7 @@ public class WebSocketSessionManager {
 		}
 	}
 
-	private static void sendToOther(String sessionId, String content){
+	private static void sendToOther(String sessionId, String content) {
 		if (magicNotifyService != null) {
 			// 通知其他机器去发送消息
 			magicNotifyService.sendNotify(new MagicNotify(instanceId, Constants.NOTIFY_WS_S_C, sessionId, content));

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/context/CookieContext.java

@@ -6,6 +6,8 @@ import java.util.HashMap;
 
 /**
  * Cookie Context 用于脚本中获取cookie信息
+ *
+ * @author mxd
  */
 public class CookieContext extends HashMap<String, String> {
 

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/context/RequestContext.java

@@ -4,6 +4,11 @@ import org.ssssssss.magicapi.model.RequestEntity;
 
 import javax.servlet.http.HttpServletRequest;
 
+/**
+ * 请求上下文
+ *
+ * @author mxd
+ */
 public class RequestContext {
 
 	private static final ThreadLocal<RequestEntity> REQUEST_ENTITY_THREAD_LOCAL = new InheritableThreadLocal<>();

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/context/SessionContext.java

@@ -5,6 +5,8 @@ import java.util.HashMap;
 
 /**
  * Session Context 用于脚本中获取Session信息
+ *
+ * @author mxd
  */
 public class SessionContext extends HashMap<String, Object> {
 

+ 6 - 3
magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicController.java

@@ -14,13 +14,16 @@ import org.ssssssss.magicapi.provider.MagicBackupService;
 
 import javax.servlet.http.HttpServletRequest;
 
+/**
+ * Controller 基类
+ *
+ * @author mxd
+ */
 public class MagicController implements JsonCodeConstants {
 
-	MagicConfiguration configuration;
-
 	final MagicAPIService magicAPIService;
-
 	final MagicBackupService magicBackupService;
+	MagicConfiguration configuration;
 
 	MagicController(MagicConfiguration configuration) {
 		this.configuration = configuration;

+ 6 - 2
magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicDataSourceController.java

@@ -8,12 +8,16 @@ import org.ssssssss.magicapi.config.Valid;
 import org.ssssssss.magicapi.interceptor.Authorization;
 import org.ssssssss.magicapi.model.DataSourceInfo;
 import org.ssssssss.magicapi.model.JsonBean;
-import org.ssssssss.magicapi.provider.MagicAPIService;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 import java.util.stream.Collectors;
 
+/**
+ * 数据源相关操作
+ *
+ * @author mxd
+ */
 public class MagicDataSourceController extends MagicController implements MagicExceptionHandler {
 
 	public MagicDataSourceController(MagicConfiguration configuration) {
@@ -74,7 +78,7 @@ public class MagicDataSourceController extends MagicController implements MagicE
 		return new JsonBean<>(dataSource);
 	}
 
-	private DataSourceInfo getDataSourceInfo(String id){
+	private DataSourceInfo getDataSourceInfo(String id) {
 		DataSourceInfo dataSource = magicAPIService.getDataSource(id);
 		notNull(dataSource, DATASOURCE_NOT_FOUND);
 		return dataSource;

+ 6 - 1
magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicDebugHandler.java

@@ -10,6 +10,11 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 
+/**
+ * WebSocket Debug 处理器
+ *
+ * @author mxd
+ */
 public class MagicDebugHandler {
 
 	/**
@@ -44,7 +49,7 @@ public class MagicDebugHandler {
 		MagicScriptDebugContext context = session.getMagicScriptDebugContext();
 		if (context != null) {
 			context.setStepInto("1".equals(stepInto));
-			if(StringUtils.isNotBlank(breakpoints)){
+			if (StringUtils.isNotBlank(breakpoints)) {
 				context.setBreakpoints(Stream.of(breakpoints.split("\\|")).map(Integer::valueOf).collect(Collectors.toList()));
 			}
 			try {

+ 17 - 0
magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicExceptionHandler.java

@@ -7,10 +7,21 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.ssssssss.magicapi.exception.InvalidArgumentException;
 import org.ssssssss.magicapi.model.JsonBean;
 
+/**
+ * magic-api接口异常处理器
+ *
+ * @author mxd
+ */
 public interface MagicExceptionHandler {
 
 	Logger logger = LoggerFactory.getLogger(MagicExceptionHandler.class);
 
+	/**
+	 * magic-api中的接口异常处理
+	 *
+	 * @param e 异常对象
+	 * @return 返回json对象
+	 */
 	@ExceptionHandler(Exception.class)
 	@ResponseBody
 	default Object exceptionHandler(Exception e) {
@@ -18,6 +29,12 @@ public interface MagicExceptionHandler {
 		return new JsonBean<>(-1, e.getMessage());
 	}
 
+	/**
+	 * magic-api中的接口异常处理
+	 *
+	 * @param e 异常对象
+	 * @return 返回json对象
+	 */
 	@ExceptionHandler(InvalidArgumentException.class)
 	@ResponseBody
 	default Object exceptionHandler(InvalidArgumentException e) {

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicFunctionController.java

@@ -17,6 +17,11 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Collectors;
 
+/**
+ * 函数相关操作
+ *
+ * @author mxd
+ */
 public class MagicFunctionController extends MagicController implements MagicExceptionHandler {
 
 

+ 7 - 2
magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicGroupController.java

@@ -6,14 +6,19 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.ssssssss.magicapi.config.MagicConfiguration;
 import org.ssssssss.magicapi.config.Valid;
 import org.ssssssss.magicapi.interceptor.Authorization;
+import org.ssssssss.magicapi.model.Constants;
 import org.ssssssss.magicapi.model.Group;
 import org.ssssssss.magicapi.model.JsonBean;
-import org.ssssssss.magicapi.provider.MagicAPIService;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 import java.util.stream.Collectors;
 
+/**
+ * 分组相关操作
+ *
+ * @author mxd
+ */
 public class MagicGroupController extends MagicController implements MagicExceptionHandler {
 
 	public MagicGroupController(MagicConfiguration configuration) {
@@ -80,7 +85,7 @@ public class MagicGroupController extends MagicController implements MagicExcept
 	public JsonBean<String> copyGroup(HttpServletRequest request, String src, String target) {
 		Group group = magicAPIService.getGroup(src);
 		notNull(group, GROUP_NOT_FOUND);
-		if(!"0".equals(target)){
+		if (!Constants.ROOT_ID.equals(target)) {
 			Group targetGroup = magicAPIService.getGroup(target);
 			notNull(targetGroup, GROUP_NOT_FOUND);
 			isTrue(allowVisit(request, Authorization.SAVE, targetGroup), PERMISSION_INVALID);

+ 25 - 21
magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicWebSocketDispatcher.java

@@ -23,11 +23,16 @@ import java.util.stream.Stream;
 
 import static org.ssssssss.magicapi.model.Constants.EMPTY_OBJECT_ARRAY;
 
+/**
+ * WebSocket 分发器
+ *
+ * @author mxd
+ */
 public class MagicWebSocketDispatcher extends TextWebSocketHandler {
 
 	private static final Logger logger = LoggerFactory.getLogger(MagicWebSocketDispatcher.class);
 
-	private static final Map<String, Invoker> handlers = new HashMap<>();
+	private static final Map<String, Invoker> HANDLERS = new HashMap<>();
 
 	private final String instanceId;
 
@@ -40,32 +45,15 @@ public class MagicWebSocketDispatcher extends TextWebSocketHandler {
 		WebSocketSessionManager.setInstanceId(instanceId);
 		websocketMessageHandlers.forEach(websocketMessageHandler ->
 				Stream.of(websocketMessageHandler.getClass().getDeclaredMethods())
-						.forEach(method -> handlers.put(method.getAnnotation(Message.class).value().name().toLowerCase(), Invoker.from(new MethodInvoker(method, websocketMessageHandler))))
+						.forEach(method -> HANDLERS.put(method.getAnnotation(Message.class).value().name().toLowerCase(), Invoker.from(new MethodInvoker(method, websocketMessageHandler))))
 		);
 	}
 
-	@Override
-	public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
-		WebSocketSessionManager.remove(MagicConsoleSession.from(session));
-		MagicConsoleSession.remove(session);
-	}
-
-	@Override
-	protected void handleTextMessage(WebSocketSession session, TextMessage message) {
-		MagicConsoleSession consoleSession = MagicConsoleSession.from(session);
-		Object returnValue = findHandleAndInvoke(consoleSession, message.getPayload());
-		// 如果未成功处理消息,则通知其他机器去处理消息
-		if (Boolean.FALSE.equals(returnValue)) {
-			magicNotifyService.sendNotify(new MagicNotify(instanceId, Constants.NOTIFY_WS_C_S, consoleSession.getId(), message.getPayload()));
-		}
-	}
-
-
 	private static Object findHandleAndInvoke(MagicConsoleSession session, String payload) {
 		// messageType[, data][,data]
 		int index = payload.indexOf(",");
 		String msgType = index == -1 ? payload : payload.substring(0, index);
-		Invoker invoker = handlers.get(msgType);
+		Invoker invoker = HANDLERS.get(msgType);
 		if (invoker != null) {
 			Object returnValue;
 			try {
@@ -90,7 +78,7 @@ public class MagicWebSocketDispatcher extends TextWebSocketHandler {
 							pValues[i] = JsonUtils.readValue(payload, pType);
 						}
 					}
-					returnValue =  invoker.invoke(null, null, pValues);
+					returnValue = invoker.invoke(null, null, pValues);
 				}
 				return returnValue;
 			} catch (Throwable e) {
@@ -106,4 +94,20 @@ public class MagicWebSocketDispatcher extends TextWebSocketHandler {
 			findHandleAndInvoke(session, payload);
 		}
 	}
+
+	@Override
+	public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
+		WebSocketSessionManager.remove(MagicConsoleSession.from(session));
+		MagicConsoleSession.remove(session);
+	}
+
+	@Override
+	protected void handleTextMessage(WebSocketSession session, TextMessage message) {
+		MagicConsoleSession consoleSession = MagicConsoleSession.from(session);
+		Object returnValue = findHandleAndInvoke(consoleSession, message.getPayload());
+		// 如果未成功处理消息,则通知其他机器去处理消息
+		if (Boolean.FALSE.equals(returnValue)) {
+			magicNotifyService.sendNotify(new MagicNotify(instanceId, Constants.NOTIFY_WS_C_S, consoleSession.getId(), message.getPayload()));
+		}
+	}
 }

+ 7 - 2
magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicWorkbenchHandler.java

@@ -7,6 +7,11 @@ import org.ssssssss.magicapi.exception.MagicLoginException;
 import org.ssssssss.magicapi.interceptor.AuthorizationInterceptor;
 import org.ssssssss.magicapi.model.MagicConsoleSession;
 
+/**
+ * UI上其它操作处理
+ *
+ * @author mxd
+ */
 public class MagicWorkbenchHandler {
 
 	private final AuthorizationInterceptor authorizationInterceptor;
@@ -16,9 +21,9 @@ public class MagicWorkbenchHandler {
 	}
 
 	@Message(MessageType.LOGIN)
-	public void onLogin(MagicConsoleSession session, String token){
+	public void onLogin(MagicConsoleSession session, String token) {
 		try {
-			if(!authorizationInterceptor.requireLogin() || authorizationInterceptor.getUserByToken(token) != null){
+			if (!authorizationInterceptor.requireLogin() || authorizationInterceptor.getUserByToken(token) != null) {
 				WebSocketSessionManager.add(session);
 			}
 		} catch (MagicLoginException ignored) {

+ 18 - 7
magic-api/src/main/java/org/ssssssss/magicapi/controller/RequestHandler.java

@@ -49,13 +49,16 @@ import static org.ssssssss.magicapi.config.MessageType.BREAKPOINT;
 import static org.ssssssss.magicapi.config.MessageType.EXCEPTION;
 import static org.ssssssss.magicapi.model.Constants.*;
 
+/**
+ * 请求入口处理
+ *
+ * @author mxd
+ */
 public class RequestHandler extends MagicController {
 
 	private static final Logger logger = LoggerFactory.getLogger(RequestHandler.class);
-
-	private final ResultProvider resultProvider;
-
 	private static final Map<String, Object> EMPTY_MAP = new HashMap<>();
+	private final ResultProvider resultProvider;
 
 	public RequestHandler(MagicConfiguration configuration) {
 		super(configuration);
@@ -64,9 +67,16 @@ public class RequestHandler extends MagicController {
 
 	/**
 	 * 测试入口、实际请求入口
+	 *
+	 * @param request       HttpServletRequest
+	 * @param response      HttpServletResponse
+	 * @param pathVariables 路径变量
+	 * @param parameters    表单参数&URL参数
+	 * @return 返回请求结果
+	 * @throws Throwable 处理失败抛出的异常
 	 */
 	@ResponseBody
-	@Valid(requireLogin = false)    // 无需验证是否要登录
+	@Valid(requireLogin = false)
 	public Object invoke(HttpServletRequest request, HttpServletResponse response,
 						 @PathVariable(required = false) Map<String, Object> pathVariables,
 						 @RequestParam(required = false) Map<String, Object> parameters) throws Throwable {
@@ -123,7 +133,7 @@ public class RequestHandler extends MagicController {
 				MagicLoggerContext.SESSION.set(sessionId);
 				return invokeRequest(requestEntity);
 			} finally {
-				MagicLoggerContext.SESSION.remove();
+				MagicLoggerContext.remove();
 				WebSocketSessionManager.remove(sessionId);
 			}
 		} else {
@@ -168,7 +178,7 @@ public class RequestHandler extends MagicController {
 				}
 				List<Object> list = (List) parameters.get(parameter.getName());
 				if (list != null) {
-					List<Map<String, Object>> newList = list.stream().map(it -> doValidate(VAR_NAME_REQUEST_BODY, parameter.getChildren(), new HashMap<String, Object>() {{    // 使用 hashmap
+					List<Map<String, Object>> newList = list.stream().map(it -> doValidate(VAR_NAME_REQUEST_BODY, parameter.getChildren(), new HashMap<String, Object>() {{
 						put(EMPTY, it);
 					}}, jsonCode)).collect(Collectors.toList());
 					for (int i = 0, size = newList.size(); i < size; i++) {
@@ -192,7 +202,8 @@ public class RequestHandler extends MagicController {
 							throw new ValidateException(jsonCode, StringUtils.defaultIfBlank(parameter.getError(), String.format("%s[%s]为必填项", comment, parameter.getName())));
 						}
 					}
-					if (VALIDATE_TYPE_PATTERN.equals(parameter.getValidateType())) {    // 正则验证
+					// 正则验证
+					if (VALIDATE_TYPE_PATTERN.equals(parameter.getValidateType())) {
 						String expression = parameter.getExpression();
 						if (StringUtils.isNotBlank(expression) && !PatternUtils.match(Objects.toString(value, EMPTY), expression)) {
 							throw new ValidateException(jsonCode, StringUtils.defaultIfBlank(parameter.getError(), String.format("%s[%s]不满足正则表达式", comment, parameter.getName())));

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/dialect/ClickhouseDialect.java

@@ -1,5 +1,10 @@
 package org.ssssssss.magicapi.dialect;
 
+/**
+ * ClickHouse方言
+ *
+ * @author mxd
+ */
 public class ClickhouseDialect extends MySQLDialect {
 
 	@Override

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/dialect/DB2Dialect.java

@@ -3,6 +3,11 @@ package org.ssssssss.magicapi.dialect;
 
 import org.ssssssss.magicapi.modules.BoundSql;
 
+/**
+ * DB2方言
+ *
+ * @author mxd
+ */
 public class DB2Dialect implements Dialect {
 	@Override
 	public boolean match(String jdbcUrl) {

+ 22 - 1
magic-api/src/main/java/org/ssssssss/magicapi/dialect/Dialect.java

@@ -6,17 +6,29 @@ import org.ssssssss.magicapi.modules.BoundSql;
 import java.sql.Connection;
 import java.sql.SQLException;
 
+/**
+ * 数据库方言接口
+ *
+ * @author mxd
+ */
 public interface Dialect {
 
 	/**
 	 * 根据jdbcUrl匹配
+	 *
+	 * @param jdbcUrl jdbc链接
+	 * @return 是否匹配
 	 */
-	default boolean match(String jdbcUrl){
+	default boolean match(String jdbcUrl) {
 		return false;
 	}
 
 	/**
 	 * 根据Connection匹配
+	 *
+	 * @param connection jdbc连接
+	 * @return 是否匹配
+	 * @throws SQLException 匹配失败时抛出的异常
 	 */
 	default boolean match(Connection connection) throws SQLException {
 		return match(connection.getMetaData().getURL());
@@ -24,6 +36,9 @@ public interface Dialect {
 
 	/**
 	 * 获取查总数的sql
+	 *
+	 * @param sql 原始SQL
+	 * @return 分页 count SQL
 	 */
 	default String getCountSql(String sql) {
 		return "select count(1) from (" + sql + ") count_";
@@ -31,6 +46,12 @@ public interface Dialect {
 
 	/**
 	 * 获取分页sql
+	 *
+	 * @param sql      原始SQL
+	 * @param boundSql boundSql对象
+	 * @param offset   跳过条数
+	 * @param limit    限制条数
+	 * @return 返回分页SQL
 	 */
 	String getPageSql(String sql, BoundSql boundSql, long offset, long limit);
 }

+ 6 - 0
magic-api/src/main/java/org/ssssssss/magicapi/dialect/KingbaseSQLDialect.java

@@ -3,7 +3,13 @@ package org.ssssssss.magicapi.dialect;
 
 import org.ssssssss.magicapi.modules.BoundSql;
 
+/**
+ * 人大金仓kingbase方言
+ *
+ * @author is_lixy@163.com
+ */
 public class KingbaseSQLDialect implements Dialect {
+
 	@Override
 	public boolean match(String jdbcUrl) {
 		return jdbcUrl.contains(":kingbase8:");

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/dialect/MySQLDialect.java

@@ -3,6 +3,11 @@ package org.ssssssss.magicapi.dialect;
 
 import org.ssssssss.magicapi.modules.BoundSql;
 
+/**
+ * mysql 方言
+ *
+ * @author mxd
+ */
 public class MySQLDialect implements Dialect {
 
 	@Override

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/dialect/OracleDialect.java

@@ -3,6 +3,11 @@ package org.ssssssss.magicapi.dialect;
 
 import org.ssssssss.magicapi.modules.BoundSql;
 
+/**
+ * Oracle方言
+ *
+ * @author mxd
+ */
 public class OracleDialect implements Dialect {
 
 	@Override

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/dialect/PostgreSQLDialect.java

@@ -3,6 +3,11 @@ package org.ssssssss.magicapi.dialect;
 
 import org.ssssssss.magicapi.modules.BoundSql;
 
+/**
+ * PostgreSQL 方言
+ *
+ * @author mxd
+ */
 public class PostgreSQLDialect implements Dialect {
 	@Override
 	public boolean match(String jdbcUrl) {

+ 6 - 0
magic-api/src/main/java/org/ssssssss/magicapi/dialect/SQLServer2005Dialect.java

@@ -3,7 +3,13 @@ package org.ssssssss.magicapi.dialect;
 import org.apache.commons.lang3.StringUtils;
 import org.ssssssss.magicapi.modules.BoundSql;
 
+/**
+ * SQLServer2005 方言
+ *
+ * @author mxd
+ */
 public class SQLServer2005Dialect implements Dialect {
+
 	@Override
 	public boolean match(String jdbcUrl) {
 		return jdbcUrl.contains(":sqlserver:");

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/dialect/SQLServerDialect.java

@@ -3,6 +3,11 @@ package org.ssssssss.magicapi.dialect;
 
 import org.ssssssss.magicapi.modules.BoundSql;
 
+/**
+ * SQL Server 方言
+ *
+ * @author mxd
+ */
 public class SQLServerDialect implements Dialect {
 	@Override
 	public boolean match(String jdbcUrl) {

+ 6 - 1
magic-api/src/main/java/org/ssssssss/magicapi/exception/InvalidArgumentException.java

@@ -2,9 +2,14 @@ package org.ssssssss.magicapi.exception;
 
 import org.ssssssss.magicapi.model.JsonCode;
 
+/**
+ * 参数错误异常
+ *
+ * @author mxd
+ */
 public class InvalidArgumentException extends RuntimeException {
 
-	private final JsonCode jsonCode;
+	private final transient JsonCode jsonCode;
 
 	public InvalidArgumentException(JsonCode jsonCode) {
 		super(jsonCode.getMessage());

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/exception/MagicAPIException.java

@@ -1,5 +1,10 @@
 package org.ssssssss.magicapi.exception;
 
+/**
+ * magic-api异常对象
+ *
+ * @author mxd
+ */
 public class MagicAPIException extends RuntimeException {
 
 	public MagicAPIException(String message) {

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/exception/MagicLoginException.java

@@ -1,5 +1,10 @@
 package org.ssssssss.magicapi.exception;
 
+/**
+ * 登录异常对象
+ *
+ * @author mxd
+ */
 public class MagicLoginException extends Exception {
 
 	public MagicLoginException(String message) {

+ 13 - 0
magic-api/src/main/java/org/ssssssss/magicapi/exception/MagicResourceNotFoundException.java

@@ -0,0 +1,13 @@
+package org.ssssssss.magicapi.exception;
+
+/**
+ * 资源未找到
+ *
+ * @author mxd
+ */
+public class MagicResourceNotFoundException extends RuntimeException {
+
+	public MagicResourceNotFoundException(String message) {
+		super(message);
+	}
+}

+ 0 - 8
magic-api/src/main/java/org/ssssssss/magicapi/exception/MagicServiceException.java

@@ -1,8 +0,0 @@
-package org.ssssssss.magicapi.exception;
-
-public class MagicServiceException extends RuntimeException {
-
-	public MagicServiceException(String message) {
-		super(message);
-	}
-}

+ 6 - 1
magic-api/src/main/java/org/ssssssss/magicapi/exception/ValidateException.java

@@ -2,7 +2,12 @@ package org.ssssssss.magicapi.exception;
 
 import org.ssssssss.magicapi.model.JsonCode;
 
-public class ValidateException extends RuntimeException{
+/**
+ * 接口验证异常
+ *
+ * @author mxd
+ */
+public class ValidateException extends RuntimeException {
 
 	private final JsonCode jsonCode;
 

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/interceptor/Authorization.java

@@ -1,5 +1,10 @@
 package org.ssssssss.magicapi.interceptor;
 
+/**
+ * 鉴权类型枚举
+ *
+ * @author mxd
+ */
 public enum Authorization {
 	/**
 	 * 无实际意义

+ 45 - 1
magic-api/src/main/java/org/ssssssss/magicapi/interceptor/AuthorizationInterceptor.java

@@ -8,11 +8,18 @@ import org.ssssssss.magicapi.model.Group;
 
 import javax.servlet.http.HttpServletRequest;
 
+/**
+ * UI权限拦截器
+ *
+ * @author mxd
+ */
 public interface AuthorizationInterceptor {
 
 
 	/**
 	 * 是否需要登录
+	 *
+	 * @return true 需要登录, false 不需要登录
 	 */
 	default boolean requireLogin() {
 		return false;
@@ -20,6 +27,10 @@ public interface AuthorizationInterceptor {
 
 	/**
 	 * 根据Token获取User对象
+	 *
+	 * @param token token值
+	 * @return 登录成功后返回MagicUser对象
+	 * @throws MagicLoginException 登录失败抛出
 	 */
 	default MagicUser getUserByToken(String token) throws MagicLoginException {
 		return null;
@@ -30,6 +41,8 @@ public interface AuthorizationInterceptor {
 	 *
 	 * @param username 用户名
 	 * @param password 密码
+	 * @return 登录成功后返回MagicUser对象
+	 * @throws MagicLoginException 登录失败抛出
 	 */
 	default MagicUser login(String username, String password) throws MagicLoginException {
 		return null;
@@ -37,13 +50,20 @@ public interface AuthorizationInterceptor {
 
 	/**
 	 * 退出登录
+	 *
+	 * @param token token值
 	 */
-	default void logout(String token){
+	default void logout(String token) {
 
 	}
 
 	/**
 	 * 是否拥有页面按钮的权限
+	 *
+	 * @param magicUser     登录的用户对象
+	 * @param request       HttpServletRequest
+	 * @param authorization 鉴权方法
+	 * @return true 有权限访问, false 无权限访问
 	 */
 	default boolean allowVisit(MagicUser magicUser, HttpServletRequest request, Authorization authorization) {
 		return true;
@@ -51,6 +71,12 @@ public interface AuthorizationInterceptor {
 
 	/**
 	 * 是否拥有对该接口的增删改权限
+	 *
+	 * @param magicUser     登录的用户对象
+	 * @param request       HttpServletRequest
+	 * @param authorization 鉴权方法
+	 * @param apiInfo       接口信息
+	 * @return true 有权限访问, false 无权限访问
 	 */
 	default boolean allowVisit(MagicUser magicUser, HttpServletRequest request, Authorization authorization, ApiInfo apiInfo) {
 		return allowVisit(magicUser, request, authorization);
@@ -58,6 +84,12 @@ public interface AuthorizationInterceptor {
 
 	/**
 	 * 是否拥有对该函数的增删改权限
+	 *
+	 * @param magicUser     登录的用户对象
+	 * @param request       HttpServletRequest
+	 * @param authorization 鉴权方法
+	 * @param functionInfo  函数信息
+	 * @return true 有权限访问, false 无权限访问
 	 */
 	default boolean allowVisit(MagicUser magicUser, HttpServletRequest request, Authorization authorization, FunctionInfo functionInfo) {
 		return allowVisit(magicUser, request, authorization);
@@ -65,6 +97,12 @@ public interface AuthorizationInterceptor {
 
 	/**
 	 * 是否拥有对该分组的增删改权限
+	 *
+	 * @param magicUser     登录的用户对象
+	 * @param request       HttpServletRequest
+	 * @param authorization 鉴权方法
+	 * @param group         分组信息
+	 * @return true 有权限访问, false 无权限访问
 	 */
 	default boolean allowVisit(MagicUser magicUser, HttpServletRequest request, Authorization authorization, Group group) {
 		return allowVisit(magicUser, request, authorization);
@@ -72,6 +110,12 @@ public interface AuthorizationInterceptor {
 
 	/**
 	 * 是否拥有对该数据源的增删改权限
+	 *
+	 * @param magicUser      登录的用户对象
+	 * @param request        HttpServletRequest
+	 * @param authorization  鉴权方法
+	 * @param dataSourceInfo 数据源信息
+	 * @return true 有权限访问, false 无权限访问
 	 */
 	default boolean allowVisit(MagicUser magicUser, HttpServletRequest request, Authorization authorization, DataSourceInfo dataSourceInfo) {
 		return allowVisit(magicUser, request, authorization);

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/interceptor/DefaultAuthorizationInterceptor.java

@@ -5,6 +5,11 @@ import org.ssssssss.magicapi.utils.MD5Utils;
 
 import java.util.Objects;
 
+/**
+ * 默认UI鉴权实现
+ *
+ * @author mxd
+ */
 public class DefaultAuthorizationInterceptor implements AuthorizationInterceptor {
 
 	private final boolean requireLogin;

+ 8 - 3
magic-api/src/main/java/org/ssssssss/magicapi/interceptor/DefaultSqlInterceptor.java

@@ -9,7 +9,12 @@ import org.ssssssss.script.MagicScriptContext;
 import java.util.Arrays;
 import java.util.stream.Collectors;
 
-public class DefaultSqlInterceptor implements SQLInterceptor{
+/**
+ * 默认打印SQL实现
+ *
+ * @author mxd
+ */
+public class DefaultSqlInterceptor implements SQLInterceptor {
 
 	@Override
 	public void preHandle(BoundSql boundSql, RequestEntity requestEntity) {
@@ -22,10 +27,10 @@ public class DefaultSqlInterceptor implements SQLInterceptor{
 		}).collect(Collectors.joining(", "));
 		String dataSourceName = boundSql.getSqlModule().getDataSourceName();
 		logger.info("执行SQL:{}", boundSql.getSql().trim());
-		if(dataSourceName != null){
+		if (dataSourceName != null) {
 			logger.info("数据源:{}", dataSourceName);
 		}
-		if(parameters.length() > 0){
+		if (parameters.length() > 0) {
 			logger.info("SQL参数:{}", parameters);
 		}
 	}

+ 9 - 4
magic-api/src/main/java/org/ssssssss/magicapi/interceptor/MagicUser.java

@@ -1,5 +1,10 @@
 package org.ssssssss.magicapi.interceptor;
 
+/**
+ * magic 用户对象
+ *
+ * @author mxd
+ */
 public class MagicUser {
 
 	private String id;
@@ -14,6 +19,10 @@ public class MagicUser {
 		this.token = token;
 	}
 
+	public static MagicUser guest() {
+		return new MagicUser(null, "guest", null);
+	}
+
 	public String getId() {
 		return id;
 	}
@@ -37,8 +46,4 @@ public class MagicUser {
 	public void setToken(String token) {
 		this.token = token;
 	}
-
-	public static MagicUser guest(){
-		return new MagicUser(null, "guest", null);
-	}
 }

+ 28 - 3
magic-api/src/main/java/org/ssssssss/magicapi/interceptor/RequestInterceptor.java

@@ -9,12 +9,15 @@ import javax.servlet.http.HttpServletResponse;
 
 /**
  * 请求拦截器
+ *
+ * @author mxd
  */
 public interface RequestInterceptor {
 
 	/**
 	 * 请求之前执行
 	 *
+	 * @param requestEntity 请求对象
 	 * @return 当返回对象时,直接将此对象返回到页面,返回null时,继续执行后续操作
 	 */
 	default Object preHandle(RequestEntity requestEntity) throws Exception {
@@ -24,7 +27,12 @@ public interface RequestInterceptor {
 	/**
 	 * 请求之前执行
 	 *
+	 * @param info     接口信息
+	 * @param context  脚本上下文
+	 * @param request  HttpServletRequest
+	 * @param response HttpServletResponse
 	 * @return 当返回对象时,直接将此对象返回到页面,返回null时,继续执行后续操作
+	 * @throws Exception 处理失败时抛出的异常
 	 */
 	default Object preHandle(ApiInfo info, MagicScriptContext context, HttpServletRequest request, HttpServletResponse response) throws Exception {
 		return null;
@@ -34,8 +42,13 @@ public interface RequestInterceptor {
 	/**
 	 * 执行完毕之后执行
 	 *
+	 * @param info        接口信息
+	 * @param context     脚本上下文
 	 * @param returnValue 即将要返回到页面的值
+	 * @param request     HttpServletRequest
+	 * @param response    HttpServletResponse
 	 * @return 返回到页面的对象, 当返回null时执行后续拦截器,否则直接返回该值,不执行后续拦截器
+	 * @throws Exception 处理失败时抛出的异常
 	 */
 	default Object postHandle(ApiInfo info, MagicScriptContext context, Object returnValue, HttpServletRequest request, HttpServletResponse response) throws Exception {
 		return null;
@@ -44,7 +57,8 @@ public interface RequestInterceptor {
 	/**
 	 * 执行完毕之后执行
 	 *
-	 * @param returnValue 即将要返回到页面的值
+	 * @param requestEntity 请求对象
+	 * @param returnValue   即将要返回到页面的值
 	 * @return 返回到页面的对象, 当返回null时执行后续拦截器,否则直接返回该值,不执行后续拦截器
 	 */
 	default Object postHandle(RequestEntity requestEntity, Object returnValue) throws Exception {
@@ -53,15 +67,26 @@ public interface RequestInterceptor {
 
 	/**
 	 * 接口执行完毕之后执行
+	 *
+	 * @param requestEntity 请求对象
+	 * @param returnValue   即将要返回到页面的值
+	 * @param throwable     异常对象
 	 */
-	default void afterCompletion(RequestEntity requestEntity, Object returnValue, Throwable throwable){
+	default void afterCompletion(RequestEntity requestEntity, Object returnValue, Throwable throwable) {
 		afterCompletion(requestEntity.getApiInfo(), requestEntity.getMagicScriptContext(), returnValue, requestEntity.getRequest(), requestEntity.getResponse(), throwable);
 	}
 
 	/**
 	 * 接口执行完毕之后执行
+	 *
+	 * @param info        接口信息
+	 * @param context     脚本上下文
+	 * @param returnValue 即将要返回到页面的值
+	 * @param request     HttpServletRequest
+	 * @param response    HttpServletResponse
+	 * @param throwable   异常对象
 	 */
-	default void afterCompletion(ApiInfo info, MagicScriptContext context, Object returnValue, HttpServletRequest request, HttpServletResponse response, Throwable throwable){
+	default void afterCompletion(ApiInfo info, MagicScriptContext context, Object returnValue, HttpServletRequest request, HttpServletResponse response, Throwable throwable) {
 
 	}
 

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/interceptor/SQLInterceptor.java

@@ -5,11 +5,16 @@ import org.ssssssss.magicapi.modules.BoundSql;
 
 /**
  * SQL 拦截器
+ *
+ * @author mxd
  */
 public interface SQLInterceptor {
 
 	/**
 	 * 1.1.1 新增
+	 *
+	 * @param boundSql      SQL信息
+	 * @param requestEntity 请求信息
 	 */
 	void preHandle(BoundSql boundSql, RequestEntity requestEntity);
 

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/logging/Log4j2LoggerContext.java

@@ -17,6 +17,8 @@ import java.nio.charset.StandardCharsets;
 
 /**
  * 对接Log4j2
+ *
+ * @author mxd
  */
 public class Log4j2LoggerContext implements MagicLoggerContext {
 

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/logging/Log4jLoggerContext.java

@@ -10,6 +10,8 @@ import org.apache.log4j.spi.ThrowableInformation;
 
 /**
  * 对接Log4j
+ *
+ * @author mxd
  */
 public class Log4jLoggerContext implements MagicLoggerContext {
 	@Override

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/logging/LogInfo.java

@@ -6,6 +6,8 @@ import java.io.StringWriter;
 
 /**
  * 打印的日志信息
+ *
+ * @author mxd
  */
 public class LogInfo {
 

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/logging/LogbackLoggerContext.java

@@ -9,6 +9,8 @@ import org.slf4j.LoggerFactory;
 
 /**
  * 对接Logback
+ *
+ * @author mxd
  */
 public class LogbackLoggerContext implements MagicLoggerContext {
 

+ 8 - 3
magic-api/src/main/java/org/ssssssss/magicapi/logging/LoggerManager.java

@@ -6,6 +6,8 @@ import org.slf4j.LoggerFactory;
 
 /**
  * 日志管理
+ *
+ * @author mxd
  */
 public class LoggerManager {
 
@@ -18,11 +20,14 @@ public class LoggerManager {
 		ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory();
 		String loggerFactoryClassName = loggerFactory.getClass().getName();
 		MagicLoggerContext magicLoggerContext = null;
-		if ("ch.qos.logback.classic.LoggerContext".equalsIgnoreCase(loggerFactoryClassName)) {    //logback
+		// logback
+		if ("ch.qos.logback.classic.LoggerContext".equalsIgnoreCase(loggerFactoryClassName)) {
 			magicLoggerContext = new LogbackLoggerContext();
-		} else if ("org.apache.logging.slf4j.Log4jLoggerFactory".equalsIgnoreCase(loggerFactoryClassName)) {    //log4j2
+		} else if ("org.apache.logging.slf4j.Log4jLoggerFactory".equalsIgnoreCase(loggerFactoryClassName)) {
+			// log4j2
 			magicLoggerContext = new Log4j2LoggerContext();
-		} else if ("org.slf4j.impl.Log4jLoggerFactory".equalsIgnoreCase(loggerFactoryClassName)) {    //log4j 1
+		} else if ("org.slf4j.impl.Log4jLoggerFactory".equalsIgnoreCase(loggerFactoryClassName)) {
+			// log4j 1
 			magicLoggerContext = new Log4jLoggerContext();
 		}
 		if (magicLoggerContext == null) {

+ 12 - 0
magic-api/src/main/java/org/ssssssss/magicapi/logging/MagicLoggerContext.java

@@ -3,6 +3,11 @@ package org.ssssssss.magicapi.logging;
 import org.ssssssss.magicapi.config.MessageType;
 import org.ssssssss.magicapi.config.WebSocketSessionManager;
 
+/**
+ * 日志上下文
+ *
+ * @author mxd
+ */
 public interface MagicLoggerContext {
 
 	String LOGGER_NAME = "magic";
@@ -22,6 +27,13 @@ public interface MagicLoggerContext {
 		}
 	}
 
+	/**
+	 * 移除ThreadLocal中的sessionId
+	 */
+	static void remove() {
+		SESSION.remove();
+	}
+
 	/**
 	 * 生成appender
 	 */

+ 43 - 35
magic-api/src/main/java/org/ssssssss/magicapi/model/ApiInfo.java

@@ -7,9 +7,12 @@ import org.ssssssss.magicapi.config.MappingHandlerMapping;
 import org.ssssssss.magicapi.utils.JsonUtils;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 接口信息
+ *
+ * @author mxd
  */
 public class ApiInfo extends MagicEntity {
 
@@ -68,10 +71,10 @@ public class ApiInfo extends MagicEntity {
 	 */
 	private BaseDefinition requestBodyDefinition;
 
-    /**
-     * 输出结果属性
-     */
-    private BaseDefinition responseBodyDefinition;
+	/**
+	 * 输出结果属性
+	 */
+	private BaseDefinition responseBodyDefinition;
 
 	public String getMethod() {
 		return method;
@@ -92,28 +95,28 @@ public class ApiInfo extends MagicEntity {
 	public void setParameter(String parameter) {
 		if (parameter != null) {
 			parameter = parameter.trim();
-			if (parameter.startsWith("[")) {    // v0.5.0+
+			// v0.5.0+
+			if (parameter.startsWith("[")) {
 				this.parameters = JsonUtils.readValue(Objects.toString(parameter, "[]"), new TypeReference<List<Parameter>>() {
 				});
 			} else {
-				Map map = JsonUtils.readValue(Objects.toString(parameter, "{}"), Map.class);
+				Map<String, Object> map = JsonUtils.readValue(Objects.toString(parameter, "{}"), new TypeReference<Map<String, Object>>() {
+				});
 				Object request = map.get("request");
 				if (request instanceof Map) {
-					Map requestMap = (Map) request;
-					Set keys = requestMap.keySet();
-					this.parameters = new ArrayList<>();
-					for (Object key : keys) {
-						this.parameters.add(new Parameter(key.toString(), Objects.toString(requestMap.get(key), "")));
-					}
+					Map<String, Object> requestMap = (Map<String, Object>) request;
+					this.parameters = requestMap.keySet()
+							.stream()
+							.map(key -> new Parameter(key, Objects.toString(requestMap.get(key), "")))
+							.collect(Collectors.toList());
 				}
 				Object header = map.get("header");
 				if (header instanceof Map) {
-					Map headers = (Map) header;
-					Set keys = headers.keySet();
-					this.headers = new ArrayList<>();
-					for (Object key : keys) {
-						this.headers.add(new Header(key.toString(), Objects.toString(headers.get(key), "")));
-					}
+					Map<String, Object> headers = (Map<String, Object>) header;
+					this.headers = headers.keySet()
+							.stream()
+							.map(key -> new Header(key, Objects.toString(headers.get(key), "")))
+							.collect(Collectors.toList());
 				}
 				if (map.containsKey("body")) {
 					this.requestBody = Objects.toString(map.get("body"), null);
@@ -149,7 +152,7 @@ public class ApiInfo extends MagicEntity {
 	public Map<String, String> getOptionMap() {
 		Map<String, String> map = new HashMap<>();
 		if (this.jsonNode == null) {
-			return null;
+			return Collections.emptyMap();
 		} else if (this.jsonNode.isArray()) {
 			for (JsonNode node : this.jsonNode) {
 				map.put(node.get("name").asText(), node.get("value").asText());
@@ -185,6 +188,7 @@ public class ApiInfo extends MagicEntity {
 		try {
 			this.jsonNode = new ObjectMapper().readTree(option);
 		} catch (Throwable ignored) {
+			// ignored
 		}
 	}
 
@@ -241,23 +245,23 @@ public class ApiInfo extends MagicEntity {
 				.map(it -> Objects.toString(it.getValue(), null)).orElse(null);
 	}
 
-    public BaseDefinition getRequestBodyDefinition() {
-        return requestBodyDefinition;
-    }
+	public BaseDefinition getRequestBodyDefinition() {
+		return requestBodyDefinition;
+	}
 
-    public void setRequestBodyDefinition(BaseDefinition requestBodyDefinition) {
-        this.requestBodyDefinition = requestBodyDefinition;
-    }
+	public void setRequestBodyDefinition(BaseDefinition requestBodyDefinition) {
+		this.requestBodyDefinition = requestBodyDefinition;
+	}
 
-    public BaseDefinition getResponseBodyDefinition() {
-        return responseBodyDefinition;
-    }
+	public BaseDefinition getResponseBodyDefinition() {
+		return responseBodyDefinition;
+	}
 
-    public void setResponseBodyDefinition(BaseDefinition responseBodyDefinition) {
-        this.responseBodyDefinition = responseBodyDefinition;
-    }
+	public void setResponseBodyDefinition(BaseDefinition responseBodyDefinition) {
+		this.responseBodyDefinition = responseBodyDefinition;
+	}
 
-	public ApiInfo simple(){
+	public ApiInfo simple() {
 		ApiInfo target = new ApiInfo();
 		target.setId(this.getId());
 		target.setName(this.getName());
@@ -268,10 +272,14 @@ public class ApiInfo extends MagicEntity {
 		return target;
 	}
 
-    @Override
+	@Override
 	public boolean equals(Object o) {
-		if (this == o) return true;
-		if (o == null || getClass() != o.getClass()) return false;
+		if (this == o) {
+			return true;
+		}
+		if (o == null || getClass() != o.getClass()) {
+			return false;
+		}
 		ApiInfo apiInfo = (ApiInfo) o;
 		return Objects.equals(id, apiInfo.id) &&
 				Objects.equals(method, apiInfo.method) &&

+ 7 - 1
magic-api/src/main/java/org/ssssssss/magicapi/model/Attributes.java

@@ -3,7 +3,13 @@ package org.ssssssss.magicapi.model;
 import java.util.HashMap;
 import java.util.Map;
 
-public class Attributes<T>  {
+/**
+ * 属性信息
+ *
+ * @param <T>
+ * @author mxd
+ */
+public class Attributes<T> {
 
 	protected Map<String, T> properties = new HashMap<>();
 

+ 3 - 1
magic-api/src/main/java/org/ssssssss/magicapi/model/Backup.java

@@ -2,6 +2,8 @@ package org.ssssssss.magicapi.model;
 
 /**
  * 备份记录
+ *
+ * @author mxd
  */
 public class Backup {
 
@@ -106,7 +108,7 @@ public class Backup {
 		this.name = name;
 	}
 
-	public Backup small(){
+	public Backup small() {
 		setContent(null);
 		return this;
 	}

+ 11 - 2
magic-api/src/main/java/org/ssssssss/magicapi/model/BaseDefinition.java

@@ -3,6 +3,11 @@ package org.ssssssss.magicapi.model;
 import java.util.ArrayList;
 import java.util.Objects;
 
+/**
+ * 参数、header、path的基础信息
+ *
+ * @author mxd
+ */
 public class BaseDefinition {
 	/**
 	 * 名
@@ -157,8 +162,12 @@ public class BaseDefinition {
 
 	@Override
 	public boolean equals(Object o) {
-		if (this == o) return true;
-		if (!(o instanceof BaseDefinition)) return false;
+		if (this == o) {
+			return true;
+		}
+		if (!(o instanceof BaseDefinition)) {
+			return false;
+		}
 		BaseDefinition that = (BaseDefinition) o;
 		return required == that.required && Objects.equals(name, that.name) && Objects.equals(value, that.value) && Objects.equals(description, that.description) && dataType == that.dataType && Objects.equals(defaultValue, that.defaultValue) && Objects.equals(validateType, that.validateType) && Objects.equals(error, that.error) && Objects.equals(expression, that.expression) && Objects.equals(children, that.children);
 	}

+ 24 - 28
magic-api/src/main/java/org/ssssssss/magicapi/model/Constants.java

@@ -1,5 +1,10 @@
 package org.ssssssss.magicapi.model;
 
+/**
+ * magic-api中使用的常量信息
+ *
+ * @author mxd
+ */
 public class Constants {
 
 	/**
@@ -43,6 +48,11 @@ public class Constants {
 	 */
 	public static final String EMPTY = "";
 
+	/**
+	 * 根节点ID
+	 */
+	public static final String ROOT_ID = "0";
+
 	/**
 	 * 表达式验证
 	 */
@@ -105,86 +115,72 @@ public class Constants {
 
 	public static final String GROUP_METABASE = "group.json";
 
+	public static final String JSON_SUFFIX = ".json";
+
 	public static final String UPLOAD_MODE_FULL = "full";
 
 	public static final String LOCK = "1";
 
 	public static final String UNLOCK = "0";
-
-	/**
-	 * 执行成功的code值
-	 */
-	public static int RESPONSE_CODE_SUCCESS = 1;
-
 	/**
 	 * 执行成功的message值
 	 */
 	public static final String RESPONSE_MESSAGE_SUCCESS = "success";
-
-	/**
-	 * 执行出现异常的code值
-	 */
-	public static int RESPONSE_CODE_EXCEPTION = -1;
-
-	/**
-	 * 参数验证未通过的code值
-	 */
-	public static int RESPONSE_CODE_INVALID = 0;
-
 	/**
 	 * 通知新增
 	 */
 	public static final int NOTIFY_ACTION_ADD = 1;
-
 	/**
 	 * 通知修改
 	 */
 	public static final int NOTIFY_ACTION_UPDATE = 2;
-
 	/**
 	 * 通知删除
 	 */
 	public static final int NOTIFY_ACTION_DELETE = 3;
-
 	/**
 	 * 通知更新全部
 	 */
 	public static final int NOTIFY_ACTION_ALL = 0;
-
 	/**
 	 * 通知接口刷新
 	 */
 	public static final int NOTIFY_ACTION_API = 1;
-
 	/**
 	 * 通知分组刷新
 	 */
 	public static final int NOTIFY_ACTION_GROUP = 2;
-
 	/**
 	 * 通知函数刷新
 	 */
 	public static final int NOTIFY_ACTION_FUNCTION = 3;
-
 	/**
 	 * 通知数据源刷新
 	 */
 	public static final int NOTIFY_ACTION_DATASOURCE = 4;
-
-
 	/**
 	 * 通知 C -> S 的WebSocket消息
 	 */
 	public static final int NOTIFY_WS_C_S = 100;
-
 	/**
 	 * 通知 S -> C 的WebSocket消息
 	 */
 	public static final int NOTIFY_WS_S_C = 200;
-
 	/**
 	 * 空数组
 	 */
 	public static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
+	/**
+	 * 执行成功的code值
+	 */
+	public static int RESPONSE_CODE_SUCCESS = 1;
+	/**
+	 * 执行出现异常的code值
+	 */
+	public static int RESPONSE_CODE_EXCEPTION = -1;
+	/**
+	 * 参数验证未通过的code值
+	 */
+	public static int RESPONSE_CODE_INVALID = 0;
 
 }

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/DataSourceInfo.java

@@ -4,6 +4,11 @@ import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
 
+/**
+ * 数据源信息
+ *
+ * @author mxd
+ */
 public class DataSourceInfo extends Attributes<String> implements Map<String, String> {
 
 	public String getId() {

+ 49 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/DataType.java

@@ -9,18 +9,67 @@ import java.math.BigDecimal;
 
 import static org.ssssssss.script.reflection.JavaReflection.findInvoker;
 
+/**
+ * 参数类型枚举
+ *
+ * @author mxd
+ */
 public enum DataType {
+	/**
+	 * Object 类型
+	 */
 	Object("object"),
+
+	/**
+	 * 数组类型
+	 */
 	Array("array"),
+
+	/**
+	 * Boolean类型
+	 */
 	Boolean(false, findInvoker(Boolean.class, "valueOf", new Class<?>[]{String.class}), false, true, "boolean"),
+
+	/**
+	 * String 类型
+	 */
 	String("string"),
+
+	/**
+	 * Integer 类型
+	 */
 	Integer(true, findInvoker(BigDecimal.class, "intValue"), "number"),
+
+	/**
+	 * Double 类型
+	 */
 	Double(true, findInvoker(BigDecimal.class, "doubleValue"), "number"),
+	/**
+	 * Long 类型
+	 */
 	Long(true, findInvoker(BigDecimal.class, "longValue"), "number"),
+	/**
+	 * Float 类型
+	 */
 	Float(true, findInvoker(BigDecimal.class, "floatValue"), "number"),
+	/**
+	 * Byte 类型
+	 */
 	Byte(true, findInvoker(BigDecimal.class, "byteValue"), "number"),
+
+	/**
+	 * Short类型
+	 */
 	Short(true, findInvoker(BigDecimal.class, "shortValue"), "number"),
+
+	/**
+	 * MultipartFile 类型
+	 */
 	MultipartFile(findInvoker(RequestModule.class, "getFile", new Class<?>[]{String.class}), true, false, "file"),
+
+	/**
+	 * List<MultipartFile> 类型
+	 */
 	MultipartFiles(findInvoker(RequestModule.class, "getFiles", new Class<?>[]{String.class}), true, false, "file");
 
 

+ 13 - 3
magic-api/src/main/java/org/ssssssss/magicapi/model/FunctionInfo.java

@@ -7,6 +7,11 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 
+/**
+ * 函数信息
+ *
+ * @author mxd
+ */
 public class FunctionInfo extends MagicEntity {
 
 	private String path;
@@ -32,6 +37,7 @@ public class FunctionInfo extends MagicEntity {
 			this.parameters = JsonUtils.readValue(Objects.toString(parameter, "[]"), new TypeReference<List<Parameter>>() {
 			});
 		} catch (Throwable ignored) {
+			// ignored
 		}
 	}
 
@@ -69,8 +75,12 @@ public class FunctionInfo extends MagicEntity {
 
 	@Override
 	public boolean equals(Object o) {
-		if (this == o) return true;
-		if (o == null || getClass() != o.getClass()) return false;
+		if (this == o) {
+			return true;
+		}
+		if (o == null || getClass() != o.getClass()) {
+			return false;
+		}
 		FunctionInfo functionInfo = (FunctionInfo) o;
 		return Objects.equals(id, functionInfo.id) &&
 				Objects.equals(path, functionInfo.path) &&
@@ -88,7 +98,7 @@ public class FunctionInfo extends MagicEntity {
 		return Objects.hash(id, path, script, name, groupId, parameters, description, returnType);
 	}
 
-	public FunctionInfo copy(){
+	public FunctionInfo copy() {
 		FunctionInfo info = new FunctionInfo();
 		info.setId(this.id);
 		info.setName(this.name);

+ 23 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/Group.java

@@ -2,7 +2,13 @@ package org.ssssssss.magicapi.model;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
 
+/**
+ * 分组对象
+ *
+ * @author mxd
+ */
 public class Group extends Attributes<Object> {
 
 	private String id;
@@ -88,4 +94,21 @@ public class Group extends Attributes<Object> {
 	public void setOptions(List<BaseDefinition> options) {
 		this.options = options;
 	}
+
+	@Override
+	public boolean equals(Object o) {
+		if (this == o) {
+			return true;
+		}
+		if (!(o instanceof Group)) {
+			return false;
+		}
+		Group group = (Group) o;
+		return Objects.equals(id, group.id) && Objects.equals(name, group.name) && Objects.equals(type, group.type) && Objects.equals(parentId, group.parentId) && Objects.equals(path, group.path);
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(id, name, type, parentId, path);
+	}
 }

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/Header.java

@@ -1,5 +1,10 @@
 package org.ssssssss.magicapi.model;
 
+/**
+ * Header参数信息
+ *
+ * @author mxd
+ */
 public class Header extends BaseDefinition {
 
 	public Header() {

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/JsonBean.java

@@ -2,6 +2,8 @@ package org.ssssssss.magicapi.model;
 
 /**
  * 统一返回值对象
+ *
+ * @author mxd
  */
 public class JsonBean<T> {
 

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/JsonBodyBean.java

@@ -1,5 +1,10 @@
 package org.ssssssss.magicapi.model;
 
+/**
+ * 统一返回值对象带body
+ *
+ * @author mxd
+ */
 public class JsonBodyBean<T> extends JsonBean<T> {
 
 	private Object body;

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/JsonCode.java

@@ -1,5 +1,10 @@
 package org.ssssssss.magicapi.model;
 
+/**
+ * Json状态码信息
+ *
+ * @author mxd
+ */
 public class JsonCode {
 
 	private int code;

+ 23 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/JsonCodeConstants.java

@@ -3,6 +3,11 @@ package org.ssssssss.magicapi.model;
 import org.apache.commons.lang3.StringUtils;
 import org.ssssssss.magicapi.exception.InvalidArgumentException;
 
+/**
+ * JSON状态码常量
+ *
+ * @author mxd
+ */
 public interface JsonCodeConstants {
 
 	JsonCode SUCCESS = new JsonCode(1, Constants.RESPONSE_MESSAGE_SUCCESS);
@@ -84,18 +89,36 @@ public interface JsonCodeConstants {
 
 	JsonCode DATASOURCE_TYPE_NOT_SET = new JsonCode(0, "请设置数据源类型");
 
+	/**
+	 * 值不能为空
+	 *
+	 * @param value    值
+	 * @param jsonCode 值为空时的状态码
+	 */
 	default void notNull(Object value, JsonCode jsonCode) {
 		if (value == null) {
 			throw new InvalidArgumentException(jsonCode);
 		}
 	}
 
+	/**
+	 * 值应为true
+	 *
+	 * @param value    值
+	 * @param jsonCode 值为false的状态码
+	 */
 	default void isTrue(boolean value, JsonCode jsonCode) {
 		if (!value) {
 			throw new InvalidArgumentException(jsonCode);
 		}
 	}
 
+	/**
+	 * 值不能为空
+	 *
+	 * @param value    值
+	 * @param jsonCode 值为空的状态码
+	 */
 	default void notBlank(String value, JsonCode jsonCode) {
 		isTrue(StringUtils.isNotBlank(value), jsonCode);
 	}

+ 20 - 15
magic-api/src/main/java/org/ssssssss/magicapi/model/MagicConsoleSession.java

@@ -7,9 +7,14 @@ import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 
+/**
+ * WebSocket Session对象封装
+ *
+ * @author mxd
+ */
 public class MagicConsoleSession {
 
-	private static final Map<String, MagicConsoleSession> cached = new ConcurrentHashMap<>();
+	private static final Map<String, MagicConsoleSession> CACHED = new ConcurrentHashMap<>();
 
 	private final String id = UUID.randomUUID().toString();
 
@@ -28,6 +33,19 @@ public class MagicConsoleSession {
 		this.magicScriptDebugContext = magicScriptDebugContext;
 	}
 
+	public static MagicConsoleSession from(WebSocketSession session) {
+		MagicConsoleSession magicConsoleSession = CACHED.get(session.getId());
+		if (magicConsoleSession == null) {
+			magicConsoleSession = new MagicConsoleSession(session);
+			CACHED.put(session.getId(), magicConsoleSession);
+		}
+		return magicConsoleSession;
+	}
+
+	public static void remove(WebSocketSession session) {
+		CACHED.remove(session.getId());
+	}
+
 	public String getId() {
 		return id;
 	}
@@ -48,7 +66,7 @@ public class MagicConsoleSession {
 		this.magicScriptDebugContext = magicScriptDebugContext;
 	}
 
-	public boolean writeable(){
+	public boolean writeable() {
 		return webSocketSession != null && webSocketSession.isOpen();
 	}
 
@@ -59,17 +77,4 @@ public class MagicConsoleSession {
 	public void setSessionId(String sessionId) {
 		this.sessionId = sessionId;
 	}
-
-	public static MagicConsoleSession from(WebSocketSession session){
-		MagicConsoleSession magicConsoleSession = cached.get(session.getId());
-		if(magicConsoleSession == null){
-			magicConsoleSession = new MagicConsoleSession(session);
-			cached.put(session.getId(), magicConsoleSession);
-		}
-		return magicConsoleSession;
-	}
-
-	public static void remove(WebSocketSession session){
-		cached.remove(session.getId());
-	}
 }

+ 6 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/MagicEntity.java

@@ -1,5 +1,10 @@
 package org.ssssssss.magicapi.model;
 
+/**
+ * 接口、函数信息基类
+ *
+ * @author mxd
+ */
 public class MagicEntity extends Attributes<Object> implements Cloneable {
 
 	protected String id;
@@ -72,6 +77,7 @@ public class MagicEntity extends Attributes<Object> implements Cloneable {
 		this.lock = lock;
 	}
 
+	@Override
 	public MagicEntity clone() {
 		try {
 			return (MagicEntity) super.clone();

+ 6 - 1
magic-api/src/main/java/org/ssssssss/magicapi/model/MagicNotify.java

@@ -1,5 +1,10 @@
 package org.ssssssss.magicapi.model;
 
+/**
+ * 消息通知对象
+ *
+ * @author mxd
+ */
 public class MagicNotify {
 
 	/**
@@ -133,7 +138,7 @@ public class MagicNotify {
 			default:
 				builder.append("未知");
 		}
-		if(action != Constants.NOTIFY_ACTION_ALL && action < Constants.NOTIFY_WS_C_S){
+		if (action != Constants.NOTIFY_ACTION_ALL && action < Constants.NOTIFY_WS_C_S) {
 			builder.append(", type=");
 			switch (type) {
 				case Constants.NOTIFY_ACTION_API:

+ 24 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/Options.java

@@ -1,11 +1,35 @@
 package org.ssssssss.magicapi.model;
 
+/**
+ * 接口选项信息
+ *
+ * @author mxd
+ */
 public enum Options {
 
+	/**
+	 * 包装请求参数到一个变量中
+	 */
 	WRAP_REQUEST_PARAMETERS("包装请求参数到一个变量中", "wrap_request_parameter"),
+
+	/**
+	 * 允许拥有该权限的访问
+	 */
 	PERMISSION("允许拥有该权限的访问", "permission"),
+
+	/**
+	 * 允许拥有该角色的访问
+	 */
 	ROLE("允许拥有该角色的访问", "role"),
+
+	/**
+	 * 该接口需要登录才允许访问
+	 */
 	REQUIRE_LOGIN("该接口需要登录才允许访问", "require_login", "true"),
+
+	/**
+	 * 该接口需要不登录也可访问
+	 */
 	ANONYMOUS("该接口需要不登录也可访问", "anonymous", "true");
 
 	private final String name;

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/Page.java

@@ -2,6 +2,8 @@ package org.ssssssss.magicapi.model;
 
 /**
  * 分页对象
+ *
+ * @author mxd
  */
 public class Page {
 

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/PageResult.java

@@ -4,6 +4,8 @@ import java.util.List;
 
 /**
  * 分页执行结果
+ *
+ * @author mxd
  */
 public class PageResult<T> {
 

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/Parameter.java

@@ -1,5 +1,10 @@
 package org.ssssssss.magicapi.model;
 
+/**
+ * 参数信息
+ *
+ * @author mxd
+ */
 public class Parameter extends BaseDefinition {
 
 	public Parameter() {

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/Path.java

@@ -1,5 +1,10 @@
 package org.ssssssss.magicapi.model;
 
+/**
+ * 路径变量信息
+ *
+ * @author mxd
+ */
 public class Path extends BaseDefinition {
 
 	public Path() {

+ 12 - 15
magic-api/src/main/java/org/ssssssss/magicapi/model/RequestEntity.java

@@ -11,24 +11,21 @@ import java.util.stream.Collectors;
 
 import static org.ssssssss.magicapi.model.Constants.*;
 
+/**
+ * 请求信息
+ *
+ * @author mxd
+ */
 public class RequestEntity {
 
+	private final Long requestTime = System.currentTimeMillis();
+	private final String requestId = UUID.randomUUID().toString().replace("-", "");
 	private ApiInfo apiInfo;
-
 	private HttpServletRequest request;
-
 	private HttpServletResponse response;
-
 	private boolean requestedFromTest;
-
 	private Map<String, Object> parameters;
-
 	private Map<String, Object> pathVariables;
-
-	private final Long requestTime = System.currentTimeMillis();
-
-	private final String requestId = UUID.randomUUID().toString().replace("-", "");
-
 	private MagicScriptContext magicScriptContext;
 
 	private Map<String, Object> headers;
@@ -100,14 +97,14 @@ public class RequestEntity {
 		return requestedFromTest;
 	}
 
-	public boolean isRequestedFromDebug(){
-		return requestedFromTest && !getRequestedBreakpoints().isEmpty();
-	}
-
 	public void setRequestedFromTest(boolean requestedFromTest) {
 		this.requestedFromTest = requestedFromTest;
 	}
 
+	public boolean isRequestedFromDebug() {
+		return requestedFromTest && !getRequestedBreakpoints().isEmpty();
+	}
+
 	public Map<String, Object> getParameters() {
 		return parameters;
 	}
@@ -151,7 +148,7 @@ public class RequestEntity {
 	/**
 	 * 获取 RequestBody
 	 */
-	public Object getRequestBody(){
+	public Object getRequestBody() {
 		return magicScriptContext == null ? null : this.magicScriptContext.get(VAR_NAME_REQUEST_BODY);
 	}
 

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/SelectedResource.java

@@ -1,5 +1,10 @@
 package org.ssssssss.magicapi.model;
 
+/**
+ * 选择的资源
+ *
+ * @author mxd
+ */
 public class SelectedResource {
 
 	private String id;

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/TreeNode.java

@@ -4,6 +4,11 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.function.Function;
 
+/**
+ * 树形结构
+ *
+ * @author mxd
+ */
 public class TreeNode<T> {
 
 	private T node;

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/modules/AssertModule.java

@@ -9,6 +9,8 @@ import java.util.regex.Pattern;
 
 /**
  * 断言模块
+ *
+ * @author mxd
  */
 public class AssertModule implements MagicModule {
 

+ 13 - 9
magic-api/src/main/java/org/ssssssss/magicapi/modules/BoundSql.java

@@ -1,6 +1,5 @@
 package org.ssssssss.magicapi.modules;
 
-import org.ssssssss.magicapi.cache.SqlCache;
 import org.ssssssss.magicapi.context.RequestContext;
 import org.ssssssss.magicapi.interceptor.SQLInterceptor;
 import org.ssssssss.script.MagicScriptContext;
@@ -17,15 +16,20 @@ import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
+/**
+ * SQL参数处理
+ *
+ * @author mxd
+ */
 public class BoundSql {
 
-	private static final GenericTokenParser concatTokenParser = new GenericTokenParser("${", "}", false);
+	private static final GenericTokenParser CONCAT_TOKEN_PARSER = new GenericTokenParser("${", "}", false);
 
-	private static final GenericTokenParser replaceTokenParser = new GenericTokenParser("#{", "}", true);
+	private static final GenericTokenParser REPLACE_TOKEN_PARSER = new GenericTokenParser("#{", "}", true);
 
-	private static final GenericTokenParser ifTokenParser = new GenericTokenParser("?{", "}", true);
+	private static final GenericTokenParser IF_TOKEN_PARSER = new GenericTokenParser("?{", "}", true);
 
-	private static final GenericTokenParser ifParamTokenParser = new GenericTokenParser("?{", ",", true);
+	private static final GenericTokenParser IF_PARAM_TOKEN_PARSER = new GenericTokenParser("?{", ",", true);
 
 	private static final Pattern REPLACE_MULTI_WHITE_LINE = Pattern.compile("(\r?\n(\\s*\r?\n)+)");
 
@@ -46,18 +50,18 @@ public class BoundSql {
 	private BoundSql(String sql) {
 		MagicScriptContext context = MagicScriptContext.get();
 		// 处理?{}参数
-		this.sql = ifTokenParser.parse(sql.trim(), text -> {
+		this.sql = IF_TOKEN_PARSER.parse(sql.trim(), text -> {
 			AtomicBoolean ifTrue = new AtomicBoolean(false);
-			String val = ifParamTokenParser.parse("?{" + text, param -> {
+			String val = IF_PARAM_TOKEN_PARSER.parse("?{" + text, param -> {
 				ifTrue.set(BooleanLiteral.isTrue(context.eval(param)));
 				return null;
 			});
 			return ifTrue.get() ? val : "";
 		});
 		// 处理${}参数
-		this.sql = concatTokenParser.parse(this.sql, text -> String.valueOf(context.eval(text)));
+		this.sql = CONCAT_TOKEN_PARSER.parse(this.sql, text -> String.valueOf(context.eval(text)));
 		// 处理#{}参数
-		this.sql = replaceTokenParser.parse(this.sql, text -> {
+		this.sql = REPLACE_TOKEN_PARSER.parse(this.sql, text -> {
 			Object value = context.eval(text);
 			if (value == null) {
 				parameters.add(null);

+ 5 - 0
magic-api/src/main/java/org/ssssssss/magicapi/modules/EnvModule.java

@@ -4,6 +4,11 @@ import org.springframework.core.env.Environment;
 import org.ssssssss.magicapi.config.MagicModule;
 import org.ssssssss.script.annotation.Comment;
 
+/**
+ * env模块
+ *
+ * @author mxd
+ */
 public class EnvModule implements MagicModule {
 
 	private final Environment environment;

+ 4 - 3
magic-api/src/main/java/org/ssssssss/magicapi/modules/HttpModule.java

@@ -16,6 +16,7 @@ import java.util.stream.Collectors;
 /**
  * http 模块
  *
+ * @author mxd
  * @since 1.1.0
  */
 public class HttpModule implements MagicModule {
@@ -154,13 +155,13 @@ public class HttpModule implements MagicModule {
 	@Comment("执行请求")
 	public ResponseEntity<Object> execute() {
 		if (!this.params.isEmpty()) {
-			String params = this.params.entrySet().stream()
+			String queryString = this.params.entrySet().stream()
 					.map(it -> it.getValue().stream()
 							.map(value -> it.getKey() + "=" + value)
 							.collect(Collectors.joining("&"))
 					).collect(Collectors.joining("&"));
-			if (StringUtils.isNotBlank(params)) {
-				this.url += (this.url.contains("?") ? "&" : "?") + params;
+			if (StringUtils.isNotBlank(queryString)) {
+				this.url += (this.url.contains("?") ? "&" : "?") + queryString;
 			}
 		}
 		if (!this.data.isEmpty()) {

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/modules/MongoCollectionExtension.java

@@ -13,6 +13,8 @@ import java.util.stream.Collectors;
 
 /**
  * MongoCollection方法扩展
+ *
+ * @author mxd
  */
 public class MongoCollectionExtension {
 

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/modules/MongoFindIterableExtension.java

@@ -11,6 +11,8 @@ import java.util.Map;
 
 /**
  * Mongo FindIterable 方法扩展
+ *
+ * @author mxd
  */
 public class MongoFindIterableExtension {
 

+ 2 - 2
magic-api/src/main/java/org/ssssssss/magicapi/modules/MongoModule.java

@@ -10,14 +10,14 @@ import org.springframework.data.mongodb.core.MongoTemplate;
 import org.ssssssss.magicapi.config.MagicModule;
 import org.ssssssss.magicapi.model.Constants;
 import org.ssssssss.magicapi.utils.Invoker;
-import org.ssssssss.script.reflection.JavaInvoker;
 import org.ssssssss.script.reflection.JavaReflection;
 
-import java.lang.reflect.Method;
 import java.util.HashMap;
 
 /**
  * mongo模块
+ *
+ * @author mxd
  */
 public class MongoModule extends HashMap<String, Object> implements MagicModule {
 

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/modules/RedisModule.java

@@ -11,6 +11,8 @@ import java.util.List;
 
 /**
  * redis模块
+ *
+ * @author mxd
  */
 public class RedisModule implements MagicModule, DynamicMethod {
 

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/modules/RequestModule.java

@@ -14,6 +14,8 @@ import java.util.stream.Collectors;
 
 /**
  * request 模块
+ *
+ * @author mxd
  */
 public class RequestModule {
 

+ 4 - 1
magic-api/src/main/java/org/ssssssss/magicapi/modules/ResponseModule.java

@@ -23,6 +23,8 @@ import java.util.Map;
 
 /**
  * response模块
+ *
+ * @author mxd
  */
 public class ResponseModule {
 
@@ -53,7 +55,7 @@ public class ResponseModule {
 	 */
 	@Comment("返回自定义分页结果")
 	public Object page(@Comment("总条数") long total, @Comment("当前结果集") List<Map<String, Object>> values) {
-		return resultProvider.buildPageResult(RequestContext.getRequestEntity(),null, total, values);
+		return resultProvider.buildPageResult(RequestContext.getRequestEntity(), null, total, values);
 	}
 
 	/**
@@ -129,6 +131,7 @@ public class ResponseModule {
 
 	/**
 	 * 获取OutputStream
+	 *
 	 * @since 1.2.3
 	 */
 	@Comment("获取OutputStream")

部分文件因为文件数量过多而无法显示