const { pool } = require('../config/database'); const bcrypt = require('bcryptjs'); // 创建用户表 const createUserTable = async () => { try { await pool.query(` CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, role ENUM('admin', 'user') DEFAULT 'user', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) `); console.log('用户表创建/检查成功'); } catch (error) { console.error('创建用户表失败:', error); throw error; } }; // 初始化表 createUserTable().catch(error => { console.error('初始化用户表失败:', error); }); // 用户相关方法 const User = { // 根据用户名查找用户 findByUsername: async (username) => { try { console.log('正在查找用户:', username); const [rows] = await pool.query( 'SELECT * FROM users WHERE username = ?', [username] ); console.log('查询结果:', rows[0] ? '找到用户' : '未找到用户'); return rows[0]; } catch (error) { console.error('查找用户失败:', error); throw error; } }, // 根据ID查找用户 findById: async (id) => { try { const [rows] = await pool.query( 'SELECT * FROM users WHERE id = ?', [id] ); return rows[0]; } catch (error) { console.error('根据ID查找用户失败:', error); throw error; } }, // 创建用户 create: async (userData) => { try { const hashedPassword = await bcrypt.hash(userData.password, 10); const [result] = await pool.query( 'INSERT INTO users (username, password, role) VALUES (?, ?, ?)', [userData.username, hashedPassword, userData.role || 'user'] ); return result.insertId; } catch (error) { console.error('创建用户失败:', error); throw error; } }, // 更新用户密码 updatePassword: async (id, newPassword) => { try { const hashedPassword = await bcrypt.hash(newPassword, 10); await pool.query( 'UPDATE users SET password = ? WHERE id = ?', [hashedPassword, id] ); } catch (error) { console.error('更新密码失败:', error); throw error; } }, // 验证密码 comparePassword: async (password, hashedPassword) => { try { if (!password || !hashedPassword) { console.error('密码比较失败: 缺少密码或哈希值'); return false; } return await bcrypt.compare(password, hashedPassword); } catch (error) { console.error('密码比较失败:', error); throw error; } }, // 更新用户信息 update: async (id, updateData) => { try { const [result] = await pool.query( 'UPDATE users SET contact = ?, remark = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?', [updateData.contact, updateData.remark, id] ); return result.affectedRows > 0; } catch (error) { console.error('更新用户信息失败:', error); throw error; } } }; module.exports = User;