116 lines
2.8 KiB
TypeScript
116 lines
2.8 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server'
|
|
import bcrypt from 'bcryptjs'
|
|
import { db } from '@/lib/db'
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const body = await request.json()
|
|
const { name, email, password } = body
|
|
|
|
// 验证必填字段
|
|
if (!name || !email || !password) {
|
|
return NextResponse.json(
|
|
{ message: '请填写所有必填字段' },
|
|
{ status: 400 }
|
|
)
|
|
}
|
|
|
|
// 验证邮箱格式
|
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
|
|
if (!emailRegex.test(email)) {
|
|
return NextResponse.json(
|
|
{ message: '请输入有效的邮箱地址' },
|
|
{ status: 400 }
|
|
)
|
|
}
|
|
|
|
// 验证密码长度
|
|
if (password.length < 6) {
|
|
return NextResponse.json(
|
|
{ message: '密码长度至少6位' },
|
|
{ status: 400 }
|
|
)
|
|
}
|
|
|
|
// 检查邮箱是否已存在
|
|
const existingUser = await db.findUserByEmail(email)
|
|
if (existingUser) {
|
|
return NextResponse.json(
|
|
{ message: '该邮箱已被注册' },
|
|
{ status: 409 }
|
|
)
|
|
}
|
|
|
|
// 使用 bcrypt 加密密码
|
|
const saltRounds = 10
|
|
const hashedPassword = await bcrypt.hash(password, saltRounds)
|
|
|
|
// 创建新用户
|
|
const newUser = await db.createUser(name, email, hashedPassword)
|
|
|
|
console.log('✅ 新用户注册成功:', {
|
|
id: newUser.id,
|
|
name: newUser.name,
|
|
email: newUser.email,
|
|
createdAt: newUser.created_at,
|
|
})
|
|
|
|
// 返回成功响应(不返回密码)
|
|
return NextResponse.json(
|
|
{
|
|
message: '注册成功',
|
|
user: {
|
|
id: newUser.id,
|
|
name: newUser.name,
|
|
email: newUser.email,
|
|
},
|
|
},
|
|
{ status: 201 }
|
|
)
|
|
} catch (error) {
|
|
console.error('注册错误:', error)
|
|
|
|
// 处理数据库唯一约束错误
|
|
if (error instanceof Error && error.message.includes('duplicate key')) {
|
|
return NextResponse.json(
|
|
{ message: '该邮箱已被注册' },
|
|
{ status: 409 }
|
|
)
|
|
}
|
|
|
|
return NextResponse.json(
|
|
{ message: '服务器错误,请稍后重试' },
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
}
|
|
|
|
// 获取已注册用户列表(管理员功能)
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
// TODO: 添加管理员权限验证
|
|
|
|
const users = await db.getAllUsers()
|
|
|
|
return NextResponse.json(
|
|
{
|
|
total: users.length,
|
|
users: users.map(user => ({
|
|
id: user.id,
|
|
name: user.name,
|
|
email: user.email,
|
|
emailVerified: user.email_verified,
|
|
createdAt: user.created_at,
|
|
})),
|
|
},
|
|
{ status: 200 }
|
|
)
|
|
} catch (error) {
|
|
console.error('获取用户列表错误:', error)
|
|
return NextResponse.json(
|
|
{ message: '服务器错误' },
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
}
|