From a160d838f9c0a79dfc2f18e7cd46bdd4faa59c6d Mon Sep 17 00:00:00 2001
From: yj <2077506045@qq.com>
Date: 星期四, 05 十二月 2024 11:21:50 +0800
Subject: [PATCH] add

---
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/Range.java               |   27 +
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/model/GatewayResponse.java                |   19 
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/util/GeneratorUtil.java                   |   45 ++
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/enums/EmptyEnums.java                     |   22 +
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/entiy/SuperDTO.java                       |   19 
 dobbinfw-core/.gitignore                                                                     |   28 +
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/enums/BaseEnums.java                      |   76 +++
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/ServiceException.java           |   47 ++
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/entiy/inter/IdentityOwner.java            |   14 
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/AppServiceException.java        |   15 
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/ThirdPartServiceException.java  |   17 
 dobbinfw-core/pom.xml                                                                        |   86 ++++
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/doc/ApiEntity.java             |   21 +
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/HttpParamType.java             |   20 
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/HttpMethod.java                |   34 +
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/util/ISessionUtil.java                    |   28 +
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/HttpParam.java                 |   35 +
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/TextFormat.java          |   41 +
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/CustomCheck.java         |   27 +
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/build/AnnotationProcessor.java            |   26 +
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/BizServiceException.java        |   15 
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/entiy/inter/PermissionOwner.java          |   16 
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/AdminServiceException.java      |   20 
 dobbinfw-core/README.md                                                                      |   40 +
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/ResultType.java                |   13 
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/Validator.java           |   16 
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/Const.java                                |   49 ++
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/RateLimitType.java             |   17 
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/doc/ApiField.java              |   26 +
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/CoreExceptionDefinition.java    |   25 +
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/util/ReflectUtil.java                     |  223 ++++++++++
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/NotNull.java             |   23 +
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/HttpOpenApi.java               |   20 
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/ServiceExceptionDefinition.java |   13 
 dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/util/SessionUtil.java                     |   83 +++
 35 files changed, 1,246 insertions(+), 0 deletions(-)

