mirror of
https://github.com/ZSCNetSupportDept/scheduler.git
synced 2025-10-28 12:35:03 +08:00
1
This commit is contained in:
7
.gitignore
vendored
7
.gitignore
vendored
@@ -1,5 +1,4 @@
|
|||||||
scheduler
|
|
||||||
scheduler.db
|
|
||||||
|
|
||||||
|
|
||||||
ignore/*
|
ignore/*
|
||||||
|
build/target/*
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
26
Dockerfile
26
Dockerfile
@@ -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"]
|
|
||||||
22
Makefile
22
Makefile
@@ -1,18 +1,8 @@
|
|||||||
build:
|
# 配置项
|
||||||
go build
|
PWD = $(shell pwd)
|
||||||
|
|
||||||
deploy:
|
SOURCE_PATH = $(PWD)/src
|
||||||
go build -o scheduler
|
TARGET_PATH = $(PWD)/build/target
|
||||||
cp -u ./scheduler /opt/scheduler/scheduler
|
INSTALL_PATH = /opt/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参数"
|
|
||||||
|
|
||||||
default: help
|
include build/Makefile
|
||||||
|
|
||||||
clean:
|
|
||||||
rm ./scheduler
|
|
||||||
help:
|
|
||||||
echo "请查看MakeFile文件查看构建选项"
|
|
||||||
|
|||||||
3
build/Help
Executable file
3
build/Help
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
#! /usr/bin/bash
|
||||||
|
|
||||||
|
echo ""
|
||||||
12
build/Makefile
Normal file
12
build/Makefile
Normal 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
|
||||||
101
member.csv
101
member.csv
@@ -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,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
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -2,10 +2,8 @@ package db
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
//"gorm.io/driver/postgres"
|
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"gorm.io/driver/postgres"
|
|
||||||
"gorm.io/driver/sqlite"
|
"gorm.io/driver/sqlite"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"zsxyww.com/scheduler/config"
|
"zsxyww.com/scheduler/config"
|
||||||
@@ -23,7 +21,6 @@ func Connect() {
|
|||||||
default:
|
default:
|
||||||
panic("DBType error")
|
panic("DBType error")
|
||||||
}
|
}
|
||||||
//Main.AutoMigrate(&model.Member{}, &model.Tweak{})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func connectSQLite() {
|
func connectSQLite() {
|
||||||
@@ -33,17 +30,4 @@ func connectSQLite() {
|
|||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
os.Exit(1)
|
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{})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -3,8 +3,12 @@ package db
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/jackc/pgx/v5/pgxpool"
|
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
//"gorm.io/driver/postgres"
|
||||||
|
"github.com/jackc/pgx/v5/pgxpool"
|
||||||
|
"gorm.io/driver/postgres"
|
||||||
|
"gorm.io/gorm"
|
||||||
"zsxyww.com/scheduler/config"
|
"zsxyww.com/scheduler/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -24,3 +28,10 @@ func PGSQL() {
|
|||||||
fmt.Println("Connected to:", version)
|
fmt.Println("Connected to:", version)
|
||||||
PGX = pgx
|
PGX = pgx
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func connectPGSQL() {
|
||||||
|
Main, err = gorm.Open(postgres.Open(config.Default.DB.Path), &gorm.Config{})
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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/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 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
|
||||||
github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
|
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 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
|
||||||
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
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 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
|
||||||
@@ -1,17 +1,13 @@
|
|||||||
package handler
|
package handler
|
||||||
|
|
||||||
import (
|
import (
|
||||||
//"fmt"
|
|
||||||
"errors"
|
"errors"
|
||||||
//"github.com/gocarina/gocsv"
|
"net/http"
|
||||||
|
|
||||||
"github.com/golang-module/carbon/v2"
|
"github.com/golang-module/carbon/v2"
|
||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
"net/http"
|
|
||||||
//"os"
|
|
||||||
//"sync"
|
|
||||||
"zsxyww.com/scheduler/config"
|
"zsxyww.com/scheduler/config"
|
||||||
"zsxyww.com/scheduler/model"
|
"zsxyww.com/scheduler/model"
|
||||||
//"zsxyww.com/scheduler/signals"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// /api/getAssignment GET 获取当日值班表
|
// /api/getAssignment GET 获取当日值班表
|
||||||
@@ -2,38 +2,38 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/gocarina/gocsv"
|
|
||||||
"github.com/labstack/echo/v4"
|
|
||||||
"html/template"
|
"html/template"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"github.com/gocarina/gocsv"
|
||||||
|
"github.com/labstack/echo/v4"
|
||||||
"zsxyww.com/scheduler/config"
|
"zsxyww.com/scheduler/config"
|
||||||
"zsxyww.com/scheduler/database"
|
db "zsxyww.com/scheduler/database"
|
||||||
"zsxyww.com/scheduler/model"
|
"zsxyww.com/scheduler/model"
|
||||||
"zsxyww.com/scheduler/route"
|
"zsxyww.com/scheduler/route"
|
||||||
"zsxyww.com/scheduler/templates"
|
tl "zsxyww.com/scheduler/templates"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
|
//进行各种初始化工作:
|
||||||
|
|
||||||
config.Load()
|
config.Load()
|
||||||
db.Connect()
|
db.Connect()
|
||||||
|
|
||||||
app := echo.New()
|
app := echo.New()
|
||||||
register(app)
|
csv() //初始化Model.MemberList
|
||||||
csv()
|
|
||||||
|
|
||||||
listenAddress := fmt.Sprintf(":%d", config.Default.App.ListenPort)
|
route.Route(app) //注册路由表
|
||||||
|
route.Middleware(app) //注册中间件
|
||||||
app.Logger.Fatal(app.Start(listenAddress))
|
|
||||||
}
|
|
||||||
func register(app *echo.Echo) {
|
|
||||||
route.Route(app)
|
|
||||||
route.Middleware(app)
|
|
||||||
renderer := tl.Tlw{
|
renderer := tl.Tlw{
|
||||||
Tl: template.Must(template.ParseGlob("templates/*.html")),
|
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文件
|
// 读取csv文件
|
||||||
12
src/model/init.go
Normal file
12
src/model/init.go
Normal 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{})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gorm.io/gorm"
|
|
||||||
"time"
|
"time"
|
||||||
"zsxyww.com/scheduler/database"
|
|
||||||
|
"gorm.io/gorm"
|
||||||
|
db "zsxyww.com/scheduler/database"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 这个结构体是供数据库使用的表结构,换班补班蹭班的记录都会以这种方式储存
|
// 这个结构体是供数据库使用的表结构,换班补班蹭班的记录都会以这种方式储存
|
||||||
Reference in New Issue
Block a user