-- ============================ -- 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');