发布 v3.3.0

This commit is contained in:
疯狂的狮子li
2021-10-29 09:18:18 +08:00
parent 6def4aa84d
commit 4d12424378
426 changed files with 43788 additions and 4704 deletions

View File

@ -10,12 +10,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
*/
@SpringBootApplication
public class RuoYiApplication
{
public static void main(String[] args)
{
public class RuoYiApplication {
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(RuoYiApplication.class, args);
System.out.println("(♥◠‿◠)ノ゙ RuoYi-Vue-Plus启动成功 ლ(´ڡ`ლ)゙");
}
}

View File

@ -5,14 +5,14 @@ import org.springframework.boot.web.servlet.support.SpringBootServletInitializer
/**
* web容器中进行部署
*
*
* @author ruoyi
*/
public class RuoYiServletInitializer extends SpringBootServletInitializer
{
public class RuoYiServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
{
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(RuoYiApplication.class);
}
}

View File

@ -1,10 +1,6 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.*;
/**
* 数据权限过滤注解
@ -14,20 +10,19 @@ import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataScope
{
public @interface DataScope {
/**
* 部门表的别名
*/
public String deptAlias() default "";
String deptAlias() default "";
/**
* 用户表的别名
*/
public String userAlias() default "";
String userAlias() default "";
/**
* 是否过滤用户权限
*/
public boolean isUser() default false;
/**
* 是否过滤用户权限
*/
boolean isUser() default false;
}

View File

@ -1,28 +1,23 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.ruoyi.common.enums.DataSourceType;
import java.lang.annotation.*;
/**
* 自定义多数据源切换注解
*
* <p>
* 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准
*
* @author ruoyi
*/
@Target({ ElementType.METHOD, ElementType.TYPE })
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DataSource
{
public @interface DataSource {
/**
* 切换数据源名称
*/
public DataSourceType value() default DataSourceType.MASTER;
DataSourceType value() default DataSourceType.MASTER;
}

View File

@ -12,19 +12,19 @@ import java.lang.annotation.*;
@Inherited
public @interface ExcelDictFormat {
/**
* 如果是字典类型请设置字典的type值 (如: sys_user_sex)
*/
String dictType() default "";
/**
* 如果是字典类型请设置字典的type值 (如: sys_user_sex)
*/
String dictType() default "";
/**
* 读取内容转表达式 (如: 0=男,1=女,2=未知)
*/
String readConverterExp() default "";
/**
* 读取内容转表达式 (如: 0=男,1=女,2=未知)
*/
String readConverterExp() default "";
/**
* 分隔符,读取字符串组内容
*/
String separator() default ",";
/**
* 分隔符,读取字符串组内容
*/
String separator() default ",";
}

View File

@ -1,46 +1,41 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.enums.OperatorType;
import java.lang.annotation.*;
/**
* 自定义操作日志记录注解
*
* @author ruoyi
*
* @author ruoyi
*/
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log
{
public @interface Log {
/**
* 模块
* 模块
*/
public String title() default "";
String title() default "";
/**
* 功能
*/
public BusinessType businessType() default BusinessType.OTHER;
BusinessType businessType() default BusinessType.OTHER;
/**
* 操作人类别
*/
public OperatorType operatorType() default OperatorType.MANAGE;
OperatorType operatorType() default OperatorType.MANAGE;
/**
* 是否保存请求的参数
*/
public boolean isSaveRequestData() default true;
boolean isSaveRequestData() default true;
/**
* 是否保存响应的参数
*/
public boolean isSaveResponseData() default true;
boolean isSaveResponseData() default true;
}

View File

@ -1,40 +1,36 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.enums.LimitType;
import java.lang.annotation.*;
/**
* 限流注解
*
* @author ruoyi
*
* @author Lion Li
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RateLimiter
{
public @interface RateLimiter {
/**
* 限流key
*/
public String key() default Constants.RATE_LIMIT_KEY;
String key() default Constants.RATE_LIMIT_KEY;
/**
* 限流时间,单位秒
*/
public int time() default 60;
int time() default 60;
/**
* 限流次数
*/
public int count() default 100;
int count() default 100;
/**
* 限流类型
*/
public LimitType limitType() default LimitType.DEFAULT;
LimitType limitType() default LimitType.DEFAULT;
}

View File

@ -1,11 +1,6 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;
/**
@ -19,16 +14,16 @@ import java.util.concurrent.TimeUnit;
@Documented
public @interface RepeatSubmit {
/**
* 间隔时间(ms),小于此时间视为重复提交
*/
int interval() default 5000;
/**
* 间隔时间(ms),小于此时间视为重复提交
*/
int interval() default 5000;
TimeUnit timeUnit() default TimeUnit.MILLISECONDS;
TimeUnit timeUnit() default TimeUnit.MILLISECONDS;
/**
* 提示消息
*/
String message() default "不允许重复提交,请稍再试";
String message() default "不允许重复提交,请稍再试";
}

View File

