Files
AI_OJ/db/blog.sql
2026-01-20 17:20:03 +08:00

225 lines
12 KiB
SQL
Raw 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 博客服务数据库表结构
-- 数据库: aioj_blog
-- 描述: 用于用户发帖、分享技术经验、写文章
-- ============================================
-- 创建数据库
CREATE DATABASE IF NOT EXISTS `aioj_blog` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `aioj_blog`;
-- ============================================
-- 1. 文章分类表
-- ============================================
DROP TABLE IF EXISTS `blog_category`;
CREATE TABLE `blog_category` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '分类ID',
`name` VARCHAR(50) NOT NULL COMMENT '分类名称',
`slug` VARCHAR(50) NOT NULL COMMENT '分类别名用于URL',
`description` VARCHAR(200) DEFAULT NULL COMMENT '分类描述',
`icon` VARCHAR(100) DEFAULT NULL COMMENT '分类图标',
`parent_id` BIGINT UNSIGNED DEFAULT 0 COMMENT '父分类ID0表示顶级分类',
`sort_order` INT DEFAULT 0 COMMENT '排序权重,数值越大越靠前',
`article_count` INT UNSIGNED DEFAULT 0 COMMENT '该分类下的文章数量',
`is_deleted` TINYINT(1) DEFAULT 0 COMMENT '是否删除0-否1-是',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL 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. 文章标签表
-- ============================================
DROP TABLE IF EXISTS `blog_tag`;
CREATE TABLE `blog_tag` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '标签ID',
`name` VARCHAR(30) NOT NULL COMMENT '标签名称',
`slug` VARCHAR(30) NOT NULL COMMENT '标签别名用于URL',
`description` VARCHAR(200) DEFAULT NULL COMMENT '标签描述',
`color` VARCHAR(7) DEFAULT NULL COMMENT '标签颜色(十六进制)',
`article_count` INT UNSIGNED DEFAULT 0 COMMENT '该标签下的文章数量',
`is_deleted` TINYINT(1) DEFAULT 0 COMMENT '是否删除0-否1-是',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL 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. 文章表
-- ============================================
DROP TABLE IF EXISTS `blog_article`;
CREATE TABLE `blog_article` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '文章ID',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '作者用户ID',
`category_id` BIGINT UNSIGNED NOT NULL COMMENT '分类ID',
`title` VARCHAR(200) NOT NULL COMMENT '文章标题',
`slug` VARCHAR(200) DEFAULT NULL COMMENT '文章别名用于URL唯一',
`summary` VARCHAR(500) DEFAULT NULL COMMENT '文章摘要',
`cover_image` VARCHAR(500) DEFAULT NULL COMMENT '封面图片URL',
`content` MEDIUMTEXT NOT NULL COMMENT '文章内容Markdown格式',
`content_html` MEDIUMTEXT DEFAULT NULL COMMENT '文章内容HTML格式缓存用',
`view_count` BIGINT UNSIGNED DEFAULT 0 COMMENT '浏览次数',
`like_count` INT UNSIGNED DEFAULT 0 COMMENT '点赞数',
`comment_count` INT UNSIGNED DEFAULT 0 COMMENT '评论数',
`favorite_count` INT UNSIGNED DEFAULT 0 COMMENT '收藏数',
`is_top` TINYINT(1) DEFAULT 0 COMMENT '是否置顶0-否1-是',
`is_featured` TINYINT(1) DEFAULT 0 COMMENT '是否精选0-否1-是',
`is_original` TINYINT(1) DEFAULT 1 COMMENT '是否原创0-转载1-原创',
`source_url` VARCHAR(500) DEFAULT NULL COMMENT '转载来源URL',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '文章状态0-草稿1-已发布2-审核中3-已下架',
`publish_time` DATETIME DEFAULT NULL COMMENT '发布时间',
`is_deleted` TINYINT(1) DEFAULT 0 COMMENT '是否删除0-否1-是',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_slug` (`slug`),
KEY `idx_user_id` (`user_id`),
KEY `idx_category_id` (`category_id`),
KEY `idx_status` (`status`),
KEY `idx_is_top` (`is_top`),
KEY `idx_publish_time` (`publish_time`),
KEY `idx_view_count` (`view_count`),
FULLTEXT KEY `ft_title_content` (`title`, `content`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章表';
-- ============================================
-- 4. 文章标签关联表(多对多)
-- ============================================
DROP TABLE IF EXISTS `blog_article_tag`;
CREATE TABLE `blog_article_tag` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '关联ID',
`article_id` BIGINT UNSIGNED NOT NULL COMMENT '文章ID',
`tag_id` BIGINT UNSIGNED NOT NULL COMMENT '标签ID',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_article_tag` (`article_id`, `tag_id`),
KEY `idx_article_id` (`article_id`),
KEY `idx_tag_id` (`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章标签关联表';
-- ============================================
-- 5. 评论表
-- ============================================
DROP TABLE IF EXISTS `blog_comment`;
CREATE TABLE `blog_comment` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '评论ID',
`article_id` BIGINT UNSIGNED NOT NULL COMMENT '文章ID',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '评论用户ID',
`parent_id` BIGINT UNSIGNED DEFAULT 0 COMMENT '父评论ID0表示一级评论',
`reply_user_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '被回复的用户ID',
`content` TEXT NOT NULL COMMENT '评论内容',
`like_count` INT UNSIGNED DEFAULT 0 COMMENT '点赞数',
`reply_count` INT UNSIGNED DEFAULT 0 COMMENT '回复数',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '评论状态0-待审核1-已通过2-已拒绝',
`is_deleted` TINYINT(1) DEFAULT 0 COMMENT '是否删除0-否1-是',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL 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. 点赞表
-- ============================================
DROP TABLE IF EXISTS `blog_like`;
CREATE TABLE `blog_like` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '点赞ID',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
`target_id` BIGINT UNSIGNED NOT NULL COMMENT '目标ID文章ID或评论ID',
`target_type` TINYINT NOT NULL COMMENT '目标类型1-文章2-评论',
`is_deleted` TINYINT(1) DEFAULT 0 COMMENT '是否删除0-否1-是(取消点赞)',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_target` (`user_id`, `target_id`, `target_type`, `is_deleted`),
KEY `idx_target` (`target_id`, `target_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='点赞表';
-- ============================================
-- 7. 收藏表
-- ============================================
DROP TABLE IF EXISTS `blog_favorite`;
CREATE TABLE `blog_favorite` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '收藏ID',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
`article_id` BIGINT UNSIGNED NOT NULL COMMENT '文章ID',
`folder_name` VARCHAR(50) DEFAULT '默认收藏夹' COMMENT '收藏夹名称',
`is_deleted` TINYINT(1) DEFAULT 0 COMMENT '是否删除0-否1-是(取消收藏)',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_article` (`user_id`, `article_id`, `is_deleted`),
KEY `idx_article_id` (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='收藏表';
-- ============================================
-- 8. 浏览记录表
-- ============================================
DROP TABLE IF EXISTS `blog_view`;
CREATE TABLE `blog_view` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '浏览记录ID',
`article_id` BIGINT UNSIGNED NOT NULL COMMENT '文章ID',
`user_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '用户ID未登录为NULL',
`ip_address` VARCHAR(45) DEFAULT NULL COMMENT 'IP地址',
`user_agent` VARCHAR(500) DEFAULT NULL COMMENT '用户代理(浏览器信息)',
`duration` INT UNSIGNED DEFAULT 0 COMMENT '浏览时长(秒)',
`create_time` DATETIME NOT NULL 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='浏览记录表';
-- ============================================
-- 9. 草稿箱表
-- ============================================
DROP TABLE IF EXISTS `blog_draft`;
CREATE TABLE `blog_draft` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '草稿ID',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
`title` VARCHAR(200) DEFAULT NULL COMMENT '草稿标题',
`content` MEDIUMTEXT DEFAULT NULL COMMENT '草稿内容Markdown格式',
`category_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '分类ID',
`cover_image` VARCHAR(500) DEFAULT NULL COMMENT '封面图片URL',
`is_deleted` TINYINT(1) DEFAULT 0 COMMENT '是否删除0-否1-是',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL 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`, `parent_id`, `sort_order`) VALUES
('技术分享', 'tech', '分享技术经验和心得', 'icon-tech', 0, 100),
('算法学习', 'algorithm', '算法与数据结构学习笔记', 'icon-algo', 0, 90),
('项目实战', 'project', '项目开发实战经验', 'icon-project', 0, 80),
('面试经验', 'interview', '面试经验总结', 'icon-interview', 0, 70),
('学习笔记', 'note', '日常学习笔记', 'icon-note', 0, 60);
-- 初始化标签
INSERT INTO `blog_tag` (`name`, `slug`, `description`, `color`) VALUES
('Java', 'java', 'Java编程语言', '#007396'),
('Python', 'python', 'Python编程语言', '#3776AB'),
('Spring', 'spring', 'Spring框架', '#6DB33F'),
('MyBatis', 'mybatis', 'MyBatis持久层框架', '#DC382D'),
('Redis', 'redis', 'Redis缓存', '#D82C20'),
('MySQL', 'mysql', 'MySQL数据库', '#4479A1'),
('LeetCode', 'leetcode', 'LeetCode刷题', '#FFA116'),
('系统设计', 'system-design', '系统设计相关', '#FF6B6B'),
('微服务', 'microservice', '微服务架构', '#009688'),
('前端开发', 'frontend', '前端开发技术', '#F7DF1E');