252 lines
7.4 KiB
JavaScript
252 lines
7.4 KiB
JavaScript
|
|
/**
|
|||
|
|
* 操作日志集成示例
|
|||
|
|
* @file operation-log-integration.js
|
|||
|
|
* @description 展示如何在现有控制器中集成操作日志记录
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
const { createOperationLogger } = require('../middleware/operationLogger');
|
|||
|
|
|
|||
|
|
// 示例1: 用户管理控制器集成操作日志
|
|||
|
|
const userControllerWithLogs = {
|
|||
|
|
// 创建用户 - 集成操作日志
|
|||
|
|
createUser: [
|
|||
|
|
// 操作日志中间件
|
|||
|
|
createOperationLogger({
|
|||
|
|
moduleName: '用户管理',
|
|||
|
|
tableName: 'users',
|
|||
|
|
getRecordId: (req, res) => res.body?.data?.id || null,
|
|||
|
|
getOperationDesc: (req, res) => `创建用户: ${req.body.username}`,
|
|||
|
|
getOldData: () => null,
|
|||
|
|
getNewData: (req, res) => res.body?.data || null
|
|||
|
|
}),
|
|||
|
|
|
|||
|
|
// 原有的创建用户逻辑
|
|||
|
|
async (req, res) => {
|
|||
|
|
try {
|
|||
|
|
// 创建用户逻辑
|
|||
|
|
const user = await User.create(req.body);
|
|||
|
|
res.json({
|
|||
|
|
success: true,
|
|||
|
|
data: user,
|
|||
|
|
message: '用户创建成功'
|
|||
|
|
});
|
|||
|
|
} catch (error) {
|
|||
|
|
res.status(500).json({
|
|||
|
|
success: false,
|
|||
|
|
message: '用户创建失败',
|
|||
|
|
error: error.message
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
|
|||
|
|
// 更新用户 - 集成操作日志
|
|||
|
|
updateUser: [
|
|||
|
|
createOperationLogger({
|
|||
|
|
moduleName: '用户管理',
|
|||
|
|
tableName: 'users',
|
|||
|
|
getRecordId: (req, res) => req.params.id,
|
|||
|
|
getOperationDesc: (req, res) => `更新用户: ${req.body.username || req.params.id}`,
|
|||
|
|
getOldData: async (req, res) => {
|
|||
|
|
// 获取更新前的数据
|
|||
|
|
const oldUser = await User.findByPk(req.params.id);
|
|||
|
|
return oldUser ? oldUser.toJSON() : null;
|
|||
|
|
},
|
|||
|
|
getNewData: (req, res) => res.body?.data || req.body
|
|||
|
|
}),
|
|||
|
|
|
|||
|
|
async (req, res) => {
|
|||
|
|
try {
|
|||
|
|
const user = await User.findByPk(req.params.id);
|
|||
|
|
if (!user) {
|
|||
|
|
return res.status(404).json({
|
|||
|
|
success: false,
|
|||
|
|
message: '用户不存在'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
await user.update(req.body);
|
|||
|
|
res.json({
|
|||
|
|
success: true,
|
|||
|
|
data: user,
|
|||
|
|
message: '用户更新成功'
|
|||
|
|
});
|
|||
|
|
} catch (error) {
|
|||
|
|
res.status(500).json({
|
|||
|
|
success: false,
|
|||
|
|
message: '用户更新失败',
|
|||
|
|
error: error.message
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
|
|||
|
|
// 删除用户 - 集成操作日志
|
|||
|
|
deleteUser: [
|
|||
|
|
createOperationLogger({
|
|||
|
|
moduleName: '用户管理',
|
|||
|
|
tableName: 'users',
|
|||
|
|
getRecordId: (req, res) => req.params.id,
|
|||
|
|
getOperationDesc: (req, res) => `删除用户: ${req.params.id}`,
|
|||
|
|
getOldData: async (req, res) => {
|
|||
|
|
// 获取删除前的数据
|
|||
|
|
const oldUser = await User.findByPk(req.params.id);
|
|||
|
|
return oldUser ? oldUser.toJSON() : null;
|
|||
|
|
},
|
|||
|
|
getNewData: () => null
|
|||
|
|
}),
|
|||
|
|
|
|||
|
|
async (req, res) => {
|
|||
|
|
try {
|
|||
|
|
const user = await User.findByPk(req.params.id);
|
|||
|
|
if (!user) {
|
|||
|
|
return res.status(404).json({
|
|||
|
|
success: false,
|
|||
|
|
message: '用户不存在'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
await user.destroy();
|
|||
|
|
res.json({
|
|||
|
|
success: true,
|
|||
|
|
message: '用户删除成功'
|
|||
|
|
});
|
|||
|
|
} catch (error) {
|
|||
|
|
res.status(500).json({
|
|||
|
|
success: false,
|
|||
|
|
message: '用户删除失败',
|
|||
|
|
error: error.message
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 示例2: 农场管理控制器集成操作日志
|
|||
|
|
const farmControllerWithLogs = {
|
|||
|
|
// 创建农场 - 集成操作日志
|
|||
|
|
createFarm: [
|
|||
|
|
createOperationLogger({
|
|||
|
|
moduleName: '农场管理',
|
|||
|
|
tableName: 'farms',
|
|||
|
|
getRecordId: (req, res) => res.body?.data?.id || null,
|
|||
|
|
getOperationDesc: (req, res) => `创建农场: ${req.body.name}`,
|
|||
|
|
getOldData: () => null,
|
|||
|
|
getNewData: (req, res) => res.body?.data || null
|
|||
|
|
}),
|
|||
|
|
|
|||
|
|
async (req, res) => {
|
|||
|
|
try {
|
|||
|
|
const farm = await Farm.create(req.body);
|
|||
|
|
res.json({
|
|||
|
|
success: true,
|
|||
|
|
data: farm,
|
|||
|
|
message: '农场创建成功'
|
|||
|
|
});
|
|||
|
|
} catch (error) {
|
|||
|
|
res.status(500).json({
|
|||
|
|
success: false,
|
|||
|
|
message: '农场创建失败',
|
|||
|
|
error: error.message
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 示例3: 批量操作日志记录
|
|||
|
|
const batchOperationLogger = createBatchOperationLogger([
|
|||
|
|
{
|
|||
|
|
moduleName: '用户管理',
|
|||
|
|
tableName: 'users',
|
|||
|
|
getRecordId: (req, res) => req.params.id,
|
|||
|
|
getOperationDesc: (req, res) => `批量操作用户: ${req.params.id}`,
|
|||
|
|
getOldData: () => null,
|
|||
|
|
getNewData: (req, res) => res.body
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
moduleName: '权限管理',
|
|||
|
|
tableName: 'user_roles',
|
|||
|
|
getRecordId: (req, res) => req.params.id,
|
|||
|
|
getOperationDesc: (req, res) => `更新用户角色: ${req.params.id}`,
|
|||
|
|
getOldData: () => null,
|
|||
|
|
getNewData: (req, res) => req.body.roles
|
|||
|
|
}
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
// 示例4: 在Express路由中使用
|
|||
|
|
const express = require('express');
|
|||
|
|
const router = express.Router();
|
|||
|
|
|
|||
|
|
// 用户路由
|
|||
|
|
router.post('/users',
|
|||
|
|
createOperationLogger({
|
|||
|
|
moduleName: '用户管理',
|
|||
|
|
tableName: 'users',
|
|||
|
|
getRecordId: (req, res) => res.body?.data?.id || null,
|
|||
|
|
getOperationDesc: (req, res) => `创建用户: ${req.body.username}`,
|
|||
|
|
getOldData: () => null,
|
|||
|
|
getNewData: (req, res) => res.body?.data || null
|
|||
|
|
}),
|
|||
|
|
userControllerWithLogs.createUser[1] // 实际的控制器函数
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
router.put('/users/:id',
|
|||
|
|
createOperationLogger({
|
|||
|
|
moduleName: '用户管理',
|
|||
|
|
tableName: 'users',
|
|||
|
|
getRecordId: (req, res) => req.params.id,
|
|||
|
|
getOperationDesc: (req, res) => `更新用户: ${req.body.username || req.params.id}`,
|
|||
|
|
getOldData: async (req, res) => {
|
|||
|
|
const oldUser = await User.findByPk(req.params.id);
|
|||
|
|
return oldUser ? oldUser.toJSON() : null;
|
|||
|
|
},
|
|||
|
|
getNewData: (req, res) => res.body?.data || req.body
|
|||
|
|
}),
|
|||
|
|
userControllerWithLogs.updateUser[1]
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
router.delete('/users/:id',
|
|||
|
|
createOperationLogger({
|
|||
|
|
moduleName: '用户管理',
|
|||
|
|
tableName: 'users',
|
|||
|
|
getRecordId: (req, res) => req.params.id,
|
|||
|
|
getOperationDesc: (req, res) => `删除用户: ${req.params.id}`,
|
|||
|
|
getOldData: async (req, res) => {
|
|||
|
|
const oldUser = await User.findByPk(req.params.id);
|
|||
|
|
return oldUser ? oldUser.toJSON() : null;
|
|||
|
|
},
|
|||
|
|
getNewData: () => null
|
|||
|
|
}),
|
|||
|
|
userControllerWithLogs.deleteUser[1]
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
module.exports = {
|
|||
|
|
userControllerWithLogs,
|
|||
|
|
farmControllerWithLogs,
|
|||
|
|
batchOperationLogger,
|
|||
|
|
router
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 使用说明:
|
|||
|
|
*
|
|||
|
|
* 1. 在需要记录操作日志的控制器方法前添加 createOperationLogger 中间件
|
|||
|
|
* 2. 配置中间件参数:
|
|||
|
|
* - moduleName: 模块名称(如:用户管理、农场管理)
|
|||
|
|
* - tableName: 数据表名(如:users、farms)
|
|||
|
|
* - getRecordId: 获取记录ID的函数
|
|||
|
|
* - getOperationDesc: 获取操作描述的函数
|
|||
|
|
* - getOldData: 获取操作前数据的函数(可选)
|
|||
|
|
* - getNewData: 获取操作后数据的函数(可选)
|
|||
|
|
*
|
|||
|
|
* 3. 操作日志会自动记录以下信息:
|
|||
|
|
* - 操作用户信息(从req.user获取)
|
|||
|
|
* - 操作类型(CREATE/UPDATE/DELETE)
|
|||
|
|
* - 操作描述
|
|||
|
|
* - 数据变化(操作前后的数据)
|
|||
|
|
* - 请求信息(IP、URL、方法等)
|
|||
|
|
* - 响应信息(状态码、执行时间等)
|
|||
|
|
*
|
|||
|
|
* 4. 对于批量操作,可以使用 createBatchOperationLogger 记录多个操作
|
|||
|
|
*/
|