const pool = require('../config/database'); const bcrypt = require('bcryptjs'); class User { // 创建用户表 static async createTable() { const query = ` CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); `; try { await pool.query(query); console.log('用户表创建成功'); } catch (error) { console.error('创建用户表失败:', error); throw error; } } // 根据用户名查找用户 static async findByUsername(username) { const query = 'SELECT * FROM users WHERE username = $1'; try { const result = await pool.query(query, [username]); return result.rows[0]; } catch (error) { console.error('查找用户失败:', error); throw error; } } // 根据邮箱查找用户 static async findByEmail(email) { const query = 'SELECT * FROM users WHERE email = $1'; try { const result = await pool.query(query, [email]); return result.rows[0]; } catch (error) { console.error('查找用户失败:', error); throw error; } } // 创建新用户 static async create(userData) { const { username, email, password } = userData; // 加密密码 const saltRounds = 10; const hashedPassword = await bcrypt.hash(password, saltRounds); const query = ` INSERT INTO users (username, email, password) VALUES ($1, $2, $3) RETURNING id, username, email, created_at `; try { const result = await pool.query(query, [username, email, hashedPassword]); return result.rows[0]; } catch (error) { console.error('创建用户失败:', error); throw error; } } // 验证密码 static async verifyPassword(password, hashedPassword) { return await bcrypt.compare(password, hashedPassword); } // 获取所有用户(仅用于测试) static async findAll() { const query = 'SELECT id, username, email, created_at FROM users'; try { const result = await pool.query(query); return result.rows; } catch (error) { console.error('获取用户列表失败:', error); throw error; } } } module.exports = User;