Files
GPT_Management/backend/internal/db/db.go
sar 8d60704eda feat: 实现前端卡密管理界面
- 卡密列表展示与分页功能

- 单个/批量创建卡密

- 卡密删除与批量删除

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

- 启用/禁用状态切换

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

- Toast 通知系统 (vue-sonner)

- 登录页面错误提示优化

- 后端登录错误消息中文化
2026-01-13 21:34:56 +08:00

100 lines
1.9 KiB
Go

package db
import (
"database/sql"
"fmt"
"log"
"os"
"time"
_ "github.com/lib/pq"
)
var DB *sql.DB
// Config 数据库配置
type Config struct {
Host string
Port int
User string
Password string
DBName string
SSLMode string
}
// DefaultConfig 从环境变量读取默认配置
func DefaultConfig() Config {
return Config{
Host: getEnv("DB_HOST", "localhost"),
Port: getEnvInt("DB_PORT", 5432),
User: getEnv("DB_USER", "postgres"),
Password: getEnv("DB_PASSWORD", ""),
DBName: getEnv("DB_NAME", "gpt_manager"),
SSLMode: getEnv("DB_SSLMODE", "disable"),
}
}
// Connect 连接数据库
func Connect(cfg Config) (*sql.DB, error) {
dsn := fmt.Sprintf(
"host=%s port=%d user=%s password=%s dbname=%s sslmode=%s",
cfg.Host, cfg.Port, cfg.User, cfg.Password, cfg.DBName, cfg.SSLMode,
)
db, err := sql.Open("postgres", dsn)
if err != nil {
return nil, fmt.Errorf("failed to open database: %w", err)
}
// 配置连接池
db.SetMaxOpenConns(25)
db.SetMaxIdleConns(5)
db.SetConnMaxLifetime(5 * time.Minute)
// 测试连接
if err := db.Ping(); err != nil {
return nil, fmt.Errorf("failed to ping database: %w", err)
}
log.Println("Database connected successfully")
return db, nil
}
// Init 初始化全局数据库连接
func Init() error {
cfg := DefaultConfig()
db, err := Connect(cfg)
if err != nil {
return err
}
DB = db
return nil
}
// Close 关闭数据库连接
func Close() error {
if DB != nil {
return DB.Close()
}
return nil
}
// getEnv 获取环境变量,带默认值
func getEnv(key, defaultVal string) string {
if val := os.Getenv(key); val != "" {
return val
}
return defaultVal
}
// getEnvInt 获取整数类型环境变量
func getEnvInt(key string, defaultVal int) int {
if val := os.Getenv(key); val != "" {
var i int
if _, err := fmt.Sscanf(val, "%d", &i); err == nil {
return i
}
}
return defaultVal
}