Files
Go-Web-Template/server/api/v1/admin/app_login_logs.go
2026-04-23 15:29:07 +08:00

139 lines
3.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}