55 lines
1.6 KiB
TypeScript
55 lines
1.6 KiB
TypeScript
|
|
/**
|
|||
|
|
* 忘记密码 / 重置密码(Web 端)
|
|||
|
|
* POST { phone, newPassword } -> 按手机号更新密码(无验证码版本,适合内测/内部使用)
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
import { NextRequest, NextResponse } from 'next/server'
|
|||
|
|
import { query } from '@/lib/db'
|
|||
|
|
import { hashPassword } from '@/lib/password'
|
|||
|
|
|
|||
|
|
export async function POST(request: NextRequest) {
|
|||
|
|
try {
|
|||
|
|
const body = await request.json()
|
|||
|
|
const { phone, newPassword } = body
|
|||
|
|
|
|||
|
|
if (!phone || !newPassword) {
|
|||
|
|
return NextResponse.json(
|
|||
|
|
{ success: false, error: '请输入手机号和新密码' },
|
|||
|
|
{ status: 400 }
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const trimmedPhone = String(phone).trim()
|
|||
|
|
const trimmedPassword = String(newPassword).trim()
|
|||
|
|
|
|||
|
|
if (trimmedPassword.length < 6) {
|
|||
|
|
return NextResponse.json(
|
|||
|
|
{ success: false, error: '密码至少 6 位' },
|
|||
|
|
{ status: 400 }
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const rows = await query('SELECT id FROM users WHERE phone = ?', [trimmedPhone]) as any[]
|
|||
|
|
if (!rows || rows.length === 0) {
|
|||
|
|
return NextResponse.json(
|
|||
|
|
{ success: false, error: '该手机号未注册' },
|
|||
|
|
{ status: 404 }
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const hashed = hashPassword(trimmedPassword)
|
|||
|
|
await query('UPDATE users SET password = ?, updated_at = NOW() WHERE phone = ?', [
|
|||
|
|
hashed,
|
|||
|
|
trimmedPhone,
|
|||
|
|
])
|
|||
|
|
|
|||
|
|
return NextResponse.json({ success: true, message: '密码已重置,请使用新密码登录' })
|
|||
|
|
} catch (e) {
|
|||
|
|
console.error('[Auth ResetPassword] error:', e)
|
|||
|
|
return NextResponse.json(
|
|||
|
|
{ success: false, error: '重置失败' },
|
|||
|
|
{ status: 500 }
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
}
|