Files
MER-2.2_2601/mer_uniapp/subPackage/pages/diyPage/memberRecharge.vue

302 lines
9.2 KiB
Vue
Raw Normal View History

<template>
<view class="mobile-page" v-if="configObj && rechargeList.length">
<view class="member-recharge overflow-hidden" :style="[boxStyle]">
<!-- 头部信息 -->
<view class="header acea-row row-between-wrapper mb20">
<view class="left acea-row row-middle">
<view class="f-s-30 f-w-500 mr-12" :style="[titleColor]">
{{ configObj.titleConfig.val }}
</view>
<view class="f-s24" :style="[infoColor]">
{{ configObj.infoConfig.val }}
</view>
</view>
<view v-show="isLogin && merMemberInfo.isMerchantMember" @click="handleMore" class="f-s-24 flex-y-center" :style="[moreColor]">
更多<i class="iconfont icon-ic_rightarrow f-s-24"></i>
</view>
</view>
<!-- 套餐列表 -->
<view class="recharge-list flex flex-wrap" :class="'list-' + listStyle">
<view
class="recharge-item flex-center flex-column relative overflow-hidden"
v-for="(item, index) in rechargeList"
:key="index"
@click="clickRecharge(item, index)"
:style="[
itemStyle,
{ marginRight: (index + 1) % colNum === 0 ? '0' : configObj.contentConfig.val + 'px' },
{ marginBottom: configObj.contentConfig.val + 'px' },
index === checkedIndex
? {
borderColor: themeStyle ? amountColor : themeColor,
backgroundColor: themeStyle ? rechargeBgColor : themeRgba,
}
: {},
]"
>
<view
class="f-w-600 mb-6 recharge-price"
:style="{
color: index === checkedIndex ? (themeStyle ? amountColor : themeColor) : themeStyle ? amountColor : themeColor,
}"
>
<span class="mr-4 symbol"></span>
<span class="num semiBold">{{ item.rechargeAmount }}</span>
</view>
<view class="f-s-26 regular" :style="{ color: giveAwayColor }">{{ item.giftAmount }}</view>
<!-- 选中角标 -->
<view
class="active-icon absolute"
v-if="index === checkedIndex"
:style="{ borderTopColor: themeStyle ? amountColor : themeColor }"
>
<i class="iconfont icon-ic_complete absolute f-s-24"></i>
</view>
</view>
</view>
<!-- 充值按钮 -->
<view class="recharge-btn flex-center flex-column rd-50rpx mt20 w-100-p111-" @click="handleRecharge" :style="[btnColorStyle]">
<view class="f-s-30 fw-500 mb-6">{{isLogin&&merMemberInfo.isMerchantMember ? '立即充值' : '入会并充值'}}</view>
<view class="f-s-22" :style="[btnInfoColor]">{{ configObj.btnInfoConfig.val }}</view>
</view>
</view>
</view>
</template>
<script>
import {setLinearThemeColor, setThemeColor, themeRgba} from "../../../utils/setTheme";
import { mapGetters } from "vuex";
import {toLogin} from "../../../libs/login";
import {getMemberCreditsApi} from "../../../pages/member/memberApi";
import {handleGoRecharge} from "../../../pages/member/member";
const recharge = [
{ rechargeAmount: '4500', giftAmount: '200',id: 1 },
{ rechargeAmount: '4500', giftAmount: '200',id: 2 },
{ rechargeAmount: '4500', giftAmount: '200',id: 3 },
{ rechargeAmount: '4500', giftAmount: '200',id: 4 },
];
export default {
name: "memberRecharge",
props: {
merMemberInfo:{ //店铺会员信息
type: Object,
default: () => {}
},
merId: { // 商户id
type: Number,
default: 0
},
configObj: {
type: Object,
default: () => {}
}
},
computed: {
...mapGetters(['isLogin']),
themeStyle(){
return this.configObj.themeStyleConfig.tabVal
},
listStyle(){
return this.configObj.tabConfig.tabVal;
},
//最外层盒子的样式
boxStyle() {
return { 'border-radius': this.configObj.bgStyle.val ? 2 * this.configObj.bgStyle.val + 'rpx' : '0',
background: `linear-gradient(to right,${this.configObj.bgColor.color[0].item}, ${this.configObj.bgColor.color[1].item})`,
margin: 2 * this.configObj.mbConfig.val + 'rpx' + ' ' + 2 * this.configObj.lrConfig.val + 'rpx' + ' ' + 0,
padding:2 * this.configObj.upConfig.val + 'rpx' + ' ' + '20rpx' + ' ' + 2 * this.configObj.downConfig.val + 'rpx'}
},
//内容边距
contentConfig() {
return this.configObj.contentConfig.val ? 2 * this.configObj.contentConfig.val + 'rpx' : '0';
},
titleColor(){
return { color: this.configObj.titleColor.color[0].item };
},
infoColor(){
return { color: this.configObj.infoColor.color[0].item };
},
moreColor(){
return { color: this.configObj.moreColor.color[0].item };
},
scopeColor() {
return { color: this.configObj.scopeColor? this.configObj.scopeColor.color[0].item:'' };
},
rechargeBgColor() {
return this.configObj.rechargeBgColor.color[0].item;
},
//优惠金额颜色
giveAwayColor() {
return this.configObj.giveAwayColor.color[0].item;
},
amountColor() {
return this.configObj.amountColor.color[0].item;
},
btnInfoColor() {
return { color: this.themeStyle ? this.configObj.btnInfoColor.color[0].item : '#fff' };
},
//领取按钮
btnColorStyle() {
return {
background: this.themeStyle
? `linear-gradient(90deg,${this.configObj.btnColor.color[0].item}, ${this.configObj.btnColor.color[1].item})`
: setLinearThemeColor(),
color: this.themeStyle ? this.configObj.btnBgColor.color[0].item : '#fff',
}
},
// 单个卡片样式
itemStyle() {
const margin = this.configObj.contentConfig.val;
const col = this.colNum;
// 计算宽度: (100% - (列数-1) * 间距) / 列数
// 注意:这里需要返回字符串形式的 calc
return {
borderRadius: 2 * this.configObj.contentStyle.val + 'rpx',
width: `calc((100% - ${(col - 1) * margin}px) / ${col})`,
};
},
// 列数
colNum() {
if (this.listStyle == 0) return 2;
if (this.listStyle == 1) return 3;
if (this.listStyle == 2) return 4;
return 2;
},
// 卡片宽度百分比
itemWidth() {
// (100 - (列数-1) * 间距) / 列数
// 这里简化处理,直接用 calc 在 style 中动态计算可能更精确,或者用 flex
// 简单起见,这里返回近似值,实际宽度在 CSS 中控制更好
// 但因为有 marginRight需要精确计算
// 100% / colNum - margin * (colNum - 1) / colNum
// 为了简单,我们用 flex 布局控制
return 100; // 这里的返回值会在 style 中被覆盖,或者我们可以直接不返回宽度,用 flex
},
},
data(){
return{
checkedIndex: 0,
themeColor: setThemeColor(),
themeRgba: themeRgba(),
rechargeList: [],
recharge: {
id: '',
price: ''
}
}
},
mounted(){
this.getMemberRecharge()
},
methods: {
clickRecharge(item, index){
this.checkedIndex = index
this.recharge = {
id: item.id,
price: item.rechargeAmount
}
},
async getMemberRecharge(){
if(this.configObj.rechargeConfig.ids){
let { data } = await getMemberCreditsApi(this.configObj.rechargeConfig.ids)
this.rechargeList = [...data]
let item = this.rechargeList[this.checkedIndex]
this.recharge = {
id: item.id,
price: item.rechargeAmount
}
}else{
this.rechargeList = []
}
},
handleMore(){ //去更多
this.$util.navigateTo(`/pages/member/recharge_amount/index?merId=${this.merId}`)
},
handleRecharge(){
if(this.isLogin){
if(this.merMemberInfo.isMerchantMember){
this.handlerOpen()
}else{
this.$emit('activate-membership')
}
}else{
toLogin();
}
},
handlerOpen() { //充值
handleGoRecharge(this.recharge, this.merId)
}
}
}
</script>
<style scoped lang="scss">
.member-recharge {
.recharge-list {
display: flex;
flex-wrap: wrap;
.recharge-item {
background: #fff;
border: 2rpx solid #eee;
padding: 28rpx 0;
box-sizing: border-box;
.recharge-price {
font-size: 26px;
.symbol {
font-size: 15px;
}
}
.active-icon {
right: 0;
top: 0;
width: 0;
height: 0;
border-top: 48rpx solid;
border-left: 48rpx solid transparent;
color: #fff;
.icon-ic_complete {
position: absolute;
top: -44rpx;
right: 2rpx;
transform: scale(0.8);
}
}
}
// 2列
&.list-0 {
.recharge-item {
// width 由内联样式控制
}
}
// 3列
&.list-1 {
.recharge-item {
// width 由内联样式控制
}
}
// 4列
&.list-2 {
.recharge-item {
// width 由内联样式控制
padding: 20rpx 0;
.recharge-price {
font-size: 14px;
}
.num{
font-size: 20px;
}
}
}
}
.recharge-btn {
height: 46px;
}
}
</style>