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

refactor: 去掉API自动传memberId——child角色从JWT获取currentMemberId,parent不自动选孩子

- child-index.vue: 去掉API请求中自动传的memberId,由后端JwtInterceptor派生currentMemberId
- parent-index.vue: 去掉自动选中children[0],默认显示自己,用户从FamilyMemberStrip选择后设置selectedChild
- 后端: HealthSleep/Water/Exercise/DailyCheckin/HealthDimension 五个Controller添加@RequestAttribute('currentMemberId')回退
- 前端: sleep/water/exercise/daily-checkin/diet 五个健康页,child角色不从storage取currentChildId
Xiaogang Liao 2 месяцев назад
Родитель
Сommit
62ccf45cae

+ 8 - 3
cfc-backend/src/main/java/com/etotem/cfc/controller/DailyCheckinController.java

@@ -21,9 +21,10 @@ public class DailyCheckinController {
 
     @Operation(summary = "获取打卡列表")
     @PostMapping("/list")
-    public Result<List<DailyHealthCheckin>> list(@RequestBody Map<String, Object> params) {
+    public Result<List<DailyHealthCheckin>> list(@RequestBody Map<String, Object> params,
+                                                 @RequestAttribute(value = "currentMemberId", required = false) Long currentMemberId) {
         Long memberId = params.get("memberId") != null
-                ? Long.valueOf(params.get("memberId").toString()) : null;
+                ? Long.valueOf(params.get("memberId").toString()) : currentMemberId;
         if (memberId == null) {
             return Result.error("memberId不能为空");
         }
@@ -43,7 +44,11 @@ public class DailyCheckinController {
 
     @Operation(summary = "创建打卡记录")
     @PostMapping("/create")
-    public Result<DailyHealthCheckin> create(@RequestBody DailyHealthCheckin checkin) {
+    public Result<DailyHealthCheckin> create(@RequestBody DailyHealthCheckin checkin,
+                                             @RequestAttribute(value = "currentMemberId", required = false) Long currentMemberId) {
+        if (checkin.getMemberId() == null) {
+            checkin.setMemberId(currentMemberId);
+        }
         DailyHealthCheckin created = dailyCheckinService.createCheckin(checkin);
         return Result.success(created);
     }

+ 6 - 4
cfc-backend/src/main/java/com/etotem/cfc/controller/HealthDimensionController.java

@@ -24,9 +24,10 @@ public class HealthDimensionController {
     @PostMapping("/overview")
     public Result<HealthDimensionVO> overview(
             @RequestBody Map<String, Object> params,
-            @RequestAttribute("userId") Long userId) {
+            @RequestAttribute("userId") Long userId,
+            @RequestAttribute(value = "currentMemberId", required = false) Long currentMemberId) {
         Long memberId = params.get("memberId") != null
-                ? Long.valueOf(params.get("memberId").toString()) : null;
+                ? Long.valueOf(params.get("memberId").toString()) : currentMemberId;
         if (memberId == null) {
             return Result.error("memberId不能为空");
         }
@@ -62,9 +63,10 @@ public class HealthDimensionController {
     @PostMapping("/history")
     public Result<List<HealthDimensionVO.DimensionItem>> history(
             @RequestBody Map<String, Object> params,
-            @RequestAttribute("userId") Long userId) {
+            @RequestAttribute("userId") Long userId,
+            @RequestAttribute(value = "currentMemberId", required = false) Long currentMemberId) {
         Long memberId = params.get("memberId") != null
-                ? Long.valueOf(params.get("memberId").toString()) : null;
+                ? Long.valueOf(params.get("memberId").toString()) : currentMemberId;
         String dimension = (String) params.get("dimension");
         int limit = params.get("limit") != null
                 ? Integer.parseInt(params.get("limit").toString()) : 10;

+ 8 - 3
cfc-backend/src/main/java/com/etotem/cfc/controller/HealthExerciseController.java

@@ -23,8 +23,9 @@ public class HealthExerciseController {
 
     @Operation(summary = "获取运动打卡列表")
     @PostMapping("/list")
-    public Result<List<HealthExerciseRecord>> list(@RequestBody Map<String, Object> params) {
-        Long memberId = params.get("memberId") != null ? Long.valueOf(params.get("memberId").toString()) : null;
+    public Result<List<HealthExerciseRecord>> list(@RequestBody Map<String, Object> params,
+                                                   @RequestAttribute(value = "currentMemberId", required = false) Long currentMemberId) {
+        Long memberId = params.get("memberId") != null ? Long.valueOf(params.get("memberId").toString()) : currentMemberId;
         if (memberId == null) return Result.error("memberId不能为空");
         LambdaQueryWrapper<HealthExerciseRecord> wrapper = new LambdaQueryWrapper<HealthExerciseRecord>()
                 .eq(HealthExerciseRecord::getMemberId, memberId)
@@ -34,7 +35,11 @@ public class HealthExerciseController {
 
     @Operation(summary = "创建运动打卡")
     @PostMapping("/create")
-    public Result<HealthExerciseRecord> create(@RequestBody HealthExerciseRecord record) {
+    public Result<HealthExerciseRecord> create(@RequestBody HealthExerciseRecord record,
+                                               @RequestAttribute(value = "currentMemberId", required = false) Long currentMemberId) {
+        if (record.getMemberId() == null) {
+            record.setMemberId(currentMemberId);
+        }
         record.setCreatedAt(new Date());
         healthExerciseRecordMapper.insert(record);
         return Result.success(record);

+ 8 - 3
cfc-backend/src/main/java/com/etotem/cfc/controller/HealthSleepController.java

@@ -23,8 +23,9 @@ public class HealthSleepController {
 
     @Operation(summary = "获取睡眠打卡列表")
     @PostMapping("/list")
-    public Result<List<HealthSleepRecord>> list(@RequestBody Map<String, Object> params) {
-        Long memberId = params.get("memberId") != null ? Long.valueOf(params.get("memberId").toString()) : null;
+    public Result<List<HealthSleepRecord>> list(@RequestBody Map<String, Object> params,
+                                                @RequestAttribute(value = "currentMemberId", required = false) Long currentMemberId) {
+        Long memberId = params.get("memberId") != null ? Long.valueOf(params.get("memberId").toString()) : currentMemberId;
         if (memberId == null) return Result.error("memberId不能为空");
         LambdaQueryWrapper<HealthSleepRecord> wrapper = new LambdaQueryWrapper<HealthSleepRecord>()
                 .eq(HealthSleepRecord::getMemberId, memberId)
@@ -34,7 +35,11 @@ public class HealthSleepController {
 
     @Operation(summary = "创建睡眠打卡")
     @PostMapping("/create")
-    public Result<HealthSleepRecord> create(@RequestBody HealthSleepRecord record) {
+    public Result<HealthSleepRecord> create(@RequestBody HealthSleepRecord record,
+                                            @RequestAttribute(value = "currentMemberId", required = false) Long currentMemberId) {
+        if (record.getMemberId() == null) {
+            record.setMemberId(currentMemberId);
+        }
         record.setCreatedAt(new Date());
         healthSleepRecordMapper.insert(record);
         return Result.success(record);

+ 8 - 3
cfc-backend/src/main/java/com/etotem/cfc/controller/HealthWaterController.java

@@ -23,8 +23,9 @@ public class HealthWaterController {
 
     @Operation(summary = "获取喝水打卡列表")
     @PostMapping("/list")
-    public Result<List<HealthWaterRecord>> list(@RequestBody Map<String, Object> params) {
-        Long memberId = params.get("memberId") != null ? Long.valueOf(params.get("memberId").toString()) : null;
+    public Result<List<HealthWaterRecord>> list(@RequestBody Map<String, Object> params,
+                                                @RequestAttribute(value = "currentMemberId", required = false) Long currentMemberId) {
+        Long memberId = params.get("memberId") != null ? Long.valueOf(params.get("memberId").toString()) : currentMemberId;
         if (memberId == null) return Result.error("memberId不能为空");
         LambdaQueryWrapper<HealthWaterRecord> wrapper = new LambdaQueryWrapper<HealthWaterRecord>()
                 .eq(HealthWaterRecord::getMemberId, memberId)
@@ -34,7 +35,11 @@ public class HealthWaterController {
 
     @Operation(summary = "创建喝水打卡")
     @PostMapping("/create")
-    public Result<HealthWaterRecord> create(@RequestBody HealthWaterRecord record) {
+    public Result<HealthWaterRecord> create(@RequestBody HealthWaterRecord record,
+                                            @RequestAttribute(value = "currentMemberId", required = false) Long currentMemberId) {
+        if (record.getMemberId() == null) {
+            record.setMemberId(currentMemberId);
+        }
         record.setCreatedAt(new Date());
         healthWaterRecordMapper.insert(record);
         return Result.success(record);

+ 5 - 1
cfc-frontend/pages/health/daily-checkin.vue

@@ -119,7 +119,11 @@ export default {
     }
   },
   onLoad: function() {
-    this.memberId = uni.getStorageSync('currentChildId') || null
+    var role = uni.getStorageSync('currentRole') || uni.getStorageSync('role') || 'parent'
+    // child 角色:memberId 由后端从 JWT 获取 currentMemberId,前端无需传
+    if (role !== 'child') {
+      this.memberId = uni.getStorageSync('currentChildId') || null
+    }
     this.loadHistory()
   },
   methods: {

+ 5 - 1
cfc-frontend/pages/health/diet-index.vue

@@ -163,7 +163,11 @@ export default {
     }
   },
   onLoad: function() {
-    this.memberId = uni.getStorageSync('currentChildId') || null
+    var role = uni.getStorageSync('currentRole') || uni.getStorageSync('role') || 'parent'
+    // child 角色:memberId 由后端从 JWT 获取 currentMemberId,前端无需传
+    if (role !== 'child') {
+      this.memberId = uni.getStorageSync('currentChildId') || null
+    }
     this.loadHistory()
   },
   methods: {

+ 5 - 1
cfc-frontend/pages/health/exercise-index.vue

@@ -173,7 +173,11 @@ export default {
     }
   },
   onLoad: function() {
-    this.memberId = uni.getStorageSync('currentChildId') || null
+    var role = uni.getStorageSync('currentRole') || uni.getStorageSync('role') || 'parent'
+    // child 角色:memberId 由后端从 JWT 获取 currentMemberId,前端无需传
+    if (role !== 'child') {
+      this.memberId = uni.getStorageSync('currentChildId') || null
+    }
     this.loadHistory()
   },
   methods: {

+ 5 - 1
cfc-frontend/pages/health/sleep-index.vue

@@ -159,7 +159,11 @@ export default {
     }
   },
   onLoad: function() {
-    this.memberId = uni.getStorageSync('currentChildId') || null
+    var role = uni.getStorageSync('currentRole') || uni.getStorageSync('role') || 'parent'
+    // child 角色:memberId 由后端从 JWT 获取 currentMemberId,前端无需传
+    if (role !== 'child') {
+      this.memberId = uni.getStorageSync('currentChildId') || null
+    }
     this.loadHistory()
   },
   methods: {

+ 5 - 1
cfc-frontend/pages/health/water-index.vue

@@ -133,7 +133,11 @@ export default {
     }
   },
   onLoad: function() {
-    this.memberId = uni.getStorageSync('currentChildId') || null
+    var role = uni.getStorageSync('currentRole') || uni.getStorageSync('role') || 'parent'
+    // child 角色:memberId 由后端从 JWT 获取 currentMemberId,前端无需传
+    if (role !== 'child') {
+      this.memberId = uni.getStorageSync('currentChildId') || null
+    }
     this.loadHistory()
   },
   methods: {

+ 23 - 30
cfc-frontend/pages/home-pages/child-index.vue

@@ -527,7 +527,7 @@ export default {
         this.totalPoints = child.totalPoints || 0
         this.streakDays = child.streakDays || 0
 
-        const tasksRes = await getTodayTasks(this.memberId)
+        const tasksRes = await getTodayTasks()
         const rawTasks = tasksRes.data || []
         this.todayTasks = rawTasks
         this.completedCount = rawTasks.filter(function(t) { return t.status === 'completed' }).length
@@ -566,44 +566,37 @@ export default {
           this.unlockBadge(5)
         }
 
-        // 加载五维能量概览
-        var energyChildId = this.memberId
-        if (energyChildId) {
-          try {
-            var overviewRes = await getEnergyOverview(energyChildId)
-            if (overviewRes && overviewRes.data) {
-              this.energyDimensions = overviewRes.data.dimensions || []
-              this.totalEnergy = overviewRes.data.totalEnergy || 0
-              this.totalHealthIndex = overviewRes.data.totalHealthIndex || 0
-            }
-          } catch (e) {
-            console.log('获取能量概览失败', e)
+        // 加载五维能量概览(memberId 由后端从 JWT 派生)
+        try {
+          var overviewRes = await getEnergyOverview()
+          if (overviewRes && overviewRes.data) {
+            this.energyDimensions = overviewRes.data.dimensions || []
+            this.totalEnergy = overviewRes.data.totalEnergy || 0
+            this.totalHealthIndex = overviewRes.data.totalHealthIndex || 0
           }
+        } catch (e) {
+          console.log('获取能量概览失败', e)
         }
 
         // 加载最近能量变动
-        if (energyChildId) {
-          try {
-            var logsRes = await getEnergyLogs(energyChildId, '', 1, 5)
-            if (logsRes && logsRes.data) {
-              this.energyLogs = logsRes.data.records || logsRes.data || []
-            }
-          } catch (e) {
-            console.log('获取能量日志失败', e)
-            this.energyLogs = []
+        try {
+          var logsRes = await getEnergyLogs('', 1, 5)
+          if (logsRes && logsRes.data) {
+            this.energyLogs = logsRes.data.records || logsRes.data || []
           }
+        } catch (e) {
+          console.log('获取能量日志失败', e)
+          this.energyLogs = []
         }
 
         // 加载沙盘数据
-        if (energyChildId) {
-          try {
-            var sandboxRes = await getFamilyEnergySandbox()
-            if (sandboxRes && sandboxRes.data) {
-              this.sandboxData = sandboxRes.data
-            }
-          } catch (e) {
-            console.log('获取沙盘数据失败', e)
+        try {
+          var sandboxRes = await getFamilyEnergySandbox()
+          if (sandboxRes && sandboxRes.data) {
+            this.sandboxData = sandboxRes.data
           }
+        } catch (e) {
+          console.log('获取沙盘数据失败', e)
         }
 
         // 加载家庭成员

+ 12 - 10
cfc-frontend/pages/home-pages/parent-index.vue

@@ -691,8 +691,7 @@ export default {
           })
           if (filteredChildren.length > 0) {
             this.children = filteredChildren
-            this.selectedChild = filteredChildren[0]
-            this.currentChildId = filteredChildren[0].id
+            // 不自动选孩子:默认显示家长自己,等待用户从 FamilyMemberStrip 选择
             this.familyAvgCompletionRate = dashData.avgCompletionRate || 0
             // 家长自身数据(积分 + 任务完成率)
             this.myPoints = dashData.parentPoints || 0
@@ -716,10 +715,7 @@ export default {
             const parents = (data.parents || []).filter(function(p) { return p && p.id && p.id !== currentUserId }).map(function(p) { return { ...p, role: 'parent' } })
             const children = (data.children || []).filter(function(c) { return c && c.id }).map(function(c) { return { ...c, role: 'child' } })
             this.familyMembers = [].concat(parents, children)
-            if (children.length > 0) {
-              this.selectedChild = children[0]
-              this.currentChildId = children[0].id
-            }
+            // 不自动选孩子:默认显示家长自己,等待用户从 FamilyMemberStrip 选择
             // 保存 familyId 用于后续请求
             if (data.familyId) {
               this._familyId = data.familyId
@@ -733,10 +729,7 @@ export default {
               const childrenRes = await getChildren()
               const rawChildren = childrenRes.data || []
               this.children = rawChildren
-              if (this.children.length > 0 && !this.selectedChild) {
-                this.selectedChild = this.children[0]
-                this.currentChildId = this.children[0].id
-              }
+              // 不自动选孩子:默认显示家长自己,等待用户从 FamilyMemberStrip 选择
             } catch (e) {
               console.log('获取孩子列表失败', e)
             }
@@ -923,6 +916,15 @@ export default {
     },
     onFamilyMemberSelect(member) {
       this.selectedMemberId = member.id
+      // 选中的是孩子时,设置 selectedChild 以便子组件加载孩子数据
+      var matched = this.children.find(function(c) { return c.id === member.id })
+      if (matched) {
+        this.selectedChild = matched
+        this.currentChildId = matched.id
+      } else {
+        this.selectedChild = null
+        this.currentChildId = ''
+      }
     },
     async onFamilyMemberSwitch(member) {
       if (!member || !member.id) return