更新日报相关功能

This commit is contained in:
hero920103 committed 2026-10-22 17:55:50 +08:00
1 parent 51fd90fc51
commit 68cdaf38fa
23 files changed
+2313 -1056

No files matched your search

+108
View File
@@ -7,6 +7,7 @@ import (
"server/models"
"server/pkg/identity"
"server/services"
beego "github.com/beego/beego/v2/server/web"
)
@@ -108,3 +109,110 @@ func (c *PlatformWebsiteSettingController) Save() {
c.Data["json"] = map[string]any{"code": 200, "msg": "保存成功"}
_ = c.ServeJSON()
}
// loginBrandTags 登录页品牌配置项,存放于 yz_platform_site_setting,
// 统一认证中心 /auth/login 渲染时读取。
var loginBrandTags = []string{"login_title", "login_subtitle", "login_logo", "login_bg"}
// LoginBrandInfo GET /platform/loginBrand
// 返回登录页品牌配置(主标题 / 副标题 / Logo / 背景图)。
func (c *PlatformWebsiteSettingController) LoginBrandInfo() {
if _, err := requirePlatform(&c.Controller); err != nil {
code := identity.Status(err)
c.jsonErr(code, code, err.Error())
return
}
all := models.GetPlatformSiteTagMap()
data := make(map[string]string, len(loginBrandTags))
for _, tag := range loginBrandTags {
data[tag] = all[tag]
}
c.Data["json"] = map[string]any{"code": 200, "msg": "success", "data": data}
_ = c.ServeJSON()
}
// SaveLoginBrand POST /platform/saveLoginBrand
// 入参 { login_title, login_subtitle, login_logo, login_bg }。
// 只接受这四个标签,避免与「站点设置」共用的 yz_platform_site_setting 被写入无关项。
func (c *PlatformWebsiteSettingController) SaveLoginBrand() {
if _, err := requirePlatform(&c.Controller); err != nil {
code := identity.Status(err)
c.jsonErr(code, code, err.Error())
return
}
raw, err := io.ReadAll(c.Ctx.Request.Body)
if err != nil {
c.jsonErr(400, 400, "参数错误")
return
}
var payload map[string]string
if uerr := json.Unmarshal(raw, &payload); uerr != nil {
c.jsonErr(400, 400, "参数错误")
return
}
values := make(map[string]string, len(loginBrandTags))
for _, tag := range loginBrandTags {
if v, ok := payload[tag]; ok {
values[tag] = strings.TrimSpace(v)
}
}
if len(values) == 0 {
c.jsonErr(400, 400, "参数错误")
return
}
if len([]rune(values["login_title"])) > 60 {
c.jsonErr(400, 400, "主标题不能超过 60 个字符")
return
}
if len([]rune(values["login_subtitle"])) > 120 {
c.jsonErr(400, 400, "副标题不能超过 120 个字符")
return
}
for _, tag := range []string{"login_logo", "login_bg"} {
img, ok := normalizeLoginBrandImage(values[tag])
if !ok {
c.jsonErr(400, 400, "图片地址必须是 HTTPS 或站内相对路径")
return
}
values[tag] = img
}
if err = models.SavePlatformSiteSettings(values); err != nil {
c.jsonErr(500, 500, "保存失败: "+err.Error())
return
}
c.Data["json"] = map[string]any{"code": 200, "msg": "保存成功"}
_ = c.ServeJSON()
}
// normalizeLoginBrandImage 校验登录页图片地址:
// - 站内相对路径(/uploads/...)直接放行;
// - HTTPS 完整地址放行;
// - HTTP 历史七牛域名尝试改写为存储配置的 HTTPS 基址,改不动则拒绝,
// 否则登录页会被浏览器按 Mixed Content 拦截。
func normalizeLoginBrandImage(raw string) (string, bool) {
raw = strings.TrimSpace(raw)
if raw == "" {
return "", true
}
if strings.HasPrefix(raw, "/") {
return raw, true
}
lower := strings.ToLower(raw)
if strings.HasPrefix(lower, "https://") {
return raw, true
}
if strings.HasPrefix(lower, "http://") {
rewritten := services.ResolvePublicURL("", "", raw)
if strings.HasPrefix(strings.ToLower(rewritten), "https://") {
return rewritten, true
}
return "", false
}
return "", false
}