mirror of https://github.com/cloudreve/Cloudreve
				
				
				
			
		
			
				
	
	
		
			92 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
package bootstrap
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"github.com/HFO4/cloudreve/pkg/conf"
 | 
						|
	"github.com/HFO4/cloudreve/pkg/util"
 | 
						|
	_ "github.com/HFO4/cloudreve/statik"
 | 
						|
	"github.com/gin-contrib/static"
 | 
						|
	"github.com/rakyll/statik/fs"
 | 
						|
	"io/ioutil"
 | 
						|
	"net/http"
 | 
						|
)
 | 
						|
 | 
						|
type GinFS struct {
 | 
						|
	FS http.FileSystem
 | 
						|
}
 | 
						|
 | 
						|
type staticVersion struct {
 | 
						|
	Name    string `json:"name"`
 | 
						|
	Version string `json:"version"`
 | 
						|
}
 | 
						|
 | 
						|
// StaticFS 内置静态文件资源
 | 
						|
var StaticFS static.ServeFileSystem
 | 
						|
 | 
						|
// Open 打开文件
 | 
						|
func (b *GinFS) Open(name string) (http.File, error) {
 | 
						|
	return b.FS.Open(name)
 | 
						|
}
 | 
						|
 | 
						|
// Exists 文件是否存在
 | 
						|
func (b *GinFS) Exists(prefix string, filepath string) bool {
 | 
						|
 | 
						|
	if _, err := b.FS.Open(filepath); err != nil {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
	return true
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
// InitStatic 初始化静态资源文件
 | 
						|
func InitStatic() {
 | 
						|
	var err error
 | 
						|
 | 
						|
	if util.Exists(util.RelativePath("statics")) {
 | 
						|
		util.Log().Info("检测到 statics 目录存在,将使用此目录下的静态资源文件")
 | 
						|
		StaticFS = static.LocalFile(util.RelativePath("statics"), false)
 | 
						|
 | 
						|
		// 检查静态资源的版本
 | 
						|
		f, err := StaticFS.Open("version.json")
 | 
						|
		if err != nil {
 | 
						|
			util.Log().Warning("静态资源版本标识文件不存在,请重新构建或删除 statics 目录")
 | 
						|
			return
 | 
						|
		}
 | 
						|
 | 
						|
		b, err := ioutil.ReadAll(f)
 | 
						|
		if err != nil {
 | 
						|
			util.Log().Warning("无法读取静态资源文件版本,请重新构建或删除 statics 目录")
 | 
						|
			return
 | 
						|
		}
 | 
						|
 | 
						|
		var v staticVersion
 | 
						|
		if err := json.Unmarshal(b, &v); err != nil {
 | 
						|
			util.Log().Warning("无法解析静态资源文件版本, %s", err)
 | 
						|
			return
 | 
						|
		}
 | 
						|
 | 
						|
		staticName := "cloudreve-frontend"
 | 
						|
		if conf.IsPro == "true" {
 | 
						|
			staticName += "-pro"
 | 
						|
		}
 | 
						|
 | 
						|
		if v.Name != staticName {
 | 
						|
			util.Log().Warning("静态资源版本不匹配,请重新构建或删除 statics 目录")
 | 
						|
			return
 | 
						|
		}
 | 
						|
 | 
						|
		if v.Version != conf.RequiredStaticVersion {
 | 
						|
			util.Log().Warning("静态资源版本不匹配 [当前 %s, 需要: %s],请重新构建或删除 statics 目录", v.Version, conf.RequiredStaticVersion)
 | 
						|
			return
 | 
						|
		}
 | 
						|
 | 
						|
	} else {
 | 
						|
		StaticFS = &GinFS{}
 | 
						|
		StaticFS.(*GinFS).FS, err = fs.New()
 | 
						|
		if err != nil {
 | 
						|
			util.Log().Panic("无法初始化静态资源, %s", err)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
}
 |