commit adaec0eadd39bb21e8a381a6cf43f7730e0b2b65
Author: clay <20932067@zju.edu.cn>
Date: Wed Mar 6 17:44:09 2024 +0800
init
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..0994585
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,50 @@
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+### Maven template
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+# https://github.com/takari/maven-wrapper#usage-without-binary-jar
+.mvn/wrapper/maven-wrapper.jar
+
+### Example user template template
+### Example user template
+
+# IntelliJ project files
+.idea
+*.iml
+out
+gen
+
+
+!$DRONE_COMMIT_BRANCH.jar
+!start.sh
\ No newline at end of file
diff --git a/.drone.yml b/.drone.yml
new file mode 100644
index 0000000..45f7168
--- /dev/null
+++ b/.drone.yml
@@ -0,0 +1,105 @@
+kind: pipeline
+type: docker
+name: fateverse
+platform:
+ os: linux
+ arch: arm64
+
+
+steps:
+ - name: build-jar # 流水线名称
+ image: maven:3.8.5-openjdk-11 # 定义创建容器的Docker镜像,maven:3.8.5-openjdk-8用于对java进行打包使用
+ volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
+ - name: maven-cache
+ path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载
+ - name: maven-build
+ path: /app/build # 将应用打包好的Jar和执行脚本挂载出来
+ commands: # 定义在Docker容器中执行的shell命令
+ - sed -i 's/$DRONE_COMMIT_BRANCH/'"$DRONE_COMMIT_BRANCH"'/' start.sh
+ - bash maven.sh
+
+ - name: build-docker # 制作docker镜像
+ image: docker # 使用官方docker镜像
+ volumes: # 将容器内目录挂载到宿主机
+ - name: maven-build
+ path: /app/build # 将应用打包好的Jar和执行脚本挂载出来
+ - name: docker
+ path: /var/run/docker.sock # 挂载宿主机的docker
+# - name: skywalking
+# path: /app/skywalking
+ environment: # 获取到密文的docker用户名和密码
+ DOCKER_USERNAME:
+ from_secret: docker_username
+ DOCKER_PASSWORD:
+ from_secret: docker_password
+ REGISTRY:
+ from_secret: registry
+ REGISTRY_NAMESPACE:
+ from_secret: registry_namespace
+ commands: # 定义在Docker容器中执行的shell命令
+ - cd /app/build/$DRONE_COMMIT_BRANCH
+ - sed -i 's/$REGISTRY/'"$REGISTRY"'/' deployment.yml
+ - sed -i 's/$REGISTRY_NAMESPACE/'"$REGISTRY_NAMESPACE"'/' deployment.yml
+ - sed -i 's/$DRONE_COMMIT_BRANCH/'"$DRONE_COMMIT_BRANCH"'/' start.sh
+ - sed -i 's/$DRONE_COMMIT_BRANCH/'"$DRONE_COMMIT_BRANCH"'/' Dockerfile
+ - sed -i 's/$DRONE_COMMIT_BRANCH/'"$DRONE_COMMIT_BRANCH"'/' .dockerignore
+ - sed -i 's/$DRONE_COMMIT_BRANCH/'"$DRONE_COMMIT_BRANCH"'/' deployment.yml
+ - sed -i 's/$DRONE_COMMIT/'"$DRONE_COMMIT"'/' deployment.yml
+ # docker登录,不能在脚本中登录,并且不能使用docker login -u -p
+ - echo $DOCKER_PASSWORD | docker login $REGISTRY --username $DOCKER_USERNAME --password-stdin
+ - chmod +x docker.sh
+# - cp -r /app/skywalking ./
+ - sh docker.sh
+ # 执行完脚本删除本次制作的docker镜像,避免多次后当前runner空间不足
+ - docker rmi -f $(docker images | grep $DRONE_COMMIT_BRANCH | awk '{print $3}')
+
+
+ - name: deploy # rancher运行
+ image: bitnami/kubectl:1.26.13-debian-11-r1 #阿里云的kubectl镜像,里面包含kubectl命令行工具
+ volumes: # 将容器内目录挂载到宿主机
+ - name: maven-build
+ path: /app/build # 将应用打包好的Jar和执行脚本挂载出来
+ - name: config
+ path: /app/config # 将kubectl 配置文件挂载出来
+ commands: # 定义在Docker容器中执行的shell命令
+ - cd /app/build/$DRONE_COMMIT_BRANCH
+ # 通过kubectl指令运行deployment.yml,并指定授权文件kubectl_conf.yml
+ - kubectl apply -f deployment.yml -n fateverse --kubeconfig=/app/config/base-taishan-kubectl.yml
+
+
+
+volumes:
+ - name: maven-build
+ host:
+ path: /home/build/fateverse
+ - name: skywalking
+ host:
+ path: /home/skywalking-agent
+ - name: config # k8s对接的配置文件
+ host:
+ path: /home/kubect
+ - name: maven-cache
+ host:
+ path: /home/data/maven/cache
+ - name: docker
+ host:
+ path: /var/run/docker.sock
+# 定义触发条件
+trigger:
+ branch:
+ - gateway
+ - auth
+ - admin-biz
+ - notice-biz
+ - log-biz
+ - monitor
+ - code-gen
+ - custom-query
+ - sentinel-dashboard
+ - sentinel-dashboard-pro
+ - code-gen-test-mysql
+ - workflow
+ - flowable
+
+ event:
+ - push
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e29b398
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,36 @@
+.gradle
+/build/
+!gradle/wrapper/gradle-wrapper.jar
+
+**/target/
+#**/resources/bootstrap.yml
+#common/common-log/pom.xml
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..c453a69
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,18 @@
+FROM openjdk:11.0.10-jre
+VOLUME /tmp
+RUN useradd -b /home -m -s /bin/bash clay
+RUN chmod a+xr -R /home/clay && chown clay:clay -R /home/clay
+#COPY skywalking /home/clay/skywalking-agent
+#RUN chmod a+xr -R /home/clay/skywalking-agent && chown clay:clay -R /home/clay/skywalking-agent
+USER clay
+ARG NAME=$DRONE_COMMIT_BRANCH
+COPY ./$NAME.jar /home/clay/$NAME.jar
+COPY start.sh /home/clay/start.sh
+WORKDIR /home/clay
+RUN mkdir -p /home/clay/logs && touch /home/clay/logs/spring.log
+#RUN mkdir -p /home/clay/code
+#RUN chmod 777 /home/clay/code
+#RUN mkdir -p /home/clay/skywalking-agent/logs && touch /home/clay/skywalking-agent/logs/skywalking-api.log
+ENV REF_NAME dev
+EXPOSE 8080
+CMD bash /home/clay/start.sh $REF_NAME && echo "start logging..." && : > /home/clay/logs/spring.log && tail -F -n 500 /home/clay/logs/spring.log
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..872deba
--- /dev/null
+++ b/README.md
@@ -0,0 +1,70 @@
+# 系统说明
+
+- 基于 Spring Cloud 2021 、Spring Boot 2.7、 Spring Security 的权限管理系统
+- 采用前后端分离的模式,前端(基于 FateVerse-React, FateVerse-Vue)
+- 注册中心,配置中心使用Nacos,权限认证使用Spring Security + Redis
+- 流量控制使用Sentinel,分布式事务选用Seata
+- gitea+drone+harbor+rancher全套部署流程
+
+## 快速开始
+
+### 核心依赖
+
+| 依赖 | 版本 |
+|----------------------|------------|
+| Spring Boot | 2.7.5 |
+| Spring Cloud | 2021.0.5 |
+| Spring Cloud Alibaba | 2021.0.4.0 |
+| Mybatis | 3.5.2 |
+| Vue | 3.1.3 |
+| React | 3.1.3 |
+
+### 模块说明
+
+```lua
+FateVerse
+├── auth -- 授权服务提供
+└── common -- 系统公共模块
+ ├── common-code -- 代码引擎的基础封装
+ ├── common-core -- 公共工具类核心包
+ ├── common-decrypt -- 加密模块
+ ├── common-dubbo -- dubbo rpc服务
+ ├── common-email -- 邮件发送服务
+ ├── common-excel -- excel导出模块
+ ├── common-file -- 分布式文件存储
+ ├── common-lock -- 分布式锁模块
+ ├── common-mybatis -- mybatis 扩展封装
+ ├── common-mybatis-puls -- mybatis-puls 扩展封装
+ ├── common-redis -- redis序列化封装
+ ├── common-seata -- seata模块
+ ├── common-security -- 系统权限控制模块
+ ├── common-swagger -- swagger接口文档
+ └── common-log -- 系统日志记录
+└── notice -- 通用消息公告模块
+ ├── notice-api -- 通用消息公告模块公共api模块
+ └── notice-biz -- 通用消息公告模块业务处理模块[5000]
+└── admin -- 通用用户权限管理模块
+ ├── admin-api -- 通用用户权限管理系统公共api模块
+ └── admin-biz -- 通用用户权限管理系统业务处理模块[4000]
+├── sql -- 数据库文件
+└── visual -- 图形化管理模块
+ ├── code-gen -- 代码生成模块
+ ├── monitor -- 服务监控
+ └── sentinel-dashboard -- sentinel 官方版
+└── nacos_config.zip -- nacos基础配置
+```
+
+### 本地开发 运行
+
+### 对象存储
+
+在 SpringBoot **FTP**、**minio**、**FastDFS**、**阿里云OSS**
+
+### 系统架构图
+
+
+
+### 压力测试
+
+- 4*8 单节点测试结果
+ 
\ No newline at end of file
diff --git a/admin/admin-api/pom.xml b/admin/admin-api/pom.xml
new file mode 100644
index 0000000..1231232
--- /dev/null
+++ b/admin/admin-api/pom.xml
@@ -0,0 +1,34 @@
+
+
+
+ admin
+ cn.fateverse
+ 1.0.0
+
+ 4.0.0
+
+ admin-api
+
+
+
+ cn.fateverse
+ common-dubbo
+
+
+ cn.fateverse
+ common-core
+
+
+ cn.fateverse
+ common-swagger
+ true
+
+
+ cn.fateverse
+ common-decrypt
+ true
+
+
+
\ No newline at end of file
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/dto/ConfigDto.java b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/ConfigDto.java
new file mode 100644
index 0000000..2f1b254
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/ConfigDto.java
@@ -0,0 +1,71 @@
+package cn.fateverse.admin.dto;
+
+import cn.fateverse.admin.entity.Config;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 参数配置表对象 sys_config
+ *
+ * @author clay
+ * @date 2023-06-09
+ */
+@Data
+@ApiModel("参数配置表Dto")
+public class ConfigDto {
+
+ /**
+ * 参数主键
+ */
+ @ApiModelProperty("参数主键")
+ private Integer configId;
+
+ /**
+ * 参数名称
+ */
+ @NotNull(message = "参数名称不能为空!")
+ @ApiModelProperty("参数名称")
+ private String configName;
+
+ /**
+ * 参数键名
+ */
+ @NotNull(message = "参数键名不能为空!")
+ @ApiModelProperty("参数键名")
+ private String configKey;
+
+ /**
+ * 参数键值
+ */
+ @NotNull(message = "参数键值不能为空!")
+ @ApiModelProperty("参数键值")
+ private String configValue;
+
+ /**
+ * 系统内置(1是 0否)
+ */
+ @NotNull(message = "是否系统内置不能为空!")
+ @ApiModelProperty("系统内置(1是 0否)")
+ private Integer configType;
+
+ /**
+ * 备注
+ */
+ @ApiModelProperty("备注")
+ private String remark;
+
+ public Config toConfig() {
+ Config build = Config.builder()
+ .configId(configId)
+ .configName(configName)
+ .configKey(configKey)
+ .configValue(configValue)
+ .configType(configType)
+ .build();
+ build.setRemark(remark);
+ return build;
+ }
+}
\ No newline at end of file
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/dto/DeptDto.java b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/DeptDto.java
new file mode 100644
index 0000000..f2db241
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/DeptDto.java
@@ -0,0 +1,83 @@
+package cn.fateverse.admin.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+/**
+ * 部门表 sys_dept
+ *
+ * @author Clay
+ * @date 2022/10/30
+ */
+@Data
+public class DeptDto {
+
+
+ /**
+ * 部门ID
+ */
+ private Long deptId;
+
+ /**
+ * 父部门ID
+ */
+ private Long parentId;
+
+ /**
+ * 祖级列表
+ */
+ private String ancestors;
+
+ /**
+ * 部门名称
+ */
+ @NotBlank(message = "部门名称不能为空!")
+ private String deptName;
+
+ /**
+ * 显示顺序
+ */
+ @NotNull(message = "显示顺序不能为空!")
+ private Integer orderNum;
+
+ /**
+ * 负责人
+ */
+ @NotBlank(message = "负责人不能为空!")
+ private String leader;
+
+ /**
+ * 负责人id
+ */
+ @NotNull(message = "负责人id不能为空!")
+ private Long leaderId;
+
+ /**
+ * 联系电话
+ */
+ @Pattern(message = "手机号格式错误!",regexp = "^1[0-9]{10}$")
+ private String phone;
+
+ /**
+ * 邮箱
+ */
+ @Email(message = "邮箱格式错误!")
+ private String email;
+
+ /**
+ * 部门状态:1正常,0停用
+ */
+ private String state;
+
+ /**
+ * 删除标志(0代表存在 2代表删除)
+ */
+ private String delFlag;
+
+
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/dto/DictDataDto.java b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/DictDataDto.java
new file mode 100644
index 0000000..6121316
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/DictDataDto.java
@@ -0,0 +1,70 @@
+package cn.fateverse.admin.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author Clay
+ * @date 2023/5/18
+ */
+@Data
+@ApiModel("字典数据实体")
+public class DictDataDto {
+ /**
+ * 字典编码
+ */
+ private Long dictCode;
+ /**
+ * 字典排序
+ */
+ @ApiModelProperty("字典排序")
+ @NotNull(message = "状态不能为空!")
+ private Integer dictSort;
+ /**
+ * 字典标签
+ */
+ @ApiModelProperty("字典标签")
+ @NotNull(message = "字典标签不能为空!")
+ private String dictLabel;
+ /**
+ * 字典键值
+ */
+ @ApiModelProperty("字典键值")
+ @NotNull(message = "字典键值不能为空!")
+ private String dictValue;
+ /**
+ * 字典类型
+ */
+ @ApiModelProperty("字典类型")
+ @NotNull(message = "字典类型不能为空!")
+ private String dictType;
+ /**
+ * 样式属性(其他样式扩展)
+ */
+ @ApiModelProperty("样式属性(其他样式扩展)")
+ private Boolean isType;
+ /**
+ * 表格回显样式
+ */
+ @ApiModelProperty("表格回显样式")
+ private String listClass;
+ /**
+ * 字典显示主题(ui框架时)or文字颜色(自定义颜色时)
+ */
+ @ApiModelProperty("字典显示主题(ui框架时)or文字颜色(自定义颜色时)")
+ private String theme;
+ /**
+ * 是否默认(Y是 N否)
+ */
+ @ApiModelProperty("是否默认(Y是 N否)")
+ private Integer isDefault;
+ /**
+ * 状态(1正常 0停用)
+ */
+ @ApiModelProperty(value = "状态(1正常 0停用)",required = true)
+ @NotNull(message = "状态不能为空!")
+ private String state;
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/dto/DictTypeDto.java b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/DictTypeDto.java
new file mode 100644
index 0000000..ed01f09
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/DictTypeDto.java
@@ -0,0 +1,42 @@
+package cn.fateverse.admin.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author Clay
+ * @date 2022/11/9
+ */
+@Data
+@ApiModel("字典类型实体")
+public class DictTypeDto {
+
+ /**
+ * 字典主键
+ */
+ @ApiModelProperty("字典主键")
+ private Long dictId;
+ /**
+ * 字典名称
+ */
+ @ApiModelProperty("字典名称")
+ @NotNull(message = "字典名称不能为空!")
+ private String dictName;
+ /**
+ * 字典类型
+ */
+ @ApiModelProperty("字典类型")
+ @NotNull(message = "字典类型不能为空!")
+ private String dictType;
+ /**
+ * 字典状态(1正常 0停用)
+ */
+ @ApiModelProperty("字典状态")
+ @NotNull(message = "字典状态不能为空!")
+ private String state;
+
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/dto/IpBackDto.java b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/IpBackDto.java
new file mode 100644
index 0000000..56f7cb6
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/IpBackDto.java
@@ -0,0 +1,26 @@
+package cn.fateverse.admin.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author Clay
+ * @date 2023-10-22
+ */
+@Data
+public class IpBackDto {
+ /**
+ * 主键id
+ */
+ @ApiModelProperty("主键id")
+ private Long id;
+ /**
+ * ip地址
+ */
+ @NotBlank(message = "ip地址不能为空")
+ @ApiModelProperty("ip地址")
+ private String ipAddr;
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/dto/MappingSwitchDto.java b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/MappingSwitchDto.java
new file mode 100644
index 0000000..475fd56
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/MappingSwitchDto.java
@@ -0,0 +1,33 @@
+package cn.fateverse.admin.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import cn.fateverse.common.decrypt.annotation.EncryptField;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author Clay
+ * @date 2024/2/5 16:37
+ */
+@Data
+@ApiModel("接口开关Dto")
+public class MappingSwitchDto {
+ /**
+ * key作为唯一编号
+ */
+ @NotBlank(message = "唯一编号不能为空")
+ @ApiModelProperty("唯一编号不能为空")
+ @EncryptField
+ private String key;
+
+ /**
+ * 当前方法的状态,true为正常放行,false为关闭
+ */
+ @NotNull(message = "状态不能为空")
+ @ApiModelProperty("当前方法的状态,true为正常放行,false为关闭")
+ private Boolean state;
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/dto/MenuDto.java b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/MenuDto.java
new file mode 100644
index 0000000..48fd9a8
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/MenuDto.java
@@ -0,0 +1,114 @@
+package cn.fateverse.admin.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * 菜单详细返回对象
+ *
+ * @author Clay
+ */
+@Data
+@ApiModel("菜单")
+public class MenuDto implements Serializable {
+
+ /**
+ * 菜单ID
+ */
+ @ApiModelProperty("菜单ID")
+ private Long menuId;
+
+ /**
+ * 菜单名称
+ */
+ @NotBlank(message = "菜单名称不能为空")
+ @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符")
+ @ApiModelProperty("菜单名称")
+ private String menuName;
+
+ /**
+ * 父菜单ID
+ */
+ @ApiModelProperty("父菜单ID")
+ private Long parentId;
+
+ /**
+ * 显示顺序
+ */
+ @ApiModelProperty("显示顺序")
+ @NotNull(message = "显示顺序不能为空")
+ private Integer orderNum;
+
+ /**
+ * 路由地址
+ */
+ @ApiModelProperty("路由地址")
+ @Size(min = 0, max = 200, message = "路由地址不能超过200个字符")
+ private String path;
+
+ @ApiModelProperty("路径参数")
+ private String pathParams;
+
+ /**
+ * 组件路径
+ */
+ @ApiModelProperty("组件路径")
+ @Size(min = 0, max = 200, message = "组件路径不能超过255个字符")
+ private String component;
+
+ /**
+ * 是否为外链(0是 1否)
+ */
+ @ApiModelProperty("是否为外链(0是 1否)")
+ private Boolean isFrame;
+
+ /**
+ * 是否缓存(0缓存 1不缓存)
+ */
+ @ApiModelProperty("是否缓存(0缓存 1不缓存)")
+ private Boolean isCache;
+
+ @ApiModelProperty("不重定向")
+ private Boolean noRedirect;
+
+ @ApiModelProperty("面包屑")
+ private Boolean breadcrumb;
+
+ /**
+ * 类型(D目录 M菜单 B按钮)
+ */
+ @ApiModelProperty("类型(D目录 M菜单 B按钮)")
+ @NotBlank(message = "菜单类型不能为空")
+ private String menuType;
+
+ /**
+ * 显示状态(0显示 1隐藏)
+ */
+ @ApiModelProperty("显示状态(0显示 1隐藏)")
+ private String visible;
+
+ /**
+ * 菜单状态(0显示 1隐藏)
+ */
+ @ApiModelProperty("菜单状态(0显示 1隐藏)")
+ private String state;
+
+ /**
+ * 权限字符串
+ */
+ @ApiModelProperty("权限字符串")
+ @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符")
+ private String perms;
+
+ /**
+ * 菜单图标
+ */
+ @ApiModelProperty("菜单图标")
+ private String icon;
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/dto/PostDto.java b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/PostDto.java
new file mode 100644
index 0000000..abc2f7c
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/PostDto.java
@@ -0,0 +1,47 @@
+package cn.fateverse.admin.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author Clay
+ * @date 2022/11/26
+ */
+@Data
+@ApiModel("岗位实体")
+public class PostDto {
+
+ /**
+ * 岗位ID
+ */
+ @ApiModelProperty("岗位ID")
+ private Long postId;
+ /**
+ * 岗位编码
+ */
+ @ApiModelProperty("岗位编码")
+ @NotNull(message = "岗位编码不能为空!")
+ private String postCode;
+ /**
+ * 岗位名称
+ */
+ @ApiModelProperty("岗位名称")
+ @NotNull(message = "岗位名称不能为空!")
+ private String postName;
+ /**
+ * 显示顺序
+ */
+ @ApiModelProperty("显示顺序")
+ @NotNull(message = "显示顺序不能为空!")
+ private Integer postSort;
+ /**
+ * 状态(1正常 0停用)
+ */
+ @ApiModelProperty("状态(1正常 0停用)")
+ @NotNull(message = "状态不能为空!")
+ private String state;
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/dto/RoleDto.java b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/RoleDto.java
new file mode 100644
index 0000000..a380c1c
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/RoleDto.java
@@ -0,0 +1,87 @@
+package cn.fateverse.admin.dto;
+
+import cn.fateverse.admin.entity.Role;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Set;
+
+/**
+ * @author Clay
+ * @date 2022/11/5
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("角色接受对象")
+public class RoleDto {
+
+ /**
+ * 角色ID
+ */
+ @ApiModelProperty("角色id")
+ private Long roleId;
+
+ /**
+ * 角色名称
+ */
+ @ApiModelProperty("角色名称")
+ @NotBlank(message = "角色名称不能为空!")
+ private String roleName;
+
+ /**
+ * 角色关键词
+ */
+ @ApiModelProperty("角色关键词")
+ @NotBlank(message = "角色关键词不能为空!")
+ private String roleKey;
+
+ /**
+ * 角色排序
+ */
+ @ApiModelProperty("角色排序")
+ @NotNull(message = "角色排序不能为空!")
+ private Integer roleSort;
+
+ /**
+ * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限)
+ */
+ @ApiModelProperty("数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限)")
+ private String dataScope;
+
+ /**
+ * 角色状态(1正常 0停用)
+ */
+ @ApiModelProperty("角色状态(1正常 0停用)")
+ @NotBlank(message = "角色状态不能为空!")
+ private String state;
+
+ /**
+ * 菜单组
+ */
+ @ApiModelProperty("菜单组")
+ private Set menuIds;
+
+ /**
+ * 部门组(数据权限)
+ */
+ @ApiModelProperty("部门组(数据权限)")
+ private Long[] deptIds;
+
+ public Role toRole() {
+ return Role.builder()
+ .roleId(roleId)
+ .roleName(roleName)
+ .roleKey(roleKey)
+ .roleSort(roleSort)
+ .dataScope(dataScope)
+ .state(state)
+ .delFlag("0")
+ .build();
+ }
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/dto/UserDto.java b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/UserDto.java
new file mode 100644
index 0000000..14cd0f3
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/dto/UserDto.java
@@ -0,0 +1,100 @@
+package cn.fateverse.admin.dto;
+
+import cn.fateverse.admin.entity.UserBase;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.util.List;
+
+/**
+ * @author Clay
+ * @date 2022/11/7
+ */
+@Data
+@ApiModel("用户返回实体")
+public class UserDto{
+
+
+ /**
+ * 用户ID
+ */
+ private Long userId;
+
+ /**
+ * 部门ID
+ */
+ private Long deptId;
+
+ /**
+ * 用户账号
+ */
+ @NotBlank(message = "用户名称不能为空")
+ @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
+ private String userName;
+
+ /**
+ * 用户昵称
+ */
+ @NotBlank(message = "用户昵称不能为空")
+ @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
+ private String nickName;
+
+ /**
+ * 用户邮箱
+ */
+ @Email(message = "邮箱格式不正确")
+ @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
+ private String email;
+
+ /**
+ * 手机号码
+ */
+ @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符")
+ private String phoneNumber;
+
+ /**
+ * 用户性别
+ */
+ private String sex;
+
+ /**
+ * 密码
+ */
+ private String password;
+
+ /**
+ * 帐号状态(1正常 0停用)
+ */
+ private String state;
+
+ /**
+ * 岗位ids
+ */
+ @ApiModelProperty("岗位ids")
+ private List postIds;
+ /**
+ * 角色ids
+ */
+ @ApiModelProperty("角色ids")
+ private List roleIds;
+
+
+ public UserBase toUser() {
+ return UserBase.builder()
+ .userId(userId)
+ .deptId(deptId)
+ .userName(userName)
+ .nickName(nickName)
+ .email(email)
+ .phoneNumber(phoneNumber)
+ .sex(sex)
+ .password(password)
+ .state(state)
+ .build();
+ }
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/dubbo/DubboDeptService.java b/admin/admin-api/src/main/java/cn/fateverse/admin/dubbo/DubboDeptService.java
new file mode 100644
index 0000000..ac503d8
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/dubbo/DubboDeptService.java
@@ -0,0 +1,19 @@
+package cn.fateverse.admin.dubbo;
+
+import cn.fateverse.admin.vo.DeptVo;
+
+import java.util.List;
+
+/**
+ * @author Clay
+ * @date 2023-02-20
+ */
+public interface DubboDeptService {
+ /**
+ * 通过部门id获取到部门信息
+ *
+ * @param deptIds 部门列表
+ * @return 返回部门信息
+ */
+ List searchDeptByDeptId(List deptIds);
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/dubbo/DubboDictDataService.java b/admin/admin-api/src/main/java/cn/fateverse/admin/dubbo/DubboDictDataService.java
new file mode 100644
index 0000000..ede1f0d
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/dubbo/DubboDictDataService.java
@@ -0,0 +1,23 @@
+package cn.fateverse.admin.dubbo;
+
+import cn.fateverse.admin.vo.DictDataVo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Clay
+ * @date 2023-02-20
+ */
+
+public interface DubboDictDataService {
+
+ /**
+ * 获取到字典缓存
+ *
+ * @param cacheKeys 字典缓存key
+ * @return 映射完成的字典对象
+ */
+ Map> searchDictDataCacheKeys(List cacheKeys);
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/dubbo/DubboMenuService.java b/admin/admin-api/src/main/java/cn/fateverse/admin/dubbo/DubboMenuService.java
new file mode 100644
index 0000000..c6f4022
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/dubbo/DubboMenuService.java
@@ -0,0 +1,55 @@
+package cn.fateverse.admin.dubbo;
+
+import cn.fateverse.admin.dto.MenuDto;
+import cn.fateverse.admin.vo.MenuVo;
+import cn.fateverse.admin.vo.RouterVo;
+import cn.fateverse.common.core.result.Result;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Clay
+ * @date 2023-02-20
+ */
+public interface DubboMenuService {
+ /**
+ * 获取到用户的菜单权限信息
+ *
+ * @param userId 用户id
+ * @return 当前用户的权限信息
+ */
+ Set selectMenuPermsByUserId(Long userId);
+
+ /**
+ * 保存登录信息
+ *
+ * @param userId 用户id
+ * @return 当前用户的路由信息
+ */
+ List selectMenuRouterByUserId(Long userId);
+
+ /**
+ * 新增菜单
+ *
+ * @param menuDto 菜单对象
+ * @return 操作结果
+ */
+ Result insertMenu(MenuDto menuDto);
+
+ /**
+ * 删除菜单
+ *
+ * @param menuId 菜单id
+ */
+ void removeMenu(Long menuId);
+
+ /**
+ * 根据id查询父级菜单信息
+ *
+ * @param menuId 父级菜单
+ * @return 菜单信息
+ */
+ Result selectMenuByMenuId(Long menuId);
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/dubbo/DubboRoleService.java b/admin/admin-api/src/main/java/cn/fateverse/admin/dubbo/DubboRoleService.java
new file mode 100644
index 0000000..9157d60
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/dubbo/DubboRoleService.java
@@ -0,0 +1,18 @@
+package cn.fateverse.admin.dubbo;
+
+import java.util.List;
+
+/**
+ * @author Clay
+ * @date 2023-05-06
+ */
+public interface DubboRoleService {
+
+ /**
+ * 根据角色id获取到角色name
+ *
+ * @param roleIds 角色id
+ * @return 角色名称
+ */
+ List searchRoleNameByIds(List roleIds);
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/dubbo/DubboUserService.java b/admin/admin-api/src/main/java/cn/fateverse/admin/dubbo/DubboUserService.java
new file mode 100644
index 0000000..375a372
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/dubbo/DubboUserService.java
@@ -0,0 +1,60 @@
+package cn.fateverse.admin.dubbo;
+
+import cn.fateverse.admin.entity.User;
+import cn.fateverse.admin.vo.UserVo;
+
+import java.util.List;
+
+/**
+ * @author Clay
+ * @date 2023-02-20
+ */
+
+public interface DubboUserService {
+ /**
+ * 通过用户名查询用户信息
+ *
+ * @param username 用户名称
+ * @return 用户信息
+ */
+ User getUserByUsername(String username);
+
+ /**
+ * 根据用户id查询用户信息
+ *
+ * @param userId 用户id
+ * @return 用户信息
+ */
+ User getUserByUserId(Long userId);
+
+ /**
+ * 根据roleId查询用户列表
+ *
+ * @param roleIds 角色id列表
+ * @return 用户信息列表
+ */
+ List searchUserListByRoleIds(List roleIds);
+
+ /**
+ * 根据用户id查询用户信息
+ *
+ * @param userIds 用户id列表
+ * @return 用户信息列表
+ */
+ List searchUserListByUserIds(List userIds);
+
+ /**
+ * 根据部门id查询用户信息
+ *
+ * @param deptIds 部门信息列表
+ * @return 部门列表
+ */
+ List searchUserByDeptIds(List deptIds);
+
+ /**
+ * 获取所有的用户id
+ *
+ * @return 所有用户的id
+ */
+ List searchAllUserIds();
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/entity/Config.java b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/Config.java
new file mode 100644
index 0000000..7e177b9
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/Config.java
@@ -0,0 +1,49 @@
+package cn.fateverse.admin.entity;
+
+import cn.fateverse.common.core.annotaion.EnableAutoField;
+import cn.fateverse.common.core.entity.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+
+/**
+ * 参数配置表对象 sys_config
+ *
+ * @author clay
+ * @date 2023-06-09
+*/
+@Data
+@Builder
+@EnableAutoField
+@AllArgsConstructor
+@NoArgsConstructor
+public class Config extends BaseEntity{
+
+ /**
+ * 参数主键
+ */
+ private Integer configId;
+
+ /**
+ * 参数名称
+ */
+ private String configName;
+
+ /**
+ * 参数键名
+ */
+ private String configKey;
+
+ /**
+ * 参数键值
+ */
+ private String configValue;
+
+ /**
+ * 系统内置(1是 0否)
+ */
+ private Integer configType;
+
+}
\ No newline at end of file
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/entity/Dept.java b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/Dept.java
new file mode 100644
index 0000000..0dbdde3
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/Dept.java
@@ -0,0 +1,86 @@
+package cn.fateverse.admin.entity;
+
+import cn.fateverse.common.core.annotaion.EnableAutoField;
+import cn.fateverse.common.core.entity.BaseEntity;
+import lombok.Data;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+/**
+ * 部门表 sys_dept
+ *
+ * @author Clay
+ * @date 2022/10/30
+ */
+@Data
+@EnableAutoField
+public class Dept extends BaseEntity {
+
+
+ /**
+ * 部门ID
+ */
+ private Long deptId;
+
+ /**
+ * 父部门ID
+ */
+ private Long parentId;
+
+ /**
+ * 祖级列表
+ */
+ private String ancestors;
+
+ /**
+ * 部门名称
+ */
+ @NotBlank(message = "部门名称不能为空!")
+ private String deptName;
+
+ /**
+ * 显示顺序
+ */
+ @NotNull(message = "显示顺序不能为空!")
+ private Integer orderNum;
+
+ /**
+ * 负责人
+ */
+ @NotBlank(message = "负责人不能为空!")
+ private String leader;
+
+ /**
+ * 负责人id
+ */
+ @NotNull(message = "负责人id不能为空!")
+ private Long leaderId;
+
+ /**
+ * 联系电话
+ */
+ @Pattern(message = "手机号格式错误!",regexp = "^1[0-9]{10}$")
+ private String phone;
+
+ /**
+ * 邮箱
+ */
+ @Email(message = "邮箱格式错误!")
+ private String email;
+
+ /**
+ * 部门状态:1正常,0停用
+ */
+ private String state;
+
+ /**
+ * 删除标志(0代表存在 2代表删除)
+ */
+ private String delFlag;
+
+
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/entity/DictData.java b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/DictData.java
new file mode 100644
index 0000000..bf09558
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/DictData.java
@@ -0,0 +1,141 @@
+package cn.fateverse.admin.entity;
+
+import cn.fateverse.admin.dto.DictDataDto;
+import cn.fateverse.admin.vo.DictDataSimpVo;
+import cn.fateverse.admin.vo.DictDataVo;
+import cn.fateverse.common.core.annotaion.EnableAutoField;
+import cn.fateverse.common.core.entity.BaseEntity;
+import cn.fateverse.common.core.entity.Option;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.BeanUtils;
+
+/**
+ * @author Clay
+ * @date 2022/11/9
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@EnableAutoField
+public class DictData extends BaseEntity {
+ /**
+ * 字典编码
+ */
+ private Long dictCode;
+ /**
+ * 字典排序
+ */
+ private Integer dictSort;
+ /**
+ * 字典标签
+ */
+ private String dictLabel;
+ /**
+ * 字典键值
+ */
+ private String dictValue;
+ /**
+ * 字典类型
+ */
+ private String dictType;
+ /**
+ * 样式属性(其他样式扩展)
+ */
+ private Boolean isType;
+ /**
+ * 表格回显样式
+ */
+ private String listClass;
+ /**
+ * 字典显示主题(ui框架时)or文字颜色(自定义颜色时)
+ */
+ private String theme;
+ /**
+ * 是否默认(Y是 N否)
+ */
+ private Integer isDefault;
+ /**
+ * 状态(1正常 0停用)
+ */
+ private String state;
+
+ public static DictData toDictData(DictDataDto dto) {
+ return DictData.builder()
+ .dictCode(dto.getDictCode())
+ .dictSort(dto.getDictSort())
+ .dictLabel(dto.getDictLabel())
+ .dictValue(dto.getDictValue())
+ .dictType(dto.getDictType())
+ .isType(dto.getIsType())
+ .listClass(dto.getListClass())
+ .theme(dto.getTheme())
+ .isDefault(dto.getIsDefault())
+ .state(dto.getState())
+ .build();
+ }
+
+ public static DictDataVo toDictDataListVo(DictData dict) {
+ return DictDataVo.builder()
+ .dictCode(dict.getDictCode())
+ .dictLabel(dict.getDictLabel())
+ .dictSort(dict.getDictSort())
+ .dictValue(dict.getDictValue())
+ .dictType(dict.getDictType())
+ .isDefault(dict.getIsDefault())
+ .isType(dict.getIsType())
+ .state(dict.getState())
+ .listClass(dict.getListClass())
+ .theme(dict.getTheme())
+ .createTime(dict.getCreateTime())
+ .build();
+ }
+
+ /**
+ * 字典对象转换成为Option对象
+ *
+ * @param dictData 字典对象
+ * @return Option选项
+ */
+ public static Option dictDataToOption(DictData dictData) {
+ return Option.builder()
+ .value(dictData.getDictValue())
+ .label(dictData.getDictLabel())
+ .build();
+ }
+
+
+ /**
+ * 将DictData对象转换为DictDataVo对象
+ *
+ * @param dict 待转换的DictData对象
+ * @return 转换后的DictDataVo对象
+ */
+ public static DictDataVo toDictDataVo(DictData dict) {
+ DictDataVo dataVo = new DictDataVo();
+ BeanUtils.copyProperties(dict, dataVo);
+ return dataVo;
+ }
+
+
+ /**
+ * 字典对象转换成为简单的字典返回Vo
+ *
+ * @param dictData 字典对象
+ * @return 简单vo对象
+ */
+ public static DictDataSimpVo toDictDataSimpVo(DictData dictData) {
+ return DictDataSimpVo.builder()
+ .label(dictData.getDictLabel())
+ .value(dictData.getDictValue())
+ .isType(dictData.getIsType())
+ .listClass(dictData.getListClass())
+ .theme(dictData.getTheme())
+ .isDefault(dictData.getIsDefault())
+ .build();
+ }
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/entity/DictType.java b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/DictType.java
new file mode 100644
index 0000000..53b31dd
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/DictType.java
@@ -0,0 +1,45 @@
+package cn.fateverse.admin.entity;
+
+import cn.fateverse.common.core.annotaion.EnableAutoField;
+import cn.fateverse.common.core.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author Clay
+ * @date 2022/11/9
+ */
+@Data
+@EnableAutoField
+@ApiModel("字典类型实体")
+public class DictType extends BaseEntity {
+
+ /**
+ * 字典主键
+ */
+ @ApiModelProperty("字典主键")
+ private Long dictId;
+ /**
+ * 字典名称
+ */
+ @ApiModelProperty("字典名称")
+ @NotNull(message = "字典名称不能为空!")
+ private String dictName;
+ /**
+ * 字典类型
+ */
+ @ApiModelProperty("字典类型")
+ @NotNull(message = "字典类型不能为空!")
+ private String dictType;
+ /**
+ * 字典状态(1正常 0停用)
+ */
+ @ApiModelProperty("字典状态")
+ @NotNull(message = "字典状态不能为空!")
+ private String state;
+
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/entity/IpBack.java b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/IpBack.java
new file mode 100644
index 0000000..b0aa6e4
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/IpBack.java
@@ -0,0 +1,38 @@
+package cn.fateverse.admin.entity;
+
+import cn.fateverse.admin.vo.IpBackVo;
+import cn.fateverse.common.core.annotaion.EnableAutoField;
+import cn.fateverse.common.core.entity.BaseEntity;
+import lombok.Data;
+
+/**
+ * @author Clay
+ * @date 2023-10-22
+ */
+@Data
+@EnableAutoField
+public class IpBack extends BaseEntity {
+ /**
+ * 主键id
+ */
+ private Long id;
+ /**
+ * ip地址
+ */
+ private String ipAddr;
+ /**
+ * ip类型 ipv4 ipv6
+ */
+ private String type;
+
+ public IpBackVo toIPBackVo(){
+ return IpBackVo.builder()
+ .id(id)
+ .ipAddr(ipAddr)
+ .type(type)
+ .createTime(getCreateTime())
+ .remark(getRemark())
+ .build();
+ }
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/entity/Menu.java b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/Menu.java
new file mode 100644
index 0000000..62a532e
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/Menu.java
@@ -0,0 +1,98 @@
+package cn.fateverse.admin.entity;
+
+import cn.fateverse.common.core.annotaion.EnableAutoField;
+import cn.fateverse.common.core.entity.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 菜单权限表 sys_menu
+ *
+ * @author Clay
+ */
+@Data
+@Builder
+@EnableAutoField
+@NoArgsConstructor
+@AllArgsConstructor
+public class Menu extends BaseEntity {
+
+
+ /**
+ * 菜单ID
+ */
+ private Long menuId;
+
+ /**
+ * 菜单名称
+ */
+ private String menuName;
+
+ /**
+ * 父菜单ID
+ */
+ private Long parentId;
+
+ /**
+ * 显示顺序
+ */
+ private Integer orderNum;
+
+ /**
+ * 路由地址
+ */
+ private String path;
+
+ /**
+ * 路径参数
+ */
+ private String pathParams;
+
+ /**
+ * 组件路径
+ */
+ private String component;
+
+ /**
+ * 是否为外链(1是 0否)
+ */
+ private Boolean isFrame;
+
+ /**
+ * 是否缓存(1 缓存 0不缓存)
+ */
+ private Boolean isCache;
+
+
+ private Boolean noRedirect;
+
+
+ private Boolean breadcrumb;
+ /**
+ * 类型(D目录 M菜单 B按钮)
+ */
+ private String menuType;
+
+ /**
+ * 显示状态(1显示 0隐藏)
+ */
+ private String visible;
+
+ /**
+ * 菜单状态(1正常 0停用)
+ */
+ private String state;
+
+ /**
+ * 权限字符串
+ */
+ private String perms;
+
+ /**
+ * 菜单图标
+ */
+ private String icon;
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/entity/OnlineUser.java b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/OnlineUser.java
new file mode 100644
index 0000000..ad52a76
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/OnlineUser.java
@@ -0,0 +1,64 @@
+package cn.fateverse.admin.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author Clay
+ * @date 2022/11/13
+ */
+@Data
+@Builder
+@ApiModel("在线用户实体")
+public class OnlineUser {
+
+ /**
+ * 会话id
+ */
+ @ApiModelProperty("会话id")
+ private String tokenId;
+
+ /**
+ * 用户名
+ */
+ @ApiModelProperty("用户名")
+ private String username;
+
+ /**
+ * 部门名称
+ */
+ @ApiModelProperty("部门名称")
+ private String deptName;
+ /**
+ * 登录ip
+ */
+ @ApiModelProperty("登录ip")
+ private String ipAddr;
+ /**
+ * 登录地点
+ */
+ @ApiModelProperty("登录地点")
+ private String loginLocation;
+ /**
+ * 浏览器类型
+ */
+ @ApiModelProperty("浏览器类型")
+ private String browser;
+ /**
+ * 操作系统
+ */
+ @ApiModelProperty("操作系统")
+ private String os;
+
+ /**
+ * 登录时间
+ */
+ @ApiModelProperty("登录时间")
+ private Date loginTime;
+
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/entity/Post.java b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/Post.java
new file mode 100644
index 0000000..124c0f7
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/Post.java
@@ -0,0 +1,41 @@
+package cn.fateverse.admin.entity;
+
+import cn.fateverse.common.core.annotaion.EnableAutoField;
+import cn.fateverse.common.core.entity.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+
+/**
+ * @author Clay
+ * @date 2022/11/26
+ */
+@Data
+@EnableAutoField
+@AllArgsConstructor
+@NoArgsConstructor
+public class Post extends BaseEntity {
+
+ /**
+ * 岗位ID
+ */
+ private Long postId;
+ /**
+ * 岗位编码
+ */
+ private String postCode;
+ /**
+ * 岗位名称
+ */
+ private String postName;
+ /**
+ * 显示顺序
+ */
+ private Integer postSort;
+ /**
+ * 状态(1正常 0停用)
+ */
+ private String state;
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/entity/Role.java b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/Role.java
new file mode 100644
index 0000000..eb52b9a
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/Role.java
@@ -0,0 +1,77 @@
+package cn.fateverse.admin.entity;
+
+import cn.fateverse.common.core.annotaion.EnableAutoField;
+import cn.fateverse.common.core.entity.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+
+/**
+ *
+ * @author Clay
+ * @date 2022/10/30
+ */
+@Data
+@Builder
+@EnableAutoField
+@AllArgsConstructor
+@NoArgsConstructor
+public class Role extends BaseEntity {
+
+ /**
+ * 角色ID
+ */
+ private Long roleId;
+
+ /**
+ * 角色名称
+ */
+ private String roleName;
+
+ /**
+ * 角色关键词
+ */
+ private String roleKey;
+
+ /**
+ * 角色排序
+ */
+ private Integer roleSort;
+
+ /**
+ * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限)
+ */
+ private String dataScope;
+
+ /**
+ * 角色状态(1正常 0停用)
+ */
+ private String state;
+
+ /**
+ * 删除标志(0代表存在 1代表删除)
+ */
+ @JsonIgnore
+ private String delFlag;
+
+ private Integer roleType = 0;
+
+ @JsonIgnore
+ public boolean isAdmin() {
+ return isAdmin(this.roleId);
+ }
+
+ @JsonIgnore
+ public static boolean isAdmin(Long roleId) {
+ return roleId != null && 1L == roleId;
+ }
+
+ public Role(Long roleId) {
+ this.roleId = roleId;
+ }
+
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/entity/RoleMenu.java b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/RoleMenu.java
new file mode 100644
index 0000000..cb67989
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/RoleMenu.java
@@ -0,0 +1,22 @@
+package cn.fateverse.admin.entity;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @author Clay
+ * @date 2022/11/6
+ */
+@Data
+@Builder
+public class RoleMenu {
+ /**
+ * 角色id
+ */
+ private Long roleId;
+ /**
+ * 菜单id
+ */
+ private Long menuId;
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/entity/User.java b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/User.java
new file mode 100644
index 0000000..b8247b6
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/User.java
@@ -0,0 +1,36 @@
+package cn.fateverse.admin.entity;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author Clay
+ * @date 2022/10/27
+ */
+@Data
+public class User extends UserBase {
+
+
+ /**
+ * 部门对象
+ */
+ private Dept dept;
+
+ /**
+ * 角色对象
+ */
+ private List roles;
+
+
+ @JsonIgnore
+ public boolean isAdmin() {
+ return isAdmin(super.getUserId());
+ }
+
+ @JsonIgnore
+ public static boolean isAdmin(Long userId) {
+ return userId != null && 1L == userId;
+ }
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/entity/UserBase.java b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/UserBase.java
new file mode 100644
index 0000000..9646d59
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/UserBase.java
@@ -0,0 +1,112 @@
+package cn.fateverse.admin.entity;
+
+import cn.fateverse.common.core.annotaion.EnableAutoField;
+import cn.fateverse.common.core.entity.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author Clay
+ * @date 2022/11/7
+ */
+@Data
+@Builder
+@EnableAutoField
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserBase extends BaseEntity {
+
+ /**
+ * 用户ID
+ */
+ private Long userId;
+
+ /**
+ * 部门ID
+ */
+ private Long deptId;
+
+ /**
+ * 用户账号
+ */
+ private String userName;
+
+ /**
+ * 用户昵称
+ */
+ private String nickName;
+
+ /**
+ * 用户邮箱
+ */
+ private String email;
+
+ /**
+ * 手机号码
+ */
+ private String phoneNumber;
+
+ /**
+ * 用户性别
+ */
+ private String sex;
+
+ /**
+ * 用户头像
+ */
+ private String avatar;
+
+ /**
+ * 密码
+ */
+ private String password;
+
+ /**
+ * 盐加密
+ */
+ @JsonIgnore
+ private String salt;
+
+ /**
+ * 帐号状态(1正常 0停用)
+ */
+ private String state;
+
+ /**
+ * 删除标志(0代表存在 2代表删除)
+ */
+ @JsonIgnore
+ private String delFlag;
+ /**
+ * 用户类型
+ */
+ private String userType;
+
+ /**
+ * 一个微信开放平台帐号下的应用,同一用户的 union
+ */
+ private String unionId;
+ /**
+ * 用户唯一标识
+ */
+ private String openId;
+ /**
+ * 城市
+ */
+ private String city;
+
+ /**
+ * 最后登录IP
+ */
+ private String loginIp;
+
+ /**
+ * 最后登录时间
+ */
+ private Date loginDate;
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/entity/UserPost.java b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/UserPost.java
new file mode 100644
index 0000000..d5f4411
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/UserPost.java
@@ -0,0 +1,23 @@
+package cn.fateverse.admin.entity;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @author Clay
+ * @date 2022/11/26
+ */
+@Data
+@Builder
+public class UserPost {
+ /**
+ * 用户id
+ */
+ private Long userId;
+
+ /**
+ * 角色id
+ */
+ private Long postId;
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/entity/UserRole.java b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/UserRole.java
new file mode 100644
index 0000000..3923b5a
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/entity/UserRole.java
@@ -0,0 +1,24 @@
+package cn.fateverse.admin.entity;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @author Clay
+ * @date 2022/11/6
+ */
+@Data
+@Builder
+public class UserRole {
+
+ /**
+ * 用户id
+ */
+ private Long userId;
+
+ /**
+ * 角色id
+ */
+ private Long roleId;
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/query/ConfigQuery.java b/admin/admin-api/src/main/java/cn/fateverse/admin/query/ConfigQuery.java
new file mode 100644
index 0000000..435bda3
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/query/ConfigQuery.java
@@ -0,0 +1,38 @@
+package cn.fateverse.admin.query;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 参数配置表对象 sys_config
+ *
+ * @author clay
+ * @date 2023-06-09
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("参数配置表Query")
+public class ConfigQuery {
+
+ /**
+ * 参数名称
+ */
+ @ApiModelProperty("参数名称")
+ private String configName;
+
+ /**
+ * 参数键名
+ */
+ @ApiModelProperty("参数键名")
+ private String configKey;
+
+ /**
+ * 系统内置(1是 0否)
+ */
+ @ApiModelProperty("系统内置(1是 0否)")
+ private Integer configType;
+}
\ No newline at end of file
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/query/DictDataQuery.java b/admin/admin-api/src/main/java/cn/fateverse/admin/query/DictDataQuery.java
new file mode 100644
index 0000000..619d0d3
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/query/DictDataQuery.java
@@ -0,0 +1,28 @@
+package cn.fateverse.admin.query;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Clay
+ * @date 2022/11/9
+ */
+@Data
+public class DictDataQuery {
+
+ /**
+ * 字典类型
+ */
+ @ApiModelProperty(value = "字典名称",required = true)
+ private String dictType;
+ /**
+ * 字典标签
+ */
+ @ApiModelProperty("字典标签")
+ private String dictLabel;
+ /**
+ * 状态(1正常 0停用)
+ */
+ @ApiModelProperty("帐号状态(1正常 0停用)")
+ private String state;
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/query/DictTypeQuery.java b/admin/admin-api/src/main/java/cn/fateverse/admin/query/DictTypeQuery.java
new file mode 100644
index 0000000..47aa286
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/query/DictTypeQuery.java
@@ -0,0 +1,31 @@
+package cn.fateverse.admin.query;
+
+import cn.fateverse.common.core.entity.QueryTime;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Clay
+ * @date 2022/11/9
+ */
+@Data
+public class DictTypeQuery extends QueryTime {
+
+ /**
+ * 字典名称
+ */
+ @ApiModelProperty("字典名称")
+ private String dictName;
+ /**
+ * 字典类型
+ */
+ @ApiModelProperty("字典类型")
+ private String dictType;
+
+ /**
+ * 帐号状态(1正常 0停用)
+ */
+ @ApiModelProperty("帐号状态(1正常 0停用)")
+ private String state;
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/query/IpBackQuery.java b/admin/admin-api/src/main/java/cn/fateverse/admin/query/IpBackQuery.java
new file mode 100644
index 0000000..e8c668c
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/query/IpBackQuery.java
@@ -0,0 +1,23 @@
+package cn.fateverse.admin.query;
+
+import cn.fateverse.common.core.annotaion.Excel;
+import cn.fateverse.common.core.entity.QueryTime;
+import lombok.Data;
+
+/**
+ * @author Clay
+ * @date 2023-10-22
+ */
+@Data
+public class IpBackQuery extends QueryTime {
+ /**
+ * ip地址
+ */
+ private String ipAddr;
+
+ /**
+ * ip类型 ipv4 ipv6
+ */
+ private String type;
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/query/MappingSwitchQuery.java b/admin/admin-api/src/main/java/cn/fateverse/admin/query/MappingSwitchQuery.java
new file mode 100644
index 0000000..6b12c5e
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/query/MappingSwitchQuery.java
@@ -0,0 +1,23 @@
+package cn.fateverse.admin.query;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Clay
+ * @date 2024/2/5 14:35
+ */
+@Data
+@ApiModel("接口开关Query")
+public class MappingSwitchQuery {
+
+ @ApiModelProperty("应用名称")
+ private String applicationName;
+
+ @ApiModelProperty("类别名称")
+ private String className;
+
+ @ApiModelProperty("方法名称")
+ private String methodName;
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/query/PostQuery.java b/admin/admin-api/src/main/java/cn/fateverse/admin/query/PostQuery.java
new file mode 100644
index 0000000..7795ca0
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/query/PostQuery.java
@@ -0,0 +1,34 @@
+package cn.fateverse.admin.query;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Clay
+ * @date 2022/11/26
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PostQuery {
+
+ /**
+ * 岗位编码
+ */
+ @ApiModelProperty("岗位编码")
+ private String postCode;
+
+ /**
+ * 岗位名称
+ */
+ @ApiModelProperty("岗位名称")
+ private String postName;
+
+ /**
+ * 状态(1正常 0停用)
+ */
+ @ApiModelProperty("状态(1正常 0停用)")
+ private String state;
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/query/RoleQuery.java b/admin/admin-api/src/main/java/cn/fateverse/admin/query/RoleQuery.java
new file mode 100644
index 0000000..983363a
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/query/RoleQuery.java
@@ -0,0 +1,31 @@
+package cn.fateverse.admin.query;
+
+import cn.fateverse.common.core.entity.QueryTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Clay
+ * @date 2022/11/4
+ */
+@Data
+@ApiModel("角色查询实体")
+public class RoleQuery extends QueryTime {
+ /**
+ * 权限字符
+ */
+ @ApiModelProperty("角色名称")
+ private String roleName;
+
+ /**
+ * 权限字符
+ */
+ @ApiModelProperty("权限字符")
+ private String roleKey;
+ /**
+ * 帐号状态(1正常 0停用)
+ */
+ @ApiModelProperty("帐号状态(1正常 0停用)")
+ private String state;
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/query/UserQuery.java b/admin/admin-api/src/main/java/cn/fateverse/admin/query/UserQuery.java
new file mode 100644
index 0000000..8717e40
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/query/UserQuery.java
@@ -0,0 +1,41 @@
+package cn.fateverse.admin.query;
+
+import cn.fateverse.common.core.entity.QueryTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Clay
+ * @date 2022/11/2
+ */
+@Data
+@ApiModel("用户查询对象")
+public class UserQuery extends QueryTime {
+
+ /**
+ * 部门ID
+ */
+ @ApiModelProperty("部门ID")
+ private Long deptId;
+
+ /**
+ * 用户账号
+ */
+ @ApiModelProperty("用户账号")
+ private String userName;
+
+ /**
+ * 手机号码
+ */
+ @ApiModelProperty("手机号码")
+ private String phoneNumber;
+
+ /**
+ * 帐号状态(1正常 0停用)
+ */
+ @ApiModelProperty("帐号状态(1正常 0停用)")
+ private String state;
+
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/vo/ConfigVo.java b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/ConfigVo.java
new file mode 100644
index 0000000..ec220f8
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/ConfigVo.java
@@ -0,0 +1,76 @@
+package cn.fateverse.admin.vo;
+
+import cn.fateverse.admin.entity.Config;
+import cn.fateverse.common.core.annotaion.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 参数配置表对象 sys_config
+ *
+ * @author clay
+ * @date 2023-06-09
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("参数配置表Vo")
+public class ConfigVo {
+
+ /**
+ * 参数主键
+ */
+ @ApiModelProperty("参数主键")
+ private Integer configId;
+
+ /**
+ * 参数名称
+ */
+ @ApiModelProperty("参数名称")
+ @Excel("参数名称")
+ private String configName;
+
+ /**
+ * 参数键名
+ */
+ @ApiModelProperty("参数键名")
+ @Excel("参数键名")
+ private String configKey;
+
+ /**
+ * 参数键值
+ */
+ @ApiModelProperty("参数键值")
+ @Excel("参数键值")
+ private String configValue;
+
+ /**
+ * 系统内置(1是 0否)
+ */
+ @ApiModelProperty("系统内置(1是 0否)")
+ @Excel("系统内置(1是 0否)")
+ private Integer configType;
+
+ /**
+ * 备注
+ */
+ @ApiModelProperty("备注")
+ @Excel("备注")
+ private String remark;
+
+ public static ConfigVo toConfigVo(Config config) {
+ return ConfigVo.builder()
+ .configId(config.getConfigId())
+ .configName(config.getConfigName())
+ .configKey(config.getConfigKey())
+ .configValue(config.getConfigValue())
+ .configType(config.getConfigType())
+ .remark(config.getRemark())
+ .build();
+ }
+}
\ No newline at end of file
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/vo/DeptVo.java b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/DeptVo.java
new file mode 100644
index 0000000..d9ff1ba
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/DeptVo.java
@@ -0,0 +1,76 @@
+package cn.fateverse.admin.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author Clay
+ * @date 2022/11/2
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeptVo implements Serializable {
+
+ /**
+ * 父部门名称
+ */
+ private Long parentId;
+
+ /**
+ * 部门ID
+ */
+ private Long deptId;
+
+ /**
+ * 部门名称
+ */
+ private String deptName;
+
+ /**
+ * 显示顺序
+ */
+ private Integer orderNum;
+
+ /**
+ * 负责人
+ */
+ private String leader;
+ /**
+ * 负责人Id
+ */
+ private Long leaderId;
+
+ /**
+ * 联系电话
+ */
+ private String phone;
+
+ /**
+ * 邮箱
+ */
+ private String email;
+
+ /**
+ * 部门状态:1正常,0停用
+ */
+ private String state;
+
+ /**
+ * 创建时间
+ */
+ private Date createTime;
+
+ /**
+ * 子节点
+ */
+ private List children;
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/vo/DictDataSimpVo.java b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/DictDataSimpVo.java
new file mode 100644
index 0000000..4013cbc
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/DictDataSimpVo.java
@@ -0,0 +1,74 @@
+package cn.fateverse.admin.vo;
+
+import cn.fateverse.admin.entity.DictData;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author Clay
+ * @date 2022/11/11
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("Cache字典数据实体")
+public class DictDataSimpVo {
+ /**
+ * 字典标签
+ */
+ @ApiModelProperty("字典标签")
+ @NotNull(message = "字典标签不能为空!")
+ private String label;
+ /**
+ * 字典键值
+ */
+ @ApiModelProperty("字典键值")
+ @NotNull(message = "字典键值不能为空!")
+ private String value;
+ /**
+ * 样式属性(其他样式扩展)
+ */
+ @ApiModelProperty("样式属性(其他样式扩展)")
+ private Boolean isType;
+ /**
+ * 表格回显样式
+ */
+ @ApiModelProperty("表格回显样式")
+ private String listClass;
+ /**
+ * 字典显示主题(ui框架时)or文字颜色(自定义颜色时)
+ */
+ @ApiModelProperty("字典显示主题(ui框架时)or文字颜色(自定义颜色时)")
+ private String theme;
+ /**
+ * 是否默认(Y是 N否)
+ */
+ @ApiModelProperty("是否默认(Y是 N否)")
+ private Integer isDefault;
+
+
+ /**
+ * 字典对象转换成为简单的字典返回Vo
+ *
+ * @param dictData 字典对象
+ * @return 简单vo对象
+ */
+ public static DictDataSimpVo dictDataToDictDataVo(DictData dictData) {
+ return DictDataSimpVo.builder()
+ .label(dictData.getDictLabel())
+ .value(dictData.getDictValue())
+ .isType(dictData.getIsType())
+ .listClass(dictData.getListClass())
+ .isDefault(dictData.getIsDefault())
+ .build();
+ }
+
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/vo/DictDataVo.java b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/DictDataVo.java
new file mode 100644
index 0000000..d65794d
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/DictDataVo.java
@@ -0,0 +1,79 @@
+package cn.fateverse.admin.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 字典数据返回vo
+ *
+ * @author Clay
+ * @date 2023/05/18
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class DictDataVo implements Serializable {
+ /**
+ * 字典编码
+ */
+ private Long dictCode;
+ /**
+ * 字典排序
+ */
+ @ApiModelProperty("字典排序")
+ private Integer dictSort;
+ /**
+ * 字典标签
+ */
+ @ApiModelProperty("字典标签")
+ private String dictLabel;
+ /**
+ * 字典键值
+ */
+ @ApiModelProperty("字典键值")
+ private String dictValue;
+ /**
+ * 字典类型
+ */
+ @ApiModelProperty("字典类型")
+ private String dictType;
+ /**
+ * 样式属性(其他样式扩展)
+ */
+ @ApiModelProperty("样式属性(其他样式扩展)")
+ private Boolean isType;
+ /**
+ * 表格回显样式
+ */
+ @ApiModelProperty("表格回显样式")
+ private String listClass;
+ /**
+ * 字典显示主题(ui框架时)or文字颜色(自定义颜色时)
+ */
+ @ApiModelProperty("字典显示主题(ui框架时)or文字颜色(自定义颜色时)")
+ private String theme;
+ /**
+ * 是否默认(Y是 N否)
+ */
+ @ApiModelProperty("是否默认(Y是 N否)")
+ private Integer isDefault;
+ /**
+ * 状态(1正常 0停用)
+ */
+ @ApiModelProperty(value = "状态(1正常 0停用)")
+ private String state;
+
+
+ @ApiModelProperty(value = "创建时间")
+ private Date createTime;
+
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/vo/DictTypeVo.java b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/DictTypeVo.java
new file mode 100644
index 0000000..1b77eb0
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/DictTypeVo.java
@@ -0,0 +1,48 @@
+package cn.fateverse.admin.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author Clay
+ * @date 2022/11/9
+ */
+@Data
+@Builder
+@ApiModel("字典返回实体")
+public class DictTypeVo {
+ /**
+ * 字典id
+ */
+ @ApiModelProperty("字典id")
+ private Long dictId;
+ /**
+ * 字典名称
+ */
+ @ApiModelProperty("字典名称")
+ private String dictName;
+ /**
+ * 字典类型
+ */
+ @ApiModelProperty("字典类型")
+ private String dictType;
+
+ /**
+ * 帐号状态(1正常 0停用)
+ */
+ @ApiModelProperty("帐号状态(1正常 0停用)")
+ private String state;
+
+ /**
+ * 创建时间
+ */
+ @ApiModelProperty("创建时间")
+ private LocalDateTime createTime;
+
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/vo/IpBackVo.java b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/IpBackVo.java
new file mode 100644
index 0000000..d63c9b5
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/IpBackVo.java
@@ -0,0 +1,61 @@
+package cn.fateverse.admin.vo;
+
+import cn.fateverse.admin.entity.IpBack;
+import cn.fateverse.common.core.annotaion.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author Clay
+ * @date 2023-10-22
+ */
+@Data
+@Builder
+@ApiModel("ip黑名单")
+@AllArgsConstructor
+@NoArgsConstructor
+public class IpBackVo {
+ /**
+ * 主键id
+ */
+ @ApiModelProperty("主键id")
+ @Excel("id")
+ private Long id;
+ /**
+ * ip地址
+ */
+ @ApiModelProperty("ip地址")
+ @Excel("ip地址")
+ private String ipAddr;
+ /**
+ * ip类型 ipv4 ipv6
+ */
+ @ApiModelProperty("ip类型 ipv4 ipv6")
+ @Excel("ip类型 ipv4 ipv6")
+ private String type;
+ /**
+ * 备注信息
+ */
+ @Excel("备注信息")
+ private String remark;
+
+ @ApiModelProperty("创建时间")
+ @Excel("创建时间")
+ private Date createTime;
+
+ public static IpBackVo toIpBackVo(IpBack ipBack) {
+ return IpBackVo.builder()
+ .id(ipBack.getId())
+ .ipAddr(ipBack.getIpAddr())
+ .type(ipBack.getType())
+ .remark(ipBack.getRemark())
+ .createTime(ipBack.getCreateTime())
+ .build();
+ }
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/vo/MenuSimpVo.java b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/MenuSimpVo.java
new file mode 100644
index 0000000..fb9ef11
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/MenuSimpVo.java
@@ -0,0 +1,80 @@
+package cn.fateverse.admin.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.Size;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author Clay
+ * @date 2022/11/5
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("菜单返回实体")
+public class MenuSimpVo {
+
+ /**
+ * 菜单ID
+ */
+ @ApiModelProperty("菜单ID")
+ private Long menuId;
+
+ /**
+ * 菜单名称
+ */
+ @ApiModelProperty("菜单名称")
+ private String menuName;
+
+ /**
+ * 菜单图标
+ */
+ @ApiModelProperty("菜单图标")
+ private String icon;
+
+ /**
+ * 显示顺序
+ */
+ @ApiModelProperty("显示顺序")
+ private Integer orderNum;
+
+
+ @ApiModelProperty("显示顺序")
+ private String menuType;
+
+ /**
+ * 权限字符串
+ */
+ @ApiModelProperty("权限字符串")
+ @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符")
+ private String perms;
+
+ /**
+ * 组件路径
+ */
+ @ApiModelProperty("组件路径")
+ private String component;
+
+ /**
+ * 菜单状态(0显示 1隐藏)
+ */
+ @ApiModelProperty("菜单状态(0显示 1隐藏)")
+ private String state;
+
+ /**
+ * 创建时间
+ */
+ private Date createTime;
+
+
+ private List children;
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/vo/MenuVo.java b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/MenuVo.java
new file mode 100644
index 0000000..379f27a
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/MenuVo.java
@@ -0,0 +1,104 @@
+package cn.fateverse.admin.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 菜单详细返回对象
+ *
+ * @author Clay
+ */
+@Data
+@ApiModel("菜单")
+public class MenuVo implements Serializable {
+
+ /**
+ * 菜单ID
+ */
+ @ApiModelProperty("菜单ID")
+ private Long menuId;
+
+ /**
+ * 菜单名称
+ */
+ @ApiModelProperty("菜单名称")
+ private String menuName;
+
+ /**
+ * 父菜单ID
+ */
+ @ApiModelProperty("父菜单ID")
+ private Long parentId;
+
+ /**
+ * 显示顺序
+ */
+ @ApiModelProperty("显示顺序")
+ private Integer orderNum;
+
+ /**
+ * 路由地址
+ */
+ @ApiModelProperty("路由地址")
+ private String path;
+
+ @ApiModelProperty("路径参数")
+ private String pathParams;
+
+ /**
+ * 组件路径
+ */
+ @ApiModelProperty("组件路径")
+ private String component;
+
+ /**
+ * 是否为外链(0是 1否)
+ */
+ @ApiModelProperty("是否为外链(0是 1否)")
+ private Boolean isFrame;
+
+ /**
+ * 是否缓存(0缓存 1不缓存)
+ */
+ @ApiModelProperty("是否缓存(0缓存 1不缓存)")
+ private Boolean isCache;
+
+ @ApiModelProperty("不重定向")
+ private Boolean noRedirect;
+
+ @ApiModelProperty("面包屑")
+ private Boolean breadcrumb;
+ /**
+ * 类型(D目录 M菜单 B按钮)
+ */
+ @ApiModelProperty("类型(D目录 M菜单 B按钮)")
+ private String menuType;
+
+ /**
+ * 显示状态(0显示 1隐藏)
+ */
+ @ApiModelProperty("显示状态(0显示 1隐藏)")
+ private String visible;
+
+ /**
+ * 菜单状态(0显示 1隐藏)
+ */
+ @ApiModelProperty("菜单状态(0显示 1隐藏)")
+ private String state;
+
+ /**
+ * 权限字符串
+ */
+ @ApiModelProperty("权限字符串")
+ private String perms;
+
+ /**
+ * 菜单图标
+ */
+ @ApiModelProperty("菜单图标")
+ private String icon;
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/vo/MetaVo.java b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/MetaVo.java
new file mode 100644
index 0000000..c382431
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/MetaVo.java
@@ -0,0 +1,62 @@
+package cn.fateverse.admin.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author Clay
+ * @date 2022/10/30
+ */
+@Data
+public class MetaVo implements Serializable {
+ /**
+ * 设置该路由在侧边栏和面包屑中展示的名字
+ */
+ private String title;
+
+ /**
+ * 设置该路由的图标,对应路径src/assets/icons/svg
+ */
+ private String icon;
+
+ /**
+ * 设置为true,则不会被 缓存
+ */
+ private Boolean noCache;
+
+ /**
+ * 是否重定向
+ */
+ private Boolean noRedirect;
+
+ /**
+ * 是否开起面包屑
+ */
+ private Boolean breadcrumb;
+
+ private Boolean isFrame;
+
+ public MetaVo() {
+ }
+
+ public MetaVo(String title, String icon) {
+ this.title = title;
+ this.icon = icon;
+ }
+
+ public MetaVo(String title, String icon, Boolean noCache) {
+ this.title = title;
+ this.icon = icon;
+ this.noCache = noCache;
+ }
+
+ public MetaVo(String title, String icon, Boolean noCache, Boolean noRedirect, Boolean breadcrumb,Boolean isFrame) {
+ this.title = title;
+ this.icon = icon;
+ this.noCache = noCache;
+ this.noRedirect = noRedirect;
+ this.breadcrumb = breadcrumb;
+ this.isFrame = isFrame;
+ }
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/vo/OptionMenuVo.java b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/OptionMenuVo.java
new file mode 100644
index 0000000..8d7c707
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/OptionMenuVo.java
@@ -0,0 +1,26 @@
+package cn.fateverse.admin.vo;
+
+import cn.fateverse.common.core.entity.OptionTree;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Clay
+ * @date 2022/11/6
+ */
+@Data
+@Builder
+@ApiModel("角色修改时菜单返回实体")
+public class OptionMenuVo {
+
+ @ApiModelProperty("已选择的")
+ private Set checked;
+ @ApiModelProperty("菜单选择option")
+ private List menuOption;
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/vo/PostVo.java b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/PostVo.java
new file mode 100644
index 0000000..0520950
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/PostVo.java
@@ -0,0 +1,69 @@
+package cn.fateverse.admin.vo;
+
+import cn.fateverse.admin.entity.Post;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * @author Clay
+ * @date 2023-05-05
+ */
+@Data
+@Builder
+@ApiModel("岗位实体")
+public class PostVo {
+
+ /**
+ * 岗位ID
+ */
+ @ApiModelProperty("岗位ID")
+ private Long postId;
+ /**
+ * 岗位编码
+ */
+ @ApiModelProperty("岗位编码")
+ @NotNull(message = "岗位编码不能为空!")
+ private String postCode;
+ /**
+ * 岗位名称
+ */
+ @ApiModelProperty("岗位名称")
+ @NotNull(message = "岗位名称不能为空!")
+ private String postName;
+ /**
+ * 显示顺序
+ */
+ @ApiModelProperty("显示顺序")
+ @NotNull(message = "显示顺序不能为空!")
+ private Integer postSort;
+ /**
+ * 状态(1正常 0停用)
+ */
+ @ApiModelProperty("状态(1正常 0停用)")
+ @NotNull(message = "状态不能为空!")
+ private String state;
+
+ /**
+ * 创建时间
+ */
+ @JsonFormat(locale = "zh",timezone = "GMT+8",pattern = "yyyy-MM-dd")
+ private Date createTime;
+
+ public static PostVo toPostVo(Post post){
+ return PostVo.builder()
+ .postId(post.getPostId())
+ .postCode(post.getPostCode())
+ .postName(post.getPostName())
+ .postSort(post.getPostSort())
+ .state(post.getState())
+ .createTime(post.getCreateTime())
+ .build();
+ }
+
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/vo/RoleVo.java b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/RoleVo.java
new file mode 100644
index 0000000..f480cd9
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/RoleVo.java
@@ -0,0 +1,78 @@
+package cn.fateverse.admin.vo;
+
+import cn.fateverse.admin.entity.Role;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+import java.util.Set;
+
+
+/**
+ * @author Clay
+ * @date 2023-05-26
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class RoleVo {
+
+ @ApiModelProperty("角色id")
+ private Long roleId;
+
+ @ApiModelProperty("角色名称")
+ private String roleName;
+
+
+ @ApiModelProperty("角色权限字符串")
+ private String roleKey;
+
+ @ApiModelProperty("角色排序")
+ private Integer roleSort;
+
+ /**
+ * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限)
+ */
+ @ApiModelProperty("数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限)")
+ private String dataScope;
+
+ /**
+ * 角色状态(1正常 0停用)
+ */
+ @ApiModelProperty("角色状态(1正常 0停用)")
+ private String state;
+
+ /**
+ * 菜单组
+ */
+ @ApiModelProperty("菜单组")
+ @JsonInclude(JsonInclude.Include.NON_NULL)
+ private Set menuIds;
+
+ /**
+ * 部门组(数据权限)
+ */
+ @ApiModelProperty("部门组(数据权限)")
+ @JsonInclude(JsonInclude.Include.NON_NULL)
+ private Long[] deptIds;
+ private Date createTime;
+ private Date updateTime;
+
+ public static RoleVo toRoleVo(Role role){
+ return RoleVo.builder()
+ .roleId(role.getRoleId())
+ .roleName(role.getRoleName())
+ .roleKey(role.getRoleKey())
+ .roleSort(role.getRoleSort())
+ .dataScope(role.getDataScope())
+ .state(role.getState())
+ .createTime(role.getCreateTime())
+ .updateTime(role.getUpdateTime())
+ .build();
+ }
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/vo/RouterVo.java b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/RouterVo.java
new file mode 100644
index 0000000..c14ac72
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/RouterVo.java
@@ -0,0 +1,69 @@
+package cn.fateverse.admin.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * @author Clay
+ * @date 2022/10/30
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class RouterVo implements Serializable {
+ /**
+ * 路由名字
+ */
+ private String name;
+
+ /**
+ * 路由地址
+ */
+ private String path;
+ /**
+ * 路径参数
+ */
+ private String pathParams;
+
+ /**
+ * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现
+ */
+ private boolean hidden;
+
+ /**
+ * 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击
+ */
+ @JsonInclude(NON_NULL)
+ private String redirect;
+
+ /**
+ * 组件地址
+ */
+ private String component;
+
+ /**
+ * 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面
+ */
+ @JsonInclude(NON_NULL)
+ private Boolean alwaysShow;
+
+ /**
+ * 其他元素
+ */
+ private MetaVo meta;
+
+ /**
+ * 子路由
+ */
+ @JsonInclude(NON_NULL)
+ private List children;
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/vo/UserChooseVo.java b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/UserChooseVo.java
new file mode 100644
index 0000000..0b379b3
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/UserChooseVo.java
@@ -0,0 +1,62 @@
+package cn.fateverse.admin.vo;
+
+import cn.fateverse.admin.entity.Role;
+import cn.fateverse.admin.entity.Dept;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Clay
+ * @date 2023-03-02
+ */
+@Data
+@Builder
+public class UserChooseVo {
+
+ private Long id;
+
+ private String name;
+
+ private Integer type;
+
+ private String value;
+
+ private String avatar;
+
+ private List children;
+
+
+ public static UserChooseVo toUserChooseByDept(Dept dept, Long id) {
+ return UserChooseVo.builder()
+ .id(dept.getDeptId())
+ .type(2)
+ .value(id + "-" + dept.getDeptId())
+ .children(new ArrayList<>())
+ .name(dept.getDeptName())
+ .build();
+ }
+
+ public static UserChooseVo toUserChooseByRole(Role role) {
+ return UserChooseVo.builder()
+ .id(role.getRoleId())
+ .type(1)
+ .value("0-" + role.getRoleId())
+ .children(new ArrayList<>())
+ .name(role.getRoleName())
+ .build();
+ }
+
+ public static UserChooseVo toUserChooseByUser(UserVo user, long id) {
+ return UserChooseVo.builder()
+ .id(user.getUserId())
+ .type(0)
+ .value(id + "-" + user.getUserId())
+ .children(new ArrayList<>())
+ .avatar(user.getAvatar())
+ .name(user.getNickName())
+ .build();
+ }
+}
diff --git a/admin/admin-api/src/main/java/cn/fateverse/admin/vo/UserDetailVo.java b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/UserDetailVo.java
new file mode 100644
index 0000000..7a7c9d3
--- /dev/null
+++ b/admin/admin-api/src/main/java/cn/fateverse/admin/vo/UserDetailVo.java
@@ -0,0 +1,34 @@
+package cn.fateverse.admin.vo;
+
+import cn.fateverse.admin.entity.User;
+import cn.fateverse.common.core.entity.Option;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author Clay
+ * @date 2022/11/4
+ */
+@Data
+@Builder
+@ApiModel("用户详细信息")
+public class UserDetailVo {
+ @ApiModelProperty("用户基本细腻系")
+ private User user;
+
+ @ApiModelProperty("用户所在的岗位")
+ private List postIds;
+
+ @ApiModelProperty("岗位option选择数组")
+ private List