Browse Source

1.抽取公共核心包

1 1 month ago
parent
commit
f8be6263c3
31 changed files with 2184 additions and 11 deletions
  1. 62 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/base/BaseApi.java
  2. 126 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/base/BaseController.java
  3. 53 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/config/JacksonConfig.java
  4. 32 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/config/Long2StringAdapter.java
  5. 35 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/config/WebConfig.java
  6. 42 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/config/XssConfiguration.java
  7. 39 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/constants/Constants.java
  8. 26 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/constants/DateConstants.java
  9. 26 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/constants/NumberConstants.java
  10. 164 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/enums/HttpStatusCodeEnum.java
  11. 71 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/exception/BusinessException.java
  12. 42 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/handler/BaseCoreRequestHandlerInterceptor.java
  13. 84 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/pojo/BaseMenu.java
  14. 163 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/pojo/BaseParams.java
  15. 117 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/pojo/BaseResult.java
  16. 124 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/pojo/BaseTreeNode.java
  17. 65 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/pojo/DeleteParams.java
  18. 63 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/pojo/LoginParamVO.java
  19. 152 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/pojo/ResponseMsg.java
  20. 40 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/service/IBaseEnumService.java
  21. 43 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/utils/Base64Utils.java
  22. 79 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/utils/DateUtils.java
  23. 211 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/utils/DecimalUtils.java
  24. 32 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/utils/JasyptUtils.java
  25. 53 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/utils/NumberUtils.java
  26. 97 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/utils/StringUtils.java
  27. 25 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/xss/XssFilter.java
  28. 107 0
      imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/xss/XssHttpServletRequestWrapper.java
  29. 1 1
      imwork-commons/imwork-commons-core/src/main/resources/application.properties
  30. 1 1
      imwork-windows/imwork-silos/src/main/resources/static/business/login/login.js
  31. 9 9
      imwork-windows/imwork-silos/src/main/resources/templates/login/login.html

+ 62 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/base/BaseApi.java

@@ -0,0 +1,62 @@
+package top.imwork.commons.core.base;
+
+import org.springframework.web.bind.annotation.*;
+import top.imwork.commons.core.pojo.DeleteParams;
+
+/**
+ * 〈功能简述〉<br>
+ * 〈接口抽取〉
+ * R 响应
+ * T 入参实体
+ * P 列表查询入参实体
+ * FileName: BaseApi
+ *
+ * @author stars
+ * @create 2020/7/21 14:23
+ * @since 1.0.0
+ */
+public interface BaseApi<R, T, P> {
+    /**
+     * 根据id查询数据
+     *
+     * @param id long类型的id
+     * @return 返回查询结果
+     */
+    @GetMapping("/info/{id}")
+    R info(@PathVariable("id") Long id);
+
+    /**
+     * 添加info
+     *
+     * @param t 入参
+     * @return R 响应
+     */
+    @PostMapping("/save")
+    R save(@RequestBody T t);
+
+    /**
+     * 根据id逻辑删除
+     *
+     * @param id id
+     * @return boolean
+     */
+    @DeleteMapping("/delete/{id}")
+    R delete(@PathVariable("id") Long id);
+
+    /**
+     * 根据ids数组删除
+     *
+     * @return boolean
+     */
+    @DeleteMapping("/deleteByIds")
+    R deleteByIds(@RequestBody DeleteParams params);
+
+    /**
+     * 获取信息列表
+     *
+     * @param listParamVO 入参
+     * @return ResponseMsg 信息列表查询结果
+     */
+    @PostMapping("/queryPage")
+    R queryPage(@RequestBody P listParamVO);
+}

+ 126 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/base/BaseController.java

@@ -0,0 +1,126 @@
+package top.imwork.commons.core.base;
+
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.stereotype.Controller;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.MissingServletRequestParameterException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.client.HttpClientErrorException;
+import top.imwork.commons.core.constants.Constants;
+import top.imwork.commons.core.enums.HttpStatusCodeEnum;
+import top.imwork.commons.core.exception.BusinessException;
+import top.imwork.commons.core.pojo.ResponseMsg;
+
+import java.util.Objects;
+
+/**
+ * Copyright (C), 2015-2021
+ * FileName: BaseController
+ * Author(作者姓名):   jiangxiaowei
+ * CreateDate(创建时间):     2021/8/2 15:24
+ * UpdateDate(修改时间):     2021/8/2 15:24
+ * Description(功能描述):    基础控制器
+ * Since(版本号)  1.0.0
+ * History:
+ */
+@Slf4j
+@Controller
+@ControllerAdvice
+public class BaseController {
+    /**
+     * HttpClientErrorException
+     *
+     * @return org.springframework.web.client.HttpClientErrorException$Unauthorized: 401
+     */
+    @ResponseBody
+    @ExceptionHandler({HttpClientErrorException.class})
+    public ResponseMsg httpClientErrorException(Exception e) {
+        log.error(e.getMessage());
+        return ResponseMsg.buildResponse(HttpStatusCodeEnum.UNAUTHORIZED.getCode(), HttpStatusCodeEnum.UNAUTHORIZED.getZmsg(), "error:refresh_token 过期无效");
+    }
+
+    /**
+     * HTTP请求参数转换异常
+     *
+     * @param exception HTTP请求参数转换异常
+     * @return
+     */
+    @ResponseBody
+    @ExceptionHandler({HttpMessageNotReadableException.class})
+    public ResponseMsg httpMessageNotReadableException(Exception exception) {
+        log.error("code:" + HttpStatusCodeEnum.BAD_REQUEST.getCode() + "message:" + HttpStatusCodeEnum.BAD_REQUEST.getZmsg(), "error:HTTP请求参数转换错误!");
+        return ResponseMsg.buildResponse(HttpStatusCodeEnum.BAD_REQUEST.getCode(), HttpStatusCodeEnum.BAD_REQUEST.getZmsg(), "error:HTTP请求参数转换错误!");
+    }
+
+    /**
+     * @param exception 捕获的异常
+     * @param request   请求参数
+     * @return 响应
+     */
+    @ResponseBody
+    @ExceptionHandler(value = Exception.class)
+    protected ResponseMsg exception(Exception exception, HttpServletRequest request, HttpServletResponse response) {
+        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
+        if (statusCode == null) {
+            log.error(HttpStatusCodeEnum.INTERNAL_SERVER_ERROR.getZmsg(), exception.getMessage());
+            return ResponseMsg.buildResponse(HttpStatusCodeEnum.INTERNAL_SERVER_ERROR.getCode(), HttpStatusCodeEnum.INTERNAL_SERVER_ERROR.getZmsg(), Constants.ERROR + exception.getMessage());
+        } else {
+            log.error(Objects.requireNonNull(HttpStatusCodeEnum.fromTypeCode(statusCode)).getZmsg(), exception.getMessage());
+            return ResponseMsg.buildResponse(statusCode, Objects.requireNonNull(HttpStatusCodeEnum.fromTypeCode(statusCode)).getZmsg(), Constants.ERROR + exception.getMessage());
+        }
+    }
+
+    /**
+     * 业务异常
+     *
+     * @param exception 捕获的异常
+     * @return 响应
+     */
+    @ResponseBody
+    @ExceptionHandler({BusinessException.class})
+    public ResponseMsg exceptionParam(BusinessException exception) {
+        log.error("业务异常:" + exception.getMessage());
+        return ResponseMsg.error("业务异常:" + exception.getMessage());
+    }
+
+    /**
+     * 缺少参数的异常处理
+     *
+     * @param exception 捕获的异常
+     * @return 响应
+     */
+    @ResponseBody
+    @ExceptionHandler({MissingServletRequestParameterException.class})
+    public ResponseMsg exceptionParam(MissingServletRequestParameterException exception) {
+        log.error(exception.getMessage());
+        return ResponseMsg.error(exception.getMessage());
+    }
+
+    /**
+     * 参数校验异常处理
+     *
+     * @param exception 捕获的异常
+     * @return 响应
+     */
+    @ResponseBody
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    public ResponseMsg methodArgumentNotValidException(MethodArgumentNotValidException exception) {
+        BindingResult bindingResult = exception.getBindingResult();
+        if (bindingResult.hasErrors()) {
+            FieldError error = bindingResult.getFieldError();
+            if (error != null) {
+                log.error(error.getField() + error.getDefaultMessage());
+                return ResponseMsg.error(error.getField() + error.getDefaultMessage());
+            }
+        }
+        log.error(exception.getMessage());
+        return ResponseMsg.error(exception.getMessage());
+    }
+}

+ 53 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/config/JacksonConfig.java

