|
@@ -60,9 +60,10 @@
|
|
|
<el-tag :type="row.prioritySupport ? 'success' : 'info'" size="small">{{ row.prioritySupport ? '是' : '否' }}</el-tag>
|
|
<el-tag :type="row.prioritySupport ? 'success' : 'info'" size="small">{{ row.prioritySupport ? '是' : '否' }}</el-tag>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column label="操作" width="100" fixed="right">
|
|
|
|
|
|
|
+ <el-table-column label="操作" width="140" fixed="right">
|
|
|
<template slot-scope="{ row }">
|
|
<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>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
</el-table>
|
|
</el-table>
|
|
@@ -214,11 +215,58 @@
|
|
|
</div>
|
|
</div>
|
|
|
</el-dialog>
|
|
</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>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
<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 LEVEL_TAG_TYPE = { FREE: 'info', FAMILY: 'success', PROVIDER: 'warning', LIFETIME: 'danger' }
|
|
|
const UPGRADE_TYPE_LABEL = { pay: '付费升级', consumption: '消费升级', admin: '管理员操作', trial: '试用激活', lifetime: '终身会员授予' }
|
|
const UPGRADE_TYPE_LABEL = { pay: '付费升级', consumption: '消费升级', admin: '管理员操作', trial: '试用激活', lifetime: '终身会员授予' }
|
|
@@ -257,7 +305,28 @@ export default {
|
|
|
maintainForm: { id: null, nickname: '', memberLevel: '', referrerIdStr: '' },
|
|
maintainForm: { id: null, nickname: '', memberLevel: '', referrerIdStr: '' },
|
|
|
// 权限详情
|
|
// 权限详情
|
|
|
featuresVisible: false,
|
|
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: {
|
|
computed: {
|
|
@@ -352,6 +421,47 @@ export default {
|
|
|
this.featuresVisible = true
|
|
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) {
|
|
resolveUserNames(items, idField) {
|
|
|
if (!items || items.length === 0) return Promise.resolve()
|
|
if (!items || items.length === 0) return Promise.resolve()
|
|
|
var ids = []
|
|
var ids = []
|