import { Inject, MidwayWebRouterService, Provide } from '@midwayjs/core'; import { InjectEntityModel } from '@midwayjs/typeorm'; import { Repository } from 'typeorm'; import { get } from 'lodash'; import dayjs = require('dayjs'); import { Context } from '@midwayjs/koa'; import { TypeORMDataSourceManager } from '@midwayjs/typeorm'; import { Opera } from '../../entityLogs/opera.entity'; @Provide() export class OperaService { @Inject() ctx: Context; @InjectEntityModel(Opera, 'logs') model: Repository; @Inject() webRouterService: MidwayWebRouterService; @Inject() dataSourceManager: TypeORMDataSourceManager; /** * 生成日志 * 原数据和新数据格式: * { * [表名]:[数据,...数据] * } * @param origin_data 原数据 * @param new_data 新数据 */ async toMakeLogs(origin_data?: object, new_data?: object) { const req = this.ctx.request; const user = this.ctx.user; const logInfo: any = { // 操作人 operator_id: user.id, operator_name: get(user, 'nick_name', get(user, 'name')), // ip ip: get(req, 'header.x-forwarded-for', req.ip), // 设备 device: get(req, 'header.user-agent'), // 操作时间 time: dayjs().format('YYYY-MM-DD HH:mm:ss'), // 操作地址 referer: get(req, 'header.referer'), // 请求地址uri path: get(req, 'path'), // 地址参数 params: get(req, 'params'), // 请求参数 query: get(req, 'query'), // 方法体参数 body: get(req, 'body'), // 操作业务:可以通过路由注解的routerName来获取 opera: null, // 变动值: 表:[数据] 需要自己组织 origin_data: origin_data, new_data: new_data, }; const routeInfo = await this.webRouterService.getMatchedRouterInfo(this.ctx.path, this.ctx.method); if (routeInfo) logInfo.opera = get(routeInfo, 'routerName'); await this.model.insert(logInfo); } }