lovart3/DATABASE_SCHEMA.md

372 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 数据库表结构说明
本文档描述项目使用的 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` 的用法。