feat: 青主题产品壳与静态资源版本号
对齐 SPA 顶栏工具条与清青强调色,CSS/JS 带构建 ?v= 长缓存穿透。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -11,10 +11,11 @@ import (
|
||||
|
||||
// Deps 安装依赖
|
||||
type Deps struct {
|
||||
DataDir string
|
||||
JWTSecret string
|
||||
Auth *services.AuthService
|
||||
Settings *services.ForumSettingsService
|
||||
DataDir string
|
||||
JWTSecret string
|
||||
AssetVersion string
|
||||
Auth *services.AuthService
|
||||
Settings *services.ForumSettingsService
|
||||
}
|
||||
|
||||
type pageData struct {
|
||||
@@ -26,6 +27,7 @@ type pageData struct {
|
||||
LogoURL string
|
||||
FaviconURL string
|
||||
OGImageURL string
|
||||
AssetVersion string
|
||||
ShowFriendLinksFooter bool
|
||||
FooterPages []struct {
|
||||
Title string
|
||||
@@ -59,6 +61,7 @@ func (d Deps) Get(c *gin.Context) {
|
||||
}
|
||||
ctx.HTML(http.StatusOK, "install", pageData{
|
||||
Title: "安装 · " + name, SiteName: name, LogoMark: "姜",
|
||||
AssetVersion: d.assetVersion(),
|
||||
CSRF: ctx.EnsureCSRF(), AdminUsername: "admin",
|
||||
})
|
||||
}
|
||||
@@ -77,7 +80,8 @@ func (d Deps) Post(c *gin.Context) {
|
||||
}
|
||||
data := pageData{
|
||||
Title: "安装 · " + siteName, SiteName: siteName, LogoMark: "姜",
|
||||
CSRF: ctx.EnsureCSRF(),
|
||||
AssetVersion: d.assetVersion(),
|
||||
CSRF: ctx.EnsureCSRF(),
|
||||
AdminUsername: strings.TrimSpace(c.PostForm("admin_username")),
|
||||
AdminEmail: strings.TrimSpace(c.PostForm("admin_email")),
|
||||
AdminNickname: strings.TrimSpace(c.PostForm("admin_nickname")),
|
||||
@@ -109,10 +113,19 @@ func (d Deps) Post(c *gin.Context) {
|
||||
}
|
||||
ctx.HTML(http.StatusOK, "post-install", pageData{
|
||||
Title: "安装完成", SiteName: siteName, LogoMark: "姜",
|
||||
AssetVersion: d.assetVersion(),
|
||||
})
|
||||
_ = brand
|
||||
}
|
||||
|
||||
func (d Deps) assetVersion() string {
|
||||
v := strings.TrimSpace(d.AssetVersion)
|
||||
if v == "" {
|
||||
return "dev"
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
// Guard 未安装则只允许 install / assets / health
|
||||
func Guard(dataDir string) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"git.iioio.com/freefire/jiang13-forum/config"
|
||||
"git.iioio.com/freefire/jiang13-forum/modules/auth"
|
||||
@@ -30,7 +31,8 @@ func Setup(cfg *config.Config) (*gin.Engine, error) {
|
||||
if sub, err := fs.Sub(webpublic.Assets, "assets"); err == nil {
|
||||
ssrFiles := http.StripPrefix("/ssr-assets", http.FileServer(http.FS(sub)))
|
||||
r.GET("/ssr-assets/*filepath", func(c *gin.Context) {
|
||||
c.Header("Cache-Control", "public, max-age=86400")
|
||||
// 模板带 ?v=AssetVersion;部署换版本即穿透,可长缓存
|
||||
c.Header("Cache-Control", "public, max-age=31536000, immutable")
|
||||
ssrFiles.ServeHTTP(c.Writer, c.Request)
|
||||
})
|
||||
}
|
||||
@@ -83,9 +85,15 @@ func Setup(cfg *config.Config) (*gin.Engine, error) {
|
||||
}
|
||||
authMW := auth.NewAuthMiddleware(authSvc)
|
||||
|
||||
assetVer := strings.TrimSpace(cfg.Version)
|
||||
if assetVer == "" {
|
||||
assetVer = "dev"
|
||||
}
|
||||
|
||||
install.Register(r, install.Deps{
|
||||
DataDir: cfg.DataDir, JWTSecret: cfg.JWTSecret,
|
||||
Auth: authSvc, Settings: settingsSvc,
|
||||
AssetVersion: assetVer,
|
||||
})
|
||||
|
||||
webpages.Register(r, webpages.Deps{
|
||||
@@ -103,6 +111,7 @@ func Setup(cfg *config.Config) (*gin.Engine, error) {
|
||||
Captcha: captchaSvc,
|
||||
Notify: notifySvc,
|
||||
Backup: backupSvc,
|
||||
AssetVersion: assetVer,
|
||||
}, authMW)
|
||||
|
||||
r.GET("/media/thumb/*filepath", h.ServeImageThumb)
|
||||
@@ -126,6 +135,7 @@ func Setup(cfg *config.Config) (*gin.Engine, error) {
|
||||
DataDir: cfg.DataDir, JWTSecret: cfg.JWTSecret,
|
||||
Settings: settingsSvc, Auth: authSvc,
|
||||
Board: boardSvc, Post: postSvc, Comment: commentSvc,
|
||||
AssetVersion: assetVer,
|
||||
}.NotFound)
|
||||
|
||||
return r, nil
|
||||
|
||||
@@ -11,28 +11,29 @@ import (
|
||||
|
||||
// Deps 页面依赖
|
||||
type Deps struct {
|
||||
DataDir string
|
||||
JWTSecret string
|
||||
Settings *services.ForumSettingsService
|
||||
Auth *services.AuthService
|
||||
User *services.UserService
|
||||
Board *services.BoardService
|
||||
Post *services.PostService
|
||||
Comment *services.CommentService
|
||||
Message *services.MessageService
|
||||
Filter *services.SensitiveFilter
|
||||
Limiter *services.RateLimiter
|
||||
EmailCode *services.EmailCodeService
|
||||
Store *services.UploadStore
|
||||
Points *services.PointsService
|
||||
Badge *services.BadgeService
|
||||
FriendLink *services.FriendLinkApplyService
|
||||
Mail *services.MailService
|
||||
SitePage *services.SitePageService
|
||||
Report *services.ReportService
|
||||
Captcha *services.CaptchaService
|
||||
Notify *services.NotifyService
|
||||
Backup *services.BackupService
|
||||
DataDir string
|
||||
JWTSecret string
|
||||
AssetVersion string // 静态资源 ?v=;来自构建 ldflags
|
||||
Settings *services.ForumSettingsService
|
||||
Auth *services.AuthService
|
||||
User *services.UserService
|
||||
Board *services.BoardService
|
||||
Post *services.PostService
|
||||
Comment *services.CommentService
|
||||
Message *services.MessageService
|
||||
Filter *services.SensitiveFilter
|
||||
Limiter *services.RateLimiter
|
||||
EmailCode *services.EmailCodeService
|
||||
Store *services.UploadStore
|
||||
Points *services.PointsService
|
||||
Badge *services.BadgeService
|
||||
FriendLink *services.FriendLinkApplyService
|
||||
Mail *services.MailService
|
||||
SitePage *services.SitePageService
|
||||
Report *services.ReportService
|
||||
Captcha *services.CaptchaService
|
||||
Notify *services.NotifyService
|
||||
Backup *services.BackupService
|
||||
}
|
||||
|
||||
// SitePageLink 导航/页脚站点单页链接
|
||||
@@ -135,6 +136,7 @@ type PageChrome struct {
|
||||
NavPages []SitePageLink
|
||||
FooterPages []SitePageLink
|
||||
RightAside RightAsideData
|
||||
AssetVersion string
|
||||
}
|
||||
|
||||
func (d Deps) ctx(c *gin.Context) *webctx.Context {
|
||||
@@ -175,6 +177,10 @@ func (d Deps) chrome(ctx *webctx.Context, title, desc, inner string) PageChrome
|
||||
path = ctx.C.Request.URL.Path
|
||||
}
|
||||
navPages, footerPages := d.sitePageLinks()
|
||||
assetVer := strings.TrimSpace(d.AssetVersion)
|
||||
if assetVer == "" {
|
||||
assetVer = "dev"
|
||||
}
|
||||
return PageChrome{
|
||||
Title: title,
|
||||
Description: desc,
|
||||
@@ -201,6 +207,7 @@ func (d Deps) chrome(ctx *webctx.Context, title, desc, inner string) PageChrome
|
||||
NavPages: navPages,
|
||||
FooterPages: footerPages,
|
||||
RightAside: d.loadRightAside(ctx, brand),
|
||||
AssetVersion: assetVer,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user