diff --git a/dao/logger.go b/dao/logger.go index 4161772..b5b6482 100644 --- a/dao/logger.go +++ b/dao/logger.go @@ -26,3 +26,13 @@ func deleteByID(id int) bool { DB.Where("ID = ?", id).Delete(&Logger{}) return true } + +// 删除3天前的日志 +func DeleteLog(days int) bool { + res := DB.Exec("delete from loggers where created_at < DATE_SUB(CURDATE(), INTERVAL ? DAY)", days) + if res.Error != nil { + fmt.Println("DeleteLog error", res.Error) + return false + } + return true +} diff --git a/main.go b/main.go index d506ba1..7fda56c 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,8 @@ package main import ( + "encoding/json" + "fmt" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt" "github.com/robfig/cron/v3" @@ -43,6 +45,8 @@ func main() { log.Fatal("添加定时任务失败: ", err) } c.Start() + //读取配置文件,设置系统 + ReadConfigToSetSystem() r.Run(":" + proto.Config.SERVER_PORT) // listen and serve on 0.0.0.0:8083 } func init() { @@ -86,7 +90,9 @@ func writeLogger(c *gin.Context) { func JWTAuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { - writeLogger(c) + if proto.Config.LOG_SAVE_DAYS > 0 { + writeLogger(c) + } // 从请求头中获取 JWT 令牌 tokenString := c.Request.Header.Get("token") @@ -172,4 +178,89 @@ func myTask() { if proto.Config.MONITOR { handler.ScanDeviceStatus() } + //其它定时任务-通用 + RunGeneralCron() + +} + +func ReadConfigToSetSystem() { + //redis添加通用定时任务 + key := "cron_info" + //日志清理 + res := worker.GetRedis(key) + var cron_infos []proto.CronInfo + if res != "" { + err := json.Unmarshal([]byte(res), &cron_infos) + if err != nil { + fmt.Println("Error decoding config") + } + + //查看清除日志任务是否存在 + if proto.Config.LOG_SAVE_DAYS > 0 { + var is_exist bool + for _, v := range cron_infos { + if v.Type == 1 { + is_exist = true + break + } + } + if !is_exist { + var logClean proto.CronInfo + logClean.Type = 1 + logClean.Info = "日志清理" + logClean.Curr = 86400 + logClean.Every = 86400 + cron_infos = append(cron_infos, logClean) + } + + } + } else { + if proto.Config.LOG_SAVE_DAYS > 0 { + var logClean proto.CronInfo + logClean.Type = 1 + logClean.Info = "日志清理" + logClean.Curr = 86400 + logClean.Every = 86400 + cron_infos = append(cron_infos, logClean) + } + } + //存入redis + data, err := json.Marshal(cron_infos) + if err != nil { + fmt.Println("Error encoding config") + } + worker.SetRedis(key, string(data)) +} + +func RunGeneralCron() { + //redis添加通用定时任务 + key := "cron_info" + //日志清理 + res := worker.GetRedis(key) + var cron_infos []proto.CronInfo + if res != "" { + err := json.Unmarshal([]byte(res), cron_infos) + if err != nil { + fmt.Println("Error decoding config") + } + for _, v := range cron_infos { + //1:日志清理,其他待定 + if v.Type == 1 { + //日志清理 + if v.Curr <= 0 { + //执行日志清理 + go dao.DeleteLog(proto.Config.LOG_SAVE_DAYS) + v.Curr = v.Every + } else { + v.Curr -= 10 + } + } + } + //存入redis + data, err := json.Marshal(cron_infos) + if err != nil { + fmt.Println("Error encoding config") + } + worker.SetRedis(key, string(data)) + } } diff --git a/proto/conf.go b/proto/conf.go index 508ae90..18b7577 100644 --- a/proto/conf.go +++ b/proto/conf.go @@ -74,8 +74,9 @@ type ConfigStruct struct { TOKEN_SECRET string `json:"token_secret"` CID_BASE_DIR string `json:"cid_base_dir"` FILE_BASE_DIR string `json:"file_base_dir"` - MONITOR bool `json:"monitor"` // 状态监控及邮件通知 - SERVER_PORT string `json:"server_port"` // 服务端口 + MONITOR bool `json:"monitor"` // 状态监控及邮件通知 + SERVER_PORT string `json:"server_port"` // 服务端口 + LOG_SAVE_DAYS int `json:"log_save_days"` // 日志保存天数,-1表示不保存,0表示永久保存 } // 读取配置文件 diff --git a/proto/user_req.go b/proto/user_req.go index 6baa463..426c3a1 100644 --- a/proto/user_req.go +++ b/proto/user_req.go @@ -17,3 +17,11 @@ type CIDRUN struct { Curr int `json:"curr" form:"curr"` //当前剩余时间,每次执行减10s小于等于0则执行 Every int `json:"every" form:"every"` //每隔多少秒执行一次,小于等于0表示不执行,时间粒度为10s } + +// 用于执行函数,方法 +type CronInfo struct { + Type int `json:"type" form:"type"` //类型编码,1日志清理(且只会有一个),其他待定 + Info string `json:"info" form:"info"` //信息 + Curr int `json:"curr" form:"curr"` //当前剩余时间,每次执行减10s小于等于0则执行 + Every int `json:"every" form:"every"` //每隔多少秒执行一次,小于等于0表示不执行,时间粒度为10s +}