🎨 新增兑换码库导出excel功能

This commit is contained in:
2025-09-27 17:17:47 +08:00
parent 013b7af7e3
commit 0ec44fad2c
4 changed files with 130 additions and 5 deletions

View File

@@ -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)
}

View File

@@ -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"` // 域名
}

View File

@@ -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) // 导出兑换码
}
{

View File

@@ -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
}