mirror of
				https://github.com/cloudreve/cloudreve.git
				synced 2025-11-04 13:16:02 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			74 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.9 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
 | 
						|
		}
 | 
						|
 | 
						|
		if path == "/service-worker.js" {
 | 
						|
			c.Header("Cache-Control", "public, no-cache")
 | 
						|
		}
 | 
						|
 | 
						|
		// 存在的静态文件
 | 
						|
		fileServer.ServeHTTP(c.Writer, c.Request)
 | 
						|
		c.Abort()
 | 
						|
	}
 | 
						|
}
 |