Files
nxxmdata/bank-backend/models/BaseModel.js

110 lines
2.6 KiB
JavaScript

/**
* 基础模型类
* @file BaseModel.js
* @description 所有模型的基类,提供通用方法
*/
const { Model } = require('sequelize');
class BaseModel extends Model {
/**
* 获取模型的安全信息(排除敏感字段)
* @param {Array} excludeFields 要排除的字段
* @returns {Object} 安全信息对象
*/
getSafeInfo(excludeFields = ['password', 'pin', 'secret']) {
const data = this.get({ plain: true });
if (Array.isArray(excludeFields)) {
excludeFields.forEach(field => {
delete data[field];
});
}
return data;
}
/**
* 转换为JSON格式
* @param {Array} excludeFields 要排除的字段
* @returns {Object} JSON对象
*/
toJSON(excludeFields = ['password', 'pin', 'secret']) {
return this.getSafeInfo(excludeFields);
}
/**
* 格式化金额(分转元)
* @param {Number} amount 金额(分)
* @returns {String} 格式化后的金额
*/
formatAmount(amount) {
if (amount === null || amount === undefined) return '0.00';
return (amount / 100).toFixed(2);
}
/**
* 解析金额(元转分)
* @param {String|Number} amount 金额(元)
* @returns {Number} 金额(分)
*/
parseAmount(amount) {
if (typeof amount === 'string') {
return Math.round(parseFloat(amount) * 100);
}
return Math.round(amount * 100);
}
/**
* 格式化日期
* @param {Date} date 日期
* @param {String} format 格式
* @returns {String} 格式化后的日期
*/
formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
if (!date) return null;
const moment = require('moment');
return moment(date).format(format);
}
/**
* 检查字段是否已更改
* @param {String} field 字段名
* @returns {Boolean} 是否已更改
*/
isFieldChanged(field) {
return this.changed(field);
}
/**
* 获取原始值
* @param {String} field 字段名
* @returns {*} 原始值
*/
getOriginalValue(field) {
return this._previousDataValues[field];
}
/**
* 软删除(如果模型支持)
*/
async softDelete() {
if (this.constructor.rawAttributes.deleted_at) {
this.deleted_at = new Date();
await this.save();
} else {
throw new Error('模型不支持软删除');
}
}
/**
* 恢复软删除(如果模型支持)
*/
async restore() {
if (this.constructor.rawAttributes.deleted_at) {
this.deleted_at = null;
await this.save();
} else {
throw new Error('模型不支持软删除');
}
}
}
module.exports = BaseModel;