@ -2,7 +2,6 @@ package com.ruoyi.common.config;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ -10,34 +9,42 @@ import org.springframework.stereotype.Component;
/**
* 读取项目相关配置
*
* @author ruoyi
* @author Lion Li
*/
@Data
@NoArgsConstructor
@Accessors(chain = true)
@Component
@ConfigurationProperties(prefix = "ruoyi")
public class RuoYiConfig
{
/** 项目名称 */
public class RuoYiConfig {
/**
* 项目名称
*/
private String name;
/** 版本 */
/**
* 版本
*/
private String version;
/** 版权年份 */
/**
* 版权年份
*/
private String copyrightYear;
/** 实例演示开关 */
/**
* 实例演示开关
*/
private boolean demoEnabled;
/** 获取地址开关 */
/**
* 获取地址开关
*/
@Getter
private static boolean addressEnabled;
public void setAddressEnabled(boolean addressEnabled)
{
public void setAddressEnabled(boolean addressEnabled) {
RuoYiConfig.addressEnabled = addressEnabled;
}

View File

@ -7,8 +7,7 @@ import io.jsonwebtoken.Claims;
*
* @author ruoyi
*/
public class Constants
{
public class Constants {
/**
* UTF-8 字符集
*/
@ -134,13 +133,13 @@ public class Constants
*/
public static final String SYS_DICT_KEY = "sys_dict:";
/**
* RMI 远程方法调用
*/
public static final String LOOKUP_RMI = "rmi://";
/**
* RMI 远程方法调用
*/
public static final String LOOKUP_RMI = "rmi://";
/**
* LDAP 远程方法调用
*/
public static final String LOOKUP_LDAP = "ldap://";
/**
* LDAP 远程方法调用
*/
public static final String LOOKUP_LDAP = "ldap://";
}

View File

@ -2,118 +2,187 @@ package com.ruoyi.common.constant;
/**
* 代码生成通用常量
*
*
* @author ruoyi
*/
public class GenConstants
{
/** 单表(增删改查) */
public class GenConstants {
/**
* 单表(增删改查)
*/
public static final String TPL_CRUD = "crud";
/** 树表(增删改查) */
/**
* 树表(增删改查)
*/
public static final String TPL_TREE = "tree";
/** 主子表(增删改查) */
/**
* 主子表(增删改查)
*/
public static final String TPL_SUB = "sub";
/** 树编码字段 */
/**
* 树编码字段
*/
public static final String TREE_CODE = "treeCode";
/** 树父编码字段 */
/**
* 树父编码字段
*/
public static final String TREE_PARENT_CODE = "treeParentCode";
/** 树名称字段 */
/**
* 树名称字段
*/
public static final String TREE_NAME = "treeName";
/** 上级菜单ID字段 */
/**
* 上级菜单ID字段
*/
public static final String PARENT_MENU_ID = "parentMenuId";
/** 上级菜单名称字段 */
/**
* 上级菜单名称字段
*/
public static final String PARENT_MENU_NAME = "parentMenuName";
/** 数据库字符串类型 */
public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" };
/**
* 数据库字符串类型
*/
public static final String[] COLUMNTYPE_STR = {"char", "varchar", "nvarchar", "varchar2"};
/** 数据库文本类型 */
public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" };
/**
* 数据库文本类型
*/
public static final String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext"};
/** 数据库时间类型 */
public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" };
/**
* 数据库时间类型
*/
public static final String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp"};
/** 数据库数字类型 */
public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer",
"bit", "bigint", "float", "double", "decimal" };
/**
* 数据库数字类型
*/
public static final String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer",
"bit", "bigint", "float", "double", "decimal"};
/** 页面不需要添加字段 */
public static final String[] COLUMNNAME_NOT_ADD = { "create_by", "create_time", "del_flag", "update_by",
"update_time", "version" };
/**
* BO对象 不需要添加字段
*/
public static final String[] COLUMNNAME_NOT_ADD = {"create_by", "create_time", "del_flag", "update_by",
"update_time", "version"};
/** 页面不需要编辑字段 */
public static final String[] COLUMNNAME_NOT_EDIT = { "create_by", "create_time", "del_flag", "update_by",
"update_time", "version" };
/**
* BO对象 不需要编辑字段
*/
public static final String[] COLUMNNAME_NOT_EDIT = {"create_by", "create_time", "del_flag", "update_by",
"update_time", "version"};
/** 页面不需要显示的列表字段 */
public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by",
"update_time", "version" };
/**
* VO对象 不需要返回字段
*/
public static final String[] COLUMNNAME_NOT_LIST = {"create_by", "create_time", "del_flag", "update_by",
"update_time", "version"};
/** 页面不需要查询字段 */
public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by",
"update_time", "remark", "version" };
/**
* BO对象 不需要查询字段
*/
public static final String[] COLUMNNAME_NOT_QUERY = {"id", "create_by", "create_time", "del_flag", "update_by",
"update_time", "remark", "version"};
/** Entity基类字段 */
public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" };
/**
* Entity基类字段
*/
public static final String[] BASE_ENTITY = {"createBy", "createTime", "updateBy", "updateTime"};
/** Tree基类字段 */
public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors", "children" };
/**
* Tree基类字段
*/
public static final String[] TREE_ENTITY = {"parentName", "parentId", "children"};
/** 文本框 */
/**
* 文本框
*/
public static final String HTML_INPUT = "input";
/** 文本域 */
/**
* 文本域
*/
public static final String HTML_TEXTAREA = "textarea";
/** 下拉框 */
/**
* 下拉框
*/
public static final String HTML_SELECT = "select";
/** 单选框 */
/**
* 单选框
*/
public static final String HTML_RADIO = "radio";
/** 复选框 */
/**
* 复选框
*/
public static final String HTML_CHECKBOX = "checkbox";
/** 日期控件 */
/**
* 日期控件
*/
public static final String HTML_DATETIME = "datetime";
/** 图片上传控件 */
/**
* 图片上传控件
*/
public static final String HTML_IMAGE_UPLOAD = "imageUpload";
/** 文件上传控件 */
/**
* 文件上传控件
*/
public static final String HTML_FILE_UPLOAD = "fileUpload";
/** 富文本控件 */
/**
* 富文本控件
*/
public static final String HTML_EDITOR = "editor";
/** 字符串类型 */
/**
* 字符串类型
*/
public static final String TYPE_STRING = "String";
/** 整型 */
/**
* 整型
*/
public static final String TYPE_INTEGER = "Integer";
/** 长整型 */
/**
* 长整型
*/
public static final String TYPE_LONG = "Long";
/** 浮点型 */
/**
* 浮点型
*/
public static final String TYPE_DOUBLE = "Double";
/** 高精度计算类型 */
/**
* 高精度计算类型
*/
public static final String TYPE_BIGDECIMAL = "BigDecimal";
/** 时间类型 */
/**
* 时间类型
*/
public static final String TYPE_DATE = "Date";
/** 模糊查询 */
/**
* 模糊查询
*/
public static final String QUERY_LIKE = "LIKE";
/** 需要 */
/**
* 需要
*/
public static final String REQUIRE = "1";
}

View File

@ -2,7 +2,8 @@ package com.ruoyi.common.constant;
/**
* 任务调度通用常量
*
*
* @deprecated 3.4.0删除 迁移至xxl-job
* @author ruoyi
*/
public class ScheduleConstants

View File

@ -5,62 +5,96 @@ package com.ruoyi.common.constant;
*
* @author ruoyi
*/
public class UserConstants
{
public class UserConstants {
/**
* 平台内系统用户的唯一标志
*/
public static final String SYS_USER = "SYS_USER";
/** 正常状态 */
/**
* 正常状态
*/
public static final String NORMAL = "0";
/** 异常状态 */
/**
* 异常状态
*/
public static final String EXCEPTION = "1";
/** 用户封禁状态 */
/**
* 用户封禁状态
*/
public static final String USER_DISABLE = "1";
/** 角色封禁状态 */
/**
* 角色封禁状态
*/
public static final String ROLE_DISABLE = "1";
/** 部门正常状态 */
/**
* 部门正常状态
*/
public static final String DEPT_NORMAL = "0";
/** 部门停用状态 */
/**
* 部门停用状态
*/
public static final String DEPT_DISABLE = "1";
/** 字典正常状态 */
/**
* 字典正常状态
*/
public static final String DICT_NORMAL = "0";
/** 是否为系统默认(是) */
/**
* 是否为系统默认(是)
*/
public static final String YES = "Y";
/** 是否菜单外链(是) */
/**
* 是否菜单外链(是)
*/
public static final String YES_FRAME = "0";
/** 是否菜单外链(否) */
/**
* 是否菜单外链(否)
*/
public static final String NO_FRAME = "1";
/** 菜单类型(目录) */
/**
* 菜单类型(目录)
*/
public static final String TYPE_DIR = "M";
/** 菜单类型(菜单) */
/**
* 菜单类型(菜单)
*/
public static final String TYPE_MENU = "C";
/** 菜单类型(按钮) */
/**
* 菜单类型(按钮)
*/
public static final String TYPE_BUTTON = "F";
/** Layout组件标识 */
/**
* Layout组件标识
*/
public final static String LAYOUT = "Layout";
/** ParentView组件标识 */
/**
* ParentView组件标识
*/
public final static String PARENT_VIEW = "ParentView";
/** InnerLink组件标识 */
/**
* InnerLink组件标识
*/
public final static String INNER_LINK = "InnerLink";
/** 校验返回结果码 */
/**
* 校验返回结果码
*/
public final static String UNIQUE = "0";
public final static String NOT_UNIQUE = "1";

View File

@ -4,58 +4,49 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* web层通用数据处理
*
* @author ruoyi
*/
public class BaseController
{
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
public class BaseController {
/**
* 返回成功
*/
public AjaxResult<Void> success()
{
public AjaxResult<Void> success() {
return AjaxResult.success();
}
/**
* 返回失败消息
*/
public AjaxResult<Void> error()
{
public AjaxResult<Void> error() {
return AjaxResult.error();
}
/**
* 返回成功消息
*/
public AjaxResult<Void> success(String message)
{
public AjaxResult<Void> success(String message) {
return AjaxResult.success(message);
}
/**
* 返回失败消息
*/
public AjaxResult<Void> error(String message)
{
public AjaxResult<Void> error(String message) {
return AjaxResult.error(message);
}
/**
* 响应返回结果
*
*
* @param rows 影响行数
* @return 操作结果
*/
protected AjaxResult<Void> toAjax(int rows)
{
protected AjaxResult<Void> toAjax(int rows) {
return rows > 0 ? AjaxResult.success() : AjaxResult.error();
}
@ -65,48 +56,42 @@ public class BaseController
* @param result 结果
* @return 操作结果
*/
protected AjaxResult<Void> toAjax(boolean result)
{
protected AjaxResult<Void> toAjax(boolean result) {
return result ? success() : error();
}
/**
* 页面跳转
*/
public String redirect(String url)
{
public String redirect(String url) {
return StringUtils.format("redirect:{}", url);
}
/**
* 获取用户缓存信息
*/
public LoginUser getLoginUser()
{
public LoginUser getLoginUser() {
return SecurityUtils.getLoginUser();
}
/**
* 获取登录用户id
*/
public Long getUserId()
{
public Long getUserId() {
return getLoginUser().getUserId();
}
/**
* 获取登录部门id
*/
public Long getDeptId()
{
public Long getDeptId() {
return getLoginUser().getDeptId();
}
/**
* 获取登录用户名
*/
public String getUsername()
{
public String getUsername() {
return getLoginUser().getUsername();
}
}

View File

@ -1,9 +1,10 @@
package com.ruoyi.common.core.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@ -14,11 +15,10 @@ import java.util.Map;
/**
* Entity基类
*
* @author ruoyi
* @author Lion Li
*/
@Data
@NoArgsConstructor
@Accessors(chain = true)
public class BaseEntity implements Serializable {
@ -28,43 +28,43 @@ public class BaseEntity implements Serializable {
* 搜索值
*/
@ApiModelProperty(value = "搜索值")
@TableField(exist = false)
private String searchValue;
/**
* 创建者
*/
@ApiModelProperty(value = "创建者")
@TableField(fill = FieldFill.INSERT)
private String createBy;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新者
*/
@ApiModelProperty(value = "更新者")
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/**
* 更新时间
*/
@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 备注
*/
@ApiModelProperty(value = "备注")
private String remark;
/**
* 请求参数
*/
@JsonIgnore
@ApiModelProperty(value = "请求参数")
@TableField(exist = false)
private Map<String, Object> params = new HashMap<>();
}

View File

@ -1,9 +1,9 @@
package com.ruoyi.common.core.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.ArrayList;
@ -12,12 +12,11 @@ import java.util.List;
/**
* Tree基类
*
* @author ruoyi
* @author Lion Li
*/
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class TreeEntity extends BaseEntity {
@ -26,6 +25,7 @@ public class TreeEntity extends BaseEntity {
/**
* 父菜单名称
*/
@TableField(exist = false)
@ApiModelProperty(value = "父菜单名称")
private String parentName;
@ -35,21 +35,10 @@ public class TreeEntity extends BaseEntity {
@ApiModelProperty(value = "父菜单ID")
private Long parentId;
/**
* 显示顺序
*/
@ApiModelProperty(value = "显示顺序")
private Integer orderNum;
/**
* 祖级列表
*/
@ApiModelProperty(value = "祖级列表")
private String ancestors;
/**
* 子部门
*/
@TableField(exist = false)
@ApiModelProperty(value = "子部门")
private List<?> children = new ArrayList<>();

View File

@ -3,7 +3,10 @@ package com.ruoyi.common.core.domain;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysMenu;
import lombok.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@ -12,39 +15,53 @@ import java.util.stream.Collectors;
/**
* Treeselect树结构实体类
*
* @author ruoyi
*
* @author Lion Li
*/
@Data
@NoArgsConstructor
@Accessors(chain = true)
public class TreeSelect implements Serializable
{
@ApiModel("树结构实体类")
public class TreeSelect implements Serializable {
private static final long serialVersionUID = 1L;
/** 节点ID */
/**
* 节点ID
*/
@ApiModelProperty(value = "节点ID")
private Long id;
/** 节点名称 */
/**
* 节点名称
*/
@ApiModelProperty(value = "节点名称")
private String label;
/** 子节点 */
/**
* 子节点
*/
@ApiModelProperty(value = "子节点")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<TreeSelect> children;
public TreeSelect(SysDept dept)
{
public TreeSelect(SysDept dept) {
this.id = dept.getDeptId();
this.label = dept.getDeptName();
this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
this.children = dept.getChildren()
.stream()
.map(d -> new TreeSelect((SysDept) d))
.collect(Collectors.toList());
}
public TreeSelect(SysMenu menu)
{
public TreeSelect(SysMenu menu) {
this.id = menu.getMenuId();
this.label = menu.getMenuName();
this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
this.children = menu.getChildren()
.stream()
.map(d -> new TreeSelect((SysMenu) d))
.collect(Collectors.toList());
}
}

View File

@ -8,15 +8,16 @@ import java.io.Serializable;
import java.util.Date;
/**
* 操作日志记录表 oper_log
* 通用操作日志实体
*
* @author ruoyi
* @author Lion Li
*/
@Data
@NoArgsConstructor
@Accessors(chain = true)
public class OperLogDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**

View File

@ -1,48 +1,44 @@
package com.ruoyi.common.core.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.TreeEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.*;
/**
* 部门表 sys_dept
*
* @author ruoyi
* @author Lion Li
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("sys_dept")
public class SysDept implements Serializable {
@ApiModel("部门业务对象")
public class SysDept extends TreeEntity {
private static final long serialVersionUID = 1L;
/**
* 部门ID
*/
@TableId(value = "dept_id", type = IdType.AUTO)
@ApiModelProperty(value = "部门id")
@TableId(value = "dept_id")
private Long deptId;
/**
* 父部门ID
*/
private Long parentId;
/**
* 祖级列表
*/
private String ancestors;
/**
* 部门名称
*/
@ApiModelProperty(value = "部门名称")
@NotBlank(message = "部门名称不能为空")
@Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
private String deptName;
@ -50,23 +46,27 @@ public class SysDept implements Serializable {
/**
* 显示顺序
*/
@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;
@ -74,54 +74,20 @@ public class SysDept implements Serializable {
/**
* 部门状态:0正常,1停用
*/
@ApiModelProperty(value = "部门状态:0正常,1停用")
private String status;
/**
* 删除标志0代表存在 2代表删除
*/
@ApiModelProperty(value = "删除标志0代表存在 2代表删除")
@TableLogic
private String delFlag;
/**
* 父部门名称
* 祖级列表
*/
@TableField(exist = false)
private String parentName;
/**
* 创建者
*/
@TableField(fill = FieldFill.INSERT)
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新者
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 子部门
*/
@TableField(exist = false)
private List<SysDept> children = new ArrayList<SysDept>();
/**
* 请求参数
*/
@TableField(exist = false)
private Map<String, Object> params = new HashMap<>();
@ApiModelProperty(value = "祖级列表")
private String ancestors;
}

View File

@ -2,51 +2,54 @@ package com.ruoyi.common.core.domain.entity;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.ExcelDictFormat;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.convert.ExcelDictConvert;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 字典数据表 sys_dict_data
*
* @author ruoyi
* @author Lion Li
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("sys_dict_data")
@ExcelIgnoreUnannotated
public class SysDictData implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModel("字典数据业务对象")
public class SysDictData extends BaseEntity {
/**
* 字典编码
*/
@ApiModelProperty(value = "字典编码")
@ExcelProperty(value = "字典编码")
@TableId(value = "dict_code", type = IdType.AUTO)
@TableId(value = "dict_code")
private Long dictCode;
/**
* 字典排序
*/
@ApiModelProperty(value = "字典排序")
@ExcelProperty(value = "字典排序")
private Long dictSort;
/**
* 字典标签
*/
@ApiModelProperty(value = "字典标签")
@ExcelProperty(value = "字典标签")
@NotBlank(message = "字典标签不能为空")
@Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符")
@ -55,6 +58,7 @@ public class SysDictData implements Serializable {
/**
* 字典键值
*/
@ApiModelProperty(value = "字典键值")
@ExcelProperty(value = "字典键值")
@NotBlank(message = "字典键值不能为空")
@Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符")
@ -63,6 +67,7 @@ public class SysDictData implements Serializable {
/**
* 字典类型
*/
@ApiModelProperty(value = "字典类型")
@ExcelProperty(value = "字典类型")
@NotBlank(message = "字典类型不能为空")
@Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符")
@ -71,17 +76,20 @@ public class SysDictData implements Serializable {
/**
* 样式属性(其他样式扩展)
*/
@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;
@ -89,47 +97,19 @@ public class SysDictData implements Serializable {
/**
* 状态0正常 1停用
*/
@ApiModelProperty(value = "状态0正常 1停用")
@ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_normal_disable")
private String status;
/**
* 创建者
*/
@TableField(fill = FieldFill.INSERT)
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新者
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 备注
*/
@ApiModelProperty(value = "备注")
private String remark;
/**
* 请求参数
*/
@TableField(exist = false)
private Map<String, Object> params = new HashMap<>();
public boolean getDefault() {
return UserConstants.YES.equals(this.isDefault) ? true : false;
return UserConstants.YES.equals(this.isDefault);
}
}

View File

@ -2,44 +2,46 @@ package com.ruoyi.common.core.domain.entity;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.ExcelDictFormat;
import com.ruoyi.common.convert.ExcelDictConvert;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 字典类型表 sys_dict_type
*
* @author ruoyi
* @author Lion Li
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("sys_dict_type")
@ExcelIgnoreUnannotated
public class SysDictType implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModel("字典类型业务对象")
public class SysDictType extends BaseEntity {
/**
* 字典主键
*/
@ApiModelProperty(value = "字典主键")
@ExcelProperty(value = "字典主键")
@TableId(value = "dict_id", type = IdType.AUTO)
@TableId(value = "dict_id")
private Long dictId;
/**
* 字典名称
*/
@ApiModelProperty(value = "字典名称")
@ExcelProperty(value = "字典名称")
@NotBlank(message = "字典名称不能为空")
@Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符")
@ -48,6 +50,7 @@ public class SysDictType implements Serializable {
/**
* 字典类型
*/
@ApiModelProperty(value = "字典类型")
@ExcelProperty(value = "字典类型")
@NotBlank(message = "字典类型不能为空")
@Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符")
@ -56,43 +59,15 @@ public class SysDictType implements Serializable {
/**
* 状态0正常 1停用
*/
@ApiModelProperty(value = "状态0正常 1停用")
@ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_normal_disable")
private String status;
/**
* 创建者
*/
@TableField(fill = FieldFill.INSERT)
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新者
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 备注
*/
@ApiModelProperty(value = "备注")
private String remark;
/**
* 请求参数
*/
@TableField(exist = false)
private Map<String, Object> params = new HashMap<>();
}

View File

@ -1,154 +1,120 @@
package com.ruoyi.common.core.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.TreeEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.*;
/**
* 菜单权限表 sys_menu
*
* @author ruoyi
* @author Lion Li
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("sys_menu")
public class SysMenu implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModel("菜单权限业务对象")
public class SysMenu extends TreeEntity {
/**
* 菜单ID
*/
@TableId(value = "menu_id", type = IdType.AUTO)
@ApiModelProperty(value = "菜单ID")
@TableId(value = "menu_id")
private Long menuId;
/**
* 菜单名称
*/
@ApiModelProperty(value = "菜单名称")
@NotBlank(message = "菜单名称不能为空")
@Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符")
private String menuName;
/**
* 父菜单名称
*/
@TableField(exist = false)
private String parentName;
/**
* 父菜单ID
*/
private Long parentId;
/**
* 显示顺序
*/
@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;
/**
* 创建者
*/
@TableField(fill = FieldFill.INSERT)
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新者
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 备注
*/
@ApiModelProperty(value = "备注")
private String remark;
/**
* 请求参数
*/
@TableField(exist = false)
private Map<String, Object> params = new HashMap<>();
/**
* 子菜单
*/
@TableField(exist = false)
private List<SysMenu> children = new ArrayList<SysMenu>();
}

View File

@ -2,44 +2,48 @@ package com.ruoyi.common.core.domain.entity;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.ExcelDictFormat;
import com.ruoyi.common.convert.ExcelDictConvert;
import com.ruoyi.common.core.domain.BaseEntity;
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;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 角色表 sys_role
*
* @author ruoyi
* @author Lion Li
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("sys_role")
@ExcelIgnoreUnannotated
public class SysRole implements Serializable {
private static final long serialVersionUID = 1L;
public class SysRole extends BaseEntity {
/**
* 角色ID
*/
@ApiModelProperty(value = "角色ID")
@ExcelProperty(value = "角色序号")
@TableId(value = "role_id", type = IdType.AUTO)
@TableId(value = "role_id")
private Long roleId;
/**
* 角色名称
*/
@ApiModelProperty(value = "角色名称")
@ExcelProperty(value = "角色名称")
@NotBlank(message = "角色名称不能为空")
@Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符")
@ -48,6 +52,7 @@ public class SysRole implements Serializable {
/**
* 角色权限
*/
@ApiModelProperty(value = "角色权限")
@ExcelProperty(value = "角色权限")
@NotBlank(message = "权限字符不能为空")
@Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符")
@ -56,6 +61,7 @@ public class SysRole implements Serializable {
/**
* 角色排序
*/
@ApiModelProperty(value = "角色排序")
@ExcelProperty(value = "角色排序")
@NotBlank(message = "显示顺序不能为空")
private String roleSort;
@ -63,6 +69,7 @@ public class SysRole implements Serializable {
/**
* 数据范围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;
@ -70,16 +77,19 @@ public class SysRole implements Serializable {
/**
* 菜单树选择项是否关联显示( 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;
@ -87,59 +97,34 @@ public class SysRole implements Serializable {
/**
* 删除标志0代表存在 2代表删除
*/
@ApiModelProperty(value = "删除标志0代表存在 2代表删除")
@TableLogic
private String delFlag;
/**
* 创建者
*/
@TableField(fill = FieldFill.INSERT)
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新者
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 备注
*/
@ApiModelProperty(value = "备注")
private String remark;
/**
* 请求参数
*/
@TableField(exist = false)
private Map<String, Object> params = new HashMap<>();
/**
* 用户是否存在此角色标识 默认不存在
*/
@ApiModelProperty(value = "用户是否存在此角色标识 默认不存在")
@TableField(exist = false)
private boolean flag = false;
/**
* 菜单组
*/
@ApiModelProperty(value = "菜单组")
@TableField(exist = false)
private Long[] menuIds;
/**
* 部门组(数据权限)
*/
@ApiModelProperty(value = "部门组(数据权限)")
@TableField(exist = false)
private Long[] deptIds;
@ -147,6 +132,7 @@ public class SysRole implements Serializable {
this.roleId = roleId;
}
@ApiModelProperty(value = "是否管理员")
public boolean isAdmin() {
return isAdmin(this.roleId);
}

View File

@ -3,46 +3,51 @@ package com.ruoyi.common.core.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.ruoyi.common.core.domain.BaseEntity;
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.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 用户对象 sys_user
*
* @author ruoyi
* @author Lion Li
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("sys_user")
public class SysUser implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModel("用户信息业务对象")
public class SysUser extends BaseEntity {
/**
* 用户ID
*/
@TableId(value = "user_id", type = IdType.AUTO)
@ApiModelProperty(value = "用户ID")
@TableId(value = "user_id")
private Long userId;
/**
* 部门ID
*/
@ApiModelProperty(value = "部门ID")
private Long deptId;
/**
* 用户账号
*/
@ApiModelProperty(value = "用户账号")
@NotBlank(message = "用户账号不能为空")
@Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
private String userName;
@ -50,12 +55,14 @@ public class SysUser implements Serializable {
/**
* 用户昵称
*/
@ApiModelProperty(value = "用户昵称")
@Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
private String nickName;
/**
* 用户邮箱
*/
@ApiModelProperty(value = "用户邮箱")
@Email(message = "邮箱格式不正确")
@Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
private String email;
@ -63,21 +70,25 @@ public class SysUser implements Serializable {
/**
* 手机号码
*/
@ApiModelProperty(value = "手机号码")
private String phonenumber;
/**
* 用户性别
*/
@ApiModelProperty(value = "用户性别")
private String sex;
/**
* 用户头像
*/
@ApiModelProperty(value = "用户头像")
private String avatar;
/**
* 密码
*/
@ApiModelProperty(value = "密码")
@TableField(
insertStrategy = FieldStrategy.NOT_EMPTY,
updateStrategy = FieldStrategy.NOT_EMPTY,
@ -94,86 +105,66 @@ public class SysUser implements Serializable {
/**
* 帐号状态0正常 1停用
*/
@ApiModelProperty(value = "帐号状态0正常 1停用")
private String status;
/**
* 删除标志0代表存在 2代表删除
*/
@ApiModelProperty(value = "删除标志0代表存在 2代表删除")
@TableLogic
private String delFlag;
/**
* 最后登录IP
*/
@ApiModelProperty(value = "最后登录IP")
private String loginIp;
/**
* 最后登录时间
*/
@ApiModelProperty(value = "最后登录时间")
private Date loginDate;
/**
* 创建者
*/
@TableField(fill = FieldFill.INSERT)
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新者
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 备注
*/
@ApiModelProperty(value = "备注")
private String remark;
/**
* 请求参数
*/
@TableField(exist = false)
private Map<String, Object> params = new HashMap<>();
/**
* 部门对象
*/
@ApiModelProperty(value = "部门对象")
@TableField(exist = false)
private SysDept dept;
/**
* 角色对象
*/
@ApiModelProperty(value = "角色对象")
@TableField(exist = false)
private List<SysRole> roles;
/**
* 角色组
*/
@ApiModelProperty(value = "角色组")
@TableField(exist = false)
private Long[] roleIds;
/**
* 岗位组
*/
@ApiModelProperty(value = "岗位组")
@TableField(exist = false)
private Long[] postIds;
/**
* 角色ID
*/
@ApiModelProperty(value = "角色ID")
@TableField(exist = false)
private Long roleId;
@ -181,6 +172,7 @@ public class SysUser implements Serializable {
this.userId = userId;
}
@ApiModelProperty(value = "是否管理员")
public boolean isAdmin() {
return isAdmin(this.userId);
}

View File

@ -1,37 +1,43 @@
package com.ruoyi.common.core.domain.model;
import lombok.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 用户登录对象
*
* @author ruoyi
*
* @author Lion Li
*/
@Data
@NoArgsConstructor
@Accessors(chain = true)
public class LoginBody
{
@ApiModel("用户登录对象")
public class LoginBody {
/**
* 用户名
*/
@ApiModelProperty(value = "用户名")
private String username;
/**
* 用户密码
*/
@ApiModelProperty(value = "用户密码")
private String password;
/**
* 验证码
*/
@ApiModelProperty(value = "验证码")
private String code;
/**
* 唯一标识
*/
@ApiModelProperty(value = "唯一标识")
private String uuid = "";
}

View File

@ -2,7 +2,8 @@ package com.ruoyi.common.core.domain.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.ruoyi.common.core.domain.entity.SysUser;
import lombok.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
@ -13,14 +14,14 @@ import java.util.Set;
/**
* 登录用户身份权限
*
* @author ruoyi
* @author Lion Li
*/
@Data
@NoArgsConstructor
@Accessors(chain = true)
public class LoginUser implements UserDetails
{
public class LoginUser implements UserDetails {
private static final long serialVersionUID = 1L;
/**
@ -78,14 +79,12 @@ public class LoginUser implements UserDetails
*/
private SysUser user;
public LoginUser(SysUser user, Set<String> permissions)
{
public LoginUser(SysUser user, Set<String> permissions) {
this.user = user;
this.permissions = permissions;
}
public LoginUser(Long userId, Long deptId, SysUser user, Set<String> permissions)
{
public LoginUser(Long userId, Long deptId, SysUser user, Set<String> permissions) {
this.userId = userId;
this.deptId = deptId;
this.user = user;
@ -94,14 +93,12 @@ public class LoginUser implements UserDetails
@JsonIgnore
@Override
public String getPassword()
{
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername()
{
public String getUsername() {
return user.getUserName();
}
@ -110,50 +107,39 @@ public class LoginUser implements UserDetails
*/
@JsonIgnore
@Override
public boolean isAccountNonExpired()
{
public boolean isAccountNonExpired() {
return true;
}
/**
* 指定用户是否解锁,锁定的用户无法进行身份验证
*
* @return
*/
@JsonIgnore
@Override
public boolean isAccountNonLocked()
{
public boolean isAccountNonLocked() {
return true;
}
/**
* 指示是否已过期的用户的凭据(密码),过期的凭据防止认证
*
* @return
*/
@JsonIgnore
@Override
public boolean isCredentialsNonExpired()
{
public boolean isCredentialsNonExpired() {
return true;
}
/**
* 是否可用 ,禁用的用户不能身份验证
*
* @return
*/
@JsonIgnore
@Override
public boolean isEnabled()
{
public boolean isEnabled() {
return true;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities()
{
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
}

View File

@ -1,11 +1,13 @@
package com.ruoyi.common.core.domain.model;
import io.swagger.annotations.ApiModel;
/**
* 用户注册对象
*
* @author ruoyi
*
* @author Lion Li
*/
public class RegisterBody extends LoginBody
{
@ApiModel("用户注册对象")
public class RegisterBody extends LoginBody {
}

View File

@ -18,6 +18,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
* 使用方法 配置文件开启 mybatis-plus 二级缓存
* 在 XxxMapper.java 类上添加注解 @CacheNamespace(implementation = MybatisPlusRedisCache.class, eviction = MybatisPlusRedisCache.class)
*
* @deprecated 3.4.0删除 推荐使用spirng-cache
* @author Lion Li
*/
@Slf4j

View File

@ -2,12 +2,10 @@ package com.ruoyi.common.enums;
/**
* 操作状态
*
* @author ruoyi
*
* @author ruoyi
*/
public enum BusinessStatus
{
public enum BusinessStatus {
/**
* 成功
*/

View File

@ -2,11 +2,10 @@ package com.ruoyi.common.enums;
/**
* 业务操作类型
*
*
* @author ruoyi
*/
public enum BusinessType
{
public enum BusinessType {
/**
* 其它
*/
@ -51,7 +50,7 @@ public enum BusinessType
* 生成代码
*/
GENCODE,
/**
* 清空数据
*/

View File

@ -10,16 +10,16 @@ import lombok.Getter;
*/
@AllArgsConstructor
public enum DataSourceType {
/**
* 主库
*/
MASTER("master"),
/**
* 主库
*/
MASTER("master"),
/**
* 从库
*/
SLAVE("slave");
/**
* 从库
*/
SLAVE("slave");
@Getter
private final String source;
@Getter
private final String source;
}

View File

@ -1,36 +1,32 @@
package com.ruoyi.common.enums;
import org.springframework.lang.Nullable;
import java.util.HashMap;
import java.util.Map;
import org.springframework.lang.Nullable;
/**
* 请求方式
*
* @author ruoyi
*/
public enum HttpMethod
{
public enum HttpMethod {
GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE;
private static final Map<String, HttpMethod> mappings = new HashMap<>(16);
static
{
for (HttpMethod httpMethod : values())
{
static {
for (HttpMethod httpMethod : values()) {
mappings.put(httpMethod.name(), httpMethod);
}
}
@Nullable
public static HttpMethod resolve(@Nullable String method)
{
public static HttpMethod resolve(@Nullable String method) {
return (method != null ? mappings.get(method) : null);
}
public boolean matches(String method)
{
public boolean matches(String method) {
return (this == resolve(method));
}
}

View File

@ -6,8 +6,7 @@ package com.ruoyi.common.enums;
* @author ruoyi
*/
public enum LimitType
{
public enum LimitType {
/**
* 默认策略全局限流
*/

View File

@ -2,11 +2,10 @@ package com.ruoyi.common.enums;
/**
* 操作人类别
*
*
* @author ruoyi
*/
public enum OperatorType
{
public enum OperatorType {
/**
* 其它
*/

View File

@ -2,29 +2,25 @@ package com.ruoyi.common.enums;
/**
* 用户状态
*
*
* @author ruoyi
*/
public enum UserStatus
{
public enum UserStatus {
OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "删除");
private final String code;
private final String info;
UserStatus(String code, String info)
{
UserStatus(String code, String info) {
this.code = code;
this.info = info;
}
public String getCode()
{
public String getCode() {
return code;
}
public String getInfo()
{
public String getInfo() {
return info;
}
}

View File

@ -2,14 +2,12 @@ package com.ruoyi.common.exception;
/**
* 演示模式异常
*
*
* @author ruoyi
*/
public class DemoModeException extends RuntimeException
{
public class DemoModeException extends RuntimeException {
private static final long serialVersionUID = 1L;
public DemoModeException()
{
public DemoModeException() {
}
}

View File

@ -2,11 +2,10 @@ package com.ruoyi.common.exception;
/**
* 全局异常
*
*
* @author ruoyi
*/
public class GlobalException extends RuntimeException
{
public class GlobalException extends RuntimeException {
private static final long serialVersionUID = 1L;
@ -17,7 +16,7 @@ public class GlobalException extends RuntimeException
/**
* 错误明细,内部调试错误
*
* <p>
* 和 {@link CommonResult#getDetailMessage()} 一致的设计
*/
private String detailMessage;
@ -25,33 +24,28 @@ public class GlobalException extends RuntimeException
/**
* 空构造方法,避免反序列化问题
*/
public GlobalException()
{
public GlobalException() {
}
public GlobalException(String message)
{
public GlobalException(String message) {
this.message = message;
}
public String getDetailMessage()
{
public String getDetailMessage() {
return detailMessage;
}
public GlobalException setDetailMessage(String detailMessage)
{
public GlobalException setDetailMessage(String detailMessage) {
this.detailMessage = detailMessage;
return this;
}
public String getMessage()
{
@Override
public String getMessage() {
return message;
}
public GlobalException setMessage(String message)
{
public GlobalException setMessage(String message) {
this.message = message;
return this;
}

View File

@ -2,11 +2,10 @@ package com.ruoyi.common.exception;
/**
* 业务异常
*
*
* @author ruoyi
*/
public final class ServiceException extends RuntimeException
{
public final class ServiceException extends RuntimeException {
private static final long serialVersionUID = 1L;
/**
@ -21,7 +20,7 @@ public final class ServiceException extends RuntimeException
/**
* 错误明细,内部调试错误
*
* <p>
* 和 {@link CommonResult#getDetailMessage()} 一致的设计
*/
private String detailMessage;
@ -29,44 +28,37 @@ public final class ServiceException extends RuntimeException
/**
* 空构造方法,避免反序列化问题
*/
public ServiceException()
{
public ServiceException() {
}
public ServiceException(String message)
{
public ServiceException(String message) {
this.message = message;
}
public ServiceException(String message, Integer code)
{
public ServiceException(String message, Integer code) {
this.message = message;
this.code = code;
}
public String getDetailMessage()
{
public String getDetailMessage() {
return detailMessage;
}
public String getMessage()
{
@Override
public String getMessage() {
return message;
}
public Integer getCode()
{
public Integer getCode() {
return code;
}
public ServiceException setMessage(String message)
{
public ServiceException setMessage(String message) {
this.message = message;
return this;
}
public ServiceException setDetailMessage(String detailMessage)
{
public ServiceException setDetailMessage(String detailMessage) {
this.detailMessage = detailMessage;
return this;
}

View File

@ -2,25 +2,21 @@ package com.ruoyi.common.exception;
/**
* 工具类异常
*
*
* @author ruoyi
*/
public class UtilException extends RuntimeException
{
public class UtilException extends RuntimeException {
private static final long serialVersionUID = 8247610319171014183L;
public UtilException(Throwable e)
{
public UtilException(Throwable e) {
super(e.getMessage(), e);
}
public UtilException(String message)
{
public UtilException(String message) {
super(message);
}
public UtilException(String message, Throwable throwable)
{
public UtilException(String message, Throwable throwable) {
super(message, throwable);
}
}

View File

@ -2,14 +2,17 @@ package com.ruoyi.common.exception.base;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.StringUtils;
import lombok.*;
/**
* 基础异常
*
* @author ruoyi
*/
public class BaseException extends RuntimeException
{
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
public class BaseException extends RuntimeException {
private static final long serialVersionUID = 1L;
/**
@ -32,66 +35,39 @@ public class BaseException extends RuntimeException
*/
private String defaultMessage;
public BaseException(String module, String code, Object[] args, String defaultMessage)
{
public BaseException(String module, String code, Object[] args, String defaultMessage) {
this.module = module;
this.code = code;
this.args = args;
this.defaultMessage = defaultMessage;
}
public BaseException(String module, String code, Object[] args)
{
public BaseException(String module, String code, Object[] args) {
this(module, code, args, null);
}
public BaseException(String module, String defaultMessage)
{
public BaseException(String module, String defaultMessage) {
this(module, null, null, defaultMessage);
}
public BaseException(String code, Object[] args)
{
public BaseException(String code, Object[] args) {
this(null, code, args, null);
}
public BaseException(String defaultMessage)
{
public BaseException(String defaultMessage) {
this(null, null, null, defaultMessage);
}
@Override
public String getMessage()
{
public String getMessage() {
String message = null;
if (!StringUtils.isEmpty(code))
{
if (!StringUtils.isEmpty(code)) {
message = MessageUtils.message(code, args);
}
if (message == null)
{
if (message == null) {
message = defaultMessage;
}
return message;
}
public String getModule()
{
return module;
}
public String getCode()
{
return code;
}
public Object[] getArgs()
{
return args;
}
public String getDefaultMessage()
{
return defaultMessage;
}
}

View File

@ -7,12 +7,10 @@ import com.ruoyi.common.exception.base.BaseException;
*
* @author ruoyi
*/
public class FileException extends BaseException
{
public class FileException extends BaseException {
private static final long serialVersionUID = 1L;
public FileException(String code, Object[] args)
{
public FileException(String code, Object[] args) {
super("file", code, args, null);
}

View File

@ -2,15 +2,13 @@ package com.ruoyi.common.exception.file;
/**
* 文件名称超长限制异常类
*
*
* @author ruoyi
*/
public class FileNameLengthLimitExceededException extends FileException
{
public class FileNameLengthLimitExceededException extends FileException {
private static final long serialVersionUID = 1L;
public FileNameLengthLimitExceededException(int defaultFileNameLength)
{
super("upload.filename.exceed.length", new Object[] { defaultFileNameLength });
public FileNameLengthLimitExceededException(int defaultFileNameLength) {
super("upload.filename.exceed.length", new Object[]{defaultFileNameLength});
}
}

View File

@ -2,15 +2,13 @@ package com.ruoyi.common.exception.file;
/**
* 文件名大小限制异常类
*
*
* @author ruoyi
*/
public class FileSizeLimitExceededException extends FileException
{
public class FileSizeLimitExceededException extends FileException {
private static final long serialVersionUID = 1L;
public FileSizeLimitExceededException(long defaultMaxSize)
{
super("upload.exceed.maxSize", new Object[] { defaultMaxSize });
public FileSizeLimitExceededException(long defaultMaxSize) {
super("upload.exceed.maxSize", new Object[]{defaultMaxSize});
}
}

View File

@ -1,80 +1,60 @@
package com.ruoyi.common.exception.file;
import java.util.Arrays;
import lombok.*;
import org.apache.commons.fileupload.FileUploadException;
import java.util.Arrays;
/**
* 文件上传 误异常类
*
*
* @author ruoyi
*/
public class InvalidExtensionException extends FileUploadException
{
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
public class InvalidExtensionException extends FileUploadException {
private static final long serialVersionUID = 1L;
private String[] allowedExtension;
private String extension;
private String filename;
public InvalidExtensionException(String[] allowedExtension, String extension, String filename)
{
public InvalidExtensionException(String[] allowedExtension, String extension, String filename) {
super("filename : [" + filename + "], extension : [" + extension + "], allowed extension : [" + Arrays.toString(allowedExtension) + "]");
this.allowedExtension = allowedExtension;
this.extension = extension;
this.filename = filename;
}
public String[] getAllowedExtension()
{
return allowedExtension;
}
public String getExtension()
{
return extension;
}
public String getFilename()
{
return filename;
}
public static class InvalidImageExtensionException extends InvalidExtensionException
{
public static class InvalidImageExtensionException extends InvalidExtensionException {
private static final long serialVersionUID = 1L;
public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename)
{
public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename) {
super(allowedExtension, extension, filename);
}
}
public static class InvalidFlashExtensionException extends InvalidExtensionException
{
public static class InvalidFlashExtensionException extends InvalidExtensionException {
private static final long serialVersionUID = 1L;
public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename)
{
public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename) {
super(allowedExtension, extension, filename);
}
}
public static class InvalidMediaExtensionException extends InvalidExtensionException
{
public static class InvalidMediaExtensionException extends InvalidExtensionException {
private static final long serialVersionUID = 1L;
public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename)
{
public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename) {
super(allowedExtension, extension, filename);
}
}
public static class InvalidVideoExtensionException extends InvalidExtensionException
{
public static class InvalidVideoExtensionException extends InvalidExtensionException {
private static final long serialVersionUID = 1L;
public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename)
{
public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename) {
super(allowedExtension, extension, filename);
}
}

View File

@ -2,7 +2,8 @@ package com.ruoyi.common.exception.job;
/**
* 计划策略异常
*
*
* @deprecated 3.4.0删除 迁移至xxl-job
* @author ruoyi
*/
public class TaskException extends Exception

View File

@ -2,15 +2,13 @@ package com.ruoyi.common.exception.user;
/**
* 验证码错误异常类
*
*
* @author ruoyi
*/
public class CaptchaException extends UserException
{
public class CaptchaException extends UserException {
private static final long serialVersionUID = 1L;
public CaptchaException()
{
public CaptchaException() {
super("user.jcaptcha.error", null);
}
}

View File

@ -2,15 +2,13 @@ package com.ruoyi.common.exception.user;
/**
* 验证码失效异常类
*
*
* @author ruoyi
*/
public class CaptchaExpireException extends UserException
{
public class CaptchaExpireException extends UserException {
private static final long serialVersionUID = 1L;
public CaptchaExpireException()
{
public CaptchaExpireException() {
super("user.jcaptcha.expire", null);
}
}

View File

@ -7,12 +7,10 @@ import com.ruoyi.common.exception.base.BaseException;
*
* @author ruoyi
*/
public class UserException extends BaseException
{
public class UserException extends BaseException {
private static final long serialVersionUID = 1L;
public UserException(String code, Object[] args)
{
public UserException(String code, Object[] args) {
super("user", code, args, null);
}
}

View File

@ -2,15 +2,13 @@ package com.ruoyi.common.exception.user;
/**
* 用户密码不正确或不符合规范异常类
*
*
* @author ruoyi
*/
public class UserPasswordNotMatchException extends UserException
{
public class UserPasswordNotMatchException extends UserException {
private static final long serialVersionUID = 1L;
public UserPasswordNotMatchException()
{
public UserPasswordNotMatchException() {
super("user.password.not.match", null);
}
}

View File

@ -12,37 +12,29 @@ import java.io.IOException;
*
* @author ruoyi
*/
public class RepeatableFilter implements Filter
{
public class RepeatableFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
throws IOException, ServletException {
ServletRequest requestWrapper = null;
if (request instanceof HttpServletRequest
&& StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE))
{
&& StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) {
requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response);
}
if (null == requestWrapper)
{
if (null == requestWrapper) {
chain.doFilter(request, response);
}
else
{
} else {
chain.doFilter(requestWrapper, response);
}
}
@Override
public void destroy()
{
public void destroy() {
}
}

View File

@ -18,12 +18,10 @@ import java.nio.charset.StandardCharsets;
*
* @author ruoyi
*/
public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper
{
public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper {
private final byte[] body;
public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException
{
public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException {
super(request);
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
@ -32,44 +30,36 @@ public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper
}
@Override
public BufferedReader getReader() throws IOException
{
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
@Override
public ServletInputStream getInputStream() throws IOException
{
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream bais = new ByteArrayInputStream(body);
return new ServletInputStream()
{
return new ServletInputStream() {
@Override
public int read() throws IOException
{
public int read() throws IOException {
return bais.read();
}
@Override
public int available() throws IOException
{
public int available() throws IOException {
return body.length;
}
@Override
public boolean isFinished()
{
public boolean isFinished() {
return false;
}
@Override
public boolean isReady()
{
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener)
{
public void setReadListener(ReadListener readListener) {
}
};

View File

@ -14,22 +14,18 @@ import java.util.List;
*
* @author ruoyi
*/
public class XssFilter implements Filter
{
public class XssFilter implements Filter {
/**
* 排除链接
*/
public List<String> excludes = new ArrayList<>();
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
public void init(FilterConfig filterConfig) throws ServletException {
String tempExcludes = filterConfig.getInitParameter("excludes");
if (StringUtils.isNotEmpty(tempExcludes))
{
if (StringUtils.isNotEmpty(tempExcludes)) {
String[] url = tempExcludes.split(",");
for (int i = 0; url != null && i < url.length; i++)
{
for (int i = 0; url != null && i < url.length; i++) {
excludes.add(url[i]);
}
}
@ -37,12 +33,10 @@ public class XssFilter implements Filter
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
if (handleExcludeURL(req, resp))
{
if (handleExcludeURL(req, resp)) {
chain.doFilter(request, response);
return;
}
@ -50,21 +44,18 @@ public class XssFilter implements Filter
chain.doFilter(xssRequest, response);
}
private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response)
{
private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) {
String url = request.getServletPath();
String method = request.getMethod();
// GET DELETE 不过滤
if (method == null || method.matches("GET") || method.matches("DELETE"))
{
if (method == null || method.matches("GET") || method.matches("DELETE")) {
return true;
}
return StringUtils.matches(url, excludes);
}
@Override
public void destroy()
{
public void destroy() {
}
}

View File

@ -19,26 +19,21 @@ import java.nio.charset.StandardCharsets;
*
* @author ruoyi
*/
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
{
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
/**
* @param request
*/
public XssHttpServletRequestWrapper(HttpServletRequest request)
{
public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String[] getParameterValues(String name)
{
public String[] getParameterValues(String name) {
String[] values = super.getParameterValues(name);
if (values != null)
{
if (values != null) {
int length = values.length;
String[] escapseValues = new String[length];
for (int i = 0; i < length; i++)
{
for (int i = 0; i < length; i++) {
// 防xss攻击和过滤前后空格
escapseValues[i] = HtmlUtil.cleanHtmlTag(values[i]).trim();
}
@ -48,18 +43,15 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
}
@Override
public ServletInputStream getInputStream() throws IOException
{
public ServletInputStream getInputStream() throws IOException {
// 非json类型直接返回
if (!isJsonRequest())
{
if (!isJsonRequest()) {
return super.getInputStream();
}
// 为空,直接返回
String json = IoUtil.read(super.getInputStream(), StandardCharsets.UTF_8);
if (StringUtils.isEmpty(json))
{
if (StringUtils.isEmpty(json)) {
return super.getInputStream();
}
@ -67,34 +59,28 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
json = HtmlUtil.cleanHtmlTag(json).trim();
byte[] jsonBytes = json.getBytes(StandardCharsets.UTF_8);
final ByteArrayInputStream bis = IoUtil.toStream(jsonBytes);
return new ServletInputStream()
{
return new ServletInputStream() {
@Override
public boolean isFinished()
{
public boolean isFinished() {
return true;
}
@Override
public boolean isReady()
{
public boolean isReady() {
return true;
}
@Override
public int available() throws IOException
{
public int available() throws IOException {
return jsonBytes.length;
}
@Override
public void setReadListener(ReadListener readListener)
{
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() throws IOException
{
public int read() throws IOException {
return bis.read();
}
};
@ -105,8 +91,7 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
*
* @param request
*/
public boolean isJsonRequest()
{
public boolean isJsonRequest() {
String header = super.getHeader(HttpHeaders.CONTENT_TYPE);
return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE);
}

View File

@ -16,51 +16,51 @@ import java.util.stream.Collectors;
*/
public class BeanCopyUtils {
/**
* 单对象基于class创建拷贝
*
* @param source 数据来源实体
* @param copyOptions copy条件
* @param desc 描述对象 转换后的对象
* @return desc
*/
public static <T, V> V oneCopy(T source, CopyOptions copyOptions, Class<V> desc) {
V v = ReflectUtil.newInstanceIfPossible(desc);
return oneCopy(source, copyOptions, v);
}
/**
* 单对象基于class创建拷贝
*
* @param source 数据来源实体
* @param copyOptions copy条件
* @param desc 描述对象 转换后的对象
* @return desc
*/
public static <T, V> V oneCopy(T source, CopyOptions copyOptions, Class<V> desc) {
V v = ReflectUtil.newInstanceIfPossible(desc);
return oneCopy(source, copyOptions, v);
}
/**
* 单对象基于对象创建拷贝
*
* @param source 数据来源实体
* @param copyOptions copy条件
* @param desc 转换后的对象
* @return desc
*/
public static <T, V> V oneCopy(T source, CopyOptions copyOptions, V desc) {
if (ObjectUtil.isNull(source)) {
return null;
}
return BeanCopier.create(source, desc, copyOptions).copy();
}
/**
* 单对象基于对象创建拷贝
*
* @param source 数据来源实体
* @param copyOptions copy条件
* @param desc 转换后的对象
* @return desc
*/
public static <T, V> V oneCopy(T source, CopyOptions copyOptions, V desc) {
if (ObjectUtil.isNull(source)) {
return null;
}
return BeanCopier.create(source, desc, copyOptions).copy();
}
/**
* 列表对象基于class创建拷贝
*
* @param sourceList 数据来源实体列表
* @param copyOptions copy条件
* @param desc 描述对象 转换后的对象
* @return desc
*/
public static <T, V> List<V> listCopy(List<T> sourceList, CopyOptions copyOptions, Class<V> desc) {
if (ObjectUtil.isNull(sourceList)) {
return null;
}
if (CollUtil.isEmpty(sourceList)) {
return CollUtil.newArrayList();
}
return sourceList.stream()
.map(source -> oneCopy(source, copyOptions, desc))
.collect(Collectors.toList());
}
/**
* 列表对象基于class创建拷贝
*
* @param sourceList 数据来源实体列表
* @param copyOptions copy条件
* @param desc 描述对象 转换后的对象
* @return desc
*/
public static <T, V> List<V> listCopy(List<T> sourceList, CopyOptions copyOptions, Class<V> desc) {
if (ObjectUtil.isNull(sourceList)) {
return null;
}
if (CollUtil.isEmpty(sourceList)) {
return CollUtil.newArrayList();
}
return sourceList.stream()
.map(source -> oneCopy(source, copyOptions, desc))
.collect(Collectors.toList());
}
}

View File

@ -1,18 +1,19 @@
package com.ruoyi.common.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;
import org.apache.commons.lang3.time.DateFormatUtils;
/**
* 时间工具类
*
*
* @author ruoyi
*/
public class DateUtils extends org.apache.commons.lang3.time.DateUtils
{
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
public static String YYYY = "yyyy";
public static String YYYY_MM = "yyyy-MM";
@ -22,65 +23,54 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
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",
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
/**
* 获取当前Date型日期
*
*
* @return Date() 当前日期
*/
public static Date getNowDate()
{
public static Date getNowDate() {
return new Date();
}
/**
* 获取当前日期, 默认格式为yyyy-MM-dd
*
*
* @return String
*/
public static String getDate()
{
public static String getDate() {
return dateTimeNow(YYYY_MM_DD);
}
public static final String getTime()
{
public static final String getTime() {
return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
}
public static final String dateTimeNow()
{
public static final String dateTimeNow() {
return dateTimeNow(YYYYMMDDHHMMSS);
}
public static final String dateTimeNow(final String format)
{
public static final String dateTimeNow(final String format) {
return parseDateToStr(format, new Date());
}
public static final String dateTime(final Date 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)
{
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
{
public static final Date dateTime(final String format, final String ts) {
try {
return new SimpleDateFormat(format).parse(ts);
}
catch (ParseException e)
{
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
@ -88,8 +78,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
/**
* 日期路径 即年/月/日 如2018/08/08
*/
public static final String datePath()
{
public static final String datePath() {
Date now = new Date();
return DateFormatUtils.format(now, "yyyy/MM/dd");
}
@ -97,8 +86,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
/**
* 日期路径 即年/月/日 如20180808
*/
public static final String dateTime()
{
public static final String dateTime() {
Date now = new Date();
return DateFormatUtils.format(now, "yyyyMMdd");
}
@ -106,27 +94,21 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
/**
* 日期型字符串转化为日期 格式
*/
public static Date parseDate(Object str)
{
if (str == null)
{
public static Date parseDate(Object str) {
if (str == null) {
return null;
}
try
{
try {
return parseDate(str.toString(), parsePatterns);
}
catch (ParseException e)
{
} catch (ParseException e) {
return null;
}
}
/**
* 获取服务器启动时间
*/
public static Date getServerStartDate()
{
public static Date getServerStartDate() {
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
return new Date(time);
}
@ -134,8 +116,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
/**
* 计算两个时间差
*/
public static String getDatePoor(Date endDate, Date nowDate)
{
public static String getDatePoor(Date endDate, Date nowDate) {
long nd = 1000 * 24 * 60 * 60;
long nh = 1000 * 60 * 60;
long nm = 1000 * 60;

View File

@ -12,8 +12,8 @@ import java.util.List;
*
* @author ruoyi
*/
public class DictUtils
{
public class DictUtils {
/**
* 分隔符
*/
@ -22,11 +22,10 @@ public class DictUtils
/**
* 设置字典缓存
*
* @param key 参数键
* @param key 参数键
* @param dictDatas 字典数据列表
*/
public static void setDictCache(String key, List<SysDictData> dictDatas)
{
public static void setDictCache(String key, List<SysDictData> dictDatas) {
RedisUtils.setCacheObject(getCacheKey(key), dictDatas);
}
@ -36,12 +35,10 @@ public class DictUtils
* @param key 参数键
* @return dictDatas 字典数据列表
*/
public static List<SysDictData> getDictCache(String key)
{
public static List<SysDictData> getDictCache(String key) {
Object cacheObj = RedisUtils.getCacheObject(getCacheKey(key));
if (StringUtils.isNotNull(cacheObj))
{
List<SysDictData> dictDatas = (List<SysDictData>)cacheObj;
if (StringUtils.isNotNull(cacheObj)) {
List<SysDictData> dictDatas = (List<SysDictData>) cacheObj;
return dictDatas;
}
return null;
@ -50,60 +47,49 @@ public class DictUtils
/**
* 根据字典类型和字典值获取字典标签
*
* @param dictType 字典类型
* @param dictType 字典类型
* @param dictValue 字典值
* @return 字典标签
*/
public static String getDictLabel(String dictType, String dictValue)
{
public static String getDictLabel(String dictType, String dictValue) {
return getDictLabel(dictType, dictValue, SEPARATOR);
}
/**
* 根据字典类型和字典标签获取字典值
*
* @param dictType 字典类型
* @param dictType 字典类型
* @param dictLabel 字典标签
* @return 字典值
*/
public static String getDictValue(String dictType, String dictLabel)
{
public static String getDictValue(String dictType, String dictLabel) {
return getDictValue(dictType, dictLabel, SEPARATOR);
}
/**
* 根据字典类型和字典值获取字典标签
*
* @param dictType 字典类型
* @param dictType 字典类型
* @param dictValue 字典值
* @param separator 分隔符
* @return 字典标签
*/
public static String getDictLabel(String dictType, String dictValue, String separator)
{
public static String getDictLabel(String dictType, String dictValue, String separator) {
StringBuilder propertyString = new StringBuilder();
List<SysDictData> datas = getDictCache(dictType);
if (StringUtils.containsAny(dictValue, separator) && CollUtil.isNotEmpty(datas))
{
for (SysDictData dict : datas)
{
for (String value : dictValue.split(separator))
{
if (value.equals(dict.getDictValue()))
{
if (StringUtils.containsAny(dictValue, separator) && CollUtil.isNotEmpty(datas)) {
for (SysDictData dict : datas) {
for (String value : dictValue.split(separator)) {
if (value.equals(dict.getDictValue())) {
propertyString.append(dict.getDictLabel() + separator);
break;
}
}
}
}
else
{
for (SysDictData dict : datas)
{
if (dictValue.equals(dict.getDictValue()))
{
} else {
for (SysDictData dict : datas) {
if (dictValue.equals(dict.getDictValue())) {
return dict.getDictLabel();
}
}
@ -114,36 +100,27 @@ public class DictUtils
/**
* 根据字典类型和字典标签获取字典值
*
* @param dictType 字典类型
* @param dictType 字典类型
* @param dictLabel 字典标签
* @param separator 分隔符
* @return 字典值
*/
public static String getDictValue(String dictType, String dictLabel, String separator)
{
public static String getDictValue(String dictType, String dictLabel, String separator) {
StringBuilder propertyString = new StringBuilder();
List<SysDictData> datas = getDictCache(dictType);
if (StringUtils.containsAny(dictLabel, separator) && CollUtil.isNotEmpty(datas))
{
for (SysDictData dict : datas)
{
for (String label : dictLabel.split(separator))
{
if (label.equals(dict.getDictLabel()))
{
if (StringUtils.containsAny(dictLabel, separator) && CollUtil.isNotEmpty(datas)) {
for (SysDictData dict : datas) {
for (String label : dictLabel.split(separator)) {
if (label.equals(dict.getDictLabel())) {
propertyString.append(dict.getDictValue() + separator);
break;
}
}
}
}
else
{
for (SysDictData dict : datas)
{
if (dictLabel.equals(dict.getDictLabel()))
{
} else {
for (SysDictData dict : datas) {
if (dictLabel.equals(dict.getDictLabel())) {
return dict.getDictValue();
}
}
@ -156,16 +133,14 @@ public class DictUtils
*
* @param key 字典键
*/
public static void removeDictCache(String key)
{
public static void removeDictCache(String key) {
RedisUtils.deleteObject(getCacheKey(key));
}
/**
* 清空字典缓存
*/
public static void clearDictCache()
{
public static void clearDictCache() {
Collection<String> keys = RedisUtils.keys(Constants.SYS_DICT_KEY + "*");
RedisUtils.deleteObject(keys);
}
@ -176,8 +151,7 @@ public class DictUtils
* @param configKey 参数键
* @return 缓存键key
*/
public static String getCacheKey(String configKey)
{
public static String getCacheKey(String configKey) {
return Constants.SYS_DICT_KEY + configKey;
}
}

View File

@ -24,9 +24,9 @@ public class JsonUtils {
private static ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class);
public static String toJsonString(Object object) {
if (StringUtils.isNull(object)) {
return null;
}
if (StringUtils.isNull(object)) {
return null;
}
try {
return objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
@ -57,9 +57,9 @@ public class JsonUtils {
}
public static <T> T parseObject(String text, TypeReference<T> typeReference) {
if (StringUtils.isBlank(text)) {
return null;
}
if (StringUtils.isBlank(text)) {
return null;
}
try {
return objectMapper.readValue(text, typeReference);
} catch (IOException e) {
@ -67,16 +67,17 @@ public class JsonUtils {
}
}
public static <T> Map<String, T> parseMap(String text) {
if (StringUtils.isBlank(text)) {
return null;
}
try {
return objectMapper.readValue(text, new TypeReference<Map<String, T>>() {});
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static <T> Map<String, T> parseMap(String text) {
if (StringUtils.isBlank(text)) {
return null;
}
try {
return objectMapper.readValue(text, new TypeReference<Map<String, T>>() {
});
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static <T> List<T> parseArray(String text, Class<T> clazz) {
if (StringUtils.isEmpty(text)) {

View File

@ -1,16 +1,15 @@
package com.ruoyi.common.utils;
import com.ruoyi.common.utils.spring.SpringUtils;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import com.ruoyi.common.utils.spring.SpringUtils;
/**
* 获取i18n资源文件
*
*
* @author ruoyi
*/
public class MessageUtils
{
public class MessageUtils {
/**
* 根据消息键和参数 获取消息 委托给spring messageSource
*
@ -18,8 +17,7 @@ public class MessageUtils
* @param args 参数
* @return 获取国际化翻译值
*/
public static String message(String code, Object... args)
{
public static String message(String code, Object... args) {
MessageSource messageSource = SpringUtils.getBean(MessageSource.class);
return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
}

View File

@ -48,6 +48,7 @@ public class PageUtils {
/**
* 构建 plus 分页对象
*
* @param <T> domain 实体
* @param <K> vo 实体
* @return 分页对象
@ -66,12 +67,13 @@ public class PageUtils {
return page;
}
public static <T> Page<T> buildPage() {
return buildPage(null, null);
}
public static <T> Page<T> buildPage() {
return buildPage(null, null);
}
/**
* 构建 MP 普通分页对象
*
* @param <T> domain 实体
* @return 分页对象
*/
@ -98,8 +100,8 @@ public class PageUtils {
}
if (StringUtils.isNotBlank(orderByColumn)) {
String orderBy = SqlUtil.escapeOrderBySql(orderByColumn);
orderBy = StringUtils.toUnderScoreCase(orderBy);
if ("asc".equals(isAsc)) {
orderBy = StringUtils.toUnderScoreCase(orderBy);
if ("asc".equals(isAsc)) {
return OrderItem.asc(orderBy);
} else if ("desc".equals(isAsc)) {
return OrderItem.desc(orderBy);

View File

@ -259,6 +259,18 @@ public class RedisUtils {
return rMap.get(hKey);
}
/**
* 删除Hash中的数据
*
* @param key Redis键
* @param hKey Hash键
* @return Hash中的对象
*/
public static <T> T delCacheMapValue(final String key, final String hKey) {
RMap<String, T> rMap = client.getMap(key);
return rMap.remove(hKey);
}
/**
* 获取多个Hash中的数据
*

View File

@ -1,30 +1,26 @@
package com.ruoyi.common.utils;
import cn.hutool.http.HttpStatus;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.exception.ServiceException;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.exception.ServiceException;
/**
* 安全服务工具类
*
* @author ruoyi
*/
public class SecurityUtils
{
public class SecurityUtils {
/**
* 用户ID
**/
public static Long getUserId()
{
try
{
public static Long getUserId() {
try {
return getLoginUser().getUserId();
}
catch (Exception e)
{
} catch (Exception e) {
throw new ServiceException("获取用户ID异常", HttpStatus.HTTP_UNAUTHORIZED);
}
}
@ -32,14 +28,10 @@ public class SecurityUtils
/**
* 获取部门ID
**/
public static Long getDeptId()
{
try
{
public static Long getDeptId() {
try {
return getLoginUser().getDeptId();
}
catch (Exception e)
{
} catch (Exception e) {
throw new ServiceException("获取部门ID异常", HttpStatus.HTTP_UNAUTHORIZED);
}
}
@ -47,14 +39,10 @@ public class SecurityUtils
/**
* 获取用户账户
**/
public static String getUsername()
{
try
{
public static String getUsername() {
try {
return getLoginUser().getUsername();
}
catch (Exception e)
{
} catch (Exception e) {
throw new ServiceException("获取用户账户异常", HttpStatus.HTTP_UNAUTHORIZED);
}
}
@ -62,14 +50,10 @@ public class SecurityUtils
/**
* 获取用户
**/
public static LoginUser getLoginUser()
{
try
{
public static LoginUser getLoginUser() {
try {
return (LoginUser) getAuthentication().getPrincipal();
}
catch (Exception e)
{
} catch (Exception e) {
throw new ServiceException("获取用户信息异常", HttpStatus.HTTP_UNAUTHORIZED);
}
}
@ -77,8 +61,7 @@ public class SecurityUtils
/**
* 获取Authentication
*/
public static Authentication getAuthentication()
{
public static Authentication getAuthentication() {
return SecurityContextHolder.getContext().getAuthentication();
}
@ -88,8 +71,7 @@ public class SecurityUtils
* @param password 密码
* @return 加密字符串
*/
public static String encryptPassword(String password)
{
public static String encryptPassword(String password) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
return passwordEncoder.encode(password);
}
@ -97,12 +79,11 @@ public class SecurityUtils
/**
* 判断密码是否相同
*
* @param rawPassword 真实密码
* @param rawPassword 真实密码
* @param encodedPassword 加密后字符
* @return 结果
*/
public static boolean matchesPassword(String rawPassword, String encodedPassword)
{
public static boolean matchesPassword(String rawPassword, String encodedPassword) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
return passwordEncoder.matches(rawPassword, encodedPassword);
}
@ -113,8 +94,7 @@ public class SecurityUtils
* @param userId 用户ID
* @return 结果
*/
public static boolean isAdmin(Long userId)
{
public static boolean isAdmin(Long userId) {
return userId != null && 1L == userId;
}
}

View File

@ -20,33 +20,34 @@ import java.nio.charset.StandardCharsets;
* @author ruoyi
*/
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);
}
/**
* 获取String参数
*/
public static String getParameter(String name) {
return getRequest().getParameter(name);
}
/**
* 获取Integer参数
*/
public static Integer getParameterToInt(String name) {
return Convert.toInt(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, Integer defaultValue) {
return Convert.toInt(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参数
@ -69,75 +70,75 @@ public class ServletUtils extends ServletUtil {
return getRequestAttributes().getRequest();
}
/**
* 获取response
*/
public static HttpServletResponse getResponse() {
return getRequestAttributes().getResponse();
}
/**
* 获取response
*/
public static HttpServletResponse getResponse() {
return getRequestAttributes().getResponse();
}
/**
* 获取session
*/
public static HttpSession getSession() {
return getRequest().getSession();
}
/**
* 获取session
*/
public static HttpSession getSession() {
return getRequest().getSession();
}
public static ServletRequestAttributes getRequestAttributes() {
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
return (ServletRequestAttributes) attributes;
}
public static ServletRequestAttributes getRequestAttributes() {
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
return (ServletRequestAttributes) attributes;
}
/**
* 将字符串渲染到客户端
*
* @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;
}
/**
* 将字符串渲染到客户端
*
* @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) {
/**
* 是否是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 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 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 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;
}
String ajax = request.getParameter("__ajax");
if (StringUtils.equalsAnyIgnoreCase(ajax, "json", "xml")) {
return true;
}
return false;
}
public static String getClientIP() {
return getClientIP(getRequest());
}
public static String getClientIP() {
return getClientIP(getRequest());
}
}

View File

@ -13,7 +13,7 @@ import java.util.*;
/**
* 字符串工具类
*
* @author ruoyi
* @author Lion Li
*/
public class StringUtils extends org.apache.commons.lang3.StringUtils {

View File

@ -1,33 +1,25 @@
package com.ruoyi.common.utils;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.*;
/**
* 线程相关工具类.
*
*
* @author ruoyi
*/
public class Threads
{
public class Threads {
private static final Logger logger = LoggerFactory.getLogger(Threads.class);
/**
* sleep等待,单位为毫秒
*/
public static void sleep(long milliseconds)
{
try
{
public static void sleep(long milliseconds) {
try {
Thread.sleep(milliseconds);
}
catch (InterruptedException e)
{
} catch (InterruptedException e) {
return;
}
}
@ -36,27 +28,20 @@ public class Threads
* 停止线程池
* 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务.
* 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数.
* 如果仍超時,則強制退出.
* 如果仍超時,則強制退出.
* 另对在shutdown时线程本身被调用中断做了处理.
*/
public static void shutdownAndAwaitTermination(ExecutorService pool)
{
if (pool != null && !pool.isShutdown())
{
public static void shutdownAndAwaitTermination(ExecutorService pool) {
if (pool != null && !pool.isShutdown()) {
pool.shutdown();
try
{
if (!pool.awaitTermination(120, TimeUnit.SECONDS))
{
try {
if (!pool.awaitTermination(120, TimeUnit.SECONDS)) {
pool.shutdownNow();
if (!pool.awaitTermination(120, TimeUnit.SECONDS))
{
if (!pool.awaitTermination(120, TimeUnit.SECONDS)) {
logger.info("Pool did not terminate");
}
}
}
catch (InterruptedException ie)
{
} catch (InterruptedException ie) {
pool.shutdownNow();
Thread.currentThread().interrupt();
}
@ -66,33 +51,22 @@ public class Threads
/**
* 打印线程异常信息
*/
public static void printException(Runnable r, Throwable t)
{
if (t == null && r instanceof Future<?>)
{
try
{
public static void printException(Runnable r, Throwable t) {
if (t == null && r instanceof Future<?>) {
try {
Future<?> future = (Future<?>) r;
if (future.isDone())
{
if (future.isDone()) {
future.get();
}
}
catch (CancellationException ce)
{
} catch (CancellationException ce) {
t = ce;
}
catch (ExecutionException ee)
{
} catch (ExecutionException ee) {
t = ee.getCause();
}
catch (InterruptedException ie)
{
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
}
if (t != null)
{
if (t != null) {
logger.error(t.getMessage(), t);
}
}

View File

@ -10,20 +10,18 @@ import java.nio.charset.StandardCharsets;
/**
* 文件处理工具类
*
* @author ruoyi
* @author Lion Li
*/
public class FileUtils extends FileUtil
{
public class FileUtils extends FileUtil {
/**
* 下载文件名重新编码
*
* @param response 响应对象
* @param response 响应对象
* @param realFileName 真实文件名
* @return
*/
public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException
{
public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException {
String percentEncodedFileName = percentEncode(realFileName);
StringBuilder contentDispositionValue = new StringBuilder();
@ -34,6 +32,8 @@ public class FileUtils extends FileUtil
.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);
}
@ -44,8 +44,7 @@ public class FileUtils extends FileUtil
* @param s 需要百分号编码的字符串
* @return 百分号编码后的字符串
*/
public static String percentEncode(String s) throws UnsupportedEncodingException
{
public static String percentEncode(String s) throws UnsupportedEncodingException {
String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString());
return encode.replaceAll("\\+", "%20");
}

View File

@ -14,45 +14,45 @@ import java.util.Map;
/**
* 获取地址类
*
* @author ruoyi
* @author Lion Li
*/
@Slf4j
public class AddressUtils {
// IP地址查询
public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp";
// IP地址查询
public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp";
// 未知地址
public static final String UNKNOWN = "XX XX";
// 未知地址
public static final String UNKNOWN = "XX XX";
public static String getRealAddressByIP(String ip) {
String address = UNKNOWN;
if (StringUtils.isBlank(ip)){
return address;
}
// 内网不查询
ip = "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(ip);
if (NetUtil.isInnerIP(ip)) {
return "内网IP";
}
if (RuoYiConfig.isAddressEnabled()) {
try {
String rspStr = HttpUtil.createGet(IP_URL)
.body("ip=" + ip + "&json=true", Constants.GBK)
.execute()
.body();
if (StringUtils.isEmpty(rspStr)) {
log.error("获取地理位置异常 {}", ip);
return UNKNOWN;
}
Map<String, String> obj = JsonUtils.parseMap(rspStr);
String region = obj.get("pro");
String city = obj.get("city");
return String.format("%s %s", region, city);
} catch (Exception e) {
log.error("获取地理位置异常 {}", ip);
}
}
return address;
}
public static String getRealAddressByIP(String ip) {
String address = UNKNOWN;
if (StringUtils.isBlank(ip)) {
return address;
}
// 内网不查询
ip = "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(ip);
if (NetUtil.isInnerIP(ip)) {
return "内网IP";
}
if (RuoYiConfig.isAddressEnabled()) {
try {
String rspStr = HttpUtil.createGet(IP_URL)
.body("ip=" + ip + "&json=true", Constants.GBK)
.execute()
.body();
if (StringUtils.isEmpty(rspStr)) {
log.error("获取地理位置异常 {}", ip);
return UNKNOWN;
}
Map<String, String> obj = JsonUtils.parseMap(rspStr);
String region = obj.get("pro");
String city = obj.get("city");
return String.format("%s %s", region, city);
} catch (Exception e) {
log.error("获取地理位置异常 {}", ip);
}
}
return address;
}
}

View File

@ -12,14 +12,12 @@ import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
/**
* Excel相关处理
*
* @author ruoyi
* @author Lion Li
*/
public class ExcelUtil {
@ -44,8 +42,6 @@ public class ExcelUtil {
try {
String filename = encodingFilename(sheetName);
response.reset();
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Expose-Headers", "Content-Disposition");
FileUtils.setAttachmentResponseHeader(response, filename);
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
ServletOutputStream os = response.getOutputStream();

View File

@ -13,41 +13,41 @@ import java.lang.reflect.Method;
@SuppressWarnings("rawtypes")
public class ReflectUtils extends ReflectUtil {
private static final String SETTER_PREFIX = "set";
private static final String SETTER_PREFIX = "set";
private static final String GETTER_PREFIX = "get";
private static final String GETTER_PREFIX = "get";
/**
* 调用Getter方法.
* 支持多级,如:对象名.对象名.方法
*/
@SuppressWarnings("unchecked")
public static <E> E invokeGetter(Object obj, String propertyName) {
Object object = obj;
for (String name : StringUtils.split(propertyName, ".")) {
String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name);
object = invoke(object, getterMethodName);
}
return (E) object;
}
/**
* 调用Getter方法.
* 支持多级,如:对象名.对象名.方法
*/
@SuppressWarnings("unchecked")
public static <E> E invokeGetter(Object obj, String propertyName) {
Object object = obj;
for (String name : StringUtils.split(propertyName, ".")) {
String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name);
object = invoke(object, getterMethodName);
}
return (E) object;
}
/**
* 调用Setter方法, 仅匹配方法名。
* 支持多级,如:对象名.对象名.方法
*/
public static <E> void invokeSetter(Object obj, String propertyName, E value) {
Object object = obj;
String[] names = StringUtils.split(propertyName, ".");
for (int i = 0; i < names.length; i++) {
if (i < names.length - 1) {
String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]);
object = invoke(object, getterMethodName);
} else {
String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]);
Method method = getMethodByName(object.getClass(), setterMethodName);
invoke(object, method, value);
}
}
}
/**
* 调用Setter方法, 仅匹配方法名。
* 支持多级,如:对象名.对象名.方法
*/
public static <E> void invokeSetter(Object obj, String propertyName, E value) {
Object object = obj;
String[] names = StringUtils.split(propertyName, ".");
for (int i = 0; i < names.length; i++) {
if (i < names.length - 1) {
String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]);
object = invoke(object, getterMethodName);
} else {
String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]);
Method method = getMethodByName(object.getClass(), setterMethodName);
invoke(object, method, value);
}
}
}
}

View File

@ -13,53 +13,53 @@ import org.springframework.stereotype.Component;
@Component
public final class SpringUtils extends SpringUtil {
/**
* 如果BeanFactory包含一个与所给名称匹配的bean定义则返回true
*
* @param name
* @return boolean
*/
public static boolean containsBean(String name) {
return getBeanFactory().containsBean(name);
}
/**
* 如果BeanFactory包含一个与所给名称匹配的bean定义则返回true
*
* @param name
* @return boolean
*/
public static boolean containsBean(String name) {
return getBeanFactory().containsBean(name);
}
/**
* 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
* 如果与给定名字相应的bean定义没有被找到将会抛出一个异常NoSuchBeanDefinitionException
*
* @param name
* @return boolean
*/
public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
return getBeanFactory().isSingleton(name);
}
/**
* 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
* 如果与给定名字相应的bean定义没有被找到将会抛出一个异常NoSuchBeanDefinitionException
*
* @param name
* @return boolean
*/
public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
return getBeanFactory().isSingleton(name);
}
/**
* @param name
* @return Class 注册对象的类型
*/
public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
return getBeanFactory().getType(name);
}
/**
* @param name
* @return Class 注册对象的类型
*/
public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
return getBeanFactory().getType(name);
}
/**
* 如果给定的bean名字在bean定义中有别名则返回这些别名
*
* @param name
*/
public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
return getBeanFactory().getAliases(name);
}
/**
* 如果给定的bean名字在bean定义中有别名则返回这些别名
*
* @param name
*/
public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
return getBeanFactory().getAliases(name);
}
/**
* 获取aop代理对象
*
* @param invoker
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T getAopProxy(T invoker) {
return (T) AopContext.currentProxy();
}
/**
* 获取aop代理对象
*
* @param invoker
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T getAopProxy(T invoker) {
return (T) AopContext.currentProxy();
}
}

View File

@ -8,8 +8,7 @@ import com.ruoyi.common.utils.StringUtils;
*
* @author ruoyi
*/
public class SqlUtil
{
public class SqlUtil {
/**
* 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序)
*/
@ -18,10 +17,8 @@ public class SqlUtil
/**
* 检查字符,防止注入绕过
*/
public static String escapeOrderBySql(String value)
{
if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value))
{
public static String escapeOrderBySql(String value) {
if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) {
throw new UtilException("参数不符合规范,不能进行查询");
}
return value;
@ -30,8 +27,7 @@ public class SqlUtil
/**
* 验证 order by 语法是否符合规范
*/
public static boolean isValidOrderBySql(String value)
{
public static boolean isValidOrderBySql(String value) {
return value.matches(SQL_PATTERN);
}
}

View File

@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
* feign测试controller
*
* @author Lion Li
* @deprecated 由于使用人数较少 决定与 3.4.0 版本移除
*/
@Api(value = "feign测试", tags = {"feign测试"})
@RequiredArgsConstructor(onConstructor_ = @Autowired)

View File

@ -1,6 +1,7 @@
package com.ruoyi.demo.controller;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.RedisUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@ -12,6 +13,8 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.TimeUnit;
/**
* spring-cache 演示案例
*
@ -76,4 +79,24 @@ public class RedisCacheController {
return AjaxResult.success("操作成功", value);
}
/**
* 测试设置过期时间
* 手动设置过期时间10秒
* 11秒后获取 判断是否相等
*/
@ApiOperation("测试设置过期时间")
@GetMapping("/test6")
public AjaxResult<Boolean> test6(String key, String value){
RedisUtils.setCacheObject(key, value);
boolean flag = RedisUtils.expire(key, 10, TimeUnit.SECONDS);
System.out.println("***********" + flag);
try {
Thread.sleep(11 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Object obj = RedisUtils.getCacheObject(key);
return AjaxResult.success("操作成功", value.equals(obj));
}
}

View File

@ -59,7 +59,7 @@ public class TestDemoController extends BaseController {
@ApiOperation("自定义分页查询")
@PreAuthorize("@ss.hasPermi('demo:demo:list')")
@GetMapping("/page")
public TableDataInfo<TestDemoVo> page(@Validated TestDemoBo bo) {
public TableDataInfo<TestDemoVo> page(@Validated(QueryGroup.class) TestDemoBo bo) {
return iTestDemoService.customPageList(bo);
}

View File

@ -1,13 +1,11 @@
package com.ruoyi.demo.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 测试单表对象 test_demo
*
@ -15,10 +13,10 @@ import java.util.Date;
* @date 2021-07-26
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("test_demo")
public class TestDemo implements Serializable {
public class TestDemo extends BaseEntity {
private static final long serialVersionUID=1L;
@ -42,7 +40,7 @@ public class TestDemo implements Serializable {
/**
* 排序号
*/
@OrderBy(isDesc = false, sort = 1)
@OrderBy(asc = false, sort = 1)
private Long orderNum;
/**
@ -61,30 +59,6 @@ public class TestDemo implements Serializable {
@Version
private Long version;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
private String createBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 更新人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/**
* 删除标志
*/

View File

@ -1,13 +1,14 @@
package com.ruoyi.demo.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import com.ruoyi.common.core.domain.TreeEntity;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 测试树表对象 test_tree
*
@ -15,10 +16,10 @@ import java.util.Date;
* @date 2021-07-26
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("test_tree")
public class TestTree implements Serializable {
public class TestTree extends TreeEntity {
private static final long serialVersionUID=1L;
@ -29,11 +30,6 @@ public class TestTree implements Serializable {
@TableId(value = "id")
private Long id;
/**
* 父id
*/
private Long parentId;
/**
* 部门id
*/
@ -55,30 +51,6 @@ public class TestTree implements Serializable {
@Version
private Long version;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
private String createBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 更新人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/**
* 删除标志
*/

View File

@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestParam;
* 增加 feign 的目的为使 http 请求接口化
*
* @author Lion Li
* @deprecated 由于使用人数较少 决定与 3.4.0 版本移除
*/
@FeignClient(
name = FeignTestConstant.BAIDU_NAME,

View File

@ -1,5 +1,9 @@
package com.ruoyi.demo.feign.constant;
/**
* @deprecated 由于使用人数较少 决定与 3.4.0 版本移除
*/
@Deprecated
public class FeignTestConstant {
public static final String BAIDU_NAME = "baidu";

View File

@ -14,6 +14,7 @@ import org.springframework.stereotype.Component;
*
* @see {com.ruoyi.framework.config.FeignConfig#errorDecoder()}
* @author Lion Li
* @deprecated 由于使用人数较少 决定与 3.4.0 版本移除
*/
@Slf4j
@Component

View File

@ -0,0 +1,85 @@
package com.ruoyi.framework.Interceptor;
import cn.hutool.core.map.MapUtil;
import com.alibaba.ttl.TransmittableThreadLocal;
import com.ruoyi.common.utils.JsonUtils;
import com.ruoyi.common.utils.StringUtils;
import com.yomahub.tlog.context.TLogContext;
import com.yomahub.tlog.web.interceptor.AbsTLogWebHandlerMethodInterceptor;
import com.yomahub.tlog.web.wrapper.RequestWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.StopWatch;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
* 重写Tlog web的调用时间统计拦截器
*
* @author Lion Li
* @since 3.3.0
*/
@Slf4j
public class PlusWebInvokeTimeInterceptor extends AbsTLogWebHandlerMethodInterceptor {
private final TransmittableThreadLocal<StopWatch> invokeTimeTL = new TransmittableThreadLocal<>();
@Override
public boolean preHandleByHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (TLogContext.enableInvokeTimePrint()) {
String url = request.getMethod() + " " + request.getRequestURI();
// 打印请求参数
if (isJsonRequest(request)) {
String jsonParam = new RequestWrapper(request).getBodyString();
log.info("[PLUS]开始请求 => URL[{}],参数类型[json],参数:[{}]", url, jsonParam);
} else {
Map<String, String[]> parameterMap = request.getParameterMap();
if (MapUtil.isNotEmpty(parameterMap)) {
String parameters = JsonUtils.toJsonString(parameterMap);
log.info("[PLUS]开始请求 => URL[{}],参数类型[param],参数:[{}]", url, parameters);
} else {
log.info("[PLUS]开始请求 => URL[{}],无参数", url);
}
}
StopWatch stopWatch = new StopWatch();
invokeTimeTL.set(stopWatch);
stopWatch.start();
}
return true;
}
@Override
public void postHandleByHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletionByHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
if (TLogContext.enableInvokeTimePrint()) {
StopWatch stopWatch = invokeTimeTL.get();
stopWatch.stop();
log.info("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime());
invokeTimeTL.remove();
}
}
/**
* 判断本次请求的数据类型是否为json
*
* @param request request
* @return boolean
*/
private boolean isJsonRequest(HttpServletRequest request) {
String contentType = request.getContentType();
if (contentType != null) {
return StringUtils.startsWithIgnoreCase(contentType, MediaType.APPLICATION_JSON_VALUE);
}
return false;
}
}

View File

@ -37,13 +37,13 @@ public class RateLimiterAspect {
}
long number = RedisUtils.rateLimiter(combineKey, rateType, count, time);
if (number == -1) {
throw new ServiceException("访问过于频繁,请稍再试");
throw new ServiceException("访问过于频繁,请稍再试");
}
log.info("限制令牌 => {}, 剩余令牌 => {}, 缓存key => '{}'", count, number, combineKey);
} catch (ServiceException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException("服务器限流异常,请稍再试");
throw new RuntimeException("服务器限流异常,请稍再试");
}
}

View File

@ -17,7 +17,9 @@ import java.util.concurrent.TimeUnit;
* openfeign配置类
*
* @author Lion Li
* @deprecated 由于使用人数较少 决定与 3.4.0 版本移除
*/
@Deprecated
@EnableFeignClients("${feign.package}")
@Configuration
@ConditionalOnClass(Feign.class)

View File

@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.ruoyi.common.core.mybatisplus.methods.InsertAll;
import com.ruoyi.framework.mybatisplus.CreateAndUpdateMetaObjectHandler;
import com.ruoyi.framework.handler.CreateAndUpdateMetaObjectHandler;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@ -18,13 +18,12 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.util.List;
/**
* mybatis-plus配置类
* mybatis-plus配置类(下方注释有插件介绍)
*
* @author Lion Li
*/
@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
// 指定要扫描的Mapper类的包的路径
@MapperScan("${mybatis-plus.mapperPackage}")
public class MybatisPlusConfig {
@ -35,14 +34,11 @@ public class MybatisPlusConfig {
interceptor.addInnerInterceptor(paginationInnerInterceptor());
// 乐观锁插件
interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
// 阻断插件
// interceptor.addInnerInterceptor(blockAttackInnerInterceptor());
return interceptor;
}
/**
* 分页插件,自动识别数据库类型
* https://baomidou.com/guide/interceptor-pagination.html
*/
public PaginationInnerInterceptor paginationInnerInterceptor() {
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
@ -55,41 +51,13 @@ public class MybatisPlusConfig {
/**
* 乐观锁插件
* https://baomidou.com/guide/interceptor-optimistic-locker.html
*/
public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
return new OptimisticLockerInnerInterceptor();
}
/**
* 如果是对全表的删除或更新操作,就会终止该操作
* https://baomidou.com/guide/interceptor-block-attack.html
*/
// public BlockAttackInnerInterceptor blockAttackInnerInterceptor() {
// return new BlockAttackInnerInterceptor();
// }
/**
* sql性能规范插件(垃圾SQL拦截)
* 如有需要可以启用
*/
// public IllegalSQLInnerInterceptor illegalSQLInnerInterceptor() {
// return new IllegalSQLInnerInterceptor();
// }
/**
* 自定义主键策略
* https://baomidou.com/guide/id-generator.html
*/
// @Bean
// public IdentifierGenerator idGenerator() {
// return new CustomIdGenerator();
// }
/**
* 元对象字段填充控制器
* https://baomidou.com/guide/auto-fill-metainfo.html
*/
@Bean
public MetaObjectHandler metaObjectHandler() {
@ -98,7 +66,6 @@ public class MybatisPlusConfig {
/**
* sql注入器配置
* https://baomidou.com/guide/sql-injector.html
*/
@Bean
public ISqlInjector sqlInjector() {
@ -113,6 +80,19 @@ public class MybatisPlusConfig {
}
/**
* PaginationInnerInterceptor 分页插件,自动识别数据库类型
* https://baomidou.com/guide/interceptor-pagination.html
* OptimisticLockerInnerInterceptor 乐观锁插件
* https://baomidou.com/guide/interceptor-optimistic-locker.html
* MetaObjectHandler 元对象字段填充控制器
* https://baomidou.com/guide/auto-fill-metainfo.html
* ISqlInjector sql注入器
* https://baomidou.com/guide/sql-injector.html
* BlockAttackInnerInterceptor 如果是对全表的删除或更新操作,就会终止该操作
* https://baomidou.com/guide/interceptor-block-attack.html
* IllegalSQLInnerInterceptor sql性能规范插件(垃圾SQL拦截)
* IdentifierGenerator 自定义主键策略
* https://baomidou.com/guide/id-generator.html
* TenantLineInnerInterceptor 多租户插件
* https://baomidou.com/guide/interceptor-tenant-line.html
* DynamicTableNameInnerInterceptor 动态表名插件

View File

@ -76,7 +76,7 @@ public class RedisConfig extends CachingConfigurerSupport {
.setConnectionPoolSize(singleServerConfig.getConnectionPoolSize())
.setDnsMonitoringInterval(singleServerConfig.getDnsMonitoringInterval());
}
// 集群配置方式 参考下方注释
RedissonProperties.ClusterServersConfig clusterServersConfig = redissonProperties.getClusterServersConfig();
if (ObjectUtil.isNotNull(clusterServersConfig)) {
// 使用集群模式
@ -123,4 +123,69 @@ public class RedisConfig extends CachingConfigurerSupport {
return new RedissonSpringCacheManager(redissonClient, config, JsonJacksonCodec.INSTANCE);
}
/**
* redis集群配置 yml
*
* --- # redis 集群配置(单机与集群只能开启一个另一个需要注释掉)
* spring:
* redis:
* cluster:
* nodes:
* - 192.168.0.100:6379
* - 192.168.0.101:6379
* - 192.168.0.102:6379
* # 密码
* password:
* # 连接超时时间
* timeout: 10s
* # 是否开启ssl
* ssl: false
*
* redisson:
* # 线程池数量
* threads: 16
* # Netty线程池数量
* nettyThreads: 32
* # 传输模式
* transportMode: "NIO"
* # 集群配置
* clusterServersConfig:
* # 客户端名称
* clientName: ${ruoyi.name}
* # master最小空闲连接数
* masterConnectionMinimumIdleSize: 32
* # master连接池大小
* masterConnectionPoolSize: 64
* # slave最小空闲连接数
* slaveConnectionMinimumIdleSize: 32
* # slave连接池大小
* slaveConnectionPoolSize: 64
* # 连接空闲超时,单位:毫秒
* idleConnectionTimeout: 10000
* # ping连接间隔
* pingConnectionInterval: 1000
* # 命令等待超时,单位:毫秒
* timeout: 3000
* # 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。
* retryAttempts: 3
* # 命令重试发送时间间隔,单位:毫秒
* retryInterval: 1500
* # 从可用服务器的内部列表中排除 Redis Slave 重新连接尝试的间隔。
* failedSlaveReconnectionInterval: 3000
* # 发布和订阅连接池最小空闲连接数
* subscriptionConnectionMinimumIdleSize: 1
* # 发布和订阅连接池大小
* subscriptionConnectionPoolSize: 50
* # 单个连接最大订阅数量
* subscriptionsPerConnection: 5
* # 扫描间隔
* scanInterval: 1000
* # DNS监测时间间隔单位毫秒
* dnsMonitoringInterval: 5000
* # 读取模式
* readMode: "SLAVE"
* # 订阅模式
* subscriptionMode: "MASTER"
*/
}

View File

@ -1,10 +1,13 @@
package com.ruoyi.framework.config;
import com.ruoyi.framework.Interceptor.PlusWebInvokeTimeInterceptor;
import com.yomahub.tlog.web.interceptor.TLogWebInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@ -20,12 +23,19 @@ public class ResourcesConfig implements WebMvcConfigurer {
public void addResourceHandlers(ResourceHandlerRegistry registry) {
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 全局链路跟踪拦截器
registry.addInterceptor(new TLogWebInterceptor());
// 全局访问性能拦截
registry.addInterceptor(new PlusWebInvokeTimeInterceptor());
}
/**
* 跨域配置
*/
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
// 设置访问源地址
@ -34,8 +44,12 @@ public class ResourcesConfig implements WebMvcConfigurer {
config.addAllowedHeader("*");
// 设置访问源请求方法
config.addAllowedMethod("*");
// 对接口配置跨域设置
// 有效期 1800秒
config.setMaxAge(1800L);
// 添加映射路径,拦截一切请求
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
// 返回新的CorsFilter
return new CorsFilter(source);
}
}
}

View File

@ -0,0 +1,49 @@
package com.ruoyi.framework.config;
import com.yomahub.tlog.core.aop.AspectLogAop;
import com.yomahub.tlog.feign.filter.TLogFeignFilter;
import com.yomahub.tlog.spring.TLogPropertyInit;
import com.yomahub.tlog.spring.TLogSpringAware;
import com.yomahub.tlog.springboot.property.TLogProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.annotation.Order;
/**
* 整合 TLog 框架配置
*
* @author Lion Li
* @since 3.3.0
*/
@Order(-999)
@Configuration
@Import(TLogProperty.class)
public class TLogConfig {
@Bean
public TLogPropertyInit tLogPropertyInit(TLogProperty tLogProperty) {
TLogPropertyInit tLogPropertyInit = new TLogPropertyInit();
tLogPropertyInit.setPattern(tLogProperty.getPattern());
tLogPropertyInit.setEnableInvokeTimePrint(tLogProperty.enableInvokeTimePrint());
tLogPropertyInit.setIdGenerator(tLogProperty.getIdGenerator());
tLogPropertyInit.setMdcEnable(tLogProperty.getMdcEnable());
return tLogPropertyInit;
}
@Bean
public TLogSpringAware tLogSpringAware(){
return new TLogSpringAware();
}
@Bean
public AspectLogAop aspectLogAop() {
return new AspectLogAop();
}
@Bean
public TLogFeignFilter tLogFeignFilter() {
return new TLogFeignFilter();
}
}

View File

@ -0,0 +1,89 @@
package com.ruoyi.framework.handler;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpStatus;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import java.util.Date;
/**
* MP注入处理器
*
* @author Lion Li
* @date 2021/4/25
*/
@Slf4j
public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
try {
if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) {
BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject();
Date current = new Date();
// 创建时间为空 则填充
if (ObjectUtil.isNull(baseEntity.getCreateTime())) {
baseEntity.setCreateTime(current);
}
// 更新时间为空 则填充
if (ObjectUtil.isNull(baseEntity.getUpdateTime())) {
baseEntity.setUpdateTime(current);
}
String username = getLoginUsername();
// 当前已登录 且 创建人为空 则填充
if (StringUtils.isNotBlank(username)
&& StringUtils.isBlank(baseEntity.getCreateBy())) {
baseEntity.setCreateBy(username);
}
// 当前已登录 且 更新人为空 则填充
if (StringUtils.isNotBlank(username)
&& StringUtils.isBlank(baseEntity.getUpdateBy())) {
baseEntity.setUpdateBy(username);
}
}
} catch (Exception e) {
throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
}
}
@Override
public void updateFill(MetaObject metaObject) {
try {
if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) {
BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject();
Date current = new Date();
// 更新时间填充(不管为不为空)
baseEntity.setUpdateTime(current);
String username = getLoginUsername();
// 当前已登录 更新人填充(不管为不为空)
if (StringUtils.isNotBlank(username)) {
baseEntity.setUpdateBy(username);
}
}
} catch (Exception e) {
throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
}
}
/**
* 获取登录用户名
*/
private String getLoginUsername() {
LoginUser loginUser;
try {
loginUser = SecurityUtils.getLoginUser();
} catch (Exception e) {
log.warn("自动注入警告 => 用户未登录");
return null;
}
return loginUser.getUsername();
}
}

View File

@ -1,66 +0,0 @@
package com.ruoyi.framework.mybatisplus;
import cn.hutool.http.HttpStatus;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import java.util.Date;
/**
* MP注入处理器
*
* @author Lion Li
* @date 2021/4/25
*/
@Slf4j
public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
try {
//根据属性名字设置要填充的值
if (metaObject.hasGetter("createTime")) {
this.setFieldValByName("createTime", new Date(), metaObject);
}
if (metaObject.hasGetter("createBy")) {
this.setFieldValByName("createBy", getLoginUsername(), metaObject);
}
} catch (Exception e) {
throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
}
updateFill(metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
try {
if (metaObject.hasGetter("updateBy")) {
this.setFieldValByName("updateBy", getLoginUsername(), metaObject);
}
if (metaObject.hasGetter("updateTime")) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
} catch (Exception e) {
throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
}
}
/**
* 获取登录用户名
*/
private String getLoginUsername() {
LoginUser loginUser;
try {
loginUser = SecurityUtils.getLoginUser();
} catch (Exception e) {
log.warn("自动注入警告 => 用户未登录");
return null;
}
return loginUser.getUsername();
}
}

View File

@ -23,15 +23,14 @@ import java.io.IOException;
* @author ruoyi
*/
@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
{
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
@Autowired
private TokenService tokenService;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException
{
throws ServletException, IOException {
LoginUser loginUser = tokenService.getLoginUser(request);
if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) {
tokenService.verifyToken(loginUser);

View File

@ -1,10 +1,10 @@
package com.ruoyi.framework.security.handle;
import com.ruoyi.common.utils.StringUtils;
import cn.hutool.http.HttpStatus;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.JsonUtils;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;
@ -20,14 +20,12 @@ import java.io.Serializable;
* @author ruoyi
*/
@Component
public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable
{
public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable {
private static final long serialVersionUID = -8970718410437077606L;
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e)
throws IOException
{
throws IOException {
int code = HttpStatus.HTTP_UNAUTHORIZED;
String msg = StringUtils.format("请求访问:{},认证失败,无法访问系统资源", request.getRequestURI());
ServletUtils.renderString(response, JsonUtils.toJsonString(AjaxResult.error(code, msg)));

View File

@ -5,8 +5,7 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.DemoModeException;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.validation.BindException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
@ -20,19 +19,17 @@ import javax.validation.ConstraintViolationException;
/**
* 全局异常处理器
*
* @author ruoyi
* @author Lion Li
*/
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler
{
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
public class GlobalExceptionHandler {
/**
* 权限校验异常
*/
@ExceptionHandler(AccessDeniedException.class)
public AjaxResult handleAccessDeniedException(AccessDeniedException e, HttpServletRequest request)
{
public AjaxResult<Void> handleAccessDeniedException(AccessDeniedException e, HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}',权限校验失败'{}'", requestURI, e.getMessage());
return AjaxResult.error(HttpStatus.HTTP_FORBIDDEN, "没有权限,请联系管理员授权");
@ -42,9 +39,8 @@ public class GlobalExceptionHandler
* 请求方式不支持
*/
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e,
HttpServletRequest request)
{
public AjaxResult<Void> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e,
HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod());
return AjaxResult.error(e.getMessage());
@ -54,8 +50,7 @@ public class GlobalExceptionHandler
* 业务异常
*/
@ExceptionHandler(ServiceException.class)
public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request)
{
public AjaxResult<Void> 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());
@ -65,8 +60,7 @@ public class GlobalExceptionHandler
* 拦截未知的运行时异常
*/
@ExceptionHandler(RuntimeException.class)
public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request)
{
public AjaxResult<Void> handleRuntimeException(RuntimeException e, HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}',发生未知异常.", requestURI, e);
return AjaxResult.error(e.getMessage());
@ -76,8 +70,7 @@ public class GlobalExceptionHandler
* 系统异常
*/
@ExceptionHandler(Exception.class)
public AjaxResult handleException(Exception e, HttpServletRequest request)
{
public AjaxResult<Void> handleException(Exception e, HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}',发生系统异常.", requestURI, e);
return AjaxResult.error(e.getMessage());
@ -87,8 +80,7 @@ public class GlobalExceptionHandler
* 自定义验证异常
*/
@ExceptionHandler(BindException.class)
public AjaxResult handleBindException(BindException e)
{
public AjaxResult<Void> handleBindException(BindException e) {
log.error(e.getMessage(), e);
String message = e.getAllErrors().get(0).getDefaultMessage();
return AjaxResult.error(message);
@ -98,7 +90,7 @@ public class GlobalExceptionHandler
* 自定义验证异常
*/
@ExceptionHandler(ConstraintViolationException.class)
public AjaxResult constraintViolationException(ConstraintViolationException e) {
public AjaxResult<Void> constraintViolationException(ConstraintViolationException e) {
log.error(e.getMessage(), e);
String message = e.getConstraintViolations().iterator().next().getMessage();
return AjaxResult.error(message);
@ -108,8 +100,7 @@ public class GlobalExceptionHandler
* 自定义验证异常
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e)
{
public AjaxResult<Void> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
log.error(e.getMessage(), e);
String message = e.getBindingResult().getFieldError().getDefaultMessage();
return AjaxResult.error(message);
@ -119,8 +110,7 @@ public class GlobalExceptionHandler
* 演示模式异常
*/
@ExceptionHandler(DemoModeException.class)
public AjaxResult handleDemoModeException(DemoModeException e)
{
public AjaxResult<Void> handleDemoModeException(DemoModeException e) {
return AjaxResult.error("演示模式,不允许操作");
}
}

View File

@ -7,67 +7,67 @@ import org.springframework.stereotype.Component;
/**
* 读取代码生成相关配置
*
*
* @author ruoyi
*/
@Component
@ConfigurationProperties(prefix = "gen")
@PropertySource(value = { "classpath:generator.yml" })
public class GenConfig
{
/** 作者 */
@PropertySource(value = {"classpath:generator.yml"})
public class GenConfig {
/**
* 作者
*/
public static String author;
/** 生成包路径 */
/**
* 生成包路径
*/
public static String packageName;
/** 自动去除表前缀默认是false */
/**
* 自动去除表前缀默认是false
*/
public static boolean autoRemovePre;
/** 表前缀(类名不会包含表前缀) */
/**
* 表前缀(类名不会包含表前缀)
*/
public static String tablePrefix;
public static String getAuthor()
{
public static String getAuthor() {
return author;
}
@Value("${author}")
public void setAuthor(String author)
{
public void setAuthor(String author) {
GenConfig.author = author;
}
public static String getPackageName()
{
public static String getPackageName() {
return packageName;
}
@Value("${packageName}")
public void setPackageName(String packageName)
{
public void setPackageName(String packageName) {
GenConfig.packageName = packageName;
}
public static boolean getAutoRemovePre()
{
public static boolean getAutoRemovePre() {
return autoRemovePre;
}
@Value("${autoRemovePre}")
public void setAutoRemovePre(boolean autoRemovePre)
{
public void setAutoRemovePre(boolean autoRemovePre) {
GenConfig.autoRemovePre = autoRemovePre;
}
public static String getTablePrefix()
{
public static String getTablePrefix() {
return tablePrefix;
}
@Value("${tablePrefix}")
public void setTablePrefix(String tablePrefix)
{
public void setTablePrefix(String tablePrefix) {
GenConfig.tablePrefix = tablePrefix;
}
}

View File

@ -10,6 +10,9 @@ import com.ruoyi.generator.domain.GenTable;
import com.ruoyi.generator.domain.GenTableColumn;
import com.ruoyi.generator.service.IGenTableColumnService;
import com.ruoyi.generator.service.IGenTableService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
@ -24,36 +27,36 @@ import java.util.Map;
/**
* 代码生成 操作处理
*
* @author ruoyi
*
* @author Lion Li
*/
@Validated
@Api(value = "代码生成", tags = {"代码生成管理"})
@RequiredArgsConstructor(onConstructor_ = @Autowired)
@RestController
@RequestMapping("/tool/gen")
public class GenController extends BaseController
{
@Autowired
private IGenTableService genTableService;
public class GenController extends BaseController {
@Autowired
private IGenTableColumnService genTableColumnService;
private final IGenTableService genTableService;
private final IGenTableColumnService genTableColumnService;
/**
* 查询代码生成列表
*/
@ApiOperation("查询代码生成列表")
@PreAuthorize("@ss.hasPermi('tool:gen:list')")
@GetMapping("/list")
public TableDataInfo genList(GenTable genTable)
{
public TableDataInfo<GenTable> genList(GenTable genTable) {
return genTableService.selectPageGenTableList(genTable);
}
/**
* 修改代码生成业务
*/
@ApiOperation("修改代码生成业务")
@PreAuthorize("@ss.hasPermi('tool:gen:query')")
@GetMapping(value = "/{talbleId}")
public AjaxResult getInfo(@PathVariable Long talbleId)
{
public AjaxResult<Map<String, Object>> getInfo(@PathVariable Long talbleId) {
GenTable table = genTableService.selectGenTableById(talbleId);
List<GenTable> tables = genTableService.selectGenTableAll();
List<GenTableColumn> list = genTableColumnService.selectGenTableColumnListByTableId(talbleId);
@ -67,21 +70,21 @@ public class GenController extends BaseController
/**
* 查询数据库列表
*/
@ApiOperation("查询数据库列表")
@PreAuthorize("@ss.hasPermi('tool:gen:list')")
@GetMapping("/db/list")
public TableDataInfo dataList(GenTable genTable)
{
public TableDataInfo<GenTable> dataList(GenTable genTable) {
return genTableService.selectPageDbTableList(genTable);
}
/**
* 查询数据表字段列表
*/
@ApiOperation("查询数据表字段列表")
@PreAuthorize("@ss.hasPermi('tool:gen:list')")
@GetMapping(value = "/column/{talbleId}")
public TableDataInfo columnList(Long tableId)
{
TableDataInfo dataInfo = new TableDataInfo();
public TableDataInfo<GenTableColumn> columnList(Long tableId) {
TableDataInfo<GenTableColumn> dataInfo = new TableDataInfo<>();
List<GenTableColumn> list = genTableColumnService.selectGenTableColumnListByTableId(tableId);
dataInfo.setRows(list);
dataInfo.setTotal(list.size());
@ -91,11 +94,11 @@ public class GenController extends BaseController
/**
* 导入表结构(保存)
*/
@ApiOperation("导入表结构(保存)")
@PreAuthorize("@ss.hasPermi('tool:gen:import')")
@Log(title = "代码生成", businessType = BusinessType.IMPORT)
@PostMapping("/importTable")
public AjaxResult importTableSave(String tables)
{
public AjaxResult<Void> importTableSave(String tables) {
String[] tableNames = Convert.toStrArray(tables);
// 查询表信息
List<GenTable> tableList = genTableService.selectDbTableListByNames(tableNames);
@ -106,11 +109,11 @@ public class GenController extends BaseController
/**
* 修改保存代码生成业务
*/
@ApiOperation("修改保存代码生成业务")
@PreAuthorize("@ss.hasPermi('tool:gen:edit')")
@Log(title = "代码生成", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult editSave(@Validated @RequestBody GenTable genTable)
{
public AjaxResult<Void> editSave(@Validated @RequestBody GenTable genTable) {
genTableService.validateEdit(genTable);
genTableService.updateGenTable(genTable);
return AjaxResult.success();
@ -119,11 +122,11 @@ public class GenController extends BaseController
/**
* 删除代码生成
*/
@ApiOperation("删除代码生成")
@PreAuthorize("@ss.hasPermi('tool:gen:remove')")
@Log(title = "代码生成", businessType = BusinessType.DELETE)
@DeleteMapping("/{tableIds}")
public AjaxResult remove(@PathVariable Long[] tableIds)
{
public AjaxResult<Void> remove(@PathVariable Long[] tableIds) {
genTableService.deleteGenTableByIds(tableIds);
return AjaxResult.success();
}
@ -131,10 +134,10 @@ public class GenController extends BaseController
/**
* 预览代码
*/
@ApiOperation("预览代码")
@PreAuthorize("@ss.hasPermi('tool:gen:preview')")
@GetMapping("/preview/{tableId}")
public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException
{
public AjaxResult<Map<String, String>> preview(@PathVariable("tableId") Long tableId) throws IOException {
Map<String, String> dataMap = genTableService.previewCode(tableId);
return AjaxResult.success(dataMap);
}
@ -142,11 +145,11 @@ public class GenController extends BaseController
/**
* 生成代码(下载方式)
*/
@ApiOperation("生成代码(下载方式)")
@PreAuthorize("@ss.hasPermi('tool:gen:code')")
@Log(title = "代码生成", businessType = BusinessType.GENCODE)
@GetMapping("/download/{tableName}")
public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException
{
public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException {
byte[] data = genTableService.downloadCode(tableName);
genCode(response, data);
}
@ -154,11 +157,11 @@ public class GenController extends BaseController
/**
* 生成代码(自定义路径)
*/
@ApiOperation("生成代码(自定义路径)")
@PreAuthorize("@ss.hasPermi('tool:gen:code')")
@Log(title = "代码生成", businessType = BusinessType.GENCODE)
@GetMapping("/genCode/{tableName}")
public AjaxResult genCode(@PathVariable("tableName") String tableName)
{
public AjaxResult<Void> genCode(@PathVariable("tableName") String tableName) {
genTableService.generatorCode(tableName);
return AjaxResult.success();
}
@ -166,11 +169,11 @@ public class GenController extends BaseController
/**
* 同步数据库
*/
@ApiOperation("同步数据库")
@PreAuthorize("@ss.hasPermi('tool:gen:edit')")
@Log(title = "代码生成", businessType = BusinessType.UPDATE)
@GetMapping("/synchDb/{tableName}")
public AjaxResult synchDb(@PathVariable("tableName") String tableName)
{
public AjaxResult<Void> synchDb(@PathVariable("tableName") String tableName) {
genTableService.synchDb(tableName);
return AjaxResult.success();
}
@ -178,11 +181,11 @@ public class GenController extends BaseController
/**
* 批量生成代码
*/
@ApiOperation("批量生成代码")
@PreAuthorize("@ss.hasPermi('tool:gen:code')")
@Log(title = "代码生成", businessType = BusinessType.GENCODE)
@GetMapping("/batchGenCode")
public void batchGenCode(HttpServletResponse response, String tables) throws IOException
{
public void batchGenCode(HttpServletResponse response, String tables) throws IOException {
String[] tableNames = Convert.toStrArray(tables);
byte[] data = genTableService.downloadCode(tableNames);
genCode(response, data);
@ -191,8 +194,7 @@ public class GenController extends BaseController
/**
* 生成zip文件
*/
private void genCode(HttpServletResponse response, byte[] data) throws IOException
{
private void genCode(HttpServletResponse response, byte[] data) throws IOException {
response.reset();
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Expose-Headers", "Content-Disposition");

View File

@ -1,38 +1,36 @@
package com.ruoyi.generator.domain;
import com.ruoyi.common.utils.StringUtils;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.constant.GenConstants;
import lombok.*;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.utils.StringUtils;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.apache.commons.lang3.ArrayUtils;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 业务表 gen_table
*
* @author ruoyi
* @author Lion Li
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("gen_table")
public class GenTable implements Serializable {
private static final long serialVersionUID = 1L;
public class GenTable extends BaseEntity {
/**
* 编号
*/
@TableId(value = "table_id", type = IdType.AUTO)
@TableId(value = "table_id")
private Long tableId;
/**
@ -132,43 +130,11 @@ public class GenTable implements Serializable {
*/
private String options;
/**
* 创建者
*/
@TableField(fill = FieldFill.INSERT)
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新者
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 备注
*/
private String remark;
/**
* 请求参数
*/
@TableField(exist = false)
private Map<String, Object> params = new HashMap<>();
/**
* 树编码字段
*/

View File

@ -1,34 +1,33 @@
package com.ruoyi.generator.domain;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.utils.StringUtils;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 代码生成业务字段表 gen_table_column
*
* @author ruoyi
* @author Lion Li
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("gen_table_column")
public class GenTableColumn implements Serializable {
private static final long serialVersionUID = 1L;
public class GenTableColumn extends BaseEntity {
/**
* 编号
*/
@TableId(value = "column_id", type = IdType.AUTO)
@TableId(value = "column_id")
private Long columnId;
/**
@ -125,38 +124,6 @@ public class GenTableColumn implements Serializable {
*/
private Integer sort;
/**
* 创建者
*/
@TableField(fill = FieldFill.INSERT)
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新者
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 请求参数
*/
@TableField(exist = false)
private Map<String, Object> params = new HashMap<>();
public String getCapJavaField() {
return StringUtils.uncapitalize(javaField);
}
@ -224,9 +191,9 @@ public class GenTableColumn implements Serializable {
public static boolean isSuperColumn(String javaField) {
return StringUtils.equalsAnyIgnoreCase(javaField,
// BaseEntity
"createBy", "createTime", "updateBy", "updateTime", "remark",
"createBy", "createTime", "updateBy", "updateTime",
// TreeEntity
"parentName", "parentId", "orderNum", "ancestors");
"parentName", "parentId");
}
public boolean isUsableColumn() {

View File

@ -8,7 +8,7 @@ import java.util.List;
/**
* 业务字段 数据层
*
* @author ruoyi
* @author Lion Li
*/
public interface GenTableColumnMapper extends BaseMapperPlus<GenTableColumn> {
/**
@ -17,6 +17,6 @@ public interface GenTableColumnMapper extends BaseMapperPlus<GenTableColumn> {
* @param tableName 表名称
* @return 列信息
*/
public List<GenTableColumn> selectDbTableColumnsByName(String tableName);
List<GenTableColumn> selectDbTableColumnsByName(String tableName);
}

View File

@ -10,7 +10,7 @@ import java.util.List;
/**
* 业务 数据层
*
* @author ruoyi
* @author Lion Li
*/
public interface GenTableMapper extends BaseMapperPlus<GenTable> {
@ -25,7 +25,7 @@ public interface GenTableMapper extends BaseMapperPlus<GenTable> {
* @param genTable 业务信息
* @return 业务集合
*/
public List<GenTable> selectGenTableList(GenTable genTable);
List<GenTable> selectGenTableList(GenTable genTable);
/**
* 查询据库列表
@ -33,7 +33,7 @@ public interface GenTableMapper extends BaseMapperPlus<GenTable> {
* @param genTable 业务信息
* @return 数据库表集合
*/
public List<GenTable> selectDbTableList(GenTable genTable);
List<GenTable> selectDbTableList(GenTable genTable);
/**
* 查询据库列表
@ -41,14 +41,14 @@ public interface GenTableMapper extends BaseMapperPlus<GenTable> {
* @param tableNames 表名称组
* @return 数据库表集合
*/
public List<GenTable> selectDbTableListByNames(String[] tableNames);
List<GenTable> selectDbTableListByNames(String[] tableNames);
/**
* 查询所有表信息
*
* @return 表信息集合
*/
public List<GenTable> selectGenTableAll();
List<GenTable> selectGenTableAll();
/**
* 查询表ID业务信息
@ -56,7 +56,7 @@ public interface GenTableMapper extends BaseMapperPlus<GenTable> {
* @param id 业务ID
* @return 业务信息
*/
public GenTable selectGenTableById(Long id);
GenTable selectGenTableById(Long id);
/**
* 查询表名称业务信息
@ -64,6 +64,6 @@ public interface GenTableMapper extends BaseMapperPlus<GenTable> {
* @param tableName 表名称
* @return 业务信息
*/
public GenTable selectGenTableByName(String tableName);
GenTable selectGenTableByName(String tableName);
}

View File

@ -12,7 +12,7 @@ import java.util.List;
/**
* 业务字段 服务层实现
*
* @author ruoyi
* @author Lion Li
*/
@Service
public class GenTableColumnServiceImpl extends ServicePlusImpl<GenTableColumnMapper, GenTableColumn, GenTableColumn> implements IGenTableColumnService {
@ -26,7 +26,7 @@ public class GenTableColumnServiceImpl extends ServicePlusImpl<GenTableColumnMap
@Override
public List<GenTableColumn> selectGenTableColumnListByTableId(Long tableId) {
return list(new LambdaQueryWrapper<GenTableColumn>()
.eq(GenTableColumn::getTableId,tableId)
.eq(GenTableColumn::getTableId, tableId)
.orderByAsc(GenTableColumn::getSort));
}

View File

@ -41,7 +41,7 @@ import java.util.zip.ZipOutputStream;
/**
* 业务 服务层实现
*
* @author ruoyi
* @author Lion Li
*/
@Slf4j
@Service
@ -163,18 +163,18 @@ public class GenTableServiceImpl extends ServicePlusImpl<GenTableMapper, GenTabl
String tableName = table.getTableName();
GenUtils.initTable(table, operName);
int row = baseMapper.insert(table);
if (row > 0) {
// 保存列信息
List<GenTableColumn> genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName);
List<GenTableColumn> saveColumns = new ArrayList<>();
for (GenTableColumn column : genTableColumns) {
GenUtils.initColumnField(column, table);
saveColumns.add(column);
}
if (CollUtil.isNotEmpty(saveColumns)) {
genTableColumnMapper.insertAll(saveColumns);
}
}
if (row > 0) {
// 保存列信息
List<GenTableColumn> genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName);
List<GenTableColumn> saveColumns = new ArrayList<>();
for (GenTableColumn column : genTableColumns) {
GenUtils.initColumnField(column, table);
saveColumns.add(column);
}
if (CollUtil.isNotEmpty(saveColumns)) {
genTableColumnMapper.insertAll(saveColumns);
}
}
}
} catch (Exception e) {
throw new ServiceException("导入失败:" + e.getMessage());
@ -253,12 +253,12 @@ public class GenTableServiceImpl extends ServicePlusImpl<GenTableMapper, GenTabl
StringWriter sw = new StringWriter();
Template tpl = Velocity.getTemplate(template, Constants.UTF8);
tpl.merge(context, sw);
try {
String path = getGenPath(table, template);
FileUtils.writeUtf8String(sw.toString(), path);
} catch (Exception e) {
throw new ServiceException("渲染模板失败,表名:" + table.getTableName());
}
try {
String path = getGenPath(table, template);
FileUtils.writeUtf8String(sw.toString(), path);
} catch (Exception e) {
throw new ServiceException("渲染模板失败,表名:" + table.getTableName());
}
}
}
}
@ -281,16 +281,16 @@ public class GenTableServiceImpl extends ServicePlusImpl<GenTableMapper, GenTabl
}
List<String> dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList());
List<GenTableColumn> saveColumns = new ArrayList<>();
dbTableColumns.forEach(column -> {
if (!tableColumnNames.contains(column.getColumnName())) {
GenUtils.initColumnField(column, table);
saveColumns.add(column);
}
});
if (CollUtil.isNotEmpty(saveColumns)) {
genTableColumnMapper.insertAll(saveColumns);
}
List<GenTableColumn> saveColumns = new ArrayList<>();
dbTableColumns.forEach(column -> {
if (!tableColumnNames.contains(column.getColumnName())) {
GenUtils.initColumnField(column, table);
saveColumns.add(column);
}
});
if (CollUtil.isNotEmpty(saveColumns)) {
genTableColumnMapper.insertAll(saveColumns);
}
List<GenTableColumn> delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList());
if (CollUtil.isNotEmpty(delColumns)) {
@ -359,7 +359,7 @@ public class GenTableServiceImpl extends ServicePlusImpl<GenTableMapper, GenTabl
@Override
public void validateEdit(GenTable genTable) {
if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) {
Map<String, Object> paramsObj = genTable.getParams();
Map<String, Object> paramsObj = genTable.getParams();
if (StringUtils.isEmpty(paramsObj.get(GenConstants.TREE_CODE))) {
throw new ServiceException("树编码字段不能为空");
} else if (StringUtils.isEmpty(paramsObj.get(GenConstants.TREE_PARENT_CODE))) {
@ -422,7 +422,7 @@ public class GenTableServiceImpl extends ServicePlusImpl<GenTableMapper, GenTabl
* @param genTable 设置后的生成对象
*/
public void setTableFromOptions(GenTable genTable) {
Map<String, Object> paramsObj = JsonUtils.parseMap(genTable.getOptions());
Map<String, Object> paramsObj = JsonUtils.parseMap(genTable.getOptions());
if (StringUtils.isNotNull(paramsObj)) {
String treeCode = Convert.toStr(paramsObj.get(GenConstants.TREE_CODE));
String treeParentCode = Convert.toStr(paramsObj.get(GenConstants.TREE_PARENT_CODE));
@ -441,7 +441,7 @@ public class GenTableServiceImpl extends ServicePlusImpl<GenTableMapper, GenTabl
/**
* 获取代码生成地址
*
* @param table 业务表信息
* @param table 业务表信息
* @param template 模板文件路径
* @return 生成地址
*/

View File

@ -8,7 +8,7 @@ import java.util.List;
/**
* 业务字段 服务层
*
* @author ruoyi
* @author Lion Li
*/
public interface IGenTableColumnService extends IService<GenTableColumn> {
/**
@ -17,7 +17,7 @@ public interface IGenTableColumnService extends IService<GenTableColumn> {
* @param tableId 业务字段编号
* @return 业务字段集合
*/
public List<GenTableColumn> selectGenTableColumnListByTableId(Long tableId);
List<GenTableColumn> selectGenTableColumnListByTableId(Long tableId);
/**
* 新增业务字段
@ -25,7 +25,7 @@ public interface IGenTableColumnService extends IService<GenTableColumn> {
* @param genTableColumn 业务字段信息
* @return 结果
*/
public int insertGenTableColumn(GenTableColumn genTableColumn);
int insertGenTableColumn(GenTableColumn genTableColumn);
/**
* 修改业务字段
@ -33,7 +33,7 @@ public interface IGenTableColumnService extends IService<GenTableColumn> {
* @param genTableColumn 业务字段信息
* @return 结果
*/
public int updateGenTableColumn(GenTableColumn genTableColumn);
int updateGenTableColumn(GenTableColumn genTableColumn);
/**
* 删除业务字段信息
@ -41,5 +41,5 @@ public interface IGenTableColumnService extends IService<GenTableColumn> {
* @param ids 需要删除的数据ID
* @return 结果
*/
public int deleteGenTableColumnByIds(String ids);
int deleteGenTableColumnByIds(String ids);
}

View File

@ -10,7 +10,7 @@ import java.util.Map;
/**
* 业务 服务层
*
* @author ruoyi
* @author Lion Li
*/
public interface IGenTableService extends IService<GenTable> {
@ -26,7 +26,7 @@ public interface IGenTableService extends IService<GenTable> {
* @param genTable 业务信息
* @return 业务集合
*/
public List<GenTable> selectGenTableList(GenTable genTable);
List<GenTable> selectGenTableList(GenTable genTable);
/**
* 查询据库列表
@ -34,7 +34,7 @@ public interface IGenTableService extends IService<GenTable> {
* @param genTable 业务信息
* @return 数据库表集合
*/
public List<GenTable> selectDbTableList(GenTable genTable);
List<GenTable> selectDbTableList(GenTable genTable);
/**
* 查询据库列表
@ -42,14 +42,14 @@ public interface IGenTableService extends IService<GenTable> {
* @param tableNames 表名称组
* @return 数据库表集合
*/
public List<GenTable> selectDbTableListByNames(String[] tableNames);
List<GenTable> selectDbTableListByNames(String[] tableNames);
/**
* 查询所有表信息
*
* @return 表信息集合
*/
public List<GenTable> selectGenTableAll();
List<GenTable> selectGenTableAll();
/**
* 查询业务信息
@ -57,7 +57,7 @@ public interface IGenTableService extends IService<GenTable> {
* @param id 业务ID
* @return 业务信息
*/
public GenTable selectGenTableById(Long id);
GenTable selectGenTableById(Long id);
/**
* 修改业务
@ -65,7 +65,7 @@ public interface IGenTableService extends IService<GenTable> {
* @param genTable 业务信息
* @return 结果
*/
public void updateGenTable(GenTable genTable);
void updateGenTable(GenTable genTable);
/**
* 删除业务信息
@ -73,14 +73,14 @@ public interface IGenTableService extends IService<GenTable> {
* @param tableIds 需要删除的表数据ID
* @return 结果
*/
public void deleteGenTableByIds(Long[] tableIds);
void deleteGenTableByIds(Long[] tableIds);
/**
* 导入表结构
*
* @param tableList 导入表列表
*/
public void importGenTable(List<GenTable> tableList);
void importGenTable(List<GenTable> tableList);
/**
* 预览代码
@ -88,7 +88,7 @@ public interface IGenTableService extends IService<GenTable> {
* @param tableId 表编号
* @return 预览数据列表
*/
public Map<String, String> previewCode(Long tableId);
Map<String, String> previewCode(Long tableId);
/**
* 生成代码(下载方式)
@ -96,7 +96,7 @@ public interface IGenTableService extends IService<GenTable> {
* @param tableName 表名称
* @return 数据
*/
public byte[] downloadCode(String tableName);
byte[] downloadCode(String tableName);
/**
* 生成代码(自定义路径)
@ -104,14 +104,14 @@ public interface IGenTableService extends IService<GenTable> {
* @param tableName 表名称
* @return 数据
*/
public void generatorCode(String tableName);
void generatorCode(String tableName);
/**
* 同步数据库
*
* @param tableName 表名称
*/
public void synchDb(String tableName);
void synchDb(String tableName);
/**
* 批量生成代码(下载方式)
@ -119,12 +119,12 @@ public interface IGenTableService extends IService<GenTable> {
* @param tableNames 表数组
* @return 数据
*/
public byte[] downloadCode(String[] tableNames);
byte[] downloadCode(String[] tableNames);
/**
* 修改保存参数校验
*
* @param genTable 业务信息
*/
public void validateEdit(GenTable genTable);
void validateEdit(GenTable genTable);
}

Some files were not shown because too many files have changed in this diff Show More