全项目扫描修复: Docker数据卷修复+安全requireAdmin+12页SEO+API白名单+脚本超时+常量提取+假数据删除

This commit is contained in:
ZhuiGuangAI Dev
2026-06-12 17:27:47 +08:00
parent 464924aea0
commit 4c325c8699
454 changed files with 33647 additions and 980 deletions
@@ -0,0 +1,28 @@
-- AlterTable
ALTER TABLE `bot_memories`
ADD COLUMN `layer` VARCHAR(20) NOT NULL DEFAULT 'LONGTERM',
ADD COLUMN `context_tags` JSON NULL,
ADD COLUMN `ttl` DATETIME(3) NULL;
-- CreateIndex
CREATE INDEX `bot_memories_bot_id_layer_importance_idx` ON `bot_memories`(`bot_id`, `layer`, `importance`);
-- CreateTable
CREATE TABLE `bot_daily_stats` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`bot_id` INTEGER NOT NULL,
`date` DATE NOT NULL,
`topic_created` INTEGER NOT NULL DEFAULT 0,
`reply_sent` INTEGER NOT NULL DEFAULT 0,
`follow_up_sent` INTEGER NOT NULL DEFAULT 0,
`replies_received` INTEGER NOT NULL DEFAULT 0,
`likes_received` INTEGER NOT NULL DEFAULT 0,
`human_interactions` INTEGER NOT NULL DEFAULT 0,
`feedback_processed` INTEGER NOT NULL DEFAULT 0,
`top_topic_id` INTEGER NULL,
`updated_at` DATETIME(3) NOT NULL,
UNIQUE INDEX `bot_daily_stats_bot_id_date_key`(`bot_id`, `date`),
INDEX `bot_daily_stats_date_idx`(`date`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -0,0 +1,44 @@
-- CreateTable
CREATE TABLE `bot_skills` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`bot_id` INTEGER NOT NULL,
`name` VARCHAR(50) NOT NULL,
`category` VARCHAR(30) NOT NULL,
`hook_pattern` TEXT NOT NULL,
`body_template` TEXT NOT NULL,
`applicability` TEXT NULL,
`source_topic_ids` JSON NOT NULL,
`success_rate` DOUBLE NOT NULL DEFAULT 0,
`usage_count` INTEGER NOT NULL DEFAULT 0,
`avg_replies` DOUBLE NOT NULL DEFAULT 0,
`avg_likes` DOUBLE NOT NULL DEFAULT 0,
`version` INTEGER NOT NULL DEFAULT 1,
`is_active` BOOLEAN NOT NULL DEFAULT true,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
INDEX `bot_skills_bot_id_category_is_active_idx`(`bot_id`, `category`, `is_active`),
INDEX `bot_skills_bot_id_success_rate_idx`(`bot_id`, `success_rate`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `bot_weekly_reviews` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`bot_id` INTEGER NOT NULL,
`week_start` DATE NOT NULL,
`week_end` DATE NOT NULL,
`topics_created` INTEGER NOT NULL DEFAULT 0,
`replies_sent` INTEGER NOT NULL DEFAULT 0,
`replies_received` INTEGER NOT NULL DEFAULT 0,
`human_ratio` DOUBLE NOT NULL DEFAULT 0,
`likes_received` INTEGER NOT NULL DEFAULT 0,
`engagement_score` DOUBLE NOT NULL DEFAULT 0,
`next_week_quota` VARCHAR(20) NOT NULL,
`reflection` TEXT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE INDEX `bot_weekly_reviews_bot_id_week_start_key`(`bot_id`, `week_start`),
INDEX `bot_weekly_reviews_bot_id_week_start_idx`(`bot_id`, `week_start`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -0,0 +1,31 @@
-- CreateTable
CREATE TABLE `bot_personas` (
`bot_id` INTEGER NOT NULL,
`avg_reply_length` INTEGER NOT NULL DEFAULT 0,
`question_ratio` DOUBLE NOT NULL DEFAULT 0,
`exclamation_count` INTEGER NOT NULL DEFAULT 0,
`avg_topic_length` INTEGER NOT NULL DEFAULT 0,
`stance_keywords` JSON NULL,
`top_human_users` JSON NULL,
`top_topic_types` JSON NULL,
`last_topic_titles` JSON NULL,
`post_sample_count` INTEGER NOT NULL DEFAULT 0,
`updated_at` DATETIME(3) NOT NULL,
PRIMARY KEY (`bot_id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `bot_cross_forum_affinities` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`bot_id` INTEGER NOT NULL,
`forum_slug` VARCHAR(30) NOT NULL,
`affinity` DOUBLE NOT NULL DEFAULT 0,
`sample_count` INTEGER NOT NULL DEFAULT 0,
`reason` VARCHAR(100) NULL,
`updated_at` DATETIME(3) NOT NULL,
UNIQUE INDEX `bot_cross_forum_affinities_bot_id_forum_slug_key`(`bot_id`, `forum_slug`),
INDEX `bot_cross_forum_affinities_bot_id_affinity_idx`(`bot_id`, `affinity`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -0,0 +1,106 @@
-- 论坛增强:点赞/标签/关注/草稿
-- 2026-06-03
-- AlterTable
ALTER TABLE `forum_categories` ADD COLUMN `follower_count` INTEGER NOT NULL DEFAULT 0;
-- AlterTable
ALTER TABLE `forum_topics` ADD COLUMN `is_featured` BOOLEAN NOT NULL DEFAULT false,
ADD COLUMN `like_count` INTEGER NOT NULL DEFAULT 0;
-- AlterTable
ALTER TABLE `forum_posts` ADD COLUMN `like_count` INTEGER NOT NULL DEFAULT 0;
-- CreateTable
CREATE TABLE `forum_topic_likes` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`topic_id` INTEGER NOT NULL,
`user_id` INTEGER NOT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `forum_topic_likes_user_id_idx`(`user_id`),
UNIQUE INDEX `forum_topic_likes_topic_id_user_id_key`(`topic_id`, `user_id`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `forum_post_likes` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`post_id` INTEGER NOT NULL,
`user_id` INTEGER NOT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `forum_post_likes_user_id_idx`(`user_id`),
UNIQUE INDEX `forum_post_likes_post_id_user_id_key`(`post_id`, `user_id`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `forum_category_follows` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`category_id` INTEGER NOT NULL,
`user_id` INTEGER NOT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `forum_category_follows_user_id_idx`(`user_id`),
UNIQUE INDEX `forum_category_follows_category_id_user_id_key`(`category_id`, `user_id`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `forum_tags` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`slug` VARCHAR(30) NOT NULL,
`topic_count` INTEGER NOT NULL DEFAULT 0,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE INDEX `forum_tags_name_key`(`name`),
UNIQUE INDEX `forum_tags_slug_key`(`slug`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `forum_topic_tags` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`topic_id` INTEGER NOT NULL,
`tag_id` INTEGER NOT NULL,
INDEX `forum_topic_tags_tag_id_idx`(`tag_id`),
UNIQUE INDEX `forum_topic_tags_topic_id_tag_id_key`(`topic_id`, `tag_id`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `forum_drafts` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`user_id` INTEGER NOT NULL,
`category_id` INTEGER NULL,
`title` VARCHAR(100) NULL,
`content` TEXT NOT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
INDEX `forum_drafts_user_id_updated_at_idx`(`user_id`, `updated_at`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- AddForeignKey
ALTER TABLE `forum_topic_likes` ADD CONSTRAINT `forum_topic_likes_topic_id_fkey` FOREIGN KEY (`topic_id`) REFERENCES `forum_topics`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `forum_topic_likes` ADD CONSTRAINT `forum_topic_likes_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `forum_post_likes` ADD CONSTRAINT `forum_post_likes_post_id_fkey` FOREIGN KEY (`post_id`) REFERENCES `forum_posts`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `forum_post_likes` ADD CONSTRAINT `forum_post_likes_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `forum_category_follows` ADD CONSTRAINT `forum_category_follows_category_id_fkey` FOREIGN KEY (`category_id`) REFERENCES `forum_categories`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `forum_category_follows` ADD CONSTRAINT `forum_category_follows_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `forum_topic_tags` ADD CONSTRAINT `forum_topic_tags_topic_id_fkey` FOREIGN KEY (`topic_id`) REFERENCES `forum_topics`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `forum_topic_tags` ADD CONSTRAINT `forum_topic_tags_tag_id_fkey` FOREIGN KEY (`tag_id`) REFERENCES `forum_tags`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `forum_drafts` ADD CONSTRAINT `forum_drafts_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- CreateIndex
CREATE INDEX `forum_topics_category_id_is_pinned_created_at_idx` ON `forum_topics`(`category_id`, `is_pinned`, `created_at`);
CREATE INDEX `forum_topics_is_featured_last_reply_at_idx` ON `forum_topics`(`is_featured`, `last_reply_at`);
CREATE INDEX `forum_posts_user_id_idx` ON `forum_posts`(`user_id`);
@@ -0,0 +1,53 @@
-- 论坛第三阶段增强:通知/收藏/举报/嵌套回复
-- 2026-06-04
-- AlterTable: forum_topics 加 is_hidden 字段
ALTER TABLE `forum_topics` ADD COLUMN `is_hidden` BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE `forum_topics` ADD INDEX `forum_topics_is_hidden_idx`(`is_hidden`);
-- AlterTable: forum_posts 加 reply_to_id / reply_to_snapshot
ALTER TABLE `forum_posts` ADD COLUMN `reply_to_id` INTEGER NULL;
ALTER TABLE `forum_posts` ADD COLUMN `reply_to_snapshot` VARCHAR(300) NULL;
ALTER TABLE `forum_posts` ADD CONSTRAINT `forum_posts_reply_to_id_fkey` FOREIGN KEY (`reply_to_id`) REFERENCES `forum_posts`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE `forum_posts` ADD INDEX `forum_posts_reply_to_id_idx`(`reply_to_id`);
-- AlterTable: forum_topics 加联合全文索引
ALTER TABLE `forum_topics` ADD FULLTEXT INDEX `forum_topics_title_content_idx`(`title`, `content`);
-- CreateTable: 收藏
CREATE TABLE `forum_topic_bookmarks` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`topic_id` INTEGER NOT NULL,
`user_id` INTEGER NOT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE INDEX `forum_topic_bookmarks_topic_id_user_id_key`(`topic_id`, `user_id`),
INDEX `forum_topic_bookmarks_user_id_created_at_idx`(`user_id`, `created_at`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `forum_topic_bookmarks` ADD CONSTRAINT `forum_topic_bookmarks_topic_id_fkey` FOREIGN KEY (`topic_id`) REFERENCES `forum_topics`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `forum_topic_bookmarks` ADD CONSTRAINT `forum_topic_bookmarks_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- CreateTable: 举报
CREATE TABLE `forum_reports` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`reporter_id` INTEGER NOT NULL,
`topic_id` INTEGER NULL,
`post_id` INTEGER NULL,
`reason` VARCHAR(50) NOT NULL,
`detail` VARCHAR(500) NULL,
`status` VARCHAR(20) NOT NULL DEFAULT 'pending',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`resolved_at` DATETIME(3) NULL,
PRIMARY KEY (`id`),
INDEX `forum_reports_status_created_at_idx`(`status`, `created_at`),
INDEX `forum_reports_reporter_id_idx`(`reporter_id`),
INDEX `forum_reports_topic_id_idx`(`topic_id`),
INDEX `forum_reports_post_id_idx`(`post_id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `forum_reports` ADD CONSTRAINT `forum_reports_reporter_id_fkey` FOREIGN KEY (`reporter_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `forum_reports` ADD CONSTRAINT `forum_reports_topic_id_fkey` FOREIGN KEY (`topic_id`) REFERENCES `forum_topics`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AlterTable: notifications 增加新枚举值
ALTER TABLE `notifications` MODIFY COLUMN `type` ENUM('COMMENT_REPLY','COMMENT_LIKE','TOPIC_REPLY','MENTION','BEST_ANSWER','POST_LIKE','TOPIC_LIKE','SYSTEM') NOT NULL;
@@ -0,0 +1,44 @@
-- 论坛第四阶段增强:签到、举报处理、隐藏回复、审核日志
-- 2026-06-05
-- AlterTable: forum_posts 增加 is_hidden 字段
ALTER TABLE `forum_posts` ADD COLUMN `is_hidden` BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE `forum_posts` ADD INDEX `forum_posts_is_hidden_idx`(`is_hidden`);
-- AlterTable: forum_reports 增加 resolution/resolvedBy
ALTER TABLE `forum_reports` ADD COLUMN `resolution` VARCHAR(20) NULL;
ALTER TABLE `forum_reports` ADD COLUMN `resolved_by` INTEGER NULL;
ALTER TABLE `forum_reports` ADD CONSTRAINT `forum_reports_resolved_by_fkey` FOREIGN KEY (`resolved_by`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE `forum_reports` ADD INDEX `forum_reports_resolved_by_idx`(`resolved_by`);
-- CreateTable: 每日签到
CREATE TABLE `forum_check_ins` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`user_id` INTEGER NOT NULL,
`check_in_date` DATE NOT NULL,
`streak` INTEGER NOT NULL DEFAULT 1,
`points_earned` INTEGER NOT NULL DEFAULT 0,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE INDEX `forum_check_ins_user_id_check_in_date_key`(`user_id`, `check_in_date`),
INDEX `forum_check_ins_user_id_check_in_date_idx`(`user_id`, `check_in_date`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `forum_check_ins` ADD CONSTRAINT `forum_check_ins_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- CreateTable: 审核日志
CREATE TABLE `forum_moderation_logs` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`actor_id` INTEGER NOT NULL,
`target_type` VARCHAR(20) NOT NULL,
`target_id` INTEGER NOT NULL,
`action` VARCHAR(30) NOT NULL,
`reason` VARCHAR(200) NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
INDEX `forum_moderation_logs_actor_id_created_at_idx`(`actor_id`, `created_at`),
INDEX `forum_moderation_logs_target_type_target_id_idx`(`target_type`, `target_id`),
INDEX `forum_moderation_logs_created_at_idx`(`created_at`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `forum_moderation_logs` ADD CONSTRAINT `forum_moderation_logs_actor_id_fkey` FOREIGN KEY (`actor_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,42 @@
-- Forum Phase 5: Achievement system + topic subscriptions
CREATE TABLE `achievements` (
`key` VARCHAR(50) NOT NULL,
`name` VARCHAR(50) NOT NULL,
`description` VARCHAR(200) NOT NULL,
`icon` VARCHAR(20) NOT NULL,
`tier` VARCHAR(20) NOT NULL DEFAULT 'bronze',
`points` INT NOT NULL DEFAULT 0,
`category` VARCHAR(30) NOT NULL DEFAULT 'general',
`sort_order` INT NOT NULL DEFAULT 0,
`is_active` BOOLEAN NOT NULL DEFAULT TRUE,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`key`),
INDEX `achievements_category_is_active_sort_order_idx`(`category`, `is_active`, `sort_order`)
);
CREATE TABLE `user_achievements` (
`id` INT NOT NULL AUTO_INCREMENT,
`user_id` INT NOT NULL,
`achievement_key` VARCHAR(50) NOT NULL,
`progress` INT NOT NULL DEFAULT 0,
`unlocked_at` DATETIME(3) NULL,
`notified_at` DATETIME(3) NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE INDEX `user_achievements_user_id_achievement_key_key`(`user_id`, `achievement_key`),
INDEX `user_achievements_user_id_unlocked_at_idx`(`user_id`, `unlocked_at`),
INDEX `user_achievements_achievement_key_idx`(`achievement_key`)
);
CREATE TABLE `forum_topic_subscriptions` (
`id` INT NOT NULL AUTO_INCREMENT,
`topic_id` INT NOT NULL,
`user_id` INT NOT NULL,
`notify_reply` BOOLEAN NOT NULL DEFAULT TRUE,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE INDEX `forum_topic_subscriptions_topic_id_user_id_key`(`topic_id`, `user_id`),
INDEX `forum_topic_subscriptions_user_id_created_at_idx`(`user_id`, `created_at`)
);
@@ -0,0 +1,87 @@
-- Bot Persona A/B Testing
-- Adds: bot_persona_variants, bot_persona_experiments, bot_persona_assignments, bot_persona_metrics
CREATE TABLE `bot_persona_variants` (
`id` INT NOT NULL AUTO_INCREMENT,
`bot_id` INT NOT NULL,
`experiment_id` INT NULL,
`variant_key` VARCHAR(20) NOT NULL,
`label` VARCHAR(50) NOT NULL,
`description` VARCHAR(200) NULL,
`stance_keywords` JSON NULL,
`top_topic_types` JSON NULL,
`top_human_users` JSON NULL,
`style_hints` JSON NULL,
`weight` FLOAT NOT NULL DEFAULT 0.5,
`is_control` BOOLEAN NOT NULL DEFAULT FALSE,
`is_active` BOOLEAN NOT NULL DEFAULT TRUE,
`sample_count` INT NOT NULL DEFAULT 0,
`reply_count` INT NOT NULL DEFAULT 0,
`like_count` INT NOT NULL DEFAULT 0,
`human_reply_count` INT NOT NULL DEFAULT 0,
`engagement_score` FLOAT NOT NULL DEFAULT 0,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE INDEX `bot_persona_variants_bot_id_variant_key_key`(`bot_id`, `variant_key`),
INDEX `bot_persona_variants_bot_id_is_active_idx`(`bot_id`, `is_active`),
INDEX `bot_persona_variants_experiment_id_idx`(`experiment_id`)
);
CREATE TABLE `bot_persona_experiments` (
`id` INT NOT NULL AUTO_INCREMENT,
`bot_id` INT NOT NULL,
`name` VARCHAR(80) NOT NULL,
`description` VARCHAR(200) NULL,
`status` VARCHAR(20) NOT NULL DEFAULT 'active',
`winner_variant_key` VARCHAR(20) NULL,
`min_samples_per_arm` INT NOT NULL DEFAULT 20,
`significance_level` FLOAT NOT NULL DEFAULT 0.1,
`primary_metric` VARCHAR(30) NOT NULL DEFAULT 'engagement_score',
`config` JSON NULL,
`started_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`ended_at` DATETIME(3) NULL,
`last_analyzed_at` DATETIME(3) NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
INDEX `bot_persona_experiments_bot_id_status_idx`(`bot_id`, `status`),
INDEX `bot_persona_experiments_status_idx`(`status`)
);
CREATE TABLE `bot_persona_assignments` (
`id` INT NOT NULL AUTO_INCREMENT,
`bot_id` INT NOT NULL,
`variant_id` INT NOT NULL,
`ref_type` VARCHAR(20) NOT NULL,
`ref_id` INT NOT NULL,
`forum_slug` VARCHAR(30) NULL,
`replies` INT NOT NULL DEFAULT 0,
`likes` INT NOT NULL DEFAULT 0,
`human_replies` INT NOT NULL DEFAULT 0,
`impressions` INT NOT NULL DEFAULT 0,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE INDEX `bot_persona_assignments_ref_type_ref_id_key`(`ref_type`, `ref_id`),
INDEX `bot_persona_assignments_bot_id_variant_id_idx`(`bot_id`, `variant_id`),
INDEX `bot_persona_assignments_variant_id_created_at_idx`(`variant_id`, `created_at`)
);
CREATE TABLE `bot_persona_metrics` (
`id` INT NOT NULL AUTO_INCREMENT,
`variant_id` INT NOT NULL,
`date` DATE NOT NULL,
`impressions` INT NOT NULL DEFAULT 0,
`replies` INT NOT NULL DEFAULT 0,
`likes` INT NOT NULL DEFAULT 0,
`human_replies` INT NOT NULL DEFAULT 0,
`content_count` INT NOT NULL DEFAULT 0,
`avg_replies` FLOAT NOT NULL DEFAULT 0,
`avg_likes` FLOAT NOT NULL DEFAULT 0,
`computed_score` FLOAT NOT NULL DEFAULT 0,
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE INDEX `bot_persona_metrics_variant_id_date_key`(`variant_id`, `date`),
INDEX `bot_persona_metrics_date_idx`(`date`)
);
@@ -0,0 +1,30 @@
-- 数字人 vs 真人"对抗学习"
-- 每周为每个 bot 选 1 个真实高赞真人帖,让 bot 吸收其"为什么高互动"的洞察
CREATE TABLE `bot_adversarial_learnings` (
`id` INT NOT NULL AUTO_INCREMENT,
`bot_id` INT NOT NULL,
`week_key` VARCHAR(20) NOT NULL,
`source_ref_type` VARCHAR(20) NOT NULL,
`source_ref_id` INT NOT NULL,
`source_user_id` INT NOT NULL,
`source_user_name` VARCHAR(50) NULL,
`forum_slug` VARCHAR(30) NULL,
`source_title` VARCHAR(200) NULL,
`source_content` TEXT NOT NULL,
`source_metrics` JSON NOT NULL,
`relevance_score` DOUBLE NOT NULL DEFAULT 0,
`learned_insight` TEXT NOT NULL,
`learn_categories` JSON NULL,
`status` VARCHAR(20) NOT NULL DEFAULT 'active',
`used_count` INT NOT NULL DEFAULT 0,
`learned_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`expires_at` DATETIME(3) NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE INDEX `bot_adversarial_learnings_bot_id_week_key_key`(`bot_id`, `week_key`),
INDEX `bot_adversarial_learnings_bot_id_status_idx`(`bot_id`, `status`),
INDEX `bot_adversarial_learnings_week_key_idx`(`week_key`),
INDEX `bot_adversarial_learnings_source_ref_type_source_ref_id_idx`(`source_ref_type`, `source_ref_id`)
);