Files
nxxmdata/backend/examples/operation-log-integration.js
2025-09-12 20:08:42 +08:00

252 lines
7.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.

/**
* 操作日志集成示例
* @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 记录多个操作
*/