初始提交: Qihu-AIFlow v2.0.1 完整项目
- 前端 React+TypeScript (源码+构建产物) - 后端 Python FastAPI - 数据库迁移 001-015 - Docker部署配置 - 微信ClawBot API频道绑定 - 项目文档 README.md
This commit is contained in:
commit
78ff261b5a
199 files changed
+69126
No files matched your search
@@ -0,0 +1,728 @@
|
||||
-- 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;
|
||||
Reference in new issue
Block a user