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.
 

3.6 KiB

RFC 127: 修复文件夹分类查询参数

状态: 已完成
创建时间: 2026-01-20
作者: System
类型: Bug 修复

问题描述

文件夹创建成功但页面不显示,前端报 CORS 错误。经调试发现:

  1. 后端代码 BugFolderRepository.get_by_parent() 方法缺少 folder_category 参数
  2. Docker 配置问题:容器未正确加载 .env 文件中的 CORS 配置

错误信息

TypeError: FolderRepository.get_by_parent() takes from 3 to 5 positional arguments but 6 were given

根本原因

FolderService.get_folders() 调用 repository.get_by_parent() 时传递了 5 个参数:

folders = await self.repository.get_by_parent(
    parent_id, user_id, folder_category, page, page_size
)

FolderRepository.get_by_parent() 只接受 4 个参数:

async def get_by_parent(
    self,
    parent_id: Optional[str],
    owner_id: str,
    page: int = 1,
    page_size: int = 20
) -> List[Folder]:

解决方案

1. 修复 Repository 方法签名

文件: server/app/repositories/folder_repository.py

async def get_by_parent(
    self,
    parent_id: Optional[str],
    owner_id: str,
    folder_category: Optional[int] = None,  # 新增参数
    page: int = 1,
    page_size: int = 20
) -> List[Folder]:
    """获取指定父文件夹下的子文件夹"""
    conditions = [
        Folder.parent_folder_id == parent_id,
        Folder.owner_id == owner_id,
        Folder.deleted_at.is_(None)
    ]
    
    # 如果指定了 folder_category,添加过滤条件
    if folder_category is not None:
        conditions.append(Folder.folder_category == folder_category)
    
    statement = select(Folder).where(
        and_(*conditions)
    ).order_by(Folder.sort_order, Folder.created_at).offset((page - 1) * page_size).limit(page_size)
    
    result = await self.session.exec(statement)
    return list(result.all())

同样修复 count_by_parent() 方法:

async def count_by_parent(
    self,
    parent_id: Optional[str],
    owner_id: str,
    folder_category: Optional[int] = None  # 新增参数
) -> int:
    """统计指定父文件夹下的子文件夹数量"""
    conditions = [
        Folder.parent_folder_id == parent_id,
        Folder.owner_id == owner_id,
        Folder.deleted_at.is_(None)
    ]
    
    # 如果指定了 folder_category,添加过滤条件
    if folder_category is not None:
        conditions.append(Folder.folder_category == folder_category)
    
    statement = select(func.count(Folder.id)).where(and_(*conditions))
    result = await self.session.exec(statement)
    return result.one()

2. 修复 Docker Compose 配置

文件: server/docker-compose.yml

app:
  build:
    context: .
    dockerfile: Dockerfile
  container_name: jointo-server-app
  ports:
    - "6170:6170"
  volumes:
    - .:/app
    - /app/venv
  env_file:
    - .env  # 添加此行
  environment:
    - DATABASE_URL=postgresql+asyncpg://postgres:postgres@postgres:5432/jointo
    - REDIS_URL=redis://redis:6379/0
    - MINIO_ENDPOINT=minio:9000
    - CORS_ORIGINS=["http://localhost:6160","http://192.168.31.178:6160"]  # 显式添加

测试验证

  1. 创建文件夹成功
  2. 文件夹正确显示在页面上
  3. API 请求无 CORS 错误
  4. 虚拟根系统正常工作

影响范围

  • server/app/repositories/folder_repository.py
  • server/docker-compose.yml

相关文档