仰望星辰工作室

clearlove2.1

clearlove2.1/ internal/config/config.go 2.3 KB · 83 行 原始文件
1// Package config 负责全局配置的加载与持久化。
2// 安装状态通过 data/config.json 标记,首次启动(无该文件)自动进入安装向导。
3package config
4
5import (
6 "encoding/json"
7 "os"
8 "path/filepath"
9)
10
11// Version 当前应用版本号,用于检查更新
12const Version = "2.1.3"
13
14// Cfg 全局配置单例
15var Cfg Config
16
17// Config 持久化到 data/config.json 的配置项
18type Config struct {
19 Installed bool `json:"installed"` // 是否已完成安装
20 DBType string `json:"db_type"` // sqlite | mysql
21 SQLitePath string `json:"sqlite_path"` // SQLite 文件路径
22 MySQLDsn string `json:"mysql_dsn"` // MySQL DSN
23 Secret string `json:"secret"` // 会话签名密钥
24 DataDir string `json:"data_dir"` // 数据目录
25 UploadDir string `json:"upload_dir"` // 上传目录
26 Version string `json:"version"` // 安装时的程序版本
27}
28
29// dir 返回数据目录(默认 ./data)
30func (c *Config) dir() string {
31 if c.DataDir == "" {
32 return "data"
33 }
34 return c.DataDir
35}
36
37// File 配置文件完整路径
38func (c *Config) File() string {
39 return filepath.Join(c.dir(), "config.json")
40}
41
42// Load 启动时加载配置;文件不存在则保持未安装状态。
43// 目录可用环境变量覆盖,方便单二进制部署到任意位置:
44//
45// CLEARLOVE_DATA_DIR data 目录(默认 ./data)
46// CLEARLOVE_UPLOAD_DIR uploads 目录(默认 ./uploads)
47func Load() {
48 Cfg = Config{DataDir: "data", UploadDir: "uploads", Version: Version}
49 // 先用环境变量确定目录,才能在正确的路径读取 config.json
50 applyEnvDirs()
51 if b, err := os.ReadFile(Cfg.File()); err == nil {
52 _ = json.Unmarshal(b, &Cfg)
53 }
54 if Cfg.DataDir == "" {
55 Cfg.DataDir = "data"
56 }
57 if Cfg.UploadDir == "" {
58 Cfg.UploadDir = "uploads"
59 }
60 applyEnvDirs() // 环境变量优先级最高
61}
62
63// applyEnvDirs 应用目录类环境变量
64func applyEnvDirs() {
65 if v := os.Getenv("CLEARLOVE_DATA_DIR"); v != "" {
66 Cfg.DataDir = v
67 }
68 if v := os.Getenv("CLEARLOVE_UPLOAD_DIR"); v != "" {
69 Cfg.UploadDir = v
70 }
71}
72
73// Save 将配置写回磁盘(安装完成、升级等场景)
74func Save() error {
75 if err := os.MkdirAll(Cfg.dir(), 0o755); err != nil {
76 return err
77 }
78 b, err := json.MarshalIndent(&Cfg, "", " ")
79 if err != nil {
80 return err
81 }
82 return os.WriteFile(Cfg.File(), b, 0o600)
83}