175 lines
4.1 KiB
Go
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)
|
|
}
|