-- 用户表,支持积分系统和权限管理 CREATE TABLE `user` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户ID', `username` VARCHAR(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户名', `password` VARCHAR(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '密码哈希', `email` VARCHAR(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '邮箱地址', `avatar` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '头像URL(存储在MinIO中)', `points` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户积分', `role` VARCHAR(50) NOT NULL DEFAULT 'user' COMMENT '用户角色(user, vip, admin等)', `status` TINYINT NOT NULL DEFAULT 1 COMMENT '用户状态(1:正常, 0:禁用, -1:删除)', `last_login_at` TIMESTAMP NULL COMMENT '最后登录时间', `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`), UNIQUE KEY `uk_email` (`email`), INDEX `idx_role` (`role`), INDEX `idx_status` (`status`), INDEX `idx_points` (`points` DESC) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户表'; -- 材质表,存储皮肤和披风 CREATE TABLE `textures` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '材质的唯一ID', `uploader_id` BIGINT UNSIGNED NOT NULL COMMENT '上传者的用户ID', `name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '材质名称', `description` TEXT COMMENT '材质描述', `type` ENUM('SKIN', 'CAPE') NOT NULL COMMENT '材质类型(皮肤或披风)', `url` VARCHAR(255) NOT NULL COMMENT '材质在MinIO中的永久访问URL', `hash` VARCHAR(64) NOT NULL COMMENT '材质文件的SHA-256哈希值,用于快速去重和校验', `size` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '文件大小(字节)', `is_public` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否公开到皮肤广场', `download_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '下载次数', `favorite_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '收藏次数', `status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(1:正常, 0:审核中, -1:已删除)', `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_hash` (`hash`), INDEX `idx_uploader_id` (`uploader_id`), INDEX `idx_public_type_status` (`is_public`, `type`, `status`), INDEX `idx_download_count` (`download_count` DESC), INDEX `idx_favorite_count` (`favorite_count` DESC), CONSTRAINT `fk_textures_uploader` FOREIGN KEY (`uploader_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='皮肤与披风材质表'; -- 用户材质收藏表 CREATE TABLE `user_texture_favorites` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '收藏记录的唯一ID', `user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID', `texture_id` BIGINT UNSIGNED NOT NULL COMMENT '收藏的材质ID', `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '收藏时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_user_texture` (`user_id`, `texture_id`), INDEX `idx_user_id` (`user_id`), INDEX `idx_texture_id` (`texture_id`), INDEX `idx_created_at` (`created_at`), CONSTRAINT `fk_favorites_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE, CONSTRAINT `fk_favorites_texture` FOREIGN KEY (`texture_id`) REFERENCES `textures` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户材质收藏表'; -- 用户角色信息表(Minecraft档案) CREATE TABLE `profiles` ( `uuid` VARCHAR(36) NOT NULL COMMENT '角色的UUID,通常为Minecraft玩家的UUID', `user_id` BIGINT UNSIGNED NOT NULL COMMENT '关联的用户ID', `name` VARCHAR(16) NOT NULL COMMENT '角色名(Minecraft游戏内名称)', `skin_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '当前使用的皮肤ID', `cape_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '当前使用的披风ID', `rsa_private_key` TEXT NOT NULL COMMENT '用于签名的RSA-2048私钥(PEM格式)', `is_active` BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否为活跃档案', `last_used_at` TIMESTAMP NULL COMMENT '最后使用时间', `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`uuid`), UNIQUE KEY `uk_name` (`name`), INDEX `idx_user_id` (`user_id`), INDEX `idx_active` (`is_active`), CONSTRAINT `fk_profiles_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE, CONSTRAINT `fk_profiles_skin` FOREIGN KEY (`skin_id`) REFERENCES `textures` (`id`) ON DELETE SET NULL, CONSTRAINT `fk_profiles_cape` FOREIGN KEY (`cape_id`) REFERENCES `textures` (`id`) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户角色信息表(Minecraft档案)'; -- Casbin权限管理相关表 -- casbin_rule表用于存储RBAC权限规则 CREATE TABLE `casbin_rule` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '规则ID', `ptype` VARCHAR(100) NOT NULL COMMENT '策略类型(p, g等)', `v0` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '主体(用户或角色)', `v1` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '资源对象', -- 材质表,存储皮肤和披风 CREATE TABLE `textures` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '材质的唯一ID', `uploader_id` BIGINT UNSIGNED NOT NULL COMMENT '上传者的用户ID', `name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '材质名称', `description` TEXT COMMENT '材质描述', `type` ENUM('SKIN', 'CAPE') NOT NULL COMMENT '材质类型(皮肤或披风)', `url` VARCHAR(255) NOT NULL COMMENT '材质在MinIO中的永久访问URL', `hash` VARCHAR(64) NOT NULL COMMENT '材质文件的SHA-256哈希值,用于快速去重和校验', `size` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '文件大小(字节)', `is_public` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否公开到皮肤广场', `download_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '下载次数', `favorite_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '收藏次数', "is_silm" BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否为细手臂模型(Steve/Alex),默认为粗手臂模型(Steve)', `status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(1:正常, 0:审核中, -1:已删除)', `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_hash` (`hash`), INDEX `idx_uploader_id` (`uploader_id`), INDEX `idx_public_type_status` (`is_public`, `type`, `status`), INDEX `idx_download_count` (`download_count` DESC), INDEX `idx_favorite_count` (`favorite_count` DESC), CONSTRAINT `fk_textures_uploader` FOREIGN KEY (`uploader_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='皮肤与披风材质表';