Files
pdnode-account/models/User.js
2025-07-29 15:36:25 -07:00

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;