@@ -0,0 +1,53 @@
+package top.imwork.commons.core.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import top.imwork.commons.core.constants.DateConstants;
+
+import java.text.SimpleDateFormat;
+import java.util.TimeZone;
+
+/**
+ * Copyright (C), 2015-2021
+ * FileName: JacksonConfig
+ * Author(作者姓名):   jiangxiaowei
+ * CreateDate(创建时间):     2021/8/2 15:35
+ * UpdateDate(修改时间):     2021/8/2 15:35
+ * Description(功能描述):    JacksonConfig
+ * Since(版本号)  1.0.0
+ * History:
+ */
+@Configuration
+public class JacksonConfig {
+    /**
+     * ObjectMapper配置
+     * @return objectMapper
+     */
+    @Bean
+    public ObjectMapper objectMapper() {
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.registerModule(new JavaTimeModule());
+        SimpleModule simpleModule = new SimpleModule();
+        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
+        objectMapper.registerModule(simpleModule);
+        objectMapper.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+        objectMapper.setDateFormat(new SimpleDateFormat(DateConstants.DATE_TIME_PATTERN));
+        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        return  objectMapper;
+    }
+
+    @Bean
+    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
+        return builder -> {
+            // Long 会自定转换成 String
+            builder.serializerByType(Long.class, ToStringSerializer.instance);
+        };
+    }
+}

+ 32 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/config/Long2StringAdapter.java

@@ -0,0 +1,32 @@
+package top.imwork.commons.core.config;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import org.springframework.boot.jackson.JsonComponent;
+import org.springframework.context.annotation.Bean;
+import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
+
+/**
+ * Copyright (C), 2015-2021
+ * FileName: Long2StringAdapter
+ * Author(作者姓名):   jiangxiaowei
+ * CreateDate(创建时间):     2021/8/2 15:36
+ * UpdateDate(修改时间):     2021/8/2 15:36
+ * Description(功能描述):    Long2StringAdapter
+ * Since(版本号)  1.0.0
+ * History:
+ */
+@JsonComponent
+public class Long2StringAdapter {
+    @Bean
+    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
+        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
+        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+        SimpleModule module = new SimpleModule();
+        module.addSerializer(Long.class, ToStringSerializer.instance);
+        objectMapper.registerModule(module);
+        return objectMapper;
+    }
+}

+ 35 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/config/WebConfig.java

@@ -0,0 +1,35 @@
+package top.imwork.commons.core.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+import top.imwork.commons.core.handler.BaseCoreRequestHandlerInterceptor;
+import top.imwork.commons.core.utils.StringUtils;
+
+/**
+ * Copyright (C), 2015-2021
+ * FileName: WebConfig
+ * Author:   imwork
+ * Date:     2021/2/3 15:52
+ * Description: web公共配置
+ * History:
+ * <p>
+ * 作者姓名           修改时间           版本号              描述
+ */
+public class WebConfig extends WebMvcConfigurationSupport {
+    private final String[] defaultWhiteList = new String[] {
+            "*.html", "*.js", "*.gif", "*.jpg", "*.png", "*.css", "*.ico", "/druid/*", "/doc.html", "/swagger-ui.html", "/swagger-resources",
+            "/swagger-resources/**", "/v2/api-docs/**", "/webjars/springfox-swagger-ui/**", "/assets/**" };
+
+    @Value("${silos.request.whiteList:/login}")
+    private String whiteList;
+
+    @Override
+    protected void addInterceptors(InterceptorRegistry registry) {
+        String[] addPathPatterns = { "/**" };
+        String[] excludePathPatterns = new String[]{"/login"};
+        if (StringUtils.isNotEmpty(this.whiteList))
+            excludePathPatterns = this.whiteList.split(",");
+        registry.addInterceptor(new BaseCoreRequestHandlerInterceptor()).addPathPatterns(addPathPatterns).excludePathPatterns(this.defaultWhiteList).excludePathPatterns(excludePathPatterns);
+    }
+}

+ 42 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/config/XssConfiguration.java

@@ -0,0 +1,42 @@
+package top.imwork.commons.core.config;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import top.imwork.commons.core.xss.XssFilter;
+
+/**
+ * Copyright (C), 2015-2021
+ * FileName: XssConfiguration
+ * Author(作者姓名):   jiangxiaowei
+ * CreateDate(创建时间):     2021/8/2 15:19
+ * UpdateDate(修改时间):     2021/8/2 15:19
+ * Description(功能描述):    XSS攻击防护
+ * Since(版本号)  1.0.0
+ * History:
+ */
+@Configuration
+@PropertySource(value = {"classpath:application.properties"}, ignoreResourceNotFound = true, encoding = "UTF-8")
+@ConditionalOnProperty(name = {"core.xss.filter"}, havingValue = "true", matchIfMissing = true)
+public class XssConfiguration {
+    static final Logger logger = LoggerFactory.getLogger(XssConfiguration.class);
+
+    public XssConfiguration() {
+        logger.info("XSS攻击防护配置");
+    }
+
+    @Bean
+    public FilterRegistrationBean<XssFilter> xssFilterRegistration() {
+        FilterRegistrationBean<XssFilter> registration = new FilterRegistrationBean<>();
+        registration.setFilter(new XssFilter());
+        String[] strings = new String[1];
+        strings[0] = "/*";
+        registration.addUrlPatterns(strings);
+        registration.setOrder(1);
+        return registration;
+    }
+}

+ 39 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/constants/Constants.java

@@ -0,0 +1,39 @@
+package top.imwork.commons.core.constants;
+
+/**
+ * Copyright (C), 2015-2022
+ * FileName: Constants
+ * Author<作者姓名>:   stars
+ * CreateTime<创建时间>:   2022/5/18 15:31
+ * UpdateTime<修改时间>:   2022/5/18 15:31
+ * Description〈功能简述〉: 通用常量定义
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+public class Constants {
+    private Constants() {
+        throw new IllegalStateException("Utility class");
+    }
+
+    /**
+     * 默认字符集编码
+     */
+    public static final String UTF8 = "UTF-8";
+
+    public static final String GBK = "GBK";
+
+    public static final String ISO88591 = "iso8859-1";
+
+    /**
+     * 分隔符
+     */
+    public static final char SEPARATOR = '_';
+
+    /**
+     * 请求头id
+     */
+    public static final String REQUEST_HEAD_ID = "RequestHeadId";
+
+    public static final String ERROR = "error:";
+
+}

+ 26 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/constants/DateConstants.java

@@ -0,0 +1,26 @@
+package top.imwork.commons.core.constants;
+
+/**
+ * Copyright (C), 2015-2023
+ * FileName: DateConstants
+ * Author<作者姓名>:   stars
+ * CreateTime<创建时间>:   2023/2/14 23:25
+ * UpdateTime<修改时间>:   2023/2/14 23:25
+ * Description〈功能简述〉: 时间常量
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+public class DateConstants {
+    /**
+     * 时间格式(yyyy-MM-dd)
+     */
+    public static final String DATE_PATTERN = "yyyy-MM-dd";
+    /**
+     * 时间格式(yyyyMMddHHmmss)
+     */
+    public static final String NUM_DATE_TIME_PATTERN = "yyyyMMddHHmmss";
+    /**
+     * 时间格式(yyyy-MM-dd HH:mm:ss)
+     */
+    public static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
+}

+ 26 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/constants/NumberConstants.java

@@ -0,0 +1,26 @@
+package top.imwork.commons.core.constants;
+
+/**
+ * Copyright (C), 2015-2022
+ * FileName: NumberConstants
+ * Author<作者姓名>:   jiangxiaowei
+ * CreateTime<创建时间>:   2022/7/22 9:55
+ * UpdateTime<修改时间>:   2022/7/22 9:55
+ * Description〈功能简述〉: 数字常量
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+public class NumberConstants {
+    /**
+     * 数字0
+     */
+    public static final int ZERO = 0;
+    /**
+     * 数字4
+     */
+    public static final int FOUR = 4;
+
+    private NumberConstants() {
+        throw new IllegalStateException("Utility class");
+    }
+}

+ 164 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/enums/HttpStatusCodeEnum.java

