diff --git a/server/api/v1/exa_file_upload_download.go b/server/api/v1/exa_file_upload_download.go index 3e563e4c79258080b715565e7c3fb4d646591fdb..b3e6427f85f5fd38899a1e1e76715d893506a98e 100644 --- a/server/api/v1/exa_file_upload_download.go +++ b/server/api/v1/exa_file_upload_download.go @@ -6,6 +6,7 @@ import ( "gin-vue-admin/model/request" "gin-vue-admin/model/response" "gin-vue-admin/service" + "gin-vue-admin/utils" "github.com/gin-gonic/gin" "go.uber.org/zap" ) @@ -78,3 +79,86 @@ func GetFileList(c *gin.Context) { },"获取成功", c) } } + +// @Tags ExaFileUploadAndDownload +// @Summary 导出Excel +// @Security ApiKeyAuth +// @accept application/json +// @Produce application/octet-stream +// @Param data body request.ExcelInfo true "导出Excel文件信息" +// @Success 200 +// @Router /fileUploadAndDownload/exportExcel [post] +func ExportExcel(c *gin.Context) { + var excelInfo request.ExcelInfo + c.ShouldBindJSON(&excelInfo) + filePath := global.GVA_CONFIG.Excel.Dir+excelInfo.FileName + err := service.ParseInfoList2Excel(excelInfo.InfoList, filePath) + if err != nil { + global.GVA_LOG.Error("转换Excel失败!", zap.Any("err", err)) + response.FailWithMessage("转换Excel失败", c) + return + } + c.Writer.Header().Add("success", "true") + c.File(filePath) +} + +// @Tags ExaFileUploadAndDownload +// @Summary 导入Excel文件 +// @Security ApiKeyAuth +// @accept multipart/form-data +// @Produce application/json +// @Param file formData file true "导入Excel文件" +// @Success 200 {string} string "{"success":true,"data":{},"msg":"导入成功"}" +// @Router /fileUploadAndDownload/importExcel [post] +func ImportExcel(c *gin.Context) { + _, header, err := c.Request.FormFile("file") + if err != nil { + global.GVA_LOG.Error("接收文件失败!", zap.Any("err", err)) + response.FailWithMessage("接收文件失败", c) + return + } + c.SaveUploadedFile(header, global.GVA_CONFIG.Excel.Dir+"ExcelImport.xlsx") + response.OkWithMessage("导入成功", c) +} + +// @Tags ExaFileUploadAndDownload +// @Summary 加载Excel数据 +// @Security ApiKeyAuth +// @Produce application/json +// @Success 200 {string} string "{"success":true,"data":{},"msg":"加载数据成功"}" +// @Router /fileUploadAndDownload/loadExcel [get] +func LoadExcel(c *gin.Context) { + menus, err := service.ParseExcel2InfoList() + if err != nil { + global.GVA_LOG.Error("加载数据失败", zap.Any("err", err)) + response.FailWithMessage("加载数据失败", c) + return + } + response.OkWithDetailed(response.PageResult{ + List: menus, + Total: int64(len(menus)), + Page: 1, + PageSize: 999, + },"加载数据成功", c) +} + +// @Tags ExaFileUploadAndDownload +// @Summary 下载模板 +// @Security ApiKeyAuth +// @accept multipart/form-data +// @Produce application/json +// @Param fileName query fileName true "模板名称" +// @Success 200 +// @Router /fileUploadAndDownload/downloadTemplate [get] +func DownloadTemplate(c *gin.Context) { + fileName := c.Query("fileName") + filePath := global.GVA_CONFIG.Excel.Dir+fileName + ok, err := utils.PathExists(filePath) + if !ok || err != nil { + global.GVA_LOG.Error("文件不存在", zap.Any("err", err)) + response.FailWithMessage("文件不存在", c) + return + } + c.Writer.Header().Add("success", "true") + c.File(filePath) +} \ No newline at end of file diff --git a/server/config.yaml b/server/config.yaml index 90f3d71cc4085695a9e12dc3d50e86596d3306ae..ebb438b8564f08ebfe2453050a24354d76045393 100644 --- a/server/config.yaml +++ b/server/config.yaml @@ -76,4 +76,8 @@ qiniu: use-https: false access-key: '25j8dYBZ2wuiy0yhwShytjZDTX662b8xiFguwxzZ' secret-key: 'pgdbqEsf7ooZh7W3xokP833h3dZ_VecFXPDeG5JY' - use-cdn-domains: false \ No newline at end of file + use-cdn-domains: false + +# excel configuration +excel: + dir: './resource/excel/' \ No newline at end of file diff --git a/server/config/config.go b/server/config/config.go index 71506081ce4fe62967bae92bc7deb7b7662d1ffe..7ead08b0f71b91a6d5e6614cd3a27282bec0a158 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -13,4 +13,5 @@ type Server struct { // oss Local Local `mapstructure:"local" json:"local" yaml:"local"` Qiniu Qiniu `mapstructure:"qiniu" json:"qiniu" yaml:"qiniu"` + Excel Excel `mapstructure:"excel" json:"excel" yaml:"excel"` } diff --git a/server/config/excel.go b/server/config/excel.go new file mode 100644 index 0000000000000000000000000000000000000000..a5a84234f03edf6afadfe1ffa8dd03ba40cc4111 --- /dev/null +++ b/server/config/excel.go @@ -0,0 +1,5 @@ +package config + +type Excel struct { + Dir string `mapstructure:"dir" json:"dir" yaml:"dir"` +} \ No newline at end of file diff --git a/server/go.mod b/server/go.mod index 3d83eeaf4a6aba6ac08de1f6ee9bfe14e3956fff..c1b0bf9b8ba7031762668e14530d462cad61587a 100644 --- a/server/go.mod +++ b/server/go.mod @@ -3,6 +3,7 @@ module gin-vue-admin go 1.14 require ( + github.com/360EntSecGroup-Skylar/excelize/v2 v2.3.2 github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 github.com/casbin/casbin v1.9.1 @@ -47,8 +48,7 @@ require ( github.com/tebeka/strftime v0.1.3 // indirect github.com/unrolled/secure v1.0.7 go.uber.org/zap v1.10.0 - golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e // indirect - golang.org/x/sys v0.0.0-20200610111108-226ff32320da // indirect + golang.org/x/net v0.0.0-20201224014010-6772e930b67b // indirect golang.org/x/tools v0.0.0-20200324003944-a576cf524670 // indirect google.golang.org/protobuf v1.24.0 // indirect gopkg.in/ini.v1 v1.55.0 // indirect diff --git a/server/model/request/exa_file_upload_and_download.go b/server/model/request/exa_file_upload_and_download.go new file mode 100644 index 0000000000000000000000000000000000000000..c95cd83ad8fbc3b07f76c89a4d2e619344daf080 --- /dev/null +++ b/server/model/request/exa_file_upload_and_download.go @@ -0,0 +1,8 @@ +package request + +import "gin-vue-admin/model" + +type ExcelInfo struct { + FileName string `json:"fileName"` + InfoList []model.SysBaseMenu `json:"infoList"` +} \ No newline at end of file diff --git a/server/resource/excel/ExcelExport.xlsx b/server/resource/excel/ExcelExport.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5b2ba1ca13ee3af5546a0682a207935ef7558619 Binary files /dev/null and b/server/resource/excel/ExcelExport.xlsx differ diff --git a/server/resource/excel/ExcelImport.xlsx b/server/resource/excel/ExcelImport.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6a6156dd8d3446defea0922dd7e30f107f5d5c46 Binary files /dev/null and b/server/resource/excel/ExcelImport.xlsx differ diff --git a/server/resource/excel/ExcelTemplate.xlsx b/server/resource/excel/ExcelTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d0d53e96d6e67b5270ae93e4bcc381773ac50a8d Binary files /dev/null and b/server/resource/excel/ExcelTemplate.xlsx differ diff --git a/server/router/exp_file_upload_and_download.go b/server/router/exp_file_upload_and_download.go index de141d8cd5206cd82e32f3d9e64d14a751d9511d..c8ed1fb85cf66ddb3d676c813b490f5d6243666a 100644 --- a/server/router/exp_file_upload_and_download.go +++ b/server/router/exp_file_upload_and_download.go @@ -15,5 +15,9 @@ func InitFileUploadAndDownloadRouter(Router *gin.RouterGroup) { FileUploadAndDownloadGroup.GET("/findFile", v1.FindFile) // 查询当前文件成功的切片 FileUploadAndDownloadGroup.POST("/breakpointContinueFinish", v1.BreakpointContinueFinish) // 查询当前文件成功的切片 FileUploadAndDownloadGroup.POST("/removeChunk", v1.RemoveChunk) // 查询当前文件成功的切片 + FileUploadAndDownloadGroup.POST("/importExcel", v1.ImportExcel) // 导入Excel + FileUploadAndDownloadGroup.GET("/loadExcel", v1.LoadExcel) // 加载Excel数据 + FileUploadAndDownloadGroup.POST("/exportExcel", v1.ExportExcel) // 导出Excel + FileUploadAndDownloadGroup.GET("/downloadTemplate", v1.DownloadTemplate) // 下载模板文件 } } diff --git a/server/service/exa_excel_parse.go b/server/service/exa_excel_parse.go new file mode 100644 index 0000000000000000000000000000000000000000..bb6f8ba98f7d3538854ac359d359caabd1bd69e9 --- /dev/null +++ b/server/service/exa_excel_parse.go @@ -0,0 +1,91 @@ +package service + +import ( + "errors" + "fmt" + "gin-vue-admin/global" + "gin-vue-admin/model" + "github.com/360EntSecGroup-Skylar/excelize/v2" + "strconv" +) + +func ParseInfoList2Excel(infoList []model.SysBaseMenu, filePath string) error { + excel := excelize.NewFile() + excel.SetSheetRow("Sheet1","A1",&[]string{"ID","路由Name","路由Path","是否隐藏","父节点","排序","文件名称"}) + for i, menu := range infoList { + axis := fmt.Sprintf("A%d",i+2) + excel.SetSheetRow("Sheet1",axis,&[]interface{}{ + menu.ID, + menu.Name, + menu.Path, + menu.Hidden, + menu.ParentId, + menu.Sort, + menu.Component, + }) + } + excel.SaveAs(filePath) + return nil +} + +func ParseExcel2InfoList() ([]model.SysBaseMenu, error) { + skipHeader := true + fixedHeader := []string{"ID","路由Name","路由Path","是否隐藏","父节点","排序","文件名称"} + file, err := excelize.OpenFile(global.GVA_CONFIG.Excel.Dir+"ExcelImport.xlsx") + if err != nil { + return nil, err + } + menus := make([]model.SysBaseMenu, 0) + rows, err := file.Rows("Sheet1") + if err != nil { + return nil, err + } + for rows.Next() { + row, err := rows.Columns() + if err != nil { + return nil, err + } + if skipHeader { + if compareStrSlice(row, fixedHeader) { + skipHeader = false + continue + } else { + return nil, errors.New("Excel格式错误") + } + } + if len(row) != len(fixedHeader) { + continue + } + id, _ := strconv.Atoi(row[0]) + hidden, _ := strconv.ParseBool(row[3]) + sort, _ := strconv.Atoi(row[5]) + menu := model.SysBaseMenu{ + GVA_MODEL: global.GVA_MODEL{ + ID: uint(id), + }, + Name: row[1], + Path: row[2], + Hidden: hidden, + ParentId: row[4], + Sort: sort, + Component: row[6], + } + menus = append(menus, menu) + } + return menus, nil +} + +func compareStrSlice(a, b []string) bool { + if len(a) != len(b) { + return false + } + if (b == nil) != (a == nil) { + return false + } + for key, value := range a { + if value != b[key] { + return false + } + } + return true +} \ No newline at end of file diff --git a/web/package-lock.json b/web/package-lock.json index 055a151c1fc8679468cc7bb41d4bc48f89f8649b..d0e63dab4a6f56031b9fd2c9b40d4890f2cc4194 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,5 +1,5 @@ { - "name": "qm-plus-vue-page", + "name": "gin-vue-admin", "version": "0.1.0", "lockfileVersion": 1, "requires": true, @@ -3449,6 +3449,13 @@ "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", "dev": true }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "optional": true + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz?cache=0&sync_timestamp=1591599659970&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-3.1.3.tgz", @@ -3476,12 +3483,31 @@ "path-exists": "^4.0.0" } }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", "dev": true }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "optional": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", @@ -3647,6 +3673,16 @@ "ansi-regex": "^5.0.0" } }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^4.0.0" + } + }, "terser": { "version": "4.8.0", "resolved": "https://registry.npm.taobao.org/terser/download/terser-4.8.0.tgz?cache=0&sync_timestamp=1599751633316&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser%2Fdownload%2Fterser-4.8.0.tgz", @@ -3685,6 +3721,31 @@ "punycode": "^2.1.1" } }, + "vue-loader-v16": { + "version": "npm:vue-loader@16.1.2", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.1.2.tgz", + "integrity": "sha512-8QTxh+Fd+HB6fiL52iEVLKqE9N1JSlMXLR92Ijm6g8PZrwIxckgpqjPDWRP5TWxdiPaHR+alUWsnu1ShQOwt+Q==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-6.2.0.tgz", @@ -14937,94 +14998,6 @@ } } }, - "vue-loader-v16": { - "version": "npm:vue-loader@16.1.1", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.1.1.tgz", - "integrity": "sha512-wz/+HFg/3SBayHWAlZXARcnDTl3VOChrfW9YnxvAweiuyKX/7IGx1ad/4yJHmwhgWlOVYMAbTiI7GV8G33PfGQ==", - "dev": true, - "optional": true, - "requires": { - "chalk": "^4.1.0", - "hash-sum": "^2.0.0", - "loader-utils": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "optional": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "optional": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "optional": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "vue-particle-line": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/vue-particle-line/-/vue-particle-line-0.1.4.tgz", diff --git a/web/package.json b/web/package.json index 76b70c24ccd6205b1e3059356a09182dbd84fe2b..7ea3aaae0b5774c4df20418ff0b6594d4b6cb290 100644 --- a/web/package.json +++ b/web/package.json @@ -74,4 +74,4 @@ "> 1%", "last 2 versions" ] -} +} \ No newline at end of file diff --git a/web/src/api/fileUploadAndDownload.js b/web/src/api/fileUploadAndDownload.js index bd77cf31d4b764fc30826919c578ba4cefcaf6cc..62e70c7b597888934c3641a63c42b1a72dd71f99 100644 --- a/web/src/api/fileUploadAndDownload.js +++ b/web/src/api/fileUploadAndDownload.js @@ -1,4 +1,31 @@ -import service from '@/utils/request' +import service from '@/utils/request'; +import { Message } from 'element-ui'; + +const handleFileError = (res, fileName) => { + if (typeof(res.data) !== "undefined") { + if (res.data.type == "application/json") { + const reader = new FileReader(); + reader.onload = function() { + let message = JSON.parse(reader.result).msg; + Message({ + showClose: true, + message: message, + type: 'error' + }) + }; + reader.readAsText(new Blob([res.data])); + } + } else { + var downloadUrl = window.URL.createObjectURL(new Blob([res])); + var a = document.createElement('a'); + a.style.display = 'none'; + a.href = downloadUrl; + a.download = fileName; + var event = new MouseEvent("click"); + a.dispatchEvent(event); + } +} + // @Tags FileUploadAndDownload // @Summary 分页文件列表 // @Security ApiKeyAuth @@ -28,4 +55,62 @@ export const deleteFile = (data) => { method: "post", data }) +} + +// @Tags ExaFileUploadAndDownload +// @Summary 导出Excel +// @Security ApiKeyAuth +// @accept application/json +// @Produce application/octet-stream +// @Param data body request.ExcelInfo true "导出Excel文件信息" +// @Success 200 +// @Router /fileUploadAndDownload/exportExcel [post] +export const exportExcel = (tableData, fileName) => { + service({ + url: "/fileUploadAndDownload/exportExcel", + method: 'post', + data: { + fileName: fileName, + infoList: tableData + }, + responseType: 'blob' + }).then((res)=>{ + handleFileError(res, fileName) + }) +} + +// @Tags ExaFileUploadAndDownload +// @Summary 导入Excel文件 +// @Security ApiKeyAuth +// @accept multipart/form-data +// @Produce application/json +// @Param file formData file true "导入Excel文件" +// @Success 200 {string} string "{"success":true,"data":{},"msg":"导入成功"}" +// @Router /fileUploadAndDownload/importExcel [post] +export const loadExcelData = () => { + return service({ + url: "/fileUploadAndDownload/loadExcel", + method: 'get' + }) +} + +// @Tags ExaFileUploadAndDownload +// @Summary 下载模板 +// @Security ApiKeyAuth +// @accept multipart/form-data +// @Produce application/json +// @Param fileName query fileName true "模板名称" +// @Success 200 +// @Router /fileUploadAndDownload/downloadTemplate [get] +export const downloadTemplate = (fileName) => { + return service({ + url: "/fileUploadAndDownload/downloadTemplate", + method: 'get', + params:{ + fileName: fileName + }, + responseType: 'blob' + }).then((res)=>{ + handleFileError(res, fileName) + }) } \ No newline at end of file diff --git a/web/src/view/example/excel/excel.vue b/web/src/view/example/excel/excel.vue index cc8feb432c145d20b84531f6a531ac43a3734fe9..bb208cb762878cd06285be34ab115c6f17ef63c8 100644 --- a/web/src/view/example/excel/excel.vue +++ b/web/src/view/example/excel/excel.vue @@ -1,69 +1,74 @@ \ No newline at end of file