| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- /**
- * 推荐系统 Mixin — 为维度页面提供个性化推荐加载与行为追踪
- *
- * 用法:
- * import recommendMixin from '../../mixins/recommend-mixin'
- * export default {
- * mixins: [recommendMixin],
- * methods: {
- * loadDimensionData: function() {
- * this.loadRecommendations('action') // 传入当前维度代码
- * }
- * }
- * }
- *
- * 模板:
- * <RecommendedSection
- * v-if="recommendItems.length > 0"
- * :items="recommendItems"
- * :hasMore="recommendHasMore"
- * @itemClick="onRecommendItemClick"
- * @more="$emit('more')" />
- */
- 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
|