From 1a35240d42b876db9e49636baedeed6540ce3fd6 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 26 Oct 2023 20:23:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20assets=E7=A8=8B=E5=BA=8F=E5=86=85?= =?UTF-8?q?=E5=B5=8C=E5=85=A8=E5=B1=80=E8=B5=84=E6=BA=90=E8=AE=BF=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.go | 19 ++++++++---------- .../template/excel/user_import_template.xlsx | Bin 0 -> 9417 bytes src/framework/config/config.go | 10 +++++++++ src/modules/system/controller/sys_user.go | 18 ++++++++++++++++- 4 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 src/assets/template/excel/user_import_template.xlsx diff --git a/src/app.go b/src/app.go index eafc0070..05f0a4e0 100644 --- a/src/app.go +++ b/src/app.go @@ -1,6 +1,7 @@ package src import ( + "embed" "fmt" "ems.agt/src/framework/config" @@ -17,6 +18,9 @@ import ( "github.com/gin-gonic/gin" ) +//go:embed assets/* +var assetsDir embed.FS + // 路由函数句柄,交给由 http.ListenAndServe(addr, router) func AppEngine() *gin.Engine { app := initAppEngine() @@ -27,12 +31,11 @@ func AppEngine() *gin.Engine { // 初始模块路由 initModulesRoute(app) + // 设置程序内全局资源访问 + config.SetAssetsDirFS(assetsDir) + // 读取服务配置 app.ForwardedByClientIP = config.Get("server.proxy").(bool) - addr := fmt.Sprintf(":%d", config.Get("server.port").(int)) - - // 启动服务 - fmt.Printf("\nopen http://localhost%s \n\n", addr) return app } @@ -45,13 +48,7 @@ func AppEngine() *gin.Engine { // } // } func RunServer() error { - app := initAppEngine() - - // 初始全局默认 - initDefeat(app) - - // 初始模块路由 - initModulesRoute(app) + app := AppEngine() // 读取服务配置 app.ForwardedByClientIP = config.Get("server.proxy").(bool) diff --git a/src/assets/template/excel/user_import_template.xlsx b/src/assets/template/excel/user_import_template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..eea2c6ec0359631109ff373a7f24cf611f32b52e GIT binary patch literal 9417 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 literal 0 HcmV?d00001 diff --git a/src/framework/config/config.go b/src/framework/config/config.go index dfe60ebc..ce196ee9 100644 --- a/src/framework/config/config.go +++ b/src/framework/config/config.go @@ -147,6 +147,16 @@ func Get(key string) any { return viper.Get(key) } +// GetAssetsDirFS 访问程序内全局资源访问 +func GetAssetsDirFS() embed.FS { + return viper.Get("AssetsDir").(embed.FS) +} + +// SetAssetsDirFS 设置程序内全局资源访问 +func SetAssetsDirFS(assetsDir embed.FS) { + viper.Set("AssetsDir", assetsDir) +} + // IsAdmin 用户是否为管理员 func IsAdmin(userID string) bool { if userID == "" { diff --git a/src/modules/system/controller/sys_user.go b/src/modules/system/controller/sys_user.go index 138d4cd8..470d1644 100644 --- a/src/modules/system/controller/sys_user.go +++ b/src/modules/system/controller/sys_user.go @@ -455,7 +455,23 @@ func (s *SysUserController) Export(c *gin.Context) { func (s *SysUserController) Template(c *gin.Context) { fileName := fmt.Sprintf("user_import_template_%d.xlsx", time.Now().UnixMilli()) asserPath := "assets/template/excel/user_import_template.xlsx" - c.FileAttachment(asserPath, fileName) + + // 从 embed.FS 中读取默认配置文件内容 + assetsDir := config.GetAssetsDirFS() + + // 读取内嵌文件 + fileData, err := assetsDir.ReadFile(asserPath) + if err != nil { + c.String(500, "Failed to read file") + return + } + + // 设置响应头 + c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName)) + c.Header("Content-Type", "application/octet-stream") + + // 返回响应体 + c.Data(200, "application/octet-stream", fileData) } // 用户信息列表导入