This commit is contained in:
2025-06-22 11:34:32 +08:00
parent 142992a6c9
commit 7d139b22db
55 changed files with 11035 additions and 105 deletions
+28
View File
@@ -0,0 +1,28 @@
import { NextRequest } from 'next/server'
import { verifyToken } from '@/lib/auth'
import { prisma } from '@/lib/prisma'
export async function requireAdmin(request: NextRequest) {
const authHeader = request.headers.get('Authorization')
const token = authHeader?.replace('Bearer ', '')
if (!token) {
throw new Error('未提供认证令牌')
}
const decoded = verifyToken(token)
if (!decoded) {
throw new Error('无效的认证令牌')
}
const user = await prisma.user.findUnique({
where: { id: decoded.userId },
select: { id: true, isAdmin: true }
})
if (!user || !user.isAdmin) {
throw new Error('权限不足')
}
return user
}
+24
View File
@@ -0,0 +1,24 @@
import bcrypt from 'bcryptjs'
import jwt from 'jsonwebtoken'
const JWT_SECRET = process.env.JWT_SECRET || 'your-jwt-secret-here'
export async function hashPassword(password: string): Promise<string> {
return await bcrypt.hash(password, 12)
}
export async function verifyPassword(password: string, hashedPassword: string): Promise<boolean> {
return await bcrypt.compare(password, hashedPassword)
}
export function generateToken(payload: any): string {
return jwt.sign(payload, JWT_SECRET, { expiresIn: '7d' })
}
export function verifyToken(token: string): any {
try {
return jwt.verify(token, JWT_SECRET)
} catch (error) {
return null
}
}
+9
View File
@@ -0,0 +1,9 @@
import { PrismaClient } from '@prisma/client'
const globalForPrisma = globalThis as unknown as {
prisma: PrismaClient | undefined
}
export const prisma = globalForPrisma.prisma ?? new PrismaClient()
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma