mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 05:00:25 +08:00 
			
		
		
		
	编译时生成components.js
This commit is contained in:
		@@ -58,6 +58,10 @@ function build() {
 | 
			
		||||
	rm -f $(basename $EDGE_API_ZIP_FILE)
 | 
			
		||||
	cd -
 | 
			
		||||
 | 
			
		||||
    # generate files
 | 
			
		||||
    echo "generating files ..."
 | 
			
		||||
	go run  -tags $TAG $ROOT/../cmd/edge-admin/main.go generate
 | 
			
		||||
 | 
			
		||||
	# build
 | 
			
		||||
	echo "building "${NAME}" ..."
 | 
			
		||||
	env GOOS=$OS GOARCH=$ARCH go build -tags $TAG -ldflags="-s -w" -o $DIST/bin/${NAME} $ROOT/../cmd/edge-admin/main.go
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@ import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/apps"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configs"
 | 
			
		||||
	teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/gen"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/nodes"
 | 
			
		||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web"
 | 
			
		||||
	_ "github.com/iwind/TeaGo/bootstrap"
 | 
			
		||||
@@ -70,6 +71,13 @@ func main() {
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Println("change demo mode successfully")
 | 
			
		||||
	})
 | 
			
		||||
	app.On("generate", func() {
 | 
			
		||||
		err := gen.Generate()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			fmt.Println("generate failed: " + err.Error())
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	})
 | 
			
		||||
	app.Run(func() {
 | 
			
		||||
		adminNode := nodes.NewAdminNode()
 | 
			
		||||
		adminNode.Run()
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										129
									
								
								internal/gen/generate.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								internal/gen/generate.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,129 @@
 | 
			
		||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 | 
			
		||||
 | 
			
		||||
package gen
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/conds/condutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
 | 
			
		||||
	"github.com/iwind/TeaGo/Tea"
 | 
			
		||||
	"github.com/iwind/TeaGo/files"
 | 
			
		||||
	"github.com/iwind/TeaGo/logs"
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Generate() error {
 | 
			
		||||
	err := generateComponentsJSFile()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.New("generate 'components.js' failed: " + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 生成Javascript文件
 | 
			
		||||
func generateComponentsJSFile() error {
 | 
			
		||||
	var buffer = bytes.NewBuffer([]byte{})
 | 
			
		||||
 | 
			
		||||
	var webRoot string
 | 
			
		||||
	if Tea.IsTesting() {
 | 
			
		||||
		webRoot = Tea.Root + "/../web/public/js/components/"
 | 
			
		||||
	} else {
 | 
			
		||||
		webRoot = Tea.Root + "/web/public/js/components/"
 | 
			
		||||
	}
 | 
			
		||||
	f := files.NewFile(webRoot)
 | 
			
		||||
 | 
			
		||||
	f.Range(func(file *files.File) {
 | 
			
		||||
		if !file.IsFile() {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		if file.Ext() != ".js" {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		data, err := file.ReadAll()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logs.Error(err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		buffer.Write(data)
 | 
			
		||||
		buffer.Write([]byte{'\n', '\n'})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// 条件组件
 | 
			
		||||
	typesJSON, err := json.Marshal(condutils.ReadAllAvailableCondTypes())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logs.Println("ComponentsAction marshal request cond types failed: " + err.Error())
 | 
			
		||||
	} else {
 | 
			
		||||
		buffer.WriteString("window.REQUEST_COND_COMPONENTS = ")
 | 
			
		||||
		buffer.Write(typesJSON)
 | 
			
		||||
		buffer.Write([]byte{'\n', '\n'})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 条件操作符
 | 
			
		||||
	requestOperatorsJSON, err := json.Marshal(shared.AllRequestOperators())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logs.Println("ComponentsAction marshal request operators failed: " + err.Error())
 | 
			
		||||
	} else {
 | 
			
		||||
		buffer.WriteString("window.REQUEST_COND_OPERATORS = ")
 | 
			
		||||
		buffer.Write(requestOperatorsJSON)
 | 
			
		||||
		buffer.Write([]byte{'\n', '\n'})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 请求变量
 | 
			
		||||
	requestVariablesJSON, err := json.Marshal(shared.DefaultRequestVariables())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logs.Println("ComponentsAction marshal request variables failed: " + err.Error())
 | 
			
		||||
	} else {
 | 
			
		||||
		buffer.WriteString("window.REQUEST_VARIABLES = ")
 | 
			
		||||
		buffer.Write(requestVariablesJSON)
 | 
			
		||||
		buffer.Write([]byte{'\n', '\n'})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 指标
 | 
			
		||||
	metricHTTPKeysJSON, err := json.Marshal(serverconfigs.FindAllMetricKeyDefinitions(serverconfigs.MetricItemCategoryHTTP))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logs.Println("ComponentsAction marshal metric http keys failed: " + err.Error())
 | 
			
		||||
	} else {
 | 
			
		||||
		buffer.WriteString("window.METRIC_HTTP_KEYS = ")
 | 
			
		||||
		buffer.Write(metricHTTPKeysJSON)
 | 
			
		||||
		buffer.Write([]byte{'\n', '\n'})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// IP地址阈值项目
 | 
			
		||||
	ipAddrThresholdItemsJSON, err := json.Marshal(nodeconfigs.FindAllIPAddressThresholdItems())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logs.Println("ComponentsAction marshal ip addr threshold items failed: " + err.Error())
 | 
			
		||||
	} else {
 | 
			
		||||
		buffer.WriteString("window.IP_ADDR_THRESHOLD_ITEMS = ")
 | 
			
		||||
		buffer.Write(ipAddrThresholdItemsJSON)
 | 
			
		||||
		buffer.Write([]byte{'\n', '\n'})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// IP地址阈值动作
 | 
			
		||||
	ipAddrThresholdActionsJSON, err := json.Marshal(nodeconfigs.FindAllIPAddressThresholdActions())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logs.Println("ComponentsAction marshal ip addr threshold actions failed: " + err.Error())
 | 
			
		||||
	} else {
 | 
			
		||||
		buffer.WriteString("window.IP_ADDR_THRESHOLD_ACTIONS = ")
 | 
			
		||||
		buffer.Write(ipAddrThresholdActionsJSON)
 | 
			
		||||
		buffer.Write([]byte{'\n', '\n'})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fp, err := os.OpenFile(filepath.Clean(Tea.PublicFile("/js/components.js")), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0777)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err = io.Copy(fp, buffer)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								internal/gen/generate_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								internal/gen/generate_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 | 
			
		||||
 | 
			
		||||
package gen
 | 
			
		||||
 | 
			
		||||
import "testing"
 | 
			
		||||
 | 
			
		||||
func TestGenerate(t *testing.T) {
 | 
			
		||||
	err := Generate()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	t.Log("ok")
 | 
			
		||||
}
 | 
			
		||||
@@ -1,11 +1,10 @@
 | 
			
		||||
package ui
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"compress/gzip"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
			
		||||
	"github.com/iwind/TeaGo"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
	"github.com/iwind/TeaGo/Tea"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
@@ -16,11 +15,6 @@ func init() {
 | 
			
		||||
			// 公共可以访问的链接
 | 
			
		||||
			Get("/image/:fileId", new(ImageAction)).
 | 
			
		||||
 | 
			
		||||
			// 以下的需要压缩
 | 
			
		||||
			Helper(&actions.Gzip{Level: gzip.BestCompression}).
 | 
			
		||||
			Get("/components.js", new(ComponentsAction)).
 | 
			
		||||
			EndHelpers().
 | 
			
		||||
 | 
			
		||||
			// 以下需要登录
 | 
			
		||||
			Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeCommon)).
 | 
			
		||||
			Get("/download", new(DownloadAction)).
 | 
			
		||||
@@ -31,7 +25,13 @@ func init() {
 | 
			
		||||
			Post("/hideTip", new(HideTipAction)).
 | 
			
		||||
			Post("/theme", new(ThemeAction)).
 | 
			
		||||
			Post("/validateIPs", new(ValidateIPsAction)).
 | 
			
		||||
 | 
			
		||||
			EndAll()
 | 
			
		||||
 | 
			
		||||
		// 开发环境下总是动态加载,以便于调试
 | 
			
		||||
		if Tea.IsTesting() {
 | 
			
		||||
			server.
 | 
			
		||||
				Get("/js/components.js", new(ComponentsAction)).
 | 
			
		||||
				EndAll()
 | 
			
		||||
		}
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12042
									
								
								web/public/js/components.js
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										12042
									
								
								web/public/js/components.js
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -15,7 +15,7 @@
 | 
			
		||||
    {$TEA.VUE}
 | 
			
		||||
    {$echo "header"}
 | 
			
		||||
    <script type="text/javascript" src="/_/@default/@layout.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/ui/components.js?v=v{$.teaVersion}"></script>
 | 
			
		||||
	<script type="text/javascript" src="/js/components.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/js/utils.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/js/sweetalert2/dist/sweetalert2.all.min.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/js/date.tea.js"></script>
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
	<link rel="stylesheet" type="text/css" href="/_/@default/@layout_override.css" media="all"/>
 | 
			
		||||
	{$echo "header"}
 | 
			
		||||
	<script type="text/javascript" src="/_/@default/@layout.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/ui/components.js?v=v{$.teaVersion}"></script>
 | 
			
		||||
	<script type="text/javascript" src="/js/components.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/js/utils.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/js/sweetalert2/dist/sweetalert2.all.min.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/js/date.tea.js"></script>
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
	<script type="text/javascript" src="/js/md5.min.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/js/utils.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/js/sweetalert2/dist/sweetalert2.all.min.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/ui/components.js?v=1.0.0"></script>
 | 
			
		||||
	<script type="text/javascript" src="/js/components.js"></script>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
<div>
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@
 | 
			
		||||
	<script type="text/javascript" src="/js/md5.min.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/js/utils.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/js/sweetalert2/dist/sweetalert2.all.min.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/ui/components.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/js/components.js"></script>
 | 
			
		||||
	<link rel="stylesheet" href="/_/@default/@layout.css"/>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@
 | 
			
		||||
    <script type="text/javascript" src="/js/md5.min.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/js/utils.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/js/sweetalert2/dist/sweetalert2.all.min.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/ui/components.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/js/components.js"></script>
 | 
			
		||||
    <link rel="stylesheet" href="/_/@default/@layout.css"/>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@
 | 
			
		||||
	<script type="text/javascript" src="/js/md5.min.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/js/utils.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/js/sweetalert2/dist/sweetalert2.all.min.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/ui/components.js"></script>
 | 
			
		||||
	<script type="text/javascript" src="/js/components.js"></script>
 | 
			
		||||
	<link rel="stylesheet" href="/_/@default/@layout.css"/>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user