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