@@ -0,0 +1,164 @@
+package top.imwork.commons.core.enums;
+
+import top.imwork.commons.core.service.IBaseEnumService;
+
+/**
+ * Copyright (C), 2015-2021
+ * FileName: HttpStatusCodeEnum
+ * Author:   stars
+ * Date:     2021/8/2 14:33
+ * Description: HTTP状态码枚举
+ * History:
+ * <p>
+ * 作者姓名           修改时间           版本号              描述
+ */
+public enum HttpStatusCodeEnum implements IBaseEnumService {
+    /**
+     * 信息类
+     */
+    CONTINUE(100, "Continue", "请继续发送请求的剩余部分"),
+    SWITCHING_PROTOCOLS(101, "Switching Protocols", "协议切换"),
+    PROCESSING(102, "Processing", "请求将继续执行"),
+    CHECKPOINT(103, "Checkpoint", "可以预加载"),
+
+    /**
+     * 2XX响应成功 该类型状态码表示动作被成功接收、理解和接受
+     */
+    OK(200, "OK", "请求已经成功处理"),
+    CREATED(201, "Created", "请求已经成功处理,并创建了资源"),
+    ACCEPTED(202, "Accepted", "请求已经接受,等待执行"),
+    NON_AUTHORITATIVE_INFORMATION(203, "Non-Authoritative Information", "请求已经成功处理,但是信息不是原始的"),
+    NO_CONTENT(204, "No Content", "请求已经成功处理,没有内容需要返回"),
+    RESET_CONTENT(205, "Reset Content", "请求已经成功处理,请重置视图"),
+    PARTIAL_CONTENT(206, "Partial Content", "部分Get请求已经成功处理"),
+    MULTI_STATUS(207, "Multi-Status", "请求已经成功处理,将返回XML消息体"),
+    ALREADY_REPORTED(208, "Already Reported", "请求已经成功处理,一个DAV的绑定成员被前一个请求枚举,并且没有被再一次包括"),
+    IM_USED(226, "IM Used", "请求已经成功处理,将响应一个或者多个实例"),
+
+
+    /**
+     * 3XX(重定向类)该类型状态码表示为了完成指定的动作,必须接受进一步处理。
+     */
+    MULTIPLE_CHOICES(300, "Multiple Choices", "提供可供选择的回馈"),
+    MOVED_PERMANENTLY(301, "Moved Permanently", "请求的资源已经永久转移"),
+    FOUND(302, "Found", "请重新发送请求"),
+    SEE_OTHER(303, "See Other", "请以Get方式请求另一个URI"),
+    NOT_MODIFIED(304, "Not Modified", "资源未改变"),
+    USE_PROXY(305, "Use Proxy", "请通过Location域中的代理进行访问"),
+    TEMPORARY_REDIRECT(307, "Temporary Redirect", "请求的资源临时从不同的URI响应请求"),
+    RESUME_INCOMPLETE(308, "Resume Incomplete", "请求的资源已经永久转移"),
+
+
+    /**
+     * 4XX(客户端错误类)该类型状态码表示请求包含错误语法或不能正确执行。
+     */
+    BAD_REQUEST(400, "Bad Request", "请求错误,请修正请求"),
+    UNAUTHORIZED(401, "Unauthorized", "没有被授权或者授权已经失效"),
+    PAYMENT_REQUIRED(402, "Payment Required", "预留状态"),
+    FORBIDDEN(403, "Forbidden", "请求被理解,但是拒绝执行"),
+    NOT_FOUND(404, "Not Found", "资源未找到"),
+    METHOD_NOT_ALLOWED(405, "Method Not Allowed", "请求方法不允许被执行"),
+    NOT_ACCEPTABLE(406, "Not Acceptable", "请求的资源不满足请求者要求"),
+    PROXY_AUTHENTICATION_REQUIRED(407, "Proxy Authentication Required", "请通过代理进行身份验证"),
+    REQUEST_TIMEOUT(408, "Request Timeout", "请求超时"),
+    CONFLICT(409, "Conflict", "请求冲突"),
+    GONE(410, "Gone", "请求的资源不可用"),
+    LENGTH_REQUIRED(411, "Length Required", "Content-Length未定义"),
+    PRECONDITION_FAILED(412, "Precondition Failed", "不满足请求的先决条件"),
+    REQUEST_ENTITY_TOO_LARGE(413, "Request Entity Too Large", "请求发送的实体太大"),
+    REQUEST_URI_TOO_LONG(414, "Request-URI Too Long", "请求的URI超长"),
+    UNSUPPORTED_MEDIA_TYPE(415, "Unsupported Media Type", "请求发送的实体类型不受支持"),
+    REQUESTED_RANGE_NOT_SATISFIABLE(416, "Requested range not satisfiable", "Range指定的范围与当前资源可用范围不一致"),
+    EXPECTATION_FAILED(417, "Expectation Failed", "请求头Expect中指定的预期内容无法被服务器满足"),
+    UNPROCESSABLE_ENTITY(422, "Unprocessable Entity", "请求格式正确,但是由于含有语义错误,无法响应"),
+    LOCKED(423, "Locked", "当前资源被锁定"),
+    FAILED_DEPENDENCY(424, "Failed Dependency", "由于之前的请求发生错误,导致当前请求失败"),
+    UPGRADE_REQUIRED(426, "Upgrade Required", "客户端需要切换到TLS1.0"),
+    PRECONDITION_REQUIRED(428, "Precondition Required", "请求需要提供前置条件"),
+    TOO_MANY_REQUESTS(429, "Too Many Requests", "请求过多"),
+    REQUEST_HEADER_FIELDS_TOO_LARGE(431, "Request Header Fields Too Large", "请求头超大,拒绝请求"),
+
+    /**
+     * 5XX(服务器错误类) 该类型状态码表示服务器或网关错误。
+     */
+    INTERNAL_SERVER_ERROR(500, "Internal Server Error", "服务器内部错误"),
+    NOT_IMPLEMENTED(501, "Not Implemented", "服务器不支持当前请求的部分功能"),
+    BAD_GATEWAY(502, "Bad Gateway", "响应无效"),
+    SERVICE_UNAVAILABLE(503, "Service Unavailable", "服务器维护或者过载,拒绝服务"),
+    GATEWAY_TIMEOUT(504, "Gateway Timeout", "上游服务器超时"),
+    HTTP_VERSION_NOT_SUPPORTED(505, "HTTP Version not supported", "不支持的HTTP版本"),
+    VARIANT_ALSO_NEGOTIATES(506, "Variant Also Negotiates", "服务器内部配置错误"),
+    INSUFFICIENT_STORAGE(507, "Insufficient Storage", "服务器无法完成存储请求所需的内容"),
+    LOOP_DETECTED(508, "Loop Detected", "服务器处理请求时发现死循环"),
+    BANDWIDTH_LIMIT_EXCEEDED(509, "Bandwidth Limit Exceeded", "服务器达到带宽限制"),
+    NOT_EXTENDED(510, "Not Extended", "获取资源所需的策略没有被满足"),
+    NETWORK_AUTHENTICATION_REQUIRED(511, "Network Authentication Required", "需要进行网络授权");
+
+    /**
+     * 状态码
+     */
+    private final int code;
+
+    /**
+     * 英文提示信息
+     */
+    private final String emsg;
+
+    /**
+     * 中文提示信息
+     */
+    private final String zmsg;
+
+    /**
+     *
+     * @param code 状态码
+     * @param emsg 英文提示信息
+     * @param zmsg 中文提示信息
+     */
+    HttpStatusCodeEnum(int code, String emsg, String zmsg) {
+        this.code = code;
+        this.emsg = emsg;
+        this.zmsg = zmsg;
+    }
+
+    /**
+     * 获取状态码
+     * @return code
+     */
+    @Override
+    public int getCode(){
+        return this.code;
+    }
+
+    /**
+     * 获取英文提示信息
+     * @return eMsg
+     */
+    @Override
+    public String getEmsg(){
+        return this.emsg;
+    }
+
+    /**
+     * 获取中文提示信息
+     * @return zMsg
+     */
+    @Override
+    public String getZmsg(){
+        return this.zmsg;
+    }
+
+    /**
+     * 根据类型的code,返回类型的枚举实例。
+     *
+     * @param code code
+     */
+    public static HttpStatusCodeEnum fromTypeCode(int code) {
+        for (HttpStatusCodeEnum typeCode : HttpStatusCodeEnum.values()) {
+            if (typeCode.getCode()==code) {
+                return typeCode;
+            }
+        }
+        return null;
+    }
+}

+ 71 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/exception/BusinessException.java

@@ -0,0 +1,71 @@
+package top.imwork.commons.core.exception;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import top.imwork.commons.core.pojo.ResponseMsg;
+
+import java.io.Serial;
+
+/**
+ * Copyright (C), 2015-2021
+ * FileName: BusinessException
+ * Author(作者姓名):   jiangxiaowei
+ * CreateDate(创建时间):     2021/8/2 14:58
+ * UpdateDate(修改时间):     2021/8/2 14:58
+ * Description(功能描述):    业务异常类
+ * Since(版本号)  1.0.0
+ * History:
+ */
+public class BusinessException extends RuntimeException {
+
+    @Serial
+    private static final long serialVersionUID = -1465322317086082432L;
+
+    static final Logger logger = LoggerFactory.getLogger(BusinessException.class);
+
+    public BusinessException(int code, String msg) throws JsonProcessingException {
+        super(new ObjectMapper().writeValueAsString(ResponseMsg.buildResponse(code, msg)));
+    }
+
+    public BusinessException(int code, String msg, boolean isLog) throws JsonProcessingException {
+        super(new ObjectMapper().writeValueAsString(ResponseMsg.buildResponse(code, msg)));
+        if (isLog) {
+            logger.error(new ObjectMapper().writeValueAsString(ResponseMsg.buildResponse(code, msg)));
+        }
+    }
+
+    public BusinessException(Throwable e) {
+        super(e);
+    }
+
+    public BusinessException(Throwable e, boolean isLog) {
+        super(e);
+        if (isLog) {
+            logger.error(e.getMessage());
+        }
+    }
+
+    public BusinessException(String message) {
+        super(message);
+    }
+
+    public BusinessException(String message, boolean isLog) {
+        super(message);
+        if (isLog) {
+            logger.error(message);
+        }
+    }
+
+    public BusinessException(String message, Throwable e) {
+        super(message, e);
+    }
+
+    public BusinessException(String message, Throwable e, boolean isLog) {
+        super(message, e);
+        if (isLog) {
+            logger.error(message, e);
+        }
+    }
+}

