# 数据库设计文档 本数据库采用 `MySQL 5.7+`。 ## 1. 表结构概览 - **users**: 用户信息表 - **roles**: 角色信息表 - **meetings**: 会议主表 - **attendees**: 参会人员关联表 - **tags**: 标签表 - **audio_files**: 会议音频文件表 - **attachments**: 会议附件表 (未来扩展) - **transcript_tasks**: 语音转录任务表 - **transcript_segments**: 语音转录内容分段表 - **meeting_summaries**: AI 生成的会议纪要表(由llm_tasks替代) - **llm_tasks**: AI总结任务表 - **prompts**: 提示词仓库表 - **knowledge_bases**: 知识库主表 - **knowledge_bases_task**: 知识库生成任务表 - **dict_data**: 字典/码表数据表 - **client_downloads**: 客户端下载管理表 --- ## 2. 表结构详情 ### 2.1. `users` - 用户表 存储用户信息和登录凭证。 | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | | `user_id` | INT | PRIMARY KEY, AUTO_INCREMENT | 用户唯一ID | | `role_id` | INT | NOT NULL, FK | 角色ID (关联 `roles` 表) | | `username` | VARCHAR(50) | UNIQUE, NOT NULL | 登录用户名 | | `caption` | VARCHAR(50) | NOT NULL | 用户显示昵称 | | `email` | VARCHAR(100) | UNIQUE, NOT NULL | 用户邮箱 | | `password_hash` | VARCHAR(255) | NOT NULL | 哈希后的密码 | | `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 账户创建时间 | ### 2.1.1 'user_voiceprint' - 用户声纹表 | 字段名 | 类型 | 说明 | |--------|------|------| | vp_id | INT | 主键,自增ID | | user_id | INT | 用户ID,唯一索引 | | file_path | VARCHAR(255) | 音频文件相对路径 | | file_size | INT | 文件大小(字节) | | duration_seconds | DECIMAL(5,2) | 音频时长(秒),如 10.25 | | vector_data | TEXT | 声纹向量JSON数组,如 [0.123, 0.456, ...] | | collected_at | TIMESTAMP | 采集时间 | | updated_at | TIMESTAMP | 更新时间 | ### 2.2. `roles` - 角色表 存储用户角色信息。 | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | | `role_id` | INT | PRIMARY KEY, AUTO_INCREMENT | 角色唯一ID | | `role_name` | VARCHAR(50) | UNIQUE, NOT NULL | 角色名称 (e.g., "admin", "user") | ### 2.3. `meetings` - 会议表 存储会议的核心元数据。 | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | | `meeting_id` | INT | PRIMARY KEY, AUTO_INCREMENT | 会议唯一ID | | `user_id` | INT | FK | 会议创建者ID (关联 `users` 表) | | `title` | VARCHAR(255) | NOT NULL | 会议标题 | | `meeting_time` | TIMESTAMP | NULL | 会议召开时间 | | `user_prompt` | TEXT | NULL | 用户输入的提示词 (重复)| | `summary` | TEXT | NULL | 会议摘要 (Markdown格式) | | `tags` | VARCHAR(1024) | NULL | 以逗号分隔的标签字符串 | | `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 记录创建时间 | ### 2.4. `attendees` - 参会人表 会议与用户的多对多关联表。 | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | | `attendee_id` | INT | PRIMARY KEY, AUTO_INCREMENT | 唯一ID | | `meeting_id` | INT | FK | 会议ID (关联 `meetings` 表) | | `user_id` | INT | FK | 用户ID (关联 `users` 表) | | | | UNIQUE (`meeting_id`, `user_id`) | | ### 2.5. `tags` - 标签表 存储所有唯一的标签及其颜色,用于快速检索和维护。 | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | | `id` | INT | PRIMARY KEY, AUTO_INCREMENT | 标签唯一ID | | `name` | VARCHAR(255) | UNIQUE, NOT NULL | 标签名称 | | `color` | VARCHAR(7) | DEFAULT '#409EFF' | 标签颜色 (HEX) | | `creator_id` INT NOT NULL, COMMENT '创建者用户ID (关联 `users` 表) ' | | `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 创建时间 | ### 2.6. `audio_files` - 音频文件表 存储上传的会议音频文件信息。 | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | | `audio_id` | INT | PRIMARY KEY, AUTO_INCREMENT | 音频文件唯一ID | | `meeting_id` | INT | FK | 关联的会议ID | | `file_name` | VARCHAR(255) | | 原始文件名 | | `file_path` | VARCHAR(512) | NOT NULL | 文件存储相对路径 | | `file_size` | BIGINT | NULL | 文件大小 (bytes) | | `upload_time` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 上传时间 | ### 2.7. `attachments` - 会议附件表 存储会议相关的其他附件,如PPT、PDF等。 | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | | `attachment_id` | INT | PRIMARY KEY, AUTO_INCREMENT | 附件唯一ID | | `meeting_id` | INT | FK | 关联的会议ID | | `file_name` | VARCHAR(255) | NOT NULL | 原始文件名 | | `file_path` | VARCHAR(512) | NOT NULL | 文件存储路径或URL | | `file_type` | VARCHAR(100) | | 文件MIME类型 | | `uploaded_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 上传时间 | ### 2.8. `transcript_tasks` - 转录任务表 记录语音转录任务的状态和元数据。 | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | | `task_id` | VARCHAR(100) | PRIMARY KEY | 业务任务唯一ID (UUID) | | `paraformer_task_id`| VARCHAR(100) | NULL | 外部服务 (Dashscope) 的任务ID | | `meeting_id` | INT | NOT NULL, FK | 关联的会议ID | | `status` | ENUM(...) | DEFAULT 'pending' | 任务状态: 'pending', 'processing', 'completed', 'failed' | | `progress` | INT | DEFAULT 0 | 任务进度百分比 (0-100) | | `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 任务创建时间 | | `completed_at` | TIMESTAMP | NULL | 任务完成时间 | | `error_message` | TEXT | NULL | 错误信息记录 | ### 2.9. `transcript_segments` - 转录内容分段表 存储转录后的文字内容,按句子和发言人分段。 | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | | `segment_id` | INT | PRIMARY KEY, AUTO_INCREMENT | 分段唯一ID | | `meeting_id` | INT | FK | 关联的会议ID | | `speaker_id` | INT | | AI识别的原始发言人ID (e.g., 0, 1, 2) | | `speaker_tag` | VARCHAR(50) | NOT NULL | 用户可编辑的发言人标签 (e.g., "张三") | | `start_time_ms` | INT | NOT NULL | 在音频中的开始时间 (毫秒) | | `end_time_ms` | INT | NOT NULL | 在音频中的结束时间 (毫秒) | | `text_content` | TEXT | NOT NULL | 转录的文本内容 | ### 2.10. `meeting_summaries` - 会议纪要表(作废) 存储由LLM生成的会议纪要。 | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | | `id` | INT | PRIMARY KEY, AUTO_INCREMENT | 纪要唯一ID | | `meeting_id` | INT | FK | 关联的会议ID | | `summary_content` | TEXT | NULL | 生成的纪要内容 | | `user_prompt` | TEXT | NULL | 用户输入的额外提示 | | `prompt_id` | INT | FK | 关联的提示词模版ID | | `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 生成时间 | ### 2.11. `llm_tasks` - AI总结任务表 记录异步生成AI总结的任务状态。 | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | | `task_id` | VARCHAR(100) | PRIMARY KEY | 业务任务唯一ID (UUID) | | `meeting_id` | INT | NOT NULL, FK | 关联的会议ID | | `prompt_id` | INT | NOT NULL, FK | 关联的提示词模版ID | | `user_prompt` | TEXT | NULL | 用户输入的额外提示 | | `status` | ENUM(...) | DEFAULT 'pending' | 任务状态: 'pending', 'processing', 'completed', 'failed' | | `progress` | INT | DEFAULT 0 | 任务进度百分比 (0-100) | | `result` | TEXT | NULL | 成功时存储生成的纪要内容 | | `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 任务创建时间 | | `completed_at` | TIMESTAMP | NULL | 任务完成时间 | | `error_message` | TEXT | NULL | 错误信息记录 | ### 2.13. `knowledge_bases` - 知识库表 存储用户生成和管理的知识库条目。 | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | | `kb_id` | INT | PRIMARY KEY, AUTO_INCREMENT | 知识库条目唯一ID | | `title` | VARCHAR(255) | NOT NULL | 标题 | | `user_prompt` | TEXT | NULL | 用户输入的提示词(重复) | | `content` | TEXT | NULL | 生成的知识库内容 (Markdown格式) | | `creator_id` | INT | NOT NULL, FK | 创建者用户ID (关联 `users` 表) | | `is_shared` | BOOLEAN | NOT NULL, DEFAULT FALSE | 是否为共享知识库 (TRUE: 共享, FALSE: 个人) | | `source_meeting_ids` | TEXT | NULL | 内容来源的会议ID列表 (逗号分隔) | | `tags` | VARCHAR(255) | NULL | 逗号分隔的标签 | | `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 创建时间 | | `updated_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 最后更新时间 | ### 2.14. `knowledge_base_tasks` - 知识库生成任务表 记录异步生成知识库内容的AI任务状态。 | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | | `task_id` | VARCHAR(100) | PRIMARY KEY | 业务任务唯一ID (UUID) | | `user_id` | INT | NOT NULL, FK | 发起任务的用户ID (关联 `users` 表) | | `kb_id` | INT | NOT NULL, FK | 关联的知识库条目ID (关联 `knowledge_bases` 表) | | `prompt_id` | INT | NOT NULL, FK | 关联的提示词模版ID | | `user_prompt` | TEXT | NULL | 用户输入的提示词 | | `status` | ENUM('pending', 'processing', 'completed', 'failed') | NOT NULL, DEFAULT 'pending' | 任务状态 | | `progress` | INT | DEFAULT 0 | 任务进度百分比 (0-100) | | `error_message` | TEXT | NULL | 任务失败时的错误信息 | | `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 任务创建时间 | | `updated_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 任务状态更新时间 | | `completed_at` | TIMESTAMP | NULL | 任务完成时间 | ### 2.12. `prompts` - 提示词仓库表 存储系统中各种任务使用的大模型提示词模板。每个任务类型(会议任务、知识库任务)可以有多个提示词,但只能有一个默认且启用的提示词。 | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | | `id` | INT | AUTO_INCREMENT, PRIMARY KEY | 提示词唯一ID | | `name` | VARCHAR(255) | NOT NULL | 提示词名称 | | `task_type` | ENUM('MEETING_TASK', 'KNOWLEDGE_TASK') | NOT NULL | 任务类型:MEETING_TASK-会议任务, KNOWLEDGE_TASK-知识库任务 | | `content` | TEXT | NOT NULL | 完整的提示词内容 | | `is_default` | BOOLEAN | NOT NULL, DEFAULT FALSE | 是否为该任务类型的默认模板 | | `is_active` | BOOLEAN | NOT NULL, DEFAULT TRUE | 是否启用(只有启用的提示词才能被使用) | | `creator_id` | INT | NOT NULL, FK | 创建者用户ID (关联 `users` 表) | | `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 创建时间 | **约束说明:** - 每个 `task_type` 同一时间只能有一个 `is_default=TRUE` 的提示词 - 业务逻辑需确保:设置新默认提示词时,自动取消同类型其他提示词的默认状态 ### 2.15. `prompt_config` - 提示词配置表(已废弃) **该表已废弃,功能整合到 `prompts` 表的 `task_type` 和 `is_default` 字段。** ### 2.16. `dict_data` - 字典/码表数据表 存储系统中的码表数据,支持树形结构和扩展属性,用于管理客户端平台类型等配置数据。 | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | | `id` | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 主键ID | | `dict_type` | VARCHAR(64) | NOT NULL, DEFAULT 'client_platform' | 字典类型(如 client_platform) | | `dict_code` | VARCHAR(64) | NOT NULL | 业务编码(唯一Key,如 WIN、IOS、ANDROID) | | `parent_code` | VARCHAR(64) | NOT NULL, DEFAULT 'ROOT' | 父级编码(ROOT为顶级,支持树形结构) | | `tree_path` | VARCHAR(255) | NULL | 层级路径(辅助字段,如 0,1,10) | | `label_cn` | VARCHAR(128) | NOT NULL | 中文名称 | | `label_en` | VARCHAR(128) | NULL | 英文名称 | | `sort_order` | INT | DEFAULT 0 | 排序权重 | | `extension_attr` | JSON | NULL | 扩展属性(JSON格式,存储平台特有属性) | | `is_default` | TINYINT | DEFAULT 0 | 是否默认选中(0: 否, 1: 是) | | `status` | TINYINT | DEFAULT 1 | 状态(1: 正常, 0: 停用) | | `create_time` | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 | | | | UNIQUE KEY (`dict_type`, `dict_code`) | 确保编码在同类型下唯一 | **扩展属性示例(extension_attr):** ```json { "suffix": ".exe", "arch_support": ["x86", "x64"], "icon": "monitor" } ``` **树形结构示例:** - ROOT - DESKTOP (桌面端) - WIN (Windows) - MAC (macOS) - LINUX (Linux) - MOBILE (移动端) - IOS (苹果iOS) - ANDROID (安卓) - TERMINAL (专用终端) - TERM_STD (通用终端) - TERM_S100 (中兴终端) ### 2.17. `client_downloads` - 客户端下载管理表 存储各平台客户端版本信息,用于管理客户端下载和版本更新。 | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | | `id` | INT | PRIMARY KEY, AUTO_INCREMENT | 主键ID | | `platform_code` | VARCHAR(64) | NOT NULL | 平台编码(关联 `dict_data.dict_code`) | | `version` | VARCHAR(50) | NOT NULL | 版本号(如 1.0.0) | | `version_code` | INT | NOT NULL | 版本号数值(用于版本比较) | | `download_url` | VARCHAR(512) | NOT NULL | 下载链接 | | `file_size` | BIGINT | NULL | 文件大小(bytes) | | `release_notes` | TEXT | NULL | 更新说明 | | `is_active` | BOOLEAN | NOT NULL, DEFAULT TRUE | 是否启用 | | `is_latest` | BOOLEAN | NOT NULL, DEFAULT FALSE | 是否为最新版本 | | `min_system_version` | VARCHAR(50) | NULL | 最低系统版本要求 | | `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 创建时间 | | `updated_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 | | `created_by` | INT | NULL, FK | 创建者用户ID(关联 `users` 表) | | | | INDEX (`platform_code`) | 平台编码索引 | **约束说明:** - 同一 `platform_code` 同一时间只应有一个 `is_latest=TRUE` 的版本 - `platform_code` 关联 `dict_data` 表的 `dict_code` 字段(client_platform类型) - 业务逻辑需确保:设置新最新版本时,自动取消同平台其他版本的最新状态 **相关API接口:** - `GET /api/clients/latest/by-platform` - 获取最新版本客户端 - 支持两种调用方式(兼容新旧版本,返回数据结构一致): 1. 旧版:传 `platform_type` 和 `platform_name` 参数 2. 新版:传 `platform_code` 参数(推荐) - `POST /api/clients/upload` - 上传客户端安装包(管理员) - 自动解析APK文件的版本信息 - 自动读取文件大小并生成下载URL --- ## 3. 关系图 (ERD) ```mermaid erDiagram users { int user_id PK varchar(50) username varchar(50) caption varchar(100) email varchar(255) password_hash int role_id FK timestamp created_at } roles { int role_id PK varchar(50) role_name } meetings { int meeting_id PK int user_id FK varchar(255) title timestamp meeting_time text summary varchar(1024) tags timestamp created_at } tags { int id PK varchar(255) name varchar(7) color } attendees { int attendee_id PK int meeting_id FK int user_id FK } audio_files { int audio_id PK int meeting_id FK varchar(512) file_path varchar(100) task_id } transcript_tasks { varchar(100) task_id PK int meeting_id FK varchar(100) paraformer_task_id enum status int progress } transcript_segments { int segment_id PK int meeting_id FK int speaker_id varchar(50) speaker_tag int start_time_ms int end_time_ms text text_content } meeting_summaries { int id PK int meeting_id FK text summary_content } llm_tasks { varchar(100) task_id PK int meeting_id FK enum status int progress } users ||--o{ meetings : "creates" users ||--o{ attendees : "attends" users }|..|| roles : "has role" meetings ||--|{ attendees : "has" meetings ||--|{ audio_files : "has" meetings ||--|{ transcript_tasks : "has" meetings ||--|{ transcript_segments : "has" meetings ||--|{ meeting_summaries : "has" meetings ||--|{ llm_tasks : "has" ```