🎨 新增兑换码库导出excel功能
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"git.echol.cn/loser/lckt/global"
|
||||
"git.echol.cn/loser/lckt/model/app"
|
||||
"git.echol.cn/loser/lckt/model/app/request"
|
||||
@@ -8,6 +9,7 @@ import (
|
||||
r "git.echol.cn/loser/lckt/model/common/response"
|
||||
"github.com/gin-gonic/gin"
|
||||
"go.uber.org/zap"
|
||||
"time"
|
||||
)
|
||||
|
||||
type RedeemCodeApi struct{}
|
||||
@@ -169,6 +171,7 @@ func (rc *RedeemCodeApi) DeleteCDK(ctx *gin.Context) {
|
||||
r.OkWithMessage("删除兑换码成功", ctx)
|
||||
}
|
||||
|
||||
// Redeem 兑换码兑换
|
||||
func (rc *RedeemCodeApi) Redeem(context *gin.Context) {
|
||||
var p request.RedeemCDK
|
||||
if err := context.ShouldBind(&p); err != nil {
|
||||
@@ -186,3 +189,29 @@ func (rc *RedeemCodeApi) Redeem(context *gin.Context) {
|
||||
|
||||
r.OkWithMessage("兑换成功", context)
|
||||
}
|
||||
|
||||
// ExportCDK 导出Excel
|
||||
func (rc *RedeemCodeApi) ExportCDK(ctx *gin.Context) {
|
||||
var p request.ExportCDK
|
||||
if err := ctx.ShouldBind(&p); err != nil {
|
||||
r.FailWithMessage("导出Excel失败:"+err.Error(), ctx)
|
||||
global.GVA_LOG.Error("导出Excel失败", zap.Error(err))
|
||||
return
|
||||
}
|
||||
|
||||
f, err := redeemCodeService.ExportCDK(p)
|
||||
if err != nil {
|
||||
r.FailWithMessage("导出Excel失败:"+err.Error(), ctx)
|
||||
global.GVA_LOG.Error("导出Excel失败", zap.Error(err))
|
||||
return
|
||||
}
|
||||
// Return the excel file.
|
||||
ctx.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
||||
filename := fmt.Sprintf("好运助手兑换码%v.xlsx", time.Now().Format("2006-01-02T15:04:05"))
|
||||
ctx.Header("Content-Disposition", "attachment; filename="+filename)
|
||||
if err := f.Write(ctx.Writer); err != nil {
|
||||
r.FailWithMessage("导出Excel失败:"+err.Error(), ctx)
|
||||
return
|
||||
}
|
||||
r.OkWithMessage("导出Excel成功", ctx)
|
||||
}
|
||||
|
@@ -21,3 +21,8 @@ type RedeemCDK struct {
|
||||
UseName string `json:"useName" form:"useName"` // 使用人名称
|
||||
UserId uint `json:"userId" form:"userId"` // 用户ID
|
||||
}
|
||||
|
||||
type ExportCDK struct {
|
||||
Eid uint `json:"eid" form:"eid" binding:"required"`
|
||||
Domain string `json:"domain" form:"domain"` // 域名
|
||||
}
|
||||
|
@@ -10,11 +10,12 @@ func (rcr *RedeemCodeRouter) InitRedeemCodeRouter(AppRouter, SysteamRouter *gin.
|
||||
|
||||
{
|
||||
// 兑换码库
|
||||
SysCDKRouter.POST("mk", redeemCodeApi.Create) // 创建兑换码库
|
||||
SysCDKRouter.DELETE("mk", redeemCodeApi.Delete) // 删除兑换码库
|
||||
SysCDKRouter.PUT("mk", redeemCodeApi.Update) // 更新兑换码库
|
||||
SysCDKRouter.GET("/mk/list", redeemCodeApi.GetList) // 分页获取兑换码库列表
|
||||
SysCDKRouter.GET("mk/:id", redeemCodeApi.GetById) // 获取单个兑换码库信息
|
||||
SysCDKRouter.POST("mk", redeemCodeApi.Create) // 创建兑换码库
|
||||
SysCDKRouter.DELETE("mk", redeemCodeApi.Delete) // 删除兑换码库
|
||||
SysCDKRouter.PUT("mk", redeemCodeApi.Update) // 更新兑换码库
|
||||
SysCDKRouter.GET("/mk/list", redeemCodeApi.GetList) // 分页获取兑换码库列表
|
||||
SysCDKRouter.GET("mk/:id", redeemCodeApi.GetById) // 获取单个兑换码库信息
|
||||
SysCDKRouter.GET("/mk/excel", redeemCodeApi.ExportCDK) // 导出兑换码
|
||||
}
|
||||
|
||||
{
|
||||
|
@@ -2,6 +2,7 @@ package app
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"git.echol.cn/loser/lckt/global"
|
||||
"git.echol.cn/loser/lckt/model/app"
|
||||
request2 "git.echol.cn/loser/lckt/model/app/request"
|
||||
@@ -12,8 +13,10 @@ import (
|
||||
"git.echol.cn/loser/lckt/utils"
|
||||
"git.echol.cn/loser/lckt/utils/wechat"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/xuri/excelize/v2"
|
||||
"go.uber.org/zap"
|
||||
"gorm.io/gorm"
|
||||
"os"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -346,3 +349,90 @@ func (s RedeemCodeService) Redeem(p request2.RedeemCDK, ctx *gin.Context) (err e
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (s RedeemCodeService) ExportCDK(p request2.ExportCDK) (f *excelize.File, err error) {
|
||||
var cdks []app.CDK
|
||||
err = global.GVA_DB.Where("redeem_id = ?", p.Eid).Find(&cdks).Error
|
||||
if err != nil {
|
||||
global.GVA_LOG.Error("导出兑换码失败", zap.Error(err))
|
||||
return
|
||||
}
|
||||
|
||||
var redeem app.RedeemCode
|
||||
err = global.GVA_DB.Where("id = ?", p.Eid).First(&redeem).Error
|
||||
if err != nil {
|
||||
global.GVA_LOG.Error("读取码库信息失败", zap.Error(err))
|
||||
return
|
||||
}
|
||||
|
||||
// 导出Excel
|
||||
f = excelize.NewFile()
|
||||
temp, err := os.CreateTemp("", "cdk.xlsx")
|
||||
if err != nil {
|
||||
global.GVA_LOG.Error("创建临时文件失败", zap.Error(err))
|
||||
return
|
||||
}
|
||||
defer os.Remove(temp.Name())
|
||||
defer temp.Close()
|
||||
|
||||
// 创建一个工作表
|
||||
index, err := f.NewSheet("Sheet1")
|
||||
// 设置单元格的值
|
||||
f.SetCellValue("Sheet1", "A1", "赠送码标题")
|
||||
f.SetCellValue("Sheet1", "B1", "CDK")
|
||||
f.SetCellValue("Sheet1", "C1", "状态")
|
||||
// 兑换链接
|
||||
f.SetCellValue("Sheet1", "D1", "兑换链接")
|
||||
f.SetCellValue("Sheet1", "E1", "使用人")
|
||||
for i, cdk := range cdks {
|
||||
f.SetCellValue("Sheet1", fmt.Sprintf("A%d", i+2), redeem.CodeName)
|
||||
f.SetCellValue("Sheet1", fmt.Sprintf("B%d", i+2), cdk.Code)
|
||||
if cdk.Status == 2 {
|
||||
f.SetCellValue("Sheet1", fmt.Sprintf("C%d", i+2), "已使用")
|
||||
} else if cdk.Status == 1 {
|
||||
f.SetCellValue("Sheet1", fmt.Sprintf("C%d", i+2), "未使用")
|
||||
}
|
||||
f.SetCellValue("Sheet1", fmt.Sprintf("D%d", i+2), p.Domain+"pages/user/cdk/index?dhm="+cdk.Code)
|
||||
f.SetCellValue("Sheet1", fmt.Sprintf("E%d", i+2), cdk.UseName)
|
||||
}
|
||||
|
||||
// 设置工作簿的默认工作表
|
||||
f.SetActiveSheet(index)
|
||||
// 设置列宽
|
||||
if err := f.SetColWidth("Sheet1", "A", "A", 20); err != nil {
|
||||
global.GVA_LOG.Error("设置列宽失败", zap.Error(err))
|
||||
}
|
||||
if err := f.SetColWidth("Sheet1", "B", "B", 20); err != nil {
|
||||
global.GVA_LOG.Error("设置列宽失败", zap.Error(err))
|
||||
}
|
||||
if err := f.SetColWidth("Sheet1", "C", "C", 10); err != nil {
|
||||
global.GVA_LOG.Error("设置列宽失败", zap.Error(err))
|
||||
}
|
||||
if err := f.SetColWidth("Sheet1", "D", "D", 100); err != nil {
|
||||
global.GVA_LOG.Error("设置列宽失败", zap.Error(err))
|
||||
}
|
||||
if err := f.SetColWidth("Sheet1", "E", "E", 20); err != nil {
|
||||
global.GVA_LOG.Error("设置列宽失败", zap.Error(err))
|
||||
}
|
||||
|
||||
// 设置单元格样式 居中
|
||||
style, err := f.NewStyle(&excelize.Style{
|
||||
Alignment: &excelize.Alignment{
|
||||
Horizontal: "center",
|
||||
Vertical: "center",
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
global.GVA_LOG.Error("设置单元格样式失败", zap.Error(err))
|
||||
}
|
||||
if err := f.SetCellStyle("Sheet1", "A1", fmt.Sprintf("E%d", len(cdks)+1), style); err != nil {
|
||||
global.GVA_LOG.Error("设置单元格样式失败", zap.Error(err))
|
||||
}
|
||||
|
||||
if err = f.Write(temp); err != nil {
|
||||
global.GVA_LOG.Error("写入临时文件失败", zap.Error(err))
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
Reference in New Issue
Block a user