From eae6443f11e5f2676ea0d2f22e5dcbd30156b759 Mon Sep 17 00:00:00 2001 From: AlanScipio Date: Mon, 19 Feb 2024 16:01:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=AD=98=E5=82=A8=E6=97=B6?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/RYAS-Cloud.postman_collection.json | 28 +++ .../common/core/utils/file/MimeTypeUtils.java | 24 +- ruoyi-common/ruoyi-common-datasource/pom.xml | 1 - ruoyi-common/ruoyi-common-services/pom.xml | 8 +- .../services/config/ServicesConfig.java | 11 +- .../services/constants/FileStorageType.java | 28 +++ .../ruoyi/common/services/domain/SysFile.java | 145 ++++++++++++ .../mapper/SysFileDynamicSqlSupport.java | 108 +++++++++ .../common/services/mapper/SysFileMapper.java | 215 ++++++++++++++++++ ruoyi-modules/ruoyi-file/pom.xml | 26 ++- .../com/ruoyi/file/RuoYiFileApplication.java | 10 +- .../file/controller/SysFileController.java | 1 + .../com/ruoyi/file/domain/FileSaveRecord.java | 23 ++ .../ruoyi/file/service/ISysFileService.java | 11 +- .../file/service/LocalSysFileServiceImpl.java | 47 +++- .../file/service/MinioSysFileServiceImpl.java | 19 +- .../ruoyi/file/utils/FileUploadResult.java | 32 +++ .../com/ruoyi/file/utils/FileUploadUtils.java | 66 +++--- ruoyi-ui/src/assets/images/profile.jpg | Bin 81131 -> 0 bytes ruoyi-ui/src/assets/images/profile.png | Bin 0 -> 32174 bytes ruoyi-ui/src/store/modules/user.js | 2 +- sql/ry-cloud-ryas.sql | 30 ++- sql/ry-config-ryas.sql | 18 +- 23 files changed, 754 insertions(+), 99 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/constants/FileStorageType.java create mode 100644 ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/domain/SysFile.java create mode 100644 ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/mapper/SysFileDynamicSqlSupport.java create mode 100644 ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/mapper/SysFileMapper.java create mode 100644 ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/domain/FileSaveRecord.java create mode 100644 ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/utils/FileUploadResult.java delete mode 100644 ruoyi-ui/src/assets/images/profile.jpg create mode 100644 ruoyi-ui/src/assets/images/profile.png diff --git a/api/RYAS-Cloud.postman_collection.json b/api/RYAS-Cloud.postman_collection.json index 83d0fd45..825cb6f0 100644 --- a/api/RYAS-Cloud.postman_collection.json +++ b/api/RYAS-Cloud.postman_collection.json @@ -98,6 +98,34 @@ } }, "response": [] + }, + { + "name": "文件上传", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "file", + "type": "file", + "src": "/E:/图库/AGVCar02.png" + } + ] + }, + "url": { + "raw": "{{baseUrl}}/file/upload", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "file", + "upload" + ] + } + }, + "response": [] } ], "auth": { diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/MimeTypeUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/MimeTypeUtils.java index b8a3bc39..c6784379 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/MimeTypeUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/MimeTypeUtils.java @@ -2,11 +2,10 @@ package com.ruoyi.common.core.utils.file; /** * 媒体类型工具类 - * + * * @author ruoyi */ -public class MimeTypeUtils -{ +public class MimeTypeUtils { public static final String IMAGE_PNG = "image/png"; public static final String IMAGE_JPG = "image/jpg"; @@ -17,14 +16,14 @@ public class MimeTypeUtils public static final String IMAGE_GIF = "image/gif"; - public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" }; + public static final String[] IMAGE_EXTENSION = {"bmp", "gif", "jpg", "jpeg", "png"}; - public static final String[] FLASH_EXTENSION = { "swf", "flv" }; + public static final String[] FLASH_EXTENSION = {"swf", "flv"}; - public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", - "asf", "rm", "rmvb" }; + public static final String[] MEDIA_EXTENSION = {"swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", + "asf", "rm", "rmvb"}; - public static final String[] VIDEO_EXTENSION = { "mp4", "avi", "rmvb" }; + public static final String[] VIDEO_EXTENSION = {"mp4", "avi", "rmvb"}; public static final String[] DEFAULT_ALLOWED_EXTENSION = { // 图片 @@ -36,12 +35,11 @@ public class MimeTypeUtils // 视频格式 "mp4", "avi", "rmvb", // pdf - "pdf" }; + "pdf", + }; - public static String getExtension(String prefix) - { - switch (prefix) - { + public static String getExtension(String prefix) { + switch (prefix) { case IMAGE_PNG: return "png"; case IMAGE_JPG: diff --git a/ruoyi-common/ruoyi-common-datasource/pom.xml b/ruoyi-common/ruoyi-common-datasource/pom.xml index 6d6e04a1..e7b95cfa 100644 --- a/ruoyi-common/ruoyi-common-datasource/pom.xml +++ b/ruoyi-common/ruoyi-common-datasource/pom.xml @@ -24,7 +24,6 @@ ${druid.version} - com.baomidou diff --git a/ruoyi-common/ruoyi-common-services/pom.xml b/ruoyi-common/ruoyi-common-services/pom.xml index 3f84f315..f8ad6b55 100644 --- a/ruoyi-common/ruoyi-common-services/pom.xml +++ b/ruoyi-common/ruoyi-common-services/pom.xml @@ -19,13 +19,7 @@ com.ruoyi - ruoyi-common-log - - - org.springframework - spring-webmvc - - + ruoyi-common-security diff --git a/ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/config/ServicesConfig.java b/ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/config/ServicesConfig.java index f3ad0f06..f6560ec8 100644 --- a/ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/config/ServicesConfig.java +++ b/ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/config/ServicesConfig.java @@ -1,7 +1,9 @@ package com.ruoyi.common.services.config; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; /** * 本模块全局配置 @@ -9,10 +11,15 @@ import org.springframework.context.annotation.Configuration; * @author Alan Scipio * created on 2024/2/19 */ -@ComponentScan("com.ruoyi.common.services") +@MapperScan("com.ruoyi.common.services.mapper") +@ComponentScan(value = "com.ruoyi.common.services", excludeFilters = { + @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.ruoyi.common.services.mapper.*"), +}) @Configuration public class ServicesConfig { - + public ServicesConfig() { + System.out.println("Common Module ServicesConfig init"); + } } diff --git a/ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/constants/FileStorageType.java b/ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/constants/FileStorageType.java new file mode 100644 index 00000000..8e3f2490 --- /dev/null +++ b/ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/constants/FileStorageType.java @@ -0,0 +1,28 @@ +package com.ruoyi.common.services.constants; + +import com.ruoyi.common.core.constant.IEnum; +import lombok.Getter; + +/** + * @author Alan Scipio + * created on 2024/2/19 + */ +@Getter +public enum FileStorageType implements IEnum { + + LOCAL(1, "本地文件存储"), + + FAST_DFS(2, "FastDFS文件存储"), + + MINIO(3, "MinIO文件存储"), + + ; + + private final int code; + private final String name; + + FileStorageType(int code, String name) { + this.code = code; + this.name = name; + } +} diff --git a/ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/domain/SysFile.java b/ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/domain/SysFile.java new file mode 100644 index 00000000..30b42f6e --- /dev/null +++ b/ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/domain/SysFile.java @@ -0,0 +1,145 @@ +package com.ruoyi.common.services.domain; + +import com.ruoyi.common.core.web.domain.BaseEntity; + +import java.io.Serial; +import java.io.Serializable; + +/** + * This class was generated by MyBatis Generator. + * + * + * + * @author ryas + * created on 2024-02-19 + */ +public class SysFile extends BaseEntity implements Serializable { + /** + * 文件ID + */ + private String fileId; + + /** + * 保存的文件名称 + */ + private String savedName; + + /** + * 原始文件名称 + */ + private String originalName; + + /** + * 文件路径 + */ + private String filePath; + + /** + * 文件后缀 + */ + private String extension; + + /** + * 存储方式 + */ + private String storageType; + + /** + * 获取文件的URL + */ + private String requestUrl; + + /** + * 文件大小(Byte) + */ + private Long fileSize; + + @Serial + private static final long serialVersionUID = 1L; + + public String getFileId() { + return fileId; + } + + public void setFileId(String fileId) { + this.fileId = fileId == null ? null : fileId.trim(); + } + + public String getSavedName() { + return savedName; + } + + public void setSavedName(String savedName) { + this.savedName = savedName == null ? null : savedName.trim(); + } + + public String getOriginalName() { + return originalName; + } + + public void setOriginalName(String originalName) { + this.originalName = originalName == null ? null : originalName.trim(); + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath == null ? null : filePath.trim(); + } + + public String getExtension() { + return extension; + } + + public void setExtension(String extension) { + this.extension = extension == null ? null : extension.trim(); + } + + public String getStorageType() { + return storageType; + } + + public void setStorageType(String storageType) { + this.storageType = storageType == null ? null : storageType.trim(); + } + + public String getRequestUrl() { + return requestUrl; + } + + public void setRequestUrl(String requestUrl) { + this.requestUrl = requestUrl == null ? null : requestUrl.trim(); + } + + public Long getFileSize() { + return fileSize; + } + + public void setFileSize(Long fileSize) { + this.fileSize = fileSize; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", fileId=").append(fileId); + sb.append(", savedName=").append(savedName); + sb.append(", originalName=").append(originalName); + sb.append(", filePath=").append(filePath); + sb.append(", extension=").append(extension); + sb.append(", storageType=").append(storageType); + sb.append(", requestUrl=").append(requestUrl); + sb.append(", fileSize=").append(fileSize); + sb.append(", serialVersionUID=").append(serialVersionUID); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/mapper/SysFileDynamicSqlSupport.java b/ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/mapper/SysFileDynamicSqlSupport.java new file mode 100644 index 00000000..a19a7c14 --- /dev/null +++ b/ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/mapper/SysFileDynamicSqlSupport.java @@ -0,0 +1,108 @@ +package com.ruoyi.common.services.mapper; + +import org.mybatis.dynamic.sql.AliasableSqlTable; +import org.mybatis.dynamic.sql.SqlColumn; + +import java.sql.JDBCType; +import java.util.Date; + +public final class SysFileDynamicSqlSupport { + public static final SysFile sysFile = new SysFile(); + + /** + * 文件ID + */ + public static final SqlColumn fileId = sysFile.fileId; + + /** + * 保存的文件名称 + */ + public static final SqlColumn savedName = sysFile.savedName; + + /** + * 原始文件名称 + */ + public static final SqlColumn originalName = sysFile.originalName; + + /** + * 文件路径 + */ + public static final SqlColumn filePath = sysFile.filePath; + + /** + * 文件后缀 + */ + public static final SqlColumn extension = sysFile.extension; + + /** + * 存储方式 + */ + public static final SqlColumn storageType = sysFile.storageType; + + /** + * 获取文件的URL + */ + public static final SqlColumn requestUrl = sysFile.requestUrl; + + /** + * 文件大小(Byte) + */ + public static final SqlColumn fileSize = sysFile.fileSize; + + /** + * 创建者 + */ + public static final SqlColumn createBy = sysFile.createBy; + + /** + * 创建时间 + */ + public static final SqlColumn createTime = sysFile.createTime; + + /** + * 更新者 + */ + public static final SqlColumn updateBy = sysFile.updateBy; + + /** + * 更新时间 + */ + public static final SqlColumn updateTime = sysFile.updateTime; + + /** + * 备注 + */ + public static final SqlColumn remark = sysFile.remark; + + public static final class SysFile extends AliasableSqlTable { + public final SqlColumn fileId = column("file_id", JDBCType.VARCHAR); + + public final SqlColumn savedName = column("saved_name", JDBCType.VARCHAR); + + public final SqlColumn originalName = column("original_name", JDBCType.VARCHAR); + + public final SqlColumn filePath = column("file_path", JDBCType.VARCHAR); + + public final SqlColumn extension = column("extension", JDBCType.VARCHAR); + + public final SqlColumn storageType = column("storage_type", JDBCType.VARCHAR); + + public final SqlColumn requestUrl = column("request_url", JDBCType.VARCHAR); + + public final SqlColumn fileSize = column("file_size", JDBCType.BIGINT); + + public final SqlColumn createBy = column("create_by", JDBCType.VARCHAR); + + public final SqlColumn createTime = column("create_time", JDBCType.TIMESTAMP); + + public final SqlColumn updateBy = column("update_by", JDBCType.VARCHAR); + + public final SqlColumn updateTime = column("update_time", JDBCType.TIMESTAMP); + + public final SqlColumn remark = column("remark", JDBCType.VARCHAR); + + public SysFile() { + super("sys_file", SysFile::new); + } + } +} \ No newline at end of file diff --git a/ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/mapper/SysFileMapper.java b/ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/mapper/SysFileMapper.java new file mode 100644 index 00000000..553f0913 --- /dev/null +++ b/ruoyi-common/ruoyi-common-services/src/main/java/com/ruoyi/common/services/mapper/SysFileMapper.java @@ -0,0 +1,215 @@ +package com.ruoyi.common.services.mapper; + +import com.ruoyi.common.security.utils.SecurityUtilsExt; +import com.ruoyi.common.services.domain.SysFile; +import org.apache.ibatis.annotations.*; +import org.apache.ibatis.type.JdbcType; +import org.mybatis.dynamic.sql.BasicColumn; +import org.mybatis.dynamic.sql.delete.DeleteDSLCompleter; +import org.mybatis.dynamic.sql.select.CountDSLCompleter; +import org.mybatis.dynamic.sql.select.SelectDSLCompleter; +import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; +import org.mybatis.dynamic.sql.update.UpdateDSL; +import org.mybatis.dynamic.sql.update.UpdateDSLCompleter; +import org.mybatis.dynamic.sql.update.UpdateModel; +import org.mybatis.dynamic.sql.util.SqlProviderAdapter; +import org.mybatis.dynamic.sql.util.mybatis3.*; + +import java.util.Collection; +import java.util.List; +import java.util.Optional; + +import static com.ruoyi.common.services.mapper.SysFileDynamicSqlSupport.*; +import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo; + +@Mapper +public interface SysFileMapper extends CommonCountMapper, CommonDeleteMapper, CommonInsertMapper, CommonUpdateMapper { + BasicColumn[] selectList = BasicColumn.columnList(fileId, savedName, originalName, filePath, extension, storageType, requestUrl, fileSize, createBy, createTime, updateBy, updateTime, remark); + + @SelectProvider(type=SqlProviderAdapter.class, method="select") + @Results(id="SysFileResult", value = { + @Result(column="file_id", property="fileId", jdbcType=JdbcType.VARCHAR, id=true), + @Result(column="saved_name", property="savedName", jdbcType=JdbcType.VARCHAR), + @Result(column="original_name", property="originalName", jdbcType=JdbcType.VARCHAR), + @Result(column="file_path", property="filePath", jdbcType=JdbcType.VARCHAR), + @Result(column="extension", property="extension", jdbcType=JdbcType.VARCHAR), + @Result(column="storage_type", property="storageType", jdbcType=JdbcType.VARCHAR), + @Result(column="request_url", property="requestUrl", jdbcType=JdbcType.VARCHAR), + @Result(column="file_size", property="fileSize", jdbcType=JdbcType.BIGINT), + @Result(column="create_by", property="createBy", jdbcType=JdbcType.VARCHAR), + @Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP), + @Result(column="update_by", property="updateBy", jdbcType=JdbcType.VARCHAR), + @Result(column="update_time", property="updateTime", jdbcType=JdbcType.TIMESTAMP), + @Result(column="remark", property="remark", jdbcType=JdbcType.VARCHAR) + }) + List selectMany(SelectStatementProvider selectStatement); + + @SelectProvider(type=SqlProviderAdapter.class, method="select") + @ResultMap("SysFileResult") + Optional selectOne(SelectStatementProvider selectStatement); + + default long count(CountDSLCompleter completer) { + return MyBatis3Utils.countFrom(this::count, sysFile, completer); + } + + default int delete(DeleteDSLCompleter completer) { + return MyBatis3Utils.deleteFrom(this::delete, sysFile, completer); + } + + default int deleteByPrimaryKey(String fileId_) { + return delete(c -> + c.where(fileId, isEqualTo(fileId_)) + ); + } + + default int insert(SysFile row) { + row.setCommonForInsert(SecurityUtilsExt.getUserIdStr()); + return MyBatis3Utils.insert(this::insert, row, sysFile, c -> + c.map(fileId).toProperty("fileId") + .map(savedName).toProperty("savedName") + .map(originalName).toProperty("originalName") + .map(filePath).toProperty("filePath") + .map(extension).toProperty("extension") + .map(storageType).toProperty("storageType") + .map(requestUrl).toProperty("requestUrl") + .map(fileSize).toProperty("fileSize") + .map(createBy).toProperty("createBy") + .map(createTime).toProperty("createTime") + .map(updateBy).toProperty("updateBy") + .map(updateTime).toProperty("updateTime") + .map(remark).toProperty("remark") + ); + } + + default int insertMultiple(Collection records) { + for (SysFile row : records) { + row.setCommonForInsert(SecurityUtilsExt.getUserIdStr()); + } + return MyBatis3Utils.insertMultiple(this::insertMultiple, records, sysFile, c -> + c.map(fileId).toProperty("fileId") + .map(savedName).toProperty("savedName") + .map(originalName).toProperty("originalName") + .map(filePath).toProperty("filePath") + .map(extension).toProperty("extension") + .map(storageType).toProperty("storageType") + .map(requestUrl).toProperty("requestUrl") + .map(fileSize).toProperty("fileSize") + .map(createBy).toProperty("createBy") + .map(createTime).toProperty("createTime") + .map(updateBy).toProperty("updateBy") + .map(updateTime).toProperty("updateTime") + .map(remark).toProperty("remark") + ); + } + + default int insertSelective(SysFile row) { + row.setCommonForInsert(SecurityUtilsExt.getUserIdStr()); + return MyBatis3Utils.insert(this::insert, row, sysFile, c -> + c.map(fileId).toPropertyWhenPresent("fileId", row::getFileId) + .map(savedName).toPropertyWhenPresent("savedName", row::getSavedName) + .map(originalName).toPropertyWhenPresent("originalName", row::getOriginalName) + .map(filePath).toPropertyWhenPresent("filePath", row::getFilePath) + .map(extension).toPropertyWhenPresent("extension", row::getExtension) + .map(storageType).toPropertyWhenPresent("storageType", row::getStorageType) + .map(requestUrl).toPropertyWhenPresent("requestUrl", row::getRequestUrl) + .map(fileSize).toPropertyWhenPresent("fileSize", row::getFileSize) + .map(createBy).toPropertyWhenPresent("createBy", row::getCreateBy) + .map(createTime).toPropertyWhenPresent("createTime", row::getCreateTime) + .map(updateBy).toPropertyWhenPresent("updateBy", row::getUpdateBy) + .map(updateTime).toPropertyWhenPresent("updateTime", row::getUpdateTime) + .map(remark).toPropertyWhenPresent("remark", row::getRemark) + ); + } + + default Optional selectOne(SelectDSLCompleter completer) { + return MyBatis3Utils.selectOne(this::selectOne, selectList, sysFile, completer); + } + + default List select(SelectDSLCompleter completer) { + return MyBatis3Utils.selectList(this::selectMany, selectList, sysFile, completer); + } + + default List selectDistinct(SelectDSLCompleter completer) { + return MyBatis3Utils.selectDistinct(this::selectMany, selectList, sysFile, completer); + } + + default Optional selectByPrimaryKey(String fileId_) { + return selectOne(c -> + c.where(fileId, isEqualTo(fileId_)) + ); + } + + default int update(UpdateDSLCompleter completer) { + return MyBatis3Utils.update(this::update, sysFile, completer); + } + + static UpdateDSL updateAllColumns(SysFile row, UpdateDSL dsl) { + return dsl.set(fileId).equalTo(row::getFileId) + .set(savedName).equalTo(row::getSavedName) + .set(originalName).equalTo(row::getOriginalName) + .set(filePath).equalTo(row::getFilePath) + .set(extension).equalTo(row::getExtension) + .set(storageType).equalTo(row::getStorageType) + .set(requestUrl).equalTo(row::getRequestUrl) + .set(fileSize).equalTo(row::getFileSize) + .set(createBy).equalTo(row::getCreateBy) + .set(createTime).equalTo(row::getCreateTime) + .set(updateBy).equalTo(row::getUpdateBy) + .set(updateTime).equalTo(row::getUpdateTime) + .set(remark).equalTo(row::getRemark); + } + + static UpdateDSL updateSelectiveColumns(SysFile row, UpdateDSL dsl) { + row.setCommonForUpdate(SecurityUtilsExt.getUserIdStr()); + return dsl.set(fileId).equalToWhenPresent(row::getFileId) + .set(savedName).equalToWhenPresent(row::getSavedName) + .set(originalName).equalToWhenPresent(row::getOriginalName) + .set(filePath).equalToWhenPresent(row::getFilePath) + .set(extension).equalToWhenPresent(row::getExtension) + .set(storageType).equalToWhenPresent(row::getStorageType) + .set(requestUrl).equalToWhenPresent(row::getRequestUrl) + .set(fileSize).equalToWhenPresent(row::getFileSize) + .set(createBy).equalToWhenPresent(row::getCreateBy) + .set(createTime).equalToWhenPresent(row::getCreateTime) + .set(updateBy).equalToWhenPresent(row::getUpdateBy) + .set(updateTime).equalToWhenPresent(row::getUpdateTime) + .set(remark).equalToWhenPresent(row::getRemark); + } + + default int updateByPrimaryKey(SysFile row) { + return update(c -> + c.set(savedName).equalTo(row::getSavedName) + .set(originalName).equalTo(row::getOriginalName) + .set(filePath).equalTo(row::getFilePath) + .set(extension).equalTo(row::getExtension) + .set(storageType).equalTo(row::getStorageType) + .set(requestUrl).equalTo(row::getRequestUrl) + .set(fileSize).equalTo(row::getFileSize) + .set(createBy).equalTo(row::getCreateBy) + .set(createTime).equalTo(row::getCreateTime) + .set(updateBy).equalTo(row::getUpdateBy) + .set(updateTime).equalTo(row::getUpdateTime) + .set(remark).equalTo(row::getRemark) + .where(fileId, isEqualTo(row::getFileId)) + ); + } + + default int updateByPrimaryKeySelective(SysFile row) { + row.setCommonForUpdate(SecurityUtilsExt.getUserIdStr()); + return update(c -> + c.set(savedName).equalToWhenPresent(row::getSavedName) + .set(originalName).equalToWhenPresent(row::getOriginalName) + .set(filePath).equalToWhenPresent(row::getFilePath) + .set(extension).equalToWhenPresent(row::getExtension) + .set(storageType).equalToWhenPresent(row::getStorageType) + .set(requestUrl).equalToWhenPresent(row::getRequestUrl) + .set(fileSize).equalToWhenPresent(row::getFileSize) + .set(createBy).equalToWhenPresent(row::getCreateBy) + .set(createTime).equalToWhenPresent(row::getCreateTime) + .set(updateBy).equalToWhenPresent(row::getUpdateBy) + .set(updateTime).equalToWhenPresent(row::getUpdateTime) + .set(remark).equalToWhenPresent(row::getRemark) + .where(fileId, isEqualTo(row::getFileId)) + ); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-file/pom.xml b/ruoyi-modules/ruoyi-file/pom.xml index fcab63e0..d1f92c60 100644 --- a/ruoyi-modules/ruoyi-file/pom.xml +++ b/ruoyi-modules/ruoyi-file/pom.xml @@ -16,8 +16,8 @@ - - + + com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery @@ -46,7 +46,7 @@ org.springframework.boot spring-boot-starter-actuator - + com.github.tobato @@ -65,12 +65,30 @@ com.ruoyi ruoyi-api-system - + + + + com.mysql + mysql-connector-j + + com.ruoyi ruoyi-common-swagger + + + + com.ruoyi + ruoyi-common-services + + + + + com.ruoyi + ruoyi-common-datasource + diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/RuoYiFileApplication.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/RuoYiFileApplication.java index 18e3251f..dbdb2e97 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/RuoYiFileApplication.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/RuoYiFileApplication.java @@ -8,16 +8,14 @@ import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2; /** * 文件服务 - * + * * @author ruoyi */ @ConditionalOnProperty(name = "spring.cloud.nacos.config.group", havingValue = "DEFAULT_GROUP", matchIfMissing = true) @EnableCustomSwagger2 -@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class }) -public class RuoYiFileApplication -{ - public static void main(String[] args) - { +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +public class RuoYiFileApplication { + public static void main(String[] args) { SpringApplication.run(RuoYiFileApplication.class, args); System.out.println("(♥◠‿◠)ノ゙ 文件服务模块启动成功 ლ(´ڡ`ლ)゙"); } diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java index 5580fe59..0fd6fc96 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java @@ -18,6 +18,7 @@ import com.ruoyi.system.api.domain.SysFile; */ @RestController public class SysFileController { + private static final Logger log = LoggerFactory.getLogger(SysFileController.class); @Autowired diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/domain/FileSaveRecord.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/domain/FileSaveRecord.java new file mode 100644 index 00000000..7c9af383 --- /dev/null +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/domain/FileSaveRecord.java @@ -0,0 +1,23 @@ +package com.ruoyi.file.domain; + +import com.ruoyi.file.utils.FileUploadResult; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Alan Scipio + * created on 2024/2/19 + */ +@Data +public class FileSaveRecord implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private String requestUrl; + + private FileUploadResult uploadResult; + +} diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java index 5a353489..910d604f 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java @@ -4,17 +4,16 @@ import org.springframework.web.multipart.MultipartFile; /** * 文件上传接口 - * + * * @author ruoyi */ -public interface ISysFileService -{ +public interface ISysFileService { /** * 文件上传接口 - * + * * @param file 上传的文件 * @return 访问地址 - * @throws Exception */ - public String uploadFile(MultipartFile file) throws Exception; + String uploadFile(MultipartFile file) throws Exception; + } diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java index c0e20681..2493b26d 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java @@ -1,20 +1,25 @@ package com.ruoyi.file.service; +import com.ruoyi.common.services.constants.FileStorageType; +import com.ruoyi.common.services.domain.SysFile; +import com.ruoyi.common.services.mapper.SysFileMapper; +import com.ruoyi.file.utils.FileUploadResult; +import com.ruoyi.file.utils.FileUploadUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import com.ruoyi.file.utils.FileUploadUtils; /** * 本地文件存储 - * + * * @author ruoyi */ @Primary @Service -public class LocalSysFileServiceImpl implements ISysFileService -{ +public class LocalSysFileServiceImpl implements ISysFileService { /** * 资源映射路径 前缀 */ @@ -26,25 +31,45 @@ public class LocalSysFileServiceImpl implements ISysFileService */ @Value("${file.domain}") public String domain; - + /** * 上传文件存储在本地的根路径 */ @Value("${file.path}") private String localFilePath; + @Autowired + private SysFileMapper sysFileMapper; + /** * 本地文件上传接口 - * + * * @param file 上传的文件 * @return 访问地址 - * @throws Exception */ + @Transactional @Override - public String uploadFile(MultipartFile file) throws Exception - { - String name = FileUploadUtils.upload(localFilePath, file); - String url = domain + localFilePrefix + name; + public String uploadFile(MultipartFile file) throws Exception { + // 保存文件到本地 + FileUploadResult uploadResult = FileUploadUtils.upload(localFilePath, file); + String savedPathFileName = uploadResult.getSavedPathFileName(); + String url = domain + localFilePrefix + savedPathFileName; + // 保存文件记录 + saveFileRecord(url, uploadResult); + // 返回访问地址 return url; } + + private void saveFileRecord(String requestUrl, FileUploadResult uploadResult) { + SysFile record = new SysFile(); + record.setFileId(uploadResult.getFileId()); // 文件ID + record.setSavedName(uploadResult.getSavedFileName()); // 保存的文件名 + record.setOriginalName(uploadResult.getOriginalFilename()); // 原文件名 + record.setFilePath(uploadResult.getSavedPath()); // 本地保存的文件路径 + record.setExtension(uploadResult.getExtension()); // 文件扩展名 + record.setStorageType(FileStorageType.LOCAL.name()); // 存储类型:本地文件存储 + record.setRequestUrl(requestUrl); // 获取文件的URL + record.setFileSize(uploadResult.getFileSize()); // 文件大小(Byte) + sysFileMapper.insertSelective(record); + } } diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java index 4a0b6c4b..08710828 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java @@ -1,23 +1,24 @@ package com.ruoyi.file.service; -import java.io.InputStream; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; import com.alibaba.nacos.common.utils.IoUtils; import com.ruoyi.file.config.MinioConfig; import com.ruoyi.file.utils.FileUploadUtils; import io.minio.MinioClient; import io.minio.PutObjectArgs; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.InputStream; /** + * TODO 未完成,还需要保存文件记录 * Minio 文件存储 * * @author ruoyi */ @Service -public class MinioSysFileServiceImpl implements ISysFileService -{ +public class MinioSysFileServiceImpl implements ISysFileService { @Autowired private MinioConfig minioConfig; @@ -29,12 +30,10 @@ public class MinioSysFileServiceImpl implements ISysFileService * * @param file 上传的文件 * @return 访问地址 - * @throws Exception */ @Override - public String uploadFile(MultipartFile file) throws Exception - { - String fileName = FileUploadUtils.extractFilename(file); + public String uploadFile(MultipartFile file) throws Exception { + String fileName = FileUploadUtils.extractFilename(file, null); InputStream inputStream = file.getInputStream(); PutObjectArgs args = PutObjectArgs.builder() .bucket(minioConfig.getBucketName()) diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/utils/FileUploadResult.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/utils/FileUploadResult.java new file mode 100644 index 00000000..1f22b7ce --- /dev/null +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/utils/FileUploadResult.java @@ -0,0 +1,32 @@ +package com.ruoyi.file.utils; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Alan Scipio + * created on 2024/2/19 + */ +@Data +public class FileUploadResult implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private String fileId; + + private String savedFileName; + + private String savedPathFileName; + + private String originalFilename; + + private String extension; + + private Long fileSize; + + private String savedPath; + +} diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/utils/FileUploadUtils.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/utils/FileUploadUtils.java index 0f66ccf0..17d47470 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/utils/FileUploadUtils.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/utils/FileUploadUtils.java @@ -1,12 +1,5 @@ package com.ruoyi.file.utils; -import java.io.File; -import java.io.IOException; -import java.nio.file.Paths; -import java.util.Objects; - -import org.apache.commons.io.FilenameUtils; -import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.core.exception.file.FileException; import com.ruoyi.common.core.exception.file.FileNameLengthLimitExceededException; import com.ruoyi.common.core.exception.file.FileSizeLimitExceededException; @@ -16,6 +9,12 @@ import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.file.FileTypeUtils; import com.ruoyi.common.core.utils.file.MimeTypeUtils; import com.ruoyi.common.core.utils.uuid.Seq; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.Objects; /** * 文件上传工具类 @@ -24,9 +23,9 @@ import com.ruoyi.common.core.utils.uuid.Seq; */ public class FileUploadUtils { /** - * 默认大小 50M + * 默认大小 100M */ - public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024; + public static final long DEFAULT_MAX_SIZE = 100 * 1024 * 1024; /** * 默认的文件名最大长度 100 @@ -38,9 +37,9 @@ public class FileUploadUtils { * * @param baseDir 相对应用的基目录 * @param file 上传的文件 - * @return 文件名称 + * @return 文件上传结果 */ - public static String upload(String baseDir, MultipartFile file) throws IOException { + public static FileUploadResult upload(String baseDir, MultipartFile file) throws IOException { try { return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); } catch (FileException fe) { @@ -62,29 +61,39 @@ public class FileUploadUtils { * @throws IOException 比如读写文件出错时 * @throws InvalidExtensionException 文件校验异常 */ - public static String upload(String baseDir, MultipartFile file, String[] allowedExtension) - throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, - InvalidExtensionException { - int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length(); - if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) { + public static FileUploadResult upload(String baseDir, MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, InvalidExtensionException { + int fileNameLength = Objects.requireNonNull(file.getOriginalFilename()).length(); + if (fileNameLength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) { throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); } - assertAllowed(file, allowedExtension); + FileUploadResult result = new FileUploadResult(); - String fileName = extractFilename(file); + assertAllowed(file, allowedExtension, result); + + String fileName = extractFilename(file, result); String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath(); file.transferTo(Paths.get(absPath)); - return getPathFileName(fileName); + String savedPathFileName = getPathFileName(fileName); + + result.setSavedPathFileName(savedPathFileName); + result.setSavedPath(absPath); + return result; } /** - * 编码文件名 + * 编码文件名,最终结果举例: .../2024/02/19/20240219154651A001.jpg */ - public static String extractFilename(MultipartFile file) { - return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), - FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), FileTypeUtils.getExtension(file)); + public static String extractFilename(MultipartFile file, FileUploadResult result) { + String fileId = Seq.getId(Seq.uploadSeqType); + String savedFileName = StringUtils.format("{}.{}", fileId, FileTypeUtils.getExtension(file)); + if (result != null) { + result.setFileId(fileId); + result.setSavedFileName(savedFileName); + } + return StringUtils.format("{}/{}", DateUtils.datePath(), savedFileName); } @SuppressWarnings("ResultOfMethodCallIgnored") @@ -100,26 +109,29 @@ public class FileUploadUtils { } private static String getPathFileName(String fileName) { - String pathFileName = "/" + fileName; - return pathFileName; + return "/" + fileName; } /** * 文件大小校验 * - * @param file 上传的文件 + * @param file 上传的文件 + * @param result 文件上传结果 * @throws FileSizeLimitExceededException 如果超出最大大小 * @throws InvalidExtensionException 文件校验异常 */ - public static void assertAllowed(MultipartFile file, String[] allowedExtension) + public static void assertAllowed(MultipartFile file, String[] allowedExtension, FileUploadResult result) throws FileSizeLimitExceededException, InvalidExtensionException { long size = file.getSize(); if (size > DEFAULT_MAX_SIZE) { throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); } + result.setFileSize(size); String fileName = file.getOriginalFilename(); String extension = FileTypeUtils.getExtension(file); + result.setExtension(extension); + result.setOriginalFilename(fileName); if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) { if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) { throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, diff --git a/ruoyi-ui/src/assets/images/profile.jpg b/ruoyi-ui/src/assets/images/profile.jpg deleted file mode 100644 index b3a940b21cc9dcea01e62d94e243eebcf76d96bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81131 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 z≺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 diff --git a/ruoyi-ui/src/assets/images/profile.png b/ruoyi-ui/src/assets/images/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..1c927a4f2f4ed48d50493ff0dd74f1cfdb6e44df GIT binary patch literal 32174 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 bMBx3peWrVP$Nld)cHo7QhT?a5i{SqO&aiUd literal 0 HcmV?d00001 diff --git a/ruoyi-ui/src/store/modules/user.js b/ruoyi-ui/src/store/modules/user.js index 5325f4e4..cc40301c 100644 --- a/ruoyi-ui/src/store/modules/user.js +++ b/ruoyi-ui/src/store/modules/user.js @@ -1,6 +1,6 @@ import { login, logout, getInfo } from '@/api/login' import { getToken, setToken, removeToken } from '@/utils/auth' -import defAva from '@/assets/images/profile.jpg' +import defAva from '@/assets/images/profile.png' const useUserStore = defineStore( 'user', diff --git a/sql/ry-cloud-ryas.sql b/sql/ry-cloud-ryas.sql index e25cdd77..cfa6e586 100644 --- a/sql/ry-cloud-ryas.sql +++ b/sql/ry-cloud-ryas.sql @@ -11,7 +11,7 @@ Target Server Version : 80200 (8.2.0) File Encoding : 65001 - Date: 19/02/2024 13:45:49 + Date: 19/02/2024 15:55:14 */ SET NAMES utf8mb4; @@ -424,6 +424,32 @@ INSERT INTO `sys_dict_type` VALUES (8, '通知状态', 'sys_notice_status', '0', INSERT INTO `sys_dict_type` VALUES (9, '操作类型', 'sys_oper_type', '0', 'admin', '2024-01-30 05:05:41', '', NULL, '操作类型列表'); INSERT INTO `sys_dict_type` VALUES (10, '系统状态', 'sys_common_status', '0', 'admin', '2024-01-30 05:05:41', '', NULL, '登录状态列表'); +-- ---------------------------- +-- Table structure for sys_file +-- ---------------------------- +DROP TABLE IF EXISTS `sys_file`; +CREATE TABLE `sys_file` ( + `file_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '文件ID', + `saved_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '保存的文件名称', + `original_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '原始文件名称', + `file_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '文件路径', + `extension` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '文件后缀', + `storage_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '存储方式', + `request_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '获取文件的URL', + `file_size` bigint NOT NULL COMMENT '文件大小(Byte)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`file_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '文件存储记录表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_file +-- ---------------------------- +INSERT INTO `sys_file` VALUES ('20240219155008A001', '20240219155008A001.png', 'AGVCar02.png', 'D:\\temp\\ruoyi\\uploadPath\\2024\\02\\19\\20240219155008A001.png', 'png', 'LOCAL', 'http://127.0.0.1:9300/statics/2024/02/19/20240219155008A001.png', 330857, '1', '2024-02-19 15:50:17', '1', '2024-02-19 15:50:17', '示例数据'); + -- ---------------------------- -- Table structure for sys_job -- ---------------------------- @@ -486,7 +512,7 @@ CREATE TABLE `sys_logininfor` ( PRIMARY KEY (`info_id`) USING BTREE, INDEX `idx_sys_logininfor_s`(`status` ASC) USING BTREE, INDEX `idx_sys_logininfor_lt`(`access_time` ASC) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 134 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '系统访问记录' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 139 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '系统访问记录' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_logininfor diff --git a/sql/ry-config-ryas.sql b/sql/ry-config-ryas.sql index aa5ede31..12ecdf68 100644 --- a/sql/ry-config-ryas.sql +++ b/sql/ry-config-ryas.sql @@ -4,14 +4,14 @@ Source Server : MySQL (CIT1) Source Server Type : MySQL Source Server Version : 80200 (8.2.0) - Source Host : localhost:3306 + Source Host : Source Schema : ry-config Target Server Type : MySQL Target Server Version : 80200 (8.2.0) File Encoding : 65001 - Date: 02/02/2024 18:45:36 + Date: 19/02/2024 15:56:16 */ SET NAMES utf8mb4; @@ -41,7 +41,7 @@ CREATE TABLE `config_info` ( `encrypted_data_key` text CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL COMMENT '秘钥', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `uk_configinfo_datagrouptenant`(`data_id` ASC, `group_id` ASC, `tenant_id` ASC) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 52 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin COMMENT = 'config_info' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 57 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin COMMENT = 'config_info' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of config_info @@ -51,15 +51,15 @@ INSERT INTO `config_info` VALUES (2, 'ruoyi-gateway-dev.yml', 'DEFAULT_GROUP', ' INSERT INTO `config_info` VALUES (3, 'ruoyi-auth-dev.yml', 'DEFAULT_GROUP', 'spring:\n redis:\n host: localhost\n port: 6379\n password:\n\nspecial:\n auth:\n login-enabled: true\n', '15384b16790e69bd4bf31109a6aea12b', '2020-11-20 00:00:00', '2024-02-01 08:23:56', NULL, '0:0:0:0:0:0:0:1', '', '', '认证中心', 'null', 'null', 'yaml', '', ''); INSERT INTO `config_info` VALUES (4, 'ruoyi-monitor-dev.yml', 'DEFAULT_GROUP', '# spring\nspring:\n security:\n user:\n name: ryas\n password: 123456\n boot:\n admin:\n ui:\n title: RYAS服务状态监控\n', '8b3ccaa35d17b5abe8c05a66a264e5f5', '2020-11-20 00:00:00', '2024-01-31 07:28:14', NULL, '0:0:0:0:0:0:0:1', '', '', '监控中心', 'null', 'null', 'yaml', '', ''); INSERT INTO `config_info` VALUES (5, 'ruoyi-system-dev.yml', 'DEFAULT_GROUP', '# spring配置\nspring:\n redis:\n host: localhost\n port: 6379\n password:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n connectTimeout: 30000\n socketTimeout: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,slf4j\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n # 主库数据源\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: root\n password: password\n # 从库数据源\n # slave:\n # username: \n # password: \n # url: \n # driver-class-name: \n\n# mybatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.ruoyi.system\n # 配置MyBatis日志输出\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n\n# swagger配置\nswagger:\n title: 系统模块接口文档\n license: Powered By ruoyi\n licenseUrl: https://ruoyi.vip\n', 'c16551d84032495e08b4d0a23648258b', '2020-11-20 00:00:00', '2024-02-01 07:46:29', NULL, '0:0:0:0:0:0:0:1', '', '', '系统模块', 'null', 'null', 'yaml', '', ''); -INSERT INTO `config_info` VALUES (6, 'ruoyi-gen-dev.yml', 'DEFAULT_GROUP', '# spring配置\nspring:\n redis:\n host: localhost\n port: 6379\n password:\n datasource:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: root\n password: password\n\n# mybatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.ruoyi.gen.domain\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath:mapper/**/*.xml\n\n# swagger配置\nswagger:\n title: 代码生成接口文档\n license: Powered By ruoyi\n licenseUrl: https://ruoyi.vip\n\n# 代码生成\ngen:\n # 作者\n author: ruoyi\n # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool\n packageName: com.ruoyi.system\n # 自动去除表前缀,默认是false\n autoRemovePre: false\n # 表前缀(生成类名不会包含表前缀,多个用逗号分隔)\n tablePrefix: sys_\n', '23a2f21b291cb7757c5eee924b1cc1d5', '2020-11-20 00:00:00', '2024-01-31 06:56:23', NULL, '0:0:0:0:0:0:0:1', '', '', '代码生成', 'null', 'null', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (6, 'ruoyi-gen-dev.yml', 'DEFAULT_GROUP', '# spring配置\nspring:\n redis:\n host: localhost\n port: 6379\n password:\n datasource:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: root\n password: password\n\n# mybatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.ruoyi.gen.domain\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath:mapper/**/*.xml\n\n# swagger配置\nswagger:\n title: 代码生成接口文档\n license: Powered By ruoyi\n licenseUrl: https://ruoyi.vip\n\n# 代码生成\ngen:\n # 作者\n author: ryas\n # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool\n packageName: com.ruoyi.system\n # 自动去除表前缀,默认是false\n autoRemovePre: false\n # 表前缀(生成类名不会包含表前缀,多个用逗号分隔)\n tablePrefix: sys_\n', '6a608ec04c64588783a08316dbe2ac3e', '2020-11-20 00:00:00', '2024-02-05 08:56:27', 'alan', '101.229.149.67', '', '', '代码生成', 'null', 'null', 'yaml', '', ''); INSERT INTO `config_info` VALUES (7, 'ruoyi-job-dev.yml', 'DEFAULT_GROUP', '# spring配置\nspring:\n redis:\n host: localhost\n port: 6379\n password: \n datasource:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: root\n password: password\n\n# mybatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.ruoyi.job.domain\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n #mapperLocations: classpath:mapper/**/*.xml\n\n# swagger配置\nswagger:\n title: 定时任务接口文档\n license: Powered By ruoyi\n licenseUrl: https://ruoyi.vip\n', '79c2abe7b92b996eae686e4e158efa89', '2020-11-20 00:00:00', '2024-01-31 09:04:48', NULL, '0:0:0:0:0:0:0:1', '', '', '定时任务', 'null', 'null', 'yaml', '', ''); -INSERT INTO `config_info` VALUES (8, 'ruoyi-file-dev.yml', 'DEFAULT_GROUP', '# 本地文件上传 \nfile:\n domain: http://127.0.0.1:9300\n path: D:/temp/ruoyi/uploadPath\n prefix: /statics\n\n# FastDFS配置\nfdfs:\n domain: http://8.129.231.12\n soTimeout: 3000\n connectTimeout: 2000\n trackerList: 8.129.231.12:22122\n\n# Minio配置\nminio:\n url: http://8.129.231.12:9000\n accessKey: minioadmin\n secretKey: minioadmin\n bucketName: test', 'fe5c45f87e45f2dce9900097cfac5f64', '2020-11-20 00:00:00', '2024-01-31 07:07:52', NULL, '0:0:0:0:0:0:0:1', '', '', '文件服务', 'null', 'null', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (8, 'ruoyi-file-dev.yml', 'DEFAULT_GROUP', '# 本地文件上传 \nfile:\n domain: http://127.0.0.1:9300\n path: D:/temp/ruoyi/uploadPath\n prefix: /statics\n\n# FastDFS配置\nfdfs:\n domain: http://8.129.231.12\n soTimeout: 3000\n connectTimeout: 2000\n trackerList: 8.129.231.12:22122\n\n# Minio配置\nminio:\n url: http://8.129.231.12:9000\n accessKey: minioadmin\n secretKey: minioadmin\n bucketName: test\n\n# spring配置\nspring:\n datasource:\n druid:\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n connectTimeout: 30000\n socketTimeout: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n # 主库数据源\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: root\n password: password\n # 从库数据源\n # slave:\n # username: \n # password: \n # url: \n # driver-class-name: \n\n# mybatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.ruoyi.file\n # 配置MyBatis日志输出\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n', '558d0a9349f5560d8f0bffc3c0c36eab', '2020-11-20 00:00:00', '2024-02-19 07:22:11', 'alan', '101.229.149.67', '', '', '文件服务', 'null', 'null', 'yaml', '', ''); INSERT INTO `config_info` VALUES (9, 'sentinel-ruoyi-gateway', 'DEFAULT_GROUP', '[\r\n {\r\n \"resource\": \"ruoyi-auth\",\r\n \"count\": 500,\r\n \"grade\": 1,\r\n \"limitApp\": \"default\",\r\n \"strategy\": 0,\r\n \"controlBehavior\": 0\r\n },\r\n {\r\n \"resource\": \"ruoyi-system\",\r\n \"count\": 1000,\r\n \"grade\": 1,\r\n \"limitApp\": \"default\",\r\n \"strategy\": 0,\r\n \"controlBehavior\": 0\r\n },\r\n {\r\n \"resource\": \"ruoyi-gen\",\r\n \"count\": 200,\r\n \"grade\": 1,\r\n \"limitApp\": \"default\",\r\n \"strategy\": 0,\r\n \"controlBehavior\": 0\r\n },\r\n {\r\n \"resource\": \"ruoyi-job\",\r\n \"count\": 300,\r\n \"grade\": 1,\r\n \"limitApp\": \"default\",\r\n \"strategy\": 0,\r\n \"controlBehavior\": 0\r\n }\r\n]', '9f3a3069261598f74220bc47958ec252', '2020-11-20 00:00:00', '2020-11-20 00:00:00', NULL, '0:0:0:0:0:0:0:1', '', '', '限流策略', 'null', 'null', 'json', NULL, ''); INSERT INTO `config_info` VALUES (35, 'ruoyi-gateway-dev.yml', 'GROUP_ALL_IN_1', 'spring:\n redis:\n host: localhost\n port: 6379\n password:\n cloud:\n gateway:\n discovery:\n locator:\n lowerCaseServiceId: true\n enabled: true\n routes:\n # 认证中心\n - id: ruoyi-auth\n uri: lb://ruoyi-system\n predicates:\n - Path=/auth/**\n filters:\n # 验证码处理\n - CacheRequestFilter\n - ValidateCodeFilter\n - StripPrefix=1\n # 代码生成\n - id: ruoyi-gen\n uri: lb://ruoyi-gen\n predicates:\n - Path=/code/**\n filters:\n - StripPrefix=1\n # 定时任务\n - id: ruoyi-job\n uri: lb://ruoyi-system\n predicates:\n - Path=/schedule/**\n filters:\n - StripPrefix=1\n # 系统模块\n - id: ruoyi-system\n uri: lb://ruoyi-system\n predicates:\n - Path=/system/**\n filters:\n - StripPrefix=1\n # 文件服务\n - id: ruoyi-file\n uri: lb://ruoyi-system\n predicates:\n - Path=/file/**\n filters:\n - StripPrefix=1\n # WMS服务\n - id: ruoyi-wms\n uri: lb://ruoyi-wms\n predicates:\n - Path=/wms/**\n filters:\n - StripPrefix=1\n\n# 安全配置\nsecurity:\n # 验证码\n captcha:\n enabled: true\n type: math\n # 防止XSS攻击\n xss:\n enabled: true\n excludeUrls:\n - /system/notice\n # 不校验白名单\n ignore:\n whites:\n - /auth/logout\n - /auth/login\n - /auth/register\n - /*/v2/api-docs\n - /csrf\n - /auth/specialAuth/login\n - /system/test/**\n - /wms/test/**\n', 'cc74a6d0d4b40c085da48f56fbd01e5b', '2024-01-31 09:34:00', '2024-02-01 08:25:17', NULL, '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (36, 'ruoyi-system-dev.yml', 'GROUP_ALL_IN_1', '# spring配置\nspring:\n redis:\n host: localhost\n port: 6379\n password:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n connectTimeout: 30000\n socketTimeout: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,slf4j\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n # 主库数据源\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: root\n password: password\n # 从库数据源\n # slave:\n # username: \n # password: \n # url: \n # driver-class-name: \n\n# mybatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.ruoyi.system,com.ruoyi.job.domain\n # 配置MyBatis日志输出\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n\n# 本地文件上传 \nfile:\n domain: http://127.0.0.1:9201\n path: D:/temp/ruoyi/uploadPath\n prefix: /statics\n\n# FastDFS配置\nfdfs:\n domain: http://8.129.231.12\n soTimeout: 3000\n connectTimeout: 2000\n trackerList: 8.129.231.12:22122\n\n# Minio配置\nminio:\n url: http://8.129.231.12:9000\n accessKey: minioadmin\n secretKey: minioadmin\n bucketName: test\n\n# 特殊登录控制(不需要验证码)\nspecial:\n auth:\n login-enabled: true\n', '79e0d26257e644b6a248990af323f59d', '2024-01-31 09:34:19', '2024-02-01 08:28:49', NULL, '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (37, 'application-dev.yml', 'GROUP_ALL_IN_1', 'spring:\n autoconfigure:\n exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\n mvc:\n pathmatch:\n matching-strategy: ant_path_matcher\n cloud:\n # feign 配置\n openfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n client:\n config:\n default:\n connectTimeout: 10000\n readTimeout: 10000\n compression:\n request:\n enabled: true\n min-request-size: 8192\n response:\n enabled: true\n\n# 暴露监控端点\nmanagement:\n endpoints:\n web:\n exposure:\n include: \'*\'\n', '40039af000c00c2a42c264e926c1d2fc', '2024-01-31 09:37:04', '2024-01-31 09:37:04', NULL, '0:0:0:0:0:0:0:1', '', '', '通用配置', NULL, NULL, 'yaml', NULL, ''); INSERT INTO `config_info` VALUES (38, 'ruoyi-monitor-dev.yml', 'GROUP_ALL_IN_1', '# spring\nspring:\n security:\n user:\n name: ryas\n password: 123456\n boot:\n admin:\n ui:\n title: RYAS服务状态监控\n', '8b3ccaa35d17b5abe8c05a66a264e5f5', '2024-01-31 09:37:29', '2024-01-31 09:37:29', NULL, '0:0:0:0:0:0:0:1', '', '', '监控中心', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` VALUES (39, 'ruoyi-gen-dev.yml', 'GROUP_ALL_IN_1', '# spring配置\nspring:\n redis:\n host: localhost\n port: 6379\n password:\n datasource:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: root\n password: password\n\n# mybatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.ruoyi.gen.domain\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath:mapper/**/*.xml\n\n# swagger配置\nswagger:\n title: 代码生成接口文档\n license: Powered By ruoyi\n licenseUrl: https://ruoyi.vip\n\n# 代码生成\ngen:\n # 作者\n author: ruoyi\n # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool\n packageName: com.ruoyi.system\n # 自动去除表前缀,默认是false\n autoRemovePre: false\n # 表前缀(生成类名不会包含表前缀,多个用逗号分隔)\n tablePrefix: sys_\n', '23a2f21b291cb7757c5eee924b1cc1d5', '2024-01-31 09:37:29', '2024-01-31 09:37:29', NULL, '0:0:0:0:0:0:0:1', '', '', '代码生成', NULL, NULL, 'yaml', NULL, ''); +INSERT INTO `config_info` VALUES (39, 'ruoyi-gen-dev.yml', 'GROUP_ALL_IN_1', '# spring配置\nspring:\n redis:\n host: localhost\n port: 6379\n password:\n datasource:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: root\n password: password\n\n# mybatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.ruoyi.gen.domain\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath:mapper/**/*.xml\n\n# swagger配置\nswagger:\n title: 代码生成接口文档\n license: Powered By ruoyi\n licenseUrl: https://ruoyi.vip\n\n# 代码生成\ngen:\n # 作者\n author: ryas\n # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool\n packageName: com.ruoyi.system\n # 自动去除表前缀,默认是false\n autoRemovePre: false\n # 表前缀(生成类名不会包含表前缀,多个用逗号分隔)\n tablePrefix: sys_\n', '6a608ec04c64588783a08316dbe2ac3e', '2024-01-31 09:37:29', '2024-02-05 08:56:38', 'alan', '101.229.149.67', '', '', '代码生成', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (45, 'ruoyi-wms-dev.yml', 'DEFAULT_GROUP', '# spring配置\nspring:\n redis:\n host: localhost\n port: 6379\n password:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n connectTimeout: 30000\n socketTimeout: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,slf4j\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n # 主库数据源\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: root\n password: password\n # 从库数据源\n # slave:\n # username: \n # password: \n # url: \n # driver-class-name: \n\n# mybatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.ruoyi.wms.domain\n # 配置MyBatis日志输出\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n', '33fd0757ceb0a95e7fa62bf1646121cd', '2024-02-01 07:44:47', '2024-02-01 07:45:50', NULL, '0:0:0:0:0:0:0:1', '', '', '系统模块', '', '', 'yaml', '', ''); -- ---------------------------- @@ -201,7 +201,7 @@ CREATE TABLE `his_config_info` ( INDEX `idx_gmt_create`(`gmt_create` ASC) USING BTREE, INDEX `idx_gmt_modified`(`gmt_modified` ASC) USING BTREE, INDEX `idx_did`(`data_id` ASC) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 49 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin COMMENT = '多租户改造' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 54 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin COMMENT = '多租户改造' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of his_config_info @@ -235,7 +235,7 @@ CREATE TABLE `roles` ( -- ---------------------------- -- Records of roles -- ---------------------------- -INSERT INTO `roles` VALUES ('nacos', 'ROLE_ADMIN'); +INSERT INTO `roles` VALUES ('alan', 'ROLE_ADMIN'); -- ---------------------------- -- Table structure for tenant_capacity @@ -296,6 +296,6 @@ CREATE TABLE `users` ( -- ---------------------------- -- Records of users -- ---------------------------- -INSERT INTO `users` VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', 1); +INSERT INTO `users` VALUES ('alan', '$2a$10$/Sqe163WdMEnL.gyVu7v..tVSThUMiy7Wec37eLGByuT.UY7pbm6a', 1); SET FOREIGN_KEY_CHECKS = 1;