-- 创建数据库初始化脚本 -- 云盘应用数据库表结构 -- 用户表 CREATE TABLE IF NOT EXISTS users ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, is_active BOOLEAN DEFAULT TRUE, is_verified BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, last_login_at TIMESTAMP NULL, INDEX idx_username (username), INDEX idx_email (email), INDEX idx_created_at (created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 文件表 CREATE TABLE IF NOT EXISTS files ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL, filename VARCHAR(255) NOT NULL, original_filename VARCHAR(255) NOT NULL, file_path VARCHAR(500) NOT NULL, file_hash VARCHAR(64) NOT NULL, path_hash VARCHAR(64) NOT NULL, file_size BIGINT NOT NULL DEFAULT 0, mime_type VARCHAR(100) NOT NULL, processing_status ENUM('pending', 'processing', 'completed', 'failed') DEFAULT 'pending', is_public BOOLEAN DEFAULT FALSE, is_deleted BOOLEAN DEFAULT FALSE, 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, INDEX idx_user_id (user_id), INDEX idx_file_hash (file_hash), INDEX idx_path_hash (path_hash), INDEX idx_processing_status (processing_status), INDEX idx_created_at (created_at), UNIQUE KEY unique_user_path (user_id, path_hash) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 文件操作日志表 CREATE TABLE IF NOT EXISTS file_operations ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL, file_id BIGINT NULL, operation_type ENUM('upload', 'download', 'delete', 'rename', 'move', 'copy', 'share') NOT NULL, operation_details JSON NULL, ip_address VARCHAR(45) NULL, user_agent TEXT NULL, status ENUM('success', 'failed', 'pending') DEFAULT 'success', error_message TEXT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (file_id) REFERENCES files(id) ON DELETE SET NULL, INDEX idx_user_id (user_id), INDEX idx_file_id (file_id), INDEX idx_operation_type (operation_type), INDEX idx_created_at (created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 文件分享表 CREATE TABLE IF NOT EXISTS file_shares ( id BIGINT PRIMARY KEY AUTO_INCREMENT, file_id BIGINT NOT NULL, owner_id BIGINT NOT NULL, share_token VARCHAR(64) NOT NULL UNIQUE, share_type ENUM('public', 'password', 'private') DEFAULT 'public', share_password VARCHAR(255) NULL, expires_at TIMESTAMP NULL, download_limit INT NULL, download_count INT DEFAULT 0, is_active BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (file_id) REFERENCES files(id) ON DELETE CASCADE, FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE CASCADE, INDEX idx_file_id (file_id), INDEX idx_owner_id (owner_id), INDEX idx_share_token (share_token), INDEX idx_expires_at (expires_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 用户会话表 CREATE TABLE IF NOT EXISTS user_sessions ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL, session_token VARCHAR(255) NOT NULL UNIQUE, refresh_token VARCHAR(255) NOT NULL UNIQUE, ip_address VARCHAR(45) NULL, user_agent TEXT NULL, expires_at TIMESTAMP NOT NULL, is_active 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, INDEX idx_user_id (user_id), INDEX idx_session_token (session_token), INDEX idx_refresh_token (refresh_token), INDEX idx_expires_at (expires_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 插入测试数据 INSERT INTO users (username, email, password_hash, is_verified) VALUES ('admin', 'admin@example.com', '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewxBobJOiZLWLH/K', TRUE) ON DUPLICATE KEY UPDATE username=username;