dify
This commit is contained in:
@@ -5,12 +5,15 @@ CREATE TABLE `tb_ai_agent_config` (
|
||||
`id` VARCHAR(50) NOT NULL COMMENT '配置ID',
|
||||
`name` VARCHAR(100) NOT NULL COMMENT '智能体名称',
|
||||
`avatar` VARCHAR(255) DEFAULT NULL COMMENT '智能体头像',
|
||||
`description` VARCHAR(500) DEFAULT NULL COMMENT '智能体描述',
|
||||
`system_prompt` TEXT COMMENT '系统提示词',
|
||||
`model_name` VARCHAR(100) DEFAULT NULL COMMENT '模型名称',
|
||||
`model_provider` VARCHAR(50) DEFAULT NULL COMMENT '模型提供商',
|
||||
`temperature` DECIMAL(3,2) DEFAULT 0.70 COMMENT '温度值',
|
||||
`max_tokens` INT(11) DEFAULT 2000 COMMENT '最大tokens',
|
||||
`top_p` DECIMAL(3,2) DEFAULT 1.00 COMMENT 'Top P值',
|
||||
`dify_app_id` VARCHAR(100) DEFAULT NULL COMMENT 'Dify应用ID',
|
||||
`dify_api_key` VARCHAR(255) DEFAULT NULL COMMENT 'Dify应用API密钥',
|
||||
`status` INT(4) DEFAULT 1 COMMENT '状态(0禁用 1启用)',
|
||||
`creator` VARCHAR(50) DEFAULT NULL COMMENT '创建者',
|
||||
`updater` VARCHAR(50) DEFAULT NULL COMMENT '更新者',
|
||||
@@ -18,53 +21,76 @@ CREATE TABLE `tb_ai_agent_config` (
|
||||
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`delete_time` TIMESTAMP NULL DEFAULT NULL COMMENT '删除时间',
|
||||
`deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
|
||||
PRIMARY KEY (`id`)
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_status` (`status`, `deleted`),
|
||||
KEY `idx_dify_app` (`dify_app_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='智能体配置表';
|
||||
|
||||
|
||||
-- 知识库表
|
||||
-- 知识库表(支持资源权限控制)
|
||||
DROP TABLE IF EXISTS `tb_ai_knowledge`;
|
||||
CREATE TABLE `tb_ai_knowledge` (
|
||||
`id` VARCHAR(50) NOT NULL COMMENT '知识ID',
|
||||
`title` VARCHAR(255) NOT NULL COMMENT '知识标题',
|
||||
`content` LONGTEXT NOT NULL COMMENT '知识内容',
|
||||
`id` VARCHAR(50) NOT NULL COMMENT '知识库ID',
|
||||
`title` VARCHAR(255) NOT NULL COMMENT '知识库标题',
|
||||
`description` VARCHAR(500) DEFAULT NULL COMMENT '知识库描述',
|
||||
`content` LONGTEXT COMMENT '知识内容(手动添加时使用)',
|
||||
`source_type` INT(4) DEFAULT 1 COMMENT '来源类型(1手动添加 2文件导入 3资源同步)',
|
||||
`source_id` VARCHAR(50) DEFAULT NULL COMMENT '来源ID',
|
||||
`file_name` VARCHAR(255) DEFAULT NULL COMMENT '文件名',
|
||||
`file_path` VARCHAR(500) DEFAULT NULL COMMENT '文件路径',
|
||||
`category` VARCHAR(100) DEFAULT NULL COMMENT '分类',
|
||||
`tags` VARCHAR(500) DEFAULT NULL COMMENT '标签(JSON数组)',
|
||||
`dify_dataset_id` VARCHAR(100) DEFAULT NULL COMMENT 'Dify知识库ID(Dataset ID)',
|
||||
`dify_indexing_technique` VARCHAR(50) DEFAULT 'high_quality' COMMENT 'Dify索引方式(high_quality/economy)',
|
||||
`embedding_model` VARCHAR(100) DEFAULT NULL COMMENT '向量模型名称',
|
||||
`vector_id` VARCHAR(100) DEFAULT NULL COMMENT '向量ID(用于向量检索)',
|
||||
`status` INT(4) DEFAULT 1 COMMENT '状态(0禁用 1启用)',
|
||||
`creator` VARCHAR(50) DEFAULT NULL COMMENT '创建者',
|
||||
`document_count` INT(11) DEFAULT 0 COMMENT '文档数量',
|
||||
`total_chunks` INT(11) DEFAULT 0 COMMENT '总分段数',
|
||||
`status` INT(4) DEFAULT 1 COMMENT '状态(0禁用 1启用 2处理中)',
|
||||
`creator` VARCHAR(50) NOT NULL COMMENT '创建者(用户ID)',
|
||||
`creator_dept` VARCHAR(50) DEFAULT NULL COMMENT '创建者部门ID',
|
||||
`updater` VARCHAR(50) DEFAULT NULL COMMENT '更新者',
|
||||
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`delete_time` TIMESTAMP NULL DEFAULT NULL COMMENT '删除时间',
|
||||
`deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_creator` (`creator`, `deleted`),
|
||||
KEY `idx_creator_dept` (`creator_dept`),
|
||||
KEY `idx_source` (`source_type`, `source_id`),
|
||||
KEY `idx_category` (`category`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='知识库表';
|
||||
KEY `idx_status` (`status`, `deleted`),
|
||||
KEY `idx_dify_dataset` (`dify_dataset_id`),
|
||||
KEY `idx_create_time` (`create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='知识库表(resource_type=10,支持权限控制)';
|
||||
|
||||
-- 对话会话表
|
||||
DROP TABLE IF EXISTS `tb_ai_conversation`;
|
||||
CREATE TABLE `tb_ai_conversation` (
|
||||
`id` VARCHAR(50) NOT NULL COMMENT '会话ID',
|
||||
`user_id` VARCHAR(50) NOT NULL COMMENT '用户ID',
|
||||
`title` VARCHAR(255) DEFAULT NULL COMMENT '会话标题',
|
||||
`agent_id` VARCHAR(50) DEFAULT NULL COMMENT '智能体ID',
|
||||
`title` VARCHAR(255) DEFAULT '新对话' COMMENT '会话标题',
|
||||
`summary` VARCHAR(500) DEFAULT NULL COMMENT '对话摘要(AI自动生成)',
|
||||
`dify_conversation_id` VARCHAR(100) DEFAULT NULL COMMENT 'Dify会话ID',
|
||||
`status` INT(4) DEFAULT 1 COMMENT '状态(0已结束 1进行中)',
|
||||
`is_favorite` TINYINT(1) DEFAULT 0 COMMENT '是否收藏(0否 1是)',
|
||||
`is_pinned` TINYINT(1) DEFAULT 0 COMMENT '是否置顶(0否 1是)',
|
||||
`message_count` INT(11) DEFAULT 0 COMMENT '消息数量',
|
||||
`total_tokens` INT(11) DEFAULT 0 COMMENT '总Token消耗',
|
||||
`last_message_time` TIMESTAMP NULL DEFAULT NULL COMMENT '最后消息时间',
|
||||
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_user` (`user_id`),
|
||||
KEY `idx_user_createtime` (`user_id`, `create_time` DESC),
|
||||
KEY `idx_user_favorite` (`user_id`, `is_favorite`),
|
||||
KEY `idx_user_pinned` (`user_id`, `is_pinned`),
|
||||
KEY `idx_agent` (`agent_id`),
|
||||
KEY `idx_dify_conversation` (`dify_conversation_id`),
|
||||
KEY `idx_last_message_time` (`last_message_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='对话会话表';
|
||||
|
||||
-- 对话记录表
|
||||
-- 对话消息表
|
||||
DROP TABLE IF EXISTS `tb_ai_message`;
|
||||
CREATE TABLE `tb_ai_message` (
|
||||
`id` VARCHAR(50) NOT NULL COMMENT '消息ID',
|
||||
@@ -74,32 +100,44 @@ CREATE TABLE `tb_ai_message` (
|
||||
`content` LONGTEXT NOT NULL COMMENT '消息内容',
|
||||
`file_ids` VARCHAR(500) DEFAULT NULL COMMENT '关联文件ID(JSON数组)',
|
||||
`knowledge_ids` VARCHAR(500) DEFAULT NULL COMMENT '引用知识ID(JSON数组)',
|
||||
`knowledge_refs` TEXT DEFAULT NULL COMMENT '知识库引用详情(JSON数组,包含title/snippet/score)',
|
||||
`token_count` INT(11) DEFAULT 0 COMMENT 'Token数量',
|
||||
`dify_message_id` VARCHAR(100) DEFAULT NULL COMMENT 'Dify消息ID',
|
||||
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_conversation` (`conversation_id`),
|
||||
KEY `idx_conversation_createtime` (`conversation_id`, `create_time` ASC),
|
||||
KEY `idx_user` (`user_id`),
|
||||
KEY `idx_create_time` (`create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='对话消息表';
|
||||
KEY `idx_role` (`role`),
|
||||
KEY `idx_create_time` (`create_time`),
|
||||
FULLTEXT KEY `ft_content` (`content`) WITH PARSER ngram
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='对话消息表(支持全文检索)';
|
||||
|
||||
-- 上传文件表
|
||||
DROP TABLE IF EXISTS `tb_ai_upload_file`;
|
||||
CREATE TABLE `tb_ai_upload_file` (
|
||||
`id` VARCHAR(50) NOT NULL COMMENT '文件ID',
|
||||
`user_id` VARCHAR(50) NOT NULL COMMENT '用户ID',
|
||||
`conversation_id` VARCHAR(50) DEFAULT NULL COMMENT '会话ID',
|
||||
`knowledge_id` VARCHAR(50) DEFAULT NULL COMMENT '所属知识库ID',
|
||||
`conversation_id` VARCHAR(50) DEFAULT NULL COMMENT '关联会话ID(对话中上传)',
|
||||
`file_name` VARCHAR(255) NOT NULL COMMENT '文件名',
|
||||
`file_path` VARCHAR(500) NOT NULL COMMENT '文件路径',
|
||||
`file_size` BIGINT(20) DEFAULT 0 COMMENT '文件大小(字节)',
|
||||
`file_type` VARCHAR(50) DEFAULT NULL COMMENT '文件类型',
|
||||
`file_type` VARCHAR(50) DEFAULT NULL COMMENT '文件类型(pdf/txt/docx/md等)',
|
||||
`mime_type` VARCHAR(100) DEFAULT NULL COMMENT 'MIME类型',
|
||||
`extracted_text` LONGTEXT COMMENT '提取的文本内容',
|
||||
`status` INT(4) DEFAULT 1 COMMENT '状态(0处理中 1已完成 2失败)',
|
||||
`dify_document_id` VARCHAR(100) DEFAULT NULL COMMENT 'Dify文档ID',
|
||||
`dify_batch_id` VARCHAR(100) DEFAULT NULL COMMENT 'Dify批次ID',
|
||||
`chunk_count` INT(11) DEFAULT 0 COMMENT '分段数量',
|
||||
`status` INT(4) DEFAULT 0 COMMENT '状态(0上传中 1处理中 2已完成 3失败)',
|
||||
`error_message` VARCHAR(500) DEFAULT NULL COMMENT '错误信息',
|
||||
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
|
||||
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_user` (`user_id`),
|
||||
KEY `idx_knowledge` (`knowledge_id`),
|
||||
KEY `idx_conversation` (`conversation_id`),
|
||||
KEY `idx_dify_document` (`dify_document_id`),
|
||||
KEY `idx_status` (`status`),
|
||||
KEY `idx_create_time` (`create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='上传文件表';
|
||||
|
||||
@@ -108,16 +146,79 @@ DROP TABLE IF EXISTS `tb_ai_usage_statistics`;
|
||||
CREATE TABLE `tb_ai_usage_statistics` (
|
||||
`id` VARCHAR(50) NOT NULL COMMENT '统计ID',
|
||||
`user_id` VARCHAR(50) NOT NULL COMMENT '用户ID',
|
||||
`agent_id` VARCHAR(50) DEFAULT NULL COMMENT '智能体ID(为空表示全局统计)',
|
||||
`stat_date` DATE NOT NULL COMMENT '统计日期',
|
||||
`conversation_count` INT(11) DEFAULT 0 COMMENT '会话数量',
|
||||
`message_count` INT(11) DEFAULT 0 COMMENT '消息数量',
|
||||
`total_tokens` INT(11) DEFAULT 0 COMMENT '总Token数',
|
||||
`file_count` INT(11) DEFAULT 0 COMMENT '上传文件数',
|
||||
`knowledge_query_count` INT(11) DEFAULT 0 COMMENT '知识库查询次数',
|
||||
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_user_date` (`user_id`, `stat_date`),
|
||||
UNIQUE KEY `uk_user_agent_date` (`user_id`, `agent_id`, `stat_date`),
|
||||
KEY `idx_user` (`user_id`),
|
||||
KEY `idx_agent` (`agent_id`),
|
||||
KEY `idx_date` (`stat_date`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='AI使用统计表';
|
||||
|
||||
|
||||
-- ========================================
|
||||
-- 知识库权限控制说明
|
||||
-- ========================================
|
||||
-- 知识库使用统一权限表 tb_resource_permission 进行权限控制
|
||||
-- resource_type = 10 (AI_KNOWLEDGE)
|
||||
--
|
||||
-- 权限逻辑:
|
||||
-- 1. 用户创建知识库时,自动创建权限记录:
|
||||
-- - 为创建者所在部门创建全权限(can_read=1, can_write=1, can_execute=1)
|
||||
-- - 为root_department的superadmin创建全权限
|
||||
--
|
||||
-- 2. 权限查询示例(Java Service层):
|
||||
-- SELECT k.* FROM tb_ai_knowledge k
|
||||
-- INNER JOIN tb_resource_permission rp
|
||||
-- ON rp.resource_type = 10
|
||||
-- AND rp.resource_id = k.id
|
||||
-- AND rp.deleted = 0
|
||||
-- WHERE k.deleted = 0
|
||||
-- AND (
|
||||
-- (rp.dept_id IS NULL AND rp.role_id IS NULL) -- 公开
|
||||
-- OR (rp.dept_id = '用户部门' AND rp.role_id IS NULL)
|
||||
-- OR (rp.dept_id IS NULL AND rp.role_id = '用户角色')
|
||||
-- OR (rp.dept_id = '用户部门' AND rp.role_id = '用户角色')
|
||||
-- )
|
||||
-- AND rp.can_read = 1;
|
||||
--
|
||||
-- 3. 知识库分类权限示例:
|
||||
-- - 公开知识库:dept_id=NULL, role_id=NULL(所有人可读)
|
||||
-- - 部门知识库:dept_id='xxx', role_id=NULL(部门内可读写)
|
||||
-- - 角色知识库:dept_id=NULL, role_id='teacher'(所有教师可读)
|
||||
-- - 私有知识库:仅创建者部门+特定角色可访问
|
||||
--
|
||||
-- ========================================
|
||||
-- 初始化示例数据
|
||||
-- ========================================
|
||||
|
||||
-- 插入默认智能体配置
|
||||
INSERT INTO `tb_ai_agent_config`
|
||||
(`id`, `name`, `avatar`, `description`, `system_prompt`, `model_name`, `model_provider`, `status`, `creator`, `create_time`)
|
||||
VALUES
|
||||
('agent_default_001', '校园助手', '/img/agent/default.png', '我是您的智能校园助手,可以帮助您解答校园相关问题',
|
||||
'你是一个友好、专业的校园助手。你需要基于校园知识库回答用户问题,语气亲切自然。如果知识库中没有相关信息,请诚实告知用户。',
|
||||
'gpt-3.5-turbo', 'openai', 1, '1', NOW());
|
||||
|
||||
-- 插入示例知识库(需要配合权限表使用)
|
||||
INSERT INTO `tb_ai_knowledge`
|
||||
(`id`, `title`, `description`, `category`, `status`, `creator`, `creator_dept`, `create_time`)
|
||||
VALUES
|
||||
('knowledge_demo_001', '校园规章制度', '学校各项规章制度汇总', '规章制度', 1, '1', 'root_department', NOW()),
|
||||
('knowledge_demo_002', '新生入学指南', '新生入学相关事项说明', '入学指导', 1, '1', 'root_department', NOW());
|
||||
|
||||
-- 为示例知识库创建权限(公开可读)
|
||||
-- 注意:实际使用时应该在应用层通过权限服务自动创建
|
||||
-- INSERT INTO `tb_resource_permission`
|
||||
-- (`id`, `resource_type`, `resource_id`, `dept_id`, `role_id`, `can_read`, `can_write`, `can_execute`, `creator`, `create_time`)
|
||||
-- VALUES
|
||||
-- ('perm_ai_kb_001', 10, 'knowledge_demo_001', NULL, NULL, 1, 0, 0, '1', NOW()),
|
||||
-- ('perm_ai_kb_002', 10, 'knowledge_demo_002', NULL, NULL, 1, 0, 0, '1', NOW());
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ use school_news;
|
||||
DROP TABLE IF EXISTS `tb_resource_permission`;
|
||||
CREATE TABLE `tb_resource_permission` (
|
||||
`id` VARCHAR(50) NOT NULL COMMENT '权限ID',
|
||||
`resource_type` INT(4) NOT NULL COMMENT '资源类型(1新闻 2课程 3学习任务 4部门 5角色 6成就 7定时任务 8轮播图 9标签)',
|
||||
`resource_type` INT(4) NOT NULL COMMENT '资源类型(1新闻 2课程 3学习任务 4部门 5角色 6成就 7定时任务 8轮播图 9标签 10AI知识库)',
|
||||
`resource_id` VARCHAR(50) NOT NULL COMMENT '资源ID',
|
||||
`dept_id` VARCHAR(50) DEFAULT NULL COMMENT '部门ID(NULL表示不限制部门)',
|
||||
`role_id` VARCHAR(50) DEFAULT NULL COMMENT '角色ID(NULL表示不限制角色)',
|
||||
@@ -35,6 +35,7 @@ CREATE TABLE `tb_resource_permission` (
|
||||
-- 7 - CRONTAB_TASK (定时任务)
|
||||
-- 8 - BANNER (轮播图)
|
||||
-- 9 - TAG (标签)
|
||||
-- 10 - AI_KNOWLEDGE (AI知识库)
|
||||
-- 注意:这些值必须与 common-core/enums/ResourceType.java 中的枚举定义完全一致
|
||||
--
|
||||
-- 2. dept_id 和 role_id 组合使用:
|
||||
|
||||
@@ -2,7 +2,7 @@ use school_news;
|
||||
|
||||
-- 插入默认超级管理员用户(必须最先创建,因为后续数据的creator都需要引用此用户)
|
||||
INSERT INTO `tb_sys_user` (id, username, password, email, status, create_time) VALUES
|
||||
('1', 'superadmin', '$2a$10$/Bo2SXboVUpYfR6EA.y8puYQaMGBcuNYFY/EkQRY3w27IH56EuEcS', 'superadmin@example.com', 1, now());
|
||||
('1', 'superadmin', '$2a$10$/Bo2SXboVUpYfR6EA.y8puYQaMGBcuNYFY/EkQRY3w27IH56EuEcS', 'superadmin@example.com', 0, now());
|
||||
|
||||
-- 插入默认用户信息数据
|
||||
INSERT INTO `tb_sys_user_info` (id, user_id, full_name, avatar, create_time) VALUES
|
||||
|
||||
Reference in New Issue
Block a user