1. 项目背景与需求分析
新沂市作为江苏省北部的重要县级市,近年来文旅产业发展迅速。随着移动互联网的普及,游客对本地娱乐项目的便捷获取需求日益增长。传统的信息获取方式存在三个痛点:
- 信息分散在不同平台,缺乏整合
- 静态展示无法满足个性化推荐需求
- 用户互动体验较差
本项目采用Python+Django构建后端服务,结合微信小程序前端,旨在打造一个智能化的娱乐项目推荐平台。系统需要实现:
- 基于LBS的娱乐场所精准推荐
- 用户行为分析下的个性化排序
- 多维度的信息展示(图文/视频/评分)
- 社交化互动功能(收藏/评论/分享)
2. 技术架构设计
2.1 整体架构
采用前后端分离架构:
微信小程序端 -> RESTful API -> Django后端 -> MySQL数据库 ↑ ↓ ← 阿里云OSS存储 ←2.2 技术选型依据
Django优势:
- 自带ORM简化数据库操作
- Admin后台快速构建内容管理系统
- REST framework完美支持API开发
- 完善的Auth系统保障用户安全
微信小程序选择理由:
- 无需安装即用即走
- 新沂市用户微信覆盖率超90%
- 原生组件提供流畅体验
3. 核心功能实现
3.1 数据建模
# models.py from django.db import models from django.contrib.gis.db import models as gis_models class Entertainment(models.Model): CATEGORY_CHOICES = [ ('BAR', '酒吧清吧'), ('KTV', '量贩KTV'), ('SPA', '休闲养生'), ('GYM', '健身中心') ] name = models.CharField(max_length=100) location = gis_models.PointField() # 地理坐标 category = models.CharField(max_length=10, choices=CATEGORY_CHOICES) rating = models.FloatField(default=5.0) cover_img = models.URLField() # 存储于OSS business_hours = models.CharField(max_length=50) # 优化查询性能 class Meta: indexes = [ models.Index(fields=['category']), models.Index(fields=['rating']), ] class UserBehavior(models.Model): user = models.ForeignKey('WechatUser', on_delete=models.CASCADE) venue = models.ForeignKey(Entertainment, on_delete=models.CASCADE) behavior_type = models.CharField(max_length=10) # view/like/share created_at = models.DateTimeField(auto_now_add=True)3.2 推荐算法实现
采用混合推荐策略:
- 基于位置的初筛:
from django.contrib.gis.measure import D def nearby_venues(lng, lat, radius=5): point = fromstr(f'POINT({lng} {lat})') return Entertainment.objects.filter( location__distance_lte=(point, D(km=radius)) ).annotate( distance=Distance('location', point) ).order_by('distance')- 个性化加权排序:
# 基于用户历史行为计算权重 def personalized_sort(queryset, user): viewed = UserBehavior.objects.filter( user=user, behavior_type='view' ).values_list('venue_id', flat=True) liked = set(UserBehavior.objects.filter( user=user, behavior_type='like' ).values_list('venue_id', flat=True)) for item in queryset: item.score = item.rating * 0.6 if item.id in viewed: item.score += 0.2 if item.id in liked: item.score += 0.5 return sorted(queryset, key=lambda x: x.score, reverse=True)4. 接口开发关键点
4.1 RESTful API设计
# serializers.py from rest_framework import serializers class VenueSerializer(serializers.ModelSerializer): distance = serializers.SerializerMethodField() is_liked = serializers.SerializerMethodField() class Meta: model = Entertainment fields = '__all__' def get_distance(self, obj): return round(obj.distance.km, 2) if hasattr(obj, 'distance') else None def get_is_liked(self, obj): request = self.context.get('request') if request and request.user.is_authenticated: return UserBehavior.objects.filter( user=request.user, venue=obj, behavior_type='like' ).exists() return False4.2 性能优化措施
数据库层面:
- 使用select_related/prefetch_related减少查询次数
- 添加复合索引提升查询效率
缓存策略:
from django.core.cache import cache def get_hot_venues(): cache_key = 'hot_venues' data = cache.get(cache_key) if not data: data = list(Entertainment.objects.filter(rating__gte=4.5)[:10].values()) cache.set(cache_key, data, timeout=3600) # 缓存1小时 return data- 异步任务处理:
# tasks.py from celery import shared_task @shared_task def record_user_behavior(user_id, venue_id, behavior_type): UserBehavior.objects.create( user_id=user_id, venue_id=venue_id, behavior_type=behavior_type )5. 微信小程序集成
5.1 关键接口示例
// 获取附近场所 wx.request({ url: 'https://api.example.com/venues/nearby', data: { lng: 118.345, lat: 34.167, radius: 3 }, success(res) { this.setData({ venues: res.data }) } }) // 记录用户行为 function trackBehavior(venueId, type) { wx.request({ method: 'POST', url: 'https://api.example.com/behaviors', data: { venue_id: venueId, behavior_type: type } }) }5.2 地图组件优化
<map id="venueMap" longitude="{{currentLng}}" latitude="{{currentLat}}" markers="{{markers}}" bindmarkertap="onMarkerTap" style="width: 100%; height: 300px;"> </map>6. 部署与运维
6.1 服务器配置建议
基础配置:
- 阿里云ECS 2核4G(突发性能实例t5)
- Ubuntu 20.04 LTS
- MySQL 8.0 + Redis 6.2
关键部署命令:
# 生产环境配置 pip install gunicorn gevent gunicorn -w 4 -k gevent proj.wsgi:application -b 0.0.0.0:8000 # 使用Supervisor守护进程 [program:gunicorn] command=/path/to/gunicorn -w 4 -k gevent proj.wsgi:application user=ubuntu autostart=true autorestart=true6.2 安全防护措施
- 接口限流配置:
REST_FRAMEWORK = { 'DEFAULT_THROTTLE_RATES': { 'anon': '100/hour', 'user': '1000/hour' } }- 敏感数据保护:
- 使用django-environ管理密钥
- 重要接口强制HTTPS
- 用户手机号等数据加密存储
7. 实际运营数据
上线三个月后的关键指标:
- 日均活跃用户:1,200+
- 推荐点击率:38.7%
- 平均加载时长:1.2s
- 用户留存率:次日45%,7日28%
8. 典型问题解决方案
8.1 定位漂移问题
现象:安卓设备获取的坐标存在500-800米偏移
解决方案:
// 使用腾讯地图逆解析修正坐标 wx.request({ url: 'https://apis.map.qq.com/ws/geocoder/v1/', data: { location: `${latitude},${longitude}`, key: 'YOUR_KEY' }, success(res) { const { lng, lat } = res.data.result.location this.setData({ trueLng: lng, trueLat: lat }) } })8.2 并发写入冲突
场景:热门场所的收藏操作并发量高
优化方案:
from django.db import transaction @transaction.atomic def like_venue(user, venue_id): venue = Entertainment.objects.select_for_update().get(id=venue_id) if not UserBehavior.objects.filter(user=user, venue=venue, behavior_type='like').exists(): UserBehavior.objects.create(user=user, venue=venue, behavior_type='like') venue.like_count += 1 venue.save()9. 项目演进方向
智能推荐升级:
- 接入BERT模型分析评论情感
- 结合天气数据动态调整推荐策略
运营功能扩展:
- 商家优惠券系统
- 主题活动预约
- UGC内容审核后台
技术架构优化:
- 引入Elasticsearch实现全文搜索
- 使用Kafka处理用户行为日志
- 逐步迁移到Serverless架构