You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4.8 KiB
4.8 KiB
RFC 016: 文件夹服务实现
状态: 已实现
创建日期: 2025-01-18
作者: 架构团队
概述
实现文件夹管理服务,支持文件夹的 CRUD 操作、树形结构管理、移动、权限控制等功能。
动机
用户需要通过文件夹组织项目,支持:
- 多层级文件夹结构
- 文件夹移动(防止循环引用)
- 文件夹删除(级联删除)
- 权限管理(所有者/编辑者/查看者)
- 统计信息(子文件夹数、项目数)
设计
数据模型
class Folder(SQLModel, table=True):
id: str = Field(default_factory=generate_uuid, primary_key=True)
name: str
description: Optional[str]
parent_folder_id: Optional[str]
owner_id: str
path: str # 路径缓存,如 "/folder1/folder2/"
level: int # 层级深度
sort_order: int
color: Optional[str]
icon: Optional[str]
is_shared: bool
created_at: datetime
updated_at: datetime
deleted_at: Optional[datetime]
核心功能
1. 文件夹创建
- 自动计算
path和level - 检查同级名称唯一性
- 验证父文件夹权限
2. 文件夹移动
- 检查循环引用(不能移动到自己的子文件夹)
- 递归更新所有子文件夹的
path和level - 验证目标位置权限
循环引用检测算法:
async def would_create_cycle(folder_id: str, target_parent_id: str) -> bool:
"""向上遍历目标文件夹的所有父级,检查是否包含当前文件夹"""
current_id = target_parent_id
visited = set()
while current_id:
if current_id in visited or current_id == folder_id:
return True
visited.add(current_id)
folder = await get_by_id(current_id)
current_id = folder.parent_folder_id if folder else None
return False
3. 文件夹删除
- 软删除(标记
deleted_at) - 支持级联删除子文件夹和项目
- 仅所有者可删除
4. 树形结构查询
- 递归查询子文件夹
- 支持限制最大深度
- 返回统计信息(子文件夹数、项目数)
API 设计
GET /api/v1/folders # 获取文件夹列表(分页)
GET /api/v1/folders/tree # 获取树形结构
GET /api/v1/folders/{id} # 获取文件夹详情
POST /api/v1/folders # 创建文件夹
PUT /api/v1/folders/{id} # 更新文件夹
DELETE /api/v1/folders/{id} # 删除文件夹
POST /api/v1/folders/{id}/move # 移动文件夹
GET /api/v1/folders/{id}/path # 获取文件夹路径(面包屑)
权限模型
- Owner(所有者):完全控制(CRUD、移动、删除、共享)
- Editor(编辑者):可编辑、移动(未来实现)
- Viewer(查看者):只读(未来实现)
当前版本:仅所有者可访问自己的文件夹。
实现细节
文件结构
server/app/
├── models/folder.py # 数据模型
├── schemas/folder.py # Pydantic Schema
├── repositories/folder_repository.py # 数据访问层
├── services/folder_service.py # 业务逻辑层
└── api/v1/folders.py # API 路由
关键技术点
- 路径缓存:
path字段存储完整路径,避免递归查询 - 层级字段:
level字段快速判断深度 - 软删除:保留数据,支持恢复
- 异步操作:所有数据库操作使用 async/await
- 事务管理:移动操作使用事务保证一致性
性能优化
-
索引:
parent_folder_id(查询子文件夹)owner_id(查询用户文件夹)path(路径查询)name(名称搜索)
-
查询优化:
- 使用
path字段避免递归查询 - 分页查询避免大量数据加载
- 统计信息按需计算
- 使用
测试计划
单元测试
- 文件夹创建(正常、重名、无权限)
- 文件夹移动(正常、循环引用、无权限)
- 文件夹删除(正常、非空、级联)
- 循环引用检测算法
集成测试
- API 端到端测试
- 并发操作测试
- 性能测试(1000+ 文件夹)
未来扩展
- 共享功能:支持文件夹共享给其他用户
- 权限细化:实现 Editor/Viewer 角色
- 文件夹模板:预设文件夹结构
- 批量操作:批量移动、删除
- 回收站:软删除后的恢复功能
- 全文搜索:基于 Elasticsearch 的文件夹搜索
依赖
- SQLModel 0.0.14
- PostgreSQL 17+ (原生 UUID v7 支持)
- FastAPI 0.109.0
相关文档
实施状态:✅ 已完成核心功能