🚀 开源项目分享:MeetSpot智能会面点推荐系统 - 用AI找到最佳聚会地点!
前言
你是否遇到过这样的困扰:和朋友约见面,大家分散在城市的各个角落,不知道在哪里聚会最方便?或者想找个咖啡馆谈工作,却不知道哪家既安静又便于所有人到达?
今天给大家分享一个我开发的开源项目——MeetSpot(聚点),一个基于AI的智能会面点推荐系统,能够根据多个参与者的位置智能推荐最合适的聚会场所。
🎯 项目概述
项目地址:https://github.com/JasonRobertDestiny/MeetSpot
演示视频:https://www.bilibili.com/video/BV1aUK7zNEvo/
MeetSpot是一个基于Python + FastAPI + 高德地图API构建的智能推荐系统,主要解决以下问题:
- 📍 多人聚会选址难题:自动计算多个地点的几何中心
- 🏢 场所类型选择困难:支持咖啡馆、餐厅、图书馆等多场景
- 🎨 用户体验单调:每种场景都有专属的主题色彩
- ⚡ 响应速度慢:并发搜索+智能缓存提升性能
🛠️ 技术架构详解
后端技术栈
# 核心依赖
FastAPI==0.115.0 # 高性能Web框架
aiohttp==3.9.5 # 异步HTTP客户端
pydantic==2.8.2 # 数据验证
uvicorn==0.30.1 # ASGI服务器
核心算法实现
1. 几何中心计算算法
def calculate_center_point(locations: List[Dict]) -> Dict[str, float]:
"""计算多个地点的几何中心"""
if not locations:
return {}
total_lat = sum(loc['lat'] for loc in locations)
total_lng = sum(loc['lng'] for loc in locations)
count = len(locations)
return {
'lat': total_lat / count,
'lng': total_lng / count
}
2. 智能排序算法
def calculate_score(place: Dict, center_point: Dict, venue_types: List[str]) -> float:
"""综合评分算法"""
# 基础评分(0-5分)
base_score = float(place.get('rating', '0'))
# 距离奖励(距离越近分数越高)
distance = calculate_distance(place['location'], center_point)
distance_score = max(0, 5 - distance / 1000) # 每公里扣1分
# 场景匹配奖励
type_bonus = 0
place_name = place.get('name', '').lower()
for venue_type in venue_types:
if venue_type in place_name or venue_type in place.get('type', ''):
type_bonus += 1
return base_score * 0.6 + distance_score * 0.3 + type_bonus * 0.1
3. 并发搜索优化
async def search_multiple_venues(center_point: Dict, venue_types: List[str]) -> List[Dict]:
"""并发搜索多种场所类型"""
async with aiohttp.ClientSession() as session:
tasks = []
for venue_type in venue_types:
task = search_venues_by_type(session, center_point, venue_type)
tasks.append(task)
results = await asyncio.gather(*tasks, return_exceptions=True)
# 合并结果并去重
all_places = []
for result in results:
if isinstance(result, list):
all_places.extend(result)
return deduplicate_places(all_places)
🎨 前端设计亮点
主题色彩系统
每种场景都有专属的主题色彩,提升用户体验:
/* 咖啡馆主题 - 温暖的棕色调 */
.theme-cafe {
--primary-color: #8B4513;
--secondary-color: #D2B48C;
--accent-color: #CD853F;
}
/* 餐厅主题 - 诱人的橙红色 */
.theme-restaurant {
--primary-color: #FF6B35;
--secondary-color: #FF8C69;
--accent-color: #FFB84D;
}
/* 图书馆主题 - 知性的蓝色 */
.theme-library {
--primary-color: #4682B4;
--secondary-color: #87CEEB;
--accent-color: #B0E0E6;
}
响应式布局
.place-selection {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
gap: 1rem;
margin: 1rem 0;
}
@media (max-width: 768px) {
.place-selection {
grid-template-columns: repeat(2, 1fr);
}
}
📊 性能优化实践
1. 异步处理
@app.post("/api/recommend")
async def find_meetspot(request: CafeRequest):
start_time = time.time()
try:
# 异步处理地理编码
locations = await geocode_locations(request.locations)
# 并发搜索多种场所
recommendations = await search_multiple_venues(
center_point, request.venue_types
)
processing_time = (time.time() - start_time) * 1000
return {
"recommendations": recommendations,
"performance_stats": {
"request_duration_ms": round(processing_time, 2)
}
}
except Exception as e:
logger.error(f"推荐失败: {str(e)}")
raise HTTPException(status_code=500, detail="推荐服务暂时不可用")
2. 智能去重算法
def deduplicate_places(places: List[Dict]) -> List[Dict]:
"""基于名称和坐标的智能去重"""
seen = set()
unique_places = []
for place in places:
# 创建唯一标识符
name = place.get('name', '').strip()
location = place.get('location', {})
lat = round(float(location.get('lat', 0)), 4)
lng = round(float(location.get('lng', 0)), 4)
identifier = f"{name}_{lat}_{lng}"
if identifier not in seen:
seen.add(identifier)
unique_places.append(place)
return unique_places
🚀 部署与使用
本地开发环境
# 克隆项目
git clone https://github.com/JasonRobertDestiny/MeetSpot.git
cd MeetSpot
# 安装依赖
pip install -r requirements.txt
# 配置API密钥
cp config/config.toml.example config/config.toml
# 编辑config.toml,添加高德地图API密钥
# 启动服务
python web_server.py
API调用示例
import requests
# 推荐请求
response = requests.post('http://127.0.0.1:8000/api/recommend', json={
"locations": ["北京大学", "清华大学"],
"venue_types": ["咖啡馆", "餐厅"],
"special_requirements": ["停车方便", "环境安静"]
})
print(response.json())
📈 性能测试结果
经过优化后的性能表现:
测试场景 | 响应时间 | 成功率 | 并发支持 |
---|---|---|---|
单场景推荐 | 300-400ms | 99.5% | 100+ |
多场景推荐 | 500-800ms | 99.2% | 80+ |
健康检查 | < 1ms | 100% | 1000+ |
🔮 未来规划
v1.1.0 版本计划
- 🔐 用户登录系统
- 📝 历史记录保存
- ❤️ 收藏功能
- 🔗 社交分享
v1.2.0 版本计划
- 🤖 机器学习个性化推荐
- 🚗 实时交通信息集成
- 🌤️ 天气数据考虑
- 📱 PWA移动应用
💡 开发心得
- API设计:RESTful设计+异步处理能显著提升用户体验
- 缓存策略:合理的缓存能减少90%的重复请求
- 错误处理:详细的异常处理和日志记录是生产环境必备
- 用户体验:主题色彩系统让产品更有温度
- 性能监控:实时性能统计帮助及时发现问题
🤝 开源贡献
项目采用MIT开源协议,欢迎大家贡献代码:
- 🐛 Bug报告:发现问题请提交Issue
- ✨ 新功能:欢迎提交Feature Request
- 🔧 代码贡献:Fork项目后提交PR
- 📖 文档改进:帮助完善文档和示例
结语
MeetSpot项目展示了如何用现代技术栈构建一个实用的AI推荐系统。通过合理的架构设计、性能优化和用户体验改进,我们可以创造出真正解决实际问题的产品。
如果这个项目对你有帮助,欢迎给个⭐Star支持一下!也期待更多开发者加入,一起让MeetSpot变得更好。
项目地址:https://github.com/JasonRobertDestiny/MeetSpot
作者:JasonRobertDestiny
联系方式:Johnrobertdestiny@gmail.com
#FastAPI #Python #开源项目 #AI推荐系统 #地图API #Vue.js #前端开发 #后端开发