package utils import ( "encoding/json" "fmt" "io/ioutil" "log" "os" "path/filepath" "gorm.io/driver/sqlite" "gorm.io/gorm" "zhixiangtong/models" ) type TimeSet struct { Index int `json:"index"` Start string `json:"start"` End string `json:"end"` Time int `json:"time"` } // Config 结构体定义服务配置 type Config struct { Host string `json:"host"` Port string `json:"port"` StartDate string `json:"startDate"` TotalWeeks int `json:"totalWeeks"` EndDate string `json:"endDate"` TimeSetting []TimeSet `json:"timeSetting"` } // InitConfig 初始化配置文件 func InitConfig(dataDir string) (*Config, error) { configPath := filepath.Join(dataDir, "config.json") // 检查配置文件是否存在 if _, err := os.Stat(configPath); os.IsNotExist(err) { log.Printf("配置文件不存在,正在创建默认配置文件:%s", configPath) // JSON 数据 timeSettingJSON := `[{"index": 1, "start": "08:00", "end": "08:45", "time": 0}, {"index": 2, "start": "08:50", "end": "09:35", "time": 0}, {"index": 3, "start": "09:55", "end": "10:40", "time": 0}, {"index": 4, "start": "10:45", "end": "11:30", "time": 0}, {"index": 5, "start": "11:35", "end": "12:20", "time": 0}, {"index": 6, "start": "14:00", "end": "14:45", "time": 1}, {"index": 7, "start": "14:50", "end": "15:35", "time": 1}, {"index": 8, "start": "15:55", "end": "16:40", "time": 1}, {"index": 9, "start": "16:45", "end": "17:30", "time": 1}, {"index": 10, "start": "19:00", "end": "19:45", "time": 2}, {"index": 11, "start": "19:50", "end": "20:35", "time": 2}, {"index": 12, "start": "20:40", "end": "21:25", "time": 2}]` // 将 JSON 数据解析为 TimeSet 切片 var timeSettings []TimeSet err := json.Unmarshal([]byte(timeSettingJSON), &timeSettings) if err != nil { log.Fatalf("Failed to parse JSON: %v", err) } // 默认配置 defaultConfig := Config{ Host: "localhost", Port: "8080", StartDate: "2024-09-02", EndDate: "2025-01-19", TotalWeeks: 20, TimeSetting: timeSettings, } // 将默认配置写入配置文件 configData, err := json.MarshalIndent(defaultConfig, "", " ") if err != nil { return nil, fmt.Errorf("无法创建默认配置文件:%v", err) } err = ioutil.WriteFile(configPath, configData, 0644) if err != nil { return nil, fmt.Errorf("无法写入默认配置文件:%v", err) } } // 读取配置文件 configData, err := ioutil.ReadFile(configPath) if err != nil { return nil, fmt.Errorf("无法读取配置文件:%v", err) } // 解析配置文件 var config Config err = json.Unmarshal(configData, &config) if err != nil { return nil, fmt.Errorf("配置文件格式错误:%v", err) } log.Printf("配置文件已加载:Host=%s, Port=%s", config.Host, config.Port) return &config, nil } // InitDatabase 初始化数据库,如果不存在则创建并迁移 func InitDatabase(dataDir string) (*gorm.DB, error) { dbPath := filepath.Join(dataDir, "database.db") // 检查数据库文件是否存在 if _, err := os.Stat(dbPath); os.IsNotExist(err) { log.Printf("数据库文件不存在,正在创建数据库:%s", dbPath) } // 连接到SQLite数据库 db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{}) if err != nil { return nil, fmt.Errorf("无法连接到数据库:%v", err) } // 自动迁移数据库 err = db.AutoMigrate(&models.Campus{}, &models.Building{}, &models.Classroom{}, &models.Course{}, &models.Classname{}) if err != nil { return nil, fmt.Errorf("数据库迁移失败:%v", err) } log.Printf("数据库已初始化并连接成功:%s", dbPath) return db, nil }