chore: mqsrv backend

This commit is contained in:
Chen Gu
2026-05-09 00:52:04 +08:00
commit b84f111e8f
21 changed files with 4593 additions and 0 deletions

114
src/middleware/auth.ts Normal file
View File

@@ -0,0 +1,114 @@
import { Request, Response, NextFunction } from 'express';
import { verifyToken, extractToken } from '../utils/jwt';
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
// 扩展 Request 类型
declare global {
namespace Express {
interface Request {
user?: {
userId: string;
username: string;
email: string;
isVip: boolean;
vipLevel: number;
};
}
}
}
/**
* 认证中间件
*/
export async function authMiddleware(req: Request, res: Response, next: NextFunction) {
try {
const token = extractToken(req.headers.authorization);
if (!token) {
return res.status(401).json({
success: false,
message: '访问令牌缺失,请先登录',
code: 'NO_TOKEN',
});
}
const payload = verifyToken(token);
if (!payload) {
return res.status(401).json({
success: false,
message: '访问令牌无效或已过期',
code: 'INVALID_TOKEN',
});
}
// 检查用户是否存在且未被删除
const user = await prisma.user.findUnique({
where: { id: payload.userId },
select: { id: true, deletedAt: true },
});
if (!user || user.deletedAt) {
return res.status(401).json({
success: false,
message: '用户不存在或已被禁用',
code: 'USER_NOT_FOUND',
});
}
// 将用户信息附加到请求对象
req.user = payload;
next();
} catch (error) {
console.error('Auth middleware error:', error);
return res.status(500).json({
success: false,
message: '认证服务异常',
});
}
}
/**
* 可选认证中间件(不强制要求登录)
*/
export async function optionalAuth(req: Request, res: Response, next: NextFunction) {
try {
const token = extractToken(req.headers.authorization);
if (token) {
const payload = verifyToken(token);
if (payload) {
req.user = payload;
}
}
next();
} catch (error) {
next();
}
}
/**
* VIP 认证中间件(要求 VIP 用户)
*/
export async function vipMiddleware(req: Request, res: Response, next: NextFunction) {
if (!req.user) {
return res.status(401).json({
success: false,
message: '请先登录',
code: 'NO_TOKEN',
});
}
if (!req.user.isVip) {
return res.status(403).json({
success: false,
message: '此功能仅限 VIP 用户使用',
code: 'VIP_REQUIRED',
});
}
next();
}