+ 42 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/handler/BaseCoreRequestHandlerInterceptor.java

@@ -0,0 +1,42 @@
+package top.imwork.commons.core.handler;
+
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+import top.imwork.commons.core.constants.Constants;
+
+import java.util.UUID;
+
+/**
+ * Copyright (C), 2015-2021
+ * FileName: ImworkRequestHandlerInterceptor
+ * Author(作者姓名):   stars
+ * CreateDate(创建时间):     2021/8/2 15:28
+ * UpdateDate(修改时间):     2021/8/2 15:28
+ * Description(功能描述):    通用请求拦截器
+ * Since(版本号)  1.0.0
+ * History:
+ */
+public class BaseCoreRequestHandlerInterceptor implements HandlerInterceptor {
+    static final Logger logger = LoggerFactory.getLogger(BaseCoreRequestHandlerInterceptor.class);
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+        request.setAttribute(Constants.REQUEST_HEAD_ID, UUID.randomUUID());
+        logger.info(Constants.REQUEST_HEAD_ID + " = {}", request.getAttribute(Constants.REQUEST_HEAD_ID));
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) {
+        //
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
+        //
+    }
+}

+ 84 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/pojo/BaseMenu.java

@@ -0,0 +1,84 @@
+package top.imwork.commons.core.pojo;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * Copyright (C), 2015-2025
+ * FileName: BaseMenu
+ * Author<作者姓名>:   silos
+ * CreateTime<创建时间>:   2025/11/1 10:46
+ * UpdateTime<修改时间>:   2025/11/1 10:46
+ * Description〈功能简述〉: 菜单节点类
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+public class BaseMenu implements Serializable {
+    private Long id;
+    private Long pId;
+    private String title;
+    private String icon;
+    private String href;
+
+    @Override
+    public String toString() {
+        return "BaseMenu{" +
+                "id=" + id +
+                ", pId=" + pId +
+                ", title='" + title + '\'' +
+                ", icon='" + icon + '\'' +
+                ", href='" + href + '\'' +
+                '}';
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (!(o instanceof BaseMenu baseMenu)) return false;
+        return Objects.equals(id, baseMenu.id) && Objects.equals(pId, baseMenu.pId) && Objects.equals(title, baseMenu.title) && Objects.equals(icon, baseMenu.icon) && Objects.equals(href, baseMenu.href);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, pId, title, icon, href);
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getpId() {
+        return pId;
+    }
+
+    public void setpId(Long pId) {
+        this.pId = pId;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getIcon() {
+        return icon;
+    }
+
+    public void setIcon(String icon) {
+        this.icon = icon;
+    }
+
+    public String getHref() {
+        return href;
+    }
+
+    public void setHref(String href) {
+        this.href = href;
+    }
+}

+ 163 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/pojo/BaseParams.java

@@ -0,0 +1,163 @@
+package top.imwork.commons.core.pojo;
+
+import java.util.Objects;
+
+/**
+ * Copyright (C), 2015-2023
+ * FileName: BaseParams
+ * Author<作者姓名>:   stars
+ * CreateTime<创建时间>:   2023/3/13 18:48
+ * UpdateTime<修改时间>:   2023/3/13 18:48
+ * Description〈功能简述〉: 基础入参
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+public class BaseParams {
+    /**
+     * 页码
+     */
+    private Integer pageNo;
+    /**
+     * 每页行数
+     */
+    private Integer pageRows;
+    /**
+     * 是否删除
+     */
+    private String delFlag;
+    /**
+     * 创建人
+     */
+    private String creator;
+    /**
+     * 创建开始时间
+     */
+    private String createBeginTime;
+    /**
+     * 创建结束时间
+     */
+    private String createEndTime;
+    /**
+     * 修改人
+     */
+    private String modifier;
+    /**
+     * 修改开始时间
+     */
+    private String updateBeginTime;
+    /**
+     * 修改结束时间
+     */
+    private String updateEndTime;
+    /**
+     * 备注
+     */
+    private String remark;
+
+    @Override
+    public String toString() {
+        return "BaseParams{" +
+                "pageNo=" + pageNo +
+                ", pageRows=" + pageRows +
+                ", delFlag='" + delFlag + '\'' +
+                ", creator='" + creator + '\'' +
+                ", createBeginTime='" + createBeginTime + '\'' +
+                ", createEndTime='" + createEndTime + '\'' +
+                ", modifier='" + modifier + '\'' +
+                ", updateBeginTime='" + updateBeginTime + '\'' +
+                ", updateEndTime='" + updateEndTime + '\'' +
+                ", remark='" + remark + '\'' +
+                '}';
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (!(o instanceof BaseParams that)) return false;
+        return Objects.equals(pageNo, that.pageNo) && Objects.equals(pageRows, that.pageRows) && Objects.equals(delFlag, that.delFlag) && Objects.equals(creator, that.creator) && Objects.equals(createBeginTime, that.createBeginTime) && Objects.equals(createEndTime, that.createEndTime) && Objects.equals(modifier, that.modifier) && Objects.equals(updateBeginTime, that.updateBeginTime) && Objects.equals(updateEndTime, that.updateEndTime) && Objects.equals(remark, that.remark);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(pageNo, pageRows, delFlag, creator, createBeginTime, createEndTime, modifier, updateBeginTime, updateEndTime, remark);
+    }
+
+    public Integer getPageNo() {
+        return pageNo;
+    }
+
+    public void setPageNo(Integer pageNo) {
+        this.pageNo = pageNo;
+    }
+
+    public Integer getPageRows() {
+        return pageRows;
+    }
+
+    public void setPageRows(Integer pageRows) {
+        this.pageRows = pageRows;
+    }
+
+    public String getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag) {
+        this.delFlag = delFlag;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getCreateBeginTime() {
+        return createBeginTime;
+    }
+
+    public void setCreateBeginTime(String createBeginTime) {
+        this.createBeginTime = createBeginTime;
+    }
+
+    public String getCreateEndTime() {
+        return createEndTime;
+    }
+
+    public void setCreateEndTime(String createEndTime) {
+        this.createEndTime = createEndTime;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    public String getUpdateBeginTime() {
+        return updateBeginTime;
+    }
+
+    public void setUpdateBeginTime(String updateBeginTime) {
+        this.updateBeginTime = updateBeginTime;
+    }
+
+    public String getUpdateEndTime() {
+        return updateEndTime;
+    }
+
+    public void setUpdateEndTime(String updateEndTime) {
+        this.updateEndTime = updateEndTime;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+}

+ 117 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/pojo/BaseResult.java

@@ -0,0 +1,117 @@
+package top.imwork.commons.core.pojo;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Copyright (C), 2015-2023
+ * FileName: BaseResult
+ * Author<作者姓名>:   stars
+ * CreateTime<创建时间>:   2023/2/14 23:14
+ * UpdateTime<修改时间>:   2023/2/14 23:14
+ * Description〈功能简述〉: 基础返回信息
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+public class BaseResult<T,P> {
+    /**
+     * 页码
+     */
+    private Integer pageNo;
+
+    /**
+     * 每页记录数
+     */
+    private Integer pageRows;
+
+    /**
+     * 总页数
+     */
+    private Integer pageCount;
+
+    /**
+     * 总记录数
+     */
+    private Integer totalRows;
+
+    /**
+     * 数据集
+     */
+    private List<T> dataList;
+
+    /**
+     * 入参DTO
+     */
+    private P params;
+
+    @Override
+    public String toString() {
+        return "BaseResult{" +
+                "pageNo=" + pageNo +
+                ", pageRows=" + pageRows +
+                ", pageCount=" + pageCount +
+                ", totalRows=" + totalRows +
+                ", dataList=" + dataList +
+                ", params=" + params +
+                '}';
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (!(o instanceof BaseResult<?, ?> that)) return false;
+        return Objects.equals(pageNo, that.pageNo) && Objects.equals(pageRows, that.pageRows) && Objects.equals(pageCount, that.pageCount) && Objects.equals(totalRows, that.totalRows) && Objects.equals(dataList, that.dataList) && Objects.equals(params, that.params);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(pageNo, pageRows, pageCount, totalRows, dataList, params);
+    }
+
+    public Integer getPageNo() {
+        return pageNo;
+    }
+
+    public void setPageNo(Integer pageNo) {
+        this.pageNo = pageNo;
+    }
+
+    public Integer getPageRows() {
+        return pageRows;
+    }
+
+    public void setPageRows(Integer pageRows) {
+        this.pageRows = pageRows;
+    }
+
+    public Integer getPageCount() {
+        return pageCount;
+    }
+
+    public void setPageCount(Integer pageCount) {
+        this.pageCount = pageCount;
+    }
+
+    public Integer getTotalRows() {
+        return totalRows;
+    }
+
+    public void setTotalRows(Integer totalRows) {
+        this.totalRows = totalRows;
+    }
+
+    public List<T> getDataList() {
+        return dataList;
+    }
+
+    public void setDataList(List<T> dataList) {
+        this.dataList = dataList;
+    }
+
+    public P getParams() {
+        return params;
+    }
+
+    public void setParams(P params) {
+        this.params = params;
+    }
+}

+ 124 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/pojo/BaseTreeNode.java

@@ -0,0 +1,124 @@
+package top.imwork.commons.core.pojo;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * Copyright (C), 2015-2025
+ * FileName: BaseTreeNode
+ * Author<作者姓名>:   silos
+ * CreateTime<创建时间>:   2025/11/1 10:48
+ * UpdateTime<修改时间>:   2025/11/1 10:48
+ * Description〈功能简述〉: 树形结构辅助类
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+public class BaseTreeNode implements Serializable {
+    private String id;
+    private String pId;
+    private Integer state;
+    private String icon;
+    private String iconClose;
+    private String iconOpen;
+    private String name;
+    private boolean open;
+    private boolean isParent;
+
+    @Override
+    public String toString() {
+        return "BaseTreeNode{" +
+                "id='" + id + '\'' +
+                ", pId='" + pId + '\'' +
+                ", state=" + state +
+                ", icon='" + icon + '\'' +
+                ", iconClose='" + iconClose + '\'' +
+                ", iconOpen='" + iconOpen + '\'' +
+                ", name='" + name + '\'' +
+                ", open=" + open +
+                ", isParent=" + isParent +
+                '}';
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (!(o instanceof BaseTreeNode that)) return false;
+        return open == that.open && isParent == that.isParent && Objects.equals(id, that.id) && Objects.equals(pId, that.pId) && Objects.equals(state, that.state) && Objects.equals(icon, that.icon) && Objects.equals(iconClose, that.iconClose) && Objects.equals(iconOpen, that.iconOpen) && Objects.equals(name, that.name);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, pId, state, icon, iconClose, iconOpen, name, open, isParent);
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getpId() {
+        return pId;
+    }
+
+    public void setpId(String pId) {
+        this.pId = pId;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getIcon() {
+        return icon;
+    }
+
+    public void setIcon(String icon) {
+        this.icon = icon;
+    }
+
+    public String getIconClose() {
+        return iconClose;
+    }
+
+    public void setIconClose(String iconClose) {
+        this.iconClose = iconClose;
+    }
+
+    public String getIconOpen() {
+        return iconOpen;
+    }
+
+    public void setIconOpen(String iconOpen) {
+        this.iconOpen = iconOpen;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public boolean isOpen() {
+        return open;
+    }
+
+    public void setOpen(boolean open) {
+        this.open = open;
+    }
+
+    public boolean isParent() {
+        return isParent;
+    }
+
+    public void setParent(boolean parent) {
+        isParent = parent;
+    }
+}

+ 65 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/pojo/DeleteParams.java

@@ -0,0 +1,65 @@
+package top.imwork.commons.core.pojo;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * Copyright (C), 2015-2023
+ * FileName: DeleteParams
+ * Author<作者姓名>:   stars
+ * CreateTime<创建时间>:   2023/3/18 22:57
+ * UpdateTime<修改时间>:   2023/3/18 22:57
+ * Description〈功能简述〉: 删除参数
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+public class DeleteParams {
+    /**
+     * id拼接字符串
+     * 1,2,3
+     */
+    private String ids;
+    /**
+     * id数组
+     */
+    private String[] idsArr;
+    /**
+     * 是否刪除(默认N 未删除Y已删除)
+     */
+    private String delFlag;
+
+    @Override
+    public boolean equals(Object o) {
+        if (!(o instanceof DeleteParams that)) return false;
+        return Objects.equals(ids, that.ids) && Objects.deepEquals(idsArr, that.idsArr) && Objects.equals(delFlag, that.delFlag);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(ids, Arrays.hashCode(idsArr), delFlag);
+    }
+
+    public String getIds() {
+        return ids;
+    }
+
+    public void setIds(String ids) {
+        this.ids = ids;
+    }
+
+    public String[] getIdsArr() {
+        return idsArr;
+    }
+
+    public void setIdsArr(String[] idsArr) {
+        this.idsArr = idsArr;
+    }
+
+    public String getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag) {
+        this.delFlag = delFlag;
+    }
+}

+ 63 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/pojo/LoginParamVO.java

@@ -0,0 +1,63 @@
+package top.imwork.commons.core.pojo;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+
+import java.io.Serializable;
+
+/**
+ * Copyright (C), 2015-2020
+ * FileName: LoginParam
+ * Author:   imwork
+ * Date:     2020/5/11 0011 22:30
+ * Description: 登录参数接收
+ * History:
+ * <author>          <time>          <version>          <desc>
+ * 作者姓名           修改时间           版本号              描述
+ */
+public class LoginParamVO implements Serializable {
+
+    @NotBlank(message = "用户姓名不能为空!")
+    @NotNull(message = "用户姓名不能为空!")
+    private String username;
+
+    @NotBlank(message = "密码不能为空!")
+    @NotNull(message = "密码不能为空!")
+    private String password;
+
+    private String clientId;
+
+    private String clientSecret;
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getClientId() {
+        return clientId;
+    }
+
+    public void setClientId(String clientId) {
+        this.clientId = clientId;
+    }
+
+    public String getClientSecret() {
+        return clientSecret;
+    }
+
+    public void setClientSecret(String clientSecret) {
+        this.clientSecret = clientSecret;
+    }
+}

+ 152 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/pojo/ResponseMsg.java

@@ -0,0 +1,152 @@
+package top.imwork.commons.core.pojo;
+
+import top.imwork.commons.core.enums.HttpStatusCodeEnum;
+
+import java.io.Serial;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Copyright (C), 2015-2021
+ * FileName: ResponseMsg
+ * Author(作者姓名):   stars
+ * CreateDate(创建时间):     2021/8/2 15:00
+ * UpdateDate(修改时间):     2021/8/2 15:00
+ * Description(功能描述):    响应实体类
+ * Since(版本号)  1.0.0
+ * History:
+ */
+public class ResponseMsg extends HashMap<String, Object> {
+    @Serial
+    private static final long serialVersionUID = 1L;
+    public ResponseMsg() {
+        put("code", HttpStatusCodeEnum.OK.getCode());
+        put("msg", HttpStatusCodeEnum.OK.getZmsg());
+    }
+
+    /**
+     * 默认响应成功消息
+     * @return ResponseMsg
+     */
+    public static ResponseMsg ok() {
+        return new ResponseMsg();
+    }
+
+    /**
+     * 响应状态码消息
+     * @param code 状态码
+     * @return ResponseMsg
+     */
+    public static ResponseMsg ok(HttpStatusCodeEnum code) {
+        return buildResponse(code.getCode(), code.getZmsg());
+    }
+
+    /**
+     * 响应自定义成功消息
+     * @param message 消息内容
+     * @return ResponseMsg
+     */
+    public static ResponseMsg ok(String message) {
+        return buildResponse(HttpStatusCodeEnum.OK.getCode(),message);
+    }
+
+    /**
+     * 响应失败消息
+     * @return ResponseMsg
+     */
+    public static ResponseMsg fail() {
+        return buildResponse(HttpStatusCodeEnum.BAD_REQUEST.getCode(), HttpStatusCodeEnum.BAD_REQUEST.getZmsg());
+    }
+
+    /**
+     * 响应失败消息
+     * @return ResponseMsg
+     */
+    public static ResponseMsg fail(Object message) {
+        return buildResponse(HttpStatusCodeEnum.BAD_REQUEST.getCode(), message,null);
+    }
+
+    /**
+     * 响应错误消息
+     * @return ResponseMsg
+     */
+    public static ResponseMsg error() {
+        return buildResponse(HttpStatusCodeEnum.INTERNAL_SERVER_ERROR.getCode(), HttpStatusCodeEnum.INTERNAL_SERVER_ERROR.getZmsg());
+    }
+
+    /**
+     * 响应自定义错误消息
+     * @return ResponseMsg
+     */
+    public static ResponseMsg error(Object message) {
+        return buildResponse(HttpStatusCodeEnum.INTERNAL_SERVER_ERROR.getCode(), message);
+    }
+
+    public static ResponseMsg unauthorized() {
+        return buildResponse(HttpStatusCodeEnum.UNAUTHORIZED.getCode(), HttpStatusCodeEnum.UNAUTHORIZED.getZmsg());
+    }
+
+    /**
+     * 响应自定义键-值消息
+     * @param key 键
+     * @param value 值
+     * @return ResponseMsg
+     */
+    @Override
+    public ResponseMsg put(String key, Object value) {
+        super.put(key, value);
+        return this;
+    }
+
+    /**
+     * 响应自定义对象消息
+     * @param map 集合
+     * @return ResponseMsg
+     */
+    public static ResponseMsg ok(Map<String, Object> map) {
+        ResponseMsg responseMsg = new ResponseMsg();
+        responseMsg.putAll(map);
+        return responseMsg;
+    }
+
+    /**
+     * 构建返回对象,此为一般返回正常结果集, 一般为REST FUL API所用
+     *
+     * @param data 内容
+     * @return ResponseMsg
+     */
+    public static ResponseMsg buildResponse(Object data) {
+        ResponseMsg responseMsg = new ResponseMsg();
+        responseMsg.put("code", HttpStatusCodeEnum.OK.getCode());
+        responseMsg.put("msg", HttpStatusCodeEnum.OK.getZmsg());
+        responseMsg.put("data", data);
+        return responseMsg;
+    }
+
+    /**
+     * 自定义响应消息
+     * @param code 状态码
+     * @param message 消息内容
+     * @return ResponseMsg
+     */
+    public static ResponseMsg buildResponse(Integer code, Object message) {
+        ResponseMsg responseMsg = new ResponseMsg();
+        responseMsg.put("code", code);
+        responseMsg.put("msg", message);
+        return responseMsg;
+    }
+
+    /**
+     * 构建返回对象,此为一般返回正常结果集, 一般为REST FUL API所用
+     *
+     * @param data 内容
+     * @return ResponseMsg
+     */
+    public static ResponseMsg buildResponse(Integer code, Object message, Object data) {
+        ResponseMsg responseMsg = new ResponseMsg();
+        responseMsg.put("code", code);
+        responseMsg.put("msg", message);
+        responseMsg.put("data", data);
+        return responseMsg;
+    }
+}

+ 40 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/service/IBaseEnumService.java

@@ -0,0 +1,40 @@
+package top.imwork.commons.core.service;
+
+/**
+ * Copyright (C), 2015-2023
+ * FileName: IBaseEnumService
+ * Author<作者姓名>:   stars
+ * CreateTime<创建时间>:   2023/2/14 23:05
+ * UpdateTime<修改时间>:   2023/2/14 23:05
+ * Description〈功能简述〉: 基础枚举信息接口
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+public interface IBaseEnumService {
+    /**
+     * 获取状态码
+     *
+     * @return code
+     */
+    default int getCode() {
+        return 0;
+    }
+
+    /**
+     * 获取英文提示信息
+     *
+     * @return eMsg
+     */
+    default String getEmsg() {
+        return "Failed to catch exception information!";
+    }
+
+    /**
+     * 获取中文提示信息
+     *
+     * @return zMsg
+     */
+    default String getZmsg() {
+        return "未能捕获异常信息!";
+    }
+}

+ 43 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/utils/Base64Utils.java

@@ -0,0 +1,43 @@
+package top.imwork.commons.core.utils;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
+/**
+ * Copyright (C), 2015-2023
+ * FileName: Base64Utils
+ * Author<作者姓名>:   stars
+ * CreateTime<创建时间>:   2023/4/26 22:27
+ * UpdateTime<修改时间>:   2023/4/26 22:27
+ * Description〈功能简述〉: Base64
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+public class Base64Utils {
+    private Base64Utils() {}
+
+    //解码
+    final static Base64.Decoder decoder = Base64.getDecoder();
+    //加密
+    final static Base64.Encoder encoder = Base64.getEncoder();
+
+    /**
+     * 加密
+     *
+     * @param text 要加密的文本
+     * @return String 加密后的文本
+     */
+    public static String encoder(String text) {
+        return encoder.encodeToString(text.getBytes(StandardCharsets.UTF_8));
+    }
+
+    /**
+     * 解密
+     *
+     * @param text 要解密的文本
+     * @return String 解密后的文本
+     */
+    public static String decoder(String text) {
+        return new String(decoder.decode(text), StandardCharsets.UTF_8);
+    }
+}

+ 79 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/utils/DateUtils.java

@@ -0,0 +1,79 @@
+package top.imwork.commons.core.utils;
+
+import top.imwork.commons.core.constants.DateConstants;
+import static top.imwork.commons.core.constants.NumberConstants.FOUR;
+import static top.imwork.commons.core.constants.NumberConstants.ZERO;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Copyright (C), 2015-2022
+ * FileName: DateUtils
+ * Author<作者姓名>:   jiangxiaowei
+ * CreateTime<创建时间>:   2022/5/18 16:21
+ * UpdateTime<修改时间>:   2022/5/18 16:21
+ * Description〈功能简述〉: 时间处理工具
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+public class DateUtils {
+    private DateUtils() {
+    }
+
+    /**
+     * 默认时间格式(yyyy-MM-dd HH:mm:ss) 格式化
+     *
+     * @param date 要格式化的时间
+     * @return String 格式化后的字符串表示
+     */
+    public static String format(Date date) {
+        return format(date, DateConstants.DATE_TIME_PATTERN);
+    }
+
+    /**
+     * 时间格式化
+     *
+     * @param date    要格式化的时间
+     * @param pattern 时间格式
+     * @return String   格式化后的字符串表示
+     */
+    public static String format(Date date, String pattern) {
+        if (date != null) {
+            SimpleDateFormat df = new SimpleDateFormat(pattern);
+            return df.format(date);
+        }
+        return null;
+    }
+
+    /**
+     * 获取当前时间字符串 格式为:yyyy-MM-dd HH:mm:ss
+     *
+     * @return String 字符串形式的时间
+     */
+    public static String getCurrentDateString() {
+        return format(new Date(), DateConstants.DATE_TIME_PATTERN);
+    }
+
+    /**
+     * 获取当前时间字符串 格式自行指定
+     *
+     * @return String 字符串形式的时间
+     */
+    public static String getCurrentDateString(String pattern) {
+        return format(new Date(), pattern);
+    }
+
+    /**
+     * 获取时间字符串中的年份
+     *
+     * @param dateStr 日期
+     * @return String 年份
+     */
+    public static String getYear(String dateStr) {
+        if (StringUtils.isEmpty(dateStr) || dateStr.length() < 4) {
+            return null;
+        }
+        return dateStr.substring(ZERO, FOUR);
+    }
+}

+ 211 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/utils/DecimalUtils.java

@@ -0,0 +1,211 @@
+package top.imwork.commons.core.utils;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Copyright (C), 2015-2022
+ * FileName: BigDecimalUtils
+ * Author<作者姓名>:   stars
+ * CreateTime<创建时间>:   2022/4/14 16:57
+ * UpdateTime<修改时间>:   2022/4/14 16:57
+ * Description〈功能简述〉: BigDecimal工具类
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+public class DecimalUtils {
+
+    public interface Operation {
+        boolean calculate(BigDecimal a, BigDecimal b);
+    }
+
+    public static final Map<String, Operation> opMap = new HashMap<>();
+
+    static {
+        opMap.put(">", ((a, b) -> a.compareTo(b) > 0));
+        opMap.put(">=", ((a, b) -> a.compareTo(b) > -1));
+        opMap.put("<", ((a, b) -> a.compareTo(b) < 0));
+        opMap.put("<=", ((a, b) -> a.compareTo(b) < 1));
+        opMap.put("=", ((a, b) -> a.compareTo(b) == 0));
+        opMap.put("!=", ((a, b) -> a.compareTo(BigDecimal.ZERO) == 0));
+    }
+
+    /**
+     * 设置精度
+     *
+     * @param value 要设置的值
+     * @param scale 精度
+     * @param mode  进位类型
+     * @return BigDecimal 精度转换后结果
+     */
+    public static BigDecimal scale(BigDecimal value, int scale, RoundingMode mode) {
+        if (StringUtils.isEmpty(value)) {
+            return value;
+        } else if (StringUtils.isEmpty(mode)) {
+            return value.setScale(scale, RoundingMode.HALF_UP);
+        } else {
+            return value.setScale(scale, mode);
+        }
+    }
+
+    /**
+     * 设置精度
+     *
+     * @param value 要设置的值
+     * @param scale 精度
+     * @param mode  进位类型
+     * @return String 精度转换后结果
+     */
+    public static String reverseScale(BigDecimal value, int scale, RoundingMode mode) {
+        BigDecimal reverseValue = scale(value, scale, mode);
+        if (StringUtils.isEmpty(reverseValue)) {
+            return null;
+        }
+        return reverseValue.toString();
+    }
+
+    /**
+     * BigDecimal 加法
+     *
+     * @param a 被减数
+     * @param b 减数
+     * @return BigDecimal   计算结果
+     */
+    public static BigDecimal add(String a, String b) {
+        if (NumberUtils.isNumber(a) && NumberUtils.isNumber(b)) {
+            return new BigDecimal(a).add(new BigDecimal(b));
+        }
+        return null;
+    }
+
+    /**
+     * BigDecimal 加法
+     *
+     * @param a 被减数
+     * @param b 减数
+     * @return BigDecimal   计算结果
+     */
+    public static BigDecimal add(BigDecimal a, BigDecimal b) {
+        if (StringUtils.isEmpty(a) || StringUtils.isEmpty(b)) {
+            return null;
+        }
+        return a.add(b);
+    }
+
+    /**
+     * BigDecimal 减法
+     *
+     * @param a 被减数
+     * @param b 减数
+     * @return BigDecimal   计算结果
+     */
+    public static BigDecimal subtract(String a, String b) {
+        if (NumberUtils.isNumber(a) && NumberUtils.isNumber(b)) {
+            return new BigDecimal(a).subtract(new BigDecimal(b));
+        }
+        return null;
+    }
+
+    /**
+     * BigDecimal 减法
+     *
+     * @param a 被减数
+     * @param b 减数
+     * @return BigDecimal   计算结果
+     */
+    public static BigDecimal subtract(BigDecimal a, BigDecimal b) {
+        if (StringUtils.isEmpty(a) || StringUtils.isEmpty(b)) {
+            return null;
+        }
+        return a.subtract(b);
+    }
+
+    /**
+     * BigDecimal 除法
+     *
+     * @param a 被除数
+     * @param b 除数
+     * @return BigDecimal   计算结果
+     */
+    public static BigDecimal divide(String a, String b, Integer scale) {
+        if (NumberUtils.isNumber(a) && NumberUtils.isNumber(b)) {
+            if (new BigDecimal(b).compareTo(BigDecimal.ZERO) == 0) {
+                return new BigDecimal(0);
+            }
+            if (scale == null) {
+                scale = 4;
+            }
+            if (opMap.get("<").calculate(new BigDecimal(a), new BigDecimal(0)) && opMap.get("<").calculate(new BigDecimal(b), new BigDecimal(0))) {
+                return new BigDecimal(a).divide(new BigDecimal(b), scale, RoundingMode.HALF_UP).negate();
+            }
+            return new BigDecimal(a).divide(new BigDecimal(b), scale, RoundingMode.HALF_UP);
+        }
+        return null;
+    }
+
+    /**
+     * BigDecimal 除法
+     *
+     * @param a 被除数
+     * @param b 除数
+     * @return BigDecimal   计算结果
+     */
+    public static BigDecimal divide(BigDecimal a, BigDecimal b, Integer scale) {
+        if (StringUtils.isEmpty(a) || StringUtils.isEmpty(b)) {
+            return null;
+        }
+        if (b.compareTo(BigDecimal.ZERO) == 0) {
+            return new BigDecimal(0);
+        }
+        if (scale == null) {
+            scale = 4;
+        }
+        return a.divide(b, scale, RoundingMode.HALF_UP);
+    }
+
+    /**
+     * BigDecimal 乘法
+     *
+     * @param a 被乘数
+     * @param b 乘数
+     * @return BigDecimal   计算结果
+     */
+    public static BigDecimal multiply(BigDecimal a, BigDecimal b, Integer scale) {
+        if (StringUtils.isEmpty(a) || StringUtils.isEmpty(b)) {
+            return null;
+        }
+        if (a.compareTo(BigDecimal.ZERO) == 0 || b.compareTo(BigDecimal.ZERO) == 0) {
+            return new BigDecimal(0);
+        }
+        if (scale == null) {
+            scale = 4;
+        }
+        BigDecimal value = a.multiply(b);
+        return scale(value, scale, null);
+    }
+
+    /**
+     * BigDecimal 乘法
+     *
+     * @param a 被乘数
+     * @param b 乘数
+     * @return BigDecimal   计算结果
+     */
+    public static String multiply(String a, String b, Integer scale) {
+        if (StringUtils.isEmpty(a) || StringUtils.isEmpty(b)) {
+            return null;
+        }
+        if (new BigDecimal(a).compareTo(BigDecimal.ZERO) == 0 || new BigDecimal(b).compareTo(BigDecimal.ZERO) == 0) {
+            return new BigDecimal(0).toString();
+        }
+        if (scale == null) {
+            scale = 4;
+        }
+        BigDecimal value = new BigDecimal(a).multiply(new BigDecimal(b));
+        return reverseScale(value, scale, null);
+    }
+    private DecimalUtils() {
+    }
+}

+ 32 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/utils/JasyptUtils.java

@@ -0,0 +1,32 @@
+package top.imwork.commons.core.utils;
+
+import org.jasypt.util.text.BasicTextEncryptor;
+
+/**
+ * Copyright (C), 2015-2022
+ * FileName: JasyptUtils
+ * Author<作者姓名>:   jiangxiaowei
+ * CreateTime<创建时间>:   2022/5/25 11:23
+ * UpdateTime<修改时间>:   2022/5/25 11:23
+ * Description〈功能简述〉: 安全加密工具
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+public class JasyptUtils {
+    private JasyptUtils() {
+        throw new IllegalStateException("Utility class");
+    }
+
+    /**
+     * Jasypt 加密
+     *
+     * @param salt    加密所需的salt(盐)
+     * @param dataStr 要加密的数据(数据库的用户名或密码)
+     * @return String 加密后的字符串
+     */
+    public static String encryptor(String salt, String dataStr) {
+        BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
+        textEncryptor.setPassword(salt);
+        return textEncryptor.encrypt(dataStr);
+    }
+}

