From 3bc0069fb9e5b6309a5fbbf7fcc7d10710a29689 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 29 Sep 2026 15:46:21 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E9=A1=B5=20banner=20=E7=AB=99?= =?UTF-8?q?=E5=86=85=E9=93=BE=E6=8E=A5=E8=87=AA=E5=8A=A8=E8=A1=A5=E5=B0=BE?= =?UTF-8?q?=E6=96=9C=E6=9D=A0=EF=BC=8C=E9=81=BF=E5=85=8D=E5=A4=9A=E4=B8=80?= =?UTF-8?q?=E6=AC=A1=20301?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- app/service/playletser/home.go | 22 +++++++++++++++ app/service/playletser/home_banner_test.go | 32 ++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 app/service/playletser/home_banner_test.go diff --git a/app/service/playletser/home.go b/app/service/playletser/home.go index e2bbc08..5a4b19e 100644 --- a/app/service/playletser/home.go +++ b/app/service/playletser/home.go @@ -2,6 +2,9 @@ package playletser import ( "fmt" + "net/url" + "path" + "strings" "sync" "time" "videoweb/app/service/upstream" @@ -101,7 +104,26 @@ func ActiveHomeBanners(list []HomeBannerData) []HomeBannerData { if !item.Status { continue } + item.URL = normalizeBannerURL(item.URL) out = append(out, item) } return out } + +// normalizeBannerURL 站内页面链接补尾斜杠,避免后台漏填 "/" 时每次点击都多一次 301。 +// 外链、协议相对地址、带扩展名的文件路径保持原样。 +func normalizeBannerURL(raw string) string { + raw = strings.TrimSpace(raw) + if !strings.HasPrefix(raw, "/") || strings.HasPrefix(raw, "//") { + return raw + } + u, err := url.Parse(raw) + if err != nil || u.Path == "" || strings.HasSuffix(u.Path, "/") { + return raw + } + if strings.Contains(path.Base(u.Path), ".") { + return raw + } + u.Path += "/" + return u.String() +} diff --git a/app/service/playletser/home_banner_test.go b/app/service/playletser/home_banner_test.go new file mode 100644 index 0000000..cc95cee --- /dev/null +++ b/app/service/playletser/home_banner_test.go @@ -0,0 +1,32 @@ +package playletser + +import "testing" + +func TestNormalizeBannerURL(t *testing.T) { + cases := map[string]string{ + "/detail/hqtqxdqe": "/detail/hqtqxdqe/", + "/detail/hqtqxdqe/": "/detail/hqtqxdqe/", + " /play/abc ": "/play/abc/", + "/detail/abc?from=banner": "/detail/abc/?from=banner", + "/": "/", + "": "", + "https://example.com/a": "https://example.com/a", + "//cdn.example.com/a": "//cdn.example.com/a", + "/static/images/a.png": "/static/images/a.png", + } + for in, want := range cases { + if got := normalizeBannerURL(in); got != want { + t.Errorf("normalizeBannerURL(%q) = %q, want %q", in, got, want) + } + } +} + +func TestActiveHomeBannersNormalizesURL(t *testing.T) { + got := ActiveHomeBanners([]HomeBannerData{ + {ID: 1, URL: "/detail/abc", Status: true}, + {ID: 2, URL: "/detail/off", Status: false}, + }) + if len(got) != 1 || got[0].URL != "/detail/abc/" { + t.Fatalf("unexpected banners: %+v", got) + } +}