114 lines
7.3 KiB
Plaintext
114 lines
7.3 KiB
Plaintext
-- 用户表,支持积分系统和权限管理
|
||
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='皮肤与披风材质表'; |