1. 项目概述
这个基于Vue和Python的协同过滤推荐系统,专为节日鲜花店场景设计。我在实际开发中发现,鲜花消费具有明显的节日性特征(情人节、母亲节等时段销量激增),传统电商的通用推荐算法在这里往往水土不服。通过将Python后端协同过滤算法与Vue前端可视化结合,我们实现了根据用户历史行为(浏览、收藏、购买)和相似用户偏好进行个性化推荐的功能。
系统采用前后端分离架构:前端使用Vue3+Element Plus构建响应式界面,后端采用Flask轻量级框架提供RESTful API,数据存储使用MySQL+Redis组合。特别针对鲜花品类开发了节日权重因子,使推荐结果能动态适应不同节日的消费特征。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 前端技术选型
选择Vue3作为前端框架主要基于三点考虑:
- 组合式API更适合处理复杂的推荐逻辑交互
- 与Element Plus组件库完美配合,快速搭建电商界面
- 良好的TypeScript支持,便于维护大型项目
关键实现细节:
vue复制// 推荐商品卡片组件示例
<script setup>
const props = defineProps({
flowers: {
type: Array,
required: true
}
})
// 节日标签计算
const festivalTag = computed(() => {
const now = new Date()
return props.flowers.filter(f =>
f.festivals.some(d => isDateInRange(now, d.start, d.end))
)
})
</script>
2.2 后端算法设计
采用改进的协同过滤算法,主要优化点:
-
时间衰减因子:处理鲜花时效性
python复制def time_decay(timestamp): delta = datetime.now() - timestamp return 0.5 ** (delta.days/30) # 每月衰减50% -
节日增强系数:
python复制def festival_boost(festival_date): days_before = (festival_date - datetime.now()).days return min(3, 1 + 0.1 * (30 - days_before)) # 节前30天开始线性增长 -
混合推荐策略:
- 70% 基于用户的协同过滤(UserCF)
- 20% 基于内容的推荐(鲜花品类特征)
- 10% 热门商品兜底
3. 核心功能实现
3.1 用户行为采集
设计埋点方案时特别注意:
javascript复制// 前端埋点示例
const trackEvent = (eventType, flowerId) => {
navigator.sendBeacon('/api/track', JSON.stringify({
event: eventType,
item_id: flowerId,
timestamp: Date.now(),
dwell_time: getDwellTime() // 页面停留时长
}))
}
后端处理采用异步写入:
python复制@app.route('/api/track', methods=['POST'])
def track_behavior():
data = request.get_json()
redis_client.lpush('user:events', json.dumps(data))
return jsonify(success=True)
3.2 推荐结果生成
算法服务化关键代码:
python复制class RecommendationService:
def __init__(self):
self.user_sim_matrix = load_pickle('model/sim_matrix.pkl')
def get_recommendations(self, user_id, top_n=10):
# 获取相似用户
similar_users = self.user_sim_matrix[user_id].argsort()[-5:][::-1]
# 合并推荐结果
recommendations = defaultdict(float)
for sim_user in similar_users:
for item, rating in get_user_ratings(sim_user):
recommendations[item] += rating * self.user_sim_matrix[user_id][sim_user]
# 应用节日因子
for item in recommendations:
recommendations[item] *= get_festival_boost(item)
return sorted(recommendations.items(), key=lambda x: -x[1])[:top_n]
4. 性能优化实践
4.1 缓存策略设计
采用三级缓存架构:
-
内存缓存:使用lru_cache装饰高频查询
python复制@lru_cache(maxsize=1024) def get_user_preferences(user_id): return db.query(UserPref).filter_by(user_id=user_id).first() -
Redis缓存:存储热门推荐结果
python复制def get_cached_recommendations(user_id): cache_key = f"rec:{user_id}" if redis_client.exists(cache_key): return json.loads(redis_client.get(cache_key)) # ...计算逻辑... redis_client.setex(cache_key, 3600, json.dumps(result)) # 1小时过期 return result -
数据库查询优化:为user_item_actions表添加复合索引
sql复制CREATE INDEX idx_user_item ON user_item_actions (user_id, item_id, action_type);
4.2 前端性能调优
-
图片懒加载优化:
vue复制<img v-lazy="flower.image" :alt="flower.name" /> -
推荐结果分页加载:
javascript复制const loadMore = () => { if (loading.value) return loading.value = true api.getRecommendations({ page: page.value++, size: 10 }).then(res => { flowerList.value.push(...res.data) }) }
5. 部署方案
5.1 容器化部署
Docker-compose配置示例:
yaml复制version: '3'
services:
web:
build: ./frontend
ports:
- "8080:80"
environment:
- VUE_APP_API_URL=http://api.example.com
api:
build: ./backend
ports:
- "5000:5000"
depends_on:
- redis
- mysql
redis:
image: redis:alpine
ports:
- "6379:6379"
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: flower@123
volumes:
- ./data/mysql:/var/lib/mysql
5.2 CI/CD流程
GitLab CI配置要点:
yaml复制stages:
- test
- build
- deploy
frontend_test:
stage: test
image: node:16
script:
- cd frontend
- npm install
- npm run test:unit
backend_test:
stage: test
image: python:3.9
script:
- pip install -r backend/requirements.txt
- pytest backend/tests/
deploy_prod:
stage: deploy
only:
- master
script:
- docker-compose up -d --build
6. 踩坑实录
-
冷启动问题解决方案:
- 建立鲜花特征矩阵(颜色、花语、价格段)
- 新用户首次推荐采用"节日爆款+特征抽样"策略
- 实现代码:
python复制def cold_start_recommend(festival=None): base = get_top_selling(limit=20) if festival: base = [x for x in base if x.festival == festival] return sorted(base, key=lambda x: x.diversity_score)[:10]
-
相似度矩阵更新策略:
- 每周全量更新一次
- 每日增量更新活跃用户
- 使用Redis sorted set存储临时变化:
python复制def update_similarity(user_a, user_b, score): redis_client.zadd( f'user:sim:{user_a}', {str(user_b): score} )
-
跨节日推荐异常处理:
python复制def normalize_recommendations(items): max_score = max(x[1] for x in items) or 1 return [(x[0], x[1]/max_score) for x in items]
这个项目让我深刻体会到,推荐系统不是算法越复杂越好,关键要贴合业务场景。鲜花电商的特殊性在于:
- 用户购买频次低但决策快
- 节日效应显著
- 商品生命周期短
下次我会尝试加入实时点击流分析,用Flink处理用户行为事件,实现分钟级推荐更新。目前系统在情人节期间经受住了流量考验,峰值QPS达到1200,平均推荐响应时间控制在200ms以内。
