From 66b3a30a62c3cebce69d63819fe3bb3ecb77c3a0 Mon Sep 17 00:00:00 2001 From: engigu Date: Sun, 31 Dec 2023 21:31:56 +0800 Subject: [PATCH] feat: complete settings --- .idea/.gitignore | 8 ++ .idea/inspectionProfiles/Project_Default.xml | 6 ++ .idea/message-nest.iml | 9 ++ .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 ++ go.mod | 1 + go.sum | 2 + main.go | 4 + models/models.go | 13 +-- models/send_tasks_logs.go | 28 +++++- models/settings.go | 58 ++++++++++++ pkg/constant/constant.go | 28 ++++++ pkg/constant/release_log.go | 15 ++++ pkg/setting/setting.go | 10 +-- pkg/table/table.go | 2 + routers/api/v1/user_settings.go | 67 +++++++++++++- routers/router.go | 2 + service/cron_service/cron_service.go | 78 ++++++++++++++++ service/cron_service/tasks.go | 52 +++++++++++ service/env_service/env_service.go | 48 ++++++++++ service/settings_service/settings.go | 90 +++++++++++++++++++ web/src/views/tabsTools/settings/settings.vue | 4 +- .../views/tabsTools/settings/view/about.vue | 27 ++++-- .../tabsTools/settings/view/setLogClean.vue | 32 +++++-- .../tabsTools/settings/view/siteCustom.vue | 34 +++++-- 25 files changed, 595 insertions(+), 37 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/message-nest.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 models/settings.go create mode 100644 pkg/constant/constant.go create mode 100644 pkg/constant/release_log.go create mode 100644 service/cron_service/cron_service.go create mode 100644 service/cron_service/tasks.go create mode 100644 service/env_service/env_service.go diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..03d9549 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/message-nest.iml b/.idea/message-nest.iml new file mode 100644 index 0000000..5e764c4 --- /dev/null +++ b/.idea/message-nest.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..09a9ff1 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/go.mod b/go.mod index 68c9faf..801aca6 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/go-playground/validator/v10 v10.16.0 github.com/google/uuid v1.5.0 github.com/jinzhu/gorm v0.0.0-20180213101209-6e1387b44c64 + github.com/robfig/cron/v3 v3.0.1 github.com/sirupsen/logrus v1.9.3 github.com/unknwon/com v1.0.1 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df diff --git a/go.sum b/go.sum index 87f678d..698a133 100644 --- a/go.sum +++ b/go.sum @@ -86,6 +86,8 @@ github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOS github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= diff --git a/main.go b/main.go index 363d667..f3ce58f 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,8 @@ import ( "fmt" "log" "message-nest/pkg/table" + "message-nest/service/cron_service" + "message-nest/service/env_service" "net/http" "github.com/gin-gonic/gin" @@ -21,6 +23,8 @@ func init() { logging.Setup() util.Setup() table.Setup() + env_service.Setup() + cron_service.Setup() } // @title Golang Gin API diff --git a/models/models.go b/models/models.go index afddfa5..ac6aca0 100644 --- a/models/models.go +++ b/models/models.go @@ -13,11 +13,14 @@ import ( var db *gorm.DB -//type Model struct { -// ID int `gorm:"primary_key" json:"id"` -// CreatedOn util.Time `json:"created_on"` -// ModifiedOn util.Time `json:"modified_on"` -//} +type IDModel struct { + ID int `gorm:"primary_key" json:"id"` + + CreatedBy string `json:"created_by"` + ModifiedBy string `json:"modified_by"` + CreatedOn util.Time `json:"created_on"` + ModifiedOn util.Time `json:"modified_on"` +} type UUIDModel struct { ID uuid.UUID `gorm:"primary_key" json:"id"` diff --git a/models/send_tasks_logs.go b/models/send_tasks_logs.go index b1c90c4..b4f5c2d 100644 --- a/models/send_tasks_logs.go +++ b/models/send_tasks_logs.go @@ -44,13 +44,13 @@ func GetSendLogs(pageNum int, pageSize int, name string, taskId string, maps int query := db. Table(logt). Select(fmt.Sprintf("%s.*, %s.name as task_name", logt, taskt)). - Joins(fmt.Sprintf("JOIN %s ON %s.task_id = %s.id", taskt, logt, taskt)) + Joins(fmt.Sprintf("LEFT JOIN %s ON %s.task_id = %s.id", taskt, logt, taskt)) if name != "" { query = query.Where(fmt.Sprintf("%s.name like ?", taskt), fmt.Sprintf("%%%s%%", name)) } if taskId != "" { - query = query.Where(fmt.Sprintf("%s.id = ?", taskt), taskId) + query = query.Where(fmt.Sprintf("%s.task_id = ?", logt), taskId) } query = query.Order("created_on DESC") if pageSize > 0 || pageNum > 0 { @@ -68,13 +68,33 @@ func GetSendLogsTotal(name string, taskId string, maps interface{}) (int, error) taskt := table.TasksTableName query := db. Table(logt). - Joins(fmt.Sprintf("JOIN %s ON %s.task_id = %s.id", taskt, logt, taskt)) + Joins(fmt.Sprintf("LEFT JOIN %s ON %s.task_id = %s.id", taskt, logt, taskt)) if name != "" { query = query.Where(fmt.Sprintf("%s.name like ?", taskt), fmt.Sprintf("%%%s%%", name)) } if taskId != "" { - query = query.Where(fmt.Sprintf("%s.id = ?", taskt), taskId) + query = query.Where(fmt.Sprintf("%s.task_id = ?", logt), taskId) } query.Count(&total) return total, nil } + +// GetSendLogsTotal 获取所有日志总数 +func DeleteOutDateLogs(keepNum int) error { + logt := table.LogsTableName + sql := fmt.Sprintf(`DELETE FROM %s +WHERE id NOT IN ( + SELECT id FROM ( + SELECT id + FROM %s + ORDER BY created_on DESC + LIMIT %d + ) tmp +);`, logt, logt, keepNum) + + result := db.Exec(sql) + if result.Error != nil { + return result.Error + } + return nil +} diff --git a/models/settings.go b/models/settings.go new file mode 100644 index 0000000..133487b --- /dev/null +++ b/models/settings.go @@ -0,0 +1,58 @@ +package models + +import ( + "errors" + "github.com/jinzhu/gorm" + "message-nest/pkg/table" +) + +type Settings struct { + IDModel + + Section string `json:"section"` + Key string `json:"key"` + Value string `json:"value"` +} + +// AddOneSetting 添加一条设置 +func AddOneSetting(setting Settings) error { + if err := db.Create(&setting).Error; err != nil { + return err + } + return nil +} + +// EditSetting 编辑设置 +func EditSetting(id int, data interface{}) error { + if err := db.Model(&Settings{}).Where("id = ? ", id).Updates(data).Error; err != nil { + return err + } + + return nil +} + +// DeleteMsgTaskIns 删除一条设置 +func DeleteSettingByKey(section string, key string) error { + if err := db.Where("`section` = ? and `key` = ? ", section, key).Delete(&Settings{}).Error; err != nil { + return err + } + return nil +} + +func GetSettingByKey(section string, key string) (Settings, error) { + var setting Settings + err := db.Where("`section` = ? and `key` = ? ", section, key).Find(&setting).Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + return setting, err + } + return setting, nil +} + +func GetSettingBySection(section string) ([]Settings, error) { + var settings []Settings + err := db.Table(table.SettingsTableName).Where("`section` = ? ", section).Scan(&settings).Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + return settings, err + } + return settings, nil +} diff --git a/pkg/constant/constant.go b/pkg/constant/constant.go new file mode 100644 index 0000000..b2c2fa2 --- /dev/null +++ b/pkg/constant/constant.go @@ -0,0 +1,28 @@ +package constant + +var CleanLogsTaskId = "00000000-0000-0000-0000-000000000001" +var SiteSettingSectionName = "site_config" + +//var SiteSettingTitleKeyName = "title" +//var SiteSettingSloganKeyName = "slogan" +//var SiteSettingLogoKeyName = "logo" + +// 站点信息默认值 +var SiteSiteDefaultValueMap = map[string]string{ + "title": "Message Nest", + "slogan": "A Message Way Hosted Site", + "logo": "", +} + +// 日志清理自定义 +var LogsCleanSectionName = "log_config" +var LogsCleanCronKeyName = "cron" +var LogsCleanKeepKeyName = "keep_num" + +// 日志清理默认值 +var LogsCleanDefaultValueMap = map[string]string{ + "cron": "1 0 * * *", + "keep_num": "1000", +} + +var AboutSectionName = "about" diff --git a/pkg/constant/release_log.go b/pkg/constant/release_log.go new file mode 100644 index 0000000..6c1566c --- /dev/null +++ b/pkg/constant/release_log.go @@ -0,0 +1,15 @@ +package constant + +var LatestVersion = map[string]string{} + +//var info map[string]string + +var V1Version = "v1.0.0" +var V1VersionDesc = `1. 支持邮件消息发送 +2. 支持日志定时删除 +3. 支持账号密码重置` + +func init() { + LatestVersion["version"] = V1Version + LatestVersion["desc"] = V1VersionDesc +} diff --git a/pkg/setting/setting.go b/pkg/setting/setting.go index d7af42b..e4708db 100644 --- a/pkg/setting/setting.go +++ b/pkg/setting/setting.go @@ -27,8 +27,8 @@ type App struct { LogFileExt string TimeFormat string - LogKeepNum int - CleanTaskLogID string + //LogKeepNum int + //CleanTaskLogID string } var AppSetting = &App{} @@ -83,9 +83,9 @@ func Setup() { ServerSetting.WriteTimeout = ServerSetting.WriteTimeout * time.Second RedisSetting.IdleTimeout = RedisSetting.IdleTimeout * time.Second - // 默认值 - AppSetting.LogKeepNum = 1000 - AppSetting.CleanTaskLogID = "00000000-0000-0000-0000-000000000001" + //// 默认值 + //AppSetting.LogKeepNum = 1000 + //AppSetting.CleanTaskLogID = "00000000-0000-0000-0000-000000000001" } // mapTo map section diff --git a/pkg/table/table.go b/pkg/table/table.go index 0083ae9..5d7daf8 100644 --- a/pkg/table/table.go +++ b/pkg/table/table.go @@ -9,10 +9,12 @@ var InsTableName string var WayTableName string var LogsTableName string var TasksTableName string +var SettingsTableName string func Setup() { InsTableName = fmt.Sprintf("%ssend_tasks_ins", setting.DatabaseSetting.TablePrefix) WayTableName = fmt.Sprintf("%ssend_ways", setting.DatabaseSetting.TablePrefix) LogsTableName = fmt.Sprintf("%ssend_tasks_logs", setting.DatabaseSetting.TablePrefix) TasksTableName = fmt.Sprintf("%ssend_tasks", setting.DatabaseSetting.TablePrefix) + SettingsTableName = fmt.Sprintf("%ssettings", setting.DatabaseSetting.TablePrefix) } diff --git a/routers/api/v1/user_settings.go b/routers/api/v1/user_settings.go index 1f065f7..d8fed8a 100644 --- a/routers/api/v1/user_settings.go +++ b/routers/api/v1/user_settings.go @@ -9,7 +9,30 @@ import ( "net/http" ) -type EditUserPasswd struct { +type GetSettingReq struct { + Section string `json:"section" validate:"required,max=50" label:"节点"` +} + +// GetUserSetting 用户重设密码 +func GetUserSetting(c *gin.Context) { + var ( + appG = app.Gin{C: c} + ) + section := c.Query("section") + + settingService := settings_service.UserSettings{} + settings, err := settingService.GetUserSetting(section) + if err != nil { + appG.CResponse(http.StatusBadRequest, fmt.Sprintf("获取失败!错误原因:%s", err), nil) + return + } + + appG.CResponse(http.StatusOK, "获取成功!", settings) + +} + +// EditUserPasswdReq 编辑设置请求 +type EditUserPasswdReq struct { OldPassword string `json:"old_passwd" validate:"required,max=50" label:"旧密码"` NewPassword string `json:"new_passwd" validate:"required,max=50" label:"新密码"` } @@ -18,7 +41,7 @@ type EditUserPasswd struct { func EditPasswd(c *gin.Context) { var ( appG = app.Gin{C: c} - req EditUserPasswd + req EditUserPasswdReq ) currentUser := app.GetCurrentUserName(c) @@ -28,12 +51,12 @@ func EditPasswd(c *gin.Context) { return } - sendTaskService := settings_service.UserSettings{ + settingService := settings_service.UserSettings{ UserName: currentUser, OldPassword: req.OldPassword, NewPassword: req.NewPassword, } - err := sendTaskService.EditUserPasswd() + err := settingService.EditUserPasswd() if err != nil { appG.CResponse(http.StatusBadRequest, fmt.Sprintf("修改密码失败!错误原因:%s", err), nil) return @@ -42,3 +65,39 @@ func EditPasswd(c *gin.Context) { appG.CResponse(http.StatusOK, "修改成功!", nil) } + +type SettingReq struct { + Section string `json:"section" validate:"required,max=50" label:"一级分类"` + Data map[string]string +} + +// EditSettings 编辑设置 +func EditSettings(c *gin.Context) { + var ( + appG = app.Gin{C: c} + req SettingReq + ) + errCode, errStr := app.BindJsonAndPlayValid(c, &req) + if errCode != e.SUCCESS { + appG.CResponse(errCode, errStr, nil) + return + } + + currentUser := app.GetCurrentUserName(c) + settingService := settings_service.UserSettings{} + diffStr := settingService.ValidateDiffSetting(req.Section, req.Data) + if diffStr != "" { + appG.CResponse(http.StatusBadRequest, diffStr, nil) + return + } + for key, value := range req.Data { + err := settingService.EditSettings(req.Section, key, value, currentUser) + if err != nil { + appG.CResponse(http.StatusBadRequest, fmt.Sprintf("修改密码失败!错误原因:%s", err), nil) + return + } + } + + appG.CResponse(http.StatusOK, "修改成功!", nil) + +} diff --git a/routers/router.go b/routers/router.go index d996916..609f11b 100644 --- a/routers/router.go +++ b/routers/router.go @@ -46,6 +46,8 @@ func InitRouter() *gin.Engine { // settings apiv1.POST("/settings/setpasswd", v1.EditPasswd) + apiv1.POST("/settings/set", v1.EditSettings) + apiv1.GET("/settings/getsetting", v1.GetUserSetting) } diff --git a/service/cron_service/cron_service.go b/service/cron_service/cron_service.go new file mode 100644 index 0000000..fdfea67 --- /dev/null +++ b/service/cron_service/cron_service.go @@ -0,0 +1,78 @@ +package cron_service + +import ( + "fmt" + "github.com/robfig/cron/v3" + "github.com/unknwon/com" + "message-nest/models" + "message-nest/pkg/constant" + "message-nest/pkg/logging" + "message-nest/service/send_message_service" +) + +type CronService struct { +} + +var ClearLogsTaskId cron.EntryID + +// 清除日志的定时任务 +func ClearLogs() { + var logOutput []string + var errStr string + status := 1 + + sm := send_message_service.SendMessageService{TaskID: constant.CleanLogsTaskId} + logging.Logger.Error("开始清除日志") + logOutput = append(logOutput, "开始清除日志") + + setting, err := models.GetSettingByKey(constant.LogsCleanSectionName, constant.LogsCleanKeepKeyName) + if err != nil { + errStr = fmt.Sprintf("获取日志的保留数失败,原因:%s", err) + logging.Logger.Error(errStr) + sm.MarkStatus(errStr, &status) + logOutput = append(logOutput, errStr) + } + + keepNum := com.StrTo(setting.Value).MustInt() + err = models.DeleteOutDateLogs(keepNum) + if err != nil { + errStr = fmt.Sprintf("删除日志失败,原因:%s", err) + logging.Logger.Error(errStr) + sm.MarkStatus(errStr, &status) + logOutput = append(logOutput, errStr) + } else { + errStr = fmt.Sprintf("删除日志成功,保留数目:%d", keepNum) + logging.Logger.Error(errStr) + logOutput = append(logOutput, errStr) + } + sm.RecordSendLog(logOutput, status) +} + +// 启动注册清除任务定时任务 +func (cs *CronService) InitLogsCronRun() { + setting, err := models.GetSettingByKey(constant.LogsCleanSectionName, constant.LogsCleanCronKeyName) + if err != nil { + logging.Logger.Error(fmt.Sprintf("获取日志的cron失败,原因:%s", err)) + } + ClearLogsTaskId = AddTask(ScheduledTask{ + Schedule: setting.Value, + Job: ClearLogs, + }) +} + +// 更新清除任务定时任务 +func (cs *CronService) UpdateLogsCronRun(cron string) { + RemoveTask(ClearLogsTaskId) + ClearLogsTaskId = AddTask(ScheduledTask{ + Schedule: cron, + Job: ClearLogs, + }) + logging.Logger.Error(fmt.Sprintf("更新日志的cron成功,%s", cron)) + logging.Logger.Info(fmt.Sprintf("所有的定时任务: %s", TaskList)) + +} + +func Setup() { + cs := CronService{} + cs.InitLogsCronRun() +} diff --git a/service/cron_service/tasks.go b/service/cron_service/tasks.go new file mode 100644 index 0000000..c74d899 --- /dev/null +++ b/service/cron_service/tasks.go @@ -0,0 +1,52 @@ +package cron_service + +import ( + "fmt" + "github.com/robfig/cron/v3" + "message-nest/pkg/logging" + "sync" +) + +type ScheduledTask struct { + //ID int + Schedule string + Job func() +} + +var ( + CronInstance *cron.Cron + TaskList map[cron.EntryID]*ScheduledTask + mutex sync.Mutex +) + +func init() { + CronInstance = cron.New() + CronInstance.Start() + TaskList = make(map[cron.EntryID]*ScheduledTask) +} + +// 添加定时任务 +func AddTask(task ScheduledTask) cron.EntryID { + mutex.Lock() + defer mutex.Unlock() + + taskId, err := CronInstance.AddFunc(task.Schedule, task.Job) + if err != nil { + // 处理错误 + logging.Logger.Error(fmt.Sprintf("添加定时任务失败,原因:%s", err)) + } else { + TaskList[taskId] = &task + logging.Logger.Error(fmt.Sprintf("添加日志清除任务成功,entryID: %d", taskId)) + } + return taskId +} + +// 删除定时任务 +func RemoveTask(taskID cron.EntryID) { + mutex.Lock() + defer mutex.Unlock() + if _, ok := TaskList[taskID]; ok { + CronInstance.Remove(taskID) + delete(TaskList, taskID) + } +} diff --git a/service/env_service/env_service.go b/service/env_service/env_service.go new file mode 100644 index 0000000..3edcad3 --- /dev/null +++ b/service/env_service/env_service.go @@ -0,0 +1,48 @@ +package env_service + +import ( + "message-nest/models" + "message-nest/pkg/constant" + "message-nest/pkg/logging" +) + +type EnvService struct { +} + +func (es *EnvService) CommonAdd(section string, key string, value string) { + setting, _ := models.GetSettingByKey(section, key) + if setting.ID <= 0 { + err := models.AddOneSetting(models.Settings{ + Section: section, + Key: key, + Value: value, + }) + if err != nil { + logging.Logger.Error("初始化%s:%s失败", section, key) + } else { + logging.Logger.Infof("初始化%s:%s成功", section, key) + } + } +} + +// InitSiteConfig 初始化、重置站点信息设置 +func (es *EnvService) InitSiteConfig() { + section := constant.SiteSettingSectionName + for key, value := range constant.SiteSiteDefaultValueMap { + es.CommonAdd(section, key, value) + } +} + +// InitLogConfig 初始化日志清理设置 +func (es *EnvService) InitLogConfig() { + section := constant.LogsCleanSectionName + for key, value := range constant.LogsCleanDefaultValueMap { + es.CommonAdd(section, key, value) + } +} + +func Setup() { + es := EnvService{} + es.InitSiteConfig() + es.InitLogConfig() +} diff --git a/service/settings_service/settings.go b/service/settings_service/settings.go index 99b4023..984ab2c 100644 --- a/service/settings_service/settings.go +++ b/service/settings_service/settings.go @@ -2,7 +2,12 @@ package settings_service import ( "errors" + "fmt" + "github.com/robfig/cron/v3" "message-nest/models" + "message-nest/pkg/app" + "message-nest/pkg/constant" + "message-nest/service/cron_service" ) type UserSettings struct { @@ -21,3 +26,88 @@ func (us *UserSettings) EditUserPasswd() error { user["password"] = us.NewPassword return models.EditUser(us.UserName, user) } + +// GetUserSetting 获取用户设置 +func (us *UserSettings) GetUserSetting(section string) (map[string]string, error) { + result := make(map[string]string) + settings, err := models.GetSettingBySection(section) + if err != nil { + return result, err + } + for _, setting := range settings { + result[setting.Key] = setting.Value + } + // 版本信息单独获取 + if section == constant.AboutSectionName { + result = constant.LatestVersion + } + return result, nil +} + +// EditSettings 便捷自定义设置 +func (us *UserSettings) EditSettings(section string, key string, value string, currentUser string) error { + setting, _ := models.GetSettingByKey(section, key) + if setting.ID <= 0 { + err := models.AddOneSetting(models.Settings{ + IDModel: models.IDModel{ + CreatedBy: currentUser, + ModifiedBy: currentUser, + }, + Section: section, + Key: key, + Value: value, + }) + return err + } else { + if value == "" { + return nil + } + data := make(map[string]interface{}) + data["section"] = section + data["key"] = key + data["value"] = value + data["modified_by"] = currentUser + err := models.EditSetting(setting.ID, data) + if key == constant.LogsCleanCronKeyName { + cronService := cron_service.CronService{} + cronService.UpdateLogsCronRun(value) + } + return err + } +} + +// 站点自定义的结构 +type SiteConfig struct { + Title string `json:"title" validate:"omitempty,min=1,max=50" label:"网站标题"` + Slogan string `json:"slogan" validate:"omitempty,min=1,max=50" label:"网站slogan"` + Logo string `json:"logo" validate:"omitempty,min=1" label:"logo"` +} + +type LogConfig struct { + Cron string `json:"cron" validate:"required,cron" label:"日志定时表达式"` + KeepNum string `json:"keep_num" validate:"required,min=1,max=50" label:"日志保留数"` +} + +// ValidateDiffSetting 校验不同的设置 +func (us *UserSettings) ValidateDiffSetting(section string, data map[string]string) string { + if section == constant.SiteSettingSectionName { + var config SiteConfig + config.Title = data["title"] + config.Slogan = data["slogan"] + config.Logo = data["logo"] + _, errStr := app.CommonPlaygroundValid(config) + return errStr + } + if section == constant.LogsCleanSectionName { + var config LogConfig + config.Cron = data["cron"] + config.KeepNum = data["keep_num"] + _, err := cron.ParseStandard(config.Cron) + if err != nil { + return fmt.Sprintf("%s 不是合法的corn表达式", config.Cron) + } + _, errStr := app.CommonPlaygroundValid(config) + return errStr + } + return fmt.Sprintf("未知的section:%s", section) +} diff --git a/web/src/views/tabsTools/settings/settings.vue b/web/src/views/tabsTools/settings/settings.vue index 20d1f29..2ce49b6 100644 --- a/web/src/views/tabsTools/settings/settings.vue +++ b/web/src/views/tabsTools/settings/settings.vue @@ -10,9 +10,9 @@ 日志清理 - + 站点关于 diff --git a/web/src/views/tabsTools/settings/view/about.vue b/web/src/views/tabsTools/settings/view/about.vue index dd5eb4b..f3c3716 100644 --- a/web/src/views/tabsTools/settings/view/about.vue +++ b/web/src/views/tabsTools/settings/view/about.vue @@ -1,14 +1,12 @@