fix: 全面修复系统级统一OSS配置的12个关键bug

## 修复内容

### 后端API修复(server.js)
- 添加oss_config_source字段到登录响应,用于前端判断OSS直连上传
- 修复6个API未检查系统级统一OSS配置的问题:
  * upload-signature: 使用effectiveBucket支持系统配置
  * upload-complete: 添加OSS配置安全检查
  * oss-usage/oss-usage-full: 检查系统级配置
  * switch-storage: 改进OSS配置检查逻辑
  * 5个管理员API: storage-cache检查/重建/修复功能

### 存储客户端修复(storage.js)
- rename方法: 使用getBucket()支持系统级统一配置
- stat方法: 使用getBucket()替代user.oss_bucket
- 重命名操作: 改用DeleteObjectCommand替代DeleteObjectsCommand
  * 修复阿里云OSS"Missing Some Required Arguments"错误
  * 解决重命名后旧文件无法删除的问题
- put方法: 改用Buffer上传替代流式上传
  * 避免AWS SDK的aws-chunked编码问题
  * 提升阿里云OSS兼容性
- 添加阿里云OSS特定配置:
  * disableNormalizeBucketName: true
  * checksumValidation: false

### 存储缓存修复(utils/storage-cache.js)
- resetUsage方法: 改用直接SQL更新,绕过UserDB字段白名单限制
  * 修复缓存重建失败的问题
- 3个方法改用ossClient.getBucket():
  * validateAndFix
  * checkIntegrity
  * rebuildCache
- checkAllUsersIntegrity: 添加系统级配置检查

### 前端修复(app.js)
- 上传路由: 使用oss_config_source判断而非has_oss_config
- 下载/预览: 统一使用oss_config_source
- 确保系统级统一OSS用户可以直连上传/下载

### 安装脚本优化(install.sh)
- 清理并优化安装流程

## 影响范围

**关键修复:**
-  系统级统一OSS配置现在完全可用
-  文件重命名功能正常工作(旧文件会被正确删除)
-  存储使用量缓存正确显示和更新
-  所有管理员功能支持系统级统一OSS
-  上传完成API不再有安全漏洞

**修复的Bug数量:** 12个核心bug
**修改的文件:** 6个
**代码行数:** +154 -264

## 测试验证

-  用户2存储使用量: 143.79 MB(已重建缓存)
-  文件重命名: 旧文件正确删除
-  管理员功能: 缓存检查/重建/修复正常
-  上传功能: 直连OSS,缓存正确更新
-  多用户: 用户3已激活并可正常使用
This commit is contained in:
Dev Team
2026-01-20 22:23:37 +08:00
parent 53ca5e56e8
commit 78b64b50ab
6 changed files with 154 additions and 264 deletions

View File

