/** * 推荐系统 Mixin — 为维度页面提供个性化推荐加载与行为追踪 * * 用法: * import recommendMixin from '../../mixins/recommend-mixin' * export default { * mixins: [recommendMixin], * methods: { * loadDimensionData: function() { * this.loadRecommendations('action') // 传入当前维度代码 * } * } * } * * 模板: * */ import { getRecommendList, trackRecommendAction } from '../utils/api' var recommendMixin = { data: function() { return { recommendItems: [], recommendHasMore: false, _recommendDimension: null } }, methods: { /** * 加载个性化推荐列表 * @param {String} dimensionCode 维度代码 body/mind/wisdom/action/wealth * @param {Number} limit 推荐数量 */ loadRecommendations: function(dimensionCode, limit) { limit = limit || 6 this._recommendDimension = dimensionCode var self = this getRecommendList({ dimensionCode: dimensionCode, size: limit }).then(function(res) { if (res.code === 200 && res.data && res.data.items) { self.recommendItems = res.data.items || [] self.recommendHasMore = res.data.hasMore || false } }).catch(function() { // 静默失败,不阻塞页面 }) }, /** * 推荐项点击处理 — 跳转 + 行为追踪 */ onRecommendItemClick: function(item) { if (!item) return // 追踪点击行为 this._trackRecommend(item, 'click') // 根据内容类型跳转 this._navigateToRecommend(item) }, /** * 内部:追踪推荐行为 */ _trackRecommend: function(item, action) { trackRecommendAction({ contentType: item.contentType, contentId: item.id, action: action }).catch(function() { // 静默 }) }, /** * 内部:根据内容类型导航 */ _navigateToRecommend: function(item) { var url = '' switch (item.contentType) { case 'article': url = '/pages/article-center/article-detail/article-detail?id=' + item.id break case 'task': url = '/pages/tasks/task-detail/task-detail?id=' + item.id break case 'product': url = '/pages/shop/product-detail/product-detail?id=' + item.id break case 'activity': url = '/pages/activity/activity-detail/activity-detail?id=' + item.id break default: return } if (url) { uni.navigateTo({ url: url }) } } }, /** * 页面显示时展示推荐内容(曝光追踪) */ onShow: function() { if (this.recommendItems && this.recommendItems.length > 0) { var self = this // 只追踪前3条曝光(避免过多请求) var showItems = this.recommendItems.slice(0, 3) showItems.forEach(function(item) { self._trackRecommend(item, 'show') }) } } } export default recommendMixin