feat: 新增heritage-model数据模型模块

- 新增枚举类:菜单状态、菜单类型、操作类型等
- 新增BO类:业务对象,包含表单元素和系统业务对象
- 新增VO类:视图对象,用于接口返回数据
- 新增POJO实体类:对应数据库表结构
- 新增数据验证注解:手机号、URL等自定义验证器
This commit is contained in:
Leo 2025-10-08 02:05:51 +08:00
parent 533838cb59
commit 287add8e36
55 changed files with 3662 additions and 0 deletions

51
heritage-model/pom.xml Normal file
View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.leocoder.heritage</groupId>
<artifactId>heritage-backend</artifactId>
<version>${revision}</version>
</parent>
<name>heritage-model</name>
<artifactId>heritage-model</artifactId>
<description>实体类模块</description>
<dependencies>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- 实体中会用mp的注解 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
</dependency>
<!-- 自定义验证注解 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- 数据脱敏 -->
<dependency>
<groupId>org.leocoder.heritage</groupId>
<artifactId>heritage-desensitize</artifactId>
<version>${revision}</version>
</dependency>
<!-- 参数校验 -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<!-- EasyExcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,68 @@
package org.leocoder.heritage.domain.enums.menu;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author Leocoder
* @description [菜单状态枚举]
*/
@Getter
@AllArgsConstructor
public enum MenuStatusEnum {
/**
* 启用
*/
ENABLED("0", "启用"),
/**
* 停用
*/
DISABLED("1", "停用");
/**
* 状态值
*/
private final String value;
/**
* 状态描述
*/
private final String description;
/**
* 根据值获取枚举
*
* @param value 状态值
* @return 对应的枚举
*/
public static MenuStatusEnum getByValue(String value) {
for (MenuStatusEnum status : values()) {
if (status.getValue().equals(value)) {
return status;
}
}
return null;
}
/**
* 判断是否是启用状态
*
* @param value 状态值
* @return 是否是启用状态
*/
public static boolean isEnabled(String value) {
return ENABLED.getValue().equals(value);
}
/**
* 判断是否是停用状态
*
* @param value 状态值
* @return 是否是停用状态
*/
public static boolean isDisabled(String value) {
return DISABLED.getValue().equals(value);
}
}

View File

@ -0,0 +1,83 @@
package org.leocoder.heritage.domain.enums.menu;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author Leocoder
* @description [菜单类型枚举]
*/
@Getter
@AllArgsConstructor
public enum MenuTypeEnum {
/**
* 目录
*/
DIRECTORY("1", "目录"),
/**
* 菜单
*/
MENU("2", "菜单"),
/**
* 按钮
*/
BUTTON("3", "按钮");
/**
* 类型值
*/
private final String value;
/**
* 类型描述
*/
private final String description;
/**
* 根据值获取枚举
*
* @param value 类型值
* @return 对应的枚举
*/
public static MenuTypeEnum getByValue(String value) {
for (MenuTypeEnum type : values()) {
if (type.getValue().equals(value)) {
return type;
}
}
return null;
}
/**
* 判断是否是按钮类型
*
* @param value 类型值
* @return 是否是按钮类型
*/
public static boolean isButton(String value) {
return BUTTON.getValue().equals(value);
}
/**
* 判断是否是目录类型
*
* @param value 类型值
* @return 是否是目录类型
*/
public static boolean isDirectory(String value) {
return DIRECTORY.getValue().equals(value);
}
/**
* 判断是否是菜单类型
*
* @param value 类型值
* @return 是否是菜单类型
*/
public static boolean isMenu(String value) {
return MENU.getValue().equals(value);
}
}

View File

