mirror of
https://github.com/ZSCNetSupportDept/scheduler.git
synced 2025-10-28 04:25:03 +08:00
1
This commit is contained in:
7
.gitignore
vendored
7
.gitignore
vendored
@@ -1,5 +1,4 @@
|
||||
scheduler
|
||||
scheduler.db
|
||||
|
||||
|
||||
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:
|
||||
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
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 (
|
||||
"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{})
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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=
|
||||
@@ -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 获取当日值班表
|
||||
@@ -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
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
|
||||
|
||||
import (
|
||||
"gorm.io/gorm"
|
||||
"time"
|
||||
"zsxyww.com/scheduler/database"
|
||||
|
||||
"gorm.io/gorm"
|
||||
db "zsxyww.com/scheduler/database"
|
||||
)
|
||||
|
||||
// 这个结构体是供数据库使用的表结构,换班补班蹭班的记录都会以这种方式储存
|
||||
Reference in New Issue
Block a user