+ 53 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/utils/NumberUtils.java

@@ -0,0 +1,53 @@
+package top.imwork.commons.core.utils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Copyright (C), 2015-2022
+ * FileName: NumberUtils
+ * Author<作者姓名>:   stars
+ * CreateTime<创建时间>:   2022/4/18 9:03
+ * UpdateTime<修改时间>:   2022/4/18 9:03
+ * Description〈功能简述〉: 数字处理工具类
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+public class NumberUtils {
+    private NumberUtils() {
+        // 私有构造方法
+        throw new IllegalStateException("Utility class");
+    }
+
+    public static final Pattern NUMBER_PATTERN = Pattern.compile("^[-+]?\\d+(\\.?\\d+)?$");
+
+    /**
+     * 判断字符串是否是正整数
+     *
+     * @param str 要验证的字符串
+     * @return 验证结果
+     */
+    public static boolean isNumeric(String str) {
+        if (StringUtils.isEmpty(str)) {
+            return false;
+        }
+        Pattern pattern = Pattern.compile("[0-9]*");
+        Matcher isNum = pattern.matcher(str);
+
+        return isNum.matches();
+    }
+
+    /**
+     * 判断字符串是否是数值型字符串
+     *
+     * @param str 要验证的字符串
+     * @return 验证结果
+     */
+    public static boolean isNumber(String str) {
+        if (StringUtils.isEmpty(str)) {
+            return false;
+        }
+        Matcher matcher = NUMBER_PATTERN.matcher(str);
+        return matcher.find();
+    }
+}

