| | |
| | | <div class="rule-item" v-for="pointRuleDetial in rule.pointsRules"> |
| | | <span class="rule-desc">{{ pointRuleDetial.ruleName }} : {{ pointRuleDetial.ruleDescription}} </span> |
| | | <el-input |
| | | v-model="rules.benchmarkSubmission" |
| | | v-model="pointRuleDetial.pointsValue" |
| | | size="small" |
| | | style="width: 80px;" |
| | | placeholder="请输入" |
| | |
| | | <span class="unit">积分</span> |
| | | <span class="unit" v-if="pointRuleDetial.isLimit === 1">,每日积分上限</span> |
| | | <el-input |
| | | v-model="rules.productSubscribedDailyLimit" |
| | | v-model="pointRuleDetial.dailyLimit" |
| | | size="small" |
| | | style="width: 80px;" |
| | | placeholder="请输入" |
| | |
| | | </template> |
| | | |
| | | <!-- 资源传播 --> |
| | | <div class="rule-category"> |
| | | <h4>资源传播</h4> |
| | | <div class="rule-category" v-for="consumeRule in rules.consumePointsRuleList"> |
| | | <h4>{{ consumeRule.category }}</h4> |
| | | <div class="rule-subcategory"> |
| | | <h5>数字资源</h5> |
| | | <!-- <h5>数字资源</h5>--> |
| | | <div class="rule-items"> |
| | | <div class="rule-item"> |
| | | <span class="rule-desc">提报产品被取消收藏,扣除</span> |
| | | <div class="rule-item" v-for="pointRuleDetials in consumeRule.pointsRules"> |
| | | <span class="rule-desc">{{ pointRuleDetials.ruleName }} : {{ pointRuleDetials.ruleDescription}}</span> |
| | | <el-input |
| | | v-model="rules.productUnfavorited" |
| | | v-model="pointRuleDetials.pointsValue" |
| | | size="small" |
| | | style="width: 60px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分</span> |
| | | </div> |
| | | <div class="rule-item"> |
| | | <span class="rule-desc">提报产品被取消点赞,扣除</span> |
| | | <span class="unit" v-if="pointRuleDetials.isLimit === 1">,每日积分上限</span> |
| | | <el-input |
| | | v-model="rules.productUnliked" |
| | | v-model="pointRuleDetials.dailyLimit" |
| | | size="small" |
| | | style="width: 60px;" |
| | | style="width: 80px;" |
| | | placeholder="请输入" |
| | | v-if="pointRuleDetials.isLimit === 1" |
| | | /> |
| | | <span class="unit">积分</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="rule-subcategory"> |
| | | <h5>产品订阅</h5> |
| | | <div class="rule-items"> |
| | | <div class="rule-item"> |
| | | <span class="rule-desc">提报产品被取消订阅,扣除</span> |
| | | <el-input |
| | | v-model="rules.productUnfavorited" |
| | | size="small" |
| | | style="width: 60px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分</span> |
| | | </div> |
| | | <div class="rule-item"> |
| | | <span class="rule-desc">提报产品被取消试用,扣除</span> |
| | | <el-input |
| | | v-model="rules.productUnliked" |
| | | size="small" |
| | | style="width: 60px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="rule-subcategory"> |
| | | <h5>交流社区</h5> |
| | | <div class="rule-items"> |
| | | <div class="rule-item"> |
| | | <span class="rule-desc">删除提问,扣除</span> |
| | | <el-input |
| | | v-model="rules.productUnfavorited" |
| | | size="small" |
| | | style="width: 60px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分</span> |
| | | </div> |
| | | <div class="rule-item"> |
| | | <span class="rule-desc">删除评论,扣除</span> |
| | | <el-input |
| | | v-model="rules.productUnliked" |
| | | size="small" |
| | | style="width: 60px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分</span> |
| | | </div> |
| | | <div class="rule-item"> |
| | | <span class="rule-desc">评论被取消点赞,扣除</span> |
| | | <el-input |
| | | v-model="rules.productUnliked" |
| | | size="small" |
| | | style="width: 60px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | </el-card> |
| | | |
| | | <!-- 积分转换规则 --> |
| | | <el-card class="rule-section" shadow="never"> |
| | | <template #header> |
| | | <div class="card-header"> |
| | | <span class="section-title">积分转换规则</span> |
| | | </div> |
| | | </template> |
| | | <!-- <el-card class="rule-section" shadow="never">--> |
| | | <!-- <template #header>--> |
| | | <!-- <div class="card-header">--> |
| | | <!-- <span class="section-title">积分转换规则</span>--> |
| | | <!-- </div>--> |
| | | <!-- </template>--> |
| | | |
| | | <div class="rule-category"> |
| | | <h4>积分转换</h4> |
| | | <div class="rule-subcategory"> |
| | | <h5>数字化标杆积分转换</h5> |
| | | <div class="rule-items"> |
| | | <div class="rule-item"> |
| | | <span class="rule-desc">数字化标杆个人</span> |
| | | <el-input |
| | | v-model="rules.benchmarkPersonalToUnit" |
| | | size="small" |
| | | style="width: 80px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分兑换数字化标杆单位</span> |
| | | <el-input |
| | | v-model="rules.benchmarkUnitToPersonal" |
| | | size="small" |
| | | style="width: 80px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分</span> |
| | | </div> |
| | | <div class="rule-item"> |
| | | <span class="rule-desc">数字化标杆单位</span> |
| | | <el-input |
| | | v-model="rules.benchmarkUnitToPersonal" |
| | | size="small" |
| | | style="width: 80px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分兑换数字化标杆个人</span> |
| | | <el-input |
| | | v-model="rules.benchmarkPersonalToUnit" |
| | | size="small" |
| | | style="width: 80px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="rule-subcategory"> |
| | | <h5>数字化知识积分转换</h5> |
| | | <div class="rule-items"> |
| | | <div class="rule-item"> |
| | | <span class="rule-desc">数字化知识个人</span> |
| | | <el-input |
| | | v-model="rules.knowledgePersonalToUnit" |
| | | size="small" |
| | | style="width: 80px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分兑换数字化知识单位</span> |
| | | <el-input |
| | | v-model="rules.knowledgeUnitToPersonal" |
| | | size="small" |
| | | style="width: 80px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分</span> |
| | | </div> |
| | | <div class="rule-item"> |
| | | <span class="rule-desc">数字化知识单位</span> |
| | | <el-input |
| | | v-model="rules.knowledgeUnitToPersonal" |
| | | size="small" |
| | | style="width: 80px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分兑换数字化知识个人</span> |
| | | <el-input |
| | | v-model="rules.knowledgePersonalToUnit" |
| | | size="small" |
| | | style="width: 80px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="rule-subcategory"> |
| | | <h5>数字化产品积分转换</h5> |
| | | <div class="rule-items"> |
| | | <div class="rule-item"> |
| | | <span class="rule-desc">数字化产品个人</span> |
| | | <el-input |
| | | v-model="rules.productPersonalToUnit" |
| | | size="small" |
| | | style="width: 80px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分兑换数字化产品单位</span> |
| | | <el-input |
| | | v-model="rules.productUnitToPersonal" |
| | | size="small" |
| | | style="width: 80px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分</span> |
| | | </div> |
| | | <div class="rule-item"> |
| | | <span class="rule-desc">数字化产品单位</span> |
| | | <el-input |
| | | v-model="rules.productUnitToPersonal" |
| | | size="small" |
| | | style="width: 80px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分兑换数字化产品个人</span> |
| | | <el-input |
| | | v-model="rules.productPersonalToUnit" |
| | | size="small" |
| | | style="width: 80px;" |
| | | placeholder="请输入" |
| | | /> |
| | | <span class="unit">积分</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | <!-- <div class="rule-category">--> |
| | | <!-- <h4>积分转换</h4>--> |
| | | <!-- <div class="rule-subcategory">--> |
| | | <!-- <h5>数字化标杆积分转换</h5>--> |
| | | <!-- <div class="rule-items">--> |
| | | <!-- <div class="rule-item">--> |
| | | <!-- <span class="rule-desc">数字化标杆个人</span>--> |
| | | <!-- <el-input--> |
| | | <!-- v-model="rules.benchmarkPersonalToUnit"--> |
| | | <!-- size="small"--> |
| | | <!-- style="width: 80px;"--> |
| | | <!-- placeholder="请输入"--> |
| | | <!-- />--> |
| | | <!-- <span class="unit">积分兑换数字化标杆单位</span>--> |
| | | <!-- <el-input--> |
| | | <!-- v-model="rules.benchmarkUnitToPersonal"--> |
| | | <!-- size="small"--> |
| | | <!-- style="width: 80px;"--> |
| | | <!-- placeholder="请输入"--> |
| | | <!-- />--> |
| | | <!-- <span class="unit">积分</span>--> |
| | | <!-- </div>--> |
| | | <!-- <div class="rule-item">--> |
| | | <!-- <span class="rule-desc">数字化标杆单位</span>--> |
| | | <!-- <el-input--> |
| | | <!-- v-model="rules.benchmarkUnitToPersonal"--> |
| | | <!-- size="small"--> |
| | | <!-- style="width: 80px;"--> |
| | | <!-- placeholder="请输入"--> |
| | | <!-- />--> |
| | | <!-- <span class="unit">积分兑换数字化标杆个人</span>--> |
| | | <!-- <el-input--> |
| | | <!-- v-model="rules.benchmarkPersonalToUnit"--> |
| | | <!-- size="small"--> |
| | | <!-- style="width: 80px;"--> |
| | | <!-- placeholder="请输入"--> |
| | | <!-- />--> |
| | | <!-- <span class="unit">积分</span>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <!-- <div class="rule-subcategory">--> |
| | | <!-- <h5>数字化知识积分转换</h5>--> |
| | | <!-- <div class="rule-items">--> |
| | | <!-- <div class="rule-item">--> |
| | | <!-- <span class="rule-desc">数字化知识个人</span>--> |
| | | <!-- <el-input--> |
| | | <!-- v-model="rules.knowledgePersonalToUnit"--> |
| | | <!-- size="small"--> |
| | | <!-- style="width: 80px;"--> |
| | | <!-- placeholder="请输入"--> |
| | | <!-- />--> |
| | | <!-- <span class="unit">积分兑换数字化知识单位</span>--> |
| | | <!-- <el-input--> |
| | | <!-- v-model="rules.knowledgeUnitToPersonal"--> |
| | | <!-- size="small"--> |
| | | <!-- style="width: 80px;"--> |
| | | <!-- placeholder="请输入"--> |
| | | <!-- />--> |
| | | <!-- <span class="unit">积分</span>--> |
| | | <!-- </div>--> |
| | | <!-- <div class="rule-item">--> |
| | | <!-- <span class="rule-desc">数字化知识单位</span>--> |
| | | <!-- <el-input--> |
| | | <!-- v-model="rules.knowledgeUnitToPersonal"--> |
| | | <!-- size="small"--> |
| | | <!-- style="width: 80px;"--> |
| | | <!-- placeholder="请输入"--> |
| | | <!-- />--> |
| | | <!-- <span class="unit">积分兑换数字化知识个人</span>--> |
| | | <!-- <el-input--> |
| | | <!-- v-model="rules.knowledgePersonalToUnit"--> |
| | | <!-- size="small"--> |
| | | <!-- style="width: 80px;"--> |
| | | <!-- placeholder="请输入"--> |
| | | <!-- />--> |
| | | <!-- <span class="unit">积分</span>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <!-- <div class="rule-subcategory">--> |
| | | <!-- <h5>数字化产品积分转换</h5>--> |
| | | <!-- <div class="rule-items">--> |
| | | <!-- <div class="rule-item">--> |
| | | <!-- <span class="rule-desc">数字化产品个人</span>--> |
| | | <!-- <el-input--> |
| | | <!-- v-model="rules.productPersonalToUnit"--> |
| | | <!-- size="small"--> |
| | | <!-- style="width: 80px;"--> |
| | | <!-- placeholder="请输入"--> |
| | | <!-- />--> |
| | | <!-- <span class="unit">积分兑换数字化产品单位</span>--> |
| | | <!-- <el-input--> |
| | | <!-- v-model="rules.productUnitToPersonal"--> |
| | | <!-- size="small"--> |
| | | <!-- style="width: 80px;"--> |
| | | <!-- placeholder="请输入"--> |
| | | <!-- />--> |
| | | <!-- <span class="unit">积分</span>--> |
| | | <!-- </div>--> |
| | | <!-- <div class="rule-item">--> |
| | | <!-- <span class="rule-desc">数字化产品单位</span>--> |
| | | <!-- <el-input--> |
| | | <!-- v-model="rules.productUnitToPersonal"--> |
| | | <!-- size="small"--> |
| | | <!-- style="width: 80px;"--> |
| | | <!-- placeholder="请输入"--> |
| | | <!-- />--> |
| | | <!-- <span class="unit">积分兑换数字化产品个人</span>--> |
| | | <!-- <el-input--> |
| | | <!-- v-model="rules.productPersonalToUnit"--> |
| | | <!-- size="small"--> |
| | | <!-- style="width: 80px;"--> |
| | | <!-- placeholder="请输入"--> |
| | | <!-- />--> |
| | | <!-- <span class="unit">积分</span>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <!-- </el-card>--> |
| | | </div> |
| | | </div> |
| | | |
| | |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { ref, onMounted } from 'vue' |
| | | import { ref, onMounted, watch } from 'vue' |
| | | import { useRoute } from 'vue-router' |
| | | import { ElMessage, ElMessageBox } from 'element-plus' |
| | | import { ArrowLeft } from '@element-plus/icons-vue' |
| | | import pointsApi from '../../../api/pointsApi' |
| | | import qs from 'qs' |
| | | |
| | | // 获取路由实例 |
| | | const route = useRoute() |
| | | // 获取路由参数中的规则id |
| | | const ruleId = route.query.ruleId as string |
| | | // 定义props |
| | | interface Props { |
| | | ruleId?: string |
| | | } |
| | | |
| | | const props = withDefaults(defineProps<Props>(), { |
| | | ruleId: '' |
| | | }) |
| | | |
| | | // 定义emits |
| | | const emit = defineEmits<{ |
| | | goBack: [] |
| | | saveSuccess: [] |
| | | }>() |
| | | |
| | | interface PointRule { |
| | | category: string, |
| | |
| | | createdAt: string, |
| | | ruleType: number, |
| | | pointsWinner: number, |
| | | isLimit: number |
| | | isLimit: number, |
| | | pointsValue: number, |
| | | dailyLimit: number |
| | | } |
| | | |
| | | // 积分规则配置 |
| | | interface PointsRules { |
| | | getPointsRuleList: PointRule[], |
| | | consumePointsRuleList: PointRule[], |
| | | benchmarkSubmission: number, |
| | | productSubscribedDailyLimit: number, |
| | | productAccess: number, |
| | | resourceTransaction: number, |
| | | productSubscribed: number, |
| | | productTrialed: number, |
| | | productTrialedDailyLimit: number, |
| | | resourceLiked: number, |
| | | resourceLikedDailyLimit: number, |
| | | dailyFirstLogin: number, |
| | | postQuestion: number, |
| | | postQuestionDailyLimit: number, |
| | | postComment: number, |
| | | postCommentDailyLimit: number, |
| | | commentLiked: number, |
| | | commentLikedDailyLimit: number, |
| | | monthlyTop1: number, |
| | | monthlyTop2: number, |
| | | monthlyTop3: number, |
| | | productUnfavorited: number, |
| | | productUnliked: number, |
| | | benchmarkPersonalToUnit: number, |
| | | benchmarkUnitToPersonal: number, |
| | | knowledgePersonalToUnit: number, |
| | | knowledgeUnitToPersonal: number, |
| | | productPersonalToUnit: number, |
| | | productUnitToPersonal: number |
| | | consumePointsRuleList: PointRule[] |
| | | } |
| | | |
| | | const rules = ref<PointsRules>({ |
| | | consumePointsRuleList: [], |
| | | getPointsRuleList: [], |
| | | benchmarkSubmission: 0, |
| | | productSubscribedDailyLimit: 0, |
| | | productAccess: 0, |
| | | resourceTransaction: 0, |
| | | productSubscribed: 0, |
| | | productTrialed: 0, |
| | | productTrialedDailyLimit: 0, |
| | | resourceLiked: 0, |
| | | resourceLikedDailyLimit: 0, |
| | | dailyFirstLogin: 0, |
| | | postQuestion: 0, |
| | | postQuestionDailyLimit: 0, |
| | | postComment: 0, |
| | | postCommentDailyLimit: 0, |
| | | commentLiked: 0, |
| | | commentLikedDailyLimit: 0, |
| | | monthlyTop1: 0, |
| | | monthlyTop2: 0, |
| | | monthlyTop3: 0, |
| | | productUnfavorited: 0, |
| | | productUnliked: 0, |
| | | benchmarkPersonalToUnit: 0, |
| | | benchmarkUnitToPersonal: 0, |
| | | knowledgePersonalToUnit: 0, |
| | | knowledgeUnitToPersonal: 0, |
| | | productPersonalToUnit: 0, |
| | | productUnitToPersonal: 0 |
| | | getPointsRuleList: [] |
| | | }) |
| | | |
| | | // 获取积分规则配置 |
| | | const getPointsRules = async () => { |
| | | try { |
| | | if (ruleId) { |
| | | if (props.ruleId) { |
| | | // 如果有ruleId参数,则获取特定规则 |
| | | const formData = new URLSearchParams(); |
| | | formData.append('ruleId', ruleId); |
| | | formData.append('ruleId', props.ruleId); |
| | | |
| | | const res = await pointsApi.getPointsRuleById(formData) |
| | | if (res.code === 200 && res.data) { |
| | |
| | | console.log(rules.value) |
| | | } |
| | | } else { |
| | | // 如果没有ruleId参数,则获取所有规则 |
| | | const res = await pointsApi.getPointsRules() |
| | | if (res.code === 200 && res.data) { |
| | | // 将后端数据映射到前端规则对象 |
| | | Object.assign(rules.value, res.data) |
| | | } |
| | | ElMessage.error('对应规则设置不存在') |
| | | } |
| | | } catch (error) { |
| | | console.error('获取积分规则失败:', error) |
| | |
| | | cancelButtonText: '取消', |
| | | type: 'warning', |
| | | }) |
| | | |
| | | const res = await pointsApi.savePointsRules(rules.value) |
| | | let pointRuleDetials: PointRuleDetial[] = [] |
| | | rules.value.getPointsRuleList.forEach(k => { |
| | | pointRuleDetials.push(...k.pointsRules) |
| | | }) |
| | | rules.value.consumePointsRuleList.forEach(k => pointRuleDetials.push(...k.pointsRules)) |
| | | const res = await pointsApi.savePointsRules(pointRuleDetials) |
| | | if (res.code === 200) { |
| | | ElMessage.success('保存成功') |
| | | // 发出保存成功事件 |
| | | emit('saveSuccess') |
| | | } else { |
| | | ElMessage.error(res.msg || '保存失败') |
| | | } |
| | |
| | | |
| | | // 返回上一页 |
| | | const goBack = () => { |
| | | // 如果是从组件调用,发出goBack事件 |
| | | if (props.ruleId) { |
| | | emit('goBack') |
| | | } else { |
| | | // 否则使用原有的返回逻辑 |
| | | history.back() |
| | | } |
| | | } |
| | | |
| | | // 监听ruleId变化 |
| | | watch(() => props.ruleId, (newRuleId) => { |
| | | if (newRuleId) { |
| | | getPointsRules() |
| | | } |
| | | }, { immediate: true }) |
| | | |
| | | onMounted(() => { |
| | | // 只有在没有props.ruleId时才执行原有的逻辑 |
| | | if (!props.ruleId) { |
| | | getPointsRules() |
| | | } |
| | | }) |
| | | </script> |
| | | |