Initial project commit

This commit is contained in:
2026-05-09 16:40:29 +08:00
commit 02b0259a9e
267 changed files with 54891 additions and 0 deletions
+80
View File
@@ -0,0 +1,80 @@
import hashlib
import httpx
from fastapi import APIRouter, Query, Request
from app.core.config import settings
router = APIRouter()
CACHE_TTL = 3600
def _cache_key(prefix: str, **kwargs: str) -> str:
raw = "&".join(f"{k}={v}" for k, v in sorted(kwargs.items()) if v)
return f"map:{prefix}:{hashlib.md5(raw.encode()).hexdigest()}"
@router.get("/geocoder/reverse")
async def reverse_geocode(
request: Request,
location: str = Query(..., description="lat,lng"),
):
redis = request.app.state.redis
ck = _cache_key("rev", location=location)
if redis:
cached = await redis.get(ck)
if cached:
import json
return json.loads(cached)
async with httpx.AsyncClient(timeout=5) as client:
resp = await client.get(
"https://apis.map.qq.com/ws/geocoder/v1/",
params={
"location": location,
"key": settings.TENCENT_MAP_KEY,
"get_poi": 1,
},
)
data = resp.json()
if redis and data.get("status") == 0:
import json
await redis.set(ck, json.dumps(data), ex=CACHE_TTL)
return data
@router.get("/place/search")
async def place_search(
request: Request,
keyword: str = Query(...),
boundary: str = Query(...),
):
redis = request.app.state.redis
ck = _cache_key("place", keyword=keyword, boundary=boundary)
if redis:
cached = await redis.get(ck)
if cached:
import json
return json.loads(cached)
async with httpx.AsyncClient(timeout=5) as client:
resp = await client.get(
"https://apis.map.qq.com/ws/place/v1/search",
params={
"keyword": keyword,
"boundary": boundary,
"page_size": 10,
"page_index": 1,
"key": settings.TENCENT_MAP_KEY,
},
)
data = resp.json()
if redis and data.get("status") == 0:
import json
await redis.set(ck, json.dumps(data), ex=CACHE_TTL)
return data