You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

311 lines
9.6 KiB
Vue

<template>
<view class="content bg-white">
<kevyloading v-if="loading" type="bsm-loader" color="#618af8" transparent></kevyloading>
<!-- <view class="w-full">
<wd-navbar fixed safeAreaInsetTop :leftText="user_info?.info?.name || '商城首页'">
<template #right>
<wd-icon @click="utils.toUrl('/store/setup/index')" name="setting" size="22px"></wd-icon>
</template>
</wd-navbar>
</view> -->
<wd-tabs v-model="tab">
<block v-for="item in 1" :key="0">
<wd-tab :title="`等级列表`">
<view class="my-4 flex px-14 gap-4">
<wd-button class="flex-1" @click="utils.toUrl('/store/user/editMember')" size="small">新增等级</wd-button>
<wd-button class="flex-1" @click="utils.toUrl('/store/user/setUp')" size="small">页面配置</wd-button>
</view>
<view class="grid p-2">
<view>
<wd-swipe-action v-for="(member, index) of memberList" class="rounded-3xl overflow-hidden mb-3 relative">
<view class="overflow-hidden p-4 relative">
<div class="bg absolute inset-0 bg-cover z-10 bg-no-repeat bg-center" :class="gradients[index]">
</div>
<div class="z-20 relative">
<div class="flex items-center">
<view>
<wd-badge custom-class="badge" type="primary" :modelValue="`v${member.level}`">
<view class="border-white border-4 border-solid flex items-center justify-center"
style="border-radius: 100px;width: 68px;height: 68px;">
<image mode="aspectFill" :src="member.image" :alt="member.name"
style="width: 60px;height: 60px;min-width: 60px;border-radius: 100px; " />
</view>
</wd-badge>
</view>
<view>
<view class="ml-4 px-4 py-2 rounded-3xl mb-1 inline-flex text-white" :class="gradients[index]"
style="font-size: 24rpx; ">
{{ member.name }} ¥{{ member.price }}
</view>
<view class="ml-4 rounded" style="font-size: 22rpx; ">
<view class="mt-2">
<wd-button class="mr-2" type="success" :round="true" size="small">消费:{{ member.money }}
元</wd-button>
<wd-button type="warning" :round="true" size="small">{{ member.growth }} 成长值</wd-button>
</view>
</view>
</view>
</div>
</div>
</view>
<template #right>
<view class="action">
<view class="button " :class="gradients[index]"
@click="utils.toUrl('/store/user/editMember?edit=' + JSON.stringify(member))">编辑</view>
</view>
</template>
</wd-swipe-action>
</view>
</view>
</wd-tab>
</block>
<block v-for="item in 1" :key="1">
<wd-tab :title="`会员专享`">
<view class="my-4 flex px-14 gap-4">
<wd-button class="flex-1" @click="utils.toUrl('/store/user/editGoods')" size="small">新增折扣</wd-button>
</view>
<yList v-if="!loading" class="p-2 bg-gray-50" height="86vh" ref="yListRef" :apiObj="userMembers.DiscountList"
:params="{ ...params }">
<template #default="{ list }">
<div v-for="user of list" class="rounded-md overflow-hidden ">
<wd-card class="rounded-md overflow-hidden" type="rectangle">
<template #title>
<view class="title">
<view>{{ user.name }}</view>
<view class="title-tip">
折扣 {{ user.discount }}
</view>
</view>
</template>
<view class="bg-gray-50 p-2 mb-2.5 flex justify-between" style="font-size: 22rpx;">
<view>状态:
<el-tag type="primary" v-if="user.status == 1">开启</el-tag>
<el-tag v-else>关闭</el-tag>
</view>
<view>折扣商品:{{ user?.goods_list?.length || 0 }} </view>
</view>
<template #footer>
<view class="bg-gray-50 p-2 mb-2.5 flex justify-between" style="font-size: 22rpx;">
<view>优惠时间:
<wd-tag type="primary">{{ utils.dateFormat(user.start_time * 1000) }}</wd-tag> - <wd-tag>{{
utils.dateFormat(user.end_time * 1000) }}</wd-tag>
</view>
</view>
<view class="flex justify-between items-center">
<view></view>
<view>
<!-- <wd-button @click="changeS(user)" v-if="user.status == 1" size="small" plain
style="margin-right: 8px;">关闭</wd-button>
<wd-button @click="changeS(user)" v-if="user.status !== 1" size="small" plain
style="margin-right: 8px;">
开启</wd-button> -->
<wd-button @click="utils.toUrl('/store/user/editGoods?edit=' + JSON.stringify({
...user,
goods_list: user.goods_list.map(item => {
return {
id: item.id,
pic_url: item.pic_url,
name: item.name
}
})
}))" size="small" style="margin-right: 0px;"></wd-button>
</view>
</view>
</template>
</wd-card>
</div>
</template>
</yList>
</wd-tab>
</block>
</wd-tabs>
<wd-toast />
<wd-message-box></wd-message-box>
</view>
</template>
<script setup>
import { ref } from 'vue';
import utils from '@/utils/utils.js';
import yList from "/components/yList/index.vue";
import kevyloading from "@/components/kevy-loading/kevy-loading";
import userMembers from '@/api/store/userMembers.js';
import { useMessage } from '@/uni_modules/wot-design-uni';
import { useToast } from '@/uni_modules/wot-design-uni'
import { useApi } from "@/hooks/useApi.js"
import {
onShow,
} from "@dcloudio/uni-app";
const gradients = [
'bg-gradient-to-t from-blue-100 to-blue-300',
'bg-gradient-to-t from-green-100 to-green-300',
'bg-gradient-to-t from-yellow-100 to-yellow-300',
'bg-gradient-to-t from-red-100 to-red-300',
'bg-gradient-to-t from-purple-100 to-purple-300',
'bg-gradient-to-t from-pink-100 to-pink-300',
'bg-gradient-to-t from-indigo-100 to-indigo-300',
'bg-gradient-to-t from-teal-100 to-teal-300',
'bg-gradient-to-t from-orange-100 to-orange-300',
'bg-gradient-to-t from-gray-100 to-gray-300',
// 添加更多的渐变类,以满足你的需求
];
const toast = useToast()
const message1 = useMessage();
const tab = ref(0);
/**
* @type {Ref<boolean>}
* 控制页面加载状态的 Ref
*/
const loading = ref(false);
/**
* 从本地存储中获取用户信息
*/
const user_info = uni.getStorageSync("user_info");
const memberList = ref({});
const changeS = async (row) => {
const { fetchData } = await useApi(userMembers.LevelShow, { loading })
fetchData({
id: row.id,
status: [1, 0][row.status],
}).then(res => {
if (result.value.code == 0) {
toast.success('操作成功')
row.status = [1, 0][row.status]
} else {
uni.showToast({
title: '出错了',
icon: 'none'
})
}
})
}
const syncGoods = (row) => {
message1
.confirm({
title: '同步商品',
})
.then((resp) => {
toast.loading('请稍后...')
member.synchronousGoods({
id: row.id,
}).then(res => {
if (res.code == 0) {
toast.success('同步成功');
} else {
toast.error('同步失败');
}
});
})
.catch((error) => {
console.log(error);
});
};
/**
* 获取数据的函数
*/
const getmemberList = async () => {
const { fetchData } = await useApi(userMembers.LevelShow, { loading })
fetchData().then(res => {
memberList.value = res.data;
memberList.value.ok = true;
})
};
// 初始化调用获取一行数据
onShow(() => {
getmemberList();
})
</script>
<style lang="scss" scoped>
.memberBox,
.title {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
.memberBox {
justify-content: flex-start;
}
.title {
justify-content: space-between;
}
.title-tip {
color: rgba(0, 0, 0, 0.25);
font-size: 12px;
}
.action {
height: 100%;
.button {
display: inline-block;
padding: 0 11px;
height: 100%;
color: white;
display: flex;
align-items: center;
}
}
:deep(.badge) {
.wd-badge__content {
// padding: 20rpx 20rpx;
width: auto;
display: flex;
line-height: 30rpx;
height: 40rpx;
display: flex;
align-items: center;
justify-content: center;
padding-right: 20rpx;
padding-left: 20rpx;
top: 16rpx !important;
right: 20rpx !important;
border-radius: 100px !important;
box-sizing: border-box;
}
}
</style>