feat:实现管理员系统核心功能

- 添加管理员数据库管理控制器和服务
- 实现管理员操作日志记录系统
- 添加数据库异常处理过滤器
- 完善管理员权限验证和响应格式
- 添加全面的属性测试覆盖
This commit is contained in:
moyin
2026-01-08 23:05:34 +08:00
parent 0f37130832
commit 6924416bbd
34 changed files with 9481 additions and 199 deletions

View File

@@ -0,0 +1,97 @@
/**
* 管理员鉴权守卫
*
* 功能描述:
* - 保护后台管理接口的访问权限
* - 验证Authorization Bearer Token
* - 确保只有role=9的管理员可以访问
*
* 职责分离:
* - HTTP请求权限验证
* - Token解析和验证
* - 管理员身份确认
*
* 主要方法:
* - canActivate() - 权限验证核心逻辑
*
* 使用场景:
* - 后台管理API的权限保护
* - 管理员身份验证
*
* 最近修改:
* - 2026-01-08: 注释规范优化 - 为接口添加注释,完善文档说明 (修改者: moyin)
* - 2026-01-07: 代码规范优化 - 修正文件命名规范,更新作者信息和修改记录
* - 2026-01-08: 注释规范优化 - 补充方法注释,添加@param、@returns、@throws和@example (修改者: moyin)
*
* @author moyin
* @version 1.0.3
* @since 2025-12-19
* @lastModified 2026-01-08
*/
import { CanActivate, ExecutionContext, Injectable, UnauthorizedException } from '@nestjs/common';
import { Request } from 'express';
import { AdminCoreService, AdminAuthPayload } from '../../core/admin_core/admin_core.service';
/**
* 管理员请求接口
*
* 功能描述:
* 扩展Express Request接口添加管理员认证信息
*
* 使用场景:
* - AdminGuard验证通过后将管理员信息附加到请求对象
* - 控制器方法中获取当前管理员信息
*/
export interface AdminRequest extends Request {
admin?: AdminAuthPayload;
}
@Injectable()
export class AdminGuard implements CanActivate {
constructor(private readonly adminCoreService: AdminCoreService) {}
/**
* 权限验证核心逻辑
*
* 功能描述:
* 验证HTTP请求的Authorization头确保只有管理员可以访问
*
* 业务逻辑:
* 1. 提取Authorization头
* 2. 验证Bearer Token格式
* 3. 调用核心服务验证Token
* 4. 将管理员信息附加到请求对象
*
* @param context 执行上下文包含HTTP请求信息
* @returns 是否允许访问true表示允许
*
* @throws UnauthorizedException 当缺少Authorization头或格式错误时
* @throws UnauthorizedException 当Token无效或过期时
*
* @example
* ```typescript
* // 在控制器方法上使用
* @UseGuards(AdminGuard)
* @Get('users')
* async getUsers() { ... }
* ```
*/
canActivate(context: ExecutionContext): boolean {
const req = context.switchToHttp().getRequest<AdminRequest>();
const auth = req.headers['authorization'];
if (!auth || Array.isArray(auth)) {
throw new UnauthorizedException('缺少Authorization头');
}
const [scheme, token] = auth.split(' ');
if (scheme !== 'Bearer' || !token) {
throw new UnauthorizedException('Authorization格式错误');
}
const payload = this.adminCoreService.verifyToken(token);
req.admin = payload;
return true;
}
}