@ -0,0 +1,59 @@
package org.leocoder.heritage.domain.enums.oper;
/**
* @author Leocoder
* @description [操作类型枚举]
*/
public enum OperType {
/**
* 新增
*/
INSERT("INSERT", "新增"),
/**
* 修改
*/
UPDATE("UPDATE", "修改"),
/**
* 删除
*/
DELETE("DELETE", "删除"),
/**
* 查询
*/
SELECT("SELECT", "查询"),
/**
* 导入
*/
IMPORT("IMPORT", "导入"),
/**
* 导出
*/
EXPORT("EXPORT", "导出"),
/**
* 其它
*/
OTHER("OTHER", "其它");
private final String code;
private final String desc;
OperType(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
public String getDesc() {
return desc;
}
}

View File

@ -0,0 +1,39 @@
package org.leocoder.heritage.domain.enums.oper;
/**
* @author Leocoder
* @description [系统类型枚举]
*/
public enum SystemType {
/**
* 后台用户
*/
MANAGER("MANAGER", "后台用户"),
/**
* 手机端用户
*/
PHONE("PHONE", "手机端用户"),
/**
* 其它
*/
OTHER("OTHER", "其它");
private final String code;
private final String desc;
SystemType(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
public String getDesc() {
return desc;
}
}

View File

@ -0,0 +1,31 @@
package org.leocoder.heritage.domain.model.bo.element;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Leocoder
* @description [CascaderBo-ElementPlus级联选择框]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CascaderLongBo {
/**
* 选择项
*/
private String label;
/**
* 选择值
*/
private Long value;
/**
* 父节点
*/
private String parentId;
}

View File

@ -0,0 +1,31 @@
package org.leocoder.heritage.domain.model.bo.element;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Leocoder
* @description [CascaderBo-ElementPlus级联选择框]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CascaderStringBo {
/**
* 选择项
*/
private String label;
/**
* 选择值
*/
private String value;
/**
* 父节点
*/
private String parentId;
}

View File

@ -0,0 +1,26 @@
package org.leocoder.heritage.domain.model.bo.element;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Leocoder
* @description [Element下拉框模型]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SelectLongBo {
/**
* 选择项
*/
private String label;
/**
* 选择值
*/
private Long value;
}

View File

@ -0,0 +1,26 @@
package org.leocoder.heritage.domain.model.bo.element;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Leocoder
* @description [Element下拉框模型]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SelectStringBo {
/**
* 选择项
*/
private String label;
/**
* 选择值
*/
private String value;
}

View File

@ -0,0 +1,26 @@
package org.leocoder.heritage.domain.model.bo.element;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Leocoder
* @description [transferBo穿梭框模型]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TransferLongBo {
/**
* 选择项
*/
private String label;
/**
* 选择值
*/
private Long value;
}

View File

@ -0,0 +1,26 @@
package org.leocoder.heritage.domain.model.bo.element;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Leocoder
* @description [transferBo穿梭框模型]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TransferStringBo {
/**
* 选择项
*/
private String label;
/**
* 选择值
*/
private String value;
}

View File

@ -0,0 +1,73 @@
package org.leocoder.heritage.domain.model.bo.system;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
/**
* @author Leocoder
* @description [定时任务业务对象]
*/
@Data
public class SysJobBo implements Serializable {
/**
* 任务ID
*/
private Long jobId;
/**
* 任务名称
*/
@NotBlank(message = "任务名称不能为空")
private String jobName;
/**
* 任务类型[1-管理平台 2-小程序 3-App]
*/
@NotBlank(message = "任务类型不能为空")
private String jobType;
/**
* 类路径
*/
@NotBlank(message = "类路径不能为空")
private String classPath;
/**
* 方法名称
*/
@NotBlank(message = "方法名称不能为空")
private String methodName;
/**
* cron执行表达式
*/
@NotBlank(message = "cron执行表达式不能为空")
private String cronExpression;
/**
* cron计划策略[1-立即执行 2-执行一次 3-放弃执行]
*/
@NotBlank(message = "cron计划策略不能为空")
private String policyStatus;
/**
* 任务状态 [0正常 1暂停]
*/
@NotBlank(message = "任务状态不能为空")
private String jobStatus;
/**
* 任务参数
*/
private String jobParams;
/**
* 任务备注
*/
private String remark;
}

View File

@ -0,0 +1,22 @@
package org.leocoder.heritage.domain.model.bo.system;
import lombok.Data;
/**
* @author Leocoder
* @description [登录-模型][Bo类]
*/
@Data
public class SysLoginBo {
/**
* token名称
*/
private String tokenName;
/**
* token值
*/
private String tokenValue;
}

View File

@ -0,0 +1,98 @@
package org.leocoder.heritage.domain.model.bo.system;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author Leocoder
* @description [菜单权限表-模型][Bo类]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SysMenuBo implements Serializable {
/**
* 菜单ID
*/
private Long menuId;
/**
* 菜单名称
*/
private String menuName;
/**
* 英文菜单
*/
private String enName;
/**
* 父菜单ID
*/
private Long parentId;
/**
* 菜单类型[1-目录 2-菜单 3-按钮]
*/
private String menuType;
/**
* 路由name
*/
private String name;
/**
* 路由地址
*/
private String path;
/**
* 请求地址
*/
private String component;
/**
* 菜单图标
*/
private String icon;
/**
* 菜单是否隐藏[0-隐藏 1-显示]
*/
private String isHide;
/**
* 是否外链[空值不跳转有值则跳转链接]
*/
private String isLink;
/**
* 是否缓存[0- 1-]
*/
private String isKeepAlive;
/**
* 是否全屏[0- 1-][例如数据大屏]
*/
private String isFull;
/**
* 是否固定项[0- 1-][例如首页]
*/
private String isAffix;
/**
* 重定向页面[子节点第一级path]
*/
private String redirect;
/**
* 选中路由
*/
private String activeMenu;
}

View File

@ -0,0 +1,45 @@
package org.leocoder.heritage.domain.model.bo.system;
import lombok.Data;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author Leocoder
* @description [角色菜单权限分配-模型][Bo类]
*/
@Data
public class SysRoleMenuBo {
/**
* 角色ID字符串格式避免前端精度丢失
*/
private String roleId;
/**
* 菜单ID列表字符串格式避免前端精度丢失
*/
private List<String> menuIds;
/**
* 获取Long类型的角色ID
*/
public Long getRoleIdAsLong() {
return roleId != null ? Long.valueOf(roleId) : null;
}
/**
* 获取Long类型的菜单ID列表
*/
public List<Long> getMenuIdsAsLong() {
if (menuIds == null) {
return null;
}
return menuIds.stream()
.filter(id -> id != null && !id.isEmpty())
.map(Long::valueOf)
.collect(Collectors.toList());
}
}

View File

@ -0,0 +1,35 @@
package org.leocoder.heritage.domain.model.vo.base;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
/**
* @author Leocoder
* @description [BaseVo公共参数]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BaseVo implements java.io.Serializable {
/**
* 当前第几页
*/
private Integer pageNo = 1;
/**
* 每页显示多少条
*/
private Integer pageSize = 10;
/**
* 请求参数
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private Map<String, Object> params;
}

View File

@ -0,0 +1,116 @@
package org.leocoder.heritage.domain.model.vo.gen;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.leocoder.heritage.domain.model.vo.base.BaseVo;
import java.util.Date;
/**
* @author Leocoder
* @description [代码生成字段表-模型][Vo类]
*/
@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GenColumnVo extends BaseVo {
/**
* 主键ID
*/
private Long columnId;
/**
* 归属表编号
*/
private Long tableId;
/**
* 列名称
*/
private String columnName;
/**
* 列描述
*/
private String columnComment;
/**
* 列类型
*/
private String columnType;
/**
* JAVA类型
*/
private String javaType;
/**
* JAVA字段名
*/
private String javaField;
/**
* 是否主键[0-1-]
*/
private String isPk;
/**
* 是否列表展示字段[0-1-]
*/
private String isList;
/**
* 是否搜索展示字段[0-1-]
*/
private String isSearch;
/**
* 条件搜索类型[EQLIKE等]
*/
private String searchType;
/**
* 是否表单展示字段[0-1-]
*/
private String isForm;
/**
* 是否添加规则校验[0-1-]
*/
private String isRule;
/**
* 显示类型[文本框-input下拉框-select复选框-checkbox单选框-radio日期控件-datatime文本域-textarea]
*/
private String elementType;
/**
* 字典类型
*/
private String dictType;
/**
* 创建者
*/
private String createBy;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新者
*/
private String updateBy;
/**
* 更新时间
*/
private Date updateTime;
}

View File

@ -0,0 +1,30 @@
package org.leocoder.heritage.domain.model.vo.gen;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.leocoder.heritage.domain.model.vo.base.BaseVo;
/**
* @author Leocoder
* @description [代码生成业务表-模型][Vo类]
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class GenTableVo extends BaseVo {
/**
* 表名称
*/
private String tableName;
/**
* 表类名
*/
private String className;
/**
* 表描述
*/
private String tableComment;
}

View File

@ -0,0 +1,221 @@
package org.leocoder.heritage.domain.model.vo.system;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 仪表盘统计数据响应对象
*
* @author Leocoder
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class DashboardStatisticsVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 用户统计数据
*/
@JsonProperty("userStats")
private UserStatsVo userStats;
/**
* 登录统计数据
*/
@JsonProperty("loginStats")
private LoginStatsVo loginStats;
/**
* 存储统计数据
*/
@JsonProperty("storageStats")
private StorageStatsVo storageStats;
/**
* 今日活跃统计数据
*/
@JsonProperty("dailyActivityStats")
private DailyActivityStatsVo dailyActivityStats;
/**
* 用户统计数据
*/
@Data
public static class UserStatsVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 总用户数
*/
@JsonProperty("totalUsers")
private Integer totalUsers;
/**
* 今日新增用户数
*/
@JsonProperty("todayNewUsers")
private Integer todayNewUsers;
/**
* 活跃用户数
*/
@JsonProperty("activeUsers")
private Integer activeUsers;
/**
* 当前在线用户数
*/
@JsonProperty("onlineUsers")
private Integer onlineUsers;
}
/**
* 登录统计数据
*/
@Data
public static class LoginStatsVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 今日登录次数
*/
@JsonProperty("todayLogins")
private Integer todayLogins;
/**
* 累计登录次数
*/
@JsonProperty("totalLogins")
private Integer totalLogins;
/**
* 登录趋势数据
*/
@JsonProperty("loginTrend")
private List<LoginTrendItemVo> loginTrend;
}
/**
* 存储统计数据
*/
@Data
public static class StorageStatsVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 总文件数
*/
@JsonProperty("totalFiles")
private Integer totalFiles;
/**
* 总图片数
*/
@JsonProperty("totalImages")
private Integer totalImages;
/**
* 总存储大小格式化
*/
@JsonProperty("totalSize")
private String totalSize;
/**
* 今日上传文件数
*/
@JsonProperty("todayUploads")
private Integer todayUploads;
/**
* 存储使用率百分比
*/
@JsonProperty("storageUsage")
private Double storageUsage;
/**
* 可用空间格式化
*/
@JsonProperty("availableSpace")
private String availableSpace;
}
/**
* 今日活跃统计数据
*/
@Data
public static class DailyActivityStatsVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 今日访问量
*/
@JsonProperty("todayVisits")
private Integer todayVisits;
/**
* 今日操作数
*/
@JsonProperty("todayOperations")
private Integer todayOperations;
/**
* 活跃用户数
*/
@JsonProperty("activeUsers")
private Integer activeUsers;
/**
* 新增内容数
*/
@JsonProperty("newContent")
private Integer newContent;
/**
* API调用次数
*/
@JsonProperty("apiCalls")
private Integer apiCalls;
/**
* 平均响应时间毫秒
*/
@JsonProperty("avgResponseTime")
private Integer avgResponseTime;
}
/**
* 登录趋势项
*/
@Data
public static class LoginTrendItemVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 日期YYYY-MM-DD格式
*/
@JsonProperty("date")
private String date;
/**
* 当日登录次数
*/
@JsonProperty("count")
private Integer count;
/**
* 显示标签用于图表展示
*/
@JsonProperty("label")
private String label;
}
}

