diff --git a/bonus-api/bonus-ai-api-system/pom.xml b/bonus-api/bonus-ai-api-system/pom.xml
new file mode 100644
index 0000000..3c02b0a
--- /dev/null
+++ b/bonus-api/bonus-ai-api-system/pom.xml
@@ -0,0 +1,28 @@
+
+
+
+ com.bonus
+ bonus-api
+ 3.6.4
+
+ 4.0.0
+
+ bonus-ai-api-system
+
+
+ bonus-ai-api-system系统接口模块
+
+
+
+
+
+
+ com.bonus
+ bonus-common-core
+
+
+
+
+
\ No newline at end of file
diff --git a/bonus-api/bonus-ai-api-system/src/.DS_Store b/bonus-api/bonus-ai-api-system/src/.DS_Store
new file mode 100644
index 0000000..7b0d367
Binary files /dev/null and b/bonus-api/bonus-ai-api-system/src/.DS_Store differ
diff --git a/bonus-api/bonus-ai-api-system/src/main/.DS_Store b/bonus-api/bonus-ai-api-system/src/main/.DS_Store
new file mode 100644
index 0000000..55c1fcb
Binary files /dev/null and b/bonus-api/bonus-ai-api-system/src/main/.DS_Store differ
diff --git a/bonus-api/bonus-ai-api-system/src/main/java/.DS_Store b/bonus-api/bonus-ai-api-system/src/main/java/.DS_Store
new file mode 100644
index 0000000..35a54bf
Binary files /dev/null and b/bonus-api/bonus-ai-api-system/src/main/java/.DS_Store differ
diff --git a/bonus-api/bonus-ai-api-system/src/main/java/com/.DS_Store b/bonus-api/bonus-ai-api-system/src/main/java/com/.DS_Store
new file mode 100644
index 0000000..8a20afe
Binary files /dev/null and b/bonus-api/bonus-ai-api-system/src/main/java/com/.DS_Store differ
diff --git a/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/.DS_Store b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/.DS_Store
new file mode 100644
index 0000000..c7f175f
Binary files /dev/null and b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/.DS_Store differ
diff --git a/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/.DS_Store b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/.DS_Store
new file mode 100644
index 0000000..f953888
Binary files /dev/null and b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/.DS_Store differ
diff --git a/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/RemoteFileService.java b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/RemoteFileService.java
new file mode 100644
index 0000000..8e6f0ea
--- /dev/null
+++ b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/RemoteFileService.java
@@ -0,0 +1,29 @@
+package com.bonus.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.bonus.common.core.constant.ServiceNameConstants;
+import com.bonus.common.core.domain.R;
+import com.bonus.system.api.domain.SysFile;
+import com.bonus.system.api.factory.RemoteFileFallbackFactory;
+
+/**
+ * 文件服务
+ *
+ * @author bonus
+ */
+@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/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/RemoteLogService.java b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/RemoteLogService.java
new file mode 100644
index 0000000..682081e
--- /dev/null
+++ b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/RemoteLogService.java
@@ -0,0 +1,41 @@
+package com.bonus.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.bonus.common.core.constant.SecurityConstants;
+import com.bonus.common.core.constant.ServiceNameConstants;
+import com.bonus.common.core.domain.R;
+import com.bonus.system.api.domain.SysLogininfor;
+import com.bonus.system.api.domain.SysOperLog;
+import com.bonus.system.api.factory.RemoteLogFallbackFactory;
+
+/**
+ * 日志服务
+ *
+ * @author bonus
+ */
+@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/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/RemoteUserService.java b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/RemoteUserService.java
new file mode 100644
index 0000000..5c19cec
--- /dev/null
+++ b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/RemoteUserService.java
@@ -0,0 +1,43 @@
+package com.bonus.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.bonus.common.core.constant.SecurityConstants;
+import com.bonus.common.core.constant.ServiceNameConstants;
+import com.bonus.common.core.domain.R;
+import com.bonus.system.api.domain.SysUser;
+import com.bonus.system.api.factory.RemoteUserFallbackFactory;
+import com.bonus.system.api.model.LoginUser;
+
+/**
+ * 用户服务
+ *
+ * @author bonus
+ */
+@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/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysDept.java b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysDept.java
new file mode 100644
index 0000000..6c9f019
--- /dev/null
+++ b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysDept.java
@@ -0,0 +1,203 @@
+package com.bonus.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.bonus.common.core.web.domain.BaseEntity;
+
+/**
+ * 部门表 sys_dept
+ *
+ * @author bonus
+ */
+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/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysDictData.java b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysDictData.java
new file mode 100644
index 0000000..471ff20
--- /dev/null
+++ b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysDictData.java
@@ -0,0 +1,176 @@
+package com.bonus.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.bonus.common.core.annotation.Excel;
+import com.bonus.common.core.annotation.Excel.ColumnType;
+import com.bonus.common.core.constant.UserConstants;
+import com.bonus.common.core.web.domain.BaseEntity;
+
+/**
+ * 字典数据表 sys_dict_data
+ *
+ * @author bonus
+ */
+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/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysDictType.java b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysDictType.java
new file mode 100644
index 0000000..50a2be9
--- /dev/null
+++ b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysDictType.java
@@ -0,0 +1,96 @@
+package com.bonus.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.bonus.common.core.annotation.Excel;
+import com.bonus.common.core.annotation.Excel.ColumnType;
+import com.bonus.common.core.web.domain.BaseEntity;
+
+/**
+ * 字典类型表 sys_dict_type
+ *
+ * @author bonus
+ */
+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/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysFile.java b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysFile.java
new file mode 100644
index 0000000..7ce7a89
--- /dev/null
+++ b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysFile.java
@@ -0,0 +1,50 @@
+package com.bonus.system.api.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 文件信息
+ *
+ * @author bonus
+ */
+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/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysLogininfor.java b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysLogininfor.java
new file mode 100644
index 0000000..0dd5237
--- /dev/null
+++ b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysLogininfor.java
@@ -0,0 +1,102 @@
+package com.bonus.system.api.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.bonus.common.core.annotation.Excel;
+import com.bonus.common.core.annotation.Excel.ColumnType;
+import com.bonus.common.core.web.domain.BaseEntity;
+
+/**
+ * 系统访问记录表 sys_logininfor
+ *
+ * @author bonus
+ */
+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;
+ }
+}
\ No newline at end of file
diff --git a/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysOperLog.java b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysOperLog.java
new file mode 100644
index 0000000..dac8a58
--- /dev/null
+++ b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysOperLog.java
@@ -0,0 +1,255 @@
+package com.bonus.system.api.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.bonus.common.core.annotation.Excel;
+import com.bonus.common.core.annotation.Excel.ColumnType;
+import com.bonus.common.core.web.domain.BaseEntity;
+
+/**
+ * 操作日志记录表 oper_log
+ *
+ * @author bonus
+ */
+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/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysRole.java b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysRole.java
new file mode 100644
index 0000000..8540519
--- /dev/null
+++ b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysRole.java
@@ -0,0 +1,241 @@
+package com.bonus.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.bonus.common.core.annotation.Excel;
+import com.bonus.common.core.annotation.Excel.ColumnType;
+import com.bonus.common.core.web.domain.BaseEntity;
+
+/**
+ * 角色表 sys_role
+ *
+ * @author bonus
+ */
+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/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysUser.java b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysUser.java
new file mode 100644
index 0000000..6d89efc
--- /dev/null
+++ b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/domain/SysUser.java
@@ -0,0 +1,323 @@
+package com.bonus.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.bonus.common.core.annotation.Excel;
+import com.bonus.common.core.annotation.Excel.ColumnType;
+import com.bonus.common.core.annotation.Excel.Type;
+import com.bonus.common.core.annotation.Excels;
+import com.bonus.common.core.web.domain.BaseEntity;
+import com.bonus.common.core.xss.Xss;
+
+/**
+ * 用户对象 sys_user
+ *
+ * @author bonus
+ */
+public class SysUser extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ /** 用户ID */
+ @Excel(name = "用户序号", type = Type.EXPORT, 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 = "手机号码", cellType = ColumnType.TEXT)
+ 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/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/factory/RemoteFileFallbackFactory.java b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/factory/RemoteFileFallbackFactory.java
new file mode 100644
index 0000000..023977d
--- /dev/null
+++ b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/factory/RemoteFileFallbackFactory.java
@@ -0,0 +1,35 @@
+package com.bonus.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.bonus.common.core.domain.R;
+import com.bonus.system.api.RemoteFileService;
+import com.bonus.system.api.domain.SysFile;
+
+/**
+ * 文件服务降级处理
+ *
+ * @author bonus
+ */
+@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/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/factory/RemoteLogFallbackFactory.java b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/factory/RemoteLogFallbackFactory.java
new file mode 100644
index 0000000..c4a57d8
--- /dev/null
+++ b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/factory/RemoteLogFallbackFactory.java
@@ -0,0 +1,42 @@
+package com.bonus.system.api.factory;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+import com.bonus.common.core.domain.R;
+import com.bonus.system.api.RemoteLogService;
+import com.bonus.system.api.domain.SysLogininfor;
+import com.bonus.system.api.domain.SysOperLog;
+
+/**
+ * 日志服务降级处理
+ *
+ * @author bonus
+ */
+@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/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/factory/RemoteUserFallbackFactory.java b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/factory/RemoteUserFallbackFactory.java
new file mode 100644
index 0000000..be1fdc3
--- /dev/null
+++ b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/factory/RemoteUserFallbackFactory.java
@@ -0,0 +1,41 @@
+package com.bonus.system.api.factory;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+import com.bonus.common.core.domain.R;
+import com.bonus.system.api.RemoteUserService;
+import com.bonus.system.api.domain.SysUser;
+import com.bonus.system.api.model.LoginUser;
+
+/**
+ * 用户服务降级处理
+ *
+ * @author bonus
+ */
+@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/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/model/LoginUser.java b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/model/LoginUser.java
new file mode 100644
index 0000000..d335a6f
--- /dev/null
+++ b/bonus-api/bonus-ai-api-system/src/main/java/com/bonus/system/api/model/LoginUser.java
@@ -0,0 +1,150 @@
+package com.bonus.system.api.model;
+
+import java.io.Serializable;
+import java.util.Set;
+import com.bonus.system.api.domain.SysUser;
+
+/**
+ * 用户信息
+ *
+ * @author bonus
+ */
+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;
+
+ 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;
+ }
+}
diff --git a/bonus-api/bonus-ai-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/bonus-api/bonus-ai-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
new file mode 100644
index 0000000..83df20b
--- /dev/null
+++ b/bonus-api/bonus-ai-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1,3 @@
+com.bonus.system.api.factory.RemoteUserFallbackFactory
+com.bonus.system.api.factory.RemoteLogFallbackFactory
+com.bonus.system.api.factory.RemoteFileFallbackFactory
diff --git a/bonus-modules/bonus-ai-modules/bonus-large-model/pom.xml b/bonus-modules/bonus-ai-modules/bonus-large-model/pom.xml
new file mode 100644
index 0000000..9d4b6de
--- /dev/null
+++ b/bonus-modules/bonus-ai-modules/bonus-large-model/pom.xml
@@ -0,0 +1,102 @@
+
+
+
+ com.bonus
+ bonus-modules
+ 3.6.4
+
+ 4.0.0
+
+ bonus-large-model
+
+
+ bonus-large-model服务
+
+
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-sentinel
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+
+ com.github.tobato
+ fastdfs-client
+
+
+
+
+ io.minio
+ minio
+ ${minio.version}
+
+
+
+
+ com.aliyun.oss
+ aliyun-sdk-oss
+ 3.5.0
+
+
+
+
+ commons-net
+ commons-net
+ 3.8.0
+
+
+
+
+ com.bonus
+ bonus-api-system
+
+
+
+
+ com.bonus
+ bonus-common-swagger
+
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/bonus-modules/bonus-ai-modules/bonus-large-model/src/main/java/com/bonus/.DS_Store b/bonus-modules/bonus-ai-modules/bonus-large-model/src/main/java/com/bonus/.DS_Store
new file mode 100644
index 0000000..2db3721
Binary files /dev/null and b/bonus-modules/bonus-ai-modules/bonus-large-model/src/main/java/com/bonus/.DS_Store differ
diff --git a/bonus-modules/bonus-ai-modules/bonus-large-model/src/main/java/com/bonus/llm/BonusLLMApplication.java b/bonus-modules/bonus-ai-modules/bonus-large-model/src/main/java/com/bonus/llm/BonusLLMApplication.java
new file mode 100644
index 0000000..c990559
--- /dev/null
+++ b/bonus-modules/bonus-ai-modules/bonus-large-model/src/main/java/com/bonus/llm/BonusLLMApplication.java
@@ -0,0 +1,31 @@
+package com.bonus.llm;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+//import com.bonus.common.swagger.annotation.EnableCustomSwagger2;
+
+/**
+ * 文件服务
+ *
+ * @author bonus
+ */
+//@EnableCustomSwagger2
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
+public class BonusLLMApplication
+{
+ public static void main(String[] args)
+ {
+ SpringApplication.run(BonusLLMApplication.class, args);
+ System.out.println("(♥◠‿◠)ノ゙ 文件服务模块启动成功 ლ(´ڡ`ლ)゙ \n" +
+ " .-------. ____ __ \n" +
+ " | _ _ \\ \\ \\ / / \n" +
+ " | ( ' ) | \\ _. / ' \n" +
+ " |(_ o _) / _( )_ .' \n" +
+ " | (_,_).' __ ___(_ o _)' \n" +
+ " | |\\ \\ | || |(_,_)' \n" +
+ " | | \\ `' /| `-' / \n" +
+ " | | \\ / \\ / \n" +
+ " ''-' `'-' `-..-' ");
+ }
+}
diff --git a/bonus-modules/bonus-ai-modules/bonus-large-model/src/main/resources/banner.txt b/bonus-modules/bonus-ai-modules/bonus-large-model/src/main/resources/banner.txt
new file mode 100644
index 0000000..27cacb9
--- /dev/null
+++ b/bonus-modules/bonus-ai-modules/bonus-large-model/src/main/resources/banner.txt
@@ -0,0 +1,10 @@
+Spring Boot Version: ${spring-boot.version}
+Spring Application Name: ${spring.application.name}
+ _ __ _ _
+ (_) / _|(_)| |
+ _ __ _ _ ___ _ _ _ ______ | |_ _ | | ___
+| '__|| | | | / _ \ | | | || ||______|| _|| || | / _ \
+| | | |_| || (_) || |_| || | | | | || || __/
+|_| \__,_| \___/ \__, ||_| |_| |_||_| \___|
+ __/ |
+ |___/
\ No newline at end of file
diff --git a/bonus-modules/bonus-ai-modules/bonus-large-model/src/main/resources/bootstrap.yml b/bonus-modules/bonus-ai-modules/bonus-large-model/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000..6e70201
--- /dev/null
+++ b/bonus-modules/bonus-ai-modules/bonus-large-model/src/main/resources/bootstrap.yml
@@ -0,0 +1,29 @@
+# Tomcat
+server:
+ port: 9300
+
+# Spring
+spring:
+ application:
+ # 应用名称
+ name: bonus-file
+ profiles:
+ # 环境配置
+ active: dev
+ cloud:
+ nacos:
+ username: nacos
+ password: nacos
+ discovery:
+ # 服务注册地址
+ server-addr: 192.168.0.14:8848
+ namespace: f1fcd3ea-9460-4597-8acd-0f334527017c
+ config:
+ # 配置中心地址
+ server-addr: 192.168.0.14:8848
+ namespace: f1fcd3ea-9460-4597-8acd-0f334527017c
+ # 配置文件格式
+ file-extension: yml
+ # 共享配置
+ shared-configs:
+ - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
diff --git a/bonus-modules/bonus-ai-modules/bonus-large-model/src/main/resources/logback.xml b/bonus-modules/bonus-ai-modules/bonus-large-model/src/main/resources/logback.xml
new file mode 100644
index 0000000..7607fdf
--- /dev/null
+++ b/bonus-modules/bonus-ai-modules/bonus-large-model/src/main/resources/logback.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+ ${log.pattern}
+
+
+
+
+
+ ${log.path}/info.log
+
+
+
+ ${log.path}/info.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+ ${log.pattern}
+
+
+
+ INFO
+
+ ACCEPT
+
+ DENY
+
+
+
+
+ ${log.path}/error.log
+
+
+
+ ${log.path}/error.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+ ${log.pattern}
+
+
+
+ ERROR
+
+ ACCEPT
+
+ DENY
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/pom.xml b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/pom.xml
new file mode 100644
index 0000000..a0c7fba
--- /dev/null
+++ b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/pom.xml
@@ -0,0 +1,102 @@
+
+
+
+ com.bonus
+ bonus-modules
+ 3.6.4
+
+ 4.0.0
+
+ bonus-ocr-recognition
+
+
+ bonus-ocr-recognition服务
+
+
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-sentinel
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+
+ com.github.tobato
+ fastdfs-client
+
+
+
+
+ io.minio
+ minio
+ ${minio.version}
+
+
+
+
+ com.aliyun.oss
+ aliyun-sdk-oss
+ 3.5.0
+
+
+
+
+ commons-net
+ commons-net
+ 3.8.0
+
+
+
+
+ com.bonus
+ bonus-api-system
+
+
+
+
+ com.bonus
+ bonus-common-swagger
+
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/.DS_Store b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/.DS_Store
new file mode 100644
index 0000000..7b0d367
Binary files /dev/null and b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/.DS_Store differ
diff --git a/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/.DS_Store b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/.DS_Store
new file mode 100644
index 0000000..508c44c
Binary files /dev/null and b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/.DS_Store differ
diff --git a/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/java/.DS_Store b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/java/.DS_Store
new file mode 100644
index 0000000..35a54bf
Binary files /dev/null and b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/java/.DS_Store differ
diff --git a/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/java/com/.DS_Store b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/java/com/.DS_Store
new file mode 100644
index 0000000..ec3d2d8
Binary files /dev/null and b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/java/com/.DS_Store differ
diff --git a/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/java/com/bonus/.DS_Store b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/java/com/bonus/.DS_Store
new file mode 100644
index 0000000..882c0d3
Binary files /dev/null and b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/java/com/bonus/.DS_Store differ
diff --git a/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/java/com/bonus/ocr/.DS_Store b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/java/com/bonus/ocr/.DS_Store
new file mode 100644
index 0000000..d185717
Binary files /dev/null and b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/java/com/bonus/ocr/.DS_Store differ
diff --git a/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/java/com/bonus/ocr/BonusOcrApplication.java b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/java/com/bonus/ocr/BonusOcrApplication.java
new file mode 100644
index 0000000..cfe3705
--- /dev/null
+++ b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/java/com/bonus/ocr/BonusOcrApplication.java
@@ -0,0 +1,31 @@
+package com.bonus.file;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import com.bonus.common.swagger.annotation.EnableCustomSwagger2;
+
+/**
+ * 文件服务
+ *
+ * @author bonus
+ */
+@EnableCustomSwagger2
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
+public class BonusOcrApplication
+{
+ public static void main(String[] args)
+ {
+ SpringApplication.run(BonusFileApplication.class, args);
+ System.out.println("(♥◠‿◠)ノ゙ 文件服务模块启动成功 ლ(´ڡ`ლ)゙ \n" +
+ " .-------. ____ __ \n" +
+ " | _ _ \\ \\ \\ / / \n" +
+ " | ( ' ) | \\ _. / ' \n" +
+ " |(_ o _) / _( )_ .' \n" +
+ " | (_,_).' __ ___(_ o _)' \n" +
+ " | |\\ \\ | || |(_,_)' \n" +
+ " | | \\ `' /| `-' / \n" +
+ " | | \\ / \\ / \n" +
+ " ''-' `'-' `-..-' ");
+ }
+}
diff --git a/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/resources/banner.txt b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/resources/banner.txt
new file mode 100644
index 0000000..27cacb9
--- /dev/null
+++ b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/resources/banner.txt
@@ -0,0 +1,10 @@
+Spring Boot Version: ${spring-boot.version}
+Spring Application Name: ${spring.application.name}
+ _ __ _ _
+ (_) / _|(_)| |
+ _ __ _ _ ___ _ _ _ ______ | |_ _ | | ___
+| '__|| | | | / _ \ | | | || ||______|| _|| || | / _ \
+| | | |_| || (_) || |_| || | | | | || || __/
+|_| \__,_| \___/ \__, ||_| |_| |_||_| \___|
+ __/ |
+ |___/
\ No newline at end of file
diff --git a/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/resources/bootstrap.yml b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000..6e70201
--- /dev/null
+++ b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/resources/bootstrap.yml
@@ -0,0 +1,29 @@
+# Tomcat
+server:
+ port: 9300
+
+# Spring
+spring:
+ application:
+ # 应用名称
+ name: bonus-file
+ profiles:
+ # 环境配置
+ active: dev
+ cloud:
+ nacos:
+ username: nacos
+ password: nacos
+ discovery:
+ # 服务注册地址
+ server-addr: 192.168.0.14:8848
+ namespace: f1fcd3ea-9460-4597-8acd-0f334527017c
+ config:
+ # 配置中心地址
+ server-addr: 192.168.0.14:8848
+ namespace: f1fcd3ea-9460-4597-8acd-0f334527017c
+ # 配置文件格式
+ file-extension: yml
+ # 共享配置
+ shared-configs:
+ - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
diff --git a/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/resources/logback.xml b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/resources/logback.xml
new file mode 100644
index 0000000..7607fdf
--- /dev/null
+++ b/bonus-modules/bonus-ai-modules/bonus-ocr-recognition/src/main/resources/logback.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+ ${log.pattern}
+
+
+
+
+
+ ${log.path}/info.log
+
+
+
+ ${log.path}/info.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+ ${log.pattern}
+
+
+
+ INFO
+
+ ACCEPT
+
+ DENY
+
+
+
+
+ ${log.path}/error.log
+
+
+
+ ${log.path}/error.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+ ${log.pattern}
+
+
+
+ ERROR
+
+ ACCEPT
+
+ DENY
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/bonus-modules/bonus-large-model/pom.xml b/bonus-modules/bonus-large-model/pom.xml
new file mode 100644
index 0000000..8450c1b
--- /dev/null
+++ b/bonus-modules/bonus-large-model/pom.xml
@@ -0,0 +1,20 @@
+
+
+ 4.0.0
+
+ com.bonus
+ bonus-modules
+ 3.6.4
+
+
+ bonus-large-model
+
+
+ 8
+ 8
+ UTF-8
+
+
+
\ No newline at end of file
diff --git a/bonus-modules/bonus-large-model/src/main/java/com/bonus/llm/BonusFileApplication.java b/bonus-modules/bonus-large-model/src/main/java/com/bonus/llm/BonusFileApplication.java
new file mode 100644
index 0000000..e4089a7
--- /dev/null
+++ b/bonus-modules/bonus-large-model/src/main/java/com/bonus/llm/BonusFileApplication.java
@@ -0,0 +1,31 @@
+package com.bonus.file;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import com.bonus.common.swagger.annotation.EnableCustomSwagger2;
+
+/**
+ * 文件服务
+ *
+ * @author bonus
+ */
+@EnableCustomSwagger2
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
+public class BonusFileApplication
+{
+ public static void main(String[] args)
+ {
+ SpringApplication.run(BonusFileApplication.class, args);
+ System.out.println("(♥◠‿◠)ノ゙ 文件服务模块启动成功 ლ(´ڡ`ლ)゙ \n" +
+ " .-------. ____ __ \n" +
+ " | _ _ \\ \\ \\ / / \n" +
+ " | ( ' ) | \\ _. / ' \n" +
+ " |(_ o _) / _( )_ .' \n" +
+ " | (_,_).' __ ___(_ o _)' \n" +
+ " | |\\ \\ | || |(_,_)' \n" +
+ " | | \\ `' /| `-' / \n" +
+ " | | \\ / \\ / \n" +
+ " ''-' `'-' `-..-' ");
+ }
+}
diff --git a/bonus-modules/bonus-large-model/src/main/resources/banner.txt b/bonus-modules/bonus-large-model/src/main/resources/banner.txt
new file mode 100644
index 0000000..27cacb9
--- /dev/null
+++ b/bonus-modules/bonus-large-model/src/main/resources/banner.txt
@@ -0,0 +1,10 @@
+Spring Boot Version: ${spring-boot.version}
+Spring Application Name: ${spring.application.name}
+ _ __ _ _
+ (_) / _|(_)| |
+ _ __ _ _ ___ _ _ _ ______ | |_ _ | | ___
+| '__|| | | | / _ \ | | | || ||______|| _|| || | / _ \
+| | | |_| || (_) || |_| || | | | | || || __/
+|_| \__,_| \___/ \__, ||_| |_| |_||_| \___|
+ __/ |
+ |___/
\ No newline at end of file
diff --git a/bonus-modules/bonus-large-model/src/main/resources/bootstrap.yml b/bonus-modules/bonus-large-model/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000..6e70201
--- /dev/null
+++ b/bonus-modules/bonus-large-model/src/main/resources/bootstrap.yml
@@ -0,0 +1,29 @@
+# Tomcat
+server:
+ port: 9300
+
+# Spring
+spring:
+ application:
+ # 应用名称
+ name: bonus-file
+ profiles:
+ # 环境配置
+ active: dev
+ cloud:
+ nacos:
+ username: nacos
+ password: nacos
+ discovery:
+ # 服务注册地址
+ server-addr: 192.168.0.14:8848
+ namespace: f1fcd3ea-9460-4597-8acd-0f334527017c
+ config:
+ # 配置中心地址
+ server-addr: 192.168.0.14:8848
+ namespace: f1fcd3ea-9460-4597-8acd-0f334527017c
+ # 配置文件格式
+ file-extension: yml
+ # 共享配置
+ shared-configs:
+ - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
diff --git a/bonus-modules/bonus-large-model/src/main/resources/logback.xml b/bonus-modules/bonus-large-model/src/main/resources/logback.xml
new file mode 100644
index 0000000..7607fdf
--- /dev/null
+++ b/bonus-modules/bonus-large-model/src/main/resources/logback.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+ ${log.pattern}
+
+
+
+
+
+ ${log.path}/info.log
+
+
+
+ ${log.path}/info.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+ ${log.pattern}
+
+
+
+ INFO
+
+ ACCEPT
+
+ DENY
+
+
+
+
+ ${log.path}/error.log
+
+
+
+ ${log.path}/error.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+ ${log.pattern}
+
+
+
+ ERROR
+
+ ACCEPT
+
+ DENY
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file