90 lines
1.9 KiB
JavaScript
90 lines
1.9 KiB
JavaScript
import db from '../../utils/db.js'
|
|
import { verifyToken, extractToken } from '../../utils/jwt.js'
|
|
import bcrypt from 'bcryptjs'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
try {
|
|
// 验证登录
|
|
const token = extractToken(event)
|
|
if (!token) {
|
|
throw createError({
|
|
statusCode: 401,
|
|
message: '请先登录'
|
|
})
|
|
}
|
|
|
|
const user = await verifyToken(token)
|
|
if (!user) {
|
|
throw createError({
|
|
statusCode: 401,
|
|
message: 'Token 无效或已过期'
|
|
})
|
|
}
|
|
|
|
// 获取请求体
|
|
const body = await readBody(event)
|
|
const { oldPassword, newPassword } = body
|
|
|
|
if (!oldPassword || !newPassword) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
message: '请输入旧密码和新密码'
|
|
})
|
|
}
|
|
|
|
if (newPassword.length < 6) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
message: '新密码长度至少 6 位'
|
|
})
|
|
}
|
|
|
|
// 获取用户
|
|
const dbUser = await db.users.findOne({ _id: user.userId })
|
|
if (!dbUser) {
|
|
throw createError({
|
|
statusCode: 404,
|
|
message: '用户不存在'
|
|
})
|
|
}
|
|
|
|
// 验证旧密码
|
|
const isValidPassword = await bcrypt.compare(oldPassword, dbUser.password)
|
|
if (!isValidPassword) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
message: '旧密码错误'
|
|
})
|
|
}
|
|
|
|
// 加密新密码
|
|
const hashedPassword = await bcrypt.hash(newPassword, 10)
|
|
|
|
// 更新密码
|
|
await db.users.update(
|
|
{ _id: user.userId },
|
|
{
|
|
$set: {
|
|
password: hashedPassword,
|
|
updatedAt: new Date().toISOString()
|
|
}
|
|
}
|
|
)
|
|
|
|
return {
|
|
success: true,
|
|
message: '密码修改成功'
|
|
}
|
|
} catch (error) {
|
|
if (error.statusCode) {
|
|
throw error
|
|
}
|
|
|
|
console.error('[Admin] 修改密码失败:', error)
|
|
throw createError({
|
|
statusCode: 500,
|
|
message: '修改密码失败'
|
|
})
|
|
}
|
|
})
|