package service import ( "context" "gitee.com/red-future---jilin-g/common/log/consts" "gitee.com/red-future---jilin-g/common/log/dao" "gitee.com/red-future---jilin-g/common/log/model/dto" logEntity "gitee.com/red-future---jilin-g/common/log/model/entity" "gitee.com/red-future---jilin-g/common/utils" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gtime" "github.com/gogf/gf/v2/util/gconv" ) type operationLog struct{} // OperationLog 操作日志服务 var OperationLog = &operationLog{} // RecordCreate 记录创建操作 func (s *operationLog) RecordCreate(ctx context.Context, module, service, resource, resourceID, description string, afterData map[string]interface{}) error { return s.record(ctx, module, service, string(consts.OperationCreate), resource, resourceID, description, nil, afterData, nil) } // RecordUpdate 记录更新操作 func (s *operationLog) RecordUpdate(ctx context.Context, module, service, resource, resourceID, description string, beforeData, afterData map[string]interface{}) error { return s.record(ctx, module, service, string(consts.OperationUpdate), resource, resourceID, description, beforeData, afterData, nil) } // RecordDelete 记录删除操作 func (s *operationLog) RecordDelete(ctx context.Context, module, service, resource, resourceID, description string, beforeData map[string]interface{}) error { return s.record(ctx, module, service, string(consts.OperationDelete), resource, resourceID, description, beforeData, nil, nil) } // BatchRecordCreate 批量记录创建操作 func (s *operationLog) BatchRecordCreate(ctx context.Context, logs []*logEntity.OperationLog) error { return dao.Log.CreateBatch(ctx, logs) } // GetByID 根据ID获取操作日志 func (s *operationLog) GetByID(ctx context.Context, id string) (*dto.OperationLogInfo, error) { log, err := dao.Log.GetByID(ctx, id) if err != nil { return nil, err } var logInfo dto.OperationLogInfo gconv.Struct(log, &logInfo) logInfo.ID = log.Id.Hex() logInfo.CreatedAt = gtime.New(log.CreatedAt).Format("Y-m-d H:i:s") logInfo.UpdatedAt = gtime.New(log.UpdatedAt).Format("Y-m-d H:i:s") return &logInfo, nil } // List 查询操作日志列表 func (s *operationLog) List(ctx context.Context, filter interface{}, sortFields ...string) ([]dto.OperationLogInfo, int64, error) { logs, total, err := dao.Log.List(ctx, filter, sortFields...) if err != nil { return nil, 0, err } var logInfos []dto.OperationLogInfo err = gconv.Slice(logs, &logInfos) if err != nil { return nil, 0, err } // 处理特殊字段 for i, log := range logs { logInfos[i].ID = log.Id.Hex() logInfos[i].CreatedAt = gtime.New(log.CreatedAt).Format("Y-m-d H:i:s") logInfos[i].UpdatedAt = gtime.New(log.UpdatedAt).Format("Y-m-d H:i:s") } return logInfos, total, nil } // record 记录操作日志的通用方法 func (s *operationLog) record(ctx context.Context, module, service, operation, resource, resourceID, description string, beforeData, afterData, extraData map[string]interface{}) error { // 获取用户信息 user, err := utils.GetUserInfo(ctx) if err != nil { return err } // 获取请求信息 ipAddress, userAgent := getHTTPRequestInfo(ctx) var userName string if user.UserName != nil { userName = gconv.String(user.UserName) } log := &logEntity.OperationLog{ Module: module, Service: service, Operation: operation, Resource: resource, ResourceID: resourceID, UserID: user.UserName, UserName: userName, IPAddress: ipAddress, UserAgent: userAgent, Description: description, BeforeData: beforeData, AfterData: afterData, ExtraData: extraData, } return dao.Log.Create(ctx, log) } // getHTTPRequestInfo 从上下文中获取HTTP请求信息 func getHTTPRequestInfo(ctx context.Context) (ipAddress, userAgent string) { request := g.RequestFromCtx(ctx) if request != nil { return request.GetClientIp(), request.Header.Get("User-Agent") } return "", "" }