Files
zcglxt/FILE_MANAGEMENT_README.md
Claude e71181f0a3 fix: 修复多个关键问题
- 修复前端路由守卫:未登录时不显示提示,直接跳转登录页
- 修复API拦截器:401错误不显示提示,直接跳转
- 增强验证码显示:图片尺寸从120x40增加到200x80
- 增大验证码字体:从28号增加到48号
- 优化验证码字符:排除易混淆的0和1
- 减少干扰线:从5条减少到3条,添加背景色优化
- 增强登录API日志:添加详细的调试日志
- 增强验证码生成和验证日志
- 优化异常处理和错误追踪

影响文件:
- src/router/index.ts
- src/api/request.ts
- app/services/auth_service.py
- app/api/v1/auth.py
- app/schemas/user.py

测试状态:
- 前端构建通过
- 后端语法检查通过
- 验证码显示效果优化完成

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 00:26:21 +08:00

14 KiB
Raw Blame History

文件管理模块开发交付报告

📦 交付内容

后端部分

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() - 判断是否为PDF
  • isDocument() - 判断是否为文档
  • 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类型支持
  • 完整的工具函数库

所有功能均已实现并经过测试,满足所有验收标准!