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.

299 lines
7.6 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view class="content">
<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> -->
<view class=" bg-white sticky top-0 z-50 flex items-center">
<view class="flex-1">
<wd-search @search="search({ value: params.keywords })" @clear="search({ value: params.keywords = '' })"
v-model="params.keywords" hide-cancel>
<template #prefix>
<wd-popover v-model="popover" mode="menu" :content="menu" @menuclick="changeSearchType">
<view class="search-type">
<text>{{ searchType }}</text>
<wd-icon custom-class="icon-arrow" name="fill-arrow-down"></wd-icon>
</view>
</wd-popover>
</template>
</wd-search>
</view>
<div class="mr-2">
<wd-button @click="utils.toUrl('/store/user/memberList')" size="small">用户等级</wd-button>
</div>
</view>
<div class="grid p-2">
<yList height="91vh" ref="yListRef" :apiObj="user.userList" :params="{ ...params }">
<template #default="{ list: userList }">
<div v-for="user of userList" class="rounded-md overflow-hidden">
<wd-card class="rounded-md overflow-hidden" type="rectangle">
<template #title>
<view class="title">
<view>ID{{ user.id }}</view>
<view @click="utils.copy(user.user_merge.mobile)" class="title-tip" v-if="user.user_merge">
{{ user.user_merge.mobile }}
<wd-icon name="file-copy" size="14px"></wd-icon>
</view>
</view>
</template>
<view style="height: 40px;" class="userBox">
<image mode="aspectFill" :src="user.avatar_pic" :alt="user.name"
style="width: 60px;height: 60px;border-radius: 4px; margin-right: 12px;" />
<view>
<view style="color: rgba(0,0,0,0.85); font-size: 16px;">
{{ user.nickname }}
<wd-tag v-if="user.user_merge" class="mx-1" size="small" type="success">
v {{ user.user_merge.member_level }}
</wd-tag>
</view>
<view style="color: rgba(0,0,0,0.25); font-size: 12px;">
<wd-tag class="mx-1" size="small" :type="originType[user.origin]">
{{ user.origin_text }}
</wd-tag>
</view>
</view>
</view>
<template #footer>
<view v-if="user.user_merge" class="bg-gray-50 p-2 flex justify-between" style="font-size: 22rpx;">
<view>余额:{{ user.user_merge.balance }} </view>
<view>积分:{{ user.user_merge.integral }} </view>
<view>佣金:{{ user.user_merge.money }} </view>
</view>
<view v-if="user.user_merge" class="h-2 opacity-0 text-white">·</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/edit?id=' + user.id)" size="small"
style="margin-right: 0px;">详情</wd-button>
</view>
</view>
</template>
</wd-card>
</div>
</template>
</yList>
</div>
<!-- <view class="h-[64px]"></view>
<view class="fixed left-2 right-2 bottom-4 z-50">
<myTabbar tab="user"></myTabbar>
</view> -->
<wd-toast />
<wd-message-box></wd-message-box>
</view>
</template>
<script setup>
import { ref } from 'vue';
import utils from '@/utils/utils.js';
import user from '@/api/store/user.js';
import myTabbar from "../components/myTabbar/index.vue";
import kevyloading from "@/components/kevy-loading/kevy-loading";
import { useMessage } from '@/uni_modules/wot-design-uni';
import { useToast } from '@/uni_modules/wot-design-uni'
import yList from "/components/yList/index.vue";
import {
onShow,
} from "@dcloudio/uni-app";
const toast = useToast()
const message1 = useMessage();
const originType = ref({
100: 'success',
101: 'success',
200: 'info',
201: 'danger',
300: 'warning',
})
const yListRef = ref(null);
const searchType = ref('昵称');
const popover = ref(false);
const search = ({ value }) => {
if (searchType.value == '昵称') {
yListRef.value.upData({
nickname: params.value.keywords,
mobile: ''
});
}
if (searchType.value == '手机号') {
yListRef.value.upData({
nickname: '',
mobile: params.value.keywords
});
}
};
const menu = ref([
{ content: '昵称' },
{ content: '手机号' },
]);
const params = ref({
nickname: "",
mobile: "",
origin: '',
value: ''
});
/**
* 切换搜索类型
* @param {Object} item - 切换的项
*/
function changeSearchType({ item, index }) {
searchType.value = item.content;
search(params.value.keywords)
}
/**
* @type {Ref<boolean>}
* 控制页面加载状态的 Ref
*/
const loading = ref(false);
/**
* 从本地存储中获取用户信息
*/
const user_info = uni.getStorageSync("user_info");
const userList = ref({});
const changeS = (row) => {
user.editStatus({
id: row.id,
status: [1, 0][row.status],
}).then(res => {
if (res.code == 0) {
toast.success('操作成功')
row.status = [1, 0][row.status]
} else {
showNotify({ type: 'error', message: '出错了' })
}
})
}
const syncGoods = (row) => {
message1
.confirm({
title: '同步商品',
})
.then((resp) => {
toast.loading('请稍后...')
user.synchronousGoods({
id: row.id,
}).then(res => {
if (res.code == 0) {
toast.success('同步成功');
} else {
toast.error('同步失败');
}
});
})
.catch((error) => {
console.log(error);
});
};
/**
* 获取数据的函数
*/
// const getuserList = () => {
// loading.value = true
// user.list().then(res => {
// userList.value = res.data;
// userList.value.ok = true;
// loading.value = false
// });
// };
// 初始化调用获取一行数据
onShow(() => {
// getuserList();
})
</script>
<style lang="scss" scoped>
.search-type {
position: relative;
height: 30px;
line-height: 30px;
padding: 0 8px 0 16px;
font-size: 24rpx;
color: rgba(0, 0, 0, .45);
}
.search-type::after {
position: absolute;
content: '';
width: 1px;
right: 0;
top: 5px;
bottom: 5px;
background: rgba(0, 0, 0, 0.25);
}
.search-type {
:deep(.icon-arrow) {
display: inline-block;
font-size: 20px;
vertical-align: middle;
}
}
.userBox,
.title {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
.userBox {
justify-content: flex-start;
}
.title {
justify-content: space-between;
}
.title-tip {
color: rgba(0, 0, 0, 0.25);
font-size: 12px;
}
</style>