first commit
This commit is contained in:
50
MeetSpot/api/routers/miniprogram.py
Normal file
50
MeetSpot/api/routers/miniprogram.py
Normal file
@@ -0,0 +1,50 @@
|
||||
from typing import List, Optional, Dict, Any
|
||||
from fastapi import APIRouter, HTTPException, Depends
|
||||
from pydantic import BaseModel
|
||||
|
||||
from app.tool.meetspot_recommender import CafeRecommender
|
||||
from app.logger import logger
|
||||
|
||||
router = APIRouter(prefix="/api/miniprogram", tags=["miniprogram"])
|
||||
|
||||
class LocationItem(BaseModel):
|
||||
lng: float
|
||||
lat: float
|
||||
address: Optional[str] = ""
|
||||
name: Optional[str] = ""
|
||||
|
||||
class CalculateRequest(BaseModel):
|
||||
locations: List[LocationItem]
|
||||
keywords: Optional[str] = "咖啡馆"
|
||||
requirements: Optional[str] = ""
|
||||
min_rating: Optional[float] = 0.0
|
||||
max_distance: Optional[int] = 100000
|
||||
price_range: Optional[str] = ""
|
||||
|
||||
@router.post("/calculate")
|
||||
async def calculate_meetspot(request: CalculateRequest):
|
||||
"""小程序核心计算接口:根据坐标直接计算推荐"""
|
||||
try:
|
||||
recommender = CafeRecommender()
|
||||
|
||||
# 转换 locations 为 list of dict
|
||||
location_dicts = [loc.model_dump() for loc in request.locations]
|
||||
|
||||
result = await recommender.execute_for_miniprogram(
|
||||
locations=location_dicts,
|
||||
keywords=request.keywords,
|
||||
user_requirements=request.requirements,
|
||||
min_rating=request.min_rating,
|
||||
max_distance=request.max_distance,
|
||||
price_range=request.price_range
|
||||
)
|
||||
|
||||
if not result.get("success", False):
|
||||
# 业务逻辑错误也返回 200,但在 body 中包含 error
|
||||
return result
|
||||
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Miniprogram calculation failed: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
Reference in New Issue
Block a user