diff --git a/README.md b/README.md
index aae31932b..440fee4e4 100644
--- a/README.md
+++ b/README.md
@@ -50,8 +50,8 @@
| 多数据源框架 | Dynamic-Datasource | [dynamic-ds文档](https://www.kancloud.cn/tracy5546/dynamic-datasource/content) | 支持主从与多种类数据库异构 |
| 序列化框架 | Jackson | [Jackson官网](https://github.com/FasterXML/jackson) | 统一使用 jackson 高效可靠 |
| Redis客户端 | Redisson | [Redisson文档](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95) | 支持单机、集群配置 |
-| 校验框架(待优化) | Validation | [Validation文档](https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/) | 增强接口安全性、严谨性 支持国际化 |
-| Excel框架(未完成) | Alibaba EasyExcel | [EasyExcel文档](https://www.yuque.com/easyexcel/doc/easyexcel) | 性能优异 扩展性强 |
+| 校验框架 | Validation | [Validation文档](https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/) | 增强接口安全性、严谨性 支持国际化 |
+| Excel框架 | Alibaba EasyExcel | [EasyExcel文档](https://www.yuque.com/easyexcel/doc/easyexcel) | 性能优异 扩展性强 |
| 文档框架 | Knife4j | [Knife4j文档](https://doc.xiaominfo.com/knife4j/documentation/) | 美化接口文档 |
| 工具类框架 | Hutool、Lombok | [Hutool文档](https://www.hutool.cn/docs/) | 减少代码冗余 增加安全性 |
| 代码生成器(未完成) | 适配MP、Knife4j规范化代码 | [Hutool文档](https://www.hutool.cn/docs/) | 一键生成前后端代码 |
diff --git a/pom.xml b/pom.xml
index e35b82e65..521e91aa4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -34,6 +34,8 @@
2.3
8.2.2
4.1.2
+ 3.0.5
+ 3.3.0
3.2.2
2.12.2
5.7.18
@@ -224,6 +226,28 @@
${poi.version}
+
+ com.alibaba
+ easyexcel
+ ${easyexcel.version}
+
+
+ org.apache.poi
+ poi
+
+
+ org.apache.poi
+ poi-ooxml-schemas
+
+
+
+
+
+ cglib
+ cglib
+ ${cglib.version}
+
+
commons-fileupload
diff --git a/ruoyi-api/ruoyi-api-system/pom.xml b/ruoyi-api/ruoyi-api-system/pom.xml
index 50b7e5321..b657e7692 100644
--- a/ruoyi-api/ruoyi-api-system/pom.xml
+++ b/ruoyi-api/ruoyi-api-system/pom.xml
@@ -1,28 +1,33 @@
-
-
-
- com.ruoyi
- ruoyi-api
- 0.3.0
-
- 4.0.0
-
- ruoyi-api-system
-
-
- ruoyi-api-system系统接口模块
-
-
-
-
-
-
- com.ruoyi
- ruoyi-common-core
-
-
-
-
-
\ No newline at end of file
+
+
+
+ com.ruoyi
+ ruoyi-api
+ 0.3.0
+
+ 4.0.0
+
+ ruoyi-api-system
+
+
+ ruoyi-api-system系统接口模块
+
+
+
+
+
+
+ com.ruoyi
+ ruoyi-common-core
+
+
+
+ com.ruoyi
+ ruoyi-common-excel
+
+
+
+
+
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDept.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDept.java
index e2c992f48..04a822a42 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDept.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDept.java
@@ -1,93 +1,87 @@
-package com.ruoyi.system.api.domain;
-
-import com.ruoyi.common.core.web.domain.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import javax.validation.constraints.Email;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.Size;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 部门表 sys_dept
- *
- * @author ruoyi
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@NoArgsConstructor
-@Accessors(chain = true)
-public class SysDept extends BaseEntity {
- private static final long serialVersionUID = 1L;
-
- /**
- * 部门ID
- */
- private Long deptId;
-
- /**
- * 父部门ID
- */
- private Long parentId;
-
- /**
- * 祖级列表
- */
- private String ancestors;
-
- /**
- * 部门名称
- */
- @NotBlank(message = "部门名称不能为空")
- @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
- private String deptName;
-
- /**
- * 显示顺序
- */
- @NotBlank(message = "显示顺序不能为空")
- private String orderNum;
-
- /**
- * 负责人
- */
- private String leader;
-
- /**
- * 联系电话
- */
- @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符")
- private String phone;
-
- /**
- * 邮箱
- */
- @Email(message = "邮箱格式不正确")
- @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
- private String email;
-
- /**
- * 部门状态:0正常,1停用
- */
- private String status;
-
- /**
- * 删除标志(0代表存在 2代表删除)
- */
- private String delFlag;
-
- /**
- * 父部门名称
- */
- private String parentName;
-
- /**
- * 子部门
- */
- private List children = new ArrayList();
-
-}
+package com.ruoyi.system.api.domain;
+
+import com.ruoyi.common.core.web.domain.TreeEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+/**
+ * 部门表 sys_dept
+ *
+ * @author Lion Li
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@ApiModel("部门业务对象")
+public class SysDept extends TreeEntity {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 部门ID
+ */
+ @ApiModelProperty(value = "部门id")
+ private Long deptId;
+
+ /**
+ * 部门名称
+ */
+ @ApiModelProperty(value = "部门名称")
+ @NotBlank(message = "部门名称不能为空")
+ @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
+ private String deptName;
+
+ /**
+ * 显示顺序
+ */
+ @ApiModelProperty(value = "显示顺序")
+ @NotBlank(message = "显示顺序不能为空")
+ private String orderNum;
+
+ /**
+ * 负责人
+ */
+ @ApiModelProperty(value = "负责人")
+ private String leader;
+
+ /**
+ * 联系电话
+ */
+ @ApiModelProperty(value = "联系电话")
+ @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符")
+ private String phone;
+
+ /**
+ * 邮箱
+ */
+ @ApiModelProperty(value = "邮箱")
+ @Email(message = "邮箱格式不正确")
+ @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
+ private String email;
+
+ /**
+ * 部门状态:0正常,1停用
+ */
+ @ApiModelProperty(value = "部门状态:0正常,1停用")
+ private String status;
+
+ /**
+ * 删除标志(0代表存在 2代表删除)
+ */
+ @ApiModelProperty(value = "删除标志(0代表存在 2代表删除)")
+ private String delFlag;
+
+ /**
+ * 祖级列表
+ */
+ @ApiModelProperty(value = "祖级列表")
+ private String ancestors;
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictData.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictData.java
index 0d903c0f3..aa9dbaeee 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictData.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictData.java
@@ -1,90 +1,111 @@
-package com.ruoyi.system.api.domain;
-
-import com.ruoyi.common.core.annotation.Excel;
-import com.ruoyi.common.core.annotation.Excel.ColumnType;
-import com.ruoyi.common.core.constant.UserConstants;
-import com.ruoyi.common.core.web.domain.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.Size;
-
-/**
- * 字典数据表 sys_dict_data
- *
- * @author ruoyi
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@NoArgsConstructor
-@Accessors(chain = true)
-public class SysDictData extends BaseEntity {
- private static final long serialVersionUID = 1L;
-
- /**
- * 字典编码
- */
- @Excel(name = "字典编码", cellType = ColumnType.NUMERIC)
- private Long dictCode;
-
- /**
- * 字典排序
- */
- @Excel(name = "字典排序", cellType = ColumnType.NUMERIC)
- private Long dictSort;
-
- /**
- * 字典标签
- */
- @NotBlank(message = "字典标签不能为空")
- @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符")
- @Excel(name = "字典标签")
- private String dictLabel;
-
- /**
- * 字典键值
- */
- @NotBlank(message = "字典键值不能为空")
- @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符")
- @Excel(name = "字典键值")
- private String dictValue;
-
- /**
- * 字典类型
- */
- @NotBlank(message = "字典类型不能为空")
- @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符")
- @Excel(name = "字典类型")
- private String dictType;
-
- /**
- * 样式属性(其他样式扩展)
- */
- @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符")
- private String cssClass;
-
- /**
- * 表格字典样式
- */
- private String listClass;
-
- /**
- * 是否默认(Y是 N否)
- */
- @Excel(name = "是否默认", readConverterExp = "Y=是,N=否")
- private String isDefault;
-
- /**
- * 状态(0正常 1停用)
- */
- @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
- private String status;
-
- public boolean getDefault() {
- return UserConstants.YES.equals(this.isDefault) ? true : false;
- }
-
-}
+package com.ruoyi.system.api.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.core.constant.UserConstants;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import com.ruoyi.common.excel.annotation.ExcelDictFormat;
+import com.ruoyi.common.excel.convert.ExcelDictConvert;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+/**
+ * 字典数据表 sys_dict_data
+ *
+ * @author Lion Li
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@ExcelIgnoreUnannotated
+@ApiModel("字典数据业务对象")
+public class SysDictData extends BaseEntity {
+
+ /**
+ * 字典编码
+ */
+ @ApiModelProperty(value = "字典编码")
+ @ExcelProperty(value = "字典编码")
+ private Long dictCode;
+
+ /**
+ * 字典排序
+ */
+ @ApiModelProperty(value = "字典排序")
+ @ExcelProperty(value = "字典排序")
+ private Long dictSort;
+
+ /**
+ * 字典标签
+ */
+ @ApiModelProperty(value = "字典标签")
+ @ExcelProperty(value = "字典标签")
+ @NotBlank(message = "字典标签不能为空")
+ @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符")
+ private String dictLabel;
+
+ /**
+ * 字典键值
+ */
+ @ApiModelProperty(value = "字典键值")
+ @ExcelProperty(value = "字典键值")
+ @NotBlank(message = "字典键值不能为空")
+ @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符")
+ private String dictValue;
+
+ /**
+ * 字典类型
+ */
+ @ApiModelProperty(value = "字典类型")
+ @ExcelProperty(value = "字典类型")
+ @NotBlank(message = "字典类型不能为空")
+ @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符")
+ private String dictType;
+
+ /**
+ * 样式属性(其他样式扩展)
+ */
+ @ApiModelProperty(value = "样式属性(其他样式扩展)")
+ @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符")
+ private String cssClass;
+
+ /**
+ * 表格字典样式
+ */
+ @ApiModelProperty(value = "表格字典样式")
+ private String listClass;
+
+ /**
+ * 是否默认(Y是 N否)
+ */
+ @ApiModelProperty(value = "是否默认(Y是 N否)")
+ @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "sys_yes_no")
+ private String isDefault;
+
+ /**
+ * 状态(0正常 1停用)
+ */
+ @ApiModelProperty(value = "状态(0正常 1停用)")
+ @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "sys_normal_disable")
+ private String status;
+
+ /**
+ * 备注
+ */
+ @ApiModelProperty(value = "备注")
+ private String remark;
+
+ public boolean getDefault() {
+ return UserConstants.YES.equals(this.isDefault);
+ }
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictType.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictType.java
index a188a3062..a0065eb55 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictType.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictType.java
@@ -1,54 +1,69 @@
-package com.ruoyi.system.api.domain;
-
-import com.ruoyi.common.core.annotation.Excel;
-import com.ruoyi.common.core.annotation.Excel.ColumnType;
-import com.ruoyi.common.core.web.domain.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.Size;
-
-/**
- * 字典类型表 sys_dict_type
- *
- * @author ruoyi
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@NoArgsConstructor
-@Accessors(chain = true)
-public class SysDictType extends BaseEntity {
- private static final long serialVersionUID = 1L;
-
- /**
- * 字典主键
- */
- @Excel(name = "字典主键", cellType = ColumnType.NUMERIC)
- private Long dictId;
-
- /**
- * 字典名称
- */
- @NotBlank(message = "字典名称不能为空")
- @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符")
- @Excel(name = "字典名称")
- private String dictName;
-
- /**
- * 字典类型
- */
- @NotBlank(message = "字典类型不能为空")
- @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符")
- @Excel(name = "字典类型")
- private String dictType;
-
- /**
- * 状态(0正常 1停用)
- */
- @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
- private String status;
-
-}
+package com.ruoyi.system.api.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import com.ruoyi.common.excel.annotation.ExcelDictFormat;
+import com.ruoyi.common.excel.convert.ExcelDictConvert;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+/**
+ * 字典类型表 sys_dict_type
+ *
+ * @author Lion Li
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@ExcelIgnoreUnannotated
+@ApiModel("字典类型业务对象")
+public class SysDictType extends BaseEntity {
+
+ /**
+ * 字典主键
+ */
+ @ApiModelProperty(value = "字典主键")
+ @ExcelProperty(value = "字典主键")
+ private Long dictId;
+
+ /**
+ * 字典名称
+ */
+ @ApiModelProperty(value = "字典名称")
+ @ExcelProperty(value = "字典名称")
+ @NotBlank(message = "字典名称不能为空")
+ @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符")
+ private String dictName;
+
+ /**
+ * 字典类型
+ */
+ @ApiModelProperty(value = "字典类型")
+ @ExcelProperty(value = "字典类型")
+ @NotBlank(message = "字典类型不能为空")
+ @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符")
+ private String dictType;
+
+ /**
+ * 状态(0正常 1停用)
+ */
+ @ApiModelProperty(value = "状态(0正常 1停用)")
+ @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "sys_normal_disable")
+ private String status;
+
+ /**
+ * 备注
+ */
+ @ApiModelProperty(value = "备注")
+ private String remark;
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysLogininfor.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysLogininfor.java
index 0d1166efc..d2e10f169 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysLogininfor.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysLogininfor.java
@@ -1,60 +1,79 @@
-package com.ruoyi.system.api.domain;
-
-import com.ruoyi.common.core.annotation.Excel;
-import com.ruoyi.common.core.annotation.Excel.ColumnType;
-import com.ruoyi.common.core.web.domain.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import java.util.Date;
-
-/**
- * 系统访问记录表 sys_logininfor
- *
- * @author ruoyi
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@NoArgsConstructor
-@Accessors(chain = true)
-public class SysLogininfor extends BaseEntity {
-
- /**
- * ID
- */
- @Excel(name = "序号", cellType = ColumnType.NUMERIC)
- private Long infoId;
-
- /**
- * 用户账号
- */
- @Excel(name = "用户账号")
- private String userName;
-
- /**
- * 状态 0成功 1失败
- */
- @Excel(name = "状态", readConverterExp = "0=成功,1=失败")
- private String status;
-
- /**
- * 地址
- */
- @Excel(name = "地址")
- private String ipaddr;
-
- /**
- * 描述
- */
- @Excel(name = "描述")
- private String msg;
-
- /**
- * 访问时间
- */
- @Excel(name = "访问时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
- private Date accessTime;
-
-}
\ No newline at end of file
+package com.ruoyi.system.api.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.excel.annotation.ExcelDictFormat;
+import com.ruoyi.common.excel.convert.ExcelDictConvert;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 系统访问记录表 sys_logininfor
+ *
+ * @author Lion Li
+ */
+
+@Data
+@Accessors(chain = true)
+@ExcelIgnoreUnannotated
+@ApiModel("系统访问记录业务对象")
+public class SysLogininfor implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * ID
+ */
+ @ApiModelProperty(value = "访问ID")
+ @ExcelProperty(value = "序号")
+ private Long infoId;
+
+ /**
+ * 用户账号
+ */
+ @ApiModelProperty(value = "用户账号")
+ @ExcelProperty(value = "用户账号")
+ private String userName;
+
+ /**
+ * 状态 0成功 1失败
+ */
+ @ApiModelProperty(value = "状态 0成功 1失败")
+ @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "sys_common_status")
+ private String status;
+
+ /**
+ * 地址
+ */
+ @ApiModelProperty(value = "地址")
+ @ExcelProperty(value = "地址")
+ private String ipaddr;
+
+ /**
+ * 描述
+ */
+ @ApiModelProperty(value = "描述")
+ @ExcelProperty(value = "描述")
+ private String msg;
+
+ /**
+ * 访问时间
+ */
+ @ApiModelProperty(value = "访问时间")
+ @ExcelProperty(value = "访问时间")
+ private Date accessTime;
+
+ /**
+ * 请求参数
+ */
+ @ApiModelProperty(value = "请求参数")
+ private Map params = new HashMap<>();
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysOperLog.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysOperLog.java
index b53c3d4ba..ac719a578 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysOperLog.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysOperLog.java
@@ -1,119 +1,151 @@
-package com.ruoyi.system.api.domain;
-
-import com.ruoyi.common.core.annotation.Excel;
-import com.ruoyi.common.core.annotation.Excel.ColumnType;
-import com.ruoyi.common.core.web.domain.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import java.util.Date;
-
-/**
- * 操作日志记录表 oper_log
- *
- * @author ruoyi
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@NoArgsConstructor
-@Accessors(chain = true)
-public class SysOperLog extends BaseEntity {
-
- /**
- * 日志主键
- */
- @Excel(name = "操作序号", cellType = ColumnType.NUMERIC)
- private Long operId;
-
- /**
- * 操作模块
- */
- @Excel(name = "操作模块")
- private String title;
-
- /**
- * 业务类型(0其它 1新增 2修改 3删除)
- */
- @Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据")
- private Integer businessType;
-
- /**
- * 业务类型数组
- */
- private Integer[] businessTypes;
-
- /**
- * 请求方法
- */
- @Excel(name = "请求方法")
- private String method;
-
- /**
- * 请求方式
- */
- @Excel(name = "请求方式")
- private String requestMethod;
-
- /**
- * 操作类别(0其它 1后台用户 2手机端用户)
- */
- @Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户")
- private Integer operatorType;
-
- /**
- * 操作人员
- */
- @Excel(name = "操作人员")
- private String operName;
-
- /**
- * 部门名称
- */
- @Excel(name = "部门名称")
- private String deptName;
-
- /**
- * 请求url
- */
- @Excel(name = "请求地址")
- private String operUrl;
-
- /**
- * 操作地址
- */
- @Excel(name = "操作地址")
- private String operIp;
-
- /**
- * 请求参数
- */
- @Excel(name = "请求参数")
- private String operParam;
-
- /**
- * 返回参数
- */
- @Excel(name = "返回参数")
- private String jsonResult;
-
- /**
- * 操作状态(0正常 1异常)
- */
- @Excel(name = "状态", readConverterExp = "0=正常,1=异常")
- private Integer status;
-
- /**
- * 错误消息
- */
- @Excel(name = "错误消息")
- private String errorMsg;
-
- /**
- * 操作时间
- */
- @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
- private Date operTime;
-
-}
+package com.ruoyi.system.api.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.excel.annotation.ExcelDictFormat;
+import com.ruoyi.common.excel.convert.ExcelDictConvert;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 操作日志记录表 oper_log
+ *
+ * @author Lion Li
+ */
+
+@Data
+@Accessors(chain = true)
+@ExcelIgnoreUnannotated
+@ApiModel("操作日志记录业务对象")
+public class SysOperLog implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 日志主键
+ */
+ @ApiModelProperty(value = "日志主键")
+ @ExcelProperty(value = "日志主键")
+ private Long operId;
+
+ /**
+ * 操作模块
+ */
+ @ApiModelProperty(value = "操作模块")
+ @ExcelProperty(value = "操作模块")
+ private String title;
+
+ /**
+ * 业务类型(0其它 1新增 2修改 3删除)
+ */
+ @ApiModelProperty(value = "业务类型(0其它 1新增 2修改 3删除)")
+ @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "sys_oper_type")
+ private Integer businessType;
+
+ /**
+ * 业务类型数组
+ */
+ @ApiModelProperty(value = "业务类型数组")
+ private Integer[] businessTypes;
+
+ /**
+ * 请求方法
+ */
+ @ApiModelProperty(value = "请求方法")
+ @ExcelProperty(value = "请求方法")
+ private String method;
+
+ /**
+ * 请求方式
+ */
+ @ApiModelProperty(value = "请求方式")
+ @ExcelProperty(value = "请求方式")
+ private String requestMethod;
+
+ /**
+ * 操作类别(0其它 1后台用户 2手机端用户)
+ */
+ @ApiModelProperty(value = "操作类别(0其它 1后台用户 2手机端用户)")
+ @ExcelProperty(value = "操作类别", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "0=其它,1=后台用户,2=手机端用户")
+ private Integer operatorType;
+
+ /**
+ * 操作人员
+ */
+ @ApiModelProperty(value = "操作人员")
+ @ExcelProperty(value = "操作人员")
+ private String operName;
+
+ /**
+ * 部门名称
+ */
+ @ApiModelProperty(value = "部门名称")
+ @ExcelProperty(value = "部门名称")
+ private String deptName;
+
+ /**
+ * 请求url
+ */
+ @ApiModelProperty(value = "请求url")
+ @ExcelProperty(value = "请求地址")
+ private String operUrl;
+
+ /**
+ * 操作地址
+ */
+ @ApiModelProperty(value = "操作地址")
+ @ExcelProperty(value = "操作地址")
+ private String operIp;
+
+ /**
+ * 请求参数
+ */
+ @ApiModelProperty(value = "请求参数")
+ @ExcelProperty(value = "请求参数")
+ private String operParam;
+
+ /**
+ * 返回参数
+ */
+ @ApiModelProperty(value = "返回参数")
+ @ExcelProperty(value = "返回参数")
+ private String jsonResult;
+
+ /**
+ * 操作状态(0正常 1异常)
+ */
+ @ApiModelProperty(value = "操作状态(0正常 1异常)")
+ @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "sys_common_status")
+ private Integer status;
+
+ /**
+ * 错误消息
+ */
+ @ApiModelProperty(value = "错误消息")
+ @ExcelProperty(value = "错误消息")
+ private String errorMsg;
+
+ /**
+ * 操作时间
+ */
+ @ApiModelProperty(value = "操作时间")
+ @ExcelProperty(value = "操作时间")
+ private Date operTime;
+
+ /**
+ * 请求参数
+ */
+ @ApiModelProperty(value = "请求参数")
+ private Map params = new HashMap<>();
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java
index 50083b946..a8ea0405b 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java
@@ -1,108 +1,134 @@
-package com.ruoyi.system.api.domain;
-
-import com.ruoyi.common.core.annotation.Excel;
-import com.ruoyi.common.core.annotation.Excel.ColumnType;
-import com.ruoyi.common.core.web.domain.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.Size;
-
-/**
- * 角色表 sys_role
- *
- * @author ruoyi
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@NoArgsConstructor
-@Accessors(chain = true)
-public class SysRole extends BaseEntity {
-
- /**
- * 角色ID
- */
- @Excel(name = "角色序号", cellType = ColumnType.NUMERIC)
- private Long roleId;
-
- /**
- * 角色名称
- */
- @NotBlank(message = "角色名称不能为空")
- @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符")
- @Excel(name = "角色名称")
- private String roleName;
-
- /**
- * 角色权限
- */
- @NotBlank(message = "权限字符不能为空")
- @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符")
- @Excel(name = "角色权限")
- private String roleKey;
-
- /**
- * 角色排序
- */
- @NotBlank(message = "显示顺序不能为空")
- @Excel(name = "角色排序")
- private String roleSort;
-
- /**
- * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限)
- */
- @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限")
- private String dataScope;
-
- /**
- * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示)
- */
- private boolean menuCheckStrictly;
-
- /**
- * 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 )
- */
- private boolean deptCheckStrictly;
-
- /**
- * 角色状态(0正常 1停用)
- */
- @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用")
- private String status;
-
- /**
- * 删除标志(0代表存在 2代表删除)
- */
- private String delFlag;
-
- /**
- * 用户是否存在此角色标识 默认不存在
- */
- private boolean flag = false;
-
- /**
- * 菜单组
- */
- private Long[] menuIds;
-
- /**
- * 部门组(数据权限)
- */
- private Long[] deptIds;
-
- public SysRole(Long roleId) {
- this.roleId = roleId;
- }
-
- public boolean isAdmin() {
- return isAdmin(this.roleId);
- }
-
- public static boolean isAdmin(Long roleId) {
- return roleId != null && 1L == roleId;
- }
-
-}
+package com.ruoyi.system.api.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import com.ruoyi.common.excel.annotation.ExcelDictFormat;
+import com.ruoyi.common.excel.convert.ExcelDictConvert;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+/**
+ * 角色表 sys_role
+ *
+ * @author Lion Li
+ */
+
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@ExcelIgnoreUnannotated
+public class SysRole extends BaseEntity {
+
+ /**
+ * 角色ID
+ */
+ @ApiModelProperty(value = "角色ID")
+ @ExcelProperty(value = "角色序号")
+ private Long roleId;
+
+ /**
+ * 角色名称
+ */
+ @ApiModelProperty(value = "角色名称")
+ @ExcelProperty(value = "角色名称")
+ @NotBlank(message = "角色名称不能为空")
+ @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符")
+ private String roleName;
+
+ /**
+ * 角色权限
+ */
+ @ApiModelProperty(value = "角色权限")
+ @ExcelProperty(value = "角色权限")
+ @NotBlank(message = "权限字符不能为空")
+ @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符")
+ private String roleKey;
+
+ /**
+ * 角色排序
+ */
+ @ApiModelProperty(value = "角色排序")
+ @ExcelProperty(value = "角色排序")
+ @NotBlank(message = "显示顺序不能为空")
+ private String roleSort;
+
+ /**
+ * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限)
+ */
+ @ApiModelProperty(value = "数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限)")
+ @ExcelProperty(value = "数据范围", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限")
+ private String dataScope;
+
+ /**
+ * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示)
+ */
+ @ApiModelProperty(value = "菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示)")
+ private boolean menuCheckStrictly;
+
+ /**
+ * 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 )
+ */
+ @ApiModelProperty(value = "部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 )")
+ private boolean deptCheckStrictly;
+
+ /**
+ * 角色状态(0正常 1停用)
+ */
+ @ApiModelProperty(value = "角色状态(0正常 1停用)")
+ @ExcelProperty(value = "角色状态", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "sys_common_status")
+ private String status;
+
+ /**
+ * 删除标志(0代表存在 2代表删除)
+ */
+ @ApiModelProperty(value = "删除标志(0代表存在 2代表删除)")
+ private String delFlag;
+
+ /**
+ * 备注
+ */
+ @ApiModelProperty(value = "备注")
+ private String remark;
+
+ /**
+ * 用户是否存在此角色标识 默认不存在
+ */
+ @ApiModelProperty(value = "用户是否存在此角色标识 默认不存在")
+ private boolean flag = false;
+
+ /**
+ * 菜单组
+ */
+ @ApiModelProperty(value = "菜单组")
+ private Long[] menuIds;
+
+ /**
+ * 部门组(数据权限)
+ */
+ @ApiModelProperty(value = "部门组(数据权限)")
+ private Long[] deptIds;
+
+ public SysRole(Long roleId) {
+ this.roleId = roleId;
+ }
+
+ @ApiModelProperty(value = "是否管理员")
+ public boolean isAdmin() {
+ return isAdmin(this.roleId);
+ }
+
+ public static boolean isAdmin(Long roleId) {
+ return roleId != null && 1L == roleId;
+ }
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java
index 104226095..d1587ef7c 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java
@@ -1,157 +1,179 @@
-package com.ruoyi.system.api.domain;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.ruoyi.common.core.annotation.Excel;
-import com.ruoyi.common.core.annotation.Excel.ColumnType;
-import com.ruoyi.common.core.annotation.Excel.Type;
-import com.ruoyi.common.core.annotation.Excels;
-import com.ruoyi.common.core.web.domain.BaseEntity;
-import com.ruoyi.common.core.xss.Xss;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import javax.validation.constraints.Email;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.Size;
-import java.util.Date;
-import java.util.List;
-
-/**
- * 用户对象 sys_user
- *
- * @author ruoyi
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@NoArgsConstructor
-@Accessors(chain = true)
-public class SysUser extends BaseEntity {
-
- /**
- * 用户ID
- */
- @Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号")
- private Long userId;
-
- /**
- * 部门ID
- */
- @Excel(name = "部门编号", type = Type.IMPORT)
- private Long deptId;
-
- /**
- * 用户账号
- */
- @Xss(message = "用户账号不能包含脚本字符")
- @NotBlank(message = "用户账号不能为空")
- @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
- @Excel(name = "登录名称")
- private String userName;
-
- /**
- * 用户昵称
- */
- @Xss(message = "用户昵称不能包含脚本字符")
- @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
- @Excel(name = "用户名称")
- private String nickName;
-
- /**
- * 用户邮箱
- */
- @Email(message = "邮箱格式不正确")
- @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
- @Excel(name = "用户邮箱")
- private String email;
-
- /**
- * 手机号码
- */
- @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符")
- @Excel(name = "手机号码")
- private String phonenumber;
-
- /**
- * 用户性别
- */
- @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
- private String sex;
-
- /**
- * 用户头像
- */
- private String avatar;
-
- /**
- * 密码
- */
- @JsonProperty
- private String password;
-
- /**
- * 帐号状态(0正常 1停用)
- */
- @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")
- private String status;
-
- /**
- * 删除标志(0代表存在 2代表删除)
- */
- private String delFlag;
-
- /**
- * 最后登录IP
- */
- @Excel(name = "最后登录IP", type = Type.EXPORT)
- private String loginIp;
-
- /**
- * 最后登录时间
- */
- @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
- private Date loginDate;
-
- /**
- * 部门对象
- */
- @Excels({
- @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
- @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
- })
- private SysDept dept;
-
- /**
- * 角色对象
- */
- private List roles;
-
- /**
- * 角色组
- */
- private Long[] roleIds;
-
- /**
- * 岗位组
- */
- private Long[] postIds;
-
- /**
- * 角色ID
- */
- private Long roleId;
-
- public SysUser(Long userId) {
- this.userId = userId;
- }
-
- public boolean isAdmin() {
- return isAdmin(this.userId);
- }
-
- public static boolean isAdmin(Long userId) {
- return userId != null && 1L == userId;
- }
-
-}
+package com.ruoyi.system.api.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import com.ruoyi.common.core.xss.Xss;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 用户对象 sys_user
+ *
+ * @author Lion Li
+ */
+
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@ApiModel("用户信息业务对象")
+public class SysUser extends BaseEntity {
+
+ /**
+ * 用户ID
+ */
+ @ApiModelProperty(value = "用户ID")
+ private Long userId;
+
+ /**
+ * 部门ID
+ */
+ @ApiModelProperty(value = "部门ID")
+ private Long deptId;
+
+ /**
+ * 用户账号
+ */
+ @ApiModelProperty(value = "用户账号")
+ @Xss(message = "用户账号不能包含脚本字符")
+ @NotBlank(message = "用户账号不能为空")
+ @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
+ private String userName;
+
+ /**
+ * 用户昵称
+ */
+ @ApiModelProperty(value = "用户昵称")
+ @Xss(message = "用户昵称不能包含脚本字符")
+ @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
+ private String nickName;
+
+ /**
+ * 用户类型(sys_user系统用户)
+ */
+ @ApiModelProperty(value = "用户类型")
+ private String userType;
+
+ /**
+ * 用户邮箱
+ */
+ @ApiModelProperty(value = "用户邮箱")
+ @Email(message = "邮箱格式不正确")
+ @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
+ private String email;
+
+ /**
+ * 手机号码
+ */
+ @ApiModelProperty(value = "手机号码")
+ private String phonenumber;
+
+ /**
+ * 用户性别
+ */
+ @ApiModelProperty(value = "用户性别")
+ private String sex;
+
+ /**
+ * 用户头像
+ */
+ @ApiModelProperty(value = "用户头像")
+ private String avatar;
+
+ /**
+ * 密码
+ */
+ @ApiModelProperty(value = "密码")
+ private String password;
+
+ @JsonIgnore
+ @JsonProperty
+ public String getPassword() {
+ return password;
+ }
+
+ /**
+ * 帐号状态(0正常 1停用)
+ */
+ @ApiModelProperty(value = "帐号状态(0正常 1停用)")
+ private String status;
+
+ /**
+ * 删除标志(0代表存在 2代表删除)
+ */
+ @ApiModelProperty(value = "删除标志(0代表存在 2代表删除)")
+ private String delFlag;
+
+ /**
+ * 最后登录IP
+ */
+ @ApiModelProperty(value = "最后登录IP")
+ private String loginIp;
+
+ /**
+ * 最后登录时间
+ */
+ @ApiModelProperty(value = "最后登录时间")
+ private Date loginDate;
+
+ /**
+ * 备注
+ */
+ @ApiModelProperty(value = "备注")
+ private String remark;
+
+ /**
+ * 部门对象
+ */
+ @ApiModelProperty(value = "部门对象")
+ private SysDept dept;
+
+ /**
+ * 角色对象
+ */
+ @ApiModelProperty(value = "角色对象")
+ private List roles;
+
+ /**
+ * 角色组
+ */
+ @ApiModelProperty(value = "角色组")
+ private Long[] roleIds;
+
+ /**
+ * 岗位组
+ */
+ @ApiModelProperty(value = "岗位组")
+ private Long[] postIds;
+
+ /**
+ * 数据权限 当前角色ID
+ */
+ @ApiModelProperty(value = "角色ID")
+ private Long roleId;
+
+ public SysUser(Long userId) {
+ this.userId = userId;
+ }
+
+ @ApiModelProperty(value = "是否管理员")
+ public boolean isAdmin() {
+ return isAdmin(this.userId);
+ }
+
+ public static boolean isAdmin(Long userId) {
+ return userId != null && 1L == userId;
+ }
+
+}
diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
index 79d3fbf06..7a62a6ec7 100644
--- a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
+++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
@@ -1,72 +1,73 @@
-package com.ruoyi.auth.controller;
-
-import com.ruoyi.auth.form.LoginBody;
-import com.ruoyi.auth.form.RegisterBody;
-import com.ruoyi.auth.service.SysLoginService;
-import com.ruoyi.common.core.domain.R;
-import com.ruoyi.common.core.utils.JwtUtils;
-import com.ruoyi.common.core.utils.StringUtils;
-import com.ruoyi.common.security.auth.AuthUtil;
-import com.ruoyi.common.security.service.TokenService;
-import com.ruoyi.common.security.utils.SecurityUtils;
-import com.ruoyi.system.api.model.LoginUser;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * token 控制
- *
- * @author ruoyi
- */
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@RestController
-public class TokenController {
-
- private final TokenService tokenService;
- private final SysLoginService sysLoginService;
-
- @PostMapping("login")
- public R> login(@RequestBody LoginBody form) {
- // 用户登录
- LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword());
- // 获取登录token
- return R.ok(tokenService.createToken(userInfo));
- }
-
- @DeleteMapping("logout")
- public R> logout(HttpServletRequest request) {
- String token = SecurityUtils.getToken(request);
- if (StringUtils.isNotEmpty(token)) {
- String username = JwtUtils.getUserName(token);
- // 删除用户缓存记录
- AuthUtil.logoutByToken(token);
- // 记录用户退出日志
- sysLoginService.logout(username);
- }
- return R.ok();
- }
-
- @PostMapping("refresh")
- public R> refresh(HttpServletRequest request) {
- LoginUser loginUser = tokenService.getLoginUser(request);
- if (StringUtils.isNotNull(loginUser)) {
- // 刷新令牌有效期
- tokenService.refreshToken(loginUser);
- return R.ok();
- }
- return R.ok();
- }
-
- @PostMapping("register")
- public R> register(@RequestBody RegisterBody registerBody) {
- // 用户注册
- sysLoginService.register(registerBody.getUsername(), registerBody.getPassword());
- return R.ok();
- }
-}
+package com.ruoyi.auth.controller;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.auth.form.LoginBody;
+import com.ruoyi.auth.form.RegisterBody;
+import com.ruoyi.auth.service.SysLoginService;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.utils.JwtUtils;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.security.auth.AuthUtil;
+import com.ruoyi.common.security.service.TokenService;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.system.api.model.LoginUser;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * token 控制
+ *
+ * @author ruoyi
+ */
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+public class TokenController {
+
+ private final TokenService tokenService;
+ private final SysLoginService sysLoginService;
+
+ @PostMapping("login")
+ public R> login(@RequestBody LoginBody form) {
+ // 用户登录
+ LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword());
+ // 获取登录token
+ return R.ok(tokenService.createToken(userInfo));
+ }
+
+ @DeleteMapping("logout")
+ public R> logout(HttpServletRequest request) {
+ String token = SecurityUtils.getToken(request);
+ if (StringUtils.isNotEmpty(token)) {
+ String username = JwtUtils.getUserName(token);
+ // 删除用户缓存记录
+ AuthUtil.logoutByToken(token);
+ // 记录用户退出日志
+ sysLoginService.logout(username);
+ }
+ return R.ok();
+ }
+
+ @PostMapping("refresh")
+ public R> refresh(HttpServletRequest request) {
+ LoginUser loginUser = tokenService.getLoginUser(request);
+ if (ObjectUtil.isNotNull(loginUser)) {
+ // 刷新令牌有效期
+ tokenService.refreshToken(loginUser);
+ return R.ok();
+ }
+ return R.ok();
+ }
+
+ @PostMapping("register")
+ public R> register(@RequestBody RegisterBody registerBody) {
+ // 用户注册
+ sysLoginService.register(registerBody.getUsername(), registerBody.getPassword());
+ return R.ok();
+ }
+}
diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
index f2253cfb7..2d9720a50 100644
--- a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
+++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
@@ -1,5 +1,6 @@
package com.ruoyi.auth.service;
+import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.constant.UserConstants;
@@ -7,7 +8,6 @@ import com.ruoyi.common.core.enums.UserStatus;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.ServletUtils;
import com.ruoyi.common.core.utils.StringUtils;
-import com.ruoyi.common.core.utils.ip.IpUtils;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.system.api.RemoteLogService;
import com.ruoyi.system.api.RemoteUserService;
@@ -54,7 +54,7 @@ public class SysLoginService {
// 查询用户信息
LoginUser userInfo = remoteUserService.getUserInfo(username, SecurityConstants.INNER);
- if (StringUtils.isNull(userInfo)) {
+ if (ObjectUtil.isNull(userInfo)) {
recordLogininfor(username, Constants.LOGIN_FAIL, "登录用户不存在");
throw new ServiceException("登录用户:" + username + " 不存在");
}
@@ -117,7 +117,7 @@ public class SysLoginService {
public void recordLogininfor(String username, String status, String message) {
SysLogininfor logininfor = new SysLogininfor();
logininfor.setUserName(username);
- logininfor.setIpaddr(IpUtils.getIpAddr(ServletUtils.getRequest()));
+ logininfor.setIpaddr(ServletUtils.getClientIP());
logininfor.setMsg(message);
// 日志状态
if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
@@ -127,4 +127,4 @@ public class SysLoginService {
}
remoteLogService.saveLogininfor(logininfor, SecurityConstants.INNER);
}
-}
\ No newline at end of file
+}
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index fdf304bff..7f3a1b8d6 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -12,6 +12,7 @@
ruoyi-common-bom
ruoyi-common-log
ruoyi-common-dict
+ ruoyi-common-excel
ruoyi-common-core
ruoyi-common-redis
ruoyi-common-swagger
diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml
index 6f6625b84..aaf81c018 100644
--- a/ruoyi-common/ruoyi-common-bom/pom.xml
+++ b/ruoyi-common/ruoyi-common-bom/pom.xml
@@ -64,6 +64,13 @@
${project.version}
+
+
+ com.ruoyi
+ ruoyi-common-excel
+ ${project.version}
+
+
com.ruoyi
diff --git a/ruoyi-common/ruoyi-common-core/pom.xml b/ruoyi-common/ruoyi-common-core/pom.xml
index acf68473f..0b965fcdb 100644
--- a/ruoyi-common/ruoyi-common-core/pom.xml
+++ b/ruoyi-common/ruoyi-common-core/pom.xml
@@ -93,10 +93,9 @@
commons-fileupload
-
- org.apache.poi
- poi-ooxml
+ cglib
+ cglib
@@ -126,6 +125,11 @@
hutool-jwt
+
+ cn.hutool
+ hutool-http
+
+
cn.hutool
hutool-extra
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excel.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excel.java
deleted file mode 100644
index 1cbd6ca5b..000000000
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excel.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package com.ruoyi.common.core.annotation;
-
-import com.ruoyi.common.core.utils.poi.ExcelHandlerAdapter;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.math.BigDecimal;
-
-/**
- * 自定义导出Excel数据注解
- *
- * @author ruoyi
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.FIELD)
-public @interface Excel {
- /**
- * 导出时在excel中排序
- */
- public int sort() default Integer.MAX_VALUE;
-
- /**
- * 导出到Excel中的名字.
- */
- public String name() default "";
-
- /**
- * 日期格式, 如: yyyy-MM-dd
- */
- public String dateFormat() default "";
-
- /**
- * 读取内容转表达式 (如: 0=男,1=女,2=未知)
- */
- public String readConverterExp() default "";
-
- /**
- * 分隔符,读取字符串组内容
- */
- public String separator() default ",";
-
- /**
- * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化)
- */
- public int scale() default -1;
-
- /**
- * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN
- */
- public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
-
- /**
- * 导出类型(0数字 1字符串)
- */
- public ColumnType cellType() default ColumnType.STRING;
-
- /**
- * 导出时在excel中每个列的高度 单位为字符
- */
- public double height() default 14;
-
- /**
- * 导出时在excel中每个列的宽 单位为字符
- */
- public double width() default 16;
-
- /**
- * 文字后缀,如% 90 变成90%
- */
- public String suffix() default "";
-
- /**
- * 当值为空时,字段的默认值
- */
- public String defaultValue() default "";
-
- /**
- * 提示信息
- */
- public String prompt() default "";
-
- /**
- * 设置只能选择不能输入的列内容.
- */
- public String[] combo() default {};
-
- /**
- * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
- */
- public boolean isExport() default true;
-
- /**
- * 另一个类中的属性名称,支持多级获取,以小数点隔开
- */
- public String targetAttr() default "";
-
- /**
- * 是否自动统计数据,在最后追加一行统计数据总和
- */
- public boolean isStatistics() default false;
-
- /**
- * 导出字段对齐方式(0:默认;1:靠左;2:居中;3:靠右)
- */
- public Align align() default Align.AUTO;
-
- /**
- * 自定义数据处理器
- */
- public Class> handler() default ExcelHandlerAdapter.class;
-
- /**
- * 自定义数据处理器参数
- */
- public String[] args() default {};
-
- public enum Align {
- AUTO(0), LEFT(1), CENTER(2), RIGHT(3);
- private final int value;
-
- Align(int value) {
- this.value = value;
- }
-
- public int value() {
- return this.value;
- }
- }
-
- /**
- * 字段类型(0:导出导入;1:仅导出;2:仅导入)
- */
- Type type() default Type.ALL;
-
- public enum Type {
- ALL(0), EXPORT(1), IMPORT(2);
- private final int value;
-
- Type(int value) {
- this.value = value;
- }
-
- public int value() {
- return this.value;
- }
- }
-
- public enum ColumnType {
- NUMERIC(0), STRING(1), IMAGE(2);
- private final int value;
-
- ColumnType(int value) {
- this.value = value;
- }
-
- public int value() {
- return this.value;
- }
- }
-}
\ No newline at end of file
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excels.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excels.java
deleted file mode 100644
index fe2d4d104..000000000
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excels.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.ruoyi.common.core.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Excel注解集
- *
- * @author ruoyi
- */
-@Target(ElementType.FIELD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface Excels {
- Excel[] value();
-}
\ No newline at end of file
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/config/ValidatorConfig.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/config/ValidatorConfig.java
new file mode 100644
index 000000000..36d2e4fbf
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/config/ValidatorConfig.java
@@ -0,0 +1,43 @@
+package com.ruoyi.common.core.config;
+
+import org.hibernate.validator.HibernateValidator;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.MessageSource;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
+
+import javax.validation.Validator;
+import java.util.Properties;
+
+/**
+ * 校验框架配置类
+ *
+ * @author Lion Li
+ */
+@Configuration
+public class ValidatorConfig {
+
+ @Autowired
+ private MessageSource messageSource;
+
+ /**
+ * 配置校验框架 快速返回模式
+ */
+ @Bean
+ public Validator validator() {
+ LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
+ // 国际化
+ factoryBean.setValidationMessageSource(messageSource);
+ // 设置使用 HibernateValidator 校验器
+ factoryBean.setProviderClass(HibernateValidator.class);
+ Properties properties = new Properties();
+ // 设置 快速异常返回
+ properties.setProperty("hibernate.validator.fail_fast", "true");
+ factoryBean.setValidationProperties(properties);
+ // 加载配置
+ factoryBean.afterPropertiesSet();
+ return factoryBean.getValidator();
+ }
+
+}
diff --git a/ruoyi-common/ruoyi-common-dict/src/main/java/com/ruoyi/common/dict/service/DictService.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/service/DictService.java
similarity index 97%
rename from ruoyi-common/ruoyi-common-dict/src/main/java/com/ruoyi/common/dict/service/DictService.java
rename to ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/service/DictService.java
index ddcc67eb5..2b649fcfc 100644
--- a/ruoyi-common/ruoyi-common-dict/src/main/java/com/ruoyi/common/dict/service/DictService.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/service/DictService.java
@@ -1,4 +1,4 @@
-package com.ruoyi.common.dict.service;
+package com.ruoyi.common.core.service;
/**
* 字典服务服务
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/BeanCopyUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/BeanCopyUtils.java
new file mode 100644
index 000000000..67cc835ae
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/BeanCopyUtils.java
@@ -0,0 +1,121 @@
+package com.ruoyi.common.core.utils;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.ReflectUtil;
+import cn.hutool.extra.cglib.CglibUtil;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * bean深拷贝工具(基于 cglib 性能优异)
+ *
+ * @author Lion Li
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class BeanCopyUtils {
+
+ /**
+ * 单对象基于class创建拷贝
+ *
+ * @param source 数据来源实体
+ * @param desc 描述对象 转换后的对象
+ * @return desc
+ */
+ public static V copy(T source, Class desc) {
+ if (ObjectUtil.isNull(source)) {
+ return null;
+ }
+ if (ObjectUtil.isNull(desc)) {
+ return null;
+ }
+ return CglibUtil.copy(source, desc);
+ }
+
+ /**
+ * 单对象基于对象创建拷贝
+ *
+ * @param source 数据来源实体
+ * @param desc 转换后的对象
+ * @return desc
+ */
+ public static V copy(T source, V desc) {
+ if (ObjectUtil.isNull(source)) {
+ return null;
+ }
+ if (ObjectUtil.isNull(desc)) {
+ return null;
+ }
+ CglibUtil.copy(source, desc);
+ return desc;
+ }
+
+ /**
+ * 列表对象基于class创建拷贝
+ *
+ * @param sourceList 数据来源实体列表
+ * @param desc 描述对象 转换后的对象
+ * @return desc
+ */
+ public static List copyList(List sourceList, Class desc) {
+ if (ObjectUtil.isNull(sourceList)) {
+ return null;
+ }
+ if (CollUtil.isEmpty(sourceList)) {
+ return CollUtil.newArrayList();
+ }
+ return CglibUtil.copyList(sourceList, () -> ReflectUtil.newInstanceIfPossible(desc));
+ }
+
+ /**
+ * bean拷贝到map
+ *
+ * @param bean 数据来源实体
+ * @return map对象
+ */
+ @SuppressWarnings("all")
+ public static Map copyToMap(T bean) {
+ if (ObjectUtil.isNull(bean)) {
+ return null;
+ }
+ return CglibUtil.toMap(bean);
+ }
+
+ /**
+ * map拷贝到bean
+ *
+ * @param map 数据来源
+ * @param beanClass bean类
+ * @return bean对象
+ */
+ public static T mapToBean(Map map, Class beanClass) {
+ if (MapUtil.isEmpty(map)) {
+ return null;
+ }
+ if (ObjectUtil.isNull(beanClass)) {
+ return null;
+ }
+ return CglibUtil.toBean(map, beanClass);
+ }
+
+ /**
+ * map拷贝到bean
+ *
+ * @param map 数据来源
+ * @param bean bean对象
+ * @return bean对象
+ */
+ public static T mapToBean(Map map, T bean) {
+ if (MapUtil.isEmpty(map)) {
+ return null;
+ }
+ if (ObjectUtil.isNull(bean)) {
+ return null;
+ }
+ return CglibUtil.fillBean(map, bean);
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
index 9d6a5d7ce..6e2c3c7b5 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
@@ -1,135 +1,139 @@
-package com.ruoyi.common.core.utils;
-
-import org.apache.commons.lang3.time.DateFormatUtils;
-
-import java.lang.management.ManagementFactory;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-/**
- * 时间工具类
- *
- * @author ruoyi
- */
-public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
- public static String YYYY = "yyyy";
-
- public static String YYYY_MM = "yyyy-MM";
-
- public static String YYYY_MM_DD = "yyyy-MM-dd";
-
- public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
-
- public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
-
- private static String[] parsePatterns = {
- "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
- "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
- "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
-
- /**
- * 获取当前Date型日期
- *
- * @return Date() 当前日期
- */
- public static Date getNowDate() {
- return new Date();
- }
-
- /**
- * 获取当前日期, 默认格式为yyyy-MM-dd
- *
- * @return String
- */
- public static String getDate() {
- return dateTimeNow(YYYY_MM_DD);
- }
-
- public static final String getTime() {
- return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
- }
-
- public static final String dateTimeNow() {
- return dateTimeNow(YYYYMMDDHHMMSS);
- }
-
- public static final String dateTimeNow(final String format) {
- return parseDateToStr(format, new Date());
- }
-
- public static final String dateTime(final Date date) {
- return parseDateToStr(YYYY_MM_DD, date);
- }
-
- public static final String parseDateToStr(final String format, final Date date) {
- return new SimpleDateFormat(format).format(date);
- }
-
- public static final Date dateTime(final String format, final String ts) {
- try {
- return new SimpleDateFormat(format).parse(ts);
- } catch (ParseException e) {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * 日期路径 即年/月/日 如2018/08/08
- */
- public static final String datePath() {
- Date now = new Date();
- return DateFormatUtils.format(now, "yyyy/MM/dd");
- }
-
- /**
- * 日期路径 即年/月/日 如20180808
- */
- public static final String dateTime() {
- Date now = new Date();
- return DateFormatUtils.format(now, "yyyyMMdd");
- }
-
- /**
- * 日期型字符串转化为日期 格式
- */
- public static Date parseDate(Object str) {
- if (str == null) {
- return null;
- }
- try {
- return parseDate(str.toString(), parsePatterns);
- } catch (ParseException e) {
- return null;
- }
- }
-
- /**
- * 获取服务器启动时间
- */
- public static Date getServerStartDate() {
- long time = ManagementFactory.getRuntimeMXBean().getStartTime();
- return new Date(time);
- }
-
- /**
- * 计算两个时间差
- */
- public static String getDatePoor(Date endDate, Date nowDate) {
- long nd = 1000 * 24 * 60 * 60;
- long nh = 1000 * 60 * 60;
- long nm = 1000 * 60;
- // long ns = 1000;
- // 获得两个时间的毫秒时间差异
- long diff = endDate.getTime() - nowDate.getTime();
- // 计算差多少天
- long day = diff / nd;
- // 计算差多少小时
- long hour = diff % nd / nh;
- // 计算差多少分钟
- long min = diff % nd % nh / nm;
- // 计算差多少秒//输出结果
- // long sec = diff % nd % nh % nm / ns;
- return day + "天" + hour + "小时" + min + "分钟";
- }
-}
+package com.ruoyi.common.core.utils;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.time.DateFormatUtils;
+
+import java.lang.management.ManagementFactory;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 时间工具类
+ *
+ * @author ruoyi
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
+
+ public static String YYYY = "yyyy";
+
+ public static String YYYY_MM = "yyyy-MM";
+
+ public static String YYYY_MM_DD = "yyyy-MM-dd";
+
+ public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
+
+ public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
+
+ private static String[] parsePatterns = {
+ "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
+ "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
+ "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
+
+ /**
+ * 获取当前Date型日期
+ *
+ * @return Date() 当前日期
+ */
+ public static Date getNowDate() {
+ return new Date();
+ }
+
+ /**
+ * 获取当前日期, 默认格式为yyyy-MM-dd
+ *
+ * @return String
+ */
+ public static String getDate() {
+ return dateTimeNow(YYYY_MM_DD);
+ }
+
+ public static final String getTime() {
+ return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
+ }
+
+ public static final String dateTimeNow() {
+ return dateTimeNow(YYYYMMDDHHMMSS);
+ }
+
+ public static final String dateTimeNow(final String format) {
+ return parseDateToStr(format, new Date());
+ }
+
+ public static final String dateTime(final Date date) {
+ return parseDateToStr(YYYY_MM_DD, date);
+ }
+
+ public static final String parseDateToStr(final String format, final Date date) {
+ return new SimpleDateFormat(format).format(date);
+ }
+
+ public static final Date dateTime(final String format, final String ts) {
+ try {
+ return new SimpleDateFormat(format).parse(ts);
+ } catch (ParseException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * 日期路径 即年/月/日 如2018/08/08
+ */
+ public static final String datePath() {
+ Date now = new Date();
+ return DateFormatUtils.format(now, "yyyy/MM/dd");
+ }
+
+ /**
+ * 日期路径 即年/月/日 如20180808
+ */
+ public static final String dateTime() {
+ Date now = new Date();
+ return DateFormatUtils.format(now, "yyyyMMdd");
+ }
+
+ /**
+ * 日期型字符串转化为日期 格式
+ */
+ public static Date parseDate(Object str) {
+ if (str == null) {
+ return null;
+ }
+ try {
+ return parseDate(str.toString(), parsePatterns);
+ } catch (ParseException e) {
+ return null;
+ }
+ }
+
+ /**
+ * 获取服务器启动时间
+ */
+ public static Date getServerStartDate() {
+ long time = ManagementFactory.getRuntimeMXBean().getStartTime();
+ return new Date(time);
+ }
+
+ /**
+ * 计算两个时间差
+ */
+ public static String getDatePoor(Date endDate, Date nowDate) {
+ long nd = 1000 * 24 * 60 * 60;
+ long nh = 1000 * 60 * 60;
+ long nm = 1000 * 60;
+ // long ns = 1000;
+ // 获得两个时间的毫秒时间差异
+ long diff = endDate.getTime() - nowDate.getTime();
+ // 计算差多少天
+ long day = diff / nd;
+ // 计算差多少小时
+ long hour = diff % nd / nh;
+ // 计算差多少分钟
+ long min = diff % nd % nh / nm;
+ // 计算差多少秒//输出结果
+ // long sec = diff % nd % nh % nm / ns;
+ return day + "天" + hour + "小时" + min + "分钟";
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JsonUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JsonUtils.java
index 347a8b1e8..2e2368fc7 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JsonUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JsonUtils.java
@@ -1,6 +1,7 @@
package com.ruoyi.common.core.utils;
import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.ObjectUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -23,7 +24,7 @@ public class JsonUtils {
private static ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class);
public static String toJsonString(Object object) {
- if (StringUtils.isNull(object)) {
+ if (ObjectUtil.isNull(object)) {
return null;
}
try {
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/PageUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/PageUtils.java
index 9248c3a25..337f56301 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/PageUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/PageUtils.java
@@ -1,5 +1,6 @@
package com.ruoyi.common.core.utils;
+import cn.hutool.core.util.ObjectUtil;
import com.github.pagehelper.PageHelper;
import com.ruoyi.common.core.utils.sql.SqlUtil;
import com.ruoyi.common.core.web.page.PageDomain;
@@ -18,7 +19,7 @@ public class PageUtils extends PageHelper {
PageDomain pageDomain = TableSupport.buildPageRequest();
Integer pageNum = pageDomain.getPageNum();
Integer pageSize = pageDomain.getPageSize();
- if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) {
+ if (ObjectUtil.isNotNull(pageNum) && ObjectUtil.isNotNull(pageSize)) {
String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
Boolean reasonable = pageDomain.getReasonable();
PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ServletUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ServletUtils.java
index a635e97eb..d07de0ffb 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ServletUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ServletUtils.java
@@ -1,202 +1,215 @@
-package com.ruoyi.common.core.utils;
-
-import cn.hutool.core.convert.Convert;
-import com.ruoyi.common.core.constant.Constants;
-import org.springframework.web.context.request.RequestAttributes;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.net.URLEncoder;
-import java.util.Enumeration;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * 客户端工具类
- *
- * @author ruoyi
- */
-public class ServletUtils {
- /**
- * 获取String参数
- */
- public static String getParameter(String name) {
- return getRequest().getParameter(name);
- }
-
- /**
- * 获取String参数
- */
- public static String getParameter(String name, String defaultValue) {
- return Convert.toStr(getRequest().getParameter(name), defaultValue);
- }
-
- /**
- * 获取Integer参数
- */
- public static Integer getParameterToInt(String name) {
- return Convert.toInt(getRequest().getParameter(name));
- }
-
- /**
- * 获取Integer参数
- */
- public static Integer getParameterToInt(String name, Integer defaultValue) {
- return Convert.toInt(getRequest().getParameter(name), defaultValue);
- }
-
- /**
- * 获取Boolean参数
- */
- public static Boolean getParameterToBool(String name) {
- return Convert.toBool(getRequest().getParameter(name));
- }
-
- /**
- * 获取Boolean参数
- */
- public static Boolean getParameterToBool(String name, Boolean defaultValue) {
- return Convert.toBool(getRequest().getParameter(name), defaultValue);
- }
-
- /**
- * 获取request
- */
- public static HttpServletRequest getRequest() {
- try {
- return getRequestAttributes().getRequest();
- } catch (Exception e) {
- return null;
- }
- }
-
- /**
- * 获取response
- */
- public static HttpServletResponse getResponse() {
- try {
- return getRequestAttributes().getResponse();
- } catch (Exception e) {
- return null;
- }
- }
-
- /**
- * 获取session
- */
- public static HttpSession getSession() {
- return getRequest().getSession();
- }
-
- public static ServletRequestAttributes getRequestAttributes() {
- try {
- RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
- return (ServletRequestAttributes) attributes;
- } catch (Exception e) {
- return null;
- }
- }
-
- public static String getHeader(HttpServletRequest request, String name) {
- String value = request.getHeader(name);
- if (StringUtils.isEmpty(value)) {
- return StringUtils.EMPTY;
- }
- return urlDecode(value);
- }
-
- public static Map getHeaders(HttpServletRequest request) {
- Map map = new LinkedHashMap<>();
- Enumeration enumeration = request.getHeaderNames();
- if (enumeration != null) {
- while (enumeration.hasMoreElements()) {
- String key = enumeration.nextElement();
- String value = request.getHeader(key);
- map.put(key, value);
- }
- }
- return map;
- }
-
- /**
- * 将字符串渲染到客户端
- *
- * @param response 渲染对象
- * @param string 待渲染的字符串
- * @return null
- */
- public static String renderString(HttpServletResponse response, String string) {
- try {
- response.setStatus(200);
- response.setContentType("application/json");
- response.setCharacterEncoding("utf-8");
- response.getWriter().print(string);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
-
- /**
- * 是否是Ajax异步请求
- *
- * @param request
- */
- public static boolean isAjaxRequest(HttpServletRequest request) {
- String accept = request.getHeader("accept");
- if (accept != null && accept.indexOf("application/json") != -1) {
- return true;
- }
-
- String xRequestedWith = request.getHeader("X-Requested-With");
- if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1) {
- return true;
- }
-
- String uri = request.getRequestURI();
- if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) {
- return true;
- }
-
- String ajax = request.getParameter("__ajax");
- if (StringUtils.inStringIgnoreCase(ajax, "json", "xml")) {
- return true;
- }
- return false;
- }
-
- /**
- * 内容编码
- *
- * @param str 内容
- * @return 编码后的内容
- */
- public static String urlEncode(String str) {
- try {
- return URLEncoder.encode(str, Constants.UTF8);
- } catch (UnsupportedEncodingException e) {
- return StringUtils.EMPTY;
- }
- }
-
- /**
- * 内容解码
- *
- * @param str 内容
- * @return 解码后的内容
- */
- public static String urlDecode(String str) {
- try {
- return URLDecoder.decode(str, Constants.UTF8);
- } catch (UnsupportedEncodingException e) {
- return StringUtils.EMPTY;
- }
- }
-
-}
+package com.ruoyi.common.core.utils;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.extra.servlet.ServletUtil;
+import cn.hutool.http.HttpStatus;
+import com.ruoyi.common.core.constant.Constants;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.springframework.http.MediaType;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.Enumeration;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * 客户端工具类
+ *
+ * @author ruoyi
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class ServletUtils extends ServletUtil {
+
+ /**
+ * 获取String参数
+ */
+ public static String getParameter(String name) {
+ return getRequest().getParameter(name);
+ }
+
+ /**
+ * 获取String参数
+ */
+ public static String getParameter(String name, String defaultValue) {
+ return Convert.toStr(getRequest().getParameter(name), defaultValue);
+ }
+
+ /**
+ * 获取Integer参数
+ */
+ public static Integer getParameterToInt(String name) {
+ return Convert.toInt(getRequest().getParameter(name));
+ }
+
+ /**
+ * 获取Integer参数
+ */
+ public static Integer getParameterToInt(String name, Integer defaultValue) {
+ return Convert.toInt(getRequest().getParameter(name), defaultValue);
+ }
+
+ /**
+ * 获取Boolean参数
+ */
+ public static Boolean getParameterToBool(String name) {
+ return Convert.toBool(getRequest().getParameter(name));
+ }
+
+ /**
+ * 获取Boolean参数
+ */
+ public static Boolean getParameterToBool(String name, Boolean defaultValue) {
+ return Convert.toBool(getRequest().getParameter(name), defaultValue);
+ }
+
+ /**
+ * 获取request
+ */
+ public static HttpServletRequest getRequest() {
+ try {
+ return getRequestAttributes().getRequest();
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ /**
+ * 获取response
+ */
+ public static HttpServletResponse getResponse() {
+ try {
+ return getRequestAttributes().getResponse();
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ /**
+ * 获取session
+ */
+ public static HttpSession getSession() {
+ return getRequest().getSession();
+ }
+
+ public static ServletRequestAttributes getRequestAttributes() {
+ try {
+ RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
+ return (ServletRequestAttributes) attributes;
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ public static String getHeader(HttpServletRequest request, String name) {
+ String value = request.getHeader(name);
+ if (StringUtils.isEmpty(value)) {
+ return StringUtils.EMPTY;
+ }
+ return urlDecode(value);
+ }
+
+ public static Map getHeaders(HttpServletRequest request) {
+ Map map = new LinkedHashMap<>();
+ Enumeration enumeration = request.getHeaderNames();
+ if (enumeration != null) {
+ while (enumeration.hasMoreElements()) {
+ String key = enumeration.nextElement();
+ String value = request.getHeader(key);
+ map.put(key, value);
+ }
+ }
+ return map;
+ }
+
+ /**
+ * 将字符串渲染到客户端
+ *
+ * @param response 渲染对象
+ * @param string 待渲染的字符串
+ * @return null
+ */
+ public static String renderString(HttpServletResponse response, String string) {
+ try {
+ response.setStatus(HttpStatus.HTTP_OK);
+ response.setContentType(MediaType.APPLICATION_JSON_VALUE);
+ response.setCharacterEncoding(StandardCharsets.UTF_8.toString());
+ response.getWriter().print(string);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * 是否是Ajax异步请求
+ *
+ * @param request
+ */
+ public static boolean isAjaxRequest(HttpServletRequest request) {
+
+ String accept = request.getHeader("accept");
+ if (accept != null && accept.indexOf("application/json") != -1) {
+ return true;
+ }
+
+ String xRequestedWith = request.getHeader("X-Requested-With");
+ if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1) {
+ return true;
+ }
+
+ String uri = request.getRequestURI();
+ if (StringUtils.equalsAnyIgnoreCase(uri, ".json", ".xml")) {
+ return true;
+ }
+
+ String ajax = request.getParameter("__ajax");
+ if (StringUtils.equalsAnyIgnoreCase(ajax, "json", "xml")) {
+ return true;
+ }
+ return false;
+ }
+
+ public static String getClientIP() {
+ return getClientIP(getRequest());
+ }
+
+ /**
+ * 内容编码
+ *
+ * @param str 内容
+ * @return 编码后的内容
+ */
+ public static String urlEncode(String str) {
+ try {
+ return URLEncoder.encode(str, Constants.UTF8);
+ } catch (UnsupportedEncodingException e) {
+ return StringUtils.EMPTY;
+ }
+ }
+
+ /**
+ * 内容解码
+ *
+ * @param str 内容
+ * @return 解码后的内容
+ */
+ public static String urlDecode(String str) {
+ try {
+ return URLDecoder.decode(str, Constants.UTF8);
+ } catch (UnsupportedEncodingException e) {
+ return StringUtils.EMPTY;
+ }
+ }
+
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java
index a6f06a312..80f70e084 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java
@@ -2,15 +2,15 @@ package com.ruoyi.common.core.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Validator;
-import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.util.ArrayUtil;
-import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.util.AntPathMatcher;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
/**
* 字符串工具类
@@ -20,16 +20,6 @@ import java.util.*;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class StringUtils extends org.apache.commons.lang3.StringUtils {
- /**
- * 获取参数不为空值
- *
- * @param value defaultValue 要判断的value
- * @return value 返回值
- */
- public static T nvl(T value, T defaultValue) {
- return ObjectUtil.defaultIfNull(value, defaultValue);
- }
-
/**
* 获取参数不为空值
*
@@ -40,86 +30,6 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
return StrUtil.blankToDefault(str, defaultValue);
}
- /**
- * * 判断一个Collection是否为空, 包含List,Set,Queue
- *
- * @param coll 要判断的Collection
- * @return true:为空 false:非空
- */
- public static boolean isEmpty(Collection> coll) {
- return CollUtil.isEmpty(coll);
- }
-
- /**
- * * 判断一个Collection是否非空,包含List,Set,Queue
- *
- * @param coll 要判断的Collection
- * @return true:非空 false:空
- */
- public static boolean isNotEmpty(Collection> coll) {
- return !isEmpty(coll);
- }
-
- /**
- * * 判断一个对象数组是否为空
- *
- * @param objects 要判断的对象数组
- * * @return true:为空 false:非空
- */
- public static boolean isEmpty(Object[] objects) {
- return ArrayUtil.isEmpty(objects);
- }
-
- /**
- * * 判断一个对象数组是否非空
- *
- * @param objects 要判断的对象数组
- * @return true:非空 false:空
- */
- public static boolean isNotEmpty(Object[] objects) {
- return !isEmpty(objects);
- }
-
- /**
- * * 判断一个对象是否为空
- *
- * @param object 要判断的对象数组
- * * @return true:为空 false:非空
- */
- public static boolean isEmpty(Object object) {
- return ObjectUtil.isEmpty(object);
- }
-
- /**
- * * 判断一个对象是否非空
- *
- * @param object 要判断的对象数组
- * @return true:非空 false:空
- */
- public static boolean isNotEmpty(Object object) {
- return !isEmpty(object);
- }
-
- /**
- * * 判断一个Map是否为空
- *
- * @param map 要判断的Map
- * @return true:为空 false:非空
- */
- public static boolean isEmpty(Map, ?> map) {
- return MapUtil.isEmpty(map);
- }
-
- /**
- * * 判断一个Map是否为空
- *
- * @param map 要判断的Map
- * @return true:非空 false:空
- */
- public static boolean isNotEmpty(Map, ?> map) {
- return !isEmpty(map);
- }
-
/**
* * 判断一个字符串是否为空串
*
@@ -140,36 +50,6 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
return !isEmpty(str);
}
- /**
- * * 判断一个对象是否为空
- *
- * @param object Object
- * @return true:为空 false:非空
- */
- public static boolean isNull(Object object) {
- return ObjectUtil.isNull(object);
- }
-
- /**
- * * 判断一个对象是否非空
- *
- * @param object Object
- * @return true:非空 false:空
- */
- public static boolean isNotNull(Object object) {
- return !isNull(object);
- }
-
- /**
- * * 判断一个对象是否是数组类型(Java基本型别的数组)
- *
- * @param object 对象
- * @return true:是数组 false:不是数组
- */
- public static boolean isArray(Object object) {
- return ArrayUtil.isArray(object);
- }
-
/**
* 去空格
*/
@@ -325,7 +205,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
* @return 是否匹配
*/
public static boolean matches(String str, List strs) {
- if (isEmpty(str) || isEmpty(strs)) {
+ if (isEmpty(str) || CollUtil.isEmpty(strs)) {
return false;
}
for (String pattern : strs) {
@@ -355,4 +235,4 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
public static T cast(Object obj) {
return (T) obj;
}
-}
\ No newline at end of file
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/TreeBuildUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/TreeBuildUtils.java
new file mode 100644
index 000000000..5aee557bb
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/TreeBuildUtils.java
@@ -0,0 +1,29 @@
+package com.ruoyi.common.core.utils;
+
+import cn.hutool.core.lang.tree.Tree;
+import cn.hutool.core.lang.tree.TreeNodeConfig;
+import cn.hutool.core.lang.tree.TreeUtil;
+import cn.hutool.core.lang.tree.parser.NodeParser;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * 扩展 hutool TreeUtil 封装系统树构建
+ *
+ * @author Lion Li
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class TreeBuildUtils extends TreeUtil {
+
+ /**
+ * 根据前端定制差异化字段
+ */
+ public static final TreeNodeConfig DEFAULT_CONFIG = TreeNodeConfig.DEFAULT_CONFIG.setNameKey("label");
+
+ public static List> build(List list, Long parentId, NodeParser nodeParser) {
+ return TreeUtil.build(list, parentId, DEFAULT_CONFIG, nodeParser);
+ }
+
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ValidatorUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ValidatorUtils.java
new file mode 100644
index 000000000..8ba84da05
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ValidatorUtils.java
@@ -0,0 +1,28 @@
+package com.ruoyi.common.core.utils;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.ConstraintViolationException;
+import javax.validation.Validator;
+import java.util.Set;
+
+/**
+ * Validator 校验框架工具
+ *
+ * @author Lion Li
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class ValidatorUtils {
+
+ private static final Validator VALID = SpringUtils.getBean(Validator.class);
+
+ public static void validate(T object, Class>... groups) {
+ Set> validate = VALID.validate(object, groups);
+ if (!validate.isEmpty()) {
+ throw new ConstraintViolationException("参数校验异常", validate);
+ }
+ }
+
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanUtils.java
deleted file mode 100644
index 85ff99fea..000000000
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanUtils.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package com.ruoyi.common.core.utils.bean;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Bean 工具类
- *
- * @author ruoyi
- */
-public class BeanUtils extends org.springframework.beans.BeanUtils {
- /**
- * Bean方法名中属性名开始的下标
- */
- private static final int BEAN_METHOD_PROP_INDEX = 3;
-
- /**
- * 匹配getter方法的正则表达式
- */
- private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)");
-
- /**
- * 匹配setter方法的正则表达式
- */
- private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)");
-
- /**
- * Bean属性复制工具方法。
- *
- * @param dest 目标对象
- * @param src 源对象
- */
- public static void copyBeanProp(Object dest, Object src) {
- try {
- copyProperties(src, dest);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- /**
- * 获取对象的setter方法。
- *
- * @param obj 对象
- * @return 对象的setter方法列表
- */
- public static List getSetterMethods(Object obj) {
- // setter方法列表
- List setterMethods = new ArrayList();
-
- // 获取所有方法
- Method[] methods = obj.getClass().getMethods();
-
- // 查找setter方法
-
- for (Method method : methods) {
- Matcher m = SET_PATTERN.matcher(method.getName());
- if (m.matches() && (method.getParameterTypes().length == 1)) {
- setterMethods.add(method);
- }
- }
- // 返回setter方法列表
- return setterMethods;
- }
-
- /**
- * 获取对象的getter方法。
- *
- * @param obj 对象
- * @return 对象的getter方法列表
- */
-
- public static List getGetterMethods(Object obj) {
- // getter方法列表
- List getterMethods = new ArrayList();
- // 获取所有方法
- Method[] methods = obj.getClass().getMethods();
- // 查找getter方法
- for (Method method : methods) {
- Matcher m = GET_PATTERN.matcher(method.getName());
- if (m.matches() && (method.getParameterTypes().length == 0)) {
- getterMethods.add(method);
- }
- }
- // 返回getter方法列表
- return getterMethods;
- }
-
- /**
- * 检查Bean方法名中的属性名是否相等。
- * 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。
- *
- * @param m1 方法名1
- * @param m2 方法名2
- * @return 属性名一样返回true,否则返回false
- */
-
- public static boolean isMethodPropEquals(String m1, String m2) {
- return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX));
- }
-}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanValidators.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanValidators.java
deleted file mode 100644
index 98d304874..000000000
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanValidators.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.ruoyi.common.core.utils.bean;
-
-import javax.validation.ConstraintViolation;
-import javax.validation.ConstraintViolationException;
-import javax.validation.Validator;
-import java.util.Set;
-
-/**
- * bean对象属性验证
- *
- * @author ruoyi
- */
-public class BeanValidators {
- public static void validateWithException(Validator validator, Object object, Class>... groups)
- throws ConstraintViolationException {
- Set> constraintViolations = validator.validate(object, groups);
- if (!constraintViolations.isEmpty()) {
- throw new ConstraintViolationException(constraintViolations);
- }
- }
-}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUtils.java
index 92b857916..a0af569dc 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUtils.java
@@ -1,221 +1,54 @@
-package com.ruoyi.common.core.utils.file;
-
-import com.ruoyi.common.core.utils.StringUtils;
-import org.apache.commons.lang3.ArrayUtils;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.*;
-import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
-
-/**
- * 文件处理工具类
- *
- * @author ruoyi
- */
-public class FileUtils {
- /**
- * 字符常量:斜杠 {@code '/'}
- */
- public static final char SLASH = '/';
-
- /**
- * 字符常量:反斜杠 {@code '\\'}
- */
- public static final char BACKSLASH = '\\';
-
- public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+";
-
- /**
- * 输出指定文件的byte数组
- *
- * @param filePath 文件路径
- * @param os 输出流
- * @return
- */
- public static void writeBytes(String filePath, OutputStream os) throws IOException {
- FileInputStream fis = null;
- try {
- File file = new File(filePath);
- if (!file.exists()) {
- throw new FileNotFoundException(filePath);
- }
- fis = new FileInputStream(file);
- byte[] b = new byte[1024];
- int length;
- while ((length = fis.read(b)) > 0) {
- os.write(b, 0, length);
- }
- } catch (IOException e) {
- throw e;
- } finally {
- if (os != null) {
- try {
- os.close();
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- }
- if (fis != null) {
- try {
- fis.close();
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- }
- }
- }
-
- /**
- * 删除文件
- *
- * @param filePath 文件
- * @return
- */
- public static boolean deleteFile(String filePath) {
- boolean flag = false;
- File file = new File(filePath);
- // 路径为文件且不为空则进行删除
- if (file.isFile() && file.exists()) {
- file.delete();
- flag = true;
- }
- return flag;
- }
-
- /**
- * 文件名称验证
- *
- * @param filename 文件名称
- * @return true 正常 false 非法
- */
- public static boolean isValidFilename(String filename) {
- return filename.matches(FILENAME_PATTERN);
- }
-
- /**
- * 检查文件是否可下载
- *
- * @param resource 需要下载的文件
- * @return true 正常 false 非法
- */
- public static boolean checkAllowDownload(String resource) {
- // 禁止目录上跳级别
- if (StringUtils.contains(resource, "..")) {
- return false;
- }
-
- // 检查允许下载的文件规则
- if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource))) {
- return true;
- }
-
- // 不在允许下载的文件规则
- return false;
- }
-
- /**
- * 下载文件名重新编码
- *
- * @param request 请求对象
- * @param fileName 文件名
- * @return 编码后的文件名
- */
- public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException {
- final String agent = request.getHeader("USER-AGENT");
- String filename = fileName;
- if (agent.contains("MSIE")) {
- // IE浏览器
- filename = URLEncoder.encode(filename, "utf-8");
- filename = filename.replace("+", " ");
- } else if (agent.contains("Firefox")) {
- // 火狐浏览器
- filename = new String(fileName.getBytes(), "ISO8859-1");
- } else if (agent.contains("Chrome")) {
- // google浏览器
- filename = URLEncoder.encode(filename, "utf-8");
- } else {
- // 其它浏览器
- filename = URLEncoder.encode(filename, "utf-8");
- }
- return filename;
- }
-
- /**
- * 返回文件名
- *
- * @param filePath 文件
- * @return 文件名
- */
- public static String getName(String filePath) {
- if (null == filePath) {
- return null;
- }
- int len = filePath.length();
- if (0 == len) {
- return filePath;
- }
- if (isFileSeparator(filePath.charAt(len - 1))) {
- // 以分隔符结尾的去掉结尾分隔符
- len--;
- }
-
- int begin = 0;
- char c;
- for (int i = len - 1; i > -1; i--) {
- c = filePath.charAt(i);
- if (isFileSeparator(c)) {
- // 查找最后一个路径分隔符(/或者\)
- begin = i + 1;
- break;
- }
- }
-
- return filePath.substring(begin, len);
- }
-
- /**
- * 是否为Windows或者Linux(Unix)文件分隔符
- * Windows平台下分隔符为\,Linux(Unix)为/
- *
- * @param c 字符
- * @return 是否为Windows或者Linux(Unix)文件分隔符
- */
- public static boolean isFileSeparator(char c) {
- return SLASH == c || BACKSLASH == c;
- }
-
- /**
- * 下载文件名重新编码
- *
- * @param response 响应对象
- * @param realFileName 真实文件名
- * @return
- */
- public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException {
- String percentEncodedFileName = percentEncode(realFileName);
-
- StringBuilder contentDispositionValue = new StringBuilder();
- contentDispositionValue.append("attachment; filename=")
- .append(percentEncodedFileName)
- .append(";")
- .append("filename*=")
- .append("utf-8''")
- .append(percentEncodedFileName);
-
- response.setHeader("Content-disposition", contentDispositionValue.toString());
- response.setHeader("download-filename", percentEncodedFileName);
- }
-
- /**
- * 百分号编码工具方法
- *
- * @param s 需要百分号编码的字符串
- * @return 百分号编码后的字符串
- */
- public static String percentEncode(String s) throws UnsupportedEncodingException {
- String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString());
- return encode.replaceAll("\\+", "%20");
- }
-}
+package com.ruoyi.common.core.utils.file;
+
+import cn.hutool.core.io.FileUtil;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 文件处理工具类
+ *
+ * @author Lion Li
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class FileUtils extends FileUtil {
+
+ /**
+ * 下载文件名重新编码
+ *
+ * @param response 响应对象
+ * @param realFileName 真实文件名
+ * @return
+ */
+ public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException {
+ String percentEncodedFileName = percentEncode(realFileName);
+
+ StringBuilder contentDispositionValue = new StringBuilder();
+ contentDispositionValue.append("attachment; filename=")
+ .append(percentEncodedFileName)
+ .append(";")
+ .append("filename*=")
+ .append("utf-8''")
+ .append(percentEncodedFileName);
+
+ response.addHeader("Access-Control-Allow-Origin", "*");
+ response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename");
+ response.setHeader("Content-disposition", contentDispositionValue.toString());
+ response.setHeader("download-filename", percentEncodedFileName);
+ }
+
+ /**
+ * 百分号编码工具方法
+ *
+ * @param s 需要百分号编码的字符串
+ * @return 百分号编码后的字符串
+ */
+ public static String percentEncode(String s) throws UnsupportedEncodingException {
+ String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString());
+ return encode.replaceAll("\\+", "%20");
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/ImageUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/ImageUtils.java
index c01eb0bb2..ce00f5054 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/ImageUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/ImageUtils.java
@@ -1,71 +1,71 @@
-package com.ruoyi.common.core.utils.file;
-
-import org.apache.poi.util.IOUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.Arrays;
-
-/**
- * 图片处理工具类
- *
- * @author ruoyi
- */
-public class ImageUtils {
- private static final Logger log = LoggerFactory.getLogger(ImageUtils.class);
-
- public static byte[] getImage(String imagePath) {
- InputStream is = getFile(imagePath);
- try {
- return IOUtils.toByteArray(is);
- } catch (Exception e) {
- log.error("图片加载异常 {}", e);
- return null;
- } finally {
- IOUtils.closeQuietly(is);
- }
- }
-
- public static InputStream getFile(String imagePath) {
- try {
- byte[] result = readFile(imagePath);
- result = Arrays.copyOf(result, result.length);
- return new ByteArrayInputStream(result);
- } catch (Exception e) {
- log.error("获取图片异常 {}", e);
- }
- return null;
- }
-
- /**
- * 读取文件为字节数据
- *
- * @param key 地址
- * @return 字节数据
- */
- public static byte[] readFile(String url) {
- InputStream in = null;
- ByteArrayOutputStream baos = null;
- try {
- // 网络地址
- URL urlObj = new URL(url);
- URLConnection urlConnection = urlObj.openConnection();
- urlConnection.setConnectTimeout(30 * 1000);
- urlConnection.setReadTimeout(60 * 1000);
- urlConnection.setDoInput(true);
- in = urlConnection.getInputStream();
- return IOUtils.toByteArray(in);
- } catch (Exception e) {
- log.error("访问文件异常 {}", e);
- return null;
- } finally {
- IOUtils.closeQuietly(in);
- IOUtils.closeQuietly(baos);
- }
- }
-}
+package com.ruoyi.common.core.utils.file;
+
+import org.apache.commons.io.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Arrays;
+
+/**
+ * 图片处理工具类
+ *
+ * @author ruoyi
+ */
+public class ImageUtils {
+ private static final Logger log = LoggerFactory.getLogger(ImageUtils.class);
+
+ public static byte[] getImage(String imagePath) {
+ InputStream is = getFile(imagePath);
+ try {
+ return IOUtils.toByteArray(is);
+ } catch (Exception e) {
+ log.error("图片加载异常 {}", e);
+ return null;
+ } finally {
+ IOUtils.closeQuietly(is);
+ }
+ }
+
+ public static InputStream getFile(String imagePath) {
+ try {
+ byte[] result = readFile(imagePath);
+ result = Arrays.copyOf(result, result.length);
+ return new ByteArrayInputStream(result);
+ } catch (Exception e) {
+ log.error("获取图片异常 {}", e);
+ }
+ return null;
+ }
+
+ /**
+ * 读取文件为字节数据
+ *
+ * @param key 地址
+ * @return 字节数据
+ */
+ public static byte[] readFile(String url) {
+ InputStream in = null;
+ ByteArrayOutputStream baos = null;
+ try {
+ // 网络地址
+ URL urlObj = new URL(url);
+ URLConnection urlConnection = urlObj.openConnection();
+ urlConnection.setConnectTimeout(30 * 1000);
+ urlConnection.setReadTimeout(60 * 1000);
+ urlConnection.setDoInput(true);
+ in = urlConnection.getInputStream();
+ return IOUtils.toByteArray(in);
+ } catch (Exception e) {
+ log.error("访问文件异常 {}", e);
+ return null;
+ } finally {
+ IOUtils.closeQuietly(in);
+ IOUtils.closeQuietly(baos);
+ }
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java
deleted file mode 100644
index 1f30a9246..000000000
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java
+++ /dev/null
@@ -1,179 +0,0 @@
-package com.ruoyi.common.core.utils.ip;
-
-import com.ruoyi.common.core.utils.StringUtils;
-
-import javax.servlet.http.HttpServletRequest;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-/**
- * 获取IP方法
- *
- * @author ruoyi
- */
-public class IpUtils {
- public static String getIpAddr(HttpServletRequest request) {
- if (request == null) {
- return null;
- }
-
- String ip = null;
-
- // X-Forwarded-For:Squid 服务代理
- String ipAddresses = request.getHeader("X-Forwarded-For");
- if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
- // Proxy-Client-IP:apache 服务代理
- ipAddresses = request.getHeader("Proxy-Client-IP");
- }
- if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
- // WL-Proxy-Client-IP:weblogic 服务代理
- ipAddresses = request.getHeader("WL-Proxy-Client-IP");
- }
- if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
- // HTTP_CLIENT_IP:有些代理服务器
- ipAddresses = request.getHeader("HTTP_CLIENT_IP");
- }
- if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
- // X-Real-IP:nginx服务代理
- ipAddresses = request.getHeader("X-Real-IP");
- }
-
- // 有些网络通过多层代理,那么获取到的ip就会有多个,一般都是通过逗号(,)分割开来,并且第一个ip为客户端的真实IP
- if (ipAddresses != null && ipAddresses.length() != 0) {
- ip = ipAddresses.split(",")[0];
- }
-
- // 还是不能获取到,最后再通过request.getRemoteAddr();获取
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
- ip = request.getRemoteAddr();
- }
- return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;
- }
-
- public static boolean internalIp(String ip) {
- byte[] addr = textToNumericFormatV4(ip);
- return internalIp(addr) || "127.0.0.1".equals(ip);
- }
-
- private static boolean internalIp(byte[] addr) {
- if (StringUtils.isNull(addr) || addr.length < 2) {
- return true;
- }
- final byte b0 = addr[0];
- final byte b1 = addr[1];
- // 10.x.x.x/8
- final byte SECTION_1 = 0x0A;
- // 172.16.x.x/12
- final byte SECTION_2 = (byte) 0xAC;
- final byte SECTION_3 = (byte) 0x10;
- final byte SECTION_4 = (byte) 0x1F;
- // 192.168.x.x/16
- final byte SECTION_5 = (byte) 0xC0;
- final byte SECTION_6 = (byte) 0xA8;
- switch (b0) {
- case SECTION_1:
- return true;
- case SECTION_2:
- if (b1 >= SECTION_3 && b1 <= SECTION_4) {
- return true;
- }
- case SECTION_5:
- switch (b1) {
- case SECTION_6:
- return true;
- }
- default:
- return false;
- }
- }
-
- /**
- * 将IPv4地址转换成字节
- *
- * @param text IPv4地址
- * @return byte 字节
- */
- public static byte[] textToNumericFormatV4(String text) {
- if (text.length() == 0) {
- return null;
- }
-
- byte[] bytes = new byte[4];
- String[] elements = text.split("\\.", -1);
- try {
- long l;
- int i;
- switch (elements.length) {
- case 1:
- l = Long.parseLong(elements[0]);
- if ((l < 0L) || (l > 4294967295L)) {
- return null;
- }
- bytes[0] = (byte) (int) (l >> 24 & 0xFF);
- bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);
- bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
- bytes[3] = (byte) (int) (l & 0xFF);
- break;
- case 2:
- l = Integer.parseInt(elements[0]);
- if ((l < 0L) || (l > 255L)) {
- return null;
- }
- bytes[0] = (byte) (int) (l & 0xFF);
- l = Integer.parseInt(elements[1]);
- if ((l < 0L) || (l > 16777215L)) {
- return null;
- }
- bytes[1] = (byte) (int) (l >> 16 & 0xFF);
- bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
- bytes[3] = (byte) (int) (l & 0xFF);
- break;
- case 3:
- for (i = 0; i < 2; ++i) {
- l = Integer.parseInt(elements[i]);
- if ((l < 0L) || (l > 255L)) {
- return null;
- }
- bytes[i] = (byte) (int) (l & 0xFF);
- }
- l = Integer.parseInt(elements[2]);
- if ((l < 0L) || (l > 65535L)) {
- return null;
- }
- bytes[2] = (byte) (int) (l >> 8 & 0xFF);
- bytes[3] = (byte) (int) (l & 0xFF);
- break;
- case 4:
- for (i = 0; i < 4; ++i) {
- l = Integer.parseInt(elements[i]);
- if ((l < 0L) || (l > 255L)) {
- return null;
- }
- bytes[i] = (byte) (int) (l & 0xFF);
- }
- break;
- default:
- return null;
- }
- } catch (NumberFormatException e) {
- return null;
- }
- return bytes;
- }
-
- public static String getHostIp() {
- try {
- return InetAddress.getLocalHost().getHostAddress();
- } catch (UnknownHostException e) {
- }
- return "127.0.0.1";
- }
-
- public static String getHostName() {
- try {
- return InetAddress.getLocalHost().getHostName();
- } catch (UnknownHostException e) {
- }
- return "未知";
- }
-}
\ No newline at end of file
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelHandlerAdapter.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelHandlerAdapter.java
deleted file mode 100644
index eef3b014a..000000000
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelHandlerAdapter.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.ruoyi.common.core.utils.poi;
-
-/**
- * Excel数据格式处理适配器
- *
- * @author ruoyi
- */
-public interface ExcelHandlerAdapter {
- /**
- * 格式化
- *
- * @param value 单元格数据值
- * @param args excel注解args参数组
- * @return 处理后的值
- */
- Object format(Object value, String[] args);
-}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java
deleted file mode 100644
index a83ee4dc7..000000000
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java
+++ /dev/null
@@ -1,944 +0,0 @@
-package com.ruoyi.common.core.utils.poi;
-
-import cn.hutool.core.convert.Convert;
-import com.ruoyi.common.core.annotation.Excel;
-import com.ruoyi.common.core.annotation.Excel.ColumnType;
-import com.ruoyi.common.core.annotation.Excel.Type;
-import com.ruoyi.common.core.annotation.Excels;
-import com.ruoyi.common.core.utils.DateUtils;
-import com.ruoyi.common.core.utils.StringUtils;
-import com.ruoyi.common.core.utils.file.FileTypeUtils;
-import com.ruoyi.common.core.utils.file.ImageUtils;
-import com.ruoyi.common.core.utils.reflect.ReflectUtils;
-import org.apache.poi.ss.usermodel.*;
-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 javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.math.BigDecimal;
-import java.text.DecimalFormat;
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * Excel相关处理
- *
- * @author ruoyi
- */
-public class ExcelUtil {
- private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class);
-
- /**
- * Excel sheet最大行数,默认65536
- */
- public static final int sheetSize = 65536;
-
- /**
- * 工作表名称
- */
- private String sheetName;
-
- /**
- * 导出类型(EXPORT:导出数据;IMPORT:导入模板)
- */
- private Type type;
-
- /**
- * 工作薄对象
- */
- private Workbook wb;
-
- /**
- * 工作表对象
- */
- private Sheet sheet;
-
- /**
- * 样式列表
- */
- private Map styles;
-
- /**
- * 导入导出数据列表
- */
- private List list;
-
- /**
- * 注解列表
- */
- private List
de.javakaffee
kryo-serializers
- 0.45
+ 0.43
diff --git a/ruoyi-common/ruoyi-common-security/pom.xml b/ruoyi-common/ruoyi-common-security/pom.xml
index 9a375d588..560d2154b 100644
--- a/ruoyi-common/ruoyi-common-security/pom.xml
+++ b/ruoyi-common/ruoyi-common-security/pom.xml
@@ -1,45 +1,46 @@
-
-
-
- com.ruoyi
- ruoyi-common
- 0.3.0
-
- 4.0.0
-
- ruoyi-common-security
-
-
- ruoyi-common-security安全模块
-
-
-
-
-
-
- org.springframework
- spring-webmvc
-
-
-
-
- com.ruoyi
- ruoyi-api-system
-
-
-
-
- com.ruoyi
- ruoyi-common-redis
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ com.ruoyi
+ ruoyi-common
+ 0.3.0
+
+ 4.0.0
+
+ ruoyi-common-security
+
+
+ ruoyi-common-security安全模块
+
+
+
+
+
+
+ org.springframework
+ spring-webmvc
+
+
+
+
+ com.ruoyi
+ ruoyi-api-system
+ ${project.version}
+
+
+
+
+ com.ruoyi
+ ruoyi-common-redis
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/handler/GlobalExceptionHandler.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/handler/GlobalExceptionHandler.java
index 005b71f43..83a8a2433 100644
--- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/handler/GlobalExceptionHandler.java
+++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/handler/GlobalExceptionHandler.java
@@ -1,125 +1,125 @@
-package com.ruoyi.common.security.handler;
-
-import com.ruoyi.common.core.constant.HttpStatus;
-import com.ruoyi.common.core.exception.DemoModeException;
-import com.ruoyi.common.core.exception.InnerAuthException;
-import com.ruoyi.common.core.exception.ServiceException;
-import com.ruoyi.common.core.exception.auth.NotPermissionException;
-import com.ruoyi.common.core.exception.auth.NotRoleException;
-import com.ruoyi.common.core.utils.StringUtils;
-import com.ruoyi.common.core.web.domain.AjaxResult;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.validation.BindException;
-import org.springframework.web.HttpRequestMethodNotSupportedException;
-import org.springframework.web.bind.MethodArgumentNotValidException;
-import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.bind.annotation.RestControllerAdvice;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * 全局异常处理器
- *
- * @author ruoyi
- */
-@Slf4j
-@RestControllerAdvice
-public class GlobalExceptionHandler {
-
- /**
- * 权限码异常
- */
- @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(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("演示模式,不允许操作");
- }
-}
+package com.ruoyi.common.security.handler;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.common.core.constant.HttpStatus;
+import com.ruoyi.common.core.exception.DemoModeException;
+import com.ruoyi.common.core.exception.InnerAuthException;
+import com.ruoyi.common.core.exception.ServiceException;
+import com.ruoyi.common.core.exception.auth.NotPermissionException;
+import com.ruoyi.common.core.exception.auth.NotRoleException;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.BindException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 全局异常处理器
+ *
+ * @author ruoyi
+ */
+@Slf4j
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+
+ /**
+ * 权限码异常
+ */
+ @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 ObjectUtil.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage());
+ }
+
+ /**
+ * 拦截未知的运行时异常
+ */
+ @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("演示模式,不允许操作");
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/interceptor/HeaderInterceptor.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/interceptor/HeaderInterceptor.java
index 608b4bfa0..854cc5a08 100644
--- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/interceptor/HeaderInterceptor.java
+++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/interceptor/HeaderInterceptor.java
@@ -1,49 +1,50 @@
-package com.ruoyi.common.security.interceptor;
-
-import com.ruoyi.common.core.constant.SecurityConstants;
-import com.ruoyi.common.core.context.SecurityContextHolder;
-import com.ruoyi.common.core.utils.ServletUtils;
-import com.ruoyi.common.core.utils.StringUtils;
-import com.ruoyi.common.security.auth.AuthUtil;
-import com.ruoyi.common.security.utils.SecurityUtils;
-import com.ruoyi.system.api.model.LoginUser;
-import org.springframework.web.method.HandlerMethod;
-import org.springframework.web.servlet.AsyncHandlerInterceptor;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * 自定义请求头拦截器,将Header数据封装到线程变量中方便获取
- * 注意:此拦截器会同时验证当前用户有效期自动刷新有效期
- *
- * @author ruoyi
- */
-public class HeaderInterceptor implements AsyncHandlerInterceptor {
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- if (!(handler instanceof HandlerMethod)) {
- return true;
- }
-
- SecurityContextHolder.setUserId(ServletUtils.getHeader(request, SecurityConstants.DETAILS_USER_ID));
- SecurityContextHolder.setUserName(ServletUtils.getHeader(request, SecurityConstants.DETAILS_USERNAME));
- SecurityContextHolder.setUserKey(ServletUtils.getHeader(request, SecurityConstants.USER_KEY));
-
- String token = SecurityUtils.getToken();
- if (StringUtils.isNotEmpty(token)) {
- LoginUser loginUser = AuthUtil.getLoginUser(token);
- if (StringUtils.isNotNull(loginUser)) {
- AuthUtil.verifyLoginUserExpire(loginUser);
- SecurityContextHolder.set(SecurityConstants.LOGIN_USER, loginUser);
- }
- }
- return true;
- }
-
- @Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
- throws Exception {
- SecurityContextHolder.remove();
- }
-}
+package com.ruoyi.common.security.interceptor;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.common.core.constant.SecurityConstants;
+import com.ruoyi.common.core.context.SecurityContextHolder;
+import com.ruoyi.common.core.utils.ServletUtils;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.security.auth.AuthUtil;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.system.api.model.LoginUser;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.AsyncHandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 自定义请求头拦截器,将Header数据封装到线程变量中方便获取
+ * 注意:此拦截器会同时验证当前用户有效期自动刷新有效期
+ *
+ * @author ruoyi
+ */
+public class HeaderInterceptor implements AsyncHandlerInterceptor {
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+ if (!(handler instanceof HandlerMethod)) {
+ return true;
+ }
+
+ SecurityContextHolder.setUserId(ServletUtils.getHeader(request, SecurityConstants.DETAILS_USER_ID));
+ SecurityContextHolder.setUserName(ServletUtils.getHeader(request, SecurityConstants.DETAILS_USERNAME));
+ SecurityContextHolder.setUserKey(ServletUtils.getHeader(request, SecurityConstants.USER_KEY));
+
+ String token = SecurityUtils.getToken();
+ if (StringUtils.isNotEmpty(token)) {
+ LoginUser loginUser = AuthUtil.getLoginUser(token);
+ if (ObjectUtil.isNotNull(loginUser)) {
+ AuthUtil.verifyLoginUserExpire(loginUser);
+ SecurityContextHolder.set(SecurityConstants.LOGIN_USER, loginUser);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
+ throws Exception {
+ SecurityContextHolder.remove();
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
index 588052659..431a6ee0f 100644
--- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
+++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
@@ -1,12 +1,12 @@
package com.ruoyi.common.security.service;
import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.core.constant.CacheConstants;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.utils.JwtUtils;
import com.ruoyi.common.core.utils.ServletUtils;
import com.ruoyi.common.core.utils.StringUtils;
-import com.ruoyi.common.core.utils.ip.IpUtils;
import com.ruoyi.common.redis.utils.RedisUtils;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.system.api.model.LoginUser;
@@ -45,7 +45,7 @@ public class TokenService {
loginUser.setToken(token);
loginUser.setUserid(userId);
loginUser.setUsername(userName);
- loginUser.setIpaddr(IpUtils.getIpAddr(ServletUtils.getRequest()));
+ loginUser.setIpaddr(ServletUtils.getClientIP());
refreshToken(loginUser);
// Jwt存储信息
@@ -103,7 +103,7 @@ public class TokenService {
* 设置用户身份信息
*/
public void setLoginUser(LoginUser loginUser) {
- if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) {
+ if (ObjectUtil.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) {
refreshToken(loginUser);
}
}
@@ -147,4 +147,4 @@ public class TokenService {
private String getTokenKey(String token) {
return ACCESS_TOKEN + token;
}
-}
\ No newline at end of file
+}
diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/GenTableServiceImpl.java
index 362474ef8..3a0be83c6 100644
--- a/ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/GenTableServiceImpl.java
+++ b/ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/GenTableServiceImpl.java
@@ -1,5 +1,7 @@
package com.ruoyi.gen.service;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.constant.GenConstants;
import com.ruoyi.common.core.exception.ServiceException;
@@ -261,7 +263,7 @@ public class GenTableServiceImpl implements IGenTableService {
Map tableColumnMap = tableColumns.stream().collect(Collectors.toMap(GenTableColumn::getColumnName, Function.identity()));
List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName);
- if (StringUtils.isEmpty(dbTableColumns)) {
+ if (CollUtil.isEmpty(dbTableColumns)) {
throw new ServiceException("同步数据失败,原表结构不存在");
}
List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList());
@@ -282,7 +284,7 @@ public class GenTableServiceImpl implements IGenTableService {
});
List delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList());
- if (StringUtils.isNotEmpty(delColumns)) {
+ if (CollUtil.isNotEmpty(delColumns)) {
genTableColumnMapper.deleteGenTableColumns(delColumns);
}
}
@@ -377,7 +379,7 @@ public class GenTableServiceImpl implements IGenTableService {
break;
}
}
- if (StringUtils.isNull(table.getPkColumn())) {
+ if (ObjectUtil.isNull(table.getPkColumn())) {
table.setPkColumn(table.getColumns().get(0));
}
if (GenConstants.TPL_SUB.equals(table.getTplCategory())) {
@@ -387,7 +389,7 @@ public class GenTableServiceImpl implements IGenTableService {
break;
}
}
- if (StringUtils.isNull(table.getSubTable().getPkColumn())) {
+ if (ObjectUtil.isNull(table.getSubTable().getPkColumn())) {
table.getSubTable().setPkColumn(table.getSubTable().getColumns().get(0));
}
}
@@ -412,7 +414,7 @@ public class GenTableServiceImpl implements IGenTableService {
*/
public void setTableFromOptions(GenTable genTable) {
Map paramsObj = JsonUtils.parseMap(genTable.getOptions());
- if (StringUtils.isNotNull(paramsObj)) {
+ if (ObjectUtil.isNotNull(paramsObj)) {
String treeCode = paramsObj.get(GenConstants.TREE_CODE);
String treeParentCode = paramsObj.get(GenConstants.TREE_PARENT_CODE);
String treeName = paramsObj.get(GenConstants.TREE_NAME);
diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityUtils.java b/ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityUtils.java
index 2d733364b..c8fd1a451 100644
--- a/ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityUtils.java
+++ b/ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityUtils.java
@@ -1,330 +1,332 @@
-package com.ruoyi.gen.util;
-
-import com.ruoyi.common.core.constant.GenConstants;
-import com.ruoyi.common.core.utils.DateUtils;
-import com.ruoyi.common.core.utils.JsonUtils;
-import com.ruoyi.common.core.utils.StringUtils;
-import com.ruoyi.gen.domain.GenTable;
-import com.ruoyi.gen.domain.GenTableColumn;
-import org.apache.velocity.VelocityContext;
-
-import java.util.*;
-
-/**
- * 模板工具类
- *
- * @author ruoyi
- */
-public class VelocityUtils {
- /**
- * 项目空间路径
- */
- private static final String PROJECT_PATH = "main/java";
-
- /**
- * mybatis空间路径
- */
- private static final String MYBATIS_PATH = "main/resources/mapper";
-
- /**
- * 默认上级菜单,系统工具
- */
- private static final String DEFAULT_PARENT_MENU_ID = "3";
-
- /**
- * 设置模板变量信息
- *
- * @return 模板列表
- */
- public static VelocityContext prepareContext(GenTable genTable) {
- String moduleName = genTable.getModuleName();
- String businessName = genTable.getBusinessName();
- String packageName = genTable.getPackageName();
- String tplCategory = genTable.getTplCategory();
- String functionName = genTable.getFunctionName();
-
- VelocityContext velocityContext = new VelocityContext();
- velocityContext.put("tplCategory", genTable.getTplCategory());
- velocityContext.put("tableName", genTable.getTableName());
- velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】");
- velocityContext.put("ClassName", genTable.getClassName());
- velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName()));
- velocityContext.put("moduleName", genTable.getModuleName());
- velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName()));
- velocityContext.put("businessName", genTable.getBusinessName());
- velocityContext.put("basePackage", getPackagePrefix(packageName));
- velocityContext.put("packageName", packageName);
- velocityContext.put("author", genTable.getFunctionAuthor());
- velocityContext.put("datetime", DateUtils.getDate());
- velocityContext.put("pkColumn", genTable.getPkColumn());
- velocityContext.put("importList", getImportList(genTable));
- velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName));
- velocityContext.put("columns", genTable.getColumns());
- velocityContext.put("table", genTable);
- velocityContext.put("dicts", getDicts(genTable));
- setMenuVelocityContext(velocityContext, genTable);
- if (GenConstants.TPL_TREE.equals(tplCategory)) {
- setTreeVelocityContext(velocityContext, genTable);
- }
- if (GenConstants.TPL_SUB.equals(tplCategory)) {
- setSubVelocityContext(velocityContext, genTable);
- }
- return velocityContext;
- }
-
- public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) {
- String options = genTable.getOptions();
- Map paramsObj = JsonUtils.parseMap(options);
- String parentMenuId = getParentMenuId(paramsObj);
- context.put("parentMenuId", parentMenuId);
- }
-
- public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) {
- String options = genTable.getOptions();
- Map paramsObj = JsonUtils.parseMap(options);
- String treeCode = getTreecode(paramsObj);
- String treeParentCode = getTreeParentCode(paramsObj);
- String treeName = getTreeName(paramsObj);
-
- context.put("treeCode", treeCode);
- context.put("treeParentCode", treeParentCode);
- context.put("treeName", treeName);
- context.put("expandColumn", getExpandColumn(genTable));
- if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) {
- context.put("tree_parent_code", paramsObj.get(GenConstants.TREE_PARENT_CODE));
- }
- if (paramsObj.containsKey(GenConstants.TREE_NAME)) {
- context.put("tree_name", paramsObj.get(GenConstants.TREE_NAME));
- }
- }
-
- public static void setSubVelocityContext(VelocityContext context, GenTable genTable) {
- GenTable subTable = genTable.getSubTable();
- String subTableName = genTable.getSubTableName();
- String subTableFkName = genTable.getSubTableFkName();
- String subClassName = genTable.getSubTable().getClassName();
- String subTableFkClassName = StringUtils.convertToCamelCase(subTableFkName);
-
- context.put("subTable", subTable);
- context.put("subTableName", subTableName);
- context.put("subTableFkName", subTableFkName);
- context.put("subTableFkClassName", subTableFkClassName);
- context.put("subTableFkclassName", StringUtils.uncapitalize(subTableFkClassName));
- context.put("subClassName", subClassName);
- context.put("subclassName", StringUtils.uncapitalize(subClassName));
- context.put("subImportList", getImportList(genTable.getSubTable()));
- }
-
- /**
- * 获取模板信息
- *
- * @return 模板列表
- */
- public static List getTemplateList(String tplCategory) {
- List templates = new ArrayList();
- templates.add("vm/java/domain.java.vm");
- templates.add("vm/java/mapper.java.vm");
- templates.add("vm/java/service.java.vm");
- templates.add("vm/java/serviceImpl.java.vm");
- templates.add("vm/java/controller.java.vm");
- templates.add("vm/xml/mapper.xml.vm");
- templates.add("vm/sql/sql.vm");
- templates.add("vm/js/api.js.vm");
- if (GenConstants.TPL_CRUD.equals(tplCategory)) {
- templates.add("vm/vue/index.vue.vm");
- } else if (GenConstants.TPL_TREE.equals(tplCategory)) {
- templates.add("vm/vue/index-tree.vue.vm");
- } else if (GenConstants.TPL_SUB.equals(tplCategory)) {
- templates.add("vm/vue/index.vue.vm");
- templates.add("vm/java/sub-domain.java.vm");
- }
- return templates;
- }
-
- /**
- * 获取文件名
- */
- public static String getFileName(String template, GenTable genTable) {
- // 文件名称
- String fileName = "";
- // 包路径
- String packageName = genTable.getPackageName();
- // 模块名
- String moduleName = genTable.getModuleName();
- // 大写类名
- String className = genTable.getClassName();
- // 业务名称
- String businessName = genTable.getBusinessName();
-
- String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/");
- String mybatisPath = MYBATIS_PATH + "/" + moduleName;
- String vuePath = "vue";
-
- if (template.contains("domain.java.vm")) {
- fileName = StringUtils.format("{}/domain/{}.java", javaPath, className);
- }
- if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) {
- fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName());
- } else if (template.contains("mapper.java.vm")) {
- fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className);
- } else if (template.contains("service.java.vm")) {
- fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className);
- } else if (template.contains("serviceImpl.java.vm")) {
- fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className);
- } else if (template.contains("controller.java.vm")) {
- fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className);
- } else if (template.contains("mapper.xml.vm")) {
- fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className);
- } else if (template.contains("sql.vm")) {
- fileName = businessName + "Menu.sql";
- } else if (template.contains("api.js.vm")) {
- fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName);
- } else if (template.contains("index.vue.vm")) {
- fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
- } else if (template.contains("index-tree.vue.vm")) {
- fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
- }
- return fileName;
- }
-
- /**
- * 获取包前缀
- *
- * @param packageName 包名称
- * @return 包前缀名称
- */
- public static String getPackagePrefix(String packageName) {
- int lastIndex = packageName.lastIndexOf(".");
- String basePackage = StringUtils.substring(packageName, 0, lastIndex);
- return basePackage;
- }
-
- /**
- * 根据列类型获取导入包
- *
- * @param genTable 业务表对象
- * @return 返回需要导入的包列表
- */
- public static HashSet getImportList(GenTable genTable) {
- List columns = genTable.getColumns();
- GenTable subGenTable = genTable.getSubTable();
- HashSet importList = new HashSet();
- if (StringUtils.isNotNull(subGenTable)) {
- importList.add("java.util.List");
- }
- for (GenTableColumn column : columns) {
- if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) {
- importList.add("java.util.Date");
- } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) {
- importList.add("java.math.BigDecimal");
- }
- }
- return importList;
- }
-
- /**
- * 根据列类型获取字典组
- *
- * @param genTable 业务表对象
- * @return 返回字典组
- */
- public static String getDicts(GenTable genTable) {
- List columns = genTable.getColumns();
- Set dicts = new HashSet();
- for (GenTableColumn column : columns) {
- if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny(
- column.getHtmlType(),
- new String[]{GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX})) {
- dicts.add("'" + column.getDictType() + "'");
- }
- }
- return StringUtils.join(dicts, ", ");
- }
-
- /**
- * 获取权限前缀
- *
- * @param moduleName 模块名称
- * @param businessName 业务名称
- * @return 返回权限前缀
- */
- public static String getPermissionPrefix(String moduleName, String businessName) {
- return StringUtils.format("{}:{}", moduleName, businessName);
- }
-
- /**
- * 获取上级菜单ID字段
- *
- * @param paramsObj 生成其他选项
- * @return 上级菜单ID字段
- */
- public static String getParentMenuId(Map paramsObj) {
- if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID)
- && StringUtils.isNotEmpty(paramsObj.get(GenConstants.PARENT_MENU_ID))) {
- return paramsObj.get(GenConstants.PARENT_MENU_ID);
- }
- return DEFAULT_PARENT_MENU_ID;
- }
-
- /**
- * 获取树编码
- *
- * @param paramsObj 生成其他选项
- * @return 树编码
- */
- public static String getTreecode(Map paramsObj) {
- if (paramsObj.containsKey(GenConstants.TREE_CODE)) {
- return StringUtils.toCamelCase(paramsObj.get(GenConstants.TREE_CODE));
- }
- return StringUtils.EMPTY;
- }
-
- /**
- * 获取树父编码
- *
- * @param paramsObj 生成其他选项
- * @return 树父编码
- */
- public static String getTreeParentCode(Map paramsObj) {
- if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) {
- return StringUtils.toCamelCase(paramsObj.get(GenConstants.TREE_PARENT_CODE));
- }
- return StringUtils.EMPTY;
- }
-
- /**
- * 获取树名称
- *
- * @param paramsObj 生成其他选项
- * @return 树名称
- */
- public static String getTreeName(Map paramsObj) {
- if (paramsObj.containsKey(GenConstants.TREE_NAME)) {
- return StringUtils.toCamelCase(paramsObj.get(GenConstants.TREE_NAME));
- }
- return StringUtils.EMPTY;
- }
-
- /**
- * 获取需要在哪一列上面显示展开按钮
- *
- * @param genTable 业务表对象
- * @return 展开按钮列序号
- */
- public static int getExpandColumn(GenTable genTable) {
- String options = genTable.getOptions();
- Map paramsObj = JsonUtils.parseMap(options);
- String treeName = paramsObj.get(GenConstants.TREE_NAME);
- int num = 0;
- for (GenTableColumn column : genTable.getColumns()) {
- if (column.isList()) {
- num++;
- String columnName = column.getColumnName();
- if (columnName.equals(treeName)) {
- break;
- }
- }
- }
- return num;
- }
-}
+package com.ruoyi.gen.util;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.common.core.constant.GenConstants;
+import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.common.core.utils.JsonUtils;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.gen.domain.GenTable;
+import com.ruoyi.gen.domain.GenTableColumn;
+import org.apache.velocity.VelocityContext;
+
+import java.util.*;
+
+/**
+ * 模板工具类
+ *
+ * @author ruoyi
+ */
+public class VelocityUtils {
+ /**
+ * 项目空间路径
+ */
+ private static final String PROJECT_PATH = "main/java";
+
+ /**
+ * mybatis空间路径
+ */
+ private static final String MYBATIS_PATH = "main/resources/mapper";
+
+ /**
+ * 默认上级菜单,系统工具
+ */
+ private static final String DEFAULT_PARENT_MENU_ID = "3";
+
+ /**
+ * 设置模板变量信息
+ *
+ * @return 模板列表
+ */
+ public static VelocityContext prepareContext(GenTable genTable) {
+ String moduleName = genTable.getModuleName();
+ String businessName = genTable.getBusinessName();
+ String packageName = genTable.getPackageName();
+ String tplCategory = genTable.getTplCategory();
+ String functionName = genTable.getFunctionName();
+
+ VelocityContext velocityContext = new VelocityContext();
+ velocityContext.put("tplCategory", genTable.getTplCategory());
+ velocityContext.put("tableName", genTable.getTableName());
+ velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】");
+ velocityContext.put("ClassName", genTable.getClassName());
+ velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName()));
+ velocityContext.put("moduleName", genTable.getModuleName());
+ velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName()));
+ velocityContext.put("businessName", genTable.getBusinessName());
+ velocityContext.put("basePackage", getPackagePrefix(packageName));
+ velocityContext.put("packageName", packageName);
+ velocityContext.put("author", genTable.getFunctionAuthor());
+ velocityContext.put("datetime", DateUtils.getDate());
+ velocityContext.put("pkColumn", genTable.getPkColumn());
+ velocityContext.put("importList", getImportList(genTable));
+ velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName));
+ velocityContext.put("columns", genTable.getColumns());
+ velocityContext.put("table", genTable);
+ velocityContext.put("dicts", getDicts(genTable));
+ setMenuVelocityContext(velocityContext, genTable);
+ if (GenConstants.TPL_TREE.equals(tplCategory)) {
+ setTreeVelocityContext(velocityContext, genTable);
+ }
+ if (GenConstants.TPL_SUB.equals(tplCategory)) {
+ setSubVelocityContext(velocityContext, genTable);
+ }
+ return velocityContext;
+ }
+
+ public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) {
+ String options = genTable.getOptions();
+ Map paramsObj = JsonUtils.parseMap(options);
+ String parentMenuId = getParentMenuId(paramsObj);
+ context.put("parentMenuId", parentMenuId);
+ }
+
+ public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) {
+ String options = genTable.getOptions();
+ Map paramsObj = JsonUtils.parseMap(options);
+ String treeCode = getTreecode(paramsObj);
+ String treeParentCode = getTreeParentCode(paramsObj);
+ String treeName = getTreeName(paramsObj);
+
+ context.put("treeCode", treeCode);
+ context.put("treeParentCode", treeParentCode);
+ context.put("treeName", treeName);
+ context.put("expandColumn", getExpandColumn(genTable));
+ if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) {
+ context.put("tree_parent_code", paramsObj.get(GenConstants.TREE_PARENT_CODE));
+ }
+ if (paramsObj.containsKey(GenConstants.TREE_NAME)) {
+ context.put("tree_name", paramsObj.get(GenConstants.TREE_NAME));
+ }
+ }
+
+ public static void setSubVelocityContext(VelocityContext context, GenTable genTable) {
+ GenTable subTable = genTable.getSubTable();
+ String subTableName = genTable.getSubTableName();
+ String subTableFkName = genTable.getSubTableFkName();
+ String subClassName = genTable.getSubTable().getClassName();
+ String subTableFkClassName = StringUtils.convertToCamelCase(subTableFkName);
+
+ context.put("subTable", subTable);
+ context.put("subTableName", subTableName);
+ context.put("subTableFkName", subTableFkName);
+ context.put("subTableFkClassName", subTableFkClassName);
+ context.put("subTableFkclassName", StringUtils.uncapitalize(subTableFkClassName));
+ context.put("subClassName", subClassName);
+ context.put("subclassName", StringUtils.uncapitalize(subClassName));
+ context.put("subImportList", getImportList(genTable.getSubTable()));
+ }
+
+ /**
+ * 获取模板信息
+ *
+ * @return 模板列表
+ */
+ public static List getTemplateList(String tplCategory) {
+ List templates = new ArrayList();
+ templates.add("vm/java/domain.java.vm");
+ templates.add("vm/java/mapper.java.vm");
+ templates.add("vm/java/service.java.vm");
+ templates.add("vm/java/serviceImpl.java.vm");
+ templates.add("vm/java/controller.java.vm");
+ templates.add("vm/xml/mapper.xml.vm");
+ templates.add("vm/sql/sql.vm");
+ templates.add("vm/js/api.js.vm");
+ if (GenConstants.TPL_CRUD.equals(tplCategory)) {
+ templates.add("vm/vue/index.vue.vm");
+ } else if (GenConstants.TPL_TREE.equals(tplCategory)) {
+ templates.add("vm/vue/index-tree.vue.vm");
+ } else if (GenConstants.TPL_SUB.equals(tplCategory)) {
+ templates.add("vm/vue/index.vue.vm");
+ templates.add("vm/java/sub-domain.java.vm");
+ }
+ return templates;
+ }
+
+ /**
+ * 获取文件名
+ */
+ public static String getFileName(String template, GenTable genTable) {
+ // 文件名称
+ String fileName = "";
+ // 包路径
+ String packageName = genTable.getPackageName();
+ // 模块名
+ String moduleName = genTable.getModuleName();
+ // 大写类名
+ String className = genTable.getClassName();
+ // 业务名称
+ String businessName = genTable.getBusinessName();
+
+ String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/");
+ String mybatisPath = MYBATIS_PATH + "/" + moduleName;
+ String vuePath = "vue";
+
+ if (template.contains("domain.java.vm")) {
+ fileName = StringUtils.format("{}/domain/{}.java", javaPath, className);
+ }
+ if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) {
+ fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName());
+ } else if (template.contains("mapper.java.vm")) {
+ fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className);
+ } else if (template.contains("service.java.vm")) {
+ fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className);
+ } else if (template.contains("serviceImpl.java.vm")) {
+ fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className);
+ } else if (template.contains("controller.java.vm")) {
+ fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className);
+ } else if (template.contains("mapper.xml.vm")) {
+ fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className);
+ } else if (template.contains("sql.vm")) {
+ fileName = businessName + "Menu.sql";
+ } else if (template.contains("api.js.vm")) {
+ fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName);
+ } else if (template.contains("index.vue.vm")) {
+ fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
+ } else if (template.contains("index-tree.vue.vm")) {
+ fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
+ }
+ return fileName;
+ }
+
+ /**
+ * 获取包前缀
+ *
+ * @param packageName 包名称
+ * @return 包前缀名称
+ */
+ public static String getPackagePrefix(String packageName) {
+ int lastIndex = packageName.lastIndexOf(".");
+ String basePackage = StringUtils.substring(packageName, 0, lastIndex);
+ return basePackage;
+ }
+
+ /**
+ * 根据列类型获取导入包
+ *
+ * @param genTable 业务表对象
+ * @return 返回需要导入的包列表
+ */
+ public static HashSet getImportList(GenTable genTable) {
+ List columns = genTable.getColumns();
+ GenTable subGenTable = genTable.getSubTable();
+ HashSet importList = new HashSet();
+ if (ObjectUtil.isNotNull(subGenTable)) {
+ importList.add("java.util.List");
+ }
+ for (GenTableColumn column : columns) {
+ if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) {
+ importList.add("java.util.Date");
+ } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) {
+ importList.add("java.math.BigDecimal");
+ }
+ }
+ return importList;
+ }
+
+ /**
+ * 根据列类型获取字典组
+ *
+ * @param genTable 业务表对象
+ * @return 返回字典组
+ */
+ public static String getDicts(GenTable genTable) {
+ List columns = genTable.getColumns();
+ Set dicts = new HashSet();
+ for (GenTableColumn column : columns) {
+ if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny(
+ column.getHtmlType(),
+ new String[]{GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX})) {
+ dicts.add("'" + column.getDictType() + "'");
+ }
+ }
+ return StringUtils.join(dicts, ", ");
+ }
+
+ /**
+ * 获取权限前缀
+ *
+ * @param moduleName 模块名称
+ * @param businessName 业务名称
+ * @return 返回权限前缀
+ */
+ public static String getPermissionPrefix(String moduleName, String businessName) {
+ return StringUtils.format("{}:{}", moduleName, businessName);
+ }
+
+ /**
+ * 获取上级菜单ID字段
+ *
+ * @param paramsObj 生成其他选项
+ * @return 上级菜单ID字段
+ */
+ public static String getParentMenuId(Map paramsObj) {
+ if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID)
+ && StringUtils.isNotEmpty(paramsObj.get(GenConstants.PARENT_MENU_ID))) {
+ return paramsObj.get(GenConstants.PARENT_MENU_ID);
+ }
+ return DEFAULT_PARENT_MENU_ID;
+ }
+
+ /**
+ * 获取树编码
+ *
+ * @param paramsObj 生成其他选项
+ * @return 树编码
+ */
+ public static String getTreecode(Map paramsObj) {
+ if (paramsObj.containsKey(GenConstants.TREE_CODE)) {
+ return StringUtils.toCamelCase(paramsObj.get(GenConstants.TREE_CODE));
+ }
+ return StringUtils.EMPTY;
+ }
+
+ /**
+ * 获取树父编码
+ *
+ * @param paramsObj 生成其他选项
+ * @return 树父编码
+ */
+ public static String getTreeParentCode(Map paramsObj) {
+ if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) {
+ return StringUtils.toCamelCase(paramsObj.get(GenConstants.TREE_PARENT_CODE));
+ }
+ return StringUtils.EMPTY;
+ }
+
+ /**
+ * 获取树名称
+ *
+ * @param paramsObj 生成其他选项
+ * @return 树名称
+ */
+ public static String getTreeName(Map paramsObj) {
+ if (paramsObj.containsKey(GenConstants.TREE_NAME)) {
+ return StringUtils.toCamelCase(paramsObj.get(GenConstants.TREE_NAME));
+ }
+ return StringUtils.EMPTY;
+ }
+
+ /**
+ * 获取需要在哪一列上面显示展开按钮
+ *
+ * @param genTable 业务表对象
+ * @return 展开按钮列序号
+ */
+ public static int getExpandColumn(GenTable genTable) {
+ String options = genTable.getOptions();
+ Map paramsObj = JsonUtils.parseMap(options);
+ String treeName = paramsObj.get(GenConstants.TREE_NAME);
+ int num = 0;
+ for (GenTableColumn column : genTable.getColumns()) {
+ if (column.isList()) {
+ num++;
+ String columnName = column.getColumnName();
+ if (columnName.equals(treeName)) {
+ break;
+ }
+ }
+ }
+ return num;
+ }
+}
diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm
index e466592d7..3508058dd 100644
--- a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm
+++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm
@@ -1,116 +1,115 @@
-package ${packageName}.controller;
-
-import java.util.List;
-import java.io.IOException;
-import javax.servlet.http.HttpServletResponse;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.ruoyi.common.log.annotation.Log;
-import com.ruoyi.common.log.enums.BusinessType;
-import com.ruoyi.common.security.annotation.RequiresPermissions;
-import ${packageName}.domain.${ClassName};
-import ${packageName}.service.I${ClassName}Service;
-import com.ruoyi.common.core.web.controller.BaseController;
-import com.ruoyi.common.core.web.domain.AjaxResult;
-import com.ruoyi.common.core.utils.poi.ExcelUtil;
-#if($table.crud || $table.sub)
-import com.ruoyi.common.core.web.page.TableDataInfo;
-#elseif($table.tree)
-#end
-
-/**
- * ${functionName}Controller
- *
- * @author ${author}
- * @date ${datetime}
- */
-@RestController
-@RequestMapping("/${businessName}")
-public class ${ClassName}Controller extends BaseController
-{
- @Autowired
- private I${ClassName}Service ${className}Service;
-
- /**
- * 查询${functionName}列表
- */
- @RequiresPermissions("${permissionPrefix}:list")
- @GetMapping("/list")
-#if($table.crud || $table.sub)
- public TableDataInfo list(${ClassName} ${className})
- {
- startPage();
- List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
- return getDataTable(list);
- }
-#elseif($table.tree)
- public AjaxResult list(${ClassName} ${className})
- {
- List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
- return AjaxResult.success(list);
- }
-#end
-
- /**
- * 导出${functionName}列表
- */
- @RequiresPermissions("${permissionPrefix}:export")
- @Log(title = "${functionName}", businessType = BusinessType.EXPORT)
- @PostMapping("/export")
- public void export(HttpServletResponse response, ${ClassName} ${className})
- {
- List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
- ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
- util.exportExcel(response, list, "${functionName}数据");
- }
-
- /**
- * 获取${functionName}详细信息
- */
- @RequiresPermissions("${permissionPrefix}:query")
- @GetMapping(value = "/{${pkColumn.javaField}}")
- public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField})
- {
- return AjaxResult.success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}));
- }
-
- /**
- * 新增${functionName}
- */
- @RequiresPermissions("${permissionPrefix}:add")
- @Log(title = "${functionName}", businessType = BusinessType.INSERT)
- @PostMapping
- public AjaxResult add(@RequestBody ${ClassName} ${className})
- {
- return toAjax(${className}Service.insert${ClassName}(${className}));
- }
-
- /**
- * 修改${functionName}
- */
- @RequiresPermissions("${permissionPrefix}:edit")
- @Log(title = "${functionName}", businessType = BusinessType.UPDATE)
- @PutMapping
- public AjaxResult edit(@RequestBody ${ClassName} ${className})
- {
- return toAjax(${className}Service.update${ClassName}(${className}));
- }
-
- /**
- * 删除${functionName}
- */
- @RequiresPermissions("${permissionPrefix}:remove")
- @Log(title = "${functionName}", businessType = BusinessType.DELETE)
- @DeleteMapping("/{${pkColumn.javaField}s}")
- public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s)
- {
- return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s));
- }
-}
+package ${packageName}.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.common.security.annotation.RequiresPermissions;
+import ${packageName}.domain.${ClassName};
+import ${packageName}.service.I${ClassName}Service;
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.utils.poi.ExcelUtil;
+#if($table.crud || $table.sub)
+import com.ruoyi.common.core.web.page.TableDataInfo;
+#elseif($table.tree)
+#end
+
+/**
+ * ${functionName}Controller
+ *
+ * @author ${author}
+ * @date ${datetime}
+ */
+@RestController
+@RequestMapping("/${businessName}")
+public class ${ClassName}Controller extends BaseController
+{
+ @Autowired
+ private I${ClassName}Service ${className}Service;
+
+ /**
+ * 查询${functionName}列表
+ */
+ @RequiresPermissions("${permissionPrefix}:list")
+ @GetMapping("/list")
+#if($table.crud || $table.sub)
+ public TableDataInfo list(${ClassName} ${className})
+ {
+ startPage();
+ List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
+ return getDataTable(list);
+ }
+#elseif($table.tree)
+ public AjaxResult list(${ClassName} ${className})
+ {
+ List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
+ return AjaxResult.success(list);
+ }
+#end
+
+ /**
+ * 导出${functionName}列表
+ */
+ @RequiresPermissions("${permissionPrefix}:export")
+ @Log(title = "${functionName}", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, ${ClassName} ${className})
+ {
+ List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
+ ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
+ util.exportExcel(response, list, "${functionName}数据");
+ }
+
+ /**
+ * 获取${functionName}详细信息
+ */
+ @RequiresPermissions("${permissionPrefix}:query")
+ @GetMapping(value = "/{${pkColumn.javaField}}")
+ public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField})
+ {
+ return AjaxResult.success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}));
+ }
+
+ /**
+ * 新增${functionName}
+ */
+ @RequiresPermissions("${permissionPrefix}:add")
+ @Log(title = "${functionName}", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody ${ClassName} ${className})
+ {
+ return toAjax(${className}Service.insert${ClassName}(${className}));
+ }
+
+ /**
+ * 修改${functionName}
+ */
+ @RequiresPermissions("${permissionPrefix}:edit")
+ @Log(title = "${functionName}", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody ${ClassName} ${className})
+ {
+ return toAjax(${className}Service.update${ClassName}(${className}));
+ }
+
+ /**
+ * 删除${functionName}
+ */
+ @RequiresPermissions("${permissionPrefix}:remove")
+ @Log(title = "${functionName}", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{${pkColumn.javaField}s}")
+ public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s)
+ {
+ return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s));
+ }
+}
diff --git a/ruoyi-modules/ruoyi-system/pom.xml b/ruoyi-modules/ruoyi-system/pom.xml
index e45735605..b4352c0e7 100644
--- a/ruoyi-modules/ruoyi-system/pom.xml
+++ b/ruoyi-modules/ruoyi-system/pom.xml
@@ -107,6 +107,11 @@
ruoyi-api-file
+
+ org.springframework.cloud
+ spring-cloud-starter-stream-rabbit
+
+
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysConfigController.java
index b29bce9dd..bed12a11b 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysConfigController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysConfigController.java
@@ -1,119 +1,118 @@
-package com.ruoyi.system.controller;
-
-import com.ruoyi.common.core.constant.UserConstants;
-import com.ruoyi.common.core.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.web.controller.BaseController;
-import com.ruoyi.common.core.web.domain.AjaxResult;
-import com.ruoyi.common.core.web.page.TableDataInfo;
-import com.ruoyi.common.log.annotation.Log;
-import com.ruoyi.common.log.enums.BusinessType;
-import com.ruoyi.common.security.annotation.RequiresPermissions;
-import com.ruoyi.common.security.utils.SecurityUtils;
-import com.ruoyi.system.domain.SysConfig;
-import com.ruoyi.system.service.ISysConfigService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-
-/**
- * 参数配置 信息操作处理
- *
- * @author ruoyi
- */
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@RestController
-@RequestMapping("/config")
-public class SysConfigController extends BaseController {
-
- private final ISysConfigService configService;
-
- /**
- * 获取参数配置列表
- */
- @RequiresPermissions("system:config:list")
- @GetMapping("/list")
- public TableDataInfo list(SysConfig config) {
- startPage();
- List list = configService.selectConfigList(config);
- return getDataTable(list);
- }
-
- @Log(title = "参数管理", businessType = BusinessType.EXPORT)
- @RequiresPermissions("system:config:export")
- @PostMapping("/export")
- public void export(HttpServletResponse response, SysConfig config) {
- List list = configService.selectConfigList(config);
- ExcelUtil util = new ExcelUtil(SysConfig.class);
- util.exportExcel(response, list, "参数数据");
- }
-
- /**
- * 根据参数编号获取详细信息
- */
- @GetMapping(value = "/{configId}")
- public AjaxResult getInfo(@PathVariable Long configId) {
- return AjaxResult.success(configService.selectConfigById(configId));
- }
-
- /**
- * 根据参数键名查询参数值
- */
- @GetMapping(value = "/configKey/{configKey}")
- public AjaxResult getConfigKey(@PathVariable String configKey) {
- return AjaxResult.success(configService.selectConfigByKey(configKey));
- }
-
- /**
- * 新增参数配置
- */
- @RequiresPermissions("system:config:add")
- @Log(title = "参数管理", businessType = BusinessType.INSERT)
- @PostMapping
- public AjaxResult add(@Validated @RequestBody SysConfig config) {
- if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) {
- return AjaxResult.error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
- }
- config.setCreateBy(SecurityUtils.getUsername());
- return toAjax(configService.insertConfig(config));
- }
-
- /**
- * 修改参数配置
- */
- @RequiresPermissions("system:config:edit")
- @Log(title = "参数管理", businessType = BusinessType.UPDATE)
- @PutMapping
- public AjaxResult edit(@Validated @RequestBody SysConfig config) {
- if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) {
- return AjaxResult.error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
- }
- config.setUpdateBy(SecurityUtils.getUsername());
- return toAjax(configService.updateConfig(config));
- }
-
- /**
- * 删除参数配置
- */
- @RequiresPermissions("system:config:remove")
- @Log(title = "参数管理", businessType = BusinessType.DELETE)
- @DeleteMapping("/{configIds}")
- public AjaxResult remove(@PathVariable Long[] configIds) {
- configService.deleteConfigByIds(configIds);
- return success();
- }
-
- /**
- * 刷新参数缓存
- */
- @RequiresPermissions("system:config:remove")
- @Log(title = "参数管理", businessType = BusinessType.CLEAN)
- @DeleteMapping("/refreshCache")
- public AjaxResult refreshCache() {
- configService.resetConfigCache();
- return AjaxResult.success();
- }
-}
+package com.ruoyi.system.controller;
+
+import com.ruoyi.common.core.constant.UserConstants;
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+import com.ruoyi.common.excel.utils.ExcelUtil;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.common.security.annotation.RequiresPermissions;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.system.domain.SysConfig;
+import com.ruoyi.system.service.ISysConfigService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 参数配置 信息操作处理
+ *
+ * @author ruoyi
+ */
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/config")
+public class SysConfigController extends BaseController {
+
+ private final ISysConfigService configService;
+
+ /**
+ * 获取参数配置列表
+ */
+ @RequiresPermissions("system:config:list")
+ @GetMapping("/list")
+ public TableDataInfo list(SysConfig config) {
+ startPage();
+ List list = configService.selectConfigList(config);
+ return getDataTable(list);
+ }
+
+ @Log(title = "参数管理", businessType = BusinessType.EXPORT)
+ @RequiresPermissions("system:config:export")
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, SysConfig config) {
+ List list = configService.selectConfigList(config);
+ ExcelUtil.exportExcel(list, "参数数据", SysConfig.class, response);
+ }
+
+ /**
+ * 根据参数编号获取详细信息
+ */
+ @GetMapping(value = "/{configId}")
+ public AjaxResult getInfo(@PathVariable Long configId) {
+ return AjaxResult.success(configService.selectConfigById(configId));
+ }
+
+ /**
+ * 根据参数键名查询参数值
+ */
+ @GetMapping(value = "/configKey/{configKey}")
+ public AjaxResult getConfigKey(@PathVariable String configKey) {
+ return AjaxResult.success(configService.selectConfigByKey(configKey));
+ }
+
+ /**
+ * 新增参数配置
+ */
+ @RequiresPermissions("system:config:add")
+ @Log(title = "参数管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@Validated @RequestBody SysConfig config) {
+ if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) {
+ return AjaxResult.error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
+ }
+ config.setCreateBy(SecurityUtils.getUsername());
+ return toAjax(configService.insertConfig(config));
+ }
+
+ /**
+ * 修改参数配置
+ */
+ @RequiresPermissions("system:config:edit")
+ @Log(title = "参数管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@Validated @RequestBody SysConfig config) {
+ if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) {
+ return AjaxResult.error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
+ }
+ config.setUpdateBy(SecurityUtils.getUsername());
+ return toAjax(configService.updateConfig(config));
+ }
+
+ /**
+ * 删除参数配置
+ */
+ @RequiresPermissions("system:config:remove")
+ @Log(title = "参数管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{configIds}")
+ public AjaxResult remove(@PathVariable Long[] configIds) {
+ configService.deleteConfigByIds(configIds);
+ return success();
+ }
+
+ /**
+ * 刷新参数缓存
+ */
+ @RequiresPermissions("system:config:remove")
+ @Log(title = "参数管理", businessType = BusinessType.CLEAN)
+ @DeleteMapping("/refreshCache")
+ public AjaxResult refreshCache() {
+ configService.resetConfigCache();
+ return AjaxResult.success();
+ }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictDataController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictDataController.java
index 022e586a4..96b0b8dd1 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictDataController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictDataController.java
@@ -1,107 +1,106 @@
-package com.ruoyi.system.controller;
-
-import com.ruoyi.common.core.utils.StringUtils;
-import com.ruoyi.common.core.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.web.controller.BaseController;
-import com.ruoyi.common.core.web.domain.AjaxResult;
-import com.ruoyi.common.core.web.page.TableDataInfo;
-import com.ruoyi.common.log.annotation.Log;
-import com.ruoyi.common.log.enums.BusinessType;
-import com.ruoyi.common.security.annotation.RequiresPermissions;
-import com.ruoyi.common.security.utils.SecurityUtils;
-import com.ruoyi.system.api.domain.SysDictData;
-import com.ruoyi.system.service.ISysDictDataService;
-import com.ruoyi.system.service.ISysDictTypeService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 数据字典信息
- *
- * @author ruoyi
- */
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@RestController
-@RequestMapping("/dict/data")
-public class SysDictDataController extends BaseController {
-
- private final ISysDictDataService dictDataService;
- private final ISysDictTypeService dictTypeService;
-
- @RequiresPermissions("system:dict:list")
- @GetMapping("/list")
- public TableDataInfo list(SysDictData dictData) {
- startPage();
- List list = dictDataService.selectDictDataList(dictData);
- return getDataTable(list);
- }
-
- @Log(title = "字典数据", businessType = BusinessType.EXPORT)
- @RequiresPermissions("system:dict:export")
- @PostMapping("/export")
- public void export(HttpServletResponse response, SysDictData dictData) {
- List list = dictDataService.selectDictDataList(dictData);
- ExcelUtil util = new ExcelUtil(SysDictData.class);
- util.exportExcel(response, list, "字典数据");
- }
-
- /**
- * 查询字典数据详细
- */
- @RequiresPermissions("system:dict:query")
- @GetMapping(value = "/{dictCode}")
- public AjaxResult getInfo(@PathVariable Long dictCode) {
- return AjaxResult.success(dictDataService.selectDictDataById(dictCode));
- }
-
- /**
- * 根据字典类型查询字典数据信息
- */
- @GetMapping(value = "/type/{dictType}")
- public AjaxResult dictType(@PathVariable String dictType) {
- List data = dictTypeService.selectDictDataByType(dictType);
- if (StringUtils.isNull(data)) {
- data = new ArrayList();
- }
- return AjaxResult.success(data);
- }
-
- /**
- * 新增字典类型
- */
- @RequiresPermissions("system:dict:add")
- @Log(title = "字典数据", businessType = BusinessType.INSERT)
- @PostMapping
- public AjaxResult add(@Validated @RequestBody SysDictData dict) {
- dict.setCreateBy(SecurityUtils.getUsername());
- return toAjax(dictDataService.insertDictData(dict));
- }
-
- /**
- * 修改保存字典类型
- */
- @RequiresPermissions("system:dict:edit")
- @Log(title = "字典数据", businessType = BusinessType.UPDATE)
- @PutMapping
- public AjaxResult edit(@Validated @RequestBody SysDictData dict) {
- dict.setUpdateBy(SecurityUtils.getUsername());
- return toAjax(dictDataService.updateDictData(dict));
- }
-
- /**
- * 删除字典类型
- */
- @RequiresPermissions("system:dict:remove")
- @Log(title = "字典类型", businessType = BusinessType.DELETE)
- @DeleteMapping("/{dictCodes}")
- public AjaxResult remove(@PathVariable Long[] dictCodes) {
- dictDataService.deleteDictDataByIds(dictCodes);
- return success();
- }
-}
+package com.ruoyi.system.controller;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+import com.ruoyi.common.excel.utils.ExcelUtil;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.common.security.annotation.RequiresPermissions;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.system.api.domain.SysDictData;
+import com.ruoyi.system.service.ISysDictDataService;
+import com.ruoyi.system.service.ISysDictTypeService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 数据字典信息
+ *
+ * @author ruoyi
+ */
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/dict/data")
+public class SysDictDataController extends BaseController {
+
+ private final ISysDictDataService dictDataService;
+ private final ISysDictTypeService dictTypeService;
+
+ @RequiresPermissions("system:dict:list")
+ @GetMapping("/list")
+ public TableDataInfo list(SysDictData dictData) {
+ startPage();
+ List list = dictDataService.selectDictDataList(dictData);
+ return getDataTable(list);
+ }
+
+ @Log(title = "字典数据", businessType = BusinessType.EXPORT)
+ @RequiresPermissions("system:dict:export")
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, SysDictData dictData) {
+ List list = dictDataService.selectDictDataList(dictData);
+ ExcelUtil.exportExcel(list, "字典数据", SysDictData.class, response);
+ }
+
+ /**
+ * 查询字典数据详细
+ */
+ @RequiresPermissions("system:dict:query")
+ @GetMapping(value = "/{dictCode}")
+ public AjaxResult getInfo(@PathVariable Long dictCode) {
+ return AjaxResult.success(dictDataService.selectDictDataById(dictCode));
+ }
+
+ /**
+ * 根据字典类型查询字典数据信息
+ */
+ @GetMapping(value = "/type/{dictType}")
+ public AjaxResult dictType(@PathVariable String dictType) {
+ List data = dictTypeService.selectDictDataByType(dictType);
+ if (ObjectUtil.isNull(data)) {
+ data = new ArrayList();
+ }
+ return AjaxResult.success(data);
+ }
+
+ /**
+ * 新增字典类型
+ */
+ @RequiresPermissions("system:dict:add")
+ @Log(title = "字典数据", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@Validated @RequestBody SysDictData dict) {
+ dict.setCreateBy(SecurityUtils.getUsername());
+ return toAjax(dictDataService.insertDictData(dict));
+ }
+
+ /**
+ * 修改保存字典类型
+ */
+ @RequiresPermissions("system:dict:edit")
+ @Log(title = "字典数据", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@Validated @RequestBody SysDictData dict) {
+ dict.setUpdateBy(SecurityUtils.getUsername());
+ return toAjax(dictDataService.updateDictData(dict));
+ }
+
+ /**
+ * 删除字典类型
+ */
+ @RequiresPermissions("system:dict:remove")
+ @Log(title = "字典类型", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{dictCodes}")
+ public AjaxResult remove(@PathVariable Long[] dictCodes) {
+ dictDataService.deleteDictDataByIds(dictCodes);
+ return success();
+ }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictTypeController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictTypeController.java
index 2ea49ec70..f286ab980 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictTypeController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictTypeController.java
@@ -1,118 +1,117 @@
-package com.ruoyi.system.controller;
-
-import com.ruoyi.common.core.constant.UserConstants;
-import com.ruoyi.common.core.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.web.controller.BaseController;
-import com.ruoyi.common.core.web.domain.AjaxResult;
-import com.ruoyi.common.core.web.page.TableDataInfo;
-import com.ruoyi.common.log.annotation.Log;
-import com.ruoyi.common.log.enums.BusinessType;
-import com.ruoyi.common.security.annotation.RequiresPermissions;
-import com.ruoyi.common.security.utils.SecurityUtils;
-import com.ruoyi.system.api.domain.SysDictType;
-import com.ruoyi.system.service.ISysDictTypeService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-
-/**
- * 数据字典信息
- *
- * @author ruoyi
- */
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@RestController
-@RequestMapping("/dict/type")
-public class SysDictTypeController extends BaseController {
-
- private final ISysDictTypeService dictTypeService;
-
- @RequiresPermissions("system:dict:list")
- @GetMapping("/list")
- public TableDataInfo list(SysDictType dictType) {
- startPage();
- List list = dictTypeService.selectDictTypeList(dictType);
- return getDataTable(list);
- }
-
- @Log(title = "字典类型", businessType = BusinessType.EXPORT)
- @RequiresPermissions("system:dict:export")
- @PostMapping("/export")
- public void export(HttpServletResponse response, SysDictType dictType) {
- List list = dictTypeService.selectDictTypeList(dictType);
- ExcelUtil util = new ExcelUtil(SysDictType.class);
- util.exportExcel(response, list, "字典类型");
- }
-
- /**
- * 查询字典类型详细
- */
- @RequiresPermissions("system:dict:query")
- @GetMapping(value = "/{dictId}")
- public AjaxResult getInfo(@PathVariable Long dictId) {
- return AjaxResult.success(dictTypeService.selectDictTypeById(dictId));
- }
-
- /**
- * 新增字典类型
- */
- @RequiresPermissions("system:dict:add")
- @Log(title = "字典类型", businessType = BusinessType.INSERT)
- @PostMapping
- public AjaxResult add(@Validated @RequestBody SysDictType dict) {
- if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) {
- return AjaxResult.error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
- }
- dict.setCreateBy(SecurityUtils.getUsername());
- return toAjax(dictTypeService.insertDictType(dict));
- }
-
- /**
- * 修改字典类型
- */
- @RequiresPermissions("system:dict:edit")
- @Log(title = "字典类型", businessType = BusinessType.UPDATE)
- @PutMapping
- public AjaxResult edit(@Validated @RequestBody SysDictType dict) {
- if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) {
- return AjaxResult.error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
- }
- dict.setUpdateBy(SecurityUtils.getUsername());
- return toAjax(dictTypeService.updateDictType(dict));
- }
-
- /**
- * 删除字典类型
- */
- @RequiresPermissions("system:dict:remove")
- @Log(title = "字典类型", businessType = BusinessType.DELETE)
- @DeleteMapping("/{dictIds}")
- public AjaxResult remove(@PathVariable Long[] dictIds) {
- dictTypeService.deleteDictTypeByIds(dictIds);
- return success();
- }
-
- /**
- * 刷新字典缓存
- */
- @RequiresPermissions("system:dict:remove")
- @Log(title = "字典类型", businessType = BusinessType.CLEAN)
- @DeleteMapping("/refreshCache")
- public AjaxResult refreshCache() {
- dictTypeService.resetDictCache();
- return AjaxResult.success();
- }
-
- /**
- * 获取字典选择框列表
- */
- @GetMapping("/optionselect")
- public AjaxResult optionselect() {
- List dictTypes = dictTypeService.selectDictTypeAll();
- return AjaxResult.success(dictTypes);
- }
-}
+package com.ruoyi.system.controller;
+
+import com.ruoyi.common.core.constant.UserConstants;
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+import com.ruoyi.common.excel.utils.ExcelUtil;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.common.security.annotation.RequiresPermissions;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.system.api.domain.SysDictType;
+import com.ruoyi.system.service.ISysDictTypeService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 数据字典信息
+ *
+ * @author ruoyi
+ */
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/dict/type")
+public class SysDictTypeController extends BaseController {
+
+ private final ISysDictTypeService dictTypeService;
+
+ @RequiresPermissions("system:dict:list")
+ @GetMapping("/list")
+ public TableDataInfo list(SysDictType dictType) {
+ startPage();
+ List list = dictTypeService.selectDictTypeList(dictType);
+ return getDataTable(list);
+ }
+
+ @Log(title = "字典类型", businessType = BusinessType.EXPORT)
+ @RequiresPermissions("system:dict:export")
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, SysDictType dictType) {
+ List list = dictTypeService.selectDictTypeList(dictType);
+ ExcelUtil.exportExcel(list, "字典类型", SysDictType.class, response);
+ }
+
+ /**
+ * 查询字典类型详细
+ */
+ @RequiresPermissions("system:dict:query")
+ @GetMapping(value = "/{dictId}")
+ public AjaxResult getInfo(@PathVariable Long dictId) {
+ return AjaxResult.success(dictTypeService.selectDictTypeById(dictId));
+ }
+
+ /**
+ * 新增字典类型
+ */
+ @RequiresPermissions("system:dict:add")
+ @Log(title = "字典类型", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@Validated @RequestBody SysDictType dict) {
+ if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) {
+ return AjaxResult.error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
+ }
+ dict.setCreateBy(SecurityUtils.getUsername());
+ return toAjax(dictTypeService.insertDictType(dict));
+ }
+
+ /**
+ * 修改字典类型
+ */
+ @RequiresPermissions("system:dict:edit")
+ @Log(title = "字典类型", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@Validated @RequestBody SysDictType dict) {
+ if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) {
+ return AjaxResult.error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
+ }
+ dict.setUpdateBy(SecurityUtils.getUsername());
+ return toAjax(dictTypeService.updateDictType(dict));
+ }
+
+ /**
+ * 删除字典类型
+ */
+ @RequiresPermissions("system:dict:remove")
+ @Log(title = "字典类型", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{dictIds}")
+ public AjaxResult remove(@PathVariable Long[] dictIds) {
+ dictTypeService.deleteDictTypeByIds(dictIds);
+ return success();
+ }
+
+ /**
+ * 刷新字典缓存
+ */
+ @RequiresPermissions("system:dict:remove")
+ @Log(title = "字典类型", businessType = BusinessType.CLEAN)
+ @DeleteMapping("/refreshCache")
+ public AjaxResult refreshCache() {
+ dictTypeService.resetDictCache();
+ return AjaxResult.success();
+ }
+
+ /**
+ * 获取字典选择框列表
+ */
+ @GetMapping("/optionselect")
+ public AjaxResult optionselect() {
+ List dictTypes = dictTypeService.selectDictTypeAll();
+ return AjaxResult.success(dictTypes);
+ }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysLogininforController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysLogininforController.java
index c51cea953..90828c15c 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysLogininforController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysLogininforController.java
@@ -1,69 +1,68 @@
-package com.ruoyi.system.controller;
-
-import com.ruoyi.common.core.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.web.controller.BaseController;
-import com.ruoyi.common.core.web.domain.AjaxResult;
-import com.ruoyi.common.core.web.page.TableDataInfo;
-import com.ruoyi.common.log.annotation.Log;
-import com.ruoyi.common.log.enums.BusinessType;
-import com.ruoyi.common.security.annotation.InnerAuth;
-import com.ruoyi.common.security.annotation.RequiresPermissions;
-import com.ruoyi.system.api.domain.SysLogininfor;
-import com.ruoyi.system.service.ISysLogininforService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-
-/**
- * 系统访问记录
- *
- * @author ruoyi
- */
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@RestController
-@RequestMapping("/logininfor")
-public class SysLogininforController extends BaseController {
-
- private final ISysLogininforService logininforService;
-
- @RequiresPermissions("system:logininfor:list")
- @GetMapping("/list")
- public TableDataInfo list(SysLogininfor logininfor) {
- startPage();
- List list = logininforService.selectLogininforList(logininfor);
- return getDataTable(list);
- }
-
- @Log(title = "登录日志", businessType = BusinessType.EXPORT)
- @RequiresPermissions("system:logininfor:export")
- @PostMapping("/export")
- public void export(HttpServletResponse response, SysLogininfor logininfor) {
- List list = logininforService.selectLogininforList(logininfor);
- ExcelUtil util = new ExcelUtil(SysLogininfor.class);
- util.exportExcel(response, list, "登录日志");
- }
-
- @RequiresPermissions("system:logininfor:remove")
- @Log(title = "登录日志", businessType = BusinessType.DELETE)
- @DeleteMapping("/{infoIds}")
- public AjaxResult remove(@PathVariable Long[] infoIds) {
- return toAjax(logininforService.deleteLogininforByIds(infoIds));
- }
-
- @RequiresPermissions("system:logininfor:remove")
- @Log(title = "登录日志", businessType = BusinessType.DELETE)
- @DeleteMapping("/clean")
- public AjaxResult clean() {
- logininforService.cleanLogininfor();
- return AjaxResult.success();
- }
-
- @InnerAuth
- @PostMapping
- public AjaxResult add(@RequestBody SysLogininfor logininfor) {
- return toAjax(logininforService.insertLogininfor(logininfor));
- }
-}
+package com.ruoyi.system.controller;
+
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+import com.ruoyi.common.excel.utils.ExcelUtil;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.common.security.annotation.InnerAuth;
+import com.ruoyi.common.security.annotation.RequiresPermissions;
+import com.ruoyi.system.api.domain.SysLogininfor;
+import com.ruoyi.system.service.ISysLogininforService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 系统访问记录
+ *
+ * @author ruoyi
+ */
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/logininfor")
+public class SysLogininforController extends BaseController {
+
+ private final ISysLogininforService logininforService;
+
+ @RequiresPermissions("system:logininfor:list")
+ @GetMapping("/list")
+ public TableDataInfo list(SysLogininfor logininfor) {
+ startPage();
+ List list = logininforService.selectLogininforList(logininfor);
+ return getDataTable(list);
+ }
+
+ @Log(title = "登录日志", businessType = BusinessType.EXPORT)
+ @RequiresPermissions("system:logininfor:export")
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, SysLogininfor logininfor) {
+ List list = logininforService.selectLogininforList(logininfor);
+ ExcelUtil.exportExcel(list, "登录日志", SysLogininfor.class, response);
+ }
+
+ @RequiresPermissions("system:logininfor:remove")
+ @Log(title = "登录日志", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{infoIds}")
+ public AjaxResult remove(@PathVariable Long[] infoIds) {
+ return toAjax(logininforService.deleteLogininforByIds(infoIds));
+ }
+
+ @RequiresPermissions("system:logininfor:remove")
+ @Log(title = "登录日志", businessType = BusinessType.DELETE)
+ @DeleteMapping("/clean")
+ public AjaxResult clean() {
+ logininforService.cleanLogininfor();
+ return AjaxResult.success();
+ }
+
+ @InnerAuth
+ @PostMapping
+ public AjaxResult add(@RequestBody SysLogininfor logininfor) {
+ return toAjax(logininforService.insertLogininfor(logininfor));
+ }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysOperlogController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysOperlogController.java
index 5e783368b..03afbf112 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysOperlogController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysOperlogController.java
@@ -1,68 +1,67 @@
-package com.ruoyi.system.controller;
-
-import com.ruoyi.common.core.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.web.controller.BaseController;
-import com.ruoyi.common.core.web.domain.AjaxResult;
-import com.ruoyi.common.core.web.page.TableDataInfo;
-import com.ruoyi.common.log.annotation.Log;
-import com.ruoyi.common.log.enums.BusinessType;
-import com.ruoyi.common.security.annotation.InnerAuth;
-import com.ruoyi.common.security.annotation.RequiresPermissions;
-import com.ruoyi.system.api.domain.SysOperLog;
-import com.ruoyi.system.service.ISysOperLogService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-
-/**
- * 操作日志记录
- *
- * @author ruoyi
- */
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@RestController
-@RequestMapping("/operlog")
-public class SysOperlogController extends BaseController {
- private final ISysOperLogService operLogService;
-
- @RequiresPermissions("system:operlog:list")
- @GetMapping("/list")
- public TableDataInfo list(SysOperLog operLog) {
- startPage();
- List list = operLogService.selectOperLogList(operLog);
- return getDataTable(list);
- }
-
- @Log(title = "操作日志", businessType = BusinessType.EXPORT)
- @RequiresPermissions("system:operlog:export")
- @PostMapping("/export")
- public void export(HttpServletResponse response, SysOperLog operLog) {
- List list = operLogService.selectOperLogList(operLog);
- ExcelUtil util = new ExcelUtil(SysOperLog.class);
- util.exportExcel(response, list, "操作日志");
- }
-
- @Log(title = "操作日志", businessType = BusinessType.DELETE)
- @RequiresPermissions("system:operlog:remove")
- @DeleteMapping("/{operIds}")
- public AjaxResult remove(@PathVariable Long[] operIds) {
- return toAjax(operLogService.deleteOperLogByIds(operIds));
- }
-
- @RequiresPermissions("system:operlog:remove")
- @Log(title = "操作日志", businessType = BusinessType.CLEAN)
- @DeleteMapping("/clean")
- public AjaxResult clean() {
- operLogService.cleanOperLog();
- return AjaxResult.success();
- }
-
- @InnerAuth
- @PostMapping
- public AjaxResult add(@RequestBody SysOperLog operLog) {
- return toAjax(operLogService.insertOperlog(operLog));
- }
-}
+package com.ruoyi.system.controller;
+
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+import com.ruoyi.common.excel.utils.ExcelUtil;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.common.security.annotation.InnerAuth;
+import com.ruoyi.common.security.annotation.RequiresPermissions;
+import com.ruoyi.system.api.domain.SysOperLog;
+import com.ruoyi.system.service.ISysOperLogService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 操作日志记录
+ *
+ * @author ruoyi
+ */
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/operlog")
+public class SysOperlogController extends BaseController {
+ private final ISysOperLogService operLogService;
+
+ @RequiresPermissions("system:operlog:list")
+ @GetMapping("/list")
+ public TableDataInfo list(SysOperLog operLog) {
+ startPage();
+ List list = operLogService.selectOperLogList(operLog);
+ return getDataTable(list);
+ }
+
+ @Log(title = "操作日志", businessType = BusinessType.EXPORT)
+ @RequiresPermissions("system:operlog:export")
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, SysOperLog operLog) {
+ List list = operLogService.selectOperLogList(operLog);
+ ExcelUtil.exportExcel(list, "操作日志", SysOperLog.class, response);
+ }
+
+ @Log(title = "操作日志", businessType = BusinessType.DELETE)
+ @RequiresPermissions("system:operlog:remove")
+ @DeleteMapping("/{operIds}")
+ public AjaxResult remove(@PathVariable Long[] operIds) {
+ return toAjax(operLogService.deleteOperLogByIds(operIds));
+ }
+
+ @RequiresPermissions("system:operlog:remove")
+ @Log(title = "操作日志", businessType = BusinessType.CLEAN)
+ @DeleteMapping("/clean")
+ public AjaxResult clean() {
+ operLogService.cleanOperLog();
+ return AjaxResult.success();
+ }
+
+ @InnerAuth
+ @PostMapping
+ public AjaxResult add(@RequestBody SysOperLog operLog) {
+ return toAjax(operLogService.insertOperlog(operLog));
+ }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysPostController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysPostController.java
index aefde836d..ca88bf7df 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysPostController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysPostController.java
@@ -1,113 +1,112 @@
-package com.ruoyi.system.controller;
-
-import com.ruoyi.common.core.constant.UserConstants;
-import com.ruoyi.common.core.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.web.controller.BaseController;
-import com.ruoyi.common.core.web.domain.AjaxResult;
-import com.ruoyi.common.core.web.page.TableDataInfo;
-import com.ruoyi.common.log.annotation.Log;
-import com.ruoyi.common.log.enums.BusinessType;
-import com.ruoyi.common.security.annotation.RequiresPermissions;
-import com.ruoyi.common.security.utils.SecurityUtils;
-import com.ruoyi.system.domain.SysPost;
-import com.ruoyi.system.service.ISysPostService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-
-/**
- * 岗位信息操作处理
- *
- * @author ruoyi
- */
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@RestController
-@RequestMapping("/post")
-public class SysPostController extends BaseController {
-
- private final ISysPostService postService;
-
- /**
- * 获取岗位列表
- */
- @RequiresPermissions("system:post:list")
- @GetMapping("/list")
- public TableDataInfo list(SysPost post) {
- startPage();
- List list = postService.selectPostList(post);
- return getDataTable(list);
- }
-
- @Log(title = "岗位管理", businessType = BusinessType.EXPORT)
- @RequiresPermissions("system:post:export")
- @PostMapping("/export")
- public void export(HttpServletResponse response, SysPost post) {
- List list = postService.selectPostList(post);
- ExcelUtil util = new ExcelUtil(SysPost.class);
- util.exportExcel(response, list, "岗位数据");
- }
-
- /**
- * 根据岗位编号获取详细信息
- */
- @RequiresPermissions("system:post:query")
- @GetMapping(value = "/{postId}")
- public AjaxResult getInfo(@PathVariable Long postId) {
- return AjaxResult.success(postService.selectPostById(postId));
- }
-
- /**
- * 新增岗位
- */
- @RequiresPermissions("system:post:add")
- @Log(title = "岗位管理", businessType = BusinessType.INSERT)
- @PostMapping
- public AjaxResult add(@Validated @RequestBody SysPost post) {
- if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) {
- return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");
- } else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) {
- return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
- }
- post.setCreateBy(SecurityUtils.getUsername());
- return toAjax(postService.insertPost(post));
- }
-
- /**
- * 修改岗位
- */
- @RequiresPermissions("system:post:edit")
- @Log(title = "岗位管理", businessType = BusinessType.UPDATE)
- @PutMapping
- public AjaxResult edit(@Validated @RequestBody SysPost post) {
- if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) {
- return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");
- } else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) {
- return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");
- }
- post.setUpdateBy(SecurityUtils.getUsername());
- return toAjax(postService.updatePost(post));
- }
-
- /**
- * 删除岗位
- */
- @RequiresPermissions("system:post:remove")
- @Log(title = "岗位管理", businessType = BusinessType.DELETE)
- @DeleteMapping("/{postIds}")
- public AjaxResult remove(@PathVariable Long[] postIds) {
- return toAjax(postService.deletePostByIds(postIds));
- }
-
- /**
- * 获取岗位选择框列表
- */
- @GetMapping("/optionselect")
- public AjaxResult optionselect() {
- List posts = postService.selectPostAll();
- return AjaxResult.success(posts);
- }
-}
+package com.ruoyi.system.controller;
+
+import com.ruoyi.common.core.constant.UserConstants;
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+import com.ruoyi.common.excel.utils.ExcelUtil;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.common.security.annotation.RequiresPermissions;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.system.domain.SysPost;
+import com.ruoyi.system.service.ISysPostService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 岗位信息操作处理
+ *
+ * @author ruoyi
+ */
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/post")
+public class SysPostController extends BaseController {
+
+ private final ISysPostService postService;
+
+ /**
+ * 获取岗位列表
+ */
+ @RequiresPermissions("system:post:list")
+ @GetMapping("/list")
+ public TableDataInfo list(SysPost post) {
+ startPage();
+ List list = postService.selectPostList(post);
+ return getDataTable(list);
+ }
+
+ @Log(title = "岗位管理", businessType = BusinessType.EXPORT)
+ @RequiresPermissions("system:post:export")
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, SysPost post) {
+ List list = postService.selectPostList(post);
+ ExcelUtil.exportExcel(list, "岗位数据", SysPost.class, response);
+ }
+
+ /**
+ * 根据岗位编号获取详细信息
+ */
+ @RequiresPermissions("system:post:query")
+ @GetMapping(value = "/{postId}")
+ public AjaxResult getInfo(@PathVariable Long postId) {
+ return AjaxResult.success(postService.selectPostById(postId));
+ }
+
+ /**
+ * 新增岗位
+ */
+ @RequiresPermissions("system:post:add")
+ @Log(title = "岗位管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@Validated @RequestBody SysPost post) {
+ if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) {
+ return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");
+ } else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) {
+ return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
+ }
+ post.setCreateBy(SecurityUtils.getUsername());
+ return toAjax(postService.insertPost(post));
+ }
+
+ /**
+ * 修改岗位
+ */
+ @RequiresPermissions("system:post:edit")
+ @Log(title = "岗位管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@Validated @RequestBody SysPost post) {
+ if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) {
+ return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");
+ } else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) {
+ return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");
+ }
+ post.setUpdateBy(SecurityUtils.getUsername());
+ return toAjax(postService.updatePost(post));
+ }
+
+ /**
+ * 删除岗位
+ */
+ @RequiresPermissions("system:post:remove")
+ @Log(title = "岗位管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{postIds}")
+ public AjaxResult remove(@PathVariable Long[] postIds) {
+ return toAjax(postService.deletePostByIds(postIds));
+ }
+
+ /**
+ * 获取岗位选择框列表
+ */
+ @GetMapping("/optionselect")
+ public AjaxResult optionselect() {
+ List posts = postService.selectPostAll();
+ return AjaxResult.success(posts);
+ }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java
index f96201f30..5a0c5e8b9 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java
@@ -1,5 +1,6 @@
package com.ruoyi.system.controller;
+import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.core.constant.UserConstants;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.web.controller.BaseController;
@@ -118,7 +119,7 @@ public class SysProfileController extends BaseController {
if (!file.isEmpty()) {
LoginUser loginUser = SecurityUtils.getLoginUser();
SysFile sysFile = remoteFileService.upload(file.getName(), file.getOriginalFilename(), file.getContentType(), file.getBytes());
- if (StringUtils.isNull(sysFile)) {
+ if (ObjectUtil.isNull(sysFile)) {
return AjaxResult.error("文件服务异常,请联系管理员");
}
String url = sysFile.getUrl();
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java
index 68d1f96b4..f44d457e5 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java
@@ -1,192 +1,191 @@
-package com.ruoyi.system.controller;
-
-import com.ruoyi.common.core.constant.UserConstants;
-import com.ruoyi.common.core.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.web.controller.BaseController;
-import com.ruoyi.common.core.web.domain.AjaxResult;
-import com.ruoyi.common.core.web.page.TableDataInfo;
-import com.ruoyi.common.log.annotation.Log;
-import com.ruoyi.common.log.enums.BusinessType;
-import com.ruoyi.common.security.annotation.RequiresPermissions;
-import com.ruoyi.common.security.utils.SecurityUtils;
-import com.ruoyi.system.api.domain.SysRole;
-import com.ruoyi.system.api.domain.SysUser;
-import com.ruoyi.system.domain.SysUserRole;
-import com.ruoyi.system.service.ISysRoleService;
-import com.ruoyi.system.service.ISysUserService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-
-/**
- * 角色信息
- *
- * @author ruoyi
- */
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@RestController
-@RequestMapping("/role")
-public class SysRoleController extends BaseController {
-
- private final ISysRoleService roleService;
- private final ISysUserService userService;
-
- @RequiresPermissions("system:role:list")
- @GetMapping("/list")
- public TableDataInfo list(SysRole role) {
- startPage();
- List list = roleService.selectRoleList(role);
- return getDataTable(list);
- }
-
- @Log(title = "角色管理", businessType = BusinessType.EXPORT)
- @RequiresPermissions("system:role:export")
- @PostMapping("/export")
- public void export(HttpServletResponse response, SysRole role) {
- List list = roleService.selectRoleList(role);
- ExcelUtil util = new ExcelUtil(SysRole.class);
- util.exportExcel(response, list, "角色数据");
- }
-
- /**
- * 根据角色编号获取详细信息
- */
- @RequiresPermissions("system:role:query")
- @GetMapping(value = "/{roleId}")
- public AjaxResult getInfo(@PathVariable Long roleId) {
- roleService.checkRoleDataScope(roleId);
- return AjaxResult.success(roleService.selectRoleById(roleId));
- }
-
- /**
- * 新增角色
- */
- @RequiresPermissions("system:role:add")
- @Log(title = "角色管理", businessType = BusinessType.INSERT)
- @PostMapping
- public AjaxResult add(@Validated @RequestBody SysRole role) {
- if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) {
- return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
- } else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) {
- return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
- }
- role.setCreateBy(SecurityUtils.getUsername());
- return toAjax(roleService.insertRole(role));
-
- }
-
- /**
- * 修改保存角色
- */
- @RequiresPermissions("system:role:edit")
- @Log(title = "角色管理", businessType = BusinessType.UPDATE)
- @PutMapping
- public AjaxResult edit(@Validated @RequestBody SysRole role) {
- roleService.checkRoleAllowed(role);
- if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) {
- return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
- } else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) {
- return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
- }
- role.setUpdateBy(SecurityUtils.getUsername());
- return toAjax(roleService.updateRole(role));
- }
-
- /**
- * 修改保存数据权限
- */
- @RequiresPermissions("system:role:edit")
- @Log(title = "角色管理", businessType = BusinessType.UPDATE)
- @PutMapping("/dataScope")
- public AjaxResult dataScope(@RequestBody SysRole role) {
- roleService.checkRoleAllowed(role);
- return toAjax(roleService.authDataScope(role));
- }
-
- /**
- * 状态修改
- */
- @RequiresPermissions("system:role:edit")
- @Log(title = "角色管理", businessType = BusinessType.UPDATE)
- @PutMapping("/changeStatus")
- public AjaxResult changeStatus(@RequestBody SysRole role) {
- roleService.checkRoleAllowed(role);
- role.setUpdateBy(SecurityUtils.getUsername());
- return toAjax(roleService.updateRoleStatus(role));
- }
-
- /**
- * 删除角色
- */
- @RequiresPermissions("system:role:remove")
- @Log(title = "角色管理", businessType = BusinessType.DELETE)
- @DeleteMapping("/{roleIds}")
- public AjaxResult remove(@PathVariable Long[] roleIds) {
- return toAjax(roleService.deleteRoleByIds(roleIds));
- }
-
- /**
- * 获取角色选择框列表
- */
- @RequiresPermissions("system:role:query")
- @GetMapping("/optionselect")
- public AjaxResult optionselect() {
- return AjaxResult.success(roleService.selectRoleAll());
- }
-
- /**
- * 查询已分配用户角色列表
- */
- @RequiresPermissions("system:role:list")
- @GetMapping("/authUser/allocatedList")
- public TableDataInfo allocatedList(SysUser user) {
- startPage();
- List list = userService.selectAllocatedList(user);
- return getDataTable(list);
- }
-
- /**
- * 查询未分配用户角色列表
- */
- @RequiresPermissions("system:role:list")
- @GetMapping("/authUser/unallocatedList")
- public TableDataInfo unallocatedList(SysUser user) {
- startPage();
- List list = userService.selectUnallocatedList(user);
- return getDataTable(list);
- }
-
- /**
- * 取消授权用户
- */
- @RequiresPermissions("system:role:edit")
- @Log(title = "角色管理", businessType = BusinessType.GRANT)
- @PutMapping("/authUser/cancel")
- public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole) {
- return toAjax(roleService.deleteAuthUser(userRole));
- }
-
- /**
- * 批量取消授权用户
- */
- @RequiresPermissions("system:role:edit")
- @Log(title = "角色管理", businessType = BusinessType.GRANT)
- @PutMapping("/authUser/cancelAll")
- public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds) {
- return toAjax(roleService.deleteAuthUsers(roleId, userIds));
- }
-
- /**
- * 批量选择用户授权
- */
- @RequiresPermissions("system:role:edit")
- @Log(title = "角色管理", businessType = BusinessType.GRANT)
- @PutMapping("/authUser/selectAll")
- public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds) {
- return toAjax(roleService.insertAuthUsers(roleId, userIds));
- }
-}
\ No newline at end of file
+package com.ruoyi.system.controller;
+
+import com.ruoyi.common.core.constant.UserConstants;
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+import com.ruoyi.common.excel.utils.ExcelUtil;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.common.security.annotation.RequiresPermissions;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.system.api.domain.SysRole;
+import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.domain.SysUserRole;
+import com.ruoyi.system.service.ISysRoleService;
+import com.ruoyi.system.service.ISysUserService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 角色信息
+ *
+ * @author ruoyi
+ */
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/role")
+public class SysRoleController extends BaseController {
+
+ private final ISysRoleService roleService;
+ private final ISysUserService userService;
+
+ @RequiresPermissions("system:role:list")
+ @GetMapping("/list")
+ public TableDataInfo list(SysRole role) {
+ startPage();
+ List list = roleService.selectRoleList(role);
+ return getDataTable(list);
+ }
+
+ @Log(title = "角色管理", businessType = BusinessType.EXPORT)
+ @RequiresPermissions("system:role:export")
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, SysRole role) {
+ List list = roleService.selectRoleList(role);
+ ExcelUtil.exportExcel(list, "角色数据", SysRole.class, response);
+ }
+
+ /**
+ * 根据角色编号获取详细信息
+ */
+ @RequiresPermissions("system:role:query")
+ @GetMapping(value = "/{roleId}")
+ public AjaxResult getInfo(@PathVariable Long roleId) {
+ roleService.checkRoleDataScope(roleId);
+ return AjaxResult.success(roleService.selectRoleById(roleId));
+ }
+
+ /**
+ * 新增角色
+ */
+ @RequiresPermissions("system:role:add")
+ @Log(title = "角色管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@Validated @RequestBody SysRole role) {
+ if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) {
+ return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
+ } else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) {
+ return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
+ }
+ role.setCreateBy(SecurityUtils.getUsername());
+ return toAjax(roleService.insertRole(role));
+
+ }
+
+ /**
+ * 修改保存角色
+ */
+ @RequiresPermissions("system:role:edit")
+ @Log(title = "角色管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@Validated @RequestBody SysRole role) {
+ roleService.checkRoleAllowed(role);
+ if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) {
+ return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
+ } else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) {
+ return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
+ }
+ role.setUpdateBy(SecurityUtils.getUsername());
+ return toAjax(roleService.updateRole(role));
+ }
+
+ /**
+ * 修改保存数据权限
+ */
+ @RequiresPermissions("system:role:edit")
+ @Log(title = "角色管理", businessType = BusinessType.UPDATE)
+ @PutMapping("/dataScope")
+ public AjaxResult dataScope(@RequestBody SysRole role) {
+ roleService.checkRoleAllowed(role);
+ return toAjax(roleService.authDataScope(role));
+ }
+
+ /**
+ * 状态修改
+ */
+ @RequiresPermissions("system:role:edit")
+ @Log(title = "角色管理", businessType = BusinessType.UPDATE)
+ @PutMapping("/changeStatus")
+ public AjaxResult changeStatus(@RequestBody SysRole role) {
+ roleService.checkRoleAllowed(role);
+ role.setUpdateBy(SecurityUtils.getUsername());
+ return toAjax(roleService.updateRoleStatus(role));
+ }
+
+ /**
+ * 删除角色
+ */
+ @RequiresPermissions("system:role:remove")
+ @Log(title = "角色管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{roleIds}")
+ public AjaxResult remove(@PathVariable Long[] roleIds) {
+ return toAjax(roleService.deleteRoleByIds(roleIds));
+ }
+
+ /**
+ * 获取角色选择框列表
+ */
+ @RequiresPermissions("system:role:query")
+ @GetMapping("/optionselect")
+ public AjaxResult optionselect() {
+ return AjaxResult.success(roleService.selectRoleAll());
+ }
+
+ /**
+ * 查询已分配用户角色列表
+ */
+ @RequiresPermissions("system:role:list")
+ @GetMapping("/authUser/allocatedList")
+ public TableDataInfo allocatedList(SysUser user) {
+ startPage();
+ List list = userService.selectAllocatedList(user);
+ return getDataTable(list);
+ }
+
+ /**
+ * 查询未分配用户角色列表
+ */
+ @RequiresPermissions("system:role:list")
+ @GetMapping("/authUser/unallocatedList")
+ public TableDataInfo unallocatedList(SysUser user) {
+ startPage();
+ List list = userService.selectUnallocatedList(user);
+ return getDataTable(list);
+ }
+
+ /**
+ * 取消授权用户
+ */
+ @RequiresPermissions("system:role:edit")
+ @Log(title = "角色管理", businessType = BusinessType.GRANT)
+ @PutMapping("/authUser/cancel")
+ public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole) {
+ return toAjax(roleService.deleteAuthUser(userRole));
+ }
+
+ /**
+ * 批量取消授权用户
+ */
+ @RequiresPermissions("system:role:edit")
+ @Log(title = "角色管理", businessType = BusinessType.GRANT)
+ @PutMapping("/authUser/cancelAll")
+ public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds) {
+ return toAjax(roleService.deleteAuthUsers(roleId, userIds));
+ }
+
+ /**
+ * 批量选择用户授权
+ */
+ @RequiresPermissions("system:role:edit")
+ @Log(title = "角色管理", businessType = BusinessType.GRANT)
+ @PutMapping("/authUser/selectAll")
+ public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds) {
+ return toAjax(roleService.insertAuthUsers(roleId, userIds));
+ }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
index dc51340b8..18bf39aec 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
@@ -1,223 +1,235 @@
-package com.ruoyi.system.controller;
-
-import com.ruoyi.common.core.constant.UserConstants;
-import com.ruoyi.common.core.utils.StringUtils;
-import com.ruoyi.common.core.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.web.controller.BaseController;
-import com.ruoyi.common.core.web.domain.AjaxResult;
-import com.ruoyi.common.core.web.page.TableDataInfo;
-import com.ruoyi.common.log.annotation.Log;
-import com.ruoyi.common.log.enums.BusinessType;
-import com.ruoyi.common.security.annotation.RequiresPermissions;
-import com.ruoyi.common.security.utils.SecurityUtils;
-import com.ruoyi.system.api.domain.SysRole;
-import com.ruoyi.system.api.domain.SysUser;
-import com.ruoyi.system.service.*;
-import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang3.ArrayUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * 用户信息
- *
- * @author ruoyi
- */
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@RestController
-@RequestMapping("/user")
-public class SysUserController extends BaseController {
-
- private final ISysUserService userService;
- private final ISysRoleService roleService;
- private final ISysPostService postService;
- private final ISysPermissionService permissionService;
- private final ISysConfigService configService;
-
- /**
- * 获取用户列表
- */
- @RequiresPermissions("system:user:list")
- @GetMapping("/list")
- public TableDataInfo list(SysUser user) {
- startPage();
- List list = userService.selectUserList(user);
- return getDataTable(list);
- }
-
- @Log(title = "用户管理", businessType = BusinessType.EXPORT)
- @RequiresPermissions("system:user:export")
- @PostMapping("/export")
- public void export(HttpServletResponse response, SysUser user) {
- List list = userService.selectUserList(user);
- ExcelUtil util = new ExcelUtil(SysUser.class);
- util.exportExcel(response, list, "用户数据");
- }
-
- @Log(title = "用户管理", businessType = BusinessType.IMPORT)
- @RequiresPermissions("system:user:import")
- @PostMapping("/importData")
- public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
- ExcelUtil util = new ExcelUtil(SysUser.class);
- List userList = util.importExcel(file.getInputStream());
- String operName = SecurityUtils.getUsername();
- String message = userService.importUser(userList, updateSupport, operName);
- return AjaxResult.success(message);
- }
-
- @PostMapping("/importTemplate")
- public void importTemplate(HttpServletResponse response) throws IOException {
- ExcelUtil util = new ExcelUtil(SysUser.class);
- util.importTemplateExcel(response, "用户数据");
- }
-
- /**
- * 获取用户信息
- *
- * @return 用户信息
- */
- @GetMapping("getInfo")
- public AjaxResult getInfo() {
- Long userId = SecurityUtils.getUserId();
- // 角色集合
- Set roles = permissionService.getRolePermission(userId);
- // 权限集合
- Set permissions = permissionService.getMenuPermission(userId);
- AjaxResult ajax = AjaxResult.success();
- ajax.put("user", userService.selectUserById(userId));
- ajax.put("roles", roles);
- ajax.put("permissions", permissions);
- return ajax;
- }
-
- /**
- * 根据用户编号获取详细信息
- */
- @RequiresPermissions("system:user:query")
- @GetMapping(value = {"/", "/{userId}"})
- public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) {
- userService.checkUserDataScope(userId);
- AjaxResult ajax = AjaxResult.success();
- List roles = roleService.selectRoleAll();
- ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
- ajax.put("posts", postService.selectPostAll());
- if (StringUtils.isNotNull(userId)) {
- SysUser sysUser = userService.selectUserById(userId);
- ajax.put(AjaxResult.DATA_TAG, sysUser);
- ajax.put("postIds", postService.selectPostListByUserId(userId));
- ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));
- }
- return ajax;
- }
-
- /**
- * 新增用户
- */
- @RequiresPermissions("system:user:add")
- @Log(title = "用户管理", businessType = BusinessType.INSERT)
- @PostMapping
- public AjaxResult add(@Validated @RequestBody SysUser user) {
- if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName()))) {
- return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
- } else if (StringUtils.isNotEmpty(user.getPhonenumber())
- && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
- return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
- } else if (StringUtils.isNotEmpty(user.getEmail())
- && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) {
- return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
- }
- user.setCreateBy(SecurityUtils.getUsername());
- user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
- return toAjax(userService.insertUser(user));
- }
-
- /**
- * 修改用户
- */
- @RequiresPermissions("system:user:edit")
- @Log(title = "用户管理", businessType = BusinessType.UPDATE)
- @PutMapping
- public AjaxResult edit(@Validated @RequestBody SysUser user) {
- userService.checkUserAllowed(user);
- if (StringUtils.isNotEmpty(user.getPhonenumber())
- && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
- return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
- } else if (StringUtils.isNotEmpty(user.getEmail())
- && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) {
- return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
- }
- user.setUpdateBy(SecurityUtils.getUsername());
- return toAjax(userService.updateUser(user));
- }
-
- /**
- * 删除用户
- */
- @RequiresPermissions("system:user:remove")
- @Log(title = "用户管理", businessType = BusinessType.DELETE)
- @DeleteMapping("/{userIds}")
- public AjaxResult remove(@PathVariable Long[] userIds) {
- if (ArrayUtils.contains(userIds, SecurityUtils.getUserId())) {
- return AjaxResult.error("当前用户不能删除");
- }
- return toAjax(userService.deleteUserByIds(userIds));
- }
-
- /**
- * 重置密码
- */
- @RequiresPermissions("system:user:edit")
- @Log(title = "用户管理", businessType = BusinessType.UPDATE)
- @PutMapping("/resetPwd")
- public AjaxResult resetPwd(@RequestBody SysUser user) {
- userService.checkUserAllowed(user);
- user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
- user.setUpdateBy(SecurityUtils.getUsername());
- return toAjax(userService.resetPwd(user));
- }
-
- /**
- * 状态修改
- */
- @RequiresPermissions("system:user:edit")
- @Log(title = "用户管理", businessType = BusinessType.UPDATE)
- @PutMapping("/changeStatus")
- public AjaxResult changeStatus(@RequestBody SysUser user) {
- userService.checkUserAllowed(user);
- user.setUpdateBy(SecurityUtils.getUsername());
- return toAjax(userService.updateUserStatus(user));
- }
-
- /**
- * 根据用户编号获取授权角色
- */
- @RequiresPermissions("system:user:query")
- @GetMapping("/authRole/{userId}")
- public AjaxResult authRole(@PathVariable("userId") Long userId) {
- AjaxResult ajax = AjaxResult.success();
- SysUser user = userService.selectUserById(userId);
- List roles = roleService.selectRolesByUserId(userId);
- ajax.put("user", user);
- ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
- return ajax;
- }
-
- /**
- * 用户授权角色
- */
- @RequiresPermissions("system:user:edit")
- @Log(title = "用户管理", businessType = BusinessType.GRANT)
- @PutMapping("/authRole")
- public AjaxResult insertAuthRole(Long userId, Long[] roleIds) {
- userService.insertUserAuth(userId, roleIds);
- return success();
- }
-}
+package com.ruoyi.system.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.common.core.constant.UserConstants;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+import com.ruoyi.common.excel.core.ExcelResult;
+import com.ruoyi.common.excel.utils.ExcelUtil;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.common.security.annotation.RequiresPermissions;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.system.api.domain.SysDept;
+import com.ruoyi.system.api.domain.SysRole;
+import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.domain.vo.SysUserExportVo;
+import com.ruoyi.system.domain.vo.SysUserImportVo;
+import com.ruoyi.system.listener.SysUserImportListener;
+import com.ruoyi.system.service.*;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 用户信息
+ *
+ * @author ruoyi
+ */
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/user")
+public class SysUserController extends BaseController {
+
+ private final ISysUserService userService;
+ private final ISysRoleService roleService;
+ private final ISysPostService postService;
+ private final ISysPermissionService permissionService;
+ private final ISysConfigService configService;
+
+ /**
+ * 获取用户列表
+ */
+ @RequiresPermissions("system:user:list")
+ @GetMapping("/list")
+ public TableDataInfo list(SysUser user) {
+ startPage();
+ List list = userService.selectUserList(user);
+ return getDataTable(list);
+ }
+
+ @Log(title = "用户管理", businessType = BusinessType.EXPORT)
+ @RequiresPermissions("system:user:export")
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, SysUser user) {
+ List list = userService.selectUserList(user);
+ List listVo = BeanUtil.copyToList(list, SysUserExportVo.class);
+ for (int i = 0; i < list.size(); i++) {
+ SysDept dept = list.get(i).getDept();
+ SysUserExportVo vo = listVo.get(i);
+ if (ObjectUtil.isNotEmpty(dept)) {
+ vo.setDeptName(dept.getDeptName());
+ vo.setLeader(dept.getLeader());
+ }
+ }
+ ExcelUtil.exportExcel(listVo, "用户数据", SysUserExportVo.class, response);
+ }
+
+ @Log(title = "用户管理", businessType = BusinessType.IMPORT)
+ @RequiresPermissions("system:user:import")
+ @PostMapping("/importData")
+ public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
+ ExcelResult result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport));
+ return AjaxResult.success(result.getAnalysis());
+ }
+
+ @PostMapping("/importTemplate")
+ public void importTemplate(HttpServletResponse response) throws IOException {
+ ExcelUtil.exportExcel(new ArrayList<>(), "用户数据", SysUserImportVo.class, response);
+ }
+
+ /**
+ * 获取用户信息
+ *
+ * @return 用户信息
+ */
+ @GetMapping("getInfo")
+ public AjaxResult getInfo() {
+ Long userId = SecurityUtils.getUserId();
+ // 角色集合
+ Set roles = permissionService.getRolePermission(userId);
+ // 权限集合
+ Set permissions = permissionService.getMenuPermission(userId);
+ AjaxResult ajax = AjaxResult.success();
+ ajax.put("user", userService.selectUserById(userId));
+ ajax.put("roles", roles);
+ ajax.put("permissions", permissions);
+ return ajax;
+ }
+
+ /**
+ * 根据用户编号获取详细信息
+ */
+ @RequiresPermissions("system:user:query")
+ @GetMapping(value = {"/", "/{userId}"})
+ public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) {
+ userService.checkUserDataScope(userId);
+ AjaxResult ajax = AjaxResult.success();
+ List roles = roleService.selectRoleAll();
+ ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
+ ajax.put("posts", postService.selectPostAll());
+ if (ObjectUtil.isNotNull(userId)) {
+ SysUser sysUser = userService.selectUserById(userId);
+ ajax.put(AjaxResult.DATA_TAG, sysUser);
+ ajax.put("postIds", postService.selectPostListByUserId(userId));
+ ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));
+ }
+ return ajax;
+ }
+
+ /**
+ * 新增用户
+ */
+ @RequiresPermissions("system:user:add")
+ @Log(title = "用户管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@Validated @RequestBody SysUser user) {
+ if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName()))) {
+ return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
+ } else if (StringUtils.isNotEmpty(user.getPhonenumber())
+ && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
+ return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
+ } else if (StringUtils.isNotEmpty(user.getEmail())
+ && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) {
+ return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
+ }
+ user.setCreateBy(SecurityUtils.getUsername());
+ user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+ return toAjax(userService.insertUser(user));
+ }
+
+ /**
+ * 修改用户
+ */
+ @RequiresPermissions("system:user:edit")
+ @Log(title = "用户管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@Validated @RequestBody SysUser user) {
+ userService.checkUserAllowed(user);
+ if (StringUtils.isNotEmpty(user.getPhonenumber())
+ && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
+ return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
+ } else if (StringUtils.isNotEmpty(user.getEmail())
+ && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) {
+ return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
+ }
+ user.setUpdateBy(SecurityUtils.getUsername());
+ return toAjax(userService.updateUser(user));
+ }
+
+ /**
+ * 删除用户
+ */
+ @RequiresPermissions("system:user:remove")
+ @Log(title = "用户管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{userIds}")
+ public AjaxResult remove(@PathVariable Long[] userIds) {
+ if (ArrayUtils.contains(userIds, SecurityUtils.getUserId())) {
+ return AjaxResult.error("当前用户不能删除");
+ }
+ return toAjax(userService.deleteUserByIds(userIds));
+ }
+
+ /**
+ * 重置密码
+ */
+ @RequiresPermissions("system:user:edit")
+ @Log(title = "用户管理", businessType = BusinessType.UPDATE)
+ @PutMapping("/resetPwd")
+ public AjaxResult resetPwd(@RequestBody SysUser user) {
+ userService.checkUserAllowed(user);
+ user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+ user.setUpdateBy(SecurityUtils.getUsername());
+ return toAjax(userService.resetPwd(user));
+ }
+
+ /**
+ * 状态修改
+ */
+ @RequiresPermissions("system:user:edit")
+ @Log(title = "用户管理", businessType = BusinessType.UPDATE)
+ @PutMapping("/changeStatus")
+ public AjaxResult changeStatus(@RequestBody SysUser user) {
+ userService.checkUserAllowed(user);
+ user.setUpdateBy(SecurityUtils.getUsername());
+ return toAjax(userService.updateUserStatus(user));
+ }
+
+ /**
+ * 根据用户编号获取授权角色
+ */
+ @RequiresPermissions("system:user:query")
+ @GetMapping("/authRole/{userId}")
+ public AjaxResult authRole(@PathVariable("userId") Long userId) {
+ AjaxResult ajax = AjaxResult.success();
+ SysUser user = userService.selectUserById(userId);
+ List roles = roleService.selectRolesByUserId(userId);
+ ajax.put("user", user);
+ ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
+ return ajax;
+ }
+
+ /**
+ * 用户授权角色
+ */
+ @RequiresPermissions("system:user:edit")
+ @Log(title = "用户管理", businessType = BusinessType.GRANT)
+ @PutMapping("/authRole")
+ public AjaxResult insertAuthRole(Long userId, Long[] roleIds) {
+ userService.insertUserAuth(userId, roleIds);
+ return success();
+ }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java
index a3435a4c2..d594554c3 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java
@@ -1,62 +1,78 @@
-package com.ruoyi.system.domain;
-
-import com.ruoyi.common.core.annotation.Excel;
-import com.ruoyi.common.core.annotation.Excel.ColumnType;
-import com.ruoyi.common.core.web.domain.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.Size;
-
-/**
- * 参数配置表 sys_config
- *
- * @author ruoyi
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@NoArgsConstructor
-@Accessors(chain = true)
-public class SysConfig extends BaseEntity {
- private static final long serialVersionUID = 1L;
-
- /**
- * 参数主键
- */
- @Excel(name = "参数主键", cellType = ColumnType.NUMERIC)
- private Long configId;
-
- /**
- * 参数名称
- */
- @NotBlank(message = "参数名称不能为空")
- @Size(min = 0, max = 100, message = "参数名称不能超过100个字符")
- @Excel(name = "参数名称")
- private String configName;
-
- /**
- * 参数键名
- */
- @NotBlank(message = "参数键名长度不能为空")
- @Size(min = 0, max = 100, message = "参数键名长度不能超过100个字符")
- @Excel(name = "参数键名")
- private String configKey;
-
- /**
- * 参数键值
- */
- @NotBlank(message = "参数键值不能为空")
- @Size(min = 0, max = 500, message = "参数键值长度不能超过500个字符")
- @Excel(name = "参数键值")
- private String configValue;
-
- /**
- * 系统内置(Y是 N否)
- */
- @Excel(name = "系统内置", readConverterExp = "Y=是,N=否")
- private String configType;
-
-}
+package com.ruoyi.system.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import com.ruoyi.common.excel.annotation.ExcelDictFormat;
+import com.ruoyi.common.excel.convert.ExcelDictConvert;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+/**
+ * 参数配置表 sys_config
+ *
+ * @author Lion Li
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@ExcelIgnoreUnannotated
+@ApiModel("参数配置业务对象")
+public class SysConfig extends BaseEntity {
+
+ /**
+ * 参数主键
+ */
+ @ApiModelProperty(value = "参数主键")
+ @ExcelProperty(value = "参数主键")
+ private Long configId;
+
+ /**
+ * 参数名称
+ */
+ @ApiModelProperty(value = "参数名称")
+ @ExcelProperty(value = "参数名称")
+ @NotBlank(message = "参数名称不能为空")
+ @Size(min = 0, max = 100, message = "参数名称不能超过100个字符")
+ private String configName;
+
+ /**
+ * 参数键名
+ */
+ @ApiModelProperty(value = "参数键名")
+ @ExcelProperty(value = "参数键名")
+ @NotBlank(message = "参数键名长度不能为空")
+ @Size(min = 0, max = 100, message = "参数键名长度不能超过100个字符")
+ private String configKey;
+
+ /**
+ * 参数键值
+ */
+ @ApiModelProperty(value = "参数键值")
+ @ExcelProperty(value = "参数键值")
+ @NotBlank(message = "参数键值不能为空")
+ @Size(min = 0, max = 500, message = "参数键值长度不能超过500个字符")
+ private String configValue;
+
+ /**
+ * 系统内置(Y是 N否)
+ */
+ @ApiModelProperty(value = "系统内置(Y是 N否)")
+ @ExcelProperty(value = "系统内置", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "sys_yes_no")
+ private String configType;
+
+ /**
+ * 备注
+ */
+ @ApiModelProperty(value = "备注")
+ private String remark;
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMenu.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMenu.java
index f9a4636ff..dd7423fdc 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMenu.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMenu.java
@@ -1,113 +1,116 @@
-package com.ruoyi.system.domain;
-
-import com.ruoyi.common.core.web.domain.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.Size;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 菜单权限表 sys_menu
- *
- * @author ruoyi
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@NoArgsConstructor
-@Accessors(chain = true)
-public class SysMenu extends BaseEntity {
- private static final long serialVersionUID = 1L;
-
- /**
- * 菜单ID
- */
- private Long menuId;
-
- /**
- * 菜单名称
- */
- @NotBlank(message = "菜单名称不能为空")
- @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符")
- private String menuName;
-
- /**
- * 父菜单名称
- */
- private String parentName;
-
- /**
- * 父菜单ID
- */
- private Long parentId;
-
- /**
- * 显示顺序
- */
- @NotBlank(message = "显示顺序不能为空")
- private String orderNum;
-
- /**
- * 路由地址
- */
- @Size(min = 0, max = 200, message = "路由地址不能超过200个字符")
- private String path;
-
- /**
- * 组件路径
- */
- @Size(min = 0, max = 200, message = "组件路径不能超过255个字符")
- private String component;
-
- /**
- * 路由参数
- */
- private String query;
-
- /**
- * 是否为外链(0是 1否)
- */
- private String isFrame;
-
- /**
- * 是否缓存(0缓存 1不缓存)
- */
- private String isCache;
-
- /**
- * 类型(M目录 C菜单 F按钮)
- */
- @NotBlank(message = "菜单类型不能为空")
- private String menuType;
-
- /**
- * 显示状态(0显示 1隐藏)
- */
- private String visible;
-
- /**
- * 菜单状态(0显示 1隐藏)
- */
- private String status;
-
- /**
- * 权限字符串
- */
- @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符")
- private String perms;
-
- /**
- * 菜单图标
- */
- private String icon;
-
- /**
- * 子菜单
- */
- private List children = new ArrayList();
-
-}
+package com.ruoyi.system.domain;
+
+import com.ruoyi.common.core.web.domain.TreeEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+/**
+ * 菜单权限表 sys_menu
+ *
+ * @author Lion Li
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@ApiModel("菜单权限业务对象")
+public class SysMenu extends TreeEntity {
+
+ /**
+ * 菜单ID
+ */
+ @ApiModelProperty(value = "菜单ID")
+ private Long menuId;
+
+ /**
+ * 菜单名称
+ */
+ @ApiModelProperty(value = "菜单名称")
+ @NotBlank(message = "菜单名称不能为空")
+ @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符")
+ private String menuName;
+
+ /**
+ * 显示顺序
+ */
+ @ApiModelProperty(value = "显示顺序")
+ @NotBlank(message = "显示顺序不能为空")
+ private String orderNum;
+
+ /**
+ * 路由地址
+ */
+ @ApiModelProperty(value = "路由地址")
+ @Size(min = 0, max = 200, message = "路由地址不能超过200个字符")
+ private String path;
+
+ /**
+ * 组件路径
+ */
+ @ApiModelProperty(value = "组件路径")
+ @Size(min = 0, max = 200, message = "组件路径不能超过255个字符")
+ private String component;
+
+ /**
+ * 路由参数
+ */
+ @ApiModelProperty(value = "路由参数")
+ private String query;
+
+ /**
+ * 是否为外链(0是 1否)
+ */
+ @ApiModelProperty(value = "是否为外链(0是 1否)")
+ private String isFrame;
+
+ /**
+ * 是否缓存(0缓存 1不缓存)
+ */
+ @ApiModelProperty(value = "是否缓存(0缓存 1不缓存)")
+ private String isCache;
+
+ /**
+ * 类型(M目录 C菜单 F按钮)
+ */
+ @ApiModelProperty(value = "类型(M目录 C菜单 F按钮)")
+ @NotBlank(message = "菜单类型不能为空")
+ private String menuType;
+
+ /**
+ * 显示状态(0显示 1隐藏)
+ */
+ @ApiModelProperty(value = "显示状态(0显示 1隐藏)")
+ private String visible;
+
+ /**
+ * 菜单状态(0显示 1隐藏)
+ */
+ @ApiModelProperty(value = "菜单状态(0显示 1隐藏)")
+ private String status;
+
+ /**
+ * 权限字符串
+ */
+ @ApiModelProperty(value = "权限字符串")
+ @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符")
+ private String perms;
+
+ /**
+ * 菜单图标
+ */
+ @ApiModelProperty(value = "菜单图标")
+ private String icon;
+
+ /**
+ * 备注
+ */
+ @ApiModelProperty(value = "备注")
+ private String remark;
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java
index abbca6e52..18a03b1f1 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java
@@ -1,53 +1,63 @@
-package com.ruoyi.system.domain;
-
-import com.ruoyi.common.core.web.domain.BaseEntity;
-import com.ruoyi.common.core.xss.Xss;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.Size;
-
-/**
- * 通知公告表 sys_notice
- *
- * @author ruoyi
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@NoArgsConstructor
-@Accessors(chain = true)
-public class SysNotice extends BaseEntity {
- private static final long serialVersionUID = 1L;
-
- /**
- * 公告ID
- */
- private Long noticeId;
-
- /**
- * 公告标题
- */
- @Xss(message = "公告标题不能包含脚本字符")
- @NotBlank(message = "公告标题不能为空")
- @Size(min = 0, max = 50, message = "公告标题不能超过50个字符")
- private String noticeTitle;
-
- /**
- * 公告类型(1通知 2公告)
- */
- private String noticeType;
-
- /**
- * 公告内容
- */
- private String noticeContent;
-
- /**
- * 公告状态(0正常 1关闭)
- */
- private String status;
-
-}
+package com.ruoyi.system.domain;
+
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import com.ruoyi.common.core.xss.Xss;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+
+/**
+ * 通知公告表 sys_notice
+ *
+ * @author Lion Li
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+public class SysNotice extends BaseEntity {
+
+ /**
+ * 公告ID
+ */
+ @ApiModelProperty(value = "公告ID")
+ private Long noticeId;
+
+ /**
+ * 公告标题
+ */
+ @Xss(message = "公告标题不能包含脚本字符")
+ @ApiModelProperty(value = "公告标题")
+ @NotBlank(message = "公告标题不能为空")
+ @Size(min = 0, max = 50, message = "公告标题不能超过50个字符")
+ private String noticeTitle;
+
+ /**
+ * 公告类型(1通知 2公告)
+ */
+ @ApiModelProperty(value = "公告类型(1通知 2公告)")
+ private String noticeType;
+
+ /**
+ * 公告内容
+ */
+ @ApiModelProperty(value = "公告内容")
+ private String noticeContent;
+
+ /**
+ * 公告状态(0正常 1关闭)
+ */
+ @ApiModelProperty(value = "公告状态(0正常 1关闭)")
+ private String status;
+
+ /**
+ * 备注
+ */
+ @ApiModelProperty(value = "备注")
+ private String remark;
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java
index 078251686..94e11a2a2 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java
@@ -1,66 +1,83 @@
-package com.ruoyi.system.domain;
-
-import com.ruoyi.common.core.annotation.Excel;
-import com.ruoyi.common.core.annotation.Excel.ColumnType;
-import com.ruoyi.common.core.web.domain.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.Size;
-
-/**
- * 岗位表 sys_post
- *
- * @author ruoyi
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@NoArgsConstructor
-@Accessors(chain = true)
-public class SysPost extends BaseEntity {
- private static final long serialVersionUID = 1L;
-
- /**
- * 岗位序号
- */
- @Excel(name = "岗位序号", cellType = ColumnType.NUMERIC)
- private Long postId;
-
- /**
- * 岗位编码
- */
- @NotBlank(message = "岗位编码不能为空")
- @Size(min = 0, max = 64, message = "岗位编码长度不能超过64个字符")
- @Excel(name = "岗位编码")
- private String postCode;
-
- /**
- * 岗位名称
- */
- @NotBlank(message = "岗位名称不能为空")
- @Size(min = 0, max = 50, message = "岗位名称长度不能超过50个字符")
- @Excel(name = "岗位名称")
- private String postName;
-
- /**
- * 岗位排序
- */
- @NotBlank(message = "显示顺序不能为空")
- @Excel(name = "岗位排序")
- private String postSort;
-
- /**
- * 状态(0正常 1停用)
- */
- @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
- private String status;
-
- /**
- * 用户是否存在此岗位标识 默认不存在
- */
- private boolean flag = false;
-
-}
+package com.ruoyi.system.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import com.ruoyi.common.excel.annotation.ExcelDictFormat;
+import com.ruoyi.common.excel.convert.ExcelDictConvert;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+/**
+ * 岗位表 sys_post
+ *
+ * @author Lion Li
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@ExcelIgnoreUnannotated
+@ApiModel("岗位信息业务对象")
+public class SysPost extends BaseEntity {
+
+ /**
+ * 岗位序号
+ */
+ @ApiModelProperty(value = "岗位序号")
+ @ExcelProperty(value = "岗位序号")
+ private Long postId;
+
+ /**
+ * 岗位编码
+ */
+ @ApiModelProperty(value = "岗位编码")
+ @ExcelProperty(value = "岗位编码")
+ @NotBlank(message = "岗位编码不能为空")
+ @Size(min = 0, max = 64, message = "岗位编码长度不能超过64个字符")
+ private String postCode;
+
+ /**
+ * 岗位名称
+ */
+ @ApiModelProperty(value = "岗位名称")
+ @ExcelProperty(value = "岗位名称")
+ @NotBlank(message = "岗位名称不能为空")
+ @Size(min = 0, max = 50, message = "岗位名称长度不能超过50个字符")
+ private String postName;
+
+ /**
+ * 岗位排序
+ */
+ @ApiModelProperty(value = "岗位排序")
+ @ExcelProperty(value = "岗位排序")
+ @NotBlank(message = "显示顺序不能为空")
+ private String postSort;
+
+ /**
+ * 状态(0正常 1停用)
+ */
+ @ApiModelProperty(value = "状态(0正常 1停用)")
+ @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "sys_common_status")
+ private String status;
+
+ /**
+ * 备注
+ */
+ @ApiModelProperty(value = "备注")
+ private String remark;
+
+ /**
+ * 用户是否存在此岗位标识 默认不存在
+ */
+ @ApiModelProperty(value = "用户是否存在此岗位标识 默认不存在")
+ private boolean flag = false;
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java
index 13a92c8e1..9203bbb1e 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java
@@ -1,27 +1,31 @@
-package com.ruoyi.system.domain;
-
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-/**
- * 角色和部门关联 sys_role_dept
- *
- * @author ruoyi
- */
-@Data
-@NoArgsConstructor
-@Accessors(chain = true)
-public class SysRoleDept {
-
- /**
- * 角色ID
- */
- private Long roleId;
-
- /**
- * 部门ID
- */
- private Long deptId;
-
-}
+package com.ruoyi.system.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 角色和部门关联 sys_role_dept
+ *
+ * @author Lion Li
+ */
+
+@Data
+@Accessors(chain = true)
+@ApiModel("角色和部门关联")
+public class SysRoleDept {
+
+ /**
+ * 角色ID
+ */
+ @ApiModelProperty(value = "角色ID")
+ private Long roleId;
+
+ /**
+ * 部门ID
+ */
+ @ApiModelProperty(value = "部门ID")
+ private Long deptId;
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java
index 2e911f3e2..da34f00db 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java
@@ -1,27 +1,31 @@
-package com.ruoyi.system.domain;
-
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-/**
- * 角色和菜单关联 sys_role_menu
- *
- * @author ruoyi
- */
-@Data
-@NoArgsConstructor
-@Accessors(chain = true)
-public class SysRoleMenu {
-
- /**
- * 角色ID
- */
- private Long roleId;
-
- /**
- * 菜单ID
- */
- private Long menuId;
-
-}
+package com.ruoyi.system.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 角色和菜单关联 sys_role_menu
+ *
+ * @author Lion Li
+ */
+
+@Data
+@Accessors(chain = true)
+@ApiModel("角色和菜单关联")
+public class SysRoleMenu {
+
+ /**
+ * 角色ID
+ */
+ @ApiModelProperty(value = "角色ID")
+ private Long roleId;
+
+ /**
+ * 菜单ID
+ */
+ @ApiModelProperty(value = "角色ID")
+ private Long menuId;
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java
index 6c4b249e7..656b4eef2 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java
@@ -1,52 +1,67 @@
package com.ruoyi.system.domain;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* 当前在线会话
*
- * @author ruoyi
+ * @author Lion Li
*/
+
@Data
-@NoArgsConstructor
@Accessors(chain = true)
+@ApiModel("当前在线会话业务对象")
public class SysUserOnline {
/**
* 会话编号
*/
+ @ApiModelProperty(value = "会话编号")
private String tokenId;
+ /**
+ * 部门名称
+ */
+ @ApiModelProperty(value = "部门名称")
+ private String deptName;
+
/**
* 用户名称
*/
+ @ApiModelProperty(value = "用户名称")
private String userName;
/**
* 登录IP地址
*/
+ @ApiModelProperty(value = "登录IP地址")
private String ipaddr;
/**
* 登录地址
*/
+ @ApiModelProperty(value = "登录地址")
private String loginLocation;
/**
* 浏览器类型
*/
+ @ApiModelProperty(value = "浏览器类型")
private String browser;
/**
* 操作系统
*/
+ @ApiModelProperty(value = "操作系统")
private String os;
/**
* 登录时间
*/
+ @ApiModelProperty(value = "登录时间")
private Long loginTime;
}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java
index 9fa841b60..a3dcbd07b 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java
@@ -1,27 +1,31 @@
-package com.ruoyi.system.domain;
-
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-/**
- * 用户和岗位关联 sys_user_post
- *
- * @author ruoyi
- */
-@Data
-@NoArgsConstructor
-@Accessors(chain = true)
-public class SysUserPost {
-
- /**
- * 用户ID
- */
- private Long userId;
-
- /**
- * 岗位ID
- */
- private Long postId;
-
-}
+package com.ruoyi.system.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 用户和岗位关联 sys_user_post
+ *
+ * @author Lion Li
+ */
+
+@Data
+@Accessors(chain = true)
+@ApiModel("用户和岗位关联")
+public class SysUserPost {
+
+ /**
+ * 用户ID
+ */
+ @ApiModelProperty(value = "用户ID")
+ private Long userId;
+
+ /**
+ * 岗位ID
+ */
+ @ApiModelProperty(value = "岗位ID")
+ private Long postId;
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java
index 72632f2d6..c279adc3e 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java
@@ -1,27 +1,31 @@
-package com.ruoyi.system.domain;
-
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-/**
- * 用户和角色关联 sys_user_role
- *
- * @author ruoyi
- */
-@Data
-@NoArgsConstructor
-@Accessors(chain = true)
-public class SysUserRole {
-
- /**
- * 用户ID
- */
- private Long userId;
-
- /**
- * 角色ID
- */
- private Long roleId;
-
-}
+package com.ruoyi.system.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 用户和角色关联 sys_user_role
+ *
+ * @author Lion Li
+ */
+
+@Data
+@Accessors(chain = true)
+@ApiModel("用户和角色关联")
+public class SysUserRole {
+
+ /**
+ * 用户ID
+ */
+ @ApiModelProperty(value = "用户ID")
+ private Long userId;
+
+ /**
+ * 角色ID
+ */
+ @ApiModelProperty(value = "角色ID")
+ private Long roleId;
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysUserExportVo.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysUserExportVo.java
new file mode 100644
index 000000000..6a9f1df4f
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysUserExportVo.java
@@ -0,0 +1,93 @@
+package com.ruoyi.system.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.excel.annotation.ExcelDictFormat;
+import com.ruoyi.common.excel.convert.ExcelDictConvert;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 用户对象导出VO
+ *
+ * @author Lion Li
+ */
+
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class SysUserExportVo implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 用户ID
+ */
+ @ExcelProperty(value = "用户序号")
+ private Long userId;
+
+ /**
+ * 用户账号
+ */
+ @ExcelProperty(value = "登录名称")
+ private String userName;
+
+ /**
+ * 用户昵称
+ */
+ @ExcelProperty(value = "用户名称")
+ private String nickName;
+
+ /**
+ * 用户邮箱
+ */
+ @ExcelProperty(value = "用户邮箱")
+ private String email;
+
+ /**
+ * 手机号码
+ */
+ @ExcelProperty(value = "手机号码")
+ private String phonenumber;
+
+ /**
+ * 用户性别
+ */
+ @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "sys_user_sex")
+ private String sex;
+
+ /**
+ * 帐号状态(0正常 1停用)
+ */
+ @ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "sys_common_status")
+ private String status;
+
+ /**
+ * 最后登录IP
+ */
+ @ExcelProperty(value = "最后登录IP")
+ private String loginIp;
+
+ /**
+ * 最后登录时间
+ */
+ @ExcelProperty(value = "最后登录时间")
+ private Date loginDate;
+
+ /**
+ * 部门名称
+ */
+ @ExcelProperty(value = "部门名称")
+ private String deptName;
+
+ /**
+ * 负责人
+ */
+ @ExcelProperty(value = "部门负责人")
+ private String leader;
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysUserImportVo.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysUserImportVo.java
new file mode 100644
index 000000000..d77f3836b
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysUserImportVo.java
@@ -0,0 +1,73 @@
+package com.ruoyi.system.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.excel.annotation.ExcelDictFormat;
+import com.ruoyi.common.excel.convert.ExcelDictConvert;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 用户对象导入VO
+ *
+ * @author Lion Li
+ */
+
+@Data
+@NoArgsConstructor
+// @Accessors(chain = true) // 导入不允许使用 会找不到set方法
+public class SysUserImportVo implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 用户ID
+ */
+ @ExcelProperty(value = "用户序号")
+ private Long userId;
+
+ /**
+ * 部门ID
+ */
+ @ExcelProperty(value = "部门编号")
+ private Long deptId;
+
+ /**
+ * 用户账号
+ */
+ @ExcelProperty(value = "登录名称")
+ private String userName;
+
+ /**
+ * 用户昵称
+ */
+ @ExcelProperty(value = "用户名称")
+ private String nickName;
+
+ /**
+ * 用户邮箱
+ */
+ @ExcelProperty(value = "用户邮箱")
+ private String email;
+
+ /**
+ * 手机号码
+ */
+ @ExcelProperty(value = "手机号码")
+ private String phonenumber;
+
+ /**
+ * 用户性别
+ */
+ @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "sys_user_sex")
+ private String sex;
+
+ /**
+ * 帐号状态(0正常 1停用)
+ */
+ @ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "sys_normal_disable")
+ private String status;
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TreeSelect.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TreeSelect.java
deleted file mode 100644
index 8ae8e6cc1..000000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TreeSelect.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.ruoyi.system.domain.vo;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.ruoyi.system.api.domain.SysDept;
-import com.ruoyi.system.domain.SysMenu;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import java.io.Serializable;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * Treeselect树结构实体类
- *
- * @author ruoyi
- */
-@Data
-@NoArgsConstructor
-@Accessors(chain = true)
-public class TreeSelect implements Serializable {
- private static final long serialVersionUID = 1L;
-
- /**
- * 节点ID
- */
- private Long id;
-
- /**
- * 节点名称
- */
- private String label;
-
- /**
- * 子节点
- */
- @JsonInclude(JsonInclude.Include.NON_EMPTY)
- private List children;
-
- public TreeSelect(SysDept dept) {
- this.id = dept.getDeptId();
- this.label = dept.getDeptName();
- this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
- }
-
- public TreeSelect(SysMenu menu) {
- this.id = menu.getMenuId();
- this.label = menu.getMenuName();
- this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
- }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/dubbo/RemoteUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/dubbo/RemoteUserServiceImpl.java
index ac1beba16..6cb644ed6 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/dubbo/RemoteUserServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/dubbo/RemoteUserServiceImpl.java
@@ -1,8 +1,8 @@
package com.ruoyi.system.dubbo;
+import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.core.constant.UserConstants;
import com.ruoyi.common.core.exception.ServiceException;
-import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.system.api.RemoteUserService;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.model.LoginUser;
@@ -33,7 +33,7 @@ public class RemoteUserServiceImpl implements RemoteUserService {
@Override
public LoginUser getUserInfo(String username, String source) {
SysUser sysUser = userService.selectUserByUserName(username);
- if (StringUtils.isNull(sysUser)) {
+ if (ObjectUtil.isNull(sysUser)) {
throw new ServiceException("用户名或密码错误");
}
// 角色集合
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java
new file mode 100644
index 000000000..2de97e445
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java
@@ -0,0 +1,112 @@
+package com.ruoyi.system.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.ruoyi.common.core.exception.ServiceException;
+import com.ruoyi.common.core.utils.SpringUtils;
+import com.ruoyi.common.core.utils.ValidatorUtils;
+import com.ruoyi.common.excel.core.ExcelListener;
+import com.ruoyi.common.excel.core.ExcelResult;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.domain.vo.SysUserImportVo;
+import com.ruoyi.system.service.ISysConfigService;
+import com.ruoyi.system.service.ISysUserService;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+
+/**
+ * 系统用户自定义导入
+ *
+ * @author Lion Li
+ */
+@Slf4j
+public class SysUserImportListener extends AnalysisEventListener implements ExcelListener {
+
+ private final ISysUserService userService;
+
+ private final String password;
+
+ private final Boolean isUpdateSupport;
+
+ private final String operName;
+
+ private int successNum = 0;
+ private int failureNum = 0;
+ private final StringBuilder successMsg = new StringBuilder();
+ private final StringBuilder failureMsg = new StringBuilder();
+
+ public SysUserImportListener(Boolean isUpdateSupport) {
+ String initPassword = SpringUtils.getBean(ISysConfigService.class).selectConfigByKey("sys.user.initPassword");
+ this.userService = SpringUtils.getBean(ISysUserService.class);
+ this.password = SecurityUtils.encryptPassword(initPassword);
+ this.isUpdateSupport = isUpdateSupport;
+ this.operName = SecurityUtils.getUsername();
+ }
+
+ @Override
+ public void invoke(SysUserImportVo userVo, AnalysisContext context) {
+ SysUser user = this.userService.selectUserByUserName(userVo.getUserName());
+ try {
+ // 验证是否存在这个用户
+ if (ObjectUtil.isNull(user)) {
+ user = BeanUtil.toBean(userVo, SysUser.class);
+ ValidatorUtils.validate(user);
+ user.setPassword(password);
+ user.setCreateBy(operName);
+ userService.insertUser(user);
+ successNum++;
+ successMsg.append("
").append(successNum).append("、账号 ").append(user.getUserName()).append(" 导入成功");
+ } else if (isUpdateSupport) {
+ ValidatorUtils.validate(user);
+ user.setUpdateBy(operName);
+ userService.updateUser(user);
+ successNum++;
+ successMsg.append("
").append(successNum).append("、账号 ").append(user.getUserName()).append(" 更新成功");
+ } else {
+ failureNum++;
+ failureMsg.append("
").append(failureNum).append("、账号 ").append(user.getUserName()).append(" 已存在");
+ }
+ } catch (Exception e) {
+ failureNum++;
+ String msg = "
" + failureNum + "、账号 " + user.getUserName() + " 导入失败:";
+ failureMsg.append(msg).append(e.getMessage());
+ log.error(msg, e);
+ }
+ }
+
+ @Override
+ public void doAfterAllAnalysed(AnalysisContext context) {
+
+ }
+
+ @Override
+ public ExcelResult getExcelResult() {
+ return new ExcelResult() {
+
+ @Override
+ public String getAnalysis() {
+ if (failureNum > 0) {
+ failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+ throw new ServiceException(failureMsg.toString());
+ } else {
+ successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+ }
+ return successMsg.toString();
+ }
+
+ @Override
+ public List getList() {
+ return null;
+ }
+
+ @Override
+ public List getErrorList() {
+ return null;
+ }
+ };
+ }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java
index e31a527b5..ad4764467 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java
@@ -1,116 +1,116 @@
-package com.ruoyi.system.service;
-
-import com.ruoyi.system.api.domain.SysDept;
-import com.ruoyi.system.domain.vo.TreeSelect;
-
-import java.util.List;
-
-/**
- * 部门管理 服务层
- *
- * @author ruoyi
- */
-public interface ISysDeptService {
- /**
- * 查询部门管理数据
- *
- * @param dept 部门信息
- * @return 部门信息集合
- */
- List selectDeptList(SysDept dept);
-
- /**
- * 构建前端所需要树结构
- *
- * @param depts 部门列表
- * @return 树结构列表
- */
- List buildDeptTree(List depts);
-
- /**
- * 构建前端所需要下拉树结构
- *
- * @param depts 部门列表
- * @return 下拉树结构列表
- */
- List buildDeptTreeSelect(List depts);
-
- /**
- * 根据角色ID查询部门树信息
- *
- * @param roleId 角色ID
- * @return 选中部门列表
- */
- List selectDeptListByRoleId(Long roleId);
-
- /**
- * 根据部门ID查询信息
- *
- * @param deptId 部门ID
- * @return 部门信息
- */
- SysDept selectDeptById(Long deptId);
-
- /**
- * 根据ID查询所有子部门(正常状态)
- *
- * @param deptId 部门ID
- * @return 子部门数
- */
- int selectNormalChildrenDeptById(Long deptId);
-
- /**
- * 是否存在部门子节点
- *
- * @param deptId 部门ID
- * @return 结果
- */
- boolean hasChildByDeptId(Long deptId);
-
- /**
- * 查询部门是否存在用户
- *
- * @param deptId 部门ID
- * @return 结果 true 存在 false 不存在
- */
- boolean checkDeptExistUser(Long deptId);
-
- /**
- * 校验部门名称是否唯一
- *
- * @param dept 部门信息
- * @return 结果
- */
- String checkDeptNameUnique(SysDept dept);
-
- /**
- * 校验部门是否有数据权限
- *
- * @param deptId 部门id
- */
- void checkDeptDataScope(Long deptId);
-
- /**
- * 新增保存部门信息
- *
- * @param dept 部门信息
- * @return 结果
- */
- int insertDept(SysDept dept);
-
- /**
- * 修改保存部门信息
- *
- * @param dept 部门信息
- * @return 结果
- */
- int updateDept(SysDept dept);
-
- /**
- * 删除部门管理信息
- *
- * @param deptId 部门ID
- * @return 结果
- */
- int deleteDeptById(Long deptId);
-}
+package com.ruoyi.system.service;
+
+import cn.hutool.core.lang.tree.Tree;
+import com.ruoyi.system.api.domain.SysDept;
+
+import java.util.List;
+
+/**
+ * 部门管理 服务层
+ *
+ * @author ruoyi
+ */
+public interface ISysDeptService {
+ /**
+ * 查询部门管理数据
+ *
+ * @param dept 部门信息
+ * @return 部门信息集合
+ */
+ List selectDeptList(SysDept dept);
+
+ /**
+ * 构建前端所需要树结构
+ *
+ * @param depts 部门列表
+ * @return 树结构列表
+ */
+ List buildDeptTree(List depts);
+
+ /**
+ * 构建前端所需要下拉树结构
+ *
+ * @param depts 部门列表
+ * @return 下拉树结构列表
+ */
+ List> buildDeptTreeSelect(List depts);
+
+ /**
+ * 根据角色ID查询部门树信息
+ *
+ * @param roleId 角色ID
+ * @return 选中部门列表
+ */
+ List selectDeptListByRoleId(Long roleId);
+
+ /**
+ * 根据部门ID查询信息
+ *
+ * @param deptId 部门ID
+ * @return 部门信息
+ */
+ SysDept selectDeptById(Long deptId);
+
+ /**
+ * 根据ID查询所有子部门(正常状态)
+ *
+ * @param deptId 部门ID
+ * @return 子部门数
+ */
+ int selectNormalChildrenDeptById(Long deptId);
+
+ /**
+ * 是否存在部门子节点
+ *
+ * @param deptId 部门ID
+ * @return 结果
+ */
+ boolean hasChildByDeptId(Long deptId);
+
+ /**
+ * 查询部门是否存在用户
+ *
+ * @param deptId 部门ID
+ * @return 结果 true 存在 false 不存在
+ */
+ boolean checkDeptExistUser(Long deptId);
+
+ /**
+ * 校验部门名称是否唯一
+ *
+ * @param dept 部门信息
+ * @return 结果
+ */
+ String checkDeptNameUnique(SysDept dept);
+
+ /**
+ * 校验部门是否有数据权限
+ *
+ * @param deptId 部门id
+ */
+ void checkDeptDataScope(Long deptId);
+
+ /**
+ * 新增保存部门信息
+ *
+ * @param dept 部门信息
+ * @return 结果
+ */
+ int insertDept(SysDept dept);
+
+ /**
+ * 修改保存部门信息
+ *
+ * @param dept 部门信息
+ * @return 结果
+ */
+ int updateDept(SysDept dept);
+
+ /**
+ * 删除部门管理信息
+ *
+ * @param deptId 部门ID
+ * @return 结果
+ */
+ int deleteDeptById(Long deptId);
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java
index 62fb7c911..cf515e34d 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java
@@ -1,136 +1,128 @@
-package com.ruoyi.system.service;
-
-import com.ruoyi.system.domain.SysMenu;
-import com.ruoyi.system.domain.vo.RouterVo;
-import com.ruoyi.system.domain.vo.TreeSelect;
-
-import java.util.List;
-import java.util.Set;
-
-/**
- * 菜单 业务层
- *
- * @author ruoyi
- */
-public interface ISysMenuService {
- /**
- * 根据用户查询系统菜单列表
- *
- * @param userId 用户ID
- * @return 菜单列表
- */
- List selectMenuList(Long userId);
-
- /**
- * 根据用户查询系统菜单列表
- *
- * @param menu 菜单信息
- * @param userId 用户ID
- * @return 菜单列表
- */
- List selectMenuList(SysMenu menu, Long userId);
-
- /**
- * 根据用户ID查询权限
- *
- * @param userId 用户ID
- * @return 权限列表
- */
- Set selectMenuPermsByUserId(Long userId);
-
- /**
- * 根据用户ID查询菜单树信息
- *
- * @param userId 用户ID
- * @return 菜单列表
- */
- List selectMenuTreeByUserId(Long userId);
-
- /**
- * 根据角色ID查询菜单树信息
- *
- * @param roleId 角色ID
- * @return 选中菜单列表
- */
- List selectMenuListByRoleId(Long roleId);
-
- /**
- * 构建前端路由所需要的菜单
- *
- * @param menus 菜单列表
- * @return 路由列表
- */
- List buildMenus(List menus);
-
- /**
- * 构建前端所需要树结构
- *
- * @param menus 菜单列表
- * @return 树结构列表
- */
- List buildMenuTree(List menus);
-
- /**
- * 构建前端所需要下拉树结构
- *
- * @param menus 菜单列表
- * @return 下拉树结构列表
- */
- List buildMenuTreeSelect(List menus);
-
- /**
- * 根据菜单ID查询信息
- *
- * @param menuId 菜单ID
- * @return 菜单信息
- */
- SysMenu selectMenuById(Long menuId);
-
- /**
- * 是否存在菜单子节点
- *
- * @param menuId 菜单ID
- * @return 结果 true 存在 false 不存在
- */
- boolean hasChildByMenuId(Long menuId);
-
- /**
- * 查询菜单是否存在角色
- *
- * @param menuId 菜单ID
- * @return 结果 true 存在 false 不存在
- */
- boolean checkMenuExistRole(Long menuId);
-
- /**
- * 新增保存菜单信息
- *
- * @param menu 菜单信息
- * @return 结果
- */
- int insertMenu(SysMenu menu);
-
- /**
- * 修改保存菜单信息
- *
- * @param menu 菜单信息
- * @return 结果
- */
- int updateMenu(SysMenu menu);
-
- /**
- * 删除菜单管理信息
- *
- * @param menuId 菜单ID
- * @return 结果
- */
- int deleteMenuById(Long menuId);
-
- /**
- * 校验菜单名称是否唯一
- *
- * @param menu 菜单信息
- * @return 结果
- */
- String checkMenuNameUnique(SysMenu menu);
-}
+package com.ruoyi.system.service;
+
+import cn.hutool.core.lang.tree.Tree;
+import com.ruoyi.system.domain.SysMenu;
+import com.ruoyi.system.domain.vo.RouterVo;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 菜单 业务层
+ *
+ * @author ruoyi
+ */
+public interface ISysMenuService {
+ /**
+ * 根据用户查询系统菜单列表
+ *
+ * @param userId 用户ID
+ * @return 菜单列表
+ */
+ List selectMenuList(Long userId);
+
+ /**
+ * 根据用户查询系统菜单列表
+ *
+ * @param menu 菜单信息
+ * @param userId 用户ID
+ * @return 菜单列表
+ */
+ List selectMenuList(SysMenu menu, Long userId);
+
+ /**
+ * 根据用户ID查询权限
+ *
+ * @param userId 用户ID
+ * @return 权限列表
+ */
+ Set selectMenuPermsByUserId(Long userId);
+
+ /**
+ * 根据用户ID查询菜单树信息
+ *
+ * @param userId 用户ID
+ * @return 菜单列表
+ */
+ List selectMenuTreeByUserId(Long userId);
+
+ /**
+ * 根据角色ID查询菜单树信息
+ *
+ * @param roleId 角色ID
+ * @return 选中菜单列表
+ */
+ List selectMenuListByRoleId(Long roleId);
+
+ /**
+ * 构建前端路由所需要的菜单
+ *
+ * @param menus 菜单列表
+ * @return 路由列表
+ */
+ List buildMenus(List menus);
+
+ /**
+ * 构建前端所需要下拉树结构
+ *
+ * @param menus 菜单列表
+ * @return 下拉树结构列表
+ */
+ List> buildMenuTreeSelect(List menus);
+
+ /**
+ * 根据菜单ID查询信息
+ *
+ * @param menuId 菜单ID
+ * @return 菜单信息
+ */
+ SysMenu selectMenuById(Long menuId);
+
+ /**
+ * 是否存在菜单子节点
+ *
+ * @param menuId 菜单ID
+ * @return 结果 true 存在 false 不存在
+ */
+ boolean hasChildByMenuId(Long menuId);
+
+ /**
+ * 查询菜单是否存在角色
+ *
+ * @param menuId 菜单ID
+ * @return 结果 true 存在 false 不存在
+ */
+ boolean checkMenuExistRole(Long menuId);
+
+ /**
+ * 新增保存菜单信息
+ *
+ * @param menu 菜单信息
+ * @return 结果
+ */
+ int insertMenu(SysMenu menu);
+
+ /**
+ * 修改保存菜单信息
+ *
+ * @param menu 菜单信息
+ * @return 结果
+ */
+ int updateMenu(SysMenu menu);
+
+ /**
+ * 删除菜单管理信息
+ *
+ * @param menuId 菜单ID
+ * @return 结果
+ */
+ int deleteMenuById(Long menuId);
+
+ /**
+ * 校验菜单名称是否唯一
+ *
+ * @param menu 菜单信息
+ * @return 结果
+ */
+ String checkMenuNameUnique(SysMenu menu);
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
index 440fcd9fa..7ee220aae 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
@@ -1,206 +1,197 @@
-package com.ruoyi.system.service;
-
-import com.ruoyi.system.api.domain.SysUser;
-
-import java.util.List;
-
-/**
- * 用户 业务层
- *
- * @author ruoyi
- */
-public interface ISysUserService {
- /**
- * 根据条件分页查询用户列表
- *
- * @param user 用户信息
- * @return 用户信息集合信息
- */
- List selectUserList(SysUser user);
-
- /**
- * 根据条件分页查询已分配用户角色列表
- *
- * @param user 用户信息
- * @return 用户信息集合信息
- */
- List selectAllocatedList(SysUser user);
-
- /**
- * 根据条件分页查询未分配用户角色列表
- *
- * @param user 用户信息
- * @return 用户信息集合信息
- */
- List selectUnallocatedList(SysUser user);
-
- /**
- * 通过用户名查询用户
- *
- * @param userName 用户名
- * @return 用户对象信息
- */
- SysUser selectUserByUserName(String userName);
-
- /**
- * 通过用户ID查询用户
- *
- * @param userId 用户ID
- * @return 用户对象信息
- */
- SysUser selectUserById(Long userId);
-
- /**
- * 根据用户ID查询用户所属角色组
- *
- * @param userName 用户名
- * @return 结果
- */
- String selectUserRoleGroup(String userName);
-
- /**
- * 根据用户ID查询用户所属岗位组
- *
- * @param userName 用户名
- * @return 结果
- */
- String selectUserPostGroup(String userName);
-
- /**
- * 校验用户名称是否唯一
- *
- * @param userName 用户名称
- * @return 结果
- */
- String checkUserNameUnique(String userName);
-
- /**
- * 校验手机号码是否唯一
- *
- * @param user 用户信息
- * @return 结果
- */
- String checkPhoneUnique(SysUser user);
-
- /**
- * 校验email是否唯一
- *
- * @param user 用户信息
- * @return 结果
- */
- String checkEmailUnique(SysUser user);
-
- /**
- * 校验用户是否允许操作
- *
- * @param user 用户信息
- */
- void checkUserAllowed(SysUser user);
-
- /**
- * 校验用户是否有数据权限
- *
- * @param userId 用户id
- */
- void checkUserDataScope(Long userId);
-
- /**
- * 新增用户信息
- *
- * @param user 用户信息
- * @return 结果
- */
- int insertUser(SysUser user);
-
- /**
- * 注册用户信息
- *
- * @param user 用户信息
- * @return 结果
- */
- boolean registerUser(SysUser user);
-
- /**
- * 修改用户信息
- *
- * @param user 用户信息
- * @return 结果
- */
- int updateUser(SysUser user);
-
- /**
- * 用户授权角色
- *
- * @param userId 用户ID
- * @param roleIds 角色组
- */
- void insertUserAuth(Long userId, Long[] roleIds);
-
- /**
- * 修改用户状态
- *
- * @param user 用户信息
- * @return 结果
- */
- int updateUserStatus(SysUser user);
-
- /**
- * 修改用户基本信息
- *
- * @param user 用户信息
- * @return 结果
- */
- int updateUserProfile(SysUser user);
-
- /**
- * 修改用户头像
- *
- * @param userName 用户名
- * @param avatar 头像地址
- * @return 结果
- */
- boolean updateUserAvatar(String userName, String avatar);
-
- /**
- * 重置用户密码
- *
- * @param user 用户信息
- * @return 结果
- */
- int resetPwd(SysUser user);
-
- /**
- * 重置用户密码
- *
- * @param userName 用户名
- * @param password 密码
- * @return 结果
- */
- int resetUserPwd(String userName, String password);
-
- /**
- * 通过用户ID删除用户
- *
- * @param userId 用户ID
- * @return 结果
- */
- int deleteUserById(Long userId);
-
- /**
- * 批量删除用户信息
- *
- * @param userIds 需要删除的用户ID
- * @return 结果
- */
- int deleteUserByIds(Long[] userIds);
-
- /**
- * 导入用户数据
- *
- * @param userList 用户数据列表
- * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
- * @param operName 操作用户
- * @return 结果
- */
- String importUser(List userList, Boolean isUpdateSupport, String operName);
-}
+package com.ruoyi.system.service;
+
+import com.ruoyi.system.api.domain.SysUser;
+
+import java.util.List;
+
+/**
+ * 用户 业务层
+ *
+ * @author ruoyi
+ */
+public interface ISysUserService {
+ /**
+ * 根据条件分页查询用户列表
+ *
+ * @param user 用户信息
+ * @return 用户信息集合信息
+ */
+ List selectUserList(SysUser user);
+
+ /**
+ * 根据条件分页查询已分配用户角色列表
+ *
+ * @param user 用户信息
+ * @return 用户信息集合信息
+ */
+ List selectAllocatedList(SysUser user);
+
+ /**
+ * 根据条件分页查询未分配用户角色列表
+ *
+ * @param user 用户信息
+ * @return 用户信息集合信息
+ */
+ List selectUnallocatedList(SysUser user);
+
+ /**
+ * 通过用户名查询用户
+ *
+ * @param userName 用户名
+ * @return 用户对象信息
+ */
+ SysUser selectUserByUserName(String userName);
+
+ /**
+ * 通过用户ID查询用户
+ *
+ * @param userId 用户ID
+ * @return 用户对象信息
+ */
+ SysUser selectUserById(Long userId);
+
+ /**
+ * 根据用户ID查询用户所属角色组
+ *
+ * @param userName 用户名
+ * @return 结果
+ */
+ String selectUserRoleGroup(String userName);
+
+ /**
+ * 根据用户ID查询用户所属岗位组
+ *
+ * @param userName 用户名
+ * @return 结果
+ */
+ String selectUserPostGroup(String userName);
+
+ /**
+ * 校验用户名称是否唯一
+ *
+ * @param userName 用户名称
+ * @return 结果
+ */
+ String checkUserNameUnique(String userName);
+
+ /**
+ * 校验手机号码是否唯一
+ *
+ * @param user 用户信息
+ * @return 结果
+ */
+ String checkPhoneUnique(SysUser user);
+
+ /**
+ * 校验email是否唯一
+ *
+ * @param user 用户信息
+ * @return 结果
+ */
+ String checkEmailUnique(SysUser user);
+
+ /**
+ * 校验用户是否允许操作
+ *
+ * @param user 用户信息
+ */
+ void checkUserAllowed(SysUser user);
+
+ /**
+ * 校验用户是否有数据权限
+ *
+ * @param userId 用户id
+ */
+ void checkUserDataScope(Long userId);
+
+ /**
+ * 新增用户信息
+ *
+ * @param user 用户信息
+ * @return 结果
+ */
+ int insertUser(SysUser user);
+
+ /**
+ * 注册用户信息
+ *
+ * @param user 用户信息
+ * @return 结果
+ */
+ boolean registerUser(SysUser user);
+
+ /**
+ * 修改用户信息
+ *
+ * @param user 用户信息
+ * @return 结果
+ */
+ int updateUser(SysUser user);
+
+ /**
+ * 用户授权角色
+ *
+ * @param userId 用户ID
+ * @param roleIds 角色组
+ */
+ void insertUserAuth(Long userId, Long[] roleIds);
+
+ /**
+ * 修改用户状态
+ *
+ * @param user 用户信息
+ * @return 结果
+ */
+ int updateUserStatus(SysUser user);
+
+ /**
+ * 修改用户基本信息
+ *
+ * @param user 用户信息
+ * @return 结果
+ */
+ int updateUserProfile(SysUser user);
+
+ /**
+ * 修改用户头像
+ *
+ * @param userName 用户名
+ * @param avatar 头像地址
+ * @return 结果
+ */
+ boolean updateUserAvatar(String userName, String avatar);
+
+ /**
+ * 重置用户密码
+ *
+ * @param user 用户信息
+ * @return 结果
+ */
+ int resetPwd(SysUser user);
+
+ /**
+ * 重置用户密码
+ *
+ * @param userName 用户名
+ * @param password 密码
+ * @return 结果
+ */
+ int resetUserPwd(String userName, String password);
+
+ /**
+ * 通过用户ID删除用户
+ *
+ * @param userId 用户ID
+ * @return 结果
+ */
+ int deleteUserById(Long userId);
+
+ /**
+ * 批量删除用户信息
+ *
+ * @param userIds 需要删除的用户ID
+ * @return 结果
+ */
+ int deleteUserByIds(Long[] userIds);
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java
index ba1aca47b..79b423c25 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java
@@ -1,187 +1,188 @@
-package com.ruoyi.system.service.impl;
-
-import cn.hutool.core.convert.Convert;
-import com.ruoyi.common.core.constant.Constants;
-import com.ruoyi.common.core.constant.UserConstants;
-import com.ruoyi.common.core.exception.ServiceException;
-import com.ruoyi.common.core.utils.StringUtils;
-import com.ruoyi.common.redis.utils.RedisUtils;
-import com.ruoyi.system.domain.SysConfig;
-import com.ruoyi.system.mapper.SysConfigMapper;
-import com.ruoyi.system.service.ISysConfigService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.PostConstruct;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 参数配置 服务层实现
- *
- * @author ruoyi
- */
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@Service
-public class SysConfigServiceImpl implements ISysConfigService {
-
- private final SysConfigMapper configMapper;
-
- /**
- * 项目启动时,初始化参数到缓存
- */
- @PostConstruct
- public void init() {
- loadingConfigCache();
- }
-
- /**
- * 查询参数配置信息
- *
- * @param configId 参数配置ID
- * @return 参数配置信息
- */
- @Override
- public SysConfig selectConfigById(Long configId) {
- SysConfig config = new SysConfig();
- config.setConfigId(configId);
- return configMapper.selectConfig(config);
- }
-
- /**
- * 根据键名查询参数配置信息
- *
- * @param configKey 参数key
- * @return 参数键值
- */
- @Override
- public String selectConfigByKey(String configKey) {
- String configValue = Convert.toStr(RedisUtils.getCacheObject(getCacheKey(configKey)));
- if (StringUtils.isNotEmpty(configValue)) {
- return configValue;
- }
- SysConfig config = new SysConfig();
- config.setConfigKey(configKey);
- SysConfig retConfig = configMapper.selectConfig(config);
- if (StringUtils.isNotNull(retConfig)) {
- RedisUtils.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue());
- return retConfig.getConfigValue();
- }
- return StringUtils.EMPTY;
- }
-
- /**
- * 查询参数配置列表
- *
- * @param config 参数配置信息
- * @return 参数配置集合
- */
- @Override
- public List selectConfigList(SysConfig config) {
- return configMapper.selectConfigList(config);
- }
-
- /**
- * 新增参数配置
- *
- * @param config 参数配置信息
- * @return 结果
- */
- @Override
- public int insertConfig(SysConfig config) {
- int row = configMapper.insertConfig(config);
- if (row > 0) {
- RedisUtils.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
- }
- return row;
- }
-
- /**
- * 修改参数配置
- *
- * @param config 参数配置信息
- * @return 结果
- */
- @Override
- public int updateConfig(SysConfig config) {
- int row = configMapper.updateConfig(config);
- if (row > 0) {
- RedisUtils.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
- }
- return row;
- }
-
- /**
- * 批量删除参数信息
- *
- * @param configIds 需要删除的参数ID
- * @return 结果
- */
- @Override
- public void deleteConfigByIds(Long[] configIds) {
- for (Long configId : configIds) {
- SysConfig config = selectConfigById(configId);
- if (StringUtils.equals(UserConstants.YES, config.getConfigType())) {
- throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey()));
- }
- configMapper.deleteConfigById(configId);
- RedisUtils.deleteObject(getCacheKey(config.getConfigKey()));
- }
- }
-
- /**
- * 加载参数缓存数据
- */
- @Override
- public void loadingConfigCache() {
- List configsList = configMapper.selectConfigList(new SysConfig());
- for (SysConfig config : configsList) {
- RedisUtils.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
- }
- }
-
- /**
- * 清空参数缓存数据
- */
- @Override
- public void clearConfigCache() {
- Collection keys = RedisUtils.keys(Constants.SYS_CONFIG_KEY + "*");
- RedisUtils.deleteObject(keys);
- }
-
- /**
- * 重置参数缓存数据
- */
- @Override
- public void resetConfigCache() {
- clearConfigCache();
- loadingConfigCache();
- }
-
- /**
- * 校验参数键名是否唯一
- *
- * @param config 参数配置信息
- * @return 结果
- */
- @Override
- public String checkConfigKeyUnique(SysConfig config) {
- Long configId = StringUtils.isNull(config.getConfigId()) ? -1L : config.getConfigId();
- SysConfig info = configMapper.checkConfigKeyUnique(config.getConfigKey());
- if (StringUtils.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) {
- return UserConstants.NOT_UNIQUE;
- }
- return UserConstants.UNIQUE;
- }
-
- /**
- * 设置cache key
- *
- * @param configKey 参数键
- * @return 缓存键key
- */
- private String getCacheKey(String configKey) {
- return Constants.SYS_CONFIG_KEY + configKey;
- }
-}
+package com.ruoyi.system.service.impl;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.common.core.constant.Constants;
+import com.ruoyi.common.core.constant.UserConstants;
+import com.ruoyi.common.core.exception.ServiceException;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.redis.utils.RedisUtils;
+import com.ruoyi.system.domain.SysConfig;
+import com.ruoyi.system.mapper.SysConfigMapper;
+import com.ruoyi.system.service.ISysConfigService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 参数配置 服务层实现
+ *
+ * @author ruoyi
+ */
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@Service
+public class SysConfigServiceImpl implements ISysConfigService {
+
+ private final SysConfigMapper configMapper;
+
+ /**
+ * 项目启动时,初始化参数到缓存
+ */
+ @PostConstruct
+ public void init() {
+ loadingConfigCache();
+ }
+
+ /**
+ * 查询参数配置信息
+ *
+ * @param configId 参数配置ID
+ * @return 参数配置信息
+ */
+ @Override
+ public SysConfig selectConfigById(Long configId) {
+ SysConfig config = new SysConfig();
+ config.setConfigId(configId);
+ return configMapper.selectConfig(config);
+ }
+
+ /**
+ * 根据键名查询参数配置信息
+ *
+ * @param configKey 参数key
+ * @return 参数键值
+ */
+ @Override
+ public String selectConfigByKey(String configKey) {
+ String configValue = Convert.toStr(RedisUtils.getCacheObject(getCacheKey(configKey)));
+ if (StringUtils.isNotEmpty(configValue)) {
+ return configValue;
+ }
+ SysConfig config = new SysConfig();
+ config.setConfigKey(configKey);
+ SysConfig retConfig = configMapper.selectConfig(config);
+ if (ObjectUtil.isNotNull(retConfig)) {
+ RedisUtils.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue());
+ return retConfig.getConfigValue();
+ }
+ return StringUtils.EMPTY;
+ }
+
+ /**
+ * 查询参数配置列表
+ *
+ * @param config 参数配置信息
+ * @return 参数配置集合
+ */
+ @Override
+ public List selectConfigList(SysConfig config) {
+ return configMapper.selectConfigList(config);
+ }
+
+ /**
+ * 新增参数配置
+ *
+ * @param config 参数配置信息
+ * @return 结果
+ */
+ @Override
+ public int insertConfig(SysConfig config) {
+ int row = configMapper.insertConfig(config);
+ if (row > 0) {
+ RedisUtils.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
+ }
+ return row;
+ }
+
+ /**
+ * 修改参数配置
+ *
+ * @param config 参数配置信息
+ * @return 结果
+ */
+ @Override
+ public int updateConfig(SysConfig config) {
+ int row = configMapper.updateConfig(config);
+ if (row > 0) {
+ RedisUtils.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
+ }
+ return row;
+ }
+
+ /**
+ * 批量删除参数信息
+ *
+ * @param configIds 需要删除的参数ID
+ * @return 结果
+ */
+ @Override
+ public void deleteConfigByIds(Long[] configIds) {
+ for (Long configId : configIds) {
+ SysConfig config = selectConfigById(configId);
+ if (StringUtils.equals(UserConstants.YES, config.getConfigType())) {
+ throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey()));
+ }
+ configMapper.deleteConfigById(configId);
+ RedisUtils.deleteObject(getCacheKey(config.getConfigKey()));
+ }
+ }
+
+ /**
+ * 加载参数缓存数据
+ */
+ @Override
+ public void loadingConfigCache() {
+ List configsList = configMapper.selectConfigList(new SysConfig());
+ for (SysConfig config : configsList) {
+ RedisUtils.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
+ }
+ }
+
+ /**
+ * 清空参数缓存数据
+ */
+ @Override
+ public void clearConfigCache() {
+ Collection keys = RedisUtils.keys(Constants.SYS_CONFIG_KEY + "*");
+ RedisUtils.deleteObject(keys);
+ }
+
+ /**
+ * 重置参数缓存数据
+ */
+ @Override
+ public void resetConfigCache() {
+ clearConfigCache();
+ loadingConfigCache();
+ }
+
+ /**
+ * 校验参数键名是否唯一
+ *
+ * @param config 参数配置信息
+ * @return 结果
+ */
+ @Override
+ public String checkConfigKeyUnique(SysConfig config) {
+ Long configId = ObjectUtil.isNull(config.getConfigId()) ? -1L : config.getConfigId();
+ SysConfig info = configMapper.checkConfigKeyUnique(config.getConfigKey());
+ if (ObjectUtil.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) {
+ return UserConstants.NOT_UNIQUE;
+ }
+ return UserConstants.UNIQUE;
+ }
+
+ /**
+ * 设置cache key
+ *
+ * @param configKey 参数键
+ * @return 缓存键key
+ */
+ private String getCacheKey(String configKey) {
+ return Constants.SYS_CONFIG_KEY + configKey;
+ }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
index 42860f268..02e918741 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
@@ -1,296 +1,303 @@
-package com.ruoyi.system.service.impl;
-
-import cn.hutool.core.convert.Convert;
-import com.ruoyi.common.core.constant.UserConstants;
-import com.ruoyi.common.core.exception.ServiceException;
-import com.ruoyi.common.core.utils.SpringUtils;
-import com.ruoyi.common.core.utils.StringUtils;
-import com.ruoyi.common.datascope.annotation.DataScope;
-import com.ruoyi.common.security.utils.SecurityUtils;
-import com.ruoyi.system.api.domain.SysDept;
-import com.ruoyi.system.api.domain.SysRole;
-import com.ruoyi.system.api.domain.SysUser;
-import com.ruoyi.system.domain.vo.TreeSelect;
-import com.ruoyi.system.mapper.SysDeptMapper;
-import com.ruoyi.system.mapper.SysRoleMapper;
-import com.ruoyi.system.service.ISysDeptService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * 部门管理 服务实现
- *
- * @author ruoyi
- */
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@Service
-public class SysDeptServiceImpl implements ISysDeptService {
-
- private final SysDeptMapper deptMapper;
- private final SysRoleMapper roleMapper;
-
- /**
- * 查询部门管理数据
- *
- * @param dept 部门信息
- * @return 部门信息集合
- */
- @Override
- @DataScope(deptAlias = "d")
- public List selectDeptList(SysDept dept) {
- return deptMapper.selectDeptList(dept);
- }
-
- /**
- * 构建前端所需要树结构
- *
- * @param depts 部门列表
- * @return 树结构列表
- */
- @Override
- public List buildDeptTree(List depts) {
- List returnList = new ArrayList();
- List tempList = new ArrayList();
- for (SysDept dept : depts) {
- tempList.add(dept.getDeptId());
- }
- for (Iterator iterator = depts.iterator(); iterator.hasNext(); ) {
- SysDept dept = (SysDept) iterator.next();
- // 如果是顶级节点, 遍历该父节点的所有子节点
- if (!tempList.contains(dept.getParentId())) {
- recursionFn(depts, dept);
- returnList.add(dept);
- }
- }
- if (returnList.isEmpty()) {
- returnList = depts;
- }
- return returnList;
- }
-
- /**
- * 构建前端所需要下拉树结构
- *
- * @param depts 部门列表
- * @return 下拉树结构列表
- */
- @Override
- public List buildDeptTreeSelect(List depts) {
- List deptTrees = buildDeptTree(depts);
- return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
- }
-
- /**
- * 根据角色ID查询部门树信息
- *
- * @param roleId 角色ID
- * @return 选中部门列表
- */
- @Override
- public List selectDeptListByRoleId(Long roleId) {
- SysRole role = roleMapper.selectRoleById(roleId);
- return deptMapper.selectDeptListByRoleId(roleId, role.isDeptCheckStrictly());
- }
-
- /**
- * 根据部门ID查询信息
- *
- * @param deptId 部门ID
- * @return 部门信息
- */
- @Override
- public SysDept selectDeptById(Long deptId) {
- return deptMapper.selectDeptById(deptId);
- }
-
- /**
- * 根据ID查询所有子部门(正常状态)
- *
- * @param deptId 部门ID
- * @return 子部门数
- */
- @Override
- public int selectNormalChildrenDeptById(Long deptId) {
- return deptMapper.selectNormalChildrenDeptById(deptId);
- }
-
- /**
- * 是否存在子节点
- *
- * @param deptId 部门ID
- * @return 结果
- */
- @Override
- public boolean hasChildByDeptId(Long deptId) {
- int result = deptMapper.hasChildByDeptId(deptId);
- return result > 0 ? true : false;
- }
-
- /**
- * 查询部门是否存在用户
- *
- * @param deptId 部门ID
- * @return 结果 true 存在 false 不存在
- */
- @Override
- public boolean checkDeptExistUser(Long deptId) {
- int result = deptMapper.checkDeptExistUser(deptId);
- return result > 0 ? true : false;
- }
-
- /**
- * 校验部门名称是否唯一
- *
- * @param dept 部门信息
- * @return 结果
- */
- @Override
- public String checkDeptNameUnique(SysDept dept) {
- Long deptId = StringUtils.isNull(dept.getDeptId()) ? -1L : dept.getDeptId();
- SysDept info = deptMapper.checkDeptNameUnique(dept.getDeptName(), dept.getParentId());
- if (StringUtils.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue()) {
- return UserConstants.NOT_UNIQUE;
- }
- return UserConstants.UNIQUE;
- }
-
- /**
- * 校验部门是否有数据权限
- *
- * @param deptId 部门id
- */
- @Override
- public void checkDeptDataScope(Long deptId) {
- if (!SysUser.isAdmin(SecurityUtils.getUserId())) {
- SysDept dept = new SysDept();
- dept.setDeptId(deptId);
- List depts = SpringUtils.getAopProxy(this).selectDeptList(dept);
- if (StringUtils.isEmpty(depts)) {
- throw new ServiceException("没有权限访问部门数据!");
- }
- }
- }
-
- /**
- * 新增保存部门信息
- *
- * @param dept 部门信息
- * @return 结果
- */
- @Override
- public int insertDept(SysDept dept) {
- SysDept info = deptMapper.selectDeptById(dept.getParentId());
- // 如果父节点不为正常状态,则不允许新增子节点
- if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) {
- throw new ServiceException("部门停用,不允许新增");
- }
- dept.setAncestors(info.getAncestors() + "," + dept.getParentId());
- return deptMapper.insertDept(dept);
- }
-
- /**
- * 修改保存部门信息
- *
- * @param dept 部门信息
- * @return 结果
- */
- @Override
- public int updateDept(SysDept dept) {
- SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId());
- SysDept oldDept = deptMapper.selectDeptById(dept.getDeptId());
- if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept)) {
- String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId();
- String oldAncestors = oldDept.getAncestors();
- dept.setAncestors(newAncestors);
- updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors);
- }
- int result = deptMapper.updateDept(dept);
- if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors())
- && !StringUtils.equals("0", dept.getAncestors())) {
- // 如果该部门是启用状态,则启用该部门的所有上级部门
- updateParentDeptStatusNormal(dept);
- }
- return result;
- }
-
- /**
- * 修改该部门的父级部门状态
- *
- * @param dept 当前部门
- */
- private void updateParentDeptStatusNormal(SysDept dept) {
- String ancestors = dept.getAncestors();
- Long[] deptIds = Convert.toLongArray(ancestors);
- deptMapper.updateDeptStatusNormal(deptIds);
- }
-
- /**
- * 修改子元素关系
- *
- * @param deptId 被修改的部门ID
- * @param newAncestors 新的父ID集合
- * @param oldAncestors 旧的父ID集合
- */
- public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) {
- List children = deptMapper.selectChildrenDeptById(deptId);
- for (SysDept child : children) {
- child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));
- }
- if (children.size() > 0) {
- deptMapper.updateDeptChildren(children);
- }
- }
-
- /**
- * 删除部门管理信息
- *
- * @param deptId 部门ID
- * @return 结果
- */
- @Override
- public int deleteDeptById(Long deptId) {
- return deptMapper.deleteDeptById(deptId);
- }
-
- /**
- * 递归列表
- */
- private void recursionFn(List list, SysDept t) {
- // 得到子节点列表
- List childList = getChildList(list, t);
- t.setChildren(childList);
- for (SysDept tChild : childList) {
- if (hasChild(list, tChild)) {
- recursionFn(list, tChild);
- }
- }
- }
-
- /**
- * 得到子节点列表
- */
- private List getChildList(List list, SysDept t) {
- List tlist = new ArrayList();
- Iterator it = list.iterator();
- while (it.hasNext()) {
- SysDept n = (SysDept) it.next();
- if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue()) {
- tlist.add(n);
- }
- }
- return tlist;
- }
-
- /**
- * 判断是否有子节点
- */
- private boolean hasChild(List list, SysDept t) {
- return getChildList(list, t).size() > 0 ? true : false;
- }
-}
+package com.ruoyi.system.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.lang.tree.Tree;
+import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.common.core.constant.UserConstants;
+import com.ruoyi.common.core.exception.ServiceException;
+import com.ruoyi.common.core.utils.SpringUtils;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.utils.TreeBuildUtils;
+import com.ruoyi.common.datascope.annotation.DataScope;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.system.api.domain.SysDept;
+import com.ruoyi.system.api.domain.SysRole;
+import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.mapper.SysDeptMapper;
+import com.ruoyi.system.mapper.SysRoleMapper;
+import com.ruoyi.system.service.ISysDeptService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * 部门管理 服务实现
+ *
+ * @author ruoyi
+ */
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@Service
+public class SysDeptServiceImpl implements ISysDeptService {
+
+ private final SysDeptMapper deptMapper;
+ private final SysRoleMapper roleMapper;
+
+ /**
+ * 查询部门管理数据
+ *
+ * @param dept 部门信息
+ * @return 部门信息集合
+ */
+ @Override
+ @DataScope(deptAlias = "d")
+ public List selectDeptList(SysDept dept) {
+ return deptMapper.selectDeptList(dept);
+ }
+
+ /**
+ * 构建前端所需要树结构
+ *
+ * @param depts 部门列表
+ * @return 树结构列表
+ */
+ @Override
+ public List buildDeptTree(List depts) {
+ List returnList = new ArrayList();
+ List tempList = new ArrayList();
+ for (SysDept dept : depts) {
+ tempList.add(dept.getDeptId());
+ }
+ for (Iterator iterator = depts.iterator(); iterator.hasNext(); ) {
+ SysDept dept = (SysDept) iterator.next();
+ // 如果是顶级节点, 遍历该父节点的所有子节点
+ if (!tempList.contains(dept.getParentId())) {
+ recursionFn(depts, dept);
+ returnList.add(dept);
+ }
+ }
+ if (returnList.isEmpty()) {
+ returnList = depts;
+ }
+ return returnList;
+ }
+
+ /**
+ * 构建前端所需要下拉树结构
+ *
+ * @param depts 部门列表
+ * @return 下拉树结构列表
+ */
+ @Override
+ public List> buildDeptTreeSelect(List depts) {
+ if (CollUtil.isEmpty(depts)) {
+ return CollUtil.newArrayList();
+ }
+ Long parentId = depts.get(0).getParentId();
+ return TreeBuildUtils.build(depts, parentId, (dept, tree) ->
+ tree.setId(dept.getDeptId())
+ .setParentId(dept.getParentId())
+ .setName(dept.getDeptName())
+ .setWeight(dept.getOrderNum()));
+ }
+
+ /**
+ * 根据角色ID查询部门树信息
+ *
+ * @param roleId 角色ID
+ * @return 选中部门列表
+ */
+ @Override
+ public List selectDeptListByRoleId(Long roleId) {
+ SysRole role = roleMapper.selectRoleById(roleId);
+ return deptMapper.selectDeptListByRoleId(roleId, role.isDeptCheckStrictly());
+ }
+
+ /**
+ * 根据部门ID查询信息
+ *
+ * @param deptId 部门ID
+ * @return 部门信息
+ */
+ @Override
+ public SysDept selectDeptById(Long deptId) {
+ return deptMapper.selectDeptById(deptId);
+ }
+
+ /**
+ * 根据ID查询所有子部门(正常状态)
+ *
+ * @param deptId 部门ID
+ * @return 子部门数
+ */
+ @Override
+ public int selectNormalChildrenDeptById(Long deptId) {
+ return deptMapper.selectNormalChildrenDeptById(deptId);
+ }
+
+ /**
+ * 是否存在子节点
+ *
+ * @param deptId 部门ID
+ * @return 结果
+ */
+ @Override
+ public boolean hasChildByDeptId(Long deptId) {
+ int result = deptMapper.hasChildByDeptId(deptId);
+ return result > 0 ? true : false;
+ }
+
+ /**
+ * 查询部门是否存在用户
+ *
+ * @param deptId 部门ID
+ * @return 结果 true 存在 false 不存在
+ */
+ @Override
+ public boolean checkDeptExistUser(Long deptId) {
+ int result = deptMapper.checkDeptExistUser(deptId);
+ return result > 0 ? true : false;
+ }
+
+ /**
+ * 校验部门名称是否唯一
+ *
+ * @param dept 部门信息
+ * @return 结果
+ */
+ @Override
+ public String checkDeptNameUnique(SysDept dept) {
+ Long deptId = ObjectUtil.isNull(dept.getDeptId()) ? -1L : dept.getDeptId();
+ SysDept info = deptMapper.checkDeptNameUnique(dept.getDeptName(), dept.getParentId());
+ if (ObjectUtil.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue()) {
+ return UserConstants.NOT_UNIQUE;
+ }
+ return UserConstants.UNIQUE;
+ }
+
+ /**
+ * 校验部门是否有数据权限
+ *
+ * @param deptId 部门id
+ */
+ @Override
+ public void checkDeptDataScope(Long deptId) {
+ if (!SysUser.isAdmin(SecurityUtils.getUserId())) {
+ SysDept dept = new SysDept();
+ dept.setDeptId(deptId);
+ List depts = SpringUtils.getAopProxy(this).selectDeptList(dept);
+ if (CollUtil.isEmpty(depts)) {
+ throw new ServiceException("没有权限访问部门数据!");
+ }
+ }
+ }
+
+ /**
+ * 新增保存部门信息
+ *
+ * @param dept 部门信息
+ * @return 结果
+ */
+ @Override
+ public int insertDept(SysDept dept) {
+ SysDept info = deptMapper.selectDeptById(dept.getParentId());
+ // 如果父节点不为正常状态,则不允许新增子节点
+ if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) {
+ throw new ServiceException("部门停用,不允许新增");
+ }
+ dept.setAncestors(info.getAncestors() + "," + dept.getParentId());
+ return deptMapper.insertDept(dept);
+ }
+
+ /**
+ * 修改保存部门信息
+ *
+ * @param dept 部门信息
+ * @return 结果
+ */
+ @Override
+ public int updateDept(SysDept dept) {
+ SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId());
+ SysDept oldDept = deptMapper.selectDeptById(dept.getDeptId());
+ if (ObjectUtil.isNotNull(newParentDept) && ObjectUtil.isNotNull(oldDept)) {
+ String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId();
+ String oldAncestors = oldDept.getAncestors();
+ dept.setAncestors(newAncestors);
+ updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors);
+ }
+ int result = deptMapper.updateDept(dept);
+ if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors())
+ && !StringUtils.equals("0", dept.getAncestors())) {
+ // 如果该部门是启用状态,则启用该部门的所有上级部门
+ updateParentDeptStatusNormal(dept);
+ }
+ return result;
+ }
+
+ /**
+ * 修改该部门的父级部门状态
+ *
+ * @param dept 当前部门
+ */
+ private void updateParentDeptStatusNormal(SysDept dept) {
+ String ancestors = dept.getAncestors();
+ Long[] deptIds = Convert.toLongArray(ancestors);
+ deptMapper.updateDeptStatusNormal(deptIds);
+ }
+
+ /**
+ * 修改子元素关系
+ *
+ * @param deptId 被修改的部门ID
+ * @param newAncestors 新的父ID集合
+ * @param oldAncestors 旧的父ID集合
+ */
+ public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) {
+ List children = deptMapper.selectChildrenDeptById(deptId);
+ for (SysDept child : children) {
+ child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));
+ }
+ if (children.size() > 0) {
+ deptMapper.updateDeptChildren(children);
+ }
+ }
+
+ /**
+ * 删除部门管理信息
+ *
+ * @param deptId 部门ID
+ * @return 结果
+ */
+ @Override
+ public int deleteDeptById(Long deptId) {
+ return deptMapper.deleteDeptById(deptId);
+ }
+
+ /**
+ * 递归列表
+ */
+ private void recursionFn(List list, SysDept t) {
+ // 得到子节点列表
+ List childList = getChildList(list, t);
+ t.setChildren(childList);
+ for (SysDept tChild : childList) {
+ if (hasChild(list, tChild)) {
+ recursionFn(list, tChild);
+ }
+ }
+ }
+
+ /**
+ * 得到子节点列表
+ */
+ private List getChildList(List list, SysDept t) {
+ List tlist = new ArrayList();
+ for (SysDept n : list) {
+ if (ObjectUtil.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue()) {
+ tlist.add(n);
+ }
+ }
+ return tlist;
+ }
+
+ /**
+ * 判断是否有子节点
+ */
+ private boolean hasChild(List list, SysDept t) {
+ return getChildList(list, t).size() > 0 ? true : false;
+ }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java
index 476db364d..b9a27fc00 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java
@@ -1,127 +1,126 @@
-package com.ruoyi.system.service.impl;
-
-import cn.hutool.core.collection.CollUtil;
-import com.ruoyi.common.core.utils.StringUtils;
-import com.ruoyi.common.dict.utils.DictUtils;
-import com.ruoyi.system.api.domain.SysDictData;
-import com.ruoyi.system.mapper.SysDictDataMapper;
-import com.ruoyi.system.service.ISysDictDataService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-/**
- * 字典 业务层处理
- *
- * @author ruoyi
- */
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@Service
-public class SysDictDataServiceImpl implements ISysDictDataService {
-
- private final SysDictDataMapper dictDataMapper;
-
- /**
- * 根据条件分页查询字典数据
- *
- * @param dictData 字典数据信息
- * @return 字典数据集合信息
- */
- @Override
- public List selectDictDataList(SysDictData dictData) {
- return dictDataMapper.selectDictDataList(dictData);
- }
-
- /**
- * 根据字典类型和字典键值查询字典数据信息
- *
- * @param dictType 字典类型
- * @param dictValue 字典键值
- * @return 字典标签
- */
- @Override
- public String selectDictLabel(String dictType, String dictValue) {
- return dictDataMapper.selectDictLabel(dictType, dictValue);
- }
-
- /**
- * 根据字典类型查询字典数据
- *
- * @param dictType 字典类型
- * @return 字典数据集合信息
- */
- @Override
- public List selectDictDataByType(String dictType) {
- List dictDatas = DictUtils.getDictCache(dictType);
- if (StringUtils.isNotEmpty(dictDatas)) {
- return dictDatas;
- }
- dictDatas = dictDataMapper.selectDictDataByType(dictType);
- if (CollUtil.isNotEmpty(dictDatas)) {
- DictUtils.setDictCache(dictType, dictDatas);
- return dictDatas;
- }
- return null;
- }
-
- /**
- * 根据字典数据ID查询信息
- *
- * @param dictCode 字典数据ID
- * @return 字典数据
- */
- @Override
- public SysDictData selectDictDataById(Long dictCode) {
- return dictDataMapper.selectDictDataById(dictCode);
- }
-
- /**
- * 批量删除字典数据信息
- *
- * @param dictCodes 需要删除的字典数据ID
- * @return 结果
- */
- @Override
- public void deleteDictDataByIds(Long[] dictCodes) {
- for (Long dictCode : dictCodes) {
- SysDictData data = selectDictDataById(dictCode);
- dictDataMapper.deleteDictDataById(dictCode);
- List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType());
- DictUtils.setDictCache(data.getDictType(), dictDatas);
- }
- }
-
- /**
- * 新增保存字典数据信息
- *
- * @param data 字典数据信息
- * @return 结果
- */
- @Override
- public int insertDictData(SysDictData data) {
- int row = dictDataMapper.insertDictData(data);
- if (row > 0) {
- List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType());
- DictUtils.setDictCache(data.getDictType(), dictDatas);
- }
- return row;
- }
-
- /**
- * 修改保存字典数据信息
- *
- * @param data 字典数据信息
- * @return 结果
- */
- @Override
- public int updateDictData(SysDictData data) {
- int row = dictDataMapper.updateDictData(data);
- if (row > 0) {
- List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType());
- DictUtils.setDictCache(data.getDictType(), dictDatas);
- }
- return row;
- }
-}
+package com.ruoyi.system.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.ruoyi.common.dict.utils.DictUtils;
+import com.ruoyi.system.api.domain.SysDictData;
+import com.ruoyi.system.mapper.SysDictDataMapper;
+import com.ruoyi.system.service.ISysDictDataService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 字典 业务层处理
+ *
+ * @author ruoyi
+ */
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@Service
+public class SysDictDataServiceImpl implements ISysDictDataService {
+
+ private final SysDictDataMapper dictDataMapper;
+
+ /**
+ * 根据条件分页查询字典数据
+ *
+ * @param dictData 字典数据信息
+ * @return 字典数据集合信息
+ */
+ @Override
+ public List selectDictDataList(SysDictData dictData) {
+ return dictDataMapper.selectDictDataList(dictData);
+ }
+
+ /**
+ * 根据字典类型和字典键值查询字典数据信息
+ *
+ * @param dictType 字典类型
+ * @param dictValue 字典键值
+ * @return 字典标签
+ */
+ @Override
+ public String selectDictLabel(String dictType, String dictValue) {
+ return dictDataMapper.selectDictLabel(dictType, dictValue);
+ }
+
+ /**
+ * 根据字典类型查询字典数据
+ *
+ * @param dictType 字典类型
+ * @return 字典数据集合信息
+ */
+ @Override
+ public List selectDictDataByType(String dictType) {
+ List dictDatas = DictUtils.getDictCache(dictType);
+ if (CollUtil.isNotEmpty(dictDatas)) {
+ return dictDatas;
+ }
+ dictDatas = dictDataMapper.selectDictDataByType(dictType);
+ if (CollUtil.isNotEmpty(dictDatas)) {
+ DictUtils.setDictCache(dictType, dictDatas);
+ return dictDatas;
+ }
+ return null;
+ }
+
+ /**
+ * 根据字典数据ID查询信息
+ *
+ * @param dictCode 字典数据ID
+ * @return 字典数据
+ */
+ @Override
+ public SysDictData selectDictDataById(Long dictCode) {
+ return dictDataMapper.selectDictDataById(dictCode);
+ }
+
+ /**
+ * 批量删除字典数据信息
+ *
+ * @param dictCodes 需要删除的字典数据ID
+ * @return 结果
+ */
+ @Override
+ public void deleteDictDataByIds(Long[] dictCodes) {
+ for (Long dictCode : dictCodes) {
+ SysDictData data = selectDictDataById(dictCode);
+ dictDataMapper.deleteDictDataById(dictCode);
+ List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType());
+ DictUtils.setDictCache(data.getDictType(), dictDatas);
+ }
+ }
+
+ /**
+ * 新增保存字典数据信息
+ *
+ * @param data 字典数据信息
+ * @return 结果
+ */
+ @Override
+ public int insertDictData(SysDictData data) {
+ int row = dictDataMapper.insertDictData(data);
+ if (row > 0) {
+ List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType());
+ DictUtils.setDictCache(data.getDictType(), dictDatas);
+ }
+ return row;
+ }
+
+ /**
+ * 修改保存字典数据信息
+ *
+ * @param data 字典数据信息
+ * @return 结果
+ */
+ @Override
+ public int updateDictData(SysDictData data) {
+ int row = dictDataMapper.updateDictData(data);
+ if (row > 0) {
+ List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType());
+ DictUtils.setDictCache(data.getDictType(), dictDatas);
+ }
+ return row;
+ }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java
index 70bebfe60..a5dc1638d 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java
@@ -1,5 +1,7 @@
package com.ruoyi.system.service.impl;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.core.constant.UserConstants;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
@@ -70,11 +72,11 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService {
@Override
public List selectDictDataByType(String dictType) {
List dictDatas = DictUtils.getDictCache(dictType);
- if (StringUtils.isNotEmpty(dictDatas)) {
+ if (CollUtil.isNotEmpty(dictDatas)) {
return dictDatas;
}
dictDatas = dictDataMapper.selectDictDataByType(dictType);
- if (StringUtils.isNotEmpty(dictDatas)) {
+ if (CollUtil.isNotEmpty(dictDatas)) {
DictUtils.setDictCache(dictType, dictDatas);
return dictDatas;
}
@@ -193,9 +195,9 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService {
*/
@Override
public String checkDictTypeUnique(SysDictType dict) {
- Long dictId = StringUtils.isNull(dict.getDictId()) ? -1L : dict.getDictId();
+ Long dictId = ObjectUtil.isNull(dict.getDictId()) ? -1L : dict.getDictId();
SysDictType dictType = dictTypeMapper.checkDictTypeUnique(dict.getDictType());
- if (StringUtils.isNotNull(dictType) && dictType.getDictId().longValue() != dictId.longValue()) {
+ if (ObjectUtil.isNotNull(dictType) && dictType.getDictId().longValue() != dictId.longValue()) {
return UserConstants.NOT_UNIQUE;
}
return UserConstants.UNIQUE;
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
index 5bf3044b7..32c434929 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
@@ -1,444 +1,423 @@
-package com.ruoyi.system.service.impl;
-
-import com.ruoyi.common.core.constant.Constants;
-import com.ruoyi.common.core.constant.UserConstants;
-import com.ruoyi.common.core.utils.StringUtils;
-import com.ruoyi.common.security.utils.SecurityUtils;
-import com.ruoyi.system.api.domain.SysRole;
-import com.ruoyi.system.api.domain.SysUser;
-import com.ruoyi.system.domain.SysMenu;
-import com.ruoyi.system.domain.vo.MetaVo;
-import com.ruoyi.system.domain.vo.RouterVo;
-import com.ruoyi.system.domain.vo.TreeSelect;
-import com.ruoyi.system.mapper.SysMenuMapper;
-import com.ruoyi.system.mapper.SysRoleMapper;
-import com.ruoyi.system.mapper.SysRoleMenuMapper;
-import com.ruoyi.system.service.ISysMenuService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * 菜单 业务层处理
- *
- * @author ruoyi
- */
-@RequiredArgsConstructor(onConstructor_ = @Autowired)
-@Service
-public class SysMenuServiceImpl implements ISysMenuService {
-
- private final SysMenuMapper menuMapper;
- private final SysRoleMapper roleMapper;
- private final SysRoleMenuMapper roleMenuMapper;
-
- /**
- * 根据用户查询系统菜单列表
- *
- * @param userId 用户ID
- * @return 菜单列表
- */
- @Override
- public List selectMenuList(Long userId) {
- return selectMenuList(new SysMenu(), userId);
- }
-
- /**
- * 查询系统菜单列表
- *
- * @param menu 菜单信息
- * @return 菜单列表
- */
- @Override
- public List selectMenuList(SysMenu menu, Long userId) {
- List menuList = null;
- // 管理员显示所有菜单信息
- if (SysUser.isAdmin(userId)) {
- menuList = menuMapper.selectMenuList(menu);
- } else {
- menu.getParams().put("userId", userId);
- menuList = menuMapper.selectMenuListByUserId(menu);
- }
- return menuList;
- }
-
- /**
- * 根据用户ID查询权限
- *
- * @param userId 用户ID
- * @return 权限列表
- */
- @Override
- public Set selectMenuPermsByUserId(Long userId) {
- List perms = menuMapper.selectMenuPermsByUserId(userId);
- Set permsSet = new HashSet<>();
- for (String perm : perms) {
- if (StringUtils.isNotEmpty(perm)) {
- permsSet.addAll(Arrays.asList(perm.trim().split(",")));
- }
- }
- return permsSet;
- }
-
- /**
- * 根据用户ID查询菜单
- *
- * @param userId 用户名称
- * @return 菜单列表
- */
- @Override
- public List selectMenuTreeByUserId(Long userId) {
- List menus = null;
- if (SecurityUtils.isAdmin(userId)) {
- menus = menuMapper.selectMenuTreeAll();
- } else {
- menus = menuMapper.selectMenuTreeByUserId(userId);
- }
- return getChildPerms(menus, 0);
- }
-
- /**
- * 根据角色ID查询菜单树信息
- *
- * @param roleId 角色ID
- * @return 选中菜单列表
- */
- @Override
- public List selectMenuListByRoleId(Long roleId) {
- SysRole role = roleMapper.selectRoleById(roleId);
- return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly());
- }
-
- /**
- * 构建前端路由所需要的菜单
- *
- * @param menus 菜单列表
- * @return 路由列表
- */
- @Override
- public List buildMenus(List menus) {
- List routers = new LinkedList();
- for (SysMenu menu : menus) {
- RouterVo router = new RouterVo();
- router.setHidden("1".equals(menu.getVisible()));
- router.setName(getRouteName(menu));
- router.setPath(getRouterPath(menu));
- router.setComponent(getComponent(menu));
- router.setQuery(menu.getQuery());
- router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath()));
- List cMenus = menu.getChildren();
- if (!cMenus.isEmpty() && cMenus.size() > 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType())) {
- router.setAlwaysShow(true);
- router.setRedirect("noRedirect");
- router.setChildren(buildMenus(cMenus));
- } else if (isMenuFrame(menu)) {
- router.setMeta(null);
- List childrenList = new ArrayList();
- RouterVo children = new RouterVo();
- children.setPath(menu.getPath());
- children.setComponent(menu.getComponent());
- children.setName(StringUtils.capitalize(menu.getPath()));
- children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath()));
- children.setQuery(menu.getQuery());
- childrenList.add(children);
- router.setChildren(childrenList);
- } else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) {
- router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon()));
- router.setPath("/inner");
- List childrenList = new ArrayList();
- RouterVo children = new RouterVo();
- String routerPath = innerLinkReplaceEach(menu.getPath());
- children.setPath(routerPath);
- children.setComponent(UserConstants.INNER_LINK);
- children.setName(StringUtils.capitalize(routerPath));
- children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath()));
- childrenList.add(children);
- router.setChildren(childrenList);
- }
- routers.add(router);
- }
- return routers;
- }
-
- /**
- * 构建前端所需要树结构
- *
- * @param menus 菜单列表
- * @return 树结构列表
- */
- @Override
- public List buildMenuTree(List menus) {
- List returnList = new ArrayList();
- List tempList = new ArrayList();
- for (SysMenu dept : menus) {
- tempList.add(dept.getMenuId());
- }
- for (Iterator iterator = menus.iterator(); iterator.hasNext(); ) {
- SysMenu menu = (SysMenu) iterator.next();
- // 如果是顶级节点, 遍历该父节点的所有子节点
- if (!tempList.contains(menu.getParentId())) {
- recursionFn(menus, menu);
- returnList.add(menu);
- }
- }
- if (returnList.isEmpty()) {
- returnList = menus;
- }
- return returnList;
- }
-
- /**
- * 构建前端所需要下拉树结构
- *
- * @param menus 菜单列表
- * @return 下拉树结构列表
- */
- @Override
- public List buildMenuTreeSelect(List menus) {
- List menuTrees = buildMenuTree(menus);
- return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
- }
-
- /**
- * 根据菜单ID查询信息
- *
- * @param menuId 菜单ID
- * @return 菜单信息
- */
- @Override
- public SysMenu selectMenuById(Long menuId) {
- return menuMapper.selectMenuById(menuId);
- }
-
- /**
- * 是否存在菜单子节点
- *
- * @param menuId 菜单ID
- * @return 结果
- */
- @Override
- public boolean hasChildByMenuId(Long menuId) {
- int result = menuMapper.hasChildByMenuId(menuId);
- return result > 0 ? true : false;
- }
-
- /**
- * 查询菜单使用数量
- *
- * @param menuId 菜单ID
- * @return 结果
- */
- @Override
- public boolean checkMenuExistRole(Long menuId) {
- int result = roleMenuMapper.checkMenuExistRole(menuId);
- return result > 0 ? true : false;
- }
-
- /**
- * 新增保存菜单信息
- *
- * @param menu 菜单信息
- * @return 结果
- */
- @Override
- public int insertMenu(SysMenu menu) {
- return menuMapper.insertMenu(menu);
- }
-
- /**
- * 修改保存菜单信息
- *
- * @param menu 菜单信息
- * @return 结果
- */
- @Override
- public int updateMenu(SysMenu menu) {
- return menuMapper.updateMenu(menu);
- }
-
- /**
- * 删除菜单管理信息
- *
- * @param menuId 菜单ID
- * @return 结果
- */
- @Override
- public int deleteMenuById(Long menuId) {
- return menuMapper.deleteMenuById(menuId);
- }
-
- /**
- * 校验菜单名称是否唯一
- *
- * @param menu 菜单信息
- * @return 结果
- */
- @Override
- public String checkMenuNameUnique(SysMenu menu) {
- Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId();
- SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId());
- if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()) {
- return UserConstants.NOT_UNIQUE;
- }
- return UserConstants.UNIQUE;
- }
-
- /**
- * 获取路由名称
- *
- * @param menu 菜单信息
- * @return 路由名称
- */
- public String getRouteName(SysMenu menu) {
- String routerName = StringUtils.capitalize(menu.getPath());
- // 非外链并且是一级目录(类型为目录)
- if (isMenuFrame(menu)) {
- routerName = StringUtils.EMPTY;
- }
- return routerName;
- }
-
- /**
- * 获取路由地址
- *
- * @param menu 菜单信息
- * @return 路由地址
- */
- public String getRouterPath(SysMenu menu) {
- String routerPath = menu.getPath();
- // 内链打开外网方式
- if (menu.getParentId().intValue() != 0 && isInnerLink(menu)) {
- routerPath = innerLinkReplaceEach(routerPath);
- }
- // 非外链并且是一级目录(类型为目录)
- if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType())
- && UserConstants.NO_FRAME.equals(menu.getIsFrame())) {
- routerPath = "/" + menu.getPath();
- }
- // 非外链并且是一级目录(类型为菜单)
- else if (isMenuFrame(menu)) {
- routerPath = "/";
- }
- return routerPath;
- }
-
- /**
- * 获取组件信息
- *
- * @param menu 菜单信息
- * @return 组件信息
- */
- public String getComponent(SysMenu menu) {
- String component = UserConstants.LAYOUT;
- if (StringUtils.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu)) {
- component = menu.getComponent();
- } else if (StringUtils.isEmpty(menu.getComponent()) && menu.getParentId().intValue() != 0 && isInnerLink(menu)) {
- component = UserConstants.INNER_LINK;
- } else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu)) {
- component = UserConstants.PARENT_VIEW;
- }
- return component;
- }
-
- /**
- * 是否为菜单内部跳转
- *
- * @param menu 菜单信息
- * @return 结果
- */
- public boolean isMenuFrame(SysMenu menu) {
- return menu.getParentId().intValue() == 0 && UserConstants.TYPE_MENU.equals(menu.getMenuType())
- && menu.getIsFrame().equals(UserConstants.NO_FRAME);
- }
-
- /**
- * 是否为内链组件
- *
- * @param menu 菜单信息
- * @return 结果
- */
- public boolean isInnerLink(SysMenu menu) {
- return menu.getIsFrame().equals(UserConstants.NO_FRAME) && StringUtils.ishttp(menu.getPath());
- }
-
- /**
- * 是否为parent_view组件
- *
- * @param menu 菜单信息
- * @return 结果
- */
- public boolean isParentView(SysMenu menu) {
- return menu.getParentId().intValue() != 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType());
- }
-
- /**
- * 根据父节点的ID获取所有子节点
- *
- * @param list 分类表
- * @param parentId 传入的父节点ID
- * @return String
- */
- public List getChildPerms(List