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.
 
jiangrenhang 6b16e8865d archive: add Jointoai docs v1.0 snapshot (2026-03-03) 3 weeks ago
..
ai archive: add Jointoai docs v1.0 snapshot (2026-03-03) 3 weeks ago
project archive: add Jointoai docs v1.0 snapshot (2026-03-03) 3 weeks ago
resource archive: add Jointoai docs v1.0 snapshot (2026-03-03) 3 weeks ago
user archive: add Jointoai docs v1.0 snapshot (2026-03-03) 3 weeks ago
README.md archive: add Jointoai docs v1.0 snapshot (2026-03-03) 3 weeks ago

README.md

后端服务文档总览

最后更新:2026-01-27


⚠️ 重要架构变更通知

数据库设计约束(2026-01-27 更新)

本项目采用以下数据库设计约束,所有服务文档中的表定义已更新以符合这些规范:

1. 禁止物理外键约束

  • 数据库层禁止创建 FOREIGN KEY 约束
  • 所有引用完整性在应用层 Service/Repository 中验证
  • 所有逻辑关联字段必须手动创建索引

原因:为分库分表做准备、提升写入性能、增强系统扩展性

2. 禁止数据库默认值生成 UUID

  • 禁止使用 DEFAULT gen_uuid_v7()
  • 禁止使用 server_default=text("gen_uuid_v7()")
  • 必须在应用层通过 default_factory=generate_uuid 生成

原因:统一 UUID 生成逻辑、便于分布式环境管理

3. 应用层引用完整性保证

移除物理外键约束后,采用三层机制保证数据完整性:

Repository 层:提供 exists(), batch_exists() 等基础验证方法

async def exists(self, id: UUID) -> bool:
    """检查记录是否存在(排除软删除)"""
    query = select(self.model.id).where(
        self.model.id == id,
        self.model.deleted_at.is_(None)
    ).limit(1)
    result = await self.db.execute(query)
    return result.scalar_one_or_none() is not None

Service 层:在所有操作中验证引用完整性

async def create_project(self, user_id: UUID, data: ProjectCreate):
    # 验证所有外键引用
    if not await self.user_repo.exists(data.owner_id):
        raise NotFoundError("所有者用户不存在")
    
    if data.folder_id:
        if not await self.folder_repo.exists(data.folder_id):
            raise NotFoundError("文件夹不存在")
    
    # 使用事务创建
    async with self.db.begin():
        project = await self.project_repo.create(data)
        # 处理关联数据...

后台任务:定期检查数据完整性

@shared_task
async def check_orphan_records():
    """检查孤儿记录并告警"""
    # 检查并修复数据完整性问题

4. 级联删除处理

删除操作必须在应用层明确处理级联关系:

async def delete_project(self, project_id: UUID, permanent: bool = False):
    """删除项目 - 应用层级联处理"""
    async with self.db.begin():
        if permanent:
            # 物理删除所有关联数据
            await self.project_member_repo.delete_by_project(project_id)
            await self.project_share_repo.delete_by_project(project_id)
            # ... 其他关联数据
            await self.project_repo.delete(project_id)
        else:
            # 软删除
            await self.project_repo.soft_delete(project_id)
            await self.project_member_repo.soft_delete_by_project(project_id)

5. 文档说明

  • 各服务文档中的表定义仅供参考,实际以代码为准(server/app/models/
  • 表定义中不再包含 REFERENCES 外键约束
  • 表定义中不再包含 DEFAULT gen_uuid_v7() 数据库默认值
  • Python Model 定义中使用 default_factory=generate_uuid 生成 UUID

详细规范


目录结构

本目录按业务领域组织后端服务文档,共分为 4 个子目录:

📁 user/ - 用户相关服务

用户认证、授权、积分管理、充值支付等服务。

📁 project/ - 项目相关服务

项目管理、文件夹、剧本、分镜、分镜看板、评论等服务。

📁 resource/ - 资源相关服务

素材资源、附件、文件存储等服务。

📁 ai/ - AI 相关服务

AI 生成、视频处理等服务。


服务依赖关系

用户服务层
├── user-service (核心)
├── sms-service (依赖: 第三方短信平台)
├── wechat-service (依赖: 微信开放平台)
├── credit-service (依赖: user-service)
├── recharge-service (依赖: credit-service, payment-service)
└── payment-service (依赖: 微信支付、支付宝)

项目服务层
├── project-service (核心)
├── project-resource-service (依赖: project-service, resource-service)
├── folder-service (依赖: project-service)
├── screenplay-service (依赖: project-service)
├── storyboard-service (依赖: project-service, screenplay-service)
├── storyboard-board-service (依赖: project-service)
├── comment-service (依赖: project-service, user-service)
└── export-service (依赖: project-service, video-service)

资源服务层
├── resource-service (核心)
├── attachment-service (依赖: file-storage-service)
└── file-storage-service (依赖: 对象存储)

AI 服务层
├── ai-service (依赖: credit-service, 第三方 AI 平台)
└── video-service (依赖: ai-service, resource-service)

快速导航

按功能查找

用户认证

积分充值

项目管理

AI 生成


相关文档