feat: 添加 OSS 存储配额功能
- 数据库:添加 oss_storage_quota 字段(0 表示无限制) - 后端:登录/用户信息返回 OSS 配额 - 后端:管理员可设置用户 OSS 配额 - 后端:上传时检查 OSS 配额限制 - 前端:管理员编辑用户增加 OSS 配额设置 - 前端:用户文件页面显示 OSS 使用量和配额 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1897,6 +1897,7 @@ app.post('/api/login',
|
||||
current_storage_type: user.current_storage_type || 'oss',
|
||||
local_storage_quota: user.local_storage_quota || 1073741824,
|
||||
local_storage_used: user.local_storage_used || 0,
|
||||
oss_storage_quota: user.oss_storage_quota || 0, // 0 表示无限制
|
||||
// OSS配置来源(重要:用于前端判断是否使用OSS直连上传)
|
||||
oss_config_source: SettingsDB.hasUnifiedOssConfig() ? 'unified' : (user.has_oss_config ? 'personal' : 'none')
|
||||
}
|
||||
@@ -2986,6 +2987,7 @@ app.get('/api/files/upload-signature', authMiddleware, async (req, res) => {
|
||||
const filename = req.query.filename;
|
||||
const uploadPath = req.query.path || '/'; // 上传目标路径
|
||||
const contentType = req.query.contentType || 'application/octet-stream';
|
||||
const fileSize = parseInt(req.query.fileSize, 10) || 0;
|
||||
|
||||
if (!filename) {
|
||||
return res.status(400).json({
|
||||
@@ -3036,6 +3038,25 @@ app.get('/api/files/upload-signature', authMiddleware, async (req, res) => {
|
||||
});
|
||||
}
|
||||
|
||||
// OSS 配额检查(0 表示无限制)
|
||||
const ossQuota = req.user.oss_storage_quota || 0;
|
||||
if (ossQuota > 0 && fileSize > 0) {
|
||||
// 获取当前 OSS 使用量
|
||||
const { getOssUsage } = require('./storage');
|
||||
try {
|
||||
const ossUsage = await getOssUsage(req.user);
|
||||
const currentUsed = ossUsage?.totalSize || 0;
|
||||
if (currentUsed + fileSize > ossQuota) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message:
|
||||
});
|
||||
}
|
||||
} catch (usageErr) {
|
||||
console.warn('[OSS配额检查] 获取使用量失败,跳过检查:', usageErr.message);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3');
|
||||
const { getSignedUrl } = require('@aws-sdk/s3-request-presigner');
|
||||
@@ -3169,6 +3190,25 @@ app.get('/api/files/download-url', authMiddleware, async (req, res) => {
|
||||
});
|
||||
}
|
||||
|
||||
// OSS 配额检查(0 表示无限制)
|
||||
const ossQuota = req.user.oss_storage_quota || 0;
|
||||
if (ossQuota > 0 && fileSize > 0) {
|
||||
// 获取当前 OSS 使用量
|
||||
const { getOssUsage } = require('./storage');
|
||||
try {
|
||||
const ossUsage = await getOssUsage(req.user);
|
||||
const currentUsed = ossUsage?.totalSize || 0;
|
||||
if (currentUsed + fileSize > ossQuota) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message:
|
||||
});
|
||||
}
|
||||
} catch (usageErr) {
|
||||
console.warn('[OSS配额检查] 获取使用量失败,跳过检查:', usageErr.message);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const { S3Client, GetObjectCommand } = require('@aws-sdk/client-s3');
|
||||
const { getSignedUrl } = require('@aws-sdk/s3-request-presigner');
|
||||
@@ -5251,7 +5291,8 @@ app.get('/api/admin/users', authMiddleware, adminMiddleware, (req, res) => {
|
||||
storage_permission: u.storage_permission || 'oss_only',
|
||||
current_storage_type: u.current_storage_type || 'oss',
|
||||
local_storage_quota: u.local_storage_quota || 1073741824,
|
||||
local_storage_used: u.local_storage_used || 0
|
||||
local_storage_used: u.local_storage_used || 0,
|
||||
oss_storage_quota: u.oss_storage_quota || 0
|
||||
}))
|
||||
});
|
||||
} catch (error) {
|
||||
@@ -5847,7 +5888,7 @@ app.post('/api/admin/users/:id/storage-permission',
|
||||
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const { storage_permission, local_storage_quota } = req.body;
|
||||
const { storage_permission, local_storage_quota, oss_storage_quota } = req.body;
|
||||
|
||||
// 参数验证:验证 ID 格式
|
||||
const userId = parseInt(id, 10);
|
||||
@@ -5860,10 +5901,15 @@ app.post('/api/admin/users/:id/storage-permission',
|
||||
|
||||
const updates = { storage_permission };
|
||||
|
||||
// 如果提供了配额,更新配额(单位:字节)
|
||||
// 如果提供了本地配额,更新本地配额(单位:字节)
|
||||
if (local_storage_quota !== undefined) {
|
||||
updates.local_storage_quota = parseInt(local_storage_quota, 10);
|
||||
}
|
||||
|
||||
// 如果提供了 OSS 配额,更新 OSS 配额(单位:字节,0 表示无限制)
|
||||
if (oss_storage_quota !== undefined) {
|
||||
updates.oss_storage_quota = parseInt(oss_storage_quota, 10);
|
||||
}
|
||||
|
||||
// 根据权限设置自动调整存储类型
|
||||
const user = UserDB.findById(userId);
|
||||
|
||||
Reference in New Issue
Block a user