更新日报相关功能
This commit is contained in:
1 parent
51fd90fc51
commit
68cdaf38fa
23 files changed
+2313
-1056
No files matched your search
@@ -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
|
||||
}
|
||||
Reference in new issue
Block a user