diff --git a/heritage-model/pom.xml b/heritage-model/pom.xml
new file mode 100644
index 0000000..7438322
--- /dev/null
+++ b/heritage-model/pom.xml
@@ -0,0 +1,51 @@
+
+
+ 4.0.0
+
+ org.leocoder.heritage
+ heritage-backend
+ ${revision}
+
+
+
+ heritage-model
+ heritage-model
+ 实体类模块
+
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+ com.baomidou
+ mybatis-plus-spring-boot3-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
+ org.leocoder.heritage
+ heritage-desensitize
+ ${revision}
+
+
+
+ org.hibernate.validator
+ hibernate-validator
+
+
+
+ com.alibaba
+ easyexcel
+
+
+
+
\ No newline at end of file
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/enums/menu/MenuStatusEnum.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/enums/menu/MenuStatusEnum.java
new file mode 100644
index 0000000..66525bb
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/enums/menu/MenuStatusEnum.java
@@ -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);
+ }
+}
\ No newline at end of file
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/enums/menu/MenuTypeEnum.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/enums/menu/MenuTypeEnum.java
new file mode 100644
index 0000000..db8dcc9
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/enums/menu/MenuTypeEnum.java
@@ -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);
+ }
+}
\ No newline at end of file
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/enums/oper/OperType.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/enums/oper/OperType.java
new file mode 100644
index 0000000..a0fd3f8
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/enums/oper/OperType.java
@@ -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;
+ }
+}
\ No newline at end of file
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/enums/oper/SystemType.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/enums/oper/SystemType.java
new file mode 100644
index 0000000..3d35b04
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/enums/oper/SystemType.java
@@ -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;
+ }
+}
\ No newline at end of file
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/CascaderLongBo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/CascaderLongBo.java
new file mode 100755
index 0000000..4fe6fcc
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/CascaderLongBo.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/CascaderStringBo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/CascaderStringBo.java
new file mode 100755
index 0000000..66de432
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/CascaderStringBo.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/SelectLongBo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/SelectLongBo.java
new file mode 100755
index 0000000..692da72
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/SelectLongBo.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/SelectStringBo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/SelectStringBo.java
new file mode 100755
index 0000000..aac4297
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/SelectStringBo.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/TransferLongBo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/TransferLongBo.java
new file mode 100755
index 0000000..a0ec56c
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/TransferLongBo.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/TransferStringBo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/TransferStringBo.java
new file mode 100755
index 0000000..a7524d1
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/element/TransferStringBo.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/system/SysJobBo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/system/SysJobBo.java
new file mode 100644
index 0000000..5ff181a
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/system/SysJobBo.java
@@ -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;
+
+}
\ No newline at end of file
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/system/SysLoginBo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/system/SysLoginBo.java
new file mode 100755
index 0000000..a46f360
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/system/SysLoginBo.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/system/SysMenuBo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/system/SysMenuBo.java
new file mode 100755
index 0000000..24e6af0
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/system/SysMenuBo.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/system/SysRoleMenuBo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/system/SysRoleMenuBo.java
new file mode 100644
index 0000000..8a54b18
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/bo/system/SysRoleMenuBo.java
@@ -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 menuIds;
+
+ /**
+ * 获取Long类型的角色ID
+ */
+ public Long getRoleIdAsLong() {
+ return roleId != null ? Long.valueOf(roleId) : null;
+ }
+
+ /**
+ * 获取Long类型的菜单ID列表
+ */
+ public List getMenuIdsAsLong() {
+ if (menuIds == null) {
+ return null;
+ }
+ return menuIds.stream()
+ .filter(id -> id != null && !id.isEmpty())
+ .map(Long::valueOf)
+ .collect(Collectors.toList());
+ }
+
+}
\ No newline at end of file
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/base/BaseVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/base/BaseVo.java
new file mode 100755
index 0000000..ec695f4
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/base/BaseVo.java
@@ -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 params;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/gen/GenColumnVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/gen/GenColumnVo.java
new file mode 100755
index 0000000..7786ac4
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/gen/GenColumnVo.java
@@ -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;
+
+ /**
+ * 条件搜索类型[EQ、LIKE等]
+ */
+ 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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/gen/GenTableVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/gen/GenTableVo.java
new file mode 100755
index 0000000..4e878f3
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/gen/GenTableVo.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/DashboardStatisticsVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/DashboardStatisticsVo.java
new file mode 100644
index 0000000..6771440
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/DashboardStatisticsVo.java
@@ -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 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;
+ }
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/LoginTrendVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/LoginTrendVo.java
new file mode 100644
index 0000000..6cf2a4f
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/LoginTrendVo.java
@@ -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 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;
+ }
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SymbolValidateResultVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SymbolValidateResultVo.java
new file mode 100644
index 0000000..5fb7cd3
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SymbolValidateResultVo.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysDictDataVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysDictDataVo.java
new file mode 100644
index 0000000..96a916e
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysDictDataVo.java
@@ -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;
+
+}
\ No newline at end of file
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysDictTypeVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysDictTypeVo.java
new file mode 100644
index 0000000..97f4862
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysDictTypeVo.java
@@ -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;
+
+}
\ No newline at end of file
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysFileVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysFileVo.java
new file mode 100755
index 0000000..15da100
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysFileVo.java
@@ -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-LOCAL,3-OSS] */
+ private String fileService;
+
+ /** 文件类型[0-全部 1-图片 2-文档 3-音频 4-视频 5-压缩包 6-应用程序 9-其他] */
+ private String fileType;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysJobVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysJobVo.java
new file mode 100644
index 0000000..3463156
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysJobVo.java
@@ -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;
+
+}
\ No newline at end of file
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysLoginLogVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysLoginLogVo.java
new file mode 100755
index 0000000..16155b8
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysLoginLogVo.java
@@ -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;
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysLoginUserVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysLoginUserVo.java
new file mode 100755
index 0000000..f8c8d49
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysLoginUserVo.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysLoginVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysLoginVo.java
new file mode 100755
index 0000000..8b9edde
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysLoginVo.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysMenuVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysMenuVo.java
new file mode 100755
index 0000000..c0292bd
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysMenuVo.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysOperLogVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysOperLogVo.java
new file mode 100644
index 0000000..cc5894a
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysOperLogVo.java
@@ -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;
+}
\ No newline at end of file
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysPictureVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysPictureVo.java
new file mode 100755
index 0000000..00ad9dd
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysPictureVo.java
@@ -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-LOCAL,3-OSS] */
+ private String pictureService;
+
+ /** 创建时间 */
+ private Date createTime;
+
+ /** 创建人 */
+ private String createBy;
+
+ /** 修改时间 */
+ private Date updateTime;
+
+ /** 修改人 */
+ private String updateBy;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysPwdVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysPwdVo.java
new file mode 100755
index 0000000..d6c90f1
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysPwdVo.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysRegisterVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysRegisterVo.java
new file mode 100755
index 0000000..ebe719e
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysRegisterVo.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysRoleVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysRoleVo.java
new file mode 100755
index 0000000..eca38bd
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysRoleVo.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysUserOnlineVo.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysUserOnlineVo.java
new file mode 100755
index 0000000..ece802f
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/model/vo/system/SysUserOnlineVo.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/gen/GenColumn.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/gen/GenColumn.java
new file mode 100755
index 0000000..510d330
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/gen/GenColumn.java
@@ -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;
+
+ /**
+ * 条件搜索类型[EQ、LIKE等]
+ */
+ @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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/gen/GenTable.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/gen/GenTable.java
new file mode 100755
index 0000000..55579c1
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/gen/GenTable.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/gen/TableColumn.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/gen/TableColumn.java
new file mode 100755
index 0000000..9f1fd84
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/gen/TableColumn.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/gen/TableData.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/gen/TableData.java
new file mode 100755
index 0000000..565437b
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/gen/TableData.java
@@ -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 tableNameList;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysDictData.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysDictData.java
new file mode 100644
index 0000000..d272d8d
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysDictData.java
@@ -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;
+
+}
\ No newline at end of file
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysDictType.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysDictType.java
new file mode 100644
index 0000000..01cca32
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysDictType.java
@@ -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;
+}
\ No newline at end of file
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysFile.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysFile.java
new file mode 100755
index 0000000..4deedc5
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysFile.java
@@ -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-LOCAL,3-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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysJob.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysJob.java
new file mode 100644
index 0000000..8b933c8
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysJob.java
@@ -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 "其他";
+ }
+ }
+}
\ No newline at end of file
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysLoginLog.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysLoginLog.java
new file mode 100755
index 0000000..da5b3ee
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysLoginLog.java
@@ -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;
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysLoginUser.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysLoginUser.java
new file mode 100755
index 0000000..e948dbd
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysLoginUser.java
@@ -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 postIds;
+
+ /**
+ * 角色ID
+ */
+ @TableField(exist = false)
+ private List roleIds;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysMenu.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysMenu.java
new file mode 100755
index 0000000..f19bf0d
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysMenu.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysOperLog.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysOperLog.java
new file mode 100644
index 0000000..9948140
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysOperLog.java
@@ -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 "其它";
+ }
+ }
+}
\ No newline at end of file
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysPicture.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysPicture.java
new file mode 100755
index 0000000..c3f63b1
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysPicture.java
@@ -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-LOCAL,3-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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysRole.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysRole.java
new file mode 100755
index 0000000..de191c8
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysRole.java
@@ -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;
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysUserRole.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysUserRole.java
new file mode 100755
index 0000000..9056c3d
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/pojo/system/SysUserRole.java
@@ -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;
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/validator/anno/ValidPhone.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/validator/anno/ValidPhone.java
new file mode 100755
index 0000000..94e9c6f
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/validator/anno/ValidPhone.java
@@ -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();
+ }
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/validator/anno/ValidURL.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/validator/anno/ValidURL.java
new file mode 100755
index 0000000..4b00e92
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/validator/anno/ValidURL.java
@@ -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 {
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/validator/utils/ValidatorUtil.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/validator/utils/ValidatorUtil.java
new file mode 100755
index 0000000..cc2f9e2
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/validator/utils/ValidatorUtil.java
@@ -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;
+ }
+
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/validator/valid/PhoneValidator.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/validator/valid/PhoneValidator.java
new file mode 100755
index 0000000..16dfe78
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/validator/valid/PhoneValidator.java
@@ -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 {
+
+ @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) {
+
+ }
+
+}
diff --git a/heritage-model/src/main/java/org/leocoder/heritage/domain/validator/valid/URLValidator.java b/heritage-model/src/main/java/org/leocoder/heritage/domain/validator/valid/URLValidator.java
new file mode 100755
index 0000000..ce68ad4
--- /dev/null
+++ b/heritage-model/src/main/java/org/leocoder/heritage/domain/validator/valid/URLValidator.java
@@ -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 {
+
+ @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) {
+
+ }
+
+}