Files
platformV2Web/middleware/db.js
张成 8309808835 1
2025-11-21 16:53:49 +08:00

161 lines
4.4 KiB
JavaScript
Raw 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 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(/<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;