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