refactor:项目架构重构和命名规范化
- 统一文件命名为snake_case格式(kebab-case snake_case) - 重构zulip模块为zulip_core,明确Core层职责 - 重构user-mgmt模块为user_mgmt,统一命名规范 - 调整模块依赖关系,优化架构分层 - 删除过时的文件和目录结构 - 更新相关文档和配置文件 本次重构涉及大量文件重命名和模块重组, 旨在建立更清晰的项目架构和统一的命名规范。
This commit is contained in:
@@ -12,12 +12,22 @@
|
||||
* - 欢迎邮件
|
||||
* - 系统通知
|
||||
*
|
||||
* 职责分离:
|
||||
* - 邮件发送:核心邮件发送功能实现
|
||||
* - 模板管理:各种邮件模板的生成和管理
|
||||
* - 配置管理:邮件服务配置和连接管理
|
||||
*
|
||||
* 最近修改:
|
||||
* - 2026-01-07: 代码规范优化 - 清理未使用的导入(BadRequestException),移除多余注释
|
||||
* - 2026-01-07: 代码规范优化 - 完善方法注释和修改记录
|
||||
*
|
||||
* @author moyin
|
||||
* @version 1.0.0
|
||||
* @version 1.0.1
|
||||
* @since 2025-12-17
|
||||
* @lastModified 2026-01-07
|
||||
*/
|
||||
|
||||
import { Injectable, Logger, BadRequestException } from '@nestjs/common';
|
||||
import { Injectable, Logger } from '@nestjs/common';
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
import * as nodemailer from 'nodemailer';
|
||||
import { Transporter } from 'nodemailer';
|
||||
@@ -51,7 +61,7 @@ export interface VerificationEmailOptions {
|
||||
}
|
||||
|
||||
/**
|
||||
* 邮件发送结果接口 by angjustinl 2025-12-17
|
||||
* 邮件发送结果接口
|
||||
*/
|
||||
export interface EmailSendResult {
|
||||
/** 是否成功 */
|
||||
@@ -62,6 +72,27 @@ export interface EmailSendResult {
|
||||
error?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 邮件服务类
|
||||
*
|
||||
* 职责:
|
||||
* - 邮件发送功能:提供统一的邮件发送接口
|
||||
* - 模板管理:管理各种邮件模板(验证码、欢迎邮件等)
|
||||
* - 配置管理:处理邮件服务配置和连接
|
||||
* - 测试模式:支持开发环境的邮件测试模式
|
||||
*
|
||||
* 主要方法:
|
||||
* - sendEmail() - 通用邮件发送方法
|
||||
* - sendVerificationCode() - 发送验证码邮件
|
||||
* - sendWelcomeEmail() - 发送欢迎邮件
|
||||
* - verifyConnection() - 验证邮件服务连接
|
||||
*
|
||||
* 使用场景:
|
||||
* - 用户注册时发送邮箱验证码
|
||||
* - 密码重置时发送重置验证码
|
||||
* - 用户注册成功后发送欢迎邮件
|
||||
* - 登录验证时发送登录验证码
|
||||
*/
|
||||
@Injectable()
|
||||
export class EmailService {
|
||||
private readonly logger = new Logger(EmailService.name);
|
||||
@@ -73,6 +104,14 @@ export class EmailService {
|
||||
|
||||
/**
|
||||
* 初始化邮件传输器
|
||||
*
|
||||
* 业务逻辑:
|
||||
* 1. 从配置服务获取邮件服务配置(主机、端口、安全设置、认证信息)
|
||||
* 2. 检查是否配置了用户名和密码
|
||||
* 3. 未配置:创建测试模式传输器(streamTransport)
|
||||
* 4. 已配置:创建真实SMTP传输器
|
||||
* 5. 记录初始化结果到日志
|
||||
* 6. 设置transporter实例
|
||||
*/
|
||||
private initializeTransporter(): void {
|
||||
const emailConfig = {
|
||||
@@ -102,7 +141,20 @@ export class EmailService {
|
||||
/**
|
||||
* 检查是否为测试模式
|
||||
*
|
||||
* @returns 是否为测试模式
|
||||
* 业务逻辑:
|
||||
* 1. 检查transporter的options配置
|
||||
* 2. 判断是否设置了streamTransport选项
|
||||
* 3. streamTransport为true表示测试模式
|
||||
* 4. 返回测试模式状态
|
||||
*
|
||||
* @returns 是否为测试模式,true表示测试模式,false表示生产模式
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* if (emailService.isTestMode()) {
|
||||
* console.log('当前为测试模式,邮件不会真实发送');
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
isTestMode(): boolean {
|
||||
return !!(this.transporter.options as any).streamTransport;
|
||||
@@ -111,8 +163,30 @@ export class EmailService {
|
||||
/**
|
||||
* 发送邮件
|
||||
*
|
||||
* 业务逻辑:
|
||||
* 1. 构建邮件选项(发件人、收件人、主题、内容)
|
||||
* 2. 检查是否为测试模式
|
||||
* 3. 测试模式:输出邮件内容到控制台,不真实发送
|
||||
* 4. 生产模式:通过SMTP服务器发送邮件
|
||||
* 5. 记录发送结果和错误信息
|
||||
* 6. 返回发送结果状态
|
||||
*
|
||||
* @param options 邮件选项
|
||||
* @returns 发送结果
|
||||
* @returns 发送结果,包含成功状态、测试模式标识和错误信息
|
||||
* @throws Error 当邮件发送失败时抛出错误(已捕获并返回在结果中)
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const result = await emailService.sendEmail({
|
||||
* to: 'user@example.com',
|
||||
* subject: '测试邮件',
|
||||
* html: '<p>邮件内容</p>',
|
||||
* text: '邮件内容'
|
||||
* });
|
||||
* if (result.success) {
|
||||
* console.log('邮件发送成功');
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
async sendEmail(options: EmailOptions): Promise<EmailSendResult> {
|
||||
try {
|
||||
@@ -155,8 +229,28 @@ export class EmailService {
|
||||
/**
|
||||
* 发送邮箱验证码
|
||||
*
|
||||
* 业务逻辑:
|
||||
* 1. 根据验证码用途选择对应的邮件主题和模板
|
||||
* 2. 邮箱验证:使用邮箱验证模板
|
||||
* 3. 密码重置:使用密码重置模板
|
||||
* 4. 登录验证:使用登录验证模板
|
||||
* 5. 生成HTML邮件内容和纯文本内容
|
||||
* 6. 调用sendEmail方法发送邮件
|
||||
* 7. 返回发送结果
|
||||
*
|
||||
* @param options 验证码邮件选项
|
||||
* @returns 发送结果
|
||||
* @returns 发送结果,包含成功状态和错误信息
|
||||
* @throws Error 当邮件发送失败时(已捕获并返回在结果中)
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const result = await emailService.sendVerificationCode({
|
||||
* email: 'user@example.com',
|
||||
* code: '123456',
|
||||
* nickname: '张三',
|
||||
* purpose: 'email_verification'
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
async sendVerificationCode(options: VerificationEmailOptions): Promise<EmailSendResult> {
|
||||
const { email, code, nickname, purpose } = options;
|
||||
@@ -189,9 +283,25 @@ export class EmailService {
|
||||
/**
|
||||
* 发送欢迎邮件
|
||||
*
|
||||
* 业务逻辑:
|
||||
* 1. 设置欢迎邮件主题
|
||||
* 2. 生成包含用户昵称的欢迎邮件模板
|
||||
* 3. 模板包含游戏特色介绍(建造创造、社交互动、任务挑战)
|
||||
* 4. 调用sendEmail方法发送邮件
|
||||
* 5. 返回发送结果
|
||||
*
|
||||
* @param email 邮箱地址
|
||||
* @param nickname 用户昵称
|
||||
* @returns 发送结果
|
||||
* @returns 发送结果,包含成功状态和错误信息
|
||||
* @throws Error 当邮件发送失败时(已捕获并返回在结果中)
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const result = await emailService.sendWelcomeEmail(
|
||||
* 'newuser@example.com',
|
||||
* '新用户'
|
||||
* );
|
||||
* ```
|
||||
*/
|
||||
async sendWelcomeEmail(email: string, nickname: string): Promise<EmailSendResult> {
|
||||
const subject = '🎮 欢迎加入 Whale Town!';
|
||||
@@ -453,7 +563,25 @@ export class EmailService {
|
||||
/**
|
||||
* 验证邮件服务配置
|
||||
*
|
||||
* @returns 验证结果
|
||||
* 业务逻辑:
|
||||
* 1. 调用transporter的verify方法测试连接
|
||||
* 2. 验证SMTP服务器连接是否正常
|
||||
* 3. 验证认证信息是否有效
|
||||
* 4. 记录验证结果到日志
|
||||
* 5. 返回验证结果状态
|
||||
*
|
||||
* @returns 验证结果,true表示连接成功,false表示连接失败
|
||||
* @throws Error 当连接验证失败时(已捕获并返回false)
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const isConnected = await emailService.verifyConnection();
|
||||
* if (isConnected) {
|
||||
* console.log('邮件服务连接正常');
|
||||
* } else {
|
||||
* console.log('邮件服务连接失败');
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
async verifyConnection(): Promise<boolean> {
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user