init: 数字员工平台初始代码
包含前端(Vue3 + VueFlow 画布)、后端(Go)、文档体系。 - 工作台画布:节点拖放、连线模式、右键菜单、AI 助手 - 后端:连接器 API、专员种子数据 - 导航:左侧导航、工坊、市场、控制台
This commit is contained in:
@@ -0,0 +1,336 @@
|
||||
# eaisalestrain_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` — 用户表
|
||||
|
||||
```sql
|
||||
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` — 产品表
|
||||
|
||||
```sql
|
||||
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` — 课程表
|
||||
|
||||
```sql
|
||||
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` — 素材文件表
|
||||
|
||||
```sql
|
||||
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` — 知识块表
|
||||
|
||||
```sql
|
||||
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` — 题目表
|
||||
|
||||
```sql
|
||||
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` — 考试配置表
|
||||
|
||||
```sql
|
||||
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` — 考试记录表
|
||||
|
||||
```sql
|
||||
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` — 系统参数配置表
|
||||
|
||||
```sql
|
||||
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`。
|
||||
|
||||
```sql
|
||||
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)。
|
||||
Reference in New Issue
Block a user