更新
This commit is contained in:
@@ -48,6 +48,7 @@ import (
|
||||
"easygoadmin/internal/dao"
|
||||
"easygoadmin/internal/middleware"
|
||||
"easygoadmin/internal/service"
|
||||
"easygoadmin/utility/upload"
|
||||
)
|
||||
|
||||
// ============================== 操作日志业务实现 ==============================
|
||||
@@ -70,19 +71,50 @@ var operLogSpec = ModuleSpec[v1.OperLogItem, v1.OperLogItem, v1.OperLogDetailRes
|
||||
EqFields: []string{"type", "status"},
|
||||
OrderBy: "id DESC",
|
||||
SerializeMaps: operLogSerializeMaps,
|
||||
// typeText 走静态映射(注解常量值,与字典体系无关)
|
||||
// typeText 走静态映射(标签常量值,与字典体系无关);头像按操作人用户名回查补齐
|
||||
AfterPageList: func(ctx context.Context, list []*v1.OperLogItem, req any) error {
|
||||
for _, item := range list {
|
||||
item.TypeText = LogTypeText(item.Type)
|
||||
}
|
||||
return nil
|
||||
return fillOperLogAvatars(ctx, list)
|
||||
},
|
||||
AfterDetail: func(ctx context.Context, item *v1.OperLogDetailRes, req any) error {
|
||||
item.TypeText = LogTypeText(item.Type)
|
||||
return nil
|
||||
return fillOperLogAvatars(ctx, []*v1.OperLogItem{&item.OperLogItem})
|
||||
},
|
||||
}
|
||||
|
||||
// fillOperLogAvatars 按操作人用户名批量查询并回填头像
|
||||
//
|
||||
// 日志表只落 create_user(用户名),头像不冗余存储:读侧将用户名去重后
|
||||
// 一次 IN 查询用户表的 username/avatar 相对路径,经 upload.GetFileUrl
|
||||
// 补全访问域名;查询失败原样上抛。无有效用户名(未认证请求)时直接返回。
|
||||
func fillOperLogAvatars(ctx context.Context, items []*v1.OperLogItem) error {
|
||||
nameMap := map[string]bool{}
|
||||
names := make([]string, 0, len(items))
|
||||
for _, it := range items {
|
||||
if it.CreateUser != "" && !nameMap[it.CreateUser] {
|
||||
nameMap[it.CreateUser] = true
|
||||
names = append(names, it.CreateUser)
|
||||
}
|
||||
}
|
||||
if len(names) == 0 {
|
||||
return nil
|
||||
}
|
||||
rows, err := dao.User.Ctx(ctx).WhereIn("username", names).Fields("username, avatar").All()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
avatarMap := make(map[string]string, len(rows))
|
||||
for _, r := range rows {
|
||||
avatarMap[r["username"].String()] = upload.GetFileUrl(ctx, r["avatar"].String())
|
||||
}
|
||||
for i := range items {
|
||||
items[i].Avatar = avatarMap[items[i].CreateUser]
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterOperLog(&sOperLog{})
|
||||
// 操作日志中间件落库接线(异步批量,见 middleware/operation_log.go)
|
||||
@@ -131,10 +163,16 @@ func (s *sOperLog) List(ctx context.Context, req *v1.OperLogListReq) (res v1.Ope
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for _, item := range list {
|
||||
item.TypeText = LogTypeText(item.Type)
|
||||
rows := derefSlice(list)
|
||||
ptrs := make([]*v1.OperLogItem, len(rows))
|
||||
for i := range rows {
|
||||
rows[i].TypeText = LogTypeText(rows[i].Type)
|
||||
ptrs[i] = &rows[i]
|
||||
}
|
||||
return derefSlice(list), nil
|
||||
if err := fillOperLogAvatars(ctx, ptrs); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rows, nil
|
||||
}
|
||||
|
||||
// Detail 操作日志详情
|
||||
|
||||
Reference in New Issue
Block a user