mirror of https://github.com/Xhofe/alist
				
				
				
			
		
			
				
	
	
		
			97 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
| package static
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"fmt"
 | |
| 	"io/fs"
 | |
| 	"net/http"
 | |
| 	"net/http/pprof"
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/alist-org/alist/v3/cmd/flags"
 | |
| 	"github.com/alist-org/alist/v3/internal/conf"
 | |
| 	"github.com/alist-org/alist/v3/internal/setting"
 | |
| 	"github.com/alist-org/alist/v3/pkg/utils"
 | |
| 	"github.com/alist-org/alist/v3/public"
 | |
| 	"github.com/gin-gonic/gin"
 | |
| )
 | |
| 
 | |
| func InitIndex() {
 | |
| 	index, err := public.Public.ReadFile("dist/index.html")
 | |
| 	if err != nil {
 | |
| 		if errors.Is(err, fs.ErrNotExist) {
 | |
| 			utils.Log.Fatalf("index.html not exist, you may forget to put dist of frontend to public/dist")
 | |
| 		}
 | |
| 		utils.Log.Fatalf("failed to read index.html: %v", err)
 | |
| 	}
 | |
| 	conf.RawIndexHtml = string(index)
 | |
| 	siteConfig := getSiteConfig()
 | |
| 	replaceMap := map[string]string{
 | |
| 		"cdn: undefined":       fmt.Sprintf("cdn: '%s'", siteConfig.Cdn),
 | |
| 		"base_path: undefined": fmt.Sprintf("base_path: '%s'", siteConfig.BasePath),
 | |
| 	}
 | |
| 	for k, v := range replaceMap {
 | |
| 		conf.RawIndexHtml = strings.Replace(conf.RawIndexHtml, k, v, 1)
 | |
| 	}
 | |
| 	UpdateIndex()
 | |
| }
 | |
| 
 | |
| func UpdateIndex() {
 | |
| 	favicon := setting.GetStr(conf.Favicon)
 | |
| 	title := setting.GetStr(conf.SiteTitle)
 | |
| 	customizeHead := setting.GetStr(conf.CustomizeHead)
 | |
| 	customizeBody := setting.GetStr(conf.CustomizeBody)
 | |
| 	mainColor := setting.GetStr(conf.MainColor)
 | |
| 	conf.ManageHtml = conf.RawIndexHtml
 | |
| 	replaceMap1 := map[string]string{
 | |
| 		"https://jsd.nn.ci/gh/alist-org/logo@main/logo.svg": favicon,
 | |
| 		"Loading...":            title,
 | |
| 		"main_color: undefined": fmt.Sprintf("main_color: '%s'", mainColor),
 | |
| 	}
 | |
| 	for k, v := range replaceMap1 {
 | |
| 		conf.ManageHtml = strings.Replace(conf.ManageHtml, k, v, 1)
 | |
| 	}
 | |
| 	conf.IndexHtml = conf.ManageHtml
 | |
| 	replaceMap2 := map[string]string{
 | |
| 		"<!-- customize head -->": customizeHead,
 | |
| 		"<!-- customize body -->": customizeBody,
 | |
| 	}
 | |
| 	for k, v := range replaceMap2 {
 | |
| 		conf.IndexHtml = strings.Replace(conf.IndexHtml, k, v, 1)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func Static(r *gin.RouterGroup, noRoute func(handlers ...gin.HandlerFunc)) {
 | |
| 	InitIndex()
 | |
| 	folders := []string{"assets", "images", "streamer", "static"}
 | |
| 	r.Use(func(c *gin.Context) {
 | |
| 		for i := range folders {
 | |
| 			if strings.HasPrefix(c.Request.RequestURI, fmt.Sprintf("/%s/", folders[i])) {
 | |
| 				c.Header("Cache-Control", "public, max-age=15552000")
 | |
| 			}
 | |
| 		}
 | |
| 	})
 | |
| 	for i, folder := range folders {
 | |
| 		folder = "dist/" + folder
 | |
| 		sub, err := fs.Sub(public.Public, folder)
 | |
| 		if err != nil {
 | |
| 			utils.Log.Fatalf("can't find folder: %s", folder)
 | |
| 		}
 | |
| 		r.StaticFS(fmt.Sprintf("/%s/", folders[i]), http.FS(sub))
 | |
| 	}
 | |
| 
 | |
| 	noRoute(func(c *gin.Context) {
 | |
| 		c.Header("Content-Type", "text/html")
 | |
| 		c.Status(200)
 | |
| 		if strings.HasPrefix(c.Request.URL.Path, "/@manage") {
 | |
| 			_, _ = c.Writer.WriteString(conf.ManageHtml)
 | |
| 		} else if strings.HasPrefix(c.Request.URL.Path, "/debug/pprof") && flags.Debug {
 | |
| 			pprof.Index(c.Writer, c.Request)
 | |
| 		} else {
 | |
| 			_, _ = c.Writer.WriteString(conf.IndexHtml)
 | |
| 		}
 | |
| 		c.Writer.Flush()
 | |
| 		c.Writer.WriteHeaderNow()
 | |
| 	})
 | |
| }
 |