mirror of
				https://github.com/cloudreve/cloudreve.git
				synced 2025-10-31 16:49:03 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			70 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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, "/dav") || path == "/manifest.json" {
 | |
| 			c.Next()
 | |
| 			return
 | |
| 		}
 | |
| 
 | |
| 		// 不存在的路径和index.html均返回index.html
 | |
| 		if (path == "/index.html") || (path == "/") || !bootstrap.StaticFS.Exists("/", 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()
 | |
| 	}
 | |
| }
 | 
