list.vue 5.88 KB
<template>
	<view>
		<z-paging ref="paging" v-show="total>0" v-model="list" @query="getQuery" emptyViewImg="/static/nodata.png">
			<view class="searchbar" :slot="top">
				<uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
					v-model="query.name" @blur="getList" @clear="getList" placeholder="搜索姓名">
				</uni-easyinput>

			</view>
			<view class="pdbox">

				<view class="personitem" v-for="(n,index) in list" :key="index">
					<uni-swipe-action>
						<uni-swipe-action-item>
							<view class="content-box" :class="{ normal: isNormalMember(n) }" @click="handleInfo(n)">
								<view v-if="isNormalMember(n)" class="normal-corner">正常会员</view>
								<view class="flexbox" style="flex: 1 1 auto;">
									<view class="photobox">
										<image class="photo" v-if="n.photo" :src="n.photo" mode='aspectFill'></image>
										<view class="colorful" v-else>{{n.name.slice(0,1)}}</view>
									</view>
									<view class="member-info">
										<view class="member-name">
											{{n.name}} <text class="date">({{n.perCode || '--'}})</text>
										</view>
										<view class="validity-line">有效期:{{ formatValidityDate(n.validityDate) }}</view>
									</view>
								</view>
					
							</view>
							<template v-slot:right>
								<view class="slot-button">
									<!-- <view class="edit-button" @click="handleUpdate(n)">
										<uni-icons type="compose" color="#fff" size="20"></uni-icons>
										<text class="slot-button-text">编辑</text>
									</view> -->
									<view class="danger-button" @click="handleDelete(n)">
										<uni-icons type="trash" color="#fff" size="20"></uni-icons>
										<text class="slot-button-text">删除</text>
									</view>
								</view>
							</template>
						</uni-swipe-action-item>
					</uni-swipe-action>
				</view>
				
			</view>
		</z-paging>
		<view class="nodata" v-if="list.length==0">
			<!-- <image mode="aspectFit" :src="config.baseUrl_api + '/fs/static/nodata.png'"></image> -->
			<button class="btn-red" v-if="userType=='4'" @click="goVipList">+ 添加会员</button>
			<!-- <text v-else>暂无数据</text> -->
		</view>
	</view>
</template>

<script setup>
	import * as api from '@/common/api.js'
	import { fillImgUrl } from '@/common/utils.js'
	import {
		onMounted,
		ref
	} from 'vue'
	import {
		onLoad,onShow
	} from '@dcloudio/uni-app'
	const query = ref({
		pageNum: 1,
		pageSize: 20,
		showMyPersonFlag: null,
		multiDeptFlag: 1,
		perType: 1,
		checkPaymentCommit: 1
	})
	const paging = ref(null)
	const userType = ref('')
	const list = ref([])
	const total = ref(0)
	const app = getApp();
	onLoad(() => {
		userType.value = app.globalData.userType
	})
	onShow(() => {
		getList()
	})
	function getQuery(pageNum,pageSize){
		query.value.pageNum = pageNum
		query.value.pageSize = pageSize
		if (app.globalData.userType == '4') {
			// 道馆
			query.value.multiDeptFlag = null
			query.value.showMyPersonFlag = 1
		}
		api.selectPageList(query.value).then(res => {
			const rows = formatRows(res.rows || [])
			list.value = rows
			paging.value.complete(rows)
			total.value = res.total
		})
	}
	function getList() {
		uni.showLoading({
			title: '加载中'
		})
		if (app.globalData.userType == '4') {
			// 道馆
			query.value.multiDeptFlag = null
			query.value.showMyPersonFlag = 1
		}
		api.selectPageList(query.value).then(res => {
			const rows = formatRows(res.rows || [])
			list.value = rows
			paging.value.complete(rows)
			total.value = res.total
			uni.hideLoading()
		})
	}

	function formatRows(rows) {
		return rows.map(item => ({
			...item,
			photo: fillImgUrl(item.photo)
		}))
	}

	function handleDelete(item) {
		uni.showModal({
			content: `是否确认删除${item.name}`,
			success: function(res) {
				if (res.confirm) {
					api.delInfo(item.perId).then(response => {
						uni.showToast({
							title: '删除成功',
							icon: 'none'
						})
						getList()
					})
				}
			}
		})
	}

	function handleUpdate(n) {
		uni.navigateTo({
			url: `/personalVip/editVip?perId=${n.perId}&perType=${n.perType}`
		})
	}

	function handleInfo(n) {
		uni.navigateTo({
			url: `/personalVip/detail?perId=${n.perId}`
		})
	}

	function isNormalMember(item) {
		return String(item.certStage) === '3'
	}

	function formatValidityDate(value) {
		return value ? String(value).slice(0, 10) : '--'
	}

	function goVipList() {
		let path = '/personalVip/addVip';
		uni.navigateTo({
			url: path
		});
	}
</script>

<style scoped lang="scss">
	.personitem{margin: 0 0 30rpx;}
	.searchbar {
		display: flex;
		align-items: center;
		padding: 25rpx;
		box-sizing: border-box;

		.invertedbtn-red {
			margin-left: 15rpx;
			font-size: 30rpx;
			padding: 16rpx 20rpx;
			box-sizing: border-box;
			border-radius: 50rpx;
			background-color: #fff;
		}

		:deep(.uni-easyinput .uni-easyinput__content) {
			border-radius: 35rpx;
			border: none;
			height: 70rpx;
		}

		:deep(.uni-easyinput__content-input) {
			font-size: 26rpx;
		}
	}

	.content-box {
		position: relative;
		background: #fff;
		overflow: hidden;
		.photobox{margin-right: 20rpx;
		}
	}
	.content-box.normal {
		background: linear-gradient(135deg, #fff3f4 0%, #ffffff 58%, #fff0f1 100%);
		border: 1rpx solid rgba(196, 18, 27, 0.22);
		box-shadow: 0 10rpx 26rpx rgba(196, 18, 27, 0.12);
	}
	.normal-corner {
		position: absolute;
		top: 0;
		right: 0;
		padding: 8rpx 18rpx;
		border-radius: 0 0 0 20rpx;
		background: linear-gradient(135deg, #C4121B 0%, #e24a52 100%);
		color: #fff;
		font-size: 22rpx;
		font-weight: 600;
	}
	.member-info {
		min-width: 0;
		padding-right: 120rpx;
	}
	.member-name {
		color: #222;
		font-size: 30rpx;
		font-weight: 600;
		line-height: 1.4;
	}
	.validity-line {
		margin-top: 8rpx;
		color: #777;
		font-size: 24rpx;
		line-height: 1.4;
	}
	.pdbox{padding: 0 20rpx;}
</style>