From 02fd8f3c88c5471fdb11390b064a7a88ab8dbf55 Mon Sep 17 00:00:00 2001
From: DongZeLiang <2746733890@qq.com>
Date: Mon, 22 Jul 2024 15:12:09 +0800
Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 46 +++++
pom.xml | 29 +++
.../muyu/common/system/domain/LoginUser.java | 66 +++++++
.../muyu/common/system/domain/SysDept.java | 108 +++++++++++
.../common/system/domain/SysDictData.java | 104 +++++++++++
.../common/system/domain/SysDictType.java | 62 +++++++
.../muyu/common/system/domain/SysFile.java | 27 +++
.../common/system/domain/SysLogininfor.java | 64 +++++++
.../muyu/common/system/domain/SysOperLog.java | 129 +++++++++++++
.../muyu/common/system/domain/SysRole.java | 127 +++++++++++++
.../muyu/common/system/domain/SysUser.java | 173 ++++++++++++++++++
.../system/remote/RemoteFileService.java | 29 +++
.../system/remote/RemoteLogService.java | 42 +++++
.../system/remote/RemoteUserService.java | 40 ++++
.../factory/RemoteFileFallbackFactory.java | 31 ++++
.../factory/RemoteLogFallbackFactory.java | 37 ++++
.../factory/RemoteUserFallbackFactory.java | 36 ++++
...ot.autoconfigure.AutoConfiguration.imports | 3 +
18 files changed, 1153 insertions(+)
create mode 100644 .gitignore
create mode 100644 pom.xml
create mode 100644 src/main/java/com/muyu/common/system/domain/LoginUser.java
create mode 100644 src/main/java/com/muyu/common/system/domain/SysDept.java
create mode 100644 src/main/java/com/muyu/common/system/domain/SysDictData.java
create mode 100644 src/main/java/com/muyu/common/system/domain/SysDictType.java
create mode 100644 src/main/java/com/muyu/common/system/domain/SysFile.java
create mode 100644 src/main/java/com/muyu/common/system/domain/SysLogininfor.java
create mode 100644 src/main/java/com/muyu/common/system/domain/SysOperLog.java
create mode 100644 src/main/java/com/muyu/common/system/domain/SysRole.java
create mode 100644 src/main/java/com/muyu/common/system/domain/SysUser.java
create mode 100644 src/main/java/com/muyu/common/system/remote/RemoteFileService.java
create mode 100644 src/main/java/com/muyu/common/system/remote/RemoteLogService.java
create mode 100644 src/main/java/com/muyu/common/system/remote/RemoteUserService.java
create mode 100644 src/main/java/com/muyu/common/system/remote/factory/RemoteFileFallbackFactory.java
create mode 100644 src/main/java/com/muyu/common/system/remote/factory/RemoteLogFallbackFactory.java
create mode 100644 src/main/java/com/muyu/common/system/remote/factory/RemoteUserFallbackFactory.java
create mode 100644 src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..09bdfea
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,46 @@
+######################################################################
+# Build Tools
+
+.gradle
+/build/
+!gradle/wrapper/gradle-wrapper.jar
+
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+######################################################################
+# IDE
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### JRebel ###
+rebel.xml
+### NetBeans ###
+nbproject/private/
+build/*
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
+
+######################################################################
+# Others
+*.log
+*.xml.versionsBackup
+*.swp
+
+!*/build/*.java
+!*/build/*.html
+!*/build/*.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..ad4356f
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,29 @@
+
+
+ 4.0.0
+
+ com.muyu
+ cloud-common
+ 3.6.3
+
+
+ cloud-common-system
+
+ cloud-common-system系统级远程调用
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+
+ com.muyu
+ cloud-common-core
+
+
+
diff --git a/src/main/java/com/muyu/common/system/domain/LoginUser.java b/src/main/java/com/muyu/common/system/domain/LoginUser.java
new file mode 100644
index 0000000..a18af37
--- /dev/null
+++ b/src/main/java/com/muyu/common/system/domain/LoginUser.java
@@ -0,0 +1,66 @@
+package com.muyu.common.system.domain;
+
+
+import lombok.*;
+
+import java.io.Serializable;
+import java.util.Set;
+
+/**
+ * 用户信息
+ *
+ * @author muyu
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class LoginUser implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 用户唯一标识
+ */
+ private String token;
+
+ /**
+ * 用户名id
+ */
+ private Long userid;
+
+ /**
+ * 用户名
+ */
+ private String username;
+
+ /**
+ * 登录时间
+ */
+ private Long loginTime;
+
+ /**
+ * 过期时间
+ */
+ private Long expireTime;
+
+ /**
+ * 登录IP地址
+ */
+ private String ipaddr;
+
+ /**
+ * 权限列表
+ */
+ private Set permissions;
+
+ /**
+ * 角色列表
+ */
+ private Set roles;
+
+ /**
+ * 用户信息
+ */
+ private SysUser sysUser;
+
+}
diff --git a/src/main/java/com/muyu/common/system/domain/SysDept.java b/src/main/java/com/muyu/common/system/domain/SysDept.java
new file mode 100644
index 0000000..65ada9e
--- /dev/null
+++ b/src/main/java/com/muyu/common/system/domain/SysDept.java
@@ -0,0 +1,108 @@
+package com.muyu.common.system.domain;
+
+import com.muyu.common.core.web.domain.BaseEntity;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.NotBlank;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 部门表 sys_dept
+ *
+ * @author muyu
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SysDept extends BaseEntity {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 部门ID
+ */
+ private Long deptId;
+
+ /**
+ * 父部门ID
+ */
+ private Long parentId;
+
+ /**
+ * 祖级列表
+ */
+ private String ancestors;
+
+ /**
+ * 部门名称
+ */
+ private String deptName;
+
+ /**
+ * 显示顺序
+ */
+ private Integer orderNum;
+
+ /**
+ * 负责人
+ */
+ private String leader;
+
+ /**
+ * 联系电话
+ */
+ private String phone;
+
+ /**
+ * 邮箱
+ */
+ private String email;
+
+ /**
+ * 部门状态:0正常,1停用
+ */
+ private String status;
+
+ /**
+ * 删除标志(0代表存在 2代表删除)
+ */
+ private String delFlag;
+
+ /**
+ * 父部门名称
+ */
+ private String parentName;
+
+ /**
+ * 子部门
+ */
+ private List children = new ArrayList();
+
+ @NotBlank(message = "部门名称不能为空")
+ @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
+ public String getDeptName () {
+ return deptName;
+ }
+
+ @NotNull(message = "显示顺序不能为空")
+ public Integer getOrderNum () {
+ return orderNum;
+ }
+
+ @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符")
+ public String getPhone () {
+ return phone;
+ }
+
+ @Email(message = "邮箱格式不正确")
+ @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
+ public String getEmail () {
+ return email;
+ }
+}
diff --git a/src/main/java/com/muyu/common/system/domain/SysDictData.java b/src/main/java/com/muyu/common/system/domain/SysDictData.java
new file mode 100644
index 0000000..5beee3f
--- /dev/null
+++ b/src/main/java/com/muyu/common/system/domain/SysDictData.java
@@ -0,0 +1,104 @@
+package com.muyu.common.system.domain;
+
+import com.muyu.common.core.annotation.Excel;
+import com.muyu.common.core.annotation.Excel.ColumnType;
+import com.muyu.common.core.constant.UserConstants;
+import com.muyu.common.core.web.domain.BaseEntity;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+
+/**
+ * 字典数据表 sys_dict_data
+ *
+ * @author muyu
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SysDictData extends BaseEntity {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 字典编码
+ */
+ @Excel(name = "字典编码", cellType = ColumnType.NUMERIC)
+ private Long dictCode;
+
+ /**
+ * 字典排序
+ */
+ @Excel(name = "字典排序", cellType = ColumnType.NUMERIC)
+ private Long dictSort;
+
+ /**
+ * 字典标签
+ */
+ @Excel(name = "字典标签")
+ private String dictLabel;
+
+ /**
+ * 字典键值
+ */
+ @Excel(name = "字典键值")
+ private String dictValue;
+
+ /**
+ * 字典类型
+ */
+ @Excel(name = "字典类型")
+ private String dictType;
+
+ /**
+ * 样式属性(其他样式扩展)
+ */
+ private String cssClass;
+
+ /**
+ * 表格字典样式
+ */
+ private String listClass;
+
+ /**
+ * 是否默认(Y是 N否)
+ */
+ @Excel(name = "是否默认", readConverterExp = "Y=是,N=否")
+ private String isDefault;
+
+ /**
+ * 状态(0正常 1停用)
+ */
+ @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
+ private String status;
+
+ @NotBlank(message = "字典标签不能为空")
+ @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符")
+ public String getDictLabel () {
+ return dictLabel;
+ }
+
+ @NotBlank(message = "字典键值不能为空")
+ @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符")
+ public String getDictValue () {
+ return dictValue;
+ }
+
+ @NotBlank(message = "字典类型不能为空")
+ @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符")
+ public String getDictType () {
+ return dictType;
+ }
+
+ @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符")
+ public String getCssClass () {
+ return cssClass;
+ }
+
+ public boolean getDefault () {
+ return UserConstants.YES.equals(this.isDefault);
+ }
+}
diff --git a/src/main/java/com/muyu/common/system/domain/SysDictType.java b/src/main/java/com/muyu/common/system/domain/SysDictType.java
new file mode 100644
index 0000000..d623333
--- /dev/null
+++ b/src/main/java/com/muyu/common/system/domain/SysDictType.java
@@ -0,0 +1,62 @@
+package com.muyu.common.system.domain;
+
+import com.muyu.common.core.annotation.Excel;
+import com.muyu.common.core.annotation.Excel.ColumnType;
+import com.muyu.common.core.web.domain.BaseEntity;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Pattern;
+import jakarta.validation.constraints.Size;
+
+/**
+ * 字典类型表 sys_dict_type
+ *
+ * @author muyu
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SysDictType extends BaseEntity {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 字典主键
+ */
+ @Excel(name = "字典主键", cellType = ColumnType.NUMERIC)
+ private Long dictId;
+
+ /**
+ * 字典名称
+ */
+ @Excel(name = "字典名称")
+ private String dictName;
+
+ /**
+ * 字典类型
+ */
+ @Excel(name = "字典类型")
+ private String dictType;
+
+ /**
+ * 状态(0正常 1停用)
+ */
+ @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
+ private String status;
+
+ @NotBlank(message = "字典名称不能为空")
+ @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符")
+ public String getDictName () {
+ return dictName;
+ }
+
+ @NotBlank(message = "字典类型不能为空")
+ @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符")
+ @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)")
+ public String getDictType () {
+ return dictType;
+ }
+}
diff --git a/src/main/java/com/muyu/common/system/domain/SysFile.java b/src/main/java/com/muyu/common/system/domain/SysFile.java
new file mode 100644
index 0000000..ad48a1e
--- /dev/null
+++ b/src/main/java/com/muyu/common/system/domain/SysFile.java
@@ -0,0 +1,27 @@
+package com.muyu.common.system.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 文件信息
+ *
+ * @author muyu
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SysFile {
+ /**
+ * 文件名称
+ */
+ private String name;
+
+ /**
+ * 文件地址
+ */
+ private String url;
+}
diff --git a/src/main/java/com/muyu/common/system/domain/SysLogininfor.java b/src/main/java/com/muyu/common/system/domain/SysLogininfor.java
new file mode 100644
index 0000000..c66f131
--- /dev/null
+++ b/src/main/java/com/muyu/common/system/domain/SysLogininfor.java
@@ -0,0 +1,64 @@
+package com.muyu.common.system.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.muyu.common.core.annotation.Excel;
+import com.muyu.common.core.annotation.Excel.ColumnType;
+import com.muyu.common.core.web.domain.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import java.util.Date;
+
+/**
+ * 系统访问记录表 sys_logininfor
+ *
+ * @author muyu
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SysLogininfor extends BaseEntity {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * ID
+ */
+ @Excel(name = "序号", cellType = ColumnType.NUMERIC)
+ private Long infoId;
+
+ /**
+ * 用户账号
+ */
+ @Excel(name = "用户账号")
+ private String userName;
+
+ /**
+ * 状态 0成功 1失败
+ */
+ @Excel(name = "状态", readConverterExp = "0=成功,1=失败")
+ private String status;
+
+ /**
+ * 地址
+ */
+ @Excel(name = "地址")
+ private String ipaddr;
+
+ /**
+ * 描述
+ */
+ @Excel(name = "描述")
+ private String msg;
+
+ /**
+ * 访问时间
+ */
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @Excel(name = "访问时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+ private Date accessTime;
+}
diff --git a/src/main/java/com/muyu/common/system/domain/SysOperLog.java b/src/main/java/com/muyu/common/system/domain/SysOperLog.java
new file mode 100644
index 0000000..b207611
--- /dev/null
+++ b/src/main/java/com/muyu/common/system/domain/SysOperLog.java
@@ -0,0 +1,129 @@
+package com.muyu.common.system.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.muyu.common.core.annotation.Excel;
+import com.muyu.common.core.annotation.Excel.ColumnType;
+import com.muyu.common.core.web.domain.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import java.util.Date;
+
+/**
+ * 操作日志记录表 oper_log
+ *
+ * @author muyu
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SysOperLog extends BaseEntity {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 日志主键
+ */
+ @Excel(name = "操作序号", cellType = ColumnType.NUMERIC)
+ private Long operId;
+
+ /**
+ * 操作模块
+ */
+ @Excel(name = "操作模块")
+ private String title;
+
+ /**
+ * 业务类型(0其它 1新增 2修改 3删除)
+ */
+ @Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据")
+ private Integer businessType;
+
+ /**
+ * 业务类型数组
+ */
+ private Integer[] businessTypes;
+
+ /**
+ * 请求方法
+ */
+ @Excel(name = "请求方法")
+ private String method;
+
+ /**
+ * 请求方式
+ */
+ @Excel(name = "请求方式")
+ private String requestMethod;
+
+ /**
+ * 操作类别(0其它 1后台用户 2手机端用户)
+ */
+ @Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户")
+ private Integer operatorType;
+
+ /**
+ * 操作人员
+ */
+ @Excel(name = "操作人员")
+ private String operName;
+
+ /**
+ * 部门名称
+ */
+ @Excel(name = "部门名称")
+ private String deptName;
+
+ /**
+ * 请求url
+ */
+ @Excel(name = "请求地址")
+ private String operUrl;
+
+ /**
+ * 操作地址
+ */
+ @Excel(name = "操作地址")
+ private String operIp;
+
+ /**
+ * 请求参数
+ */
+ @Excel(name = "请求参数")
+ private String operParam;
+
+ /**
+ * 返回参数
+ */
+ @Excel(name = "返回参数")
+ private String jsonResult;
+
+ /**
+ * 操作状态(0正常 1异常)
+ */
+ @Excel(name = "状态", readConverterExp = "0=正常,1=异常")
+ private Integer status;
+
+ /**
+ * 错误消息
+ */
+ @Excel(name = "错误消息")
+ private String errorMsg;
+
+ /**
+ * 操作时间
+ */
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+ private Date operTime;
+
+ /**
+ * 消耗时间
+ */
+ @Excel(name = "消耗时间", suffix = "毫秒")
+ private Long costTime;
+}
diff --git a/src/main/java/com/muyu/common/system/domain/SysRole.java b/src/main/java/com/muyu/common/system/domain/SysRole.java
new file mode 100644
index 0000000..1aab56a
--- /dev/null
+++ b/src/main/java/com/muyu/common/system/domain/SysRole.java
@@ -0,0 +1,127 @@
+package com.muyu.common.system.domain;
+
+import com.muyu.common.core.annotation.Excel;
+import com.muyu.common.core.annotation.Excel.ColumnType;
+import com.muyu.common.core.web.domain.BaseEntity;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import java.util.Set;
+
+/**
+ * 角色表 sys_role
+ *
+ * @author muyu
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SysRole extends BaseEntity {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 角色ID
+ */
+ @Excel(name = "角色序号", cellType = ColumnType.NUMERIC)
+ private Long roleId;
+
+ /**
+ * 角色名称
+ */
+ @Excel(name = "角色名称")
+ private String roleName;
+
+ /**
+ * 角色权限
+ */
+ @Excel(name = "角色权限")
+ private String roleKey;
+
+ /**
+ * 角色排序
+ */
+ @Excel(name = "角色排序")
+ private Integer roleSort;
+
+ /**
+ * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限)
+ */
+ @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限")
+ private String dataScope;
+
+ /**
+ * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示)
+ */
+ private boolean menuCheckStrictly;
+
+ /**
+ * 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 )
+ */
+ private boolean deptCheckStrictly;
+
+ /**
+ * 角色状态(0正常 1停用)
+ */
+ @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用")
+ private String status;
+
+ /**
+ * 删除标志(0代表存在 2代表删除)
+ */
+ private String delFlag;
+
+ /**
+ * 用户是否存在此角色标识 默认不存在
+ */
+ private boolean flag = false;
+
+ /**
+ * 菜单组
+ */
+ private Long[] menuIds;
+
+ /**
+ * 部门组(数据权限)
+ */
+ private Long[] deptIds;
+
+ /**
+ * 角色菜单权限
+ */
+ private Set permissions;
+
+
+ public SysRole (Long roleId) {
+ this.roleId = roleId;
+ }
+
+ public static boolean isAdmin (Long roleId) {
+ return roleId != null && 1L == roleId;
+ }
+
+ public boolean isAdmin () {
+ return isAdmin(this.roleId);
+ }
+
+ @NotBlank(message = "角色名称不能为空")
+ @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符")
+ public String getRoleName () {
+ return roleName;
+ }
+
+ @NotBlank(message = "权限字符不能为空")
+ @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符")
+ public String getRoleKey () {
+ return roleKey;
+ }
+
+ @NotNull(message = "显示顺序不能为空")
+ public Integer getRoleSort () {
+ return roleSort;
+ }
+}
diff --git a/src/main/java/com/muyu/common/system/domain/SysUser.java b/src/main/java/com/muyu/common/system/domain/SysUser.java
new file mode 100644
index 0000000..999b22c
--- /dev/null
+++ b/src/main/java/com/muyu/common/system/domain/SysUser.java
@@ -0,0 +1,173 @@
+package com.muyu.common.system.domain;
+
+import com.muyu.common.core.annotation.Excel;
+import com.muyu.common.core.annotation.Excel.ColumnType;
+import com.muyu.common.core.annotation.Excel.Type;
+import com.muyu.common.core.annotation.Excels;
+import com.muyu.common.core.web.domain.BaseEntity;
+import com.muyu.common.core.xss.Xss;
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 用户对象 sys_user
+ *
+ * @author muyu
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SysUser extends BaseEntity {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 用户ID
+ */
+ @Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号")
+ private Long userId;
+
+ /**
+ * 部门ID
+ */
+ @Excel(name = "部门编号", type = Type.IMPORT)
+ private Long deptId;
+
+ /**
+ * 用户账号
+ */
+ @Excel(name = "登录名称")
+ private String userName;
+
+ /**
+ * 用户昵称
+ */
+ @Excel(name = "用户名称")
+ private String nickName;
+
+ /**
+ * 用户邮箱
+ */
+ @Excel(name = "用户邮箱")
+ private String email;
+
+ /**
+ * 手机号码
+ */
+ @Excel(name = "手机号码")
+ private String phonenumber;
+
+ /**
+ * 用户性别
+ */
+ @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
+ private String sex;
+
+ /**
+ * 用户头像
+ */
+ private String avatar;
+
+ /**
+ * 密码
+ */
+ private String password;
+
+ /**
+ * 帐号状态(0正常 1停用)
+ */
+ @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")
+ private String status;
+
+ /**
+ * 删除标志(0代表存在 2代表删除)
+ */
+ private String delFlag;
+
+ /**
+ * 最后登录IP
+ */
+ @Excel(name = "最后登录IP", type = Type.EXPORT)
+ private String loginIp;
+
+ /**
+ * 最后登录时间
+ */
+ @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
+ private Date loginDate;
+
+ /**
+ * 部门对象
+ */
+ @Excels({
+ @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
+ @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
+ })
+ private SysDept dept;
+
+ /**
+ * 角色对象
+ */
+ private List roles;
+
+ /**
+ * 角色组
+ */
+ private Long[] roleIds;
+
+ /**
+ * 岗位组
+ */
+ private Long[] postIds;
+
+ /**
+ * 角色ID
+ */
+ private Long roleId;
+
+ public SysUser (Long userId) {
+ this.userId = userId;
+ }
+
+ public static boolean isAdmin (Long userId) {
+ return userId != null && 1L == userId;
+ }
+
+ public boolean isAdmin () {
+ return isAdmin(this.userId);
+ }
+
+ @Xss(message = "用户昵称不能包含脚本字符")
+ @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
+ public String getNickName () {
+ return nickName;
+ }
+
+ @Xss(message = "用户账号不能包含脚本字符")
+ @NotBlank(message = "用户账号不能为空")
+ @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
+ public String getUserName () {
+ return userName;
+ }
+
+ @Email(message = "邮箱格式不正确")
+ @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
+ public String getEmail () {
+ return email;
+ }
+
+ @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符")
+ public String getPhonenumber () {
+ return phonenumber;
+ }
+}
diff --git a/src/main/java/com/muyu/common/system/remote/RemoteFileService.java b/src/main/java/com/muyu/common/system/remote/RemoteFileService.java
new file mode 100644
index 0000000..96dd181
--- /dev/null
+++ b/src/main/java/com/muyu/common/system/remote/RemoteFileService.java
@@ -0,0 +1,29 @@
+package com.muyu.common.system.remote;
+
+import com.muyu.common.core.constant.ServiceNameConstants;
+import com.muyu.common.core.domain.Result;
+import com.muyu.common.system.domain.SysFile;
+import com.muyu.common.system.remote.factory.RemoteFileFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 文件服务
+ *
+ * @author muyu
+ */
+@FeignClient(contextId = "remoteFileService", value = ServiceNameConstants.FILE_SERVICE, fallbackFactory = RemoteFileFallbackFactory.class)
+public interface RemoteFileService {
+ /**
+ * 上传文件
+ *
+ * @param file 文件信息
+ *
+ * @return 结果
+ */
+ @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ public Result upload (@RequestPart(value = "file") MultipartFile file);
+}
diff --git a/src/main/java/com/muyu/common/system/remote/RemoteLogService.java b/src/main/java/com/muyu/common/system/remote/RemoteLogService.java
new file mode 100644
index 0000000..7e767c4
--- /dev/null
+++ b/src/main/java/com/muyu/common/system/remote/RemoteLogService.java
@@ -0,0 +1,42 @@
+package com.muyu.common.system.remote;
+
+import com.muyu.common.core.constant.SecurityConstants;
+import com.muyu.common.core.constant.ServiceNameConstants;
+import com.muyu.common.core.domain.Result;
+import com.muyu.common.system.domain.SysLogininfor;
+import com.muyu.common.system.domain.SysOperLog;
+import com.muyu.common.system.remote.factory.RemoteLogFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+
+/**
+ * 日志服务
+ *
+ * @author muyu
+ */
+@FeignClient(contextId = "remoteLogService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteLogFallbackFactory.class)
+public interface RemoteLogService {
+ /**
+ * 保存系统日志
+ *
+ * @param sysOperLog 日志实体
+ * @param source 请求来源
+ *
+ * @return 结果
+ */
+ @PostMapping("/operlog")
+ public Result saveLog (@RequestBody SysOperLog sysOperLog, @RequestHeader(SecurityConstants.FROM_SOURCE) String source) throws Exception;
+
+ /**
+ * 保存访问记录
+ *
+ * @param sysLogininfor 访问实体
+ * @param source 请求来源
+ *
+ * @return 结果
+ */
+ @PostMapping("/logininfor")
+ public Result saveLogininfor (@RequestBody SysLogininfor sysLogininfor, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+}
diff --git a/src/main/java/com/muyu/common/system/remote/RemoteUserService.java b/src/main/java/com/muyu/common/system/remote/RemoteUserService.java
new file mode 100644
index 0000000..cb968e0
--- /dev/null
+++ b/src/main/java/com/muyu/common/system/remote/RemoteUserService.java
@@ -0,0 +1,40 @@
+package com.muyu.common.system.remote;
+
+import com.muyu.common.core.constant.SecurityConstants;
+import com.muyu.common.core.constant.ServiceNameConstants;
+import com.muyu.common.core.domain.Result;
+import com.muyu.common.system.domain.SysUser;
+import com.muyu.common.system.remote.factory.RemoteUserFallbackFactory;
+import com.muyu.common.system.domain.LoginUser;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 用户服务
+ *
+ * @author muyu
+ */
+@FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
+public interface RemoteUserService {
+ /**
+ * 通过用户名查询用户信息
+ *
+ * @param username 用户名
+ * @param source 请求来源
+ *
+ * @return 结果
+ */
+ @GetMapping("/user/info/{username}")
+ public Result getUserInfo (@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ /**
+ * 注册用户信息
+ *
+ * @param sysUser 用户信息
+ * @param source 请求来源
+ *
+ * @return 结果
+ */
+ @PostMapping("/user/register")
+ public Result registerUserInfo (@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+}
diff --git a/src/main/java/com/muyu/common/system/remote/factory/RemoteFileFallbackFactory.java b/src/main/java/com/muyu/common/system/remote/factory/RemoteFileFallbackFactory.java
new file mode 100644
index 0000000..395f74f
--- /dev/null
+++ b/src/main/java/com/muyu/common/system/remote/factory/RemoteFileFallbackFactory.java
@@ -0,0 +1,31 @@
+package com.muyu.common.system.remote.factory;
+
+import com.muyu.common.core.domain.Result;
+import com.muyu.common.system.remote.RemoteFileService;
+import com.muyu.common.system.domain.SysFile;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 文件服务降级处理
+ *
+ * @author muyu
+ */
+@Component
+public class RemoteFileFallbackFactory implements FallbackFactory {
+ private static final Logger log = LoggerFactory.getLogger(RemoteFileFallbackFactory.class);
+
+ @Override
+ public RemoteFileService create (Throwable throwable) {
+ log.error("文件服务调用失败:{}", throwable.getMessage());
+ return new RemoteFileService() {
+ @Override
+ public Result upload (MultipartFile file) {
+ return Result.error("上传文件失败:" + throwable.getMessage());
+ }
+ };
+ }
+}
diff --git a/src/main/java/com/muyu/common/system/remote/factory/RemoteLogFallbackFactory.java b/src/main/java/com/muyu/common/system/remote/factory/RemoteLogFallbackFactory.java
new file mode 100644
index 0000000..1fc0491
--- /dev/null
+++ b/src/main/java/com/muyu/common/system/remote/factory/RemoteLogFallbackFactory.java
@@ -0,0 +1,37 @@
+package com.muyu.common.system.remote.factory;
+
+import com.muyu.common.core.domain.Result;
+import com.muyu.common.system.remote.RemoteLogService;
+import com.muyu.common.system.domain.SysLogininfor;
+import com.muyu.common.system.domain.SysOperLog;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * 日志服务降级处理
+ *
+ * @author muyu
+ */
+@Component
+public class RemoteLogFallbackFactory implements FallbackFactory {
+ private static final Logger log = LoggerFactory.getLogger(RemoteLogFallbackFactory.class);
+
+ @Override
+ public RemoteLogService create (Throwable throwable) {
+ log.error("日志服务调用失败:{}", throwable.getMessage(), throwable);
+ return new RemoteLogService() {
+ @Override
+ public Result saveLog (SysOperLog sysOperLog, String source) {
+ return Result.error("保存操作日志失败:" + throwable.getMessage());
+ }
+
+ @Override
+ public Result saveLogininfor (SysLogininfor sysLogininfor, String source) {
+ return Result.error("保存登录日志失败:" + throwable.getMessage());
+ }
+ };
+
+ }
+}
diff --git a/src/main/java/com/muyu/common/system/remote/factory/RemoteUserFallbackFactory.java b/src/main/java/com/muyu/common/system/remote/factory/RemoteUserFallbackFactory.java
new file mode 100644
index 0000000..b7f4d60
--- /dev/null
+++ b/src/main/java/com/muyu/common/system/remote/factory/RemoteUserFallbackFactory.java
@@ -0,0 +1,36 @@
+package com.muyu.common.system.remote.factory;
+
+import com.muyu.common.core.domain.Result;
+import com.muyu.common.system.remote.RemoteUserService;
+import com.muyu.common.system.domain.SysUser;
+import com.muyu.common.system.domain.LoginUser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * 用户服务降级处理
+ *
+ * @author muyu
+ */
+@Component
+public class RemoteUserFallbackFactory implements FallbackFactory {
+ private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);
+
+ @Override
+ public RemoteUserService create (Throwable throwable) {
+ log.error("用户服务调用失败:{}", throwable.getMessage());
+ return new RemoteUserService() {
+ @Override
+ public Result getUserInfo (String username, String source) {
+ return Result.error("获取用户失败:" + throwable.getMessage());
+ }
+
+ @Override
+ public Result registerUserInfo (SysUser sysUser, String source) {
+ return Result.error("注册用户失败:" + throwable.getMessage());
+ }
+ };
+ }
+}
diff --git a/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
new file mode 100644
index 0000000..b9a11b8
--- /dev/null
+++ b/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1,3 @@
+com.muyu.common.system.remote.factory.RemoteUserFallbackFactory
+com.muyu.common.system.remote.factory.RemoteLogFallbackFactory
+com.muyu.common.system.remote.factory.RemoteFileFallbackFactory