diff --git a/assets/favicon.svg b/assets/favicon.svg index 9df6b83b56..19ed46028c 100644 --- a/assets/favicon.svg +++ b/assets/favicon.svg @@ -1,31 +1,20 @@ - - - - - - - - - - - + + + + + + + + + + + + diff --git a/assets/logo.svg b/assets/logo.svg index 9df6b83b56..110dc295be 100644 --- a/assets/logo.svg +++ b/assets/logo.svg @@ -1,31 +1,22 @@ - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/models/system/setting.go b/models/system/setting.go index 4472b4c228..d737589e2b 100644 --- a/models/system/setting.go +++ b/models/system/setting.go @@ -99,6 +99,21 @@ func SetSettings(ctx context.Context, settings map[string]string) error { }) } +func SetSetting(ctx context.Context, key, value string) error { + return SetSettings(ctx, map[string]string{key: value}) +} + +func GetSetting(ctx context.Context, key string) (string, error) { + setting, exist, err := db.Get[Setting](ctx, builder.Eq{"setting_key": key}) + if err != nil { + return "", err + } + if !exist { + return "", nil + } + return setting.SettingValue, nil +} + type dbConfigCachedGetter struct { mu sync.RWMutex diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index ff32c94ff9..bc3107897b 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -3411,6 +3411,10 @@ config.session_life_time = Session Life Time config.https_only = HTTPS Only config.cookie_life_time = Cookie Life Time +config.app_logo_config = Application Logo Configuration +config.choose_new_logo = Choose New Logo +config.update_logo = Update Logo + config.picture_config = Picture and Avatar Configuration config.picture_service = Picture Service config.disable_gravatar = Disable Gravatar diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 0be185cd4f..2289c9cf48 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -3400,6 +3400,10 @@ config.session_life_time=Session 生命周期 config.https_only=仅限 HTTPS config.cookie_life_time=Cookie 生命周期 +config.app_logo_config = Logo图标设置 +config.choose_new_logo = 选择新的Logo图标 +config.update_logo = 更新Logo图标 + config.picture_config=图片和头像配置 config.picture_service=图片服务 config.disable_gravatar=禁用 Gravatar 头像 diff --git a/public/assets/img/apple-touch-icon.png b/public/assets/img/apple-touch-icon.png index 0c803d35dc..6366d395c7 100644 Binary files a/public/assets/img/apple-touch-icon.png and b/public/assets/img/apple-touch-icon.png differ diff --git a/public/assets/img/avatar_default.png b/public/assets/img/avatar_default.png index 129967112d..f65c024163 100644 Binary files a/public/assets/img/avatar_default.png and b/public/assets/img/avatar_default.png differ diff --git a/public/assets/img/favicon.png b/public/assets/img/favicon.png index dcd4edb1a3..f65c024163 100644 Binary files a/public/assets/img/favicon.png and b/public/assets/img/favicon.png differ diff --git a/public/assets/img/favicon.svg b/public/assets/img/favicon.svg index 43291345df..19ed46028c 100644 --- a/public/assets/img/favicon.svg +++ b/public/assets/img/favicon.svg @@ -1 +1,20 @@ - \ No newline at end of file + + + + + + + + + + + + + diff --git a/public/assets/img/logo.png b/public/assets/img/logo.png index c7971f9183..f98894ce8f 100644 Binary files a/public/assets/img/logo.png and b/public/assets/img/logo.png differ diff --git a/public/assets/img/logo.svg b/public/assets/img/logo.svg index 43291345df..110dc295be 100644 --- a/public/assets/img/logo.svg +++ b/public/assets/img/logo.svg @@ -1 +1,22 @@ - \ No newline at end of file + + + + + + + + + + + + + + diff --git a/routers/web/admin/config.go b/routers/web/admin/config.go index 0e5b23db6d..3a78f052dc 100644 --- a/routers/web/admin/config.go +++ b/routers/web/admin/config.go @@ -9,7 +9,12 @@ import ( "net/url" "strconv" "strings" - + "io" + "os" + "path/filepath" + "time" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/forms" system_model "code.gitea.io/gitea/models/system" "code.gitea.io/gitea/modules/cache" "code.gitea.io/gitea/modules/git" @@ -253,3 +258,47 @@ func ChangeConfig(ctx *context.Context) { config.GetDynGetter().InvalidateCache() ctx.JSONOK() } + +func LogoPost(ctx *context.Context) { + form := web.GetForm(ctx).(*forms.AvatarForm) + if form.Avatar == nil || form.Avatar.Filename == "" { + ctx.Flash.Error("No file uploaded") + ctx.Redirect(setting.AppSubURL + "/-/admin/config/settings") + return + } + + ext := filepath.Ext(form.Avatar.Filename) + if ext != ".png" && ext != ".jpg" && ext != ".jpeg" && ext != ".gif" && ext != ".webp" { + ctx.Flash.Error("Invalid file type") + ctx.Redirect(setting.AppSubURL + "/-/admin/config/settings") + return + } + + // 生成唯一文件名 + filename := "logo_" + strconv.FormatInt(time.Now().Unix(), 10) + ext + savePath := filepath.Join(setting.CustomPath, "public", "assets", "img", filename) + os.MkdirAll(filepath.Dir(savePath), os.ModePerm) + out, err := os.Create(savePath) + if err != nil { + ctx.Flash.Error("Failed to save file") + ctx.Redirect(setting.AppSubURL + "/-/admin/config/settings") + return + } + defer out.Close() + fr, _ := form.Avatar.Open() + defer fr.Close() + io.Copy(out, fr) + + // 保存路径到数据库 + relPath := "/assets/img/" + filename + err = system_model.SetSetting(ctx, "custom_logo_path", relPath) + if err != nil { + ctx.Flash.Error("Failed to update database") + ctx.Redirect(setting.AppSubURL + "/-/admin/config/settings") + return + } + + ctx.Flash.Success("Logo updated successfully") + ctx.Redirect(setting.AppSubURL + "/-/admin/config/settings") +} + diff --git a/routers/web/web.go b/routers/web/web.go index b9c7013f63..bfafb75184 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -726,6 +726,7 @@ func registerWebRoutes(m *web.Router) { m.Post("/test_mail", admin.SendTestMail) m.Post("/test_cache", admin.TestCache) m.Get("/settings", admin.ConfigSettings) + m.Post("/logo", web.Bind(forms.AvatarForm{}), admin.LogoPost) }) m.Group("/monitor", func() { diff --git a/services/context/context.go b/services/context/context.go index 32ec260aab..e843e1c6d3 100644 --- a/services/context/context.go +++ b/services/context/context.go @@ -17,6 +17,7 @@ import ( "code.gitea.io/gitea/models/unit" user_model "code.gitea.io/gitea/models/user" + system_model "code.gitea.io/gitea/models/system" "code.gitea.io/gitea/modules/cache" "code.gitea.io/gitea/modules/httpcache" "code.gitea.io/gitea/modules/session" @@ -207,6 +208,12 @@ func Contexter() func(next http.Handler) http.Handler { ctx.Data["ManifestData"] = setting.ManifestData ctx.Data["AllLangs"] = translation.AllLangs() + if logoPath, _ := system_model.GetSetting(ctx, "custom_logo_path"); logoPath != "" { + ctx.Data["CustomLogoPath"] = logoPath + } else { + ctx.Data["CustomLogoPath"] = "" + } + next.ServeHTTP(ctx.Resp, ctx.Req) }) } diff --git a/templates/admin/config_settings.tmpl b/templates/admin/config_settings.tmpl index 6b9bb8275c..2dadd0d265 100644 --- a/templates/admin/config_settings.tmpl +++ b/templates/admin/config_settings.tmpl @@ -1,4 +1,36 @@ {{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin config")}} + +

+ {{ctx.Locale.Tr "admin.config.app_logo_config"}} +

+
+
+ {{.CsrfTokenHtml}} +
+ + +
+ +
+ +
+
+
+

{{ctx.Locale.Tr "admin.config.picture_config"}}

diff --git a/templates/base/head_navbar.tmpl b/templates/base/head_navbar.tmpl index b721779c95..2d30294394 100644 --- a/templates/base/head_navbar.tmpl +++ b/templates/base/head_navbar.tmpl @@ -2,7 +2,7 @@