package data import ( "context" "time" "kra/internal/biz" "gorm.io/gorm" ) type loginLogPO struct { ID uint `gorm:"primaryKey"` CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt `gorm:"index"` Username, IP string Status bool ErrorMessage, Agent string UserID uint } func (loginLogPO) TableName() string { return "sys_login_logs" } func (r *auditRepo) RecordLogin(ctx context.Context, v *biz.LoginLog) error { return r.data.gormDB.WithContext(ctx).Create(&loginLogPO{Username: v.Username, IP: v.IP, Status: v.Status, ErrorMessage: v.ErrorMessage, Agent: v.Agent, UserID: v.UserID}).Error } func loginFromPO(v loginLogPO) *biz.LoginLog { return &biz.LoginLog{ID: v.ID, CreatedAt: v.CreatedAt, Username: v.Username, IP: v.IP, Status: v.Status, ErrorMessage: v.ErrorMessage, Agent: v.Agent, UserID: v.UserID} } func (r *auditRepo) ListLogins(ctx context.Context, page, size int, q *biz.LoginLog) ([]*biz.LoginLog, int64, error) { if page < 1 { page = 1 } if size < 1 { size = 10 } db := r.data.gormDB.WithContext(ctx).Model(&loginLogPO{}) if q != nil { if q.Username != "" { db = db.Where("username LIKE ?", "%"+q.Username+"%") } if q.IP != "" { db = db.Where("ip LIKE ?", "%"+q.IP+"%") } } var total int64 if err := db.Count(&total).Error; err != nil { return nil, 0, err } var pos []loginLogPO if err := db.Order("id desc").Offset((page - 1) * size).Limit(size).Find(&pos).Error; err != nil { return nil, 0, err } out := make([]*biz.LoginLog, 0, len(pos)) for _, po := range pos { out = append(out, loginFromPO(po)) } return out, total, nil } func (r *auditRepo) FindLogin(ctx context.Context, id uint) (*biz.LoginLog, error) { var po loginLogPO if err := r.data.gormDB.WithContext(ctx).First(&po, id).Error; err != nil { return nil, err } return loginFromPO(po), nil } func (r *auditRepo) DeleteLogins(ctx context.Context, ids []uint) error { return r.data.gormDB.WithContext(ctx).Delete(&loginLogPO{}, ids).Error }