Files
AI_OJ/db/blog.sql
2026-01-21 22:50:15 +08:00

293 lines
15 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ============================
-- 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 '父分类ID0表示顶级分类',
`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 '父评论ID0表示一级评论',
`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 '收藏夹ID0表示默认收藏夹',
`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 '用户IDNULL表示游客',
`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');