diff --git a/FrontEnd/admin.html b/FrontEnd/admin.html
index e69de29..c7ae2e3 100644
--- a/FrontEnd/admin.html
+++ b/FrontEnd/admin.html
@@ -0,0 +1,5 @@
+
+
+管理
+
+
diff --git a/FrontEnd/assignment.html b/FrontEnd/assignment.html
index e69de29..125b341 100644
--- a/FrontEnd/assignment.html
+++ b/FrontEnd/assignment.html
@@ -0,0 +1,7 @@
+
+
+
+
今日值班表
+
+
+
diff --git a/config.yaml b/config.yaml
index 92cd2a8..feffc28 100644
--- a/config.yaml
+++ b/config.yaml
@@ -7,8 +7,7 @@ DB:
User: "" # not need if use SQLite
Password: "" # not need if use SQLite
Name: "" # not need if use SQLite
-
-[business]
+#[business]
Session: "2024-2025" #学年
Semester: 1 #学期,1 或 2
StartTime: "2024-9-14" #开始值班的日期
diff --git a/config/config.go b/config/config.go
index 325cf89..355a9f0 100644
--- a/config/config.go
+++ b/config/config.go
@@ -2,6 +2,7 @@ package config
import (
"fmt"
+ "github.com/golang-module/carbon/v2"
"github.com/spf13/viper"
"os"
)
@@ -22,6 +23,13 @@ func Load() {
handleArguments()
}
+ carbon.SetDefault(carbon.Default{
+ Layout: carbon.DateTimeLayout,
+ Timezone: carbon.PRC,
+ WeekStartsAt: carbon.Sunday,
+ Locale: "zh-CN", // 取值范围:lang 目录下翻译文件名,不包含文件后缀
+ })
+
}
func check() {
diff --git a/config/middleware.go b/config/middleware.go
index 2193924..6e1b628 100644
--- a/config/middleware.go
+++ b/config/middleware.go
@@ -1,12 +1,13 @@
package config
-import (
- "github.com/labstack/echo/v4"
- "github.com/labstack/echo/v4/middleware"
-)
-
-func Middleware(app *echo.Echo) {
- //here are middlewares we use
- app.Use(middleware.Logger())
- app.Use(middleware.Recover())
-}
+//
+// import (
+// "github.com/labstack/echo/v4"
+// "github.com/labstack/echo/v4/middleware"
+// )
+//
+// func Middleware(app *echo.Echo) {
+// //here are middlewares we use
+// app.Use(middleware.Logger())
+// app.Use(middleware.Recover())
+// }
diff --git a/config/route.go b/config/route.go
index 028eed2..2bd1302 100644
--- a/config/route.go
+++ b/config/route.go
@@ -1,12 +1,17 @@
package config
-import (
- "github.com/labstack/echo/v4"
- "github.com/labstack/echo/v4/middleware"
-)
-
-func Route(app *echo.Echo) {
- // here is the route for our site
- staticFiles := app.Group("/")
- staticFiles.Use(middleware.Static("./FrontEnd"))
-}
+//
+// import (
+// "github.com/labstack/echo/v4"
+// "github.com/labstack/echo/v4/middleware"
+// "zsxyww.com/scheduler/handler"
+// )
+//
+// func Route(app *echo.Echo) {
+// // here is the route for our site
+// staticFiles := app.Group("/")
+// staticFiles.Use(middleware.Static("./FrontEnd"))
+//
+// api := app.Group("/api/")
+// api.GET("/getAssignment", handler.GetAssignment)
+// }
diff --git a/doc/assignment_test.csv b/doc/assignment_test.csv
new file mode 100644
index 0000000..c519df9
--- /dev/null
+++ b/doc/assignment_test.csv
@@ -0,0 +1,6 @@
+姓名,工号,性别,权限,有空
+aaa,2301,1,6,1
+bbb,2303,0,6,1
+ccc,2303,1,6,1
+mam,2304,1,6,5
+waw,2305,0,6,5
diff --git a/doc/换班补班的业务描述.md b/doc/换班补班的业务描述.md
new file mode 100644
index 0000000..04970bb
--- /dev/null
+++ b/doc/换班补班的业务描述.md
@@ -0,0 +1,5 @@
+# 业务描述
+这里是业务描述备忘录
+## 换班
+首先,由换班的发起人填写
+为
diff --git a/doc/排班算法.md b/doc/排班算法.md
new file mode 100644
index 0000000..2ea4fa3
--- /dev/null
+++ b/doc/排班算法.md
@@ -0,0 +1,10 @@
+# 描述
+网络维护科(简称为网维)是学校中负责修理同学们网络问题的公益性组织,由大二,大三的正式成员和大一的实习成员组成。
+
+每天,网维都会去学校里的各个宿舍片区修理同学们上报的网络问题(称之为值班),每个片区由一个片区负责人所统领值班,这个负责人必须是正式成员。其余的人员为正式成员或者实习成员。每个成员每周只用值班1天,每天只会在某个具体的片区值班,具体是哪一天取决于他们的空闲时间。
+
+网维所负责值班的片区一共有6个,称为1-6号,其中1-3号为女生片区,4-6号为男生片区。由于网维男生的数量远多于女生,所以必须要让男生进入女生宿舍片区值班,但是,女生会被优先安排在女生宿舍值班,换句话说,女生只可以出现在女生片区。
+
+为了让实习成员熟悉每一个片区,每两周都会轮换值班每位成员负责值班的的片区,片区的轮换遵守上面的规则,也就是说,女生只会在女生片区内轮换,男生则会在全部的片区内轮换。
+
+一个学期值班的周数不确定,但是一般不会少于12周,即可以轮换到每个成员。
diff --git a/go.mod b/go.mod
index 5284429..cca53eb 100644
--- a/go.mod
+++ b/go.mod
@@ -4,7 +4,9 @@ go 1.23.2
require (
github.com/fsnotify/fsnotify v1.7.0 // indirect
+ github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 // indirect
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
+ github.com/golang-module/carbon/v2 v2.4.1 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
diff --git a/go.sum b/go.sum
index e7072b4..78b0de4 100644
--- a/go.sum
+++ b/go.sum
@@ -2,8 +2,12 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
+github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 h1:FWNFq4fM1wPfcK40yHE5UO3RUdSNPaBC+j3PokzA6OQ=
+github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI=
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
+github.com/golang-module/carbon/v2 v2.4.1 h1:cYUD8T+rHeX+qIybGYpnJ8I90F10dvyEF67VNOO+zZM=
+github.com/golang-module/carbon/v2 v2.4.1/go.mod h1:1jP9AZ4k2+lmfgY/wZgmtsN52VcHC5YuPM6varKDTkM=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
diff --git a/handler/assignments.go b/handler/assignments.go
new file mode 100644
index 0000000..2ff66a8
--- /dev/null
+++ b/handler/assignments.go
@@ -0,0 +1,104 @@
+package handler
+
+import (
+ "fmt"
+ "github.com/gocarina/gocsv"
+ "github.com/golang-module/carbon/v2"
+ "github.com/labstack/echo/v4"
+ "net/http"
+ "os"
+ "zsxyww.com/scheduler/config"
+ "zsxyww.com/scheduler/model"
+ "zsxyww.com/scheduler/signals"
+)
+
+func GetAssignment(i echo.Context) error {
+ if (carbon.Now().ToDateString() != signals.Table.LastUpdated.ToDateString()) || signals.Table.NeedUpdate == true {
+ fmt.Printf("At %v:start regenerate table", carbon.Now())
+ err := generateTable()
+ if err != nil {
+ i.String(http.StatusInternalServerError, err.Error())
+ return echo.ErrInternalServerError
+ }
+ return nil
+ }
+ return nil
+}
+func generateTable() error {
+
+ table := [7][]string{} //结果放入这里
+ members := []*model.Member{} //包含所有成员信息的切片
+
+ err := readTableData(&members)
+ if err != nil {
+ return err
+ }
+
+ dayOfWeek := carbon.Now().DayOfWeek() //今天星期几
+ today := []*model.Member{} //今天值班的人
+ female := []*model.Member{} //今天的女生
+ male := []*model.Member{} //今天的男生
+
+ for _, i := range members {
+ if i.FreeDay == dayOfWeek {
+ today = append(today, i)
+ }
+ }
+
+ for _, i := range today {
+ if i.Sex == false {
+ female = append(female, i)
+ } else if i.Sex == true {
+ male = append(male, i)
+ }
+ }
+ //为女生宿舍分配负责人:
+ for i := 0; i < 4; i++ {
+ for _, x := range female {
+ if (x.Arranged == false) && (x.Access < model.FRESH) {
+ table[i] = append(table[i], x.Name)
+ x.Arranged = true
+ }
+ }
+ }
+ //男生负责人:
+ for i := 0; i < 7; i++ {
+ for _, x := range male {
+ if (x.Arranged == false) && (x.Access < model.FRESH) {
+ table[i] = append(table[i], x.Name)
+ x.Arranged = true
+ }
+ }
+ }
+ //女生成员
+ for c, i := range female {
+ if i.Arranged == false {
+ table[(c % 4)] = append(table[(c%4)], i.Name)
+ }
+ }
+ //男生成员
+ for c, i := range male {
+ if i.Arranged == false {
+ table[(c % 7)] = append(table[(c%7)], i.Name)
+ }
+ }
+ fmt.Printf("today:%v\n", today)
+ fmt.Printf("table:%v\n", table)
+ return nil
+}
+func readTableData(m *[]*model.Member) error {
+ data, err := os.OpenFile(config.File, os.O_RDWR|os.O_CREATE, os.ModePerm)
+ if err != nil {
+ return err
+ }
+ defer data.Close()
+
+ err = gocsv.UnmarshalFile(data, m)
+ if err != nil {
+ return err
+ }
+ for index, member := range *m {
+ fmt.Printf("%v:%v\n", index, member) // for debug concerns
+ }
+ return nil
+}
diff --git a/main.go b/main.go
index 2d129bf..2fe62f8 100644
--- a/main.go
+++ b/main.go
@@ -1,9 +1,11 @@
package main
import (
+ "fmt"
"github.com/labstack/echo/v4"
"zsxyww.com/scheduler/config"
"zsxyww.com/scheduler/database"
+ "zsxyww.com/scheduler/route"
)
func main() {
@@ -13,8 +15,12 @@ func main() {
app := echo.New()
register(app)
+
+ listenAddress := fmt.Sprintf(":%d", config.ListenPort)
+
+ app.Logger.Fatal(app.Start(listenAddress))
}
func register(app *echo.Echo) {
- config.Route(app)
- config.Middleware(app)
+ route.Route(app)
+ route.Middleware(app)
}
diff --git a/member.csv b/member.csv
new file mode 100755
index 0000000..75896e9
--- /dev/null
+++ b/member.csv
@@ -0,0 +1,101 @@
+姓名,工号,性别,权限,有空
+王小明,10001,1,7,1
+李芳,10002,1,6,2
+张强,10003,0,3,5
+赵丽,10004,1,3,4
+孙浩,10005,1,7,5
+刘芳,10006,1,6,6
+陈伟,10007,1,6,7
+杨磊,10008,1,7,1
+张晓婷,10009,1,6,2
+王志,10010,1,6,3
+李军,10011,1,7,4
+赵玉,10012,0,2,5
+马琳,10013,1,7,6
+高飞,10014,1,7,7
+王凯,10015,1,6,1
+陈颖,10016,1,3,2
+刘宁,10017,1,6,3
+孙伟,10018,1,7,4
+周杰,10019,1,6,5
+张丽,10020,1,7,6
+李明,10021,1,6,7
+陈强,10022,0,3,5
+王芳,10023,1,7,2
+赵强,10024,1,7,3
+李欣,10025,1,7,4
+刘强,10026,1,6,5
+张飞,10027,1,7,6
+陈飞,10028,0,6,5
+李刚,10029,1,7,1
+赵勇,10030,1,6,2
+孙明,10031,1,7,3
+周飞,10032,1,6,4
+高伟,10033,1,7,5
+张晓明,10034,1,3,6
+赵伟,10035,1,7,7
+孙丽,10036,1,6,1
+王晓,10037,1,7,2
+陈霞,10038,0,2,3
+赵华,10039,1,7,4
+杨伟,10040,1,6,5
+张浩,10041,1,7,6
+李霞,10042,1,6,7
+刘伟,10043,1,7,1
+张伟,10044,1,6,2
+陈军,10045,1,6,3
+周丽,10046,1,7,4
+王宁,10047,0,2,5
+刘丽,10048,1,7,6
+赵强,10049,1,7,7
+孙宁,10050,1,6,1
+李丽,10051,1,7,2
+陈宁,10052,1,6,3
+赵明,10053,1,7,4
+高霞,10054,1,7,5
+张凯,10055,0,1,6
+孙霞,10056,1,7,7
+陈宁,10057,1,6,1
+刘军,10058,1,7,2
+王飞,10059,1,7,3
+张杰,10060,1,6,4
+赵刚,10061,1,7,5
+李晓明,10062,1,6,6
+高明,10063,1,7,7
+杨霞,10064,1,7,1
+王军,10065,1,6,2
+张霞,10066,1,6,3
+孙勇,10067,1,7,4
+赵丽华,10068,1,7,5
+刘伟华,10069,1,6,6
+杨强,10070,0,3,7
+李军华,10071,1,7,1
+张飞翔,10072,1,7,2
+陈小明,10073,1,6,3
+王志华,10074,1,7,4
+李浩,10075,1,6,5
+赵宁,10076,1,7,6
+刘宁华,10077,1,7,7
+孙杰,10078,1,6,1
+高磊,10079,1,7,2
+张宁,10080,1,6,3
+杨宁,10081,1,7,4
+陈丽,10082,0,3,5
+王丽,10083,1,7,6
+赵志华,10084,1,6,7
+孙丽华,10085,1,7,1
+刘志,10086,1,6,2
+张霞华,10087,1,7,3
+王磊,10088,1,7,4
+陈小杰,10089,1,6,5
+李宁华,10090,1,7,6
+赵丽杰,10091,1,7,7
+孙军,10092,1,6,1
+高志,10093,1,7,2
+张霞明,10094,1,6,3
+赵明华,10095,0,0,4
+陈志华,10096,1,6,5
+王丽华,10097,1,7,6
+李强,10098,1,7,7
+赵晓,10099,1,6,1
+杨磊明,10100,1,7,2
diff --git a/model/member.go b/model/member.go
index d6f3a88..43dc46d 100644
--- a/model/member.go
+++ b/model/member.go
@@ -1,9 +1,20 @@
package model
type Member struct {
- ID int //工号
- Name string
- Sex bool //不要把女生安排进男生宿舍,male=True
- FreeDay int //哪天有空
- access int // 遵循报修系统的access enum ,用来标注管理层
+ ID int `csv:"工号"` //工号
+ Name string `csv:"姓名"`
+ Sex bool `csv:"性别"` //不要把女生安排进男生宿舍,male=True
+ FreeDay int `csv:"有空"` //哪天有空
+ Access int `csv:"权限"` //遵循报修系统的access enum ,用来标注管理层
+ Arranged bool `csv:"-"` //供分配程序使用的字段
}
+
+// 权限:
+
+const DEV = 0 //开发组
+const HEAD = 1 //科长
+const API = 2 //API
+const GROUP = 3 //组长
+const FORMAL = 4 //正式成员
+const FRESH = 5 //实习成员
+const PRE = 6 //前成员
diff --git a/model/zones.go b/model/zones.go
new file mode 100644
index 0000000..8165369
--- /dev/null
+++ b/model/zones.go
@@ -0,0 +1,9 @@
+package model
+
+const FX = 0 //凤翔
+const ZH = 1 //朝晖
+const XH_AB = 2 //香晖AB
+const XH_CD = 3 //香晖CD,
+const DM = 4 //东门
+const BM = 5 //北门
+const QT = 6 //歧头
diff --git a/route/middleware.go b/route/middleware.go
new file mode 100644
index 0000000..3befaca
--- /dev/null
+++ b/route/middleware.go
@@ -0,0 +1,12 @@
+package route
+
+import (
+ "github.com/labstack/echo/v4"
+ "github.com/labstack/echo/v4/middleware"
+)
+
+func Middleware(app *echo.Echo) {
+ //here are middlewares we use
+ app.Use(middleware.Logger())
+ app.Use(middleware.Recover())
+}
diff --git a/route/route.go b/route/route.go
new file mode 100644
index 0000000..30f88c1
--- /dev/null
+++ b/route/route.go
@@ -0,0 +1,16 @@
+package route
+
+import (
+ "github.com/labstack/echo/v4"
+ "github.com/labstack/echo/v4/middleware"
+ "zsxyww.com/scheduler/handler"
+)
+
+func Route(app *echo.Echo) {
+ // here is the route for our site
+ staticFiles := app.Group("/")
+ staticFiles.Use(middleware.Static("./FrontEnd"))
+
+ api := app.Group("/api/")
+ api.GET("/getAssignment", handler.GetAssignment)
+}
diff --git a/signals/table.go b/signals/table.go
new file mode 100644
index 0000000..5ef5663
--- /dev/null
+++ b/signals/table.go
@@ -0,0 +1,12 @@
+package signals
+
+import (
+ "github.com/golang-module/carbon/v2"
+)
+
+type TablePrototype struct {
+ LastUpdated carbon.Carbon //值班表最后更新的时间
+ NeedUpdate bool //值班表是否需要更新
+}
+
+var Table TablePrototype