- 前端 React+TypeScript (源码+构建产物) - 后端 Python FastAPI - 数据库迁移 001-015 - Docker部署配置 - 微信ClawBot API频道绑定 - 项目文档 README.md
729 lines
29 KiB
SQL
729 lines
29 KiB
SQL
-- AI智能自动化PaaS平台 - 完整数据库建表脚本
|
|
-- 数据库: MySQL 8
|
|
-- 编码: utf8mb4
|
|
|
|
CREATE DATABASE IF NOT EXISTS aiflow DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
USE aiflow;
|
|
|
|
-- ============================================================
|
|
-- 用户与权限相关表
|
|
-- ============================================================
|
|
|
|
-- 用户表
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
username VARCHAR(50) NOT NULL UNIQUE,
|
|
email VARCHAR(100) DEFAULT NULL,
|
|
phone VARCHAR(20) DEFAULT NULL,
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
avatar VARCHAR(500) DEFAULT NULL,
|
|
role ENUM('user', 'admin') NOT NULL DEFAULT 'user',
|
|
status ENUM('active', 'banned') NOT NULL DEFAULT 'active',
|
|
real_name_status ENUM('unverified', 'verified') NOT NULL DEFAULT 'unverified',
|
|
real_name VARCHAR(50) DEFAULT NULL,
|
|
id_card VARCHAR(20) DEFAULT NULL,
|
|
membership_plan_id VARCHAR(36) DEFAULT NULL,
|
|
membership_level INT DEFAULT 0,
|
|
membership_expire_at DATETIME DEFAULT NULL,
|
|
auto_renew TINYINT(1) DEFAULT 0,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_users_email (email),
|
|
INDEX idx_users_phone (phone),
|
|
INDEX idx_users_role (role),
|
|
INDEX idx_users_status (status)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 登录日志表
|
|
CREATE TABLE IF NOT EXISTS login_logs (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
ip VARCHAR(45) DEFAULT NULL,
|
|
user_agent VARCHAR(500) DEFAULT NULL,
|
|
login_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_login_logs_user (user_id),
|
|
INDEX idx_login_logs_time (login_at),
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- API密钥表
|
|
CREATE TABLE IF NOT EXISTS api_keys (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
api_key VARCHAR(64) NOT NULL UNIQUE,
|
|
secret VARCHAR(128) NOT NULL,
|
|
name VARCHAR(100) DEFAULT NULL,
|
|
status ENUM('active', 'revoked') NOT NULL DEFAULT 'active',
|
|
last_used_at DATETIME DEFAULT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
expired_at DATETIME DEFAULT NULL,
|
|
INDEX idx_api_keys_user (user_id),
|
|
INDEX idx_api_keys_key (api_key),
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ============================================================
|
|
-- AI聊天与频道相关表
|
|
-- ============================================================
|
|
|
|
-- 对话会话表
|
|
CREATE TABLE IF NOT EXISTS conversations (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
title VARCHAR(200) NOT NULL DEFAULT '新对话',
|
|
model_id VARCHAR(36) DEFAULT NULL,
|
|
status ENUM('active', 'archived') NOT NULL DEFAULT 'active',
|
|
pinned TINYINT(1) DEFAULT 0,
|
|
knowledge_graph_count INT DEFAULT 0,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_conv_user (user_id),
|
|
INDEX idx_conv_status (status),
|
|
INDEX idx_conv_updated (updated_at),
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 对话消息表
|
|
CREATE TABLE IF NOT EXISTS messages (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
conversation_id VARCHAR(36) NOT NULL,
|
|
role ENUM('user', 'assistant', 'system') NOT NULL,
|
|
content TEXT NOT NULL,
|
|
token_used INT DEFAULT 0,
|
|
model_id VARCHAR(36) DEFAULT NULL,
|
|
knowledge_ids JSON DEFAULT NULL,
|
|
agent_ids JSON DEFAULT NULL,
|
|
skill_ids JSON DEFAULT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_msg_conv (conversation_id),
|
|
INDEX idx_msg_created (created_at),
|
|
FOREIGN KEY (conversation_id) REFERENCES conversations(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 频道表
|
|
CREATE TABLE IF NOT EXISTS channels (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
owner_id VARCHAR(36) NOT NULL,
|
|
name VARCHAR(100) NOT NULL,
|
|
description TEXT DEFAULT NULL,
|
|
platform ENUM('feishu', 'wechat', 'dingtalk', 'whatsapp', 'telegram', 'slack') NOT NULL,
|
|
account_name VARCHAR(100) DEFAULT NULL,
|
|
default_agent_id VARCHAR(36) DEFAULT NULL,
|
|
default_skill_id VARCHAR(36) DEFAULT NULL,
|
|
knowledge_base_id VARCHAR(36) DEFAULT NULL,
|
|
bound_model_id VARCHAR(36) DEFAULT NULL,
|
|
features JSON DEFAULT NULL,
|
|
status ENUM('connected', 'pending', 'disconnected') NOT NULL DEFAULT 'pending',
|
|
last_active DATETIME DEFAULT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_ch_owner (owner_id),
|
|
INDEX idx_ch_status (status),
|
|
FOREIGN KEY (owner_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 频道成员表
|
|
CREATE TABLE IF NOT EXISTS channel_members (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
channel_id VARCHAR(36) NOT NULL,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
role ENUM('owner', 'member') NOT NULL DEFAULT 'member',
|
|
joined_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_cm_channel (channel_id),
|
|
INDEX idx_cm_user (user_id),
|
|
UNIQUE KEY uk_channel_user (channel_id, user_id),
|
|
FOREIGN KEY (channel_id) REFERENCES channels(id),
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 频道消息表
|
|
CREATE TABLE IF NOT EXISTS channel_messages (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
channel_id VARCHAR(36) NOT NULL,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
role ENUM('user', 'assistant', 'system') NOT NULL,
|
|
content TEXT NOT NULL,
|
|
token_used INT DEFAULT 0,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_chmsg_channel (channel_id),
|
|
FOREIGN KEY (channel_id) REFERENCES channels(id),
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ============================================================
|
|
-- 知识库相关表
|
|
-- ============================================================
|
|
|
|
-- 知识库表
|
|
CREATE TABLE IF NOT EXISTS knowledge_bases (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
name VARCHAR(200) NOT NULL,
|
|
description TEXT DEFAULT NULL,
|
|
directory_path VARCHAR(500) DEFAULT '/',
|
|
document_count INT DEFAULT 0,
|
|
knowledge_graph_count INT DEFAULT 0,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_kb_user (user_id),
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 知识目录表
|
|
CREATE TABLE IF NOT EXISTS knowledge_directories (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
knowledge_base_id VARCHAR(36) DEFAULT NULL,
|
|
parent_id VARCHAR(36) DEFAULT NULL,
|
|
name VARCHAR(200) NOT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_kd_user (user_id),
|
|
INDEX idx_kd_kb (knowledge_base_id),
|
|
INDEX idx_kd_parent (parent_id),
|
|
FOREIGN KEY (user_id) REFERENCES users(id),
|
|
FOREIGN KEY (knowledge_base_id) REFERENCES knowledge_bases(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 知识文档表
|
|
CREATE TABLE IF NOT EXISTS knowledge_documents (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
knowledge_base_id VARCHAR(36) NOT NULL,
|
|
directory_id VARCHAR(36) DEFAULT NULL,
|
|
filename VARCHAR(255) NOT NULL,
|
|
file_type VARCHAR(20) NOT NULL,
|
|
file_size BIGINT DEFAULT 0,
|
|
file_path VARCHAR(500) DEFAULT NULL,
|
|
status ENUM('uploading', 'processing', 'completed', 'failed') NOT NULL DEFAULT 'uploading',
|
|
chunk_count INT DEFAULT 0,
|
|
error_message TEXT DEFAULT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_kdoc_kb (knowledge_base_id),
|
|
INDEX idx_kdoc_dir (directory_id),
|
|
INDEX idx_kdoc_status (status),
|
|
FOREIGN KEY (knowledge_base_id) REFERENCES knowledge_bases(id),
|
|
FOREIGN KEY (directory_id) REFERENCES knowledge_directories(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ============================================================
|
|
-- 应用市场相关表
|
|
-- ============================================================
|
|
|
|
-- 应用市场表
|
|
CREATE TABLE IF NOT EXISTS market_apps (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
name VARCHAR(200) NOT NULL,
|
|
type ENUM('skill', 'agent', 'mcp') NOT NULL,
|
|
source ENUM('official', 'user') NOT NULL DEFAULT 'user',
|
|
publisher_id VARCHAR(36) DEFAULT NULL,
|
|
publisher_name VARCHAR(100) DEFAULT NULL,
|
|
description TEXT DEFAULT NULL,
|
|
icon VARCHAR(500) DEFAULT NULL,
|
|
tutorial TEXT DEFAULT NULL,
|
|
price DECIMAL(10,2) NOT NULL DEFAULT 0.00,
|
|
is_member_free TINYINT(1) DEFAULT 0,
|
|
join_promotion TINYINT(1) DEFAULT 0,
|
|
status ENUM('pending', 'published', 'removed') NOT NULL DEFAULT 'pending',
|
|
rating_avg DECIMAL(3,2) DEFAULT 0.00,
|
|
review_count INT DEFAULT 0,
|
|
install_count INT DEFAULT 0,
|
|
skill_content TEXT DEFAULT NULL,
|
|
mcp_transport ENUM('streamable_http', 'sse') DEFAULT NULL,
|
|
agent_endpoint VARCHAR(500) DEFAULT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_ma_type (type),
|
|
INDEX idx_ma_source (source),
|
|
INDEX idx_ma_publisher (publisher_id),
|
|
INDEX idx_ma_status (status),
|
|
FOREIGN KEY (publisher_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 应用购买表
|
|
CREATE TABLE IF NOT EXISTS app_purchases (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
app_id VARCHAR(36) NOT NULL,
|
|
price DECIMAL(10,2) NOT NULL,
|
|
order_id VARCHAR(36) DEFAULT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_ap_user (user_id),
|
|
INDEX idx_ap_app (app_id),
|
|
FOREIGN KEY (user_id) REFERENCES users(id),
|
|
FOREIGN KEY (app_id) REFERENCES market_apps(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 应用评价表
|
|
CREATE TABLE IF NOT EXISTS app_reviews (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
app_id VARCHAR(36) NOT NULL,
|
|
rating TINYINT NOT NULL CHECK (rating >= 1 AND rating <= 5),
|
|
content TEXT DEFAULT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE KEY uk_user_app_review (user_id, app_id),
|
|
INDEX idx_ar_app (app_id),
|
|
FOREIGN KEY (user_id) REFERENCES users(id),
|
|
FOREIGN KEY (app_id) REFERENCES market_apps(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 应用安装表
|
|
CREATE TABLE IF NOT EXISTS app_installations (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
app_id VARCHAR(36) NOT NULL,
|
|
installed_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE KEY uk_user_app_install (user_id, app_id),
|
|
INDEX idx_ai_user (user_id),
|
|
INDEX idx_ai_app (app_id),
|
|
FOREIGN KEY (user_id) REFERENCES users(id),
|
|
FOREIGN KEY (app_id) REFERENCES market_apps(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ============================================================
|
|
-- 付费与订单相关表
|
|
-- ============================================================
|
|
|
|
-- 会员等级表
|
|
CREATE TABLE IF NOT EXISTS membership_plans (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
name VARCHAR(100) NOT NULL,
|
|
level INT NOT NULL DEFAULT 0,
|
|
duration_type ENUM('month', 'quarter', 'year') NOT NULL,
|
|
price DECIMAL(10,2) NOT NULL,
|
|
daily_free_tokens INT DEFAULT 0,
|
|
features JSON DEFAULT NULL,
|
|
free_app_ids JSON DEFAULT NULL,
|
|
free_model_ids JSON DEFAULT NULL,
|
|
is_active TINYINT(1) DEFAULT 1,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_mp_level (level),
|
|
INDEX idx_mp_duration (duration_type)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 用户订阅表
|
|
CREATE TABLE IF NOT EXISTS membership_subscriptions (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
plan_id VARCHAR(36) NOT NULL,
|
|
order_id VARCHAR(36) DEFAULT NULL,
|
|
start_at DATETIME NOT NULL,
|
|
end_at DATETIME NOT NULL,
|
|
auto_renew TINYINT(1) DEFAULT 0,
|
|
status ENUM('active', 'expired', 'downgraded') NOT NULL DEFAULT 'active',
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_ms_user (user_id),
|
|
INDEX idx_ms_plan (plan_id),
|
|
INDEX idx_ms_status (status),
|
|
INDEX idx_ms_end (end_at),
|
|
FOREIGN KEY (user_id) REFERENCES users(id),
|
|
FOREIGN KEY (plan_id) REFERENCES membership_plans(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 订单表
|
|
CREATE TABLE IF NOT EXISTS orders (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
order_type ENUM('membership', 'service', 'app') NOT NULL,
|
|
item_id VARCHAR(36) DEFAULT NULL,
|
|
item_name VARCHAR(200) DEFAULT NULL,
|
|
amount DECIMAL(10,2) NOT NULL,
|
|
coupon_id VARCHAR(36) DEFAULT NULL,
|
|
discount_amount DECIMAL(10,2) DEFAULT 0.00,
|
|
payment_method ENUM('wechat', 'alipay') DEFAULT NULL,
|
|
payment_id VARCHAR(200) DEFAULT NULL,
|
|
status ENUM('pending', 'paid', 'refunded', 'cancelled') NOT NULL DEFAULT 'pending',
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_ord_user (user_id),
|
|
INDEX idx_ord_type (order_type),
|
|
INDEX idx_ord_status (status),
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 优惠券表
|
|
CREATE TABLE IF NOT EXISTS coupons (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
code VARCHAR(50) NOT NULL UNIQUE,
|
|
type ENUM('fixed', 'percent') NOT NULL,
|
|
value DECIMAL(10,2) NOT NULL,
|
|
min_amount DECIMAL(10,2) DEFAULT 0.00,
|
|
valid_from DATETIME NOT NULL,
|
|
valid_to DATETIME NOT NULL,
|
|
total_count INT DEFAULT NULL,
|
|
used_count INT DEFAULT 0,
|
|
status ENUM('active', 'expired', 'disabled') NOT NULL DEFAULT 'active',
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_cp_code (code),
|
|
INDEX idx_cp_status (status)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 用户优惠券表
|
|
CREATE TABLE IF NOT EXISTS user_coupons (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
coupon_id VARCHAR(36) NOT NULL,
|
|
status ENUM('unused', 'used', 'expired') NOT NULL DEFAULT 'unused',
|
|
used_at DATETIME DEFAULT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_uc_user (user_id),
|
|
INDEX idx_uc_coupon (coupon_id),
|
|
INDEX idx_uc_status (status),
|
|
FOREIGN KEY (user_id) REFERENCES users(id),
|
|
FOREIGN KEY (coupon_id) REFERENCES coupons(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 增值服务表
|
|
CREATE TABLE IF NOT EXISTS value_added_services (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
name VARCHAR(200) NOT NULL,
|
|
description TEXT DEFAULT NULL,
|
|
price DECIMAL(10,2) NOT NULL,
|
|
type ENUM('skill', 'agent', 'mcp', 'report', 'custom') NOT NULL,
|
|
status VARCHAR(10) NOT NULL DEFAULT 'active',
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_vas_type (type),
|
|
INDEX idx_vas_status (status)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 定制服务订单表
|
|
CREATE TABLE IF NOT EXISTS custom_service_orders (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
service_id VARCHAR(36) DEFAULT NULL,
|
|
service_type ENUM('skill', 'agent', 'mcp') NOT NULL,
|
|
description TEXT DEFAULT NULL,
|
|
status ENUM('pending', 'accepted', 'in_progress', 'completed', 'cancelled') NOT NULL DEFAULT 'pending',
|
|
price DECIMAL(10,2) DEFAULT 0.00,
|
|
order_id VARCHAR(36) DEFAULT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_cso_user (user_id),
|
|
INDEX idx_cso_status (status),
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ============================================================
|
|
-- Token与计费相关表
|
|
-- ============================================================
|
|
|
|
-- 模型供应商表
|
|
CREATE TABLE IF NOT EXISTS model_providers (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
name VARCHAR(100) NOT NULL,
|
|
protocol VARCHAR(30) NOT NULL DEFAULT 'openai_compatible',
|
|
api_key VARCHAR(255) DEFAULT NULL,
|
|
api_base_url VARCHAR(500) DEFAULT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 大模型表
|
|
CREATE TABLE IF NOT EXISTS models (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
provider_id VARCHAR(36) NOT NULL,
|
|
name VARCHAR(100) NOT NULL,
|
|
api_key VARCHAR(255) DEFAULT NULL,
|
|
endpoint VARCHAR(500) DEFAULT NULL,
|
|
capabilities JSON DEFAULT NULL,
|
|
timeout INT DEFAULT 60,
|
|
status ENUM('free', 'paid') NOT NULL DEFAULT 'paid',
|
|
price_per_million_tokens DECIMAL(10,4) NOT NULL DEFAULT 0.0000,
|
|
is_enabled TINYINT(1) DEFAULT 1,
|
|
total_calls BIGINT DEFAULT 0,
|
|
total_tokens BIGINT DEFAULT 0,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_m_provider (provider_id),
|
|
INDEX idx_m_enabled (is_enabled),
|
|
INDEX idx_m_status (status),
|
|
FOREIGN KEY (provider_id) REFERENCES model_providers(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- Token消耗日志表(不可删除)
|
|
CREATE TABLE IF NOT EXISTS token_usage_logs (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
model_id VARCHAR(36) DEFAULT NULL,
|
|
model_name VARCHAR(100) DEFAULT NULL,
|
|
app_id VARCHAR(36) DEFAULT NULL,
|
|
app_name VARCHAR(200) DEFAULT NULL,
|
|
conversation_id VARCHAR(36) DEFAULT NULL,
|
|
prompt_tokens INT DEFAULT 0,
|
|
completion_tokens INT DEFAULT 0,
|
|
total_tokens INT DEFAULT 0,
|
|
cost DECIMAL(10,6) DEFAULT 0.000000,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_tul_user (user_id),
|
|
INDEX idx_tul_model (model_id),
|
|
INDEX idx_tul_created (created_at),
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- Token余额表
|
|
CREATE TABLE IF NOT EXISTS token_balances (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL UNIQUE,
|
|
total_consumed BIGINT DEFAULT 0,
|
|
balance BIGINT DEFAULT 0,
|
|
daily_free_used BIGINT DEFAULT 0,
|
|
daily_free_date DATE DEFAULT NULL,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_tb_user (user_id),
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ============================================================
|
|
-- 通知与日志相关表
|
|
-- ============================================================
|
|
|
|
-- 通知表
|
|
CREATE TABLE IF NOT EXISTS notifications (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
type ENUM('announcement', 'reminder', 'renewal', 'order', 'update') NOT NULL,
|
|
title VARCHAR(200) NOT NULL,
|
|
content TEXT DEFAULT NULL,
|
|
is_read TINYINT(1) DEFAULT 0,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_notif_user (user_id),
|
|
INDEX idx_notif_type (type),
|
|
INDEX idx_notif_read (is_read),
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 操作日志表(不可手动删除 - 应用层禁止DELETE)
|
|
CREATE TABLE IF NOT EXISTS operation_logs (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
username VARCHAR(50) DEFAULT NULL,
|
|
action VARCHAR(100) NOT NULL,
|
|
target VARCHAR(100) DEFAULT NULL,
|
|
target_id VARCHAR(36) DEFAULT NULL,
|
|
detail TEXT DEFAULT NULL,
|
|
ip VARCHAR(45) DEFAULT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_ol_user (user_id),
|
|
INDEX idx_ol_action (action),
|
|
INDEX idx_ol_created (created_at)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 审计日志表(管理员操作 - 不可手动删除)
|
|
CREATE TABLE IF NOT EXISTS audit_logs (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
admin_id VARCHAR(36) NOT NULL,
|
|
admin_name VARCHAR(50) DEFAULT NULL,
|
|
action VARCHAR(100) NOT NULL,
|
|
target_type VARCHAR(50) DEFAULT NULL,
|
|
target_id VARCHAR(36) DEFAULT NULL,
|
|
detail TEXT DEFAULT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_al_admin (admin_id),
|
|
INDEX idx_al_action (action),
|
|
INDEX idx_al_created (created_at)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 风控规则表
|
|
CREATE TABLE IF NOT EXISTS risk_rules (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
name VARCHAR(100) NOT NULL,
|
|
type ENUM('rate_limit', 'ban', 'alert') NOT NULL,
|
|
threshold INT DEFAULT 0,
|
|
duration INT DEFAULT 3600,
|
|
is_enabled TINYINT(1) DEFAULT 1,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_rr_enabled (is_enabled)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ============================================================
|
|
-- 系统配置相关表
|
|
-- ============================================================
|
|
|
|
-- 网站设置表
|
|
CREATE TABLE IF NOT EXISTS site_settings (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
`key` VARCHAR(100) NOT NULL UNIQUE,
|
|
`value` TEXT DEFAULT NULL,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 邮箱配置表
|
|
CREATE TABLE IF NOT EXISTS email_configs (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
smtp_host VARCHAR(200) NOT NULL,
|
|
smtp_port INT NOT NULL DEFAULT 587,
|
|
username VARCHAR(200) NOT NULL,
|
|
password VARCHAR(200) NOT NULL,
|
|
from_address VARCHAR(200) NOT NULL,
|
|
use_tls TINYINT(1) DEFAULT 1,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 短信配置表
|
|
CREATE TABLE IF NOT EXISTS sms_configs (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
provider VARCHAR(50) NOT NULL,
|
|
api_key VARCHAR(200) NOT NULL,
|
|
api_secret VARCHAR(200) NOT NULL,
|
|
sign_name VARCHAR(100) DEFAULT NULL,
|
|
template_code VARCHAR(100) DEFAULT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 支付配置表
|
|
CREATE TABLE IF NOT EXISTS payment_configs (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
type ENUM('wechat', 'alipay') NOT NULL,
|
|
app_id VARCHAR(100) NOT NULL,
|
|
merchant_id VARCHAR(100) DEFAULT NULL,
|
|
api_key VARCHAR(255) NOT NULL,
|
|
cert_path VARCHAR(500) DEFAULT NULL,
|
|
gateway_url VARCHAR(500) DEFAULT NULL,
|
|
status ENUM('active', 'inactive') NOT NULL DEFAULT 'inactive',
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_pc_type (type)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 注册设置表
|
|
CREATE TABLE IF NOT EXISTS register_settings (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
phone_required TINYINT(1) DEFAULT 1,
|
|
phone_sms_required TINYINT(1) DEFAULT 1,
|
|
email_required TINYINT(1) DEFAULT 1,
|
|
email_verify_required TINYINT(1) DEFAULT 1,
|
|
real_name_required TINYINT(1) DEFAULT 0,
|
|
aliyun_access_key VARCHAR(200) DEFAULT NULL,
|
|
aliyun_secret_key VARCHAR(200) DEFAULT NULL,
|
|
aliyun_endpoint VARCHAR(200) DEFAULT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ============================================================
|
|
-- 广告位管理表
|
|
-- ============================================================
|
|
|
|
-- 广告轮播图表
|
|
CREATE TABLE IF NOT EXISTS ad_banners (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
title VARCHAR(200) NOT NULL,
|
|
image_url VARCHAR(500) DEFAULT NULL,
|
|
link_app_id VARCHAR(36) DEFAULT NULL,
|
|
link_app_name VARCHAR(200) DEFAULT NULL,
|
|
sort_order INT DEFAULT 0,
|
|
click_count INT DEFAULT 0,
|
|
status ENUM('active', 'inactive') NOT NULL DEFAULT 'active',
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_ab_status (status),
|
|
INDEX idx_ab_order (sort_order)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ============================================================
|
|
-- 资产管理相关表
|
|
-- ============================================================
|
|
|
|
-- 资产分类表
|
|
CREATE TABLE IF NOT EXISTS asset_categories (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
name VARCHAR(100) NOT NULL,
|
|
type ENUM('file', 'novel', 'image', 'video', 'audio', 'custom') NOT NULL,
|
|
icon VARCHAR(200) DEFAULT NULL,
|
|
color VARCHAR(20) DEFAULT NULL,
|
|
is_default TINYINT(1) DEFAULT 0,
|
|
user_id VARCHAR(36) DEFAULT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_ac_type (type),
|
|
INDEX idx_ac_user (user_id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 资产表
|
|
CREATE TABLE IF NOT EXISTS assets (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
name VARCHAR(200) NOT NULL,
|
|
category ENUM('file', 'novel', 'image', 'video', 'audio', 'custom') NOT NULL,
|
|
sub_category VARCHAR(50) DEFAULT NULL,
|
|
file_type VARCHAR(50) DEFAULT NULL,
|
|
size BIGINT DEFAULT 0,
|
|
description TEXT DEFAULT NULL,
|
|
cover_url VARCHAR(500) DEFAULT NULL,
|
|
url VARCHAR(500) DEFAULT NULL,
|
|
novel_meta JSON DEFAULT NULL,
|
|
status ENUM('active', 'deleted') NOT NULL DEFAULT 'active',
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_ast_user (user_id),
|
|
INDEX idx_ast_category (category),
|
|
INDEX idx_ast_status (status),
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 小说章节表
|
|
CREATE TABLE IF NOT EXISTS novel_chapters (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
asset_id VARCHAR(36) NOT NULL,
|
|
title VARCHAR(200) NOT NULL,
|
|
word_count INT DEFAULT 0,
|
|
sort_order INT DEFAULT 0,
|
|
content LONGTEXT DEFAULT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_nc_asset (asset_id),
|
|
INDEX idx_nc_order (sort_order),
|
|
FOREIGN KEY (asset_id) REFERENCES assets(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ============================================================
|
|
-- 预留扩展表
|
|
-- ============================================================
|
|
|
|
-- 团队表(预留)
|
|
CREATE TABLE IF NOT EXISTS teams (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
owner_id VARCHAR(36) NOT NULL,
|
|
name VARCHAR(100) NOT NULL,
|
|
description TEXT DEFAULT NULL,
|
|
status ENUM('active', 'archived') NOT NULL DEFAULT 'active',
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_team_owner (owner_id),
|
|
FOREIGN KEY (owner_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 分销推广表(预留)
|
|
CREATE TABLE IF NOT EXISTS referrals (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
referrer_id VARCHAR(36) NOT NULL,
|
|
referee_id VARCHAR(36) NOT NULL,
|
|
referral_code VARCHAR(50) DEFAULT NULL,
|
|
status ENUM('pending', 'active', 'cancelled') NOT NULL DEFAULT 'pending',
|
|
commission_rate DECIMAL(5,2) DEFAULT 0.00,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_ref_referrer (referrer_id),
|
|
INDEX idx_ref_referee (referee_id),
|
|
FOREIGN KEY (referrer_id) REFERENCES users(id),
|
|
FOREIGN KEY (referee_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- API开放平台表(预留)
|
|
CREATE TABLE IF NOT EXISTS open_api_clients (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
name VARCHAR(100) NOT NULL,
|
|
client_id VARCHAR(64) NOT NULL UNIQUE,
|
|
client_secret VARCHAR(128) NOT NULL,
|
|
allowed_models JSON DEFAULT NULL,
|
|
rate_limit INT DEFAULT 60,
|
|
status ENUM('active', 'suspended') NOT NULL DEFAULT 'active',
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_oac_user (user_id),
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|