Files
lucky_shop/pages_promotion/fenxiao/level.vue
ZF sun 783c10fc62 refactor: 统一项目内国际化key的命名空间格式
本次提交对全项目的国际化调用进行了规范化重构:
1. 为中文/英文语言包新增了avatar和gender的别名映射,兼容旧有headImg/sex写法
2. 修正了lang.js中的注释路径错误
3. 将所有页面和组件内的$lang调用从短路径改为带业务模块前缀的完整命名空间路径,例如将$lang('title')改为$lang('article.list.title')
4. 优化了i18n-lazy.js的注释说明,补充了正确的key命名格式示例
5. 统一了分销、订单、会员等模块的国际化key层级,确保所有语言调用路径一致
2026-07-04 09:24:35 +08:00

315 lines
12 KiB
Vue

<template>
<view class="container" :style="themeColor">
<view class="level-top">
<image :src="$util.img('public/uniapp/level/level-top-bg.png')"></image>
</view>
<swiper :autoplay="false" :duration="500" class="level-swiper" previous-margin="50rpx" next-margin="50rpx" @change="swiperChange" :current="curr">
<swiper-item v-for="(item, index) in levelList" :key="index">
<view class="level-item" :class="{'curr': index == curr}">
<view class="level-wrap">
<view class="member-info">
<view class="head-img">
<image :src="fenxiaoInfo.headimg ? $util.img(fenxiaoInfo.headimg) : $util.getDefaultImage().head" @error="fenxiaoInfo.headimg = $util.getDefaultImage().head" mode="aspectFill" show-menu-by-longpress/>
</view>
<view class="nickname">{{ fenxiaoInfo.nickname }}</view>
<view class="level-name">{{ item.level_name }}</view>
</view>
<view class="level-rate">
<view class="rate-item" v-if="config.level > 0">
<view class="title">{{ $lang('fenxiao.level.firstLevelCommissionRate') }}</view>
<view class="rate">{{ item.one_rate }}<text class="percentage">%</text></view>
</view>
<view class="rate-item" v-if="config.level > 1">
<view class="title">{{ $lang('fenxiao.level.secondLevelCommissionRate') }}</view>
<view class="rate">{{ item.two_rate }}<text class="percentage">%</text></view>
</view>
<view class="rate-item" v-if="config.level > 2">
<view class="title">{{ $lang('fenxiao.level.thirdLevelCommissionRate') }}</view>
<view class="rate">{{ item.three_rate }}<text class="percentage">%</text></view>
</view>
</view>
<view class="not-unlocked" v-if="item.level_num > fenxiaoInfo.level_num">
<text class="iconfont icon-suoding"></text>
</view>
</view>
</view>
</swiper-item>
</swiper>
<view class="level-condition" v-if="levelInfo">
<view class="condition-title">
<view class="title">{{ $lang('fenxiao.level.quickUpgradeTips') }}</view>
<view class="rate price-font">
<text class="complete">{{ levelInfo.complete > levelInfo.task_num ? levelInfo.task_num : levelInfo.complete }}</text>
<text class="num">/{{ levelInfo.task_num }}</text>
</view>
</view>
<view class="task">
<view class="task-item" v-for="(item, index) in levelInfo.task" :key="index">
<view class="flex-box">
<view class="title">
{{item.title}}
<text class="iconfont icon-wenxiao" @click="openTips(item)"></text>
</view>
<view class="status" :class="{'complete': item.progress == 100}">
{{ item.progress == 100 ? $lang('completed') : $lang('fenxiao.level.incomplete') }}</view>
</view>
<view class="progress">
<progress :percent="item.progress" activeColor="#E7B667" stroke-width="4" />
</view>
<view class="flex-box">
<view class="desc">{{item.desc}}</view>
<view class="rate price-font">
<text class="complete">{{ item.value }}</text>
<text class="num">/{{ item.condition }}</text>
</view>
</view>
</view>
</view>
</view>
<uni-popup type="bottom" ref="tips">
<view class="popup">
<view class="popup-header">
<text class="tit">{{ $lang('fenxiao.level.tip') }}</text>
<text class="iconfont icon-close" @click="$refs.tips.close()"></text>
</view>
<view class="popup-body">
<view>{{ tips }}</view>
<view v-if="levelInfo">{{ levelInfo.upgrade_type == 1 ? $lang('fenxiao.level.anyConditionUpgrade') : $lang('fenxiao.level.allConditionsUpgrade') }}</view>
</view>
</view>
</uni-popup>
<ns-goods-recommend route="fenxiao_level"></ns-goods-recommend>
<loading-cover ref="loadingCover"></loading-cover>
</view>
</template>
<script>
import fenxiaoWords from 'common/js/fenxiao-words.js';
export default {
data() {
return {
fenxiaoInfo: {
condition: {
last_level: null
}
},
config: {},
levelList: [],
curr: 0,
tips: ''
};
},
mixins: [fenxiaoWords],
computed: {
levelInfo() {
if (this.levelList.length) {
let level = this.levelList[this.curr];
level.task = [];
level.complete = 0;
if (level.one_fenxiao_order_num > 0) {
let task = {
title: this.$lang('fenxiao.level.subordinateConsumption'),
desc: this.$lang('fenxiao.level.subordinateOrderCount', { count: level.one_fenxiao_order_num }),
tips: this.$lang('fenxiao.level.subordinateOrderCountTip', { count: level.one_fenxiao_order_num }),
condition: level.one_fenxiao_order_num,
value: this.fenxiaoInfo.one_fenxiao_order_num,
progress: parseFloat(this.fenxiaoInfo.one_fenxiao_order_num) > parseFloat(level.one_fenxiao_order_num) ? 100 : (parseFloat(this.fenxiaoInfo.one_fenxiao_order_num) / parseFloat(level.one_fenxiao_order_num) * 100).toFixed(2)
}
if (task.progress == 100) level.complete += 1;
level.task.push(task);
}
if (level.one_fenxiao_total_order > 0) {
let task = {
title: this.$lang('fenxiao.level.subordinateConsumption'),
desc: this.$lang('fenxiao.level.subordinateOrderAmount', { amount: this.moneyFormat(level.one_fenxiao_total_order) }),
tips: this.$lang('fenxiao.level.subordinateOrderAmountTip', { amount: this.moneyFormat(level.one_fenxiao_total_order) }),
condition: this.moneyFormat(level.one_fenxiao_total_order),
value: this.fenxiaoInfo.one_fenxiao_total_order,
progress: parseFloat(this.fenxiaoInfo.one_fenxiao_total_order) > parseFloat(level.one_fenxiao_total_order) ? 100 : (parseFloat(this.fenxiaoInfo.one_fenxiao_total_order) / parseFloat(level.one_fenxiao_total_order) * 100)
.toFixed(2)
}
if (task.progress == 100) level.complete += 1;
level.task.push(task);
}
if (level.one_fenxiao_order_money > 0) {
let task = {
title: this.$lang('fenxiao.level.subordinateConsumption'),
desc: this.$lang('fenxiao.level.subordinateCommissionAmount', { amount: this.moneyFormat(level.one_fenxiao_order_money) }),
tips: this.$lang('fenxiao.level.subordinateCommissionAmountTip', { amount: this.moneyFormat(level.one_fenxiao_order_money) }),
condition: this.moneyFormat(level.one_fenxiao_order_money),
value: this.fenxiaoInfo.one_fenxiao_order_money,
progress: parseFloat(this.fenxiaoInfo.one_fenxiao_order_money) > parseFloat(level.one_fenxiao_order_money) ? 100 : (parseFloat(this.fenxiaoInfo.one_fenxiao_order_money) / parseFloat(level.one_fenxiao_order_money) * 100)
.toFixed(2)
}
if (task.progress == 100) level.complete += 1;
level.task.push(task);
}
if (level.order_num > 0) {
let task = {
title: this.$lang('fenxiao.level.selfConsumption'),
desc: this.$lang('fenxiao.level.selfOrderCount', { count: level.order_num }),
tips: this.$lang('fenxiao.level.selfOrderCountTip', { count: level.order_num }),
condition: level.order_num,
value: this.fenxiaoInfo.order_num,
progress: parseFloat(this.fenxiaoInfo.order_num) > parseFloat(level.order_num) ? 100 : (parseFloat(this.fenxiaoInfo.order_num) / parseFloat(level.order_num) * 100).toFixed(2)
}
if (task.progress == 100) level.complete += 1;
level.task.push(task);
}
if (level.order_money > 0) {
let task = {
title: this.$lang('fenxiao.level.selfConsumption'),
desc: this.$lang('fenxiao.level.selfOrderAmount', { amount: this.moneyFormat(level.order_money) }),
tips: this.$lang('fenxiao.level.selfOrderAmountTip', { amount: this.moneyFormat(level.order_money) }),
condition: this.moneyFormat(level.order_money),
value: this.fenxiaoInfo.order_money,
progress: parseFloat(this.fenxiaoInfo.order_money) > parseFloat(level.order_money) ? 100 : (parseFloat(this.fenxiaoInfo.order_money) / parseFloat(level.order_money) * 100).toFixed(2)
}
if (task.progress == 100) level.complete += 1;
level.task.push(task);
}
if (level.one_child_num > 0) {
let task = {
title: this.$lang('fenxiao.level.inviteFriends'),
desc: this.$lang('fenxiao.level.inviteFriendCount', { count: level.one_child_num }),
tips: this.$lang('fenxiao.level.inviteFriendCountTip', { count: level.one_child_num }),
condition: level.one_child_num,
value: this.fenxiaoInfo.one_child_num,
progress: parseFloat(this.fenxiaoInfo.one_child_num) > parseFloat(level.one_child_num) ? 100 : (parseFloat(this.fenxiaoInfo.one_child_num) / parseFloat(level.one_child_num) * 100).toFixed(2)
}
if (task.progress == 100) level.complete += 1;
level.task.push(task);
}
if (level.one_child_fenxiao_num > 0) {
let task = {
title: this.$lang('fenxiao.level.inviteFriends'),
desc: this.$lang('fenxiao.level.inviteFenxiaoCount', { count: level.one_child_fenxiao_num }),
tips: this.$lang('fenxiao.level.inviteFenxiaoCountTip', { count: level.one_child_fenxiao_num }),
condition: level.one_child_fenxiao_num,
value: this.fenxiaoInfo.one_child_fenxiao_num,
progress: parseFloat(this.fenxiaoInfo.one_child_fenxiao_num) > parseFloat(level.one_child_fenxiao_num) ? 100 : (parseFloat(this.fenxiaoInfo.one_child_fenxiao_num) / parseFloat(level.one_child_fenxiao_num) * 100).toFixed(2)
}
if (task.progress == 100) level.complete += 1;
level.task.push(task);
}
level.task_num = level.upgrade_type == 1 ? 1 : level.task.length;
return level;
}
}
},
onLoad() {},
onShow() {
setTimeout( () => {
if (!this.addonIsExist.fenxiao) {
this.$util.showToast({
title: this.$lang('fenxiao.level.merchantNotOpenFenxiao'),
mask: true,
duration: 2000
});
setTimeout(() => {
this.$util.redirectTo(this.$util.INDEX_PAGE_URL);
}, 2000);
}
},1000);
if (this.fenxiaoWords && this.fenxiaoWords.fenxiao_name) this.$langConfig.title(this.fenxiaoWords.fenxiao_name + this.$lang('fenxiao.level.levelSuffix'));
if (this.storeToken) {
this.getFenxiaoInfo();
this.getBasicsConfig();
} else {
this.$util.redirectTo(this.$util.LOGIN_PAGE_URL, {
back: '/pages_promotion/fenxiao/level'
});
}
},
methods: {
/**
* 获取分销等级信息
*/
getFenxiaoLevel() {
this.$api.sendRequest({
url: '/fenxiao/api/Level/lists',
success: res => {
if (res.code == 0 && res.data) {
this.levelList = res.data;
this.levelList.forEach((item, index) => {
if (item.level_id == this.fenxiaoInfo.level_id) this.curr = index;
})
}
}
});
},
/**
* 获取分销商信息
*/
getFenxiaoInfo() {
this.$api.sendRequest({
url: '/fenxiao/api/fenxiao/detail',
success: res => {
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
if (res.code >= 0 && res.data) {
this.fenxiaoInfo = res.data;
this.curr = this.fenxiaoInfo.level_num;
this.getFenxiaoLevel();
} else {
this.$util.redirectTo('/pages_promotion/fenxiao/apply');
}
},
fail: () => {
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
}
});
},
/**
* 获取分销基本配置
*/
getBasicsConfig() {
this.$api.sendRequest({
url: '/fenxiao/api/config/basics',
success: res => {
if (res.code >= 0) {
this.config = res.data;
}
}
});
},
swiperChange(e) {
this.curr = e.detail.current;
},
openTips(data) {
this.tips = data.tips;
this.$refs.tips.open();
}
}
};
</script>
<style lang="scss">
@import './public/css/level.scss';
</style>
<style scoped lang="scss">
::v-deep .uni-popup__wrapper.uni-custom .uni-popup__wrapper-box {
background: none;
max-height: unset !important;
overflow-y: hidden !important;
}
::v-deep .uni-popup__wrapper {
border-radius: 20rpx 20rpx 0 0;
}
::v-deep .uni-popup {
z-index: 8;
}
::v-deep .sku-layer .uni-popup__wrapper.uni-custom .uni-popup__wrapper-box {
max-height: unset !important;
}
</style>