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

Merge branch 'origin/cfclub' - auto bump, overflow fix

Xiaogang Liao 2 месяцев назад
Родитель
Сommit
91a8d98651

+ 1 - 1
cfc-web/.last_build_commit

@@ -1 +1 @@
-e9a5236abd027efc1dc4ab635c7c4d89c0c78bf9
+54be32b511f4fcff8c23021f73fbe86f223690ee

+ 53 - 0
cfc-web/CHANGELOG.md

@@ -1,6 +1,40 @@
 # 更新日志 (Changelog)
 
 此文件记录所有构建版本的变更。
+## v1.0.29 (2026-07-08)
+
+### 工程化
+- auto bump version and changelog [skip ci]
+
+
+## v1.0.27 (2026-07-08)
+
+### 工程化
+- auto bump version and changelog [skip ci]
+
+
+## v1.0.25 (2026-07-08)
+
+### 工程化
+- auto bump version and changelog [skip ci]
+
+
+## v1.0.24 (2026-07-08)
+
+### 工程化
+- auto bump version and changelog [skip ci]
+
+### Bug 修复
+- admin UI improvements - action dropdown, scroll, labels, confirm dialogs
+
+### 其他
+- - Layout.vue 全局滚动修复(overflow-y:auto 覆盖所有 admin-page 编辑页)
+- - 搜索框"全部"选项改为语义标签(11 页面:「全部状态」「全部分类」等)
+- - 状态变更操作增加  确认 + 自动 loadList() 刷新
+- - 活动列表 flex 布局 + 滚动 CSS 修复
+- 
+
+
 ## v1.0.21 (2026-07-08)
 
 ### 工程化
@@ -45,6 +79,25 @@
 - clean CHANGELOG, bump version to 1.0.17, update Clarity tracking ID
 
 
+## v1.0.18 (2026-07-08)
+
+### Bug 修复
+- guard loadHealthDimensions on activeChildId + debug logs
+- add table overflow scroll to admin pages
+
+### 其他
+- - Add console logs for tracking dimension data loading flow
+- - Helps diagnose radar chart not rendering when no child selected or API fails
+- 
+- - Bump package.json version 1.0.11 → 1.0.17
+- - Update .last_build_commit to latest build
+- - web/index.html: update Clarity tracking ID, remove duplicate inline script
+- 
+
+### 工程化
+- clean CHANGELOG, bump version to 1.0.17, update Clarity tracking ID
+
+
 ## v1.0.18 (2026-07-08)
 
 ## v1.0.18 (2026-07-08)

+ 2 - 2
cfc-web/package-lock.json

