docs: 添加数据库表结构说明 DATABASE_SCHEMA.md
This commit is contained in:
parent
049f01059f
commit
503196d2ae
371
DATABASE_SCHEMA.md
Normal file
371
DATABASE_SCHEMA.md
Normal file
@ -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` 的用法。
|
||||
Loading…
x
Reference in New Issue
Block a user