169 lines
4.6 KiB
Plaintext
169 lines
4.6 KiB
Plaintext
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;
|