From 5d406f1c6a1464c5eac7c8f4b0d25557376a04c9 Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Tue, 8 Dec 2020 17:36:19 +0800 Subject: [PATCH] Feat: use history router mode --- middleware/frontend.go | 69 +++++++++++++++++++++++++++++++++ routers/controllers/callback.go | 2 +- routers/router.go | 5 +-- service/share/manage.go | 2 +- service/user/login.go | 3 +- service/user/register.go | 2 +- 6 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 middleware/frontend.go diff --git a/middleware/frontend.go b/middleware/frontend.go new file mode 100644 index 0000000..7fb7606 --- /dev/null +++ b/middleware/frontend.go @@ -0,0 +1,69 @@ +package middleware + +import ( + "github.com/cloudreve/Cloudreve/v3/bootstrap" + model "github.com/cloudreve/Cloudreve/v3/models" + "github.com/cloudreve/Cloudreve/v3/pkg/util" + "github.com/gin-gonic/gin" + "io/ioutil" + "net/http" + "strings" +) + +// FrontendFileHandler 前端静态文件处理 +func FrontendFileHandler() gin.HandlerFunc { + ignoreFunc := func(c *gin.Context) { + c.Next() + } + + if bootstrap.StaticFS == nil { + return ignoreFunc + } + + // 读取index.html + file, err := bootstrap.StaticFS.Open("/index.html") + if err != nil { + util.Log().Warning("静态文件[index.html]不存在,可能会影响首页展示") + return ignoreFunc + } + + fileContentBytes, err := ioutil.ReadAll(file) + if err != nil { + util.Log().Warning("静态文件[index.html]读取失败,可能会影响首页展示") + return ignoreFunc + } + fileContent := string(fileContentBytes) + + fileServer := http.FileServer(bootstrap.StaticFS) + return func(c *gin.Context) { + path := c.Request.URL.Path + + // API 跳过 + if strings.HasPrefix(path, "/api") || strings.HasPrefix(path, "/custom") || strings.HasPrefix(path, "/custom") || path == "manifest.json" { + c.Next() + return + } + + // 不存在的路径和index.html均返回index.html + if !bootstrap.StaticFS.Exists("/", path) || (path == "/index.html") || (path == "/") { + // 读取、替换站点设置 + options := model.GetSettingByNames("siteName", "siteKeywords", "siteScript", + "pwa_small_icon") + finalHTML := util.Replace(map[string]string{ + "{siteName}": options["siteName"], + "{siteDes}": options["siteDes"], + "{siteScript}": options["siteScript"], + "{pwa_small_icon}": options["pwa_small_icon"], + }, fileContent) + + c.Header("Content-Type", "text/html") + c.String(200, finalHTML) + c.Abort() + return + } + + // 存在的静态文件 + fileServer.ServeHTTP(c.Writer, c.Request) + c.Abort() + } +} diff --git a/routers/controllers/callback.go b/routers/controllers/callback.go index 56dd1e0..8c5a7f9 100644 --- a/routers/controllers/callback.go +++ b/routers/controllers/callback.go @@ -91,7 +91,7 @@ func OneDriveOAuth(c *gin.Context) { queries.Add("msg", res.Msg) queries.Add("err", res.Error) redirect.RawQuery = queries.Encode() - c.Redirect(301, "/#"+redirect.String()) + c.Redirect(301, "/"+redirect.String()) } else { c.JSON(200, ErrorResponse(err)) } diff --git a/routers/router.go b/routers/router.go index baf5253..71659ee 100644 --- a/routers/router.go +++ b/routers/router.go @@ -1,7 +1,6 @@ package routers import ( - "github.com/cloudreve/Cloudreve/v3/bootstrap" "github.com/cloudreve/Cloudreve/v3/middleware" "github.com/cloudreve/Cloudreve/v3/pkg/conf" "github.com/cloudreve/Cloudreve/v3/pkg/hashid" @@ -9,7 +8,6 @@ import ( "github.com/cloudreve/Cloudreve/v3/routers/controllers" "github.com/gin-contrib/cors" "github.com/gin-contrib/gzip" - "github.com/gin-contrib/static" "github.com/gin-gonic/gin" ) @@ -82,8 +80,7 @@ func InitMasterRouter() *gin.Engine { 静态资源 */ r.Use(gzip.Gzip(gzip.DefaultCompression, gzip.WithExcludedPaths([]string{"/api/"}))) - r.Use(middleware.InjectSiteInfo()) - r.Use(static.Serve("/", bootstrap.StaticFS)) + r.Use(middleware.FrontendFileHandler()) r.GET("manifest.json", controllers.Manifest) v3 := r.Group("/api/v3") diff --git a/service/share/manage.go b/service/share/manage.go index 6f4c739..bd826e1 100644 --- a/service/share/manage.go +++ b/service/share/manage.go @@ -139,7 +139,7 @@ func (service *ShareCreateService) Create(c *gin.Context) serializer.Response { uid := hashid.HashID(id, hashid.ShareID) // 最终得到分享链接 siteURL := model.GetSiteURL() - sharePath, _ := url.Parse("/#/s/" + uid) + sharePath, _ := url.Parse("/s/" + uid) shareURL := siteURL.ResolveReference(sharePath) return serializer.Response{ diff --git a/service/user/login.go b/service/user/login.go index 6c2262e..8854207 100644 --- a/service/user/login.go +++ b/service/user/login.go @@ -3,7 +3,6 @@ package user import ( "fmt" "net/url" - "strings" "time" model "github.com/cloudreve/Cloudreve/v3/models" @@ -108,7 +107,7 @@ func (service *UserResetEmailService) Reset(c *gin.Context) serializer.Response finalURL.RawQuery = queries.Encode() // 发送密码重设邮件 - title, body := email.NewResetEmail(user.Nick, strings.ReplaceAll(finalURL.String(), "/reset", "/#/reset")) + title, body := email.NewResetEmail(user.Nick, finalURL.String()) if err := email.Send(user.Email, title, body); err != nil { return serializer.Err(serializer.CodeInternalSetting, "无法发送密码重设邮件", err) } diff --git a/service/user/register.go b/service/user/register.go index c968ba6..04083ad 100644 --- a/service/user/register.go +++ b/service/user/register.go @@ -95,7 +95,7 @@ func (service *UserRegisterService) Register(c *gin.Context) serializer.Response // 返送激活邮件 title, body := email.NewActivationEmail(user.Email, - strings.ReplaceAll(finalURL.String(), "/activate", "/#/activate"), + finalURL.String(), ) if err := email.Send(user.Email, title, body); err != nil { return serializer.Err(serializer.CodeInternalSetting, "无法发送激活邮件", err)