Private
Public Access
1
0

重构:文件系统模块化架构,优化应用启动流程

This commit is contained in:
2026-01-28 00:28:54 +08:00
parent 4a9b25a505
commit 8c577f70e7
123 changed files with 32030 additions and 967 deletions

View File

@@ -0,0 +1,346 @@
# 文件管理安全功能实现总结
## ✅ 已完成的功能
### 1. 操作审计日志 (Audit Log)
**实现位置**: `internal/filesystem/audit_log.go`
**功能特性**:
- ✅ 记录所有文件操作(读取、写入、删除、创建等)
- ✅ 每条日志包含:时间戳、操作类型、文件路径、文件大小、操作结果
- ✅ 使用缓冲区批量写入每100条或每5秒刷新一次
- ✅ 按日期自动轮转日志文件(`audit_2006-01-02.log`
- ✅ JSON格式存储易于解析和分析
- ✅ 应用关闭时自动刷新缓冲区
**日志存储位置**:
- Windows: `%LOCALAPPDATA%\u-desk\logs\`
- macOS: `~/Library/Application Support/u-desk/logs/`
- Linux: `~/.config/u-desk/logs/`
**集成方式**:
```go
// 在main.go中初始化
logDir := filepath.Join(userDataDir, "logs")
filesystem.InitAudit(logDir)
// 在文件操作中自动记录
filesystem.ReadFile(path) // 自动记录读取操作
filesystem.WriteFile(path, content) // 自动记录写入操作
filesystem.DeletePath(path) // 自动记录删除操作
```
**API接口**:
```go
// 获取最近的审计日志
func (a *App) GetAuditLogs(limit int) ([]map[string]interface{}, error)
```
---
### 2. 回收站功能 (Recycle Bin)
**实现位置**: `internal/filesystem/recycle_bin.go`
**功能特性**:
- ✅ 删除文件时移动到回收站而非永久删除
- ✅ 保留原始路径、删除时间、文件大小等元数据
- ✅ 支持跨设备移动(复制+删除)
- ✅ 自动清理超过30天的文件
- ✅ 支持恢复文件到原位置
- ✅ 支持永久删除(清空回收站)
- ✅ JSON元数据存储`metadata.json`
**回收站存储位置**:
- Windows: `%LOCALAPPDATA%\u-desk\recycle_bin\`
- macOS: `~/Library/Application Support/u-desk/recycle_bin/`
- Linux: `~/.config/u-desk/recycle_bin/`
**文件命名规则**:
```
20060102_150405_随机6位_原文件名.扩展名
例如: 20250127_143022_a3b4c5_config.json
```
**使用示例**:
```go
// 删除到回收站
bin := filesystem.GetRecycleBin()
bin.MoveToRecycleBin("C:\\test.txt")
// 恢复文件
bin.RestoreFromRecycleBin("回收站路径")
// 永久删除
bin.DeletePermanently("回收站路径")
// 清空回收站
bin.Empty()
```
**API接口**:
```go
// 获取回收站条目列表
func (a *App) GetRecycleBinEntries() ([]map[string]interface{}, error)
// 恢复文件
func (a *App) RestoreFromRecycleBin(recyclePath string) error
// 永久删除
func (a *App) DeletePermanently(recyclePath string) error
// 清空回收站
func (a *App) EmptyRecycleBin() error
```
---
### 3. 文件锁检查 (File Lock Checker)
**实现位置**: `internal/filesystem/file_lock.go`
**功能特性**:
- ✅ 检测文件是否被其他程序占用
- ✅ 尝试独占打开文件以检测锁定状态
- ✅ 提供重试机制(可配置重试次数和间隔)
- ✅ Windows平台专用实现使用Windows API
- ✅ 友好的错误提示信息
**检查方式**:
1. 尝试以独占写模式打开文件
2. 尝试重命名文件(更彻底的检查)
3. 检查错误类型是否为锁定相关错误
4. 提供占用进程信息
**使用示例**:
```go
checker := filesystem.GetFileLockChecker()
// 简单检查
locked, processInfo, err := checker.IsFileLocked("C:\\test.txt")
// 带重试的检查
err := checker.CheckFileWithRetry("C:\\test.txt", 3, 1*time.Second)
// 安全删除(带锁检查)
err := checker.SafeDeleteWithLockCheck("C:\\test.txt")
```
**错误提示示例**:
```
无法删除文件:文件正被其他程序使用
提示:文件正被其他程序使用
请关闭相关程序后重试
```
---
## 📂 新增文件清单
1. **internal/filesystem/audit_log.go** - 审计日志实现
- `AuditLogger` 结构体
- `AuditLogEntry` 日志条目
- 日志记录、缓冲、轮转功能
2. **internal/filesystem/recycle_bin.go** - 回收站实现
- `RecycleBin` 管理器
- `RecycleBinEntry` 回收站条目
- 文件移动、恢复、清理功能
3. **internal/filesystem/file_lock.go** - 文件锁检查实现
- `FileLockChecker` 检查器
- Windows API集成
- 错误检测和重试机制
---
## 🔧 修改的文件
### 1. main.go
- 添加 `initFileSystemSecurity()` 初始化函数
- 添加 `getUserDataDir()` 辅助函数
- 配置 `OnShutdown` 回调
### 2. app.go
- 添加 `shutdown()` 方法
- 添加审计日志API: `GetAuditLogs()`
- 添加回收站API:
- `GetRecycleBinEntries()`
- `RestoreFromRecycleBin()`
- `DeletePermanently()`
- `EmptyRecycleBin()`
### 3. internal/filesystem/fs.go
- 添加全局审计日志记录器
- 添加 `InitAudit()``CloseAudit()` 函数
-`ReadFile``WriteFile``DeletePath` 中集成审计日志
---
## 🎯 安全层级
系统现在具有**多层安全防护**
### 第1层前端确认
- ✅ 用户必须确认删除操作
- ✅ 红色危险按钮提醒
- ✅ 防止并发删除
### 第2层后端验证
- ✅ 路径安全检查
- ✅ 敏感路径保护
- ✅ 文件大小限制
- ✅ 目录深度限制
### 第3层文件锁检查
- ✅ 检测文件占用
- ✅ 防止删除正在使用的文件
- ✅ 提供重试机制
### 第4层回收站
- ✅ 删除先移到回收站
- ✅ 30天恢复期
- ✅ 自动清理过期文件
### 第5层审计日志
- ✅ 记录所有操作
- ✅ 便于追踪和审计
- ✅ 永久保存操作历史
---
## 📊 使用流程
### 删除文件流程(带所有安全措施):
```
用户点击删除
前端确认对话框
[后端] 文件锁检查 ← 文件被占用?
↓ ↓
通过 提示关闭程序
[后端] 移动到回收站 ← 删除失败?
↓ ↓
成功 记录审计日志
记录审计日志(成功)
返回前端显示成功
```
---
## 🚀 前端集成建议
虽然后端API已实现但前端仍需添加UI
### 1. 回收站界面
```javascript
// 获取回收站条目
const entries = await app.GetRecycleBinEntries()
// 显示列表
// - 原始路径
// - 删除时间
// - 文件大小
// - 操作按钮(恢复/永久删除)
// 清空回收站
await app.EmptyRecycleBin()
```
### 2. 审计日志界面
```javascript
// 获取审计日志
const logs = await app.GetAuditLogs(100) // 最近100条
// 显示日志表格
// - 时间戳
// - 操作类型read/write/delete
// - 文件路径
// - 成功/失败状态
```
### 3. 文件锁错误处理
```javascript
try {
await deletePathApi(path)
} catch (error) {
if (error.message.includes('文件被占用')) {
// 显示友好提示,建议用户关闭相关程序
Message.error({
content: error.message,
duration: 0, // 不自动关闭
closable: true
})
}
}
```
---
## 📝 配置项
所有配置都在代码中定义,可根据需要调整:
### 审计日志配置
```go
const bufferSize = 100 // 缓冲区大小
const flushInterval = 5 * time.Second // 刷新间隔
```
### 回收站配置
```go
const retentionDays = 30 // 保留天数
const autoCleanupInterval = 24 * time.Hour // 自动清理间隔
```
### 文件锁配置
```go
const defaultMaxRetries = 3 // 默认重试次数
const defaultRetryInterval = 1 * time.Second // 默认重试间隔
```
---
## 🧪 测试建议
### 1. 审计日志测试
- 删除文件,检查日志文件是否生成
- 检查日志格式是否正确JSON
- 关闭应用,检查缓冲区是否正确刷新
### 2. 回收站测试
- 删除文件,检查回收站目录
- 恢复文件,检查原位置是否有文件
- 删除同名文件,检查是否正确处理
- 清空回收站,检查所有文件是否删除
### 3. 文件锁测试
- 用文本编辑器打开文件
- 尝试删除,应该提示文件被占用
- 关闭编辑器后,应该可以删除
---
## ✨ 总结
所有安全功能已成功实现并集成到应用中:
1.**操作审计日志** - 完整追踪所有文件操作
2.**回收站功能** - 30天恢复期自动清理
3.**文件锁检查** - 防止删除占用文件
系统现在具有**企业级的安全性和可靠性**,可以有效防止误删和恶意操作,同时提供完整的操作审计能力。
---
**实现日期**: 2025-01-27
**版本**: v1.0.0
**作者**: Claude Sonnet 4.5