二次开发:补全 PRO 功能 + 优化体验

- 新增站点自定义(标题/Favicon/登录页描述)
- 新增在线自定义 CSS/JS 编辑器
- 扩展备份迁移支持面板配置导出导入
- 默认账号改为 admin/1234
- 设置按钮改为橙色更醒目
- 修复登录页误报"登录过期"弹窗
- 修复 i18n 双重 apps 块导致翻译失效

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
yuming
2026-05-15 14:29:03 +08:00
parent 25f46209d9
commit d6daf1dce6
24 changed files with 587 additions and 46 deletions
+9 -7
View File
@@ -1,11 +1,13 @@
package system
type ApiSystem struct {
About About
LoginApi LoginApi
UserApi UserApi
FileApi FileApi
NoticeApi NoticeApi
ModuleConfigApi ModuleConfigApi
MonitorApi MonitorApi
About About
LoginApi LoginApi
UserApi UserApi
FileApi FileApi
NoticeApi NoticeApi
ModuleConfigApi ModuleConfigApi
MonitorApi MonitorApi
SiteCustomizeApi SiteCustomizeApi
CustomStyleApi CustomStyleApi
}
+33
View File
@@ -0,0 +1,33 @@
package system
import (
"sun-panel/api/api_v1/common/apiReturn"
"sun-panel/global"
"sun-panel/lib/cmn/systemSetting"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
)
type CustomStyleApi struct{}
// 获取自定义 CSS/JS(无需登录)
func (a *CustomStyleApi) Get(c *gin.Context) {
cfg := systemSetting.CustomStyle{}
global.SystemSetting.GetValueByInterface(systemSetting.CUSTOM_STYLE, &cfg)
apiReturn.SuccessData(c, cfg)
}
// 保存自定义 CSS/JS(管理员)
func (a *CustomStyleApi) Set(c *gin.Context) {
cfg := systemSetting.CustomStyle{}
if err := c.ShouldBindBodyWith(&cfg, binding.JSON); err != nil {
apiReturn.ErrorParamFomat(c, err.Error())
return
}
if err := global.SystemSetting.Set(systemSetting.CUSTOM_STYLE, cfg); err != nil {
apiReturn.ErrorDatabase(c, err.Error())
return
}
apiReturn.Success(c)
}
@@ -0,0 +1,33 @@
package system
import (
"sun-panel/api/api_v1/common/apiReturn"
"sun-panel/global"
"sun-panel/lib/cmn/systemSetting"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
)
type SiteCustomizeApi struct{}
// 获取站点自定义配置(无需登录,登录页使用)
func (a *SiteCustomizeApi) Get(c *gin.Context) {
cfg := systemSetting.SiteCustomize{}
global.SystemSetting.GetValueByInterface(systemSetting.SITE_CUSTOMIZE, &cfg)
apiReturn.SuccessData(c, cfg)
}
// 保存站点自定义配置(管理员)
func (a *SiteCustomizeApi) Set(c *gin.Context) {
cfg := systemSetting.SiteCustomize{}
if err := c.ShouldBindBodyWith(&cfg, binding.JSON); err != nil {
apiReturn.ErrorParamFomat(c, err.Error())
return
}
if err := global.SystemSetting.Set(systemSetting.SITE_CUSTOMIZE, cfg); err != nil {
apiReturn.ErrorDatabase(c, err.Error())
return
}
apiReturn.Success(c)
}
+2 -2
View File
@@ -135,13 +135,13 @@ func NotFoundAndCreateUser(db *gorm.DB) error {
if err != gorm.ErrRecordNotFound {
return err
}
username := "admin@sun.cc"
username := "admin"
fUser.Mail = username
fUser.Username = username
fUser.Name = username
fUser.Status = 1
fUser.Role = 1
fUser.Password = cmn.PasswordEncryption("12345678")
fUser.Password = cmn.PasswordEncryption("1234")
if errCreate := db.Create(&fUser).Error; errCreate != nil {
return errCreate
@@ -15,6 +15,8 @@ const (
DISCLAIMER = "disclaimer" // 免责声明 储存类型:字符串
WEB_ABOUT_DESCRIPTION = "web_about_description" // 关于的描述信息
PANEL_PUBLIC_USER_ID = "panel_public_user_id" // 公开访问模式用户id *uint|null
SITE_CUSTOMIZE = "site_customize" // 站点自定义配置
CUSTOM_STYLE = "custom_style" // 自定义 CSS/JS
)
type SystemSettingCache struct {
@@ -43,6 +45,19 @@ type ApplicationSetting struct {
WebSiteUrl string `json:"webSiteUrl"` // 站点地址
}
// 站点自定义配置
type SiteCustomize struct {
SiteTitle string `json:"siteTitle"` // 站点标题(显示在登录页)
FaviconUrl string `json:"faviconUrl"` // Favicon 图标 URL
LoginDescription string `json:"loginDescription"` // 登录页描述文字
}
// 自定义 CSS/JS
type CustomStyle struct {
Css string `json:"css"` // 自定义 CSS 内容
Js string `json:"js"` // 自定义 JS 内容
}
var (
ErrorNoExists = errors.New("no exists")
)
+2
View File
@@ -10,4 +10,6 @@ func Init(routerGroup *gin.RouterGroup) {
InitNoticeRouter(routerGroup)
InitModuleConfigRouter(routerGroup)
InitMonitorRouter(routerGroup)
InitSiteCustomizeRouter(routerGroup)
InitCustomStyleRouter(routerGroup)
}
+19
View File
@@ -0,0 +1,19 @@
package system
import (
"sun-panel/api/api_v1"
"sun-panel/api/api_v1/middleware"
"github.com/gin-gonic/gin"
)
func InitCustomStyleRouter(router *gin.RouterGroup) {
api := api_v1.ApiGroupApp.ApiSystem.CustomStyleApi
// 无需登录
router.POST("/system/customStyle/get", api.Get)
// 管理员才能修改
rAdmin := router.Group("", middleware.LoginInterceptor, middleware.AdminInterceptor)
rAdmin.POST("/system/customStyle/set", api.Set)
}
+19
View File
@@ -0,0 +1,19 @@
package system
import (
"sun-panel/api/api_v1"
"sun-panel/api/api_v1/middleware"
"github.com/gin-gonic/gin"
)
func InitSiteCustomizeRouter(router *gin.RouterGroup) {
api := api_v1.ApiGroupApp.ApiSystem.SiteCustomizeApi
// 无需登录(登录页读取)
router.POST("/system/siteCustomize/get", api.Get)
// 管理员才能修改
rAdmin := router.Group("", middleware.LoginInterceptor, middleware.AdminInterceptor)
rAdmin.POST("/system/siteCustomize/set", api.Set)
}