769 lines
38 KiB
SQL
769 lines
38 KiB
SQL
-- AI Video Platform
|
|
-- MySQL 5.7+/8.0 compatible initialization script
|
|
-- Generated from docs/AI视频平台开发文档.md
|
|
|
|
SET NAMES utf8mb4;
|
|
SET FOREIGN_KEY_CHECKS = 0;
|
|
|
|
CREATE DATABASE IF NOT EXISTS `aivideo`
|
|
DEFAULT CHARACTER SET utf8mb4
|
|
DEFAULT COLLATE utf8mb4_unicode_ci;
|
|
|
|
USE `aivideo`;
|
|
|
|
-- =========================================================
|
|
-- 1. User and Auth
|
|
-- =========================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS `users` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`public_id` VARCHAR(64) NOT NULL COMMENT 'External public user id',
|
|
`username` VARCHAR(64) NULL DEFAULT NULL COMMENT 'Unique username set by user',
|
|
`nickname` VARCHAR(100) NOT NULL DEFAULT '' COMMENT 'Display nickname',
|
|
`avatar_url` VARCHAR(500) NOT NULL DEFAULT '' COMMENT 'Avatar image url',
|
|
`email` VARCHAR(191) NULL DEFAULT NULL,
|
|
`mobile` VARCHAR(32) NULL DEFAULT NULL,
|
|
`password_hash` VARCHAR(255) NOT NULL DEFAULT '',
|
|
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '1=active,2=disabled,3=frozen',
|
|
`register_ip` VARCHAR(64) NOT NULL DEFAULT '',
|
|
`last_login_at` DATETIME NULL DEFAULT NULL,
|
|
`last_login_ip` VARCHAR(64) NOT NULL DEFAULT '',
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_users_public_id` (`public_id`),
|
|
UNIQUE KEY `uk_users_username` (`username`),
|
|
UNIQUE KEY `uk_users_email` (`email`),
|
|
UNIQUE KEY `uk_users_mobile` (`mobile`),
|
|
KEY `idx_users_status` (`status`),
|
|
KEY `idx_users_created_at` (`created_at`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='End users';
|
|
|
|
CREATE TABLE IF NOT EXISTS `user_auths` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`user_id` BIGINT UNSIGNED NOT NULL,
|
|
`auth_type` VARCHAR(32) NOT NULL COMMENT 'email/mobile/password/oauth',
|
|
`auth_provider` VARCHAR(32) NOT NULL DEFAULT 'local',
|
|
`auth_principal` VARCHAR(191) NOT NULL COMMENT 'Email/mobile/openid',
|
|
`credential_hash` VARCHAR(255) NULL DEFAULT NULL,
|
|
`verified` TINYINT NOT NULL DEFAULT 0,
|
|
`verified_at` DATETIME NULL DEFAULT NULL,
|
|
`last_login_at` DATETIME NULL DEFAULT NULL,
|
|
`last_login_ip` VARCHAR(64) NOT NULL DEFAULT '',
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_user_auths_principal` (`auth_type`, `auth_provider`, `auth_principal`),
|
|
KEY `idx_user_auths_user_id` (`user_id`),
|
|
CONSTRAINT `fk_user_auths_user_id`
|
|
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
|
|
ON DELETE CASCADE ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='User authentication identities';
|
|
|
|
-- =========================================================
|
|
-- 2. Admin and RBAC
|
|
-- =========================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS `admin_users` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`username` VARCHAR(64) NOT NULL,
|
|
`password_hash` VARCHAR(255) NOT NULL,
|
|
`nickname` VARCHAR(100) NOT NULL DEFAULT '',
|
|
`avatar_url` VARCHAR(500) NOT NULL DEFAULT '',
|
|
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '1=active,2=disabled',
|
|
`is_super_admin` TINYINT NOT NULL DEFAULT 0,
|
|
`last_login_at` DATETIME NULL DEFAULT NULL,
|
|
`last_login_ip` VARCHAR(64) NOT NULL DEFAULT '',
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_admin_users_username` (`username`),
|
|
KEY `idx_admin_users_status` (`status`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Admin backend users';
|
|
|
|
CREATE TABLE IF NOT EXISTS `roles` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`role_code` VARCHAR(64) NOT NULL,
|
|
`role_name` VARCHAR(100) NOT NULL,
|
|
`status` TINYINT NOT NULL DEFAULT 1,
|
|
`description` VARCHAR(255) NOT NULL DEFAULT '',
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_roles_role_code` (`role_code`),
|
|
KEY `idx_roles_status` (`status`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='RBAC roles';
|
|
|
|
CREATE TABLE IF NOT EXISTS `permissions` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`permission_code` VARCHAR(128) NOT NULL,
|
|
`permission_name` VARCHAR(100) NOT NULL,
|
|
`module_name` VARCHAR(64) NOT NULL DEFAULT '',
|
|
`description` VARCHAR(255) NOT NULL DEFAULT '',
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_permissions_permission_code` (`permission_code`),
|
|
KEY `idx_permissions_module_name` (`module_name`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='RBAC permissions';
|
|
|
|
CREATE TABLE IF NOT EXISTS `admin_user_roles` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`admin_user_id` BIGINT UNSIGNED NOT NULL,
|
|
`role_id` BIGINT UNSIGNED NOT NULL,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_admin_user_roles` (`admin_user_id`, `role_id`),
|
|
KEY `idx_admin_user_roles_role_id` (`role_id`),
|
|
CONSTRAINT `fk_admin_user_roles_admin_user_id`
|
|
FOREIGN KEY (`admin_user_id`) REFERENCES `admin_users` (`id`)
|
|
ON DELETE CASCADE ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_admin_user_roles_role_id`
|
|
FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`)
|
|
ON DELETE CASCADE ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Admin user role mapping';
|
|
|
|
CREATE TABLE IF NOT EXISTS `role_permissions` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`role_id` BIGINT UNSIGNED NOT NULL,
|
|
`permission_id` BIGINT UNSIGNED NOT NULL,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_role_permissions` (`role_id`, `permission_id`),
|
|
KEY `idx_role_permissions_permission_id` (`permission_id`),
|
|
CONSTRAINT `fk_role_permissions_role_id`
|
|
FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`)
|
|
ON DELETE CASCADE ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_role_permissions_permission_id`
|
|
FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`)
|
|
ON DELETE CASCADE ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Role permission mapping';
|
|
|
|
-- =========================================================
|
|
-- 3. Wallet, Rewards, Redeem, Invites
|
|
-- =========================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS `wallets` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`user_id` BIGINT UNSIGNED NOT NULL,
|
|
`balance_points` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
|
`frozen_points` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
|
`total_recharged_points` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
|
`total_consumed_points` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
|
`total_refunded_points` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_wallets_user_id` (`user_id`),
|
|
CONSTRAINT `fk_wallets_user_id`
|
|
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
|
|
ON DELETE RESTRICT ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='User wallets';
|
|
|
|
CREATE TABLE IF NOT EXISTS `wallet_transactions` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`transaction_no` VARCHAR(64) NOT NULL,
|
|
`user_id` BIGINT UNSIGNED NOT NULL,
|
|
`wallet_id` BIGINT UNSIGNED NOT NULL,
|
|
`biz_type` VARCHAR(32) NOT NULL COMMENT 'recharge/redeem_code/signup_reward/invite_reward/freeze/consume/refund/unfreeze/manual_adjust',
|
|
`direction` VARCHAR(16) NOT NULL COMMENT 'in/out/freeze/unfreeze',
|
|
`amount_points` BIGINT UNSIGNED NOT NULL,
|
|
`balance_before_points` BIGINT UNSIGNED NOT NULL,
|
|
`balance_after_points` BIGINT UNSIGNED NOT NULL,
|
|
`frozen_before_points` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
|
`frozen_after_points` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
|
`related_type` VARCHAR(32) NOT NULL DEFAULT '',
|
|
`related_id` BIGINT UNSIGNED NULL DEFAULT NULL,
|
|
`remark` VARCHAR(255) NOT NULL DEFAULT '',
|
|
`operator_type` VARCHAR(16) NOT NULL DEFAULT 'system' COMMENT 'system/admin/user',
|
|
`operator_id` BIGINT UNSIGNED NULL DEFAULT NULL,
|
|
`extra_json` JSON NULL,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_wallet_transactions_no` (`transaction_no`),
|
|
KEY `idx_wallet_transactions_user_id` (`user_id`),
|
|
KEY `idx_wallet_transactions_biz_type` (`biz_type`),
|
|
KEY `idx_wallet_transactions_related` (`related_type`, `related_id`),
|
|
KEY `idx_wallet_transactions_created_at` (`created_at`),
|
|
CONSTRAINT `fk_wallet_transactions_user_id`
|
|
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
|
|
ON DELETE RESTRICT ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_wallet_transactions_wallet_id`
|
|
FOREIGN KEY (`wallet_id`) REFERENCES `wallets` (`id`)
|
|
ON DELETE RESTRICT ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Wallet transaction ledger';
|
|
|
|
CREATE TABLE IF NOT EXISTS `growth_reward_rules` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`rule_type` VARCHAR(32) NOT NULL COMMENT 'signup_reward/invite_reward',
|
|
`enabled` TINYINT NOT NULL DEFAULT 0,
|
|
`reward_points` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
|
`trigger_condition` VARCHAR(64) NOT NULL DEFAULT '' COMMENT 'on_register/on_first_consume',
|
|
`min_consume_points` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
|
`remark` VARCHAR(255) NOT NULL DEFAULT '',
|
|
`updated_by_admin_id` BIGINT UNSIGNED NULL DEFAULT NULL,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_growth_reward_rules_type` (`rule_type`),
|
|
KEY `idx_growth_reward_rules_enabled` (`enabled`),
|
|
CONSTRAINT `fk_growth_reward_rules_updated_by_admin_id`
|
|
FOREIGN KEY (`updated_by_admin_id`) REFERENCES `admin_users` (`id`)
|
|
ON DELETE SET NULL ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Signup and invite reward rules';
|
|
|
|
CREATE TABLE IF NOT EXISTS `redeem_codes` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`batch_no` VARCHAR(64) NOT NULL,
|
|
`redeem_code` VARCHAR(64) NOT NULL,
|
|
`points` BIGINT UNSIGNED NOT NULL,
|
|
`status` VARCHAR(32) NOT NULL DEFAULT 'unused' COMMENT 'unused/used/expired/disabled',
|
|
`used_by_user_id` BIGINT UNSIGNED NULL DEFAULT NULL,
|
|
`wallet_transaction_id` BIGINT UNSIGNED NULL DEFAULT NULL,
|
|
`used_ip` VARCHAR(64) NOT NULL DEFAULT '',
|
|
`used_user_agent` VARCHAR(255) NOT NULL DEFAULT '',
|
|
`expired_at` DATETIME NULL DEFAULT NULL,
|
|
`used_at` DATETIME NULL DEFAULT NULL,
|
|
`created_by_admin_id` BIGINT UNSIGNED NULL DEFAULT NULL,
|
|
`remark` VARCHAR(255) NOT NULL DEFAULT '',
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_redeem_codes_code` (`redeem_code`),
|
|
KEY `idx_redeem_codes_batch_no` (`batch_no`),
|
|
KEY `idx_redeem_codes_status` (`status`),
|
|
KEY `idx_redeem_codes_used_by_user_id` (`used_by_user_id`),
|
|
CONSTRAINT `fk_redeem_codes_used_by_user_id`
|
|
FOREIGN KEY (`used_by_user_id`) REFERENCES `users` (`id`)
|
|
ON DELETE SET NULL ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_redeem_codes_wallet_transaction_id`
|
|
FOREIGN KEY (`wallet_transaction_id`) REFERENCES `wallet_transactions` (`id`)
|
|
ON DELETE SET NULL ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_redeem_codes_created_by_admin_id`
|
|
FOREIGN KEY (`created_by_admin_id`) REFERENCES `admin_users` (`id`)
|
|
ON DELETE SET NULL ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Redeem codes for point exchange';
|
|
|
|
CREATE TABLE IF NOT EXISTS `invite_codes` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`user_id` BIGINT UNSIGNED NOT NULL,
|
|
`invite_code` VARCHAR(32) NOT NULL,
|
|
`invite_link` VARCHAR(255) NOT NULL DEFAULT '',
|
|
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '1=enabled,0=disabled',
|
|
`is_default` TINYINT NOT NULL DEFAULT 0,
|
|
`max_use_count` INT UNSIGNED NULL DEFAULT NULL,
|
|
`used_count` INT UNSIGNED NOT NULL DEFAULT 0,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_invite_codes_code` (`invite_code`),
|
|
KEY `idx_invite_codes_user_id` (`user_id`),
|
|
KEY `idx_invite_codes_status` (`status`),
|
|
CONSTRAINT `fk_invite_codes_user_id`
|
|
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
|
|
ON DELETE CASCADE ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Invite codes and links';
|
|
|
|
CREATE TABLE IF NOT EXISTS `invite_relations` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`inviter_user_id` BIGINT UNSIGNED NOT NULL,
|
|
`invitee_user_id` BIGINT UNSIGNED NOT NULL,
|
|
`invite_code_id` BIGINT UNSIGNED NOT NULL,
|
|
`reward_status` VARCHAR(32) NOT NULL DEFAULT 'pending' COMMENT 'pending/eligible/rewarded/invalid',
|
|
`reward_points` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
|
`first_consumed_task_id` BIGINT UNSIGNED NULL DEFAULT NULL,
|
|
`first_consumed_at` DATETIME NULL DEFAULT NULL,
|
|
`rewarded_at` DATETIME NULL DEFAULT NULL,
|
|
`reward_wallet_transaction_id` BIGINT UNSIGNED NULL DEFAULT NULL,
|
|
`register_ip` VARCHAR(64) NOT NULL DEFAULT '',
|
|
`register_device_fingerprint` VARCHAR(128) NOT NULL DEFAULT '',
|
|
`risk_status` VARCHAR(32) NOT NULL DEFAULT 'normal' COMMENT 'normal/suspicious/blocked',
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_invite_relations_invitee_user_id` (`invitee_user_id`),
|
|
KEY `idx_invite_relations_inviter_user_id` (`inviter_user_id`),
|
|
KEY `idx_invite_relations_reward_status` (`reward_status`),
|
|
KEY `idx_invite_relations_invite_code_id` (`invite_code_id`),
|
|
CONSTRAINT `fk_invite_relations_inviter_user_id`
|
|
FOREIGN KEY (`inviter_user_id`) REFERENCES `users` (`id`)
|
|
ON DELETE RESTRICT ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_invite_relations_invitee_user_id`
|
|
FOREIGN KEY (`invitee_user_id`) REFERENCES `users` (`id`)
|
|
ON DELETE RESTRICT ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_invite_relations_invite_code_id`
|
|
FOREIGN KEY (`invite_code_id`) REFERENCES `invite_codes` (`id`)
|
|
ON DELETE RESTRICT ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_invite_relations_reward_wallet_transaction_id`
|
|
FOREIGN KEY (`reward_wallet_transaction_id`) REFERENCES `wallet_transactions` (`id`)
|
|
ON DELETE SET NULL ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Invite relationships and reward tracking';
|
|
|
|
-- =========================================================
|
|
-- 4. Recharge and Payment
|
|
-- =========================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS `recharge_plans` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`name` VARCHAR(100) NOT NULL,
|
|
`pay_amount` DECIMAL(10,2) NOT NULL,
|
|
`point_ratio` INT UNSIGNED NOT NULL DEFAULT 100 COMMENT 'Points per 1 CNY',
|
|
`give_points` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Base points',
|
|
`bonus_points` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Bonus points',
|
|
`sort_order` INT NOT NULL DEFAULT 0,
|
|
`status` TINYINT NOT NULL DEFAULT 1,
|
|
`start_at` DATETIME NULL DEFAULT NULL,
|
|
`end_at` DATETIME NULL DEFAULT NULL,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
KEY `idx_recharge_plans_status` (`status`),
|
|
KEY `idx_recharge_plans_sort_order` (`sort_order`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Recharge plans';
|
|
|
|
CREATE TABLE IF NOT EXISTS `payment_channels` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`channel_code` VARCHAR(32) NOT NULL,
|
|
`channel_name` VARCHAR(100) NOT NULL,
|
|
`provider_type` VARCHAR(32) NOT NULL DEFAULT 'manual' COMMENT 'alipay/wechat/manual',
|
|
`config_json` JSON NULL,
|
|
`status` TINYINT NOT NULL DEFAULT 1,
|
|
`sort_order` INT NOT NULL DEFAULT 0,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_payment_channels_code` (`channel_code`),
|
|
KEY `idx_payment_channels_status` (`status`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Payment channels';
|
|
|
|
CREATE TABLE IF NOT EXISTS `recharge_orders` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`order_no` VARCHAR(64) NOT NULL,
|
|
`user_id` BIGINT UNSIGNED NOT NULL,
|
|
`recharge_plan_id` BIGINT UNSIGNED NULL DEFAULT NULL,
|
|
`payment_channel_id` BIGINT UNSIGNED NULL DEFAULT NULL,
|
|
`payment_channel_code` VARCHAR(32) NOT NULL,
|
|
`pay_amount` DECIMAL(10,2) NOT NULL,
|
|
`point_ratio_snapshot` INT UNSIGNED NOT NULL,
|
|
`give_points` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
|
`bonus_points` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
|
`arrival_points` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
|
`currency` VARCHAR(16) NOT NULL DEFAULT 'CNY',
|
|
`status` VARCHAR(32) NOT NULL COMMENT 'pending/paid/failed/cancelled/refunded',
|
|
`third_party_order_no` VARCHAR(100) NOT NULL DEFAULT '',
|
|
`client_ip` VARCHAR(64) NOT NULL DEFAULT '',
|
|
`paid_at` DATETIME NULL DEFAULT NULL,
|
|
`expired_at` DATETIME NULL DEFAULT NULL,
|
|
`callback_payload` JSON NULL,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_recharge_orders_order_no` (`order_no`),
|
|
KEY `idx_recharge_orders_user_id` (`user_id`),
|
|
KEY `idx_recharge_orders_status` (`status`),
|
|
KEY `idx_recharge_orders_paid_at` (`paid_at`),
|
|
CONSTRAINT `fk_recharge_orders_user_id`
|
|
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
|
|
ON DELETE RESTRICT ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_recharge_orders_recharge_plan_id`
|
|
FOREIGN KEY (`recharge_plan_id`) REFERENCES `recharge_plans` (`id`)
|
|
ON DELETE SET NULL ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_recharge_orders_payment_channel_id`
|
|
FOREIGN KEY (`payment_channel_id`) REFERENCES `payment_channels` (`id`)
|
|
ON DELETE SET NULL ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Recharge orders';
|
|
|
|
-- =========================================================
|
|
-- 5. Providers, Models, Pricing
|
|
-- =========================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS `provider_accounts` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`provider_code` VARCHAR(32) NOT NULL,
|
|
`provider_name` VARCHAR(100) NOT NULL,
|
|
`api_format` VARCHAR(64) NOT NULL COMMENT 'openai_official_video/seedance_video_generation',
|
|
`base_url` VARCHAR(255) NOT NULL,
|
|
`api_key_encrypted` TEXT NOT NULL,
|
|
`api_secret_encrypted` TEXT NULL,
|
|
`webhook_secret_encrypted` TEXT NULL,
|
|
`timeout_seconds` INT NOT NULL DEFAULT 60,
|
|
`max_retries` INT NOT NULL DEFAULT 3,
|
|
`status` TINYINT NOT NULL DEFAULT 1,
|
|
`remark` VARCHAR(255) NOT NULL DEFAULT '',
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_provider_accounts_code` (`provider_code`),
|
|
KEY `idx_provider_accounts_status` (`status`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Provider accounts';
|
|
|
|
CREATE TABLE IF NOT EXISTS `provider_models` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`provider_account_id` BIGINT UNSIGNED NOT NULL,
|
|
`model_code` VARCHAR(64) NOT NULL,
|
|
`model_name` VARCHAR(100) NOT NULL,
|
|
`request_content_type` VARCHAR(64) NOT NULL DEFAULT 'application/json',
|
|
`scene_type` VARCHAR(32) NOT NULL DEFAULT 'video_generation',
|
|
`supports_text_to_video` TINYINT NOT NULL DEFAULT 1,
|
|
`supports_image_to_video` TINYINT NOT NULL DEFAULT 0,
|
|
`supports_video_reference` TINYINT NOT NULL DEFAULT 0,
|
|
`supports_audio_reference` TINYINT NOT NULL DEFAULT 0,
|
|
`supports_generate_audio` TINYINT NOT NULL DEFAULT 0,
|
|
`supports_remix` TINYINT NOT NULL DEFAULT 0,
|
|
`supports_webhook` TINYINT NOT NULL DEFAULT 0,
|
|
`min_duration` INT NOT NULL DEFAULT 4,
|
|
`max_duration` INT NOT NULL DEFAULT 15,
|
|
`status` TINYINT NOT NULL DEFAULT 1,
|
|
`default_ratio` VARCHAR(20) NOT NULL DEFAULT '16:9',
|
|
`default_resolution` VARCHAR(20) NOT NULL DEFAULT '720p',
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_provider_models` (`provider_account_id`, `model_code`),
|
|
KEY `idx_provider_models_status` (`status`),
|
|
CONSTRAINT `fk_provider_models_provider_account_id`
|
|
FOREIGN KEY (`provider_account_id`) REFERENCES `provider_accounts` (`id`)
|
|
ON DELETE CASCADE ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Provider-side video models';
|
|
|
|
CREATE TABLE IF NOT EXISTS `video_models` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`model_key` VARCHAR(64) NOT NULL,
|
|
`model_name` VARCHAR(100) NOT NULL,
|
|
`frontend_title` VARCHAR(100) NOT NULL,
|
|
`frontend_description` VARCHAR(255) NOT NULL DEFAULT '',
|
|
`default_duration_seconds` INT NOT NULL DEFAULT 8,
|
|
`default_ratio` VARCHAR(20) NOT NULL DEFAULT '16:9',
|
|
`default_resolution` VARCHAR(20) NOT NULL DEFAULT '720p',
|
|
`status` TINYINT NOT NULL DEFAULT 1,
|
|
`sort_order` INT NOT NULL DEFAULT 0,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_video_models_key` (`model_key`),
|
|
KEY `idx_video_models_status` (`status`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Platform-side public video models';
|
|
|
|
CREATE TABLE IF NOT EXISTS `video_model_supplier_bindings` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`video_model_id` BIGINT UNSIGNED NOT NULL,
|
|
`provider_model_id` BIGINT UNSIGNED NOT NULL,
|
|
`routing_priority` INT NOT NULL DEFAULT 100,
|
|
`is_primary` TINYINT NOT NULL DEFAULT 0,
|
|
`status` TINYINT NOT NULL DEFAULT 1,
|
|
`timeout_seconds_override` INT NULL DEFAULT NULL,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_video_model_supplier_binding` (`video_model_id`, `provider_model_id`),
|
|
KEY `idx_video_model_supplier_bindings_priority` (`video_model_id`, `routing_priority`),
|
|
CONSTRAINT `fk_video_model_supplier_bindings_video_model_id`
|
|
FOREIGN KEY (`video_model_id`) REFERENCES `video_models` (`id`)
|
|
ON DELETE CASCADE ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_video_model_supplier_bindings_provider_model_id`
|
|
FOREIGN KEY (`provider_model_id`) REFERENCES `provider_models` (`id`)
|
|
ON DELETE CASCADE ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Bindings between platform models and provider models';
|
|
|
|
CREATE TABLE IF NOT EXISTS `pricing_rules` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`rule_name` VARCHAR(100) NOT NULL,
|
|
`video_model_id` BIGINT UNSIGNED NOT NULL,
|
|
`billing_mode` VARCHAR(32) NOT NULL DEFAULT 'per_second',
|
|
`points_per_second` INT UNSIGNED NOT NULL,
|
|
`minimum_points` INT UNSIGNED NOT NULL DEFAULT 0,
|
|
`status` TINYINT NOT NULL DEFAULT 1,
|
|
`effective_at` DATETIME NOT NULL,
|
|
`expired_at` DATETIME NULL DEFAULT NULL,
|
|
`version_no` INT NOT NULL DEFAULT 1,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
KEY `idx_pricing_rules_video_model_id` (`video_model_id`),
|
|
KEY `idx_pricing_rules_status` (`status`),
|
|
KEY `idx_pricing_rules_effective_at` (`effective_at`),
|
|
CONSTRAINT `fk_pricing_rules_video_model_id`
|
|
FOREIGN KEY (`video_model_id`) REFERENCES `video_models` (`id`)
|
|
ON DELETE CASCADE ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Pricing rules by platform video model';
|
|
|
|
-- =========================================================
|
|
-- 6. Assets and Video Tasks
|
|
-- =========================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS `media_assets` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`asset_no` VARCHAR(64) NOT NULL,
|
|
`user_id` BIGINT UNSIGNED NOT NULL,
|
|
`media_type` VARCHAR(16) NOT NULL COMMENT 'image/video/audio',
|
|
`source_type` VARCHAR(16) NOT NULL DEFAULT 'upload' COMMENT 'upload/generated/imported',
|
|
`original_filename` VARCHAR(255) NOT NULL,
|
|
`mime_type` VARCHAR(100) NOT NULL DEFAULT '',
|
|
`file_ext` VARCHAR(32) NOT NULL DEFAULT '',
|
|
`file_size` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
|
`storage_provider` VARCHAR(32) NOT NULL DEFAULT 'minio',
|
|
`storage_bucket` VARCHAR(100) NOT NULL,
|
|
`storage_key` VARCHAR(255) NOT NULL,
|
|
`public_url` VARCHAR(500) NOT NULL DEFAULT '',
|
|
`sha256` VARCHAR(64) NOT NULL DEFAULT '',
|
|
`width` INT UNSIGNED NULL DEFAULT NULL,
|
|
`height` INT UNSIGNED NULL DEFAULT NULL,
|
|
`duration_seconds` INT UNSIGNED NULL DEFAULT NULL,
|
|
`status` VARCHAR(32) NOT NULL DEFAULT 'active' COMMENT 'active/deleted',
|
|
`deleted_at` DATETIME NULL DEFAULT NULL,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_media_assets_asset_no` (`asset_no`),
|
|
KEY `idx_media_assets_user_id` (`user_id`),
|
|
KEY `idx_media_assets_media_type` (`media_type`),
|
|
KEY `idx_media_assets_status` (`status`),
|
|
CONSTRAINT `fk_media_assets_user_id`
|
|
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
|
|
ON DELETE RESTRICT ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Uploaded and generated media assets';
|
|
|
|
CREATE TABLE IF NOT EXISTS `video_generation_tasks` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`task_no` VARCHAR(64) NOT NULL,
|
|
`user_id` BIGINT UNSIGNED NOT NULL,
|
|
`video_model_id` BIGINT UNSIGNED NOT NULL,
|
|
`provider_account_id` BIGINT UNSIGNED NOT NULL,
|
|
`provider_model_id` BIGINT UNSIGNED NOT NULL,
|
|
`provider_binding_id` BIGINT UNSIGNED NULL DEFAULT NULL,
|
|
`pricing_rule_id` BIGINT UNSIGNED NOT NULL,
|
|
`external_task_id` VARCHAR(100) NOT NULL DEFAULT '',
|
|
`submit_mode` VARCHAR(32) NOT NULL DEFAULT 'async',
|
|
`task_status` VARCHAR(32) NOT NULL COMMENT 'created/queued/submitting/submitted/running/succeeded/failed/cancelled/timed_out',
|
|
`generation_mode` VARCHAR(32) NOT NULL COMMENT 'text_to_video/image_to_video/multimodal',
|
|
`prompt_text` TEXT NULL,
|
|
`request_payload` JSON NOT NULL COMMENT 'Standardized local payload',
|
|
`response_payload` JSON NULL COMMENT 'Latest provider response',
|
|
`duration_seconds` INT NOT NULL DEFAULT 5,
|
|
`ratio` VARCHAR(20) NOT NULL DEFAULT '16:9',
|
|
`resolution` VARCHAR(20) NOT NULL DEFAULT '720p',
|
|
`generate_audio` TINYINT NOT NULL DEFAULT 0,
|
|
`estimated_points` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
|
`frozen_points` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
|
`final_points` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
|
`supplier_cost_amount` DECIMAL(10,4) NOT NULL DEFAULT 0.0000,
|
|
`supplier_cost_currency` VARCHAR(16) NOT NULL DEFAULT '',
|
|
`result_asset_id` BIGINT UNSIGNED NULL DEFAULT NULL,
|
|
`fail_reason` VARCHAR(500) NOT NULL DEFAULT '',
|
|
`submitted_at` DATETIME NULL DEFAULT NULL,
|
|
`started_at` DATETIME NULL DEFAULT NULL,
|
|
`finished_at` DATETIME NULL DEFAULT NULL,
|
|
`next_poll_at` DATETIME NULL DEFAULT NULL,
|
|
`poll_count` INT NOT NULL DEFAULT 0,
|
|
`user_visible` TINYINT NOT NULL DEFAULT 1 COMMENT 'User soft visibility flag',
|
|
`user_deleted_at` DATETIME NULL DEFAULT NULL,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_video_generation_tasks_task_no` (`task_no`),
|
|
KEY `idx_video_generation_tasks_user_id` (`user_id`),
|
|
KEY `idx_video_generation_tasks_status` (`task_status`),
|
|
KEY `idx_video_generation_tasks_external_task_id` (`external_task_id`),
|
|
KEY `idx_video_generation_tasks_next_poll_at` (`next_poll_at`),
|
|
KEY `idx_video_generation_tasks_user_visible` (`user_id`, `user_visible`, `created_at`),
|
|
CONSTRAINT `fk_video_generation_tasks_user_id`
|
|
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
|
|
ON DELETE RESTRICT ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_video_generation_tasks_video_model_id`
|
|
FOREIGN KEY (`video_model_id`) REFERENCES `video_models` (`id`)
|
|
ON DELETE RESTRICT ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_video_generation_tasks_provider_account_id`
|
|
FOREIGN KEY (`provider_account_id`) REFERENCES `provider_accounts` (`id`)
|
|
ON DELETE RESTRICT ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_video_generation_tasks_provider_model_id`
|
|
FOREIGN KEY (`provider_model_id`) REFERENCES `provider_models` (`id`)
|
|
ON DELETE RESTRICT ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_video_generation_tasks_provider_binding_id`
|
|
FOREIGN KEY (`provider_binding_id`) REFERENCES `video_model_supplier_bindings` (`id`)
|
|
ON DELETE SET NULL ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_video_generation_tasks_pricing_rule_id`
|
|
FOREIGN KEY (`pricing_rule_id`) REFERENCES `pricing_rules` (`id`)
|
|
ON DELETE RESTRICT ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_video_generation_tasks_result_asset_id`
|
|
FOREIGN KEY (`result_asset_id`) REFERENCES `media_assets` (`id`)
|
|
ON DELETE SET NULL ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Video generation tasks';
|
|
|
|
CREATE TABLE IF NOT EXISTS `video_task_events` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`video_task_id` BIGINT UNSIGNED NOT NULL,
|
|
`event_type` VARCHAR(32) NOT NULL,
|
|
`event_message` VARCHAR(255) NOT NULL DEFAULT '',
|
|
`payload` JSON NULL,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
KEY `idx_video_task_events_video_task_id` (`video_task_id`),
|
|
KEY `idx_video_task_events_event_type` (`event_type`),
|
|
CONSTRAINT `fk_video_task_events_video_task_id`
|
|
FOREIGN KEY (`video_task_id`) REFERENCES `video_generation_tasks` (`id`)
|
|
ON DELETE CASCADE ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Video task event timeline';
|
|
|
|
CREATE TABLE IF NOT EXISTS `callback_logs` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`source_type` VARCHAR(32) NOT NULL COMMENT 'payment/provider',
|
|
`source_code` VARCHAR(32) NOT NULL,
|
|
`related_no` VARCHAR(64) NOT NULL DEFAULT '',
|
|
`request_headers` JSON NULL,
|
|
`request_body` JSON NULL,
|
|
`verify_status` VARCHAR(32) NOT NULL DEFAULT 'pending',
|
|
`process_status` VARCHAR(32) NOT NULL DEFAULT 'pending',
|
|
`response_body` TEXT NULL,
|
|
`error_message` VARCHAR(500) NOT NULL DEFAULT '',
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
KEY `idx_callback_logs_source` (`source_type`, `source_code`),
|
|
KEY `idx_callback_logs_related_no` (`related_no`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Inbound callback logs';
|
|
|
|
-- =========================================================
|
|
-- 7. System Config and Audit
|
|
-- =========================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS `system_configs` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`config_key` VARCHAR(128) NOT NULL,
|
|
`config_value` TEXT NOT NULL,
|
|
`value_type` VARCHAR(32) NOT NULL DEFAULT 'string',
|
|
`group_name` VARCHAR(64) NOT NULL DEFAULT 'default',
|
|
`description` VARCHAR(255) NOT NULL DEFAULT '',
|
|
`is_public` TINYINT NOT NULL DEFAULT 0,
|
|
`updated_by_admin_id` BIGINT UNSIGNED NULL DEFAULT NULL,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_system_configs_key` (`config_key`),
|
|
KEY `idx_system_configs_group_name` (`group_name`),
|
|
CONSTRAINT `fk_system_configs_updated_by_admin_id`
|
|
FOREIGN KEY (`updated_by_admin_id`) REFERENCES `admin_users` (`id`)
|
|
ON DELETE SET NULL ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='System config key-value pairs';
|
|
|
|
CREATE TABLE IF NOT EXISTS `operation_logs` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`admin_user_id` BIGINT UNSIGNED NULL DEFAULT NULL,
|
|
`user_id` BIGINT UNSIGNED NULL DEFAULT NULL,
|
|
`module_name` VARCHAR(64) NOT NULL DEFAULT '',
|
|
`action_name` VARCHAR(64) NOT NULL DEFAULT '',
|
|
`related_type` VARCHAR(32) NOT NULL DEFAULT '',
|
|
`related_id` BIGINT UNSIGNED NULL DEFAULT NULL,
|
|
`request_method` VARCHAR(16) NOT NULL DEFAULT '',
|
|
`request_path` VARCHAR(255) NOT NULL DEFAULT '',
|
|
`request_ip` VARCHAR(64) NOT NULL DEFAULT '',
|
|
`user_agent` VARCHAR(255) NOT NULL DEFAULT '',
|
|
`request_body` JSON NULL,
|
|
`response_body` JSON NULL,
|
|
`status` VARCHAR(32) NOT NULL DEFAULT 'success',
|
|
`error_message` VARCHAR(500) NOT NULL DEFAULT '',
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
KEY `idx_operation_logs_admin_user_id` (`admin_user_id`),
|
|
KEY `idx_operation_logs_user_id` (`user_id`),
|
|
KEY `idx_operation_logs_module_name` (`module_name`),
|
|
KEY `idx_operation_logs_created_at` (`created_at`),
|
|
CONSTRAINT `fk_operation_logs_admin_user_id`
|
|
FOREIGN KEY (`admin_user_id`) REFERENCES `admin_users` (`id`)
|
|
ON DELETE SET NULL ON UPDATE RESTRICT,
|
|
CONSTRAINT `fk_operation_logs_user_id`
|
|
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
|
|
ON DELETE SET NULL ON UPDATE RESTRICT
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Admin and system operation logs';
|
|
|
|
-- =========================================================
|
|
-- 8. Seed Data
|
|
-- =========================================================
|
|
|
|
INSERT INTO `roles` (`role_code`, `role_name`, `status`, `description`)
|
|
VALUES
|
|
('super_admin', '超级管理员', 1, '拥有所有后台权限'),
|
|
('operator', '运营管理员', 1, '负责配置、奖励和订单处理')
|
|
ON DUPLICATE KEY UPDATE
|
|
`role_name` = VALUES(`role_name`),
|
|
`status` = VALUES(`status`),
|
|
`description` = VALUES(`description`);
|
|
|
|
INSERT INTO `permissions` (`permission_code`, `permission_name`, `module_name`, `description`)
|
|
VALUES
|
|
('user:view', '查看用户', 'user', '查看用户列表与详情'),
|
|
('user:edit', '编辑用户', 'user', '编辑用户状态和资料'),
|
|
('order:view', '查看订单', 'order', '查看充值订单'),
|
|
('wallet:view', '查看钱包', 'wallet', '查看用户积分'),
|
|
('wallet:manual_adjust', '手工调账', 'wallet', '人工调整积分'),
|
|
('task:view', '查看任务', 'task', '查看视频任务'),
|
|
('task:retry', '重试任务', 'task', '后台重试视频任务'),
|
|
('provider:view', '查看供应商', 'provider', '查看供应商账号和模型'),
|
|
('provider:edit', '编辑供应商', 'provider', '编辑供应商账号和模型'),
|
|
('pricing:view', '查看价格', 'pricing', '查看价格规则'),
|
|
('pricing:edit', '编辑价格', 'pricing', '编辑价格规则'),
|
|
('growth:view', '查看增长规则', 'growth', '查看注册奖励和邀请奖励'),
|
|
('growth:edit', '编辑增长规则', 'growth', '编辑注册奖励和邀请奖励'),
|
|
('redeem:view', '查看兑换码', 'redeem', '查看兑换码和兑换记录'),
|
|
('redeem:edit', '编辑兑换码', 'redeem', '创建和禁用兑换码'),
|
|
('system:view', '查看系统配置', 'system', '查看系统配置'),
|
|
('system:edit', '编辑系统配置', 'system', '编辑系统配置')
|
|
ON DUPLICATE KEY UPDATE
|
|
`permission_name` = VALUES(`permission_name`),
|
|
`module_name` = VALUES(`module_name`),
|
|
`description` = VALUES(`description`);
|
|
|
|
INSERT IGNORE INTO `role_permissions` (`role_id`, `permission_id`)
|
|
SELECT r.`id`, p.`id`
|
|
FROM `roles` r
|
|
JOIN `permissions` p
|
|
WHERE r.`role_code` = 'super_admin';
|
|
|
|
INSERT INTO `growth_reward_rules` (`rule_type`, `enabled`, `reward_points`, `trigger_condition`, `min_consume_points`, `remark`)
|
|
VALUES
|
|
('signup_reward', 0, 0, 'on_register', 0, '新用户注册送积分'),
|
|
('invite_reward', 0, 0, 'on_first_consume', 100, '邀请奖励积分')
|
|
ON DUPLICATE KEY UPDATE
|
|
`enabled` = VALUES(`enabled`),
|
|
`reward_points` = VALUES(`reward_points`),
|
|
`trigger_condition` = VALUES(`trigger_condition`),
|
|
`min_consume_points` = VALUES(`min_consume_points`),
|
|
`remark` = VALUES(`remark`);
|
|
|
|
INSERT INTO `payment_channels` (`channel_code`, `channel_name`, `provider_type`, `config_json`, `status`, `sort_order`)
|
|
VALUES
|
|
('alipay', '支付宝', 'alipay', JSON_OBJECT(), 1, 10),
|
|
('wechat_pay', '微信支付', 'wechat', JSON_OBJECT(), 1, 20),
|
|
('manual', '人工充值', 'manual', JSON_OBJECT(), 0, 99)
|
|
ON DUPLICATE KEY UPDATE
|
|
`channel_name` = VALUES(`channel_name`),
|
|
`provider_type` = VALUES(`provider_type`),
|
|
`status` = VALUES(`status`),
|
|
`sort_order` = VALUES(`sort_order`);
|
|
|
|
INSERT INTO `system_configs` (`config_key`, `config_value`, `value_type`, `group_name`, `description`, `is_public`)
|
|
VALUES
|
|
('site.title', 'AI Video Platform', 'string', 'site', '站点标题', 1),
|
|
('site.notice', '', 'string', 'site', '站点公告', 1),
|
|
('wallet.point_exchange_ratio', '100', 'int', 'wallet', '1元兑换多少积分', 0),
|
|
('reward.signup.enabled', '0', 'bool', 'reward', '是否开启注册赠送积分', 0),
|
|
('reward.signup.points', '0', 'int', 'reward', '注册赠送积分数量', 0),
|
|
('reward.invite.enabled', '0', 'bool', 'reward', '是否开启邀请奖励', 0),
|
|
('reward.invite.points', '0', 'int', 'reward', '邀请奖励积分数量', 0),
|
|
('reward.invite.trigger', 'on_first_consume', 'string', 'reward', '邀请奖励触发条件', 0),
|
|
('reward.invite.min_consume_points', '100', 'int', 'reward', '邀请奖励最小有效消费积分', 0),
|
|
('invite.code.enabled', '1', 'bool', 'invite', '是否允许用户生成邀请码', 0),
|
|
('upload.max_image_size_mb', '30', 'int', 'upload', '图片最大上传大小MB', 0),
|
|
('upload.max_video_size_mb', '50', 'int', 'upload', '视频最大上传大小MB', 0),
|
|
('upload.max_audio_size_mb', '15', 'int', 'upload', '音频最大上传大小MB', 0),
|
|
('task.default_poll_interval_seconds', '10', 'int', 'task', '默认轮询间隔秒数', 0),
|
|
('task.max_poll_minutes', '30', 'int', 'task', '最大轮询分钟数', 0),
|
|
('task.daily_create_limit', '50', 'int', 'task', '单用户每日任务上限', 0)
|
|
ON DUPLICATE KEY UPDATE
|
|
`config_value` = VALUES(`config_value`),
|
|
`value_type` = VALUES(`value_type`),
|
|
`group_name` = VALUES(`group_name`),
|
|
`description` = VALUES(`description`),
|
|
`is_public` = VALUES(`is_public`);
|
|
|
|
SET FOREIGN_KEY_CHECKS = 1;
|