View File

@ -0,0 +1,53 @@
package org.leocoder.heritage.domain.model.vo.system;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 登录趋势数据响应对象
*
* @author Leocoder
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class LoginTrendVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 登录趋势数据列表
*/
@JsonProperty("loginTrend")
private List<LoginTrendItemVo> loginTrend;
/**
* 登录趋势项
*/
@Data
public static class LoginTrendItemVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 日期YYYY-MM-DD格式
*/
@JsonProperty("date")
private String date;
/**
* 当日登录次数
*/
@JsonProperty("count")
private Integer count;
/**
* 显示标签用于图表展示
*/
@JsonProperty("label")
private String label;
}
}

View File

@ -0,0 +1,47 @@
package org.leocoder.heritage.domain.model.vo.system;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author Leocoder
* @description [Symbol验证结果对象]
*/
@Data
public class SymbolValidateResultVo implements Serializable {
/**
* 是否有效
*/
private Boolean valid;
/**
* 验证消息
*/
private String message;
/**
* 响应时间毫秒
*/
private Long responseTime;
/**
* 图标数量如果可解析
*/
private Integer iconCount;
/**
* 内容大小字节
*/
private Long contentSize;
/**
* 验证时间
*/
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime validateTime;
}

View File

@ -0,0 +1,35 @@
package org.leocoder.heritage.domain.model.vo.system;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.leocoder.heritage.domain.model.vo.base.BaseVo;
/**
* @author Leocoder
* @description [字典数据表-模型][Vo类]
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class SysDictDataVo extends BaseVo {
/**
* 字典标签
*/
private String dictLabel;
/**
* 字典键值
*/
private String dictValue;
/**
* 字典类型
*/
private String dictType;
/**
* 状态0正常 1停用
*/
private String dictStatus;
}

View File

@ -0,0 +1,30 @@
package org.leocoder.heritage.domain.model.vo.system;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.leocoder.heritage.domain.model.vo.base.BaseVo;
/**
* @author Leocoder
* @description [字典类型表-模型][Vo类]
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class SysDictTypeVo extends BaseVo {
/**
* 字典名称
*/
private String dictName;
/**
* 字典类型
*/
private String dictType;
/**
* 状态[0-正常 1-停用]
*/
private String dictStatus;
}

View File

@ -0,0 +1,31 @@
package org.leocoder.heritage.domain.model.vo.system;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.leocoder.heritage.domain.model.vo.base.BaseVo;
/**
* @description [文件资源表-模型][Vo类]
* @author Leocoder
*/
@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SysFileVo extends BaseVo {
/** 文件原始名称 */
private String fileName;
/** 文件后缀 */
private String fileSuffix;
/** 文件服务类型[1-LOCAL3-OSS] */
private String fileService;
/** 文件类型[0-全部 1-图片 2-文档 3-音频 4-视频 5-压缩包 6-应用程序 9-其他] */
private String fileType;
}

View File

@ -0,0 +1,65 @@
package org.leocoder.heritage.domain.model.vo.system;
import org.leocoder.heritage.domain.model.vo.base.BaseVo;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author Leocoder
* @description [定时任务查询视图对象]
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class SysJobVo extends BaseVo {
/**
* 主键ID
*/
private Long jobId;
/**
* 任务名称
*/
private String jobName;
/**
* 任务类型[1-管理平台 2-小程序 3-App]
*/
private String jobType;
/**
* cron执行表达式
*/
private String cronExpression;
/**
* cron计划策略[1-立即执行 2-执行一次 3-放弃执行]
*/
private String policyStatus;
/**
* 任务状态 [0正常 1暂停]
*/
private String jobStatus;
/**
* 任务参数
*/
private String jobParams;
/**
* 类路径
*/
private String classPath;
/**
* 方法名称
*/
private String methodName;
/**
* 参数备注
*/
private String remark;
}

View File

@ -0,0 +1,39 @@
package org.leocoder.heritage.domain.model.vo.system;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.leocoder.heritage.domain.model.vo.base.BaseVo;
/**
* @author Leocoder
* @description [系统访问记录-模型][Vo类]
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class SysLoginLogVo extends BaseVo {
/**
* 登录账号
*/
private String loginName;
/**
* 登录IP地址
*/
private String loginIp;
/**
* 登录状态[0-成功 1-失败]
*/
private String loginStatus;
/**
* 登录开始时间
*/
private String beginTime;
/**
* 登录结束时间
*/
private String endTime;
}

View File

@ -0,0 +1,55 @@
package org.leocoder.heritage.domain.model.vo.system;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.leocoder.heritage.domain.model.vo.base.BaseVo;
/**
* @author Leocoder
* @description [用户信息表-模型](Vo类)
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class SysLoginUserVo extends BaseVo {
/**
* 登录账号
*/
private String loginName;
/**
* 用户昵称
*/
private String userName;
/**
* 用户类型[1-系统用户 2-注册用户]
*/
private String userType;
/**
* 手机号码
*/
private String phone;
/**
* 用户性别[1- 1- 3-未知]
*/
private String sex;
/**
* 帐号状态[0-启用 1-停用]
*/
private String userStatus;
/**
* 开始时间
*/
private String beginTime;
/**
* 结束时间
*/
private String endTime;
}

View File

@ -0,0 +1,46 @@
package org.leocoder.heritage.domain.model.vo.system;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
/**
* @author Leocoder
* @description [登录-模型][Vo类]
*/
@Data
public class SysLoginVo {
/**
* 账户
*/
@Length(min = 3, max = 16, message = "账号长度为 3-16 位")
@Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母")
@NotBlank(message = "请输入登录名")
private String loginName;
/**
* 密码
*/
@NotBlank(message = "请输入密码")
private String password;
/**
* 验证码uuid用来获取redis的验证码
*/
@NotBlank(message = "验证码已失效")
private String codeKey;
/**
* 验证码
*/
@NotBlank(message = "请输入验证码")
private String securityCode;
/**
* 记住登录默认为false
*/
private Boolean rememberMe = false;
}

