- 创建 collaboration_manager.py 协作管理模块 - CollaborationManager: 协作管理主类 - 项目分享链接管理 - 支持只读/评论/编辑/管理员权限 - 评论和批注系统 - 支持实体、关系、转录文本评论 - 变更历史追踪 - 记录所有数据操作变更 - 团队成员管理 - 支持多角色权限控制 - 更新 schema.sql 添加协作相关数据库表 - project_shares: 项目分享表 - comments: 评论表 - change_history: 变更历史表 - team_members: 团队成员表 - 更新 main.py 添加协作相关 API 端点 - 项目分享相关端点 - 评论和批注相关端点 - 变更历史相关端点 - 团队成员管理端点 - 更新 README.md 和 STATUS.md
268 lines
11 KiB
SQL
268 lines
11 KiB
SQL
-- InsightFlow Phase 3 - Database Schema
|
||
-- 支持知识生长与多文件融合
|
||
|
||
-- 项目表
|
||
CREATE TABLE IF NOT EXISTS projects (
|
||
id TEXT PRIMARY KEY,
|
||
name TEXT NOT NULL,
|
||
description TEXT,
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- 文件/转录表
|
||
CREATE TABLE IF NOT EXISTS transcripts (
|
||
id TEXT PRIMARY KEY,
|
||
project_id TEXT NOT NULL,
|
||
filename TEXT,
|
||
full_text TEXT,
|
||
type TEXT DEFAULT 'audio', -- 'audio' 或 'document'
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
FOREIGN KEY (project_id) REFERENCES projects(id)
|
||
);
|
||
|
||
-- 全局实体表(跨文件共享)
|
||
CREATE TABLE IF NOT EXISTS entities (
|
||
id TEXT PRIMARY KEY,
|
||
project_id TEXT NOT NULL,
|
||
name TEXT NOT NULL,
|
||
canonical_name TEXT, -- 规范名称(用于对齐)
|
||
type TEXT,
|
||
definition TEXT,
|
||
aliases TEXT, -- JSON 数组:["别名1", "别名2"]
|
||
embedding TEXT, -- JSON 数组:实体名称+定义的 embedding
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
FOREIGN KEY (project_id) REFERENCES projects(id)
|
||
);
|
||
|
||
-- 实体提及表(文件中的具体位置)
|
||
CREATE TABLE IF NOT EXISTS entity_mentions (
|
||
id TEXT PRIMARY KEY,
|
||
entity_id TEXT NOT NULL,
|
||
transcript_id TEXT NOT NULL,
|
||
start_pos INTEGER,
|
||
end_pos INTEGER,
|
||
text_snippet TEXT,
|
||
confidence REAL DEFAULT 1.0,
|
||
FOREIGN KEY (entity_id) REFERENCES entities(id),
|
||
FOREIGN KEY (transcript_id) REFERENCES transcripts(id)
|
||
);
|
||
|
||
-- 实体关系表
|
||
CREATE TABLE IF NOT EXISTS entity_relations (
|
||
id TEXT PRIMARY KEY,
|
||
project_id TEXT NOT NULL,
|
||
source_entity_id TEXT NOT NULL,
|
||
target_entity_id TEXT NOT NULL,
|
||
relation_type TEXT, -- "belongs_to", "works_with", "depends_on" 等
|
||
evidence TEXT, -- 关系来源文本
|
||
transcript_id TEXT,
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
FOREIGN KEY (project_id) REFERENCES projects(id),
|
||
FOREIGN KEY (source_entity_id) REFERENCES entities(id),
|
||
FOREIGN KEY (target_entity_id) REFERENCES entities(id)
|
||
);
|
||
|
||
-- 术语表(项目级热词,用于 ASR 优化)
|
||
CREATE TABLE IF NOT EXISTS glossary (
|
||
id TEXT PRIMARY KEY,
|
||
project_id TEXT NOT NULL,
|
||
term TEXT NOT NULL,
|
||
pronunciation TEXT, -- 发音提示,如 "K8s" -> "Kubernetes"
|
||
frequency INTEGER DEFAULT 1,
|
||
FOREIGN KEY (project_id) REFERENCES projects(id)
|
||
);
|
||
|
||
-- Phase 5: 属性模板表
|
||
CREATE TABLE IF NOT EXISTS attribute_templates (
|
||
id TEXT PRIMARY KEY,
|
||
project_id TEXT NOT NULL,
|
||
name TEXT NOT NULL,
|
||
type TEXT NOT NULL, -- text/number/date/select/multiselect
|
||
description TEXT,
|
||
options TEXT, -- JSON 数组,用于 select/multiselect 类型
|
||
is_required INTEGER DEFAULT 0,
|
||
default_value TEXT,
|
||
sort_order INTEGER DEFAULT 0,
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
FOREIGN KEY (project_id) REFERENCES projects(id)
|
||
);
|
||
|
||
-- Phase 5: 实体属性值表
|
||
CREATE TABLE IF NOT EXISTS entity_attributes (
|
||
id TEXT PRIMARY KEY,
|
||
entity_id TEXT NOT NULL,
|
||
template_id TEXT,
|
||
name TEXT NOT NULL,
|
||
type TEXT NOT NULL, -- text/number/date/select/multiselect
|
||
value TEXT, -- 存储实际值
|
||
options TEXT, -- JSON 数组,用于 select/multiselect
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE,
|
||
FOREIGN KEY (template_id) REFERENCES attribute_templates(id) ON DELETE SET NULL,
|
||
UNIQUE(entity_id, name)
|
||
);
|
||
|
||
-- Phase 5: 属性变更历史表
|
||
CREATE TABLE IF NOT EXISTS attribute_history (
|
||
id TEXT PRIMARY KEY,
|
||
entity_id TEXT NOT NULL,
|
||
attribute_name TEXT NOT NULL,
|
||
old_value TEXT,
|
||
new_value TEXT,
|
||
changed_by TEXT, -- 用户ID或系统
|
||
changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
change_reason TEXT,
|
||
FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE
|
||
);
|
||
|
||
-- Phase 5: 属性模板表(项目级自定义属性定义)
|
||
CREATE TABLE IF NOT EXISTS attribute_templates (
|
||
id TEXT PRIMARY KEY,
|
||
project_id TEXT NOT NULL,
|
||
name TEXT NOT NULL, -- 属性名称,如"年龄"、"职位"
|
||
type TEXT NOT NULL, -- 属性类型: text, number, date, select, multiselect, boolean
|
||
options TEXT, -- JSON 数组,用于 select/multiselect 类型
|
||
default_value TEXT, -- 默认值
|
||
description TEXT, -- 属性描述
|
||
is_required BOOLEAN DEFAULT 0, -- 是否必填
|
||
display_order INTEGER DEFAULT 0, -- 显示顺序
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
FOREIGN KEY (project_id) REFERENCES projects(id)
|
||
);
|
||
|
||
-- Phase 5: 实体属性值表
|
||
CREATE TABLE IF NOT EXISTS entity_attributes (
|
||
id TEXT PRIMARY KEY,
|
||
entity_id TEXT NOT NULL,
|
||
template_id TEXT NOT NULL,
|
||
value TEXT, -- 属性值(以JSON或字符串形式存储)
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE,
|
||
FOREIGN KEY (template_id) REFERENCES attribute_templates(id) ON DELETE CASCADE,
|
||
UNIQUE(entity_id, template_id) -- 每个实体每个属性只能有一个值
|
||
);
|
||
|
||
-- Phase 5: 属性变更历史表
|
||
CREATE TABLE IF NOT EXISTS attribute_history (
|
||
id TEXT PRIMARY KEY,
|
||
entity_id TEXT NOT NULL,
|
||
template_id TEXT NOT NULL,
|
||
old_value TEXT,
|
||
new_value TEXT,
|
||
changed_by TEXT, -- 用户ID或"system"
|
||
changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
change_reason TEXT, -- 变更原因
|
||
FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE,
|
||
FOREIGN KEY (template_id) REFERENCES attribute_templates(id) ON DELETE CASCADE
|
||
);
|
||
|
||
-- 创建索引以提高查询性能
|
||
CREATE INDEX IF NOT EXISTS idx_entities_project ON entities(project_id);
|
||
CREATE INDEX IF NOT EXISTS idx_entities_name ON entities(name);
|
||
CREATE INDEX IF NOT EXISTS idx_transcripts_project ON transcripts(project_id);
|
||
CREATE INDEX IF NOT EXISTS idx_mentions_entity ON entity_mentions(entity_id);
|
||
CREATE INDEX IF NOT EXISTS idx_mentions_transcript ON entity_mentions(transcript_id);
|
||
CREATE INDEX IF NOT EXISTS idx_relations_project ON entity_relations(project_id);
|
||
CREATE INDEX IF NOT EXISTS idx_glossary_project ON glossary(project_id);
|
||
|
||
-- Phase 5: 属性相关索引
|
||
CREATE INDEX IF NOT EXISTS idx_attr_templates_project ON attribute_templates(project_id);
|
||
CREATE INDEX IF NOT EXISTS idx_entity_attributes_entity ON entity_attributes(entity_id);
|
||
CREATE INDEX IF NOT EXISTS idx_entity_attributes_template ON entity_attributes(template_id);
|
||
CREATE INDEX IF NOT EXISTS idx_attr_history_entity ON attribute_history(entity_id);
|
||
|
||
-- Phase 7: 协作与共享 - 项目分享表
|
||
CREATE TABLE IF NOT EXISTS project_shares (
|
||
id TEXT PRIMARY KEY,
|
||
project_id TEXT NOT NULL,
|
||
token TEXT NOT NULL UNIQUE, -- 分享令牌
|
||
permission TEXT DEFAULT 'read_only', -- 权限级别: read_only, comment, edit, admin
|
||
created_by TEXT NOT NULL, -- 创建者
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
expires_at TIMESTAMP, -- 过期时间
|
||
max_uses INTEGER, -- 最大使用次数
|
||
use_count INTEGER DEFAULT 0, -- 已使用次数
|
||
password_hash TEXT, -- 密码保护(哈希)
|
||
is_active BOOLEAN DEFAULT 1, -- 是否激活
|
||
allow_download BOOLEAN DEFAULT 0, -- 允许下载
|
||
allow_export BOOLEAN DEFAULT 0, -- 允许导出
|
||
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
|
||
);
|
||
|
||
-- Phase 7: 协作与共享 - 评论表
|
||
CREATE TABLE IF NOT EXISTS comments (
|
||
id TEXT PRIMARY KEY,
|
||
project_id TEXT NOT NULL,
|
||
target_type TEXT NOT NULL, -- 目标类型: entity, relation, transcript, project
|
||
target_id TEXT NOT NULL, -- 目标ID
|
||
parent_id TEXT, -- 父评论ID(支持回复)
|
||
author TEXT NOT NULL, -- 作者ID
|
||
author_name TEXT, -- 作者显示名
|
||
content TEXT NOT NULL, -- 评论内容
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
resolved BOOLEAN DEFAULT 0, -- 是否已解决
|
||
resolved_by TEXT, -- 解决者
|
||
resolved_at TIMESTAMP, -- 解决时间
|
||
mentions TEXT, -- JSON数组: 提及的用户
|
||
attachments TEXT, -- JSON数组: 附件
|
||
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
||
FOREIGN KEY (parent_id) REFERENCES comments(id) ON DELETE CASCADE
|
||
);
|
||
|
||
-- Phase 7: 协作与共享 - 变更历史表
|
||
CREATE TABLE IF NOT EXISTS change_history (
|
||
id TEXT PRIMARY KEY,
|
||
project_id TEXT NOT NULL,
|
||
change_type TEXT NOT NULL, -- 变更类型: create, update, delete, merge, split
|
||
entity_type TEXT NOT NULL, -- 实体类型: entity, relation, transcript, project
|
||
entity_id TEXT NOT NULL, -- 实体ID
|
||
entity_name TEXT, -- 实体名称(用于显示)
|
||
changed_by TEXT NOT NULL, -- 变更者ID
|
||
changed_by_name TEXT, -- 变更者显示名
|
||
changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
old_value TEXT, -- JSON: 旧值
|
||
new_value TEXT, -- JSON: 新值
|
||
description TEXT, -- 变更描述
|
||
session_id TEXT, -- 会话ID(批量变更关联)
|
||
reverted BOOLEAN DEFAULT 0, -- 是否已回滚
|
||
reverted_at TIMESTAMP, -- 回滚时间
|
||
reverted_by TEXT, -- 回滚者
|
||
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
|
||
);
|
||
|
||
-- Phase 7: 协作与共享 - 团队成员表
|
||
CREATE TABLE IF NOT EXISTS team_members (
|
||
id TEXT PRIMARY KEY,
|
||
project_id TEXT NOT NULL,
|
||
user_id TEXT NOT NULL, -- 用户ID
|
||
user_name TEXT, -- 用户名
|
||
user_email TEXT, -- 用户邮箱
|
||
role TEXT DEFAULT 'viewer', -- 角色: owner, admin, editor, viewer, commenter
|
||
joined_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
invited_by TEXT, -- 邀请者
|
||
last_active_at TIMESTAMP, -- 最后活跃时间
|
||
permissions TEXT, -- JSON数组: 具体权限列表
|
||
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
||
UNIQUE(project_id, user_id) -- 每个项目每个用户只能有一条记录
|
||
);
|
||
|
||
-- Phase 7: 协作与共享索引
|
||
CREATE INDEX IF NOT EXISTS idx_shares_project ON project_shares(project_id);
|
||
CREATE INDEX IF NOT EXISTS idx_shares_token ON project_shares(token);
|
||
CREATE INDEX IF NOT EXISTS idx_comments_project ON comments(project_id);
|
||
CREATE INDEX IF NOT EXISTS idx_comments_target ON comments(target_type, target_id);
|
||
CREATE INDEX IF NOT EXISTS idx_comments_parent ON comments(parent_id);
|
||
CREATE INDEX IF NOT EXISTS idx_change_history_project ON change_history(project_id);
|
||
CREATE INDEX IF NOT EXISTS idx_change_history_entity ON change_history(entity_type, entity_id);
|
||
CREATE INDEX IF NOT EXISTS idx_change_history_session ON change_history(session_id);
|
||
CREATE INDEX IF NOT EXISTS idx_team_members_project ON team_members(project_id);
|
||
CREATE INDEX IF NOT EXISTS idx_team_members_user ON team_members(user_id);
|