加入首次使用的引导页、写入readme文件
This commit is contained in:
@@ -5,13 +5,11 @@ import (
|
||||
"database/sql"
|
||||
"encoding/hex"
|
||||
"log"
|
||||
"sync"
|
||||
|
||||
_ "modernc.org/sqlite"
|
||||
)
|
||||
|
||||
var DB *sql.DB
|
||||
var dbInitOnce sync.Once
|
||||
|
||||
// ===== 全局配置表(A表)=====
|
||||
type GlobalConfig struct {
|
||||
@@ -90,7 +88,6 @@ func InitDB() error {
|
||||
return err
|
||||
}
|
||||
|
||||
// 确保全局配置有一行数据
|
||||
var count int
|
||||
DB.QueryRow("SELECT COUNT(*) FROM global_config").Scan(&count)
|
||||
if count == 0 {
|
||||
@@ -124,7 +121,7 @@ func InitDB() error {
|
||||
return err
|
||||
}
|
||||
|
||||
// 🟢 新增:应用配置表(用于存储 JWT 密钥等全局配置)
|
||||
// 应用配置表(JWT密钥等)
|
||||
_, err = DB.Exec(`
|
||||
CREATE TABLE IF NOT EXISTS app_config (
|
||||
key TEXT PRIMARY KEY,
|
||||
@@ -136,7 +133,6 @@ func InitDB() error {
|
||||
return err
|
||||
}
|
||||
|
||||
// 🟢 确保 JWT 密钥存在
|
||||
if err := ensureJwtSecret(); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -145,25 +141,20 @@ func InitDB() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// ===== 🟢 新增:JWT 密钥管理 =====
|
||||
|
||||
// ensureJwtSecret 检查 app_config 表里是否有 jwt_secret,没有则生成一个
|
||||
// ===== JWT 密钥管理 =====
|
||||
func ensureJwtSecret() error {
|
||||
var value string
|
||||
err := DB.QueryRow("SELECT value FROM app_config WHERE key = 'jwt_secret'").Scan(&value)
|
||||
if err == nil && value != "" {
|
||||
// 密钥已存在
|
||||
return nil
|
||||
}
|
||||
|
||||
// 生成 32 字节随机密钥
|
||||
bytes := make([]byte, 32)
|
||||
if _, err := rand.Read(bytes); err != nil {
|
||||
return err
|
||||
}
|
||||
secret := hex.EncodeToString(bytes)
|
||||
|
||||
// 存入数据库
|
||||
_, err = DB.Exec(`
|
||||
INSERT INTO app_config (key, value) VALUES ('jwt_secret', ?)
|
||||
`, secret)
|
||||
@@ -174,7 +165,6 @@ func ensureJwtSecret() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetJwtSecret 从数据库读取 JWT 密钥
|
||||
func GetJwtSecret() (string, error) {
|
||||
var secret string
|
||||
err := DB.QueryRow("SELECT value FROM app_config WHERE key = 'jwt_secret'").Scan(&secret)
|
||||
@@ -199,17 +189,15 @@ func GetGlobalConfig() (*GlobalConfig, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// 🟢 强制开启 tcpMux,忽略数据库中存储的值
|
||||
cfg.TcpMux = true
|
||||
return &cfg, nil
|
||||
}
|
||||
|
||||
func UpdateGlobalConfig(cfg *GlobalConfig) error {
|
||||
// 忽略前端传过来的 TcpMux,强制保持为 true
|
||||
_, err := DB.Exec(`
|
||||
UPDATE global_config SET
|
||||
server_addr = ?, server_port = ?, token = ?, log_level = ?, log_max_days = ?,
|
||||
tcp_mux = 1, -- 🟢 强制写死为 1
|
||||
tcp_mux = 1,
|
||||
tcp_mux_keepalive = ?, heartbeat_interval = ?, heartbeat_timeout = ?, pool_count = ?,
|
||||
updated_at = CURRENT_TIMESTAMP
|
||||
WHERE id = 1
|
||||
@@ -238,12 +226,9 @@ func GetProxies() ([]Proxy, error) {
|
||||
}
|
||||
proxies = append(proxies, p)
|
||||
}
|
||||
|
||||
// 🟢 关键:检查遍历过程中是否有错误
|
||||
if err = rows.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return proxies, nil
|
||||
}
|
||||
|
||||
@@ -307,6 +292,14 @@ func CreateUser(username, passwordHash string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
func UpdatePassword(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)
|
||||
|
||||
Reference in New Issue
Block a user