View File

@ -0,0 +1,30 @@
package org.leocoder.heritage.domain.model.vo.system;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.leocoder.heritage.domain.model.vo.base.BaseVo;
/**
* @author Leocoder
* @description [菜单权限表-模型][Vo类]
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class SysMenuVo extends BaseVo {
/**
* 菜单名称
*/
private String menuName;
/**
* 是否删除[0-开启 1-暂停]
*/
private String menuStatus;
/**
* 权限标识
*/
private String auth;
}

View File

@ -0,0 +1,79 @@
package org.leocoder.heritage.domain.model.vo.system;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.leocoder.heritage.domain.model.vo.base.BaseVo;
import java.time.LocalDateTime;
/**
* @author Leocoder
* @description [操作日志查询VO]
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class SysOperLogVo extends BaseVo {
/**
* 操作名称
*/
private String operName;
/**
* 操作类型
*/
private String operType;
/**
* 系统类型
*/
private String systemType;
/**
* 操作人员
*/
private String operMan;
/**
* 操作状态
*/
private String operStatus;
/**
* 操作时间-开始
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime operTimeStart;
/**
* 操作时间-结束
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime operTimeEnd;
/**
* IP地址
*/
private String operIp;
/**
* 方法名称
*/
private String methodName;
/**
* 请求URL
*/
private String operUrl;
/**
* 请求方式
*/
private String requestMethod;
/**
* 操作地点
*/
private String operLocation;
}

View File

@ -0,0 +1,60 @@
package org.leocoder.heritage.domain.model.vo.system;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.leocoder.heritage.domain.model.vo.base.BaseVo;
import java.util.Date;
/**
* @description [图库表-模型][Vo类]
* @author Leocoder
*/
@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SysPictureVo extends BaseVo {
/** 主键 */
private Long pictureId;
/** 图片原始名称 */
private String pictureName;
/** 图片新名称 */
private String newName;
/** 图片类型[0-全部 1-用户头像 2-动漫分类 3-美女分类 4-风景分类 5-明星分类 6-动物分类 9-其他] */
private String pictureType;
/** 图片大小[KB/MB/GB] */
private String pictureSize;
/** 图片后缀 */
private String pictureSuffix;
/** 图片上传路径 */
private String pictureUpload;
/** 图片回显路径 */
private String picturePath;
/** 图片服务类型[1-LOCAL3-OSS] */
private String pictureService;
/** 创建时间 */
private Date createTime;
/** 创建人 */
private String createBy;
/** 修改时间 */
private Date updateTime;
/** 修改人 */
private String updateBy;
}

View File

@ -0,0 +1,35 @@
package org.leocoder.heritage.domain.model.vo.system;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Leocoder
* @description [修改密码-模型][Vo类]
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
public class SysPwdVo {
/**
* 原始密码
*/
@NotBlank(message = "密码不能为空")
private String password;
/**
* 新密码
*/
@NotBlank(message = "新密码不能为空")
private String newPassword;
/**
* 确认密码
*/
@NotBlank(message = "确认密码不能为空")
private String confirmPassword;
}

View File

@ -0,0 +1,41 @@
package org.leocoder.heritage.domain.model.vo.system;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Leocoder
* @description [注册-模型][Vo类]
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
public class SysRegisterVo {
/**
* 登录名
*/
@NotBlank(message = "请输入登录名")
private String regLoginName;
/**
* 密码
*/
@NotBlank(message = "请输入密码")
private String regPwd;
/**
* 确认密码
*/
@NotBlank(message = "请输入确认密码")
private String regConfirmPwd;
/**
* 注册邀请码
*/
@NotBlank(message = "请输入注册邀请码")
private String regCode;
}

View File

@ -0,0 +1,40 @@
package org.leocoder.heritage.domain.model.vo.system;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.leocoder.heritage.domain.model.vo.base.BaseVo;
/**
* @author Leocoder
* @description [角色信息表-模型][Vo类]
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class SysRoleVo extends BaseVo {
/**
* 角色名称
*/
private String roleName;
/**
* 角色权限字符串
*/
private String roleCode;
/**
* 角色状态0正常 1停用
*/
private String roleStatus;
/**
* 开始时间
*/
private String beginTime;
/**
* 结束时间
*/
private String endTime;
}

View File

@ -0,0 +1,34 @@
package org.leocoder.heritage.domain.model.vo.system;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.leocoder.heritage.domain.model.vo.base.BaseVo;
/**
* @author Leocoder
* @description [在线用户-模型][Vo类]
*/
@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SysUserOnlineVo extends BaseVo {
/**
* IP
*/
private String loginIp;
/**
* 登录名称
*/
private String loginName;
/**
* 用户名字
*/
private String userName;
}

View File

@ -0,0 +1,150 @@
package org.leocoder.heritage.domain.pojo.gen;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author Leocoder
* @description [代码生成字段表-模型}
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("gen_column")
public class GenColumn implements Serializable {
/**
* 主键ID
*/
@TableId(value = "column_id", type = IdType.ASSIGN_ID)
private Long columnId;
/**
* 数据库名[默认本地local]
*/
@TableField(value = "table_schema")
private String tableSchema;
/**
* 归属表编号
*/
@TableField(value = "table_name")
private String tableName;
/**
* 列名称
*/
@TableField(value = "column_name")
private String columnName;
/**
* 列类型
*/
@TableField(value = "column_type")
private String columnType;
/**
* 数据库字段是否为空[0-1-]
*/
@TableField(value = "is_nullable")
private String isNullable;
/**
* 列描述
*/
@TableField(value = "column_comment")
private String columnComment;
/**
* JAVA类型
*/
@TableField(value = "java_type")
private String javaType;
/**
* JAVA字段名
*/
@TableField(value = "java_field")
private String javaField;
/**
* 是否主键[0-1-]
*/
@TableField(value = "is_pk")
private String isPk;
/**
* 是否列表展示字段[0- 1-]
*/
@TableField(value = "is_list")
private String isList;
/**
* 是否搜索展示字段[0- 1-]
*/
@TableField(value = "is_search")
private String isSearch;
/**
* 条件搜索类型[EQLIKE等]
*/
@TableField(value = "search_type")
private String searchType;
/**
* 是否表单展示字段[0- 1-]
*/
@TableField(value = "is_form")
private String isForm;
/**
* 是否添加规则校验[0- 1-]
*/
@TableField(value = "is_rule")
private String isRule;
/**
* 显示类型[文本框-input下拉框-select复选框-checkbox单选框-radio日期控件-datatime文本域-textarea]
*/
@TableField(value = "element_type")
private String elementType;
/**
* 字典类型
*/
@TableField(value = "dict_type")
private String dictType;
/**
* 创建者
*/
@TableField(value = "create_by")
private String createBy;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 更新者
*/
@TableField(value = "update_by")
private String updateBy;
/**
* 更新时间
*/
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}

View File

