-- ============================
--  AIOJ 博客服务 数据库表结构
--  创建时间: 2025-01-21
--  功能: 社区博客系统，支持文章发布、分类、标签、评论、点赞、收藏等
--  数据库: 与其他服务共用 aioj_dev/aioj_test/aioj_prod
-- ============================

-- =============================================
-- 1. 文章分类表
-- =============================================
CREATE TABLE IF NOT EXISTS `blog_category` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` VARCHAR(50) NOT NULL COMMENT '分类名称',
  `slug` VARCHAR(50) NOT NULL COMMENT '分类别名（URL友好标识）',
  `description` VARCHAR(200) COMMENT '分类描述',
  `icon` VARCHAR(100) COMMENT '分类图标',
  `sort_order` INT DEFAULT 0 COMMENT '排序序号（越小越靠前）',
  `parent_id` BIGINT DEFAULT 0 COMMENT '父分类ID（0表示顶级分类）',
  `article_count` INT DEFAULT 0 COMMENT '该分类下的文章数量',
  `is_enabled` TINYINT(1) DEFAULT 1 COMMENT '是否启用（1=启用，0=禁用）',
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_slug` (`slug`),
  KEY `idx_parent_id` (`parent_id`),
  KEY `idx_sort_order` (`sort_order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章分类表';

-- =============================================
-- 2. 文章标签表
-- =============================================
CREATE TABLE IF NOT EXISTS `blog_tag` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` VARCHAR(50) NOT NULL COMMENT '标签名称',
  `slug` VARCHAR(50) NOT NULL COMMENT '标签别名（URL友好标识）',
  `description` VARCHAR(200) COMMENT '标签描述',
  `color` VARCHAR(20) COMMENT '标签颜色（十六进制）',
  `article_count` INT DEFAULT 0 COMMENT '使用该标签的文章数量',
  `is_enabled` TINYINT(1) DEFAULT 1 COMMENT '是否启用（1=启用，0=禁用）',
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_slug` (`slug`),
  KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章标签表';

-- =============================================
-- 3. 文章表
-- =============================================
CREATE TABLE IF NOT EXISTS `blog_article` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
  `title` VARCHAR(200) NOT NULL COMMENT '文章标题',
  `slug` VARCHAR(200) COMMENT '文章别名（URL友好标识，用于SEO）',
  `summary` VARCHAR(500) COMMENT '文章摘要',
  `content` MEDIUMTEXT NOT NULL COMMENT '文章内容（Markdown格式）',
  `content_html` MEDIUMTEXT COMMENT '渲染后的HTML内容（可选缓存）',
  `cover_image` VARCHAR(500) COMMENT '封面图片URL',
  `author_id` BIGINT NOT NULL COMMENT '作者用户ID',
  `category_id` BIGINT NOT NULL COMMENT '分类ID',
  `view_count` INT DEFAULT 0 COMMENT '浏览次数',
  `like_count` INT DEFAULT 0 COMMENT '点赞数（冗余字段，便于查询）',
  `comment_count` INT DEFAULT 0 COMMENT '评论数（冗余字段，便于查询）',
  `collect_count` INT DEFAULT 0 COMMENT '收藏数（冗余字段，便于查询）',
  `is_top` TINYINT(1) DEFAULT 0 COMMENT '是否置顶（1=置顶，0=普通）',
  `is_essence` TINYINT(1) DEFAULT 0 COMMENT '是否精华（1=精华，0=普通）',
  `is_published` TINYINT(1) DEFAULT 1 COMMENT '是否发布（1=已发布，0=草稿）',
  `status` TINYINT DEFAULT 1 COMMENT '文章状态：1=正常，2=审核中，3=已关闭，4=已删除',
  `publish_time` DATETIME COMMENT '发布时间',
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_slug` (`slug`),
  KEY `idx_author_id` (`author_id`),
  KEY `idx_category_id` (`category_id`),
  KEY `idx_status` (`status`),
  KEY `idx_is_published` (`is_published`),
  KEY `idx_is_top` (`is_top`),
  KEY `idx_publish_time` (`publish_time`),
  KEY `idx_view_count` (`view_count`),
  KEY `idx_like_count` (`like_count`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章表';

-- =============================================
-- 4. 文章标签关联表（多对多）
-- =============================================
CREATE TABLE IF NOT EXISTS `blog_article_tag` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
  `article_id` BIGINT NOT NULL COMMENT '文章ID',
  `tag_id` BIGINT NOT NULL COMMENT '标签ID',
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_article_tag` (`article_id`, `tag_id`),
  KEY `idx_tag_id` (`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章标签关联表';

-- =============================================
-- 5. 评论表
-- =============================================
CREATE TABLE IF NOT EXISTS `blog_comment` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
  `article_id` BIGINT NOT NULL COMMENT '文章ID',
  `user_id` BIGINT NOT NULL COMMENT '评论用户ID',
  `parent_id` BIGINT DEFAULT 0 COMMENT '父评论ID（0表示一级评论）',
  `reply_to_id` BIGINT DEFAULT 0 COMMENT '回复的评论ID（用于@提醒）',
  `content` TEXT NOT NULL COMMENT '评论内容（支持Markdown）',
  `content_html` TEXT COMMENT '渲染后的HTML内容',
  `like_count` INT DEFAULT 0 COMMENT '点赞数',
  `reply_count` INT DEFAULT 0 COMMENT '回复数',
  `is_author` TINYINT(1) DEFAULT 0 COMMENT '是否为作者评论（1=是，0=否）',
  `status` TINYINT DEFAULT 1 COMMENT '状态：1=正常，2=待审核，3=已删除',
  `ip_address` VARCHAR(50) COMMENT 'IP地址',
  `user_agent` VARCHAR(500) COMMENT '用户代理',
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_article_id` (`article_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_parent_id` (`parent_id`),
  KEY `idx_status` (`status`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='评论表';

-- =============================================
-- 6. 点赞表
-- =============================================
CREATE TABLE IF NOT EXISTS `blog_like` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` BIGINT NOT NULL COMMENT '用户ID',
  `target_id` BIGINT NOT NULL COMMENT '目标ID（文章ID或评论ID）',
  `target_type` TINYINT NOT NULL COMMENT '目标类型：1=文章，2=评论',
  `is_cancelled` TINYINT(1) DEFAULT 0 COMMENT '是否已取消（1=已取消，0=有效）',
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_target` (`user_id`, `target_id`, `target_type`),
  KEY `idx_target` (`target_id`, `target_type`),
  KEY `idx_is_cancelled` (`is_cancelled`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='点赞表';

-- =============================================
-- 7. 收藏表
-- =============================================
CREATE TABLE IF NOT EXISTS `blog_collection` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` BIGINT NOT NULL COMMENT '用户ID',
  `article_id` BIGINT NOT NULL COMMENT '文章ID',
  `folder_id` BIGINT DEFAULT 0 COMMENT '收藏夹ID（0表示默认收藏夹）',
  `note` VARCHAR(200) COMMENT '收藏备注',
  `is_cancelled` TINYINT(1) DEFAULT 0 COMMENT '是否已取消（1=已取消，0=有效）',
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_article` (`user_id`, `article_id`),
  KEY `idx_article_id` (`article_id`),
  KEY `idx_folder_id` (`folder_id`),
  KEY `idx_is_cancelled` (`is_cancelled`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='收藏表';

-- =============================================
-- 8. 收藏夹表
-- =============================================
CREATE TABLE IF NOT EXISTS `blog_collection_folder` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` BIGINT NOT NULL COMMENT '用户ID',
  `name` VARCHAR(50) NOT NULL COMMENT '收藏夹名称',
  `description` VARCHAR(200) COMMENT '收藏夹描述',
  `is_public` TINYINT(1) DEFAULT 0 COMMENT '是否公开（1=公开，0=私有）',
  `collect_count` INT DEFAULT 0 COMMENT '收藏数量',
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='收藏夹表';

-- =============================================
-- 9. 浏览记录表
-- =============================================
CREATE TABLE IF NOT EXISTS `blog_view` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
  `article_id` BIGINT NOT NULL COMMENT '文章ID',
  `user_id` BIGINT COMMENT '用户ID（NULL表示游客）',
  `ip_address` VARCHAR(50) COMMENT 'IP地址',
  `user_agent` VARCHAR(500) COMMENT '用户代理',
  `duration` INT DEFAULT 0 COMMENT '浏览时长（秒）',
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_article_id` (`article_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='浏览记录表';

-- =============================================
-- 10. 用户关注表
-- =============================================
CREATE TABLE IF NOT EXISTS `blog_follow` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
  `follower_id` BIGINT NOT NULL COMMENT '关注者ID',
  `following_id` BIGINT NOT NULL COMMENT '被关注者ID',
  `is_cancelled` TINYINT(1) DEFAULT 0 COMMENT '是否已取消（1=已取消，0=有效）',
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_follower_following` (`follower_id`, `following_id`),
  KEY `idx_following_id` (`following_id`),
  KEY `idx_is_cancelled` (`is_cancelled`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户关注表';

-- =============================================
-- 11. 用户社区统计表
-- =============================================
CREATE TABLE IF NOT EXISTS `blog_user_stat` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` BIGINT NOT NULL COMMENT '用户ID',
  `article_count` INT DEFAULT 0 COMMENT '发布文章数',
  `comment_count` INT DEFAULT 0 COMMENT '发表评论数',
  `like_count` INT DEFAULT 0 COMMENT '获得点赞数',
  `collect_count` INT DEFAULT 0 COMMENT '获得收藏数',
  `view_count` INT DEFAULT 0 COMMENT '文章被浏览数',
  `follower_count` INT DEFAULT 0 COMMENT '粉丝数',
  `following_count` INT DEFAULT 0 COMMENT '关注数',
  `level` INT DEFAULT 1 COMMENT '用户等级',
  `experience` INT DEFAULT 0 COMMENT '经验值',
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户社区统计表';

-- =============================================
-- 12. 通知表
-- =============================================
CREATE TABLE IF NOT EXISTS `blog_notification` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` BIGINT NOT NULL COMMENT '接收用户ID',
  `type` TINYINT NOT NULL COMMENT '通知类型：1=评论，2=点赞，3=收藏，4=关注，5=回复，6=系统通知',
  `title` VARCHAR(200) NOT NULL COMMENT '通知标题',
  `content` TEXT COMMENT '通知内容',
  `link_url` VARCHAR(500) COMMENT '跳转链接',
  `sender_id` BIGINT COMMENT '发送者ID（系统通知为NULL）',
  `target_id` BIGINT COMMENT '关联目标ID（文章ID、评论ID等）',
  `is_read` TINYINT(1) DEFAULT 0 COMMENT '是否已读（1=已读，0=未读）',
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_is_read` (`is_read`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='通知表';

-- =============================================
-- 13. 草稿箱表
-- =============================================
CREATE TABLE IF NOT EXISTS `blog_draft` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` BIGINT NOT NULL COMMENT '用户ID',
  `title` VARCHAR(200) COMMENT '文章标题',
  `content` MEDIUMTEXT COMMENT '文章内容（Markdown格式）',
  `category_id` BIGINT COMMENT '分类ID',
  `cover_image` VARCHAR(500) COMMENT '封面图片URL',
  `auto_save` TINYINT(1) DEFAULT 0 COMMENT '是否自动保存（1=是，0=否）',
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_update_time` (`update_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='草稿箱表';

-- =============================================
-- 插入初始数据
-- =============================================

-- 插入默认分类
INSERT INTO `blog_category` (`name`, `slug`, `description`, `icon`, `sort_order`) VALUES
('算法题解', 'algorithm-solutions', '算法题目解题思路和代码分享', '💡', 1),
('学习笔记', 'learning-notes', '各类编程和技术学习笔记', '📝', 2),
('经验分享', 'experience-sharing', '学习和求职经验分享', '💬', 3),
('技术干货', 'tech-tutorials', '实用的技术教程和干货', '🔧', 4),
('职场交流', 'career-talk', '职场话题和交流讨论', '🏢', 5);

-- 插入默认标签
INSERT INTO `blog_tag` (`name`, `slug`, `color`) VALUES
('数据结构', 'data-structure', '#3498db'),
('动态规划', 'dynamic-programming', '#9b59b6'),
('贪心算法', 'greedy', '#2ecc71'),
('图论', 'graph-theory', '#e74c3c'),
('Java', 'java', '#f39c12'),
('Python', 'python', '#3498db'),
('C++', 'cpp', '#00599C'),
('Go', 'go', '#00ADD8'),
('前端', 'frontend', '#e67e22'),
('后端', 'backend', '#1abc9c'),
('系统设计', 'system-design', '#34495e'),
('LeetCode', 'leetcode', '#ffa116');
