diff --git a/database.sql b/database.sql new file mode 100644 index 0000000..e77d63c --- /dev/null +++ b/database.sql @@ -0,0 +1,166 @@ +-- PicHost 完整数据库结构 +SET FOREIGN_KEY_CHECKS=0; +DROP TABLE IF EXISTS `users`, `images`, `tags`, `image_tags`, `password_resets`, `feedbacks`, `image_feedbacks`, `user_settings`, `notification_types`, `user_notification_settings`, `notifications`, `file_operations`; + +-- 用户表 +CREATE TABLE `users` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `username` VARCHAR(50) UNIQUE NOT NULL, + `email` VARCHAR(100) UNIQUE NOT NULL, + `password` VARCHAR(255) NOT NULL, + `role` ENUM('user', 'admin') DEFAULT 'user', + `is_verified` BOOLEAN DEFAULT FALSE, + `verification_code` VARCHAR(255), + `api_key` VARCHAR(255), + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 图片表 +CREATE TABLE `images` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `user_id` INT NOT NULL, + `title` VARCHAR(255), + `description` TEXT, + `filename` VARCHAR(255) NOT NULL, + `is_public` BOOLEAN DEFAULT TRUE, + `file_size` INT, + `mime_type` VARCHAR(100), + `views` INT DEFAULT 0, + `uploaded_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 标签表 +CREATE TABLE `tags` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `name` VARCHAR(50) UNIQUE NOT NULL, + `color` VARCHAR(7) DEFAULT '#3498db', + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 图片标签关联表 +CREATE TABLE `image_tags` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `image_id` INT NOT NULL, + `tag_id` INT NOT NULL, + FOREIGN KEY (`image_id`) REFERENCES `images`(`id`) ON DELETE CASCADE, + FOREIGN KEY (`tag_id`) REFERENCES `tags`(`id`) ON DELETE CASCADE, + UNIQUE KEY `unique_image_tag` (`image_id`, `tag_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 密码重置表 +CREATE TABLE `password_resets` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `email` VARCHAR(100) NOT NULL, + `token` VARCHAR(255) NOT NULL, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + `expires_at` TIMESTAMP NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 反馈表 +CREATE TABLE `feedbacks` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `user_id` INT NULL, + `type` ENUM('bug', 'feature', 'suggestion', 'other') NOT NULL, + `subject` VARCHAR(255) NOT NULL, + `message` TEXT NOT NULL, + `status` ENUM('pending', 'reviewed', 'resolved') DEFAULT 'pending', + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 图片反馈表 +CREATE TABLE `image_feedbacks` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `image_id` INT NOT NULL, + `user_id` INT NULL, + `type` ENUM('like', 'report') NOT NULL, + `comment` TEXT NULL, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`image_id`) REFERENCES `images`(`id`) ON DELETE CASCADE, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 用户设置表 +CREATE TABLE `user_settings` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `user_id` INT NOT NULL UNIQUE, + `dark_mode` BOOLEAN DEFAULT FALSE, + `language` VARCHAR(10) DEFAULT 'zh-CN', + `items_per_page` INT DEFAULT 20, + `email_notifications` BOOLEAN DEFAULT TRUE, + `browser_notifications` BOOLEAN DEFAULT TRUE, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 通知类型表 +CREATE TABLE `notification_types` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `name` VARCHAR(50) NOT NULL, + `description` TEXT, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 用户通知设置表 +CREATE TABLE `user_notification_settings` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `user_id` INT NOT NULL, + `notification_type_id` INT NOT NULL, + `enabled` BOOLEAN DEFAULT TRUE, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + UNIQUE KEY `unique_user_notification` (`user_id`, `notification_type_id`), + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE, + FOREIGN KEY (`notification_type_id`) REFERENCES `notification_types`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 通知表 +CREATE TABLE `notifications` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `user_id` INT NOT NULL, + `type_id` INT NOT NULL, + `title` VARCHAR(255) NOT NULL, + `message` TEXT NOT NULL, + `related_url` VARCHAR(500) NULL, + `is_read` BOOLEAN DEFAULT FALSE, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE, + FOREIGN KEY (`type_id`) REFERENCES `notification_types`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 文件操作记录表 +CREATE TABLE `file_operations` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `user_id` INT NULL, + `operation` ENUM('upload', 'delete', 'rename', 'move') NOT NULL, + `file_path` VARCHAR(500) NOT NULL, + `old_path` VARCHAR(500) NULL, + `file_size` INT NULL, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 插入默认数据 +INSERT IGNORE INTO `tags` (`id`, `name`, `color`) VALUES +(1, '风景', '#27ae60'), +(2, '人物', '#e74c3c'), +(3, '动物', '#f39c12'), +(4, '建筑', '#9b59b6'), +(5, '美食', '#e67e22'), +(6, '艺术', '#1abc9c'), +(7, '科技', '#3498db'), +(8, '运动', '#2ecc71'); + +INSERT IGNORE INTO `notification_types` (`id`, `name`, `description`) VALUES +(1, 'announcement', '系统公告和更新通知'), +(2, 'tips', '使用技巧和最佳实践'), +(3, 'feedback_result', '反馈处理结果'), +(4, 'image_feedback', '图片反馈通知'); + +-- 创建管理员用户 (密码: admin123) +INSERT IGNORE INTO `users` (`id`, `username`, `email`, `password`, `role`, `is_verified`) VALUES +(1, 'admin', 'admin@66ghz.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'admin', 1); + +SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file