@ -0,0 +1,168 @@
package org.leocoder.heritage.domain.pojo.gen;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author Leocoder
* @description [代码生成业务表-模型]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("gen_table")
public class GenTable implements Serializable {
/**
* 编号
*/
@TableId(value = "table_id", type = IdType.ASSIGN_ID)
private Long tableId;
/**
* 表名称
*/
@TableField(value = "table_name")
private String tableName;
/**
* 数据库名[-默认数据库有值-指定数据库]
*/
@TableField(value = "table_schema")
private String tableSchema;
/**
* 表描述
*/
@TableField(value = "table_comment")
private String tableComment;
/**
* 实体类名称
*/
@TableField(value = "class_name")
private String className;
/**
* 数据权限字符
*/
@TableField(value = "table_auth")
private String tableAuth;
/**
* 中文菜单名称
*/
@TableField(value = "zh_name")
private String zhName;
/**
* 英文菜单名称
*/
@TableField(value = "en_name")
private String enName;
/**
* 菜单图标
*/
@TableField(value = "table_icon")
private String tableIcon;
/**
* 父级菜单
*/
@TableField(value = "parent_id")
private Long parentId;
/**
* 父级菜单
*/
@TableField(value = "table_path")
private String tablePath;
/**
* 使用的模板[table单表操作 tree树表操作]
*/
@TableField(value = "table_template")
private String tableTemplate;
/**
* 树编码字段
*/
@TableField(value = "tree_id")
private String treeId;
/**
* 树父编码字段
*/
@TableField(value = "tree_pid")
private String treePid;
/**
* 树编码名称
*/
@TableField(value = "tree_name")
private String treeName;
/**
* 包路径
*/
@TableField(value = "package_path")
private String packagePath;
/**
* 模块文件夹名字
*/
@TableField(value = "module_folder")
private String moduleFolder;
/**
* 页面文件夹名字
*/
@TableField(value = "page_folder")
private String pageFolder;
/**
* 作者
*/
@TableField(value = "author")
private String author;
/**
* 生成路径
*/
@TableField(value = "gen_path")
private String genPath;
/**
* 创建者
*/
@TableField(value = "create_by")
private String createBy;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 更新者
*/
@TableField(value = "update_by")
private String updateBy;
/**
* 更新时间
*/
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}

View File

@ -0,0 +1,41 @@
package org.leocoder.heritage.domain.pojo.gen;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Leocoder
* @description [数据库表字段-模型]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TableColumn {
/**
* 数据库字段名称
*/
private String columnName;
/**
* 数据库字段类型
*/
private String columnType;
/**
* 数据库字段是否默认为空[0-1-]
*/
private String isNullable;
/**
* 数据库字段是否主键[0-1-]
*/
private String isPk;
/**
* 数据库字段注释
*/
private String columnComment;
}

View File

@ -0,0 +1,41 @@
package org.leocoder.heritage.domain.pojo.gen;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.leocoder.heritage.domain.model.vo.base.BaseVo;
import java.util.List;
/**
* @author Leocoder
* @description [数据库表-模型]
*/
@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TableData extends BaseVo {
/**
* 数据库名称
*/
private String tableSchema;
/**
* 数据库表名
*/
private String tableName;
/**
* 表注释
*/
private String tableComment;
/**
* 导入表传递的表名
*/
private List<String> tableNameList;
}

View File

@ -0,0 +1,110 @@
package org.leocoder.heritage.domain.pojo.system;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author Leocoder
* @description [字典数据表-模型]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_dict_data")
public class SysDictData implements Serializable {
/**
* 字典编码
*/
@TableId(value = "dict_id", type = IdType.ASSIGN_ID)
private Long dictId;
/**
* 字典标签
*/
@NotBlank(message = "字典标签不能为空")
@TableField(value = "dict_label")
private String dictLabel;
/**
* 字典键值
*/
@NotBlank(message = "字典键值不能为空")
@TableField(value = "dict_value")
private String dictValue;
/**
* 字典类型
*/
@NotBlank(message = "字典类型不能为空")
@TableField(value = "dict_type")
private String dictType;
/**
* 字典状态[0启用 1停用]
*/
@NotBlank(message = "字典状态不能为空")
@TableField(value = "dict_status")
private String dictStatus;
/**
* ElementPlus官方颜色[默认-primary]
*/
@NotBlank(message = "标签不能为空")
@TableField(value = "dict_tag")
private String dictTag;
/**
* tags自定义背景颜色[有值会进行覆盖ElementPlus官方颜色][例如16进制或者pink等]
*/
@TableField(value = "dict_color")
private String dictColor;
/**
* 显示顺序
*/
@NotNull(message = "显示顺序不能为空")
@TableField(value = "sorted")
private Integer sorted;
/**
* 创建者
*/
@TableField(value = "create_by")
private String createBy;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 更新者
*/
@TableField(value = "update_by")
private String updateBy;
/**
* 更新时间
*/
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
/**
* 备注
*/
@TableField(value = "remark")
private String remark;
}

View File

@ -0,0 +1,81 @@
package org.leocoder.heritage.domain.pojo.system;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author Leocoder
* @description [字典类型表-模型]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_dict_type")
public class SysDictType implements Serializable {
/**
* 字典主键
*/
@TableId(value = "dict_id", type = IdType.ASSIGN_ID)
private Long dictId;
/**
* 字典类型
*/
@NotBlank(message = "字典类型不能为空")
@TableField("dict_type")
private String dictType;
/**
* 字典名称
*/
@NotBlank(message = "字典名称不能为空")
@TableField("dict_name")
private String dictName;
/**
* 字典状态[0-正常 1-停用]
*/
@NotBlank(message = "字典状态不能为空")
@TableField("dict_status")
private String dictStatus;
/**
* 创建者
*/
@TableField("create_by")
private String createBy;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 更新者
*/
@TableField("update_by")
private String updateBy;
/**
* 更新时间
*/
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
/**
* 备注
*/
@TableField("remark")
private String remark;
}

View File

@ -0,0 +1,76 @@
package org.leocoder.heritage.domain.pojo.system;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @description [文件资源表-模型]
* @author Leocoder
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_file")
public class SysFile implements Serializable {
/** 主键 */
@TableId(value = "file_id", type = IdType.ASSIGN_ID)
private Long fileId;
/** 文件原始名称 */
@TableField(value = "file_name")
private String fileName;
/** 文件新名称 */
@TableField(value = "new_name")
private String newName;
/** 文件类型[0-全部 1-图片 2-文档 3-音频 4-视频 5-压缩包 6-应用程序 9-其他] */
@TableField(value = "file_type")
private String fileType;
/** 文件大小[KB/MB/GB] */
@TableField(value = "file_size")
private String fileSize;
/** 文件后缀 */
@TableField(value = "file_suffix")
private String fileSuffix;
/** 文件上传路径 */
@TableField(value = "file_upload")
private String fileUpload;
/** 文件回显路径 */
@TableField(value = "file_path")
private String filePath;
/** 文件服务类型[1-LOCAL3-OSS] */
@TableField(value = "file_service")
private String fileService;
/** 创建时间 */
@TableField(value = "create_time", fill = FieldFill.INSERT)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/** 创建人 */
@TableField(value = "create_by")
private String createBy;
/** 修改时间 */
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
/** 修改人 */
@TableField(value = "update_by")
private String updateBy;
}

View File

