const Sequelize = require("sequelize"); const config = require("../config/config")["db"]; const dayjs = require("dayjs"); let model = {}; const logEditField = (oldRow, newRow) => { let str = ``; oldRow = oldRow.toJSON ? oldRow.toJSON() : oldRow; newRow = newRow ? newRow.toJSON() : newRow; let keyRows = Object.keys(oldRow); for (let i = 0; i < keyRows.length; i++) { let key = keyRows[i]; if (key !== "create_time" && key !== "last_modify_time" && oldRow[key] !== newRow[key]) { let oldVal = oldRow[key]; if (typeof oldVal === "string") { oldVal = oldVal.replace(/

/g, "").replace(/<\/p>/g, ""); } let newVal = newRow[key]; if (typeof newVal === "string") { newVal = newVal.replace(/

/g, "").replace(/<\/p>/g, ""); } str += ` ${key} 从 ${oldVal} 变更为 ${newVal}
`; } } return str; }; const logCreateField = (oldRow) => { let str = ``; oldRow = oldRow.toJSON ? oldRow.toJSON() : oldRow; let keyRows = Object.keys(oldRow); for (let i = 0; i < keyRows.length; i++) { let key = keyRows[i]; if (key !== "create_time" && key !== "last_modify_time") { let newVal = oldRow[key]; if (typeof newVal === "string") { newVal = newVal.replace(/

/g, "").replace(/<\/p>/g, ""); } str += ` ${key} ${newVal}
`; } } return str; }; let sequelize = new Sequelize(config.database, config.username, config.password, { host: config.host, dialect: config.dialect, pool: { max: 5, min: 0, idle: 10000, }, dialectOptions: { charset: "utf8mb4", collate: "utf8mb4_unicode_ci", supportBigNumbers: true, bigNumberStrings: true, }, }); const define = (name, attributes) => { let attrs = {}; for (let key in attributes) { let value = attributes[key]; if (typeof value === "object" && value["type"]) { value.allowNull = value.allowNull || false; attrs[key] = value; } else { attrs[key] = { type: value, allowNull: false, }; } } attrs.create_time = { type: Sequelize.DATE, allowNull: false, defaultValue: sequelize.literal("CURRENT_TIMESTAMP"), comment: "创建时间", get() { return dayjs(this.getDataValue("create_time")).format("YYYY-MM-DD HH:mm:ss"); }, }; attrs.last_modify_time = { type: Sequelize.DATE, allowNull: false, comment: "最后更新时间", defaultValue: sequelize.literal("CURRENT_TIMESTAMP"), get() { return dayjs(this.getDataValue("last_modify_time")).format("YYYY-MM-DD HH:mm:ss"); }, }; model[name] = sequelize.define(name, attrs, { tableName: name, timestamps: false, hooks: { beforeValidate: (obj) => { let now = Date.now(); if (obj.isNewRecord) { obj.create_time = now; obj.last_modify_time = now; } else { obj.last_modify_time = now; } }, afterCreate: async (obj) => { let tableName = obj._modelOptions.tableName; if (tableName !== "sys_log") { let logStr = logCreateField(obj); await model["sys_log"].create({ table_name: tableName, operate: "新增", content: logStr }); } }, afterDestroy: async (obj) => { let id = obj.id; let tableName = obj._modelOptions.tableName; if (tableName !== "sys_log") { await model["sys_log"].create({ table_name: tableName, operate: "删除", content: `用户删除id为 ${id} ` }); } }, beforeUpdate: async (obj) => { let tableName = obj._modelOptions.tableName; if (tableName !== "sys_log") { let id = obj.id; let tableName = obj._modelOptions.tableName; let updateRow = await model[tableName].findOne({ where: { id } }); let logStr = logEditField(updateRow, obj); await model["sys_log"].create({ table_name: tableName, operate: "修改", content: logStr }); } }, }, }); return model[name]; }; let exp = { sequelize, define, sync: () => { if (process.env.NODE_ENV !== "production") { sequelize.sync({ force: false }); } else { throw new Error("Cannot sync() when NODE_ENV is set to 'production'."); } }, }; module.exports = exp;