diff --git a/dobbinfw-core/.gitignore b/dobbinfw-core/.gitignore
new file mode 100644
index 0000000..9f55144
--- /dev/null
+++ b/dobbinfw-core/.gitignore
@@ -0,0 +1,28 @@
+# Compiled class file
+*.class
+
+/target
+
+/.idea
+*.iml
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
diff --git a/dobbinfw-core/README.md b/dobbinfw-core/README.md
new file mode 100644
index 0000000..b59457e
--- /dev/null
+++ b/dobbinfw-core/README.md
@@ -0,0 +1,40 @@
+## Dobbin Framework Logo
+
+#### 涓�銆侀」鐩儗鏅�
+
+> 涓轰簡蹇�熻惤鍦伴」鐩�佸揩閫熸惌寤鸿剼鎵嬫灦锛宒obbinsoft寮�鍙戜竴濂楀熀浜嶴pringBoot MyBatis鐨勬鏋讹紝骞舵墜鎼撲簡濡傚弬鏁版牎楠屻�佹枃妗g敓鎴愩�侀檺娴併�侀壌鏉冪瓑绛夊父鐢ㄥ姛鑳姐�俢ore鍖呬腑鍖呮嫭宸ュ叿绫汇�佹敞瑙c�佹ā鍨嬬瓑銆�
+
+#### 浜屻�佸揩閫熷紑濮�
+
+##### 2.1. 涓嬭浇浠g爜
+
+鎮ㄥ彲浠ュ湪鍥藉唴寮�婧愮ぞ鍖篏itee涓嬭浇锛堟帹鑽愶級锛歨ttps://gitee.com/iotechn/dobbinfw-core
+
+鎮ㄥ彲浠ュ湪鍥介檯寮�婧愮ぞ鍖篏ithub涓嬭浇锛歨ttps://github.com/iotechn/dobbinfw-core
+
+##### 2.2. maven寮曞叆
+
+璇风‘瀹氭偍宸茬粡灏� JAVA_HOME 閰嶇疆锛屽苟灏唌vn鍛戒护閰嶇疆鍒癙ATH涓紝鑻ュ嚭鐜版壘涓嶅埌鍛戒护锛屾垨鎵句笉鍒癑AVA_HOME锛孾璇峰弬鑰冩鏂囨。](https://blog.csdn.net/weixin_44548718/article/details/108635409)
+
+鍦ㄩ」鐩牴鐩綍锛屾墦寮�鍛戒护琛屻�傚苟鎵ц 锛�
+
+```shell
+mvn install -Dmaven.test.skip=true
+```
+
+寮曞叆maven鍧愭爣鍒板伐绋媝om.xml鏂囦欢涓��
+
+```xml
+<groupId>com.dobbinsoft</groupId>
+<artifactId>fw-core</artifactId>
+<version>1.0-SNAPSHOT</version>
+```
+
+#### 涓夈�佸父瑙侀棶棰�
+
+##### 3.1. 涓轰綍鍒嗙core鍖咃紵
+
+閮ㄥ垎椤圭洰锛岄渶瑕佹媶鍒嗗井鏈嶅姟锛岃繖绫婚」鐩渶瑕佸皢鎺ュ彛鏆撮湶缁欏叾浠栧井鏈嶅姟绯荤粺锛岄�氬父鎻愪緵涓�涓猘pi鍖咃紝api鍖呬笉闇�瑕佸紩鍏ヨ繃閲嶄緷璧栵紝浣跨敤姝ゆ鏋跺垯鍙渶瑕佸紩鍏ore鍖呭嵆鍙��
+
+#### 鍥涖�佽础鐚� & 绀惧尯
+鎮ㄥ彲浠ョ洿鎺ュ湪浠撳簱涓彂甯働ull Request銆傛湰椤圭洰娆㈣繋鎵�鏈夊紑鍙戣�呬竴璧风淮鎶わ紝骞舵案涔呭紑婧愩��
\ No newline at end of file
diff --git a/dobbinfw-core/pom.xml b/dobbinfw-core/pom.xml
new file mode 100644
index 0000000..c825fe9
--- /dev/null
+++ b/dobbinfw-core/pom.xml
@@ -0,0 +1,86 @@
+<?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"
+         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>
+
+    <groupId>com.dobbinsoft</groupId>
+    <artifactId>fw-core</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>8</source>
+                    <target>8</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <!-- 閰嶇疆缂栬瘧鏃朵繚鐣欏弬鏁板悕 -->
+                <configuration>
+                    <debuglevel>lines,vars,source</debuglevel>
+                    <compilerArgs>
+                        <arg>-parameters</arg>
+                    </compilerArgs>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+
+        <!-- HuTool 宸ュ叿鍖� -->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.6.0</version>
+        </dependency>
+
+        <!-- 闃块噷宸村反 json 瑙f瀽 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.76</version>
+        </dependency>
+
+        <!-- 鑵捐浜戠煭淇� -->
+        <dependency>
+            <groupId>com.github.qcloudsms</groupId>
+            <artifactId>qcloudsms</artifactId>
+            <version>1.0.5</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>4.1.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.4</version>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
+
+    </dependencies>
+	
+	<distributionManagement>
+		<repository>
+			<id>rdc-snapshot</id>
+            <name>Aliyun Xiao</name>
+			<url>https://packages.aliyun.com/maven/repository/2084582-snapshot-Vrq4iK/</url>
+		</repository>
+	</distributionManagement>
+
+
+</project>
\ No newline at end of file
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/Const.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/Const.java
new file mode 100644
index 0000000..0974965
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/Const.java
@@ -0,0 +1,49 @@
+package com.dobbinsoft.fw.core;
+
+import java.util.*;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:
+ * User: rize
+ * Date: 2018-08-11
+ * Time: 涓嬪崍11:43
+ */
+public class Const {
+
+    public static final Set<Class> IGNORE_PARAM_LIST = new HashSet<Class>();
+
+    static {
+        IGNORE_PARAM_LIST.add(boolean.class);
+        IGNORE_PARAM_LIST.add(byte.class);
+        IGNORE_PARAM_LIST.add(char.class);
+        IGNORE_PARAM_LIST.add(short.class);
+        IGNORE_PARAM_LIST.add(int.class);
+        IGNORE_PARAM_LIST.add(long.class);
+        IGNORE_PARAM_LIST.add(float.class);
+        IGNORE_PARAM_LIST.add(double.class);
+        IGNORE_PARAM_LIST.add(Byte.class);
+        IGNORE_PARAM_LIST.add(Character.class);
+        IGNORE_PARAM_LIST.add(Short.class);
+        IGNORE_PARAM_LIST.add(Integer.class);
+        IGNORE_PARAM_LIST.add(Long.class);
+        IGNORE_PARAM_LIST.add(String.class);
+        IGNORE_PARAM_LIST.add(Float.class);
+        IGNORE_PARAM_LIST.add(Double.class);
+        IGNORE_PARAM_LIST.add(Boolean.class);
+    }
+
+    public static final int CACHE_ONE_DAY = 60 * 60 * 24;
+
+    public static final int CACHE_ONE_YEAR = 60 * 60 * 24 * 365;
+
+
+    public static final String USER_ACCESS_TOKEN = "ACCESSTOKEN";
+
+    public static final String USER_REDIS_PREFIX = "USER_SESSION_";
+
+    public static final String ADMIN_ACCESS_TOKEN = "ADMINTOKEN";
+
+    public static final String ADMIN_REDIS_PREFIX = "ADMIN_SESSION_";
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/HttpMethod.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/HttpMethod.java
new file mode 100644
index 0000000..a8b9466
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/HttpMethod.java
@@ -0,0 +1,34 @@
+package com.dobbinsoft.fw.core.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:
+ * User: rize
+ * Date: 2018-03-25
+ * Time: 涓嬪崍1:12
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface HttpMethod {
+    String description();
+    ResultType type() default ResultType.COMMONS;
+    RateLimitType rateLimit() default RateLimitType.NONE;
+    int rateWindow() default 60;
+    int rate() default 1;
+    String retName() default "";
+    int maxAge() default -1;
+    String permission() default "";
+    String permissionParentName() default "";
+    String permissionName() default "";
+    boolean openPlatform() default false;
+    /**
+     * 浠庣綉鍏充笂鏋勫缓涓�涓疄渚�
+     * @return
+     */
+    Class loadBean() default void.class;
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/HttpOpenApi.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/HttpOpenApi.java
new file mode 100644
index 0000000..047f9be
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/HttpOpenApi.java
@@ -0,0 +1,20 @@
+package com.dobbinsoft.fw.core.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:
+ * User: rize
+ * Date: 2018-03-25
+ * Time: 涓嬪崍1:12
+ */
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface HttpOpenApi {
+    String group();
+    String description();
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/HttpParam.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/HttpParam.java
new file mode 100644
index 0000000..8501260
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/HttpParam.java
@@ -0,0 +1,35 @@
+package com.dobbinsoft.fw.core.annotation;
+
+import com.dobbinsoft.fw.core.enums.BaseEnums;
+import com.dobbinsoft.fw.core.enums.EmptyEnums;
+
+import java.lang.annotation.*;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:
+ * User: rize
+ * Date: 2018-03-25
+ * Time: 涓嬪崍1:12
+ */
+@Target(ElementType.PARAMETER)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface HttpParam {
+
+    String name();
+
+    HttpParamType type() default HttpParamType.COMMON;
+
+    String description() default "";
+
+    String valueDef() default "";
+
+    Class arrayClass() default Object.class;
+
+    /**
+     * 缁戝畾鏋氫妇
+     * @return
+     */
+    Class<? extends BaseEnums> enums() default EmptyEnums.class;
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/HttpParamType.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/HttpParamType.java
new file mode 100644
index 0000000..4f9dc08
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/HttpParamType.java
@@ -0,0 +1,20 @@
+package com.dobbinsoft.fw.core.annotation;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:
+ * User: rize
+ * Date: 2018-03-25
+ * Time: 涓嬪崍1:12
+ */
+
+public enum HttpParamType {
+    HEADER,
+    COMMON,
+    USER_ID,
+    ADMIN_ID,
+    IP,
+    FILE
+    ;
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/RateLimitType.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/RateLimitType.java
new file mode 100644
index 0000000..f19370f
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/RateLimitType.java
@@ -0,0 +1,17 @@
+package com.dobbinsoft.fw.core.annotation;
+
+/**
+ * ClassName: RateLimitType
+ * Description: TODO
+ *
+ * @author: e-weichaozheng
+ * @date: 2021-04-12
+ */
+public enum  RateLimitType {
+
+    USER_ID,
+    IP,
+    ALL,
+    NONE
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/ResultType.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/ResultType.java
new file mode 100644
index 0000000..5abb9af
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/ResultType.java
@@ -0,0 +1,13 @@
+package com.dobbinsoft.fw.core.annotation;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:
+ * User: rize
+ * Date: 2018-08-24
+ * Time: 涓嬪崍5:03
+ */
+public enum ResultType {
+    COMMONS,
+    COOKIE;
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/doc/ApiEntity.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/doc/ApiEntity.java
new file mode 100644
index 0000000..a312f46
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/doc/ApiEntity.java
@@ -0,0 +1,21 @@
+package com.dobbinsoft.fw.core.annotation.doc;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description: 鎻忚堪瀹炰綋
+ * User: rize
+ * Date: 2021-03-17
+ * Time: 涓婂崍9:15
+ */
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ApiEntity {
+
+    String description();
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/doc/ApiField.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/doc/ApiField.java
new file mode 100644
index 0000000..248f080
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/doc/ApiField.java
@@ -0,0 +1,26 @@
+package com.dobbinsoft.fw.core.annotation.doc;
+
+import com.dobbinsoft.fw.core.enums.BaseEnums;
+import com.dobbinsoft.fw.core.enums.EmptyEnums;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description: 鎻忚堪瀹炰綋灞炴��
+ * User: rize
+ * Date: 2021-03-17
+ * Time: 涓婂崍9:15
+ */
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ApiField {
+
+    String description();
+
+    Class<? extends BaseEnums> enums() default EmptyEnums.class;
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/CustomCheck.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/CustomCheck.java
new file mode 100644
index 0000000..42a6808
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/CustomCheck.java
@@ -0,0 +1,27 @@
+package com.dobbinsoft.fw.core.annotation.param;
+
+import java.lang.annotation.*;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description: 鑷畾涔夊弬鏁版牎楠�
+ * User: rize
+ * Date: 2021-03-17
+ * Time: 涓婂崍9:15
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.PARAMETER, ElementType.FIELD})
+@Documented
+public @interface CustomCheck {
+
+    /**
+     * 鏍¢獙鍣–lass瀵硅薄锛屼細浠嶪oC涓嬁鍙�
+     * @return
+     */
+    Class beanClass();
+
+    boolean reqScope() default true;
+
+    boolean respScope() default false;
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/NotNull.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/NotNull.java
new file mode 100644
index 0000000..acc0ad0
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/NotNull.java
@@ -0,0 +1,23 @@
+package com.dobbinsoft.fw.core.annotation.param;
+
+import java.lang.annotation.*;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:
+ * User: rize
+ * Date: 2018-08-20
+ * Time: 涓婂崍10:51
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.PARAMETER, ElementType.FIELD})
+@Documented
+public @interface NotNull {
+
+    String message() default "";
+
+    boolean reqScope() default true;
+
+    boolean respScope() default false;
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/Range.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/Range.java
new file mode 100644
index 0000000..f17b6ac
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/Range.java
@@ -0,0 +1,27 @@
+package com.dobbinsoft.fw.core.annotation.param;
+
+import java.lang.annotation.*;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:
+ * User: rize
+ * Date: 2018-08-20
+ * Time: 涓婂崍11:11
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.PARAMETER, ElementType.FIELD})
+@Documented
+public @interface Range {
+
+    long min() default Long.MIN_VALUE;
+
+    long max() default Long.MAX_VALUE;
+
+    String message() default "";
+
+    boolean reqScope() default true;
+
+    boolean respScope() default false;
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/TextFormat.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/TextFormat.java
new file mode 100644
index 0000000..566b412
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/TextFormat.java
@@ -0,0 +1,41 @@
+package com.dobbinsoft.fw.core.annotation.param;
+
+import java.lang.annotation.*;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:
+ * User: rize
+ * Date: 2018-08-20
+ * Time: 涓婂崍10:51
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.PARAMETER, ElementType.FIELD})
+@Documented
+public @interface TextFormat {
+
+    String regex() default "";
+
+    String[] contains() default {};
+
+    String[] notContains() default {};
+
+    String startWith() default "";
+
+    String endsWith() default "";
+
+    int lengthMax() default Integer.MAX_VALUE;
+
+    int lengthMin() default 0;
+
+    int length() default -1;
+
+    boolean notChinese() default false;
+
+    String message() default "";
+
+    boolean reqScope() default true;
+
+    boolean respScope() default false;
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/Validator.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/Validator.java
new file mode 100644
index 0000000..8b8d01b
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/annotation/param/Validator.java
@@ -0,0 +1,16 @@
+package com.dobbinsoft.fw.core.annotation.param;
+
+import com.dobbinsoft.fw.core.exception.ServiceException;
+
+/**
+ * ClassName: Validator
+ * Description: 鏍¢獙鍣�
+ *
+ * @author: e-weichaozheng
+ * @date: 2021-03-17
+ */
+public interface Validator<T> {
+
+    public boolean check(T param) throws ServiceException;
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/build/AnnotationProcessor.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/build/AnnotationProcessor.java
new file mode 100644
index 0000000..e2dca38
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/build/AnnotationProcessor.java
@@ -0,0 +1,26 @@
+package com.dobbinsoft.fw.core.build;
+
+import javax.annotation.processing.AbstractProcessor;
+import javax.annotation.processing.RoundEnvironment;
+import javax.annotation.processing.SupportedAnnotationTypes;
+import javax.annotation.processing.SupportedSourceVersion;
+import javax.lang.model.SourceVersion;
+import javax.lang.model.element.TypeElement;
+import java.util.Set;
+
+/**
+ * Description:
+ * User: rize
+ * Date: 2021/4/4
+ * Time: 13:57
+ */
+@SupportedAnnotationTypes(value = {"com.dobbinsoft.fw.support.annotation.Table"})
+@SupportedSourceVersion(value = SourceVersion.RELEASE_8)
+public class AnnotationProcessor extends AbstractProcessor {
+
+    @Override
+    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+
+        return true;
+    }
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/entiy/SuperDTO.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/entiy/SuperDTO.java
new file mode 100644
index 0000000..f7930a7
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/entiy/SuperDTO.java
@@ -0,0 +1,19 @@
+package com.dobbinsoft.fw.core.entiy;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * Created by rize on 2019/7/1.
+ */
+@Data
+public class SuperDTO {
+
+    private Long id;
+
+    private Date gmtUpdate;
+
+    private Date gmtCreate;
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/entiy/inter/IdentityOwner.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/entiy/inter/IdentityOwner.java
new file mode 100644
index 0000000..c363492
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/entiy/inter/IdentityOwner.java
@@ -0,0 +1,14 @@
+package com.dobbinsoft.fw.core.entiy.inter;
+
+/**
+ * ClassName: IdentityOwner
+ * Description: 鏈夎韩浠界殑
+ *
+ * @author: e-weichaozheng
+ * @date: 2021-03-17
+ */
+public interface IdentityOwner {
+
+    public Long getId();
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/entiy/inter/PermissionOwner.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/entiy/inter/PermissionOwner.java
new file mode 100644
index 0000000..816f7dd
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/entiy/inter/PermissionOwner.java
@@ -0,0 +1,16 @@
+package com.dobbinsoft.fw.core.entiy.inter;
+
+import java.util.List;
+
+/**
+ * ClassName: PermissionOwner
+ * Description: 琛ㄧず涓�涓湁鏉冮檺鐨勮韩浠�
+ *
+ * @author: e-weichaozheng
+ * @date: 2021-03-16
+ */
+public interface PermissionOwner extends IdentityOwner {
+
+    public List<String> getPerms();
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/enums/BaseEnums.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/enums/BaseEnums.java
new file mode 100644
index 0000000..36a3193
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/enums/BaseEnums.java
@@ -0,0 +1,76 @@
+package com.dobbinsoft.fw.core.enums;
+
+import cn.hutool.core.util.StrUtil;
+
+import java.io.Serializable;
+
+/**
+ * ClassName: BaseEnums
+ * Description: TODO
+ *
+ * @author: e-weichaozheng
+ * @date: 2021-03-19
+ */
+public interface BaseEnums<T extends Serializable> {
+
+    public Serializable getCode();
+
+    public String getMsg();
+
+    public static <T extends Serializable> BaseEnums getByCode(T t, Class<? extends BaseEnums<T>> clazz) {
+        BaseEnums<T>[] enumConstants = clazz.getEnumConstants();
+        for (BaseEnums baseEnums : enumConstants) {
+            if (baseEnums.getCode().equals(t)) {
+                return baseEnums;
+            }
+        }
+        return null;
+    }
+
+    public static <T extends Serializable> String getMsgByCode(T t, Class<? extends BaseEnums<T>> clazz) {
+        BaseEnums baseEnums = getByCode(t, clazz);
+        if (baseEnums == null) {
+            return null;
+        }
+        return baseEnums.getMsg();
+    }
+
+    /**
+     * 鑾峰彇鍓嶇鏍煎紡鍖栭渶瑕佺殑MAP
+     * @return
+     */
+    public default String getMap() {
+        Class<? extends BaseEnums> clazz = this.getClass();
+        BaseEnums[] enumConstants = clazz.getEnumConstants();
+        StringBuilder sb = new StringBuilder();
+        sb.append("const ");
+        sb.append(StrUtil.lowerFirst(clazz.getSimpleName()));
+        sb.append("Map = {\n");
+
+        for (int i = 0; i < enumConstants.length; i++) {
+            sb.append("  ");
+            sb.append(enumConstants[i].getCode());
+            sb.append(": '");
+            sb.append(enumConstants[i].getMsg());
+            if (i == enumConstants.length -1) {
+                sb.append("'\n}");
+            } else {
+                sb.append("',\n");
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 鑾峰彇鍓嶇鏍煎紡鍖栭渶瑕佺殑杩囨护鍣�
+     * @return
+     */
+    public default String getFilter() {
+        Class<? extends BaseEnums> clazz = this.getClass();
+        return
+                "    " + StrUtil.lowerFirst(clazz.getSimpleName()) + "Filter(status) {\n" +
+                "      return " + StrUtil.lowerFirst(clazz.getSimpleName()) + "Map[status]\n" +
+                "    }";
+    }
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/enums/EmptyEnums.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/enums/EmptyEnums.java
new file mode 100644
index 0000000..ca52b58
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/enums/EmptyEnums.java
@@ -0,0 +1,22 @@
+package com.dobbinsoft.fw.core.enums;
+
+import java.io.Serializable;
+
+/**
+ * ClassName: EmptyEnums
+ * Description: TODO
+ *
+ * @author: e-weichaozheng
+ * @date: 2021-03-19
+ */
+public enum EmptyEnums implements BaseEnums<Integer> {
+    ;
+
+    public Integer getCode() {
+        return 0;
+    }
+
+    public String getMsg() {
+        return null;
+    }
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/AdminServiceException.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/AdminServiceException.java
new file mode 100644
index 0000000..be10bdf
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/AdminServiceException.java
@@ -0,0 +1,20 @@
+package com.dobbinsoft.fw.core.exception;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:
+ * User: kbq
+ * Date: 2019-07-07
+ * Time: 涓嬪崍4:21
+ */
+public class AdminServiceException extends ServiceException {
+
+    public AdminServiceException(ServiceExceptionDefinition definition) {
+        super(definition);
+    }
+
+    public AdminServiceException(String message, int code) {
+        super(message,code);
+    }
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/AppServiceException.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/AppServiceException.java
new file mode 100644
index 0000000..cd870b1
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/AppServiceException.java
@@ -0,0 +1,15 @@
+package com.dobbinsoft.fw.core.exception;
+
+/**
+ * Created by rize on 2019/7/1.
+ */
+public class AppServiceException extends ServiceException {
+
+    public AppServiceException(ServiceExceptionDefinition definition) {
+        super(definition);
+    }
+
+    public AppServiceException(String message, int code) {
+        super(message,code);
+    }
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/BizServiceException.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/BizServiceException.java
new file mode 100644
index 0000000..5315077
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/BizServiceException.java
@@ -0,0 +1,15 @@
+package com.dobbinsoft.fw.core.exception;
+
+/**
+ * Created by rize on 2019/7/1.
+ */
+public class BizServiceException extends ServiceException {
+
+    public BizServiceException(ServiceExceptionDefinition definition) {
+        super(definition);
+    }
+
+    public BizServiceException(String message, int code) {
+        super(message,code);
+    }
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/CoreExceptionDefinition.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/CoreExceptionDefinition.java
new file mode 100644
index 0000000..e0ccd23
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/CoreExceptionDefinition.java
@@ -0,0 +1,25 @@
+package com.dobbinsoft.fw.core.exception;
+
+/**
+ * Created by rize on 2019/7/1.
+ */
+public class CoreExceptionDefinition {
+
+    public static final ServiceExceptionDefinition THIRD_PART_SERVICE_EXCEPTION =
+            new ServiceExceptionDefinition(0, "绗笁鏂规湇鍔″紓甯�");
+
+    public static final ServiceExceptionDefinition THIRD_PART_IO_EXCEPTION =
+            new ServiceExceptionDefinition(0, "绗笁鏂规湇鍔$綉缁滃紓甯�");
+
+    public static ServiceExceptionDefinition buildVariableException(ServiceExceptionDefinition definition, String ...args) {
+        String msg = definition.getMsg();
+        for (int i = 0; i < args.length; i++) {
+            msg = msg.replace("${" + i + "}", args[i]);
+        }
+        return new ServiceExceptionDefinition(definition.getCode(), msg);
+    }
+
+
+
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/ServiceException.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/ServiceException.java
new file mode 100644
index 0000000..d4fc41d
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/ServiceException.java
@@ -0,0 +1,47 @@
+package com.dobbinsoft.fw.core.exception;
+
+import java.io.Serializable;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:
+ * User: rize
+ * Date: 2019-01-31
+ * Time: 涓嬪崍8:07
+ */
+public abstract class ServiceException extends Exception implements Serializable {
+
+    private int code;
+
+    private Object attach;
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public Object getAttach() {
+        return attach;
+    }
+
+    public ServiceException() {
+    }
+
+    public ServiceException(String message, int code) {
+        super(message);
+        this.code = code;
+    }
+
+    public ServiceException(ServiceExceptionDefinition definition) {
+        super(definition.getMsg());
+        this.code = definition.getCode();
+    }
+
+    public ServiceException attach(Object attach) {
+        this.attach = attach;
+        return this;
+    }
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/ServiceExceptionDefinition.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/ServiceExceptionDefinition.java
new file mode 100644
index 0000000..a1e9bb3
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/ServiceExceptionDefinition.java
@@ -0,0 +1,13 @@
+package com.dobbinsoft.fw.core.exception;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ServiceExceptionDefinition {
+    private int code;
+    private String msg;
+}
\ No newline at end of file
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/ThirdPartServiceException.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/ThirdPartServiceException.java
new file mode 100644
index 0000000..cc4a6d2
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/exception/ThirdPartServiceException.java
@@ -0,0 +1,17 @@
+package com.dobbinsoft.fw.core.exception;
+
+/**
+ * 绗笁鏂规帴鍙f湇鍔″紓甯�
+ * Created by rize on 2019/7/3.
+ */
+public class ThirdPartServiceException extends ServiceException {
+
+    public ThirdPartServiceException(ServiceExceptionDefinition definition) {
+        super(definition);
+    }
+
+    public ThirdPartServiceException(String message, int code) {
+        super(message, code);
+    }
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/model/GatewayResponse.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/model/GatewayResponse.java
new file mode 100644
index 0000000..b1c12a5
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/model/GatewayResponse.java
@@ -0,0 +1,19 @@
+package com.dobbinsoft.fw.core.model;
+
+import lombok.Data;
+
+/**
+ * Created with IntelliJ IDEA.
+ * Description:
+ * User: rize
+ * Date: 2018-08-12
+ * Time: 涓婂崍10:35
+ */
+@Data
+public class GatewayResponse<T> {
+    private int errno;
+    private String errmsg;
+    private T data;
+    private long timestamp;
+}
+
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/util/GeneratorUtil.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/util/GeneratorUtil.java
new file mode 100644
index 0000000..84d0e89
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/util/GeneratorUtil.java
@@ -0,0 +1,45 @@
+package com.dobbinsoft.fw.core.util;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Created by rize on 2019/7/1.
+ */
+public class GeneratorUtil {
+
+    private static AtomicInteger orderIdCount = new AtomicInteger();
+
+    private static final SimpleDateFormat ORDER_ID_FORMAT = new SimpleDateFormat("yyyyMMHHmmss");
+
+    public static final String genSalt() {
+        return genUUId().substring(0, 7);
+    }
+
+    public static String genSixVerifyCode() {
+        String time = System.nanoTime() + "";
+        return time.substring(time.length() - 6);
+    }
+
+    public static String genSessionId() {
+        return UUID.randomUUID().toString().replace("-","").toUpperCase();
+    }
+
+
+    public static String genOrderId(String machineNo, String env) {
+        int i = orderIdCount.incrementAndGet() % 1000;
+        if (i < 1000)
+            i += 1000;
+        return env + machineNo + ORDER_ID_FORMAT.format(new Date()) + i;
+    }
+
+    public static String genFileName(){
+        return UUID.randomUUID().toString().replaceAll("-", "");
+    }
+
+    public static String genUUId() {
+        return UUID.randomUUID().toString().replace("-", "");
+    }
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/util/ISessionUtil.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/util/ISessionUtil.java
new file mode 100644
index 0000000..5aa94e3
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/util/ISessionUtil.java
@@ -0,0 +1,28 @@
+package com.dobbinsoft.fw.core.util;
+
+import com.dobbinsoft.fw.core.entiy.inter.IdentityOwner;
+import com.dobbinsoft.fw.core.entiy.inter.PermissionOwner;
+import com.dobbinsoft.fw.core.exception.ServiceException;
+
+import java.util.List;
+
+/**
+ * Session 鐩稿叧鎶藉彇鎺ュ彛
+ */
+public interface ISessionUtil<U extends IdentityOwner, A extends PermissionOwner> {
+
+    public void setUser(U userDTO);
+
+    public U getUser();
+
+    public void setAdmin(A adminDTO);
+
+    public A getAdmin();
+
+    public Class<U> getUserClass();
+
+    public Class<A> getAdminClass();
+
+    public boolean hasPerm(String permission) throws ServiceException;
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/util/ReflectUtil.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/util/ReflectUtil.java
new file mode 100644
index 0000000..dca4a05
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/util/ReflectUtil.java
@@ -0,0 +1,223 @@
+package com.dobbinsoft.fw.core.util;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.IoUtil;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.net.JarURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+/**
+ * Description:
+ * User: rize
+ * Date: 2020/8/15
+ * Time: 11:01
+ */
+public class ReflectUtil {
+
+    /**
+     * 閫氳繃Getter鏂规硶鍚嶇О鑾峰彇灞炴��
+     * @param getterName
+     * @return
+     */
+    public static String getField(String getterName) {
+        char[] dst = new char[getterName.length() - 3];
+        getterName.getChars(3, getterName.length(), dst, 0);
+        if ('A' <= dst[0] && 'Z' >= dst[0]) {
+            dst[0] = (char) (dst[0] + 32);
+        }
+        return new String(dst);
+    }
+
+    /**
+     * 閫氳繃灞炴�у悕鑾峰彇 Getter 鎴� Setter
+     * @param fieldName
+     * @param prefix "get" | "set"
+     * @return
+     */
+    public static String getMethodName(String fieldName, String prefix) {
+        char[] dst = new char[fieldName.length() + 3];
+        // 1. 灏唒refix鎼炶繘鍘�
+        prefix.getChars(0, 3, dst, 0);
+        // 2. 璺熼殢鑰冭繘鍘�
+        fieldName.getChars(0, fieldName.length(), dst, 3);
+        if ('a' <= dst[3] && 'z' >= dst[3]) {
+            dst[3] = (char) (dst[3] - 32);
+        }
+        return new String(dst);
+    }
+
+    /**
+     * 鍔犺浇鍖呭瓧鑺傜爜
+     * @return
+     */
+    public static Map<String, byte[]> loadPackageBytes(String basePackage, boolean subPackage, boolean isInterface) {
+        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+        String fsBasePackage = basePackage.replace(".","/");
+        Map<String, byte[]> map = new HashMap<>();
+        try {
+            Enumeration<URL> resources = classLoader.getResources(fsBasePackage);
+            while(resources.hasMoreElements()) {
+                //鍏堣幏寰楁湰绫荤殑鎵�鍦ㄤ綅缃�
+                URL url = resources.nextElement();
+                //url.getProtocol()鏄幏鍙朥RL鐨凥TTP鍗忚銆�
+                if(url.getProtocol().equals("jar")) {
+                    //鍒ゆ柇鏄笉鏄痡ar鍖�
+                    JarURLConnection urlConnection = (JarURLConnection) url.openConnection();
+                    JarFile jarfile = urlConnection.getJarFile();
+                    Enumeration<JarEntry> jarEntries = jarfile.entries();
+                    while(jarEntries.hasMoreElements()) {
+                        JarEntry jarEntry = jarEntries.nextElement();
+                        String jarName = jarEntry.getName();
+                        if(!jarName.endsWith(".class")) {
+                            continue;
+                        }
+                        String className = jarName.replace(".class", "").replaceAll("/", ".");
+                        if (!className.startsWith(basePackage)) {
+                            continue;
+                        }
+                        if (!subPackage) {
+                            if (!className.substring(0, className.lastIndexOf(".")).equals(basePackage)) {
+                                continue;
+                            }
+                        }
+                        if (checkClassType(isInterface, className)) {
+                            continue;
+                        }
+                        InputStream inputStream = null;
+                        try {
+                            String newUrl = url.toString().substring(0, url.toString().lastIndexOf("!") + 2) + jarName;
+                            URL classUrl = new URL(newUrl);
+                            URLConnection classUrlConnection = classUrl.openConnection();
+                            inputStream = classUrlConnection.getInputStream();
+                            byte[] bytes = IoUtil.readBytes(inputStream);
+                            map.put(className, bytes);
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        } finally {
+                            if (inputStream != null) {
+                                inputStream.close();
+                            }
+                        }
+                    }
+                } else if (url.getProtocol().equals("file")) {
+                    // 鏂囦欢绯荤粺锛岃繖鏄湪寮�鍙戠殑鏃跺�欎細鐢ㄥ埌
+                    // file:/D:/develop/workspace/ideawork/unierp/unierp-data/target/classes/com/dobbinsoft/unierp/data/dto
+                    Map<String, File> classNameFileMap = getClassNameFileMap(new HashMap<>(), new File(url.getFile()), basePackage, subPackage);
+                    for (String className : classNameFileMap.keySet()) {
+                        if (checkClassType(isInterface, className)) {
+                            continue;
+                        }
+                        InputStream inputStream = null;
+                        try {
+                            File file = classNameFileMap.get(className);
+                            inputStream = new FileInputStream(file);
+                            byte[] bytes = IoUtil.readBytes(inputStream);
+                            map.put(className, bytes);
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        } finally {
+                            if (inputStream != null) {
+                                inputStream.close();
+                            }
+                        }
+                    }
+                } else {
+                    throw new RuntimeException("涓嶆敮鎸佹湰鍖呭璞★紝璇蜂笉瑕佸皢鎺ュ彛鍜屽疄浣撴斁鍏ュ惎鍔ㄥ櫒涓�");
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    private static boolean checkClassType(boolean isInterface, String className) {
+        try {
+            Class<?> klass = Class.forName(className);
+            if (klass.isAnnotation()
+                    || klass.isEnum()
+                    || klass.isPrimitive()) {
+                return true;
+            }
+            if (isInterface && !klass.isInterface()) {
+                return true;
+            } else if (!isInterface && klass.isInterface()) {
+                return true;
+            }
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+            throw new RuntimeException("鏈壘鍒扮被锛�" + className);
+        }
+        return false;
+    }
+
+    /**
+     * 閫掑綊鑾峰彇baseDir涓嬬殑绫讳笌鏂囦欢鏄犲皠
+     * @param map
+     * @param baseDir
+     * @return
+     */
+    private static Map<String, File> getClassNameFileMap(Map<String, File> map, File baseDir, String basePackage, boolean subPackage) {
+        if (baseDir == null || !baseDir.isDirectory()) {
+            return map;
+        }
+        File[] files = baseDir.listFiles();
+        for (File file : files) {
+            if (file.isDirectory() && subPackage) {
+                // 涓嶈繖涔堝啓 true idea 鎶ラ粍锛岀湅鐫�鑳�鐪肩潧
+                getClassNameFileMap(map, file, basePackage, true);
+            } else if (file.getName().endsWith("class")) {
+                // 鍏煎 Windows
+                String rawPackage = baseDir.toString().replace("\\", ".").replace("/", ".");
+                String className = rawPackage.substring(rawPackage.indexOf(basePackage)) + "." + file.getName().replace(".class", "");
+                map.put(className, file);
+            }
+        }
+        return map;
+    }
+
+
+    /**
+     * 娓呯悊鎺夊璞$殑绌轰覆灞炴��
+     * @param object
+     */
+    public static void clearEmptyString(Object object) {
+        try {
+            Class<?> clazz = object.getClass();
+            Field[] fields = clazz.getFields();
+            for (Field field : fields) {
+                String getter = getMethodName(field.getName(), "get");
+                Method getterMethod = clazz.getMethod(getter);
+                if (getterMethod != null) {
+                    Object res = getterMethod.invoke(object);
+                    if (res != null && res instanceof String) {
+                        // 鑻ユ槸杩斿洖String
+                        if (!"".equals(res)) {
+                            //璁剧疆涓虹┖
+                            String setter = getMethodName(field.getName(), "set");
+                            Method setterMethod = clazz.getMethod(setter);
+                            if (setterMethod != null) {
+                                setterMethod.invoke(object, null);
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}
diff --git a/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/util/SessionUtil.java b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/util/SessionUtil.java
new file mode 100644
index 0000000..fec8a06
--- /dev/null
+++ b/dobbinfw-core/src/main/java/com/dobbinsoft/fw/core/util/SessionUtil.java
@@ -0,0 +1,83 @@
+package com.dobbinsoft.fw.core.util;
+
+
+
+import com.dobbinsoft.fw.core.entiy.inter.IdentityOwner;
+import com.dobbinsoft.fw.core.entiy.inter.PermissionOwner;
+import com.dobbinsoft.fw.core.exception.ServiceException;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.List;
+
+/**
+ * Created by rize on 2019/2/27.
+ * Edit by rize on 2021/3/16.
+ */
+public class SessionUtil<U extends IdentityOwner, A extends PermissionOwner> implements ISessionUtil<U, A> {
+
+    private ThreadLocal<U> userLocal = new ThreadLocal<U>();
+
+    private ThreadLocal<A> adminLocal = new ThreadLocal<A>();
+
+    private Class<U> userClass;
+
+    private Class<A> adminClass;
+
+    public SessionUtil(Class<U> userClass, Class<A> adminClass) {
+        this.userClass = userClass;
+        this.adminClass = adminClass;
+    }
+
+    public void setUser(U userDTO) {
+        userLocal.set(userDTO);
+    }
+
+    public U getUser() {
+        return userLocal.get();
+    }
+
+    public void setAdmin(A adminDTO) {
+        adminLocal.set(adminDTO);
+    }
+
+    public A getAdmin() {
+        return adminLocal.get();
+    }
+
+    public Class<U> getUserClass() {
+        return this.userClass;
+    }
+
+    public Class<A> getAdminClass() {
+        return this.adminClass;
+    }
+
+    public boolean hasPerm(String permission) throws ServiceException {
+        //鎷ユ湁鐨勬潈闄�
+        List<String> perms = getAdmin().getPerms();
+        boolean hasPerm = false;
+        //鐩爣鍖归厤鏉冮檺
+        String[] permissions = permission.split(":");
+        outer : for(String item : perms) {
+            //鎷ユ湁鐨勬潈闄愮偣
+            String[] hasPer = item.split(":");
+            inner : for (int i = 0; i < permissions.length; i++) {
+                if ("*".equals(hasPer[i])) {
+                    hasPerm = true;
+                    break outer;
+                } else if (hasPer[i].equals(permissions[i])){
+                    //姝ゅ眰鍚堟牸
+                    if (i == permissions.length - 1) {
+                        //鑻ユ槸鐩爣灞傜殑鏈�鍚庝竴灞傘�傚垯琛ㄧず鎵�鏈夊眰鏍¢獙閫氳繃
+                        hasPerm = true;
+                    }
+                } else {
+                    break inner;
+                }
+            }
+        }
+        return hasPerm;
+    }
+
+}

--
Gitblit v1.9.1