Browse Source

制作单体应用

Signed-off-by: 716 <[email protected]>
716 3 years ago
parent
commit
c16c49a34e

+ 19 - 2
.github/workflows/goreleaser-ChineseSubFinder-Beta.yml

@@ -16,11 +16,28 @@ jobs:
         with:
         with:
           fetch-depth: 0
           fetch-depth: 0
 
 
+      - name: Setup npm
+        uses: bahmutov/npm-install@v1
+        with:
+          working-directory: frontend
+
+      - name: frontend install depandence
+        run: npm install
+        working-directory: frontend
+
+      - name: frontend change api address
+        run: find -name '.env.production' | xargs perl -pi -e 's|BACKEND_URL=/api|BACKEND_URL=|g'
+        working-directory: frontend
+
+      - name: frontend build
+        run: npm run build
+        working-directory: frontend
+
       - name: Set up Go
       - name: Set up Go
         uses: actions/setup-go@v2
         uses: actions/setup-go@v2
         with:
         with:
           go-version: 1.17
           go-version: 1.17
-          
+
       - name: Run GoReleaser
       - name: Run GoReleaser
         uses: goreleaser/goreleaser-action@v2
         uses: goreleaser/goreleaser-action@v2
         with:
         with:
@@ -29,4 +46,4 @@ jobs:
           version: latest
           version: latest
           args: release -f .goreleaser-ChineseSubFinder.yml --rm-dist
           args: release -f .goreleaser-ChineseSubFinder.yml --rm-dist
         env:
         env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN  }}
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN  }}

+ 1 - 1
Dockerfile

@@ -13,7 +13,7 @@ WORKDIR /homelab/buildspace
 COPY . .
 COPY . .
 # 执行编译,-o 指定保存位置和程序编译名称
 # 执行编译,-o 指定保存位置和程序编译名称
 RUN cd ./cmd/chinesesubfinder \
 RUN cd ./cmd/chinesesubfinder \
-    && go build -ldflags="-s -w -X main.AppVersion=${VERSION}" -o /app/chinesesubfinder
+    && go build -ldflags='-s -w --extldflags "-static -fpic" -X main.AppVersion=${VERSION}"' -o /app/chinesesubfinder
 
 
 # 运行时环境
 # 运行时环境
 FROM lsiobase/ubuntu:bionic
 FROM lsiobase/ubuntu:bionic

+ 43 - 0
frontend/dist/spa.go

@@ -0,0 +1,43 @@
+package dist
+
+import (
+	"embed"
+	"io/fs"
+	"net/http"
+)
+
+//go:embed spa/index.html
+var SpaIndexHtml []byte
+
+//go:embed spa/css
+var SpaCSS embed.FS
+
+//go:embed spa/fonts
+var SpaFonts embed.FS
+
+//go:embed spa/icons
+var SpaIcons embed.FS
+
+//go:embed spa/images
+var SpaImages embed.FS
+
+//go:embed spa/js
+var SpaJS embed.FS
+
+func Assets(dirName string, emFS embed.FS) http.FileSystem {
+	// even uiAssets is empty, fs.Sub won't fail
+	stripped, err := fs.Sub(emFS, dirName)
+	if err != nil {
+		panic(err)
+	}
+	return http.FS(stripped)
+}
+
+const (
+	SpaFolderName   = "spa"
+	SpaFolderCSS    = "/css"
+	SpaFolderFonts  = "/fonts"
+	SpaFolderIcons  = "/icons"
+	SpaFolderImages = "/images"
+	SpaFolderJS     = "/js"
+)

+ 16 - 0
internal/backend/backend.go

@@ -2,11 +2,13 @@ package backend
 
 
 import (
 import (
 	"fmt"
 	"fmt"
+	"github.com/allanpk716/ChineseSubFinder/frontend/dist"
 	"github.com/allanpk716/ChineseSubFinder/internal/backend/routers"
 	"github.com/allanpk716/ChineseSubFinder/internal/backend/routers"
 	"github.com/allanpk716/ChineseSubFinder/internal/logic/cron_helper"
 	"github.com/allanpk716/ChineseSubFinder/internal/logic/cron_helper"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/log_helper"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/log_helper"
 	"github.com/gin-contrib/cors"
 	"github.com/gin-contrib/cors"
 	"github.com/gin-gonic/gin"
 	"github.com/gin-gonic/gin"
+	"net/http"
 )
 )
 
 
 // StartBackEnd 开启后端的服务器
 // StartBackEnd 开启后端的服务器
@@ -17,6 +19,20 @@ func StartBackEnd(httpPort int, cronHelper *cron_helper.CronHelper) {
 	engine.Use(cors.Default())
 	engine.Use(cors.Default())
 	routers.InitRouter(engine, cronHelper)
 	routers.InitRouter(engine, cronHelper)
 
 
+	engine.GET("/", func(c *gin.Context) {
+		c.Header("content-type", "text/html;charset=utf-8")
+		c.String(http.StatusOK, string(dist.SpaIndexHtml))
+	})
+	engine.StaticFS(dist.SpaFolderJS, dist.Assets(dist.SpaFolderName+dist.SpaFolderJS, dist.SpaJS))
+	engine.StaticFS(dist.SpaFolderCSS, dist.Assets(dist.SpaFolderName+dist.SpaFolderCSS, dist.SpaCSS))
+	engine.StaticFS(dist.SpaFolderFonts, dist.Assets(dist.SpaFolderName+dist.SpaFolderFonts, dist.SpaFonts))
+	engine.StaticFS(dist.SpaFolderIcons, dist.Assets(dist.SpaFolderName+dist.SpaFolderIcons, dist.SpaIcons))
+	engine.StaticFS(dist.SpaFolderImages, dist.Assets(dist.SpaFolderName+dist.SpaFolderImages, dist.SpaImages))
+
+	engine.Any("/api", func(c *gin.Context) {
+		c.Redirect(http.StatusMovedPermanently, "/")
+	})
+
 	// listen and serve on 0.0.0.0:8080(default)
 	// listen and serve on 0.0.0.0:8080(default)
 	log_helper.GetLogger().Infoln("Try Start Server At Port", httpPort)
 	log_helper.GetLogger().Infoln("Try Start Server At Port", httpPort)
 	err := engine.Run(":" + fmt.Sprintf("%d", httpPort))
 	err := engine.Run(":" + fmt.Sprintf("%d", httpPort))