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 @@
-
当前版本:v1.0.0
+
当前版本:{{ version }}
版本功能说明
- logo请输入svg文本,替换后登录页面、ico、导航栏logo将全部一起更换
-
- *将在下一次登录的时候生效
+
@@ -20,7 +18,7 @@