全项目扫描修复: Docker数据卷修复+安全requireAdmin+12页SEO+API白名单+脚本超时+常量提取+假数据删除
This commit is contained in:
@@ -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`)
|
||||
);
|
||||
Reference in New Issue
Block a user