-- 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;