Files
EasyGoAdmin_GoFrame_EleVue/internal/logic/login_log.go
T
2026-10-20 11:37:25 +08:00

110 lines
3.7 KiB
Go

package logic
import (
"context"
"github.com/gogf/gf/v2/database/gdb"
"easygoadmin/api/v1"
"easygoadmin/internal/dao"
"easygoadmin/internal/service"
)
// ============================== 登录日志业务实现 ==============================
// sLoginLog 登录日志业务实现
// 实现 service.ILoginLog 接口,承载登录日志模块的业务逻辑
type sLoginLog struct{}
// loginLogSerializeMaps 枚举字段到字典编码的映射
// {field}Text 由 dict_item 解析,字典管理页可修改文案
var loginLogSerializeMaps = map[string]string{
"log_type": "login_log_log_type",
"source": "login_log_source",
"status": "login_log_status",
}
// loginLogSpec 登录日志模块声明
var loginLogSpec = ModuleSpec[v1.LoginLogItem, v1.LoginLogItem, v1.LoginLogDetailRes]{
Model: dao.LoginLog.Ctx,
LikeFields: []string{"username"},
EqFields: []string{"log_type", "status"},
OrderBy: "id DESC",
SerializeMaps: loginLogSerializeMaps,
}
func init() {
service.RegisterLoginLog(&sLoginLog{})
}
// Page 登录日志分页
// 按查询条件分页返回登录日志列表
func (s *sLoginLog) Page(ctx context.Context, req *v1.LoginLogPageReq) (res *v1.LoginLogPageRes, err error) {
list, total, err := loginLogSpec.Page(ctx, req, req.GetPageNo(), req.GetPageSize())
if err != nil {
return nil, err
}
return v1.NewPageData(req.GetPageNo(), req.GetPageSize(), total, derefSlice(list)), nil
}
// List 登录日志全量列表
// 按关键词、类型、状态等条件返回登录日志列表
func (s *sLoginLog) List(ctx context.Context, req *v1.LoginLogListReq) (res v1.LoginLogListRes, err error) {
list, err := loginLogSpec.List(ctx, req)
if err != nil {
return nil, err
}
return derefSlice(list), nil
}
// Detail 登录日志详情
// 按日志ID查询详情
func (s *sLoginLog) Detail(ctx context.Context, req *v1.LoginLogDetailReq) (res *v1.LoginLogDetailRes, err error) {
return loginLogSpec.Detail(ctx, req.Id, req)
}
// Delete 删除登录日志
// 按日志ID删除单条记录
func (s *sLoginLog) Delete(ctx context.Context, req *v1.LoginLogDeleteReq) (res *v1.LoginLogDeleteRes, err error) {
if err = loginLogSpec.Delete(ctx, req.Id); err != nil {
return nil, err
}
return &v1.LoginLogDeleteRes{}, nil
}
// BatchDelete 批量删除登录日志
// 按日志ID列表批量删除记录
func (s *sLoginLog) BatchDelete(ctx context.Context, req *v1.LoginLogBatchDeleteReq) (res *v1.LoginLogBatchDeleteRes, err error) {
if err = loginLogSpec.BatchDelete(ctx, req.Ids); err != nil {
return nil, err
}
return &v1.LoginLogBatchDeleteRes{}, nil
}
// toItem 数据库记录转换为登录日志行数据
// 枚举字段同步补全对应文本
func (s *sLoginLog) toItem(ctx context.Context, r gdb.Record) v1.LoginLogItem {
return v1.LoginLogItem{
Id: r["id"].Int64(),
Username: r["username"].String(),
LogType: r["log_type"].Int(),
LogTypeText: DictGetText(ctx, loginLogSerializeMaps["log_type"], r["log_type"].Int()),
Source: r["source"].Int(),
SourceText: DictGetText(ctx, loginLogSerializeMaps["source"], r["source"].Int()),
Method: r["method"].String(),
RequestMethod: r["request_method"].String(),
Url: r["url"].String(),
Param: r["param"].String(),
Result: r["result"].String(),
Ip: r["ip"].String(),
Location: r["location"].String(),
Os: r["os"].String(),
Browser: r["browser"].String(),
ConsumeTime: r["consume_time"].Int64(),
Status: r["status"].Int(),
StatusText: DictGetText(ctx, loginLogSerializeMaps["status"], r["status"].Int()),
Error: r["error"].String(),
CreateTime: r["create_time"].GTime(),
}
}