This commit is contained in:
Jane
2023-12-22 10:59:10 +08:00
parent 751c43e199
commit d1ede2d4aa
2774 changed files with 291509 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>data-system-service-parent</artifactId>
<groupId>com.platform</groupId>
<version>0.4.x</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<version>0.4.x</version>
<artifactId>data-system-service-api</artifactId>
<dependencies>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-micro-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<!--feign 依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.platform</groupId>
<artifactId>common-core</artifactId>
<version>0.4.x</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,42 @@
package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* <p>
* 系统参数配置信息表 实体DTO
* </p>
*
* @author yuwei
* @date 2022-05-19
*/
@ApiModel(value = "系统参数配置信息表Model")
@Data
public class ConfigDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "参数名称")
@NotBlank(message = "参数名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String configName;
@ApiModelProperty(value = "参数键名")
@NotBlank(message = "参数键名不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String configKey;
@ApiModelProperty(value = "参数键值")
@NotBlank(message = "参数键值不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String configValue;
@ApiModelProperty(value = "状态")
@NotNull(message = "状态不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String status;
@ApiModelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,40 @@
package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@ApiModel(value = "部门Model")
@Data
public class DeptDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "父部门ID")
@NotBlank(message = "父部门ID不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String parentId;
@ApiModelProperty(value = "部门名称")
@NotBlank(message = "部门名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String deptName;
@ApiModelProperty(value = "部门编码")
@NotBlank(message = "部门编码不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String deptNo;
@ApiModelProperty(value = "状态")
@NotNull(message = "状态不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String status;
@ApiModelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,39 @@
package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* <p>
* 字典编码信息表 实体DTO
* </p>
*
* @author yuwei
* @date 2022-04-17
*/
@ApiModel(value = "字典编码信息表Model")
@Data
public class DictDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "字典名称")
@NotBlank(message = "字典名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String dictName;
@ApiModelProperty(value = "字典编码")
@NotBlank(message = "字典编码不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String dictCode;
@ApiModelProperty(value = "状态")
@NotNull(message = "状态不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String status;
@ApiModelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,45 @@
package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* <p>
* 字典项信息表 实体DTO
* </p>
*
* @author yuwei
* @date 2022-04-17
*/
@ApiModel(value = "字典项信息表Model")
@Data
public class DictItemDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "字典ID")
@NotBlank(message = "字典ID不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String dictId;
@ApiModelProperty(value = "字典项文本")
@NotBlank(message = "字典项文本不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String itemText;
@ApiModelProperty(value = "字典项值")
@NotBlank(message = "字典项值不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String itemValue;
@ApiModelProperty(value = "排序")
@NotNull(message = "排序不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private Integer itemSort;
@ApiModelProperty(value = "状态")
@NotNull(message = "状态不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String status;
@ApiModelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,61 @@
package cn.datax.service.system.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
@ApiModel(value = "日志Model")
@Data
@Accessors(chain = true)
public class LogDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
private String id;
@ApiModelProperty(value = "所属模块")
private String module;
@ApiModelProperty(value = "日志标题")
private String title;
@ApiModelProperty(value = "用户ID")
private String userId;
@ApiModelProperty(value = "用户名称")
private String userName;
@ApiModelProperty(value = "请求IP")
private String remoteAddr;
@ApiModelProperty(value = "请求URI")
private String requestUri;
@ApiModelProperty(value = "方法类名")
private String className;
@ApiModelProperty(value = "方法名称")
private String methodName;
@ApiModelProperty(value = "请求参数")
private String params;
@ApiModelProperty(value = "请求耗时")
private String time;
@ApiModelProperty(value = "浏览器名称")
private String browser;
@ApiModelProperty(value = "操作系统")
private String os;
@ApiModelProperty(value = "错误类型")
private String exCode;
@ApiModelProperty(value = "错误信息")
private String exMsg;
}

View File

@@ -0,0 +1,38 @@
package cn.datax.service.system.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 登录日志信息表 实体DTO
* </p>
*
* @author yuwei
* @date 2022-05-29
*/
@ApiModel(value = "登录日志信息表Model")
@Data
public class LoginLogDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
private String id;
@ApiModelProperty(value = "操作系统")
private String opOs;
@ApiModelProperty(value = "浏览器类型")
private String opBrowser;
@ApiModelProperty(value = "登录IP地址")
private String opIp;
@ApiModelProperty(value = "登录时间")
private LocalDateTime opDate;
@ApiModelProperty(value = "登录用户ID")
private String userId;
@ApiModelProperty(value = "登录用户名称")
private String userName;
}

View File

@@ -0,0 +1,66 @@
package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@ApiModel(value = "资源Model")
@Data
public class MenuDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "父资源ID")
@NotBlank(message = "父资源ID不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String parentId;
@ApiModelProperty(value = "资源名称")
@NotBlank(message = "资源名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String menuName;
@ApiModelProperty(value = "对应路由地址path")
private String menuPath;
@ApiModelProperty(value = "对应路由组件component")
private String menuComponent;
@ApiModelProperty(value = "对应路由默认跳转地址redirect")
private String menuRedirect;
@ApiModelProperty(value = "权限标识")
private String menuPerms;
@ApiModelProperty(value = "资源图标")
private String menuIcon;
@ApiModelProperty(value = "资源类型")
@NotNull(message = "类型不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String menuType;
@ApiModelProperty(value = "资源编码")
private String menuCode;
@ApiModelProperty(value = "隐藏")
@NotNull(message = "隐藏不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String menuHidden;
@ApiModelProperty(value = "排序")
@NotNull(message = "排序不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private Integer menuSort;
@ApiModelProperty(value = "状态")
@NotNull(message = "状态不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String status;
@ApiModelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,32 @@
package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@ApiModel(value = "岗位Model")
@Data
public class PostDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "岗位名称")
@NotBlank(message = "岗位名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String postName;
@ApiModelProperty(value = "状态")
@NotNull(message = "状态不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String status;
@ApiModelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,49 @@
package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
@ApiModel(value = "角色Model")
@Data
public class RoleDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "角色名称")
@NotBlank(message = "角色名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String roleName;
@ApiModelProperty(value = "角色编码")
@NotBlank(message = "角色编码不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String roleCode;
@ApiModelProperty(value = "数据范围")
@NotNull(message = "数据范围不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String dataScope;
@ApiModelProperty(value = "资源")
@NotEmpty(message = "资源不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private List<String> menuList;
@ApiModelProperty(value = "数据范围为2时自定义数据权限")
private List<String> deptList;
@ApiModelProperty(value = "状态")
@NotNull(message = "状态不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String status;
@ApiModelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,72 @@
package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.*;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.List;
@ApiModel(value = "用户Model")
@Data
public class UserDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "用户名称")
@NotBlank(message = "用户名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
@Length(min=3, max = 12, message="用户名称长度必须位于{min}-{max}之间")
private String username;
@ApiModelProperty(value = "用户昵称")
@NotBlank(message = "用户昵称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String nickname;
@ApiModelProperty(value = "用户密码")
@NotBlank(message = "用户密码不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String password;
@ApiModelProperty(value = "电子邮箱")
@NotBlank(message = "电子邮箱不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
@Email(message = "请输入正确的邮箱")
private String email;
@ApiModelProperty(value = "手机号码")
@NotBlank(message = "手机号码不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String phone;
@ApiModelProperty(value = "出生日期", example = "2019-09-09")
@NotNull(message = "出生日期不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate birthday;
@ApiModelProperty(value = "部门")
@NotBlank(message = "部门不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String deptId;
@ApiModelProperty(value = "角色")
@NotEmpty(message = "角色不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
@Size(min = 1, max = 5, message="角色长度必须位于{min}-{max}之间")
private List<String> roleList;
@ApiModelProperty(value = "岗位")
@NotEmpty(message = "岗位不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
@Size(min = 1, max = 1, message="岗位长度必须位于{min}-{max}之间")
private List<String> postList;
@ApiModelProperty(value = "状态")
@NotNull(message = "状态不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String status;
@ApiModelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,26 @@
package cn.datax.service.system.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
@ApiModel(value = "用户密码Model")
@Data
public class UserPasswordDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
private String id;
@ApiModelProperty(value = "密码")
@NotBlank(message = "密码不能为空")
private String password;
@ApiModelProperty(value = "旧密码")
@NotBlank(message = "旧密码不能为空")
private String oldPassword;
}

View File

@@ -0,0 +1,41 @@
package cn.datax.service.system.api.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import cn.datax.common.base.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 系统参数配置信息表
* </p>
*
* @author yuwei
* @date 2022-05-19
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("sys_config")
public class ConfigEntity extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 参数名称
*/
private String configName;
/**
* 参数键名
*/
private String configKey;
/**
* 参数键值
*/
private String configValue;
}

View File

@@ -0,0 +1,42 @@
package cn.datax.service.system.api.entity;
import cn.datax.common.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author yuwei
* @date 2022-09-11
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("sys_dept")
public class DeptEntity extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 父部门ID
*/
private String parentId;
/**
* 部门名称
*/
private String deptName;
/**
* 一级10
* 二级10 001、10 002
* 三级10 001 001、10 001 002、10 002 001
* 部门编码(数据权限优化查询速度 like '10001%'
*/
private String deptNo;
}

View File

@@ -0,0 +1,42 @@
package cn.datax.service.system.api.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 部门关系表
* </p>
*
* @author yuwei
* @date 2022-11-22
*/
@Data
@Accessors(chain = true)
@TableName("sys_dept_relation")
public class DeptRelationEntity implements Serializable {
private static final long serialVersionUID=1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
/**
* 祖先节点
*/
private String ancestor;
/**
* 后代节点
*/
private String descendant;
}

View File

@@ -0,0 +1,42 @@
package cn.datax.service.system.api.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import cn.datax.common.base.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.List;
/**
* <p>
* 字典编码信息表
* </p>
*
* @author yuwei
* @date 2022-04-17
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("sys_dict")
public class DictEntity extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 字典名称
*/
private String dictName;
/**
* 字典编码
*/
private String dictCode;
@TableField(exist = false)
private List<DictItemEntity> items;
}

View File

@@ -0,0 +1,46 @@
package cn.datax.service.system.api.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import cn.datax.common.base.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 字典项信息表
* </p>
*
* @author yuwei
* @date 2022-04-17
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("sys_market_dict_item")
public class DictItemEntity extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 字典id
*/
private String dictId;
/**
* 字典项文本
*/
private String itemText;
/**
* 字典项值
*/
private String itemValue;
/**
* 排序
*/
private Integer itemSort;
}

View File

@@ -0,0 +1,108 @@
package cn.datax.service.system.api.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
*
* </p>
*
* @author yuwei
* @date 2022-09-11
*/
@Data
@Accessors(chain = true)
@TableName("sys_log")
public class LogEntity implements Serializable {
private static final long serialVersionUID=1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
/**
* 所属模块
*/
private String module;
/**
* 日志标题
*/
private String title;
/**
* 用户ID
*/
private String userId;
/**
* 用户名称
*/
private String userName;
/**
* 请求IP
*/
private String remoteAddr;
/**
* 请求URI
*/
private String requestUri;
/**
* 方法类名
*/
private String className;
/**
* 方法名称
*/
private String methodName;
/**
* 请求参数
*/
private String params;
/**
* 请求耗时
*/
private String time;
/**
* 浏览器名称
*/
private String browser;
/**
* 操作系统
*/
private String os;
/**
* 错误类型
*/
private String exCode;
/**
* 错误信息
*/
private String exMsg;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@TableField(value = "create_time", fill = FieldFill.INSERT)
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,62 @@
package cn.datax.service.system.api.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import java.io.Serializable;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* <p>
* 登录日志信息表
* </p>
*
* @author yuwei
* @date 2022-05-29
*/
@Data
@Accessors(chain = true)
@TableName("sys_login_log")
public class LoginLogEntity implements Serializable {
private static final long serialVersionUID=1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
/**
* 操作系统
*/
private String opOs;
/**
* 浏览器类型
*/
private String opBrowser;
/**
* 登录IP地址
*/
private String opIp;
/**
* 登录时间
*/
private LocalDateTime opDate;
/**
* 登录用户ID
*/
private String userId;
/**
* 登录用户名称
*/
private String userName;
}

View File

@@ -0,0 +1,80 @@
package cn.datax.service.system.api.entity;
import cn.datax.common.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author yuwei
* @date 2022-09-11
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("sys_menu")
public class MenuEntity extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 父资源ID
*/
private String parentId;
/**
* 资源名称
*/
private String menuName;
/**
* 对应路由地址path
*/
private String menuPath;
/**
* 对应路由组件component
*/
private String menuComponent;
/**
* 对应路由默认跳转地址redirect
*/
private String menuRedirect;
/**
* 权限标识
*/
private String menuPerms;
/**
* 资源图标
*/
private String menuIcon;
/**
* 资源类型0模块1菜单2按钮
*/
private String menuType;
/**
* 资源编码
*/
private String menuCode;
/**
* 资源隐藏0否1是
*/
private String menuHidden;
/**
* 排序
*/
private Integer menuSort;
}

View File

@@ -0,0 +1,30 @@
package cn.datax.service.system.api.entity;
import cn.datax.common.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author yuwei
* @date 2022-09-11
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("sys_post")
public class PostEntity extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 岗位名称
*/
private String postName;
}

View File

@@ -0,0 +1,42 @@
package cn.datax.service.system.api.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 角色和部门关联表
* </p>
*
* @author yuwei
* @date 2022-11-22
*/
@Data
@Accessors(chain = true)
@TableName("sys_role_dept")
public class RoleDeptEntity implements Serializable {
private static final long serialVersionUID=1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
/**
* 角色ID
*/
private String roleId;
/**
* 部门ID
*/
private String deptId;
}

View File

@@ -0,0 +1,49 @@
package cn.datax.service.system.api.entity;
import cn.datax.common.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.List;
/**
* <p>
*
* </p>
*
* @author yuwei
* @date 2022-09-11
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName(value = "sys_role", autoResultMap = true)
public class RoleEntity extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 角色名称
*/
private String roleName;
/**
* 角色编码
*/
private String roleCode;
/**
* 数据范围1全部数据权限 2自定义数据权限 3本部门数据权限 4本部门及以下数据权限 5仅本人数据权限
*/
private String dataScope;
@TableField(exist = false)
private List<MenuEntity> menus;
@TableField(exist = false)
private List<DeptEntity> depts;
}

View File

@@ -0,0 +1,42 @@
package cn.datax.service.system.api.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
*
* </p>
*
* @author yuwei
* @date 2022-09-11
*/
@Data
@Accessors(chain = true)
@TableName("sys_role_menu")
public class RoleMenuEntity implements Serializable {
private static final long serialVersionUID=1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
/**
* 角色ID
*/
private String roleId;
/**
* 菜单ID
*/
private String menuId;
}

View File

@@ -0,0 +1,72 @@
package cn.datax.service.system.api.entity;
import cn.datax.common.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.time.LocalDate;
import java.util.List;
/**
* <p>
*
* </p>
*
* @author yuwei
* @date 2022-09-11
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName(value = "sys_user", autoResultMap = true)
public class UserEntity extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 用户名称
*/
private String username;
/**
* 用户昵称
*/
private String nickname;
/**
* 用户密码
*/
private String password;
/**
* 电子邮箱
*/
private String email;
/**
* 手机号码
*/
private String phone;
/**
* 出生日期
*/
private LocalDate birthday;
/**
* 部门
*/
private String deptId;
@TableField(exist = false)
private DeptEntity dept;
@TableField(exist = false)
private List<RoleEntity> roles;
@TableField(exist = false)
private List<PostEntity> posts;
}

View File

@@ -0,0 +1,42 @@
package cn.datax.service.system.api.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
*
* </p>
*
* @author yuwei
* @date 2022-09-11
*/
@Data
@Accessors(chain = true)
@TableName("sys_user_post")
public class UserPostEntity implements Serializable {
private static final long serialVersionUID=1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
/**
* 用户ID
*/
private String userId;
/**
* 岗位ID
*/
private String postId;
}

View File

@@ -0,0 +1,42 @@
package cn.datax.service.system.api.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
*
* </p>
*
* @author yuwei
* @date 2022-09-11
*/
@Data
@Accessors(chain = true)
@TableName("sys_user_role")
public class UserRoleEntity implements Serializable {
private static final long serialVersionUID=1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
/**
* 用户ID
*/
private String userId;
/**
* 角色ID
*/
private String roleId;
}

View File

@@ -0,0 +1,14 @@
package cn.datax.service.system.api.feign;
import cn.datax.service.system.api.dto.LogDto;
import cn.datax.service.system.api.feign.factory.LogServiceFeignFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(contextId = "logServiceFeign", value = "datax-service-system", fallbackFactory = LogServiceFeignFallbackFactory.class)
public interface LogServiceFeign {
@PostMapping("/inner/logs")
void saveLog(@RequestBody LogDto logDto);
}

View File

@@ -0,0 +1,14 @@
package cn.datax.service.system.api.feign;
import cn.datax.service.system.api.feign.factory.UserServiceFeignFallbackFactory;
import cn.datax.service.system.api.vo.UserInfo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(contextId = "userServiceFeign", value = "datax-service-system", fallbackFactory = UserServiceFeignFallbackFactory.class)
public interface UserServiceFeign {
@GetMapping("/login/username/{username}")
UserInfo loginByUsername(@PathVariable("username") String username);
}

View File

@@ -0,0 +1,17 @@
package cn.datax.service.system.api.feign.factory;
import cn.datax.service.system.api.feign.LogServiceFeign;
import cn.datax.service.system.api.feign.fallback.LogServiceFeignFallbackImpl;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
@Component
public class LogServiceFeignFallbackFactory implements FallbackFactory<LogServiceFeign> {
@Override
public LogServiceFeign create(Throwable throwable) {
LogServiceFeignFallbackImpl logServiceFeignFallback = new LogServiceFeignFallbackImpl();
logServiceFeignFallback.setCause(throwable);
return logServiceFeignFallback;
}
}

View File

@@ -0,0 +1,17 @@
package cn.datax.service.system.api.feign.factory;
import cn.datax.service.system.api.feign.UserServiceFeign;
import cn.datax.service.system.api.feign.fallback.UserServiceFeignFallbackImpl;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
@Component
public class UserServiceFeignFallbackFactory implements FallbackFactory<UserServiceFeign> {
@Override
public UserServiceFeign create(Throwable throwable) {
UserServiceFeignFallbackImpl userServiceFeignFallback = new UserServiceFeignFallbackImpl();
userServiceFeignFallback.setCause(throwable);
return userServiceFeignFallback;
}
}

View File

@@ -0,0 +1,20 @@
package cn.datax.service.system.api.feign.fallback;
import cn.datax.service.system.api.dto.LogDto;
import cn.datax.service.system.api.feign.LogServiceFeign;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class LogServiceFeignFallbackImpl implements LogServiceFeign {
@Setter
private Throwable cause;
@Override
public void saveLog(LogDto logDto) {
log.error("feign 调用出错", cause);
}
}

View File

@@ -0,0 +1,21 @@
package cn.datax.service.system.api.feign.fallback;
import cn.datax.service.system.api.feign.UserServiceFeign;
import cn.datax.service.system.api.vo.UserInfo;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class UserServiceFeignFallbackImpl implements UserServiceFeign {
@Setter
private Throwable cause;
@Override
public UserInfo loginByUsername(String username) {
log.error("feign 调用{}出错", username, cause);
return null;
}
}

View File

@@ -0,0 +1,20 @@
package cn.datax.service.system.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 系统参数配置信息表 查询实体
* </p>
*
* @author yuwei
* @date 2022-05-19
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ConfigQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
}

View File

@@ -0,0 +1,27 @@
package cn.datax.service.system.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 字典项信息表 查询实体
* </p>
*
* @author yuwei
* @date 2022-04-17
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class DictItemQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
/**
* 字典id
*/
private String dictId;
private String itemText;
private String itemValue;
}

View File

@@ -0,0 +1,23 @@
package cn.datax.service.system.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 字典编码信息表 查询实体
* </p>
*
* @author yuwei
* @date 2022-04-17
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class DictQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
private String dictName;
private String dictCode;
}

View File

@@ -0,0 +1,27 @@
package cn.datax.service.system.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class LogQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
/**
* 日志标题
*/
private String title;
/**
* 所属模块
*/
private String module;
/**
* 用户名称
*/
private String userName;
}

View File

@@ -0,0 +1,25 @@
package cn.datax.service.system.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 登录日志信息表 查询实体
* </p>
*
* @author yuwei
* @date 2022-05-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class LoginLogQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
/**
* 登录用户名称
*/
private String userName;
}

View File

@@ -0,0 +1,17 @@
package cn.datax.service.system.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class PostQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
/**
* 岗位名称
*/
private String postName;
}

View File

@@ -0,0 +1,17 @@
package cn.datax.service.system.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class RoleQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
/**
* 角色名称
*/
private String roleName;
}

View File

@@ -0,0 +1,25 @@
package cn.datax.service.system.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class UserQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
/**
* 用户名称
*/
private String username;
/**
* 用户昵称
*/
private String nickname;
/**
* 部门ID
*/
private String deptId;
}

View File

@@ -0,0 +1,30 @@
package cn.datax.service.system.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 系统参数配置信息表 实体VO
* </p>
*
* @author yuwei
* @date 2022-05-19
*/
@Data
public class ConfigVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private String status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String remark;
private String configName;
private String configKey;
private String configValue;
}

View File

@@ -0,0 +1,24 @@
package cn.datax.service.system.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class DeptVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private String status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String remark;
private String parentId;
private String deptName;
private String deptNo;
private List<DictItemVo> items;
}

View File

@@ -0,0 +1,31 @@
package cn.datax.service.system.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 字典项信息表 实体VO
* </p>
*
* @author yuwei
* @date 2022-04-17
*/
@Data
public class DictItemVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private String status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String remark;
private String dictId;
private String itemText;
private String itemValue;
private Integer itemSort;
}

View File

@@ -0,0 +1,29 @@
package cn.datax.service.system.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 字典编码信息表 实体VO
* </p>
*
* @author yuwei
* @date 2022-04-17
*/
@Data
public class DictVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private String status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String remark;
private String dictName;
private String dictCode;
}

View File

@@ -0,0 +1,31 @@
package cn.datax.service.system.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class LogVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private String module;
private String title;
private String userId;
private String userName;
private String remoteAddr;
private String requestUri;
private String className;
private String methodName;
private String params;
private String time;
private String browser;
private String os;
private String exCode;
private String exMsg;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,30 @@
package cn.datax.service.system.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 登录日志信息表 实体VO
* </p>
*
* @author yuwei
* @date 2022-05-29
*/
@Data
public class LoginLogVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private String opOs;
private String opBrowser;
private String opIp;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime opDate;
private String userId;
private String userName;
}

View File

@@ -0,0 +1,30 @@
package cn.datax.service.system.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class MenuVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private String status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String remark;
private String parentId;
private String menuName;
private String menuPath;
private String menuComponent;
private String menuRedirect;
private String menuPerms;
private String menuIcon;
private String menuType;
private String menuCode;
private String menuHidden;
private Integer menuSort;
}

View File

@@ -0,0 +1,20 @@
package cn.datax.service.system.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class PostVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private String status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String remark;
private String postName;
}

View File

@@ -0,0 +1,25 @@
package cn.datax.service.system.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class RoleVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private String status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String remark;
private String roleName;
private String roleCode;
private String dataScope;
private List<MenuVo> menus;
private List<DeptVo> depts;
}

View File

@@ -0,0 +1,20 @@
package cn.datax.service.system.api.vo;
import lombok.Data;
import java.io.Serializable;
@Data
public class UserInfo implements Serializable {
private static final long serialVersionUID=1L;
/**
* 用户基本信息
*/
private UserVo userVo;
/**
* 权限标识集合
*/
private String[] perms;
}

View File

@@ -0,0 +1,32 @@
package cn.datax.service.system.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class UserVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private String status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String remark;
private String username;
private String nickname;
private String password;
private String email;
private String phone;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDate birthday;
private String deptId;
private DeptVo dept;
private List<PostVo> posts;
private List<RoleVo> roles;
}

View File

@@ -0,0 +1,20 @@
package cn.datax.service.system.api.vo.route;
import lombok.Data;
import java.io.Serializable;
@Data
public class MetaVo implements Serializable {
private static final long serialVersionUID=1L;
/**
* 路由标题
*/
private String title;
/**
* 路由图标
*/
private String icon;
}

View File

@@ -0,0 +1,41 @@
package cn.datax.service.system.api.vo.route;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class RouteVo implements Serializable {
private static final long serialVersionUID=1L;
/**
* 请求url
*/
private String path;
/**
* 对应组件
*/
private String component;
/**
* 父级菜单重定向地址
*/
private String redirect;
/**
* 路由名称
*/
private String name;
/**
* 路由附带内容
*/
private MetaVo meta;
/**
* 隐藏
*/
private Boolean hidden;
/**
* 子路由
*/
private List<RouteVo> children;
}

View File

@@ -0,0 +1,5 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.datax.service.system.api.feign.factory.LogServiceFeignFallbackFactory,\
cn.datax.service.system.api.feign.factory.UserServiceFeignFallbackFactory,\
cn.datax.service.system.api.feign.fallback.LogServiceFeignFallbackImpl,\
cn.datax.service.system.api.feign.fallback.UserServiceFeignFallbackImpl