103 lines
2.4 KiB
Go
103 lines
2.4 KiB
Go
package sqlite
|
||
|
||
import (
|
||
"fmt"
|
||
|
||
"git.zkcoi.com/zkcoi/meshray/internal/model"
|
||
"github.com/glebarez/sqlite"
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
// Store SQLite 存储实现(基于 GORM + glebarez/sqlite)
|
||
type Store struct {
|
||
db *gorm.DB
|
||
}
|
||
|
||
// New 创建 Store 实例
|
||
func New(dbPath string) (*Store, error) {
|
||
// 使用 glebarez/sqlite(纯Go 实现,无需 CGO)
|
||
// 这是 modernc.org/sqlite 的 GORM 适配层
|
||
db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
|
||
if err != nil {
|
||
return nil, fmt.Errorf("初始化数据库失败:%w", err)
|
||
}
|
||
|
||
store := &Store{db: db}
|
||
|
||
// 自动迁移所有表
|
||
if err := store.AutoMigrate(); err != nil {
|
||
return nil, fmt.Errorf("数据库迁移失败:%w", err)
|
||
}
|
||
|
||
// 初始化默认系统设置
|
||
if err := store.initDefaultSettings(); err != nil {
|
||
return nil, fmt.Errorf("初始化系统设置失败:%w", err)
|
||
}
|
||
|
||
return store, nil
|
||
}
|
||
|
||
// AutoMigrate 自动创建所有数据表
|
||
func (s *Store) AutoMigrate() error {
|
||
return s.db.AutoMigrate(
|
||
&model.Network{},
|
||
&model.Device{},
|
||
&model.Policy{},
|
||
&model.Service{},
|
||
&model.MeshSeed{},
|
||
&model.PendingJoin{},
|
||
&model.AlertRule{},
|
||
&model.AuditLog{},
|
||
&model.User{},
|
||
&model.SystemConfig{},
|
||
&model.DDNSConfig{},
|
||
&model.NetworkMember{},
|
||
&model.SecurityKey{}, // 新增:安全密钥表
|
||
&model.SystemSetting{}, // 新增:系统设置表
|
||
&model.ExternalService{}, // 新增:外部服务表
|
||
&model.DDNSProvider{}, // 新增:DDNS 服务商配置
|
||
&model.DDNSUsage{}, // 新增:DDNS 用途定义
|
||
&model.NetworkDDNSBinding{}, // 新增:网络 DDNS 绑定
|
||
&model.Notification{}, // 新增:通知表
|
||
)
|
||
}
|
||
|
||
// initDefaultSettings 初始化默认系统设置
|
||
func (s *Store) initDefaultSettings() error {
|
||
// 检查是否已有系统设置
|
||
var count int64
|
||
if err := s.db.Model(&model.SystemSetting{}).Count(&count).Error; err != nil {
|
||
return err
|
||
}
|
||
|
||
// 如果没有记录,创建默认设置
|
||
if count == 0 {
|
||
return s.db.Create(&model.SystemSetting{
|
||
ID: 1,
|
||
ServerPort: 51820,
|
||
LogLevel: "info",
|
||
LogFormat: "console",
|
||
MaxBackups: 7,
|
||
MaxAge: 30,
|
||
Theme: "light",
|
||
Language: "zh-CN",
|
||
}).Error
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
// DB 获取 GORM 数据库连接
|
||
func (s *Store) DB() *gorm.DB {
|
||
return s.db
|
||
}
|
||
|
||
// Close 关闭数据库连接
|
||
func (s *Store) Close() error {
|
||
sqlDB, err := s.db.DB()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
return sqlDB.Close()
|
||
}
|