pixel
4 years ago
14 changed files with 218 additions and 183 deletions
-
99server/api/v1/exa_excel.go
-
86server/api/v1/exa_file_upload_download.go
-
4server/cmd/information/system/api.go
-
4server/cmd/information/system/casbin.go
-
1server/initialize/router.go
-
6server/model/exa_excel.go
-
8server/model/request/exa_file_upload_and_download.go
-
BINserver/resource/excel/ExcelExport.xlsx
-
0server/router/exa_customer.go
-
16server/router/exa_excel.go
-
4server/router/exa_file_upload_and_download.go
-
85web/src/api/excel.js
-
84web/src/api/fileUploadAndDownload.js
-
4web/src/view/example/excel/excel.vue
@ -0,0 +1,99 @@ |
|||||
|
package v1 |
||||
|
|
||||
|
import ( |
||||
|
"gin-vue-admin/global" |
||||
|
"gin-vue-admin/model" |
||||
|
"gin-vue-admin/model/response" |
||||
|
"gin-vue-admin/service" |
||||
|
"gin-vue-admin/utils" |
||||
|
"github.com/gin-gonic/gin" |
||||
|
"go.uber.org/zap" |
||||
|
) |
||||
|
|
||||
|
// /excel/importExcel 接口,与upload接口作用类似,只是把文件存到resource/excel目录下,用于导入Excel时存放Excel文件(ExcelImport.xlsx)
|
||||
|
// /excel/loadExcel接口,用于读取resource/excel目录下的文件((ExcelImport.xlsx)并加载为[]model.SysBaseMenu类型的示例数据
|
||||
|
// /excel/exportExcel 接口,用于读取前端传来的tableData,生成Excel文件并返回
|
||||
|
// /excel/downloadTemplate 接口,用于下载resource/excel目录下的 ExcelTemplate.xlsx 文件,作为导入的模板
|
||||
|
|
||||
|
// @Tags excel
|
||||
|
// @Summary 导出Excel
|
||||
|
// @Security ApiKeyAuth
|
||||
|
// @accept application/json
|
||||
|
// @Produce application/octet-stream
|
||||
|
// @Param data body model.ExcelInfo true "导出Excel文件信息"
|
||||
|
// @Success 200
|
||||
|
// @Router /excel/exportExcel [post]
|
||||
|
func ExportExcel(c *gin.Context) { |
||||
|
var excelInfo model.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 excel
|
||||
|
// @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 /excel/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 excel
|
||||
|
// @Summary 加载Excel数据
|
||||
|
// @Security ApiKeyAuth
|
||||
|
// @Produce application/json
|
||||
|
// @Success 200 {string} string "{"success":true,"data":{},"msg":"加载数据成功"}"
|
||||
|
// @Router /excel/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 excel
|
||||
|
// @Summary 下载模板
|
||||
|
// @Security ApiKeyAuth
|
||||
|
// @accept multipart/form-data
|
||||
|
// @Produce application/json
|
||||
|
// @Param fileName query fileName true "模板名称"
|
||||
|
// @Success 200
|
||||
|
// @Router /excel/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) |
||||
|
} |
@ -0,0 +1,6 @@ |
|||||
|
package model |
||||
|
|
||||
|
type ExcelInfo struct { |
||||
|
FileName string `json:"fileName"` |
||||
|
InfoList []SysBaseMenu `json:"infoList"` |
||||
|
} |
@ -1,8 +0,0 @@ |
|||||
package request |
|
||||
|
|
||||
import "gin-vue-admin/model" |
|
||||
|
|
||||
type ExcelInfo struct { |
|
||||
FileName string `json:"fileName"` |
|
||||
InfoList []model.SysBaseMenu `json:"infoList"` |
|
||||
} |
|
@ -0,0 +1,16 @@ |
|||||
|
package router |
||||
|
|
||||
|
import ( |
||||
|
"gin-vue-admin/api/v1" |
||||
|
"github.com/gin-gonic/gin" |
||||
|
) |
||||
|
|
||||
|
func InitExcelRouter(Router *gin.RouterGroup) { |
||||
|
FileUploadAndDownloadGroup := Router.Group("excel") |
||||
|
{ |
||||
|
FileUploadAndDownloadGroup.POST("/importExcel", v1.ImportExcel) // 导入Excel
|
||||
|
FileUploadAndDownloadGroup.GET("/loadExcel", v1.LoadExcel) // 加载Excel数据
|
||||
|
FileUploadAndDownloadGroup.POST("/exportExcel", v1.ExportExcel) // 导出Excel
|
||||
|
FileUploadAndDownloadGroup.GET("/downloadTemplate", v1.DownloadTemplate) // 下载模板文件
|
||||
|
} |
||||
|
} |
@ -0,0 +1,85 @@ |
|||||
|
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 excel
|
||||
|
// @Summary 导出Excel
|
||||
|
// @Security ApiKeyAuth
|
||||
|
// @accept application/json
|
||||
|
// @Produce application/octet-stream
|
||||
|
// @Param data body model.ExcelInfo true "导出Excel文件信息"
|
||||
|
// @Success 200
|
||||
|
// @Router /excel/exportExcel [post]
|
||||
|
export const exportExcel = (tableData, fileName) => { |
||||
|
service({ |
||||
|
url: "/excel/exportExcel", |
||||
|
method: 'post', |
||||
|
data: { |
||||
|
fileName: fileName, |
||||
|
infoList: tableData |
||||
|
}, |
||||
|
responseType: 'blob' |
||||
|
}).then((res) => { |
||||
|
handleFileError(res, fileName) |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
// @Tags excel
|
||||
|
// @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 /excel/importExcel [post]
|
||||
|
export const loadExcelData = () => { |
||||
|
return service({ |
||||
|
url: "/excel/loadExcel", |
||||
|
method: 'get' |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
// @Tags excel
|
||||
|
// @Summary 下载模板
|
||||
|
// @Security ApiKeyAuth
|
||||
|
// @accept multipart/form-data
|
||||
|
// @Produce application/json
|
||||
|
// @Param fileName query fileName true "模板名称"
|
||||
|
// @Success 200
|
||||
|
// @Router /excel/downloadTemplate [get]
|
||||
|
export const downloadTemplate = (fileName) => { |
||||
|
return service({ |
||||
|
url: "/excel/downloadTemplate", |
||||
|
method: 'get', |
||||
|
params: { |
||||
|
fileName: fileName |
||||
|
}, |
||||
|
responseType: 'blob' |
||||
|
}).then((res) => { |
||||
|
handleFileError(res, fileName) |
||||
|
}) |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue