From ff996b0dea237cc2549b86d4117b52638408ed18 Mon Sep 17 00:00:00 2001
From: moyin <244344649@qq.com>
Date: Wed, 14 Jan 2026 15:11:54 +0800
Subject: [PATCH 1/3] =?UTF-8?q?docs=EF=BC=9A=E4=BC=98=E5=8C=96README?=
=?UTF-8?q?=E4=B8=AD=E7=9A=84AI=E4=BB=A3=E7=A0=81=E6=A3=80=E6=9F=A5?=
=?UTF-8?q?=E6=8C=87=E5=8D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 将快速开始改为简洁的prompt模板
- 移除详细的检查步骤列表
- 简化使用说明,突出AI自动化流程
- 保留文档链接供开发者查看详细规范
---
README.md | 490 ++++++++++++++----------------------------------------
1 file changed, 122 insertions(+), 368 deletions(-)
diff --git a/README.md b/README.md
index 1768a65..f8c0ebc 100644
--- a/README.md
+++ b/README.md
@@ -1,35 +1,30 @@
# 🐋 Whale Town - 像素游戏后端服务
-> 一个基于 NestJS 的现代化 2D 像素风游戏后端服务,采用业务功能模块化架构,支持用户认证、管理员后台、安全防护等完整功能。
+> 基于 NestJS 的现代化 2D 像素游戏后端,采用四层架构(Gateway-Business-Core-Data),支持用户认证、实时通信、Zulip集成、管理员后台。
[](https://nodejs.org/)
[](https://nestjs.com/)
[](https://www.typescriptlang.org/)
-[](./LICENSE)
+[](https://reactjs.org/)
+[](#)
-## 🎯 项目简介
+## 🎯 核心特性
-Whale Town 是一个功能完整的像素游戏后端服务,采用业务功能模块化架构设计:
-
-- 🔐 **用户认证模块** - 完整的登录、注册、密码管理、邮箱验证系统
-- 👥 **用户管理模块** - 用户状态管理、批量操作、状态统计功能
-- 🛡️ **管理员模块** - 管理员认证、用户管理、密码重置、日志查看
-- 🔒 **安全模块** - 频率限制、维护模式、超时控制、内容类型检查
-- 📧 **智能邮件服务** - 支持测试模式和生产模式自动切换
-- 🗄️ **灵活存储方案** - Redis文件存储 + 内存数据库,支持无依赖测试
-- 📚 **完整API文档** - Swagger UI + OpenAPI规范,17个接口完整覆盖
-- 🧪 **全面测试覆盖** - 140个单元测试用例全部通过
-
----
+- 🔐 用户认证:多方式登录、验证码登录、GitHub OAuth
+- 🌐 实时通信:原生WebSocket、位置广播、地图房间管理
+- 💬 Zulip集成:游戏内聊天与Zulip社群双向同步
+- 👑 管理员后台:React界面、用户管理、日志监控
+- 🛡️ 安全防护:频率限制、维护模式、JWT认证
+- 🗄️ 灵活存储:MySQL/内存双模式、Redis/文件双模式
+- 📚 完整文档:Swagger UI、WebSocket测试工具
## 🚀 快速开始
-### 📋 环境要求
+### 环境要求
+- Node.js >= 18.0.0
+- pnpm >= 8.0.0
-- **Node.js** >= 18.0.0 (推荐 24.7.0)
-- **pnpm** >= 8.0.0 (推荐 10.25.0)
-
-### 🛠️ 安装与运行
+### 安装运行
```bash
# 1. 克隆项目
@@ -39,432 +34,191 @@ cd whale-town-end
# 2. 安装依赖
pnpm install
-# 3. 配置环境(测试模式,无需数据库和邮件服务器)
+# 3. 配置环境(测试模式,无需数据库)
cp .env.example .env
-# 4. 启动开发服务器
+# 4. 启动服务
pnpm run dev
```
-🎉 **服务启动成功!** 访问 http://localhost:3000
+访问:http://localhost:3000
-### 🧑💻 前端管理界面
-
-项目包含一个功能完整的前端管理界面,位于 `client/` 目录:
-
-**🎛️ 核心功能:**
-- 管理员身份认证(独立Token系统)
-- 用户列表管理与搜索
-- 用户密码重置功能
-- 运行时日志查看与下载
-- 响应式界面设计
-
-**🚀 快速启动:**
+### 前端管理界面
```bash
-# 1. 启动后端服务
-pnpm run dev
-
-# 2. 启动前端管理界面
+# 启动管理后台
cd client
pnpm install
pnpm run dev
-
-# 3. 访问管理后台
-# 地址: http://localhost:5173
-# 默认账号: admin / Admin123456
```
-### 🧪 快速测试
+访问:http://localhost:5173
+默认账号:admin / Admin123456
-```bash
-# 运行综合测试(推荐)
-.\test-comprehensive.ps1
+### 在线体验
-# 跳过限流测试(更快)
-.\test-comprehensive.ps1 -SkipThrottleTest
+- API文档:https://whaletownend.xinghangee.icu/api-docs
+- WebSocket测试:https://whaletownend.xinghangee.icu/websocket-test
-# 测试远程服务器
-.\test-comprehensive.ps1 -BaseUrl "https://your-server.com"
-```
+## 🏗️ 项目架构
-**测试内容:**
-- ✅ 应用状态检查
-- ✅ 邮箱验证码发送与验证
-- ✅ 用户注册与登录
-- ✅ 验证码登录功能
-- ✅ 密码重置流程
-- ✅ 邮箱冲突检测
-- ✅ 验证码冷却时间清除
-- ✅ 限流保护机制
-- ✅ Redis文件存储功能
-- ✅ 邮件测试模式
-
----
-
-## 🎓 新开发者指南
-
-### 第一步:了解项目规范 📚
-
-**⚠️ 重要:在开始开发前,请务必阅读以下文档**
-
-1. **[AI辅助开发规范指南](./docs/AI辅助开发规范指南.md)** 🤖
- - 学会使用AI助手提升开发效率300%
- - 自动生成符合规范的代码和注释
- - 实时检查代码质量
-
-2. **[后端开发规范](./docs/backend_development_guide.md)** 📝
- - 代码注释标准
- - 业务逻辑设计原则
- - 日志记录要求
-
-3. **[Git提交规范](./docs/git_commit_guide.md)** 🔄
- - 提交信息格式
- - 分支管理策略
-
-### 第二步:熟悉项目架构 🏗️
-
-**📁 项目文件结构总览**
+### 四层架构设计
```
-whale-town-end/ # 🐋 项目根目录
-├── 📂 src/ # 源代码目录
-│ ├── 📂 business/ # 🎯 业务功能模块(按功能组织)
-│ │ ├── 📂 auth/ # 🔐 用户认证模块
-│ │ ├── 📂 user-mgmt/ # 👥 用户管理模块
-│ │ ├── 📂 admin/ # 🛡️ 管理员模块
-│ │ ├── 📂 security/ # 🔒 安全防护模块
-│ │ ├── 📂 zulip/ # 💬 Zulip集成模块
-│ │ └── 📂 shared/ # 🔗 共享业务组件
-│ ├── 📂 core/ # ⚙️ 核心技术服务
-│ │ ├── 📂 db/ # 🗄️ 数据库层(MySQL/内存双模式)
-│ │ ├── 📂 redis/ # 🔴 Redis缓存(真实Redis/文件存储)
-│ │ ├── 📂 login_core/ # 🔑 登录核心服务
-│ │ ├── 📂 admin_core/ # 👑 管理员核心服务
-│ │ ├── 📂 zulip/ # 💬 Zulip核心服务
-│ │ └── 📂 utils/ # 🛠️ 工具服务(邮件、验证码、日志)
-│ ├── 📄 app.module.ts # 🏠 应用主模块
-│ └── 📄 main.ts # 🚀 应用入口点
-├── 📂 client/ # 🎨 前端管理界面
-│ ├── 📂 src/ # 前端源码
-│ ├── 📂 dist/ # 前端构建产物
-│ ├── 📄 package.json # 前端依赖配置
-│ └── 📄 vite.config.ts # Vite构建配置
-├── 📂 docs/ # 📚 项目文档中心
-│ ├── 📂 api/ # 🔌 API接口文档
-│ ├── 📂 development/ # 💻 开发指南
-│ ├── 📂 deployment/ # 🚀 部署文档
-│ ├── 📄 ARCHITECTURE.md # 🏗️ 架构设计文档
-│ └── 📄 README.md # 📖 文档导航中心
-├── 📂 test/ # 🧪 测试文件目录
-├── 📂 config/ # ⚙️ 配置文件目录
-├── 📂 logs/ # 📝 日志文件存储
-├── 📂 redis-data/ # 💾 Redis文件存储数据
-├── 📂 dist/ # 📦 后端构建产物
-├── 📄 .env # 🔧 环境变量配置
-├── 📄 package.json # 📋 项目依赖配置
-├── 📄 docker-compose.yml # 🐳 Docker编排配置
-├── 📄 Dockerfile # 🐳 Docker镜像配置
-└── 📄 README.md # 📖 项目主文档(当前文件)
+Gateway Layer (网关层)
+ ↓ HTTP/WebSocket协议处理、数据验证
+Business Layer (业务层)
+ ↓ 业务逻辑实现、服务协调
+Core Layer (核心层)
+ ↓ 技术基础设施、数据访问
+Data Layer (数据层)
+ ↓ 数据持久化、缓存管理
```
-**架构特点:**
-- 🏗️ **业务功能模块化** - 按业务功能而非技术组件组织代码
-- 🔄 **双模式支持** - 开发测试模式 + 生产部署模式
-- 📦 **清晰分层** - 业务层 → 核心层 → 数据层
-- 🧪 **测试友好** - 完整的单元测试和集成测试覆盖
+### 目录结构
-### 第三步:体验核心功能 🎮
+```
+whale-town-end/
+├── src/
+│ ├── gateway/ # 网关层:auth, location_broadcast
+│ ├── business/ # 业务层:auth, user_mgmt, admin, zulip, notice
+│ ├── core/ # 核心层:db, redis, login_core, admin_core, utils
+│ ├── app.module.ts
+│ └── main.ts
+├── client/ # React管理界面
+├── docs/ # 项目文档
+├── test/ # 测试文件
+└── config/ # 配置文件
+```
-1. **API文档系统** 📖
- ```bash
- # 启动服务后访问
- http://localhost:3000/api-docs
- ```
-
-2. **用户认证系统** 🔐
- - 邮箱验证码注册
- - 多方式登录(用户名/邮箱/手机号)
- - 密码重置功能
-
-3. **实时通信** 🌐
- - WebSocket支持
- - Socket.IO集成
-
-### 第四步:开始贡献 🤝
-
-1. **Fork项目** 到你的Gitea账户
-2. **创建功能分支**:`git checkout -b feature/your-feature`
-3. **遵循规范开发**(使用AI助手帮助)
-4. **提交代码**:`git commit -m "feat:添加新功能"`
-5. **创建Pull Request**
-
----
+详细架构:[docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md)
## 🛠️ 技术栈
-### 🚀 核心框架
-- **NestJS** `^11.1.9` - 企业级Node.js框架,提供依赖注入、模块化等特性
-- **TypeScript** `^5.9.3` - 类型安全的JavaScript超集
-- **Express** `^10.4.20` - 基于Express的HTTP服务器
-- **RxJS** `^7.8.2` - 响应式编程库,处理异步数据流
+**后端:** NestJS 11 + TypeScript 5 + MySQL + Redis + WebSocket
+**前端:** React 18 + Vite 7 + Ant Design 5
+**测试:** Jest + Supertest(99个测试用例)
+**部署:** Docker + PM2 + Nginx
-### 🌐 实时通信
-- **Socket.IO** `^10.4.20` - WebSocket实时双向通信
-- **@nestjs/websockets** - NestJS WebSocket网关支持
-- **@nestjs/platform-socket.io** - Socket.IO平台适配器
-
-### 🗄️ 数据存储
-- **TypeORM** `^0.3.28` - 强大的ORM框架,支持多种数据库
-- **MySQL2** `^3.16.0` - 高性能MySQL驱动
-- **IORedis** `^5.8.2` - Redis客户端,支持集群和哨兵模式
-- **文件存储** - 自研Redis文件存储适配器,支持无Redis开发
-
-### 🔐 安全认证
-- **bcrypt** `^6.0.0` - 密码加密哈希算法
-- **class-validator** `^0.14.3` - 数据验证装饰器
-- **class-transformer** `^0.5.1` - 对象转换和序列化
-
-### 📧 通信服务
-- **Nodemailer** `^6.10.1` - 邮件发送服务
-- **Axios** `^1.13.2` - HTTP客户端,支持第三方API调用
-
-### 📚 API文档
-- **Swagger UI** `^5.0.1` - 交互式API文档界面
-- **@nestjs/swagger** `^11.2.3` - NestJS Swagger集成
-
-### 🧑💻 管理员后台(前端)
-- **Vite** - 前端构建工具(本项目 admin dashboard 使用)
-- **React** - 前端 UI 框架
-- **React Router** - 前端路由
-- **Ant Design** - 企业级 UI 组件库
-
-### 📊 日志监控
-- **Pino** `^10.1.0` - 高性能结构化日志库
-- **nestjs-pino** `^4.5.0` - NestJS Pino集成
-- **pino-pretty** `^13.1.3` - Pino日志美化输出
-
-### 🧪 测试框架
-- **Jest** `^29.7.0` - JavaScript测试框架
-- **Supertest** `^7.1.4` - HTTP断言测试
-- **@nestjs/testing** `^10.4.20` - NestJS测试工具
-
-### ⚙️ 开发工具
-- **@nestjs/cli** `^10.4.9` - NestJS命令行工具
-- **ts-jest** `^29.2.5` - TypeScript Jest支持
-- **ts-node** `^10.9.2` - TypeScript运行时
-- **pnpm** - 快速、节省磁盘空间的包管理器
-
-### 🔄 任务调度
-- **@nestjs/schedule** `^4.1.2` - 定时任务和计划任务支持
-
-### 📦 构建部署
-- **Docker** - 容器化部署
-- **PM2** - 生产环境进程管理
-- **Nginx** - 反向代理和负载均衡
-
----
-
-## 🏗️ 核心功能
-
-### 🔐 用户认证模块 (business/auth/)
-- **多方式登录** - 用户名/邮箱/手机号
-- **邮箱验证** - 完整的验证码流程
-- **密码安全** - bcrypt加密 + 强度验证
-- **第三方登录** - GitHub OAuth支持
-- **密码管理** - 忘记密码、重置密码、修改密码
-
-### 👥 用户管理模块 (business/user-mgmt/)
-- **用户状态管理** - 6种状态控制(active、inactive、locked、banned、deleted、pending)
-- **批量操作** - 批量修改用户状态
-- **状态统计** - 各状态用户数量统计
-- **状态变更日志** - 完整的审计日志
-
-### 🛡️ 管理员模块 (business/admin/)
-- **独立认证** - 专用Token系统,与用户系统隔离
-- **用户管理** - 用户列表、搜索、密码重置
-- **日志监控** - 实时日志查看、历史日志下载
-- **权限控制** - 管理员角色验证(role=9)
-
-### 🔒 安全模块 (business/security/)
-- **频率限制** - 基于IP的请求频率控制
-- **维护模式** - 系统维护期间的访问控制
-- **内容类型验证** - HTTP请求内容类型检查
-- **超时控制** - 可配置的请求超时机制
-
-### 📧 智能邮件服务
-- **测试模式** - 控制台输出,无需SMTP服务器
-- **生产模式** - 支持主流邮件服务商
-- **模板系统** - 验证码、欢迎邮件等模板
-- **自动切换** - 根据配置自动选择模式
-
-### 🗄️ 灵活存储方案
-- **Redis文件存储** - 开发测试无需Redis服务器
-- **内存数据库** - 无需MySQL即可运行
-- **生产就绪** - 支持MySQL + Redis部署
-- **自动切换** - 根据配置自动选择存储方式
-
-### 📚 完整API文档
-- **Swagger UI** - 交互式API文档
-- **OpenAPI规范** - 标准化接口描述
-- **Postman集合** - 可导入的测试集合
-- **实时更新** - 代码变更自动同步文档
-
-### 🧪 全面测试覆盖
-- **单元测试** - 140个测试用例全部通过
-- **API测试** - 跨平台测试脚本
-- **集成测试** - 完整业务流程验证
-- **测试模式** - 无依赖快速测试
-
----
-
-## 📊 开发与测试
-
-### 🔧 开发命令
+## 📊 开发命令
```bash
-# 开发服务器(热重载)
-pnpm run dev
+# 开发
+pnpm run dev # 启动开发服务器
+pnpm run build # 构建项目
+pnpm run start:prod # 生产环境运行
-# 构建项目
-pnpm run build
-
-# 生产环境运行
-pnpm run start:prod
-
-# 代码检查
-pnpm run lint
-
-# 格式化代码
-pnpm run format
+# 测试
+pnpm test # 运行单元测试
+pnpm run test:cov # 测试覆盖率
+.\test-comprehensive.ps1 # API功能测试
```
-### 🧪 测试命令
+## 🌍 环境配置
+### 开发环境(默认)
```bash
-# 运行所有单元测试
-pnpm test
-
-# 监听模式运行测试
-pnpm run test:watch
-
-# 生成测试覆盖率报告
-pnpm run test:cov
-
-# API功能测试(综合测试脚本)
-.\test-comprehensive.ps1
-```
-
-### 📈 测试覆盖率
-
-- **单元测试**: 140个测试用例 ✅
-- **功能测试**: 用户认证、用户管理、管理员后台、安全防护 ✅
-- **集成测试**: 完整业务流程 ✅
-
----
-
-## 🌍 部署配置
-
-### 测试环境(默认)
-```bash
-# 无需数据库和邮件服务器
-USE_FILE_REDIS=true
+USE_FILE_REDIS=true # 使用文件存储(无需Redis)
NODE_ENV=development
-# 数据库和邮件配置保持注释状态
+# 无需配置数据库和邮件
```
### 生产环境
```bash
-# 启用真实服务
USE_FILE_REDIS=false
NODE_ENV=production
-# 配置数据库
+# 数据库
DB_HOST=your_mysql_host
DB_USERNAME=your_username
DB_PASSWORD=your_password
-# 配置Redis
+# Redis
REDIS_HOST=your_redis_host
REDIS_PASSWORD=your_password
-# 配置邮件服务
-EMAIL_HOST=smtp.gmail.com
-EMAIL_USER=your_email@gmail.com
-EMAIL_PASS=your_app_password
+# 邮件
+EMAIL_HOST=smtp.163.com
+EMAIL_USER=your_email@163.com
+EMAIL_PASS=your_password
+
+# Zulip
+ZULIP_SERVER_URL=https://your-zulip.com/
+ZULIP_BOT_API_KEY=your_api_key
```
-详细部署指南:[DEPLOYMENT.md](./DEPLOYMENT.md)
+详细配置:[docs/deployment/DEPLOYMENT.md](./docs/deployment/DEPLOYMENT.md)
----
+## 📚 文档
-## 📚 文档中心
+- [架构设计](./docs/ARCHITECTURE.md) - 四层架构详解
+- [开发规范](./docs/development/backend_development_guide.md) - 代码规范
+- [Git规范](./docs/development/git_commit_guide.md) - 提交规范
+- [API文档](http://localhost:3000/api-docs) - Swagger UI
+- [测试指南](./docs/development/TESTING.md) - 测试说明
-### 🎯 新手必读
-1. **[AI辅助开发指南](./docs/AI辅助开发规范指南.md)** - 提升开发效率300%
-2. **[后端开发规范](./docs/backend_development_guide.md)** - 代码质量标准
-3. **[Git提交规范](./docs/git_commit_guide.md)** - 版本控制最佳实践
+### 🤖 AI代码检查指南
-### 📖 API文档
-- **[Swagger UI](http://localhost:3000/api-docs)** - 交互式API文档
-- **[API文档总览](./docs/api/README.md)** - 使用指南
-- **[OpenAPI规范](./docs/api/openapi.yaml)** - 标准化描述
-- **[Postman集合](./docs/api/postman-collection.json)** - 测试集合
+项目提供了完整的AI辅助代码检查流程,帮助确保代码质量和规范性。
-### 🏗️ 系统设计
-- **[架构文档](./docs/ARCHITECTURE.md)** - 系统架构设计
-- **[部署指南](./docs/deployment/DEPLOYMENT.md)** - 生产环境部署
+**快速开始:**
-### 🧪 测试指南
-- **[测试指南](./docs/development/TESTING.md)** - 完整测试说明
-- **[单元测试](./src/**/*.spec.ts)** - 测试用例参考
+向AI发送以下prompt开始代码检查:
----
+```
+请使用 docs/ai-reading 中readme的规范对 [模块路径] 进行完整的代码检查。
+```
-## 🤝 贡献者
+**如何使用:**
+- AI会按照7个步骤逐步执行检查(命名规范、注释标准、代码质量、架构层级、测试覆盖、文档生成、代码提交)
+- 每个步骤完成后会提供检查报告,等待确认后继续下一步
+- 如有问题会自动修复并重新验证
+- 这里建议每个步骤结束后,人工确认是否执行了修复,如果进行了修复,请告诉他:请重新执行一遍该步骤,看看是否有遗漏。
-感谢所有为项目做出贡献的开发者!
+详细说明:[docs/ai-reading/README.md](./docs/ai-reading/README.md) | 开发者规范:[docs/开发者代码检查规范.md](./docs/开发者代码检查规范.md)
-### 🏆 核心团队
-- **[moyin](https://gitea.xinghangee.icu/moyin)** - 核心开发者
-- **[jianuo](https://gitea.xinghangee.icu/jianuo)** - 核心开发者
-- **[angjustinl](https://gitea.xinghangee.icu/ANGJustinl)** - 核心开发者
+## 🤝 参与贡献
-查看完整贡献者名单:[docs/CONTRIBUTORS.md](./docs/CONTRIBUTORS.md)
+### 贡献流程
+1. Fork项目
+2. 创建分支:`git checkout -b feature/your-feature`
+3. 开发功能(遵循开发规范)
+4. 运行测试:`pnpm test`
+5. 提交代码:`git commit -m "feat: 添加新功能"`
+6. 创建Pull Request
-### 🌟 如何贡献
+### 核心团队
+- [moyin](https://gitea.xinghangee.icu/moyin)
+- [jianuo](https://gitea.xinghangee.icu/jianuo)
+- [angjustinl](https://gitea.xinghangee.icu/ANGJustinl)
-我们欢迎所有形式的贡献:
+完整贡献者:[docs/CONTRIBUTORS.md](./docs/CONTRIBUTORS.md)
-1. **� Bug修复** - 发现并修复问题
-2. **✨ 新功能** - 添加有价值的功能
-3. **� 文档改馈进** - 完善项目文档
-4. **🧪 测试用例** - 提高代码覆盖率
-5. **💡 建议反馈** - 提出改进建议
+## 📝 版本历史
-**贡献流程:**
-1. Fork项目 → 2. 创建分支 → 3. 开发功能 → 4. 提交PR
+- **v2.1.0** (2026-01) - WebSocket架构升级、地图房间管理
+- **v2.0.0** (2025-12) - 四层架构重构、Zulip集成、管理员后台
+- **v1.2.0** (2025-11) - 用户管理、安全防护、邮件服务
+- **v1.0.0** (2025-10) - 项目初始化、用户认证、双模式存储
----
+## 📞 联系方式
-## 📞 联系我们
-
-- **项目地址**: [Gitea Repository](https://gitea.xinghangee.icu/datawhale/whale-town-end)
-- **问题反馈**: [Issues](https://gitea.xinghangee.icu/datawhale/whale-town-end/issues)
-- **功能建议**: [Discussions](https://gitea.xinghangee.icu/datawhale/whale-town-end/discussions)
+- 项目地址:[Gitea Repository](https://gitea.xinghangee.icu/datawhale/whale-town-end)
+- 问题反馈:[Issues](https://gitea.xinghangee.icu/datawhale/whale-town-end/issues)
+- 功能建议:[Discussions](https://gitea.xinghangee.icu/datawhale/whale-town-end/discussions)
## 📄 许可证
-本项目采用 [MIT License](./LICENSE) 开源协议。
+[MIT License](./LICENSE)
---
-**🐋 Whale Town - 让像素世界更精彩!**
+**🐋 Whale Town - 让像素世界更精彩 !**
Made with ❤️ by the Whale Town Team
[⭐ Star](https://gitea.xinghangee.icu/datawhale/whale-town-end) | [🍴 Fork](https://gitea.xinghangee.icu/datawhale/whale-town-end/fork) | [📖 Docs](./docs/) | [🐛 Issues](https://gitea.xinghangee.icu/datawhale/whale-town-end/issues)
-
\ No newline at end of file
+
From cc1b081c3aae430409c504e3639095a09a8a3830 Mon Sep 17 00:00:00 2001
From: moyin <244344649@qq.com>
Date: Wed, 14 Jan 2026 15:12:15 +0800
Subject: [PATCH 2/3] =?UTF-8?q?docs=EF=BC=9A=E6=A0=B9=E6=8D=AEgit=E8=AE=B0?=
=?UTF-8?q?=E5=BD=95=E6=9B=B4=E6=96=B0=E8=B4=A1=E7=8C=AE=E8=80=85=E5=90=8D?=
=?UTF-8?q?=E5=8D=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 更新提交统计:moyin 166次,jianuo 10次,angjustinl 9次
- 调整贡献者排序,按提交数量重新组织
- 细化每位贡献者的具体工作内容
- 更新最新重要贡献(2026年1月的工作)
- 重新整理项目里程碑,按时间倒序排列
- 修正文档链接路径
---
docs/CONTRIBUTORS.md | 214 +++++++++++++++++++++++++------------------
1 file changed, 124 insertions(+), 90 deletions(-)
diff --git a/docs/CONTRIBUTORS.md b/docs/CONTRIBUTORS.md
index 9e4f6a4..c533b32 100644
--- a/docs/CONTRIBUTORS.md
+++ b/docs/CONTRIBUTORS.md
@@ -4,116 +4,149 @@
## 核心贡献者
+### � 项目维护者
+
+**moyin** - 项目维护者
+- Gitea: [@moyin](https://gitea.xinghangee.icu/moyin)
+- Email: xinghang_a@proton.me
+- 提交数: **166 commits** (不含合并提交)
+- 主要贡献:
+ - 🚀 **项目架构设计** - 四层架构(Gateway-Business-Core-Data)设计与实现
+ - � **用户认证系统** - 完整的登录、注册、JWT认证、验证码登录
+ - 📧 **邮箱验证系统** - 邮件服务、验证码服务、冷却时间机制
+ - �️ **双模式架构** - Redis缓存(文件/真实)、用户服务(内存/数据库)
+ - � **API文档系统** - Swagger UI、OpenAPI规范、WebSocket文档
+ - 🧪 **测试框架** - Jest配置、507+测试用例、集成测试、E2E测试
+ - � **日志系统** - Pino高性能日志、结构化日志、日志管理
+ - 🏗️ **架构重构** - Zulip模块重构、认证模块分层、安全模块迁移
+ - 📚 **文档体系** - 架构文档、开发规范、AI代码检查指南、部署文档
+ - 🎮 **游戏功能** - 位置广播系统、通知系统、地图房间管理
+ - 🔧 **项目配置** - TypeScript配置、构建配置、环境配置、Docker部署
+ - 🐛 **问题修复** - 验证码TTL重置、依赖注入、HTTP状态码、数据库管理
+
### 🌟 核心开发者
+**jianuo** - 核心开发者
+- Gitea: [@jianuo](https://gitea.xinghangee.icu/jianuo)
+- Email: 32106500027@e.gzhu.edu.cn
+- 提交数: **10 commits** (不含合并提交)
+- 主要贡献:
+ - 🎛️ **管理员后台系统** - React前端界面、Ant Design组件、完整CRUD功能
+ - 📊 **日志管理功能** - 运行时日志查看、日志下载、日志分析
+ - � **管理员认证** - 独立Token认证、权限控制、会话管理
+ - 🧪 **单元测试** - 管理员功能测试用例、测试覆盖率提升
+ - ⚙️ **TypeScript配置** - Node16模块解析、编译配置优化
+ - 🐳 **Docker部署** - 容器化部署问题修复、部署脚本优化
+ - 📖 **文档维护** - 技术栈文档、部署文档、错误修复文档
+
**angjustinl** - 核心开发者
- Gitea: [@ANGJustinl](https://gitea.xinghangee.icu/ANGJustinl)
- GitHub: [@ANGJustinl](https://github.com/ANGJustinl)
- Email: 96008766+ANGJustinl@users.noreply.github.com
-- 提交数: **7 commits**
+- 提交数: **9 commits** (不含合并提交)
- 主要贡献:
- - 🔄 邮箱验证流程重构与优化
- - 💾 基于内存的用户服务实现
- - 🛠️ API响应处理改进
- - 🧪 测试用例完善与错误修复
- - 📚 系统架构优化
- - 💬 **Zulip集成系统** - 完整的Zulip实时通信系统开发
- - 🔧 **E2E测试修复** - Zulip集成的端到端测试优化
- - 🎯 **验证码登录测试** - 验证码登录功能测试用例编写
-
-**jianuo** - 核心开发者
-- Gitea: [@jianuo](https://gitea.xinghangee.icu/jianuo)
-- Email: 32106500027@e.gzhu.edu.cn
-- 提交数: **11 commits**
-- 主要贡献:
- - 🎛️ **管理员后台系统** - 完整的前后端管理界面开发
- - 📊 **日志管理功能** - 运行时日志查看与下载系统
- - 🔐 **管理员认证系统** - 独立Token认证与权限控制
- - 🧪 **单元测试完善** - 管理员功能测试用例编写
- - ⚙️ **TypeScript配置优化** - Node16模块解析配置
- - 🐳 **Docker部署优化** - 容器化部署问题修复
- - 📖 **技术栈文档更新** - 项目技术栈说明完善
- - 🔧 **项目配置优化** - 构建和开发环境配置改进
-
-### 🏆 主要维护者
-
-**moyin** - 主要维护者
-- Gitea: [@moyin](https://gitea.xinghangee.icu/moyin)
-- Email: xinghang_a@proton.me
-- 提交数: **112 commits**
-- 主要贡献:
- - 🚀 项目架构设计与初始化
- - 🔐 完整用户认证系统实现
- - 📧 邮箱验证系统设计与开发
- - 🗄️ Redis缓存服务(文件存储+真实Redis双模式)
- - 📝 完整的API文档系统(Swagger UI + OpenAPI)
- - 🧪 测试框架搭建与507个测试用例编写
- - 📊 高性能日志系统集成(Pino)
- - 🔧 项目配置优化与部署方案
- - 🐛 验证码TTL重置关键问题修复
- - 📚 完整的项目文档体系建设
- - 🏗️ **Zulip模块架构重构** - 业务功能模块化架构设计与实现
- - 📖 **架构文档重写** - 详细的架构设计文档和开发者指南
- - 🔄 **验证码冷却时间优化** - 自动清除机制设计与实现
- - 📋 **文档清理优化** - 项目文档结构化整理和维护体系建立
+ - � **Zulip集成系统** - 完整的Zulip实时通信系统、WebSocket连接、消息同步
+ - 🔑 **JWT认证重构** - JWT验证机制、API密钥管理、Token刷新
+ - � **邮箱验证重构** - 验证流程优化、内存用户服务、API响应改进
+ - � **验证码登录** - 验证码登录功能实现、测试用例编写
+ - 🧪 **测试优化** - E2E测试修复、测试断言更新、测试覆盖完善
+ - 🏗️ **Zulip账户管理** - Zulip账户创建、绑定、同步机制
## 贡献统计
| 贡献者 | 提交数 | 主要领域 | 贡献占比 |
|--------|--------|----------|----------|
-| angjustinl | 7 | Zulip集成、功能优化、测试、重构 | 5% |
-| jianuo | 11 | 管理员后台、日志系统、部署优化、配置管理 | 8% |
-| moyin | 112 | 架构设计、核心功能、文档、测试、Zulip重构 | 86% |
+| moyin | 166 | 架构设计、核心功能、文档、测试、重构 | 89.7% |
+| jianuo | 10 | 管理员后台、日志系统、部署优化 | 5.4% |
+| angjustinl | 9 | Zulip集成、JWT认证、验证码登录 | 4.9% |
## 🌟 最新重要贡献
-### 🏗️ Zulip模块架构重构 (2025年12月31日)
-**主要贡献者**: moyin, angjustinl
-
-这是项目历史上最重要的架构重构之一:
-
-- **架构重构**: 实现业务功能模块化架构,将Zulip模块按照业务层和核心层进行清晰分离
-- **代码迁移**: 36个文件的重构和迁移,涉及2773行代码的新增和125行的删除
-- **依赖注入**: 通过接口抽象实现业务层与核心层的完全解耦
-- **测试完善**: 所有507个测试用例通过,确保重构的安全性
-
-### 📚 项目文档体系优化 (2025年12月31日)
+### 🏗️ 四层架构重构与规范化 (2026年1月)
**主要贡献者**: moyin
-- **架构文档重写**: `docs/ARCHITECTURE.md` 从简单架构图扩展为800+行的完整架构设计文档
-- **README优化**: 采用总分结构设计,详细的文件结构总览
-- **文档清理**: 新增 `docs/DOCUMENT_CLEANUP.md` 记录文档维护过程
-- **开发者体验**: 建立完整的文档导航体系,提升开发者上手体验
+项目完成了重大的架构升级和代码规范化工作:
-### 💬 Zulip集成系统 (2025年12月25日)
-**主要贡献者**: angjustinl
+- **认证模块重构** (1月14日): 将Gateway层组件从Business层分离,实现清晰的四层架构
+- **依赖注入优化** (1月14日): 修复AuthGatewayModule依赖注入问题,完善NestJS模块系统
+- **AI代码检查体系** (1月14日): 建立完整的AI辅助代码检查流程和规范文档
+- **架构文档完善** (1月14日): 新增架构重构文档、Gateway层规范、NestJS命名规范
+- **代码规范优化** (1月12日): 完善多个核心模块的代码规范和测试覆盖
-- **完整集成**: 实现与Zulip的完整集成,支持实时通信功能
-- **WebSocket支持**: 建立稳定的WebSocket连接和消息处理机制
-- **测试覆盖**: 完善的E2E测试确保集成功能的稳定性
+### 📚 代码质量与测试提升 (2026年1月)
+**主要贡献者**: moyin
+
+- **测试覆盖完善** (1月12日): 完善users、zulip、verification等模块测试覆盖
+- **文档体系建设** (1月12日): 添加开发者代码检查规范、AI代码检查执行指南
+- **性能优化** (1月12日): 集成高性能缓存系统和结构化日志
+- **模块功能扩展** (1月12日): 添加Zulip动态配置控制器和账户业务服务
+
+### 🎮 游戏功能扩展 (2026年1月)
+**主要贡献者**: moyin
+
+- **通知系统** (1月10日): 实现完整的通知系统核心功能和数据库支持
+- **WebSocket优化** (1月9日): 统一WebSocket网关配置、增强测试页面用户体验
+- **原生WebSocket** (1月9日): 移除Socket.IO依赖,实现原生WebSocket支持
+- **位置广播系统** (1月8日): 实现位置广播系统和端到端测试
+- **管理员系统** (1月8日): 完善管理员系统核心功能和用户管理模块
+
+### 🏗️ Zulip模块架构重构 (2025年12月)
+**主要贡献者**: moyin, angjustinl
+
+- **架构重构** (12月31日): 实现业务功能模块化架构,清晰分离业务层和核心层
+- **Zulip集成** (12月25日): angjustinl开发完整的Zulip实时通信系统
+- **JWT认证** (1月6日): angjustinl引入JWT验证并重构API密钥管理
+- **账户管理** (1月5日): angjustinl添加Zulip账户管理和认证系统集成
## 项目里程碑
+### 2026年1月
+- **1月14日**: 🏗️ 认证模块四层架构重构,Gateway层与Business层清晰分离
+- **1月14日**: 🔧 修复AuthGatewayModule依赖注入问题,完善模块系统
+- **1月14日**: 📚 建立AI代码检查体系,添加完整的规范文档
+- **1月14日**: 📖 新增架构重构文档和NestJS框架规范说明
+- **1月12日**: ✨ 完善多个核心模块的代码规范和测试覆盖
+- **1月12日**: 🧪 添加Zulip业务模块完整测试覆盖
+- **1月12日**: 📝 添加开发者代码检查规范和AI检查执行指南
+- **1月12日**: ⚡ 集成高性能缓存系统和结构化日志
+- **1月10日**: 🔔 实现通知系统核心功能和数据库支持
+- **1月10日**: 🐛 修复数据库管理服务的关键问题
+- **1月9日**: 🌐 统一WebSocket网关配置,增强测试页面
+- **1月9日**: 🔄 移除Socket.IO依赖,实现原生WebSocket支持
+- **1月8日**: 📍 实现位置广播系统和端到端测试
+- **1月8日**: 👑 完善管理员系统核心功能
+- **1月8日**: 🏗️ 项目架构重构和命名规范化
+- **1月7日**: 📦 升级到v2.0.0版本
+- **1月6日**: 🔑 angjustinl引入JWT验证并重构API密钥管理
+- **1月5日**: 👤 angjustinl添加Zulip账户管理和认证系统集成
+- **1月4日**: 🛡️ 重构安全模块架构,迁移至core层
+
### 2025年12月
-- **12月17日**: 项目初始化,完成基础架构搭建
-- **12月17日**: 实现完整的用户认证系统
-- **12月17日**: 完成API文档系统集成
-- **12月17日**: 实现邮箱验证系统
-- **12月17日**: 修复验证码TTL重置关键问题
-- **12月18日**: angjustinl重构邮箱验证流程,引入内存用户服务
-- **12月18日**: jianuo修复Docker部署问题
-- **12月18日**: 完成测试用例修复和优化
-- **12月19日**: jianuo开发管理员后台系统
-- **12月20日**: jianuo完善日志管理功能
-- **12月21日**: jianuo添加管理员后台单元测试
-- **12月22日**: 管理员后台功能合并到主分支
-- **12月25日**: angjustinl开发完整的Zulip集成系统
-- **12月25日**: 实现验证码冷却时间自动清除机制
-- **12月25日**: 完成邮箱冲突检测优化v1.1.1
-- **12月25日**: 升级项目版本到v1.1.0
-- **12月31日**: **重大架构重构** - 完成Zulip模块业务功能模块化架构重构
-- **12月31日**: **文档体系优化** - 项目文档结构化整理和架构文档重写
-- **12月31日**: **测试覆盖完善** - 所有507个测试用例通过,测试覆盖率达到新高
+- **12月31日**: 🏗️ Zulip模块业务功能模块化架构重构
+- **12月31日**: 📚 项目文档结构化整理和架构文档重写
+- **12月25日**: 💬 angjustinl开发完整的Zulip集成系统
+- **12月25日**: 🔄 实现验证码冷却时间自动清除机制
+- **12月25日**: 📧 完成邮箱冲突检测优化v1.1.1
+- **12月25日**: 🎯 angjustinl实现验证码登录功能
+- **12月25日**: 📈 升级项目版本到v1.1.0
+- **12月24日**: 🐛 修复注册逻辑和HTTP状态码问题
+- **12月24日**: 🔧 修复API状态码和限流配置问题
+- **12月24日**: 🏗️ 重构项目结构和业务模块架构
+- **12月23日**: 📖 全面更新API接口文档
+- **12月22日**: 🎛️ jianuo的管理员后台功能合并到主分支
+- **12月19日**: 👑 jianuo开发管理员后台系统
+- **12月19日**: 📊 jianuo完善日志管理功能
+- **12月19日**: 🧪 jianuo添加管理员后台单元测试
+- **12月19日**: ⚙️ jianuo优化TypeScript配置
+- **12月18日**: 🔄 angjustinl重构邮箱验证流程,引入内存用户服务
+- **12月18日**: 🐳 jianuo修复Docker部署问题
+- **12月18日**: 🧪 完成测试用例修复和优化
+- **12月17日**: 🐛 修复验证码TTL重置关键问题
+- **12月17日**: 📧 实现完整的邮箱验证系统
+- **12月17日**: 🗄️ 实现Redis缓存服务(双模式)
+- **12月17日**: 📝 完成API文档系统集成
+- **12月17日**: 🔐 实现完整的用户认证系统
+- **12月17日**: 🚀 项目初始化,完成基础架构搭建
## 如何成为贡献者
@@ -137,9 +170,10 @@
### 贡献规范
请在贡献前阅读:
-- [AI辅助开发规范指南](./docs/AI辅助开发规范指南.md)
-- [后端开发规范](./docs/backend_development_guide.md)
-- [Git提交规范](./docs/git_commit_guide.md)
+- [开发者代码检查规范](./开发者代码检查规范.md)
+- [后端开发规范](./development/backend_development_guide.md)
+- [Git提交规范](./development/git_commit_guide.md)
+- [AI代码检查指南](./ai-reading/README.md)
---
From 260ae2c559da455499a3c96a7a4dc844c2f599f5 Mon Sep 17 00:00:00 2001
From: moyin <244344649@qq.com>
Date: Wed, 14 Jan 2026 15:13:54 +0800
Subject: [PATCH 3/3] =?UTF-8?q?docs=EF=BC=9A=E7=AE=80=E5=8C=96=E6=9E=B6?=
=?UTF-8?q?=E6=9E=84=E6=96=87=E6=A1=A3=EF=BC=8C=E7=AA=81=E5=87=BA=E5=9B=9B?=
=?UTF-8?q?=E5=B1=82=E6=9E=B6=E6=9E=84=E6=A0=B8=E5=BF=83=E8=AE=BE=E8=AE=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 精简ARCHITECTURE.md,移除冗长的目录结构说明
- 突出四层架构的职责和原则
- 保留核心的架构图和依赖关系说明
- 简化双模式架构和模块依赖的描述
- 移除过于详细的扩展指南,保留核心内容
---
docs/ARCHITECTURE.md | 1069 +++++++----------
docs/development/backend_development_guide.md | 823 ++++++++-----
2 files changed, 910 insertions(+), 982 deletions(-)
diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md
index 8469558..5a5cfa3 100644
--- a/docs/ARCHITECTURE.md
+++ b/docs/ARCHITECTURE.md
@@ -1,464 +1,315 @@
# 🏗️ Whale Town 项目架构设计
-> 基于业务功能模块化的现代化后端架构,支持双模式运行,开发测试零依赖,生产部署高性能。
+> 基于四层架构(Gateway-Business-Core-Data)的现代化后端设计,支持双模式运行,开发测试零依赖,生产部署高性能。
## 📋 目录
-- [🎯 架构概述](#-架构概述)
-- [📁 目录结构详解](#-目录结构详解)
-- [🏗️ 分层架构设计](#️-分层架构设计)
-- [🔄 双模式架构](#-双模式架构)
-- [📦 模块依赖关系](#-模块依赖关系)
-- [🚀 扩展指南](#-扩展指南)
+- [架构概述](#架构概述)
+- [四层架构设计](#四层架构设计)
+- [目录结构](#目录结构)
+- [双模式架构](#双模式架构)
+- [模块依赖关系](#模块依赖关系)
+- [数据流向](#数据流向)
+- [扩展指南](#扩展指南)
---
-## 🎯 架构概述
+## 架构概述
-Whale Town 采用**业务功能模块化架构**,将代码按业务功能而非技术组件组织,确保高内聚、低耦合的设计原则。
+Whale Town 采用**四层架构设计**(Gateway-Business-Core-Data),将协议处理、业务逻辑、技术基础设施和数据存储清晰分离。
-### 🌟 核心设计理念
+### 核心设计理念
-- **业务驱动** - 按业务功能组织代码,而非技术分层
+- **职责分离** - 每层职责明确,互不干扰
- **双模式支持** - 开发测试零依赖,生产部署高性能
-- **清晰分层** - 业务层 → 核心层 → 数据层,职责明确
-- **模块化设计** - 每个模块独立完整,可单独测试和部署
-- **配置驱动** - 通过环境变量控制运行模式和行为
+- **依赖单向** - 上层依赖下层,下层不依赖上层
+- **模块化设计** - 每个模块独立完整,可单独测试
+- **配置驱动** - 通过环境变量控制运行模式
-### 🛠️ 技术栈
+### 技术栈
-#### 后端技术栈
-- **框架**: NestJS 11.x (基于Express)
-- **语言**: TypeScript 5.x
-- **数据库**: MySQL + TypeORM (生产) / 内存数据库 (开发)
-- **缓存**: Redis + IORedis (生产) / 文件存储 (开发)
-- **认证**: JWT + bcrypt
-- **验证**: class-validator + class-transformer
-- **文档**: Swagger/OpenAPI
-- **测试**: Jest + Supertest
-- **日志**: Pino + nestjs-pino
-- **WebSocket**: Socket.IO
-- **邮件**: Nodemailer
-- **集成**: Zulip API
-
-#### 前端技术栈
-- **框架**: React 18.x
-- **构建工具**: Vite 7.x
-- **UI库**: Ant Design 5.x
-- **路由**: React Router DOM 6.x
-- **语言**: TypeScript 5.x
-
-### 📊 整体架构图
-
-```
-┌─────────────────────────────────────────────────────────────────┐
-│ 🌐 API接口层 │
-│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
-│ │ 🔗 REST API │ │ 🔌 WebSocket │ │ 📄 Swagger UI │ │
-│ │ (HTTP接口) │ │ (实时通信) │ │ (API文档) │ │
-│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
-└─────────────────────────────────────────────────────────────────┘
- ⬇️
-┌─────────────────────────────────────────────────────────────────┐
-│ 🎯 业务功能模块层 │
-│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
-│ │ 🔐 用户认证 │ │ 👥 用户管理 │ │ 🛡️ 管理员 │ │
-│ │ (auth) │ │ (user_mgmt) │ │ (admin) │ │
-│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
-│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
-│ │ 💬 Zulip集成 │ │ 🔗 共享组件 │ │ │ │
-│ │ (zulip) │ │ (shared) │ │ │ │
-│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
-└─────────────────────────────────────────────────────────────────┘
- ⬇️
-┌─────────────────────────────────────────────────────────────────┐
-│ ⚙️ 核心技术服务层 │
-│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
-│ │ 🔑 登录核心 │ │ 👑 管理员核心 │ │ 💬 Zulip核心 │ │
-│ │ (auth_core) │ │ (admin_core) │ │ (zulip) │ │
-│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
-│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
-│ │ 🛡️ 安全核心 │ │ 🛠️ 工具服务 │ │ 📧 邮件服务 │ │
-│ │ (security_core)│ │ (utils) │ │ (email) │ │
-│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
-└─────────────────────────────────────────────────────────────────┘
- ⬇️
-┌─────────────────────────────────────────────────────────────────┐
-│ 🗄️ 数据存储层 │
-│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
-│ │ 🗃️ 数据库 │ │ 🔴 Redis缓存 │ │ 📁 文件存储 │ │
-│ │ (MySQL/内存) │ │ (Redis/文件) │ │ (logs/data) │ │
-│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
-└─────────────────────────────────────────────────────────────────┘
-```
+**后端:** NestJS 11 + TypeScript 5 + MySQL + Redis + 原生WebSocket
+**前端:** React 18 + Vite 7 + Ant Design 5
+**测试:** Jest + Supertest(99个测试用例)
+**部署:** Docker + PM2 + Nginx
---
-## 📁 目录结构详解
+## 四层架构设计
-### 🎯 业务功能模块 (`src/business/`)
+### 架构层次图
-> **设计原则**: 按业务功能组织,每个模块包含完整的业务逻辑
+```
+┌─────────────────────────────────────────────────────────────┐
+│ 🌐 Gateway Layer (网关层) │
+│ HTTP/WebSocket协议处理、数据验证、路由管理、认证守卫 │
+└─────────────────────────────────────────────────────────────┘
+ ⬇️
+┌─────────────────────────────────────────────────────────────┐
+│ 🎯 Business Layer (业务层) │
+│ 业务逻辑实现、服务协调、业务规则验证、事务管理 │
+└─────────────────────────────────────────────────────────────┘
+ ⬇️
+┌─────────────────────────────────────────────────────────────┐
+│ ⚙️ Core Layer (核心层) │
+│ 技术基础设施、数据访问、外部系统集成、工具服务 │
+└─────────────────────────────────────────────────────────────┘
+ ⬇️
+┌─────────────────────────────────────────────────────────────┐
+│ 🗄️ Data Layer (数据层) │
+│ 数据持久化、缓存管理、文件存储 │
+└─────────────────────────────────────────────────────────────┘
+```
+
+### 各层职责
+
+#### 🌐 Gateway Layer(网关层)
+
+**位置:** `src/gateway/`
+
+**职责:**
+- HTTP/WebSocket协议处理
+- 请求参数验证(DTO)
+- 路由管理
+- 认证守卫(JWT验证)
+- 错误转换(业务错误 → HTTP状态码)
+- API文档(Swagger)
+
+**原则:**
+- ✅ 只做协议转换,不做业务逻辑
+- ✅ 使用DTO进行数据验证
+- ✅ 统一的错误处理
+- ❌ 不直接访问数据库
+- ❌ 不包含业务规则
+
+**示例模块:**
+- `gateway/auth/` - 认证网关(登录、注册接口)
+- `gateway/location_broadcast/` - 位置广播网关(WebSocket)
+
+#### 🎯 Business Layer(业务层)
+
+**位置:** `src/business/`
+
+**职责:**
+- 业务逻辑实现
+- 业务流程控制
+- 服务协调
+- 业务规则验证
+- 事务管理
+
+**原则:**
+- ✅ 实现所有业务逻辑
+- ✅ 协调多个Core层服务
+- ✅ 返回统一的业务响应
+- ❌ 不处理HTTP协议
+- ❌ 不直接访问数据库
+
+**示例模块:**
+- `business/auth/` - 用户认证业务
+- `business/user_mgmt/` - 用户管理业务
+- `business/admin/` - 管理员业务
+- `business/zulip/` - Zulip集成业务
+- `business/location_broadcast/` - 位置广播业务
+- `business/notice/` - 公告业务
+
+#### ⚙️ Core Layer(核心层)
+
+**位置:** `src/core/`
+
+**职责:**
+- 数据访问(数据库、缓存)
+- 基础设施(Redis、消息队列)
+- 外部系统集成(Zulip API)
+- 技术实现细节
+- 工具服务(邮件、验证码、日志)
+
+**原则:**
+- ✅ 提供技术基础设施
+- ✅ 数据持久化和缓存
+- ✅ 外部API集成
+- ❌ 不包含业务逻辑
+- ❌ 不处理HTTP协议
+
+**示例模块:**
+- `core/db/users/` - 用户数据服务
+- `core/redis/` - Redis缓存服务
+- `core/login_core/` - 登录核心服务
+- `core/admin_core/` - 管理员核心服务
+- `core/zulip_core/` - Zulip核心服务
+- `core/security_core/` - 安全核心服务
+- `core/utils/` - 工具服务(邮件、验证码、日志)
+
+#### �️ Data Layer(数据层)
+
+**位置:** 数据库、Redis、文件系统
+
+**职责:**
+- 数据持久化
+- 缓存管理
+- 文件存储
+
+**实现:**
+- MySQL / 内存数据库
+- Redis / 文件存储
+- 日志文件 / 数据文件
+
+---
+
+## 目录结构
+
+### 整体结构
+
+```
+whale-town-end/
+├── src/
+│ ├── gateway/ # 🌐 网关层
+│ │ ├── auth/ # 认证网关
+│ │ └── location_broadcast/ # 位置广播网关
+│ ├── business/ # 🎯 业务层
+│ │ ├── auth/ # 用户认证业务
+│ │ ├── user_mgmt/ # 用户管理业务
+│ │ ├── admin/ # 管理员业务
+│ │ ├── zulip/ # Zulip集成业务
+│ │ ├── location_broadcast/ # 位置广播业务
+│ │ └── notice/ # 公告业务
+│ ├── core/ # ⚙️ 核心层
+│ │ ├── db/users/ # 用户数据服务
+│ │ ├── redis/ # Redis缓存服务
+│ │ ├── login_core/ # 登录核心服务
+│ │ ├── admin_core/ # 管理员核心服务
+│ │ ├── zulip_core/ # Zulip核心服务
+│ │ ├── security_core/ # 安全核心服务
+│ │ └── utils/ # 工具服务
+│ ├── app.module.ts # 应用主模块
+│ └── main.ts # 应用入口
+├── client/ # 🎨 前端管理界面
+├── docs/ # 📚 项目文档
+├── test/ # 🧪 测试文件
+└── config/ # ⚙️ 配置文件
+```
+
+### 网关层结构
+
+```
+src/gateway/
+├── auth/ # 认证网关
+│ ├── login.controller.ts
+│ ├── register.controller.ts
+│ ├── jwt_auth.guard.ts
+│ ├── current_user.decorator.ts
+│ ├── dto/
+│ └── auth.gateway.module.ts
+└── location_broadcast/ # 位置广播网关
+ ├── location_broadcast.gateway.ts
+ └── location_broadcast.gateway.module.ts
+```
+
+### 业务层结构
```
src/business/
-├── 📂 auth/ # 🔐 用户认证模块
-│ ├── 📄 auth.module.ts # 模块定义
-│ ├── 📂 controllers/ # 控制器
-│ │ └── 📄 login.controller.ts # 登录接口控制器
-│ ├── 📂 services/ # 业务服务
-│ │ ├── 📄 login.service.ts # 登录业务逻辑
-│ │ └── 📄 login.service.spec.ts # 登录服务测试
-│ ├── 📂 dto/ # 数据传输对象
-│ │ ├── 📄 login.dto.ts # 登录请求DTO
-│ │ └── 📄 login_response.dto.ts # 登录响应DTO
-│ └── 📂 guards/ # 权限守卫(预留)
-│
-├── 📂 user-mgmt/ # 👥 用户管理模块
-│ ├── 📄 user-mgmt.module.ts # 模块定义
-│ ├── 📂 controllers/ # 控制器
-│ │ └── 📄 user-status.controller.ts # 用户状态管理接口
-│ ├── 📂 services/ # 业务服务
-│ │ └── 📄 user-management.service.ts # 用户管理逻辑
-│ ├── 📂 dto/ # 数据传输对象
-│ │ ├── 📄 user-status.dto.ts # 用户状态DTO
-│ │ └── 📄 user-status-response.dto.ts # 状态响应DTO
-│ ├── 📂 enums/ # 枚举定义
-│ │ └── 📄 user-status.enum.ts # 用户状态枚举
-│ └── 📂 tests/ # 测试文件(预留)
-│
-├── 📂 admin/ # 🛡️ 管理员模块
-│ ├── 📄 admin.controller.ts # 管理员接口
-│ ├── 📄 admin.service.ts # 管理员业务逻辑
-│ ├── 📄 admin.module.ts # 模块定义
-│ ├── 📄 admin.service.spec.ts # 管理员服务测试
-│ ├── 📂 dto/ # 数据传输对象
-│ └── 📂 guards/ # 权限守卫
-│
-├── 📂 zulip/ # 💬 Zulip集成模块
-│ ├── 📄 zulip.service.ts # Zulip业务服务
-│ ├── 📄 zulip_websocket.gateway.ts # WebSocket网关
-│ ├── 📄 zulip.module.ts # 模块定义
-│ ├── 📂 interfaces/ # 接口定义
-│ └── 📂 services/ # 子服务
-│ ├── 📄 message_filter.service.ts # 消息过滤
-│ └── 📄 session_cleanup.service.ts # 会话清理
-│
-└── 📂 shared/ # 🔗 共享业务组件
- ├── 📂 dto/ # 共享数据传输对象
- └── 📄 index.ts # 导出文件
+├── auth/ # 用户认证业务
+│ ├── login.service.ts
+│ ├── register.service.ts
+│ └── auth.module.ts
+├── user_mgmt/ # 用户管理业务
+│ ├── user_management.service.ts
+│ ├── dto/
+│ ├── enums/
+│ └── user_mgmt.module.ts
+├── admin/ # 管理员业务
+│ ├── admin.service.ts
+│ └── admin.module.ts
+├── zulip/ # Zulip集成业务
+│ ├── zulip.service.ts
+│ ├── services/
+│ └── zulip.module.ts
+├── location_broadcast/ # 位置广播业务
+│ ├── location_broadcast.service.ts
+│ └── location_broadcast.module.ts
+└── notice/ # 公告业务
+ ├── notice.service.ts
+ └── notice.module.ts
```
-### ⚙️ 核心技术服务 (`src/core/`)
-
-> **设计原则**: 提供技术基础设施,支持业务模块运行
+### 核心层结构
```
src/core/
-├── 📂 db/ # 🗄️ 数据库层
-│ └── 📂 users/ # 用户数据服务
-│ ├── 📄 users.service.ts # MySQL数据库实现
-│ ├── 📄 users_memory.service.ts # 内存数据库实现
-│ ├── 📄 users.dto.ts # 用户数据传输对象
-│ ├── 📄 users.entity.ts # 用户实体定义
-│ ├── 📄 users.module.ts # 用户数据模块
-│ └── 📄 users.service.spec.ts # 用户服务测试
-│
-├── 📂 redis/ # 🔴 Redis缓存层
-│ ├── 📄 redis.module.ts # Redis模块
-│ ├── 📄 real_redis.service.ts # Redis真实实现
-│ ├── 📄 file_redis.service.ts # 文件存储实现
-│ └── 📄 redis.interface.ts # Redis服务接口
-│
-├── 📂 login_core/ # 🔑 登录核心服务
-│ ├── 📄 login_core.service.ts # 登录核心逻辑
-│ ├── 📄 login_core.module.ts # 模块定义
-│ └── 📄 login_core.service.spec.ts # 登录核心测试
-│
-├── 📂 admin_core/ # 👑 管理员核心服务
-│ ├── 📄 admin_core.service.ts # 管理员核心逻辑
-│ ├── 📄 admin_core.module.ts # 模块定义
-│ └── 📄 admin_core.service.spec.ts # 管理员核心测试
-│
-├── 📂 zulip_core/ # 💬 Zulip核心服务
-│ ├── 📄 zulip_core.module.ts # Zulip核心模块
-│ ├── 📂 config/ # 配置文件
-│ ├── 📂 interfaces/ # 接口定义
-│ ├── 📂 services/ # 核心服务
-│ ├── 📂 types/ # 类型定义
-│ └── 📄 index.ts # 导出文件
-│
-├── 📂 security_core/ # 🛡️ 安全核心模块
-│ ├── 📄 security_core.module.ts # 安全模块定义
-│ ├── 📂 guards/ # 安全守卫
-│ │ └── 📄 throttle.guard.ts # 频率限制守卫
-│ ├── 📂 interceptors/ # 拦截器
-│ │ └── 📄 timeout.interceptor.ts # 超时拦截器
-│ ├── 📂 middleware/ # 中间件
-│ │ ├── 📄 maintenance.middleware.ts # 维护模式中间件
-│ │ └── 📄 content_type.middleware.ts # 内容类型中间件
-│ └── 📂 decorators/ # 装饰器
-│ ├── 📄 throttle.decorator.ts # 频率限制装饰器
-│ └── 📄 timeout.decorator.ts # 超时装饰器
-│
-└── 📂 utils/ # 🛠️ 工具服务
- ├── 📂 email/ # 📧 邮件服务
- │ ├── 📄 email.service.ts # 邮件发送服务
- │ ├── 📄 email.module.ts # 邮件模块
- │ └── 📄 email.service.spec.ts # 邮件服务测试
- ├── 📂 verification/ # 🔢 验证码服务
- │ ├── 📄 verification.service.ts # 验证码生成验证
- │ ├── 📄 verification.module.ts # 验证码模块
- │ └── 📄 verification.service.spec.ts # 验证码服务测试
- └── 📂 logger/ # 📝 日志服务
- ├── 📄 logger.service.ts # 日志记录服务
- ├── 📄 logger.module.ts # 日志模块
- ├── 📄 logger.config.ts # 日志配置
- └── 📄 log_management.service.ts # 日志管理服务
-```
-
-### 🎨 前端管理界面 (`client/`)
-
-> **设计原则**: 独立的前端项目,提供管理员后台功能,基于React + Vite + Ant Design
-
-```
-client/
-├── 📂 src/ # 前端源码
-│ ├── 📂 app/ # 应用组件
-│ │ ├── 📄 App.tsx # 应用主组件
-│ │ └── 📄 AdminLayout.tsx # 管理员布局组件
-│ ├── 📂 pages/ # 页面组件
-│ │ ├── 📄 LoginPage.tsx # 登录页面
-│ │ ├── 📄 UsersPage.tsx # 用户管理页面
-│ │ └── 📄 LogsPage.tsx # 日志管理页面
-│ ├── 📂 lib/ # 工具库
-│ │ ├── 📄 api.ts # API客户端
-│ │ └── 📄 adminAuth.ts # 管理员认证服务
-│ └── 📄 main.tsx # 应用入口
-├── 📂 dist/ # 构建产物
-├── 📄 package.json # 前端依赖
-├── 📄 vite.config.ts # Vite配置
-└── 📄 tsconfig.json # TypeScript配置
-```
-
-### 📚 文档中心 (`docs/`)
-
-> **设计原则**: 完整的项目文档,支持开发者快速上手
-
-```
-docs/
-├── 📄 README.md # 📖 文档导航中心
-├── 📄 ARCHITECTURE.md # 🏗️ 架构设计文档
-├── 📄 CONTRIBUTORS.md # 🤝 贡献者指南
-│
-├── 📂 api/ # 🔌 API接口文档
-│ ├── 📄 README.md # API文档使用指南
-│ └── 📄 api-documentation.md # 完整API接口文档
-│
-├── 📂 development/ # 💻 开发指南
-│ ├── 📄 backend_development_guide.md # 后端开发规范
-│ ├── 📄 git_commit_guide.md # Git提交规范
-│ ├── 📄 AI辅助开发规范指南.md # AI辅助开发指南
-│ └── 📄 TESTING.md # 测试指南
-│
-└── 📂 deployment/ # 🚀 部署文档
- └── 📄 DEPLOYMENT.md # 生产环境部署指南
-```
-
-### 🧪 测试文件 (`test/`)
-
-> **设计原则**: 完整的测试覆盖,确保代码质量
-
-```
-test/
-├── 📂 unit/ # 单元测试
-├── 📂 integration/ # 集成测试
-├── 📂 e2e/ # 端到端测试
-└── 📂 fixtures/ # 测试数据
-```
-
-### ⚙️ 配置文件
-
-> **设计原则**: 清晰的配置管理,支持多环境部署
-
-```
-项目根目录/
-├── 📄 .env # 🔧 环境变量配置
-├── 📄 .env.example # 🔧 环境变量示例
-├── 📄 .env.production.example # 🔧 生产环境示例
-├── 📄 package.json # 📋 后端项目依赖配置
-├── 📄 pnpm-workspace.yaml # 📦 pnpm工作空间配置
-├── 📄 tsconfig.json # 📘 TypeScript配置
-├── 📄 jest.config.js # 🧪 Jest测试配置
-├── 📄 nest-cli.json # 🏠 NestJS CLI配置
-└── 📄 ecosystem.config.js # 🚀 PM2进程管理配置
-
-client/
-├── 📄 package.json # 📋 前端项目依赖配置
-├── 📄 vite.config.ts # ⚡ Vite构建配置
-└── 📄 tsconfig.json # 📘 前端TypeScript配置
+├── db/users/ # 用户数据服务
+│ ├── users.service.ts # MySQL实现
+│ ├── users_memory.service.ts # 内存实现
+│ ├── users.entity.ts
+│ └── users.module.ts
+├── redis/ # Redis缓存服务
+│ ├── real_redis.service.ts
+│ ├── file_redis.service.ts
+│ └── redis.module.ts
+├── login_core/ # 登录核心服务
+│ ├── login_core.service.ts
+│ └── login_core.module.ts
+├── admin_core/ # 管理员核心服务
+│ ├── admin_core.service.ts
+│ └── admin_core.module.ts
+├── zulip_core/ # Zulip核心服务
+│ ├── services/
+│ ├── config/
+│ └── zulip_core.module.ts
+├── security_core/ # 安全核心服务
+│ ├── guards/
+│ ├── interceptors/
+│ ├── middleware/
+│ └── security_core.module.ts
+└── utils/ # 工具服务
+ ├── email/
+ ├── verification/
+ └── logger/
```
---
-## 🏗️ 分层架构设计
+## 双模式架构
-### 📊 架构分层说明
+### 模式对比
-```
-┌─────────────────────────────────────────────────────────────┐
-│ 🌐 表现层 (Presentation) │
-│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
-│ │ Controllers │ │ WebSocket │ │ Swagger UI │ │
-│ │ (HTTP接口) │ │ Gateways │ │ (API文档) │ │
-│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
-└─────────────────────────────────────────────────────────────┘
- ⬇️
-┌─────────────────────────────────────────────────────────────┐
-│ 🎯 业务层 (Business) │
-│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
-│ │ Auth Module │ │ UserMgmt │ │ Admin Module │ │
-│ │ (用户认证) │ │ Module │ │ (管理员) │ │
-│ │ │ │ (用户管理) │ │ │ │
-│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
-│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
-│ │ Security Module │ │ Zulip Module │ │ Shared Module │ │
-│ │ (安全防护) │ │ (Zulip集成) │ │ (共享组件) │ │
-│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
-└─────────────────────────────────────────────────────────────┘
- ⬇️
-┌─────────────────────────────────────────────────────────────┐
-│ ⚙️ 服务层 (Service) │
-│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
-│ │ Login Core │ │ Admin Core │ │ Zulip Core │ │
-│ │ (登录核心) │ │ (管理员核心) │ │ (Zulip核心) │ │
-│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
-│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
-│ │ Email Service │ │ Verification │ │ Logger Service │ │
-│ │ (邮件服务) │ │ Service │ │ (日志服务) │ │
-│ │ │ │ (验证码服务) │ │ │ │
-│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
-└─────────────────────────────────────────────────────────────┘
- ⬇️
-┌─────────────────────────────────────────────────────────────┐
-│ 🗄️ 数据层 (Data) │
-│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
-│ │ Users Service │ │ Redis Service │ │ File Storage │ │
-│ │ (用户数据) │ │ (缓存服务) │ │ (文件存储) │ │
-│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
-│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
-│ │ MySQL/Memory │ │ Redis/File │ │ Logs/Data │ │
-│ │ (数据库) │ │ (缓存实现) │ │ (日志数据) │ │
-│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
-└─────────────────────────────────────────────────────────────┘
-```
+| 功能 | 开发模式 | 生产模式 |
+|------|---------|---------|
+| 数据库 | 内存存储 | MySQL |
+| 缓存 | 文件存储 | Redis |
+| 邮件 | 控制台输出 | SMTP服务器 |
+| 日志 | 控制台+文件 | 结构化日志 |
-### 🔄 数据流向
+### 配置示例
-#### 用户登录流程示例
-
-```
-1. 📱 用户请求 → LoginController.login()
-2. 🔍 参数验证 → class-validator装饰器
-3. 🎯 业务逻辑 → LoginService.login()
-4. ⚙️ 核心服务 → LoginCoreService.validateUser()
-5. 📧 发送验证码 → VerificationService.generate()
-6. 💾 存储数据 → UsersService.findByEmail() + RedisService.set()
-7. 📝 记录日志 → LoggerService.log()
-8. ✅ 返回响应 → 用户收到登录结果
-```
-
-#### 管理员操作流程示例
-
-```
-1. 🛡️ 管理员请求 → AdminController.resetUserPassword()
-2. 🔐 权限验证 → AdminGuard.canActivate()
-3. 🎯 业务逻辑 → AdminService.resetPassword()
-4. ⚙️ 核心服务 → AdminCoreService.resetUserPassword()
-5. 🔑 密码加密 → bcrypt.hash()
-6. 💾 更新数据 → UsersService.update()
-7. 📧 通知用户 → EmailService.sendPasswordReset()
-8. 📝 审计日志 → LoggerService.audit()
-9. ✅ 返回响应 → 管理员收到操作结果
-```
-
----
-
-## 🔄 双模式架构
-
-### 🎯 设计目标
-
-- **开发测试**: 零依赖快速启动,无需安装MySQL、Redis等外部服务
-- **生产部署**: 高性能、高可用,支持集群和负载均衡
-
-### 📊 模式对比
-
-| 功能模块 | 🧪 开发测试模式 | 🚀 生产部署模式 |
-|----------|----------------|----------------|
-| **数据库** | 内存存储 (UsersMemoryService) | MySQL (UsersService + TypeORM) |
-| **缓存** | 文件存储 (FileRedisService) | Redis (RealRedisService + IORedis) |
-| **邮件** | 控制台输出 (测试模式) | SMTP服务器 (生产模式) |
-| **日志** | 控制台 + 文件 | 结构化日志 + 日志轮转 |
-| **配置** | `.env` 默认配置 | 环境变量 + 配置中心 |
-
-### ⚙️ 模式切换配置
-
-#### 开发测试模式 (.env)
+**开发模式:**
```bash
-# 数据存储模式
-USE_FILE_REDIS=true # 使用文件存储代替Redis
-NODE_ENV=development # 开发环境
-
-# 数据库配置(注释掉,使用内存数据库)
-# DB_HOST=localhost
-# DB_USERNAME=root
-# DB_PASSWORD=password
-
-# 邮件配置(注释掉,使用测试模式)
-# EMAIL_HOST=smtp.gmail.com
-# EMAIL_USER=your_email@gmail.com
-# EMAIL_PASS=your_password
+USE_FILE_REDIS=true
+NODE_ENV=development
+# 无需配置数据库和邮件
```
-#### 生产部署模式 (.env.production)
+**生产模式:**
```bash
-# 数据存储模式
-USE_FILE_REDIS=false # 使用真实Redis
-NODE_ENV=production # 生产环境
-
-# 数据库配置
+USE_FILE_REDIS=false
+NODE_ENV=production
DB_HOST=your_mysql_host
-DB_PORT=3306
-DB_USERNAME=your_username
-DB_PASSWORD=your_password
-DB_DATABASE=whale_town
-
-# Redis配置
REDIS_HOST=your_redis_host
-REDIS_PORT=6379
-REDIS_PASSWORD=your_redis_password
-
-# 邮件配置
-EMAIL_HOST=smtp.gmail.com
-EMAIL_PORT=587
-EMAIL_USER=your_email@gmail.com
-EMAIL_PASS=your_app_password
+EMAIL_HOST=smtp.163.com
```
-### 🔧 实现机制
+### 实现机制
+
+通过依赖注入和工厂模式实现自动切换:
-#### 依赖注入切换
```typescript
-// redis.module.ts
@Module({
providers: [
{
provide: 'IRedisService',
- useFactory: (configService: ConfigService) => {
- const useFileRedis = configService.get('USE_FILE_REDIS');
- return useFileRedis
- ? new FileRedisService()
- : new RealRedisService(configService);
+ useFactory: (config: ConfigService) => {
+ return config.get('USE_FILE_REDIS')
+ ? new FileRedisService()
+ : new RealRedisService(config);
},
inject: [ConfigService],
},
@@ -467,220 +318,117 @@ EMAIL_PASS=your_app_password
export class RedisModule {}
```
-#### 配置驱动服务选择
-```typescript
-// users.module.ts
-@Module({
- providers: [
- {
- provide: 'IUsersService',
- useFactory: (configService: ConfigService) => {
- const dbHost = configService.get('DB_HOST');
- return dbHost
- ? new UsersService()
- : new UsersMemoryService();
- },
- inject: [ConfigService],
- },
- ],
-})
-export class UsersModule {}
-```
-
---
-## 📦 模块依赖关系
+## 模块依赖关系
-### 🏗️ 模块依赖图
+### 依赖方向
```
-AppModule (应用主模块)
-├── 📊 ConfigModule (全局配置)
-├── 📝 LoggerModule (日志系统)
-├── 🔴 RedisModule (缓存服务)
-│ ├── RealRedisService (真实Redis)
-│ └── FileRedisService (文件存储)
-├── 🗄️ UsersModule (用户数据)
-│ ├── UsersService (MySQL数据库)
-│ └── UsersMemoryService (内存数据库)
-├── 📧 EmailModule (邮件服务)
-├── 🔢 VerificationModule (验证码服务)
-├── 🔑 LoginCoreModule (登录核心)
-├── 👑 AdminCoreModule (管理员核心)
-├── 💬 ZulipCoreModule (Zulip核心)
-├── 🔒 SecurityCoreModule (安全核心)
+Gateway Layer
+ ↓ 依赖
+Business Layer
+ ↓ 依赖
+Core Layer
+ ↓ 依赖
+Data Layer
+```
+
+### 模块依赖图
+
+```
+AppModule
+├── ConfigModule (全局配置)
+├── LoggerModule (日志系统)
+├── RedisModule (缓存服务)
+├── UsersModule (用户数据)
+├── EmailModule (邮件服务)
+├── VerificationModule (验证码服务)
+├── LoginCoreModule (登录核心)
+├── AdminCoreModule (管理员核心)
+├── ZulipCoreModule (Zulip核心)
+├── SecurityCoreModule (安全核心)
│
-├── 🎯 业务功能模块
-│ ├── 🔐 AuthModule (用户认证)
-│ │ └── 依赖: LoginCoreModule, EmailModule, VerificationModule, SecurityCoreModule
-│ ├── 👥 UserMgmtModule (用户管理)
-│ │ └── 依赖: UsersModule, LoggerModule, SecurityCoreModule
-│ ├── 🛡️ AdminModule (管理员)
-│ │ └── 依赖: AdminCoreModule, UsersModule, SecurityCoreModule
-│ ├── 💬 ZulipModule (Zulip集成)
-│ │ └── 依赖: ZulipCoreModule, RedisModule
-│ └── 🔗 SharedModule (共享组件)
-```
-
-### 🔄 模块交互流程
-
-#### 用户认证流程
-```
-AuthController → LoginService → LoginCoreService
- ↓
-EmailService ← VerificationService ← RedisService
- ↓
- UsersService
-```
-
-#### 管理员操作流程
-```
-AdminController → AdminService → AdminCoreService
- ↓
-LoggerService ← UsersService ← RedisService
-```
-
-#### 安全防护流程
-```
-SecurityGuard → RedisService (频率限制)
- → LoggerService (审计日志)
- → ConfigService (维护模式)
+├── Gateway Layer
+│ ├── AuthGatewayModule
+│ └── LocationBroadcastGatewayModule
+│
+└── Business Layer
+ ├── AuthModule
+ ├── UserMgmtModule
+ ├── AdminModule
+ ├── ZulipModule
+ ├── LocationBroadcastModule
+ └── NoticeModule
```
---
-## 🚀 扩展指南
+## 数据流向
-### 📝 添加新的业务模块
+### 用户登录流程
-#### 1. 创建业务模块结构
-```bash
-# 创建模块目录
-mkdir -p src/business/game/{dto,enums,guards,interfaces}
-
-# 生成NestJS模块文件
-nest g module business/game
-nest g controller business/game
-nest g service business/game
+```
+1. 用户请求 → LoginController (Gateway)
+2. 参数验证 → DTO Validation
+3. 业务逻辑 → LoginService (Business)
+4. 核心服务 → LoginCoreService (Core)
+5. 数据访问 → UsersService + RedisService (Core)
+6. 数据存储 → MySQL/Memory + Redis/File (Data)
+7. 返回响应 → 用户收到结果
```
-#### 2. 实现业务逻辑
-```typescript
-// src/business/game/game.module.ts
-@Module({
- imports: [
- GameCoreModule, # 依赖核心服务
- UsersModule, # 依赖用户数据
- RedisModule, # 依赖缓存服务
- ],
- controllers: [GameController],
- providers: [GameService],
- exports: [GameService],
-})
-export class GameModule {}
+### WebSocket消息流程
+
+```
+1. WebSocket连接 → LocationBroadcastGateway (Gateway)
+2. 消息验证 → JWT验证
+3. 业务处理 → LocationBroadcastService (Business)
+4. 房间管理 → 地图分组逻辑
+5. 消息广播 → 同地图用户
+6. Zulip同步 → ZulipService (Business)
```
-#### 3. 创建对应的核心服务
+### 管理员操作流程
+
+```
+1. 管理员请求 → AdminController (Gateway)
+2. 权限验证 → AdminGuard
+3. 业务逻辑 → AdminService (Business)
+4. 核心服务 → AdminCoreService (Core)
+5. 数据更新 → UsersService (Core)
+6. 审计日志 → LoggerService (Core)
+7. 返回响应 → 管理员收到结果
+```
+
+---
+
+## 扩展指南
+
+### 添加新的业务模块
+
+1. **创建目录结构**
```bash
-# 创建核心服务
+mkdir -p src/gateway/game
+mkdir -p src/business/game
mkdir -p src/core/game_core
-nest g module core/game_core
-nest g service core/game_core
```
-#### 4. 更新主模块
+2. **实现网关层**
```typescript
-// src/app.module.ts
-@Module({
- imports: [
- // ... 其他模块
- GameModule, # 添加新的业务模块
- ],
-})
-export class AppModule {}
-```
-
-### 🛠️ 添加新的工具服务
-
-#### 1. 创建工具服务
-```bash
-mkdir -p src/core/utils/notification
-nest g module core/utils/notification
-nest g service core/utils/notification
-```
-
-#### 2. 定义服务接口
-```typescript
-// src/core/utils/notification/notification.interface.ts
-export interface INotificationService {
- sendPush(userId: string, message: string): Promise;
- sendSMS(phone: string, message: string): Promise;
-}
-```
-
-#### 3. 实现服务
-```typescript
-// src/core/utils/notification/notification.service.ts
-@Injectable()
-export class NotificationService implements INotificationService {
- async sendPush(userId: string, message: string): Promise {
- // 实现推送通知逻辑
- }
-
- async sendSMS(phone: string, message: string): Promise {
- // 实现短信发送逻辑
- }
-}
-```
-
-#### 4. 配置依赖注入
-```typescript
-// src/core/utils/notification/notification.module.ts
-@Module({
- providers: [
- {
- provide: 'INotificationService',
- useClass: NotificationService,
- },
- ],
- exports: ['INotificationService'],
-})
-export class NotificationModule {}
-```
-
-### 🔌 添加新的API接口
-
-#### 1. 定义DTO
-```typescript
-// src/business/game/dto/create-game.dto.ts
-export class CreateGameDto {
- @IsString()
- @IsNotEmpty()
- name: string;
-
- @IsString()
- @IsOptional()
- description?: string;
-}
-```
-
-#### 2. 实现Controller
-```typescript
-// src/business/game/game.controller.ts
+// src/gateway/game/game.controller.ts
@Controller('game')
-@ApiTags('游戏管理')
export class GameController {
constructor(private readonly gameService: GameService) {}
-
+
@Post()
- @ApiOperation({ summary: '创建游戏' })
- async createGame(@Body() createGameDto: CreateGameDto) {
- return this.gameService.create(createGameDto);
+ async createGame(@Body() dto: CreateGameDto) {
+ return this.gameService.create(dto);
}
}
```
-#### 3. 实现Service
+3. **实现业务层**
```typescript
// src/business/game/game.service.ts
@Injectable()
@@ -689,85 +437,82 @@ export class GameService {
@Inject('IGameCoreService')
private readonly gameCoreService: IGameCoreService,
) {}
-
- async create(createGameDto: CreateGameDto) {
- return this.gameCoreService.createGame(createGameDto);
+
+ async create(dto: CreateGameDto) {
+ // 业务逻辑
+ return this.gameCoreService.createGame(dto);
}
}
```
-#### 4. 添加测试用例
+4. **实现核心层**
```typescript
-// src/business/game/game.service.spec.ts
-describe('GameService', () => {
- let service: GameService;
- let gameCoreService: jest.Mocked;
-
- beforeEach(async () => {
- const module: TestingModule = await Test.createTestingModule({
- providers: [
- GameService,
- {
- provide: 'IGameCoreService',
- useValue: {
- createGame: jest.fn(),
- },
- },
- ],
- }).compile();
-
- service = module.get(GameService);
- gameCoreService = module.get('IGameCoreService');
- });
-
- it('should create game', async () => {
- const createGameDto = { name: 'Test Game' };
- const expectedResult = { id: 1, ...createGameDto };
-
- gameCoreService.createGame.mockResolvedValue(expectedResult);
-
- const result = await service.create(createGameDto);
-
- expect(result).toEqual(expectedResult);
- expect(gameCoreService.createGame).toHaveBeenCalledWith(createGameDto);
- });
-});
+// src/core/game_core/game_core.service.ts
+@Injectable()
+export class GameCoreService {
+ async createGame(dto: CreateGameDto) {
+ // 数据访问逻辑
+ }
+}
```
-### 📊 性能优化建议
+5. **注册模块**
+```typescript
+// src/app.module.ts
+@Module({
+ imports: [
+ // ...
+ GameGatewayModule,
+ GameModule,
+ GameCoreModule,
+ ],
+})
+export class AppModule {}
+```
-#### 1. 缓存策略
-- **Redis缓存**: 用户会话、验证码、频繁查询数据
-- **内存缓存**: 配置信息、静态数据
-- **CDN缓存**: 静态资源文件
+### 性能优化建议
-#### 2. 数据库优化
-- **连接池**: 复用数据库连接,减少连接开销
-- **索引优化**: 为查询字段建立合适的索引
-- **查询优化**: 避免N+1查询,使用JOIN优化关联查询
+1. **缓存策略**
+ - 用户会话 → Redis
+ - 验证码 → Redis(短期)
+ - 配置信息 → 内存缓存
-#### 3. 日志优化
-- **异步日志**: 使用Pino的异步写入功能
-- **日志分级**: 生产环境只记录ERROR和WARN级别
-- **日志轮转**: 自动清理过期日志文件
+2. **数据库优化**
+ - 添加索引
+ - 使用连接池
+ - 避免N+1查询
-### 🔒 安全加固建议
+3. **日志优化**
+ - 异步写入
+ - 日志分级
+ - 日志轮转
-#### 1. 数据验证
-- **输入验证**: 使用class-validator进行严格验证
-- **类型检查**: TypeScript静态类型检查
-- **SQL注入防护**: TypeORM参数化查询
+### 安全加固建议
-#### 2. 认证授权
-- **密码安全**: bcrypt加密,强密码策略
-- **会话管理**: JWT + Redis会话存储
-- **权限控制**: 基于角色的访问控制(RBAC)
+1. **数据验证**
+ - 使用class-validator
+ - TypeScript类型检查
+ - SQL注入防护
-#### 3. 通信安全
-- **HTTPS**: 生产环境强制HTTPS
-- **CORS**: 严格的跨域请求控制
-- **Rate Limiting**: API请求频率限制
+2. **认证授权**
+ - JWT认证
+ - 角色权限控制
+ - 会话管理
+
+3. **通信安全**
+ - HTTPS强制
+ - CORS配置
+ - 频率限制
---
-**🏗️ 通过清晰的架构设计,Whale Town 实现了高内聚、低耦合的模块化架构,支持快速开发和灵活部署!**
\ No newline at end of file
+## 参考文档
+
+- [架构重构文档](./ARCHITECTURE_REFACTORING.md) - 四层架构迁移指南
+- [网关层README](../src/gateway/auth/README.md) - 网关层详细说明
+- [开发规范](./development/backend_development_guide.md) - 代码规范
+- [部署指南](./deployment/DEPLOYMENT.md) - 生产环境部署
+
+---
+
+**🏗️ 通过清晰的四层架构设计,Whale Town 实现了职责分离、高内聚、低耦合的现代化架构!**
diff --git a/docs/development/backend_development_guide.md b/docs/development/backend_development_guide.md
index 2bf08ee..035407e 100644
--- a/docs/development/backend_development_guide.md
+++ b/docs/development/backend_development_guide.md
@@ -1,45 +1,220 @@
# 后端开发规范指南
-本文档定义了后端开发的核心规范,包括注释规范、日志规范、业务逻辑规范等,确保代码质量和团队协作效率。
+本文档定义了基于四层架构的后端开发规范,包括架构规范、注释规范、日志规范、代码质量规范等。
## 📋 目录
+- [架构规范](#架构规范)
- [注释规范](#注释规范)
- [日志规范](#日志规范)
-- [业务逻辑规范](#业务逻辑规范)
- [异常处理规范](#异常处理规范)
- [代码质量规范](#代码质量规范)
- [最佳实践](#最佳实践)
---
-## 📝 注释规范
+## 🏗️ 架构规范
+
+### 四层架构原则
+
+项目采用 **Gateway-Business-Core-Data** 四层架构,每层职责明确:
+
+```
+Gateway Layer (网关层)
+ ↓ 依赖
+Business Layer (业务层)
+ ↓ 依赖
+Core Layer (核心层)
+ ↓ 依赖
+Data Layer (数据层)
+```
+
+### 各层职责
+
+#### 🌐 Gateway Layer(网关层)
+
+**位置:** `src/gateway/`
+
+**职责:**
+- HTTP/WebSocket协议处理
+- 请求参数验证(DTO)
+- 路由管理
+- 认证守卫
+- 错误转换
+
+**规范:**
+```typescript
+// ✅ 正确:只做协议转换
+@Controller('auth')
+export class LoginController {
+ constructor(private readonly loginService: LoginService) {}
+
+ @Post('login')
+ async login(@Body() dto: LoginDto, @Res() res: Response) {
+ const result = await this.loginService.login(dto);
+ this.handleResponse(result, res);
+ }
+}
+
+// ❌ 错误:包含业务逻辑
+@Controller('auth')
+export class LoginController {
+ @Post('login')
+ async login(@Body() dto: LoginDto) {
+ const user = await this.usersService.findByEmail(dto.email);
+ const isValid = await bcrypt.compare(dto.password, user.password);
+ // ... 更多业务逻辑
+ }
+}
+```
+
+#### 🎯 Business Layer(业务层)
+
+**位置:** `src/business/`
+
+**职责:**
+- 业务逻辑实现
+- 服务协调
+- 业务规则验证
+- 事务管理
+
+**规范:**
+```typescript
+// ✅ 正确:实现业务逻辑
+@Injectable()
+export class LoginService {
+ constructor(
+ private readonly loginCoreService: LoginCoreService,
+ private readonly emailService: EmailService,
+ ) {}
+
+ async login(dto: LoginDto): Promise> {
+ try {
+ // 1. 调用核心服务验证
+ const user = await this.loginCoreService.validateUser(dto);
+
+ // 2. 业务逻辑:生成Token
+ const tokens = await this.loginCoreService.generateTokens(user);
+
+ // 3. 业务逻辑:发送登录通知
+ await this.emailService.sendLoginNotification(user.email);
+
+ return { success: true, data: tokens };
+ } catch (error) {
+ return { success: false, message: error.message };
+ }
+ }
+}
+
+// ❌ 错误:直接访问数据库
+@Injectable()
+export class LoginService {
+ async login(dto: LoginDto) {
+ const user = await this.userRepository.findOne({ email: dto.email });
+ // ...
+ }
+}
+```
+
+#### ⚙️ Core Layer(核心层)
+
+**位置:** `src/core/`
+
+**职责:**
+- 数据访问
+- 基础设施
+- 外部系统集成
+- 工具服务
+
+**规范:**
+```typescript
+// ✅ 正确:提供技术基础设施
+@Injectable()
+export class LoginCoreService {
+ constructor(
+ @Inject('IUsersService')
+ private readonly usersService: IUsersService,
+ @Inject('IRedisService')
+ private readonly redisService: IRedisService,
+ ) {}
+
+ async validateUser(dto: LoginDto): Promise {
+ const user = await this.usersService.findByEmail(dto.email);
+ if (!user) {
+ throw new UnauthorizedException('用户不存在');
+ }
+
+ const isValid = await bcrypt.compare(dto.password, user.password);
+ if (!isValid) {
+ throw new UnauthorizedException('密码错误');
+ }
+
+ return user;
+ }
+}
+
+// ❌ 错误:包含业务逻辑
+@Injectable()
+export class LoginCoreService {
+ async validateUser(dto: LoginDto) {
+ // 发送邮件通知 - 这是业务逻辑,应该在Business层
+ await this.emailService.sendLoginNotification(user.email);
+ }
+}
+```
+
+### 模块组织规范
+
+```typescript
+// 模块命名:功能名.module.ts
+// 服务命名:功能名.service.ts
+// 控制器命名:功能名.controller.ts
+// 网关命名:功能名.gateway.ts
+
+// ✅ 正确的模块结构
+src/
+├── gateway/
+│ └── auth/
+│ ├── login.controller.ts
+│ ├── register.controller.ts
+│ ├── jwt_auth.guard.ts
+│ ├── dto/
+│ └── auth.gateway.module.ts
+├── business/
+│ └── auth/
+│ ├── login.service.ts
+│ ├── register.service.ts
+│ └── auth.module.ts
+└── core/
+ └── login_core/
+ ├── login_core.service.ts
+ └── login_core.module.ts
+```
+
+---
+
+## � 注释规规范
### 文件头注释
-每个 TypeScript 文件都必须包含完整的文件头注释:
-
```typescript
/**
- * 文件功能描述
+ * 用户登录服务
*
* 功能描述:
- * - 主要功能点1
- * - 主要功能点2
- * - 主要功能点3
+ * - 处理用户登录业务逻辑
+ * - 协调登录核心服务和邮件服务
+ * - 生成JWT令牌
*
- * 职责分离:
- * - 职责描述1
- * - 职责描述2
+ * 架构层级:Business Layer
*
- * 最近修改:
- * - YYYY-MM-DD: 修改类型 - 具体修改内容描述
- * - YYYY-MM-DD: 修改类型 - 具体修改内容描述
+ * 依赖服务:
+ * - LoginCoreService: 登录核心逻辑
+ * - EmailService: 邮件发送服务
*
* @author 作者名
- * @version x.x.x
- * @since 创建日期
- * @lastModified 最后修改日期
+ * @version 1.0.0
+ * @since 2025-01-01
*/
```
@@ -47,149 +222,75 @@
```typescript
/**
- * 类功能描述
+ * 登录业务服务
*
* 职责:
- * - 主要职责1
- * - 主要职责2
+ * - 实现用户登录业务逻辑
+ * - 协调核心服务完成登录流程
+ * - 处理登录相关的业务规则
*
* 主要方法:
- * - method1() - 方法1功能
- * - method2() - 方法2功能
- *
- * 使用场景:
- * - 场景描述
+ * - login() - 用户登录
+ * - verificationCodeLogin() - 验证码登录
+ * - refreshToken() - 刷新令牌
*/
@Injectable()
-export class ExampleService {
- // 类实现
+export class LoginService {
+ // 实现
}
```
-### 方法注释(三级注释标准)
+### 方法注释(三级标准)
-**必须包含以下三个级别的注释:**
-
-#### 1. 功能描述级别
```typescript
/**
- * 用户登录验证
- */
-```
-
-#### 2. 业务逻辑级别
-```typescript
-/**
- * 用户登录验证
+ * 用户登录
*
* 业务逻辑:
- * 1. 验证用户名或邮箱格式
- * 2. 查找用户记录
- * 3. 验证密码哈希值
- * 4. 检查用户状态是否允许登录
- * 5. 记录登录日志
- * 6. 返回认证结果
- */
-```
-
-#### 3. 技术实现级别
-```typescript
-/**
- * 用户登录验证
+ * 1. 调用核心服务验证用户凭证
+ * 2. 生成访问令牌和刷新令牌
+ * 3. 发送登录成功通知邮件
+ * 4. 记录登录日志
+ * 5. 返回登录结果
*
- * 业务逻辑:
- * 1. 验证用户名或邮箱格式
- * 2. 查找用户记录
- * 3. 验证密码哈希值
- * 4. 检查用户状态是否允许登录
- * 5. 记录登录日志
- * 6. 返回认证结果
- *
- * @param loginRequest 登录请求数据
- * @returns 认证结果,包含用户信息和认证状态
- * @throws UnauthorizedException 用户名或密码错误时
- * @throws ForbiddenException 用户状态不允许登录时
+ * @param dto 登录请求数据
+ * @returns 登录结果,包含用户信息和令牌
+ * @throws UnauthorizedException 用户名或密码错误
+ * @throws ForbiddenException 用户状态不允许登录
*
* @example
* ```typescript
- * const result = await loginService.validateUser({
+ * const result = await loginService.login({
* identifier: 'user@example.com',
* password: 'password123'
* });
* ```
*/
-async validateUser(loginRequest: LoginRequest): Promise {
- // 实现代码
+async login(dto: LoginDto): Promise> {
+ // 实现
}
```
### 修改记录规范
-#### 修改类型定义
-
-- **代码规范优化** - 命名规范、注释规范、代码清理等
-- **功能新增** - 添加新的功能或方法
-- **功能修改** - 修改现有功能的实现
-- **Bug修复** - 修复代码缺陷
-- **性能优化** - 提升代码性能
-- **重构** - 代码结构调整但功能不变
-
-#### 修改记录格式
-
```typescript
/**
* 最近修改:
- * - 2025-01-07: 代码规范优化 - 清理未使用的导入(EmailSendResult, crypto)
- * - 2025-01-07: 代码规范优化 - 修复常量命名(saltRounds -> SALT_ROUNDS)
- * - 2025-01-07: 功能新增 - 添加用户验证码登录功能
- * - 2025-01-06: Bug修复 - 修复邮箱验证逻辑错误
+ * - 2025-01-15: 架构重构 - 迁移到四层架构,分离网关层和业务层
+ * - 2025-01-10: 功能新增 - 添加验证码登录功能
+ * - 2025-01-08: Bug修复 - 修复Token刷新逻辑错误
+ * - 2025-01-05: 代码规范优化 - 统一异常处理格式
+ * - 2025-01-03: 性能优化 - 优化数据库查询性能
*
- * @version 1.0.1 (修改后需要递增版本号)
- * @lastModified 2025-01-07
+ * @version 2.0.0
+ * @lastModified 2025-01-15
*/
```
-#### 修改记录长度限制
-
-**重要:为保持文件头注释简洁,修改记录只保留最近的5次修改。**
-
-- ✅ **保留最新5条记录** - 便于快速了解最近变更
-- ✅ **超出时删除最旧记录** - 保持注释简洁
-- ✅ **重要修改可标注** - 重大版本更新可特别标注
-
-```typescript
-// ✅ 正确示例:保持最新5条记录
-/**
- * 最近修改:
- * - 2025-01-07: 功能新增 - 添加用户头像上传功能
- * - 2025-01-06: Bug修复 - 修复邮箱验证逻辑错误
- * - 2025-01-05: 代码规范优化 - 统一异常处理格式
- * - 2025-01-04: 功能修改 - 优化用户状态管理逻辑
- * - 2025-01-03: 性能优化 - 优化数据库查询性能
- *
- * @version 1.3.0
- */
-
-// ❌ 错误示例:记录过多,注释冗长
-/**
- * 最近修改:
- * - 2025-01-07: 功能新增 - 添加用户头像上传功能
- * - 2025-01-06: Bug修复 - 修复邮箱验证逻辑错误
- * - 2025-01-05: 代码规范优化 - 统一异常处理格式
- * - 2025-01-04: 功能修改 - 优化用户状态管理逻辑
- * - 2025-01-03: 性能优化 - 优化数据库查询性能
- * - 2025-01-02: 重构 - 重构用户认证逻辑
- * - 2025-01-01: 功能新增 - 添加用户权限管理
- * - 2024-12-31: Bug修复 - 修复登录超时问题
- * // ... 更多记录导致注释过长
- */
-```
-
-#### 版本号递增规则
-
-- **代码规范优化、Bug修复** → 修订版本 +1 (1.0.0 → 1.0.1)
-- **功能新增、功能修改** → 次版本 +1 (1.0.1 → 1.1.0)
-- **重构、架构变更** → 主版本 +1 (1.1.0 → 2.0.0)
+**修改记录原则:**
+- 只保留最近5次修改
+- 包含日期、类型、描述
+- 重大版本更新标注版本号
---
@@ -199,22 +300,37 @@ async validateUser(loginRequest: LoginRequest): Promise {
```typescript
// ERROR - 系统错误,需要立即处理
-this.logger.error('用户登录失败', { userId, error: error.message });
+this.logger.error('用户登录失败', {
+ userId,
+ error: error.message,
+ stack: error.stack
+});
-// WARN - 警告信息,需要关注但不影响系统运行
-this.logger.warn('用户多次登录失败', { userId, attemptCount });
+// WARN - 警告信息,需要关注
+this.logger.warn('用户多次登录失败', {
+ userId,
+ attemptCount,
+ ip: request.ip
+});
-// INFO - 重要的业务操作记录
-this.logger.info('用户登录成功', { userId, loginTime: new Date() });
+// INFO - 重要的业务操作
+this.logger.info('用户登录成功', {
+ userId,
+ loginTime: new Date(),
+ ip: request.ip
+});
-// DEBUG - 调试信息,仅在开发环境使用
-this.logger.debug('验证用户密码', { userId, hashedPassword: '***' });
+// DEBUG - 调试信息(仅开发环境)
+this.logger.debug('验证用户密码', {
+ userId,
+ passwordHash: '***'
+});
```
### 日志格式规范
```typescript
-// ✅ 正确格式
+// ✅ 正确:结构化日志
this.logger.info('操作描述', {
userId: 'user123',
action: 'login',
@@ -222,68 +338,26 @@ this.logger.info('操作描述', {
metadata: { ip: '192.168.1.1' }
});
-// ❌ 错误格式
-this.logger.info('用户登录');
+// ❌ 错误:字符串拼接
this.logger.info(`用户${userId}登录成功`);
```
----
-
-## 🏗️ 业务逻辑规范
-
-### 防御性编程
+### 敏感信息处理
```typescript
-async getUserById(userId: string): Promise {
- // 1. 参数验证
- if (!userId) {
- throw new BadRequestException('用户ID不能为空');
- }
+// ✅ 正确:隐藏敏感信息
+this.logger.info('用户注册', {
+ email: user.email,
+ password: '***', // 密码不记录
+ apiKey: '***' // API密钥不记录
+});
- // 2. 业务逻辑验证
- const user = await this.usersService.findOne(userId);
- if (!user) {
- throw new NotFoundException('用户不存在');
- }
-
- // 3. 状态检查
- if (user.status === UserStatus.DELETED) {
- throw new ForbiddenException('用户已被删除');
- }
-
- // 4. 返回结果
- return user;
-}
-```
-
-### 业务逻辑分层
-
-```typescript
-// Controller 层 - 只处理HTTP请求和响应
-@Controller('users')
-export class UsersController {
- @Get(':id')
- async getUser(@Param('id') id: string) {
- return this.usersService.getUserById(id);
- }
-}
-
-// Service 层 - 处理业务逻辑
-@Injectable()
-export class UsersService {
- async getUserById(id: string): Promise {
- // 业务逻辑实现
- return this.usersCoreService.findUserById(id);
- }
-}
-
-// Core 层 - 核心业务实现
-@Injectable()
-export class UsersCoreService {
- async findUserById(id: string): Promise {
- // 核心逻辑实现
- }
-}
+// ❌ 错误:暴露敏感信息
+this.logger.info('用户注册', {
+ email: user.email,
+ password: user.password, // 危险!
+ apiKey: user.apiKey // 危险!
+});
```
---
@@ -312,38 +386,66 @@ throw new ConflictException('用户名已存在');
throw new InternalServerErrorException('系统内部错误');
```
-### 异常处理模式
+### 分层异常处理
```typescript
-async createUser(userData: CreateUserDto): Promise {
- try {
- // 1. 参数验证
- this.validateUserData(userData);
+// Gateway Layer - 转换为HTTP响应
+@Controller('auth')
+export class LoginController {
+ @Post('login')
+ async login(@Body() dto: LoginDto, @Res() res: Response) {
+ const result = await this.loginService.login(dto);
- // 2. 业务逻辑检查
- await this.checkUserExists(userData.email);
+ if (result.success) {
+ res.status(HttpStatus.OK).json(result);
+ } else {
+ const statusCode = this.getErrorStatusCode(result);
+ res.status(statusCode).json(result);
+ }
+ }
+}
+
+// Business Layer - 返回业务响应
+@Injectable()
+export class LoginService {
+ async login(dto: LoginDto): Promise> {
+ try {
+ const user = await this.loginCoreService.validateUser(dto);
+ const tokens = await this.loginCoreService.generateTokens(user);
+
+ return {
+ success: true,
+ data: tokens,
+ message: '登录成功'
+ };
+ } catch (error) {
+ this.logger.error('登录失败', { dto, error: error.message });
+
+ return {
+ success: false,
+ message: error.message,
+ error_code: 'LOGIN_FAILED'
+ };
+ }
+ }
+}
+
+// Core Layer - 抛出技术异常
+@Injectable()
+export class LoginCoreService {
+ async validateUser(dto: LoginDto): Promise {
+ const user = await this.usersService.findByEmail(dto.email);
- // 3. 执行创建操作
- const user = await this.usersRepository.create(userData);
-
- // 4. 记录成功日志
- this.logger.info('用户创建成功', { userId: user.id });
-
- return user;
- } catch (error) {
- // 5. 记录错误日志
- this.logger.error('用户创建失败', {
- userData: { ...userData, password: '***' },
- error: error.message
- });
-
- // 6. 重新抛出业务异常
- if (error instanceof BadRequestException) {
- throw error;
+ if (!user) {
+ throw new UnauthorizedException('用户不存在');
}
- // 7. 转换为系统异常
- throw new InternalServerErrorException('用户创建失败');
+ const isValid = await bcrypt.compare(dto.password, user.password);
+ if (!isValid) {
+ throw new UnauthorizedException('密码错误');
+ }
+
+ return user;
}
}
```
@@ -354,152 +456,233 @@ async createUser(userData: CreateUserDto): Promise {
### 代码检查清单
-在提交代码前,请确保:
+提交代码前确保:
+
+- [ ] **架构规范**
+ - [ ] 代码放在正确的架构层
+ - [ ] 没有跨层直接调用(如Gateway直接调用Core)
+ - [ ] 依赖方向正确(上层依赖下层)
+ - [ ] 模块职责单一明确
- [ ] **注释完整性**
- - [ ] 文件头注释包含功能描述、修改记录、作者信息
- - [ ] 类注释包含职责、主要方法、使用场景
- - [ ] 方法注释包含三级注释(功能、业务逻辑、技术实现)
- - [ ] 修改现有文件时添加了修改记录和更新版本号
- - [ ] 修改记录只保留最近5次,保持注释简洁
-
-- [ ] **业务逻辑完整性**
- - [ ] 所有参数都进行了验证
- - [ ] 所有异常情况都进行了处理
- - [ ] 关键操作都记录了日志
- - [ ] 业务逻辑考虑了所有边界情况
+ - [ ] 文件头注释包含架构层级说明
+ - [ ] 类注释说明职责和主要方法
+ - [ ] 方法注释包含业务逻辑和技术实现
+ - [ ] 修改记录保持最近5次
- [ ] **代码质量**
- [ ] 没有未使用的导入和变量
- - [ ] 常量使用了正确的命名规范
- - [ ] 方法长度合理(建议不超过50行)
- - [ ] 单一职责原则,每个方法只做一件事
+ - [ ] 常量使用正确命名(UPPER_SNAKE_CASE)
+ - [ ] 方法长度合理(不超过50行)
+ - [ ] 单一职责原则
-- [ ] **安全性**
- - [ ] 敏感信息不在日志中暴露
- - [ ] 用户输入都进行了验证和清理
- - [ ] 权限检查在适当的位置进行
+- [ ] **日志规范**
+ - [ ] 关键操作记录日志
+ - [ ] 使用结构化日志格式
+ - [ ] 敏感信息已隐藏
+ - [ ] 日志级别使用正确
+
+- [ ] **异常处理**
+ - [ ] 所有异常情况都处理
+ - [ ] 异常类型使用正确
+ - [ ] 错误信息清晰明确
+ - [ ] 记录了错误日志
---
## 💡 最佳实践
-### 1. 注释驱动开发
+### 1. 遵循四层架构
```typescript
-/**
- * 用户注册功能
- *
- * 业务逻辑:
- * 1. 验证邮箱格式和唯一性
- * 2. 验证密码强度
- * 3. 生成邮箱验证码
- * 4. 创建用户记录
- * 5. 发送验证邮件
- * 6. 返回注册结果
- *
- * @param registerData 注册数据
- * @returns 注册结果
- */
-async registerUser(registerData: RegisterDto): Promise {
- // 先写注释,再写实现
- // 这样确保逻辑清晰,不遗漏步骤
+// ✅ 正确:清晰的层次调用
+// Gateway → Business → Core → Data
+
+// Gateway Layer
+@Controller('users')
+export class UsersController {
+ constructor(private readonly usersService: UsersService) {}
+
+ @Get(':id')
+ async getUser(@Param('id') id: string) {
+ return this.usersService.getUserById(id);
+ }
+}
+
+// Business Layer
+@Injectable()
+export class UsersService {
+ constructor(private readonly usersCoreService: UsersCoreService) {}
+
+ async getUserById(id: string): Promise> {
+ try {
+ const user = await this.usersCoreService.findUserById(id);
+ return { success: true, data: user };
+ } catch (error) {
+ return { success: false, message: error.message };
+ }
+ }
+}
+
+// Core Layer
+@Injectable()
+export class UsersCoreService {
+ constructor(
+ @Inject('IUsersService')
+ private readonly usersDataService: IUsersService
+ ) {}
+
+ async findUserById(id: string): Promise {
+ const user = await this.usersDataService.findOne(id);
+ if (!user) {
+ throw new NotFoundException('用户不存在');
+ }
+ return user;
+ }
}
```
-### 2. 错误优先处理
+### 2. 使用依赖注入接口
```typescript
-async processPayment(paymentData: PaymentDto): Promise {
- // 1. 先处理所有可能的错误情况
- if (!paymentData.amount || paymentData.amount <= 0) {
- throw new BadRequestException('支付金额必须大于0');
- }
-
- if (!paymentData.userId) {
- throw new BadRequestException('用户ID不能为空');
- }
-
- const user = await this.usersService.findOne(paymentData.userId);
- if (!user) {
- throw new NotFoundException('用户不存在');
- }
-
- // 2. 再处理正常的业务逻辑
- return this.executePayment(paymentData);
+// ✅ 正确:使用接口依赖注入
+@Injectable()
+export class LoginCoreService {
+ constructor(
+ @Inject('IUsersService')
+ private readonly usersService: IUsersService,
+ @Inject('IRedisService')
+ private readonly redisService: IRedisService,
+ ) {}
+}
+
+// ❌ 错误:直接依赖具体实现
+@Injectable()
+export class LoginCoreService {
+ constructor(
+ private readonly usersService: UsersService,
+ private readonly redisService: RealRedisService,
+ ) {}
}
```
-### 3. 日志驱动调试
+### 3. 统一响应格式
```typescript
-async complexBusinessLogic(data: ComplexData): Promise {
- this.logger.debug('开始执行复杂业务逻辑', { data });
-
+// 定义统一的响应接口
+export interface ApiResponse {
+ success: boolean;
+ data?: T;
+ message: string;
+ error_code?: string;
+}
+
+// Business Layer 返回统一格式
+async login(dto: LoginDto): Promise> {
try {
- // 步骤1
- const step1Result = await this.step1(data);
- this.logger.debug('步骤1完成', { step1Result });
-
- // 步骤2
- const step2Result = await this.step2(step1Result);
- this.logger.debug('步骤2完成', { step2Result });
-
- // 步骤3
- const finalResult = await this.step3(step2Result);
- this.logger.info('复杂业务逻辑执行成功', { finalResult });
-
- return finalResult;
+ const result = await this.loginCoreService.validateUser(dto);
+ return {
+ success: true,
+ data: result,
+ message: '登录成功'
+ };
} catch (error) {
- this.logger.error('复杂业务逻辑执行失败', { data, error: error.message });
- throw error;
+ return {
+ success: false,
+ message: error.message,
+ error_code: 'LOGIN_FAILED'
+ };
}
}
```
-### 4. 版本管理最佳实践
+### 4. 防御性编程
```typescript
-/**
- * 用户服务
- *
- * 最近修改:
- * - 2025-01-07: 功能新增 - 添加用户头像上传功能 (v1.2.0)
- * - 2025-01-06: Bug修复 - 修复邮箱验证逻辑错误 (v1.1.1)
- * - 2025-01-05: 代码规范优化 - 统一异常处理格式 (v1.1.0)
- * - 2025-01-04: 功能新增 - 添加用户状态管理 (v1.1.0)
- * - 2025-01-03: 重构 - 重构用户认证逻辑 (v2.0.0)
- *
- * @version 1.2.0
- * @lastModified 2025-01-07
- */
+async processPayment(dto: PaymentDto): Promise> {
+ // 1. 参数验证
+ if (!dto.amount || dto.amount <= 0) {
+ return {
+ success: false,
+ message: '支付金额必须大于0',
+ error_code: 'INVALID_AMOUNT'
+ };
+ }
+
+ // 2. 业务规则验证
+ const user = await this.usersService.findOne(dto.userId);
+ if (!user) {
+ return {
+ success: false,
+ message: '用户不存在',
+ error_code: 'USER_NOT_FOUND'
+ };
+ }
+
+ // 3. 状态检查
+ if (user.status !== UserStatus.ACTIVE) {
+ return {
+ success: false,
+ message: '用户状态不允许支付',
+ error_code: 'USER_INACTIVE'
+ };
+ }
+
+ // 4. 执行业务逻辑
+ return this.executePayment(dto);
+}
```
-**修改记录管理原则:**
-- ✅ **保持简洁** - 只保留最近5次修改
-- ✅ **定期清理** - 超出5条时删除最旧记录
-- ✅ **重要标注** - 重大版本更新可特别标注版本号
-- ✅ **描述清晰** - 每条记录都要说明具体改动内容
+### 5. 测试驱动开发
+
+```typescript
+// 先写测试
+describe('LoginService', () => {
+ it('should login successfully with valid credentials', async () => {
+ const dto = { identifier: 'test@example.com', password: 'password123' };
+ const result = await loginService.login(dto);
+
+ expect(result.success).toBe(true);
+ expect(result.data).toHaveProperty('accessToken');
+ });
+
+ it('should return error with invalid credentials', async () => {
+ const dto = { identifier: 'test@example.com', password: 'wrong' };
+ const result = await loginService.login(dto);
+
+ expect(result.success).toBe(false);
+ expect(result.error_code).toBe('LOGIN_FAILED');
+ });
+});
+
+// 再写实现
+@Injectable()
+export class LoginService {
+ async login(dto: LoginDto): Promise> {
+ // 实现逻辑
+ }
+}
+```
---
## 🎯 总结
-遵循后端开发规范能够:
+遵循开发规范能够:
-1. **提高代码质量** - 通过完整的注释和规范的实现
-2. **提升团队效率** - 统一的规范减少沟通成本
-3. **降低维护成本** - 清晰的文档和日志便于问题定位
-4. **增强系统稳定性** - 完善的异常处理和防御性编程
-5. **促进知识传承** - 详细的修改记录和版本管理
+1. **清晰的架构** - 四层架构确保职责分离
+2. **高质量代码** - 完整的注释和规范的实现
+3. **易于维护** - 清晰的文档和日志便于问题定位
+4. **团队协作** - 统一的规范减少沟通成本
+5. **系统稳定** - 完善的异常处理和防御性编程
-**记住:好的代码不仅要能运行,更要能被理解、维护和扩展。**
+**记住:好的代码不仅要能运行,更要符合架构设计、易于理解、便于维护和扩展。**
---
## 📚 相关文档
-- [命名规范](./naming_convention.md) - 代码命名规范
-- [NestJS 使用指南](./nestjs_guide.md) - 框架最佳实践
-- [Git 提交规范](./git_commit_guide.md) - 版本控制规范
-- [AI 辅助开发规范](./AI辅助开发规范指南.md) - AI 辅助开发指南
\ No newline at end of file
+- [架构设计文档](../ARCHITECTURE.md) - 四层架构详解
+- [架构重构文档](../ARCHITECTURE_REFACTORING.md) - 架构迁移指南
+- [Git提交规范](./git_commit_guide.md) - 版本控制规范
+- [测试指南](./TESTING.md) - 测试规范和最佳实践