feat: 优化用户等级刷新测试,默认24h扫描一次,可以通过TIMER_FREQUENCY设置时间单位是小时

This commit is contained in:
jinjianmingming 2024-07-18 10:39:21 +08:00
parent b86a3acd37
commit 1aba1e4ac3
4 changed files with 25 additions and 33 deletions

View File

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

View File

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

View File

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

View File

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