From f6deba2a41230c9198d7b94c1180ef9f74af3841 Mon Sep 17 00:00:00 2001 From: czhqwer Date: Sat, 29 Mar 2025 01:35:57 +0800 Subject: [PATCH] =?UTF-8?q?Refactor:=20=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BB=A5=E5=8A=A8=E6=80=81=E6=94=AF?= =?UTF-8?q?=E6=8C=81MySQL=E5=92=8CSQLITE=20=E5=B0=86DataSourceConfig?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=BA=EF=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MySQL跳过架构初始化,需要手动设置。 - 使用schema.sql和data.sql初始化sqlite - 更改上传文件创建时间持续到持续的时间戳处理。 - 添加日志记录以更好地调试数据源选择和初始化 --- sql/upload-file.sql | 4 +- upload-file-backend/pom.xml | 5 ++ .../cn/czh/advice/GlobalExceptionHandler.java | 3 + .../java/cn/czh/config/DataSourceConfig.java | 76 ++++++++++++++++++ .../main/java/cn/czh/entity/UploadFile.java | 2 +- .../czh/service/impl/LocalStorageService.java | 8 +- .../czh/service/impl/MinioStorageService.java | 8 +- .../czh/service/impl/OssStorageService.java | 8 +- .../src/main/resources/application.yaml | 16 ++-- upload-file-backend/upload-file.db | Bin 0 -> 24576 bytes 10 files changed, 110 insertions(+), 20 deletions(-) create mode 100644 upload-file-backend/src/main/java/cn/czh/config/DataSourceConfig.java create mode 100644 upload-file-backend/upload-file.db diff --git a/sql/upload-file.sql b/sql/upload-file.sql index 08532f6..6ef1371 100644 --- a/sql/upload-file.sql +++ b/sql/upload-file.sql @@ -36,7 +36,7 @@ CREATE TABLE `storage_config` ( -- ---------------------------- -- Records of storage_config -- ---------------------------- -INSERT INTO `storage_config` VALUES (1, 'local', 'http://localhost:10086', '', '', 'E:\\develop\\Java\\xxxxxx\\upload-file-backend\\data'); +INSERT INTO `storage_config` VALUES (1, 'local', 'http://localhost:10086', '', '', 'E:\\data'); INSERT INTO `storage_config` VALUES (2, 'minio', 'http://localhost:9000', 'minio', 'minio123', 'upload-file'); INSERT INTO `storage_config` VALUES (3, 'oss', 'https://oss-cn-guangzhou.aliyuncs.com', 'ossAccessKeyID', 'ossAccessKeySecret', 'yourBucket'); @@ -57,7 +57,7 @@ CREATE TABLE `upload_file` ( `content_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文件类型', `access_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '访问地址', `download_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '下载地址', - `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `create_time` varchar(255) DEFAULT NULL COMMENT '创建时间', `storage_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '上传类型', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `uq_file_identifier`(`file_identifier` ASC) USING BTREE, diff --git a/upload-file-backend/pom.xml b/upload-file-backend/pom.xml index 3d34d88..45a03b4 100644 --- a/upload-file-backend/pom.xml +++ b/upload-file-backend/pom.xml @@ -74,6 +74,11 @@ aliyun-sdk-oss 3.15.0 + + org.xerial + sqlite-jdbc + 3.49.1.0 + diff --git a/upload-file-backend/src/main/java/cn/czh/advice/GlobalExceptionHandler.java b/upload-file-backend/src/main/java/cn/czh/advice/GlobalExceptionHandler.java index 7b1f843..84ba312 100644 --- a/upload-file-backend/src/main/java/cn/czh/advice/GlobalExceptionHandler.java +++ b/upload-file-backend/src/main/java/cn/czh/advice/GlobalExceptionHandler.java @@ -2,11 +2,13 @@ package cn.czh.advice; import cn.czh.base.BusinessException; import cn.czh.base.Result; +import lombok.extern.slf4j.Slf4j; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +@Slf4j @RestControllerAdvice public class GlobalExceptionHandler { @@ -19,6 +21,7 @@ public class GlobalExceptionHandler { @ExceptionHandler(BusinessException.class) public Result handleBusinessException(BusinessException e) { + log.error("业务异常: {}", e.getMessage(), e); return Result.error(500, e.getMessage()); } } \ No newline at end of file diff --git a/upload-file-backend/src/main/java/cn/czh/config/DataSourceConfig.java b/upload-file-backend/src/main/java/cn/czh/config/DataSourceConfig.java new file mode 100644 index 0000000..3317596 --- /dev/null +++ b/upload-file-backend/src/main/java/cn/czh/config/DataSourceConfig.java @@ -0,0 +1,76 @@ +package cn.czh.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.DependsOn; +import org.springframework.core.io.ClassPathResource; +import org.springframework.jdbc.datasource.init.DataSourceInitializer; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; + +import javax.sql.DataSource; + +@Configuration +public class DataSourceConfig { + + @Value("${spring.datasource.url:jdbc:sqlite:./upload-file.db}") + private String defaultUrl; + + @Value("${spring.datasource.driver-class-name:org.sqlite.JDBC}") + private String defaultDriverClassName; + + @Value("${mysql.datasource.url:}") + private String mysqlUrl; + + @Value("${mysql.datasource.username:}") + private String mysqlUsername; + + @Value("${mysql.datasource.password:}") + private String mysqlPassword; + + @Value("${mysql.datasource.driver-class-name:com.mysql.cj.jdbc.Driver}") + private String mysqlDriverClassName; + + @Bean + public DataSource dataSource() { + boolean useMySQL = !mysqlUrl.isEmpty() && !mysqlUsername.isEmpty() && !mysqlPassword.isEmpty(); + + if (useMySQL) { + return DataSourceBuilder.create() + .url(mysqlUrl) + .username(mysqlUsername) + .password(mysqlPassword) + .driverClassName(mysqlDriverClassName) + .build(); + } else { + // 默认使用 SQLite,无需 username 和 password + return DataSourceBuilder.create() + .url(defaultUrl) + .driverClassName(defaultDriverClassName) + .build(); + } + } + + @Bean + @DependsOn("dataSource") + public DataSourceInitializer dataSourceInitializer(DataSource dataSource) { + DataSourceInitializer initializer = new DataSourceInitializer(); + initializer.setDataSource(dataSource); + ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); + + boolean useMySQL = !mysqlUrl.isEmpty() && !mysqlUsername.isEmpty() && !mysqlPassword.isEmpty(); + + if (useMySQL) { + initializer.setEnabled(false); + } else { + populator.addScript(new ClassPathResource("schema.sql")); + populator.addScript(new ClassPathResource("data.sql")); + initializer.setEnabled(true); + } + + initializer.setDatabasePopulator(populator); + initializer.afterPropertiesSet(); + return initializer; + } +} \ No newline at end of file diff --git a/upload-file-backend/src/main/java/cn/czh/entity/UploadFile.java b/upload-file-backend/src/main/java/cn/czh/entity/UploadFile.java index 8b73bfc..13559f7 100644 --- a/upload-file-backend/src/main/java/cn/czh/entity/UploadFile.java +++ b/upload-file-backend/src/main/java/cn/czh/entity/UploadFile.java @@ -72,6 +72,6 @@ public class UploadFile implements Serializable { /** * 创建时间 */ - private Date createTime; + private String createTime; } \ No newline at end of file diff --git a/upload-file-backend/src/main/java/cn/czh/service/impl/LocalStorageService.java b/upload-file-backend/src/main/java/cn/czh/service/impl/LocalStorageService.java index 2731556..a8dc625 100644 --- a/upload-file-backend/src/main/java/cn/czh/service/impl/LocalStorageService.java +++ b/upload-file-backend/src/main/java/cn/czh/service/impl/LocalStorageService.java @@ -21,12 +21,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.springframework.beans.BeanUtils; +import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.io.File; import java.io.FileInputStream; @@ -50,7 +50,7 @@ public class LocalStorageService implements IStorageService { private StorageConfig storageConfig; - @PostConstruct + @EventListener(ApplicationReadyEvent.class) public void init() { this.refreshConfig(); } @@ -110,7 +110,7 @@ public class LocalStorageService implements IStorageService { uploadFile.setChunkSize(file.getSize()); uploadFile.setFileIdentifier(md5); uploadFile.setStorageType(StorageConfig.LOCAL); - uploadFile.setCreateTime(new Date()); + uploadFile.setCreateTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); uploadFileMapper.insert(uploadFile); FileRecordDTO fileRecord = new FileRecordDTO(); @@ -160,7 +160,7 @@ public class LocalStorageService implements IStorageService { .setObjectKey(objectKey) .setIsFinish(0) .setStorageType(StorageConfig.LOCAL) - .setCreateTime(new Date()) + .setCreateTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")) .setContentType(param.getContentType()); uploadFileMapper.insert(uploadFile); diff --git a/upload-file-backend/src/main/java/cn/czh/service/impl/MinioStorageService.java b/upload-file-backend/src/main/java/cn/czh/service/impl/MinioStorageService.java index f318640..51e64a8 100644 --- a/upload-file-backend/src/main/java/cn/czh/service/impl/MinioStorageService.java +++ b/upload-file-backend/src/main/java/cn/czh/service/impl/MinioStorageService.java @@ -34,6 +34,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import io.minio.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; +import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; import org.springframework.http.MediaType; import org.springframework.http.MediaTypeFactory; @@ -41,7 +42,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -79,7 +79,7 @@ public class MinioStorageService implements IStorageService { private MinioClient minioClient; private AmazonS3 amazonS3; - @PostConstruct + @EventListener(ApplicationReadyEvent.class) public void init() { this.refreshConfig(); } @@ -151,7 +151,7 @@ public class MinioStorageService implements IStorageService { uploadFile.setContentType(file.getContentType()); uploadFile.setAccessUrl(getFileAccessUrl(objectName)); uploadFile.setDownloadUrl(getFileDownloadUrl(objectName)); - uploadFile.setCreateTime(new Date()); + uploadFile.setCreateTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); uploadFile.setIsFinish(1); uploadFile.setTotalSize(file.getSize()); uploadFile.setChunkNum(1); @@ -209,7 +209,7 @@ public class MinioStorageService implements IStorageService { .setFileName(fileName) .setObjectKey(key) .setIsFinish(0) - .setCreateTime(currentDate) + .setCreateTime(DateUtil.format(currentDate, "yyyy-MM-dd HH:mm:ss")) .setContentType(param.getContentType()) .setStorageType(StorageConfig.MINIO) .setUploadId(getUploadId(key)); diff --git a/upload-file-backend/src/main/java/cn/czh/service/impl/OssStorageService.java b/upload-file-backend/src/main/java/cn/czh/service/impl/OssStorageService.java index aae8a3c..acf7a5e 100644 --- a/upload-file-backend/src/main/java/cn/czh/service/impl/OssStorageService.java +++ b/upload-file-backend/src/main/java/cn/czh/service/impl/OssStorageService.java @@ -23,12 +23,12 @@ import com.aliyun.oss.model.*; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; +import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.io.IOException; import java.io.InputStream; @@ -56,7 +56,7 @@ public class OssStorageService implements IStorageService { /** 预签名 URL 过期时间:10 分钟 */ private static final long PRE_SIGN_URL_EXPIRE = 10 * 60 * 1000; - @PostConstruct + @EventListener(ApplicationReadyEvent.class) public void init() { this.refreshConfig(); } @@ -121,7 +121,7 @@ public class OssStorageService implements IStorageService { uploadFile.setChunkNum(1); uploadFile.setChunkSize(file.getSize()); uploadFile.setFileIdentifier(md5); - uploadFile.setCreateTime(new Date()); + uploadFile.setCreateTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); uploadFile.setStorageType(StorageConfig.OSS); uploadFileMapper.insert(uploadFile); @@ -196,7 +196,7 @@ public class OssStorageService implements IStorageService { .setObjectKey(objectKey) .setIsFinish(0) .setStorageType(StorageConfig.OSS) - .setCreateTime(new Date()) + .setCreateTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")) .setContentType(param.getContentType()); uploadFileMapper.insert(task); diff --git a/upload-file-backend/src/main/resources/application.yaml b/upload-file-backend/src/main/resources/application.yaml index 5244845..46dfe46 100644 --- a/upload-file-backend/src/main/resources/application.yaml +++ b/upload-file-backend/src/main/resources/application.yaml @@ -3,10 +3,8 @@ server: spring: datasource: - url: jdbc:mysql://localhost:3306/upload-file?useSSL=false&serverTimezone=Asia/Shanghai - username: ${MYSQL_USERNAME:root} - password: ${MYSQL_password:root} - driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:sqlite:./upload-file.db + driver-class-name: org.sqlite.JDBC servlet: multipart: max-file-size: 500MB @@ -14,6 +12,14 @@ spring: main: allow-bean-definition-overriding: true +mysql: + datasource: + url: ${MYSQL_URL:} # jdbc:mysql://localhost:3306/upload-file?useSSL=false&serverTimezone=Asia/Shanghai + username: ${MYSQL_USERNAME:} # root + password: ${MYSQL_PASSWORD:} # root + driver-class-name: com.mysql.cj.jdbc.Driver + logging: level: - cn.czh.mapper: debug \ No newline at end of file + cn.czh.mapper: debug + org.springframework.jdbc: debug \ No newline at end of file diff --git a/upload-file-backend/upload-file.db b/upload-file-backend/upload-file.db new file mode 100644 index 0000000000000000000000000000000000000000..ec00ebf42f944488322233bf3b87ff9205e73e47 GIT binary patch literal 24576 zcmeI&Z%^7l90%}LRLmk{*&g(PS#k?mMq^c&iJLwe&c+ZC6(N&kNmJVcZk874bsIid z;+8CX6MJ8Kwl}b+d%kO-3h0cF@q4j)<#&HSKSFYqc{CRmCm2nQ6yQL*oF zJ`h)}RMN=AdTtE6W}8k1yweZV;>H>6Pe!=MO~>%rIlWxi)pS-XaL;ZJxM-hM48KT%^e0{mx*W8Zj-4`o0nLoM?F(vAs`j^k%tw$?8#)Q-d?HyCI=QeD3wk zrg$|Ti>QY)^UCtFT#pjucO7v8HhkI*s4M0ezfFuKY9g2o9W~KYz1WbGimJ+AUkt_^ z&MEfMV9j_1gS(mW5yx7R>>aazxfzX6*Y0@C6Ja#B(@Q>i7#vrMPOd1q^F zZBX}ozLn4AUT^4I?`@Nt^+Zy7@=nb^^L#&S=!=%3x?;I2&A@b<=PfT-H67LuT+3gz zytW7yqK6rKv|rpAy*rMM>U}ThZAWMH%^9(ZSIW~&TRbT7uB~D-m&-+w=vV&b`rrZ6 zO85jwq%V7y6o&tsm(zbF@q+>Z2tWV=5P$##AOHafKmY;|fWQ<8JeCuxJpN^bM0oxe zU;0OZ00bZa0SG_<0uX=z1Rwwb2tZ(p1s;TZ!}))TGmNc400Izz00bZa0SG_<0uX=z g1SARPf4mDI009U<00Izz00bZa0SG_<0@E+>52As80RR91 literal 0 HcmV?d00001