Merge branch 'test'
This commit is contained in:
@@ -17,17 +17,7 @@ import (
|
||||
|
||||
var DB *sql.DB
|
||||
|
||||
// ============================================================
|
||||
// 数据库版本常量
|
||||
// ============================================================
|
||||
|
||||
const (
|
||||
SchemaVersion = "v2" // 当前数据库 Schema 版本
|
||||
)
|
||||
|
||||
// ============================================================
|
||||
// 数据模型
|
||||
// ============================================================
|
||||
const SchemaVersion = "v2"
|
||||
|
||||
type GlobalConfig struct {
|
||||
ID int `json:"id"`
|
||||
@@ -61,12 +51,21 @@ type User struct {
|
||||
CreatedAt string `json:"createdAt"`
|
||||
}
|
||||
|
||||
<<<<<<< HEAD
|
||||
// ============================================================
|
||||
// 数据库初始化
|
||||
|
||||
=======
|
||||
>>>>>>> test
|
||||
func InitDB() error {
|
||||
// 确保 data 目录存在
|
||||
if err := os.MkdirAll("./data", 0755); err != nil {
|
||||
return fmt.Errorf("创建数据目录失败: %w", err)
|
||||
}
|
||||
|
||||
dbPath := "./data/frpc-console.db"
|
||||
var err error
|
||||
DB, err = sql.Open("sqlite", "./frpc-console.db")
|
||||
DB, err = sql.Open("sqlite", dbPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -87,12 +86,7 @@ func InitDB() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// 建表
|
||||
// ============================================================
|
||||
|
||||
func createTables() error {
|
||||
// 用户表
|
||||
_, err := DB.Exec(`
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
@@ -106,7 +100,6 @@ func createTables() error {
|
||||
return err
|
||||
}
|
||||
|
||||
// 全局配置表
|
||||
_, err = DB.Exec(`
|
||||
CREATE TABLE IF NOT EXISTS global_config (
|
||||
id INTEGER PRIMARY KEY CHECK (id = 1),
|
||||
@@ -128,7 +121,6 @@ func createTables() error {
|
||||
return err
|
||||
}
|
||||
|
||||
// 隧道表
|
||||
_, err = DB.Exec(`
|
||||
CREATE TABLE IF NOT EXISTS proxies (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
@@ -146,7 +138,6 @@ func createTables() error {
|
||||
return err
|
||||
}
|
||||
|
||||
// 应用配置表
|
||||
_, err = DB.Exec(`
|
||||
CREATE TABLE IF NOT EXISTS app_config (
|
||||
key TEXT PRIMARY KEY,
|
||||
@@ -158,7 +149,6 @@ func createTables() error {
|
||||
return err
|
||||
}
|
||||
|
||||
// 初始化默认配置
|
||||
var count int
|
||||
DB.QueryRow("SELECT COUNT(*) FROM global_config").Scan(&count)
|
||||
if count == 0 {
|
||||
@@ -178,10 +168,6 @@ func createTables() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// 迁移引擎
|
||||
// ============================================================
|
||||
|
||||
func getCurrentSchemaVersion() string {
|
||||
var version string
|
||||
err := DB.QueryRow("SELECT value FROM app_config WHERE key = 'schema_version'").Scan(&version)
|
||||
@@ -209,13 +195,13 @@ func setSchemaVersion(version string) error {
|
||||
}
|
||||
|
||||
func backupDatabase() (string, error) {
|
||||
src := "./frpc-console.db"
|
||||
src := "./data/frpc-console.db"
|
||||
if _, err := os.Stat(src); os.IsNotExist(err) {
|
||||
return "", nil
|
||||
}
|
||||
|
||||
timestamp := time.Now().Format("20060102_150405")
|
||||
dst := fmt.Sprintf("./frpc-console.db.pre-%s.%s", SchemaVersion, timestamp)
|
||||
dst := fmt.Sprintf("./data/frpc-console.db.pre-%s.%s", SchemaVersion, timestamp)
|
||||
|
||||
srcFile, err := os.Open(src)
|
||||
if err != nil {
|
||||
@@ -244,7 +230,7 @@ func restoreDatabase(backupPath string) error {
|
||||
}
|
||||
defer srcFile.Close()
|
||||
|
||||
dstFile, err := os.Create("./frpc-console.db")
|
||||
dstFile, err := os.Create("./data/frpc-console.db")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -265,7 +251,6 @@ func runMigrations() error {
|
||||
log.Printf("📌 当前数据库 Schema: %s, 目标版本: %s", currentVer, targetVer)
|
||||
|
||||
if currentVer == targetVer {
|
||||
// 检查数据库是否包含有效数据
|
||||
var userCount int
|
||||
err := DB.QueryRow("SELECT COUNT(*) FROM users").Scan(&userCount)
|
||||
if err != nil || userCount == 0 {
|
||||
@@ -295,7 +280,6 @@ func runMigrations() error {
|
||||
|
||||
if currentSchema == nil || schemaVersionsEqual(currentSchema, targetSchema) {
|
||||
log.Println(" 迁移类型: 轻量复制(Schema 无变更)")
|
||||
// 验证数据库是否有效
|
||||
var userCount int
|
||||
err := DB.QueryRow("SELECT COUNT(*) FROM users").Scan(&userCount)
|
||||
if err != nil || userCount == 0 {
|
||||
@@ -441,10 +425,6 @@ func buildInsertSQL(oldTable, newTable string, oldDef, newDef *SchemaVersionDef)
|
||||
), nil
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// JWT 密钥管理
|
||||
// ============================================================
|
||||
|
||||
func ensureJwtSecret() error {
|
||||
var value string
|
||||
err := DB.QueryRow("SELECT value FROM app_config WHERE key = 'jwt_secret'").Scan(&value)
|
||||
@@ -477,10 +457,6 @@ func GetJwtSecret() (string, error) {
|
||||
return secret, nil
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// 全局配置 CRUD
|
||||
// ============================================================
|
||||
|
||||
func GetGlobalConfig() (*GlobalConfig, error) {
|
||||
var cfg GlobalConfig
|
||||
err := DB.QueryRow(`
|
||||
@@ -516,10 +492,6 @@ func UpdateGlobalConfig(cfg *GlobalConfig) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// 隧道 CRUD
|
||||
// ============================================================
|
||||
|
||||
func GetProxies() ([]Proxy, error) {
|
||||
rows, err := DB.Query(`
|
||||
SELECT id, name, type, local_ip, local_port, remote_port, enabled
|
||||
@@ -582,10 +554,6 @@ func DeleteProxy(id int) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// 用户 CRUD
|
||||
// ============================================================
|
||||
|
||||
func GetUserByUsername(username string) (*User, error) {
|
||||
var u User
|
||||
err := DB.QueryRow(`
|
||||
|
||||
Reference in New Issue
Block a user