Files
excel-api/handlers/sheet.go
2026-06-26 14:31:24 +08:00

175 lines
4.1 KiB
Go

// Package handlers 实现工作表相关的API请求处理器
package handlers
import (
"excel-api/models"
"excel-api/utils"
"strconv"
"github.com/gin-gonic/gin"
)
// GetSheets 获取工作簿下的工作表列表
// 请求方式: GET
// 路径: /api/workbooks/:wid/sheets
// 路径参数: wid - 工作簿ID
func GetSheets(c *gin.Context) {
wid := c.Param("wid")
// 验证工作簿是否存在
var workbook models.Workbook
if result := models.DB.First(&workbook, wid); result.Error != nil {
utils.Error(c, 404, "工作簿不存在")
return
}
var sheets []models.Sheet
// 查询该工作簿下的所有工作表,按索引排序
result := models.DB.Where("workbook_id = ?", wid).Order("index ASC").Find(&sheets)
if result.Error != nil {
utils.Error(c, 500, "查询工作表列表失败")
return
}
utils.Success(c, sheets)
}
// CreateSheet 在工作簿下创建新工作表
// 请求方式: POST
// 路径: /api/workbooks/:wid/sheets
// 路径参数: wid - 工作簿ID
// 请求体: { "name": "工作表名称" }
func CreateSheet(c *gin.Context) {
wid := c.Param("wid")
// 验证工作簿是否存在
var workbook models.Workbook
if result := models.DB.First(&workbook, wid); result.Error != nil {
utils.Error(c, 404, "工作簿不存在")
return
}
var req struct {
Name string `json:"name" binding:"required"` // 工作表名称,必填
}
if err := c.ShouldBindJSON(&req); err != nil {
utils.Error(c, 400, "参数错误: "+err.Error())
return
}
// 获取当前工作簿下最大的排序索引
var maxIndex int
models.DB.Model(&models.Sheet{}).Where("workbook_id = ?", wid).Select("COALESCE(MAX(index), -1)").Scan(&maxIndex)
widNum, _ := strconv.Atoi(wid)
sheet := models.Sheet{
WorkbookID: uint(widNum),
Name: req.Name,
Index: maxIndex + 1,
ColCount: 26,
RowCount: 100,
}
result := models.DB.Create(&sheet)
if result.Error != nil {
utils.Error(c, 500, "创建工作表失败")
return
}
utils.SuccessWithMessage(c, "创建工作表成功", sheet)
}
// GetSheet 获取工作表详情
// 请求方式: GET
// 路径: /api/sheets/:id
// 路径参数: id - 工作表ID
func GetSheet(c *gin.Context) {
id := c.Param("id")
var sheet models.Sheet
result := models.DB.First(&sheet, id)
if result.Error != nil {
utils.Error(c, 404, "工作表不存在")
return
}
utils.Success(c, sheet)
}
// UpdateSheet 更新工作表信息
// 请求方式: PUT
// 路径: /api/sheets/:id
// 路径参数: id - 工作表ID
// 请求体: { "name": "新名称", "index": 0, "colCount": 26, "rowCount": 100 }
func UpdateSheet(c *gin.Context) {
id := c.Param("id")
var sheet models.Sheet
result := models.DB.First(&sheet, id)
if result.Error != nil {
utils.Error(c, 404, "工作表不存在")
return
}
var req struct {
Name string `json:"name"` // 工作表名称
Index int `json:"index"` // 排序索引
ColCount int `json:"colCount"` // 列数量
RowCount int `json:"rowCount"` // 行数量
}
if err := c.ShouldBindJSON(&req); err != nil {
utils.Error(c, 400, "参数错误: "+err.Error())
return
}
if req.Name != "" {
sheet.Name = req.Name
}
if req.Index >= 0 {
sheet.Index = req.Index
}
if req.ColCount > 0 {
sheet.ColCount = req.ColCount
}
if req.RowCount > 0 {
sheet.RowCount = req.RowCount
}
result = models.DB.Save(&sheet)
if result.Error != nil {
utils.Error(c, 500, "更新工作表失败")
return
}
utils.SuccessWithMessage(c, "更新工作表成功", sheet)
}
// DeleteSheet 删除工作表(软删除)
// 请求方式: DELETE
// 路径: /api/sheets/:id
// 路径参数: id - 工作表ID
func DeleteSheet(c *gin.Context) {
id := c.Param("id")
var sheet models.Sheet
result := models.DB.First(&sheet, id)
if result.Error != nil {
utils.Error(c, 404, "工作表不存在")
return
}
// 软删除工作表及其关联的单元格
result = models.DB.Delete(&sheet)
if result.Error != nil {
utils.Error(c, 500, "删除工作表失败")
return
}
// 同时删除关联的单元格
models.DB.Where("sheet_id = ?", id).Delete(&models.Cell{})
utils.SuccessWithMessage(c, "删除工作表成功", nil)
}