pom.xml
@@ -9,8 +9,7 @@ <version>3.6.4</version> <name>ruoyi</name> <url>http://www.ruoyi.vip</url> <description>è¥ä¾å¾®æå¡ç³»ç»</description> <description>å¾®æå¡ç³»ç»</description> <properties> <ruoyi.version>3.6.4</ruoyi.version> @@ -227,12 +226,12 @@ </dependencyManagement> <modules> <module>ruoyi-auth</module> <module>ruoyi-gateway</module> <module>ruoyi-visual</module> <module>ruoyi-modules</module> <module>ruoyi-api</module> <module>ruoyi-common</module> <module>se-auth</module> <module>se-gateway</module> <module>se-visual</module> <module>se-modules</module> <module>se-api</module> <module>se-common</module> </modules> <packaging>pom</packaging> se-api/pom.xml
@@ -9,10 +9,10 @@ <modelVersion>4.0.0</modelVersion> <modules> <module>ruoyi-api-system</module> <module>se-api-system</module> </modules> <artifactId>ruoyi-api</artifactId> <artifactId>se-api</artifactId> <packaging>pom</packaging> <description> se-auth/pom.xml
@@ -8,10 +8,10 @@ </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ruoyi-auth</artifactId> <artifactId>se-auth</artifactId> <description> ruoyi-authè®¤è¯ææä¸å¿ se-authè®¤è¯ææä¸å¿ </description> <dependencies> se-common/pom.xml
@@ -9,22 +9,22 @@ <modelVersion>4.0.0</modelVersion> <modules> <module>ruoyi-common-log</module> <module>ruoyi-common-core</module> <module>ruoyi-common-redis</module> <module>ruoyi-common-seata</module> <module>ruoyi-common-swagger</module> <module>ruoyi-common-security</module> <module>ruoyi-common-sensitive</module> <module>ruoyi-common-datascope</module> <module>ruoyi-common-datasource</module> <module>se-common-log</module> <module>se-common-core</module> <module>se-common-redis</module> <module>se-common-seata</module> <module>se-common-swagger</module> <module>se-common-security</module> <module>se-common-sensitive</module> <module>se-common-datascope</module> <module>se-common-datasource</module> </modules> <artifactId>ruoyi-common</artifactId> <artifactId>se-common</artifactId> <packaging>pom</packaging> <description> ruoyi-commonéç¨æ¨¡å se-commonéç¨æ¨¡å </description> </project> se-common/se-common-core/pom.xml
@@ -9,10 +9,10 @@ </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ruoyi-common-core</artifactId> <artifactId>se-common-core</artifactId> <description> ruoyi-common-coreæ ¸å¿æ¨¡å se-common-coreæ ¸å¿æ¨¡å </description> <dependencies> se-common/se-common-core/src/main/java/com/se/common/core/constant/CacheConstants.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,59 @@ package com.se.common.core.constant; /** * ç¼å常éä¿¡æ¯ * * @author admin */ public class CacheConstants { /** * ç¼åæææï¼é»è®¤720ï¼åéï¼ */ public final static long EXPIRATION = 720; /** * ç¼åå·æ°æ¶é´ï¼é»è®¤120ï¼åéï¼ */ public final static long REFRESH_TIME = 120; /** * å¯ç æå¤§éè¯¯æ¬¡æ° */ public final static int PASSWORD_MAX_RETRY_COUNT = 5; /** * å¯ç é宿¶é´ï¼é»è®¤10ï¼åéï¼ */ public final static long PASSWORD_LOCK_TIME = 10; /** * æéç¼ååç¼ */ public final static String LOGIN_TOKEN_KEY = "login_tokens:"; /** * éªè¯ç redis key */ public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; /** * åæ°ç®¡ç cache key */ public static final String SYS_CONFIG_KEY = "sys_config:"; /** * åå ¸ç®¡ç cache key */ public static final String SYS_DICT_KEY = "sys_dict:"; /** * ç»å½è´¦æ·å¯ç éè¯¯æ¬¡æ° redis key */ public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; /** * ç»å½IPé»åå cache key */ public static final String SYS_LOGIN_BLACKIPLIST = SYS_CONFIG_KEY + "sys.login.blackIPList"; } se-common/se-common-core/src/main/java/com/se/common/core/constant/GenConstants.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,117 @@ package com.se.common.core.constant; /** * 代ç çæéç¨å¸¸é * * @author admin */ public class GenConstants { /** å表ï¼å¢å æ¹æ¥ï¼ */ public static final String TPL_CRUD = "crud"; /** æ 表ï¼å¢å æ¹æ¥ï¼ */ public static final String TPL_TREE = "tree"; /** 主å表ï¼å¢å æ¹æ¥ï¼ */ public static final String TPL_SUB = "sub"; /** æ ç¼ç åæ®µ */ public static final String TREE_CODE = "treeCode"; /** æ ç¶ç¼ç åæ®µ */ public static final String TREE_PARENT_CODE = "treeParentCode"; /** æ åç§°åæ®µ */ public static final String TREE_NAME = "treeName"; /** ä¸çº§èåIDåæ®µ */ public static final String PARENT_MENU_ID = "parentMenuId"; /** ä¸çº§èååç§°åæ®µ */ public static final String PARENT_MENU_NAME = "parentMenuName"; /** æ°æ®åºå符串类å */ public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" }; /** æ°æ®åºææ¬ç±»å */ public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" }; /** æ°æ®åºæ¶é´ç±»å */ public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" }; /** æ°æ®åºæ°åç±»å */ public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer", "bit", "bigint", "float", "double", "decimal" }; /** 页é¢ä¸éè¦ç¼è¾å段 */ public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" }; /** 页é¢ä¸éè¦æ¾ç¤ºçåè¡¨åæ®µ */ public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by", "update_time" }; /** 页é¢ä¸éè¦æ¥è¯¢å段 */ public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by", "update_time", "remark" }; /** Entityåºç±»å段 */ public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" }; /** Treeåºç±»å段 */ public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors" }; /** ææ¬æ¡ */ public static final String HTML_INPUT = "input"; /** ææ¬å */ public static final String HTML_TEXTAREA = "textarea"; /** ä¸ææ¡ */ public static final String HTML_SELECT = "select"; /** åéæ¡ */ public static final String HTML_RADIO = "radio"; /** å¤éæ¡ */ public static final String HTML_CHECKBOX = "checkbox"; /** æ¥ææ§ä»¶ */ public static final String HTML_DATETIME = "datetime"; /** å¾çä¸ä¼ æ§ä»¶ */ public static final String HTML_IMAGE_UPLOAD = "imageUpload"; /** æä»¶ä¸ä¼ æ§ä»¶ */ public static final String HTML_FILE_UPLOAD = "fileUpload"; /** å¯ææ¬æ§ä»¶ */ public static final String HTML_EDITOR = "editor"; /** å符串类å */ public static final String TYPE_STRING = "String"; /** æ´å */ public static final String TYPE_INTEGER = "Integer"; /** é¿æ´å */ public static final String TYPE_LONG = "Long"; /** æµ®ç¹å */ public static final String TYPE_DOUBLE = "Double"; /** é«ç²¾åº¦è®¡ç®ç±»å */ public static final String TYPE_BIGDECIMAL = "BigDecimal"; /** æ¶é´ç±»å */ public static final String TYPE_DATE = "Date"; /** æ¨¡ç³æ¥è¯¢ */ public static final String QUERY_LIKE = "LIKE"; /** ç¸çæ¥è¯¢ */ public static final String QUERY_EQ = "EQ"; /** éè¦ */ public static final String REQUIRE = "1"; } se-common/se-common-core/src/main/java/com/se/common/core/constant/HttpStatus.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,94 @@ package com.se.common.core.constant; /** * è¿åç¶æç * * @author admin */ public class HttpStatus { /** * æä½æå */ public static final int SUCCESS = 200; /** * 对象å建æå */ public static final int CREATED = 201; /** * 请æ±å·²ç»è¢«æ¥å */ public static final int ACCEPTED = 202; /** * æä½å·²ç»æ§è¡æåï¼ä½æ¯æ²¡æè¿åæ°æ® */ public static final int NO_CONTENT = 204; /** * èµæºå·²è¢«ç§»é¤ */ public static final int MOVED_PERM = 301; /** * éå®å */ public static final int SEE_OTHER = 303; /** * èµæºæ²¡æè¢«ä¿®æ¹ */ public static final int NOT_MODIFIED = 304; /** * åæ°å表é误ï¼ç¼ºå°ï¼æ ¼å¼ä¸å¹é ï¼ */ public static final int BAD_REQUEST = 400; /** * æªææ */ public static final int UNAUTHORIZED = 401; /** * 访é®åéï¼ææè¿æ */ public static final int FORBIDDEN = 403; /** * èµæºï¼æå¡æªæ¾å° */ public static final int NOT_FOUND = 404; /** * ä¸å 许çhttpæ¹æ³ */ public static final int BAD_METHOD = 405; /** * èµæºå²çªï¼æè èµæºè¢«é */ public static final int CONFLICT = 409; /** * 䏿¯æçæ°æ®ï¼åªä½ç±»å */ public static final int UNSUPPORTED_TYPE = 415; /** * ç³»ç»å é¨é误 */ public static final int ERROR = 500; /** * æ¥å£æªå®ç° */ public static final int NOT_IMPLEMENTED = 501; /** * ç³»ç»è¦åæ¶æ¯ */ public static final int WARN = 601; } se-common/se-common-core/src/main/java/com/se/common/core/constant/ScheduleConstants.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,50 @@ package com.se.common.core.constant; /** * ä»»å¡è°åº¦éç¨å¸¸é * * @author admin */ public class ScheduleConstants { public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME"; /** æ§è¡ç®æ key */ public static final String TASK_PROPERTIES = "TASK_PROPERTIES"; /** é»è®¤ */ public static final String MISFIRE_DEFAULT = "0"; /** ç«å³è§¦åæ§è¡ */ public static final String MISFIRE_IGNORE_MISFIRES = "1"; /** 触å䏿¬¡æ§è¡ */ public static final String MISFIRE_FIRE_AND_PROCEED = "2"; /** ä¸è§¦åç«å³æ§è¡ */ public static final String MISFIRE_DO_NOTHING = "3"; public enum Status { /** * æ£å¸¸ */ NORMAL("0"), /** * æå */ PAUSE("1"); private String value; private Status(String value) { this.value = value; } public String getValue() { return value; } } } se-common/se-common-core/src/main/java/com/se/common/core/constant/TokenConstants.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,25 @@ package com.se.common.core.constant; /** * TokençKey常é * * @author admin */ public class TokenConstants { /** * 令çèªå®ä¹æ è¯ */ public static final String AUTHENTICATION = "Authorization"; /** * 令çåç¼ */ public static final String PREFIX = "Bearer "; /** * 令çç§é¥ */ public final static String SECRET = "abcdefghijklmnopqrstuvwxyz"; } se-common/se-common-core/src/main/java/com/se/common/core/context/SecurityContextHolder.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,98 @@ package com.se.common.core.context; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import com.alibaba.ttl.TransmittableThreadLocal; import com.se.common.core.constant.SecurityConstants; import com.se.common.core.text.Convert; import com.se.common.core.utils.StringUtils; /** * è·åå½å线ç¨åéä¸ç ç¨æ·idãç¨æ·åç§°ãTokençä¿¡æ¯ * 注æï¼ å¿ é¡»å¨ç½å ³éè¿è¯·æ±å¤´çæ¹æ³ä¼ å ¥ï¼åæ¶å¨HeaderInterceptoræ¦æªå¨è®¾ç½®å¼ã å¦åè¿éæ æ³è·å * * @author admin */ public class SecurityContextHolder { private static final TransmittableThreadLocal<Map<String, Object>> THREAD_LOCAL = new TransmittableThreadLocal<>(); public static void set(String key, Object value) { Map<String, Object> map = getLocalMap(); map.put(key, value == null ? StringUtils.EMPTY : value); } public static String get(String key) { Map<String, Object> map = getLocalMap(); return Convert.toStr(map.getOrDefault(key, StringUtils.EMPTY)); } public static <T> T get(String key, Class<T> clazz) { Map<String, Object> map = getLocalMap(); return StringUtils.cast(map.getOrDefault(key, null)); } public static Map<String, Object> getLocalMap() { Map<String, Object> map = THREAD_LOCAL.get(); if (map == null) { map = new ConcurrentHashMap<String, Object>(); THREAD_LOCAL.set(map); } return map; } public static void setLocalMap(Map<String, Object> threadLocalMap) { THREAD_LOCAL.set(threadLocalMap); } public static Long getUserId() { return Convert.toLong(get(SecurityConstants.DETAILS_USER_ID), 0L); } public static void setUserId(String account) { set(SecurityConstants.DETAILS_USER_ID, account); } public static String getUserName() { return get(SecurityConstants.DETAILS_USERNAME); } public static void setUserName(String username) { set(SecurityConstants.DETAILS_USERNAME, username); } public static String getUserKey() { return get(SecurityConstants.USER_KEY); } public static void setUserKey(String userKey) { set(SecurityConstants.USER_KEY, userKey); } public static String getPermission() { return get(SecurityConstants.ROLE_PERMISSION); } public static void setPermission(String permissions) { set(SecurityConstants.ROLE_PERMISSION, permissions); } public static void remove() { THREAD_LOCAL.remove(); } } se-common/se-common-core/src/main/java/com/se/common/core/exception/DemoModeException.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ package com.se.common.core.exception; /** * æ¼ç¤ºæ¨¡å¼å¼å¸¸ * * @author admin */ public class DemoModeException extends RuntimeException { private static final long serialVersionUID = 1L; public DemoModeException() { } } se-common/se-common-core/src/main/java/com/se/common/core/exception/InnerAuthException.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.se.common.core.exception; /** * å é¨è®¤è¯å¼å¸¸ * * @author admin */ public class InnerAuthException extends RuntimeException { private static final long serialVersionUID = 1L; public InnerAuthException(String message) { super(message); } } se-common/se-common-core/src/main/java/com/se/common/core/exception/PreAuthorizeException.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ package com.se.common.core.exception; /** * æéå¼å¸¸ * * @author admin */ public class PreAuthorizeException extends RuntimeException { private static final long serialVersionUID = 1L; public PreAuthorizeException() { } } se-common/se-common-core/src/main/java/com/se/common/core/exception/UtilException.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ package com.se.common.core.exception; /** * å·¥å ·ç±»å¼å¸¸ * * @author admin */ public class UtilException extends RuntimeException { private static final long serialVersionUID = 8247610319171014183L; public UtilException(Throwable e) { super(e.getMessage(), e); } public UtilException(String message) { super(message); } public UtilException(String message, Throwable throwable) { super(message, throwable); } } se-common/se-common-core/src/main/java/com/se/common/core/exception/auth/NotLoginException.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.se.common.core.exception.auth; /** * æªè½éè¿çç»å½è®¤è¯å¼å¸¸ * * @author admin */ public class NotLoginException extends RuntimeException { private static final long serialVersionUID = 1L; public NotLoginException(String message) { super(message); } } se-common/se-common-core/src/main/java/com/se/common/core/exception/base/BaseException.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,79 @@ package com.se.common.core.exception.base; /** * åºç¡å¼å¸¸ * * @author admin */ public class BaseException extends RuntimeException { private static final long serialVersionUID = 1L; /** * æå±æ¨¡å */ private String module; /** * é误ç */ private String code; /** * é误ç 对åºçåæ° */ private Object[] args; /** * éè¯¯æ¶æ¯ */ private String defaultMessage; public BaseException(String module, String code, Object[] args, String defaultMessage) { this.module = module; this.code = code; this.args = args; this.defaultMessage = defaultMessage; } public BaseException(String module, String code, Object[] args) { this(module, code, args, null); } public BaseException(String module, String defaultMessage) { this(module, null, null, defaultMessage); } public BaseException(String code, Object[] args) { this(null, code, args, null); } public BaseException(String defaultMessage) { this(null, null, null, defaultMessage); } public String getModule() { return module; } public String getCode() { return code; } public Object[] getArgs() { return args; } public String getDefaultMessage() { return defaultMessage; } } se-common/se-common-core/src/main/java/com/se/common/core/exception/file/FileException.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ package com.se.common.core.exception.file; import com.se.common.core.exception.base.BaseException; /** * æä»¶ä¿¡æ¯å¼å¸¸ç±» * * @author admin */ public class FileException extends BaseException { private static final long serialVersionUID = 1L; public FileException(String code, Object[] args, String msg) { super("file", code, args, msg); } } se-common/se-common-core/src/main/java/com/se/common/core/exception/file/FileUploadException.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,61 @@ package com.se.common.core.exception.file; import java.io.PrintStream; import java.io.PrintWriter; /** * æä»¶ä¸ä¼ å¼å¸¸ç±» * * @author admin */ public class FileUploadException extends Exception { private static final long serialVersionUID = 1L; private final Throwable cause; public FileUploadException() { this(null, null); } public FileUploadException(final String msg) { this(msg, null); } public FileUploadException(String msg, Throwable cause) { super(msg); this.cause = cause; } @Override public void printStackTrace(PrintStream stream) { super.printStackTrace(stream); if (cause != null) { stream.println("Caused by:"); cause.printStackTrace(stream); } } @Override public void printStackTrace(PrintWriter writer) { super.printStackTrace(writer); if (cause != null) { writer.println("Caused by:"); cause.printStackTrace(writer); } } @Override public Throwable getCause() { return cause; } } se-common/se-common-core/src/main/java/com/se/common/core/exception/job/TaskException.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,34 @@ package com.se.common.core.exception.job; /** * 计åçç¥å¼å¸¸ * * @author admin */ public class TaskException extends Exception { private static final long serialVersionUID = 1L; private Code code; public TaskException(String msg, Code code) { this(msg, code, null); } public TaskException(String msg, Code code, Exception nestedEx) { super(msg, nestedEx); this.code = code; } public Code getCode() { return code; } public enum Code { TASK_EXISTS, NO_TASK_EXISTS, TASK_ALREADY_STARTED, UNKNOWN, CONFIG_ERROR, TASK_NODE_NOT_AVAILABLE } } se-common/se-common-core/src/main/java/com/se/common/core/exception/user/UserException.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.se.common.core.exception.user; import com.se.common.core.exception.base.BaseException; /** * ç¨æ·ä¿¡æ¯å¼å¸¸ç±» * * @author admin */ public class UserException extends BaseException { private static final long serialVersionUID = 1L; public UserException(String code, Object[] args) { super("user", code, args, null); } } se-common/se-common-core/src/main/java/com/se/common/core/exception/user/UserPasswordNotMatchException.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.se.common.core.exception.user; /** * ç¨æ·å¯ç 䏿£ç¡®æä¸ç¬¦åè§èå¼å¸¸ç±» * * @author admin */ public class UserPasswordNotMatchException extends UserException { private static final long serialVersionUID = 1L; public UserPasswordNotMatchException() { super("user.password.not.match", null); } } se-common/se-common-core/src/main/java/com/se/common/core/text/CharsetKit.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,86 @@ package com.se.common.core.text; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import com.se.common.core.utils.StringUtils; /** * å符éå·¥å ·ç±» * * @author admin */ public class CharsetKit { /** ISO-8859-1 */ public static final String ISO_8859_1 = "ISO-8859-1"; /** UTF-8 */ public static final String UTF_8 = "UTF-8"; /** GBK */ public static final String GBK = "GBK"; /** ISO-8859-1 */ public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1); /** UTF-8 */ public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); /** GBK */ public static final Charset CHARSET_GBK = Charset.forName(GBK); /** * 转æ¢ä¸ºCharset对象 * * @param charset å符éï¼ä¸ºç©ºåè¿åé»è®¤å符é * @return Charset */ public static Charset charset(String charset) { return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); } /** * 转æ¢å符串çå符éç¼ç * * @param source å符串 * @param srcCharset æºå符éï¼é»è®¤ISO-8859-1 * @param destCharset ç®æ å符éï¼é»è®¤UTF-8 * @return 转æ¢åçå符é */ public static String convert(String source, String srcCharset, String destCharset) { return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset)); } /** * 转æ¢å符串çå符éç¼ç * * @param source å符串 * @param srcCharset æºå符éï¼é»è®¤ISO-8859-1 * @param destCharset ç®æ å符éï¼é»è®¤UTF-8 * @return 转æ¢åçå符é */ public static String convert(String source, Charset srcCharset, Charset destCharset) { if (null == srcCharset) { srcCharset = StandardCharsets.ISO_8859_1; } if (null == destCharset) { destCharset = StandardCharsets.UTF_8; } if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) { return source; } return new String(source.getBytes(srcCharset), destCharset); } /** * @return ç³»ç»å符éç¼ç */ public static String systemCharset() { return Charset.defaultCharset().name(); } } se-common/se-common-core/src/main/java/com/se/common/core/utils/JwtUtils.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,123 @@ package com.se.common.core.utils; import java.util.Map; import com.se.common.core.constant.SecurityConstants; import com.se.common.core.constant.TokenConstants; import com.se.common.core.text.Convert; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; /** * Jwtå·¥å ·ç±» * * @author admin */ public class JwtUtils { public static String secret = TokenConstants.SECRET; /** * 仿°æ®å£°æçæä»¤ç * * @param claims æ°æ®å£°æ * @return 令ç */ public static String createToken(Map<String, Object> claims) { String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact(); return token; } /** * ä»ä»¤çä¸è·åæ°æ®å£°æ * * @param token 令ç * @return æ°æ®å£°æ */ public static Claims parseToken(String token) { return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); } /** * æ ¹æ®ä»¤çè·åç¨æ·æ è¯ * * @param token 令ç * @return ç¨æ·ID */ public static String getUserKey(String token) { Claims claims = parseToken(token); return getValue(claims, SecurityConstants.USER_KEY); } /** * æ ¹æ®ä»¤çè·åç¨æ·æ è¯ * * @param claims èº«ä»½ä¿¡æ¯ * @return ç¨æ·ID */ public static String getUserKey(Claims claims) { return getValue(claims, SecurityConstants.USER_KEY); } /** * æ ¹æ®ä»¤çè·åç¨æ·ID * * @param token 令ç * @return ç¨æ·ID */ public static String getUserId(String token) { Claims claims = parseToken(token); return getValue(claims, SecurityConstants.DETAILS_USER_ID); } /** * æ ¹æ®èº«ä»½ä¿¡æ¯è·åç¨æ·ID * * @param claims èº«ä»½ä¿¡æ¯ * @return ç¨æ·ID */ public static String getUserId(Claims claims) { return getValue(claims, SecurityConstants.DETAILS_USER_ID); } /** * æ ¹æ®ä»¤çè·åç¨æ·å * * @param token 令ç * @return ç¨æ·å */ public static String getUserName(String token) { Claims claims = parseToken(token); return getValue(claims, SecurityConstants.DETAILS_USERNAME); } /** * æ ¹æ®èº«ä»½ä¿¡æ¯è·åç¨æ·å * * @param claims èº«ä»½ä¿¡æ¯ * @return ç¨æ·å */ public static String getUserName(Claims claims) { return getValue(claims, SecurityConstants.DETAILS_USERNAME); } /** * æ ¹æ®èº«ä»½ä¿¡æ¯è·åé®å¼ * * @param claims èº«ä»½ä¿¡æ¯ * @param key é® * @return å¼ */ public static String getValue(Claims claims, String key) { return Convert.toStr(claims.get(key), ""); } } se-common/se-common-core/src/main/java/com/se/common/core/utils/bean/BeanValidators.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,24 @@ package com.se.common.core.utils.bean; import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import javax.validation.Validator; /** * beanå¯¹è±¡å±æ§éªè¯ * * @author admin */ public class BeanValidators { public static void validateWithException(Validator validator, Object object, Class<?>... groups) throws ConstraintViolationException { Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups); if (!constraintViolations.isEmpty()) { throw new ConstraintViolationException(constraintViolations); } } } se-common/se-common-core/src/main/java/com/se/common/core/utils/file/MimeTypeUtils.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,59 @@ package com.se.common.core.utils.file; /** * åªä½ç±»åå·¥å ·ç±» * * @author admin */ public class MimeTypeUtils { public static final String IMAGE_PNG = "image/png"; public static final String IMAGE_JPG = "image/jpg"; public static final String IMAGE_JPEG = "image/jpeg"; public static final String IMAGE_BMP = "image/bmp"; public static final String IMAGE_GIF = "image/gif"; public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" }; public static final String[] FLASH_EXTENSION = { "swf", "flv" }; public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", "asf", "rm", "rmvb" }; public static final String[] VIDEO_EXTENSION = { "mp4", "avi", "rmvb" }; public static final String[] DEFAULT_ALLOWED_EXTENSION = { // å¾ç "bmp", "gif", "jpg", "jpeg", "png", // word excel powerpoint "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt", // å缩æä»¶ "rar", "zip", "gz", "bz2", // è§é¢æ ¼å¼ "mp4", "avi", "rmvb", "pdf" }; public static String getExtension(String prefix) { switch (prefix) { case IMAGE_PNG: return "png"; case IMAGE_JPG: return "jpg"; case IMAGE_JPEG: return "jpeg"; case IMAGE_BMP: return "bmp"; case IMAGE_GIF: return "gif"; default: return ""; } } } se-common/se-common-core/src/main/java/com/se/common/core/utils/poi/ExcelUtil.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,1538 @@ package com.se.common.core.utils.poi; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.math.BigDecimal; import java.text.DecimalFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; import com.se.common.core.annotation.Excel; import com.se.common.core.annotation.Excels; import com.se.common.core.exception.UtilException; import com.se.common.core.text.Convert; import com.se.common.core.utils.file.FileTypeUtils; import com.se.common.core.utils.file.ImageUtils; import com.se.common.core.utils.reflect.ReflectUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.RegExUtils; import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.ClientAnchor; import org.apache.poi.ss.usermodel.DataFormat; import org.apache.poi.ss.usermodel.DataValidation; import org.apache.poi.ss.usermodel.DataValidationConstraint; import org.apache.poi.ss.usermodel.DataValidationHelper; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Drawing; import org.apache.poi.ss.usermodel.FillPatternType; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.Name; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.VerticalAlignment; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFDataValidation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.se.common.core.utils.DateUtils; import com.se.common.core.utils.StringUtils; /** * Excelç¸å ³å¤ç * * @author admin */ public class ExcelUtil<T> { private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); public static final String FORMULA_REGEX_STR = "=|-|\\+|@"; public static final String[] FORMULA_STR = { "=", "-", "+", "@" }; /** * Excel sheetæå¤§è¡æ°ï¼é»è®¤65536 */ public static final int sheetSize = 65536; /** * å·¥ä½è¡¨åç§° */ private String sheetName; /** * 导åºç±»åï¼EXPORT:å¯¼åºæ°æ®ï¼IMPORTï¼å¯¼å ¥æ¨¡æ¿ï¼ */ private Excel.Type type; /** * å·¥ä½è对象 */ private Workbook wb; /** * å·¥ä½è¡¨å¯¹è±¡ */ private Sheet sheet; /** * æ ·å¼å表 */ private Map<String, CellStyle> styles; /** * å¯¼å ¥å¯¼åºæ°æ®å表 */ private List<T> list; /** * 注解å表 */ private List<Object[]> fields; /** * å½åè¡å· */ private int rownum; /** * æ é¢ */ private String title; /** * æå¤§é«åº¦ */ private short maxHeight; /** * åå¹¶åæåè¡æ° */ private int subMergedLastRowNum = 0; /** * åå¹¶åå¼å§è¡æ° */ private int subMergedFirstRowNum = 1; /** * 对象çååè¡¨æ¹æ³ */ private Method subMethod; /** * 对象çååè¡¨å±æ§ */ private List<Field> subFields; /** * ç»è®¡å表 */ private Map<Integer, Double> statistics = new HashMap<Integer, Double>(); /** * æ°åæ ¼å¼ */ private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); /** * å®ä½å¯¹è±¡ */ public Class<T> clazz; /** * éè¦æé¤å屿§ */ public String[] excludeFields; public ExcelUtil(Class<T> clazz) { this.clazz = clazz; } /** * éèExcelä¸å屿§ * * @param fields å屿§å 示ä¾[å个"name"/å¤ä¸ª"id","name"] * @throws Exception */ public void hideColumn(String... fields) { this.excludeFields = fields; } public void init(List<T> list, String sheetName, String title, Excel.Type type) { if (list == null) { list = new ArrayList<T>(); } this.list = list; this.sheetName = sheetName; this.type = type; this.title = title; createExcelField(); createWorkbook(); createTitle(); createSubHead(); } /** * å建excel第ä¸è¡æ é¢ */ public void createTitle() { if (StringUtils.isNotEmpty(title)) { subMergedFirstRowNum++; subMergedLastRowNum++; int titleLastCol = this.fields.size() - 1; if (isSubList()) { titleLastCol = titleLastCol + subFields.size() - 1; } Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0); titleRow.setHeightInPoints(30); Cell titleCell = titleRow.createCell(0); titleCell.setCellStyle(styles.get("title")); titleCell.setCellValue(title); sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), titleLastCol)); } } /** * å建对象çåå表åç§° */ public void createSubHead() { if (isSubList()) { subMergedFirstRowNum++; subMergedLastRowNum++; Row subRow = sheet.createRow(rownum); int excelNum = 0; for (Object[] objects : fields) { Excel attr = (Excel) objects[1]; Cell headCell1 = subRow.createCell(excelNum); headCell1.setCellValue(attr.name()); headCell1.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); excelNum++; } int headFirstRow = excelNum - 1; int headLastRow = headFirstRow + subFields.size() - 1; if (headLastRow > headFirstRow) { sheet.addMergedRegion(new CellRangeAddress(rownum, rownum, headFirstRow, headLastRow)); } rownum++; } } /** * 对excel表åé»è®¤ç¬¬ä¸ä¸ªç´¢å¼åè½¬æ¢ælist * * @param is è¾å ¥æµ * @return 转æ¢åéå */ public List<T> importExcel(InputStream is) { List<T> list = null; try { list = importExcel(is, 0); } catch (Exception e) { log.error("å¯¼å ¥Excelå¼å¸¸{}", e.getMessage()); throw new UtilException(e.getMessage()); } finally { IOUtils.closeQuietly(is); } return list; } /** * 对excel表åé»è®¤ç¬¬ä¸ä¸ªç´¢å¼åè½¬æ¢ælist * * @param is è¾å ¥æµ * @param titleNum æ é¢å ç¨è¡æ° * @return 转æ¢åéå */ public List<T> importExcel(InputStream is, int titleNum) throws Exception { return importExcel(StringUtils.EMPTY, is, titleNum); } /** * 对excel表åæå®è¡¨æ ¼ç´¢å¼åè½¬æ¢ælist * * @param sheetName è¡¨æ ¼ç´¢å¼å * @param titleNum æ é¢å ç¨è¡æ° * @param is è¾å ¥æµ * @return 转æ¢åéå */ public List<T> importExcel(String sheetName, InputStream is, int titleNum) throws Exception { this.type = Excel.Type.IMPORT; this.wb = WorkbookFactory.create(is); List<T> list = new ArrayList<T>(); // 妿æå®sheetå,ååæå®sheetä¸çå 容 å¦åé»è®¤æå第1个sheet Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0); if (sheet == null) { throw new IOException("æä»¶sheetä¸åå¨"); } // è·åæåä¸ä¸ªé空è¡çè¡ä¸æ ï¼æ¯å¦æ»è¡æ°ä¸ºnï¼åè¿åç为n-1 int rows = sheet.getLastRowNum(); if (rows > 0) { // å®ä¹ä¸ä¸ªmapç¨äºåæ¾excelåçåºå·åfield. Map<String, Integer> cellMap = new HashMap<String, Integer>(); // è·å表头 Row heard = sheet.getRow(titleNum); for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) { Cell cell = heard.getCell(i); if (StringUtils.isNotNull(cell)) { String value = this.getCellValue(heard, i).toString(); cellMap.put(value, i); } else { cellMap.put(null, i); } } // ææ°æ®æ¶æå¤ç å¾å°ç±»çææfield. List<Object[]> fields = this.getFields(); Map<Integer, Object[]> fieldsMap = new HashMap<Integer, Object[]>(); for (Object[] objects : fields) { Excel attr = (Excel) objects[1]; Integer column = cellMap.get(attr.name()); if (column != null) { fieldsMap.put(column, objects); } } for (int i = titleNum + 1; i <= rows; i++) { // ä»ç¬¬2è¡å¼å§åæ°æ®,é»è®¤ç¬¬ä¸è¡æ¯è¡¨å¤´. Row row = sheet.getRow(i); // 夿å½åè¡æ¯å¦æ¯ç©ºè¡ if (isRowEmpty(row)) { continue; } T entity = null; for (Map.Entry<Integer, Object[]> entry : fieldsMap.entrySet()) { Object val = this.getCellValue(row, entry.getKey()); // 妿ä¸åå¨å®ä¾åæ°å»º. entity = (entity == null ? clazz.newInstance() : entity); // ä»mapä¸å¾å°å¯¹åºåçfield. Field field = (Field) entry.getValue()[0]; Excel attr = (Excel) entry.getValue()[1]; // åå¾ç±»å,å¹¶æ ¹æ®å¯¹è±¡ç±»å设置å¼. Class<?> fieldType = field.getType(); if (String.class == fieldType) { String s = Convert.toStr(val); if (StringUtils.endsWith(s, ".0")) { val = StringUtils.substringBefore(s, ".0"); } else { String dateFormat = field.getAnnotation(Excel.class).dateFormat(); if (StringUtils.isNotEmpty(dateFormat)) { val = parseDateToStr(dateFormat, val); } else { val = Convert.toStr(val); } } } else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) { val = Convert.toInt(val); } else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) { val = Convert.toLong(val); } else if (Double.TYPE == fieldType || Double.class == fieldType) { val = Convert.toDouble(val); } else if (Float.TYPE == fieldType || Float.class == fieldType) { val = Convert.toFloat(val); } else if (BigDecimal.class == fieldType) { val = Convert.toBigDecimal(val); } else if (Date.class == fieldType) { if (val instanceof String) { val = DateUtils.parseDate(val); } else if (val instanceof Double) { val = DateUtil.getJavaDate((Double) val); } } else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) { val = Convert.toBool(val, false); } if (StringUtils.isNotNull(fieldType)) { String propertyName = field.getName(); if (StringUtils.isNotEmpty(attr.targetAttr())) { propertyName = field.getName() + "." + attr.targetAttr(); } if (StringUtils.isNotEmpty(attr.readConverterExp())) { val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); } else if (!attr.handler().equals(ExcelHandlerAdapter.class)) { val = dataFormatHandlerAdapter(val, attr, null); } ReflectUtils.invokeSetter(entity, propertyName, val); } } list.add(entity); } } return list; } /** * 对listæ°æ®æºå°å ¶éé¢çæ°æ®å¯¼å ¥å°excel表å * * @param response è¿åæ°æ® * @param list å¯¼åºæ°æ®éå * @param sheetName å·¥ä½è¡¨çåç§° * @return ç»æ */ public void exportExcel(HttpServletResponse response, List<T> list, String sheetName) { exportExcel(response, list, sheetName, StringUtils.EMPTY); } /** * 对listæ°æ®æºå°å ¶éé¢çæ°æ®å¯¼å ¥å°excel表å * * @param response è¿åæ°æ® * @param list å¯¼åºæ°æ®éå * @param sheetName å·¥ä½è¡¨çåç§° * @param title æ é¢ * @return ç»æ */ public void exportExcel(HttpServletResponse response, List<T> list, String sheetName, String title) { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); this.init(list, sheetName, title, Excel.Type.EXPORT); exportExcel(response); } /** * 对listæ°æ®æºå°å ¶éé¢çæ°æ®å¯¼å ¥å°excel表å * * @param sheetName å·¥ä½è¡¨çåç§° * @return ç»æ */ public void importTemplateExcel(HttpServletResponse response, String sheetName) { importTemplateExcel(response, sheetName, StringUtils.EMPTY); } /** * 对listæ°æ®æºå°å ¶éé¢çæ°æ®å¯¼å ¥å°excel表å * * @param sheetName å·¥ä½è¡¨çåç§° * @param title æ é¢ * @return ç»æ */ public void importTemplateExcel(HttpServletResponse response, String sheetName, String title) { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); this.init(null, sheetName, title, Excel.Type.IMPORT); exportExcel(response); } /** * 对listæ°æ®æºå°å ¶éé¢çæ°æ®å¯¼å ¥å°excel表å * * @return ç»æ */ public void exportExcel(HttpServletResponse response) { try { writeSheet(); wb.write(response.getOutputStream()); } catch (Exception e) { log.error("导åºExcelå¼å¸¸{}", e.getMessage()); } finally { IOUtils.closeQuietly(wb); } } /** * å建åå ¥æ°æ®å°Sheet */ public void writeSheet() { // ååºä¸å ±æå¤å°ä¸ªsheet. int sheetNo = Math.max(1, (int) Math.ceil(list.size() * 1.0 / sheetSize)); for (int index = 0; index < sheetNo; index++) { createSheet(sheetNo, index); // 产çä¸è¡ Row row = sheet.createRow(rownum); int column = 0; // åå ¥åä¸ªåæ®µçå头åç§° for (Object[] os : fields) { Field field = (Field) os[0]; Excel excel = (Excel) os[1]; if (Collection.class.isAssignableFrom(field.getType())) { for (Field subField : subFields) { Excel subExcel = subField.getAnnotation(Excel.class); this.createHeadCell(subExcel, row, column++); } } else { this.createHeadCell(excel, row, column++); } } if (Excel.Type.EXPORT.equals(type)) { fillExcelData(index, row); addStatisticsRow(); } } } /** * å¡«å excelæ°æ® * * @param index åºå· * @param row åå æ ¼è¡ */ @SuppressWarnings("unchecked") public void fillExcelData(int index, Row row) { int startNo = index * sheetSize; int endNo = Math.min(startNo + sheetSize, list.size()); int rowNo = (1 + rownum) - startNo; for (int i = startNo; i < endNo; i++) { rowNo = isSubList() ? (i > 1 ? rowNo + 1 : rowNo + i) : i + 1 + rownum - startNo; row = sheet.createRow(rowNo); // å¾å°å¯¼åºå¯¹è±¡. T vo = (T) list.get(i); Collection<?> subList = null; if (isSubList()) { if (isSubListValue(vo)) { subList = getListCellValue(vo); subMergedLastRowNum = subMergedLastRowNum + subList.size(); } else { subMergedFirstRowNum++; subMergedLastRowNum++; } } int column = 0; for (Object[] os : fields) { Field field = (Field) os[0]; Excel excel = (Excel) os[1]; if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) { boolean subFirst = false; for (Object obj : subList) { if (subFirst) { rowNo++; row = sheet.createRow(rowNo); } List<Field> subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); int subIndex = 0; for (Field subField : subFields) { if (subField.isAnnotationPresent(Excel.class)) { subField.setAccessible(true); Excel attr = subField.getAnnotation(Excel.class); this.addCell(attr, row, (T) obj, subField, column + subIndex); } subIndex++; } subFirst = true; } this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size(); } else { this.addCell(excel, row, vo, field, column++); } } } } /** * åå»ºè¡¨æ ¼æ ·å¼ * * @param wb å·¥ä½è对象 * @return æ ·å¼å表 */ private Map<String, CellStyle> createStyles(Workbook wb) { // åå ¥åæ¡è®°å½,æ¯æ¡è®°å½å¯¹åºexcel表ä¸çä¸è¡ Map<String, CellStyle> styles = new HashMap<String, CellStyle>(); CellStyle style = wb.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); Font titleFont = wb.createFont(); titleFont.setFontName("Arial"); titleFont.setFontHeightInPoints((short) 16); titleFont.setBold(true); style.setFont(titleFont); DataFormat dataFormat = wb.createDataFormat(); style.setDataFormat(dataFormat.getFormat("@")); styles.put("title", style); style = wb.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); style.setBorderRight(BorderStyle.THIN); style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setBorderLeft(BorderStyle.THIN); style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setBorderTop(BorderStyle.THIN); style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setBorderBottom(BorderStyle.THIN); style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); Font dataFont = wb.createFont(); dataFont.setFontName("Arial"); dataFont.setFontHeightInPoints((short) 10); style.setFont(dataFont); styles.put("data", style); style = wb.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); Font totalFont = wb.createFont(); totalFont.setFontName("Arial"); totalFont.setFontHeightInPoints((short) 10); style.setFont(totalFont); styles.put("total", style); styles.putAll(annotationHeaderStyles(wb, styles)); styles.putAll(annotationDataStyles(wb)); return styles; } /** * æ ¹æ®Excel注解åå»ºè¡¨æ ¼å¤´æ ·å¼ * * @param wb å·¥ä½è对象 * @return èªå®ä¹æ ·å¼å表 */ private Map<String, CellStyle> annotationHeaderStyles(Workbook wb, Map<String, CellStyle> styles) { Map<String, CellStyle> headerStyles = new HashMap<String, CellStyle>(); for (Object[] os : fields) { Excel excel = (Excel) os[1]; String key = StringUtils.format("header_{}_{}", excel.headerColor(), excel.headerBackgroundColor()); if (!headerStyles.containsKey(key)) { CellStyle style = wb.createCellStyle(); style.cloneStyleFrom(styles.get("data")); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); style.setFillForegroundColor(excel.headerBackgroundColor().index); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); Font headerFont = wb.createFont(); headerFont.setFontName("Arial"); headerFont.setFontHeightInPoints((short) 10); headerFont.setBold(true); headerFont.setColor(excel.headerColor().index); style.setFont(headerFont); // è®¾ç½®è¡¨æ ¼å¤´åå æ ¼ææ¬å½¢å¼ DataFormat dataFormat = wb.createDataFormat(); style.setDataFormat(dataFormat.getFormat("@")); headerStyles.put(key, style); } } return headerStyles; } /** * æ ¹æ®Excel注解åå»ºè¡¨æ ¼åæ ·å¼ * * @param wb å·¥ä½è对象 * @return èªå®ä¹æ ·å¼å表 */ private Map<String, CellStyle> annotationDataStyles(Workbook wb) { Map<String, CellStyle> styles = new HashMap<String, CellStyle>(); for (Object[] os : fields) { Field field = (Field) os[0]; Excel excel = (Excel) os[1]; if (Collection.class.isAssignableFrom(field.getType())) { ParameterizedType pt = (ParameterizedType) field.getGenericType(); Class<?> subClass = (Class<?>) pt.getActualTypeArguments()[0]; List<Field> subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); for (Field subField : subFields) { Excel subExcel = subField.getAnnotation(Excel.class); annotationDataStyles(styles, subField, subExcel); } } else { annotationDataStyles(styles, field, excel); } } return styles; } /** * æ ¹æ®Excel注解åå»ºè¡¨æ ¼åæ ·å¼ * * @param styles èªå®ä¹æ ·å¼å表 * @param field 屿§åä¿¡æ¯ * @param excel æ³¨è§£ä¿¡æ¯ */ public void annotationDataStyles(Map<String, CellStyle> styles, Field field, Excel excel) { String key = StringUtils.format("data_{}_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor(), excel.cellType()); if (!styles.containsKey(key)) { CellStyle style = wb.createCellStyle(); style.setAlignment(excel.align()); style.setVerticalAlignment(VerticalAlignment.CENTER); style.setBorderRight(BorderStyle.THIN); style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setBorderLeft(BorderStyle.THIN); style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setBorderTop(BorderStyle.THIN); style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setBorderBottom(BorderStyle.THIN); style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setFillForegroundColor(excel.backgroundColor().getIndex()); Font dataFont = wb.createFont(); dataFont.setFontName("Arial"); dataFont.setFontHeightInPoints((short) 10); dataFont.setColor(excel.color().index); style.setFont(dataFont); if (Excel.ColumnType.TEXT == excel.cellType()) { DataFormat dataFormat = wb.createDataFormat(); style.setDataFormat(dataFormat.getFormat("@")); } styles.put(key, style); } } /** * å建åå æ ¼ */ public Cell createHeadCell(Excel attr, Row row, int column) { // å建å Cell cell = row.createCell(column); // åå ¥åä¿¡æ¯ cell.setCellValue(attr.name()); setDataValidation(attr, row, column); cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); if (isSubList()) { // å¡«å é»è®¤æ ·å¼ï¼é²æ¢åå¹¶åå æ ¼æ ·å¼å¤±æ sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType()))); if (attr.needMerge()) { sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column)); } } return cell; } /** * 设置åå æ ¼ä¿¡æ¯ * * @param value åå æ ¼å¼ * @param attr 注解ç¸å ³ * @param cell åå æ ¼ä¿¡æ¯ */ public void setCellVo(Object value, Excel attr, Cell cell) { if (Excel.ColumnType.STRING == attr.cellType() || Excel.ColumnType.TEXT == attr.cellType()) { String cellValue = Convert.toStr(value); // 对äºä»»ä½ä»¥è¡¨è¾¾å¼è§¦åå符 =-+@å¼å¤´çåå æ ¼ï¼ç´æ¥ä½¿ç¨tabå符ä½ä¸ºåç¼ï¼é²æ¢CSVæ³¨å ¥ã if (StringUtils.startsWithAny(cellValue, FORMULA_STR)) { cellValue = RegExUtils.replaceFirst(cellValue, FORMULA_REGEX_STR, "\t$0"); } if (value instanceof Collection && StringUtils.equals("[]", cellValue)) { cellValue = StringUtils.EMPTY; } cell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue + attr.suffix()); } else if (Excel.ColumnType.NUMERIC == attr.cellType()) { if (StringUtils.isNotNull(value)) { cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); } } else if (Excel.ColumnType.IMAGE == attr.cellType()) { ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1); String imagePath = Convert.toStr(value); if (StringUtils.isNotEmpty(imagePath)) { byte[] data = ImageUtils.getImage(imagePath); getDrawingPatriarch(cell.getSheet()).createPicture(anchor, cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); } } } /** * è·åç»å¸ */ public static Drawing<?> getDrawingPatriarch(Sheet sheet) { if (sheet.getDrawingPatriarch() == null) { sheet.createDrawingPatriarch(); } return sheet.getDrawingPatriarch(); } /** * è·åå¾çç±»å,设置å¾çæå ¥ç±»å */ public int getImageType(byte[] value) { String type = FileTypeUtils.getFileExtendName(value); if ("JPG".equalsIgnoreCase(type)) { return Workbook.PICTURE_TYPE_JPEG; } else if ("PNG".equalsIgnoreCase(type)) { return Workbook.PICTURE_TYPE_PNG; } return Workbook.PICTURE_TYPE_JPEG; } /** * åå»ºè¡¨æ ¼æ ·å¼ */ public void setDataValidation(Excel attr, Row row, int column) { if (attr.name().indexOf("注ï¼") >= 0) { sheet.setColumnWidth(column, 6000); } else { // 设置å宽 sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); } if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0) { if (attr.combo().length > 15 || StringUtils.join(attr.combo()).length() > 255) { // 妿䏿æ°å¤§äº15æå符串é¿åº¦å¤§äº255ï¼å使ç¨ä¸ä¸ªæ°sheetåå¨ï¼é¿å çæç模æ¿ä¸æå¼è·åä¸å° setXSSFValidationWithHidden(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); } else { // æç¤ºä¿¡æ¯æåªè½éæ©ä¸è½è¾å ¥çåå 容. setPromptOrValidation(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); } } } /** * æ·»å åå æ ¼ */ public Cell addCell(Excel attr, Row row, T vo, Field field, int column) { Cell cell = null; try { // 设置è¡é« row.setHeight(maxHeight); // æ ¹æ®Excelä¸è®¾ç½®æ åµå³å®æ¯å¦å¯¼åº,æäºæ åµéè¦ä¿æä¸ºç©º,å¸æç¨æ·å¡«åè¿ä¸å. if (attr.isExport()) { // å建cell cell = row.createCell(column); if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge()) { CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column); sheet.addMergedRegion(cellAddress); } cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType()))); // ç¨äºè¯»å对象ä¸ç屿§ Object value = getTargetValue(vo, field, attr); String dateFormat = attr.dateFormat(); String readConverterExp = attr.readConverterExp(); String separator = attr.separator(); if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) { cell.setCellValue(parseDateToStr(dateFormat, value)); } else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) { cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); } else if (value instanceof BigDecimal && -1 != attr.scale()) { cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).doubleValue()); } else if (!attr.handler().equals(ExcelHandlerAdapter.class)) { cell.setCellValue(dataFormatHandlerAdapter(value, attr, cell)); } else { // 设置åç±»å setCellVo(value, attr, cell); } addStatisticsData(column, Convert.toStr(value), attr); } } catch (Exception e) { log.error("导åºExcel失败{}", e); } return cell; } /** * 设置 POI XSSFSheet åå æ ¼æç¤ºæéæ©æ¡ * * @param sheet 表å * @param textlist ä¸ææ¡æ¾ç¤ºçå 容 * @param promptContent æç¤ºå 容 * @param firstRow å¼å§è¡ * @param endRow ç»æè¡ * @param firstCol å¼å§å * @param endCol ç»æå */ public void setPromptOrValidation(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, int firstCol, int endCol) { DataValidationHelper helper = sheet.getDataValidationHelper(); DataValidationConstraint constraint = textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1"); CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); DataValidation dataValidation = helper.createValidation(constraint, regions); if (StringUtils.isNotEmpty(promptContent)) { // å¦æè®¾ç½®äºæç¤ºä¿¡æ¯åé¼ æ æ¾ä¸å»æç¤º dataValidation.createPromptBox("", promptContent); dataValidation.setShowPromptBox(true); } // å¤çExcelå ¼å®¹æ§é®é¢ if (dataValidation instanceof XSSFDataValidation) { dataValidation.setSuppressDropDownArrow(true); dataValidation.setShowErrorBox(true); } else { dataValidation.setSuppressDropDownArrow(false); } sheet.addValidationData(dataValidation); } /** * 设置æäºåçå¼åªè½è¾å ¥é¢å¶çæ°æ®,æ¾ç¤ºä¸ææ¡ï¼å ¼å®¹è¶ åºä¸å®æ°éç䏿æ¡ï¼. * * @param sheet è¦è®¾ç½®çsheet. * @param textlist ä¸ææ¡æ¾ç¤ºçå 容 * @param promptContent æç¤ºå 容 * @param firstRow å¼å§è¡ * @param endRow ç»æè¡ * @param firstCol å¼å§å * @param endCol ç»æå */ public void setXSSFValidationWithHidden(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, int firstCol, int endCol) { String hideSheetName = "combo_" + firstCol + "_" + endCol; Sheet hideSheet = wb.createSheet(hideSheetName); // ç¨äºåå¨ ä¸æèåæ°æ® for (int i = 0; i < textlist.length; i++) { hideSheet.createRow(i).createCell(0).setCellValue(textlist[i]); } // å建åç§°ï¼å¯è¢«å ¶ä»åå æ ¼å¼ç¨ Name name = wb.createName(); name.setNameName(hideSheetName + "_data"); name.setRefersToFormula(hideSheetName + "!$A$1:$A$" + textlist.length); DataValidationHelper helper = sheet.getDataValidationHelper(); // å è½½ä¸æå表å 容 DataValidationConstraint constraint = helper.createFormulaListConstraint(hideSheetName + "_data"); // è®¾ç½®æ°æ®æææ§å è½½å¨åªä¸ªåå æ ¼ä¸,åä¸ªåæ°å嫿¯ï¼èµ·å§è¡ãç»æ¢è¡ãèµ·å§åãç»æ¢å CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); // æ°æ®æææ§å¯¹è±¡ DataValidation dataValidation = helper.createValidation(constraint, regions); if (StringUtils.isNotEmpty(promptContent)) { // å¦æè®¾ç½®äºæç¤ºä¿¡æ¯åé¼ æ æ¾ä¸å»æç¤º dataValidation.createPromptBox("", promptContent); dataValidation.setShowPromptBox(true); } // å¤çExcelå ¼å®¹æ§é®é¢ if (dataValidation instanceof XSSFDataValidation) { dataValidation.setSuppressDropDownArrow(true); dataValidation.setShowErrorBox(true); } else { dataValidation.setSuppressDropDownArrow(false); } sheet.addValidationData(dataValidation); // 设置hiddenSheetéè wb.setSheetHidden(wb.getSheetIndex(hideSheet), true); } /** * è§£æå¯¼åºå¼ 0=ç·,1=女,2=æªç¥ * * @param propertyValue åæ°å¼ * @param converterExp ç¿»è¯æ³¨è§£ * @param separator åé符 * @return è§£æåå¼ */ public static String convertByExp(String propertyValue, String converterExp, String separator) { StringBuilder propertyString = new StringBuilder(); String[] convertSource = converterExp.split(","); for (String item : convertSource) { String[] itemArray = item.split("="); if (StringUtils.containsAny(propertyValue, separator)) { for (String value : propertyValue.split(separator)) { if (itemArray[0].equals(value)) { propertyString.append(itemArray[1] + separator); break; } } } else { if (itemArray[0].equals(propertyValue)) { return itemArray[1]; } } } return StringUtils.stripEnd(propertyString.toString(), separator); } /** * ååè§£æå¼ ç·=0,女=1,æªç¥=2 * * @param propertyValue åæ°å¼ * @param converterExp ç¿»è¯æ³¨è§£ * @param separator åé符 * @return è§£æåå¼ */ public static String reverseByExp(String propertyValue, String converterExp, String separator) { StringBuilder propertyString = new StringBuilder(); String[] convertSource = converterExp.split(","); for (String item : convertSource) { String[] itemArray = item.split("="); if (StringUtils.containsAny(propertyValue, separator)) { for (String value : propertyValue.split(separator)) { if (itemArray[1].equals(value)) { propertyString.append(itemArray[0] + separator); break; } } } else { if (itemArray[1].equals(propertyValue)) { return itemArray[0]; } } } return StringUtils.stripEnd(propertyString.toString(), separator); } /** * æ°æ®å¤çå¨ * * @param value æ°æ®å¼ * @param excel æ°æ®æ³¨è§£ * @return */ public String dataFormatHandlerAdapter(Object value, Excel excel, Cell cell) { try { Object instance = excel.handler().newInstance(); Method formatMethod = excel.handler().getMethod("format", new Class[] { Object.class, String[].class, Cell.class, Workbook.class }); value = formatMethod.invoke(instance, value, excel.args(), cell, this.wb); } catch (Exception e) { log.error("ä¸è½æ ¼å¼åæ°æ® " + excel.handler(), e.getMessage()); } return Convert.toStr(value); } /** * å计ç»è®¡ä¿¡æ¯ */ private void addStatisticsData(Integer index, String text, Excel entity) { if (entity != null && entity.isStatistics()) { Double temp = 0D; if (!statistics.containsKey(index)) { statistics.put(index, temp); } try { temp = Double.valueOf(text); } catch (NumberFormatException e) { } statistics.put(index, statistics.get(index) + temp); } } /** * å建ç»è®¡è¡ */ public void addStatisticsRow() { if (statistics.size() > 0) { Row row = sheet.createRow(sheet.getLastRowNum() + 1); Set<Integer> keys = statistics.keySet(); Cell cell = row.createCell(0); cell.setCellStyle(styles.get("total")); cell.setCellValue("å计"); for (Integer key : keys) { cell = row.createCell(key); cell.setCellStyle(styles.get("total")); cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key))); } statistics.clear(); } } /** * è·åbeanä¸ç屿§å¼ * * @param vo å®ä½å¯¹è±¡ * @param field åæ®µ * @param excel 注解 * @return æç»ç屿§å¼ * @throws Exception */ private Object getTargetValue(T vo, Field field, Excel excel) throws Exception { Object o = field.get(vo); if (StringUtils.isNotEmpty(excel.targetAttr())) { String target = excel.targetAttr(); if (target.contains(".")) { String[] targets = target.split("[.]"); for (String name : targets) { o = getValue(o, name); } } else { o = getValue(o, target); } } return o; } /** * 以类ç屿§çgetæ¹æ³æ¹æ³å½¢å¼è·åå¼ * * @param o * @param name * @return value * @throws Exception */ private Object getValue(Object o, String name) throws Exception { if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name)) { Class<?> clazz = o.getClass(); Field field = clazz.getDeclaredField(name); field.setAccessible(true); o = field.get(o); } return o; } /** * å¾å°ææå®ä¹å段 */ private void createExcelField() { this.fields = getFields(); this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); this.maxHeight = getRowHeight(); } /** * è·ååæ®µæ³¨è§£ä¿¡æ¯ */ public List<Object[]> getFields() { List<Object[]> fields = new ArrayList<Object[]>(); List<Field> tempFields = new ArrayList<>(); tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); for (Field field : tempFields) { if (!ArrayUtils.contains(this.excludeFields, field.getName())) { // åæ³¨è§£ if (field.isAnnotationPresent(Excel.class)) { Excel attr = field.getAnnotation(Excel.class); if (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == type)) { field.setAccessible(true); fields.add(new Object[] { field, attr }); } if (Collection.class.isAssignableFrom(field.getType())) { subMethod = getSubMethod(field.getName(), clazz); ParameterizedType pt = (ParameterizedType) field.getGenericType(); Class<?> subClass = (Class<?>) pt.getActualTypeArguments()[0]; this.subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); } } // 夿³¨è§£ if (field.isAnnotationPresent(Excels.class)) { Excels attrs = field.getAnnotation(Excels.class); Excel[] excels = attrs.value(); for (Excel attr : excels) { if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr()) && (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == type))) { field.setAccessible(true); fields.add(new Object[] { field, attr }); } } } } } return fields; } /** * æ ¹æ®æ³¨è§£è·åæå¤§è¡é« */ public short getRowHeight() { double maxHeight = 0; for (Object[] os : this.fields) { Excel excel = (Excel) os[1]; maxHeight = Math.max(maxHeight, excel.height()); } return (short) (maxHeight * 20); } /** * å建ä¸ä¸ªå·¥ä½ç°¿ */ public void createWorkbook() { this.wb = new SXSSFWorkbook(500); this.sheet = wb.createSheet(); wb.setSheetName(0, sheetName); this.styles = createStyles(wb); } /** * å建工ä½è¡¨ * * @param sheetNo sheetæ°é * @param index åºå· */ public void createSheet(int sheetNo, int index) { // 设置工ä½è¡¨çåç§°. if (sheetNo > 1 && index > 0) { this.sheet = wb.createSheet(); this.createTitle(); wb.setSheetName(index, sheetName + index); } } /** * è·ååå æ ¼å¼ * * @param row è·åçè¡ * @param column è·ååå æ ¼åå· * @return åå æ ¼å¼ */ public Object getCellValue(Row row, int column) { if (row == null) { return row; } Object val = ""; try { Cell cell = row.getCell(column); if (StringUtils.isNotNull(cell)) { if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA) { val = cell.getNumericCellValue(); if (DateUtil.isCellDateFormatted(cell)) { val = DateUtil.getJavaDate((Double) val); // POI Excel æ¥ææ ¼å¼è½¬æ¢ } else { if ((Double) val % 1 != 0) { val = new BigDecimal(val.toString()); } else { val = new DecimalFormat("0").format(val); } } } else if (cell.getCellType() == CellType.STRING) { val = cell.getStringCellValue(); } else if (cell.getCellType() == CellType.BOOLEAN) { val = cell.getBooleanCellValue(); } else if (cell.getCellType() == CellType.ERROR) { val = cell.getErrorCellValue(); } } } catch (Exception e) { return val; } return val; } /** * 夿æ¯å¦æ¯ç©ºè¡ * * @param row 夿çè¡ * @return */ private boolean isRowEmpty(Row row) { if (row == null) { return true; } for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) { Cell cell = row.getCell(i); if (cell != null && cell.getCellType() != CellType.BLANK) { return false; } } return true; } /** * æ ¼å¼åä¸åç±»åçæ¥æå¯¹è±¡ * * @param dateFormat æ¥ææ ¼å¼ * @param val è¢«æ ¼å¼åçæ¥æå¯¹è±¡ * @return æ ¼å¼ååçæ¥æå符 */ public String parseDateToStr(String dateFormat, Object val) { if (val == null) { return ""; } String str; if (val instanceof Date) { str = DateUtils.parseDateToStr(dateFormat, (Date) val); } else if (val instanceof LocalDateTime) { str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDateTime) val)); } else if (val instanceof LocalDate) { str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDate) val)); } else { str = val.toString(); } return str; } /** * æ¯å¦æå¯¹è±¡çåå表 */ public boolean isSubList() { return StringUtils.isNotNull(subFields) && subFields.size() > 0; } /** * æ¯å¦æå¯¹è±¡çåå表ï¼éåä¸ä¸ºç©º */ public boolean isSubListValue(T vo) { return StringUtils.isNotNull(subFields) && subFields.size() > 0 && StringUtils.isNotNull(getListCellValue(vo)) && getListCellValue(vo).size() > 0; } /** * è·åéåçå¼ */ public Collection<?> getListCellValue(Object obj) { Object value; try { value = subMethod.invoke(obj, new Object[] {}); } catch (Exception e) { return new ArrayList<Object>(); } return (Collection<?>) value; } /** * è·å对象çååè¡¨æ¹æ³ * * @param name åç§° * @param pojoClass 类对象 * @return ååè¡¨æ¹æ³ */ public Method getSubMethod(String name, Class<?> pojoClass) { StringBuffer getMethodName = new StringBuffer("get"); getMethodName.append(name.substring(0, 1).toUpperCase()); getMethodName.append(name.substring(1)); Method method = null; try { method = pojoClass.getMethod(getMethodName.toString(), new Class[] {}); } catch (Exception e) { log.error("è·å对象å¼å¸¸{}", e.getMessage()); } return method; } } se-common/se-common-core/src/main/java/com/se/common/core/utils/reflect/ReflectUtils.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,410 @@ package com.se.common.core.utils.reflect; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Date; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.apache.poi.ss.usermodel.DateUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.se.common.core.text.Convert; import com.se.common.core.utils.DateUtils; /** * åå°å·¥å ·ç±». æä¾è°ç¨getter/setteræ¹æ³, 访é®ç§æåé, è°ç¨ç§ææ¹æ³, è·åæ³åç±»åClass, 被AOPè¿ççå®ç±»çå·¥å ·å½æ°. * * @author admin */ @SuppressWarnings("rawtypes") public class ReflectUtils { private static final String SETTER_PREFIX = "set"; private static final String GETTER_PREFIX = "get"; private static final String CGLIB_CLASS_SEPARATOR = "$$"; private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class); /** * è°ç¨Getteræ¹æ³. * æ¯æå¤çº§ï¼å¦ï¼å¯¹è±¡å.对象å.æ¹æ³ */ @SuppressWarnings("unchecked") public static <E> E invokeGetter(Object obj, String propertyName) { Object object = obj; for (String name : StringUtils.split(propertyName, ".")) { String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); } return (E) object; } /** * è°ç¨Setteræ¹æ³, ä» å¹é æ¹æ³åã * æ¯æå¤çº§ï¼å¦ï¼å¯¹è±¡å.对象å.æ¹æ³ */ public static <E> void invokeSetter(Object obj, String propertyName, E value) { Object object = obj; String[] names = StringUtils.split(propertyName, "."); for (int i = 0; i < names.length; i++) { if (i < names.length - 1) { String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); } else { String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); invokeMethodByName(object, setterMethodName, new Object[] { value }); } } } /** * ç´æ¥è¯»åå¯¹è±¡å±æ§å¼, æ è§private/protected修饰符, ä¸ç»è¿getter彿°. */ @SuppressWarnings("unchecked") public static <E> E getFieldValue(final Object obj, final String fieldName) { Field field = getAccessibleField(obj, fieldName); if (field == null) { logger.debug("å¨ [" + obj.getClass() + "] ä¸ï¼æ²¡ææ¾å° [" + fieldName + "] åæ®µ "); return null; } E result = null; try { result = (E) field.get(obj); } catch (IllegalAccessException e) { logger.error("ä¸å¯è½æåºçå¼å¸¸{}", e.getMessage()); } return result; } /** * ç´æ¥è®¾ç½®å¯¹è±¡å±æ§å¼, æ è§private/protected修饰符, ä¸ç»è¿setter彿°. */ public static <E> void setFieldValue(final Object obj, final String fieldName, final E value) { Field field = getAccessibleField(obj, fieldName); if (field == null) { // throw new IllegalArgumentException("å¨ [" + obj.getClass() + "] ä¸ï¼æ²¡ææ¾å° [" + fieldName + "] åæ®µ "); logger.debug("å¨ [" + obj.getClass() + "] ä¸ï¼æ²¡ææ¾å° [" + fieldName + "] åæ®µ "); return; } try { field.set(obj, value); } catch (IllegalAccessException e) { logger.error("ä¸å¯è½æåºçå¼å¸¸: {}", e.getMessage()); } } /** * ç´æ¥è°ç¨å¯¹è±¡æ¹æ³, æ è§private/protected修饰符. * ç¨äºä¸æ¬¡æ§è°ç¨çæ åµï¼å¦ååºä½¿ç¨getAccessibleMethod()彿°è·å¾Methodååå¤è°ç¨. * åæ¶å¹é æ¹æ³å+åæ°ç±»åï¼ */ @SuppressWarnings("unchecked") public static <E> E invokeMethod(final Object obj, final String methodName, final Class<?>[] parameterTypes, final Object[] args) { if (obj == null || methodName == null) { return null; } Method method = getAccessibleMethod(obj, methodName, parameterTypes); if (method == null) { logger.debug("å¨ [" + obj.getClass() + "] ä¸ï¼æ²¡ææ¾å° [" + methodName + "] æ¹æ³ "); return null; } try { return (E) method.invoke(obj, args); } catch (Exception e) { String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; throw convertReflectionExceptionToUnchecked(msg, e); } } /** * ç´æ¥è°ç¨å¯¹è±¡æ¹æ³, æ è§private/protectedä¿®é¥°ç¬¦ï¼ * ç¨äºä¸æ¬¡æ§è°ç¨çæ åµï¼å¦ååºä½¿ç¨getAccessibleMethodByName()彿°è·å¾Methodååå¤è°ç¨. * åªå¹é 彿°åï¼å¦ææå¤ä¸ªåå彿°è°ç¨ç¬¬ä¸ä¸ªã */ @SuppressWarnings("unchecked") public static <E> E invokeMethodByName(final Object obj, final String methodName, final Object[] args) { Method method = getAccessibleMethodByName(obj, methodName, args.length); if (method == null) { // å¦æä¸ºç©ºä¸æ¥éï¼ç´æ¥è¿å空ã logger.debug("å¨ [" + obj.getClass() + "] ä¸ï¼æ²¡ææ¾å° [" + methodName + "] æ¹æ³ "); return null; } try { // ç±»å转æ¢ï¼å°åæ°æ°æ®ç±»å转æ¢ä¸ºç®æ æ¹æ³åæ°ç±»åï¼ Class<?>[] cs = method.getParameterTypes(); for (int i = 0; i < cs.length; i++) { if (args[i] != null && !args[i].getClass().equals(cs[i])) { if (cs[i] == String.class) { args[i] = Convert.toStr(args[i]); if (StringUtils.endsWith((String) args[i], ".0")) { args[i] = StringUtils.substringBefore((String) args[i], ".0"); } } else if (cs[i] == Integer.class) { args[i] = Convert.toInt(args[i]); } else if (cs[i] == Long.class) { args[i] = Convert.toLong(args[i]); } else if (cs[i] == Double.class) { args[i] = Convert.toDouble(args[i]); } else if (cs[i] == Float.class) { args[i] = Convert.toFloat(args[i]); } else if (cs[i] == Date.class) { if (args[i] instanceof String) { args[i] = DateUtils.parseDate(args[i]); } else { args[i] = DateUtil.getJavaDate((Double) args[i]); } } else if (cs[i] == boolean.class || cs[i] == Boolean.class) { args[i] = Convert.toBool(args[i]); } } } return (E) method.invoke(obj, args); } catch (Exception e) { String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; throw convertReflectionExceptionToUnchecked(msg, e); } } /** * 循ç¯åä¸è½¬å, è·å对象çDeclaredField, 并强å¶è®¾ç½®ä¸ºå¯è®¿é®. * å¦åä¸è½¬åå°Object仿 æ³æ¾å°, è¿ånull. */ public static Field getAccessibleField(final Object obj, final String fieldName) { // ä¸ºç©ºä¸æ¥éãç´æ¥è¿å null if (obj == null) { return null; } Validate.notBlank(fieldName, "fieldName can't be blank"); for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) { try { Field field = superClass.getDeclaredField(fieldName); makeAccessible(field); return field; } catch (NoSuchFieldException e) { continue; } } return null; } /** * 循ç¯åä¸è½¬å, è·å对象çDeclaredMethod,并强å¶è®¾ç½®ä¸ºå¯è®¿é®. * å¦åä¸è½¬åå°Object仿 æ³æ¾å°, è¿ånull. * å¹é 彿°å+åæ°ç±»åã * ç¨äºæ¹æ³éè¦è¢«å¤æ¬¡è°ç¨çæ åµ. å ä½¿ç¨æ¬å½æ°å åå¾Method,ç¶åè°ç¨Method.invoke(Object obj, Object... args) */ public static Method getAccessibleMethod(final Object obj, final String methodName, final Class<?>... parameterTypes) { // ä¸ºç©ºä¸æ¥éãç´æ¥è¿å null if (obj == null) { return null; } Validate.notBlank(methodName, "methodName can't be blank"); for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) { try { Method method = searchType.getDeclaredMethod(methodName, parameterTypes); makeAccessible(method); return method; } catch (NoSuchMethodException e) { continue; } } return null; } /** * 循ç¯åä¸è½¬å, è·å对象çDeclaredMethod,并强å¶è®¾ç½®ä¸ºå¯è®¿é®. * å¦åä¸è½¬åå°Object仿 æ³æ¾å°, è¿ånull. * åªå¹é 彿°åã * ç¨äºæ¹æ³éè¦è¢«å¤æ¬¡è°ç¨çæ åµ. å ä½¿ç¨æ¬å½æ°å åå¾Method,ç¶åè°ç¨Method.invoke(Object obj, Object... args) */ public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) { // ä¸ºç©ºä¸æ¥éãç´æ¥è¿å null if (obj == null) { return null; } Validate.notBlank(methodName, "methodName can't be blank"); for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) { Method[] methods = searchType.getDeclaredMethods(); for (Method method : methods) { if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) { makeAccessible(method); return method; } } } return null; } /** * æ¹åprivate/protectedçæ¹æ³ä¸ºpublicï¼å°½éä¸è°ç¨å®é æ¹å¨çè¯å¥ï¼é¿å JDKçSecurityManageræ±æ¨ã */ public static void makeAccessible(Method method) { if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) && !method.isAccessible()) { method.setAccessible(true); } } /** * æ¹åprivate/protectedçæååé为publicï¼å°½éä¸è°ç¨å®é æ¹å¨çè¯å¥ï¼é¿å JDKçSecurityManageræ±æ¨ã */ public static void makeAccessible(Field field) { if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) { field.setAccessible(true); } } /** * éè¿åå°, è·å¾Classå®ä¹ä¸å£°æçæ³ååæ°çç±»å, æ³¨ææ³åå¿ é¡»å®ä¹å¨ç¶ç±»å¤ * 妿 æ³æ¾å°, è¿åObject.class. */ @SuppressWarnings("unchecked") public static <T> Class<T> getClassGenricType(final Class clazz) { return getClassGenricType(clazz, 0); } /** * éè¿åå°, è·å¾Classå®ä¹ä¸å£°æçç¶ç±»çæ³ååæ°çç±»å. * 妿 æ³æ¾å°, è¿åObject.class. */ public static Class getClassGenricType(final Class clazz, final int index) { Type genType = clazz.getGenericSuperclass(); if (!(genType instanceof ParameterizedType)) { logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType"); return Object.class; } Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); if (index >= params.length || index < 0) { logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + params.length); return Object.class; } if (!(params[index] instanceof Class)) { logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); return Object.class; } return (Class) params[index]; } public static Class<?> getUserClass(Object instance) { if (instance == null) { throw new RuntimeException("Instance must not be null"); } Class clazz = instance.getClass(); if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) { Class<?> superClass = clazz.getSuperclass(); if (superClass != null && !Object.class.equals(superClass)) { return superClass; } } return clazz; } /** * å°åå°æ¶çchecked exception转æ¢ä¸ºunchecked exception. */ public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) { if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException || e instanceof NoSuchMethodException) { return new IllegalArgumentException(msg, e); } else if (e instanceof InvocationTargetException) { return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException()); } return new RuntimeException(msg, e); } } se-common/se-common-core/src/main/java/com/se/common/core/utils/sign/Base64.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,291 @@ package com.se.common.core.utils.sign; /** * Base64å·¥å ·ç±» * * @author admin */ public final class Base64 { static private final int BASELENGTH = 128; static private final int LOOKUPLENGTH = 64; static private final int TWENTYFOURBITGROUP = 24; static private final int EIGHTBIT = 8; static private final int SIXTEENBIT = 16; static private final int FOURBYTE = 4; static private final int SIGN = -128; static private final char PAD = '='; static final private byte[] base64Alphabet = new byte[BASELENGTH]; static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH]; static { for (int i = 0; i < BASELENGTH; ++i) { base64Alphabet[i] = -1; } for (int i = 'Z'; i >= 'A'; i--) { base64Alphabet[i] = (byte) (i - 'A'); } for (int i = 'z'; i >= 'a'; i--) { base64Alphabet[i] = (byte) (i - 'a' + 26); } for (int i = '9'; i >= '0'; i--) { base64Alphabet[i] = (byte) (i - '0' + 52); } base64Alphabet['+'] = 62; base64Alphabet['/'] = 63; for (int i = 0; i <= 25; i++) { lookUpBase64Alphabet[i] = (char) ('A' + i); } for (int i = 26, j = 0; i <= 51; i++, j++) { lookUpBase64Alphabet[i] = (char) ('a' + j); } for (int i = 52, j = 0; i <= 61; i++, j++) { lookUpBase64Alphabet[i] = (char) ('0' + j); } lookUpBase64Alphabet[62] = (char) '+'; lookUpBase64Alphabet[63] = (char) '/'; } private static boolean isWhiteSpace(char octect) { return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9); } private static boolean isPad(char octect) { return (octect == PAD); } private static boolean isData(char octect) { return (octect < BASELENGTH && base64Alphabet[octect] != -1); } /** * Encodes hex octects into Base64 * * @param binaryData Array containing binaryData * @return Encoded Base64 array */ public static String encode(byte[] binaryData) { if (binaryData == null) { return null; } int lengthDataBits = binaryData.length * EIGHTBIT; if (lengthDataBits == 0) { return ""; } int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP; int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP; int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets; char encodedData[] = null; encodedData = new char[numberQuartet * 4]; byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0; int encodedIndex = 0; int dataIndex = 0; for (int i = 0; i < numberTriplets; i++) { b1 = binaryData[dataIndex++]; b2 = binaryData[dataIndex++]; b3 = binaryData[dataIndex++]; l = (byte) (b2 & 0x0f); k = (byte) (b1 & 0x03); byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc); encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3]; encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f]; } // form integral number of 6-bit groups if (fewerThan24bits == EIGHTBIT) { b1 = binaryData[dataIndex]; k = (byte) (b1 & 0x03); byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4]; encodedData[encodedIndex++] = PAD; encodedData[encodedIndex++] = PAD; } else if (fewerThan24bits == SIXTEENBIT) { b1 = binaryData[dataIndex]; b2 = binaryData[dataIndex + 1]; l = (byte) (b2 & 0x0f); k = (byte) (b1 & 0x03); byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2]; encodedData[encodedIndex++] = PAD; } return new String(encodedData); } /** * Decodes Base64 data into octects * * @param encoded string containing Base64 data * @return Array containind decoded data. */ public static byte[] decode(String encoded) { if (encoded == null) { return null; } char[] base64Data = encoded.toCharArray(); // remove white spaces int len = removeWhiteSpace(base64Data); if (len % FOURBYTE != 0) { return null;// should be divisible by four } int numberQuadruple = (len / FOURBYTE); if (numberQuadruple == 0) { return new byte[0]; } byte decodedData[] = null; byte b1 = 0, b2 = 0, b3 = 0, b4 = 0; char d1 = 0, d2 = 0, d3 = 0, d4 = 0; int i = 0; int encodedIndex = 0; int dataIndex = 0; decodedData = new byte[(numberQuadruple) * 3]; for (; i < numberQuadruple - 1; i++) { if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++])) || !isData((d3 = base64Data[dataIndex++])) || !isData((d4 = base64Data[dataIndex++]))) { return null; } // if found "no data" just return null b1 = base64Alphabet[d1]; b2 = base64Alphabet[d2]; b3 = base64Alphabet[d3]; b4 = base64Alphabet[d4]; decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); } if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) { return null;// if found "no data" just return null } b1 = base64Alphabet[d1]; b2 = base64Alphabet[d2]; d3 = base64Data[dataIndex++]; d4 = base64Data[dataIndex++]; if (!isData((d3)) || !isData((d4))) {// Check if they are PAD characters if (isPad(d3) && isPad(d4)) { if ((b2 & 0xf) != 0)// last 4 bits should be zero { return null; } byte[] tmp = new byte[i * 3 + 1]; System.arraycopy(decodedData, 0, tmp, 0, i * 3); tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); return tmp; } else if (!isPad(d3) && isPad(d4)) { b3 = base64Alphabet[d3]; if ((b3 & 0x3) != 0)// last 2 bits should be zero { return null; } byte[] tmp = new byte[i * 3 + 2]; System.arraycopy(decodedData, 0, tmp, 0, i * 3); tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); return tmp; } else { return null; } } else { // No PAD e.g 3cQl b3 = base64Alphabet[d3]; b4 = base64Alphabet[d4]; decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); } return decodedData; } /** * remove WhiteSpace from MIME containing encoded Base64 data. * * @param data the byte array of base64 data (with WS) * @return the new length */ private static int removeWhiteSpace(char[] data) { if (data == null) { return 0; } // count characters that's not whitespace int newSize = 0; int len = data.length; for (int i = 0; i < len; i++) { if (!isWhiteSpace(data[i])) { data[newSize++] = data[i]; } } return newSize; } } se-common/se-common-core/src/main/java/com/se/common/core/utils/sql/SqlUtil.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,70 @@ package com.se.common.core.utils.sql; import com.se.common.core.exception.UtilException; import com.se.common.core.utils.StringUtils; /** * sqlæä½å·¥å ·ç±» * * @author admin */ public class SqlUtil { /** * å®ä¹å¸¸ç¨ç sqlå ³é®å */ public static String SQL_REGEX = "and |extractvalue|updatexml|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |+|user()"; /** * ä» æ¯æåæ¯ãæ°åãä¸å线ãç©ºæ ¼ãéå·ãå°æ°ç¹ï¼æ¯æå¤ä¸ªå段æåºï¼ */ public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; /** * éå¶orderByæå¤§é¿åº¦ */ private static final int ORDER_BY_MAX_LENGTH = 500; /** * æ£æ¥å符ï¼é²æ¢æ³¨å ¥ç»è¿ */ public static String escapeOrderBySql(String value) { if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) { throw new UtilException("åæ°ä¸ç¬¦åè§èï¼ä¸è½è¿è¡æ¥è¯¢"); } if (StringUtils.length(value) > ORDER_BY_MAX_LENGTH) { throw new UtilException("åæ°å·²è¶ è¿æå¤§éå¶ï¼ä¸è½è¿è¡æ¥è¯¢"); } return value; } /** * éªè¯ order by è¯æ³æ¯å¦ç¬¦åè§è */ public static boolean isValidOrderBySql(String value) { return value.matches(SQL_PATTERN); } /** * SQLå ³é®åæ£æ¥ */ public static void filterKeyword(String value) { if (StringUtils.isEmpty(value)) { return; } String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); for (String sqlKeyword : sqlKeywords) { if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) { throw new UtilException("åæ°åå¨SQLæ³¨å ¥é£é©"); } } } } se-common/se-common-core/src/main/java/com/se/common/core/xss/Xss.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ package com.se.common.core.xss; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * èªå®ä¹xssæ ¡éªæ³¨è§£ * * @author admin */ @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 {}; } se-common/se-common-core/src/main/java/com/se/common/core/xss/XssValidator.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,39 @@ package com.se.common.core.xss; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import com.se.common.core.utils.StringUtils; /** * èªå®ä¹xssæ ¡éªæ³¨è§£å®ç° * * @author admin */ public class XssValidator implements ConstraintValidator<Xss, String> { 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(); } } se-common/se-common-datascope/pom.xml
@@ -9,10 +9,10 @@ </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ruoyi-common-datascope</artifactId> <artifactId>se-common-datascope</artifactId> <description> ruoyi-common-datascopeæéèå´ se-common-datascopeæéèå´ </description> <dependencies> se-common/se-common-datascope/src/main/java/com/se/common/datascope/aspect/DataScopeAspect.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,185 @@ package com.se.common.datascope.aspect; import java.util.ArrayList; import java.util.List; import com.se.common.datascope.annotation.DataScope; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; import com.se.common.core.context.SecurityContextHolder; import com.se.common.core.text.Convert; import com.se.common.core.utils.StringUtils; import com.se.common.core.web.domain.BaseEntity; import com.se.common.security.utils.SecurityUtils; import com.se.system.api.domain.SysRole; import com.se.system.api.domain.SysUser; import com.se.system.api.model.LoginUser; /** * æ°æ®è¿æ»¤å¤ç * * @author admin */ @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.getSysUser(); // 妿æ¯è¶ 级管çåï¼åä¸è¿æ»¤æ°æ® if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) { String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), SecurityContextHolder.getPermission()); 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<String> conditions = new ArrayList<String>(); List<String> scopeCustomIds = new ArrayList<String>(); user.getRoles().forEach(role -> { if (DATA_SCOPE_CUSTOM.equals(role.getDataScope()) && 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)) { continue; } if (!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, ""); } } } se-common/se-common-datasource/pom.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,35 @@ <?xml version="1.0" encoding="UTF-8"?> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common</artifactId> <version>3.6.4</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>se-common-datasource</artifactId> <description> se-common-datasource夿°æ®æº </description> <dependencies> <!-- Druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid.version}</version> </dependency> <!-- Dynamic DataSource --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>${dynamic-ds.version}</version> </dependency> </dependencies> </project> se-common/se-common-datasource/src/main/java/com/se/common/datasource/annotation/Master.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.se.common.datasource.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import com.baomidou.dynamic.datasource.annotation.DS; /** * ä¸»åºæ°æ®æº * * @author admin */ @Target({ ElementType.TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @Documented @DS("master") public @interface Master { } se-common/se-common-log/pom.xml
@@ -9,10 +9,10 @@ </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ruoyi-common-log</artifactId> <artifactId>se-common-log</artifactId> <description> ruoyi-common-logæ¥å¿è®°å½ se-common-logæ¥å¿è®°å½ </description> <dependencies> se-common/se-common-log/src/main/java/com/se/common/log/annotation/Log.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,51 @@ package com.se.common.log.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import com.se.common.log.enums.BusinessType; import com.se.common.log.enums.OperatorType; /** * èªå®ä¹æä½æ¥å¿è®°å½æ³¨è§£ * * @author admin * */ @Target({ ElementType.PARAMETER, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Log { /** * 模å */ public String title() default ""; /** * åè½ */ public BusinessType businessType() default BusinessType.OTHER; /** * æä½äººç±»å« */ public OperatorType operatorType() default OperatorType.MANAGE; /** * æ¯å¦ä¿å请æ±çåæ° */ public boolean isSaveRequestData() default true; /** * æ¯å¦ä¿åååºçåæ° */ public boolean isSaveResponseData() default true; /** * æé¤æå®ç请æ±åæ° */ public String[] excludeParamNames() default {}; } se-common/se-common-log/src/main/java/com/se/common/log/aspect/LogAspect.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,250 @@ package com.se.common.log.aspect; import java.util.Collection; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.se.common.log.enums.BusinessStatus; import com.se.common.log.filter.PropertyPreExcludeFilter; 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.beans.factory.annotation.Autowired; import org.springframework.core.NamedThreadLocal; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Component; import org.springframework.validation.BindingResult; import org.springframework.web.multipart.MultipartFile; import com.alibaba.fastjson2.JSON; import com.se.common.core.utils.ServletUtils; import com.se.common.core.utils.StringUtils; import com.se.common.core.utils.ip.IpUtils; import com.se.common.log.annotation.Log; import com.se.common.log.service.AsyncLogService; import com.se.common.security.utils.SecurityUtils; import com.se.system.api.domain.SysOperLog; /** * æä½æ¥å¿è®°å½å¤ç * * @author admin */ @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<Long> TIME_THREADLOCAL = new NamedThreadLocal<Long>("Cost Time"); @Autowired private AsyncLogService asyncLogService; /** * å¤ç请æ±åæ§è¡ */ @Before(value = "@annotation(controllerLog)") public void boBefore(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 { // *========æ°æ®åºæ¥å¿=========*// 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)); String username = SecurityUtils.getUsername(); if (StringUtils.isNotBlank(username)) { operLog.setOperName(username); } if (e != null) { operLog.setStatus(BusinessStatus.FAIL.ordinal()); operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 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()); // ä¿åæ°æ®åº asyncLogService.saveSysLog(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) && (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod))) { String params = argsArrayToString(joinPoint.getArgs(), excludeParamNames); operLog.setOperParam(StringUtils.substring(params, 0, 2000)); } else { operLog.setOperParam(StringUtils.substring(JSON.toJSONString(paramsMap, excludePropertyPreFilter(excludeParamNames)), 0, 2000)); } } /** * åæ°æ¼è£ */ private String argsArrayToString(Object[] paramsArray, String[] excludeParamNames) { String params = ""; 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 += jsonObj.toString() + " "; } catch (Exception e) { } } } } return params.trim(); } /** * å¿½ç¥ææå±æ§ */ 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; } } se-common/se-common-log/src/main/java/com/se/common/log/enums/BusinessStatus.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.se.common.log.enums; /** * æä½ç¶æ * * @author admin * */ public enum BusinessStatus { /** * æå */ SUCCESS, /** * 失败 */ FAIL, } se-common/se-common-log/src/main/java/com/se/common/log/enums/BusinessType.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,59 @@ package com.se.common.log.enums; /** * ä¸å¡æä½ç±»å * * @author admin */ public enum BusinessType { /** * å ¶å® */ OTHER, /** * æ°å¢ */ INSERT, /** * ä¿®æ¹ */ UPDATE, /** * å é¤ */ DELETE, /** * ææ */ GRANT, /** * å¯¼åº */ EXPORT, /** * å¯¼å ¥ */ IMPORT, /** * 强é */ FORCE, /** * çæä»£ç */ GENCODE, /** * æ¸ ç©ºæ°æ® */ CLEAN, } se-common/se-common-log/src/main/java/com/se/common/log/enums/OperatorType.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,24 @@ package com.se.common.log.enums; /** * æä½äººç±»å« * * @author admin */ public enum OperatorType { /** * å ¶å® */ OTHER, /** * åå°ç¨æ· */ MANAGE, /** * ææºç«¯ç¨æ· */ MOBILE } se-common/se-common-log/src/main/java/com/se/common/log/service/AsyncLogService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,29 @@ package com.se.common.log.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import com.se.common.core.constant.SecurityConstants; import com.se.system.api.RemoteLogService; import com.se.system.api.domain.SysOperLog; /** * 弿¥è°ç¨æ¥å¿æå¡ * * @author admin */ @Service public class AsyncLogService { @Autowired private RemoteLogService remoteLogService; /** * ä¿åç³»ç»æ¥å¿è®°å½ */ @Async public void saveSysLog(SysOperLog sysOperLog) throws Exception { remoteLogService.saveLog(sysOperLog, SecurityConstants.INNER); } } se-common/se-common-redis/pom.xml
@@ -9,10 +9,10 @@ </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ruoyi-common-redis</artifactId> <artifactId>se-common-redis</artifactId> <description> ruoyi-common-redisç¼åæå¡ se-common-redisç¼åæå¡ </description> <dependencies> se-common/se-common-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,2 @@ com.se.common.redis.configure.RedisConfig com.se.common.redis.service.RedisService se-common/se-common-seata/pom.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ <?xml version="1.0" encoding="UTF-8"?> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common</artifactId> <version>3.6.4</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>se-common-seata</artifactId> <description> se-common-seataåå¸å¼äºå¡ </description> <dependencies> <!-- SpringBoot Seata --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency> </dependencies> </project> se-common/se-common-security/pom.xml
@@ -8,10 +8,10 @@ </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ruoyi-common-security</artifactId> <artifactId>se-common-security</artifactId> <description> ruoyi-common-securityå®å ¨æ¨¡å se-common-securityå®å ¨æ¨¡å </description> <dependencies> se-common/se-common-security/src/main/java/com/se/common/security/annotation/InnerAuth.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ package com.se.common.security.annotation; import java.lang.annotation.*; /** * å é¨è®¤è¯æ³¨è§£ * * @author admin */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface InnerAuth { /** * æ¯å¦æ ¡éªç¨æ·ä¿¡æ¯ */ boolean isUser() default false; } se-common/se-common-security/src/main/java/com/se/common/security/aspect/InnerAuthAspect.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,51 @@ package com.se.common.security.aspect; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; import com.se.common.core.constant.SecurityConstants; import com.se.common.core.exception.InnerAuthException; import com.se.common.core.utils.ServletUtils; import com.se.common.core.utils.StringUtils; import com.se.common.security.annotation.InnerAuth; /** * å 鍿å¡è°ç¨éªè¯å¤ç * * @author admin */ @Aspect @Component public class InnerAuthAspect implements Ordered { @Around("@annotation(innerAuth)") public Object innerAround(ProceedingJoinPoint point, InnerAuth innerAuth) throws Throwable { String source = ServletUtils.getRequest().getHeader(SecurityConstants.FROM_SOURCE); // å é¨è¯·æ±éªè¯ if (!StringUtils.equals(SecurityConstants.INNER, source)) { throw new InnerAuthException("没æå é¨è®¿é®æéï¼ä¸å 许访é®"); } String userid = ServletUtils.getRequest().getHeader(SecurityConstants.DETAILS_USER_ID); String username = ServletUtils.getRequest().getHeader(SecurityConstants.DETAILS_USERNAME); // ç¨æ·ä¿¡æ¯éªè¯ if (innerAuth.isUser() && (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username))) { throw new InnerAuthException("没æè®¾ç½®ç¨æ·ä¿¡æ¯ï¼ä¸å è®¸è®¿é® "); } return point.proceed(); } /** * ç¡®ä¿å¨æé认è¯aopæ§è¡åæ§è¡ */ @Override public int getOrder() { return Ordered.HIGHEST_PRECEDENCE + 1; } } se-common/se-common-security/src/main/java/com/se/common/security/handler/GlobalExceptionHandler.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,166 @@ package com.se.common.security.handler; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.validation.BindException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.MissingPathVariableException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import com.se.common.core.constant.HttpStatus; import com.se.common.core.exception.DemoModeException; import com.se.common.core.exception.InnerAuthException; import com.se.common.core.exception.ServiceException; import com.se.common.core.exception.auth.NotPermissionException; import com.se.common.core.exception.auth.NotRoleException; import com.se.common.core.text.Convert; import com.se.common.core.utils.StringUtils; import com.se.common.core.utils.html.EscapeUtil; import com.se.common.core.web.domain.AjaxResult; /** * å ¨å±å¼å¸¸å¤çå¨ * * @author admin */ @RestControllerAdvice public class GlobalExceptionHandler { private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); /** * æéç å¼å¸¸ */ @ExceptionHandler(NotPermissionException.class) public AjaxResult handleNotPermissionException(NotPermissionException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请æ±å°å'{}',æéç æ ¡éªå¤±è´¥'{}'", requestURI, e.getMessage()); return AjaxResult.error(HttpStatus.FORBIDDEN, "没æè®¿é®æéï¼è¯·è系管çåææ"); } /** * è§è²æéå¼å¸¸ */ @ExceptionHandler(NotRoleException.class) public AjaxResult handleNotRoleException(NotRoleException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请æ±å°å'{}',è§è²æéæ ¡éªå¤±è´¥'{}'", requestURI, e.getMessage()); return AjaxResult.error(HttpStatus.FORBIDDEN, "没æè®¿é®æéï¼è¯·è系管çåææ"); } /** * è¯·æ±æ¹å¼ä¸æ¯æ */ @ExceptionHandler(HttpRequestMethodNotSupportedException.class) public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请æ±å°å'{}',䏿¯æ'{}'请æ±", requestURI, e.getMethod()); return AjaxResult.error(e.getMessage()); } /** * ä¸å¡å¼å¸¸ */ @ExceptionHandler(ServiceException.class) public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request) { log.error(e.getMessage(), e); Integer code = e.getCode(); return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage()); } /** * 请æ±è·¯å¾ä¸ç¼ºå°å¿ éçè·¯å¾åé */ @ExceptionHandler(MissingPathVariableException.class) public AjaxResult handleMissingPathVariableException(MissingPathVariableException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请æ±è·¯å¾ä¸ç¼ºå°å¿ éçè·¯å¾åé'{}',åçç³»ç»å¼å¸¸.", requestURI, e); return AjaxResult.error(String.format("请æ±è·¯å¾ä¸ç¼ºå°å¿ éçè·¯å¾åé[%s]", e.getVariableName())); } /** * 请æ±åæ°ç±»åä¸å¹é */ @ExceptionHandler(MethodArgumentTypeMismatchException.class) public AjaxResult handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); String value = Convert.toStr(e.getValue()); if (StringUtils.isNotEmpty(value)) { value = EscapeUtil.clean(value); } log.error("请æ±åæ°ç±»åä¸å¹é '{}',åçç³»ç»å¼å¸¸.", requestURI, e); return AjaxResult.error(String.format("请æ±åæ°ç±»åä¸å¹é ï¼åæ°[%s]è¦æ±ç±»å为ï¼'%s'ï¼ä½è¾å ¥å¼ä¸ºï¼'%s'", e.getName(), e.getRequiredType().getName(), value)); } /** * æ¦æªæªç¥çè¿è¡æ¶å¼å¸¸ */ @ExceptionHandler(RuntimeException.class) public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请æ±å°å'{}',åçæªç¥å¼å¸¸.", requestURI, e); return AjaxResult.error(e.getMessage()); } /** * ç³»ç»å¼å¸¸ */ @ExceptionHandler(Exception.class) public AjaxResult handleException(Exception e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请æ±å°å'{}',åçç³»ç»å¼å¸¸.", requestURI, e); return AjaxResult.error(e.getMessage()); } /** * èªå®ä¹éªè¯å¼å¸¸ */ @ExceptionHandler(BindException.class) public AjaxResult handleBindException(BindException e) { log.error(e.getMessage(), e); String message = e.getAllErrors().get(0).getDefaultMessage(); return AjaxResult.error(message); } /** * èªå®ä¹éªè¯å¼å¸¸ */ @ExceptionHandler(MethodArgumentNotValidException.class) public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { log.error(e.getMessage(), e); String message = e.getBindingResult().getFieldError().getDefaultMessage(); return AjaxResult.error(message); } /** * å é¨è®¤è¯å¼å¸¸ */ @ExceptionHandler(InnerAuthException.class) public AjaxResult handleInnerAuthException(InnerAuthException e) { return AjaxResult.error(e.getMessage()); } /** * æ¼ç¤ºæ¨¡å¼å¼å¸¸ */ @ExceptionHandler(DemoModeException.class) public AjaxResult handleDemoModeException(DemoModeException e) { return AjaxResult.error("æ¼ç¤ºæ¨¡å¼ï¼ä¸å 许æä½"); } } se-common/se-common-security/src/main/java/com/se/common/security/utils/DictUtils.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,75 @@ package com.se.common.security.utils; import java.util.Collection; import java.util.List; import com.alibaba.fastjson2.JSONArray; import com.se.common.core.constant.CacheConstants; import com.se.common.core.utils.SpringUtils; import com.se.common.core.utils.StringUtils; import com.se.common.redis.service.RedisService; import com.se.system.api.domain.SysDictData; /** * åå ¸å·¥å ·ç±» * * @author admin */ public class DictUtils { /** * 设置åå ¸ç¼å * * @param key åæ°é® * @param dictDatas åå ¸æ°æ®å表 */ public static void setDictCache(String key, List<SysDictData> dictDatas) { SpringUtils.getBean(RedisService.class).setCacheObject(getCacheKey(key), dictDatas); } /** * è·ååå ¸ç¼å * * @param key åæ°é® * @return dictDatas åå ¸æ°æ®å表 */ public static List<SysDictData> getDictCache(String key) { JSONArray arrayCache = SpringUtils.getBean(RedisService.class).getCacheObject(getCacheKey(key)); if (StringUtils.isNotNull(arrayCache)) { return arrayCache.toList(SysDictData.class); } return null; } /** * å 餿å®åå ¸ç¼å * * @param key åå ¸é® */ public static void removeDictCache(String key) { SpringUtils.getBean(RedisService.class).deleteObject(getCacheKey(key)); } /** * æ¸ ç©ºåå ¸ç¼å */ public static void clearDictCache() { Collection<String> keys = SpringUtils.getBean(RedisService.class).keys(CacheConstants.SYS_DICT_KEY + "*"); SpringUtils.getBean(RedisService.class).deleteObject(keys); } /** * 设置cache key * * @param configKey åæ°é® * @return ç¼åé®key */ public static String getCacheKey(String configKey) { return CacheConstants.SYS_DICT_KEY + configKey; } } se-common/se-common-sensitive/pom.xml
@@ -9,10 +9,10 @@ </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ruoyi-common-sensitive</artifactId> <artifactId>se-common-sensitive</artifactId> <description> ruoyi-common-sensitiveæ°æ®è±æ se-common-sensitiveæ°æ®è±æ </description> <dependencies> se-common/se-common-sensitive/src/main/java/com/se/common/sensitive/config/SensitiveJsonSerializer.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,67 @@ package com.se.common.sensitive.config; import java.io.IOException; import java.util.Objects; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.BeanProperty; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.ContextualSerializer; import com.se.common.security.utils.SecurityUtils; import com.se.common.sensitive.annotation.Sensitive; import com.se.common.sensitive.enums.DesensitizedType; import com.se.system.api.model.LoginUser; /** * æ°æ®è±æåºååè¿æ»¤ * * @author admin */ public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer { private DesensitizedType desensitizedType; @Override public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (desensitization()) { gen.writeString(desensitizedType.desensitizer().apply(value)); } else { gen.writeString(value); } } @Override public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException { Sensitive annotation = property.getAnnotation(Sensitive.class); if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) { this.desensitizedType = annotation.desensitizedType(); return this; } return prov.findValueSerializer(property.getType(), property); } /** * æ¯å¦éè¦è±æå¤ç */ private boolean desensitization() { try { LoginUser securityUser = SecurityUtils.getLoginUser(); // 管çåä¸è±æ return !securityUser.getSysUser().isAdmin(); } catch (Exception e) { return true; } } } se-common/se-common-sensitive/src/main/java/com/se/common/sensitive/enums/DesensitizedType.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,59 @@ package com.se.common.sensitive.enums; import java.util.function.Function; import com.se.common.sensitive.utils.DesensitizedUtil; /** * è±æç±»å * * @author admin */ public enum DesensitizedType { /** * å§åï¼ç¬¬2使巿¿æ¢ */ USERNAME(s -> s.replaceAll("(\\S)\\S(\\S*)", "$1*$2")), /** * å¯ç ï¼å ¨é¨å符é½ç¨*ä»£æ¿ */ PASSWORD(DesensitizedUtil::password), /** * 身份è¯ï¼ä¸é´10使巿¿æ¢ */ ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\d{4})", "$1** **** ****$2")), /** * ææºå·ï¼ä¸é´4使巿¿æ¢ */ PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")), /** * çµåé®ç®±ï¼ä» æ¾ç¤ºç¬¬ä¸ä¸ªåæ¯å@åé¢çå°åæ¾ç¤ºï¼å ¶ä»æå·æ¿æ¢ */ EMAIL(s -> s.replaceAll("(^.)[^@]*(@.*$)", "$1****$2")), /** * é¶è¡å¡å·ï¼ä¿çæå4ä½ï¼å ¶ä»æå·æ¿æ¢ */ BANK_CARD(s -> s.replaceAll("\\d{15}(\\d{3})", "**** **** **** **** $1")), /** * 车çå·ç ï¼å 嫿®é车è¾ãæ°è½æºè½¦è¾ */ CAR_LICENSE(DesensitizedUtil::carLicense); private final Function<String, String> desensitizer; DesensitizedType(Function<String, String> desensitizer) { this.desensitizer = desensitizer; } public Function<String, String> desensitizer() { return desensitizer; } } se-common/se-common-sensitive/src/main/java/com/se/common/sensitive/utils/DesensitizedUtil.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,51 @@ package com.se.common.sensitive.utils; import com.se.common.core.utils.StringUtils; /** * è±æå·¥å ·ç±» * * @author admin */ public class DesensitizedUtil { /** * å¯ç çå ¨é¨å符é½ç¨*代æ¿ï¼æ¯å¦ï¼****** * * @param password å¯ç * @return è±æåçå¯ç */ public static String password(String password) { if (StringUtils.isBlank(password)) { return StringUtils.EMPTY; } return StringUtils.repeat('*', password.length()); } /** * 车çä¸é´ç¨*代æ¿ï¼å¦ææ¯é误ç车çï¼ä¸å¤ç * * @param carLicense 宿´ç车çå· * @return è±æåç车ç */ public static String carLicense(String carLicense) { if (StringUtils.isBlank(carLicense)) { return StringUtils.EMPTY; } // æ®é车ç if (carLicense.length() == 7) { carLicense = StringUtils.hide(carLicense, 3, 6); } else if (carLicense.length() == 8) { // æ°è½æºè½¦ç carLicense = StringUtils.hide(carLicense, 3, 7); } return carLicense; } } se-common/se-common-swagger/pom.xml
@@ -9,10 +9,10 @@ </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ruoyi-common-swagger</artifactId> <artifactId>se-common-swagger</artifactId> <description> ruoyi-common-swaggerç³»ç»æ¥å£ se-common-swaggerç³»ç»æ¥å£ </description> <dependencies> se-common/se-common-swagger/src/main/java/com/se/common/swagger/annotation/EnableCustomSwagger2.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.se.common.swagger.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.context.annotation.Import; import com.se.common.swagger.config.SwaggerAutoConfiguration; @Target({ ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Import({ SwaggerAutoConfiguration.class }) public @interface EnableCustomSwagger2 { } se-common/se-common-swagger/src/main/java/com/se/common/swagger/config/SwaggerBeanPostProcessor.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,52 @@ package com.se.common.swagger.config; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.util.ReflectionUtils; import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider; import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider; import java.lang.reflect.Field; import java.util.List; import java.util.stream.Collectors; /** * swagger å¨ springboot 2.6.x ä¸å ¼å®¹é®é¢çå¤ç * * @author admin */ public class SwaggerBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) { customizeSpringfoxHandlerMappings(getHandlerMappings(bean)); } return bean; } private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) { List<T> copy = mappings.stream().filter(mapping -> mapping.getPatternParser() == null) .collect(Collectors.toList()); mappings.clear(); mappings.addAll(copy); } @SuppressWarnings("unchecked") private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) { try { Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); field.setAccessible(true); return (List<RequestMappingInfoHandlerMapping>) field.get(bean); } catch (IllegalArgumentException | IllegalAccessException e) { throw new IllegalStateException(e); } } } se-gateway/pom.xml
@@ -8,10 +8,10 @@ </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ruoyi-gateway</artifactId> <artifactId>se-gateway</artifactId> <description> ruoyi-gatewayç½å ³æ¨¡å se-gatewayç½å ³æ¨¡å </description> <dependencies> se-modules/pom.xml
ÎļþÃû´Ó ruoyi-modules/pom.xml ÐÞ¸Ä @@ -9,17 +9,17 @@ <modelVersion>4.0.0</modelVersion> <modules> <module>ruoyi-system</module> <module>ruoyi-gen</module> <module>ruoyi-job</module> <module>ruoyi-file</module> <module>se-system</module> <module>se-gen</module> <module>se-job</module> <module>se-file</module> </modules> <artifactId>ruoyi-modules</artifactId> <artifactId>se-modules</artifactId> <packaging>pom</packaging> <description> ruoyi-modulesä¸å¡æ¨¡å se-modulesä¸å¡æ¨¡å </description> </project> se-modules/se-file/pom.xml
ÎļþÃû´Ó ruoyi-modules/se-file/pom.xml ÐÞ¸Ä @@ -9,10 +9,10 @@ </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ruoyi-modules-file</artifactId> <artifactId>se-modules-file</artifactId> <description> ruoyi-modules-fileæä»¶æå¡ se-modules-fileæä»¶æå¡ </description> <dependencies> se-modules/se-file/src/main/java/com/se/file/SeFileApplication.java
se-modules/se-file/src/main/java/com/se/file/config/MinioConfig.java
se-modules/se-file/src/main/java/com/se/file/config/ResourcesConfig.java
se-modules/se-file/src/main/java/com/se/file/controller/SysFileController.java
se-modules/se-file/src/main/java/com/se/file/service/FastDfsSysFileServiceImpl.java
se-modules/se-file/src/main/java/com/se/file/service/ISysFileService.java
se-modules/se-file/src/main/java/com/se/file/service/LocalSysFileServiceImpl.java
se-modules/se-file/src/main/java/com/se/file/service/MinioSysFileServiceImpl.java
se-modules/se-file/src/main/java/com/se/file/utils/FileUploadUtils.java
se-modules/se-file/src/main/resources/banner.txt
se-modules/se-file/src/main/resources/bootstrap.yml
se-modules/se-file/src/main/resources/logback.xml
se-modules/se-gen/pom.xml
ÎļþÃû´Ó ruoyi-modules/se-gen/pom.xml ÐÞ¸Ä @@ -9,10 +9,10 @@ </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ruoyi-modules-gen</artifactId> <artifactId>se-modules-gen</artifactId> <description> ruoyi-modules-gen代ç çæ se-modules-gen代ç çæ </description> <dependencies> se-modules/se-gen/src/main/java/com/se/gen/SeGenApplication.java
se-modules/se-gen/src/main/java/com/se/gen/config/GenConfig.java
se-modules/se-gen/src/main/java/com/se/gen/controller/GenController.java
se-modules/se-gen/src/main/java/com/se/gen/domain/GenTable.java
se-modules/se-gen/src/main/java/com/se/gen/domain/GenTableColumn.java
se-modules/se-gen/src/main/java/com/se/gen/mapper/GenTableColumnMapper.java
se-modules/se-gen/src/main/java/com/se/gen/mapper/GenTableMapper.java
se-modules/se-gen/src/main/java/com/se/gen/service/GenTableColumnServiceImpl.java
se-modules/se-gen/src/main/java/com/se/gen/service/GenTableServiceImpl.java
se-modules/se-gen/src/main/java/com/se/gen/service/IGenTableColumnService.java
se-modules/se-gen/src/main/java/com/se/gen/service/IGenTableService.java
se-modules/se-gen/src/main/java/com/se/gen/util/GenUtils.java
se-modules/se-gen/src/main/java/com/se/gen/util/VelocityInitializer.java
se-modules/se-gen/src/main/java/com/se/gen/util/VelocityUtils.java
se-modules/se-gen/src/main/resources/banner.txt
se-modules/se-gen/src/main/resources/bootstrap.yml
se-modules/se-gen/src/main/resources/logback.xml
se-modules/se-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml
se-modules/se-gen/src/main/resources/mapper/generator/GenTableMapper.xml
se-modules/se-gen/src/main/resources/vm/java/controller.java.vm
se-modules/se-gen/src/main/resources/vm/java/domain.java.vm
se-modules/se-gen/src/main/resources/vm/java/mapper.java.vm
se-modules/se-gen/src/main/resources/vm/java/service.java.vm
se-modules/se-gen/src/main/resources/vm/java/serviceImpl.java.vm
se-modules/se-gen/src/main/resources/vm/java/sub-domain.java.vm
se-modules/se-gen/src/main/resources/vm/js/api.js.vm
se-modules/se-gen/src/main/resources/vm/sql/sql.vm
se-modules/se-gen/src/main/resources/vm/vue/index-tree.vue.vm
se-modules/se-gen/src/main/resources/vm/vue/index.vue.vm
se-modules/se-gen/src/main/resources/vm/vue/v3/index-tree.vue.vm
se-modules/se-gen/src/main/resources/vm/vue/v3/index.vue.vm
se-modules/se-gen/src/main/resources/vm/xml/mapper.xml.vm
se-modules/se-job/pom.xml
ÎļþÃû´Ó ruoyi-modules/se-job/pom.xml ÐÞ¸Ä @@ -9,10 +9,10 @@ </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ruoyi-modules-job</artifactId> <artifactId>se-modules-job</artifactId> <description> ruoyi-modules-job宿¶ä»»å¡ se-modules-job宿¶ä»»å¡ </description> <dependencies> se-modules/se-job/src/main/java/com/se/job/SeJobApplication.java
se-modules/se-job/src/main/java/com/se/job/config/ScheduleConfig.java
se-modules/se-job/src/main/java/com/se/job/controller/SysJobController.java
se-modules/se-job/src/main/java/com/se/job/controller/SysJobLogController.java
se-modules/se-job/src/main/java/com/se/job/domain/SysJob.java
se-modules/se-job/src/main/java/com/se/job/domain/SysJobLog.java
se-modules/se-job/src/main/java/com/se/job/mapper/SysJobLogMapper.java
se-modules/se-job/src/main/java/com/se/job/mapper/SysJobMapper.java
se-modules/se-job/src/main/java/com/se/job/service/ISysJobLogService.java
se-modules/se-job/src/main/java/com/se/job/service/ISysJobService.java
se-modules/se-job/src/main/java/com/se/job/service/SysJobLogServiceImpl.java
se-modules/se-job/src/main/java/com/se/job/service/SysJobServiceImpl.java
se-modules/se-job/src/main/java/com/se/job/task/RyTask.java
se-modules/se-job/src/main/java/com/se/job/util/AbstractQuartzJob.java
se-modules/se-job/src/main/java/com/se/job/util/CronUtils.java
se-modules/se-job/src/main/java/com/se/job/util/JobInvokeUtil.java
se-modules/se-job/src/main/java/com/se/job/util/QuartzDisallowConcurrentExecution.java
se-modules/se-job/src/main/java/com/se/job/util/QuartzJobExecution.java
se-modules/se-job/src/main/java/com/se/job/util/ScheduleUtils.java
se-modules/se-job/src/main/resources/banner.txt
se-modules/se-job/src/main/resources/bootstrap.yml
se-modules/se-job/src/main/resources/logback.xml
se-modules/se-job/src/main/resources/mapper/job/SysJobLogMapper.xml
se-modules/se-job/src/main/resources/mapper/job/SysJobMapper.xml
se-modules/se-system/pom.xml
ÎļþÃû´Ó ruoyi-modules/se-system/pom.xml ÐÞ¸Ä @@ -9,10 +9,10 @@ </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ruoyi-modules-system</artifactId> <artifactId>se-modules-system</artifactId> <description> ruoyi-modules-systemç³»ç»æ¨¡å se-modules-systemç³»ç»æ¨¡å </description> <dependencies> se-modules/se-system/src/main/java/com/se/system/RuoYiSystemApplication.java
se-modules/se-system/src/main/java/com/se/system/controller/SysConfigController.java
se-modules/se-system/src/main/java/com/se/system/controller/SysDeptController.java
se-modules/se-system/src/main/java/com/se/system/controller/SysDictDataController.java
se-modules/se-system/src/main/java/com/se/system/controller/SysDictTypeController.java
se-modules/se-system/src/main/java/com/se/system/controller/SysLogininforController.java
se-modules/se-system/src/main/java/com/se/system/controller/SysMenuController.java
se-modules/se-system/src/main/java/com/se/system/controller/SysNoticeController.java
se-modules/se-system/src/main/java/com/se/system/controller/SysOperlogController.java
se-modules/se-system/src/main/java/com/se/system/controller/SysPostController.java
se-modules/se-system/src/main/java/com/se/system/controller/SysProfileController.java
se-modules/se-system/src/main/java/com/se/system/controller/SysRoleController.java
se-modules/se-system/src/main/java/com/se/system/controller/SysUserController.java
se-modules/se-system/src/main/java/com/se/system/controller/SysUserOnlineController.java
se-modules/se-system/src/main/java/com/se/system/domain/SysConfig.java
se-modules/se-system/src/main/java/com/se/system/domain/SysMenu.java
se-modules/se-system/src/main/java/com/se/system/domain/SysNotice.java
se-modules/se-system/src/main/java/com/se/system/domain/SysPost.java
se-modules/se-system/src/main/java/com/se/system/domain/SysRoleDept.java
se-modules/se-system/src/main/java/com/se/system/domain/SysRoleMenu.java
se-modules/se-system/src/main/java/com/se/system/domain/SysUserOnline.java
se-modules/se-system/src/main/java/com/se/system/domain/SysUserPost.java
se-modules/se-system/src/main/java/com/se/system/domain/SysUserRole.java
se-modules/se-system/src/main/java/com/se/system/domain/vo/MetaVo.java
se-modules/se-system/src/main/java/com/se/system/domain/vo/RouterVo.java
se-modules/se-system/src/main/java/com/se/system/domain/vo/TreeSelect.java
se-modules/se-system/src/main/java/com/se/system/mapper/SysConfigMapper.java
se-modules/se-system/src/main/java/com/se/system/mapper/SysDeptMapper.java
se-modules/se-system/src/main/java/com/se/system/mapper/SysDictDataMapper.java
se-modules/se-system/src/main/java/com/se/system/mapper/SysDictTypeMapper.java
se-modules/se-system/src/main/java/com/se/system/mapper/SysLogininforMapper.java
se-modules/se-system/src/main/java/com/se/system/mapper/SysMenuMapper.java
se-modules/se-system/src/main/java/com/se/system/mapper/SysNoticeMapper.java
se-modules/se-system/src/main/java/com/se/system/mapper/SysOperLogMapper.java
se-modules/se-system/src/main/java/com/se/system/mapper/SysPostMapper.java
se-modules/se-system/src/main/java/com/se/system/mapper/SysRoleDeptMapper.java
se-modules/se-system/src/main/java/com/se/system/mapper/SysRoleMapper.java
se-modules/se-system/src/main/java/com/se/system/mapper/SysRoleMenuMapper.java
se-modules/se-system/src/main/java/com/se/system/mapper/SysUserMapper.java
se-modules/se-system/src/main/java/com/se/system/mapper/SysUserPostMapper.java
se-modules/se-system/src/main/java/com/se/system/mapper/SysUserRoleMapper.java
se-modules/se-system/src/main/java/com/se/system/service/ISysConfigService.java
se-modules/se-system/src/main/java/com/se/system/service/ISysDeptService.java
se-modules/se-system/src/main/java/com/se/system/service/ISysDictDataService.java
se-modules/se-system/src/main/java/com/se/system/service/ISysDictTypeService.java
se-modules/se-system/src/main/java/com/se/system/service/ISysLogininforService.java
se-modules/se-system/src/main/java/com/se/system/service/ISysMenuService.java
se-modules/se-system/src/main/java/com/se/system/service/ISysNoticeService.java
se-modules/se-system/src/main/java/com/se/system/service/ISysOperLogService.java
se-modules/se-system/src/main/java/com/se/system/service/ISysPermissionService.java
se-modules/se-system/src/main/java/com/se/system/service/ISysPostService.java
se-modules/se-system/src/main/java/com/se/system/service/ISysRoleService.java
se-modules/se-system/src/main/java/com/se/system/service/ISysUserOnlineService.java
se-modules/se-system/src/main/java/com/se/system/service/ISysUserService.java
se-modules/se-system/src/main/java/com/se/system/service/impl/SysConfigServiceImpl.java
se-modules/se-system/src/main/java/com/se/system/service/impl/SysDeptServiceImpl.java
se-modules/se-system/src/main/java/com/se/system/service/impl/SysDictDataServiceImpl.java
se-modules/se-system/src/main/java/com/se/system/service/impl/SysDictTypeServiceImpl.java
se-modules/se-system/src/main/java/com/se/system/service/impl/SysLogininforServiceImpl.java
se-modules/se-system/src/main/java/com/se/system/service/impl/SysMenuServiceImpl.java
se-modules/se-system/src/main/java/com/se/system/service/impl/SysNoticeServiceImpl.java
se-modules/se-system/src/main/java/com/se/system/service/impl/SysOperLogServiceImpl.java
se-modules/se-system/src/main/java/com/se/system/service/impl/SysPermissionServiceImpl.java
se-modules/se-system/src/main/java/com/se/system/service/impl/SysPostServiceImpl.java
se-modules/se-system/src/main/java/com/se/system/service/impl/SysRoleServiceImpl.java
se-modules/se-system/src/main/java/com/se/system/service/impl/SysUserOnlineServiceImpl.java
se-modules/se-system/src/main/java/com/se/system/service/impl/SysUserServiceImpl.java
se-modules/se-system/src/main/resources/banner.txt
se-modules/se-system/src/main/resources/bootstrap.yml
se-modules/se-system/src/main/resources/logback.xml
se-modules/se-system/src/main/resources/mapper/system/SysConfigMapper.xml
se-modules/se-system/src/main/resources/mapper/system/SysDeptMapper.xml
se-modules/se-system/src/main/resources/mapper/system/SysDictDataMapper.xml
se-modules/se-system/src/main/resources/mapper/system/SysDictTypeMapper.xml
se-modules/se-system/src/main/resources/mapper/system/SysLogininforMapper.xml
se-modules/se-system/src/main/resources/mapper/system/SysMenuMapper.xml
se-modules/se-system/src/main/resources/mapper/system/SysNoticeMapper.xml
se-modules/se-system/src/main/resources/mapper/system/SysOperLogMapper.xml
se-modules/se-system/src/main/resources/mapper/system/SysPostMapper.xml
se-modules/se-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml
se-modules/se-system/src/main/resources/mapper/system/SysRoleMapper.xml
se-modules/se-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml
se-modules/se-system/src/main/resources/mapper/system/SysUserMapper.xml
se-modules/se-system/src/main/resources/mapper/system/SysUserPostMapper.xml
se-modules/se-system/src/main/resources/mapper/system/SysUserRoleMapper.xml
se-visual/pom.xml
@@ -9,14 +9,14 @@ <modelVersion>4.0.0</modelVersion> <modules> <module>ruoyi-monitor</module> <module>se-monitor</module> </modules> <artifactId>ruoyi-visual</artifactId> <artifactId>se-visual</artifactId> <packaging>pom</packaging> <description> ruoyi-visualå¾å½¢åç®¡çæ¨¡å se-visualå¾å½¢åç®¡çæ¨¡å </description> </project> se-visual/se-monitor/pom.xml
@@ -8,10 +8,10 @@ </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ruoyi-visual-monitor</artifactId> <artifactId>se-visual-monitor</artifactId> <description> ruoyi-visual-monitorçæ§ä¸å¿ se-visual-monitorçæ§ä¸å¿ </description> <dependencies> se-visual/se-monitor/src/main/java/com/se/modules/monitor/SeMonitorApplication.java
@@ -16,15 +16,6 @@ public static void main(String[] args) { SpringApplication.run(SeMonitorApplication.class, args); System.out.println("(â¥â â¿â )ï¾ï¾ çæ§ä¸å¿å¯å¨æå á(´ڡ`á)ï¾ \n" + " .-------. ____ __ \n" + " | _ _ \\ \\ \\ / / \n" + " | ( ' ) | \\ _. / ' \n" + " |(_ o _) / _( )_ .' \n" + " | (_,_).' __ ___(_ o _)' \n" + " | |\\ \\ | || |(_,_)' \n" + " | | \\ `' /| `-' / \n" + " | | \\ / \\ / \n" + " ''-' `'-' `-..-' "); System.out.println(" çæ§ä¸å¿å¯å¨æå "); } }