package graph import ( "app/cfg" "app/models" "app/utils" "errors" "fmt" "github.com/veypi/OneBD/rest" ) var _ = Router.Get("", getHandle) var _ = Router.Get("/:stage_id/", getHandle) // getHandle 获取完整的图形数据,包括节点和连接 func getHandle(x *rest.X) (any, error) { utils.SetCORSHeaders(x) stageID, ok := x.Params.Get("stage_id") if !ok { return nil, errors.New("缺少stage_id") } // 验证阶段是否存在 var stage models.Stage if err := cfg.DB().Where("id = ?", stageID).First(&stage).Error; err != nil { return nil, errors.New("阶段不存在") } // 获取该阶段的所有节点 var nodes []models.GraphNode if err := cfg.DB().Where("stage_id = ?", stageID).Find(&nodes).Error; err != nil { return nil, err } // 获取该阶段的所有连接 var links []models.GraphLink if err := cfg.DB().Where("stage_id = ?", stageID).Find(&links).Error; err != nil { return nil, err } // 返回完整的图形数据 return map[string]interface{}{ "stage": stage, "nodes": nodes, "links": links, }, nil } var _ = Router.Post("/:stage_id/", saveHandle) func saveHandle(x *rest.X) (any, error) { utils.SetCORSHeaders(x) fmt.Println("saveHandle") stageID, ok := x.Params.Get("stage_id") if !ok { return nil, errors.New("缺少stage_id") } // 验证阶段是否存在 var stage models.Stage if err := cfg.DB().Where("id = ?", stageID).First(&stage).Error; err != nil { return nil, errors.New("阶段不存在") } // 解析请求体 var data struct { Nodes []models.GraphNode `json:"nodes"` Links []models.GraphLink `json:"links"` } if err := x.Parse(&data); err != nil { return nil, err } // fmt.Printf("%+v\n", data) // 开始事务 tx := cfg.DB().Begin() // 删除原有的节点和连接 if err := tx.Where("stage_id = ?", stageID).Delete(&models.GraphNode{}).Error; err != nil { tx.Rollback() return nil, err } if err := tx.Where("stage_id = ?", stageID).Delete(&models.GraphLink{}).Error; err != nil { tx.Rollback() return nil, err } // 保存新的节点和连接 for _, node := range data.Nodes { node.StageID = stageID if err := tx.Create(&node).Error; err != nil { tx.Rollback() return nil, err } } for _, link := range data.Links { link.StageID = stageID if err := tx.Create(&link).Error; err != nil { tx.Rollback() return nil, err } } // 提交事务 if err := tx.Commit().Error; err != nil { return nil, err } return map[string]interface{}{ "message": "保存成功", }, nil } var _ = Router.Any("/*", anyHandle) // anyHandle 处理其他请求 func anyHandle(x *rest.X) (any, error) { utils.SetCORSHeaders(x) return nil, nil }