Przeglądaj źródła

feat(membership): 体验会员补充 referral_commission 权益 + 前端动态加载权益列表

- DatabaseInitializer: 迁移341 BASIC features JSON 补 referral_commission
- MembershipService: BASIC 可用功能加入 referral_commission
- schema.sql: membership_levels 种子数据同步
- membership/index.vue: 动态加载权益功能列表(免费用户展示 BASIC 体验会员功能)
- utils/api.js: 新增 getMembershipBenefits 接口封装
- ContentRecommendService: 改用 selectCompletedArticleIdsByChild 查询已读文章(与文章列表过滤逻辑一致)
Sisyphus 3 dni temu
rodzic
commit
6e20157080

+ 9 - 0
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -11165,6 +11165,15 @@ log.info("迁移298: 已为无 openid 的 child 账号补齐 family_members 记
         addPolicyTermsColumn();
         createHomeBannersTable();
 
+        // 迁移341: BASIC 体验会员 features JSON 补 referral_commission(迁移315 未包含,前端对比表已显示可参与)
+        try {
+            jdbcTemplate.update("UPDATE membership_levels SET features = ? WHERE level_code = 'BASIC' AND features NOT LIKE '%referral_commission%'",
+                    "[\"free_activities\",\"free_courses\",\"discount_purchase\",\"invite_family\",\"mascot_ai_lite\",\"ai_report_reading_lite\",\"assessment_quota_lite\",\"health_report_upload_lite\",\"growth_plan_lite\",\"task_template_lite\",\"referral_commission\"]");
+            log.info("迁移341: 已为 BASIC 体验会员补充 referral_commission 功能");
+        } catch (Exception e) {
+            log.warn("迁移341: 更新 BASIC features 失败: {}", e.getMessage());
+        }
+
         // 迁移327: 创建 report_feedback 表(报告反馈+AI解答)
         try {
             jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS report_feedback (" +

+ 8 - 6
cfc-backend/src/main/java/com/etotem/cfc/service/ContentRecommendService.java

@@ -6,6 +6,8 @@ import com.etotem.cfc.dto.RecommendItemVO;
 import com.etotem.cfc.dto.RecommendRequestDTO;
 import com.etotem.cfc.entity.*;
 import com.etotem.cfc.mapper.*;
+
+import com.etotem.cfc.mapper.ArticleQuizRecordMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
@@ -34,6 +36,9 @@ public class ContentRecommendService {
     @Resource
     private ArticleReadingRecordMapper articleReadingRecordMapper;
 
+    @Resource
+    private ArticleQuizRecordMapper articleQuizRecordMapper;
+
     @Resource
     private ProductOrderMapper productOrderMapper;
 
@@ -134,12 +139,9 @@ public class ContentRecommendService {
         // 获取孩子已读的文章ID
         Set<Long> readArticleIds = new HashSet<>();
         if (memberId != null) {
-            List<ArticleReadingRecord> records = articleReadingRecordMapper.selectList(
-                    new QueryWrapper<ArticleReadingRecord>()
-                            .eq("child_id", memberId)
-                            .select("DISTINCT article_id"));
-            for (ArticleReadingRecord r : records) {
-                if (r.getArticleId() != null) readArticleIds.add(r.getArticleId());
+            List<Long> completedIds = articleReadingRecordMapper.selectCompletedArticleIdsByChild(memberId);
+            if (completedIds != null) {
+                readArticleIds.addAll(completedIds);
             }
         }
 

+ 2 - 1
cfc-backend/src/main/java/com/etotem/cfc/service/MembershipService.java

@@ -254,7 +254,8 @@ public class MembershipService implements MembershipServiceInterface {
                     || "assessment_quota_lite".equals(feature)
                     || "health_report_upload_lite".equals(feature)
                     || "growth_plan_lite".equals(feature)
-                    || "task_template_lite".equals(feature);
+                    || "task_template_lite".equals(feature)
+                    || "referral_commission".equals(feature);
         }
 
         // FAMILY用户可用功能

+ 1 - 1
cfc-backend/src/main/resources/schema.sql

@@ -5671,7 +5671,7 @@ VALUES (
     '体验会员', 
     '9.9元/月体验版,解锁核心功能,限次使用AI与报告解读',
     990,
-    '["free_activities","free_courses","discount_purchase","invite_family","mascot_ai_lite","ai_report_reading_lite","assessment_quota_lite","health_report_upload_lite","growth_plan_lite","task_template_lite"]',
+    '["free_activities","free_courses","discount_purchase","invite_family","mascot_ai_lite","ai_report_reading_lite","assessment_quota_lite","health_report_upload_lite","growth_plan_lite","task_template_lite","referral_commission"]',
     3,
     3
 );

+ 16 - 10
cfc-frontend/pages/membership/index.vue

@@ -80,7 +80,7 @@
 </template>
 
 <script>
-import { getMyMembership, getMyButler, reportAppEnter
+import { getMyMembership, getMyButler, reportAppEnter, getMembershipBenefits
 } from '../../utils/api.js'
 import { parseDate } from '../../utils/format.js'
 
@@ -125,22 +125,28 @@ export default {
       getMyMembership().then(function(res) {
         var m = res.data || {}
         that.membership = m
-        if (m.levelCode && m.levelCode !== 'FREE') {
+        var levelCode = m.memberLevel || m.levelCode || 'FREE'
+        if (levelCode && levelCode !== 'FREE') {
           that.isFree = false
-          that.currentLevelName = m.levelName || '家庭会员'
-          if (m.levelCode === 'BASIC') {
-            that.currentLevelName = '体验会员'
-          } else if (m.levelCode === 'FAMILY') {
-            that.currentLevelName = '家庭会员'
-          } else if (m.levelCode === 'PREMIUM') {
-            that.currentLevelName = '高级会员'
-          }
+          that.currentLevelName = that.getLevelName(levelCode)
         } else {
           that.isFree = true
           that.currentLevelName = '免费用户'
+          levelCode = 'BASIC'
         }
+        // 动态加载权益功能列表(免费用户展示 BASIC 体验会员功能)
+        getMembershipBenefits(levelCode).then(function(benefitsRes) {
+          var benefits = (benefitsRes && benefitsRes.data) || []
+          if (benefits.length > 0) {
+            that.features = benefits.map(function(b) { return b.benefitName || '' }).filter(function(n) { return n })
+          }
+        }).catch(function() {})
       }).catch(function() {})
     },
+    getLevelName(code) {
+      var map = { FREE: '免费用户', BASIC: '体验会员', FAMILY: '家庭会员', PREMIUM: '高级会员', LIFETIME: '终身会员' }
+      return map[code] || code || ''
+    },
     goUpgrade() {
       uni.navigateTo({ url: '/pages/membership/upgrade' })
     },

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

@@ -592,6 +592,7 @@ export const getMembershipPlans = () => {
 export const getMyMembership = () => {
 	return request('/api/membership/my', 'POST')
 }
+export const getMembershipBenefits = (levelCode) => request('/api/membership/benefits', 'POST', { levelCode })
 
 export const getGiftMembershipProgress = () => {
 	return request('/api/membership/gift-membership-progress', 'POST')