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
+48 -1
View File
@@ -49,6 +49,7 @@ import (
"easygoadmin/api/v1"
"easygoadmin/internal/dao"
"easygoadmin/internal/service"
"easygoadmin/utility/upload"
)
// ============================== 登录日志业务实现 ==============================
@@ -72,6 +73,44 @@ var loginLogSpec = ModuleSpec[v1.LoginLogItem, v1.LoginLogItem, v1.LoginLogDetai
EqFields: []string{"log_type", "status"},
OrderBy: "id DESC",
SerializeMaps: loginLogSerializeMaps,
// 头像按登录账号用户名回查补齐(失败登录无对应用户时留空)
AfterPageList: func(ctx context.Context, list []*v1.LoginLogItem, req any) error {
return fillLoginLogAvatars(ctx, list)
},
AfterDetail: func(ctx context.Context, item *v1.LoginLogDetailRes, req any) error {
return fillLoginLogAvatars(ctx, []*v1.LoginLogItem{&item.LoginLogItem})
},
}
// fillLoginLogAvatars 按登录账号用户名批量查询并回填头像
//
// 日志表不冗余存头像:读侧将用户名去重后一次 IN 查询用户表的
// username/avatar 相对路径,经 upload.GetFileUrl 补全访问域名;
// 查询失败原样上抛。无有效用户名或用户不存在(登录失败记录)时留空。
func fillLoginLogAvatars(ctx context.Context, items []*v1.LoginLogItem) error {
nameMap := map[string]bool{}
names := make([]string, 0, len(items))
for _, it := range items {
if it.Username != "" && !nameMap[it.Username] {
nameMap[it.Username] = true
names = append(names, it.Username)
}
}
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].Username]
}
return nil
}
func init() {
@@ -95,7 +134,15 @@ func (s *sLoginLog) List(ctx context.Context, req *v1.LoginLogListReq) (res v1.L
if err != nil {
return nil, err
}
return derefSlice(list), nil
rows := derefSlice(list)
ptrs := make([]*v1.LoginLogItem, len(rows))
for i := range rows {
ptrs[i] = &rows[i]
}
if err := fillLoginLogAvatars(ctx, ptrs); err != nil {
return nil, err
}
return rows, nil
}
// Detail 登录日志详情