@ -0,0 +1,149 @@
package org.leocoder.heritage.domain.pojo.system;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author Leocoder
* @description [定时任务-模型]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_job")
public class SysJob implements Serializable {
/**
* 任务ID
*/
@TableId(value = "job_id", type = IdType.ASSIGN_ID)
private Long jobId;
/**
* 任务名称
*/
@NotBlank(message = "任务名称不能为空")
@TableField("job_name")
private String jobName;
/**
* 任务类型[1-管理平台 2-小程序 3-App]
*/
@NotBlank(message = "任务类型不能为空")
@TableField("job_type")
private String jobType;
/**
* 类路径
*/
@NotBlank(message = "类路径不能为空")
@TableField("class_path")
private String classPath;
/**
* 方法名称
*/
@NotBlank(message = "方法名称不能为空")
@TableField("method_name")
private String methodName;
/**
* cron执行表达式
*/
@NotBlank(message = "cron执行表达式不能为空")
@TableField("cron_expression")
private String cronExpression;
/**
* cron计划策略[1-立即执行 2-执行一次 3-放弃执行]
*/
@NotBlank(message = "cron计划策略不能为空")
@TableField("policy_status")
private String policyStatus;
/**
* 任务状态 [0正常 1暂停]
*/
@NotBlank(message = "任务状态不能为空")
@TableField("job_status")
private String jobStatus;
/**
* 任务参数
*/
@TableField("job_params")
private String jobParams;
/**
* 任务备注
*/
@TableField("remark")
private String remark;
/**
* 创建者
*/
@TableField("create_by")
private String createBy;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 更新者
*/
@TableField("update_by")
private String updateBy;
/**
* 更新时间
*/
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
/**
* @description [获取任务状态文本]
* @author Leocoder
*/
public String getJobStatusText() {
return "0".equals(jobStatus) ? "正常" : "暂停";
}
/**
* @description [获取策略状态文本]
* @author Leocoder
*/
public String getPolicyStatusText() {
switch (policyStatus) {
case "1": return "立即执行";
case "2": return "执行一次";
case "3": return "放弃执行";
default: return "未知";
}
}
/**
* @description [获取任务类型文本]
* @author Leocoder
*/
public String getJobTypeText() {
switch (jobType) {
case "1": return "管理平台";
case "2": return "小程序";
case "3": return "App";
default: return "其他";
}
}
}

View File

@ -0,0 +1,88 @@
package org.leocoder.heritage.domain.pojo.system;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author Leocoder
* @description [系统访问记录-模型]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_login_log")
public class SysLoginLog implements Serializable {
/**
* 访问ID
*/
@TableId(value = "login_id", type = IdType.ASSIGN_ID)
private Long loginId;
/**
* 登录账号
*/
@NotBlank(message = "登录账号不能为空")
@TableField("login_name")
private String loginName;
/**
* 登录设备PC手机平板
*/
@NotBlank(message = "登录设备不能为空")
@TableField("device_name")
private String deviceName;
/**
* 登录IP地址
*/
@TableField("login_ip")
private String loginIp;
/**
* 登录地址
*/
@TableField("login_address")
private String loginAddress;
/**
* 浏览器类型
*/
@TableField("browser")
private String browser;
/**
* 操作系统
*/
@TableField("os")
private String os;
/**
* 登录状态[0-成功 1-失败]
*/
@TableField("login_status")
private String loginStatus;
/**
* 提示消息
*/
@TableField("message")
private String message;
/**
* 访问时间
*/
@TableField("login_time")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime loginTime;
}

View File

@ -0,0 +1,196 @@
package org.leocoder.heritage.domain.pojo.system;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.*;
import com.alibaba.excel.enums.BooleanEnum;
import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author Leocoder
* @description [系统用户-模型]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
// 默认不管加不加ExcelProperty的注解的所有字段都会参与读写加了ExcelIgnoreUnannotated注解以后不加ExcelProperty注解的字段就不会参与
@ExcelIgnoreUnannotated
// 设置单元格高度
@ContentRowHeight(15)
// 设置标题高度
@HeadRowHeight(17)
// 设置单元格内容居中
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER)
// 设置标题字体样式
@HeadFontStyle(fontName = "仿宋",color = 20, bold = BooleanEnum.FALSE)
// 设置单元格字体样式
@ContentFontStyle(fontName = "仿宋",color = 30, bold = BooleanEnum.FALSE)
@TableName("sys_login_user")
public class SysLoginUser implements java.io.Serializable {
/**
* 用户ID
*/
// 使用@ExcelIgnore注解默认所有字段都会和excel去匹配加了这个注解会忽略该字段
@TableId(value = "user_id", type = IdType.ASSIGN_ID)
private Long userId;
/**
* 登录账号value属性设置列的名称index属性设置设置列的序号从 0 开始
*/
@Length(min = 3, max = 16, message = "账号长度为 3-16 位")
@Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母")
@NotBlank(message = "登录账号不能为空")
@ColumnWidth(20)
@ExcelProperty(value = "登录账号", index = 0)
@TableField("login_name")
private String loginName;
/**
* 用户真实姓名
*/
@NotBlank(message = "用户真实姓名不能为空")
@ColumnWidth(20)
@ExcelProperty(value = "用户名字", index = 1)
@TableField("user_name")
private String userName;
/**
* 用户密码
*/
@TableField("password")
private String password;
/**
* 用户类型[1-系统用户 2-注册用户 3-微信用户]
*/
@TableField("user_type")
private String userType;
/**
* 用户邮箱
*/
@ColumnWidth(30)
@ExcelProperty(value = "用户邮箱", index = 2)
@TableField("email")
private String email;
/**
* 手机号码
*/
// @CoderDesensitize(rule = DesensitizeRuleEnum.MOBILE_PHONE)
@NotBlank(message = "手机号码不能为空")
@ColumnWidth(20)
@ExcelProperty(value = "手机号码", index = 3)
@TableField("phone")
private String phone;
/**
* 用户性别[1- 2- 3-未知]
*/
// @CoderDict(dictKey = "sys_user_sex", dictValue = "sex")
@NotBlank(message = "用户性别不能为空")
@ColumnWidth(20)
@ExcelProperty(value = "用户性别[1-男 2-女 3-未知]", index = 4)
@TableField("sex")
private String sex;
/**
* 头像路径
*/
@ColumnWidth(20)
@ExcelProperty(value = "头像路径", index = 5)
@TableField("avatar")
private String avatar;
/**
* 盐加密
*/
@TableField("salt")
private String salt;
/**
* 帐号状态[0-启用 1-停用]
*/
// @CoderDict(dictKey = "sys_switch_status", dictValue = "userStatus")
@NotBlank(message = "帐号状态不能为空")
@TableField("user_status")
private String userStatus;
/**
* 登录IP
*/
@TableField("login_ip")
private String loginIp;
/**
* 登录时间
*/
@TableField("login_time")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime loginTime;
/**
* 密码更新时间
*/
@TableField("pwd_update_time")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime pwdUpdateTime;
/**
* 备注
*/
@TableField("remark")
private String remark;
/**
* 创建者
*/
@TableField("create_by")
private String createBy;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 更新者
*/
@TableField("update_by")
private String updateBy;
/**
* 更新时间
*/
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
/**
* 岗位ID
*/
@TableField(exist = false)
private List<Long> postIds;
/**
* 角色ID
*/
@TableField(exist = false)
private List<Long> roleIds;
}

