/** * User 模型定义 * @file User.js * @description 定义用户模型,用于数据库操作 */ const { DataTypes } = require('sequelize'); const bcrypt = require('bcrypt'); const BaseModel = require('./BaseModel'); const { sequelize } = require('../config/database-pool'); class User extends BaseModel { /** * 验证密码 * @param {String} password 待验证的密码 * @returns {Promise} 验证结果 */ async validPassword(password) { return await bcrypt.compare(password, this.password); } /** * 获取用户角色 * @returns {Promise} 用户角色列表 */ async getRoles() { return await this.getRoles(); } /** * 检查用户是否具有指定角色 * @param {String|Array} roleName 角色名称或角色名称数组 * @returns {Promise} 检查结果 */ async hasRole(roleName) { const roles = await this.getRoles(); const roleNames = roles.map(role => role.name); if (Array.isArray(roleName)) { return roleName.some(name => roleNames.includes(name)); } return roleNames.includes(roleName); } /** * 为用户分配角色 * @param {Number|Array} roleId 角色ID或角色ID数组 * @returns {Promise} 分配结果 */ async assignRole(roleId) { try { if (Array.isArray(roleId)) { await this.addRoles(roleId); } else { await this.addRole(roleId); } return true; } catch (error) { console.error('分配角色失败:', error); return false; } } /** * 移除用户角色 * @param {Number|Array} roleId 角色ID或角色ID数组 * @returns {Promise} 移除结果 */ async removeRole(roleId) { try { if (Array.isArray(roleId)) { await this.removeRoles(roleId); } else { await this.removeRole(roleId); } return true; } catch (error) { console.error('移除角色失败:', error); return false; } } /** * 获取用户安全信息(不包含密码) * @returns {Object} 用户安全信息 */ getSafeInfo() { const { password, ...safeInfo } = this.get({ plain: true }); return safeInfo; } } // 初始化User模型 User.init({ id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true }, username: { type: DataTypes.STRING(50), allowNull: false, unique: true }, email: { type: DataTypes.STRING(100), allowNull: false, unique: true, validate: { isEmail: true } }, password: { type: DataTypes.STRING(255), allowNull: false }, phone: { type: DataTypes.STRING(20), allowNull: true }, avatar: { type: DataTypes.STRING(255), allowNull: true }, status: { type: DataTypes.ENUM('active', 'inactive', 'suspended'), defaultValue: 'active' } }, { sequelize, tableName: 'users', modelName: 'User', hooks: { beforeCreate: async (user) => { if (user.password) { user.password = await bcrypt.hash(user.password, 10); } }, beforeUpdate: async (user) => { if (user.changed('password')) { user.password = await bcrypt.hash(user.password, 10); } } } }); module.exports = User;