初始提交: Qihu-AIFlow v2.0.1 完整项目

- 前端 React+TypeScript (源码+构建产物)
- 后端 Python FastAPI
- 数据库迁移 001-015
- Docker部署配置
- 微信ClawBot API频道绑定
- 项目文档 README.md
This commit is contained in:
qyyfw committed 2026-07-02 14:40:46 +08:00
commit 78ff261b5a
199 files changed
+69126

No files matched your search

+728
View File
@@ -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;