Files
gamegroup/database/init.sql
UGREEN USER b25aa5b143 初始化游戏小组管理系统后端项目
- 基于 NestJS + TypeScript + MySQL + Redis 架构
- 完整的模块化设计(认证、用户、小组、游戏、预约等)
- JWT 认证和 RBAC 权限控制系统
- Docker 容器化部署支持
- 添加 CLAUDE.md 项目开发指南
- 配置 .gitignore 忽略文件

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-28 10:42:06 +08:00

325 lines
16 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ================================================
-- Game Guild Backend Database Init Script
-- 数据库ggdev
-- 生成日期2025-12-19
-- ================================================
-- 设置字符集
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ================================================
-- 1. 创建用户表 (users)
-- ================================================
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` varchar(36) NOT NULL,
`username` varchar(50) NOT NULL,
`email` varchar(100) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`password` varchar(255) NOT NULL,
`avatar` varchar(255) DEFAULT NULL,
`role` enum('admin','user') NOT NULL DEFAULT 'user',
`isMember` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否为会员',
`memberExpireAt` datetime DEFAULT NULL COMMENT '会员到期时间',
`lastLoginIp` varchar(50) DEFAULT NULL COMMENT '最后登录IP',
`lastLoginAt` datetime DEFAULT NULL COMMENT '最后登录时间',
`createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`),
UNIQUE KEY `UQ_username` (`username`),
UNIQUE KEY `UQ_email` (`email`),
UNIQUE KEY `UQ_phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
-- ================================================
-- 2. 创建小组表 (groups)
-- ================================================
DROP TABLE IF EXISTS `groups`;
CREATE TABLE `groups` (
`id` varchar(36) NOT NULL,
`name` varchar(100) NOT NULL,
`description` text,
`avatar` varchar(255) DEFAULT NULL,
`ownerId` varchar(36) NOT NULL,
`type` varchar(20) NOT NULL DEFAULT 'normal' COMMENT '类型: normal/guild',
`parentId` varchar(36) DEFAULT NULL COMMENT '父组ID用于子组',
`announcement` text COMMENT '公示信息',
`maxMembers` int NOT NULL DEFAULT '50' COMMENT '最大成员数',
`currentMembers` int NOT NULL DEFAULT '1' COMMENT '当前成员数',
`isActive` tinyint(1) NOT NULL DEFAULT '1',
`createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`),
KEY `FK_groups_ownerId` (`ownerId`),
KEY `FK_groups_parentId` (`parentId`),
CONSTRAINT `FK_groups_ownerId` FOREIGN KEY (`ownerId`) REFERENCES `users` (`id`),
CONSTRAINT `FK_groups_parentId` FOREIGN KEY (`parentId`) REFERENCES `groups` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='小组表';
-- ================================================
-- 3. 创建小组成员表 (group_members)
-- ================================================
DROP TABLE IF EXISTS `group_members`;
CREATE TABLE `group_members` (
`id` varchar(36) NOT NULL,
`groupId` varchar(36) NOT NULL,
`userId` varchar(36) NOT NULL,
`role` enum('owner','admin','member') NOT NULL DEFAULT 'member',
`nickname` varchar(50) DEFAULT NULL COMMENT '组内昵称',
`isActive` tinyint(1) NOT NULL DEFAULT '1',
`joinedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`),
UNIQUE KEY `UQ_groupId_userId` (`groupId`, `userId`),
KEY `FK_group_members_groupId` (`groupId`),
KEY `FK_group_members_userId` (`userId`),
CONSTRAINT `FK_group_members_groupId` FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`) ON DELETE CASCADE,
CONSTRAINT `FK_group_members_userId` FOREIGN KEY (`userId`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='小组成员表';
-- ================================================
-- 4. 创建游戏表 (games)
-- ================================================
DROP TABLE IF EXISTS `games`;
CREATE TABLE `games` (
`id` varchar(36) NOT NULL,
`name` varchar(100) NOT NULL,
`coverUrl` varchar(255) DEFAULT NULL,
`description` text,
`maxPlayers` int NOT NULL COMMENT '最大玩家数',
`minPlayers` int NOT NULL DEFAULT '1' COMMENT '最小玩家数',
`platform` varchar(50) DEFAULT NULL COMMENT '平台',
`tags` text COMMENT '游戏标签',
`isActive` tinyint(1) NOT NULL DEFAULT '1',
`createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='游戏表';
-- ================================================
-- 5. 创建预约表 (appointments)
-- ================================================
DROP TABLE IF EXISTS `appointments`;
CREATE TABLE `appointments` (
`id` varchar(36) NOT NULL,
`groupId` varchar(36) NOT NULL,
`gameId` varchar(36) NOT NULL,
`initiatorId` varchar(36) NOT NULL,
`title` varchar(200) DEFAULT NULL,
`description` text,
`startTime` datetime NOT NULL,
`endTime` datetime DEFAULT NULL,
`maxParticipants` int NOT NULL COMMENT '最大参与人数',
`currentParticipants` int NOT NULL DEFAULT '0' COMMENT '当前参与人数',
`status` enum('pending','open','full','cancelled','finished') NOT NULL DEFAULT 'open',
`createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`),
KEY `FK_appointments_groupId` (`groupId`),
KEY `FK_appointments_gameId` (`gameId`),
KEY `FK_appointments_initiatorId` (`initiatorId`),
CONSTRAINT `FK_appointments_groupId` FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`) ON DELETE CASCADE,
CONSTRAINT `FK_appointments_gameId` FOREIGN KEY (`gameId`) REFERENCES `games` (`id`),
CONSTRAINT `FK_appointments_initiatorId` FOREIGN KEY (`initiatorId`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='预约表';
-- ================================================
-- 6. 创建预约参与者表 (appointment_participants)
-- ================================================
DROP TABLE IF EXISTS `appointment_participants`;
CREATE TABLE `appointment_participants` (
`id` varchar(36) NOT NULL,
`appointmentId` varchar(36) NOT NULL,
`userId` varchar(36) NOT NULL,
`status` enum('joined','pending','rejected') NOT NULL DEFAULT 'joined',
`note` text COMMENT '备注',
`joinedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`),
UNIQUE KEY `UQ_appointmentId_userId` (`appointmentId`, `userId`),
KEY `FK_appointment_participants_appointmentId` (`appointmentId`),
KEY `FK_appointment_participants_userId` (`userId`),
CONSTRAINT `FK_appointment_participants_appointmentId` FOREIGN KEY (`appointmentId`) REFERENCES `appointments` (`id`) ON DELETE CASCADE,
CONSTRAINT `FK_appointment_participants_userId` FOREIGN KEY (`userId`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='预约参与者表';
-- ================================================
-- 7. 创建资产表 (assets)
-- ================================================
DROP TABLE IF EXISTS `assets`;
CREATE TABLE `assets` (
`id` varchar(36) NOT NULL,
`groupId` varchar(36) NOT NULL,
`type` enum('account','item') NOT NULL,
`name` varchar(100) NOT NULL,
`description` text COMMENT '描述',
`accountCredentials` text COMMENT '加密的账号凭据',
`quantity` int NOT NULL DEFAULT '1' COMMENT '数量(用于物品)',
`status` enum('available','in_use','borrowed','maintenance') NOT NULL DEFAULT 'available',
`currentBorrowerId` varchar(36) DEFAULT NULL COMMENT '当前借用人ID',
`createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`),
KEY `FK_assets_groupId` (`groupId`),
CONSTRAINT `FK_assets_groupId` FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='资产表';
-- ================================================
-- 8. 创建资产日志表 (asset_logs)
-- ================================================
DROP TABLE IF EXISTS `asset_logs`;
CREATE TABLE `asset_logs` (
`id` varchar(36) NOT NULL,
`assetId` varchar(36) NOT NULL,
`userId` varchar(36) NOT NULL,
`action` enum('borrow','return','add','remove') NOT NULL,
`quantity` int NOT NULL DEFAULT '1' COMMENT '数量',
`note` text COMMENT '备注',
`createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`),
KEY `FK_asset_logs_assetId` (`assetId`),
KEY `FK_asset_logs_userId` (`userId`),
CONSTRAINT `FK_asset_logs_assetId` FOREIGN KEY (`assetId`) REFERENCES `assets` (`id`) ON DELETE CASCADE,
CONSTRAINT `FK_asset_logs_userId` FOREIGN KEY (`userId`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='资产日志表';
-- ================================================
-- 9. 创建积分表 (points)
-- ================================================
DROP TABLE IF EXISTS `points`;
CREATE TABLE `points` (
`id` varchar(36) NOT NULL,
`userId` varchar(36) NOT NULL,
`groupId` varchar(36) NOT NULL,
`amount` int NOT NULL COMMENT '积分变动值,正为增加,负为减少',
`reason` varchar(100) NOT NULL COMMENT '原因',
`description` text COMMENT '详细说明',
`relatedId` varchar(36) DEFAULT NULL COMMENT '关联ID如活动ID、预约ID',
`createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`),
KEY `FK_points_userId` (`userId`),
KEY `FK_points_groupId` (`groupId`),
CONSTRAINT `FK_points_userId` FOREIGN KEY (`userId`) REFERENCES `users` (`id`) ON DELETE CASCADE,
CONSTRAINT `FK_points_groupId` FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='积分表';
-- ================================================
-- 10. 创建账本表 (ledgers)
-- ================================================
DROP TABLE IF EXISTS `ledgers`;
CREATE TABLE `ledgers` (
`id` varchar(36) NOT NULL,
`groupId` varchar(36) NOT NULL,
`creatorId` varchar(36) NOT NULL,
`amount` decimal(10,2) NOT NULL,
`type` enum('income','expense') NOT NULL,
`category` varchar(50) DEFAULT NULL COMMENT '分类',
`description` text,
`proofImages` text COMMENT '凭证图片',
`createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`),
KEY `FK_ledgers_groupId` (`groupId`),
KEY `FK_ledgers_creatorId` (`creatorId`),
CONSTRAINT `FK_ledgers_groupId` FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`) ON DELETE CASCADE,
CONSTRAINT `FK_ledgers_creatorId` FOREIGN KEY (`creatorId`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='账本表';
-- ================================================
-- 11. 创建荣誉表 (honors)
-- ================================================
DROP TABLE IF EXISTS `honors`;
CREATE TABLE `honors` (
`id` varchar(36) NOT NULL,
`groupId` varchar(36) NOT NULL,
`title` varchar(200) NOT NULL,
`description` text,
`mediaUrls` text COMMENT '媒体文件URLs',
`eventDate` date NOT NULL COMMENT '事件日期',
`participantIds` text COMMENT '参与者ID列表',
`creatorId` varchar(36) NOT NULL,
`createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`),
KEY `FK_honors_groupId` (`groupId`),
KEY `FK_honors_creatorId` (`creatorId`),
CONSTRAINT `FK_honors_groupId` FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`) ON DELETE CASCADE,
CONSTRAINT `FK_honors_creatorId` FOREIGN KEY (`creatorId`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='荣誉表';
-- ================================================
-- 12. 创建日程表 (schedules)
-- ================================================
DROP TABLE IF EXISTS `schedules`;
CREATE TABLE `schedules` (
`id` varchar(36) NOT NULL,
`userId` varchar(36) NOT NULL,
`groupId` varchar(36) NOT NULL,
`availableSlots` text NOT NULL COMMENT '空闲时间段 JSON: { "mon": ["20:00-23:00"], ... }',
`createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`),
KEY `FK_schedules_userId` (`userId`),
KEY `FK_schedules_groupId` (`groupId`),
CONSTRAINT `FK_schedules_userId` FOREIGN KEY (`userId`) REFERENCES `users` (`id`) ON DELETE CASCADE,
CONSTRAINT `FK_schedules_groupId` FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='日程表';
-- ================================================
-- 13. 创建黑名单表 (blacklists)
-- ================================================
DROP TABLE IF EXISTS `blacklists`;
CREATE TABLE `blacklists` (
`id` varchar(36) NOT NULL,
`targetGameId` varchar(100) NOT NULL COMMENT '目标游戏ID或用户名',
`reason` text NOT NULL,
`reporterId` varchar(36) NOT NULL,
`proofImages` text COMMENT '证据图片',
`status` enum('pending','approved','rejected') NOT NULL DEFAULT 'pending',
`reviewerId` varchar(36) DEFAULT NULL COMMENT '审核人ID',
`reviewNote` text COMMENT '审核意见',
`createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`),
KEY `FK_blacklists_reporterId` (`reporterId`),
KEY `FK_blacklists_reviewerId` (`reviewerId`),
CONSTRAINT `FK_blacklists_reporterId` FOREIGN KEY (`reporterId`) REFERENCES `users` (`id`),
CONSTRAINT `FK_blacklists_reviewerId` FOREIGN KEY (`reviewerId`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='黑名单表';
-- ================================================
-- 14. 创建竞猜表 (bets)
-- ================================================
DROP TABLE IF EXISTS `bets`;
CREATE TABLE `bets` (
`id` varchar(36) NOT NULL,
`appointmentId` varchar(36) NOT NULL,
`userId` varchar(36) NOT NULL,
`betOption` varchar(100) NOT NULL COMMENT '下注选项',
`amount` int NOT NULL COMMENT '下注积分',
`status` enum('pending','won','cancelled','lost') NOT NULL DEFAULT 'pending',
`winAmount` int NOT NULL DEFAULT '0' COMMENT '赢得的积分',
`createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`),
KEY `FK_bets_appointmentId` (`appointmentId`),
KEY `FK_bets_userId` (`userId`),
CONSTRAINT `FK_bets_appointmentId` FOREIGN KEY (`appointmentId`) REFERENCES `appointments` (`id`) ON DELETE CASCADE,
CONSTRAINT `FK_bets_userId` FOREIGN KEY (`userId`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='竞猜表';
-- ================================================
-- 恢复外键检查
-- ================================================
SET FOREIGN_KEY_CHECKS = 1;
-- ================================================
-- 初始化测试数据(可选)
-- ================================================
-- 插入一个管理员账户 (密码: Admin@123需要通过程序加密)
-- INSERT INTO `users` (`id`, `username`, `email`, `role`, `password`)
-- VALUES (UUID(), 'admin', 'admin@example.com', 'admin', 'hashed_password_here');
-- 插入一些示例游戏
-- INSERT INTO `games` (`id`, `name`, `maxPlayers`, `minPlayers`, `platform`, `description`) VALUES
-- (UUID(), 'DOTA 2', 10, 2, 'Steam', '经典MOBA游戏'),
-- (UUID(), 'CS:GO', 10, 2, 'Steam', '经典FPS游戏'),
-- (UUID(), '王者荣耀', 10, 2, 'Mobile', '热门MOBA手游');