92 lines
2.4 KiB
JavaScript
92 lines
2.4 KiB
JavaScript
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; |