93 lines
2.2 KiB
Go
93 lines
2.2 KiB
Go
package services
|
|
|
|
import (
|
|
"github.com/goravel/framework/facades"
|
|
|
|
apperrors "goravel/app/errors"
|
|
"goravel/app/http/helpers"
|
|
"goravel/app/models"
|
|
)
|
|
|
|
type LoginLogService interface {
|
|
// GetByID 根据ID获取登录日志
|
|
GetByID(id uint, withAdmin bool) (*models.LoginLog, error)
|
|
// GetList 获取登录日志列表
|
|
GetList(filters LoginLogFilters, page, pageSize int) ([]models.LoginLog, int64, error)
|
|
}
|
|
|
|
// LoginLogFilters 登录日志查询过滤器
|
|
type LoginLogFilters struct {
|
|
AdminID string
|
|
Username string
|
|
IP string
|
|
Status string
|
|
StartTime string
|
|
EndTime string
|
|
OrderBy string
|
|
}
|
|
|
|
type LoginLogServiceImpl struct {
|
|
}
|
|
|
|
func NewLoginLogService() LoginLogService {
|
|
return &LoginLogServiceImpl{}
|
|
}
|
|
|
|
// GetByID 根据ID获取登录日志
|
|
func (s *LoginLogServiceImpl) GetByID(id uint, withAdmin bool) (*models.LoginLog, error) {
|
|
var log models.LoginLog
|
|
query := facades.Orm().Query().Where("id", id)
|
|
|
|
// 预加载关联
|
|
if withAdmin {
|
|
query = query.With("Admin")
|
|
}
|
|
|
|
if err := query.FirstOrFail(&log); err != nil {
|
|
return nil, apperrors.ErrLogNotFound.WithError(err)
|
|
}
|
|
|
|
return &log, nil
|
|
}
|
|
|
|
// GetList 获取登录日志列表
|
|
func (s *LoginLogServiceImpl) GetList(filters LoginLogFilters, page, pageSize int) ([]models.LoginLog, int64, error) {
|
|
query := facades.Orm().Query().Model(&models.LoginLog{})
|
|
|
|
// 应用筛选条件
|
|
if filters.AdminID != "" {
|
|
query = query.Where("admin_id", filters.AdminID)
|
|
}
|
|
if filters.Username != "" {
|
|
query = query.Where("username LIKE ?", "%"+filters.Username+"%")
|
|
}
|
|
if filters.IP != "" {
|
|
query = query.Where("ip LIKE ?", "%"+filters.IP+"%")
|
|
}
|
|
if filters.Status != "" {
|
|
query = query.Where("status = ?", filters.Status)
|
|
}
|
|
if filters.StartTime != "" {
|
|
query = query.Where("created_at >= ?", filters.StartTime)
|
|
}
|
|
if filters.EndTime != "" {
|
|
query = query.Where("created_at <= ?", filters.EndTime)
|
|
}
|
|
|
|
// 应用排序
|
|
orderBy := filters.OrderBy
|
|
if orderBy == "" {
|
|
orderBy = "id:desc"
|
|
}
|
|
query = helpers.ApplySort(query, orderBy, "id:desc")
|
|
|
|
// 分页查询
|
|
var logs []models.LoginLog
|
|
var total int64
|
|
if err := query.With("Admin").Paginate(page, pageSize, &logs, &total); err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
return logs, total, nil
|
|
}
|