userController.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import bcrypt from 'bcryptjs';
  2. import jwt from 'jsonwebtoken';
  3. import pool from '../config/db.js';
  4. // 生成JWT令牌
  5. const generateToken = (id) => {
  6. return jwt.sign({ id }, process.env.JWT_SECRET, {
  7. expiresIn: '30d',
  8. });
  9. };
  10. // @desc 注册新用户
  11. // @route POST /api/users
  12. // @access Public
  13. const registerUser = async (req, res) => {
  14. const { email, password } = req.body;
  15. try {
  16. // 检查用户是否已存在
  17. const [existingUsers] = await pool.query('SELECT * FROM users WHERE email = ?', [email]);
  18. if (existingUsers.length > 0) {
  19. return res.status(400).json({ message: '用户已存在' });
  20. }
  21. // 加密密码
  22. const salt = await bcrypt.genSalt(10);
  23. const hashedPassword = await bcrypt.hash(password, salt);
  24. // 创建用户
  25. const [result] = await pool.query('INSERT INTO users (email, password) VALUES (?, ?)', [
  26. email,
  27. hashedPassword,
  28. ]);
  29. if (result.insertId) {
  30. res.status(201).json({
  31. id: result.insertId,
  32. email,
  33. token: generateToken(result.insertId),
  34. });
  35. } else {
  36. res.status(400).json({ message: '无效的用户数据' });
  37. }
  38. } catch (error) {
  39. console.error(error);
  40. res.status(500).json({ message: '服务器错误' });
  41. }
  42. };
  43. // @desc 认证用户 & 获取令牌
  44. // @route POST /api/users/login
  45. // @access Public
  46. const loginUser = async (req, res) => {
  47. const { email, password } = req.body;
  48. try {
  49. // 检查用户是否存在
  50. const [users] = await pool.query('SELECT * FROM users WHERE email = ?', [email]);
  51. if (users.length === 0) {
  52. return res.status(401).json({ message: '邮箱或密码不正确' });
  53. }
  54. const user = users[0];
  55. // 验证密码
  56. const isMatch = await bcrypt.compare(password, user.password);
  57. if (!isMatch) {
  58. return res.status(401).json({ message: '邮箱或密码不正确' });
  59. }
  60. res.json({
  61. id: user.id,
  62. email: user.email,
  63. token: generateToken(user.id),
  64. });
  65. } catch (error) {
  66. console.error(error);
  67. res.status(500).json({ message: '服务器错误' });
  68. }
  69. };
  70. // @desc 获取用户资料
  71. // @route GET /api/users/profile
  72. // @access Private
  73. const getUserProfile = async (req, res) => {
  74. try {
  75. res.json({
  76. id: req.user.id,
  77. email: req.user.email,
  78. });
  79. } catch (error) {
  80. console.error(error);
  81. res.status(500).json({ message: '服务器错误' });
  82. }
  83. };
  84. export { registerUser, loginUser, getUserProfile };