+ 97 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/utils/StringUtils.java

@@ -0,0 +1,97 @@
+package top.imwork.commons.core.utils;
+
+import java.lang.reflect.Array;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * Copyright (C), 2015-2022
+ * FileName: StringUtils
+ * Author<作者姓名>:   stars
+ * CreateTime<创建时间>:   2022/5/18 16:25
+ * UpdateTime<修改时间>:   2022/5/18 16:25
+ * Description〈功能简述〉: 字符串处理工具
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+public class StringUtils {
+    private StringUtils() {
+        // 私有构造方法
+        throw new IllegalStateException("Utility class");
+    }
+
+    /**
+     * 判断字符串是否为空
+     *
+     * @param str 要判断的字符串
+     * @return boolean  true为空false非空
+     */
+    public static boolean isEmpty(String str) {
+        return str == null || "".equals(str.trim());
+    }
+
+    /**
+     * 判断对象是否为空
+     *
+     * @param obj 要判断的对象
+     * @return boolean  true为空false非空
+     */
+    public static boolean isEmpty(Object obj) {
+        if (obj == null) {
+            return true;
+        } else if (obj instanceof Optional) {
+            return !((Optional) obj).isPresent();
+        } else if (obj instanceof CharSequence) {
+            return ((CharSequence) obj).length() == 0;
+        } else if (obj.getClass().isArray()) {
+            return Array.getLength(obj) == 0;
+        } else if (obj instanceof Collection) {
+            return ((Collection) obj).isEmpty();
+        } else {
+            return obj instanceof Map ? ((Map) obj).isEmpty() : false;
+        }
+    }
+
+    public static boolean isNotEmpty(Object obj) {
+        return !isEmpty(obj);
+    }
+
+    /**
+     * 判断字符串是否不为空
+     *
+     * @param str 要判断的字符串
+     * @return boolean  true非空false空
+     */
+    public static boolean isNotEmpty(String str) {
+        return !isEmpty(str);
+    }
+
+    /**
+     * 判断字符串是否为空字符串
+     *
+     * @param str 要判断的字符串
+     * @return boolean  true空false非空
+     */
+    public static boolean isBlank(String str) {
+        return "".equals(str.trim());
+    }
+
+    /**
+     * 判断字符串是否为非空字符串
+     *
+     * @param str 要判断的字符串
+     * @return boolean  true非空false空
+     */
+    public static boolean isNotBlank(String str) {
+        return !isBlank(str);
+    }
+
+    public static boolean startsWithIgnoreCase(String str, String prefix) {
+        return str != null && prefix != null && str.length() >= prefix.length() && str.regionMatches(true, 0, prefix, 0, prefix.length());
+    }
+
+    public static boolean endsWithIgnoreCase(String str, String suffix) {
+        return str != null && suffix != null && str.length() >= suffix.length() && str.regionMatches(true, str.length() - suffix.length(), suffix, 0, suffix.length());
+    }
+}

