common增加通用log模块
This commit is contained in:
121
log/service/log_service.go
Normal file
121
log/service/log_service.go
Normal file
@@ -0,0 +1,121 @@
|
||||
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 "", ""
|
||||
}
|
||||
Reference in New Issue
Block a user