162 lines
3.8 KiB
JavaScript
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; |