feat: 实现前端卡密管理界面

- 卡密列表展示与分页功能

- 单个/批量创建卡密

- 卡密删除与批量删除

- 卡密导出功能 (file-saver)

- 启用/禁用状态切换

- 状态判断 (有效/已使用/已失效)

- Toast 通知系统 (vue-sonner)

- 登录页面错误提示优化

- 后端登录错误消息中文化
This commit is contained in:
sar
2026-01-13 21:34:56 +08:00
parent 42c423bd32
commit 8d60704eda
143 changed files with 6646 additions and 91 deletions

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