302 lines
9.2 KiB
Vue
302 lines
9.2 KiB
Vue
|
|
<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>
|