View File

@ -0,0 +1,170 @@
package org.leocoder.heritage.domain.pojo.system;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author Leocoder
* @description [菜单权限表-模型]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_menu")
public class SysMenu implements Serializable {
/**
* 菜单ID
*/
@TableId(value = "menu_id", type = IdType.ASSIGN_ID)
private Long menuId;
/**
* 菜单名称
*/
@NotBlank(message = "菜单名称不能为空")
@TableField(value = "menu_name")
private String menuName;
/**
* 英文菜单
*/
@TableField(value = "en_name")
private String enName;
/**
* 父菜单ID
*/
@NotNull(message = "上级菜单不能为空")
@TableField(value = "parent_id")
private Long parentId;
/**
* 菜单类型[1-目录 2-菜单 3-按钮]
*/
@NotBlank(message = "菜单类型不能为空")
@TableField(value = "menu_type")
private String menuType;
/**
* 路由地址
*/
@TableField(value = "path")
private String path;
/**
* 路由名称[例如userPage]
*/
@TableField(value = "name")
private String name;
/**
* vue页面路径
*/
@TableField(value = "component")
private String component;
/**
* 菜单图标
*/
@TableField(value = "icon")
private String icon;
/**
* 权限标识
*/
@TableField(value = "auth")
private String auth;
/**
* 菜单状态[0-启用 1-停用]
*/
@NotBlank(message = "菜单状态不能为空")
@TableField(value = "menu_status")
private String menuStatus;
/**
* 选中路由
*/
@TableField(value = "active_menu")
private String activeMenu;
/**
* 是否隐藏[0-隐藏 1-显示]
*/
@NotBlank(message = "是否隐藏菜单不能为空")
@TableField(value = "is_hide")
private String isHide;
/**
* 是否外链[空值不跳转有值则跳转链接]
*/
@TableField(value = "is_link")
private String isLink;
/**
* 是否缓存[0- 1-]
*/
@TableField(value = "is_keep_alive")
private String isKeepAlive;
/**
* 是否全屏[0- 1-]
*/
@TableField(value = "is_Full")
private String isFull;
/**
* 是否固定项[0- 1-][例如首页]
*/
@TableField(value = "is_affix")
private String isAffix;
/**
* 是否展开[0- 1-]
*/
@TableField(value = "is_spread")
private String isSpread;
/**
* 显示顺序
*/
@NotNull(message = "显示顺序不能为空")
@TableField(value = "sorted")
private Integer sorted;
/**
* 创建者
*/
@TableField(value = "create_by")
private String createBy;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 更新者
*/
@TableField(value = "update_by")
private String updateBy;
/**
* 更新时间
*/
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}

View File

@ -0,0 +1,134 @@
package org.leocoder.heritage.domain.pojo.system;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
/**
* @author Leocoder
* @description [操作日志实体类]
*/
@Data
@TableName("sys_oper_log")
public class SysOperLog {
/**
* 操作主键
*/
@TableId(value = "oper_id", type = IdType.AUTO)
private Long operId;
/**
* 操作名称
*/
private String operName;
/**
* 操作类型
*/
private String operType;
/**
* 方法名称
*/
private String methodName;
/**
* 请求方式
*/
private String requestMethod;
/**
* 系统类型
*/
private String systemType;
/**
* 操作人员
*/
private String operMan;
/**
* 请求URL
*/
private String operUrl;
/**
* 主机地址
*/
private String operIp;
/**
* 操作地点
*/
private String operLocation;
/**
* 请求参数
*/
private String operParam;
/**
* 返回参数
*/
private String jsonResult;
/**
* 操作状态
*/
private String operStatus;
/**
* 错误消息
*/
private String errorMsg;
/**
* 操作时间
*/
private LocalDateTime operTime;
/**
* 消耗时间
*/
private String costTime;
/**
* @description [获取操作状态文本]
* @author Leocoder
*/
public String getOperStatusText() {
return "0".equals(operStatus) ? "正常" : "异常";
}
/**
* @description [获取操作类型文本]
* @author Leocoder
*/
public String getOperTypeText() {
switch (operType) {
case "INSERT": return "新增";
case "UPDATE": return "修改";
case "DELETE": return "删除";
case "SELECT": return "查询";
case "IMPORT": return "导入";
case "EXPORT": return "导出";
default: return "其它";
}
}
/**
* @description [获取系统类型文本]
* @author Leocoder
*/
public String getSystemTypeText() {
switch (systemType) {
case "MANAGER": return "后台用户";
case "PHONE": return "手机端用户";
default: return "其它";
}
}
}

View File

@ -0,0 +1,76 @@
package org.leocoder.heritage.domain.pojo.system;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @description [图库表-模型]
* @author Leocoder
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_picture")
public class SysPicture implements Serializable {
/** 主键 */
@TableId(value = "picture_id", type = IdType.ASSIGN_ID)
private Long pictureId;
/** 图片原始名称 */
@TableField(value = "picture_name")
private String pictureName;
/** 图片新名称 */
@TableField(value = "new_name")
private String newName;
/** 图片类型[0-全部 1-用户头像 2-动漫分类 3-美女分类 4-风景分类 5-明星分类 6-动物分类 9-其他] */
@TableField(value = "picture_type")
private String pictureType;
/** 图片大小[KB/MB/GB] */
@TableField(value = "picture_size")
private String pictureSize;
/** 图片后缀 */
@TableField(value = "picture_suffix")
private String pictureSuffix;
/** 图片上传路径 */
@TableField(value = "picture_upload")
private String pictureUpload;
/** 图片回显路径 */
@TableField(value = "picture_path")
private String picturePath;
/** 图片服务类型[1-LOCAL3-OSS] */
@TableField(value = "picture_service")
private String pictureService;
/** 创建时间 */
@TableField(value = "create_time", fill = FieldFill.INSERT)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/** 创建人 */
@TableField(value = "create_by")
private String createBy;
/** 修改时间 */
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
/** 修改人 */
@TableField(value = "update_by")
private String updateBy;
}

View File

@ -0,0 +1,88 @@
package org.leocoder.heritage.domain.pojo.system;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author Leocoder
* @description [角色信息表-模型]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_role")
public class SysRole implements Serializable {
/**
* 角色ID
*/
@TableId(value = "role_id", type = IdType.ASSIGN_ID)
private Long roleId;
/**
* 角色名称
*/
@NotBlank(message = "角色名称不能为空")
@TableField("role_name")
private String roleName;
/**
* 角色权限字符串
*/
@TableField("role_code")
private String roleCode;
/**
* 角色状态[0-正常 1-停用]
*/
@NotBlank(message = "角色状态不能为空")
@TableField("role_status")
private String roleStatus;
/**
* 显示顺序
*/
@NotNull(message = "显示顺序不能为空")
@TableField("sorted")
private Integer sorted;
/**
* 创建者
*/
@TableField("create_by")
private String createBy;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 更新者
*/
@TableField("update_by")
private String updateBy;
/**
* 更新时间
*/
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
/**
* 备注
*/
@TableField("remark")
private String remark;
}

View File

