+{
+ private static final long serialVersionUID = -1185015143654744140L;
+
+ /**
+ * SecureRandom 的单例
+ *
+ */
+ private static class Holder
+ {
+ static final SecureRandom numberGenerator = getSecureRandom();
+ }
+
+ /** 此UUID的最高64有效位 */
+ private final long mostSigBits;
+
+ /** 此UUID的最低64有效位 */
+ private final long leastSigBits;
+
+ /**
+ * 私有构造
+ *
+ * @param data 数据
+ */
+ private UUID(byte[] data)
+ {
+ long msb = 0;
+ long lsb = 0;
+ assert data.length == 16 : "data must be 16 bytes in length";
+ for (int i = 0; i < 8; i++)
+ {
+ msb = (msb << 8) | (data[i] & 0xff);
+ }
+ for (int i = 8; i < 16; i++)
+ {
+ lsb = (lsb << 8) | (data[i] & 0xff);
+ }
+ this.mostSigBits = msb;
+ this.leastSigBits = lsb;
+ }
+
+ /**
+ * 使用指定的数据构造新的 UUID。
+ *
+ * @param mostSigBits 用于 {@code UUID} 的最高有效 64 位
+ * @param leastSigBits 用于 {@code UUID} 的最低有效 64 位
+ */
+ public UUID(long mostSigBits, long leastSigBits)
+ {
+ this.mostSigBits = mostSigBits;
+ this.leastSigBits = leastSigBits;
+ }
+
+ /**
+ * 获取类型 4(伪随机生成的)UUID 的静态工厂。
+ *
+ * @return 随机生成的 {@code UUID}
+ */
+ public static UUID fastUUID()
+ {
+ return randomUUID(false);
+ }
+
+ /**
+ * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。
+ *
+ * @return 随机生成的 {@code UUID}
+ */
+ public static UUID randomUUID()
+ {
+ return randomUUID(true);
+ }
+
+ /**
+ * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。
+ *
+ * @param isSecure 是否使用{@link SecureRandom}如果是可以获得更安全的随机码,否则可以得到更好的性能
+ * @return 随机生成的 {@code UUID}
+ */
+ public static UUID randomUUID(boolean isSecure)
+ {
+ final Random ng = isSecure ? Holder.numberGenerator : getRandom();
+
+ byte[] randomBytes = new byte[16];
+ ng.nextBytes(randomBytes);
+ randomBytes[6] &= 0x0f; /* clear version */
+ randomBytes[6] |= 0x40; /* set to version 4 */
+ randomBytes[8] &= 0x3f; /* clear variant */
+ randomBytes[8] |= 0x80; /* set to IETF variant */
+ return new UUID(randomBytes);
+ }
+
+ /**
+ * 根据指定的字节数组获取类型 3(基于名称的)UUID 的静态工厂。
+ *
+ * @param name 用于构造 UUID 的字节数组。
+ *
+ * @return 根据指定数组生成的 {@code UUID}
+ */
+ public static UUID nameUUIDFromBytes(byte[] name)
+ {
+ MessageDigest md;
+ try
+ {
+ md = MessageDigest.getInstance("MD5");
+ }
+ catch (NoSuchAlgorithmException nsae)
+ {
+ throw new InternalError("MD5 not supported");
+ }
+ byte[] md5Bytes = md.digest(name);
+ md5Bytes[6] &= 0x0f; /* clear version */
+ md5Bytes[6] |= 0x30; /* set to version 3 */
+ md5Bytes[8] &= 0x3f; /* clear variant */
+ md5Bytes[8] |= 0x80; /* set to IETF variant */
+ return new UUID(md5Bytes);
+ }
+
+ /**
+ * 根据 {@link #toString()} 方法中描述的字符串标准表示形式创建{@code UUID}。
+ *
+ * @param name 指定 {@code UUID} 字符串
+ * @return 具有指定值的 {@code UUID}
+ * @throws IllegalArgumentException 如果 name 与 {@link #toString} 中描述的字符串表示形式不符抛出此异常
+ *
+ */
+ public static UUID fromString(String name)
+ {
+ String[] components = name.split("-");
+ if (components.length != 5)
+ {
+ throw new IllegalArgumentException("Invalid UUID string: " + name);
+ }
+ for (int i = 0; i < 5; i++)
+ {
+ components[i] = "0x" + components[i];
+ }
+
+ long mostSigBits = Long.decode(components[0]).longValue();
+ mostSigBits <<= 16;
+ mostSigBits |= Long.decode(components[1]).longValue();
+ mostSigBits <<= 16;
+ mostSigBits |= Long.decode(components[2]).longValue();
+
+ long leastSigBits = Long.decode(components[3]).longValue();
+ leastSigBits <<= 48;
+ leastSigBits |= Long.decode(components[4]).longValue();
+
+ return new UUID(mostSigBits, leastSigBits);
+ }
+
+ /**
+ * 返回此 UUID 的 128 位值中的最低有效 64 位。
+ *
+ * @return 此 UUID 的 128 位值中的最低有效 64 位。
+ */
+ public long getLeastSignificantBits()
+ {
+ return leastSigBits;
+ }
+
+ /**
+ * 返回此 UUID 的 128 位值中的最高有效 64 位。
+ *
+ * @return 此 UUID 的 128 位值中最高有效 64 位。
+ */
+ public long getMostSignificantBits()
+ {
+ return mostSigBits;
+ }
+
+ /**
+ * 与此 {@code UUID} 相关联的版本号. 版本号描述此 {@code UUID} 是如何生成的。
+ *
+ * 版本号具有以下含意:
+ *
+ * - 1 基于时间的 UUID
+ *
- 2 DCE 安全 UUID
+ *
- 3 基于名称的 UUID
+ *
- 4 随机生成的 UUID
+ *
+ *
+ * @return 此 {@code UUID} 的版本号
+ */
+ public int version()
+ {
+ // Version is bits masked by 0x000000000000F000 in MS long
+ return (int) ((mostSigBits >> 12) & 0x0f);
+ }
+
+ /**
+ * 与此 {@code UUID} 相关联的变体号。变体号描述 {@code UUID} 的布局。
+ *
+ * 变体号具有以下含意:
+ *
+ * - 0 为 NCS 向后兼容保留
+ *
- 2 IETF RFC 4122(Leach-Salz), 用于此类
+ *
- 6 保留,微软向后兼容
+ *
- 7 保留供以后定义使用
+ *
+ *
+ * @return 此 {@code UUID} 相关联的变体号
+ */
+ public int variant()
+ {
+ // This field is composed of a varying number of bits.
+ // 0 - - Reserved for NCS backward compatibility
+ // 1 0 - The IETF aka Leach-Salz variant (used by this class)
+ // 1 1 0 Reserved, Microsoft backward compatibility
+ // 1 1 1 Reserved for future definition.
+ return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63));
+ }
+
+ /**
+ * 与此 UUID 相关联的时间戳值。
+ *
+ *
+ * 60 位的时间戳值根据此 {@code UUID} 的 time_low、time_mid 和 time_hi 字段构造。
+ * 所得到的时间戳以 100 毫微秒为单位,从 UTC(通用协调时间) 1582 年 10 月 15 日零时开始。
+ *
+ *
+ * 时间戳值仅在在基于时间的 UUID(其 version 类型为 1)中才有意义。
+ * 如果此 {@code UUID} 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。
+ *
+ * @throws UnsupportedOperationException 如果此 {@code UUID} 不是 version 为 1 的 UUID。
+ */
+ public long timestamp() throws UnsupportedOperationException
+ {
+ checkTimeBase();
+ return (mostSigBits & 0x0FFFL) << 48//
+ | ((mostSigBits >> 16) & 0x0FFFFL) << 32//
+ | mostSigBits >>> 32;
+ }
+
+ /**
+ * 与此 UUID 相关联的时钟序列值。
+ *
+ *
+ * 14 位的时钟序列值根据此 UUID 的 clock_seq 字段构造。clock_seq 字段用于保证在基于时间的 UUID 中的时间唯一性。
+ *
+ * {@code clockSequence} 值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。 如果此 UUID 不是基于时间的 UUID,则此方法抛出
+ * UnsupportedOperationException。
+ *
+ * @return 此 {@code UUID} 的时钟序列
+ *
+ * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1
+ */
+ public int clockSequence() throws UnsupportedOperationException
+ {
+ checkTimeBase();
+ return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48);
+ }
+
+ /**
+ * 与此 UUID 相关的节点值。
+ *
+ *
+ * 48 位的节点值根据此 UUID 的 node 字段构造。此字段旨在用于保存机器的 IEEE 802 地址,该地址用于生成此 UUID 以保证空间唯一性。
+ *
+ * 节点值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。
+ * 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。
+ *
+ * @return 此 {@code UUID} 的节点值
+ *
+ * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1
+ */
+ public long node() throws UnsupportedOperationException
+ {
+ checkTimeBase();
+ return leastSigBits & 0x0000FFFFFFFFFFFFL;
+ }
+
+ /**
+ * 返回此{@code UUID} 的字符串表现形式。
+ *
+ *
+ * UUID 的字符串表示形式由此 BNF 描述:
+ *
+ *
+ * {@code
+ * UUID = ----
+ * time_low = 4*
+ * time_mid = 2*
+ * time_high_and_version = 2*
+ * variant_and_sequence = 2*
+ * node = 6*
+ * hexOctet =
+ * hexDigit = [0-9a-fA-F]
+ * }
+ *
+ *
+ *
+ *
+ * @return 此{@code UUID} 的字符串表现形式
+ * @see #toString(boolean)
+ */
+ @Override
+ public String toString()
+ {
+ return toString(false);
+ }
+
+ /**
+ * 返回此{@code UUID} 的字符串表现形式。
+ *
+ *
+ * UUID 的字符串表示形式由此 BNF 描述:
+ *
+ *
+ * {@code
+ * UUID = ----
+ * time_low = 4*
+ * time_mid = 2*
+ * time_high_and_version = 2*
+ * variant_and_sequence = 2*
+ * node = 6*
+ * hexOctet =
+ * hexDigit = [0-9a-fA-F]
+ * }
+ *
+ *
+ *
+ *
+ * @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串
+ * @return 此{@code UUID} 的字符串表现形式
+ */
+ public String toString(boolean isSimple)
+ {
+ final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36);
+ // time_low
+ builder.append(digits(mostSigBits >> 32, 8));
+ if (!isSimple)
+ {
+ builder.append('-');
+ }
+ // time_mid
+ builder.append(digits(mostSigBits >> 16, 4));
+ if (!isSimple)
+ {
+ builder.append('-');
+ }
+ // time_high_and_version
+ builder.append(digits(mostSigBits, 4));
+ if (!isSimple)
+ {
+ builder.append('-');
+ }
+ // variant_and_sequence
+ builder.append(digits(leastSigBits >> 48, 4));
+ if (!isSimple)
+ {
+ builder.append('-');
+ }
+ // node
+ builder.append(digits(leastSigBits, 12));
+
+ return builder.toString();
+ }
+
+ /**
+ * 返回此 UUID 的哈希码。
+ *
+ * @return UUID 的哈希码值。
+ */
+ @Override
+ public int hashCode()
+ {
+ long hilo = mostSigBits ^ leastSigBits;
+ return ((int) (hilo >> 32)) ^ (int) hilo;
+ }
+
+ /**
+ * 将此对象与指定对象比较。
+ *
+ * 当且仅当参数不为 {@code null}、而是一个 UUID 对象、具有与此 UUID 相同的 varriant、包含相同的值(每一位均相同)时,结果才为 {@code true}。
+ *
+ * @param obj 要与之比较的对象
+ *
+ * @return 如果对象相同,则返回 {@code true};否则返回 {@code false}
+ */
+ @Override
+ public boolean equals(Object obj)
+ {
+ if ((null == obj) || (obj.getClass() != UUID.class))
+ {
+ return false;
+ }
+ UUID id = (UUID) obj;
+ return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits);
+ }
+
+ // Comparison Operations
+
+ /**
+ * 将此 UUID 与指定的 UUID 比较。
+ *
+ *
+ * 如果两个 UUID 不同,且第一个 UUID 的最高有效字段大于第二个 UUID 的对应字段,则第一个 UUID 大于第二个 UUID。
+ *
+ * @param val 与此 UUID 比较的 UUID
+ *
+ * @return 在此 UUID 小于、等于或大于 val 时,分别返回 -1、0 或 1。
+ *
+ */
+ @Override
+ public int compareTo(UUID val)
+ {
+ // The ordering is intentionally set up so that the UUIDs
+ // can simply be numerically compared as two numbers
+ return (this.mostSigBits < val.mostSigBits ? -1 : //
+ (this.mostSigBits > val.mostSigBits ? 1 : //
+ (this.leastSigBits < val.leastSigBits ? -1 : //
+ (this.leastSigBits > val.leastSigBits ? 1 : //
+ 0))));
+ }
+
+ // -------------------------------------------------------------------------------------------------------------------
+ // Private method start
+ /**
+ * 返回指定数字对应的hex值
+ *
+ * @param val 值
+ * @param digits 位
+ * @return 值
+ */
+ private static String digits(long val, int digits)
+ {
+ long hi = 1L << (digits * 4);
+ return Long.toHexString(hi | (val & (hi - 1))).substring(1);
+ }
+
+ /**
+ * 检查是否为time-based版本UUID
+ */
+ private void checkTimeBase()
+ {
+ if (version() != 1)
+ {
+ throw new UnsupportedOperationException("Not a time-based UUID");
+ }
+ }
+
+ /**
+ * 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG)
+ *
+ * @return {@link SecureRandom}
+ */
+ public static SecureRandom getSecureRandom()
+ {
+ try
+ {
+ return SecureRandom.getInstance("SHA1PRNG");
+ }
+ catch (NoSuchAlgorithmException e)
+ {
+ throw new UtilException(e);
+ }
+ }
+
+ /**
+ * 获取随机数生成器对象
+ * ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。
+ *
+ * @return {@link ThreadLocalRandom}
+ */
+ public static ThreadLocalRandom getRandom()
+ {
+ return ThreadLocalRandom.current();
+ }
+}
diff --git a/portal/backend/portal-common/src/main/java/org/lingniu/portal/common/xss/Xss.java b/portal/backend/portal-common/src/main/java/org/lingniu/portal/common/xss/Xss.java
new file mode 100644
index 0000000..79a73ec
--- /dev/null
+++ b/portal/backend/portal-common/src/main/java/org/lingniu/portal/common/xss/Xss.java
@@ -0,0 +1,27 @@
+package org.lingniu.portal.common.xss;
+
+import jakarta.validation.Constraint;
+import jakarta.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义xss校验注解
+ *
+ * @author lingniu
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
+@Constraint(validatedBy = { XssValidator.class })
+public @interface Xss
+{
+ String message()
+
+ default "不允许任何脚本运行";
+
+ Class>[] groups() default {};
+
+ Class extends Payload>[] payload() default {};
+}
diff --git a/portal/backend/portal-common/src/main/java/org/lingniu/portal/common/xss/XssValidator.java b/portal/backend/portal-common/src/main/java/org/lingniu/portal/common/xss/XssValidator.java
new file mode 100644
index 0000000..34e50e3
--- /dev/null
+++ b/portal/backend/portal-common/src/main/java/org/lingniu/portal/common/xss/XssValidator.java
@@ -0,0 +1,39 @@
+package org.lingniu.portal.common.xss;
+
+import org.lingniu.portal.common.utils.StringUtils;
+import jakarta.validation.ConstraintValidator;
+import jakarta.validation.ConstraintValidatorContext;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 自定义xss校验注解实现
+ *
+ * @author lingniu
+ */
+public class XssValidator implements ConstraintValidator
+{
+ private static final String HTML_PATTERN = "<(\\S*?)[^>]*>.*?|<.*? />";
+
+ @Override
+ public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext)
+ {
+ if (StringUtils.isBlank(value))
+ {
+ return true;
+ }
+ return !containsHtml(value);
+ }
+
+ public static boolean containsHtml(String value)
+ {
+ StringBuilder sHtml = new StringBuilder();
+ Pattern pattern = Pattern.compile(HTML_PATTERN);
+ Matcher matcher = pattern.matcher(value);
+ while (matcher.find())
+ {
+ sHtml.append(matcher.group());
+ }
+ return pattern.matcher(sHtml).matches();
+ }
+}
\ No newline at end of file
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Anonymous.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Anonymous.class
new file mode 100644
index 0000000..f1d0c8c
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Anonymous.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/DataScope.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/DataScope.class
new file mode 100644
index 0000000..5ca4262
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/DataScope.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/DataSource.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/DataSource.class
new file mode 100644
index 0000000..a46a35a
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/DataSource.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Excel$ColumnType.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Excel$ColumnType.class
new file mode 100644
index 0000000..703a2f6
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Excel$ColumnType.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Excel$Type.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Excel$Type.class
new file mode 100644
index 0000000..932283e
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Excel$Type.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Excel.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Excel.class
new file mode 100644
index 0000000..cb9e3c8
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Excel.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Excels.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Excels.class
new file mode 100644
index 0000000..4ecfc0c
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Excels.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Log.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Log.class
new file mode 100644
index 0000000..5ab2814
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Log.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/RateLimiter.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/RateLimiter.class
new file mode 100644
index 0000000..e2bda23
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/RateLimiter.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/RepeatSubmit.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/RepeatSubmit.class
new file mode 100644
index 0000000..f3fd763
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/RepeatSubmit.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Sensitive.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Sensitive.class
new file mode 100644
index 0000000..8b0e59c
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/annotation/Sensitive.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/config/ProjectConfig.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/config/ProjectConfig.class
new file mode 100644
index 0000000..4acc035
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/config/ProjectConfig.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/config/serializer/SensitiveJsonSerializer.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/config/serializer/SensitiveJsonSerializer.class
new file mode 100644
index 0000000..5ae5073
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/config/serializer/SensitiveJsonSerializer.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/CacheConstants.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/CacheConstants.class
new file mode 100644
index 0000000..8ad1cea
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/CacheConstants.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/Constants.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/Constants.class
new file mode 100644
index 0000000..00e34d3
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/Constants.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/GenConstants.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/GenConstants.class
new file mode 100644
index 0000000..e345f75
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/GenConstants.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/HttpStatus.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/HttpStatus.class
new file mode 100644
index 0000000..38be540
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/HttpStatus.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/ScheduleConstants$Status.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/ScheduleConstants$Status.class
new file mode 100644
index 0000000..c8ae5ec
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/ScheduleConstants$Status.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/ScheduleConstants.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/ScheduleConstants.class
new file mode 100644
index 0000000..0cc4034
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/ScheduleConstants.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/UserConstants.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/UserConstants.class
new file mode 100644
index 0000000..d88942b
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/constant/UserConstants.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/controller/BaseController$1.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/controller/BaseController$1.class
new file mode 100644
index 0000000..25ebcdd
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/controller/BaseController$1.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/controller/BaseController.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/controller/BaseController.class
new file mode 100644
index 0000000..8286117
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/controller/BaseController.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/AjaxResult.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/AjaxResult.class
new file mode 100644
index 0000000..a844d1f
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/AjaxResult.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/BaseEntity.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/BaseEntity.class
new file mode 100644
index 0000000..23c64d6
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/BaseEntity.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/R.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/R.class
new file mode 100644
index 0000000..71358f7
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/R.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/TreeEntity.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/TreeEntity.class
new file mode 100644
index 0000000..9774dd9
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/TreeEntity.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/TreeSelect.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/TreeSelect.class
new file mode 100644
index 0000000..19f9f95
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/TreeSelect.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysDept.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysDept.class
new file mode 100644
index 0000000..45897e3
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysDept.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysDictData.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysDictData.class
new file mode 100644
index 0000000..a46b714
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysDictData.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysDictType.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysDictType.class
new file mode 100644
index 0000000..82aff7b
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysDictType.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysMenu.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysMenu.class
new file mode 100644
index 0000000..8d89486
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysMenu.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysRole.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysRole.class
new file mode 100644
index 0000000..5ab84b7
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysRole.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysUser.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysUser.class
new file mode 100644
index 0000000..1452740
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/entity/SysUser.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/model/LoginBody.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/model/LoginBody.class
new file mode 100644
index 0000000..1fc64fd
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/model/LoginBody.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/model/LoginUser.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/model/LoginUser.class
new file mode 100644
index 0000000..b73fdac
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/model/LoginUser.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/model/RegisterBody.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/model/RegisterBody.class
new file mode 100644
index 0000000..5528148
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/domain/model/RegisterBody.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/page/PageDomain.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/page/PageDomain.class
new file mode 100644
index 0000000..3ed153d
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/page/PageDomain.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/page/TableDataInfo.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/page/TableDataInfo.class
new file mode 100644
index 0000000..fb2ac6b
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/page/TableDataInfo.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/page/TableSupport.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/page/TableSupport.class
new file mode 100644
index 0000000..123103b
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/page/TableSupport.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/redis/RedisCache.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/redis/RedisCache.class
new file mode 100644
index 0000000..252d2ff
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/redis/RedisCache.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/text/CharsetKit.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/text/CharsetKit.class
new file mode 100644
index 0000000..3881e30
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/text/CharsetKit.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/text/Convert.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/text/Convert.class
new file mode 100644
index 0000000..2d91caf
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/text/Convert.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/text/StrFormatter.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/text/StrFormatter.class
new file mode 100644
index 0000000..5469acd
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/core/text/StrFormatter.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/BusinessStatus.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/BusinessStatus.class
new file mode 100644
index 0000000..feb5233
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/BusinessStatus.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/BusinessType.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/BusinessType.class
new file mode 100644
index 0000000..74eed1d
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/BusinessType.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/DataSourceType.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/DataSourceType.class
new file mode 100644
index 0000000..4325eed
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/DataSourceType.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/DesensitizedType.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/DesensitizedType.class
new file mode 100644
index 0000000..b550e4c
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/DesensitizedType.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/HttpMethod.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/HttpMethod.class
new file mode 100644
index 0000000..8130adb
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/HttpMethod.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/LimitType.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/LimitType.class
new file mode 100644
index 0000000..986612f
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/LimitType.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/OperatorType.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/OperatorType.class
new file mode 100644
index 0000000..3f09f24
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/OperatorType.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/UserStatus.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/UserStatus.class
new file mode 100644
index 0000000..69c758c
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/enums/UserStatus.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/DemoModeException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/DemoModeException.class
new file mode 100644
index 0000000..6756c1c
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/DemoModeException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/GlobalException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/GlobalException.class
new file mode 100644
index 0000000..e8f0d2c
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/GlobalException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/ServiceException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/ServiceException.class
new file mode 100644
index 0000000..378e98c
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/ServiceException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/UtilException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/UtilException.class
new file mode 100644
index 0000000..7d2f8d1
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/UtilException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/base/BaseException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/base/BaseException.class
new file mode 100644
index 0000000..31d4d09
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/base/BaseException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/FileException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/FileException.class
new file mode 100644
index 0000000..4cb450a
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/FileException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/FileNameLengthLimitExceededException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/FileNameLengthLimitExceededException.class
new file mode 100644
index 0000000..f56b144
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/FileNameLengthLimitExceededException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/FileSizeLimitExceededException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/FileSizeLimitExceededException.class
new file mode 100644
index 0000000..b091728
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/FileSizeLimitExceededException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/FileUploadException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/FileUploadException.class
new file mode 100644
index 0000000..f042876
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/FileUploadException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/InvalidExtensionException$InvalidFlashExtensionException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/InvalidExtensionException$InvalidFlashExtensionException.class
new file mode 100644
index 0000000..d4fbf17
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/InvalidExtensionException$InvalidFlashExtensionException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/InvalidExtensionException$InvalidImageExtensionException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/InvalidExtensionException$InvalidImageExtensionException.class
new file mode 100644
index 0000000..762494b
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/InvalidExtensionException$InvalidImageExtensionException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/InvalidExtensionException$InvalidMediaExtensionException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/InvalidExtensionException$InvalidMediaExtensionException.class
new file mode 100644
index 0000000..5d85d4f
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/InvalidExtensionException$InvalidMediaExtensionException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/InvalidExtensionException$InvalidVideoExtensionException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/InvalidExtensionException$InvalidVideoExtensionException.class
new file mode 100644
index 0000000..efb2d15
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/InvalidExtensionException$InvalidVideoExtensionException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/InvalidExtensionException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/InvalidExtensionException.class
new file mode 100644
index 0000000..1d3ce82
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/file/InvalidExtensionException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/job/TaskException$Code.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/job/TaskException$Code.class
new file mode 100644
index 0000000..a402d4b
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/job/TaskException$Code.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/job/TaskException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/job/TaskException.class
new file mode 100644
index 0000000..d82dfe4
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/job/TaskException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/BlackListException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/BlackListException.class
new file mode 100644
index 0000000..32f865a
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/BlackListException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/CaptchaException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/CaptchaException.class
new file mode 100644
index 0000000..fafc0e6
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/CaptchaException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/CaptchaExpireException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/CaptchaExpireException.class
new file mode 100644
index 0000000..7c8fb3e
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/CaptchaExpireException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/UserException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/UserException.class
new file mode 100644
index 0000000..cdcc06c
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/UserException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/UserNotExistsException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/UserNotExistsException.class
new file mode 100644
index 0000000..2474091
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/UserNotExistsException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/UserPasswordNotMatchException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/UserPasswordNotMatchException.class
new file mode 100644
index 0000000..e6000e6
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/UserPasswordNotMatchException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/UserPasswordRetryLimitExceedException.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/UserPasswordRetryLimitExceedException.class
new file mode 100644
index 0000000..c464cd8
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/exception/user/UserPasswordRetryLimitExceedException.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/PropertyPreExcludeFilter.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/PropertyPreExcludeFilter.class
new file mode 100644
index 0000000..05381ee
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/PropertyPreExcludeFilter.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/RefererFilter.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/RefererFilter.class
new file mode 100644
index 0000000..fb640fe
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/RefererFilter.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/RepeatableFilter.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/RepeatableFilter.class
new file mode 100644
index 0000000..61da44a
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/RepeatableFilter.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/RepeatedlyRequestWrapper$1.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/RepeatedlyRequestWrapper$1.class
new file mode 100644
index 0000000..38d6e3d
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/RepeatedlyRequestWrapper$1.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/RepeatedlyRequestWrapper.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/RepeatedlyRequestWrapper.class
new file mode 100644
index 0000000..739649d
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/RepeatedlyRequestWrapper.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/XssFilter.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/XssFilter.class
new file mode 100644
index 0000000..0aed98d
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/XssFilter.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/XssHttpServletRequestWrapper$1.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/XssHttpServletRequestWrapper$1.class
new file mode 100644
index 0000000..1f89b09
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/XssHttpServletRequestWrapper$1.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/XssHttpServletRequestWrapper.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/XssHttpServletRequestWrapper.class
new file mode 100644
index 0000000..9b91270
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/filter/XssHttpServletRequestWrapper.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/Arith.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/Arith.class
new file mode 100644
index 0000000..ab93c53
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/Arith.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/DateUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/DateUtils.class
new file mode 100644
index 0000000..21db6dc
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/DateUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/DesensitizedUtil.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/DesensitizedUtil.class
new file mode 100644
index 0000000..9b2cc23
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/DesensitizedUtil.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/DictUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/DictUtils.class
new file mode 100644
index 0000000..90f81cd
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/DictUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/ExceptionUtil.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/ExceptionUtil.class
new file mode 100644
index 0000000..15a0db6
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/ExceptionUtil.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/LogUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/LogUtils.class
new file mode 100644
index 0000000..0310b1d
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/LogUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/MessageUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/MessageUtils.class
new file mode 100644
index 0000000..30f8f10
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/MessageUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/PageUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/PageUtils.class
new file mode 100644
index 0000000..efeb29b
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/PageUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/SecurityUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/SecurityUtils.class
new file mode 100644
index 0000000..1ce0f6e
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/SecurityUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/ServletUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/ServletUtils.class
new file mode 100644
index 0000000..cb544a4
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/ServletUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/StringUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/StringUtils.class
new file mode 100644
index 0000000..68518fa
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/StringUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/Threads.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/Threads.class
new file mode 100644
index 0000000..4dc8556
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/Threads.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/bean/BeanUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/bean/BeanUtils.class
new file mode 100644
index 0000000..98e4096
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/bean/BeanUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/bean/BeanValidators.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/bean/BeanValidators.class
new file mode 100644
index 0000000..f38d75f
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/bean/BeanValidators.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/file/FileTypeUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/file/FileTypeUtils.class
new file mode 100644
index 0000000..5ffa50e
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/file/FileTypeUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/file/FileUploadUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/file/FileUploadUtils.class
new file mode 100644
index 0000000..dc1d6d3
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/file/FileUploadUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/file/FileUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/file/FileUtils.class
new file mode 100644
index 0000000..c175306
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/file/FileUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/file/ImageUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/file/ImageUtils.class
new file mode 100644
index 0000000..b7741be
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/file/ImageUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/file/MimeTypeUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/file/MimeTypeUtils.class
new file mode 100644
index 0000000..4e15958
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/file/MimeTypeUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/html/EscapeUtil.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/html/EscapeUtil.class
new file mode 100644
index 0000000..30e5162
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/html/EscapeUtil.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/html/HTMLFilter.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/html/HTMLFilter.class
new file mode 100644
index 0000000..23a804c
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/html/HTMLFilter.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/http/HttpHelper.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/http/HttpHelper.class
new file mode 100644
index 0000000..761a4f1
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/http/HttpHelper.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/http/HttpUtils$TrustAnyHostnameVerifier.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/http/HttpUtils$TrustAnyHostnameVerifier.class
new file mode 100644
index 0000000..e03aa75
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/http/HttpUtils$TrustAnyHostnameVerifier.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/http/HttpUtils$TrustAnyTrustManager.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/http/HttpUtils$TrustAnyTrustManager.class
new file mode 100644
index 0000000..e34312d
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/http/HttpUtils$TrustAnyTrustManager.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/http/HttpUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/http/HttpUtils.class
new file mode 100644
index 0000000..b2d9ac0
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/http/HttpUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/http/UserAgentUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/http/UserAgentUtils.class
new file mode 100644
index 0000000..ae82229
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/http/UserAgentUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/ip/AddressUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/ip/AddressUtils.class
new file mode 100644
index 0000000..23b42fd
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/ip/AddressUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/ip/IpUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/ip/IpUtils.class
new file mode 100644
index 0000000..ce70ae3
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/ip/IpUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/poi/ExcelHandlerAdapter.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/poi/ExcelHandlerAdapter.class
new file mode 100644
index 0000000..9335135
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/poi/ExcelHandlerAdapter.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/poi/ExcelUtil.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/poi/ExcelUtil.class
new file mode 100644
index 0000000..859ffc1
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/poi/ExcelUtil.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/reflect/ReflectUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/reflect/ReflectUtils.class
new file mode 100644
index 0000000..0808c90
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/reflect/ReflectUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/sign/Base64.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/sign/Base64.class
new file mode 100644
index 0000000..91bd0d2
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/sign/Base64.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/sign/Md5Utils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/sign/Md5Utils.class
new file mode 100644
index 0000000..943db2f
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/sign/Md5Utils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/spring/SpringUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/spring/SpringUtils.class
new file mode 100644
index 0000000..b63d3a4
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/spring/SpringUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/sql/SqlUtil.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/sql/SqlUtil.class
new file mode 100644
index 0000000..353ba4e
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/sql/SqlUtil.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/uuid/IdUtils.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/uuid/IdUtils.class
new file mode 100644
index 0000000..27a7835
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/uuid/IdUtils.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/uuid/Seq.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/uuid/Seq.class
new file mode 100644
index 0000000..ff53d37
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/uuid/Seq.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/uuid/UUID$Holder.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/uuid/UUID$Holder.class
new file mode 100644
index 0000000..a9d95fa
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/uuid/UUID$Holder.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/uuid/UUID.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/uuid/UUID.class
new file mode 100644
index 0000000..3f4f78e
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/utils/uuid/UUID.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/xss/Xss.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/xss/Xss.class
new file mode 100644
index 0000000..79837ac
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/xss/Xss.class differ
diff --git a/portal/backend/portal-common/target/classes/org/lingniu/portal/common/xss/XssValidator.class b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/xss/XssValidator.class
new file mode 100644
index 0000000..e9fc620
Binary files /dev/null and b/portal/backend/portal-common/target/classes/org/lingniu/portal/common/xss/XssValidator.class differ
diff --git a/portal/backend/portal-common/target/maven-archiver/pom.properties b/portal/backend/portal-common/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..5273a28
--- /dev/null
+++ b/portal/backend/portal-common/target/maven-archiver/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Tue Feb 10 15:13:40 CST 2026
+groupId=org.lingniu
+artifactId=portal-common
+version=1.0.0
diff --git a/portal/backend/portal-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/portal/backend/portal-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
new file mode 100644
index 0000000..ca3f95b
--- /dev/null
+++ b/portal/backend/portal-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -0,0 +1,123 @@
+org\lingniu\portal\common\constant\GenConstants.class
+org\lingniu\portal\common\exception\file\InvalidExtensionException$InvalidVideoExtensionException.class
+org\lingniu\portal\common\core\text\StrFormatter.class
+org\lingniu\portal\common\enums\DesensitizedType.class
+org\lingniu\portal\common\constant\Constants.class
+org\lingniu\portal\common\utils\DateUtils.class
+org\lingniu\portal\common\exception\user\UserPasswordNotMatchException.class
+org\lingniu\portal\common\utils\MessageUtils.class
+org\lingniu\portal\common\core\domain\entity\SysDictData.class
+org\lingniu\portal\common\utils\DesensitizedUtil.class
+org\lingniu\portal\common\utils\uuid\UUID.class
+org\lingniu\portal\common\core\page\TableDataInfo.class
+org\lingniu\portal\common\constant\CacheConstants.class
+org\lingniu\portal\common\exception\file\FileSizeLimitExceededException.class
+org\lingniu\portal\common\utils\sign\Base64.class
+org\lingniu\portal\common\exception\file\FileException.class
+org\lingniu\portal\common\enums\OperatorType.class
+org\lingniu\portal\common\utils\StringUtils.class
+org\lingniu\portal\common\utils\uuid\UUID$Holder.class
+org\lingniu\portal\common\xss\XssValidator.class
+org\lingniu\portal\common\annotation\Excel.class
+org\lingniu\portal\common\enums\UserStatus.class
+org\lingniu\portal\common\utils\SecurityUtils.class
+org\lingniu\portal\common\filter\RepeatedlyRequestWrapper.class
+org\lingniu\portal\common\utils\LogUtils.class
+org\lingniu\portal\common\core\domain\TreeEntity.class
+org\lingniu\portal\common\core\page\TableSupport.class
+org\lingniu\portal\common\exception\UtilException.class
+org\lingniu\portal\common\utils\html\EscapeUtil.class
+org\lingniu\portal\common\core\domain\model\RegisterBody.class
+org\lingniu\portal\common\exception\user\UserPasswordRetryLimitExceedException.class
+org\lingniu\portal\common\exception\user\CaptchaExpireException.class
+org\lingniu\portal\common\exception\GlobalException.class
+org\lingniu\portal\common\utils\DictUtils.class
+org\lingniu\portal\common\utils\http\HttpUtils.class
+org\lingniu\portal\common\core\domain\TreeSelect.class
+org\lingniu\portal\common\enums\HttpMethod.class
+org\lingniu\portal\common\constant\ScheduleConstants$Status.class
+org\lingniu\portal\common\core\controller\BaseController$1.class
+org\lingniu\portal\common\enums\DataSourceType.class
+org\lingniu\portal\common\core\domain\R.class
+org\lingniu\portal\common\filter\XssHttpServletRequestWrapper$1.class
+org\lingniu\portal\common\core\text\Convert.class
+org\lingniu\portal\common\core\page\PageDomain.class
+org\lingniu\portal\common\utils\poi\ExcelHandlerAdapter.class
+org\lingniu\portal\common\utils\http\UserAgentUtils.class
+org\lingniu\portal\common\utils\file\ImageUtils.class
+org\lingniu\portal\common\exception\user\BlackListException.class
+org\lingniu\portal\common\annotation\Sensitive.class
+org\lingniu\portal\common\core\domain\model\LoginUser.class
+org\lingniu\portal\common\utils\Threads.class
+org\lingniu\portal\common\exception\file\InvalidExtensionException.class
+org\lingniu\portal\common\utils\file\FileUploadUtils.class
+org\lingniu\portal\common\utils\bean\BeanUtils.class
+org\lingniu\portal\common\exception\file\InvalidExtensionException$InvalidFlashExtensionException.class
+org\lingniu\portal\common\core\domain\AjaxResult.class
+org\lingniu\portal\common\exception\base\BaseException.class
+org\lingniu\portal\common\utils\file\FileTypeUtils.class
+org\lingniu\portal\common\annotation\DataScope.class
+org\lingniu\portal\common\utils\sql\SqlUtil.class
+org\lingniu\portal\common\utils\Arith.class
+org\lingniu\portal\common\enums\BusinessType.class
+org\lingniu\portal\common\utils\sign\Md5Utils.class
+org\lingniu\portal\common\exception\ServiceException.class
+org\lingniu\portal\common\constant\HttpStatus.class
+org\lingniu\portal\common\utils\file\MimeTypeUtils.class
+org\lingniu\portal\common\utils\http\HttpUtils$TrustAnyTrustManager.class
+org\lingniu\portal\common\exception\job\TaskException$Code.class
+org\lingniu\portal\common\annotation\RateLimiter.class
+org\lingniu\portal\common\core\domain\BaseEntity.class
+org\lingniu\portal\common\enums\LimitType.class
+org\lingniu\portal\common\core\redis\RedisCache.class
+org\lingniu\portal\common\core\domain\entity\SysDictType.class
+org\lingniu\portal\common\exception\user\UserNotExistsException.class
+org\lingniu\portal\common\annotation\RepeatSubmit.class
+org\lingniu\portal\common\utils\spring\SpringUtils.class
+org\lingniu\portal\common\config\serializer\SensitiveJsonSerializer.class
+org\lingniu\portal\common\enums\BusinessStatus.class
+org\lingniu\portal\common\utils\html\HTMLFilter.class
+org\lingniu\portal\common\annotation\Excels.class
+org\lingniu\portal\common\filter\XssHttpServletRequestWrapper.class
+org\lingniu\portal\common\utils\file\FileUtils.class
+org\lingniu\portal\common\exception\job\TaskException.class
+org\lingniu\portal\common\annotation\Excel$Type.class
+org\lingniu\portal\common\annotation\DataSource.class
+org\lingniu\portal\common\exception\user\CaptchaException.class
+org\lingniu\portal\common\utils\ServletUtils.class
+org\lingniu\portal\common\exception\file\InvalidExtensionException$InvalidMediaExtensionException.class
+org\lingniu\portal\common\exception\file\FileUploadException.class
+org\lingniu\portal\common\filter\PropertyPreExcludeFilter.class
+org\lingniu\portal\common\core\domain\entity\SysDept.class
+org\lingniu\portal\common\core\domain\entity\SysMenu.class
+org\lingniu\portal\common\filter\RefererFilter.class
+org\lingniu\portal\common\exception\file\InvalidExtensionException$InvalidImageExtensionException.class
+org\lingniu\portal\common\utils\reflect\ReflectUtils.class
+org\lingniu\portal\common\xss\Xss.class
+org\lingniu\portal\common\utils\ip\IpUtils.class
+org\lingniu\portal\common\utils\http\HttpUtils$TrustAnyHostnameVerifier.class
+org\lingniu\portal\common\constant\ScheduleConstants.class
+org\lingniu\portal\common\core\domain\model\LoginBody.class
+org\lingniu\portal\common\utils\uuid\Seq.class
+org\lingniu\portal\common\filter\RepeatableFilter.class
+org\lingniu\portal\common\exception\file\FileNameLengthLimitExceededException.class
+org\lingniu\portal\common\filter\RepeatedlyRequestWrapper$1.class
+org\lingniu\portal\common\utils\uuid\IdUtils.class
+org\lingniu\portal\common\config\ProjectConfig.class
+org\lingniu\portal\common\utils\poi\ExcelUtil.class
+org\lingniu\portal\common\annotation\Log.class
+org\lingniu\portal\common\annotation\Anonymous.class
+org\lingniu\portal\common\constant\UserConstants.class
+org\lingniu\portal\common\exception\DemoModeException.class
+org\lingniu\portal\common\utils\PageUtils.class
+org\lingniu\portal\common\core\domain\entity\SysRole.class
+org\lingniu\portal\common\utils\bean\BeanValidators.class
+org\lingniu\portal\common\core\controller\BaseController.class
+org\lingniu\portal\common\core\domain\entity\SysUser.class
+org\lingniu\portal\common\exception\user\UserException.class
+org\lingniu\portal\common\utils\ExceptionUtil.class
+org\lingniu\portal\common\utils\http\HttpHelper.class
+org\lingniu\portal\common\annotation\Excel$ColumnType.class
+org\lingniu\portal\common\core\text\CharsetKit.class
+org\lingniu\portal\common\utils\ip\AddressUtils.class
+org\lingniu\portal\common\filter\XssFilter.class
diff --git a/portal/backend/portal-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/portal/backend/portal-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
new file mode 100644
index 0000000..265114c
--- /dev/null
+++ b/portal/backend/portal-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -0,0 +1,109 @@
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\annotation\Anonymous.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\annotation\DataScope.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\annotation\DataSource.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\annotation\Excel.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\annotation\Excels.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\annotation\Log.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\annotation\RateLimiter.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\annotation\RepeatSubmit.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\annotation\Sensitive.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\config\ProjectConfig.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\config\serializer\SensitiveJsonSerializer.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\constant\CacheConstants.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\constant\Constants.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\constant\GenConstants.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\constant\HttpStatus.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\constant\ScheduleConstants.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\constant\UserConstants.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\controller\BaseController.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\domain\AjaxResult.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\domain\BaseEntity.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\domain\entity\SysDept.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\domain\entity\SysDictData.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\domain\entity\SysDictType.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\domain\entity\SysMenu.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\domain\entity\SysRole.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\domain\entity\SysUser.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\domain\model\LoginBody.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\domain\model\LoginUser.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\domain\model\RegisterBody.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\domain\R.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\domain\TreeEntity.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\domain\TreeSelect.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\page\PageDomain.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\page\TableDataInfo.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\page\TableSupport.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\redis\RedisCache.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\text\CharsetKit.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\text\Convert.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\core\text\StrFormatter.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\enums\BusinessStatus.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\enums\BusinessType.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\enums\DataSourceType.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\enums\DesensitizedType.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\enums\HttpMethod.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\enums\LimitType.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\enums\OperatorType.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\enums\UserStatus.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\base\BaseException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\DemoModeException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\file\FileException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\file\FileNameLengthLimitExceededException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\file\FileSizeLimitExceededException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\file\FileUploadException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\file\InvalidExtensionException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\GlobalException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\job\TaskException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\ServiceException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\user\BlackListException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\user\CaptchaException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\user\CaptchaExpireException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\user\UserException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\user\UserNotExistsException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\user\UserPasswordNotMatchException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\user\UserPasswordRetryLimitExceedException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\exception\UtilException.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\filter\PropertyPreExcludeFilter.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\filter\RefererFilter.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\filter\RepeatableFilter.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\filter\RepeatedlyRequestWrapper.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\filter\XssFilter.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\filter\XssHttpServletRequestWrapper.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\Arith.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\bean\BeanUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\bean\BeanValidators.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\DateUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\DesensitizedUtil.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\DictUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\ExceptionUtil.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\file\FileTypeUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\file\FileUploadUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\file\FileUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\file\ImageUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\file\MimeTypeUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\html\EscapeUtil.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\html\HTMLFilter.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\http\HttpHelper.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\http\HttpUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\http\UserAgentUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\ip\AddressUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\ip\IpUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\LogUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\MessageUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\PageUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\poi\ExcelHandlerAdapter.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\poi\ExcelUtil.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\reflect\ReflectUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\SecurityUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\ServletUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\sign\Base64.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\sign\Md5Utils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\spring\SpringUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\sql\SqlUtil.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\StringUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\Threads.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\uuid\IdUtils.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\uuid\Seq.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\utils\uuid\UUID.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\xss\Xss.java
+D:\RuoYi-Vue\portal-common\src\main\java\org\lingniu\portal\common\xss\XssValidator.java
diff --git a/portal/backend/portal-common/target/portal-common-1.0.0.jar b/portal/backend/portal-common/target/portal-common-1.0.0.jar
new file mode 100644
index 0000000..2a5906f
Binary files /dev/null and b/portal/backend/portal-common/target/portal-common-1.0.0.jar differ
diff --git a/portal/backend/portal-framework/pom.xml b/portal/backend/portal-framework/pom.xml
new file mode 100644
index 0000000..06804eb
--- /dev/null
+++ b/portal/backend/portal-framework/pom.xml
@@ -0,0 +1,64 @@
+
+
+
+ portal
+ org.lingniu
+ 1.0.0
+
+ 4.0.0
+
+ portal-framework
+
+
+ framework框架核心
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
+
+
+ com.alibaba
+ druid-spring-boot-3-starter
+
+
+
+
+ pro.fessional
+ kaptcha
+
+
+ servlet-api
+ javax.servlet
+
+
+
+
+
+
+ com.github.oshi
+ oshi-core
+
+
+
+
+ org.lingniu
+ portal-system
+
+
+
+
+
\ No newline at end of file
diff --git a/portal/backend/portal-framework/src/main/java/org/lingniu/portal/framework/aspectj/DataScopeAspect.java b/portal/backend/portal-framework/src/main/java/org/lingniu/portal/framework/aspectj/DataScopeAspect.java
new file mode 100644
index 0000000..f556f4c
--- /dev/null
+++ b/portal/backend/portal-framework/src/main/java/org/lingniu/portal/framework/aspectj/DataScopeAspect.java
@@ -0,0 +1,184 @@
+package org.lingniu.portal.framework.aspectj;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.springframework.stereotype.Component;
+import org.lingniu.portal.common.annotation.DataScope;
+import org.lingniu.portal.common.constant.UserConstants;
+import org.lingniu.portal.common.core.domain.BaseEntity;
+import org.lingniu.portal.common.core.domain.entity.SysRole;
+import org.lingniu.portal.common.core.domain.entity.SysUser;
+import org.lingniu.portal.common.core.domain.model.LoginUser;
+import org.lingniu.portal.common.core.text.Convert;
+import org.lingniu.portal.common.utils.SecurityUtils;
+import org.lingniu.portal.common.utils.StringUtils;
+import org.lingniu.portal.framework.security.context.PermissionContextHolder;
+
+/**
+ * 数据过滤处理
+ *
+ * @author lingniu
+ */
+@Aspect
+@Component
+public class DataScopeAspect
+{
+ /**
+ * 全部数据权限
+ */
+ public static final String DATA_SCOPE_ALL = "1";
+
+ /**
+ * 自定数据权限
+ */
+ public static final String DATA_SCOPE_CUSTOM = "2";
+
+ /**
+ * 部门数据权限
+ */
+ public static final String DATA_SCOPE_DEPT = "3";
+
+ /**
+ * 部门及以下数据权限
+ */
+ public static final String DATA_SCOPE_DEPT_AND_CHILD = "4";
+
+ /**
+ * 仅本人数据权限
+ */
+ public static final String DATA_SCOPE_SELF = "5";
+
+ /**
+ * 数据权限过滤关键字
+ */
+ public static final String DATA_SCOPE = "dataScope";
+
+ @Before("@annotation(controllerDataScope)")
+ public void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable
+ {
+ clearDataScope(point);
+ handleDataScope(point, controllerDataScope);
+ }
+
+ protected void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope)
+ {
+ // 获取当前的用户
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ if (StringUtils.isNotNull(loginUser))
+ {
+ SysUser currentUser = loginUser.getUser();
+ // 如果是超级管理员,则不过滤数据
+ if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin())
+ {
+ String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), PermissionContextHolder.getContext());
+ dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), controllerDataScope.userAlias(), permission);
+ }
+ }
+ }
+
+ /**
+ * 数据范围过滤
+ *
+ * @param joinPoint 切点
+ * @param user 用户
+ * @param deptAlias 部门别名
+ * @param userAlias 用户别名
+ * @param permission 权限字符
+ */
+ public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, String permission)
+ {
+ StringBuilder sqlString = new StringBuilder();
+ List conditions = new ArrayList();
+ List scopeCustomIds = new ArrayList();
+ user.getRoles().forEach(role -> {
+ if (DATA_SCOPE_CUSTOM.equals(role.getDataScope()) && StringUtils.equals(role.getStatus(), UserConstants.ROLE_NORMAL) && (StringUtils.isEmpty(permission) || StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))))
+ {
+ scopeCustomIds.add(Convert.toStr(role.getRoleId()));
+ }
+ });
+
+ for (SysRole role : user.getRoles())
+ {
+ String dataScope = role.getDataScope();
+ if (conditions.contains(dataScope) || StringUtils.equals(role.getStatus(), UserConstants.ROLE_DISABLE))
+ {
+ continue;
+ }
+ if (StringUtils.isNotEmpty(permission) && !StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission)))
+ {
+ continue;
+ }
+ if (DATA_SCOPE_ALL.equals(dataScope))
+ {
+ sqlString = new StringBuilder();
+ conditions.add(dataScope);
+ break;
+ }
+ else if (DATA_SCOPE_CUSTOM.equals(dataScope))
+ {
+ if (scopeCustomIds.size() > 1)
+ {
+ // 多个自定数据权限使用in查询,避免多次拼接。
+ sqlString.append(StringUtils.format(" OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id in ({}) ) ", deptAlias, String.join(",", scopeCustomIds)));
+ }
+ else
+ {
+ sqlString.append(StringUtils.format(" OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, role.getRoleId()));
+ }
+ }
+ else if (DATA_SCOPE_DEPT.equals(dataScope))
+ {
+ sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId()));
+ }
+ else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope))
+ {
+ sqlString.append(StringUtils.format(" OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )", deptAlias, user.getDeptId(), user.getDeptId()));
+ }
+ else if (DATA_SCOPE_SELF.equals(dataScope))
+ {
+ if (StringUtils.isNotBlank(userAlias))
+ {
+ sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getUserId()));
+ }
+ else
+ {
+ // 数据权限为仅本人且没有userAlias别名不查询任何数据
+ sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias));
+ }
+ }
+ conditions.add(dataScope);
+ }
+
+ // 角色都不包含传递过来的权限字符,这个时候sqlString也会为空,所以要限制一下,不查询任何数据
+ if (StringUtils.isEmpty(conditions))
+ {
+ sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias));
+ }
+
+ if (StringUtils.isNotBlank(sqlString.toString()))
+ {
+ Object params = joinPoint.getArgs()[0];
+ if (StringUtils.isNotNull(params) && params instanceof BaseEntity)
+ {
+ BaseEntity baseEntity = (BaseEntity) params;
+ baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")");
+ }
+ }
+ }
+
+ /**
+ * 拼接权限sql前先清空params.dataScope参数防止注入
+ */
+ private void clearDataScope(final JoinPoint joinPoint)
+ {
+ Object params = joinPoint.getArgs()[0];
+ if (StringUtils.isNotNull(params) && params instanceof BaseEntity)
+ {
+ BaseEntity baseEntity = (BaseEntity) params;
+ baseEntity.getParams().put(DATA_SCOPE, "");
+ }
+ }
+}
diff --git a/portal/backend/portal-framework/src/main/java/org/lingniu/portal/framework/aspectj/DataSourceAspect.java b/portal/backend/portal-framework/src/main/java/org/lingniu/portal/framework/aspectj/DataSourceAspect.java
new file mode 100644
index 0000000..149f12b
--- /dev/null
+++ b/portal/backend/portal-framework/src/main/java/org/lingniu/portal/framework/aspectj/DataSourceAspect.java
@@ -0,0 +1,72 @@
+package org.lingniu.portal.framework.aspectj;
+
+import java.util.Objects;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.annotation.AnnotationUtils;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import org.lingniu.portal.common.annotation.DataSource;
+import org.lingniu.portal.common.utils.StringUtils;
+import org.lingniu.portal.framework.datasource.DynamicDataSourceContextHolder;
+
+/**
+ * 多数据源处理
+ *
+ * @author lingniu
+ */
+@Aspect
+@Order(1)
+@Component
+public class DataSourceAspect
+{
+ protected Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Pointcut("@annotation(org.lingniu.portal.common.annotation.DataSource)"
+ + "|| @within(org.lingniu.portal.common.annotation.DataSource)")
+ public void dsPointCut()
+ {
+
+ }
+
+ @Around("dsPointCut()")
+ public Object around(ProceedingJoinPoint point) throws Throwable
+ {
+ DataSource dataSource = getDataSource(point);
+
+ if (StringUtils.isNotNull(dataSource))
+ {
+ DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name());
+ }
+
+ try
+ {
+ return point.proceed();
+ }
+ finally
+ {
+ // 销毁数据源 在执行方法之后
+ DynamicDataSourceContextHolder.clearDataSourceType();
+ }
+ }
+
+ /**
+ * 获取需要切换的数据源
+ */
+ public DataSource getDataSource(ProceedingJoinPoint point)
+ {
+ MethodSignature signature = (MethodSignature) point.getSignature();
+ DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class);
+ if (Objects.nonNull(dataSource))
+ {
+ return dataSource;
+ }
+
+ return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class);
+ }
+}
diff --git a/portal/backend/portal-framework/src/main/java/org/lingniu/portal/framework/aspectj/LogAspect.java b/portal/backend/portal-framework/src/main/java/org/lingniu/portal/framework/aspectj/LogAspect.java
new file mode 100644
index 0000000..73749af
--- /dev/null
+++ b/portal/backend/portal-framework/src/main/java/org/lingniu/portal/framework/aspectj/LogAspect.java
@@ -0,0 +1,264 @@
+package org.lingniu.portal.framework.aspectj;
+
+import java.util.Collection;
+import java.util.Map;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.apache.commons.lang3.ArrayUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.AfterThrowing;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.NamedThreadLocal;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.multipart.MultipartFile;
+import com.alibaba.fastjson2.JSON;
+import org.lingniu.portal.common.annotation.Log;
+import org.lingniu.portal.common.core.domain.entity.SysUser;
+import org.lingniu.portal.common.core.domain.model.LoginUser;
+import org.lingniu.portal.common.core.text.Convert;
+import org.lingniu.portal.common.enums.BusinessStatus;
+import org.lingniu.portal.common.enums.HttpMethod;
+import org.lingniu.portal.common.filter.PropertyPreExcludeFilter;
+import org.lingniu.portal.common.utils.ExceptionUtil;
+import org.lingniu.portal.common.utils.SecurityUtils;
+import org.lingniu.portal.common.utils.ServletUtils;
+import org.lingniu.portal.common.utils.StringUtils;
+import org.lingniu.portal.common.utils.ip.IpUtils;
+import org.lingniu.portal.framework.manager.AsyncManager;
+import org.lingniu.portal.framework.manager.factory.AsyncFactory;
+import org.lingniu.portal.system.domain.SysOperLog;
+
+/**
+ * 操作日志记录处理
+ *
+ * @author lingniu
+ */
+@Aspect
+@Component
+public class LogAspect
+{
+ private static final Logger log = LoggerFactory.getLogger(LogAspect.class);
+
+ /** 排除敏感属性字段 */
+ public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" };
+
+ /** 计算操作消耗时间 */
+ private static final ThreadLocal TIME_THREADLOCAL = new NamedThreadLocal("Cost Time");
+
+ /** 参数最大长度限制 */
+ private static final int PARAM_MAX_LENGTH = 2000;
+
+ /**
+ * 处理请求前执行
+ */
+ @Before(value = "@annotation(controllerLog)")
+ public void doBefore(JoinPoint joinPoint, Log controllerLog)
+ {
+ TIME_THREADLOCAL.set(System.currentTimeMillis());
+ }
+
+ /**
+ * 处理完请求后执行
+ *
+ * @param joinPoint 切点
+ */
+ @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult")
+ public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult)
+ {
+ handleLog(joinPoint, controllerLog, null, jsonResult);
+ }
+
+ /**
+ * 拦截异常操作
+ *
+ * @param joinPoint 切点
+ * @param e 异常
+ */
+ @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e")
+ public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e)
+ {
+ handleLog(joinPoint, controllerLog, e, null);
+ }
+
+ protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult)
+ {
+ try
+ {
+ // 获取当前的用户
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+
+ // *========数据库日志=========*//
+ SysOperLog operLog = new SysOperLog();
+ operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
+ // 请求的地址
+ String ip = IpUtils.getIpAddr();
+ operLog.setOperIp(ip);
+ operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255));
+ if (loginUser != null)
+ {
+ operLog.setOperName(loginUser.getUsername());
+ SysUser currentUser = loginUser.getUser();
+ if (StringUtils.isNotNull(currentUser) && StringUtils.isNotNull(currentUser.getDept()))
+ {
+ operLog.setDeptName(currentUser.getDept().getDeptName());
+ }
+ }
+
+ if (e != null)
+ {
+ operLog.setStatus(BusinessStatus.FAIL.ordinal());
+ operLog.setErrorMsg(StringUtils.substring(Convert.toStr(e.getMessage(), ExceptionUtil.getExceptionMessage(e)), 0, 2000));
+ }
+ // 设置方法名称
+ String className = joinPoint.getTarget().getClass().getName();
+ String methodName = joinPoint.getSignature().getName();
+ operLog.setMethod(className + "." + methodName + "()");
+ // 设置请求方式
+ operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
+ // 处理设置注解上的参数
+ getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);
+ // 设置消耗时间
+ operLog.setCostTime(System.currentTimeMillis() - TIME_THREADLOCAL.get());
+ // 保存数据库
+ AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
+ }
+ catch (Exception exp)
+ {
+ // 记录本地异常日志
+ log.error("异常信息:{}", exp.getMessage());
+ exp.printStackTrace();
+ }
+ finally
+ {
+ TIME_THREADLOCAL.remove();
+ }
+ }
+
+ /**
+ * 获取注解中对方法的描述信息 用于Controller层注解
+ *
+ * @param log 日志
+ * @param operLog 操作日志
+ * @throws Exception
+ */
+ public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog, Object jsonResult) throws Exception
+ {
+ // 设置action动作
+ operLog.setBusinessType(log.businessType().ordinal());
+ // 设置标题
+ operLog.setTitle(log.title());
+ // 设置操作人类别
+ operLog.setOperatorType(log.operatorType().ordinal());
+ // 是否需要保存request,参数和值
+ if (log.isSaveRequestData())
+ {
+ // 获取参数的信息,传入到数据库中。
+ setRequestValue(joinPoint, operLog, log.excludeParamNames());
+ }
+ // 是否需要保存response,参数和值
+ if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult))
+ {
+ operLog.setJsonResult(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000));
+ }
+ }
+
+ /**
+ * 获取请求的参数,放到log中
+ *
+ * @param operLog 操作日志
+ * @throws Exception 异常
+ */
+ private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog, String[] excludeParamNames) throws Exception
+ {
+ String requestMethod = operLog.getRequestMethod();
+ Map, ?> paramsMap = ServletUtils.getParamMap(ServletUtils.getRequest());
+ if (StringUtils.isEmpty(paramsMap) && StringUtils.equalsAny(requestMethod, HttpMethod.PUT.name(), HttpMethod.POST.name(), HttpMethod.DELETE.name()))
+ {
+ String params = argsArrayToString(joinPoint.getArgs(), excludeParamNames);
+ operLog.setOperParam(params);
+ }
+ else
+ {
+ operLog.setOperParam(StringUtils.substring(JSON.toJSONString(paramsMap, excludePropertyPreFilter(excludeParamNames)), 0, PARAM_MAX_LENGTH));
+ }
+ }
+
+ /**
+ * 参数拼装
+ */
+ private String argsArrayToString(Object[] paramsArray, String[] excludeParamNames)
+ {
+ StringBuilder params = new StringBuilder();
+ if (paramsArray != null && paramsArray.length > 0)
+ {
+ for (Object o : paramsArray)
+ {
+ if (StringUtils.isNotNull(o) && !isFilterObject(o))
+ {
+ try
+ {
+ String jsonObj = JSON.toJSONString(o, excludePropertyPreFilter(excludeParamNames));
+ params.append(jsonObj).append(" ");
+ if (params.length() >= PARAM_MAX_LENGTH)
+ {
+ return StringUtils.substring(params.toString(), 0, PARAM_MAX_LENGTH);
+ }
+ }
+ catch (Exception e)
+ {
+ log.error("请求参数拼装异常 msg:{}, 参数:{}", e.getMessage(), paramsArray, e);
+ }
+ }
+ }
+ }
+ return params.toString();
+ }
+
+ /**
+ * 忽略敏感属性
+ */
+ public PropertyPreExcludeFilter excludePropertyPreFilter(String[] excludeParamNames)
+ {
+ return new PropertyPreExcludeFilter().addExcludes(ArrayUtils.addAll(EXCLUDE_PROPERTIES, excludeParamNames));
+ }
+
+ /**
+ * 判断是否需要过滤的对象。
+ *
+ * @param o 对象信息。
+ * @return 如果是需要过滤的对象,则返回true;否则返回false。
+ */
+ @SuppressWarnings("rawtypes")
+ public boolean isFilterObject(final Object o)
+ {
+ Class> clazz = o.getClass();
+ if (clazz.isArray())
+ {
+ return clazz.getComponentType().isAssignableFrom(MultipartFile.class);
+ }
+ else if (Collection.class.isAssignableFrom(clazz))
+ {
+ Collection collection = (Collection) o;
+ for (Object value : collection)
+ {
+ return value instanceof MultipartFile;
+ }
+ }
+ else if (Map.class.isAssignableFrom(clazz))
+ {
+ Map map = (Map) o;
+ for (Object value : map.entrySet())
+ {
+ Map.Entry entry = (Map.Entry) value;
+ return entry.getValue() instanceof MultipartFile;
+ }
+ }
+ return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse
+ || o instanceof BindingResult;
+ }
+}
diff --git a/portal/backend/portal-framework/src/main/java/org/lingniu/portal/framework/aspectj/RateLimiterAspect.java b/portal/backend/portal-framework/src/main/java/org/lingniu/portal/framework/aspectj/RateLimiterAspect.java
new file mode 100644
index 0000000..a28c4f7
--- /dev/null
+++ b/portal/backend/portal-framework/src/main/java/org/lingniu/portal/framework/aspectj/RateLimiterAspect.java
@@ -0,0 +1,89 @@
+package org.lingniu.portal.framework.aspectj;
+
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.List;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.script.RedisScript;
+import org.springframework.stereotype.Component;
+import org.lingniu.portal.common.annotation.RateLimiter;
+import org.lingniu.portal.common.enums.LimitType;
+import org.lingniu.portal.common.exception.ServiceException;
+import org.lingniu.portal.common.utils.StringUtils;
+import org.lingniu.portal.common.utils.ip.IpUtils;
+
+/**
+ * 限流处理
+ *
+ * @author lingniu
+ */
+@Aspect
+@Component
+public class RateLimiterAspect
+{
+ private static final Logger log = LoggerFactory.getLogger(RateLimiterAspect.class);
+
+ private RedisTemplate