Files
pdnode-account/routes/auth.js
2025-07-29 15:36:25 -07:00

162 lines
3.8 KiB
JavaScript

const express = require('express');
const User = require('../models/User');
const { generateToken, authenticateToken } = require('../middleware/auth');
const {
registerValidation,
loginValidation,
handleValidationErrors
} = require('../middleware/validation');
const router = express.Router();
// 注册路由
router.post('/register', registerValidation, handleValidationErrors, async (req, res) => {
try {
const { username, email, password } = req.body;
// 检查用户名是否已存在
const existingUserByUsername = await User.findByUsername(username);
if (existingUserByUsername) {
return res.status(400).json({
success: false,
message: '用户名已存在'
});
}
// 检查邮箱是否已存在
const existingUserByEmail = await User.findByEmail(email);
if (existingUserByEmail) {
return res.status(400).json({
success: false,
message: '邮箱已被注册'
});
}
// 创建新用户
const newUser = await User.create({ username, email, password });
// 生成JWT token
const token = generateToken(newUser.id, newUser.username);
res.status(201).json({
success: true,
message: '注册成功',
data: {
user: {
id: newUser.id,
username: newUser.username,
email: newUser.email,
created_at: newUser.created_at
},
token
}
});
} catch (error) {
console.error('注册失败:', error);
res.status(500).json({
success: false,
message: '服务器内部错误'
});
}
});
// 登录路由
router.post('/login', loginValidation, handleValidationErrors, async (req, res) => {
try {
const { username, password } = req.body;
// 查找用户(支持用户名或邮箱登录)
let user = await User.findByUsername(username);
if (!user) {
// 如果不是用户名,尝试用邮箱查找
user = await User.findByEmail(username);
}
if (!user) {
return res.status(401).json({
success: false,
message: '用户名或密码错误'
});
}
// 验证密码
const isPasswordValid = await User.verifyPassword(password, user.password);
if (!isPasswordValid) {
return res.status(401).json({
success: false,
message: '用户名或密码错误'
});
}
// 生成JWT token
const token = generateToken(user.id, user.username);
res.json({
success: true,
message: '登录成功',
data: {
user: {
id: user.id,
username: user.username,
email: user.email,
created_at: user.created_at
},
token
}
});
} catch (error) {
console.error('登录失败:', error);
res.status(500).json({
success: false,
message: '服务器内部错误'
});
}
});
// 获取当前用户信息(需要认证)
router.get('/profile', authenticateToken, async (req, res) => {
try {
const user = await User.findByUsername(req.user.username);
if (!user) {
return res.status(404).json({
success: false,
message: '用户不存在'
});
}
res.json({
success: true,
data: {
user: {
id: user.id,
username: user.username,
email: user.email,
created_at: user.created_at
}
}
});
} catch (error) {
console.error('获取用户信息失败:', error);
res.status(500).json({
success: false,
message: '服务器内部错误'
});
}
});
// 测试路由(需要认证)
router.get('/test', authenticateToken, (req, res) => {
res.json({
success: true,
message: '认证成功',
data: {
user: req.user
}
});
});
module.exports = router;