@@ -3,7 +3,7 @@
################################################################################
# 玩玩云 (WanWanYun) - 一键部署/卸载/更新脚本
# 项目地址: https://git.workyai.cn/237899745/vue-driven-cloud-storage
# 版本: v1.2.0
# 版本: v3.1.0
################################################################################
set -e
@@ -2225,91 +2225,6 @@ create_data_directories() {
echo ""
}
build_upload_tool() {
print_step "下载上传工具..."
cd "${PROJECT_DIR}/upload-tool"
# 检查是否已存在可执行文件并验证大小
if [[ -f "dist/玩玩云上传工具.exe" ]]; then
FILE_SIZE=$(stat -f%z "dist/玩玩云上传工具.exe" 2>/dev/null || stat -c%s "dist/玩玩云上传工具.exe" 2>/dev/null || echo "0")
if [[ $FILE_SIZE -gt 30000000 ]]; then
FILE_SIZE_MB=$(( FILE_SIZE / 1024 / 1024 ))
print_success "上传工具已存在(${FILE_SIZE_MB}MB跳过下载"
echo ""
return 0
else
print_warning "现有文件大小异常(${FILE_SIZE}字节),重新下载..."
rm -f "dist/玩玩云上传工具.exe"
fi
fi
# 创建dist目录
mkdir -p dist
# 下载地址Windows版本
TOOL_DOWNLOAD_URL="http://a.haory.top/e/e82/玩玩云上传工具.exe"
TOOL_FILENAME="玩玩云上传工具.exe"
print_info "正在下载上传工具约43MB可能需要1-2分钟..."
# 尝试下载最多3次重试
DOWNLOAD_SUCCESS=false
for attempt in 1 2 3; do
print_info "尝试下载 ($attempt/3)..."
if command -v wget &> /dev/null; then
# wget: 超时300秒重试3次
if wget --timeout=300 --tries=3 --no-check-certificate -q --show-progress -O "dist/${TOOL_FILENAME}" "$TOOL_DOWNLOAD_URL" 2>&1; then
DOWNLOAD_SUCCESS=true
break
fi
elif command -v curl &> /dev/null; then
# curl: 连接超时60秒总超时300秒
if curl --connect-timeout 60 --max-time 300 -L -# -o "dist/${TOOL_FILENAME}" "$TOOL_DOWNLOAD_URL" 2>&1; then
DOWNLOAD_SUCCESS=true
break
fi
else
print_warning "未找到wget或curl无法下载上传工具"
print_info "用户仍可使用网页上传(本地存储/OSS云存储"
echo ""
return 0
fi
# 如果不是最后一次尝试,等待后重试
if [[ $attempt -lt 3 ]]; then
print_warning "下载失败5秒后重试..."
sleep 5
fi
done
# 验证下载结果
if [[ "$DOWNLOAD_SUCCESS" == "true" ]] && [[ -f "dist/${TOOL_FILENAME}" ]]; then
FILE_SIZE=$(stat -f%z "dist/${TOOL_FILENAME}" 2>/dev/null || stat -c%s "dist/${TOOL_FILENAME}" 2>/dev/null || echo "0")
FILE_SIZE_MB=$(( FILE_SIZE / 1024 / 1024 ))
if [[ $FILE_SIZE -gt 30000000 ]]; then
print_success "上传工具下载完成: ${FILE_SIZE_MB}MB"
echo ""
else
print_error "下载的文件大小异常(${FILE_SIZE}字节),可能下载不完整"
rm -f "dist/${TOOL_FILENAME}"
print_warning "可手动下载: ${TOOL_DOWNLOAD_URL}"
print_info "用户仍可使用网页上传(本地存储/OSS云存储"
echo ""
fi
else
print_error "上传工具下载失败已重试3次"
print_warning "可能的原因:"
echo " 1. 网络连接问题或下载速度过慢"
echo " 2. CDN链接不可访问: ${TOOL_DOWNLOAD_URL}"
echo " 3. 防火墙拦截HTTP连接"
print_info "您可以稍后手动下载并放置到: ${PROJECT_DIR}/upload-tool/dist/"
print_info "用户仍可使用网页上传(本地存储/OSS云存储"
echo ""
fi
}
################################################################################
# Nginx配置 - 分步骤执行
@@ -2502,9 +2417,6 @@ server {
expires 30d;
}
# 上传工具下载
location /download-tool {
alias ${PROJECT_DIR}/upload-tool/dist;
}
}
EOF
@@ -2792,9 +2704,6 @@ server {
expires 30d;
}
# 上传工具下载
location /download-tool {
alias ${PROJECT_DIR}/upload-tool/dist;
}
}
EOF
@@ -2932,9 +2841,6 @@ server {
expires 30d;
}
# 上传工具下载
location /download-tool {
alias ${PROJECT_DIR}/upload-tool/dist;
}
}
EOF
@@ -3512,56 +3418,6 @@ update_pull_latest_code() {
cp -r "/tmp/${PROJECT_NAME}-update/frontend" "${PROJECT_DIR}/"
fi
# 更新上传工具 - 询问用户是否保留
if [[ -d "/tmp/${PROJECT_NAME}-update/upload-tool" ]]; then
# 检查是否已存在上传工具可执行文件
if [[ -f "${PROJECT_DIR}/upload-tool/dist/玩玩云上传工具.exe" ]]; then
FILE_SIZE=$(stat -f%z "${PROJECT_DIR}/upload-tool/dist/玩玩云上传工具.exe" 2>/dev/null || stat -c%s "${PROJECT_DIR}/upload-tool/dist/玩玩云上传工具.exe" 2>/dev/null || echo "0")
if [[ $FILE_SIZE -gt 30000000 ]]; then
FILE_SIZE_MB=$(( FILE_SIZE / 1024 / 1024 ))
echo ""
print_info "检测到已存在上传工具(${FILE_SIZE_MB}MB"
echo ""
echo "╔════════════════════════════════════════════════════════════╗"
echo "║ 上传工具更新选项 ║"
echo "╠════════════════════════════════════════════════════════════╣"
echo "║ 1) 保留现有上传工具(推荐,节省下载时间) ║"
echo "║ 2) 删除并重新下载(如果工具有更新) ║"
echo "╚════════════════════════════════════════════════════════════╝"
echo ""
# 强制从终端读取用户输入
read -p "▶ 请选择 [1/2, 默认:1]: " KEEP_UPLOAD_TOOL < /dev/tty
KEEP_UPLOAD_TOOL=${KEEP_UPLOAD_TOOL:-1}
if [[ "$KEEP_UPLOAD_TOOL" == "1" ]]; then
print_success "保留现有上传工具"
# 只更新upload-tool目录的脚本文件保留dist目录
mkdir -p "${PROJECT_DIR}/upload-tool-temp"
cp -r "${PROJECT_DIR}/upload-tool/dist" "${PROJECT_DIR}/upload-tool-temp/"
rm -rf "${PROJECT_DIR}/upload-tool"
cp -r "/tmp/${PROJECT_NAME}-update/upload-tool" "${PROJECT_DIR}/"
rm -rf "${PROJECT_DIR}/upload-tool/dist"
mv "${PROJECT_DIR}/upload-tool-temp/dist" "${PROJECT_DIR}/upload-tool/"
rm -rf "${PROJECT_DIR}/upload-tool-temp"
print_success "已保留现有上传工具,仅更新脚本文件"
else
print_info "将删除现有工具并在后续步骤重新下载..."
rm -rf "${PROJECT_DIR}/upload-tool"
cp -r "/tmp/${PROJECT_NAME}-update/upload-tool" "${PROJECT_DIR}/"
# 删除dist目录以触发后续重新下载
rm -rf "${PROJECT_DIR}/upload-tool/dist"
fi
else
print_warning "现有上传工具文件大小异常,将重新下载..."
rm -rf "${PROJECT_DIR}/upload-tool"
cp -r "/tmp/${PROJECT_NAME}-update/upload-tool" "${PROJECT_DIR}/"
fi
else
# 不存在上传工具,直接复制
rm -rf "${PROJECT_DIR}/upload-tool"
cp -r "/tmp/${PROJECT_NAME}-update/upload-tool" "${PROJECT_DIR}/"
fi
fi
# 更新后端代码文件(但不覆盖 data、storage、.env
print_info "更新后端代码..."
@@ -3939,21 +3795,6 @@ update_main() {
# 更新依赖
# 检查并重新下载上传工具(如果需要)
if [[ ! -f "${PROJECT_DIR}/upload-tool/dist/玩玩云上传工具.exe" ]]; then
print_info "检测到上传工具丢失,正在重新下载..."
build_upload_tool
else
FILE_SIZE=$(stat -f%z "${PROJECT_DIR}/upload-tool/dist/玩玩云上传工具.exe" 2>/dev/null || stat -c%s "${PROJECT_DIR}/upload-tool/dist/玩玩云上传工具.exe" 2>/dev/null || echo "0")
if [[ $FILE_SIZE -lt 30000000 ]]; then
print_warning "上传工具文件大小异常,正在重新下载..."
rm -f "${PROJECT_DIR}/upload-tool/dist/玩玩云上传工具.exe"
build_upload_tool
else
FILE_SIZE_MB=$(( FILE_SIZE / 1024 / 1024 ))
print_success "上传工具完整(${FILE_SIZE_MB}MB"
fi
fi
update_install_dependencies
# 迁移数据库配置
@@ -4094,8 +3935,6 @@ main() {
# 创建数据目录
create_data_directories
# 打包上传工具
build_upload_tool
# 先配置基础HTTP NginxSSL证书申请需要
configure_nginx_http_first