@@ -1,12 +1,12 @@
 {
   "name": "cfc-web",
-  "version": "1.0.7",
+  "version": "1.0.29",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "cfc-web",
-      "version": "1.0.7",
+      "version": "1.0.29",
       "dependencies": {
         "@wangeditor/editor": "^5.1.23",
         "@wangeditor/editor-for-vue": "^1.0.2",

+ 1 - 1
cfc-web/package.json

@@ -1,6 +1,6 @@
 {
   "name": "cfc-web",
-  "version": "1.0.21",
+  "version": "1.0.30",
   "private": true,
   "scripts": {
     "dev": "vue-cli-service serve",

+ 1 - 0
cfc-web/src/views/Layout.vue

@@ -703,5 +703,6 @@ export default {
   flex-direction: column;
   min-height: 0;
   padding: 20px;
+  overflow-y: auto;
 }
 </style>

+ 60 - 32
cfc-web/src/views/admin/Activities.vue

@@ -13,7 +13,7 @@
             clearable
             @change="loadActivities"
           >
-            <el-option label="全部" value="" />
+            <el-option label="全部状态" value="" />
             <el-option label="草稿" value="draft" />
             <el-option label="已发布" value="published" />
             <el-option label="已结束" value="ended" />
@@ -212,44 +212,68 @@ export default {
       this.filter.page = page
       this.loadActivities()
     },
-    handleMoreCmd(row, cmd) {
-      switch (cmd) {
-        case 'view':
-          this.$router.push('/activity-edit?id=' + row.id + '&readonly=1')
-          break
-        case 'publish':
-          this.handlePublish(row)
-          break
-        case 'end':
-          this.handleEnd(row)
-          break
-        case 'registrations':
-          this.showRegistrations(row)
-          break
-      }
-    },
+  async handleMoreCmd(row, cmd) {
+    switch (cmd) {
+      case 'view':
+        this.$router.push('/activity-edit?id=' + row.id + '&readonly=1')
+        break
+      case 'publish':
+        try {
+          await this.$confirm('确认发布该活动?', '提示')
+          await publishActivity(row.id)
+          this.$message.success('发布成功')
+          this.loadActivities()
+        } catch (e) {
+          if (e !== 'cancel') {
+            this.$message.error('发布失败')
+          }
+        }
+        break
+      case 'end':
+        try {
+          await this.$confirm('确认结束该活动?该操作不可逆', '提示')
+          await endActivity(row.id)
+          this.$message.success('活动已结束')
+          this.loadActivities()
+        } catch (e) {
+          if (e !== 'cancel') {
+            this.$message.error('操作失败')
+          }
+        }
+        break
+      case 'registrations':
+        this.showRegistrations(row)
+        break
+    }
+  },
     handleSearch() {
       this.filter.page = 1
       this.loadActivities()
     },
-    async handlePublish(row) {
-      try {
-        await publishActivity(row.id)
-        this.$message.success('发布成功')
-        this.loadActivities()
-      } catch (e) {
+  async handlePublish(row) {
+    try {
+      await this.$confirm('确认发布该活动?', '提示')
+      await publishActivity(row.id)
+      this.$message.success('发布成功')
+      this.loadActivities()
+    } catch (e) {
+      if (e !== 'cancel') {
         this.$message.error('发布失败')
       }
-    },
-    async handleEnd(row) {
-      try {
-        await endActivity(row.id)
-        this.$message.success('活动已结束')
-        this.loadActivities()
-      } catch (e) {
+    }
+  },
+  async handleEnd(row) {
+    try {
+      await this.$confirm('确认结束该活动?该操作不可逆', '提示')
+      await endActivity(row.id)
+      this.$message.success('活动已结束')
+      this.loadActivities()
+    } catch (e) {
+      if (e !== 'cancel') {
         this.$message.error('操作失败')
       }
-    },
+    }
+  },
     // ===== 报名列表 =====
     showRegistrations(row) {
       this.currentActivity = row
@@ -304,5 +328,9 @@ export default {
 </script>
 
 <style scoped>
-.activities { padding: 20px; }
+.activities { padding: 20px; flex: 1; display: flex; flex-direction: column; min-height: 0; }
+.activities > .el-card { flex: 1; display: flex; flex-direction: column; min-height: 0; }
+.activities > .el-card >>> .el-card__body { flex: 1; display: flex; flex-direction: column; min-height: 0; overflow-y: auto; }
+.activities >>> .el-table { flex: 1; }
+.activities >>> .el-table__body-wrapper { overflow-y: auto; }
 </style>

+ 1 - 1
cfc-web/src/views/admin/ActivityRegistrationReview.vue

@@ -8,7 +8,7 @@
         </el-select>
          <el-input v-model="keyword" placeholder="搜索用户/孩子ID..." prefix-icon="el-icon-search" style="width:200px" clearable @keyup.enter.native="loadList" @clear="loadList" />
          <el-select v-model="statusFilter" placeholder="状态筛选" @change="loadList" style="width: 130px;" clearable>
-          <el-option label="全部" value="" />
+          <el-option label="全部状态" value="" />
           <el-option label="待审核" value="pending" />
           <el-option label="已通过" value="approved" />
           <el-option label="已拒绝" value="rejected" />

+ 35 - 30
cfc-web/src/views/admin/ArticleManage.vue

@@ -24,31 +24,31 @@
           <el-option label="全部分类" value="" />
           <el-option v-for="cat in categories" :key="cat.id" :label="cat.name" :value="cat.id" />
         </el-select>
-        <el-select v-model="filters.contentType" placeholder="内容类型" clearable @change="loadList" style="width: 130px;">
-          <el-option label="全部" value="" />
-          <el-option label="文章" value="article" />
-          <el-option label="知识点" value="knowledge" />
-          <el-option label="课程" value="course" />
-          <el-option label="贴士" value="tip" />
-        </el-select>
-        <el-select v-model="filters.difficultyLevel" placeholder="难度" clearable @change="loadList" style="width: 100px;">
-          <el-option label="全部" value="" />
-          <el-option label="1星" value="1" />
-          <el-option label="2星" value="2" />
-          <el-option label="3星" value="3" />
-          <el-option label="4星" value="4" />
-          <el-option label="5星" value="5" />
-        </el-select>
-        <el-select v-model="filters.dimensionCode" placeholder="维度" clearable @change="loadList" style="width: 100px;">
-          <el-option label="全部" value="" />
-          <el-option label="身" value="body" />
-          <el-option label="心" value="mind" />
-          <el-option label="智" value="wisdom" />
-          <el-option label="行" value="action" />
-          <el-option label="富" value="wealth" />
-        </el-select>
-        <el-select v-model="filters.tagId" placeholder="知识标签" clearable @change="loadList" style="width: 150px;" filterable>
-          <el-option label="全部" value="" />
+    <el-select v-model="filters.contentType" placeholder="内容类型" clearable @change="loadList" style="width: 130px;">
+      <el-option label="全部类型" value="" />
+      <el-option label="文章" value="article" />
+      <el-option label="知识点" value="knowledge" />
+      <el-option label="课程" value="course" />
+      <el-option label="贴士" value="tip" />
+    </el-select>
+    <el-select v-model="filters.difficultyLevel" placeholder="难度" clearable @change="loadList" style="width: 100px;">
+      <el-option label="全部难度" value="" />
+      <el-option label="1星" value="1" />
+      <el-option label="2星" value="2" />
+      <el-option label="3星" value="3" />
+      <el-option label="4星" value="4" />
+      <el-option label="5星" value="5" />
+    </el-select>
+    <el-select v-model="filters.dimensionCode" placeholder="维度" clearable @change="loadList" style="width: 100px;">
+      <el-option label="全部维度" value="" />
+      <el-option label="身" value="body" />
+      <el-option label="心" value="mind" />
+      <el-option label="智" value="wisdom" />
+      <el-option label="行" value="action" />
+      <el-option label="富" value="wealth" />
+    </el-select>
+    <el-select v-model="filters.tagId" placeholder="知识标签" clearable @change="loadList" style="width: 150px;" filterable>
+      <el-option label="全部标签" value="" />
           <el-option v-for="tag in tagOptions" :key="tag.id" :label="tag.name" :value="tag.id" />
         </el-select>
         <el-input v-model="filters.keyword" placeholder="搜索文章标题..." clearable style="width: 220px;" @keyup.enter.native="loadList" />
@@ -344,48 +344,53 @@ export default {
     },
     async handlePublishDirect(row) {
       try {
+        await this.$confirm('确认发布该文章?', '提示')
         await adminArticlePublish({ id: row.id, status: 'published' })
         this.$message.success('文章已发布')
         this.loadList()
       } catch (e) {
-        this.$message.error(e.message || '发布失败')
+        if (e !== 'cancel') this.$message.error(e.message || '发布失败')
       }
     },
     async handleSubmitReview(row) {
       try {
+        await this.$confirm('确认提交审核?', '提示')
         await adminArticleSubmitReview({ id: row.id })
         this.$message.success('已提交审核')
         this.loadList()
       } catch (e) {
-        this.$message.error(e.message || '提交审核失败')
+        if (e !== 'cancel') this.$message.error(e.message || '提交审核失败')
       }
     },
     async handleWithdraw(row) {
       try {
+        await this.$confirm('确认下架该文章?', '提示')
         await adminArticleWithdraw({ id: row.id })
         this.$message.success('文章已下架')
         this.loadList()
       } catch (e) {
-        this.$message.error(e.message || '下架失败')
+        if (e !== 'cancel') this.$message.error(e.message || '下架失败')
       }
     },
     async handleReDraft(row) {
       try {
+        await this.$confirm('确认移回草稿箱?', '提示')
         await adminArticleReDraft({ id: row.id })
         this.$message.success('已保存到草稿箱')
         this.loadList()
       } catch (e) {
-        this.$message.error(e.message || '操作失败')
+        if (e !== 'cancel') this.$message.error(e.message || '操作失败')
       }
     },
     async handleToggleFeatured(row) {
       try {
         const newVal = row.isFeatured === 1 || row.isFeatured === true ? 0 : 1
+        await this.$confirm(newVal ? '确认设为精选?' : '确认取消精选?', '提示')
         await adminArticleToggleFeatured({ id: row.id, isFeatured: newVal })
         this.$message.success(newVal ? '已设为精选' : '已取消精选')
         this.loadList()
       } catch (e) {
-        this.$message.error(e.message || '操作失败')
+        if (e !== 'cancel') this.$message.error(e.message || '操作失败')
       }
     },
     handleDelete(row) {

+ 1 - 1
cfc-web/src/views/admin/Foods.vue

@@ -13,7 +13,7 @@
           clearable
           @change="loadList"
         >
-          <el-option label="全部" value="" />
+          <el-option label="全部分类" value="" />
           <el-option label="蔬菜" value="蔬菜" />
           <el-option label="水果" value="水果" />
           <el-option label="肉类" value="肉类" />

+ 1 - 1
cfc-web/src/views/admin/GrowthTaskManagement.vue

@@ -13,7 +13,7 @@
             clearable
             @change="loadTasks"
           >
-            <el-option label="全部" value="" />
+            <el-option label="全部状态" value="" />
             <el-option label="开启" value="enabled" />
             <el-option label="关闭" value="disabled" />
           </el-select>

+ 1 - 1
cfc-web/src/views/admin/ProductManage.vue

@@ -13,7 +13,7 @@
           @keyup.enter.native="loadList"
         />
         <el-select v-model="filters.status" placeholder="商品状态" @change="loadList" style="width: 130px;" clearable>
-          <el-option label="全部" value="" />
+          <el-option label="全部状态" value="" />
           <el-option label="待审核" value="pending" />
           <el-option label="待上架" value="approved" />
           <el-option label="已上架" value="on_shelf" />

+ 1 - 1
cfc-web/src/views/admin/Recipes.vue

@@ -13,7 +13,7 @@
           clearable
           @change="loadList"
         >
-          <el-option label="全部" value="" />
+          <el-option label="全部餐次" value="" />
           <el-option label="早餐" value="早餐" />
           <el-option label="午餐" value="午餐" />
           <el-option label="晚餐" value="晚餐" />

+ 1 - 1
cfc-web/src/views/admin/VendorReview.vue

@@ -4,7 +4,7 @@
       <h2>服务商入驻审核</h2>
       <el-input v-model="keyword" placeholder="搜索..." prefix-icon="el-icon-search" style="width:200px" clearable @keyup.enter.native="handleSearch" @clear="handleSearch" />
       <el-select v-model="statusFilter" placeholder="审核状态" @change="loadList" style="width: 150px;">
-        <el-option label="全部" value="" />
+        <el-option label="全部状态" value="" />
         <el-option label="待审核" value="pending" />
         <el-option label="已通过" value="approved" />
         <el-option label="已拒绝" value="rejected" />

+ 1 - 1
cfc-web/src/views/admin/WithdrawAudit.vue

@@ -5,7 +5,7 @@
       <div style="display:flex;align-items:center;gap:12px">
         <el-input v-model="keyword" placeholder="搜索..." prefix-icon="el-icon-search" style="width:200px" clearable @keyup.enter.native="handleSearch" @clear="handleSearch" />
         <el-select v-model="statusFilter" placeholder="审核状态" @change="loadList" style="width: 150px;">
-          <el-option label="全部" value="" />
+          <el-option label="全部状态" value="" />
           <el-option label="待审核" value="pending" />
           <el-option label="已通过" value="approved" />
           <el-option label="已拒绝" value="rejected" />

+ 1 - 1
cfc-web/src/views/admin/dimension-config.vue

@@ -71,7 +71,7 @@
         </el-form-item>
         <el-form-item label="性别">
           <el-select v-model="form.gender" placeholder="选择性别" style="width:100%">
-            <el-option label="全部" value="all"></el-option>
+            <el-option label="全部性别" value="all"></el-option>
             <el-option label="男" value="male"></el-option>
             <el-option label="女" value="female"></el-option>
           </el-select>