Merge branch 'test'

This commit is contained in:
2026-07-30 12:48:29 +08:00
12 changed files with 735 additions and 292 deletions
+14 -46
View File
@@ -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(`