Procházet zdrojové kódy

feat(admin): 会员中心等级配置添加编辑功能

- 操作列增加"编辑"按钮
- 新增编辑弹窗,支持修改等级名称/描述/价格/上限/开关/权限
- 后端已有 /api/admin/membership/level/update 接口
iwt před 2 týdny
rodič
revize
7ab743d627
1 změnil soubory, kde provedl 114 přidání a 4 odebrání
  1. 114 4
      cfc-web/src/views/admin/MembershipCenter.vue

+ 114 - 4
cfc-web/src/views/admin/MembershipCenter.vue

@@ -60,9 +60,10 @@
                   <el-tag :type="row.prioritySupport ? 'success' : 'info'" size="small">{{ row.prioritySupport ? '是' : '否' }}</el-tag>
                 </template>
               </el-table-column>
-              <el-table-column label="操作" width="100" fixed="right">
+              <el-table-column label="操作" width="140" fixed="right">
                 <template slot-scope="{ row }">
-                  <el-button size="mini" type="primary" plain @click="handleViewFeatures(row)">权限</el-button>
+                  <el-button size="mini" type="primary" plain @click="handleEditLevel(row)">编辑</el-button>
+                  <el-button size="mini" type="info" plain @click="handleViewFeatures(row)">权限</el-button>
                 </template>
               </el-table-column>
             </el-table>
@@ -214,11 +215,58 @@
       </div>
     </el-dialog>
 
+    <!-- 等级编辑对话框 -->
+    <el-dialog title="编辑会员等级" :visible.sync="editVisible" width="560px" @close="editVisible = false">
+      <el-form :model="editForm" label-width="100px" size="small">
+        <el-form-item label="等级编码">
+          <el-tag>{{ editForm.levelCode }}</el-tag>
+          <span style="color:#999;margin-left:8px;font-size:12px;">编码不可修改</span>
+        </el-form-item>
+        <el-form-item label="等级名称" required>
+          <el-input v-model="editForm.levelName" placeholder="如:家庭会员" maxlength="32" show-word-limit style="width:320px;" />
+        </el-form-item>
+        <el-form-item label="等级描述">
+          <el-input v-model="editForm.levelDesc" type="textarea" :rows="2" maxlength="200" show-word-limit style="width:320px;" />
+        </el-form-item>
+        <el-form-item label="月费(元)">
+          <el-input-number v-model="editForm.priceMonthly" :min="0" :step="100" :precision="0" style="width:160px;" />
+        </el-form-item>
+        <el-form-item label="季费(元)">
+          <el-input-number v-model="editForm.priceQuarterly" :min="0" :step="100" :precision="0" style="width:160px;" />
+        </el-form-item>
+        <el-form-item label="年费(元)">
+          <el-input-number v-model="editForm.priceYearly" :min="0" :step="100" :precision="0" style="width:160px;" />
+        </el-form-item>
+        <el-form-item label="孩子上限">
+          <el-input-number v-model="editForm.maxChildren" :min="0" :max="99" :step="1" style="width:160px;" />
+        </el-form-item>
+        <el-form-item label="每日任务上限">
+          <el-input-number v-model="editForm.maxTasksPerDay" :min="0" :max="999" :step="1" style="width:160px;" />
+        </el-form-item>
+        <el-form-item label="AI审核">
+          <el-switch v-model="editForm.aiReviewEnabled" :active-value="1" :inactive-value="0" active-text="启用" inactive-text="关闭" />
+        </el-form-item>
+        <el-form-item label="优先客服">
+          <el-switch v-model="editForm.prioritySupport" :active-value="1" :inactive-value="0" active-text="支持" inactive-text="不支持" />
+        </el-form-item>
+        <el-form-item label="老师咨询">
+          <el-switch v-model="editForm.teacherConsultation" :active-value="1" :inactive-value="0" active-text="支持" inactive-text="不支持" />
+        </el-form-item>
+        <el-form-item label="功能权限">
+          <el-input v-model="editForm.features" type="textarea" :rows="2" placeholder="JSON 数组或逗号分隔,如:[\"basic_tasks\",\"points_system\"]" style="width:320px;" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer">
+        <el-button size="small" @click="editVisible = false">取消</el-button>
+        <el-button type="primary" size="small" :loading="editSubmitting" @click="handleSubmitLevel">保存</el-button>
+      </div>
+    </el-dialog>
+
   </div>
 </template>
 
 <script>
-import { searchUsers, updateMembershipUser, getMembershipStats, listMembershipLevels } from '@/api/admin'
+import { searchUsers, updateMembershipUser, updateMembershipLevel, getMembershipStats, listMembershipLevels } from '@/api/admin'
 
 const LEVEL_TAG_TYPE = { FREE: 'info', FAMILY: 'success', PROVIDER: 'warning', LIFETIME: 'danger' }
 const UPGRADE_TYPE_LABEL = { pay: '付费升级', consumption: '消费升级', admin: '管理员操作', trial: '试用激活', lifetime: '终身会员授予' }
@@ -257,7 +305,28 @@ export default {
       maintainForm: { id: null, nickname: '', memberLevel: '', referrerIdStr: '' },
       // 权限详情
       featuresVisible: false,
-      currentLevel: null
+      currentLevel: null,
+      // 等级编辑
+      editVisible: false,
+      editSubmitting: false,
+      editForm: {
+        id: null,
+        levelCode: '',
+        levelName: '',
+        levelDesc: '',
+        priceMonthly: 0,
+        priceQuarterly: 0,
+        priceYearly: 0,
+        originalPriceMonthly: 0,
+        originalPriceQuarterly: 0,
+        originalPriceYearly: 0,
+        maxChildren: 0,
+        maxTasksPerDay: 0,
+        aiReviewEnabled: 0,
+        prioritySupport: 0,
+        teacherConsultation: 0,
+        features: ''
+      }
     }
   },
   computed: {
@@ -352,6 +421,47 @@ export default {
       this.featuresVisible = true
     },
 
+    handleEditLevel(row) {
+      this.editForm = {
+        id: row.id,
+        levelCode: row.levelCode,
+        levelName: row.levelName || '',
+        levelDesc: row.levelDesc || '',
+        priceMonthly: row.priceMonthly,
+        priceQuarterly: row.priceQuarterly,
+        priceYearly: row.priceYearly,
+        originalPriceMonthly: row.originalPriceMonthly,
+        originalPriceQuarterly: row.originalPriceQuarterly,
+        originalPriceYearly: row.originalPriceYearly,
+        maxChildren: row.maxChildren,
+        maxTasksPerDay: row.maxTasksPerDay,
+        aiReviewEnabled: row.aiReviewEnabled ? 1 : 0,
+        prioritySupport: row.prioritySupport ? 1 : 0,
+        teacherConsultation: row.teacherConsultation ? 1 : 0,
+        features: row.features || ''
+      }
+      this.editVisible = true
+    },
+
+    async handleSubmitLevel() {
+      if (!this.editForm.id) return
+      this.editSubmitting = true
+      try {
+        const res = await updateMembershipLevel(this.editForm)
+        if (res.data && res.data.code === 200) {
+          this.$message && this.$message.success && this.$message.success(res.data.data || '更新成功')
+          this.editVisible = false
+          this.loadLevels()
+        } else {
+          this.$message && this.$message.error && this.$message.error((res.data && res.data.message) || '更新失败')
+        }
+      } catch (e) {
+        this.$message && this.$message.error && this.$message.error('更新失败')
+      } finally {
+        this.editSubmitting = false
+      }
+    },
+
     resolveUserNames(items, idField) {
       if (!items || items.length === 0) return Promise.resolve()
       var ids = []