Просмотр исходного кода

feat: integrate article recommendation into dimension pages

Sisyphus 5 дней назад
Родитель
Сommit
3c98e5dccf

+ 14 - 6
cfc-frontend/components/DimensionArticles.vue

@@ -50,7 +50,7 @@
 </template>
 
 <script>
-import { getFeaturedArticles } from '@/utils/api.js'
+import { getRecommendedArticles } from '@/utils/api.js'
 var DIMENSION_MAP = {
   body: { name: '身', color: '#FF8C42' },
   mind: { name: '心', color: '#FF6B9D' },
@@ -71,6 +71,7 @@ export default {
   props: {
     articles: { type: Array, default: function() { return [] } },
     isLoggedIn: { type: Boolean, default: false },
+    dimensionCode: { type: String, default: null },
     colors: { type: Array, default: function() { return defaultGradientColors } }
   },
   data: function() {
@@ -92,20 +93,27 @@ export default {
       })
     }
   },
+  watch: {
+    dimensionCode: function(newVal, oldVal) {
+      if (newVal !== oldVal && newVal && this.isLoggedIn) {
+        this.loadArticles()
+      }
+    }
+  },
   mounted: function() {
-    if (!this.articles || this.articles.length === 0) {
+    if (this.isLoggedIn && (!this.articles || this.articles.length === 0) && this.dimensionCode) {
       this.loadArticles()
     }
   },
   methods: {
     loadArticles: function() {
       var self = this
+      if (!self.isLoggedIn) return
       self.loading = true
-      getFeaturedArticles({ size: 3 }).then(function(res) {
+      getRecommendedArticles({ type: 'article', dimensionCode: self.dimensionCode, size: 5 }).then(function(res) {
         self.loading = false
-        if (res && res.code === 200 && res.data) {
-          var list = Array.isArray(res.data) ? res.data : (res.data.records || [])
-          self.selfArticles = list.slice(0, 3)
+        if (res && res.code === 200 && res.data && res.data.recommendations) {
+          self.selfArticles = res.data.recommendations.slice(0, 5)
         }
       }).catch(function() {
         self.loading = false

+ 9 - 1
cfc-frontend/pages/action-detail/member-action-detail.vue

@@ -62,6 +62,13 @@
         @productClick="goProductDetail"
         @moreProducts="goMoreProducts" />
 
+    <!-- 文章 -->
+    <DimensionArticles
+      :isLoggedIn="true"
+      dimension-code="action"
+      @articleClick="goArticleDetail"
+      @moreArticles="goMoreArticles" />
+
       <!-- 行维度介绍卡片 -->
       <DimensionIntroCard dimCode="action" v-if="isLoggedIn" learn-more-url="/pages/action-detail/dimension-intro" />
     </template>
@@ -77,11 +84,12 @@ import FamilyRelationGraph from '../../components/FamilyRelationGraph.vue'
 import DimensionTasks from '../../components/DimensionTasks.vue'
 import DimensionActivities from '../../components/DimensionActivities.vue'
 import DimensionProducts from '../../components/DimensionProducts.vue'
+import DimensionArticles from '../../components/DimensionArticles.vue'
 import DimensionIntroCard from '../../components/DimensionIntroCard.vue'
 import { getEnergyOverview, getFamilyEnergySandbox, getChildren } from '../../utils/api.js'
 
 export default {
-  components: { FamilyEnergyBar, FamilyRelationGraph, DimensionTasks, DimensionActivities, DimensionProducts, DimensionIntroCard },
+  components: { FamilyEnergyBar, FamilyRelationGraph, DimensionTasks, DimensionActivities, DimensionProducts, DimensionArticles, DimensionIntroCard },
   data() {
     return {
       memberId: null,

+ 9 - 1
cfc-frontend/pages/body-detail/member-body-detail.vue

@@ -50,6 +50,13 @@
       @productClick="goProductDetail"
       @moreProducts="goMoreProducts" />
 
+    <!-- 文章 -->
+    <DimensionArticles
+      :isLoggedIn="true"
+      dimension-code="body"
+      @articleClick="goArticleDetail"
+      @moreArticles="goMoreArticles" />
+
     <!-- 底部占位 -->
     <view class="bottom-spacer"></view>
   </view>
@@ -61,10 +68,11 @@ import FamilyRelationGraph from '../../components/FamilyRelationGraph.vue'
 import DimensionTasks from '../../components/DimensionTasks.vue'
 import DimensionActivities from '../../components/DimensionActivities.vue'
 import DimensionProducts from '../../components/DimensionProducts.vue'
+import DimensionArticles from '../../components/DimensionArticles.vue'
 import { getEnergyOverview, getFamilyEnergySandbox, getChildren } from '../../utils/api.js'
 
 export default {
-  components: { FamilyEnergyBar, FamilyRelationGraph, DimensionTasks, DimensionActivities, DimensionProducts },
+  components: { FamilyEnergyBar, FamilyRelationGraph, DimensionTasks, DimensionActivities, DimensionProducts, DimensionArticles },
   data() {
     return {
       memberId: null,

+ 9 - 1
cfc-frontend/pages/mind-detail/member-mind-detail.vue

@@ -50,6 +50,13 @@
       @productClick="goProductDetail"
       @moreProducts="goMoreProducts" />
 
+    <!-- 文章 -->
+    <DimensionArticles
+      :isLoggedIn="true"
+      dimension-code="mind"
+      @articleClick="goArticleDetail"
+      @moreArticles="goMoreArticles" />
+
     <!-- 底部占位 -->
     <view class="bottom-spacer"></view>
   </view>
@@ -61,10 +68,11 @@ import FamilyRelationGraph from '../../components/FamilyRelationGraph.vue'
 import DimensionTasks from '../../components/DimensionTasks.vue'
 import DimensionActivities from '../../components/DimensionActivities.vue'
 import DimensionProducts from '../../components/DimensionProducts.vue'
+import DimensionArticles from '../../components/DimensionArticles.vue'
 import { getEnergyOverview, getFamilyEnergySandbox, getChildren } from '../../utils/api.js'
 
 export default {
-  components: { FamilyEnergyBar, FamilyRelationGraph, DimensionTasks, DimensionActivities, DimensionProducts },
+  components: { FamilyEnergyBar, FamilyRelationGraph, DimensionTasks, DimensionActivities, DimensionProducts, DimensionArticles },
   data() {
     return {
       memberId: null,

+ 9 - 1
cfc-frontend/pages/wealth-detail/member-wealth-detail.vue

@@ -48,6 +48,13 @@
       @productClick="goProductDetail"
       @moreProducts="goMoreProducts" />
 
+    <!-- 文章 -->
+    <DimensionArticles
+      :isLoggedIn="true"
+      dimension-code="wealth"
+      @articleClick="goArticleDetail"
+      @moreArticles="goMoreArticles" />
+
     <!-- 底部占位 -->
     <view class="bottom-spacer"></view>
   </view>
@@ -59,10 +66,11 @@ import FamilyRelationGraph from '../../components/FamilyRelationGraph.vue'
 import DimensionTasks from '../../components/DimensionTasks.vue'
 import DimensionActivities from '../../components/DimensionActivities.vue'
 import DimensionProducts from '../../components/DimensionProducts.vue'
+import DimensionArticles from '../../components/DimensionArticles.vue'
 import { getEnergyOverview, getFamilyEnergySandbox, getChildren } from '../../utils/api.js'
 
 export default {
-  components: { FamilyEnergyBar, FamilyRelationGraph, DimensionTasks, DimensionActivities, DimensionProducts },
+  components: { FamilyEnergyBar, FamilyRelationGraph, DimensionTasks, DimensionActivities, DimensionProducts, DimensionArticles },
   data() {
     return {
       memberId: null,

+ 20 - 1
cfc-frontend/pages/wisdom-detail/member-wisdom-detail.vue

@@ -50,6 +50,13 @@
       @productClick="goProductDetail"
       @moreProducts="goMoreProducts" />
 
+    <!-- 文章 -->
+    <DimensionArticles
+      :isLoggedIn="true"
+      dimension-code="wisdom"
+      @articleClick="goArticleDetail"
+      @moreArticles="goMoreArticles" />
+
     <!-- 底部占位 -->
     <view class="bottom-spacer"></view>
   </view>
@@ -61,10 +68,11 @@ import FamilyRelationGraph from '../../components/FamilyRelationGraph.vue'
 import DimensionTasks from '../../components/DimensionTasks.vue'
 import DimensionActivities from '../../components/DimensionActivities.vue'
 import DimensionProducts from '../../components/DimensionProducts.vue'
+import DimensionArticles from '../../components/DimensionArticles.vue'
 import { getEnergyOverview, getFamilyEnergySandbox, getChildren } from '../../utils/api.js'
 
 export default {
-  components: { FamilyEnergyBar, FamilyRelationGraph, DimensionTasks, DimensionActivities, DimensionProducts },
+  components: { FamilyEnergyBar, FamilyRelationGraph, DimensionTasks, DimensionActivities, DimensionProducts, DimensionArticles },
   data() {
     return {
       memberId: null,
@@ -124,6 +132,17 @@ export default {
     },
     goMoreProducts: function() {
       uni.navigateTo({ url: '/pages/shop/index/index' })
+    },
+    goArticleDetail: function(id) {
+      var token = uni.getStorageSync('token')
+      if (token) {
+        uni.navigateTo({ url: '/pages/article-center/article-detail/article-detail?id=' + id })
+      } else {
+        uni.navigateTo({ url: '/pages/login/login' })
+      }
+    },
+    goMoreArticles: function() {
+      uni.navigateTo({ url: '/pages/article-center/index' })
     }
   }
 }

+ 1 - 0
cfc-frontend/utils/api.js

@@ -2978,6 +2978,7 @@ export const uploadServiceRoleImage = (filePath) => {
 
 // 推荐系统
 export const getRecommendList = (data) => request('/api/recommend/list', 'POST', data)
+export const getRecommendedArticles = (data) => getRecommendList(data) // 文章推荐别名,参数一致
 export const trackRecommendAction = (data) => request('/api/recommend/track', 'POST', data)
 
 export const getHealthStatus = (memberId) => request('/api/health-status/get', 'POST', memberId ? { memberId: memberId } : {})