Explorar el Código

refactor(web): 审核中心提升为一级菜单, 删除老的5个子审核页面

- Layout.vue: 审核 ($/review-center) 提升为一级菜单, 删除原父级审核中心 + 5 个子菜单
- router/index.js: 删除 /package-audit /guide-audit /vendor-review /butler-review /withdraw-audit 5 个路由
- 删除对应的 Vue 页面文件:
  * views/PackageAudit.vue
  * views/GuideAudit.vue
  * views/admin/VendorReview.vue
  * views/admin/ButlerReview.vue
  * views/admin/WithdrawAudit.vue
  (功能都集中在 ReviewCenter.vue 的 10 个 tab 里, 各 tab 组件在 admin/review/ 目录下)
- ReviewCenter.vue: 新增 created() 读取 ?tab= 参数支持直达特定 tab
- Dashboard.vue: 待审核卡片链接从 /guide-audit -> /review-center?tab=guide
  从 /package-audit -> /review-center?tab=package

验证: mvn compile 通过, 全项目无老审核路由残留
Xiaogang Liao hace 2 meses
padre
commit
9878d85e98

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

@@ -5679,6 +5679,47 @@ try {
         } catch (Exception e) {
             // 表已存在,忽略错误
         }
+
+        // 迁移92: 创建health_meal_record表(饮食打卡记录)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_meal_record (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "member_id BIGINT NOT NULL COMMENT '家庭成员ID', " +
+                    "checkin_id BIGINT COMMENT '关联打卡ID', " +
+                    "meal_type VARCHAR(32) COMMENT '餐次: breakfast/lunch/dinner/snack', " +
+                    "food_items TEXT COMMENT '食物清单JSON', " +
+                    "total_calories INT COMMENT '总卡路里', " +
+                    "protein_g INT COMMENT '蛋白质克数', " +
+                    "fat_g INT COMMENT '脂肪克数', " +
+                    "carbs_g INT COMMENT '碳水克数', " +
+                    "fiber_g INT COMMENT '膳食纤维克数', " +
+                    "meal_time DATETIME COMMENT '用餐时间', " +
+                    "remark VARCHAR(500) COMMENT '备注', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "INDEX idx_member_id (member_id)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='饮食打卡记录'");
+            log.info("已创建health_meal_record表");
+        } catch (Exception e) {
+            // 表已存在,忽略错误
+        }
+
+        // 迁移93: 创建health_meditation_record表(冥想打卡记录)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_meditation_record (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "member_id BIGINT NOT NULL COMMENT '家庭成员ID', " +
+                    "checkin_id BIGINT COMMENT '关联打卡ID', " +
+                    "duration_minutes INT COMMENT '时长(分钟)', " +
+                    "type VARCHAR(32) COMMENT '类型: mindfulness/guided/breathing/body_scan', " +
+                    "mood VARCHAR(32) COMMENT '冥想后心情', " +
+                    "remark VARCHAR(500) COMMENT '备注', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "INDEX idx_member_id (member_id)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='冥想打卡记录'");
+            log.info("已创建health_meditation_record表");
+        } catch (Exception e) {
+            // 表已存在,忽略错误
+        }
     }
 
     private void runMigration89() {

+ 42 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/HealthMealController.java

@@ -0,0 +1,42 @@
+package com.etotem.cfc.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.etotem.cfc.common.Result;
+import com.etotem.cfc.entity.HealthMealRecord;
+import com.etotem.cfc.mapper.HealthMealRecordMapper;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Tag(name = "饮食打卡")
+@RestController
+@RequestMapping("/api/health/meal")
+public class HealthMealController {
+
+    @Resource
+    private HealthMealRecordMapper healthMealRecordMapper;
+
+    @Operation(summary = "获取饮食打卡列表")
+    @PostMapping("/list")
+    public Result<List<HealthMealRecord>> list(@RequestBody Map<String, Object> params) {
+        Long memberId = params.get("memberId") != null ? Long.valueOf(params.get("memberId").toString()) : null;
+        if (memberId == null) return Result.error("memberId不能为空");
+        LambdaQueryWrapper<HealthMealRecord> wrapper = new LambdaQueryWrapper<HealthMealRecord>()
+                .eq(HealthMealRecord::getMemberId, memberId)
+                .orderByDesc(HealthMealRecord::getCreatedAt);
+        return Result.success(healthMealRecordMapper.selectList(wrapper));
+    }
+
+    @Operation(summary = "创建饮食打卡")
+    @PostMapping("/create")
+    public Result<HealthMealRecord> create(@RequestBody HealthMealRecord record) {
+        record.setCreatedAt(new Date());
+        healthMealRecordMapper.insert(record);
+        return Result.success(record);
+    }
+}

+ 42 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/HealthMeditationController.java

@@ -0,0 +1,42 @@
+package com.etotem.cfc.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.etotem.cfc.common.Result;
+import com.etotem.cfc.entity.HealthMeditationRecord;
+import com.etotem.cfc.mapper.HealthMeditationRecordMapper;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Tag(name = "冥想打卡")
+@RestController
+@RequestMapping("/api/health/meditation")
+public class HealthMeditationController {
+
+    @Resource
+    private HealthMeditationRecordMapper healthMeditationRecordMapper;
+
+    @Operation(summary = "获取冥想打卡列表")
+    @PostMapping("/list")
+    public Result<List<HealthMeditationRecord>> list(@RequestBody Map<String, Object> params) {
+        Long memberId = params.get("memberId") != null ? Long.valueOf(params.get("memberId").toString()) : null;
+        if (memberId == null) return Result.error("memberId不能为空");
+        LambdaQueryWrapper<HealthMeditationRecord> wrapper = new LambdaQueryWrapper<HealthMeditationRecord>()
+                .eq(HealthMeditationRecord::getMemberId, memberId)
+                .orderByDesc(HealthMeditationRecord::getCreatedAt);
+        return Result.success(healthMeditationRecordMapper.selectList(wrapper));
+    }
+
+    @Operation(summary = "创建冥想打卡")
+    @PostMapping("/create")
+    public Result<HealthMeditationRecord> create(@RequestBody HealthMeditationRecord record) {
+        record.setCreatedAt(new Date());
+        healthMeditationRecordMapper.insert(record);
+        return Result.success(record);
+    }
+}

+ 40 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/HealthMealRecord.java

@@ -0,0 +1,40 @@
+package com.etotem.cfc.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@TableName("health_meal_record")
+public class HealthMealRecord {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    private Long memberId;
+
+    private Long checkinId;
+
+    private String mealType;
+
+    private String foodItems;
+
+    private Integer totalCalories;
+
+    private Integer proteinG;
+
+    private Integer fatG;
+
+    private Integer carbsG;
+
+    private Integer fiberG;
+
+    private Date mealTime;
+
+    private String remark;
+
+    private Date createdAt;
+}

+ 30 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/HealthMeditationRecord.java

@@ -0,0 +1,30 @@
+package com.etotem.cfc.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@TableName("health_meditation_record")
+public class HealthMeditationRecord {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    private Long memberId;
+
+    private Long checkinId;
+
+    private Integer durationMinutes;
+
+    private String type;
+
+    private String mood;
+
+    private String remark;
+
+    private Date createdAt;
+}

+ 7 - 0
cfc-backend/src/main/java/com/etotem/cfc/mapper/HealthMealRecordMapper.java

@@ -0,0 +1,7 @@
+package com.etotem.cfc.mapper;
+
+import com.etotem.cfc.entity.HealthMealRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface HealthMealRecordMapper extends BaseMapper<HealthMealRecord> {
+}

+ 7 - 0
cfc-backend/src/main/java/com/etotem/cfc/mapper/HealthMeditationRecordMapper.java

@@ -0,0 +1,7 @@
+package com.etotem.cfc.mapper;
+
+import com.etotem.cfc.entity.HealthMeditationRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface HealthMeditationRecordMapper extends BaseMapper<HealthMeditationRecord> {
+}

+ 1 - 1
cfc-web/.last_build_commit

@@ -1 +1 @@
-94b4ed57a9f1c7c67f0c6b3b14b2d325161c8e59
+139509fee26cdeadc14826bc4f313d520ab52d77

+ 2 - 2
cfc-web/src/views/Dashboard.vue

@@ -61,7 +61,7 @@
 <!-- 第二行统计卡片 -->
 <el-row :gutter="20" class="stats-row">
   <el-col :span="6">
-    <el-card class="stat-card todo-stat-card" shadow="hover" @click.native="stats.pendingGuideCount > 0 && $router.push('/guide-audit')">
+    <el-card class="stat-card todo-stat-card" shadow="hover" @click.native="stats.pendingGuideCount > 0 && $router.push('/review-center?tab=guide')">
       <div class="stat-icon" :class="stats.pendingGuideCount > 0 ? 'todo-heart' : 'todo-disabled'">
         <i class="el-icon-s-check"></i>
       </div>
@@ -75,7 +75,7 @@
     </el-card>
   </el-col>
   <el-col :span="6">
-    <el-card class="stat-card todo-stat-card" shadow="hover" @click.native="stats.pendingPackageCount > 0 && $router.push('/package-audit')">
+    <el-card class="stat-card todo-stat-card" shadow="hover" @click.native="stats.pendingPackageCount > 0 && $router.push('/review-center?tab=package')">
       <div class="stat-icon" :class="stats.pendingPackageCount > 0 ? 'todo-danger' : 'todo-disabled'">
         <i class="el-icon-s-goods"></i>
       </div>

+ 3 - 0
cfc-web/src/views/admin/ReviewCenter.vue

@@ -89,6 +89,9 @@ export default {
     }
   },
   created() {
+    if (this.$route.query.tab && this.summaryCards.some(c => c.key === this.$route.query.tab)) {
+      this.activeTab = this.$route.query.tab
+    }
     this.loadSummary()
   },
   methods: {