This commit is contained in:
2025-07-18 09:44:45 +08:00
parent 93975b26bc
commit 72f022a727
45 changed files with 67 additions and 281 deletions

7
.gitignore vendored
View File

@@ -1,5 +1,4 @@
scheduler
scheduler.db
ignore/*
build/target/*

View File

@@ -1,26 +0,0 @@
# 构建阶段
FROM golang:1.23 AS builder
WORKDIR /app
# 复制源码
COPY . .
# 构建二进制文件
RUN go build -o /app/scheduler
# 运行阶段
FROM scratch
WORKDIR /app
# 复制构建好的二进制文件
COPY --from=builder ./scheduler ./scheduler
RUN mkdir -p config
EXPOSE 25005
USER nonroot:nonroot
CMD ["./scheduler","--config","config/config.yaml"]

View File

@@ -1,18 +1,8 @@
build:
go build
# 配置项
PWD = $(shell pwd)
deploy:
go build -o scheduler
cp -u ./scheduler /opt/scheduler/scheduler
cp -r -u FrontEnd /opt/scheduler/FrontEnd
cp -r -u templates /opt/scheduler/templates
cp -r -u tools /opt/scheduler/tools
ln -sf /opt/scheduler/tools/ZSCWW-Scheduler.service /etc/systemd/system/ZSCWW-Scheduler.service
echo "部署脚本执行完成记得放入以及在tools/start.sh中修改配置文件,在新环境运行时记得带上--init-db参数"
SOURCE_PATH = $(PWD)/src
TARGET_PATH = $(PWD)/build/target
INSTALL_PATH = /opt/scheduler
default: help
clean:
rm ./scheduler
help:
echo "请查看MakeFile文件查看构建选项"
include build/Makefile

3
build/Help Executable file
View File

@@ -0,0 +1,3 @@
#! /usr/bin/bash
echo ""

12
build/Makefile Normal file
View File

@@ -0,0 +1,12 @@
.PHONY: clean help
help:
./build/Help
clean:
rm -rf $(TARGET_PATH)/*
scheduler:
cd $(SOURCE_PATH) && go build -o $(TARGET_PATH)/scheduler
all: scheduler

View File

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

View File

@@ -1,28 +0,0 @@
package signals
import (
"sync"
//"zsxyww.com/scheduler/database"
)
var IssueID int
var IssueIDMutex sync.Mutex
func init() {
//启动程序时从数据库获取最后的IssueID用来初始化程序的IssueID变量
}
// IssueID++
func IssueIDPP() {
IssueIDMutex.Lock()
IssueID++
IssueIDMutex.Unlock()
}
func GetIssueID() int {
IssueIDMutex.Lock()
defer IssueIDMutex.Unlock()
return IssueID
}

View File

@@ -1,65 +0,0 @@
package signals
import (
"github.com/golang-module/carbon/v2"
"sync"
)
// 有关值班表相关的状态
type TablePrototype struct {
lastUpdated carbon.Carbon //值班表最后更新的时间,不要直接读取这个变量
LUMutex sync.RWMutex
needUpdate bool //值班表是否需要更新,不要直接读取这个变量
NUMutex sync.RWMutex
}
var Table TablePrototype
// 下面是操作这些状态的专用函数,用且仅用它们来操作上面的全局变量
// 表格最后的更新时间
func (t *TablePrototype) GetLastUpdated() carbon.Carbon {
t.LUMutex.RLock()
defer t.LUMutex.RUnlock()
return t.lastUpdated
}
// 标记最后更新的时间
func (t *TablePrototype) MarkUpdateTime(newtime carbon.Carbon) error {
t.LUMutex.Lock()
defer t.LUMutex.Unlock()
t.lastUpdated = newtime
return nil
}
// 表格需要更新吗?
func (t *TablePrototype) IsNeedUpdate() bool {
t.NUMutex.RLock()
defer t.NUMutex.RUnlock()
return t.needUpdate
}
// 标记表格要求更新吗
func (t *TablePrototype) MarkUpdateStatus(i bool) error {
t.NUMutex.Lock()
defer t.NUMutex.Unlock()
t.needUpdate = i
return nil
}
// 标记表格更新是这两个函数的wrapper,一般用这个
func (t *TablePrototype) SetUpdated(newtime carbon.Carbon) error {
err := t.MarkUpdateTime(newtime)
if err != nil {
return err
}
err = t.MarkUpdateStatus(false)
if err != nil {
return err
}
return nil
}

View File

@@ -2,10 +2,8 @@ package db
import (
"fmt"
//"gorm.io/driver/postgres"
"os"
"gorm.io/driver/postgres"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"zsxyww.com/scheduler/config"
@@ -23,7 +21,6 @@ func Connect() {
default:
panic("DBType error")
}
//Main.AutoMigrate(&model.Member{}, &model.Tweak{})
}
func connectSQLite() {
@@ -33,17 +30,4 @@ func connectSQLite() {
fmt.Println(err)
os.Exit(1)
}
if config.InitDB == true {
//Main.AutoMigrate(&model.Member{}, &model.Tweak{})
}
}
func connectPGSQL() {
Main, err = gorm.Open(postgres.Open(config.Default.DB.Path), &gorm.Config{})
if err != nil {
panic(err)
}
if config.InitDB == true {
//Main.AutoMigrate(&model.Member{}, &model.Tweak{})
}
}

View File

@@ -3,8 +3,12 @@ package db
import (
"context"
"fmt"
"github.com/jackc/pgx/v5/pgxpool"
"os"
//"gorm.io/driver/postgres"
"github.com/jackc/pgx/v5/pgxpool"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"zsxyww.com/scheduler/config"
)
@@ -24,3 +28,10 @@ func PGSQL() {
fmt.Println("Connected to:", version)
PGX = pgx
}
func connectPGSQL() {
Main, err = gorm.Open(postgres.Open(config.Default.DB.Path), &gorm.Config{})
if err != nil {
panic(err)
}
}

View File

View File

@@ -64,8 +64,6 @@ github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
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=

View File

@@ -1,17 +1,13 @@
package handler
import (
//"fmt"
"errors"
//"github.com/gocarina/gocsv"
"net/http"
"github.com/golang-module/carbon/v2"
"github.com/labstack/echo/v4"
"net/http"
//"os"
//"sync"
"zsxyww.com/scheduler/config"
"zsxyww.com/scheduler/model"
//"zsxyww.com/scheduler/signals"
)
// /api/getAssignment GET 获取当日值班表

View File

@@ -2,38 +2,38 @@ package main
import (
"fmt"
"github.com/gocarina/gocsv"
"github.com/labstack/echo/v4"
"html/template"
"os"
"github.com/gocarina/gocsv"
"github.com/labstack/echo/v4"
"zsxyww.com/scheduler/config"
"zsxyww.com/scheduler/database"
db "zsxyww.com/scheduler/database"
"zsxyww.com/scheduler/model"
"zsxyww.com/scheduler/route"
"zsxyww.com/scheduler/templates"
tl "zsxyww.com/scheduler/templates"
)
func main() {
//进行各种初始化工作:
config.Load()
db.Connect()
app := echo.New()
register(app)
csv()
csv() //初始化Model.MemberList
listenAddress := fmt.Sprintf(":%d", config.Default.App.ListenPort)
app.Logger.Fatal(app.Start(listenAddress))
}
func register(app *echo.Echo) {
route.Route(app)
route.Middleware(app)
route.Route(app) //注册路由表
route.Middleware(app) //注册中间件
renderer := tl.Tlw{
Tl: template.Must(template.ParseGlob("templates/*.html")),
}
app.Renderer = renderer
app.Renderer = renderer //注册模板
listenAddress := fmt.Sprintf(":%d", config.Default.App.ListenPort)
app.Logger.Fatal(app.Start(listenAddress)) //启动服务器
}
// 读取csv文件

12
src/model/init.go Normal file
View File

@@ -0,0 +1,12 @@
package model
import (
"zsxyww.com/scheduler/config"
db "zsxyww.com/scheduler/database"
)
func init() {
if config.InitDB == true {
db.Main.AutoMigrate(&Member{}, &Tweak{})
}
}

View File

@@ -1,9 +1,10 @@
package model
import (
"gorm.io/gorm"
"time"
"zsxyww.com/scheduler/database"
"gorm.io/gorm"
db "zsxyww.com/scheduler/database"
)
// 这个结构体是供数据库使用的表结构,换班补班蹭班的记录都会以这种方式储存