From 503196d2ae085aac92bf5aa5580f5d18f93232b2 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 5 Feb 2026 19:36:33 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E8=A1=A8=E7=BB=93=E6=9E=84=E8=AF=B4=E6=98=8E=20DATABA?= =?UTF-8?q?SE=5FSCHEMA.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DATABASE_SCHEMA.md | 371 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 371 insertions(+) create mode 100644 DATABASE_SCHEMA.md diff --git a/DATABASE_SCHEMA.md b/DATABASE_SCHEMA.md new file mode 100644 index 000000000..b36149fa4 --- /dev/null +++ b/DATABASE_SCHEMA.md @@ -0,0 +1,371 @@ +# 数据库表结构说明 + +本文档描述项目使用的 PostgreSQL 数据库表及字段,便于配置数据库、排查问题或二次开发。 +表名与代码中 `lib/db/schema.ts` 一致,迁移文件位于 `lib/db/migrations/`。 + +--- + +## 1. User(用户表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| email | varchar(64) | 是 | - | 邮箱 | +| password | varchar(64) | 否 | - | 密码(可为空,如钉钉登录) | +| name | varchar(100) | 否 | - | 用户姓名(显示用) | +| department | varchar(256) | 否 | - | 部门 | +| dingtalkUserId | varchar(128) | 否 | - | 钉钉用户ID | +| role | varchar | 是 | 'regular' | 角色:guest / regular / admin | +| isActive | boolean | 是 | true | 是否启用 | +| monthlyImageLimit | integer | 否 | - | 每月出图限额,NULL/0 表示无限制 | +| createdAt | timestamp | 是 | now() | 创建时间 | +| updatedAt | timestamp | 是 | now() | 更新时间 | + +--- + +## 2. Chat(会话表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| createdAt | timestamp | 是 | - | 创建时间 | +| title | text | 是 | - | 会话标题 | +| userId | uuid | 是 | - | 用户ID,外键 → User.id | +| visibility | varchar | 是 | 'private' | 可见性:public / private | +| lastContext | jsonb | 否 | - | 上次使用上下文(AppUsage) | + +--- + +## 3. Message(消息表,新)— 表名:Message_v2 + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| chatId | uuid | 是 | - | 会话ID,外键 → Chat.id | +| role | varchar | 是 | - | 角色(user/assistant 等) | +| parts | json | 是 | - | 消息内容片段 | +| attachments | json | 是 | - | 附件 | +| createdAt | timestamp | 是 | - | 创建时间 | +| video_storage_status | varchar(20) | 否 | 'temporary' | 视频存储状态 | +| temporary_video_url | text | 否 | - | 临时视频URL | +| permanent_video_url | text | 否 | - | 永久视频URL | +| archived_at | timestamp | 否 | - | 归档时间 | +| video_metadata | jsonb | 否 | - | 视频元数据 | + +--- + +## 4. Message(旧版,已弃用)— 表名:Message + +保留兼容,新逻辑请用 Message_v2。 + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| chatId | uuid | 是 | - | 会话ID | +| role | varchar | 是 | - | 角色 | +| content | json | 是 | - | 内容 | +| createdAt | timestamp | 是 | - | 创建时间 | + +--- + +## 5. Vote_v2(投票表,新) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| chatId | uuid | 是 | - | 会话ID,外键 → Chat.id | +| messageId | uuid | 是 | - | 消息ID,外键 → Message_v2.id | +| isUpvoted | boolean | 是 | - | 是否点赞 | +| (主键) | - | - | - | (chatId, messageId) 联合主键 | + +--- + +## 6. Vote(旧版,已弃用)— 表名:Vote + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| chatId | uuid | 是 | - | 会话ID | +| messageId | uuid | 是 | - | 消息ID(旧 Message 表) | +| isUpvoted | boolean | 是 | - | 是否点赞 | + +--- + +## 7. Document(文档表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键之一 | +| createdAt | timestamp | 是 | - | 主键之一 | +| title | text | 是 | - | 标题 | +| content | text | 否 | - | 内容 | +| text | varchar | 是 | 'text' | 类型:text / code / image / sheet | +| userId | uuid | 是 | - | 用户ID,外键 → User.id | + +主键:(id, createdAt) + +--- + +## 8. Suggestion(建议表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| documentId | uuid | 是 | - | 文档ID | +| documentCreatedAt | timestamp | 是 | - | 文档创建时间 | +| originalText | text | 是 | - | 原文 | +| suggestedText | text | 是 | - | 建议文本 | +| description | text | 否 | - | 描述 | +| isResolved | boolean | 是 | false | 是否已解决 | +| userId | uuid | 是 | - | 用户ID,外键 → User.id | +| createdAt | timestamp | 是 | - | 创建时间 | + +--- + +## 9. Stream(流表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| chatId | uuid | 是 | - | 会话ID,外键 → Chat.id | +| createdAt | timestamp | 是 | - | 创建时间 | + +--- + +## 10. SystemSettings(系统设置表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| key | varchar(128) | 是 | - | 配置键,唯一 | +| value | jsonb | 是 | - | 配置值 | +| updatedAt | timestamp | 是 | now() | 更新时间 | +| updatedBy | uuid | 否 | - | 更新人,外键 → User.id | + +--- + +## 11. ToolConfig(工具配置表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| toolName | varchar(128) | 是 | - | 工具名称,唯一 | +| isEnabled | boolean | 是 | true | 是否启用 | +| description | text | 否 | - | 描述 | +| config | jsonb | 否 | - | 配置 | +| updatedAt | timestamp | 是 | now() | 更新时间 | +| updatedBy | uuid | 否 | - | 更新人,外键 → User.id | + +--- + +## 12. AiProvider(AI 提供商表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| name | varchar(128) | 是 | - | 提供商名称 | +| type | varchar | 是 | 'custom' | 类型:alibaba / openai / custom / local / gemini / huanke-gemini / qianwen-video / volcano-vision / volcano-video / alibaba-image | +| baseUrl | text | 是 | - | API 基础 URL | +| apiKey | text | 是 | - | API Key | +| isEnabled | boolean | 是 | true | 是否启用 | +| createdAt | timestamp | 是 | now() | 创建时间 | +| updatedAt | timestamp | 是 | now() | 更新时间 | +| updatedBy | uuid | 否 | - | 更新人,外键 → User.id | + +--- + +## 13. AiModel(AI 模型表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| providerId | uuid | 是 | - | 提供商ID,外键 → AiProvider.id | +| modelId | varchar(128) | 是 | - | 模型ID(如 qwen-turbo) | +| displayName | varchar(128) | 是 | - | 显示名称 | +| description | text | 否 | - | 描述 | +| supportsVision | boolean | 是 | false | 是否支持视觉 | +| supportsImageGen | boolean | 是 | false | 是否支持生图 | +| isEnabled | boolean | 是 | true | 是否启用 | +| isDefault | boolean | 是 | false | 是否默认模型 | +| sortOrder | integer | 是 | 0 | 排序 | +| capabilities | jsonb | 否 | - | 能力配置(如视频) | +| defaultParams | jsonb | 否 | - | 默认参数 | +| is_sub_model | boolean | 是 | false | 是否子模型(不单独展示) | +| parent_model_id | uuid | 否 | - | 父模型ID | +| fallbackModelId1 | varchar(128) | 否 | - | 备用模型ID 1 | +| fallbackModelId2 | varchar(128) | 否 | - | 备用模型ID 2 | +| imageGenConfig | jsonb | 否 | - | 生图配置 | +| createdAt | timestamp | 是 | now() | 创建时间 | +| updatedAt | timestamp | 是 | now() | 更新时间 | + +--- + +## 14. StorageConfig(存储配置表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| name | varchar(128) | 是 | - | 配置名称 | +| type | varchar | 是 | 's3' | 类型:s3 / local | +| endpoint | text | 否 | - | S3 端点 | +| region | varchar(64) | 否 | - | 区域 | +| bucket | varchar(128) | 否 | - | 存储桶 | +| accessKeyId | text | 否 | - | Access Key ID | +| secretAccessKey | text | 否 | - | Secret Access Key | +| publicUrl | text | 否 | - | 公开访问 URL 前缀 | +| isDefault | boolean | 是 | false | 是否默认存储 | +| isEnabled | boolean | 是 | true | 是否启用 | +| createdAt | timestamp | 是 | now() | 创建时间 | +| updatedAt | timestamp | 是 | now() | 更新时间 | +| updatedBy | uuid | 否 | - | 更新人,外键 → User.id | + +--- + +## 15. SiteSettings(网站设置表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| siteName | varchar(128) | 是 | 'AI Chatbot' | 站点名称 | +| siteLogo | text | 否 | - | 站点 LOGO(日间) | +| siteLogoDark | text | 否 | - | 站点 LOGO(夜间) | +| favicon | text | 否 | - | favicon | +| showAutoModel | boolean | 是 | true | 是否显示「自动」模型 | +| defaultTheme | varchar(16) | 是 | 'system' | 默认主题:system / light / dark | +| usageTimeEnabled | boolean | 是 | false | 是否启用使用时间限制 | +| usageTimeStart | varchar(5) | 否 | '08:00' | 开始时间 HH:mm | +| usageTimeEnd | varchar(5) | 否 | '20:00' | 结束时间 HH:mm | +| usageTimeMessage | text | 否 | - | 超时提示文案 | +| bannerEnabled | boolean | 是 | true | 是否显示广告横幅 | +| bannerText | text | 否 | - | 横幅文案 | +| bannerLink | text | 否 | - | 横幅链接 | +| toolbox1Name | varchar(64) | 否 | '工具箱' | 工具箱1名称 | +| toolbox1Enabled | boolean | 是 | true | 工具箱1是否显示 | +| toolbox2Name | varchar(64) | 否 | '工具箱2' | 工具箱2名称 | +| toolbox2Enabled | boolean | 是 | false | 工具箱2是否显示 | +| tutorialVideoUrl | text | 否 | - | 教程视频链接 | +| tutorialEnabled | boolean | 是 | false | 是否显示教程 | +| rankingEnabled | boolean | 是 | true | 是否显示精选榜 | +| canvasEnabled | boolean | 是 | true | 是否启用无限画布 | +| canvasDefaultModelId | varchar(128) | 否 | - | 画布默认模型ID | +| canvasAutoModeDefaultModelId | varchar(128) | 否 | - | 画布智能自动模式默认模型ID | +| updatedAt | timestamp | 是 | now() | 更新时间 | +| updatedBy | uuid | 否 | - | 更新人,外键 → User.id | + +--- + +## 16. NavLinks(导航链接表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| name | varchar(64) | 是 | - | 名称 | +| url | text | 是 | - | 链接 | +| order | integer | 是 | 0 | 排序 | +| isEnabled | boolean | 是 | true | 是否启用 | +| toolboxGroup | integer | 是 | 1 | 工具箱分组:1 或 2 | +| createdAt | timestamp | 是 | now() | 创建时间 | +| updatedAt | timestamp | 是 | now() | 更新时间 | +| createdBy | uuid | 否 | - | 创建人,外键 → User.id | + +--- + +## 17. TutorialVideos(教程视频表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| title | varchar(128) | 是 | - | 标题 | +| videoUrl | text | 是 | - | 视频链接 | +| coverUrl | text | 否 | - | 封面图链接 | +| description | text | 否 | - | 描述 | +| order | integer | 是 | 0 | 排序 | +| isEnabled | boolean | 是 | true | 是否启用 | +| createdAt | timestamp | 是 | now() | 创建时间 | +| updatedAt | timestamp | 是 | now() | 更新时间 | +| createdBy | uuid | 否 | - | 创建人,外键 → User.id | + +--- + +## 18. AuthSettings(认证配置表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| dingTalkAppKey | text | 否 | - | 钉钉 AppKey | +| dingTalkAppSecret | text | 否 | - | 钉钉 AppSecret | +| dingTalkOrganizations | jsonb | 否 | - | 多组织钉钉配置 [{ name, appKey, appSecret }] | +| isDingTalkEnabled | boolean | 是 | false | 是否启用钉钉登录 | +| isRegistrationEnabled | boolean | 是 | true | 是否开放注册 | +| updatedAt | timestamp | 是 | now() | 更新时间 | +| updatedBy | uuid | 否 | - | 更新人,外键 → User.id | + +--- + +## 19. LoginToken(临时登录令牌表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| token | text | 是 | - | 令牌,唯一 | +| email | varchar(64) | 是 | - | 邮箱 | +| expiresAt | timestamp | 是 | - | 过期时间 | +| createdAt | timestamp | 是 | now() | 创建时间 | + +--- + +## 20. GeneratedImage(生成图片记录表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| userId | uuid | 是 | - | 用户ID,外键 → User.id | +| chatId | uuid | 否 | - | 会话ID,外键 → Chat.id | +| messageId | uuid | 否 | - | 消息ID | +| thumbnailUrl | text | 是 | - | 缩略图 URL | +| originalUrl | text | 是 | - | 原图 URL | +| imageSize | varchar(10) | 否 | '2K' | 图片尺寸 | +| prompt | text | 否 | - | 提示词 | +| modelId | varchar(128) | 否 | - | 模型ID | +| isFeatured | boolean | 是 | false | 是否精选 | +| featuredAt | timestamp | 否 | - | 精选时间 | +| featuredBy | uuid | 否 | - | 精选操作人,外键 → User.id | +| createdAt | timestamp | 是 | now() | 创建时间 | + +--- + +## 21. CanvasProject(画布项目表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| userId | uuid | 是 | - | 用户ID,外键 → User.id | +| title | varchar(256) | 是 | '未命名画布' | 标题 | +| description | text | 否 | - | 描述 | +| thumbnail | text | 否 | - | 缩略图 URL | +| canvasData | jsonb | 否 | - | 画布数据 { nodes, edges, viewport } | +| createdAt | timestamp | 是 | now() | 创建时间 | +| updatedAt | timestamp | 是 | now() | 更新时间 | + +--- + +## 22. CanvasNode(画布节点表) + +| 字段名 | 类型 | 必填 | 默认 | 说明 | +|--------|------|------|------|------| +| id | uuid | 是 | defaultRandom() | 主键 | +| projectId | uuid | 是 | - | 画布项目ID,外键 → CanvasProject.id | +| type | varchar(32) | 是 | - | 类型:message / image / video / text / scene-fusion | +| position | jsonb | 否 | - | 位置 { x, y } | +| size | jsonb | 否 | - | 尺寸 { width, height } | +| data | jsonb | 否 | - | 节点数据 | +| connections | jsonb | 否 | [] | 连接列表 | +| parentId | uuid | 否 | - | 父节点ID | +| createdAt | timestamp | 是 | now() | 创建时间 | +| updatedAt | timestamp | 是 | now() | 更新时间 | + +--- + +## 使用说明 + +- **建表**:项目使用 Drizzle 迁移,首次部署请执行 `pnpm run db:migrate` 或项目内定义的迁移命令,表会按 `lib/db/migrations/` 中的 SQL 自动创建/更新。 +- **连接**:数据库连接由环境变量配置(如 `POSTGRES_URL`),请勿将包含密码的 `.env` 提交到仓库。 +- **系统配置**:部分功能依赖 `SystemSettings` 表中的 key(如 `scene_fusion_config`、站点相关 key),具体 key 名见代码中 `getSystemSetting` 的用法。