This commit is contained in:
2026-01-14 14:17:38 +08:00
commit f1e2ff6563
126 changed files with 13636 additions and 0 deletions

View File

@@ -0,0 +1,91 @@
package database
import (
"fmt"
"ssq-desk/internal/storage/models"
"sync"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var (
mysqlDB *gorm.DB
mysqlOnce sync.Once
)
// MySQLConfig MySQL 连接配置
type MySQLConfig struct {
Host string
Port int
User string
Password string
Database string
}
// GetMySQLConfig 获取 MySQL 配置(从配置文件或环境变量)
func GetMySQLConfig() *MySQLConfig {
return &MySQLConfig{
Host: "39.99.243.191",
Port: 3306,
User: "u_ssq",
Password: "u_ssq@260106",
Database: "ssq_dev", // 需要根据实际情况修改数据库名
}
}
// InitMySQL 初始化 MySQL 连接
func InitMySQL() (*gorm.DB, error) {
var err error
mysqlOnce.Do(func() {
config := GetMySQLConfig()
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
config.User, config.Password, config.Host, config.Port, config.Database)
mysqlDB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
return
}
// 测试连接
sqlDB, err2 := mysqlDB.DB()
if err2 != nil {
err = err2
return
}
if err2 = sqlDB.Ping(); err2 != nil {
err = err2
return
}
// 自动迁移表结构
err2 = mysqlDB.AutoMigrate(
&models.SsqHistory{},
&models.Authorization{},
&models.Version{},
)
if err2 != nil {
err = fmt.Errorf("MySQL 表迁移失败: %v", err2)
return
}
})
if err != nil {
return nil, fmt.Errorf("MySQL 连接初始化失败: %v", err)
}
return mysqlDB, nil
}
// GetMySQL 获取 MySQL 连接实例
func GetMySQL() *gorm.DB {
if mysqlDB == nil {
db, err := InitMySQL()
if err != nil {
return nil
}
return db
}
return mysqlDB
}

102
internal/database/sqlite.go Normal file
View File

@@ -0,0 +1,102 @@
package database
import (
"database/sql"
"fmt"
"os"
"path/filepath"
"sync"
"ssq-desk/internal/storage/models"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
_ "modernc.org/sqlite" // 使用纯 Go 的 SQLite 驱动(不需要 CGO
)
var (
sqliteDB *gorm.DB
sqliteOnce sync.Once
)
// InitSQLite 初始化 SQLite 连接
func InitSQLite() (*gorm.DB, error) {
var err error
sqliteOnce.Do(func() {
// 获取应用数据目录
homeDir, err2 := os.UserHomeDir()
if err2 != nil {
err = fmt.Errorf("获取用户目录失败: %v", err2)
return
}
// 创建数据目录
dataDir := filepath.Join(homeDir, ".ssq-desk")
if err2 := os.MkdirAll(dataDir, 0755); err2 != nil {
err = fmt.Errorf("创建数据目录失败: %v", err2)
return
}
// SQLite 数据库文件路径
dbPath := filepath.Join(dataDir, "ssq.db")
// 直接使用 database/sql 打开连接,确保使用 modernc.org/sqlite纯 Go不需要 CGO
sqlDB, err2 := sql.Open("sqlite", dbPath)
if err2 != nil {
err = fmt.Errorf("SQLite 打开连接失败: %v", err2)
sqliteDB = nil
return
}
// 测试连接
if err2 = sqlDB.Ping(); err2 != nil {
err = fmt.Errorf("SQLite 连接测试失败: %v", err2)
sqlDB.Close()
sqliteDB = nil
return
}
// 使用已打开的 database/sql 连接创建 GORM 实例
// 使用 sqlite.Dialector 并指定连接
sqliteDB, err2 = gorm.Open(sqlite.Dialector{Conn: sqlDB}, &gorm.Config{})
if err2 != nil {
err = fmt.Errorf("SQLite GORM 初始化失败: %v", err2)
sqlDB.Close()
sqliteDB = nil
return
}
// 自动迁移表结构如果表已存在但结构不对AutoMigrate 会尝试修改)
// 如果表结构完全不匹配,可能需要手动删除旧表
err2 = sqliteDB.AutoMigrate(
&models.SsqHistory{},
&models.Authorization{},
&models.Version{},
)
if err2 != nil {
err = fmt.Errorf("SQLite 表迁移失败: %v", err2)
sqliteDB = nil
return
}
})
if err != nil {
return nil, err
}
return sqliteDB, nil
}
// GetSQLite 获取 SQLite 连接实例
// 如果连接未初始化或初始化失败,返回 nil
func GetSQLite() *gorm.DB {
if sqliteDB == nil {
db, err := InitSQLite()
if err != nil {
// 初始化失败,返回 nil
return nil
}
sqliteDB = db
}
return sqliteDB
}