This commit is contained in:
小蚂蚁云
2026-10-26 08:46:20 +08:00
parent 276740924a
commit 69f5c1767d
26 changed files with 259 additions and 121 deletions
+44 -6
View File
@@ -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 操作日志详情