feat(file-management): 添加文件管理功能并支持环境配置
- 在 application.yml 和环境特定的配置文件中添加文件存储目录路径配置 - 新增 Stage 环境配置文件和相关设置 - 修改 WmsFileManagementController 以使用配置文件中的目录路径 - 优化文件管理相关 API 的错误处理和路径获取方式
This commit is contained in:
@@ -30,6 +30,12 @@ xxl.job:
|
|||||||
# 执行器日志文件保存天数:大于3生效
|
# 执行器日志文件保存天数:大于3生效
|
||||||
logretentiondays: 30
|
logretentiondays: 30
|
||||||
|
|
||||||
|
--- # WMS文件管理配置
|
||||||
|
klp:
|
||||||
|
file:
|
||||||
|
# 开发环境文件存储目录
|
||||||
|
directory-path: testDirectory
|
||||||
|
|
||||||
--- # 数据源配置
|
--- # 数据源配置
|
||||||
spring:
|
spring:
|
||||||
datasource:
|
datasource:
|
||||||
|
|||||||
@@ -1,6 +1,12 @@
|
|||||||
--- # 临时文件存储位置 避免临时文件被系统清理报错
|
--- # 临时文件存储位置 避免临时文件被系统清理报错
|
||||||
spring.servlet.multipart.location: /klp/server/temp
|
spring.servlet.multipart.location: /klp/server/temp
|
||||||
|
|
||||||
|
--- # WMS文件管理配置
|
||||||
|
klp:
|
||||||
|
file:
|
||||||
|
# 生产环境文件存储目录
|
||||||
|
directory-path: /home/ubuntu/oa/folder
|
||||||
|
|
||||||
--- # 监控中心配置
|
--- # 监控中心配置
|
||||||
spring.boot.admin.client:
|
spring.boot.admin.client:
|
||||||
# 增加客户端开关
|
# 增加客户端开关
|
||||||
|
|||||||
180
klp-admin/src/main/resources/application-stage.yml
Normal file
180
klp-admin/src/main/resources/application-stage.yml
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
--- # 临时文件存储位置 避免临时文件被系统清理报错
|
||||||
|
spring.servlet.multipart.location: /klp/server/temp
|
||||||
|
|
||||||
|
--- # WMS文件管理配置
|
||||||
|
klp:
|
||||||
|
file:
|
||||||
|
# 开发环境文件存储目录
|
||||||
|
directory-path: testDirectory
|
||||||
|
|
||||||
|
--- # 监控中心配置
|
||||||
|
spring.boot.admin.client:
|
||||||
|
# 增加客户端开关
|
||||||
|
enabled: true
|
||||||
|
url: http://localhost:9090/admin
|
||||||
|
instance:
|
||||||
|
service-host-type: IP
|
||||||
|
username: klp
|
||||||
|
password: 123456
|
||||||
|
|
||||||
|
--- # xxl-job 配置
|
||||||
|
xxl.job:
|
||||||
|
# 执行器开关
|
||||||
|
enabled: true
|
||||||
|
# 调度中心地址:如调度中心集群部署存在多个地址则用逗号分隔。
|
||||||
|
admin-addresses: http://localhost:9100/xxl-job-admin
|
||||||
|
# 执行器通讯TOKEN:非空时启用
|
||||||
|
access-token: xxl-job
|
||||||
|
executor:
|
||||||
|
# 执行器AppName:执行器心跳注册分组依据;为空则关闭自动注册
|
||||||
|
appname: xxl-job-executor
|
||||||
|
# 执行器端口号 执行器从9101开始往后写
|
||||||
|
port: 9101
|
||||||
|
# 执行器注册:默认IP:PORT
|
||||||
|
address:
|
||||||
|
# 执行器IP:默认自动获取IP
|
||||||
|
ip:
|
||||||
|
# 执行器运行日志文件存储磁盘路径
|
||||||
|
logpath: ./logs/xxl-job
|
||||||
|
# 执行器日志文件保存天数:大于3生效
|
||||||
|
logretentiondays: 30
|
||||||
|
|
||||||
|
--- # 数据源配置
|
||||||
|
spring:
|
||||||
|
datasource:
|
||||||
|
type: com.zaxxer.hikari.HikariDataSource
|
||||||
|
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
|
||||||
|
dynamic:
|
||||||
|
# 性能分析插件(有性能损耗 不建议生产环境使用)
|
||||||
|
p6spy: false
|
||||||
|
# 设置默认的数据源或者数据源组,默认值即为 master
|
||||||
|
primary: master
|
||||||
|
# 严格模式 匹配不到数据源则报错
|
||||||
|
strict: true
|
||||||
|
datasource:
|
||||||
|
# 主库数据源
|
||||||
|
master:
|
||||||
|
type: ${spring.datasource.type}
|
||||||
|
driverClassName: com.mysql.cj.jdbc.Driver
|
||||||
|
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
|
||||||
|
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
|
||||||
|
url: jdbc:mysql://140.143.206.120:3306/klp-oa?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
|
||||||
|
username: klp
|
||||||
|
password: KeLunPu123@
|
||||||
|
# 从库数据源
|
||||||
|
slave:
|
||||||
|
lazy: true
|
||||||
|
type: ${spring.datasource.type}
|
||||||
|
driverClassName: com.mysql.cj.jdbc.Driver
|
||||||
|
url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
|
||||||
|
username:
|
||||||
|
password:
|
||||||
|
# oracle:
|
||||||
|
# type: ${spring.datasource.type}
|
||||||
|
# driverClassName: oracle.jdbc.OracleDriver
|
||||||
|
# url: jdbc:oracle:thin:@//localhost:1521/XE
|
||||||
|
# username: ROOT
|
||||||
|
# password: root
|
||||||
|
# hikari:
|
||||||
|
# connectionTestQuery: SELECT 1 FROM DUAL
|
||||||
|
# postgres:
|
||||||
|
# type: ${spring.datasource.type}
|
||||||
|
# driverClassName: org.postgresql.Driver
|
||||||
|
# url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
|
||||||
|
# username: root
|
||||||
|
# password: root
|
||||||
|
# sqlserver:
|
||||||
|
# type: ${spring.datasource.type}
|
||||||
|
# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
|
||||||
|
# url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
|
||||||
|
# username: SA
|
||||||
|
# password: root
|
||||||
|
hikari:
|
||||||
|
# 最大连接池数量
|
||||||
|
maxPoolSize: 20
|
||||||
|
# 最小空闲线程数量
|
||||||
|
minIdle: 10
|
||||||
|
# 配置获取连接等待超时的时间
|
||||||
|
connectionTimeout: 30000
|
||||||
|
# 校验超时时间
|
||||||
|
validationTimeout: 5000
|
||||||
|
# 空闲连接存活最大时间,默认10分钟
|
||||||
|
idleTimeout: 600000
|
||||||
|
# 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
|
||||||
|
maxLifetime: 1800000
|
||||||
|
# 连接测试query(配置检测连接是否有效)
|
||||||
|
connectionTestQuery: SELECT 1
|
||||||
|
# 多久检查一次连接的活性
|
||||||
|
keepaliveTime: 30000
|
||||||
|
|
||||||
|
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
|
||||||
|
spring:
|
||||||
|
redis:
|
||||||
|
# 地址
|
||||||
|
host: 140.143.206.120
|
||||||
|
# 端口,默认为6379
|
||||||
|
port: 6379
|
||||||
|
# 数据库索引
|
||||||
|
database: 0
|
||||||
|
# 密码(如没有密码请注释掉)
|
||||||
|
password: KeLunPu123!
|
||||||
|
# 连接超时时间
|
||||||
|
timeout: 10s
|
||||||
|
# 是否开启ssl
|
||||||
|
ssl: false
|
||||||
|
|
||||||
|
redisson:
|
||||||
|
# redis key前缀
|
||||||
|
keyPrefix:
|
||||||
|
# 线程池数量
|
||||||
|
threads: 16
|
||||||
|
# Netty线程池数量
|
||||||
|
nettyThreads: 32
|
||||||
|
# 单节点配置
|
||||||
|
singleServerConfig:
|
||||||
|
# 客户端名称
|
||||||
|
clientName: ${klp.name}
|
||||||
|
# 最小空闲连接数
|
||||||
|
connectionMinimumIdleSize: 32
|
||||||
|
# 连接池大小
|
||||||
|
connectionPoolSize: 64
|
||||||
|
# 连接空闲超时,单位:毫秒
|
||||||
|
idleConnectionTimeout: 10000
|
||||||
|
# 命令等待超时,单位:毫秒
|
||||||
|
timeout: 3000
|
||||||
|
# 发布和订阅连接池大小
|
||||||
|
subscriptionConnectionPoolSize: 50
|
||||||
|
|
||||||
|
--- # mail 邮件发送
|
||||||
|
mail:
|
||||||
|
enabled: false
|
||||||
|
host: smtp.163.com
|
||||||
|
port: 465
|
||||||
|
# 是否需要用户名密码验证
|
||||||
|
auth: true
|
||||||
|
# 发送方,遵循RFC-822标准
|
||||||
|
from: xxx@163.com
|
||||||
|
# 用户名(注意:如果使用foxmail邮箱,此处user为qq号)
|
||||||
|
user: xxx@163.com
|
||||||
|
# 密码(注意,某些邮箱需要为SMTP服务单独设置密码,详情查看相关帮助)
|
||||||
|
pass: xxxxxxxxxx
|
||||||
|
# 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。
|
||||||
|
starttlsEnable: true
|
||||||
|
# 使用SSL安全连接
|
||||||
|
sslEnable: true
|
||||||
|
# SMTP超时时长,单位毫秒,缺省值不超时
|
||||||
|
timeout: 0
|
||||||
|
# Socket连接超时值,单位毫秒,缺省值不超时
|
||||||
|
connectionTimeout: 0
|
||||||
|
|
||||||
|
--- # sms 短信
|
||||||
|
sms:
|
||||||
|
enabled: false
|
||||||
|
# 阿里云 dysmsapi.aliyuncs.com
|
||||||
|
# 腾讯云 sms.tencentcloudapi.com
|
||||||
|
endpoint: "dysmsapi.aliyuncs.com"
|
||||||
|
accessKeyId: xxxxxxx
|
||||||
|
accessKeySecret: xxxxxx
|
||||||
|
signName: 测试
|
||||||
|
# 腾讯专用
|
||||||
|
sdkAppId:
|
||||||
@@ -12,6 +12,10 @@ klp:
|
|||||||
addressEnabled: true
|
addressEnabled: true
|
||||||
# 缓存懒加载
|
# 缓存懒加载
|
||||||
cacheLazy: false
|
cacheLazy: false
|
||||||
|
# 文件管理配置
|
||||||
|
file:
|
||||||
|
# 文件存储目录路径
|
||||||
|
directory-path: ${klp.file.directory-path:testDirectory}
|
||||||
|
|
||||||
captcha:
|
captcha:
|
||||||
# 页面 <参数设置> 可开启关闭 验证码校验
|
# 页面 <参数设置> 可开启关闭 验证码校验
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.klp.controller;
|
|||||||
import com.klp.domain.FileDetailInfo;
|
import com.klp.domain.FileDetailInfo;
|
||||||
import com.klp.domain.FileInfo;
|
import com.klp.domain.FileInfo;
|
||||||
import com.klp.domain.vo.ApiResponseVo;
|
import com.klp.domain.vo.ApiResponseVo;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
@@ -24,8 +25,9 @@ import java.util.stream.Collectors;
|
|||||||
@RequestMapping("/wms/file")
|
@RequestMapping("/wms/file")
|
||||||
public class WmsFileManagementController {
|
public class WmsFileManagementController {
|
||||||
|
|
||||||
// 文件目录路径
|
// 文件目录路径 - 从配置文件读取
|
||||||
private static final String DIRECTORY_PATH = "testDirectory";
|
@Value("${klp.file.directory-path}")
|
||||||
|
private String directoryPath;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取目录下所有文件基本信息(不包含文件内容)
|
* 获取目录下所有文件基本信息(不包含文件内容)
|
||||||
@@ -35,11 +37,11 @@ public class WmsFileManagementController {
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public ResponseEntity<ApiResponseVo<List<FileInfo>>> getAllFiles() {
|
public ResponseEntity<ApiResponseVo<List<FileInfo>>> getAllFiles() {
|
||||||
try {
|
try {
|
||||||
Path directory = Paths.get(DIRECTORY_PATH);
|
Path directory = Paths.get(directoryPath);
|
||||||
|
|
||||||
// 检查目录是否存在
|
// 检查目录是否存在
|
||||||
if (!Files.exists(directory)) {
|
if (!Files.exists(directory)) {
|
||||||
return ResponseEntity.ok(new ApiResponseVo<>(false, "目录不存在: " + DIRECTORY_PATH, null));
|
return ResponseEntity.ok(new ApiResponseVo<>(false, "目录不存在: " + directoryPath, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取所有文件基本信息(不读取文件内容)
|
// 获取所有文件基本信息(不读取文件内容)
|
||||||
@@ -73,7 +75,7 @@ public class WmsFileManagementController {
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public ResponseEntity<ApiResponseVo<FileDetailInfo>> getFileContent(@PathVariable String fileName) {
|
public ResponseEntity<ApiResponseVo<FileDetailInfo>> getFileContent(@PathVariable String fileName) {
|
||||||
try {
|
try {
|
||||||
Path filePath = Paths.get(DIRECTORY_PATH, fileName);
|
Path filePath = Paths.get(directoryPath, fileName);
|
||||||
|
|
||||||
// 检查文件是否存在
|
// 检查文件是否存在
|
||||||
if (!Files.exists(filePath)) {
|
if (!Files.exists(filePath)) {
|
||||||
@@ -108,7 +110,7 @@ public class WmsFileManagementController {
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public ResponseEntity<ApiResponseVo<String>> deleteFile(@PathVariable String fileName) {
|
public ResponseEntity<ApiResponseVo<String>> deleteFile(@PathVariable String fileName) {
|
||||||
try {
|
try {
|
||||||
Path filePath = Paths.get(DIRECTORY_PATH, fileName);
|
Path filePath = Paths.get(directoryPath, fileName);
|
||||||
|
|
||||||
// 检查文件是否存在
|
// 检查文件是否存在
|
||||||
if (!Files.exists(filePath)) {
|
if (!Files.exists(filePath)) {
|
||||||
@@ -149,7 +151,7 @@ public class WmsFileManagementController {
|
|||||||
|
|
||||||
for (String fileName : fileNames) {
|
for (String fileName : fileNames) {
|
||||||
try {
|
try {
|
||||||
Path filePath = Paths.get(DIRECTORY_PATH, fileName);
|
Path filePath = Paths.get(directoryPath, fileName);
|
||||||
|
|
||||||
if (Files.exists(filePath) && Files.isRegularFile(filePath)) {
|
if (Files.exists(filePath) && Files.isRegularFile(filePath)) {
|
||||||
Files.delete(filePath);
|
Files.delete(filePath);
|
||||||
@@ -220,10 +222,10 @@ public class WmsFileManagementController {
|
|||||||
*/
|
*/
|
||||||
private ResponseEntity<ApiResponseVo<Map<String, Object>>> performCleanup() {
|
private ResponseEntity<ApiResponseVo<Map<String, Object>>> performCleanup() {
|
||||||
try {
|
try {
|
||||||
Path directory = Paths.get(DIRECTORY_PATH);
|
Path directory = Paths.get(directoryPath);
|
||||||
|
|
||||||
if (!Files.exists(directory)) {
|
if (!Files.exists(directory)) {
|
||||||
return ResponseEntity.ok(new ApiResponseVo<>(false, "目录不存在: " + DIRECTORY_PATH, null));
|
return ResponseEntity.ok(new ApiResponseVo<>(false, "目录不存在: " + directoryPath, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 计算时间范围:删除1-3个月前的文件
|
// 计算时间范围:删除1-3个月前的文件
|
||||||
@@ -333,10 +335,10 @@ public class WmsFileManagementController {
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public ResponseEntity<ApiResponseVo<Map<String, Object>>> getDirectoryStats() {
|
public ResponseEntity<ApiResponseVo<Map<String, Object>>> getDirectoryStats() {
|
||||||
try {
|
try {
|
||||||
Path directory = Paths.get(DIRECTORY_PATH);
|
Path directory = Paths.get(directoryPath);
|
||||||
|
|
||||||
if (!Files.exists(directory)) {
|
if (!Files.exists(directory)) {
|
||||||
return ResponseEntity.ok(new ApiResponseVo<>(false, "目录不存在: " + DIRECTORY_PATH, null));
|
return ResponseEntity.ok(new ApiResponseVo<>(false, "目录不存在: " + directoryPath, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, Object> stats = new HashMap<>();
|
Map<String, Object> stats = new HashMap<>();
|
||||||
@@ -354,7 +356,7 @@ public class WmsFileManagementController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stats.put("directoryPath", DIRECTORY_PATH);
|
stats.put("directoryPath", directoryPath);
|
||||||
stats.put("fileCount", fileCount);
|
stats.put("fileCount", fileCount);
|
||||||
stats.put("totalSize", totalSize);
|
stats.put("totalSize", totalSize);
|
||||||
stats.put("totalSizeMB", String.format("%.2f MB", totalSize / (1024.0 * 1024.0)));
|
stats.put("totalSizeMB", String.format("%.2f MB", totalSize / (1024.0 * 1024.0)));
|
||||||
|
|||||||
7
pom.xml
7
pom.xml
@@ -79,6 +79,13 @@
|
|||||||
<logging.level>warn</logging.level>
|
<logging.level>warn</logging.level>
|
||||||
</properties>
|
</properties>
|
||||||
</profile>
|
</profile>
|
||||||
|
<profile>
|
||||||
|
<id>stage</id>
|
||||||
|
<properties>
|
||||||
|
<profiles.active>stage</profiles.active>
|
||||||
|
<logging.level>warn</logging.level>
|
||||||
|
</properties>
|
||||||
|
</profile>
|
||||||
</profiles>
|
</profiles>
|
||||||
|
|
||||||
<!-- 依赖声明 -->
|
<!-- 依赖声明 -->
|
||||||
|
|||||||
Reference in New Issue
Block a user