package admin import ( "strconv" "strings" "time" "git.echol.cn/loser/Go-Web-Template/server/global" appModel "git.echol.cn/loser/Go-Web-Template/server/model/app" "git.echol.cn/loser/Go-Web-Template/server/model/common/response" "github.com/gin-gonic/gin" "gorm.io/gorm" ) type AppLoginLogsApi struct{} type appLoginLogListItem struct { ID uint `json:"id"` AppUserID uint `json:"appUserId"` Username string `json:"username"` IP string `json:"ip"` Referer string `json:"referer,omitempty"` UserAgent string `json:"userAgent,omitempty"` Status bool `json:"status"` ErrorMessage string `json:"errorMessage,omitempty"` CreatedAt time.Time `json:"createdAt"` } type appLoginLogListResponse struct { List []appLoginLogListItem `json:"list"` Total int64 `json:"total"` Page int `json:"page"` PageSize int `json:"pageSize"` } // GetAppLoginLogsList // @Tags AppLoginLogsAdmin // @Summary 后台获取玩家登录日志列表 // @Security ApiKeyAuth // @Produce application/json // @Param page query int true "页码" // @Param pageSize query int true "每页条数" // @Param username query string false "用户名" // @Param ip query string false "IP" // @Param status query bool false "状态:true成功 false失败" // @Param startAt query string false "开始时间(ISO8601/RFC3339)" // @Param endAt query string false "结束时间(ISO8601/RFC3339)" // @Success 200 {object} response.Response{data=appLoginLogListResponse,msg=string} "获取成功" // @Router /admin/app-login-logs [get] func (a *AppLoginLogsApi) GetAppLoginLogsList(c *gin.Context) { page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "10")) if page <= 0 { page = 1 } if pageSize <= 0 || pageSize > 200 { pageSize = 10 } username := strings.TrimSpace(c.Query("username")) ip := strings.TrimSpace(c.Query("ip")) var status *bool if raw := strings.TrimSpace(c.Query("status")); raw != "" { v, err := strconv.ParseBool(raw) if err == nil { status = &v } } var startAt *time.Time if raw := strings.TrimSpace(c.Query("startAt")); raw != "" { if t, err := time.Parse(time.RFC3339, raw); err == nil { startAt = &t } } var endAt *time.Time if raw := strings.TrimSpace(c.Query("endAt")); raw != "" { if t, err := time.Parse(time.RFC3339, raw); err == nil { endAt = &t } } db := global.GVA_DB.Model(&appModel.AppLoginLog{}) if username != "" { db = db.Where("username LIKE ?", "%"+username+"%") } if ip != "" { db = db.Where("ip LIKE ?", "%"+ip+"%") } if status != nil { db = db.Where("status = ?", *status) } if startAt != nil { db = db.Where("created_at >= ?", *startAt) } if endAt != nil { db = db.Where("created_at <= ?", *endAt) } var total int64 if err := db.Count(&total).Error; err != nil { response.FailWithMessage(err.Error(), c) return } var rows []appModel.AppLoginLog if err := db.Order("id DESC").Offset((page - 1) * pageSize).Limit(pageSize).Find(&rows).Error; err != nil { if err == gorm.ErrRecordNotFound { rows = []appModel.AppLoginLog{} } else { response.FailWithMessage(err.Error(), c) return } } items := make([]appLoginLogListItem, 0, len(rows)) for _, r := range rows { items = append(items, appLoginLogListItem{ ID: r.ID, AppUserID: r.AppUserID, Username: r.Username, IP: r.IP, Referer: r.Referer, UserAgent: r.UserAgent, Status: r.Status, ErrorMessage: r.ErrorMessage, CreatedAt: r.CreatedAt, }) } response.OkWithDetailed(appLoginLogListResponse{ List: items, Total: total, Page: page, PageSize: pageSize, }, "获取成功", c) }