feat: complete Kra admin backend migration

This commit is contained in:
2026-08-14 00:28:37 +08:00
parent c4bf7ee03b
commit acba9624d7
88 changed files with 1765 additions and 8623 deletions
+43 -25
View File
@@ -15,7 +15,7 @@ import (
"google.golang.org/protobuf/proto"
)
func registerSystemConfigRoutes(group *gin.RouterGroup, config *conf.AdminBackend, systemService *service.SystemService, settings *service.SettingsService) {
func registerSystemConfigRoutes(group *gin.RouterGroup, config *conf.AdminBackend, systemService *service.SystemService, settings *service.SettingsService, scheduler *TaskScheduler) {
security := group.Group("/securityConfig")
security.GET("/getSecurityConfig", func(c *gin.Context) {
value, err := settings.Security(c.Request.Context())
@@ -54,6 +54,9 @@ func registerSystemConfigRoutes(group *gin.RouterGroup, config *conf.AdminBacken
if config.Local != nil {
admin["local"] = gin.H{"storePath": config.Local.StorePath, "pathPrefix": config.Local.PathPrefix}
}
if config.Media != nil {
admin["media"] = gin.H{"sessionTtl": config.Media.SessionTtl}
}
if config.Email != nil {
email = gin.H{"to": config.Email.To, "from": config.Email.From, "host": config.Email.Host, "secret": "******", "nickname": config.Email.Nickname, "port": config.Email.Port, "is-ssl": config.Email.IsSsl, "is-loginauth": config.Email.IsLoginAuth}
}
@@ -78,6 +81,9 @@ func registerSystemConfigRoutes(group *gin.RouterGroup, config *conf.AdminBacken
StorePath string `json:"storePath"`
PathPrefix string `json:"pathPrefix"`
} `json:"local"`
Media struct {
SessionTTL int32 `json:"sessionTtl"`
} `json:"media"`
Storage *conf.AdminBackend_Storage `json:"storage"`
} `json:"admin"`
Email *struct {
@@ -97,48 +103,60 @@ func registerSystemConfigRoutes(group *gin.RouterGroup, config *conf.AdminBacken
return
}
if config != nil {
config.RouterPrefix = req.Config.Admin.RouterPrefix
if config.Jwt != nil {
next := proto.Clone(config).(*conf.AdminBackend)
next.RouterPrefix = req.Config.Admin.RouterPrefix
if next.Jwt != nil {
if req.Config.Admin.JWT.SigningKey != "" && req.Config.Admin.JWT.SigningKey != "******" {
config.Jwt.SigningKey = req.Config.Admin.JWT.SigningKey
next.Jwt.SigningKey = req.Config.Admin.JWT.SigningKey
}
if req.Config.Admin.JWT.Issuer != "" {
config.Jwt.Issuer = req.Config.Admin.JWT.Issuer
next.Jwt.Issuer = req.Config.Admin.JWT.Issuer
}
}
if config.Local != nil {
if next.Local != nil {
if req.Config.Admin.Local.StorePath != "" {
config.Local.StorePath = req.Config.Admin.Local.StorePath
next.Local.StorePath = req.Config.Admin.Local.StorePath
}
if req.Config.Admin.Local.PathPrefix != "" {
config.Local.PathPrefix = req.Config.Admin.Local.PathPrefix
next.Local.PathPrefix = req.Config.Admin.Local.PathPrefix
}
}
if next.Media != nil && req.Config.Admin.Media.SessionTTL > 0 {
next.Media.SessionTtl = req.Config.Admin.Media.SessionTTL
}
if req.Config.Admin.Storage != nil {
preserveStorageSecrets(req.Config.Admin.Storage, config.Storage)
config.Storage = req.Config.Admin.Storage
preserveStorageSecrets(req.Config.Admin.Storage, next.Storage)
next.Storage = req.Config.Admin.Storage
}
if config.Email != nil && req.Config.Email != nil {
config.Email.To = req.Config.Email.To
config.Email.From = req.Config.Email.From
config.Email.Host = req.Config.Email.Host
config.Email.Nickname = req.Config.Email.Nickname
config.Email.Port = req.Config.Email.Port
config.Email.IsSsl = req.Config.Email.IsSSL
config.Email.IsLoginAuth = req.Config.Email.IsLoginAuth
if next.Email != nil && req.Config.Email != nil {
next.Email.To = req.Config.Email.To
next.Email.From = req.Config.Email.From
next.Email.Host = req.Config.Email.Host
next.Email.Nickname = req.Config.Email.Nickname
next.Email.Port = req.Config.Email.Port
next.Email.IsSsl = req.Config.Email.IsSSL
next.Email.IsLoginAuth = req.Config.Email.IsLoginAuth
if req.Config.Email.Secret != "" && req.Config.Email.Secret != "******" {
config.Email.Secret = req.Config.Email.Secret
next.Email.Secret = req.Config.Email.Secret
}
}
if err := systemService.PersistAdminConfig(c.Request.Context(), next); err != nil {
fail(c, "配置保存失败: "+err.Error())
return
}
}
if err := systemService.PersistConfig(c.Request.Context()); err != nil {
fail(c, "配置保存失败: "+err.Error())
return
}
writeResult(c, codeSuccess, gin.H{"restartRequired": true}, "配置已保存,重启服务后完整生效")
writeResult(c, codeSuccess, gin.H{}, "设置成功")
})
system.POST("/reloadSystem", func(c *gin.Context) {
writeResult(c, codeSuccess, gin.H{"reload": false, "restartRequired": true}, "配置已在当前进程部分生效;路由与存储配置需重启服务")
if err := systemService.ReloadConfig(c.Request.Context()); err != nil {
fail(c, "重载系统失败:"+err.Error())
return
}
if err := scheduler.Reload(c.Request.Context()); err != nil {
fail(c, "系统配置已重载,但定时任务重载失败:"+err.Error())
return
}
writeResult(c, codeSuccess, gin.H{}, "重载系统成功")
})
system.POST("/getServerInfo", func(c *gin.Context) {
cpuPercent, _ := cpu.Percent(200*time.Millisecond, false)