功能: 添加管理员上传工具检测和上传功能

- 后端: 添加 GET /api/admin/check-upload-tool 检测工具是否存在
- 后端: 添加 POST /api/admin/upload-tool 允许管理员手动上传exe
- 前端: 管理员界面新增上传工具管理卡片
- 前端: 支持检测工具状态、显示文件信息、手动上传
- 验证: 文件必须是.exe格式且大小>20MB
This commit is contained in:
WanWanYun
2025-11-12 20:44:41 +08:00
parent 0fc378576f
commit e5ba17329c
3 changed files with 268 additions and 2 deletions

View File

@@ -2333,6 +2333,115 @@ app.delete('/api/admin/shares/:id', authMiddleware, adminMiddleware, (req, res)
}
});
// ============================================
// 管理员:上传工具管理
// ============================================
// 检查上传工具是否存在
app.get('/api/admin/check-upload-tool', authMiddleware, adminMiddleware, (req, res) => {
try {
const toolPath = path.join(__dirname, '..', 'upload-tool', 'dist', '玩玩云上传工具.exe');
if (fs.existsSync(toolPath)) {
const stats = fs.statSync(toolPath);
const sizeMB = (stats.size / (1024 * 1024)).toFixed(2);
res.json({
success: true,
exists: true,
fileInfo: {
path: toolPath,
size: stats.size,
sizeMB: sizeMB,
modifiedAt: stats.mtime
}
});
} else {
res.json({
success: true,
exists: false,
message: '上传工具不存在'
});
}
} catch (error) {
console.error('检查上传工具失败:', error);
res.status(500).json({
success: false,
message: '检查失败: ' + error.message
});
}
});
// 上传工具文件
const uploadToolStorage = multer.diskStorage({
destination: (req, file, cb) => {
const uploadDir = path.join(__dirname, '..', 'upload-tool', 'dist');
// 确保目录存在
if (!fs.existsSync(uploadDir)) {
fs.mkdirSync(uploadDir, { recursive: true });
}
cb(null, uploadDir);
},
filename: (req, file, cb) => {
// 固定文件名
cb(null, '玩玩云上传工具.exe');
}
});
const uploadTool = multer({
storage: uploadToolStorage,
limits: {
fileSize: 100 * 1024 * 1024 // 限制100MB
},
fileFilter: (req, file, cb) => {
// 只允许.exe文件
if (!file.originalname.toLowerCase().endsWith('.exe')) {
return cb(new Error('只允许上传.exe文件'));
}
cb(null, true);
}
});
app.post('/api/admin/upload-tool', authMiddleware, adminMiddleware, uploadTool.single('file'), (req, res) => {
try {
if (!req.file) {
return res.status(400).json({
success: false,
message: '请选择要上传的文件'
});
}
const fileSizeMB = (req.file.size / (1024 * 1024)).toFixed(2);
// 验证文件大小至少20MB上传工具通常很大
if (req.file.size < 20 * 1024 * 1024) {
// 删除上传的文件
fs.unlinkSync(req.file.path);
return res.status(400).json({
success: false,
message: '文件大小异常上传工具通常大于20MB'
});
}
console.log(`[上传工具] 管理员上传成功: ${fileSizeMB}MB`);
res.json({
success: true,
message: '上传工具已上传',
fileInfo: {
size: req.file.size,
sizeMB: fileSizeMB
}
});
} catch (error) {
console.error('上传工具失败:', error);
res.status(500).json({
success: false,
message: '上传失败: ' + error.message
});
}
});
// 分享页面访问路由
app.get("/s/:code", (req, res) => {
const shareCode = req.params.code;