package db // ================================================================ // 全局配置 // ================================================================ // internal/db/repository.go func GetGlobalConfig() (*GlobalConfig, error) { var cfg GlobalConfig err := DB.QueryRow(` SELECT id, server_addr, server_port, token, admin_port, log_level, log_max_days, tcp_mux, tcp_mux_keepalive, heartbeat_interval, heartbeat_timeout, pool_count, wire_protocol_v2 FROM global_config WHERE id = 1 `).Scan( &cfg.ID, &cfg.ServerAddr, &cfg.ServerPort, &cfg.Token, &cfg.AdminPort, &cfg.LogLevel, &cfg.LogMaxDays, &cfg.TcpMux, &cfg.TcpMuxKeepalive, &cfg.HeartbeatInterval, &cfg.HeartbeatTimeout, &cfg.PoolCount, &cfg.WireProtocolV2, ) if err != nil { return nil, err } cfg.TcpMux = true return &cfg, nil } func UpdateGlobalConfig(cfg *GlobalConfig) error { _, err := DB.Exec(` UPDATE global_config SET server_addr = ?, server_port = ?, token = ?, admin_port = ?, log_level = ?, log_max_days = ?, tcp_mux = 1, tcp_mux_keepalive = ?, heartbeat_interval = ?, heartbeat_timeout = ?, pool_count = ?, wire_protocol_v2 = ?, updated_at = CURRENT_TIMESTAMP WHERE id = 1 `, cfg.ServerAddr, cfg.ServerPort, cfg.Token, cfg.AdminPort, cfg.LogLevel, cfg.LogMaxDays, cfg.TcpMuxKeepalive, cfg.HeartbeatInterval, cfg.HeartbeatTimeout, cfg.PoolCount, cfg.WireProtocolV2) return err } // ================================================================ // 隧道管理 // ================================================================ func GetProxies() ([]Proxy, error) { rows, err := DB.Query(` SELECT id, name, type, local_ip, local_port, remote_port, enabled FROM proxies ORDER BY id `) if err != nil { return nil, err } defer rows.Close() var proxies []Proxy for rows.Next() { var p Proxy err := rows.Scan(&p.ID, &p.Name, &p.Type, &p.LocalIP, &p.LocalPort, &p.RemotePort, &p.Enabled) if err != nil { return nil, err } proxies = append(proxies, p) } return proxies, rows.Err() } func GetProxy(id int) (*Proxy, error) { var p Proxy err := DB.QueryRow(` SELECT id, name, type, local_ip, local_port, remote_port, enabled FROM proxies WHERE id = ? `, id).Scan(&p.ID, &p.Name, &p.Type, &p.LocalIP, &p.LocalPort, &p.RemotePort, &p.Enabled) if err != nil { return nil, err } return &p, nil } func CreateProxy(p *Proxy) error { result, err := DB.Exec(` INSERT INTO proxies (name, type, local_ip, local_port, remote_port, enabled) VALUES (?, ?, ?, ?, ?, ?) `, p.Name, p.Type, p.LocalIP, p.LocalPort, p.RemotePort, p.Enabled) if err != nil { return err } id, _ := result.LastInsertId() p.ID = int(id) return nil } func UpdateProxy(p *Proxy) error { _, err := DB.Exec(` UPDATE proxies SET name = ?, type = ?, local_ip = ?, local_port = ?, remote_port = ?, enabled = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ? `, p.Name, p.Type, p.LocalIP, p.LocalPort, p.RemotePort, p.Enabled, p.ID) return err } func DeleteProxy(id int) error { _, err := DB.Exec("DELETE FROM proxies WHERE id = ?", id) return err } // ================================================================ // 用户管理 // ================================================================ func GetUserByUsername(username string) (*User, error) { var u User err := DB.QueryRow(` SELECT id, username, password_hash, created_at FROM users WHERE username = ? `, username).Scan(&u.ID, &u.Username, &u.PasswordHash, &u.CreatedAt) if err != nil { return nil, err } return &u, nil } func UserExists(username string) (bool, error) { var count int err := DB.QueryRow("SELECT COUNT(*) FROM users WHERE username = ?", username).Scan(&count) return count > 0, err } func CreateUser(username, passwordHash string) error { _, err := DB.Exec(` INSERT INTO users (username, password_hash) VALUES (?, ?) `, username, passwordHash) return err } func UpdateUserPassword(username, passwordHash string) error { _, err := DB.Exec(` UPDATE users SET password_hash = ?, updated_at = CURRENT_TIMESTAMP WHERE username = ? `, passwordHash, username) return err } func CountUsers() (int, error) { var count int err := DB.QueryRow("SELECT COUNT(*) FROM users").Scan(&count) return count, err }