package repository import ( "database/sql" "time" "gpt-manager-go/internal/models" ) // AdminRepository 管理员仓储 type AdminRepository struct { db *sql.DB } // NewAdminRepository 创建管理员仓储 func NewAdminRepository(db *sql.DB) *AdminRepository { return &AdminRepository{db: db} } // FindByUsername 根据用户名查找管理员 func (r *AdminRepository) FindByUsername(username string) (*models.Admin, error) { admin := &models.Admin{} err := r.db.QueryRow(` SELECT id, username, email, password_hash, is_super_admin, is_active, created_at, last_login FROM admins WHERE username = $1 `, username).Scan( &admin.ID, &admin.Username, &admin.Email, &admin.PasswordHash, &admin.IsSuperAdmin, &admin.IsActive, &admin.CreatedAt, &admin.LastLogin, ) if err == sql.ErrNoRows { return nil, nil } if err != nil { return nil, err } return admin, nil } // FindByEmail 根据邮箱查找管理员 func (r *AdminRepository) FindByEmail(email string) (*models.Admin, error) { admin := &models.Admin{} err := r.db.QueryRow(` SELECT id, username, email, password_hash, is_super_admin, is_active, created_at, last_login FROM admins WHERE email = $1 `, email).Scan( &admin.ID, &admin.Username, &admin.Email, &admin.PasswordHash, &admin.IsSuperAdmin, &admin.IsActive, &admin.CreatedAt, &admin.LastLogin, ) if err == sql.ErrNoRows { return nil, nil } if err != nil { return nil, err } return admin, nil } // FindByID 根据 ID 查找管理员 func (r *AdminRepository) FindByID(id int) (*models.Admin, error) { admin := &models.Admin{} err := r.db.QueryRow(` SELECT id, username, email, password_hash, is_super_admin, is_active, created_at, last_login FROM admins WHERE id = $1 `, id).Scan( &admin.ID, &admin.Username, &admin.Email, &admin.PasswordHash, &admin.IsSuperAdmin, &admin.IsActive, &admin.CreatedAt, &admin.LastLogin, ) if err == sql.ErrNoRows { return nil, nil } if err != nil { return nil, err } return admin, nil } // Create 创建管理员 func (r *AdminRepository) Create(admin *models.Admin) error { return r.db.QueryRow(` INSERT INTO admins (username, email, password_hash, is_super_admin, is_active, created_at) VALUES ($1, $2, $3, $4, $5, $6) RETURNING id `, admin.Username, admin.Email, admin.PasswordHash, admin.IsSuperAdmin, admin.IsActive, time.Now(), ).Scan(&admin.ID) } // UpdateLastLogin 更新最后登录时间 func (r *AdminRepository) UpdateLastLogin(id int) error { _, err := r.db.Exec(` UPDATE admins SET last_login = $1 WHERE id = $2 `, time.Now(), id) return err }