更新
This commit is contained in:
@@ -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 登录日志详情
|
||||
|
||||
Reference in New Issue
Block a user