User.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. const { pool } = require('../config/database');
  2. const bcrypt = require('bcryptjs');
  3. // 创建用户表
  4. const createUserTable = async () => {
  5. try {
  6. await pool.query(`
  7. CREATE TABLE IF NOT EXISTS users (
  8. id INT AUTO_INCREMENT PRIMARY KEY,
  9. username VARCHAR(50) NOT NULL UNIQUE,
  10. password VARCHAR(255) NOT NULL,
  11. role ENUM('admin', 'user') DEFAULT 'user',
  12. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  13. )
  14. `);
  15. console.log('用户表创建/检查成功');
  16. } catch (error) {
  17. console.error('创建用户表失败:', error);
  18. throw error;
  19. }
  20. };
  21. // 初始化表
  22. createUserTable().catch(error => {
  23. console.error('初始化用户表失败:', error);
  24. });
  25. // 用户相关方法
  26. const User = {
  27. // 根据用户名查找用户
  28. findByUsername: async (username) => {
  29. try {
  30. console.log('正在查找用户:', username);
  31. const [rows] = await pool.query(
  32. 'SELECT * FROM users WHERE username = ?',
  33. [username]
  34. );
  35. console.log('查询结果:', rows[0] ? '找到用户' : '未找到用户');
  36. return rows[0];
  37. } catch (error) {
  38. console.error('查找用户失败:', error);
  39. throw error;
  40. }
  41. },
  42. // 根据ID查找用户
  43. findById: async (id) => {
  44. try {
  45. const [rows] = await pool.query(
  46. 'SELECT * FROM users WHERE id = ?',
  47. [id]
  48. );
  49. return rows[0];
  50. } catch (error) {
  51. console.error('根据ID查找用户失败:', error);
  52. throw error;
  53. }
  54. },
  55. // 创建用户
  56. create: async (userData) => {
  57. try {
  58. const hashedPassword = await bcrypt.hash(userData.password, 10);
  59. const [result] = await pool.query(
  60. 'INSERT INTO users (username, password, role) VALUES (?, ?, ?)',
  61. [userData.username, hashedPassword, userData.role || 'user']
  62. );
  63. return result.insertId;
  64. } catch (error) {
  65. console.error('创建用户失败:', error);
  66. throw error;
  67. }
  68. },
  69. // 更新用户密码
  70. updatePassword: async (id, newPassword) => {
  71. try {
  72. const hashedPassword = await bcrypt.hash(newPassword, 10);
  73. await pool.query(
  74. 'UPDATE users SET password = ? WHERE id = ?',
  75. [hashedPassword, id]
  76. );
  77. } catch (error) {
  78. console.error('更新密码失败:', error);
  79. throw error;
  80. }
  81. },
  82. // 验证密码
  83. comparePassword: async (password, hashedPassword) => {
  84. try {
  85. if (!password || !hashedPassword) {
  86. console.error('密码比较失败: 缺少密码或哈希值');
  87. return false;
  88. }
  89. return await bcrypt.compare(password, hashedPassword);
  90. } catch (error) {
  91. console.error('密码比较失败:', error);
  92. throw error;
  93. }
  94. }
  95. };
  96. module.exports = User;