This commit is contained in:
2024-12-10 17:36:50 +08:00
parent 983cde2c7d
commit c63a553d6c
19 changed files with 352 additions and 29 deletions

View File

@@ -0,0 +1,5 @@
<html>
<body>
<h1 align=center>管理</h1>
</body>
</html>

View File

@@ -0,0 +1,7 @@
<html>
<body>
<div>
<h1 align=center>今日值班表</h1>
</div>
</body>
</html>

View File

@@ -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" #开始值班的日期

View File

@@ -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() {

View File

@@ -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())
// }

View File

@@ -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)
// }

6
doc/assignment_test.csv Normal file
View File

@@ -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
1 姓名 工号 性别 权限 有空
2 aaa 2301 1 6 1
3 bbb 2303 0 6 1
4 ccc 2303 1 6 1
5 mam 2304 1 6 5
6 waw 2305 0 6 5

View File

@@ -0,0 +1,5 @@
# 业务描述
这里是业务描述备忘录
## 换班
首先,由换班的发起人填写

10
doc/排班算法.md Normal file
View File

@@ -0,0 +1,10 @@
# 描述
网络维护科(简称为网维)是学校中负责修理同学们网络问题的公益性组织,由大二,大三的正式成员和大一的实习成员组成。
每天网维都会去学校里的各个宿舍片区修理同学们上报的网络问题称之为值班每个片区由一个片区负责人所统领值班这个负责人必须是正式成员。其余的人员为正式成员或者实习成员。每个成员每周只用值班1天每天只会在某个具体的片区值班具体是哪一天取决于他们的空闲时间。
网维所负责值班的片区一共有6个称为1-6号其中1-3号为女生片区4-6号为男生片区。由于网维男生的数量远多于女生所以必须要让男生进入女生宿舍片区值班但是女生会被优先安排在女生宿舍值班换句话说女生只可以出现在女生片区。
为了让实习成员熟悉每一个片区,每两周都会轮换值班每位成员负责值班的的片区,片区的轮换遵守上面的规则,也就是说,女生只会在女生片区内轮换,男生则会在全部的片区内轮换。
一个学期值班的周数不确定但是一般不会少于12周即可以轮换到每个成员。

2
go.mod
View File

@@ -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

4
go.sum
View File

@@ -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=

104
handler/assignments.go Normal file
View File

@@ -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
}

10
main.go
View File

@@ -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)
}

101
member.csv Executable file
View File

@@ -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
1 姓名 工号 性别 权限 有空
2 王小明 10001 1 7 1
3 李芳 10002 1 6 2
4 张强 10003 0 3 5
5 赵丽 10004 1 3 4
6 孙浩 10005 1 7 5
7 刘芳 10006 1 6 6
8 陈伟 10007 1 6 7
9 杨磊 10008 1 7 1
10 张晓婷 10009 1 6 2
11 王志 10010 1 6 3
12 李军 10011 1 7 4
13 赵玉 10012 0 2 5
14 马琳 10013 1 7 6
15 高飞 10014 1 7 7
16 王凯 10015 1 6 1
17 陈颖 10016 1 3 2
18 刘宁 10017 1 6 3
19 孙伟 10018 1 7 4
20 周杰 10019 1 6 5
21 张丽 10020 1 7 6
22 李明 10021 1 6 7
23 陈强 10022 0 3 5
24 王芳 10023 1 7 2
25 赵强 10024 1 7 3
26 李欣 10025 1 7 4
27 刘强 10026 1 6 5
28 张飞 10027 1 7 6
29 陈飞 10028 0 6 5
30 李刚 10029 1 7 1
31 赵勇 10030 1 6 2
32 孙明 10031 1 7 3
33 周飞 10032 1 6 4
34 高伟 10033 1 7 5
35 张晓明 10034 1 3 6
36 赵伟 10035 1 7 7
37 孙丽 10036 1 6 1
38 王晓 10037 1 7 2
39 陈霞 10038 0 2 3
40 赵华 10039 1 7 4
41 杨伟 10040 1 6 5
42 张浩 10041 1 7 6
43 李霞 10042 1 6 7
44 刘伟 10043 1 7 1
45 张伟 10044 1 6 2
46 陈军 10045 1 6 3
47 周丽 10046 1 7 4
48 王宁 10047 0 2 5
49 刘丽 10048 1 7 6
50 赵强 10049 1 7 7
51 孙宁 10050 1 6 1
52 李丽 10051 1 7 2
53 陈宁 10052 1 6 3
54 赵明 10053 1 7 4
55 高霞 10054 1 7 5
56 张凯 10055 0 1 6
57 孙霞 10056 1 7 7
58 陈宁 10057 1 6 1
59 刘军 10058 1 7 2
60 王飞 10059 1 7 3
61 张杰 10060 1 6 4
62 赵刚 10061 1 7 5
63 李晓明 10062 1 6 6
64 高明 10063 1 7 7
65 杨霞 10064 1 7 1
66 王军 10065 1 6 2
67 张霞 10066 1 6 3
68 孙勇 10067 1 7 4
69 赵丽华 10068 1 7 5
70 刘伟华 10069 1 6 6
71 杨强 10070 0 3 7
72 李军华 10071 1 7 1
73 张飞翔 10072 1 7 2
74 陈小明 10073 1 6 3
75 王志华 10074 1 7 4
76 李浩 10075 1 6 5
77 赵宁 10076 1 7 6
78 刘宁华 10077 1 7 7
79 孙杰 10078 1 6 1
80 高磊 10079 1 7 2
81 张宁 10080 1 6 3
82 杨宁 10081 1 7 4
83 陈丽 10082 0 3 5
84 王丽 10083 1 7 6
85 赵志华 10084 1 6 7
86 孙丽华 10085 1 7 1
87 刘志 10086 1 6 2
88 张霞华 10087 1 7 3
89 王磊 10088 1 7 4
90 陈小杰 10089 1 6 5
91 李宁华 10090 1 7 6
92 赵丽杰 10091 1 7 7
93 孙军 10092 1 6 1
94 高志 10093 1 7 2
95 张霞明 10094 1 6 3
96 赵明华 10095 0 0 4
97 陈志华 10096 1 6 5
98 王丽华 10097 1 7 6
99 李强 10098 1 7 7
100 赵晓 10099 1 6 1
101 杨磊明 10100 1 7 2

View File

@@ -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 //前成员

9
model/zones.go Normal file
View File

@@ -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 //歧头

12
route/middleware.go Normal file
View File

@@ -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())
}

16
route/route.go Normal file
View File

@@ -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)
}

12
signals/table.go Normal file
View File

@@ -0,0 +1,12 @@
package signals
import (
"github.com/golang-module/carbon/v2"
)
type TablePrototype struct {
LastUpdated carbon.Carbon //值班表最后更新的时间
NeedUpdate bool //值班表是否需要更新
}
var Table TablePrototype