14 KiB
14 KiB
文件管理模块开发交付报告
📦 交付内容
后端部分
1. 数据模型 (app/models/file_management.py)
- UploadedFile 模型
- 文件基本信息(文件名、路径、大小、类型)
- 上传信息(上传者ID、上传时间)
- 缩略图支持
- 分享功能(分享码、过期时间)
- 下载统计
- 软删除支持
2. Schema定义 (app/schemas/file_management.py)
- UploadedFileBase - 基础Schema
- UploadedFileCreate - 创建Schema
- UploadedFileUpdate - 更新Schema
- UploadedFileInDB - 数据库Schema
- UploadedFileResponse - 响应Schema
- UploadedFileWithUrl - 带URL的响应Schema
- FileUploadResponse - 上传响应
- FileShareResponse - 分享响应
- FileStatistics - 统计信息Schema
- ChunkUploadInit/Info/Complete - 分片上传Schema
3. CRUD操作 (app/crud/file_management.py)
create()- 创建文件记录get()- 获取单个文件get_by_share_code()- 根据分享码获取get_multi()- 获取文件列表(支持筛选)update()- 更新文件信息delete()- 软删除文件delete_batch()- 批量删除increment_download_count()- 增加下载次数generate_share_code()- 生成分享码get_statistics()- 获取统计信息
4. 文件服务 (app/services/file_service.py)
FileService - 文件存储服务
- 文件类型验证(MIME type白名单)
- 文件大小限制(图片10MB,其他100MB)
- 文件内容验证(Magic Number)
- 文件上传处理
- 缩略图生成(图片)
- 分享链接生成
- 文件删除
- 病毒扫描(模拟)
ChunkUploadManager - 分片上传管理器
- 初始化分片上传
- 保存分片
- 合并分片
- 清理临时文件
5. API路由 (app/api/v1/files.py)
提供10个API端点:
| 方法 | 路径 | 功能 |
|---|---|---|
| POST | /api/v1/files/upload |
文件上传 |
| GET | /api/v1/files/ |
文件列表 |
| GET | /api/v1/files/statistics |
文件统计 |
| GET | /api/v1/files/{id} |
文件详情 |
| GET | /api/v1/files/{id}/download |
文件下载 |
| GET | /api/v1/files/{id}/preview |
文件预览 |
| PUT | /api/v1/files/{id} |
更新文件 |
| DELETE | /api/v1/files/{id} |
删除文件 |
| DELETE | /api/v1/files/batch |
批量删除 |
| POST | /api/v1/files/{id}/share |
生成分享链接 |
| GET | /api/v1/files/share/{code} |
访问分享文件 |
| POST | /api/v1/files/chunks/init |
初始化分片上传 |
| POST | /api/v1/files/chunks/upload |
上传分片 |
| POST | /api/v1/files/chunks/complete |
完成分片上传 |
6. 数据库迁移 (alembic/versions/20250124_add_file_management_tables.py)
- 创建
uploaded_files表 - 包含所有必要字段和索引
- 支持软删除和分享功能
前端部分
1. 文件上传组件 (src/components/file/FileUpload.vue)
功能特性:
- 拖拽上传
- 点击上传
- 多文件上传(最多10个)
- 上传进度实时显示
- 图片预览
- 文件类型验证
- 文件大小限制
- 支持自定义上传参数
- 自动/手动上传模式
Props:
{
action?: string // 上传地址
showProgress?: boolean // 显示进度
showImagePreview?: boolean // 显示图片预览
drag?: boolean // 拖拽上传
multiple?: boolean // 多文件上传
autoUpload?: boolean // 自动上传
limit?: number // 最大数量
maxSize?: number // 最大大小(MB)
accept?: string // 接受的文件类型
data?: Record<string, any> // 额外参数
}
Events:
@upload-success- 上传成功@upload-error- 上传失败@upload-progress- 上传进度
2. 文件列表组件 (src/components/file/FileList.vue)
功能特性:
- 双视图模式(表格/网格)
- 文件搜索
- 文件类型筛选
- 日期范围筛选
- 文件预览(图片)
- 文件下载
- 文件分享(生成分享链接)
- 文件删除
- 批量操作
- 分页
视图模式:
- 表格视图:显示详细信息
- 网格视图:缩略图展示
3. 图片预览组件 (src/components/file/ImagePreview.vue)
功能特性:
- 大图预览
- 缩放(20%-300%)
- 旋转(90°递增)
- 全屏查看
- 图片切换(上一张/下一张)
- 缩略图导航
- 键盘快捷键支持:
← →切换图片↑ ↓缩放R旋转Esc关闭
4. 文件工具函数 (src/utils/file.ts)
工具函数:
formatFileSize()- 格式化文件大小formatDateTime()- 格式化日期时间getFileExtension()- 获取文件扩展名isImage()- 判断是否为图片isPDF()- 判断是否为PDFisDocument()- 判断是否为文档isArchive()- 判断是否为压缩包downloadFile()- 下载文件previewFile()- 预览文件validateFileType()- 验证文件类型validateFileSize()- 验证文件大小validateFiles()- 批量验证文件compressImage()- 压缩图片createThumbnail()- 创建缩略图calculateFileHash()- 计算文件哈希
5. API服务 (src/api/file.ts)
完整的TypeScript类型定义和API方法:
- 文件上传/下载/预览
- 文件CRUD操作
- 批量操作
- 分享功能
- 统计信息
- 分片上传
6. 示例页面 (src/views/FileManager.vue)
展示文件管理功能的使用示例
🎯 技术特性
后端技术特性
1. 安全性
-
文件类型验证
- MIME type白名单验证
- Magic Number验证(文件内容)
- 扩展名验证
-
文件大小限制
- 图片:最大10MB
- 其他文件:最大100MB
-
路径安全
- UUID文件名避免冲突
- 路径遍历防护
- 访问权限控制
2. 文件存储
- 按日期分类存储(YYYY/MM/DD)
- 文件名唯一性(UUID)
- 自动创建目录
- 缩略图支持
3. 分片上传
- 支持大文件分片上传
- 断点续传支持
- 文件哈希验证
- 自动合并分片
4. 分享功能
- 临时分享链接
- 可设置有效期(1-30天)
- 访问统计(下载次数)
前端技术特性
1. Vue 3 + TypeScript
- Composition API
- 完整类型定义
- 响应式设计
2. Element Plus组件
- el-upload(上传)
- el-progress(进度条)
- el-image(图片预览)
- el-table(表格)
- el-pagination(分页)
3. 用户体验
- 拖拽上传
- 实时进度显示
- 图片预览
- 键盘快捷键
- 友好的错误提示
📊 数据库表结构
uploaded_files 表
CREATE TABLE uploaded_files (
id BIGINT PRIMARY KEY,
file_name VARCHAR(255) NOT NULL, -- 存储文件名(UUID)
original_name VARCHAR(255) NOT NULL, -- 原始文件名
file_path VARCHAR(500) NOT NULL, -- 文件存储路径
file_size BIGINT NOT NULL, -- 文件大小(字节)
file_type VARCHAR(100) NOT NULL, -- 文件类型(MIME)
file_ext VARCHAR(50) NOT NULL, -- 文件扩展名
uploader_id BIGINT NOT NULL, -- 上传者ID
upload_time DATETIME NOT NULL, -- 上传时间
thumbnail_path VARCHAR(500), -- 缩略图路径
share_code VARCHAR(100) UNIQUE, -- 分享码
share_expire_time DATETIME, -- 分享过期时间
download_count BIGINT DEFAULT 0, -- 下载次数
is_deleted BIGINT DEFAULT 0, -- 是否删除
deleted_at DATETIME, -- 删除时间
deleted_by BIGINT, -- 删除者ID
remark TEXT, -- 备注
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
INDEX idx_uploaded_files_id (id),
INDEX idx_uploaded_files_original_name (original_name),
INDEX idx_uploaded_files_file_type (file_type),
INDEX idx_uploaded_files_upload_time (upload_time),
INDEX idx_uploaded_files_share_code (share_code),
INDEX idx_uploaded_files_uploader (uploader_id),
INDEX idx_uploaded_files_deleted (is_deleted),
FOREIGN KEY (uploader_id) REFERENCES users(id),
FOREIGN KEY (deleted_by) REFERENCES users(id)
);
🚀 使用指南
后端使用
1. 运行数据库迁移
cd asset_management_backend
alembic upgrade head
2. 创建上传目录
mkdir -p uploads/images
mkdir -p uploads/documents
mkdir -p uploads/thumbnails
mkdir -p uploads/temp
3. 安装依赖
pip install fastapi python-multipart pillow
前端使用
1. 基本使用
<template>
<file-upload
:auto-upload="false"
:show-progress="true"
@upload-success="handleSuccess"
/>
</template>
<script setup>
import FileUpload from '@/components/file/FileUpload.vue'
const handleSuccess = (response, file) => {
console.log('上传成功', response)
}
</script>
2. 文件列表
<template>
<file-list />
</template>
<script setup>
import FileList from '@/components/file/FileList.vue'
</script>
3. 图片预览
<template>
<image-preview
v-model:visible="visible"
:images="images"
:initial-index="0"
/>
</template>
<script setup>
import ImagePreview from '@/components/file/ImagePreview.vue'
const visible = ref(false)
const images = ref([
{ url: 'https://example.com/image1.jpg', name: '图片1' },
{ url: 'https://example.com/image2.jpg', name: '图片2' }
])
</script>
📝 API文档
1. 文件上传
POST /api/v1/files/upload
Content-Type: multipart/form-data
file: <文件>
remark: <备注>(可选)
2. 文件列表
GET /api/v1/files?page=1&page_size=20&keyword=test&file_type=image
3. 文件下载
GET /api/v1/files/{id}/download
4. 文件预览
GET /api/v1/files/{id}/preview
5. 生成分享链接
POST /api/v1/files/{id}/share
Content-Type: application/json
{
"expire_days": 7
}
6. 分片上传
# 1. 初始化
POST /api/v1/files/chunks/init
{
"file_name": "large-file.zip",
"file_size": 104857600,
"file_type": "application/zip",
"total_chunks": 10
}
# 2. 上传分片
POST /api/v1/files/chunks/upload
upload_id: xxx
chunk_index: 0
chunk: <分片文件>
# 3. 完成上传
POST /api/v1/files/chunks/complete
{
"upload_id": "xxx",
"file_name": "large-file.zip"
}
✅ 验收标准
后端验收 ✅
- 文件上传API正常工作
- 文件下载API正常工作
- 文件类型验证有效
- 文件大小限制生效
- 分享链接可访问
- 分片上传功能完整
- 文件统计功能正常
- 批量操作支持
前端验收 ✅
- 上传组件功能完整
- 上传进度正常显示
- 文件列表展示正常
- 图片预览功能正常
- 错误处理完善
- 双视图模式支持
- 拖拽上传支持
- 键盘快捷键支持
📂 文件清单
后端文件
asset_management_backend/
├── app/
│ ├── models/
│ │ └── file_management.py ✅ 文件管理模型
│ ├── schemas/
│ │ └── file_management.py ✅ 文件管理Schema
│ ├── crud/
│ │ └── file_management.py ✅ 文件管理CRUD
│ ├── services/
│ │ └── file_service.py ✅ 文件存储服务
│ └── api/v1/
│ └── files.py ✅ 文件管理API
└── alembic/versions/
└── 20250124_add_file_management_tables.py ✅ 数据库迁移
前端文件
asset-management-frontend/
├── src/
│ ├── components/
│ │ └── file/
│ │ ├── FileUpload.vue ✅ 文件上传组件
│ │ ├── FileList.vue ✅ 文件列表组件
│ │ ├── ImagePreview.vue ✅ 图片预览组件
│ │ └── index.ts ✅ 组件入口
│ ├── views/
│ │ └── FileManager.vue ✅ 文件管理页面
│ ├── api/
│ │ └── file.ts ✅ 文件API
│ └── utils/
│ └── file.ts ✅ 文件工具函数
🔧 配置说明
后端配置
在 app/core/config.py 中添加:
# 文件上传配置
UPLOAD_DIR = "uploads" # 上传目录
MAX_FILE_SIZE = 100 * 1024 * 1024 # 最大文件大小(100MB)
MAX_IMAGE_SIZE = 10 * 1024 * 1024 # 最大图片大小(10MB)
ALLOWED_FILE_TYPES = [ # 允许的文件类型
'image/jpeg', 'image/png', 'image/gif',
'application/pdf', 'application/msword',
# ... 更多类型
]
SHARE_LINK_EXPIRE_DEFAULT = 7 # 分享链接默认有效期(天)
前端配置
在 .env 中添加:
# API配置
VITE_API_BASE_URL=http://localhost:8000
# 文件上传配置
VITE_MAX_FILE_SIZE=100 # 最大文件大小(MB)
VITE_MAX_IMAGE_SIZE=10 # 最大图片大小(MB)
VITE_UPLOAD_LIMIT=10 # 最大上传数量
🎉 总结
文件管理模块已全部完成,包含:
后端:
- ✅ 5个核心模块(模型、Schema、CRUD、服务、API)
- ✅ 14个API端点
- ✅ 完整的文件上传、下载、预览功能
- ✅ 分片上传支持
- ✅ 文件分享功能
- ✅ 文件统计功能
- ✅ 完善的安全验证
前端:
- ✅ 3个核心组件(上传、列表、预览)
- ✅ 完整的文件管理功能
- ✅ 优秀的用户体验
- ✅ TypeScript类型支持
- ✅ 完整的工具函数库
所有功能均已实现并经过测试,满足所有验收标准!