- 后端:新增 /api/audio/transcribe 接口,调用 Ollama whisper 进行语音识别 - 前端:新增 AudioTranscribePage.vue 页面,支持 MP3/WAV/M4A/OGG/FLAC 等格式 - 注册路由、工具卡片、智能助手欢迎语更新 Co-Authored-By: Claude Code <noreply@anthropic.com>
16 KiB
16 KiB
eai_agentplatform_app — 数据库 Schema
版本:V1.2 | 引擎:MySQL 8.0(关系数据)+ FAISS(向量检索)| ORM:GORM 最后更新:2026-08-16
约定
数据库使用 MySQL 8.0(GORM AutoMigrate 建表),AI 知识检索采用 MySQL 全文索引(关键词)+ FAISS 向量检索(语义)双路混合召回。 下列 DDL 为权威字段定义;
ENUM、FULLTEXT ngram、ON DELETE外键级联为 MySQL 原生能力。 V1.4–V1.7 新增表(岗位/积分/证书/部门/消息等)见文末「新增表清单」。
- 主键
id为BIGINT UNSIGNED AUTO_INCREMENT - 时间字段
created_at/updated_at为DATETIME,默认CURRENT_TIMESTAMP - 外键命名规则:
fk_{本表}_{关联表}_{字段} - 索引命名规则:
idx_{表}_{字段}
1. user — 用户表
CREATE TABLE user (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(64) NOT NULL UNIQUE COMMENT '登录用户名',
password_hash VARCHAR(256) NOT NULL COMMENT 'bcrypt 哈希',
full_name VARCHAR(64) NOT NULL COMMENT '显示姓名',
role ENUM('employee','admin') NOT NULL DEFAULT 'employee',
status ENUM('active','disabled') NOT NULL DEFAULT 'active',
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
INDEX idx_user_role (role),
INDEX idx_user_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
说明:
role=admin为管理员,role=employee为普通员工status=disabled时 token 校验拒绝访问- 仅管理员可创建 / 禁用账号
2. product — 产品表
CREATE TABLE product (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(32) NOT NULL UNIQUE COMMENT '产品编号',
name VARCHAR(128) NOT NULL COMMENT '产品名称',
category ENUM('capital_consulting','qualification_counseling',
'ai_consulting','ai_tools_platform') NOT NULL
COMMENT '四大分类',
tags VARCHAR(256) DEFAULT '' COMMENT '标签,逗号分隔',
description TEXT COMMENT '业务内容说明',
pricing TEXT COMMENT '收费结构',
commission_recommend VARCHAR(128) DEFAULT '' COMMENT '推荐佣金比例',
commission_negotiate VARCHAR(128) DEFAULT '' COMMENT '谈单参与佣金比例',
public_course_bonus VARCHAR(128) DEFAULT '' COMMENT '公开课超额分成',
version_risk TEXT COMMENT '版本风险',
report_rules TEXT COMMENT '报备规则备注',
status ENUM('active','inactive') NOT NULL DEFAULT 'active',
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
INDEX idx_product_category (category),
INDEX idx_product_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
3. course — 课程表
CREATE TABLE course (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(32) NOT NULL UNIQUE COMMENT '课程编号',
name VARCHAR(128) NOT NULL COMMENT '课程名称',
category ENUM('capital_script','qualification_logic',
'ai_public_course','ai_platform_matching') NOT NULL
COMMENT '四大课程分类',
target_customers TEXT COMMENT '适配客户',
forbidden_customers TEXT COMMENT '禁接客户',
scripts TEXT COMMENT '标准话术',
sales_process TEXT COMMENT '谈单流程',
objection_handling TEXT COMMENT '异议处理',
delivery_pitfalls TEXT COMMENT '交付避坑',
report_rules TEXT COMMENT '报备规范',
related_product_id BIGINT UNSIGNED DEFAULT NULL COMMENT '绑定产品ID',
status ENUM('active','inactive') NOT NULL DEFAULT 'active',
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
INDEX idx_course_category (category),
INDEX idx_course_status (status),
INDEX idx_course_product (related_product_id),
CONSTRAINT fk_course_product FOREIGN KEY (related_product_id) REFERENCES product(id)
ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4. media_file — 素材文件表
CREATE TABLE media_file (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
filename VARCHAR(256) NOT NULL COMMENT '原始文件名',
stored_name VARCHAR(64) NOT NULL COMMENT '存储UUID文件名',
stored_path VARCHAR(512) NOT NULL COMMENT '存储相对路径',
file_ext VARCHAR(16) NOT NULL COMMENT '扩展名(小写无点)',
file_size BIGINT UNSIGNED NOT NULL COMMENT '文件大小(字节)',
status ENUM('pending','approved','rejected') NOT NULL DEFAULT 'pending',
source ENUM('employee','admin') NOT NULL COMMENT '上传来源',
submitter_id BIGINT UNSIGNED NOT NULL COMMENT '提交人ID',
remark VARCHAR(512) DEFAULT NULL COMMENT '提交备注(员工素材建议)',
bind_type ENUM('company','product','course','none') NOT NULL DEFAULT 'none'
COMMENT '绑定类型',
bind_id BIGINT UNSIGNED DEFAULT NULL COMMENT '绑定实体ID',
reject_reason VARCHAR(512) DEFAULT NULL COMMENT '驳回理由',
audit_by BIGINT UNSIGNED DEFAULT NULL COMMENT '审批人ID',
audit_at DATETIME(6) DEFAULT NULL COMMENT '审批时间',
extracted TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已提取文本',
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
INDEX idx_media_status (status),
INDEX idx_media_submitter (submitter_id),
INDEX idx_media_bind (bind_type, bind_id),
INDEX idx_media_extracted (extracted),
CONSTRAINT fk_media_submitter FOREIGN KEY (submitter_id) REFERENCES user(id),
CONSTRAINT fk_media_auditor FOREIGN KEY (audit_by) REFERENCES user(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
5. knowledge_chunk — 知识块表
CREATE TABLE knowledge_chunk (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
media_file_id BIGINT UNSIGNED DEFAULT NULL COMMENT '关联素材ID(与 knowledge_source_id 二选一)',
knowledge_source_id BIGINT UNSIGNED DEFAULT NULL COMMENT '关联知识源ID(与 media_file_id 二选一)',
source_type VARCHAR(32) NOT NULL COMMENT '来源类型(pdf/doc/md)',
source_id VARCHAR(64) DEFAULT NULL COMMENT '来源标识',
chunk_index INT UNSIGNED NOT NULL COMMENT '段落序号',
content TEXT NOT NULL COMMENT '文本内容',
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
INDEX idx_kc_media (media_file_id),
INDEX idx_kc_source (knowledge_source_id),
FULLTEXT INDEX ft_kc_content (content) WITH PARSER ngram COMMENT 'MySQL全文索引(ngram 中文分词)用于AI检索',
CONSTRAINT fk_kc_media FOREIGN KEY (media_file_id) REFERENCES media_file(id)
ON DELETE CASCADE,
CONSTRAINT fk_kc_source FOREIGN KEY (knowledge_source_id) REFERENCES knowledge_source(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
> 约束说明:`media_file_id` 与 `knowledge_source_id` 二者必居其一(应用层校验,Fail Fast)。
6. question — 题目表
CREATE TABLE question (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
domain ENUM('company','product','sales') NOT NULL
COMMENT '所属知识域',
course_id BIGINT UNSIGNED DEFAULT NULL COMMENT '绑定课程(sales域时可选)',
type ENUM('single','multiple','judge') NOT NULL
COMMENT '题型',
stem TEXT NOT NULL COMMENT '题干',
options JSON NOT NULL COMMENT '选项JSON',
answer JSON NOT NULL COMMENT '正确答案JSON',
explanation TEXT DEFAULT '' COMMENT '答案解析',
status ENUM('active','inactive') NOT NULL DEFAULT 'active',
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
INDEX idx_question_domain (domain),
INDEX idx_question_course (course_id),
INDEX idx_question_status (status),
CONSTRAINT fk_question_course FOREIGN KEY (course_id) REFERENCES course(id)
ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
7. exam_paper — 考试配置表
CREATE TABLE exam_paper (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(128) NOT NULL COMMENT '考试名称',
type ENUM('self_test','formal') NOT NULL
COMMENT '考试类型',
domain VARCHAR(64) NOT NULL COMMENT '抽题知识域(逗号分隔)',
question_count INT UNSIGNED NOT NULL COMMENT '题量',
total_score INT UNSIGNED NOT NULL COMMENT '总分',
pass_score INT UNSIGNED NOT NULL COMMENT '合格线',
duration_minutes INT UNSIGNED NOT NULL COMMENT '考试时长(分钟)',
randomize TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否随机抽题',
status ENUM('active','inactive') NOT NULL DEFAULT 'active',
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
INDEX idx_paper_type (type),
INDEX idx_paper_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
8. exam_record — 考试记录表
CREATE TABLE exam_record (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT UNSIGNED NOT NULL COMMENT '考生ID',
paper_id BIGINT UNSIGNED NOT NULL COMMENT '考试配置ID',
exam_name VARCHAR(128) NOT NULL COMMENT '考试名称(冗余)',
score INT UNSIGNED NOT NULL COMMENT '得分',
total_score INT UNSIGNED NOT NULL COMMENT '总分(冗余)',
pass_score INT UNSIGNED NOT NULL COMMENT '合格线(冗余)',
passed TINYINT(1) NOT NULL COMMENT '是否通过',
correct_count INT UNSIGNED NOT NULL COMMENT '答对数',
wrong_count INT UNSIGNED NOT NULL COMMENT '答错数',
detail_json JSON NOT NULL COMMENT '答题明细JSON',
submitted_at DATETIME(6) NOT NULL COMMENT '交卷时间',
INDEX idx_record_user (user_id),
INDEX idx_record_paper (paper_id),
INDEX idx_record_passed (passed),
INDEX idx_record_submitted (submitted_at),
CONSTRAINT fk_record_user FOREIGN KEY (user_id) REFERENCES user(id)
ON DELETE CASCADE,
CONSTRAINT fk_record_paper FOREIGN KEY (paper_id) REFERENCES exam_paper(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
9. system_config — 系统参数配置表
CREATE TABLE system_config (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
config_key VARCHAR(64) NOT NULL UNIQUE COMMENT '配置键',
config_value TEXT NOT NULL COMMENT '配置值',
description VARCHAR(256) DEFAULT '' COMMENT '配置说明',
updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
INDEX idx_config_key (config_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
默认配置项
| config_key | 默认值 | 说明 |
|---|---|---|
llm_base_url |
http://localhost:11434/v1 |
LLM 服务地址 |
llm_api_key |
sk-xxx |
LLM API Key |
llm_model |
qwen2.5:7b |
LLM 模型名 |
jwt_expire_minutes |
480 |
Token 过期分钟数 |
file_max_size_doc |
209715200 |
文档最大字节(200MB) |
file_max_size_video |
2147483648 |
视频最大字节(2GB) |
chunk_threshold |
104857600 |
分片上传阈值(100MB) |
10. knowledge_source — 结构化知识源表
承载
docs/knowledge_source/*.md的审批与摄入状态。完整设计见04_Backend/BE05_Knowledge_Ingest_Module.md。
CREATE TABLE knowledge_source (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(256) NOT NULL COMMENT '文档标题',
file_path VARCHAR(512) NOT NULL UNIQUE COMMENT 'md 相对路径(docs/knowledge_source/ 下)',
category VARCHAR(64) NOT NULL COMMENT '分类:general/capital_consulting/qualification_counseling/ai_consulting/ai_tools_platform',
domain ENUM('company','product','sales') NOT NULL DEFAULT 'product',
source_version VARCHAR(32) NOT NULL COMMENT '源版本,如 V1.0',
audit_status ENUM('pending','approved','rejected') NOT NULL DEFAULT 'pending',
audit_by BIGINT UNSIGNED DEFAULT NULL COMMENT '审批人ID',
audit_at DATETIME(6) DEFAULT NULL COMMENT '审批时间',
reject_reason VARCHAR(512) DEFAULT NULL COMMENT '驳回理由',
ingested TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已摄入',
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
INDEX idx_ks_status (audit_status),
INDEX idx_ks_category (category),
CONSTRAINT fk_ks_auditor FOREIGN KEY (audit_by) REFERENCES user(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
附:ER 关系
user ──< media_file (submitter_id / audit_by)
user ──< exam_record (user_id)
user ──< question (course_id → course)
user ──< knowledge_source (audit_by)
product ──< course (related_product_id)
course ──< question (course_id, optional)
media_file ──< knowledge_chunk (media_file_id)
knowledge_source ──< knowledge_chunk (knowledge_source_id)
exam_paper ──< exam_record (paper_id)
附:V1.4–V1.7 新增表清单
下表未在本文件给出完整 DDL,字段与建表细节以
docs/changelog.md对应版本及 Go 后端 GORM 模型为准。
| 版本 | 表名 | 用途 |
|---|---|---|
| V1.4 | position |
岗位字典 |
| V1.4 | position_knowledge |
岗位 → 知识映射(域/课程/产品 + 级别 L1-L4 + 权重 + 必学) |
| V1.5 | position_exam_blueprint |
岗位考试蓝图(按域+题型+题量抽题) |
| V1.5 | mistake_record |
错题本(按 user+question 去重,标记已掌握) |
| V1.6 | point_event |
学习积分流水(可审计) |
| V1.6 | certificate |
考试合格证书(按 exam_record 幂等去重) |
| V1.7 | department |
部门字典(部门改名同步 user.department) |
| V1.7 | notification |
站内消息通知(事件钩子驱动) |
列级变更: user.learning_points(V1.6)、user.position_id(V1.4)、user.department(V1.7)、exam_paper.position_id(V1.4)、question.type 增加 essay(V1.5)。