✅ 已完成功能: 1. 项目基础设施和Docker开发环境 2. 前端React 18 + TypeScript架构 3. 后端Golang + Gin框架 4. 多租户数据库设计 5. 完整API路由系统 6. 智能客服聊天界面 7. 详细文档和部署指南 🔧 技术栈: - 前端:React 18, TypeScript, Vite, Zustand - 后端:Golang, Gin, GORM, PostgreSQL - 部署:Docker, Docker Compose 🎨 设计规范: - 无渐变色,无紫色 - 简洁专业的中性色系 - 响应式布局 📊 状态: - 前端开发服务器:http://localhost:5173 - 后端API服务:http://localhost:8080 - 数据库:PostgreSQL + Redis - 完整的多租户架构 作者:小弟 (大哥的AI助手) 日期:2026-02-27
450 lines
14 KiB
SQL
450 lines
14 KiB
SQL
-- 智能客服系统数据库初始化脚本
|
||
-- 创建时间: 2026-02-27
|
||
-- 作者: 小弟 (大哥的AI助手)
|
||
|
||
-- 启用UUID扩展
|
||
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||
|
||
-- 1. 租户表
|
||
CREATE TABLE tenants (
|
||
id SERIAL PRIMARY KEY,
|
||
name VARCHAR(100) NOT NULL UNIQUE,
|
||
display_name VARCHAR(200),
|
||
description TEXT,
|
||
domain VARCHAR(100) UNIQUE,
|
||
email VARCHAR(100) NOT NULL,
|
||
phone VARCHAR(20),
|
||
|
||
-- 订阅信息
|
||
plan VARCHAR(50) DEFAULT 'free',
|
||
status VARCHAR(20) DEFAULT 'active',
|
||
expires_at TIMESTAMP WITH TIME ZONE,
|
||
|
||
-- 资源配置
|
||
max_users INT DEFAULT 10,
|
||
max_agents INT DEFAULT 5,
|
||
max_storage BIGINT DEFAULT 1073741824, -- 1GB
|
||
max_api_calls INT DEFAULT 1000,
|
||
|
||
-- 使用统计
|
||
user_count INT DEFAULT 0,
|
||
agent_count INT DEFAULT 0,
|
||
storage_used BIGINT DEFAULT 0,
|
||
api_calls_used INT DEFAULT 0,
|
||
|
||
-- 配置
|
||
config JSONB DEFAULT '{}',
|
||
|
||
-- 时间戳
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
deleted_at TIMESTAMP WITH TIME ZONE
|
||
);
|
||
|
||
-- 创建索引
|
||
CREATE INDEX idx_tenants_status ON tenants(status);
|
||
CREATE INDEX idx_tenants_domain ON tenants(domain);
|
||
CREATE INDEX idx_tenants_deleted_at ON tenants(deleted_at);
|
||
|
||
-- 2. 用户表(多租户共享)
|
||
CREATE TABLE users (
|
||
id SERIAL PRIMARY KEY,
|
||
tenant_id INT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
||
username VARCHAR(50) NOT NULL,
|
||
email VARCHAR(100) NOT NULL,
|
||
password VARCHAR(255) NOT NULL,
|
||
phone VARCHAR(20),
|
||
|
||
-- 个人信息
|
||
full_name VARCHAR(100),
|
||
avatar VARCHAR(255),
|
||
bio TEXT,
|
||
|
||
-- 角色和权限
|
||
role VARCHAR(20) DEFAULT 'user',
|
||
status VARCHAR(20) DEFAULT 'active',
|
||
is_verified BOOLEAN DEFAULT FALSE,
|
||
|
||
-- 最后活动
|
||
last_login_at TIMESTAMP WITH TIME ZONE,
|
||
last_ip VARCHAR(45),
|
||
|
||
-- 配置
|
||
preferences JSONB DEFAULT '{}',
|
||
|
||
-- 时间戳
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
deleted_at TIMESTAMP WITH TIME ZONE
|
||
);
|
||
|
||
-- 创建复合索引和唯一约束
|
||
CREATE UNIQUE INDEX idx_users_email_tenant ON users(email, tenant_id);
|
||
CREATE INDEX idx_users_tenant_id ON users(tenant_id);
|
||
CREATE INDEX idx_users_username ON users(username);
|
||
CREATE INDEX idx_users_role ON users(role);
|
||
CREATE INDEX idx_users_status ON users(status);
|
||
CREATE INDEX idx_users_deleted_at ON users(deleted_at);
|
||
|
||
-- 3. 客服坐席表
|
||
CREATE TABLE agents (
|
||
id SERIAL PRIMARY KEY,
|
||
tenant_id INT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
||
user_id INT NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,
|
||
|
||
-- 坐席信息
|
||
agent_id VARCHAR(50) NOT NULL UNIQUE,
|
||
department VARCHAR(100),
|
||
title VARCHAR(100),
|
||
skills JSONB DEFAULT '[]',
|
||
|
||
-- 工作状态
|
||
status VARCHAR(20) DEFAULT 'offline',
|
||
max_chats INT DEFAULT 5,
|
||
current_chats INT DEFAULT 0,
|
||
|
||
-- 绩效统计
|
||
total_chats INT DEFAULT 0,
|
||
avg_rating DECIMAL(3,2) DEFAULT 0,
|
||
response_time_avg INT DEFAULT 0,
|
||
|
||
-- 工作时间
|
||
work_schedule JSONB DEFAULT '{}',
|
||
|
||
-- 时间戳
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- 创建索引
|
||
CREATE INDEX idx_agents_tenant_id ON agents(tenant_id);
|
||
CREATE INDEX idx_agents_user_id ON agents(user_id);
|
||
CREATE INDEX idx_agents_status ON agents(status);
|
||
CREATE INDEX idx_agents_agent_id ON agents(agent_id);
|
||
|
||
-- 4. 会话表
|
||
CREATE TABLE conversations (
|
||
id SERIAL PRIMARY KEY,
|
||
tenant_id INT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
||
channel VARCHAR(50) NOT NULL,
|
||
type VARCHAR(20) NOT NULL,
|
||
|
||
-- 参与者
|
||
customer_id INT REFERENCES users(id) ON DELETE SET NULL,
|
||
customer_name VARCHAR(100),
|
||
customer_email VARCHAR(100),
|
||
customer_phone VARCHAR(20),
|
||
|
||
agent_id INT REFERENCES agents(id) ON DELETE SET NULL,
|
||
department VARCHAR(100),
|
||
|
||
-- 会话信息
|
||
title VARCHAR(200),
|
||
description TEXT,
|
||
tags JSONB DEFAULT '[]',
|
||
priority VARCHAR(20) DEFAULT 'normal',
|
||
|
||
-- 状态
|
||
status VARCHAR(20) DEFAULT 'open',
|
||
source VARCHAR(100),
|
||
referrer VARCHAR(500),
|
||
|
||
-- 统计
|
||
message_count INT DEFAULT 0,
|
||
first_response_at TIMESTAMP WITH TIME ZONE,
|
||
first_response_duration INT DEFAULT 0,
|
||
resolution_at TIMESTAMP WITH TIME ZONE,
|
||
resolution_duration INT DEFAULT 0,
|
||
|
||
-- 满意度
|
||
rating INT CHECK (rating >= 1 AND rating <= 5),
|
||
rating_comment TEXT,
|
||
|
||
-- 元数据
|
||
metadata JSONB DEFAULT '{}',
|
||
|
||
-- 时间戳
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
closed_at TIMESTAMP WITH TIME ZONE
|
||
);
|
||
|
||
-- 创建索引
|
||
CREATE INDEX idx_conversations_tenant_id ON conversations(tenant_id);
|
||
CREATE INDEX idx_conversations_customer_id ON conversations(customer_id);
|
||
CREATE INDEX idx_conversations_agent_id ON conversations(agent_id);
|
||
CREATE INDEX idx_conversations_status ON conversations(status);
|
||
CREATE INDEX idx_conversations_priority ON conversations(priority);
|
||
CREATE INDEX idx_conversations_created_at ON conversations(created_at);
|
||
|
||
-- 5. 消息表
|
||
CREATE TABLE messages (
|
||
id SERIAL PRIMARY KEY,
|
||
tenant_id INT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
||
conversation_id INT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
|
||
|
||
-- 发送者信息
|
||
sender_type VARCHAR(20) NOT NULL,
|
||
sender_id INT REFERENCES users(id) ON DELETE SET NULL,
|
||
sender_name VARCHAR(100),
|
||
sender_avatar VARCHAR(255),
|
||
|
||
-- 消息内容
|
||
content_type VARCHAR(50) DEFAULT 'text',
|
||
content TEXT NOT NULL,
|
||
rich_content JSONB DEFAULT '{}',
|
||
|
||
-- AI相关
|
||
is_ai_response BOOLEAN DEFAULT FALSE,
|
||
ai_model VARCHAR(100),
|
||
ai_prompt_tokens INT DEFAULT 0,
|
||
ai_completion_tokens INT DEFAULT 0,
|
||
ai_total_tokens INT DEFAULT 0,
|
||
|
||
-- 状态
|
||
status VARCHAR(20) DEFAULT 'sent',
|
||
read_by JSONB DEFAULT '[]',
|
||
read_at TIMESTAMP WITH TIME ZONE,
|
||
|
||
-- 回复引用
|
||
reply_to_id INT REFERENCES messages(id) ON DELETE SET NULL,
|
||
|
||
-- 时间戳
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- 创建索引
|
||
CREATE INDEX idx_messages_tenant_id ON messages(tenant_id);
|
||
CREATE INDEX idx_messages_conversation_id ON messages(conversation_id);
|
||
CREATE INDEX idx_messages_sender_id ON messages(sender_id);
|
||
CREATE INDEX idx_messages_sender_type ON messages(sender_type);
|
||
CREATE INDEX idx_messages_created_at ON messages(created_at);
|
||
CREATE INDEX idx_messages_reply_to_id ON messages(reply_to_id);
|
||
|
||
-- 6. 附件表
|
||
CREATE TABLE attachments (
|
||
id SERIAL PRIMARY KEY,
|
||
tenant_id INT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
||
message_id INT NOT NULL REFERENCES messages(id) ON DELETE CASCADE,
|
||
|
||
-- 文件信息
|
||
name VARCHAR(255) NOT NULL,
|
||
type VARCHAR(100) NOT NULL,
|
||
size BIGINT NOT NULL,
|
||
url VARCHAR(500) NOT NULL,
|
||
thumbnail_url VARCHAR(500),
|
||
|
||
-- 元数据
|
||
width INT,
|
||
height INT,
|
||
duration INT,
|
||
|
||
-- 时间戳
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- 创建索引
|
||
CREATE INDEX idx_attachments_tenant_id ON attachments(tenant_id);
|
||
CREATE INDEX idx_attachments_message_id ON attachments(message_id);
|
||
|
||
-- 7. 工单表
|
||
CREATE TABLE tickets (
|
||
id SERIAL PRIMARY KEY,
|
||
tenant_id INT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
||
conversation_id INT REFERENCES conversations(id) ON DELETE SET NULL,
|
||
|
||
-- 工单信息
|
||
ticket_number VARCHAR(50) NOT NULL UNIQUE,
|
||
title VARCHAR(200) NOT NULL,
|
||
description TEXT NOT NULL,
|
||
category VARCHAR(100),
|
||
subcategory VARCHAR(100),
|
||
tags JSONB DEFAULT '[]',
|
||
priority VARCHAR(20) DEFAULT 'normal',
|
||
|
||
-- 参与者
|
||
customer_id INT REFERENCES users(id) ON DELETE SET NULL,
|
||
customer_name VARCHAR(100),
|
||
customer_email VARCHAR(100),
|
||
|
||
assigned_agent_id INT REFERENCES agents(id) ON DELETE SET NULL,
|
||
assigned_department VARCHAR(100),
|
||
|
||
-- 状态
|
||
status VARCHAR(20) DEFAULT 'open',
|
||
source VARCHAR(100),
|
||
|
||
-- SLA管理
|
||
sla_level VARCHAR(50),
|
||
due_at TIMESTAMP WITH TIME ZONE,
|
||
first_response_due_at TIMESTAMP WITH TIME ZONE,
|
||
resolution_due_at TIMESTAMP WITH TIME ZONE,
|
||
|
||
-- 统计
|
||
first_response_at TIMESTAMP WITH TIME ZONE,
|
||
first_response_duration INT DEFAULT 0,
|
||
resolution_at TIMESTAMP WITH TIME ZONE,
|
||
resolution_duration INT DEFAULT 0,
|
||
|
||
-- 满意度
|
||
rating INT CHECK (rating >= 1 AND rating <= 5),
|
||
rating_comment TEXT,
|
||
|
||
-- 元数据
|
||
metadata JSONB DEFAULT '{}',
|
||
|
||
-- 时间戳
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
closed_at TIMESTAMP WITH TIME ZONE
|
||
);
|
||
|
||
-- 创建索引
|
||
CREATE INDEX idx_tickets_tenant_id ON tickets(tenant_id);
|
||
CREATE INDEX idx_tickets_ticket_number ON tickets(ticket_number);
|
||
CREATE INDEX idx_tickets_customer_id ON tickets(customer_id);
|
||
CREATE INDEX idx_tickets_assigned_agent_id ON tickets(assigned_agent_id);
|
||
CREATE INDEX idx_tickets_status ON tickets(status);
|
||
CREATE INDEX idx_tickets_priority ON tickets(priority);
|
||
CREATE INDEX idx_tickets_due_at ON tickets(due_at);
|
||
CREATE INDEX idx_tickets_created_at ON tickets(created_at);
|
||
|
||
-- 8. 知识库表
|
||
CREATE TABLE knowledge_base (
|
||
id SERIAL PRIMARY KEY,
|
||
tenant_id INT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
||
|
||
-- 知识条目
|
||
title VARCHAR(200) NOT NULL,
|
||
content TEXT NOT NULL,
|
||
summary TEXT,
|
||
category VARCHAR(100),
|
||
tags JSONB DEFAULT '[]',
|
||
|
||
-- 状态
|
||
status VARCHAR(20) DEFAULT 'draft',
|
||
visibility VARCHAR(20) DEFAULT 'private',
|
||
|
||
-- 统计
|
||
view_count INT DEFAULT 0,
|
||
helpful_count INT DEFAULT 0,
|
||
not_helpful_count INT DEFAULT 0,
|
||
|
||
-- AI训练
|
||
is_trained BOOLEAN DEFAULT FALSE,
|
||
training_status VARCHAR(50),
|
||
last_trained_at TIMESTAMP WITH TIME ZONE,
|
||
|
||
-- 元数据
|
||
metadata JSONB DEFAULT '{}',
|
||
|
||
-- 作者信息
|
||
author_id INT REFERENCES users(id) ON DELETE SET NULL,
|
||
author_name VARCHAR(100),
|
||
|
||
-- 时间戳
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
published_at TIMESTAMP WITH TIME ZONE
|
||
);
|
||
|
||
-- 创建索引
|
||
CREATE INDEX idx_knowledge_base_tenant_id ON knowledge_base(tenant_id);
|
||
CREATE INDEX idx_knowledge_base_category ON knowledge_base(category);
|
||
CREATE INDEX idx_knowledge_base_status ON knowledge_base(status);
|
||
CREATE INDEX idx_knowledge_base_visibility ON knowledge_base(visibility);
|
||
CREATE INDEX idx_knowledge_base_tags ON knowledge_base USING GIN(tags);
|
||
|
||
-- 9. 系统配置表
|
||
CREATE TABLE system_configs (
|
||
id SERIAL PRIMARY KEY,
|
||
tenant_id INT REFERENCES tenants(id) ON DELETE CASCADE,
|
||
config_key VARCHAR(100) NOT NULL,
|
||
config_value JSONB NOT NULL,
|
||
config_type VARCHAR(50) DEFAULT 'string',
|
||
description TEXT,
|
||
|
||
-- 作用域
|
||
scope VARCHAR(50) DEFAULT 'tenant', -- system, tenant, user
|
||
is_public BOOLEAN DEFAULT FALSE,
|
||
|
||
-- 时间戳
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- 创建唯一约束和索引
|
||
CREATE UNIQUE INDEX idx_system_configs_key_tenant ON system_configs(config_key, tenant_id);
|
||
CREATE INDEX idx_system_configs_scope ON system_configs(scope);
|
||
|
||
-- 10. 审计日志表
|
||
CREATE TABLE audit_logs (
|
||
id SERIAL PRIMARY KEY,
|
||
tenant_id INT REFERENCES tenants(id) ON DELETE CASCADE,
|
||
|
||
-- 操作信息
|
||
action VARCHAR(100) NOT NULL,
|
||
resource_type VARCHAR(50) NOT NULL,
|
||
resource_id VARCHAR(100),
|
||
resource_name VARCHAR(200),
|
||
|
||
-- 用户信息
|
||
user_id INT REFERENCES users(id) ON DELETE SET NULL,
|
||
user_name VARCHAR(100),
|
||
user_ip VARCHAR(45),
|
||
user_agent TEXT,
|
||
|
||
-- 变更详情
|
||
old_values JSONB,
|
||
new_values JSONB,
|
||
changes JSONB,
|
||
|
||
-- 结果
|
||
status VARCHAR(20) DEFAULT 'success',
|
||
error_message TEXT,
|
||
|
||
-- 时间戳
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- 创建索引
|
||
CREATE INDEX idx_audit_logs_tenant_id ON audit_logs(tenant_id);
|
||
CREATE INDEX idx_audit_logs_user_id ON audit_logs(user_id);
|
||
CREATE INDEX idx_audit_logs_action ON audit_logs(action);
|
||
CREATE INDEX idx_audit_logs_resource_type ON audit_logs(resource_type);
|
||
CREATE INDEX idx_audit_logs_created_at ON audit_logs(created_at);
|
||
|
||
-- 插入默认系统配置
|
||
INSERT INTO system_configs (config_key, config_value, config_type, description, scope, is_public)
|
||
VALUES
|
||
('system.name', '"智能客服系统"', 'string', '系统名称', 'system', TRUE),
|
||
('system.version', '"1.0.0"', 'string', '系统版本', 'system', TRUE),
|
||
('system.maintenance', 'false', 'boolean', '系统维护状态', 'system', TRUE),
|
||
('ai.default_model', '"gpt-3.5-turbo"', 'string', '默认AI模型', 'system', FALSE),
|
||
('ai.max_tokens', '1000', 'number', 'AI最大token数', 'system', FALSE),
|
||
('ai.temperature', '0.7', 'number', 'AI温度参数', 'system', FALSE),
|
||
('sla.first_response', '3600', 'number', '首次响应SLA(秒)', 'system', FALSE),
|
||
('sla.resolution', '86400', 'number', '解决SLA(秒)', 'system', FALSE);
|
||
|
||
-- 创建默认管理员租户
|
||
INSERT INTO tenants (name, display_name, description, domain, email, phone, plan, max_users, max_agents)
|
||
VALUES
|
||
('admin', '系统管理租户', '系统默认管理租户', 'admin.local', 'admin@example.com', '13800138000', 'enterprise', 100, 50);
|
||
|
||
-- 创建默认管理员用户
|
||
INSERT INTO users (tenant_id, username, email, password, full_name, role, is_verified)
|
||
SELECT
|
||
id,
|
||
'admin',
|
||
'admin@example.com',
|
||
-- 密码: admin123 (bcrypt hash)
|
||
'$2a$10$N9qo8uLOickgx2ZMRZoMye3Z7c7K8pB7J7B7J7B7J7B7J7B7J7B7J',
|
||
'系统管理员',
|
||
'super_admin',
|
||
TRUE
|
||
FROM tenants WHERE name = 'admin';
|
||
|
||
-- 输出完成信息
|
||
SELECT '数据库初始化完成!' AS message;
|