/*
 Navicat Premium Dump SQL

 Source Server         : Mac
 Source Server Type    : MySQL
 Source Server Version : 80041 (8.0.41)
 Source Host           : localhost:3306
 Source Schema         : novel

 Target Server Type    : MySQL
 Target Server Version : 80041 (8.0.41)
 File Encoding         : 65001

 Date: 16/07/2025 09:37:05
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for admins
-- ----------------------------
DROP TABLE IF EXISTS `admins`;
CREATE TABLE `admins` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '管理员ID',
  `username` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '管理员用户名',
  `password_hash` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码哈希',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  `deleted_at` timestamp NULL DEFAULT NULL COMMENT '软删除时间戳',
  PRIMARY KEY (`id`),
  KEY `idx_username_deleted` (`username`,`deleted_at`),
  KEY `idx_email_deleted` (`deleted_at`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统管理员表';

-- ----------------------------
-- Records of admins
-- ----------------------------
BEGIN;
INSERT INTO `admins` (`id`, `username`, `password_hash`, `created_at`, `updated_at`, `deleted_at`) VALUES (1, 'admin', '$2a$10$cin1jkkEiKg0GW2blAWEb.1V8QeUCHV350yZ6sTbmIC/4fdbFqnTW', '2025-07-09 13:40:54', '2025-07-09 13:40:54', NULL);
COMMIT;

-- ----------------------------
-- Table structure for authors
-- ----------------------------
DROP TABLE IF EXISTS `authors`;
CREATE TABLE `authors` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '作者ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `pen_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '笔名',
  `bio` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '作者简介',
  `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态：1=正常，2=禁用',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  `deleted_at` timestamp NULL DEFAULT NULL COMMENT '软删除时间戳',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_id` (`user_id`),
  KEY `idx_status` (`status`),
  CONSTRAINT `fk_authors_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='作者表';

-- ----------------------------
-- Records of authors
-- ----------------------------
BEGIN;
INSERT INTO `authors` (`id`, `user_id`, `pen_name`, `bio`, `status`, `created_at`, `updated_at`, `deleted_at`) VALUES (1, 6, 'MoonScribe', 'A fantasy writer crafting magical worlds and epic quests.', 1, '2023-01-11 09:30:00', '2025-07-10 14:00:00', NULL);
INSERT INTO `authors` (`id`, `user_id`, `pen_name`, `bio`, `status`, `created_at`, `updated_at`, `deleted_at`) VALUES (2, 7, 'NebulaTale', 'Sci-fi author exploring interstellar adventures and cosmic mysteries.', 1, '2023-03-16 12:00:00', '2025-06-25 10:15:00', NULL);
INSERT INTO `authors` (`id`, `user_id`, `pen_name`, `bio`, `status`, `created_at`, `updated_at`, `deleted_at`) VALUES (3, 8, 'MistWalker', 'Mystery novelist weaving intricate plots in shadowy settings.', 1, '2023-05-21 14:00:00', '2025-05-10 16:20:00', NULL);
INSERT INTO `authors` (`id`, `user_id`, `pen_name`, `bio`, `status`, `created_at`, `updated_at`, `deleted_at`) VALUES (4, 9, 'LegendWeaver', 'Epic storyteller inspired by ancient myths and heroic sagas.', 1, '2023-07-26 10:30:00', '2025-07-01 12:30:00', NULL);
INSERT INTO `authors` (`id`, `user_id`, `pen_name`, `bio`, `status`, `created_at`, `updated_at`, `deleted_at`) VALUES (5, 10, 'StarBloom', 'Romantic writer penning heartfelt stories under the stars.', 1, '2023-09-11 15:30:00', NULL, NULL);
INSERT INTO `authors` (`id`, `user_id`, `pen_name`, `bio`, `status`, `created_at`, `updated_at`, `deleted_at`) VALUES (6, 11, 'NightShade', 'Thriller and horror author delving into the darkest corners of the mind.', 2, '2023-11-06 09:00:00', '2025-06-15 09:00:00', '2025-07-05 11:00:00');
COMMIT;

-- ----------------------------
-- Table structure for book_ratings
-- ----------------------------
DROP TABLE IF EXISTS `book_ratings`;
CREATE TABLE `book_ratings` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '评分ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `book_id` bigint NOT NULL COMMENT '小说ID',
  `score` decimal(4,2) NOT NULL COMMENT '评分（0~10）',
  `comment` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '用户评论',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_book` (`user_id`,`book_id`),
  KEY `idx_book_id` (`book_id`),
  CONSTRAINT `fk_book_ratings_book_id` FOREIGN KEY (`book_id`) REFERENCES `books` (`id`),
  CONSTRAINT `fk_book_ratings_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='小说评分与评论表';

-- ----------------------------
-- Records of book_ratings
-- ----------------------------
BEGIN;
COMMIT;

-- ----------------------------
-- Table structure for books
-- ----------------------------
DROP TABLE IF EXISTS `books`;
CREATE TABLE `books` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '小说ID',
  `author_id` bigint NOT NULL COMMENT '作者ID',
  `category_id` bigint NOT NULL COMMENT '分类ID',
  `title` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '小说标题',
  `cover_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '封面图片URL',
  `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '小说简介',
  `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态：1=连载中，2=完结，3=下架',
  `words_count` int DEFAULT '0' COMMENT '字数',
  `chapters_count` int DEFAULT '0' COMMENT '章节数',
  `rating` decimal(4,2) DEFAULT '0.00' COMMENT '评分（0.00~10.00）',
  `read_count` bigint DEFAULT '0' COMMENT '阅读人数',
  `current_readers` bigint DEFAULT '0' COMMENT '在读人数',
  `tags` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标签（逗号分隔）',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  `deleted_at` timestamp NULL DEFAULT NULL COMMENT '软删除时间戳',
  `is_recommended` tinyint NOT NULL DEFAULT '0' COMMENT '是否推荐：0=否，1=是',
  `is_featured` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否精选：0=否，1=是',
  `language` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'zh' COMMENT '语言，如 zh=中文，en=英文，jp=日文',
  PRIMARY KEY (`id`),
  KEY `idx_author_id` (`author_id`),
  KEY `idx_category_id` (`category_id`),
  KEY `idx_status` (`status`),
  CONSTRAINT `fk_books_author_id` FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`),
  CONSTRAINT `fk_books_category_id` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='小说表';

-- ----------------------------
-- Records of books
-- ----------------------------
BEGIN;
INSERT INTO `books` (`id`, `author_id`, `category_id`, `title`, `cover_url`, `description`, `status`, `words_count`, `chapters_count`, `rating`, `read_count`, `current_readers`, `tags`, `created_at`, `updated_at`, `deleted_at`, `is_recommended`, `is_featured`, `language`) VALUES (1, 1, 1, 'Echoes of the Lost Realm', 'https://example.com/covers/echoes_realm.jpg', 'A young sorcerer uncovers secrets of a forgotten kingdom.', 1, 160000, 48, 8.60, 13000, 0, 'fantasy,magic,adventure', '2024-02-15 10:00:00', '2025-07-10 12:00:00', NULL, 1, 0, 'en');
INSERT INTO `books` (`id`, `author_id`, `category_id`, `title`, `cover_url`, `description`, `status`, `words_count`, `chapters_count`, `rating`, `read_count`, `current_readers`, `tags`, `created_at`, `updated_at`, `deleted_at`, `is_recommended`, `is_featured`, `language`) VALUES (2, 2, 2, 'Void Wanderers', 'https://example.com/covers/void_wanderers.jpg', 'A crew of explorers navigates uncharted galaxies.', 2, 210000, 62, 9.00, 22000, 0, 'sci-fi,space,exploration', '2023-09-10 11:00:00', '2025-06-20 13:30:00', NULL, 1, 0, 'en');
INSERT INTO `books` (`id`, `author_id`, `category_id`, `title`, `cover_url`, `description`, `status`, `words_count`, `chapters_count`, `rating`, `read_count`, `current_readers`, `tags`, `created_at`, `updated_at`, `deleted_at`, `is_recommended`, `is_featured`, `language`) VALUES (3, 3, 3, 'Shadows of Doubt', 'https://example.com/covers/shadows_doubt.jpg', 'A detective solves a murder in a city shrouded in secrets.', 1, 100000, 32, 8.20, 7000, 0, 'mystery,detective,crime', '2024-05-25 14:00:00', '2025-07-05 09:45:00', NULL, 0, 0, 'en');
INSERT INTO `books` (`id`, `author_id`, `category_id`, `title`, `cover_url`, `description`, `status`, `words_count`, `chapters_count`, `rating`, `read_count`, `current_readers`, `tags`, `created_at`, `updated_at`, `deleted_at`, `is_recommended`, `is_featured`, `language`) VALUES (4, 4, 4, 'The Eternal Saga', 'https://example.com/covers/eternal_saga.jpg', 'Heroes battle to fulfill an ancient prophecy.', 2, 340000, 85, 9.40, 28000, 0, 'epic,fantasy,mythology', '2023-12-01 12:00:00', '2025-07-01 11:15:00', NULL, 1, 0, 'en');
INSERT INTO `books` (`id`, `author_id`, `category_id`, `title`, `cover_url`, `description`, `status`, `words_count`, `chapters_count`, `rating`, `read_count`, `current_readers`, `tags`, `created_at`, `updated_at`, `deleted_at`, `is_recommended`, `is_featured`, `language`) VALUES (5, 5, 5, 'Love Beyond the Stars', 'https://example.com/covers/love_stars.jpg', 'A romance blossoms during an interstellar journey.', 1, 115000, 38, 8.50, 11000, 0, 'romance,sci-fi,drama', '2024-07-15 13:00:00', '2025-07-11 02:00:00', NULL, 0, 0, 'en');
INSERT INTO `books` (`id`, `author_id`, `category_id`, `title`, `cover_url`, `description`, `status`, `words_count`, `chapters_count`, `rating`, `read_count`, `current_readers`, `tags`, `created_at`, `updated_at`, `deleted_at`, `is_recommended`, `is_featured`, `language`) VALUES (6, 6, 7, 'Curse of the Forgotten', NULL, 'A haunted village hides a terrifying secret.', 3, 65000, 18, 6.90, 2500, 0, 'horror,supernatural,mystery', '2024-03-10 16:00:00', '2025-07-11 02:00:00', '2025-07-05 10:00:00', 0, 0, 'en');
INSERT INTO `books` (`id`, `author_id`, `category_id`, `title`, `cover_url`, `description`, `status`, `words_count`, `chapters_count`, `rating`, `read_count`, `current_readers`, `tags`, `created_at`, `updated_at`, `deleted_at`, `is_recommended`, `is_featured`, `language`) VALUES (7, 2, 6, 'Pulse of Danger', 'https://example.com/covers/pulse_danger.jpg', 'A rogue agent uncovers a global conspiracy.', 1, 140000, 40, 8.70, 9500, 0, 'thriller,action,conspiracy', '2024-04-20 09:30:00', '2025-06-30 15:00:00', NULL, 1, 0, 'en');
COMMIT;

-- ----------------------------
-- Table structure for bookshelves
-- ----------------------------
DROP TABLE IF EXISTS `bookshelves`;
CREATE TABLE `bookshelves` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `book_id` bigint NOT NULL COMMENT '小说ID',
  `added_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '加入书架时间',
  `last_read_chapter_id` bigint DEFAULT NULL COMMENT '最后阅读章节ID',
  `last_read_percent` decimal(5,2) DEFAULT '0.00' COMMENT '阅读进度百分比（0.00~100.00）',
  `last_read_at` timestamp NULL DEFAULT NULL COMMENT '最后阅读时间',
  `read_status` tinyint NOT NULL DEFAULT '1' COMMENT '阅读状态：1=正在读，2=已读完，3=已收藏',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_book` (`user_id`,`book_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_book_id` (`book_id`),
  CONSTRAINT `fk_bookshelves_book_id` FOREIGN KEY (`book_id`) REFERENCES `books` (`id`),
  CONSTRAINT `fk_bookshelves_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户书架表';

-- ----------------------------
-- Records of bookshelves
-- ----------------------------
BEGIN;
COMMIT;

-- ----------------------------
-- Table structure for casbin_rule
-- ----------------------------
DROP TABLE IF EXISTS `casbin_rule`;
CREATE TABLE `casbin_rule` (
  `id` int NOT NULL AUTO_INCREMENT,
  `p_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
  `v0` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
  `v1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
  `v2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
  `v3` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
  `v4` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
  `v5` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='路由权限表';

-- ----------------------------
-- Records of casbin_rule
-- ----------------------------
BEGIN;
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (1, 'g', 'user', 'guest', '', '', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (2, 'g', 'author', 'user', '', '', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (3, 'g', 'admin', 'author', '', '', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (4, 'p', 'guest', '/book/app/list', 'GET', 'App获取书籍列表', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (5, 'p', 'guest', '/book/app/detail', 'GET', 'App获取书籍详情', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (6, 'p', 'guest', '/chapter/app/list', 'GET', 'App获取章节列表', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (7, 'p', 'guest', '/chapter/app/detail', 'GET', 'App获取章节详情', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (8, 'p', 'guest', '/category', 'GET', '获取分类列表', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (9, 'p', 'user', '/book/shelf/add', 'POST', '加入书架', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (10, 'p', 'user', '/book/shelf/remove', 'POST', '移除书架', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (11, 'p', 'user', '/book/history/add', 'POST', '添加历史记录', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (12, 'p', 'user', '/book/history/remove', 'POST', '删除历史记录', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (13, 'p', 'user', '/book/app/rate', 'POST', 'App用户评分', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (14, 'p', 'user', '/chapter/app/purchase', 'POST', 'App购买章节', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (15, 'p', 'user', '/chapter/app/progress', 'POST', 'App上传阅读进度', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (16, 'p', 'user', '/feedback', 'POST', '新增反馈', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (17, 'p', 'user', '/user/info', 'GET', '获取用户信息', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (18, 'p', 'user', '/user/delete', 'POST', '删除用户', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (19, 'p', 'user', '/user/logout', 'POST', '用户登出', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (20, 'p', 'user', '/author/follow', 'POST', '关注作者', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (21, 'p', 'user', '/author/unfollow', 'POST', '取消关注作者', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (22, 'p', 'author', '/book', 'GET', '获取图书列表', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (23, 'p', 'author', '/book', 'POST', '新增图书', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (24, 'p', 'author', '/book', 'PUT', '编辑图书', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (25, 'p', 'author', '/book', 'DELETE', '删除图书', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (26, 'p', 'author', '/chapter', 'GET', '获取章节列表', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (27, 'p', 'author', '/chapter', 'POST', '创建章节', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (28, 'p', 'author', '/chapter', 'PUT', '更新章节', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (29, 'p', 'author', '/chapter', 'DELETE', '删除章节', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (30, 'p', 'admin', '/author', 'GET', '获取作者列表', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (31, 'p', 'admin', '/author', 'POST', '创建作者', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (32, 'p', 'admin', '/author', 'PUT', '更新作者', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (33, 'p', 'admin', '/author', 'DELETE', '删除作者', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (34, 'p', 'admin', '/feedback', 'GET', '获取反馈列表', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (35, 'p', 'admin', '/category', 'POST', '创建分类', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (36, 'p', 'admin', '/category', 'PUT', '更新分类', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (37, 'p', 'admin', '/category', 'DELETE', '删除分类', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (38, 'p', 'admin', '/admin/info', 'GET', '获取管理员用户信息', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (39, 'p', 'admin', '/admin/editPass', 'POST', '管理员修改密码', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (40, 'p', 'user', '/book/app/my-books', 'GET', '获取我的书籍列表', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (41, 'p', 'admin', '/book/set-featured', 'POST', '设置书籍精选状态', '', '');
INSERT INTO `casbin_rule` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (42, 'p', 'admin', '/book/set-recommended', 'POST', '设置书籍推荐状态', '', '');
COMMIT;

-- ----------------------------
-- Table structure for categories
-- ----------------------------
DROP TABLE IF EXISTS `categories`;
CREATE TABLE `categories` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '分类ID',
  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类名称',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  `deleted_at` timestamp NULL DEFAULT NULL COMMENT '软删除时间戳',
  `channel` tinyint(1) NOT NULL DEFAULT '1' COMMENT '频道类型：1=男频，2=女频',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='小说分类表';

-- ----------------------------
-- Records of categories
-- ----------------------------
BEGIN;
INSERT INTO `categories` (`id`, `name`, `created_at`, `updated_at`, `deleted_at`, `channel`) VALUES (1, 'Fantasy', '2023-01-10 09:00:00', '2025-07-10 15:30:00', NULL, 1);
INSERT INTO `categories` (`id`, `name`, `created_at`, `updated_at`, `deleted_at`, `channel`) VALUES (2, 'Science Fiction', '2023-02-15 10:30:00', '2025-06-20 12:00:00', NULL, 1);
INSERT INTO `categories` (`id`, `name`, `created_at`, `updated_at`, `deleted_at`, `channel`) VALUES (3, 'Mystery', '2023-03-20 14:00:00', '2025-05-15 09:45:00', NULL, 1);
INSERT INTO `categories` (`id`, `name`, `created_at`, `updated_at`, `deleted_at`, `channel`) VALUES (4, 'Epic', '2023-04-05 11:15:00', '2025-07-01 16:20:00', NULL, 1);
INSERT INTO `categories` (`id`, `name`, `created_at`, `updated_at`, `deleted_at`, `channel`) VALUES (5, 'Romance', '2023-05-12 08:45:00', NULL, NULL, 1);
INSERT INTO `categories` (`id`, `name`, `created_at`, `updated_at`, `deleted_at`, `channel`) VALUES (6, 'Thriller', '2023-06-18 13:20:00', '2025-04-10 10:10:00', NULL, 1);
INSERT INTO `categories` (`id`, `name`, `created_at`, `updated_at`, `deleted_at`, `channel`) VALUES (8, 'Modern Romance', '2025-07-15 21:00:00', NULL, NULL, 2);
INSERT INTO `categories` (`id`, `name`, `created_at`, `updated_at`, `deleted_at`, `channel`) VALUES (9, 'Historical Romance', '2025-07-15 21:00:00', NULL, NULL, 2);
INSERT INTO `categories` (`id`, `name`, `created_at`, `updated_at`, `deleted_at`, `channel`) VALUES (10, 'School Life', '2025-07-15 21:00:00', NULL, NULL, 2);
INSERT INTO `categories` (`id`, `name`, `created_at`, `updated_at`, `deleted_at`, `channel`) VALUES (11, 'CEO Romance', '2025-07-15 21:00:00', NULL, NULL, 2);
INSERT INTO `categories` (`id`, `name`, `created_at`, `updated_at`, `deleted_at`, `channel`) VALUES (12, 'Time Travel', '2025-07-15 21:00:00', NULL, NULL, 2);
INSERT INTO `categories` (`id`, `name`, `created_at`, `updated_at`, `deleted_at`, `channel`) VALUES (13, 'Fantasy Romance', '2025-07-15 21:00:00', NULL, NULL, 2);
COMMIT;

-- ----------------------------
-- Table structure for chapters
-- ----------------------------
DROP TABLE IF EXISTS `chapters`;
CREATE TABLE `chapters` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '章节ID',
  `book_id` bigint NOT NULL COMMENT '小说ID',
  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '章节标题',
  `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '章节内容',
  `word_count` int DEFAULT '0' COMMENT '章节字数',
  `sort` int DEFAULT '0' COMMENT '排序序号',
  `is_locked` tinyint NOT NULL DEFAULT '0' COMMENT '是否锁定：0=免费，1=需积分解锁',
  `required_score` int NOT NULL DEFAULT '0' COMMENT '解锁该章节所需积分',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  `deleted_at` timestamp NULL DEFAULT NULL COMMENT '软删除时间戳',
  PRIMARY KEY (`id`),
  KEY `idx_book_id` (`book_id`),
  CONSTRAINT `fk_chapters_book_id` FOREIGN KEY (`book_id`) REFERENCES `books` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='章节表';

-- ----------------------------
-- Records of chapters
-- ----------------------------
BEGIN;
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (1, 1, 'The Fated Dawn', 'Aelar discovers a shimmering crystal in the ruins, pulsing with ancient magic...', 3700, 1, 0, 0, '2024-02-15 10:10:00', '2025-07-11 20:23:43', NULL);
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (2, 1, 'The Oracle’s Vision', 'Aelar seeks guidance from a reclusive seer in the enchanted forest...', 4000, 2, 0, 0, '2024-03-05 11:45:00', '2024-03-05 11:45:00', NULL);
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (3, 1, 'The Veiled Kingdom', 'Aelar battles a mystical guardian to enter the Lost Realm...', 4200, 3, 1, 70, '2025-07-10 12:00:00', '2025-07-10 12:00:00', NULL);
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (4, 2, 'The Cosmic Leap', 'The Starfarer crew prepares for a daring jump into uncharted space...', 4400, 1, 0, 0, '2023-09-10 11:10:00', '2023-09-10 11:10:00', NULL);
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (5, 2, 'Anomaly Detected', 'A mysterious signal causes chaos aboard the Starfarer...', 4700, 2, 0, 0, '2023-10-25 12:30:00', '2023-10-25 12:30:00', NULL);
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (6, 2, 'The Starborn Legacy', 'The crew uncovers an alien artifact that holds the key to their mission...', 5000, 3, 1, 130, '2025-06-20 13:30:00', '2025-06-20 13:30:00', NULL);
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (7, 3, 'The Cryptic Note', 'Detective Lila finds a hidden message that changes the case...', 3400, 1, 0, 0, '2024-05-25 14:10:00', '2024-05-25 14:10:00', NULL);
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (8, 3, 'Suspect’s Secrets', 'Lila interrogates a key witness with a dark past...', 3600, 2, 1, 50, '2024-06-20 15:15:00', '2024-06-20 15:15:00', NULL);
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (9, 3, 'The Shadow’s Trail', 'A late-night pursuit leads Lila to a shocking discovery...', 3800, 3, 1, 70, '2025-07-05 09:45:00', '2025-07-05 09:45:00', NULL);
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (10, 4, 'The Oracle’s Call', 'Kael is summoned to lead the fight against an ancient evil...', 5200, 1, 0, 0, '2023-12-01 12:10:00', '2023-12-01 12:10:00', NULL);
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (11, 4, 'The Great Clash', 'Kael’s forces face the dark army in a battle for the ages...', 5400, 2, 0, 0, '2024-01-25 13:15:00', '2024-01-25 13:15:00', NULL);
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (12, 4, 'The Prophecy’s End', 'Kael’s final stand determines the fate of the world...', 5700, 3, 1, 200, '2025-07-01 11:15:00', '2025-07-01 11:15:00', NULL);
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (13, 5, 'First Glance', 'Elara and Kian meet aboard the starship, their connection instant...', 3200, 1, 0, 0, '2024-07-15 13:10:00', '2024-07-15 13:10:00', NULL);
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (14, 5, 'Under the Stars', 'A quiet evening reveals the depth of Elara and Kian’s feelings...', 3400, 2, 1, 60, '2024-08-30 14:15:00', '2024-08-30 14:15:00', NULL);
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (15, 5, 'Tempest of Love', 'A galactic storm threatens to tear Elara and Kian apart...', 3700, 3, 1, 80, '2025-07-11 02:00:00', '2025-07-11 02:00:00', NULL);
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (16, 6, 'The Fog Descends', 'A chilling mist engulfs the village, hiding unspeakable horrors...', 2900, 1, 0, 0, '2024-03-10 16:15:00', '2024-03-10 16:15:00', '2025-07-05 10:00:00');
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (17, 6, 'The Haunted Relic', 'A cursed artifact in the village square awakens dark forces...', 3100, 2, 0, 0, '2024-04-05 17:00:00', '2024-04-05 17:00:00', '2025-07-05 10:00:00');
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (18, 6, 'Whispers in the Dark', 'The villagers hear eerie voices as the curse tightens its grip...', 3300, 3, 0, 0, '2024-04-20 17:30:00', '2024-04-20 17:30:00', '2025-07-05 10:00:00');
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (19, 7, 'The Covert Operation', 'Agent Jace infiltrates a secret facility with a deadly agenda...', 3700, 1, 0, 0, '2024-04-20 09:45:00', '2024-04-20 09:45:00', NULL);
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (20, 7, 'The Hidden Truth', 'Jace uncovers evidence of a global conspiracy...', 3900, 2, 1, 80, '2024-05-20 10:30:00', '2024-05-20 10:30:00', NULL);
INSERT INTO `chapters` (`id`, `book_id`, `title`, `content`, `word_count`, `sort`, `is_locked`, `required_score`, `created_at`, `updated_at`, `deleted_at`) VALUES (21, 7, 'The Final Countdown', 'Jace races to stop a catastrophic event...', 4100, 3, 1, 90, '2025-06-30 15:00:00', '2025-06-30 15:00:00', NULL);
COMMIT;

-- ----------------------------
-- Table structure for feedbacks
-- ----------------------------
DROP TABLE IF EXISTS `feedbacks`;
CREATE TABLE `feedbacks` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '反馈ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '反馈内容',
  `status` tinyint NOT NULL DEFAULT '1' COMMENT '处理状态：1=未处理，2=处理中，3=已处理',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '反馈时间',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
  CONSTRAINT `fk_feedbacks_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户反馈表';

-- ----------------------------
-- Records of feedbacks
-- ----------------------------
BEGIN;
INSERT INTO `feedbacks` (`id`, `user_id`, `content`, `status`, `created_at`, `updated_at`) VALUES (1, 1, 'App crashes during photo upload.', 1, '2025-07-01 10:15:23', NULL);
INSERT INTO `feedbacks` (`id`, `user_id`, `content`, `status`, `created_at`, `updated_at`) VALUES (2, 2, 'Please add dark mode support.', 2, '2025-07-02 14:30:45', '2025-07-05 09:20:10');
INSERT INTO `feedbacks` (`id`, `user_id`, `content`, `status`, `created_at`, `updated_at`) VALUES (3, 3, 'Slow login process needs optimization.', 3, '2025-07-03 08:45:12', '2025-07-06 16:00:00');
INSERT INTO `feedbacks` (`id`, `user_id`, `content`, `status`, `created_at`, `updated_at`) VALUES (4, 4, 'More filter options would be great.', 1, '2025-07-04 19:22:33', NULL);
INSERT INTO `feedbacks` (`id`, `user_id`, `content`, `status`, `created_at`, `updated_at`) VALUES (5, 5, 'Payment section has a bug.', 2, '2025-07-05 11:10:50', '2025-07-07 13:45:22');
COMMIT;

-- ----------------------------
-- Table structure for user_chapter_purchases
-- ----------------------------
DROP TABLE IF EXISTS `user_chapter_purchases`;
CREATE TABLE `user_chapter_purchases` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '购买记录ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `book_id` bigint NOT NULL COMMENT '小说ID',
  `chapter_id` bigint NOT NULL COMMENT '章节ID',
  `points_used` int NOT NULL COMMENT '消耗积分数',
  `purchase_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '购买时间',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_book_id` (`book_id`),
  KEY `idx_chapter_id` (`chapter_id`),
  CONSTRAINT `fk_user_chapter_purchases_book_id` FOREIGN KEY (`book_id`) REFERENCES `books` (`id`),
  CONSTRAINT `fk_user_chapter_purchases_chapter_id` FOREIGN KEY (`chapter_id`) REFERENCES `chapters` (`id`),
  CONSTRAINT `fk_user_chapter_purchases_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户章节购买记录表';

-- ----------------------------
-- Records of user_chapter_purchases
-- ----------------------------
BEGIN;
COMMIT;

-- ----------------------------
-- Table structure for user_follow_authors
-- ----------------------------
DROP TABLE IF EXISTS `user_follow_authors`;
CREATE TABLE `user_follow_authors` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '关注ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `author_id` bigint NOT NULL COMMENT '作者ID',
  `followed_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '关注时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_author` (`user_id`,`author_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_author_id` (`author_id`),
  CONSTRAINT `fk_user_follow_authors_author_id` FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`),
  CONSTRAINT `fk_user_follow_authors_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户关注作者表';

-- ----------------------------
-- Records of user_follow_authors
-- ----------------------------
BEGIN;
COMMIT;

-- ----------------------------
-- Table structure for user_points_logs
-- ----------------------------
DROP TABLE IF EXISTS `user_points_logs`;
CREATE TABLE `user_points_logs` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '积分流水ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `change_type` tinyint NOT NULL COMMENT '变动类型，1=消费(spend), 2=收入(earn)',
  `points_change` int NOT NULL COMMENT '积分变化数，正数增加，负数减少',
  `related_order_id` bigint DEFAULT NULL COMMENT '关联ID：当change_type=1时，为chapter_purchases.id；当change_type=2时，为advertisement_records.id',
  `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '变动说明',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '变动时间',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_related_order_id` (`related_order_id`),
  CONSTRAINT `fk_user_points_logs_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户积分流水表';

-- ----------------------------
-- Records of user_points_logs
-- ----------------------------
BEGIN;
COMMIT;

-- ----------------------------
-- Table structure for user_read_history
-- ----------------------------
DROP TABLE IF EXISTS `user_read_history`;
CREATE TABLE `user_read_history` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '历史记录ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `book_id` bigint NOT NULL COMMENT '小说ID',
  `chapter_id` bigint NOT NULL COMMENT '最后阅读章节ID',
  `read_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后阅读时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_book` (`user_id`,`book_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_book_id` (`book_id`),
  KEY `fk_user_read_history_chapter_id` (`chapter_id`),
  CONSTRAINT `fk_user_read_history_book_id` FOREIGN KEY (`book_id`) REFERENCES `books` (`id`),
  CONSTRAINT `fk_user_read_history_chapter_id` FOREIGN KEY (`chapter_id`) REFERENCES `chapters` (`id`),
  CONSTRAINT `fk_user_read_history_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户阅读历史记录表';

-- ----------------------------
-- Records of user_read_history
-- ----------------------------
BEGIN;
COMMIT;

-- ----------------------------
-- Table structure for user_read_records
-- ----------------------------
DROP TABLE IF EXISTS `user_read_records`;
CREATE TABLE `user_read_records` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `book_id` bigint NOT NULL COMMENT '小说ID',
  `chapter_id` bigint NOT NULL COMMENT '章节ID',
  `progress` int NOT NULL DEFAULT '0' COMMENT '阅读进度百分比(0-100)',
  `read_at` datetime NOT NULL COMMENT '阅读时间',
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_book_chapter` (`user_id`,`book_id`,`chapter_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_book_id` (`book_id`),
  KEY `idx_chapter_id` (`chapter_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户阅读记录表';

-- ----------------------------
-- Records of user_read_records
-- ----------------------------
BEGIN;
COMMIT;

-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `username` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名',
  `password_hash` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码哈希',
  `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '头像URL',
  `email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱',
  `points` bigint unsigned NOT NULL DEFAULT '0' COMMENT '积分',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  `deleted_at` timestamp NULL DEFAULT NULL COMMENT '软删除时间戳',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_username` (`username`),
  KEY `idx_email_deleted` (`email`,`deleted_at`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户表';

-- ----------------------------
-- Records of users
-- ----------------------------
BEGIN;
INSERT INTO `users` (`id`, `username`, `password_hash`, `avatar`, `email`, `points`, `created_at`, `updated_at`, `deleted_at`) VALUES (1, 'john_doe', '$2a$10$cin1jkkEiKg0GW2blAWEb.1V8QeUCHV350yZ6sTbmIC/4fdbFqnTW', 'https://example.com/avatars/john.jpg', 'john.doe@example.com', 150, '2025-06-01 09:00:00', '2025-07-05 14:20:30', NULL);
INSERT INTO `users` (`id`, `username`, `password_hash`, `avatar`, `email`, `points`, `created_at`, `updated_at`, `deleted_at`) VALUES (2, 'jane_smith', '$2a$10$cin1jkkEiKg0GW2blAWEb.1V8QeUCHV350yZ6sTbmIC/4fdbFqnTW', 'https://example.com/avatars/jane.jpg', 'jane.smith@example.com', 320, '2025-06-02 12:15:45', '2025-07-06 10:10:10', NULL);
INSERT INTO `users` (`id`, `username`, `password_hash`, `avatar`, `email`, `points`, `created_at`, `updated_at`, `deleted_at`) VALUES (3, 'alice_wong', '$2a$10$cin1jkkEiKg0GW2blAWEb.1V8QeUCHV350yZ6sTbmIC/4fdbFqnTW', NULL, 'alice.wong@example.com', 50, '2025-06-03 15:30:22', NULL, NULL);
INSERT INTO `users` (`id`, `username`, `password_hash`, `avatar`, `email`, `points`, `created_at`, `updated_at`, `deleted_at`) VALUES (4, 'bob_lee', '$2a$10$cin1jkkEiKg0GW2blAWEb.1V8QeUCHV350yZ6sTbmIC/4fdbFqnTW', 'https://example.com/avatars/bob.jpg', 'bob.lee@example.com', 200, '2025-06-04 08:45:00', '2025-07-07 16:00:00', NULL);
INSERT INTO `users` (`id`, `username`, `password_hash`, `avatar`, `email`, `points`, `created_at`, `updated_at`, `deleted_at`) VALUES (5, 'emma_brown', '$2a$10$cin1jkkEiKg0GW2blAWEb.1V8QeUCHV350yZ6sTbmIC/4fdbFqnTW', NULL, 'emma.brown@example.com', 0, '2025-06-05 11:20:15', NULL, NULL);
INSERT INTO `users` (`id`, `username`, `password_hash`, `avatar`, `email`, `points`, `created_at`, `updated_at`, `deleted_at`) VALUES (6, 'MoonScribe', '$2a$10$cin1jkkEiKg0GW2blAWEb.1V8QeUCHV350yZ6sTbmIC/4fdbFqnTW', 'https://example.com/avatars/moonscribe.jpg', 'moonscribe@example.com', 1800, '2023-01-10 09:00:00', '2025-07-10 14:00:00', NULL);
INSERT INTO `users` (`id`, `username`, `password_hash`, `avatar`, `email`, `points`, `created_at`, `updated_at`, `deleted_at`) VALUES (7, 'NebulaTale', '$2a$10$cin1jkkEiKg0GW2blAWEb.1V8QeUCHV350yZ6sTbmIC/4fdbFqnTW', 'https://example.com/avatars/nebulatale.jpg', 'nebulatale@example.com', 2500, '2023-03-15 11:30:00', '2025-06-25 10:15:00', NULL);
INSERT INTO `users` (`id`, `username`, `password_hash`, `avatar`, `email`, `points`, `created_at`, `updated_at`, `deleted_at`) VALUES (8, 'MistWalker', '$2a$10$cin1jkkEiKg0GW2blAWEb.1V8QeUCHV350yZ6sTbmIC/4fdbFqnTW', NULL, 'mistwalker@example.com', 900, '2023-05-20 13:45:00', '2025-05-10 16:20:00', NULL);
INSERT INTO `users` (`id`, `username`, `password_hash`, `avatar`, `email`, `points`, `created_at`, `updated_at`, `deleted_at`) VALUES (9, 'LegendWeaver', '$2a$10$cin1jkkEiKg0GW2blAWEb.1V8QeUCHV350yZ6sTbmIC/4fdbFqnTW', 'https://example.com/avatars/legendweaver.jpg', 'legendweaver@example.com', 3200, '2023-07-25 10:00:00', '2025-07-01 12:30:00', NULL);
INSERT INTO `users` (`id`, `username`, `password_hash`, `avatar`, `email`, `points`, `created_at`, `updated_at`, `deleted_at`) VALUES (10, 'StarBloom', '$2a$10$cin1jkkEiKg0GW2blAWEb.1V8QeUCHV350yZ6sTbmIC/4fdbFqnTW', 'https://example.com/avatars/starbloom.jpg', 'starbloom@example.com', 1400, '2023-09-10 15:00:00', NULL, NULL);
INSERT INTO `users` (`id`, `username`, `password_hash`, `avatar`, `email`, `points`, `created_at`, `updated_at`, `deleted_at`) VALUES (11, 'NightShade', '$2a$10$cin1jkkEiKg0GW2blAWEb.1V8QeUCHV350yZ6sTbmIC/4fdbFqnTW', NULL, 'nightshade@example.com', 700, '2023-11-05 08:30:00', '2025-06-15 09:00:00', '2025-07-05 11:00:00');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;