+ 25 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/xss/XssFilter.java

@@ -0,0 +1,25 @@
+package top.imwork.commons.core.xss;
+
+import jakarta.servlet.*;
+import jakarta.servlet.http.HttpServletRequest;
+
+import java.io.IOException;
+
+public class XssFilter implements Filter {
+    FilterConfig filterConfig = null;
+
+    @Override
+    public void init(FilterConfig filterConfig){
+        this.filterConfig = filterConfig;
+    }
+
+    @Override
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+        filterChain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest)servletRequest), servletResponse);
+    }
+
+    @Override
+    public void destroy() {
+        this.filterConfig = null;
+    }
+}

+ 107 - 0
imwork-commons/imwork-commons-core/src/main/java/top/imwork/commons/core/xss/XssHttpServletRequestWrapper.java

@@ -0,0 +1,107 @@
+package top.imwork.commons.core.xss;
+
+import jakarta.servlet.ReadListener;
+import jakarta.servlet.ServletInputStream;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequestWrapper;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+
+public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
+    public XssHttpServletRequestWrapper(HttpServletRequest request) {
+        super(request);
+    }
+
+    @Override
+    public String[] getParameterValues(String parameter) {
+        String[] values = super.getParameterValues(parameter);
+        if (values == null)
+            return new String[]{};
+        int count = values.length;
+        String[] encodedValues = new String[count];
+        for (int i = 0; i < count; i++)
+            encodedValues[i] = cleanXSS(values[i]);
+        return encodedValues;
+    }
+
+    @Override
+    public String getParameter(String parameter) {
+        String value = super.getParameter(parameter);
+        if (value == null)
+            return null;
+        return cleanXSS(value);
+    }
+
+    @Override
+    public String getHeader(String name) {
+        String value = super.getHeader(name);
+        if (value == null)
+            return null;
+        return cleanXSS(value);
+    }
+
+    @Override
+    public ServletInputStream getInputStream() throws IOException {
+        final ByteArrayInputStream bai = new ByteArrayInputStream(inputHandlers(super.getInputStream()).getBytes());
+        return new ServletInputStream() {
+            public int read(){
+                return bai.read();
+            }
+
+            public boolean isFinished() {
+                return false;
+            }
+
+            public boolean isReady() {
+                return false;
+            }
+
+            public void setReadListener(ReadListener readListener) {
+                // Do nothing because of X and Y.
+            }
+        };
+    }
+
+    public String inputHandlers(ServletInputStream servletInputStream) throws IOException {
+        StringBuilder sb = new StringBuilder();
+
+        try(BufferedReader reader = new BufferedReader(new InputStreamReader(servletInputStream, StandardCharsets.UTF_8))){
+            String line;
+            while ((line = reader.readLine()) != null)
+                sb.append(line);
+        }
+
+        return cleanXSS(sb.toString());
+    }
+
+    private String cleanXSS(String value) {
+        value = value.replace("<", "&lt;").replace(">", "&gt;");
+        value = value.replace("\\(", "&#40;").replace("\\)", "&#41;");
+        value = value.replace("'", "&#39;");
+        value = value.replace("eval\\((.*)\\)", "");
+        value = value.replace("[\\\"\\'][\\s]*javascript:(.*)[\\\"\\']", "\"\"");
+        String[] values = value.split(" ");
+        String badStr = "'|and|exec|execute|insert|select|delete|update|count|drop|%|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|;|or|-|+|,|like'|and|exec|execute|insert|create|drop|table|from|grant|use|group_concat|column_name|information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|chr|mid|master|truncate|char|declare|or|;|-|--|,|like|//|/|%|#";
+        String[] badStrs = badStr.split("\\|");
+        for (String str : badStrs) {
+            for (int k = 0; k < values.length; k++) {
+                if (values[k].equalsIgnoreCase(str))
+                    values[k] = "forbid";
+            }
+        }
+        StringBuilder sb = new StringBuilder();
+        for (int j = 0; j < values.length; j++) {
+            if (j == values.length - 1) {
+                sb.append(values[j]);
+            } else {
+                sb.append(values[j]).append(" ");
+            }
+        }
+        value = sb.toString();
+        return value;
+    }
+}

