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