From 1aba1e4ac394784da8d6b721120cb68a0b7cf9ef Mon Sep 17 00:00:00 2001 From: jinjianmingming <17610798380@163.com> Date: Thu, 18 Jul 2024 10:39:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=AD=89=E7=BA=A7=E5=88=B7=E6=96=B0=E6=B5=8B=E8=AF=95,?= =?UTF-8?q?=E9=BB=98=E8=AE=A424h=E6=89=AB=E6=8F=8F=E4=B8=80=E6=AC=A1,?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E9=80=9A=E8=BF=87TIMER=5FFREQUENCY=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E6=97=B6=E9=97=B4=E5=8D=95=E4=BD=8D=E6=98=AF=E5=B0=8F?= =?UTF-8?q?=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/config/config.go | 1 + main.go | 3 +++ model/option.go | 11 ++++++++--- model/user.go | 43 +++++++++++++---------------------------- 4 files changed, 25 insertions(+), 33 deletions(-) diff --git a/common/config/config.go b/common/config/config.go index 11da0b96..59db1086 100644 --- a/common/config/config.go +++ b/common/config/config.go @@ -99,6 +99,7 @@ var requestInterval, _ = strconv.Atoi(os.Getenv("POLLING_INTERVAL")) var RequestInterval = time.Duration(requestInterval) * time.Second var SyncFrequency = env.Int("SYNC_FREQUENCY", 10*60) // unit is second +var TimerFrequency = env.Int("TIMER_FREQUENCY", 24) // unit is hour var BatchUpdateEnabled = false var BatchUpdateInterval = env.Int("BATCH_UPDATE_INTERVAL", 5) diff --git a/main.go b/main.go index 67a3cd95..3c304abd 100644 --- a/main.go +++ b/main.go @@ -73,6 +73,8 @@ func main() { go model.SyncOptions(config.SyncFrequency) go model.SyncChannelCache(config.SyncFrequency) } + go model.ScheduleCheckAndDowngrade(config.TimerFrequency) + if os.Getenv("CHANNEL_TEST_FREQUENCY") != "" { frequency, err := strconv.Atoi(os.Getenv("CHANNEL_TEST_FREQUENCY")) if err != nil { @@ -112,4 +114,5 @@ func main() { if err != nil { logger.FatalLog("failed to start HTTP server: " + err.Error()) } + } diff --git a/model/option.go b/model/option.go index a62bd5b4..cee6d214 100644 --- a/model/option.go +++ b/model/option.go @@ -78,6 +78,14 @@ func InitOptionMap() { loadOptionsFromDatabase() } +func ScheduleCheckAndDowngrade(intervalHours int) { + for { + logger.SysLog("Check user group levels.") + checkAndDowngradeUsers() + time.Sleep(time.Duration(intervalHours) * time.Hour) + } +} + func loadOptionsFromDatabase() { options, _ := AllOption() for _, option := range options { @@ -95,9 +103,6 @@ func SyncOptions(frequency int) { for { time.Sleep(time.Duration(frequency) * time.Second) logger.SysLog("syncing options from database") - if config.IsMasterNode { - checkAndDowngradeUsers() - } loadOptionsFromDatabase() } } diff --git a/model/user.go b/model/user.go index 0b061169..517fa03a 100644 --- a/model/user.go +++ b/model/user.go @@ -459,38 +459,21 @@ func GetUsernameById(id int) (username string) { } func checkAndDowngradeUsers() { - var users []User + // 获取当前时间的 Unix 时间戳 + currentTime := time.Now().Unix() - // 查询所有 Group 不为 "default" 的用户 - // 构建查询条件 - query := DB.Where("`Group` <> ?", "default"). // Group 不等于 "default" - Where("`username` <> ?", "root"). // username 不等于 "root" - Where("`expiration_date` IS NOT NULL"). // expiration_date 不为空 - Where("`expiration_date` != ?", -1) // expiration_date 不等于 -1 + // 构建更新条件并执行更新 + result := DB.Model(&User{}). + Where("`Group` <> ?", "default"). + Where("`username` <> ?", "root"). + Where("`expiration_date` IS NOT NULL"). + Where("`expiration_date` != ?", -1). + Where("`expiration_date` < ?", currentTime). + Update("Group", "default") - // 执行查询并处理错误 - if err := query.Find(&users).Error; err != nil { - log.Printf("查询用户失败: %v", err) + // 处理错误 + if result.Error != nil { + log.Printf("批量更新用户分组失败: %v", result.Error) return } - - currentTime := time.Now() - - for _, user := range users { - if user.Group != "default" { - // 将时间戳转换为 time.Time 类型 - expirationTime := time.Unix(user.ExpirationDate, 0) - - // 比较当前时间和到期时间 - if expirationTime.Before(currentTime) { - // 降级为 default - user.Group = "default" - if err := DB.Model(&user).Updates(user).Error; err != nil { - log.Printf("更新用户 %s 失败: %v", user.Username, err) - } else { - fmt.Printf("用户: %s, 特权组过期降为 default\n", user.Username) - } - } - } - } }