Files
张成 8309808835 1
2025-11-21 16:53:49 +08:00

169 lines
4.6 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const dayjs = require("dayjs");
const Sequelize = require("sequelize");
const config ={
"username": "<%=dbConfig.username%>",
"password": "<%=dbConfig.password%>",
"database": "<%=dbConfig.database%>",
"host": "<%=dbConfig.host%>",
"port": <%=dbConfig.port%>,
"dialect": "<%=dbConfig.dialect%>"
}
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(/<p>/g, "").replace(/<\/p>/g, "");
}
let newVal = newRow[key];
if (typeof newVal === "string") {
newVal = newVal.replace(/<p>/g, "").replace(/<\/p>/g, "");
}
str += ` ${key} 从<span class="bold"> ${oldVal} </span> 变更为 <span class="bold"> ${newVal} </span><br>`;
}
}
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(/<p>/g, "").replace(/<\/p>/g, "");
}
str += `<span class="bold"> ${key} </span> 为 <span class="bold"> ${newVal} </span><br>`;
}
}
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为 <span class="bold"> ${id} </span>` });
}
},
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;