124 lines
3.9 KiB
Go
124 lines
3.9 KiB
Go
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
|
||
}
|