@ -0,0 +1,32 @@
package org.leocoder.heritage.domain.pojo.system;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Leocoder
* @description [系统用户角色-模型]
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_user_role")
public class SysUserRole {
/**
* 用户ID
*/
@TableId(value = "user_id", type = IdType.NONE)
private Long userId;
/**
* 角色ID
*/
@TableId(value = "user_id", type = IdType.NONE)
private Long roleId;
}

View File

@ -0,0 +1,32 @@
package org.leocoder.heritage.domain.validator.anno;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import org.leocoder.heritage.domain.validator.valid.PhoneValidator;
import java.lang.annotation.*;
/**
* @author Leocoder
* @description [ValidPhone]
*/
@Documented
@Constraint(validatedBy = PhoneValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidPhone {
String message() default "手机格式不正确!";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface List {
ValidPhone[] value();
}
}

View File

@ -0,0 +1,17 @@
package org.leocoder.heritage.domain.validator.anno;
import jakarta.validation.Constraint;
import org.leocoder.heritage.domain.validator.valid.URLValidator;
import java.lang.annotation.*;
/**
* @author Leocoder
* @description [CoderValidURL]
*/
@Documented
@Constraint(validatedBy = URLValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidURL {
}

View File

@ -0,0 +1,121 @@
package org.leocoder.heritage.domain.validator.utils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author Leocoder
* @description [校验工具类]
*/
public class ValidatorUtil {
public static void main(String[] args) {
// System.out.println(MD5Util.md5( "123456"+"111.!@3"));
System.out.println(isValidatorPhone("18593114301"));
System.out.println(isValidatorPhone("110110110"));
System.out.println(isValidatorPhone("Coder-Admin"));
System.out.println(isURL("Coder-Admin"));
System.out.println(isURL("http://www.baidu.com"));
System.out.println("ok" + isURL("https://uncss-online.com/"));
System.out.println("ok11" + isURL("http://weathernew.pae.baidu.com/weathernew/pc?query=%E6%A2%85%E5%B7%9E%E5%A4%A9%E6%B0%94&srcid=4982&city_name=%E6%A2%85%E5%B7%9E&province_name=%E5%B9%BF%E4%B8%9C"));
System.out.println(isEmail("http://www.baidu.com"));
System.out.println(isEmail("Coder-admin@163.com"));
System.out.println(isEmail("yuxintao6@163.com"));
}
/**
* @description [验证手机号码]
*/
public static boolean isValidatorPhone(String phone) {
String regex = "(^0?1[1|2|3|4|5|7|6|8|9][0-9]\\d{8}$)";
if (phone.length() != 11) {
return false;
} else {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(phone);
boolean isMatch = m.matches();
return isMatch;
}
}
/**
* @description [利用正则表达式判断字符串是否是数字]
*/
public static boolean isNumeric(String str) {
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(str);
if (!isNum.matches()) {
return false;
}
return true;
}
/**
* @description [校验邮箱]
*/
public static boolean isEmail(String email) {
if (null == email || "".equals(email)) {
return false;
}
String regEx1 = "^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+";
Pattern p = Pattern.compile(regEx1);
Matcher m = p.matcher(email);
if (m.matches()) {
return true;
} else {
return false;
}
}
/**
* @description [校验url]
*/
public static boolean isURL(String url) {
//String regex = "^([hH][tT]{2}[pP]:/*|[hH][tT]{2}[pP][sS]:/*|[fF][tT][pP]:/*)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\/])+(\\?{0,1}(([A-Za-z0-9-~]+\\={0,1})([A-Za-z0-9-~]*)\\&{0,1})*)$";
String regex = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
Pattern pattern = Pattern.compile(regex);
return pattern.matcher(url).matches();
}
/**
* @description [顶级域名判断如果要忽略大小写可以直接在传入参数的时候toLowerCase()再做判断]
*/
public static boolean isTopURL(String str) {
//转换为小写
str = str.toLowerCase();
String domainRules = "com.cn|net.cn|org.cn|gov.cn|com.hk|公司|中国|网络|com|net|org|int|edu|gov|mil|arpa|Asia|biz|info|name|pro|coop|aero|museum|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cf|cg|ch|ci|ck|cl|cm|cn|co|cq|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|eh|es|et|ev|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gh|gi|gl|gm|gn|gp|gr|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|in|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|ml|mm|mn|mo|mp|mq|mr|ms|mt|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|va|vc|ve|vg|vn|vu|wf|ws|ye|yu|za|zm|zr|zw";
String regex = "^((https|http|ftp|rtsp|mms)?://)"
+ "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@
+ "(([0-9]{1,3}\\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184
+ "|" // 允许IP和DOMAIN域名
+ "(([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]+\\.)?" // 域名- www.
+ "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\\." // 二级域名
+ "(" + domainRules + "))" // first level domain- .com or .museum
+ "(:[0-9]{1,4})?" // 端口- :80
+ "((/?)|" // a slash isn't required if there is no file name
+ "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";
Pattern pattern = Pattern.compile(regex);
Matcher isUrl = pattern.matcher(str);
return isUrl.matches();
}
/**
* @description [判断字符串是否包含中文]
*/
public static boolean isContainsChinese(String str) {
String regEx = "[\u4e00-\u9fa5]";
Pattern pat = Pattern.compile(regEx);
Matcher matcher = pat.matcher(str);
boolean flg = false;
if (matcher.find()) {
flg = true;
}
return flg;
}
}

View File

@ -0,0 +1,33 @@
package org.leocoder.heritage.domain.validator.valid;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import org.leocoder.heritage.domain.validator.anno.ValidPhone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author Leocoder
* @description [PhoneValidator-手机号校验器]
*/
public class PhoneValidator implements ConstraintValidator<ValidPhone, String> {
@Override
public boolean isValid(String phoneNumber, ConstraintValidatorContext constraintValidatorContext) {
// 1: 如果用户没输入直接返回不校验因为空的判断交给@NotNull去做就行了
if (phoneNumber == null || phoneNumber.isEmpty()) {
return true;
}
Pattern p = Pattern.compile("^(13[0-9]|14[5|7|9]|15[0|1|2|3|5|6|7|8|9]|17[0|1|6|7|8]|18[0-9])\\d{8}$");
// 2如果校验通过就返回true,否则返回false;
Matcher matcher = p.matcher(phoneNumber);
return matcher.matches();
}
@Override
public void initialize(ValidPhone constraintAnnotation) {
}
}

View File

@ -0,0 +1,33 @@
package org.leocoder.heritage.domain.validator.valid;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import org.leocoder.heritage.domain.validator.anno.ValidURL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author Leocoder
* @description [URLValidator-URL校验器]
*/
public class URLValidator implements ConstraintValidator<ValidURL, String> {
@Override
public boolean isValid(String urlValue, ConstraintValidatorContext constraintValidatorContext) {
// 1如果用户没输入直接返回不校验因为空的判断交给@NotNull去做就行了
if (urlValue == null || urlValue.isEmpty()) {
return true;
}
Pattern p = Pattern.compile("^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]");
// 2如果校验通过就返回true否则返回false;
Matcher matcher = p.matcher(urlValue);
return matcher.matches();
}
@Override
public void initialize(ValidURL constraintAnnotation) {
}
}