+ 1 - 1
imwork-commons/imwork-commons-core/src/main/resources/application.properties

@@ -1 +1 @@
-core.xss.filter=true
+core.xss.filter=true

+ 1 - 1
imwork-windows/imwork-silos/src/main/resources/static/business/login/login.js

@@ -3,7 +3,7 @@ layui.use(['jquery'],function(){
     $(".my-canvs").width($(window).width());
     $(".my-canvs").height($(window).height());
 });
-new JParticles.Particle('.my-canvas', {
+new JParticles.Particle('.silos-canvas', {
     color: '#009688',//25bfff
     lineShape: 'cube',
     range: 2000,

+ 9 - 9
imwork-windows/imwork-silos/src/main/resources/templates/login/login.html

@@ -15,12 +15,12 @@
     <!-- 网站简介 -->
     <meta name="keywords" content="搜索关键字,以半角英文逗号隔开"/>
     <!-- 公共样式 开始 -->
-    <link rel="shortcut icon" href="../../static/assets/silos/images/logo/logo.png"/>
-    <link rel="bookmark" href="../../static/assets/silos/images/logo/logo.png"/>
     <title>Login</title>
-
-    <link rel="stylesheet" href="../../static/assets/lib/layui/css/layui.css">
-    <link rel="stylesheet" href="../../static/business/login/login.css">
+    <link rel="shortcut icon" href="../../static/assets/silos/images/logo/logo.png" th:href="@{/assets/silos/images/logo/logo.png}"/>
+    <link rel="bookmark" href="../../static/assets/silos/images/logo/logo.png" th:href="@{/assets/silos/images/logo/logo.png}"/>
+    <link rel="stylesheet" href="../../static/assets/lib/layui/css/layui.css" th:href="@{/assets/lib/layui/css/layui.css}"/>
+    <link rel="stylesheet" href="../../static/assets/lib/fonts/fontawesome4/css/font-awesome.css" th:href="@{/assets/lib/fonts/fontawesome4/css/font-awesome.css}"/>
+    <link rel="stylesheet" href="../../static/business/login/login.css" th:href="@{/business/login/login.css}"/>
 </head>
 <body>
 <div id="silos-canvas" class="silos-canvas"></div>
@@ -59,9 +59,9 @@
         </div>
     </form>
 </div>
-<script src="../../static/assets/lib/jquery/jquery.js"></script>
-<script src="../../static/assets/lib/jplus/jparticles/jparticles.all.js"></script>
-<script src="../../static/assets/lib/layui/layui.js"></script>
-<script src="../../static/business/login/login.js"></script>
+<script src="../../static/assets/lib/jquery/jquery.js" th:src="@{/assets/lib/jquery/jquery.js}"></script>
+<script src="../../static/assets/lib/layui/layui.js" th:src="@{/assets/lib/layui/layui.js}"></script>
+<script src="../../static/assets/lib/jplus/jparticles/jparticles.all.js" th:src="@{/assets/lib/jplus/jparticles/jparticles.js}"></script>
+<script src="../../static/business/login/login.js" th:src="@{/business/login/login.js}"></script>
 </body>
 </html>