开源项目分享:MeetSpot智能会面点推荐系统 - 用AI找到最佳聚会地点!

发布于:2025-06-26 ⋅ 阅读:(19) ⋅ 点赞:(0)

🚀 开源项目分享: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移动应用

💡 开发心得

  1. API设计:RESTful设计+异步处理能显著提升用户体验
  2. 缓存策略:合理的缓存能减少90%的重复请求
  3. 错误处理:详细的异常处理和日志记录是生产环境必备
  4. 用户体验:主题色彩系统让产品更有温度
  5. 性能监控:实时性能统计帮助及时发现问题

🤝 开源贡献

项目采用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 #前端开发 #后端开发


网站公告

今日签到

点亮在社区的每一天
去签到