Initial AI manga platform

This commit is contained in:
www
2026-06-15 17:45:28 +08:00
commit 7a8191650f
267 changed files with 105987 additions and 0 deletions
@@ -0,0 +1,629 @@
-- CreateTable
CREATE TABLE `users` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`email` VARCHAR(191) NULL,
`phone` VARCHAR(50) NULL,
`password_hash` VARCHAR(255) NOT NULL,
`nickname` VARCHAR(100) NULL,
`avatar_url` VARCHAR(500) NULL,
`role` VARCHAR(50) NOT NULL DEFAULT 'user',
`status` VARCHAR(50) NOT NULL DEFAULT 'active',
`wechat_openid` VARCHAR(191) NULL,
`last_login_at` DATETIME(3) NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
UNIQUE INDEX `users_email_key`(`email`),
UNIQUE INDEX `users_phone_key`(`phone`),
UNIQUE INDEX `users_wechat_openid_key`(`wechat_openid`),
INDEX `users_role_status_idx`(`role`, `status`),
INDEX `users_created_at_idx`(`created_at`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `projects` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`user_id` BIGINT NOT NULL,
`title` VARCHAR(255) NULL,
`input_mode` VARCHAR(50) NOT NULL,
`genre` VARCHAR(100) NULL,
`style_code` VARCHAR(100) NULL,
`output_type` VARCHAR(50) NULL,
`target_episode_count` INTEGER NULL,
`episode_duration` INTEGER NULL,
`status` VARCHAR(80) NOT NULL DEFAULT 'draft',
`copyright_status` VARCHAR(80) NOT NULL DEFAULT 'pending',
`payment_status` VARCHAR(80) NOT NULL DEFAULT 'unpaid',
`quality_level` VARCHAR(50) NULL,
`is_long_series` BOOLEAN NOT NULL DEFAULT false,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
`completed_at` DATETIME(3) NULL,
INDEX `projects_user_id_status_idx`(`user_id`, `status`),
INDEX `projects_genre_status_idx`(`genre`, `status`),
INDEX `projects_created_at_idx`(`created_at`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `novel_sources` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`source_type` VARCHAR(50) NOT NULL,
`title` VARCHAR(255) NULL,
`author_name` VARCHAR(100) NULL,
`raw_asset_id` BIGINT NULL,
`raw_text` LONGTEXT NULL,
`clean_text` LONGTEXT NULL,
`word_count` INTEGER NULL,
`chapter_count` INTEGER NULL,
`parse_status` VARCHAR(50) NOT NULL DEFAULT 'pending',
`parse_report` JSON NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `novel_sources_project_id_idx`(`project_id`),
INDEX `novel_sources_parse_status_idx`(`parse_status`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `novel_chapters` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`novel_source_id` BIGINT NULL,
`chapter_no` INTEGER NOT NULL,
`title` VARCHAR(255) NULL,
`content` LONGTEXT NOT NULL,
`summary` TEXT NULL,
`visual_summary` TEXT NULL,
`word_count` INTEGER NULL,
`status` VARCHAR(50) NOT NULL DEFAULT 'draft',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `novel_chapters_project_id_chapter_no_idx`(`project_id`, `chapter_no`),
INDEX `novel_chapters_project_id_status_idx`(`project_id`, `status`),
UNIQUE INDEX `novel_chapters_novel_source_id_chapter_no_key`(`novel_source_id`, `chapter_no`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `copyright_records` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`user_id` BIGINT NOT NULL,
`authorization_type` VARCHAR(50) NOT NULL,
`statement_text` TEXT NOT NULL,
`ip` VARCHAR(80) NULL,
`user_agent` TEXT NULL,
`confirmed_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `copyright_records_project_id_idx`(`project_id`),
INDEX `copyright_records_user_id_idx`(`user_id`),
INDEX `copyright_records_authorization_type_idx`(`authorization_type`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `story_bibles` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`title` VARCHAR(255) NULL,
`logline` TEXT NULL,
`main_plot` TEXT NULL,
`core_conflict` TEXT NULL,
`selling_points` TEXT NULL,
`tone` VARCHAR(100) NULL,
`world_summary` TEXT NULL,
`ending_direction` TEXT NULL,
`taboo_rules` TEXT NULL,
`version` INTEGER NOT NULL DEFAULT 1,
`status` VARCHAR(50) NOT NULL DEFAULT 'draft',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
INDEX `story_bibles_project_id_status_idx`(`project_id`, `status`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `world_bibles` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`world_type` VARCHAR(100) NULL,
`setting_text` TEXT NULL,
`rules_text` TEXT NULL,
`power_system` TEXT NULL,
`social_structure` TEXT NULL,
`time_period` TEXT NULL,
`visual_rules` TEXT NULL,
`forbidden_rules` TEXT NULL,
`status` VARCHAR(50) NOT NULL DEFAULT 'draft',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `world_bibles_project_id_status_idx`(`project_id`, `status`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `characters` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`name` VARCHAR(100) NOT NULL,
`alias_names` JSON NULL,
`role_type` VARCHAR(50) NOT NULL,
`gender_label` VARCHAR(50) NULL,
`age_group` VARCHAR(50) NULL,
`identity_desc` TEXT NULL,
`appearance_desc` TEXT NULL,
`face_desc` TEXT NULL,
`hair_desc` TEXT NULL,
`eye_desc` TEXT NULL,
`body_desc` TEXT NULL,
`costume_rules` TEXT NULL,
`special_props` TEXT NULL,
`personality_desc` TEXT NULL,
`speech_style` TEXT NULL,
`relationship_desc` TEXT NULL,
`character_arc` TEXT NULL,
`negative_rules` TEXT NULL,
`anchor_asset_id` BIGINT NULL,
`importance_level` INTEGER NOT NULL DEFAULT 0,
`status` VARCHAR(50) NOT NULL DEFAULT 'draft',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
INDEX `characters_project_id_role_type_idx`(`project_id`, `role_type`),
INDEX `characters_project_id_status_idx`(`project_id`, `status`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `character_images` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`character_id` BIGINT NOT NULL,
`asset_id` BIGINT NULL,
`image_type` VARCHAR(50) NOT NULL,
`prompt_text` TEXT NULL,
`negative_prompt` TEXT NULL,
`is_anchor` BOOLEAN NOT NULL DEFAULT false,
`quality_score` DECIMAL(5, 2) NULL,
`status` VARCHAR(50) NOT NULL DEFAULT 'pending',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `character_images_project_id_idx`(`project_id`),
INDEX `character_images_character_id_image_type_idx`(`character_id`, `image_type`),
INDEX `character_images_character_id_is_anchor_idx`(`character_id`, `is_anchor`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `character_memories` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`character_id` BIGINT NOT NULL,
`episode_id` BIGINT NULL,
`memory_type` VARCHAR(50) NOT NULL,
`content` TEXT NOT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `character_memories_project_id_character_id_idx`(`project_id`, `character_id`),
INDEX `character_memories_project_id_episode_id_idx`(`project_id`, `episode_id`),
INDEX `character_memories_memory_type_idx`(`memory_type`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `episodes` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`episode_no` INTEGER NOT NULL,
`source_chapter_ids` JSON NULL,
`title` VARCHAR(255) NULL,
`summary` TEXT NULL,
`opening_hook` TEXT NULL,
`middle_conflict` TEXT NULL,
`ending_hook` TEXT NULL,
`target_duration` INTEGER NULL,
`status` VARCHAR(50) NOT NULL DEFAULT 'draft',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
INDEX `episodes_project_id_status_idx`(`project_id`, `status`),
UNIQUE INDEX `episodes_project_id_episode_no_key`(`project_id`, `episode_no`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `episode_scripts` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`episode_id` BIGINT NOT NULL,
`script_text` LONGTEXT NULL,
`narration_text` LONGTEXT NULL,
`dialogue_json` JSON NULL,
`version` INTEGER NOT NULL DEFAULT 1,
`status` VARCHAR(50) NOT NULL DEFAULT 'draft',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
INDEX `episode_scripts_project_id_idx`(`project_id`),
INDEX `episode_scripts_episode_id_version_idx`(`episode_id`, `version`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `storyboard_shots` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`episode_id` BIGINT NOT NULL,
`shot_no` INTEGER NOT NULL,
`scene_name` VARCHAR(255) NULL,
`location_desc` TEXT NULL,
`characters_json` JSON NULL,
`visual_desc` TEXT NULL,
`action_desc` TEXT NULL,
`dialogue_text` TEXT NULL,
`narration_text` TEXT NULL,
`camera_motion` VARCHAR(100) NULL,
`effect_type` VARCHAR(100) NULL,
`duration` DECIMAL(6, 2) NULL,
`prompt_text` TEXT NULL,
`negative_prompt` TEXT NULL,
`status` VARCHAR(50) NOT NULL DEFAULT 'draft',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
INDEX `storyboard_shots_project_id_episode_id_shot_no_idx`(`project_id`, `episode_id`, `shot_no`),
INDEX `storyboard_shots_project_id_status_idx`(`project_id`, `status`),
UNIQUE INDEX `storyboard_shots_episode_id_shot_no_key`(`episode_id`, `shot_no`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `shot_images` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`episode_id` BIGINT NULL,
`shot_id` BIGINT NOT NULL,
`asset_id` BIGINT NULL,
`image_type` VARCHAR(50) NOT NULL DEFAULT 'preview',
`prompt_text` TEXT NULL,
`negative_prompt` TEXT NULL,
`quality_score` DECIMAL(5, 2) NULL,
`status` VARCHAR(50) NOT NULL DEFAULT 'pending',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `shot_images_project_id_episode_id_idx`(`project_id`, `episode_id`),
INDEX `shot_images_shot_id_image_type_idx`(`shot_id`, `image_type`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `plot_memories` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`episode_id` BIGINT NULL,
`chapter_id` BIGINT NULL,
`memory_type` VARCHAR(50) NOT NULL,
`content` TEXT NOT NULL,
`importance_level` INTEGER NOT NULL DEFAULT 0,
`status` VARCHAR(50) NOT NULL DEFAULT 'active',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `plot_memories_project_id_episode_id_idx`(`project_id`, `episode_id`),
INDEX `plot_memories_project_id_memory_type_idx`(`project_id`, `memory_type`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `plot_threads` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`thread_name` VARCHAR(255) NOT NULL,
`thread_type` VARCHAR(80) NOT NULL,
`description` TEXT NULL,
`start_episode_no` INTEGER NULL,
`expected_resolve_episode_no` INTEGER NULL,
`resolved_episode_no` INTEGER NULL,
`status` VARCHAR(50) NOT NULL DEFAULT 'open',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
INDEX `plot_threads_project_id_status_idx`(`project_id`, `status`),
INDEX `plot_threads_project_id_thread_type_idx`(`project_id`, `thread_type`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `continuity_checks` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`episode_id` BIGINT NULL,
`check_type` VARCHAR(80) NOT NULL,
`result_status` VARCHAR(50) NOT NULL,
`issue_text` TEXT NULL,
`suggestion_text` TEXT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `continuity_checks_project_id_episode_id_idx`(`project_id`, `episode_id`),
INDEX `continuity_checks_result_status_idx`(`result_status`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `assets` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`user_id` BIGINT NULL,
`project_id` BIGINT NULL,
`asset_type` VARCHAR(50) NOT NULL,
`file_path` VARCHAR(500) NOT NULL,
`file_url` VARCHAR(500) NULL,
`mime_type` VARCHAR(100) NULL,
`width` INTEGER NULL,
`height` INTEGER NULL,
`duration` DECIMAL(10, 2) NULL,
`size` BIGINT NULL,
`hash` VARCHAR(128) NULL,
`visibility` VARCHAR(30) NOT NULL DEFAULT 'private',
`status` VARCHAR(50) NOT NULL DEFAULT 'active',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `assets_project_id_asset_type_idx`(`project_id`, `asset_type`),
INDEX `assets_user_id_asset_type_idx`(`user_id`, `asset_type`),
INDEX `assets_hash_idx`(`hash`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `render_tasks` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`episode_id` BIGINT NULL,
`shot_id` BIGINT NULL,
`task_type` VARCHAR(80) NOT NULL,
`provider_id` BIGINT NULL,
`status` VARCHAR(50) NOT NULL DEFAULT 'pending',
`input_json` JSON NULL,
`input_hash` VARCHAR(128) NULL,
`idempotency_key` VARCHAR(191) NULL,
`output_asset_id` BIGINT NULL,
`provider_request_id` VARCHAR(255) NULL,
`retry_count` INTEGER NOT NULL DEFAULT 0,
`max_retry` INTEGER NOT NULL DEFAULT 0,
`cost_estimate` DECIMAL(12, 4) NULL,
`cost_actual` DECIMAL(12, 4) NULL,
`error_code` VARCHAR(100) NULL,
`error_message` TEXT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`started_at` DATETIME(3) NULL,
`finished_at` DATETIME(3) NULL,
UNIQUE INDEX `render_tasks_idempotency_key_key`(`idempotency_key`),
INDEX `render_tasks_project_id_status_idx`(`project_id`, `status`),
INDEX `render_tasks_task_type_status_idx`(`task_type`, `status`),
INDEX `render_tasks_project_id_episode_id_idx`(`project_id`, `episode_id`),
INDEX `render_tasks_input_hash_idx`(`input_hash`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `provider_configs` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`provider_type` VARCHAR(80) NOT NULL,
`provider_code` VARCHAR(100) NOT NULL,
`display_name` VARCHAR(100) NULL,
`mode` VARCHAR(50) NOT NULL DEFAULT 'mock',
`model_name` VARCHAR(100) NULL,
`config_json` JSON NULL,
`fallback_provider_id` BIGINT NULL,
`is_enabled` BOOLEAN NOT NULL DEFAULT true,
`priority` INTEGER NOT NULL DEFAULT 0,
`rate_limit_json` JSON NULL,
`cost_rule_json` JSON NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
INDEX `provider_configs_provider_type_is_enabled_idx`(`provider_type`, `is_enabled`),
UNIQUE INDEX `provider_configs_provider_type_provider_code_key`(`provider_type`, `provider_code`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `provider_logs` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`provider_id` BIGINT NULL,
`task_id` BIGINT NULL,
`project_id` BIGINT NULL,
`provider_type` VARCHAR(80) NOT NULL,
`provider_code` VARCHAR(100) NULL,
`model_name` VARCHAR(100) NULL,
`request_json` JSON NULL,
`response_json` JSON NULL,
`input_size` INTEGER NULL,
`output_size` INTEGER NULL,
`cost_estimate` DECIMAL(12, 4) NULL,
`cost_actual` DECIMAL(12, 4) NULL,
`status` VARCHAR(50) NOT NULL DEFAULT 'success',
`error_code` VARCHAR(100) NULL,
`error_message` TEXT NULL,
`started_at` DATETIME(3) NULL,
`finished_at` DATETIME(3) NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `provider_logs_provider_type_status_idx`(`provider_type`, `status`),
INDEX `provider_logs_project_id_idx`(`project_id`),
INDEX `provider_logs_task_id_idx`(`task_id`),
INDEX `provider_logs_created_at_idx`(`created_at`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `orders` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`user_id` BIGINT NOT NULL,
`project_id` BIGINT NULL,
`order_no` VARCHAR(100) NOT NULL,
`package_code` VARCHAR(100) NULL,
`amount` DECIMAL(12, 2) NOT NULL DEFAULT 0,
`currency` VARCHAR(20) NOT NULL DEFAULT 'CNY',
`payment_method` VARCHAR(50) NULL,
`payment_status` VARCHAR(50) NOT NULL DEFAULT 'pending',
`paid_at` DATETIME(3) NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
UNIQUE INDEX `orders_order_no_key`(`order_no`),
INDEX `orders_user_id_payment_status_idx`(`user_id`, `payment_status`),
INDEX `orders_project_id_idx`(`project_id`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `quota_accounts` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`user_id` BIGINT NOT NULL,
`total_quota` DECIMAL(12, 2) NOT NULL DEFAULT 0,
`available_quota` DECIMAL(12, 2) NOT NULL DEFAULT 0,
`frozen_quota` DECIMAL(12, 2) NOT NULL DEFAULT 0,
`used_quota` DECIMAL(12, 2) NOT NULL DEFAULT 0,
`status` VARCHAR(50) NOT NULL DEFAULT 'active',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
UNIQUE INDEX `quota_accounts_user_id_key`(`user_id`),
INDEX `quota_accounts_status_idx`(`status`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `quota_logs` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`user_id` BIGINT NOT NULL,
`project_id` BIGINT NULL,
`task_id` BIGINT NULL,
`change_type` VARCHAR(50) NOT NULL,
`amount` DECIMAL(12, 2) NOT NULL,
`balance_after` DECIMAL(12, 2) NULL,
`reason` VARCHAR(255) NULL,
`metadata_json` JSON NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `quota_logs_user_id_created_at_idx`(`user_id`, `created_at`),
INDEX `quota_logs_project_id_idx`(`project_id`),
INDEX `quota_logs_task_id_idx`(`task_id`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `revision_requests` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`user_id` BIGINT NOT NULL,
`revision_type` VARCHAR(50) NOT NULL,
`target_type` VARCHAR(80) NULL,
`target_id` BIGINT NULL,
`description` TEXT NOT NULL,
`status` VARCHAR(50) NOT NULL DEFAULT 'pending',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
INDEX `revision_requests_project_id_status_idx`(`project_id`, `status`),
INDEX `revision_requests_user_id_status_idx`(`user_id`, `status`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `content_reviews` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NULL,
`user_id` BIGINT NULL,
`target_type` VARCHAR(80) NOT NULL,
`target_id` BIGINT NULL,
`review_type` VARCHAR(80) NOT NULL,
`result_status` VARCHAR(50) NOT NULL DEFAULT 'pending',
`risk_level` VARCHAR(50) NULL,
`issue_text` TEXT NULL,
`suggestion_text` TEXT NULL,
`reviewer_id` BIGINT NULL,
`reviewed_at` DATETIME(3) NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
INDEX `content_reviews_project_id_result_status_idx`(`project_id`, `result_status`),
INDEX `content_reviews_target_type_target_id_idx`(`target_type`, `target_id`),
INDEX `content_reviews_review_type_result_status_idx`(`review_type`, `result_status`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `case_showcases` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`user_id` BIGINT NULL,
`title` VARCHAR(255) NOT NULL,
`cover_asset_id` BIGINT NULL,
`video_asset_id` BIGINT NULL,
`authorization_status` VARCHAR(50) NOT NULL DEFAULT 'pending',
`visibility` VARCHAR(30) NOT NULL DEFAULT 'private',
`sort_order` INTEGER NOT NULL DEFAULT 0,
`published_at` DATETIME(3) NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
INDEX `case_showcases_visibility_sort_order_idx`(`visibility`, `sort_order`),
INDEX `case_showcases_project_id_idx`(`project_id`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `analytics_events` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`project_id` BIGINT NOT NULL,
`episode_id` BIGINT NULL,
`event_type` VARCHAR(80) NOT NULL,
`platform` VARCHAR(80) NULL,
`metric_json` JSON NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `analytics_events_project_id_idx`(`project_id`),
INDEX `analytics_events_episode_id_idx`(`episode_id`),
INDEX `analytics_events_event_type_created_at_idx`(`event_type`, `created_at`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `system_configs` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`config_key` VARCHAR(191) NOT NULL,
`config_value` JSON NULL,
`description` TEXT NULL,
`is_public` BOOLEAN NOT NULL DEFAULT false,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
UNIQUE INDEX `system_configs_config_key_key`(`config_key`),
INDEX `system_configs_is_public_idx`(`is_public`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `operation_logs` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`user_id` BIGINT NULL,
`operator_role` VARCHAR(50) NULL,
`action` VARCHAR(100) NOT NULL,
`target_type` VARCHAR(80) NULL,
`target_id` BIGINT NULL,
`ip` VARCHAR(80) NULL,
`user_agent` TEXT NULL,
`metadata_json` JSON NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `operation_logs_user_id_created_at_idx`(`user_id`, `created_at`),
INDEX `operation_logs_target_type_target_id_idx`(`target_type`, `target_id`),
INDEX `operation_logs_action_created_at_idx`(`action`, `created_at`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;