package repository import ( "database/sql" "fmt" "log" "strings" "kfz-goods-pricing/internal/database" ) // KfzToken Token记录 type KfzToken struct { ID int64 Username string Password string Token string IsEnable bool } // TokenRepository Token仓储 type TokenRepository struct{} // NewTokenRepository 创建Token仓储实例 func NewTokenRepository() *TokenRepository { return &TokenRepository{} } // BatchInsert 批量插入Token记录 func (r *TokenRepository) BatchInsert(tokens []string, username string) (int64, error) { if len(tokens) == 0 { return 0, nil } // 过滤空字符串 var validTokens []string for _, t := range tokens { t := strings.TrimSpace(t) if t != "" { validTokens = append(validTokens, t) } } if len(validTokens) == 0 { return 0, nil } // 构建批量插入语句 valuePlaceholders := make([]string, len(validTokens)) args := make([]interface{}, 0, len(validTokens)*2) for i, t := range validTokens { valuePlaceholders[i] = "(?, ?, 1)" args = append(args, username, t) } query := fmt.Sprintf("INSERT INTO kfz_token (username, token, is_enable) VALUES %s", strings.Join(valuePlaceholders, ",")) result, err := database.DB.Exec(query, args...) if err != nil { return 0, fmt.Errorf("批量插入失败: %w", err) } id, err := result.LastInsertId() if err != nil { return 0, fmt.Errorf("获取自增ID失败: %w", err) } return id, nil } // Insert 插入单条Token记录(含密码) func (r *TokenRepository) Insert(username, password, token string, isEnable bool) (int64, error) { query := `INSERT INTO kfz_token (username, password, token, is_enable) VALUES (?, ?, ?, ?)` result, err := database.DB.Exec(query, username, password, token, isEnable) if err != nil { return 0, fmt.Errorf("插入失败: %w", err) } id, err := result.LastInsertId() if err != nil { return 0, fmt.Errorf("获取自增ID失败: %w", err) } return id, nil } // UpsertByUsername 根据用户名插入或更新记录(含密码和token) func (r *TokenRepository) UpsertByUsername(username, password, token string) error { // 先查是否存在 var count int err := database.DB.QueryRow("SELECT COUNT(*) FROM kfz_token WHERE username = ?", username).Scan(&count) if err != nil { return fmt.Errorf("查询记录失败: %w", err) } if count == 0 { _, err = database.DB.Exec( `INSERT INTO kfz_token (username, password, token, is_enable) VALUES (?, ?, ?, 1)`, username, password, token, ) } else { _, err = database.DB.Exec( `UPDATE kfz_token SET password = ?, token = ?, is_enable = 1 WHERE username = ?`, password, token, username, ) } if err != nil { return fmt.Errorf("保存Token记录失败: %w", err) } log.Printf("[Repo/Token] 保存Token成功: username=%s", username) return nil } // GetAll 查询所有记录 func (r *TokenRepository) GetAll() ([]*KfzToken, error) { query := `SELECT id, username, token, is_enable FROM kfz_token ORDER BY id ASC` rows, err := database.DB.Query(query) if err != nil { return nil, fmt.Errorf("查询失败: %w", err) } defer rows.Close() var records []*KfzToken for rows.Next() { var rec KfzToken err := rows.Scan(&rec.ID, &rec.Username, &rec.Token, &rec.IsEnable) if err != nil { return nil, fmt.Errorf("扫描失败: %w", err) } records = append(records, &rec) } return records, nil } // GetByID 根据ID查询单条记录 func (r *TokenRepository) GetByID(id int64) (*KfzToken, error) { query := `SELECT id, username, password, token, is_enable FROM kfz_token WHERE id = ?` row := database.DB.QueryRow(query, id) var rec KfzToken err := row.Scan(&rec.ID, &rec.Username, &rec.Password, &rec.Token, &rec.IsEnable) if err != nil { if err == sql.ErrNoRows { return nil, fmt.Errorf("记录不存在") } return nil, fmt.Errorf("查询失败: %w", err) } return &rec, nil } // GetByUsername 根据用户名查询记录(含密码) func (r *TokenRepository) GetByUsername(username string) (*KfzToken, error) { query := `SELECT id, username, password, token, is_enable FROM kfz_token WHERE username = ?` row := database.DB.QueryRow(query, username) var rec KfzToken err := row.Scan(&rec.ID, &rec.Username, &rec.Password, &rec.Token, &rec.IsEnable) if err != nil { if err == sql.ErrNoRows { return nil, nil } return nil, fmt.Errorf("查询失败: %w", err) } return &rec, nil } // Update 更新记录(完整字段) func (r *TokenRepository) Update(id int64, username, password, token string, isEnable bool) error { query := `UPDATE kfz_token SET username = ?, password = ?, token = ?, is_enable = ? WHERE id = ?` result, err := database.DB.Exec(query, username, password, token, isEnable, id) if err != nil { return fmt.Errorf("更新失败: %w", err) } rowsAffected, _ := result.RowsAffected() if rowsAffected == 0 { return fmt.Errorf("记录不存在") } return nil } // UpdateToken 只更新token字段(用于自动重新登录) func (r *TokenRepository) UpdateToken(id int64, token string) error { query := `UPDATE kfz_token SET token = ? WHERE id = ?` result, err := database.DB.Exec(query, token, id) if err != nil { return fmt.Errorf("更新Token失败: %w", err) } rowsAffected, _ := result.RowsAffected() if rowsAffected == 0 { return fmt.Errorf("记录不存在") } log.Printf("[Repo/Token] 更新Token成功: id=%d", id) return nil } // Delete 删除记录 func (r *TokenRepository) Delete(id int64) error { query := `DELETE FROM kfz_token WHERE id = ?` result, err := database.DB.Exec(query, id) if err != nil { return fmt.Errorf("删除失败: %w", err) } rowsAffected, _ := result.RowsAffected() if rowsAffected == 0 { return fmt.Errorf("记录不存在") } return nil } // GetEnabledTokens 获取所有启用状态的Token func (r *TokenRepository) GetEnabledTokens() ([]*KfzToken, error) { query := `SELECT id, username, password, token, is_enable FROM kfz_token WHERE is_enable = 1 ORDER BY id ASC` rows, err := database.DB.Query(query) if err != nil { return nil, fmt.Errorf("查询失败: %w", err) } defer rows.Close() var records []*KfzToken for rows.Next() { var rec KfzToken err := rows.Scan(&rec.ID, &rec.Username, &rec.Password, &rec.Token, &rec.IsEnable) if err != nil { return nil, fmt.Errorf("扫描失败: %w", err) } records = append(records, &rec) } return records, nil }