初始化游戏小组管理系统后端项目

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
UGREEN USER
2026-01-28 10:42:06 +08:00
commit b25aa5b143
134 changed files with 30536 additions and 0 deletions

324
database/init.sql Normal file
View File

@@ -0,0 +1,324 @@
-- ================================================
-- 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手游');