From 36ea8e405f3e2ca874bafd45fa152b4629d80648 Mon Sep 17 00:00:00 2001
From: sikadi <13315935+sikadi_love@user.noreply.gitee.com>
Date: Fri, 27 Oct 2023 14:58:40 +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 | 30 ++
.../grail/system/api/RemoteFileService.java | 29 ++
.../grail/system/api/RemoteLogService.java | 41 +++
.../grail/system/api/RemoteUserService.java | 43 +++
.../grail/system/api/RemoteWalletService.java | 12 +
.../com/grail/system/api/domain/SysDept.java | 203 +++++++++++
.../grail/system/api/domain/SysDictData.java | 176 ++++++++++
.../grail/system/api/domain/SysDictType.java | 96 ++++++
.../com/grail/system/api/domain/SysFile.java | 50 +++
.../system/api/domain/SysLogininfor.java | 102 ++++++
.../grail/system/api/domain/SysOperLog.java | 255 ++++++++++++++
.../com/grail/system/api/domain/SysRole.java | 241 +++++++++++++
.../com/grail/system/api/domain/SysUser.java | 323 ++++++++++++++++++
.../factory/RemoteFileFallbackFactory.java | 35 ++
.../api/factory/RemoteLogFallbackFactory.java | 42 +++
.../factory/RemoteUserFallbackFactory.java | 41 +++
.../factory/RemoteWalletFallbackFactory.java | 18 +
.../grail/system/api/model/CenterUser.java | 86 +++++
.../com/grail/system/api/model/LoginUser.java | 163 +++++++++
...ot.autoconfigure.AutoConfiguration.imports | 4 +
21 files changed, 2036 insertions(+)
create mode 100644 .gitignore
create mode 100644 pom.xml
create mode 100644 src/main/java/com/grail/system/api/RemoteFileService.java
create mode 100644 src/main/java/com/grail/system/api/RemoteLogService.java
create mode 100644 src/main/java/com/grail/system/api/RemoteUserService.java
create mode 100644 src/main/java/com/grail/system/api/RemoteWalletService.java
create mode 100644 src/main/java/com/grail/system/api/domain/SysDept.java
create mode 100644 src/main/java/com/grail/system/api/domain/SysDictData.java
create mode 100644 src/main/java/com/grail/system/api/domain/SysDictType.java
create mode 100644 src/main/java/com/grail/system/api/domain/SysFile.java
create mode 100644 src/main/java/com/grail/system/api/domain/SysLogininfor.java
create mode 100644 src/main/java/com/grail/system/api/domain/SysOperLog.java
create mode 100644 src/main/java/com/grail/system/api/domain/SysRole.java
create mode 100644 src/main/java/com/grail/system/api/domain/SysUser.java
create mode 100644 src/main/java/com/grail/system/api/factory/RemoteFileFallbackFactory.java
create mode 100644 src/main/java/com/grail/system/api/factory/RemoteLogFallbackFactory.java
create mode 100644 src/main/java/com/grail/system/api/factory/RemoteUserFallbackFactory.java
create mode 100644 src/main/java/com/grail/system/api/factory/RemoteWalletFallbackFactory.java
create mode 100644 src/main/java/com/grail/system/api/model/CenterUser.java
create mode 100644 src/main/java/com/grail/system/api/model/LoginUser.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..de699e9
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,30 @@
+
+
+
+ com.grail
+ grail-api
+ 3.6.3
+
+ 4.0.0
+
+ grail-api-system
+
+
+ grail-api-system接口模块11
+
+
+ 3.6.3
+
+
+
+
+
+ com.grail
+ grail-common-core
+
+
+
+
+
diff --git a/src/main/java/com/grail/system/api/RemoteFileService.java b/src/main/java/com/grail/system/api/RemoteFileService.java
new file mode 100644
index 0000000..bfa83f0
--- /dev/null
+++ b/src/main/java/com/grail/system/api/RemoteFileService.java
@@ -0,0 +1,29 @@
+package com.grail.system.api;
+
+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;
+import com.grail.common.core.constant.ServiceNameConstants;
+import com.grail.common.core.domain.R;
+import com.grail.system.api.domain.SysFile;
+import com.grail.system.api.factory.RemoteFileFallbackFactory;
+
+/**
+ * 文件服务
+ *
+ * @author grail
+ */
+@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 R upload(@RequestPart(value = "file") MultipartFile file);
+}
diff --git a/src/main/java/com/grail/system/api/RemoteLogService.java b/src/main/java/com/grail/system/api/RemoteLogService.java
new file mode 100644
index 0000000..4fc1125
--- /dev/null
+++ b/src/main/java/com/grail/system/api/RemoteLogService.java
@@ -0,0 +1,41 @@
+package com.grail.system.api;
+
+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;
+import com.grail.common.core.constant.SecurityConstants;
+import com.grail.common.core.constant.ServiceNameConstants;
+import com.grail.common.core.domain.R;
+import com.grail.system.api.domain.SysLogininfor;
+import com.grail.system.api.domain.SysOperLog;
+import com.grail.system.api.factory.RemoteLogFallbackFactory;
+
+/**
+ * 日志服务
+ *
+ * @author grail
+ */
+@FeignClient(contextId = "remoteLogService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteLogFallbackFactory.class)
+public interface RemoteLogService
+{
+ /**
+ * 保存系统日志
+ *
+ * @param sysOperLog 日志实体
+ * @param source 请求来源
+ * @return 结果
+ */
+ @PostMapping("/operlog")
+ public R saveLog(@RequestBody SysOperLog sysOperLog, @RequestHeader(SecurityConstants.FROM_SOURCE) String source) throws Exception;
+
+ /**
+ * 保存访问记录
+ *
+ * @param sysLogininfor 访问实体
+ * @param source 请求来源
+ * @return 结果
+ */
+ @PostMapping("/logininfor")
+ public R saveLogininfor(@RequestBody SysLogininfor sysLogininfor, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+}
diff --git a/src/main/java/com/grail/system/api/RemoteUserService.java b/src/main/java/com/grail/system/api/RemoteUserService.java
new file mode 100644
index 0000000..41028b7
--- /dev/null
+++ b/src/main/java/com/grail/system/api/RemoteUserService.java
@@ -0,0 +1,43 @@
+package com.grail.system.api;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import com.grail.common.core.constant.SecurityConstants;
+import com.grail.common.core.constant.ServiceNameConstants;
+import com.grail.common.core.domain.R;
+import com.grail.system.api.domain.SysUser;
+import com.grail.system.api.factory.RemoteUserFallbackFactory;
+import com.grail.system.api.model.LoginUser;
+
+/**
+ * 用户服务
+ *
+ * @author grail
+ */
+@FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
+public interface RemoteUserService
+{
+ /**
+ * 通过用户名查询用户信息
+ *
+ * @param username 用户名
+ * @param source 请求来源
+ * @return 结果
+ */
+ @GetMapping("/user/info/{username}")
+ public R getUserInfo(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ /**
+ * 注册用户信息
+ *
+ * @param sysUser 用户信息
+ * @param source 请求来源
+ * @return 结果
+ */
+ @PostMapping("/user/register")
+ public R registerUserInfo(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+}
diff --git a/src/main/java/com/grail/system/api/RemoteWalletService.java b/src/main/java/com/grail/system/api/RemoteWalletService.java
new file mode 100644
index 0000000..fc87f6d
--- /dev/null
+++ b/src/main/java/com/grail/system/api/RemoteWalletService.java
@@ -0,0 +1,12 @@
+package com.grail.system.api;
+
+import org.springframework.cloud.openfeign.FeignClient;
+
+/**
+ * @description: TODO
+ * @author: SIKADI
+ * @date: 2023/10/23 16:56
+ **/
+@FeignClient(value = )
+public interface RemoteWalletService {
+}
diff --git a/src/main/java/com/grail/system/api/domain/SysDept.java b/src/main/java/com/grail/system/api/domain/SysDept.java
new file mode 100644
index 0000000..aa732ef
--- /dev/null
+++ b/src/main/java/com/grail/system/api/domain/SysDept.java
@@ -0,0 +1,203 @@
+package com.grail.system.api.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.grail.common.core.web.domain.BaseEntity;
+
+/**
+ * 部门表 sys_dept
+ *
+ * @author grail
+ */
+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();
+
+ public Long getDeptId()
+ {
+ return deptId;
+ }
+
+ public void setDeptId(Long deptId)
+ {
+ this.deptId = deptId;
+ }
+
+ public Long getParentId()
+ {
+ return parentId;
+ }
+
+ public void setParentId(Long parentId)
+ {
+ this.parentId = parentId;
+ }
+
+ public String getAncestors()
+ {
+ return ancestors;
+ }
+
+ public void setAncestors(String ancestors)
+ {
+ this.ancestors = ancestors;
+ }
+
+ @NotBlank(message = "部门名称不能为空")
+ @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
+ public String getDeptName()
+ {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName)
+ {
+ this.deptName = deptName;
+ }
+
+ @NotNull(message = "显示顺序不能为空")
+ public Integer getOrderNum()
+ {
+ return orderNum;
+ }
+
+ public void setOrderNum(Integer orderNum)
+ {
+ this.orderNum = orderNum;
+ }
+
+ public String getLeader()
+ {
+ return leader;
+ }
+
+ public void setLeader(String leader)
+ {
+ this.leader = leader;
+ }
+
+ @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符")
+ public String getPhone()
+ {
+ return phone;
+ }
+
+ public void setPhone(String phone)
+ {
+ this.phone = phone;
+ }
+
+ @Email(message = "邮箱格式不正确")
+ @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
+ public String getEmail()
+ {
+ return email;
+ }
+
+ public void setEmail(String email)
+ {
+ this.email = email;
+ }
+
+ public String getStatus()
+ {
+ return status;
+ }
+
+ public void setStatus(String status)
+ {
+ this.status = status;
+ }
+
+ public String getDelFlag()
+ {
+ return delFlag;
+ }
+
+ public void setDelFlag(String delFlag)
+ {
+ this.delFlag = delFlag;
+ }
+
+ public String getParentName()
+ {
+ return parentName;
+ }
+
+ public void setParentName(String parentName)
+ {
+ this.parentName = parentName;
+ }
+
+ public List getChildren()
+ {
+ return children;
+ }
+
+ public void setChildren(List children)
+ {
+ this.children = children;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+ .append("deptId", getDeptId())
+ .append("parentId", getParentId())
+ .append("ancestors", getAncestors())
+ .append("deptName", getDeptName())
+ .append("orderNum", getOrderNum())
+ .append("leader", getLeader())
+ .append("phone", getPhone())
+ .append("email", getEmail())
+ .append("status", getStatus())
+ .append("delFlag", getDelFlag())
+ .append("createBy", getCreateBy())
+ .append("createTime", getCreateTime())
+ .append("updateBy", getUpdateBy())
+ .append("updateTime", getUpdateTime())
+ .toString();
+ }
+}
diff --git a/src/main/java/com/grail/system/api/domain/SysDictData.java b/src/main/java/com/grail/system/api/domain/SysDictData.java
new file mode 100644
index 0000000..b14b206
--- /dev/null
+++ b/src/main/java/com/grail/system/api/domain/SysDictData.java
@@ -0,0 +1,176 @@
+package com.grail.system.api.domain;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.grail.common.core.annotation.Excel;
+import com.grail.common.core.annotation.Excel.ColumnType;
+import com.grail.common.core.constant.UserConstants;
+import com.grail.common.core.web.domain.BaseEntity;
+
+/**
+ * 字典数据表 sys_dict_data
+ *
+ * @author grail
+ */
+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;
+
+ public Long getDictCode()
+ {
+ return dictCode;
+ }
+
+ public void setDictCode(Long dictCode)
+ {
+ this.dictCode = dictCode;
+ }
+
+ public Long getDictSort()
+ {
+ return dictSort;
+ }
+
+ public void setDictSort(Long dictSort)
+ {
+ this.dictSort = dictSort;
+ }
+
+ @NotBlank(message = "字典标签不能为空")
+ @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符")
+ public String getDictLabel()
+ {
+ return dictLabel;
+ }
+
+ public void setDictLabel(String dictLabel)
+ {
+ this.dictLabel = dictLabel;
+ }
+
+ @NotBlank(message = "字典键值不能为空")
+ @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符")
+ public String getDictValue()
+ {
+ return dictValue;
+ }
+
+ public void setDictValue(String dictValue)
+ {
+ this.dictValue = dictValue;
+ }
+
+ @NotBlank(message = "字典类型不能为空")
+ @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符")
+ public String getDictType()
+ {
+ return dictType;
+ }
+
+ public void setDictType(String dictType)
+ {
+ this.dictType = dictType;
+ }
+
+ @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符")
+ public String getCssClass()
+ {
+ return cssClass;
+ }
+
+ public void setCssClass(String cssClass)
+ {
+ this.cssClass = cssClass;
+ }
+
+ public String getListClass()
+ {
+ return listClass;
+ }
+
+ public void setListClass(String listClass)
+ {
+ this.listClass = listClass;
+ }
+
+ public boolean getDefault()
+ {
+ return UserConstants.YES.equals(this.isDefault);
+ }
+
+ public String getIsDefault()
+ {
+ return isDefault;
+ }
+
+ public void setIsDefault(String isDefault)
+ {
+ this.isDefault = isDefault;
+ }
+
+ public String getStatus()
+ {
+ return status;
+ }
+
+ public void setStatus(String status)
+ {
+ this.status = status;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+ .append("dictCode", getDictCode())
+ .append("dictSort", getDictSort())
+ .append("dictLabel", getDictLabel())
+ .append("dictValue", getDictValue())
+ .append("dictType", getDictType())
+ .append("cssClass", getCssClass())
+ .append("listClass", getListClass())
+ .append("isDefault", getIsDefault())
+ .append("status", getStatus())
+ .append("createBy", getCreateBy())
+ .append("createTime", getCreateTime())
+ .append("updateBy", getUpdateBy())
+ .append("updateTime", getUpdateTime())
+ .append("remark", getRemark())
+ .toString();
+ }
+}
diff --git a/src/main/java/com/grail/system/api/domain/SysDictType.java b/src/main/java/com/grail/system/api/domain/SysDictType.java
new file mode 100644
index 0000000..ad5464d
--- /dev/null
+++ b/src/main/java/com/grail/system/api/domain/SysDictType.java
@@ -0,0 +1,96 @@
+package com.grail.system.api.domain;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.grail.common.core.annotation.Excel;
+import com.grail.common.core.annotation.Excel.ColumnType;
+import com.grail.common.core.web.domain.BaseEntity;
+
+/**
+ * 字典类型表 sys_dict_type
+ *
+ * @author grail
+ */
+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;
+
+ public Long getDictId()
+ {
+ return dictId;
+ }
+
+ public void setDictId(Long dictId)
+ {
+ this.dictId = dictId;
+ }
+
+ @NotBlank(message = "字典名称不能为空")
+ @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符")
+ public String getDictName()
+ {
+ return dictName;
+ }
+
+ public void setDictName(String dictName)
+ {
+ this.dictName = dictName;
+ }
+
+ @NotBlank(message = "字典类型不能为空")
+ @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符")
+ @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)")
+ public String getDictType()
+ {
+ return dictType;
+ }
+
+ public void setDictType(String dictType)
+ {
+ this.dictType = dictType;
+ }
+
+ public String getStatus()
+ {
+ return status;
+ }
+
+ public void setStatus(String status)
+ {
+ this.status = status;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+ .append("dictId", getDictId())
+ .append("dictName", getDictName())
+ .append("dictType", getDictType())
+ .append("status", getStatus())
+ .append("createBy", getCreateBy())
+ .append("createTime", getCreateTime())
+ .append("updateBy", getUpdateBy())
+ .append("updateTime", getUpdateTime())
+ .append("remark", getRemark())
+ .toString();
+ }
+}
diff --git a/src/main/java/com/grail/system/api/domain/SysFile.java b/src/main/java/com/grail/system/api/domain/SysFile.java
new file mode 100644
index 0000000..265695e
--- /dev/null
+++ b/src/main/java/com/grail/system/api/domain/SysFile.java
@@ -0,0 +1,50 @@
+package com.grail.system.api.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 文件信息
+ *
+ * @author grail
+ */
+public class SysFile
+{
+ /**
+ * 文件名称
+ */
+ private String name;
+
+ /**
+ * 文件地址
+ */
+ private String url;
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ public String getUrl()
+ {
+ return url;
+ }
+
+ public void setUrl(String url)
+ {
+ this.url = url;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+ .append("name", getName())
+ .append("url", getUrl())
+ .toString();
+ }
+}
diff --git a/src/main/java/com/grail/system/api/domain/SysLogininfor.java b/src/main/java/com/grail/system/api/domain/SysLogininfor.java
new file mode 100644
index 0000000..52f7f3e
--- /dev/null
+++ b/src/main/java/com/grail/system/api/domain/SysLogininfor.java
@@ -0,0 +1,102 @@
+package com.grail.system.api.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.grail.common.core.annotation.Excel;
+import com.grail.common.core.annotation.Excel.ColumnType;
+import com.grail.common.core.web.domain.BaseEntity;
+
+/**
+ * 系统访问记录表 sys_logininfor
+ *
+ * @author grail
+ */
+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;
+
+ public Long getInfoId()
+ {
+ return infoId;
+ }
+
+ public void setInfoId(Long infoId)
+ {
+ this.infoId = infoId;
+ }
+
+ public String getUserName()
+ {
+ return userName;
+ }
+
+ public void setUserName(String userName)
+ {
+ this.userName = userName;
+ }
+
+ public String getStatus()
+ {
+ return status;
+ }
+
+ public void setStatus(String status)
+ {
+ this.status = status;
+ }
+
+ public String getIpaddr()
+ {
+ return ipaddr;
+ }
+
+ public void setIpaddr(String ipaddr)
+ {
+ this.ipaddr = ipaddr;
+ }
+
+ public String getMsg()
+ {
+ return msg;
+ }
+
+ public void setMsg(String msg)
+ {
+ this.msg = msg;
+ }
+
+ public Date getAccessTime()
+ {
+ return accessTime;
+ }
+
+ public void setAccessTime(Date accessTime)
+ {
+ this.accessTime = accessTime;
+ }
+}
diff --git a/src/main/java/com/grail/system/api/domain/SysOperLog.java b/src/main/java/com/grail/system/api/domain/SysOperLog.java
new file mode 100644
index 0000000..d0d1414
--- /dev/null
+++ b/src/main/java/com/grail/system/api/domain/SysOperLog.java
@@ -0,0 +1,255 @@
+package com.grail.system.api.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.grail.common.core.annotation.Excel;
+import com.grail.common.core.annotation.Excel.ColumnType;
+import com.grail.common.core.web.domain.BaseEntity;
+
+/**
+ * 操作日志记录表 oper_log
+ *
+ * @author grail
+ */
+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;
+
+ public Long getOperId()
+ {
+ return operId;
+ }
+
+ public void setOperId(Long operId)
+ {
+ this.operId = operId;
+ }
+
+ public String getTitle()
+ {
+ return title;
+ }
+
+ public void setTitle(String title)
+ {
+ this.title = title;
+ }
+
+ public Integer getBusinessType()
+ {
+ return businessType;
+ }
+
+ public void setBusinessType(Integer businessType)
+ {
+ this.businessType = businessType;
+ }
+
+ public Integer[] getBusinessTypes()
+ {
+ return businessTypes;
+ }
+
+ public void setBusinessTypes(Integer[] businessTypes)
+ {
+ this.businessTypes = businessTypes;
+ }
+
+ public String getMethod()
+ {
+ return method;
+ }
+
+ public void setMethod(String method)
+ {
+ this.method = method;
+ }
+
+ public String getRequestMethod()
+ {
+ return requestMethod;
+ }
+
+ public void setRequestMethod(String requestMethod)
+ {
+ this.requestMethod = requestMethod;
+ }
+
+ public Integer getOperatorType()
+ {
+ return operatorType;
+ }
+
+ public void setOperatorType(Integer operatorType)
+ {
+ this.operatorType = operatorType;
+ }
+
+ public String getOperName()
+ {
+ return operName;
+ }
+
+ public void setOperName(String operName)
+ {
+ this.operName = operName;
+ }
+
+ public String getDeptName()
+ {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName)
+ {
+ this.deptName = deptName;
+ }
+
+ public String getOperUrl()
+ {
+ return operUrl;
+ }
+
+ public void setOperUrl(String operUrl)
+ {
+ this.operUrl = operUrl;
+ }
+
+ public String getOperIp()
+ {
+ return operIp;
+ }
+
+ public void setOperIp(String operIp)
+ {
+ this.operIp = operIp;
+ }
+
+ public String getOperParam()
+ {
+ return operParam;
+ }
+
+ public void setOperParam(String operParam)
+ {
+ this.operParam = operParam;
+ }
+
+ public String getJsonResult()
+ {
+ return jsonResult;
+ }
+
+ public void setJsonResult(String jsonResult)
+ {
+ this.jsonResult = jsonResult;
+ }
+
+ public Integer getStatus()
+ {
+ return status;
+ }
+
+ public void setStatus(Integer status)
+ {
+ this.status = status;
+ }
+
+ public String getErrorMsg()
+ {
+ return errorMsg;
+ }
+
+ public void setErrorMsg(String errorMsg)
+ {
+ this.errorMsg = errorMsg;
+ }
+
+ public Date getOperTime()
+ {
+ return operTime;
+ }
+
+ public void setOperTime(Date operTime)
+ {
+ this.operTime = operTime;
+ }
+
+ public Long getCostTime()
+ {
+ return costTime;
+ }
+
+ public void setCostTime(Long costTime)
+ {
+ this.costTime = costTime;
+ }
+}
diff --git a/src/main/java/com/grail/system/api/domain/SysRole.java b/src/main/java/com/grail/system/api/domain/SysRole.java
new file mode 100644
index 0000000..63a9f60
--- /dev/null
+++ b/src/main/java/com/grail/system/api/domain/SysRole.java
@@ -0,0 +1,241 @@
+package com.grail.system.api.domain;
+
+import java.util.Set;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.grail.common.core.annotation.Excel;
+import com.grail.common.core.annotation.Excel.ColumnType;
+import com.grail.common.core.web.domain.BaseEntity;
+
+/**
+ * 角色表 sys_role
+ *
+ * @author grail
+ */
+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()
+ {
+
+ }
+
+ public SysRole(Long roleId)
+ {
+ this.roleId = roleId;
+ }
+
+ public Long getRoleId()
+ {
+ return roleId;
+ }
+
+ public void setRoleId(Long roleId)
+ {
+ this.roleId = roleId;
+ }
+
+ public boolean isAdmin()
+ {
+ return isAdmin(this.roleId);
+ }
+
+ public static boolean isAdmin(Long roleId)
+ {
+ return roleId != null && 1L == roleId;
+ }
+
+ @NotBlank(message = "角色名称不能为空")
+ @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符")
+ public String getRoleName()
+ {
+ return roleName;
+ }
+
+ public void setRoleName(String roleName)
+ {
+ this.roleName = roleName;
+ }
+
+ @NotBlank(message = "权限字符不能为空")
+ @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符")
+ public String getRoleKey()
+ {
+ return roleKey;
+ }
+
+ public void setRoleKey(String roleKey)
+ {
+ this.roleKey = roleKey;
+ }
+
+ @NotNull(message = "显示顺序不能为空")
+ public Integer getRoleSort()
+ {
+ return roleSort;
+ }
+
+ public void setRoleSort(Integer roleSort)
+ {
+ this.roleSort = roleSort;
+ }
+
+ public String getDataScope()
+ {
+ return dataScope;
+ }
+
+ public void setDataScope(String dataScope)
+ {
+ this.dataScope = dataScope;
+ }
+
+ public boolean isMenuCheckStrictly()
+ {
+ return menuCheckStrictly;
+ }
+
+ public void setMenuCheckStrictly(boolean menuCheckStrictly)
+ {
+ this.menuCheckStrictly = menuCheckStrictly;
+ }
+
+ public boolean isDeptCheckStrictly()
+ {
+ return deptCheckStrictly;
+ }
+
+ public void setDeptCheckStrictly(boolean deptCheckStrictly)
+ {
+ this.deptCheckStrictly = deptCheckStrictly;
+ }
+
+ public String getStatus()
+ {
+ return status;
+ }
+
+ public void setStatus(String status)
+ {
+ this.status = status;
+ }
+
+ public String getDelFlag()
+ {
+ return delFlag;
+ }
+
+ public void setDelFlag(String delFlag)
+ {
+ this.delFlag = delFlag;
+ }
+
+ public boolean isFlag()
+ {
+ return flag;
+ }
+
+ public void setFlag(boolean flag)
+ {
+ this.flag = flag;
+ }
+
+ public Long[] getMenuIds()
+ {
+ return menuIds;
+ }
+
+ public void setMenuIds(Long[] menuIds)
+ {
+ this.menuIds = menuIds;
+ }
+
+ public Long[] getDeptIds()
+ {
+ return deptIds;
+ }
+
+ public void setDeptIds(Long[] deptIds)
+ {
+ this.deptIds = deptIds;
+ }
+
+ public Set getPermissions()
+ {
+ return permissions;
+ }
+
+ public void setPermissions(Set permissions)
+ {
+ this.permissions = permissions;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+ .append("roleId", getRoleId())
+ .append("roleName", getRoleName())
+ .append("roleKey", getRoleKey())
+ .append("roleSort", getRoleSort())
+ .append("dataScope", getDataScope())
+ .append("menuCheckStrictly", isMenuCheckStrictly())
+ .append("deptCheckStrictly", isDeptCheckStrictly())
+ .append("status", getStatus())
+ .append("delFlag", getDelFlag())
+ .append("createBy", getCreateBy())
+ .append("createTime", getCreateTime())
+ .append("updateBy", getUpdateBy())
+ .append("updateTime", getUpdateTime())
+ .append("remark", getRemark())
+ .toString();
+ }
+}
diff --git a/src/main/java/com/grail/system/api/domain/SysUser.java b/src/main/java/com/grail/system/api/domain/SysUser.java
new file mode 100644
index 0000000..8af2fb1
--- /dev/null
+++ b/src/main/java/com/grail/system/api/domain/SysUser.java
@@ -0,0 +1,323 @@
+package com.grail.system.api.domain;
+
+import java.util.Date;
+import java.util.List;
+import javax.validation.constraints.*;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.grail.common.core.annotation.Excel;
+import com.grail.common.core.annotation.Excel.ColumnType;
+import com.grail.common.core.annotation.Excel.Type;
+import com.grail.common.core.annotation.Excels;
+import com.grail.common.core.web.domain.BaseEntity;
+import com.grail.common.core.xss.Xss;
+
+/**
+ * 用户对象 sys_user
+ *
+ * @author grail
+ */
+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()
+ {
+
+ }
+
+ public SysUser(Long userId)
+ {
+ this.userId = userId;
+ }
+
+ public Long getUserId()
+ {
+ return userId;
+ }
+
+ public void setUserId(Long userId)
+ {
+ this.userId = userId;
+ }
+
+ public boolean isAdmin()
+ {
+ return isAdmin(this.userId);
+ }
+
+ public static boolean isAdmin(Long userId)
+ {
+ return userId != null && 1L == userId;
+ }
+
+ public Long getDeptId()
+ {
+ return deptId;
+ }
+
+ public void setDeptId(Long deptId)
+ {
+ this.deptId = deptId;
+ }
+
+ @Xss(message = "用户昵称不能包含脚本字符")
+ @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
+ public String getNickName()
+ {
+ return nickName;
+ }
+
+ public void setNickName(String nickName)
+ {
+ this.nickName = nickName;
+ }
+
+ @Xss(message = "用户账号不能包含脚本字符")
+ @NotBlank(message = "用户账号不能为空")
+ @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
+ public String getUserName()
+ {
+ return userName;
+ }
+
+ public void setUserName(String userName)
+ {
+ this.userName = userName;
+ }
+
+ @Email(message = "邮箱格式不正确")
+ @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
+ public String getEmail()
+ {
+ return email;
+ }
+
+ public void setEmail(String email)
+ {
+ this.email = email;
+ }
+
+ @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符")
+ public String getPhonenumber()
+ {
+ return phonenumber;
+ }
+
+ public void setPhonenumber(String phonenumber)
+ {
+ this.phonenumber = phonenumber;
+ }
+
+ public String getSex()
+ {
+ return sex;
+ }
+
+ public void setSex(String sex)
+ {
+ this.sex = sex;
+ }
+
+ public String getAvatar()
+ {
+ return avatar;
+ }
+
+ public void setAvatar(String avatar)
+ {
+ this.avatar = avatar;
+ }
+
+ public String getPassword()
+ {
+ return password;
+ }
+
+ public void setPassword(String password)
+ {
+ this.password = password;
+ }
+
+ public String getStatus()
+ {
+ return status;
+ }
+
+ public void setStatus(String status)
+ {
+ this.status = status;
+ }
+
+ public String getDelFlag()
+ {
+ return delFlag;
+ }
+
+ public void setDelFlag(String delFlag)
+ {
+ this.delFlag = delFlag;
+ }
+
+ public String getLoginIp()
+ {
+ return loginIp;
+ }
+
+ public void setLoginIp(String loginIp)
+ {
+ this.loginIp = loginIp;
+ }
+
+ public Date getLoginDate()
+ {
+ return loginDate;
+ }
+
+ public void setLoginDate(Date loginDate)
+ {
+ this.loginDate = loginDate;
+ }
+
+ public SysDept getDept()
+ {
+ return dept;
+ }
+
+ public void setDept(SysDept dept)
+ {
+ this.dept = dept;
+ }
+
+ public List getRoles()
+ {
+ return roles;
+ }
+
+ public void setRoles(List roles)
+ {
+ this.roles = roles;
+ }
+
+ public Long[] getRoleIds()
+ {
+ return roleIds;
+ }
+
+ public void setRoleIds(Long[] roleIds)
+ {
+ this.roleIds = roleIds;
+ }
+
+ public Long[] getPostIds()
+ {
+ return postIds;
+ }
+
+ public void setPostIds(Long[] postIds)
+ {
+ this.postIds = postIds;
+ }
+
+ public Long getRoleId()
+ {
+ return roleId;
+ }
+
+ public void setRoleId(Long roleId)
+ {
+ this.roleId = roleId;
+ }
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+ .append("userId", getUserId())
+ .append("deptId", getDeptId())
+ .append("userName", getUserName())
+ .append("nickName", getNickName())
+ .append("email", getEmail())
+ .append("phonenumber", getPhonenumber())
+ .append("sex", getSex())
+ .append("avatar", getAvatar())
+ .append("password", getPassword())
+ .append("status", getStatus())
+ .append("delFlag", getDelFlag())
+ .append("loginIp", getLoginIp())
+ .append("loginDate", getLoginDate())
+ .append("createBy", getCreateBy())
+ .append("createTime", getCreateTime())
+ .append("updateBy", getUpdateBy())
+ .append("updateTime", getUpdateTime())
+ .append("remark", getRemark())
+ .append("dept", getDept())
+ .toString();
+ }
+}
diff --git a/src/main/java/com/grail/system/api/factory/RemoteFileFallbackFactory.java b/src/main/java/com/grail/system/api/factory/RemoteFileFallbackFactory.java
new file mode 100644
index 0000000..281d7f5
--- /dev/null
+++ b/src/main/java/com/grail/system/api/factory/RemoteFileFallbackFactory.java
@@ -0,0 +1,35 @@
+package com.grail.system.api.factory;
+
+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;
+import com.grail.common.core.domain.R;
+import com.grail.system.api.RemoteFileService;
+import com.grail.system.api.domain.SysFile;
+
+/**
+ * 文件服务降级处理
+ *
+ * @author grail
+ */
+@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 R upload(MultipartFile file)
+ {
+ return R.fail("上传文件失败:" + throwable.getMessage());
+ }
+ };
+ }
+}
diff --git a/src/main/java/com/grail/system/api/factory/RemoteLogFallbackFactory.java b/src/main/java/com/grail/system/api/factory/RemoteLogFallbackFactory.java
new file mode 100644
index 0000000..7635a0a
--- /dev/null
+++ b/src/main/java/com/grail/system/api/factory/RemoteLogFallbackFactory.java
@@ -0,0 +1,42 @@
+package com.grail.system.api.factory;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+import com.grail.common.core.domain.R;
+import com.grail.system.api.RemoteLogService;
+import com.grail.system.api.domain.SysLogininfor;
+import com.grail.system.api.domain.SysOperLog;
+
+/**
+ * 日志服务降级处理
+ *
+ * @author grail
+ */
+@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());
+ return new RemoteLogService()
+ {
+ @Override
+ public R saveLog(SysOperLog sysOperLog, String source)
+ {
+ return R.fail("保存操作日志失败:" + throwable.getMessage());
+ }
+
+ @Override
+ public R saveLogininfor(SysLogininfor sysLogininfor, String source)
+ {
+ return R.fail("保存登录日志失败:" + throwable.getMessage());
+ }
+ };
+
+ }
+}
diff --git a/src/main/java/com/grail/system/api/factory/RemoteUserFallbackFactory.java b/src/main/java/com/grail/system/api/factory/RemoteUserFallbackFactory.java
new file mode 100644
index 0000000..06ba954
--- /dev/null
+++ b/src/main/java/com/grail/system/api/factory/RemoteUserFallbackFactory.java
@@ -0,0 +1,41 @@
+package com.grail.system.api.factory;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+import com.grail.common.core.domain.R;
+import com.grail.system.api.RemoteUserService;
+import com.grail.system.api.domain.SysUser;
+import com.grail.system.api.model.LoginUser;
+
+/**
+ * 用户服务降级处理
+ *
+ * @author grail
+ */
+@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 R getUserInfo(String username, String source)
+ {
+ return R.fail("获取用户失败:" + throwable.getMessage());
+ }
+
+ @Override
+ public R registerUserInfo(SysUser sysUser, String source)
+ {
+ return R.fail("注册用户失败:" + throwable.getMessage());
+ }
+ };
+ }
+}
diff --git a/src/main/java/com/grail/system/api/factory/RemoteWalletFallbackFactory.java b/src/main/java/com/grail/system/api/factory/RemoteWalletFallbackFactory.java
new file mode 100644
index 0000000..8fa121e
--- /dev/null
+++ b/src/main/java/com/grail/system/api/factory/RemoteWalletFallbackFactory.java
@@ -0,0 +1,18 @@
+package com.grail.system.api.factory;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * @description: TODO
+ * @author: SIKADI
+ * @date: 2023/10/22 20:09
+ **/
+@Component
+public class RemoteWalletFallbackFactory {
+
+ private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);
+
+
+}
diff --git a/src/main/java/com/grail/system/api/model/CenterUser.java b/src/main/java/com/grail/system/api/model/CenterUser.java
new file mode 100644
index 0000000..83f2ed8
--- /dev/null
+++ b/src/main/java/com/grail/system/api/model/CenterUser.java
@@ -0,0 +1,86 @@
+package com.grail.system.api.model;
+
+/**
+ * @description: TODO
+ * @author: SIKADI
+ * @date: 2023/10/22 15:03
+ **/
+public class CenterUser {
+ /**
+ * 用戶ID
+ */
+ private Integer userId;
+
+ /**
+ * 用户名称
+ */
+ private String userName;
+
+ /**
+ * 用户密码
+ */
+ private String userPassword;
+
+ /**
+ * 用户邮箱
+ */
+ private String userEmail;
+
+ /**
+ * 用户头像
+ */
+ private String userAvatar;
+
+ /**
+ * 用户权限
+ */
+ private Integer roleId;
+
+ public Integer getUserId() {
+ return userId;
+ }
+
+ public void setUserId(Integer userId) {
+ this.userId = userId;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public String getUserPassword() {
+ return userPassword;
+ }
+
+ public void setUserPassword(String userPassword) {
+ this.userPassword = userPassword;
+ }
+
+ public String getUserEmail() {
+ return userEmail;
+ }
+
+ public void setUserEmail(String userEmail) {
+ this.userEmail = userEmail;
+ }
+
+ public String getUserAvatar() {
+ return userAvatar;
+ }
+
+ public void setUserAvatar(String userAvatar) {
+ this.userAvatar = userAvatar;
+ }
+
+ public Integer getRoleId() {
+ return roleId;
+ }
+
+ public void setRoleId(Integer roleId) {
+ this.roleId = roleId;
+ }
+}
diff --git a/src/main/java/com/grail/system/api/model/LoginUser.java b/src/main/java/com/grail/system/api/model/LoginUser.java
new file mode 100644
index 0000000..9dd2290
--- /dev/null
+++ b/src/main/java/com/grail/system/api/model/LoginUser.java
@@ -0,0 +1,163 @@
+package com.grail.system.api.model;
+
+import java.io.Serializable;
+import java.util.Set;
+import com.grail.system.api.domain.SysUser;
+
+/**
+ * 用户信息
+ *
+ * @author grail
+ */
+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;
+
+ /**
+ * 中心用户
+ */
+ private CenterUser centerUser;
+
+ public String getToken()
+ {
+ return token;
+ }
+
+ public void setToken(String token)
+ {
+ this.token = token;
+ }
+
+ public Long getUserid()
+ {
+ return userid;
+ }
+
+ public void setUserid(Long userid)
+ {
+ this.userid = userid;
+ }
+
+ public String getUsername()
+ {
+ return username;
+ }
+
+ public void setUsername(String username)
+ {
+ this.username = username;
+ }
+
+ public Long getLoginTime()
+ {
+ return loginTime;
+ }
+
+ public void setLoginTime(Long loginTime)
+ {
+ this.loginTime = loginTime;
+ }
+
+ public Long getExpireTime()
+ {
+ return expireTime;
+ }
+
+ public void setExpireTime(Long expireTime)
+ {
+ this.expireTime = expireTime;
+ }
+
+ public String getIpaddr()
+ {
+ return ipaddr;
+ }
+
+ public void setIpaddr(String ipaddr)
+ {
+ this.ipaddr = ipaddr;
+ }
+
+ public Set getPermissions()
+ {
+ return permissions;
+ }
+
+ public void setPermissions(Set permissions)
+ {
+ this.permissions = permissions;
+ }
+
+ public Set getRoles()
+ {
+ return roles;
+ }
+
+ public void setRoles(Set roles)
+ {
+ this.roles = roles;
+ }
+
+ public SysUser getSysUser()
+ {
+ return sysUser;
+ }
+
+ public void setSysUser(SysUser sysUser)
+ {
+ this.sysUser = sysUser;
+ }
+
+ public CenterUser getCenterUser() {
+ return centerUser;
+ }
+
+ public void setCenterUser(CenterUser centerUser) {
+ this.centerUser = centerUser;
+ }
+}
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..c08be15
--- /dev/null
+++ b/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1,4 @@
+com.grail.system.api.factory.RemoteUserFallbackFactory
+com.grail.system.api.factory.RemoteLogFallbackFactory
+com.grail.system.api.factory.RemoteFileFallbackFactory
+com.grail.system.api.factory.RemoteWalletFallbackFactory