feat: 实现前端卡密管理界面
- 卡密列表展示与分页功能 - 单个/批量创建卡密 - 卡密删除与批量删除 - 卡密导出功能 (file-saver) - 启用/禁用状态切换 - 状态判断 (有效/已使用/已失效) - Toast 通知系统 (vue-sonner) - 登录页面错误提示优化 - 后端登录错误消息中文化
This commit is contained in:
120
backend/internal/repository/admin_repo.go
Normal file
120
backend/internal/repository/admin_repo.go
Normal file
@@ -0,0 +1,120 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user