commit a7a2bc87de515e036838c0c3cbfb41a066f76479 Author: chenhao Date: Mon Feb 9 15:07:50 2026 +0800 docs(database): 添加数据库设计文档 - 新建 design/database.md 文件,包含完整的数据库设计文档 - 定义用户、角色、会议、参会人、标签、音频文件等核心表结构 - 设计转录任务、转录内容分段、AI总结任务等功能相关表 - 包含知识库、提示词仓库、字典数据等扩展功能表设计 - 添加客户端 diff --git a/design/database.md b/design/database.md new file mode 100644 index 0000000..ec2bc83 --- /dev/null +++ b/design/database.md @@ -0,0 +1,436 @@ +# 数据库设计文档 + +本数据库采用 `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**: 客户端下载管理表 +- **terminals**: 专用终端设备表 + +--- + +## 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类型) +- 业务逻辑需确保:设置新最新版本时,自动取消同平台其他版本的最新状态 + +### 2.18. `terminals` - 专用终端设备表 + +存储专用终端设备信息(如录音笔、会议平板等),用于设备激活管理和状态监控。 + +| 字段名 | 类型 | 约束 | 描述 | +| :--- | :--- | :--- | :--- | +| `id` | INT | PRIMARY KEY, AUTO_INCREMENT | 主键ID | +| `imei` | VARCHAR(64) | NOT NULL, UNIQUE | IMEI号(设备唯一标识) | +| `terminal_name` | VARCHAR(100) | NULL | 终端名称/设备别名 | +| `terminal_type` | VARCHAR(50) | NOT NULL | 终端类型(关联 `dict_data.dict_code`) | +| `description` | VARCHAR(500) | NULL | 终端说明/备注 | +| `status` | TINYINT(1) | NOT NULL, DEFAULT 1 | 启用状态: 1-启用, 0-停用 | +| `is_activated` | TINYINT(1) | NOT NULL, DEFAULT 0 | 激活状态: 1-已激活, 0-未激活 | +| `activated_at` | DATETIME | NULL | 激活时间 | +| `firmware_version` | VARCHAR(50) | NULL | 当前固件版本 | +| `last_online_at` | DATETIME | NULL | 最后在线/心跳时间 | +| `ip_address` | VARCHAR(50) | NULL | 最近一次连接IP | +| `mac_address` | VARCHAR(64) | NULL | MAC地址 | +| `created_at` | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 录入时间 | +| `updated_at` | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE | 更新时间 | +| `created_by` | INT | NULL, FK | 录入人ID(关联 `users` 表) | +| | | KEY `idx_terminal_type` | 终端类型索引 | +| | | KEY `idx_status` | 状态索引 | + +--- + +## 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 + } + + dedicated_terminals { + int id PK + varchar(64) imei + varchar(50) terminal_type + tinyint status + tinyint is_activated + } + + 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" + +``` \ No newline at end of file diff --git a/design/用户管理.png b/design/用户管理.png new file mode 100644 index 0000000..b446962 Binary files /dev/null and b/design/用户管理.png differ diff --git a/design/登录页.PNG b/design/登录页.PNG new file mode 100644 index 0000000..9989776 Binary files /dev/null and b/design/登录页.PNG differ diff --git a/design/角色新增.png b/design/角色新增.png new file mode 100644 index 0000000..b96719a Binary files /dev/null and b/design/角色新增.png differ diff --git a/design/角色管理.png b/design/角色管理.png new file mode 100644 index 0000000..37c51bc Binary files /dev/null and b/design/角色管理.png differ diff --git a/design/首页.PNG b/design/首页.PNG new file mode 100644 index 0000000..39069fa Binary files /dev/null and b/design/首页.PNG differ