package handler import ( "strconv" "gotest/internal/service" "github.com/gin-gonic/gin" ) // FoodHandler 外卖数据处理器 type FoodHandler struct { svc *service.FoodService } // NewFoodHandler 创建外卖数据处理器 func NewFoodHandler(svc *service.FoodService) *FoodHandler { return &FoodHandler{svc: svc} } // GetHomeData 获取外卖首页数据 GET /api/v1/food/home func (h *FoodHandler) GetHomeData(c *gin.Context) { data, err := h.svc.GetHomeData() if err != nil { FailInternal(c, "获取首页数据失败") return } Success(c, data) } // ListCategories 获取餐厅分类 GET /api/v1/food/categories func (h *FoodHandler) ListCategories(c *gin.Context) { data, err := h.svc.ListCategories() if err != nil { FailInternal(c, "获取分类失败") return } Success(c, data) } // ListRestaurants 获取餐厅列表 GET /api/v1/food/restaurants?category_id=&keyword=&sort=&page=&page_size= func (h *FoodHandler) ListRestaurants(c *gin.Context) { categoryID, _ := strconv.ParseUint(c.Query("category_id"), 10, 64) keyword := c.Query("keyword") sort := c.Query("sort") page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "12")) if page < 1 { page = 1 } if pageSize < 1 || pageSize > 100 { pageSize = 12 } data, err := h.svc.ListRestaurants(uint(categoryID), keyword, sort, page, pageSize) if err != nil { FailInternal(c, "获取餐厅列表失败") return } Success(c, data) } // GetRestaurant 获取餐厅详情 GET /api/v1/food/restaurants/:id func (h *FoodHandler) GetRestaurant(c *gin.Context) { id, err := strconv.ParseUint(c.Param("id"), 10, 64) if err != nil { FailBadRequest(c, "无效的餐厅 ID") return } data, err := h.svc.GetRestaurant(uint(id)) if err != nil { FailBadRequest(c, "餐厅不存在") return } Success(c, data) } // GetRestaurantMenu 获取餐厅菜单 GET /api/v1/food/restaurants/:id/menu func (h *FoodHandler) GetRestaurantMenu(c *gin.Context) { id, err := strconv.ParseUint(c.Param("id"), 10, 64) if err != nil { FailBadRequest(c, "无效的餐厅 ID") return } data, err := h.svc.GetRestaurantMenu(uint(id)) if err != nil { FailBadRequest(c, "菜单获取失败") return } Success(c, data) } // ListFeatured 获取推荐餐厅 GET /api/v1/food/featured?limit= func (h *FoodHandler) ListFeatured(c *gin.Context) { limit, _ := strconv.Atoi(c.DefaultQuery("limit", "8")) if limit < 1 || limit > 50 { limit = 8 } data, err := h.svc.ListFeatured(limit) if err != nil { FailInternal(c, "获取推荐餐厅失败") return } Success(c, data) }