From 67573e6ac2e815bf3efdf1cc0d6424bcd60d4e6d Mon Sep 17 00:00:00 2001 From: govolokatliai Date: Tue, 20 May 2025 09:01:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E5=96=84=E9=85=8D=E7=BD=AE=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E4=BB=A3=E7=A0=81=EF=BD=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.yaml | 19 ++++++---- config/config.go | 83 +++++++----------------------------------- config/model.go | 40 +++++++++++--------- database/database.go | 9 +++-- go.mod | 2 +- go.sum | 2 + handler/assignments.go | 4 +- handler/utils.go | 2 +- main.go | 2 +- 9 files changed, 61 insertions(+), 102 deletions(-) diff --git a/config.yaml b/config.yaml index 955265c..7d80204 100644 --- a/config.yaml +++ b/config.yaml @@ -1,5 +1,10 @@ # This is a example file for the system -ListenPort: 25005 + +app: + Name: "scheduler for ZSC Network Support staff" + File: "ignore/aa.csv" #成员信息文件的路径,看文档 + ListenPort: 25005 + DB: Type: "SQLite" Path: "./scheduler.db" # not need if use SQLite @@ -7,9 +12,9 @@ DB: User: "" # not need if use SQLite Password: "" # not need if use SQLite Name: "" # not need if use SQLite -#[business] -Session: "2024-2025" #学年 -Semester: 1 #学期,1 或 2 -StartTime: "2025-3-10" #开始值班的日期,日期必须是星期一 -Week: 15 #准备值班多少周 -File: "member.csv" #成员信息文件的路径,看文档 + +business: + Session: "2024-2025" #学年 + Semester: 1 #学期,1 或 2 + StartTime: "2025-3-10" #开始值班的日期,日期必须是星期一 + Week: 15 #准备值班多少周 diff --git a/config/config.go b/config/config.go index 3293f92..c09bf1b 100644 --- a/config/config.go +++ b/config/config.go @@ -5,24 +5,15 @@ import ( "os" "github.com/golang-module/carbon/v2" + "github.com/spf13/pflag" "github.com/spf13/viper" ) func Load() { - // where to read config - viper.SetConfigName("config") - viper.SetConfigType("yaml") - viper.AddConfigPath(".") + parseArgs() readconfig() - - check() - - debugprint() - - if len(os.Args) != 1 { - handleArguments() - } + fmt.Println(Default) carbon.SetDefault(carbon.Default{ Layout: carbon.DateTimeLayout, @@ -33,66 +24,20 @@ func Load() { } -func check() { - // 暂时只支持SQLite - if DB.Type != "SQLite" { - fmt.Println("sorry,we support SQLite only so far(At config/config.go : check())") - os.Exit(1) - } - - if startTime := carbon.Parse(StartTime); startTime.IsMonday() != true { - fmt.Println("the start time must be a monday") - os.Exit(1) - } -} -func debugprint() { - - fmt.Printf("ListenPort=%v\n", ListenPort) - fmt.Printf("database type:%s\n", DB.Type) - fmt.Printf("database path : %s\n", DB.Path) - fmt.Printf("database port:%d\n", DB.Port) - fmt.Printf("database user:%s\n", DB.User) - fmt.Printf("database passowrd:%s\n", DB.Password) - fmt.Printf("database name:%s\n", DB.Name) - fmt.Printf("session:%s\n", Session) - fmt.Printf("semester:%d\n", Semester) - fmt.Printf("start time:%s\n", StartTime) - fmt.Printf("week:%d\n", Week) - fmt.Printf("File=%v\n", File) - -} - -func handleArguments() { - if len(os.Args) > 2 { - fmt.Println("Please enter only 1 argument") - os.Exit(1) - } - switch os.Args[1] { - case "newsemester": - if DB.Type == "SQLite" { - sqliteNewSemester() - } - default: - panic("invalid argument") - } - -} - func readconfig() { if err := viper.ReadInConfig(); err != nil { fmt.Printf("Error reading config file: %v\n", err) os.Exit(1) } - ListenPort = viper.GetInt("ListenPort") - DB.Type = viper.GetString("DB.Type") - DB.Path = viper.GetString("DB.Path") - DB.Port = viper.GetInt("DB.Port") - DB.User = viper.GetString("DB.User") - DB.Password = viper.GetString("DB.Password") - DB.Name = viper.GetString("DB.Name") - Session = viper.GetString("Session") - Semester = viper.GetInt("Semester") - StartTime = viper.GetString("StartTime") - Week = viper.GetInt("Week") - File = viper.GetString("File") + if err := viper.Unmarshal(&Default); err != nil { + panic(fmt.Errorf("映射配置到结构体失败: %s", err)) + } +} + +func parseArgs() { + pflag.String("config", "config.yaml", "the path to config file.") + viper.BindPFlags(pflag.CommandLine) + pflag.Parse() + pathToConfigure = viper.GetString("config") + viper.SetConfigFile(pathToConfigure) } diff --git a/config/model.go b/config/model.go index b656f0c..9f33a67 100644 --- a/config/model.go +++ b/config/model.go @@ -1,20 +1,26 @@ package config -var ( - ListenPort int - DB database - Session string - Semester int - StartTime string - Week int - File string -) - -type database struct { - Type string - Path string - Port int - User string - Password string - Name string +type Config struct { + App struct { + Name string `mapstructure:"Name"` + ListenPort int `mapstructure:"ListenPort"` + File string `mapstructure:"File"` + } `mapstructure:"app"` + DB struct { + Type string `mapstructure:"Tyoe"` + Path string `mapstructure:"Path"` + Port int `mapstructure:"Port"` + User string `mapstructure:"User"` + Password string `mapstructure:"Password"` + Name string `mapstructure:"Name"` + } `mapstructure:"DB"` + Business struct { + Session string `mapstructure:"Session"` + Semester int `mapstructure:"Semester"` + StartTime string `mapstructure:"StartTime"` + Week int `mapstructure:"Week"` + } `mapstructure:"business"` } + +var pathToConfigure string +var Default Config diff --git a/database/database.go b/database/database.go index 48ead6c..e583dd9 100644 --- a/database/database.go +++ b/database/database.go @@ -13,11 +13,12 @@ import ( var err error func Connect() { - switch config.DB.Type { + switch config.Default.DB.Type { case "SQLite": connectSQLite() case "PostgreSQL": - connectPGSQL() + //connectPGSQL() + PGSQL() default: panic("DBType error") } @@ -25,7 +26,7 @@ func Connect() { } func connectSQLite() { - Main, err = gorm.Open(sqlite.Open(config.DB.Path), &gorm.Config{}) + Main, err = gorm.Open(sqlite.Open(config.Default.DB.Path), &gorm.Config{}) if err != nil { fmt.Printf("error in connecting to SQLite:") fmt.Println(err) @@ -35,7 +36,7 @@ func connectSQLite() { } func connectPGSQL() { - Main, err = gorm.Open(postgres.Open(config.DB.Path)) + Main, err = gorm.Open(postgres.Open(config.Default.DB.Path), &gorm.Config{}) if err != nil { panic(err) } diff --git a/go.mod b/go.mod index ee52dc2..ca2aef7 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect diff --git a/go.sum b/go.sum index 3e58c4c..de320d8 100644 --- a/go.sum +++ b/go.sum @@ -66,6 +66,8 @@ github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/handler/assignments.go b/handler/assignments.go index 555f2e2..81c2aca 100644 --- a/handler/assignments.go +++ b/handler/assignments.go @@ -60,7 +60,7 @@ func generateTable(time carbon.Carbon) (*[7][]*model.Member, error) { week, dayOfWeek := getWorkDay(time) //检查传入时间有没有问题 //TODO:这里好像有bug(对日期是否在值班时间内的判断部分),不过不怎么影响使用 - if (week < 0) || (week > config.Week) { + if (week < 0) || (week > config.Default.Business.Week) { return nil, errors.New("日期错误,日期需要在本学期的值班日期内并且格式正确") } @@ -135,7 +135,7 @@ func generateTable(time carbon.Carbon) (*[7][]*model.Member, error) { // 读取csv文件 func readTableData(m *[]*model.Member) error { - data, err := os.OpenFile(config.File, os.O_RDWR|os.O_CREATE, os.ModePerm) + data, err := os.OpenFile(config.Default.App.File, os.O_RDWR|os.O_CREATE, os.ModePerm) if err != nil { return err } diff --git a/handler/utils.go b/handler/utils.go index b9081e9..8303dd8 100644 --- a/handler/utils.go +++ b/handler/utils.go @@ -8,7 +8,7 @@ import ( // 输入一个时间,返回时间是第几周的第几天 func getWorkDay(in carbon.Carbon) (weekOffset int, dayOffset int) { - time := carbon.Parse(config.StartTime) + time := carbon.Parse(config.Default.Business.StartTime) _weekOffset := time.DiffInWeeks(in) _dayOffset := in.DayOfWeek() return int(_weekOffset), _dayOffset diff --git a/main.go b/main.go index b60eb44..c5ee737 100644 --- a/main.go +++ b/main.go @@ -18,7 +18,7 @@ func main() { app := echo.New() register(app) - listenAddress := fmt.Sprintf(":%d", config.ListenPort) + listenAddress := fmt.Sprintf(":%d", config.Default.App.ListenPort) app.Logger.Fatal(app.Start(listenAddress)) }