郭鹏飞 8 mēneši atpakaļ
vecāks
revīzija
07f62a362a
1 mainītis faili ar 379 papildinājumiem un 0 dzēšanām
  1. 379 0
      src/pages/demo/tc.vue

+ 379 - 0
src/pages/demo/tc.vue

@@ -0,0 +1,379 @@
+<template>
+	<view class="page-container">
+		<view class="top-bg-gradient"></view>
+
+		<u-navbar 
+			title="技师中心" 
+			:placeholder="true" 
+			bgColor="transparent" 
+			leftIconColor="#000" 
+			titleStyle="font-weight:bold;"
+		>
+			<view slot="right">
+				<u-icon name="more-dot-fill" size="24" color="#000"></u-icon>
+			</view>
+		</u-navbar>
+
+		<view class="header-content">
+			<view class="card profile-card">
+				<view class="profile-left">
+					<u-avatar :src="userInfo.avatar" size="50"></u-avatar>
+					<view class="info">
+						<view class="name-row">
+							<text class="name">{{ userInfo.name }}</text>
+							<u-icon name="map-fill" color="#1ecbc3" size="14"></u-icon>
+						</view>
+						<view class="address">{{ userInfo.address }}</view>
+					</view>
+				</view>
+				<u-button 
+					text="更换位置" 
+					color="#1ecbc3" 
+					shape="circle" 
+					size="small" 
+					customStyle="height: 28px; font-size: 12px; padding: 0 15px;"
+				></u-button>
+			</view>
+
+			<view class="card stats-card">
+				<view class="stats-row">
+					<view class="stat-item">
+						<view class="label">本月订单数</view>
+						<view class="value-box">
+							<text class="value green">{{ stats.orderCount }}</text> <text class="unit">单</text>
+						</view>
+					</view>
+					<view class="stat-item">
+						<view class="label">本月在线时长</view>
+						<view class="value-box">
+							<text class="value green">{{ stats.onlineHours }}</text> <text class="unit">时</text>
+						</view>
+					</view>
+					<view class="stat-item">
+						<view class="label">本月营业额</view>
+						<view class="value-box">
+							<text class="value green">{{ stats.revenue }}</text> <text class="unit">元</text>
+						</view>
+					</view>
+				</view>
+				<u-line margin="20rpx 0" dashed color="#eee"></u-line>
+				<view class="stats-row bottom-row">
+					<view class="stat-item">
+						<view class="label">余额</view>
+						<view class="value-box">
+							<text class="value orange">{{ stats.balance }}</text> <text class="unit">元</text>
+						</view>
+					</view>
+					<view class="stat-item">
+						<view class="label">可提现</view>
+						<view class="value-box">
+							<text class="value orange">{{ stats.withdrawable }}</text> <text class="unit">元</text>
+						</view>
+					</view>
+					<view class="stat-btn">
+						<u-button text="申请提现" color="#ff9900" shape="circle" size="small"></u-button>
+					</view>
+				</view>
+			</view>
+
+			<view class="card status-card">
+				<view class="status-header">
+					<view class="status-text">
+						<u-icon name="empty-data" size="20" color="#999"></u-icon>
+						<text style="margin-left: 10rpx;">休息中</text>
+					</view>
+					<u-button text="上线" color="#1ecbc3" shape="circle" size="small" customStyle="width: 80px;"></u-button>
+				</view>
+				<view style="margin-top: 20rpx;">
+					<u-button text="报警/求助" color="#f56c6c" shape="circle"></u-button>
+				</view>
+			</view>
+
+			<view class="card function-card">
+				<u-grid :border="false" col="5">
+					<u-grid-item v-for="(item, index) in functionList" :key="index" customStyle="padding: 20rpx 0;">
+						<u-icon :name="item.icon" :size="28" color="#333"></u-icon>
+						<text class="grid-text">{{ item.title }}</text>
+					</u-grid-item>
+				</u-grid>
+			</view>
+		</view>
+
+		<u-sticky bgColor="#F6F7F9" offset-top="0">
+			<view class="tabs-container">
+				<u-tabs 
+					:list="tabList" 
+					:current="currentTab" 
+					lineColor="#1ecbc3" 
+					activeColor="#1ecbc3"
+					:scrollable="false"
+					itemStyle="padding-left: 10px; padding-right: 10px; height: 44px;"
+					@click="changeTab"
+				></u-tabs>
+			</view>
+		</u-sticky>
+
+		<view class="list-container">
+			<z-paging 
+				ref="paging" 
+				v-model="dataList" 
+				@query="queryList" 
+                :fixed="false"
+				:use-page-scroll="true"
+				:refresher-enabled="false" 
+			>
+				<view class="order-item" v-for="(item, index) in dataList" :key="index">
+					<view class="order-header">
+						<text class="time">上门时间:{{ item.serviceDate }}</text>
+						<text class="status" :class="getStatusClass(item.status)">{{ item.statusText }}</text>
+					</view>
+					
+					<view class="order-content">
+						<view class="row">
+							<text class="label">客户姓名:</text>
+							<text class="val">{{ item.customerName }}</text>
+						</view>
+						<view class="row">
+							<text class="label">项目名称:</text>
+							<text class="val">{{ item.projectName }}</text>
+						</view>
+						<view class="row">
+							<text class="label">下单时间:</text>
+							<text class="val">{{ item.createTime }}</text>
+						</view>
+					</view>
+
+					<view class="order-footer">
+						<view class="price">¥ {{ item.price }}</view>
+						<view class="actions">
+							<template v-if="item.status === 1">
+								<u-button text="取消订单" size="mini" shape="circle" plain customStyle="margin-right: 10rpx;"></u-button>
+								<u-button text="转单" size="mini" shape="circle" color="#f56c6c"></u-button>
+							</template>
+							<template v-else-if="item.status === 3">
+								<u-button text="拒绝退款" size="mini" shape="circle" color="#f56c6c" customStyle="margin-right: 10rpx;"></u-button>
+								<u-button text="同意退款" size="mini" shape="circle" color="#1ecbc3"></u-button>
+							</template>
+						</view>
+					</view>
+				</view>
+				
+			</z-paging>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				// 模拟数据
+				userInfo: {
+					name: '郭丽丽',
+					avatar: 'https://cdn.uviewui.com/uview/album/1.jpg',
+					address: '山西省太原市古交市东曲街道...'
+				},
+				stats: {
+					orderCount: 12,
+					onlineHours: 3.55,
+					revenue: '21893.98',
+					balance: '3324.9',
+					withdrawable: '8127.43'
+				},
+				functionList: [
+					{ title: '订单', icon: 'order' },
+					{ title: '设置免车费', icon: 'car' },
+					{ title: '编辑资料', icon: 'edit-pen' },
+					{ title: '我的分销码', icon: 'scan' },
+					{ title: '合同签订', icon: 'file-text' }
+				],
+				tabList: [
+					{ name: '全部' }, { name: '进行中' }, { name: '已完成' }, 
+					{ name: '待付款' }, { name: '已取消' }, { name: '售后' }
+				],
+				currentTab: 0,
+				dataList: []
+			}
+		},
+		// 必须监听:页面滚动和触底,传递给 z-paging
+		onPageScroll(e) {
+			// 如果你的 z-paging 版本较新,且开启了 use-page-scroll,通常它会自动监听
+			// 但显式调用更安全,用于处理回到顶部等功能
+			this.$refs.paging && this.$refs.paging.updatePageScroll(e);
+		},
+		onReachBottom() {
+			// 页面触底时,通知 z-paging 加载更多
+			this.$refs.paging && this.$refs.paging.pageReachBottom();
+		},
+		methods: {
+			changeTab(item) {
+				this.currentTab = item.index;
+				this.$refs.paging.reload();
+			},
+			queryList(pageNo, pageSize) {
+				// 模拟请求
+				setTimeout(() => {
+					const list = [];
+					for(let i = 0; i < 5; i++) {
+						const statusType = (i % 3) + 1;
+						list.push({
+							id: i,
+							serviceDate: '今天10:00-11:00',
+							status: statusType,
+							statusText: ['待接单', '已接单', '退款申请中'][statusType-1],
+							customerName: '陈思成',
+							projectName: '泰式 · 王室古法SPA',
+							createTime: '2025-09-14 12:08',
+							price: '493.4'
+						});
+					}
+					this.$refs.paging.complete(list);
+				}, 1000);
+			},
+			getStatusClass(status) {
+				return 'text-blue';
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.page-container {
+		min-height: 100vh;
+		background-color: #F6F7F9;
+		position: relative;
+		/* 防止外边距塌陷 */
+		padding-top: 1rpx; 
+		padding-bottom: 40rpx;
+	}
+
+	/* 背景渐变 - 固定在最底层 */
+	.top-bg-gradient {
+		position: absolute;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 400rpx;
+		background: linear-gradient(to bottom, #dffbf9 0%, #F6F7F9 100%);
+		z-index: 0;
+	}
+
+	/* 头部内容 - 相对定位,层级高于背景 */
+	.header-content {
+		position: relative;
+		z-index: 1;
+		padding: 0 20rpx;
+	}
+
+	.card {
+		background: #fff;
+		border-radius: 20rpx;
+		margin-bottom: 20rpx;
+		box-shadow: 0 4rpx 16rpx rgba(0,0,0,0.02);
+		padding: 30rpx;
+	}
+
+	/* 个人信息 */
+	.profile-card {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		margin-top: 10rpx;
+		.profile-left {
+			display: flex;
+			align-items: center;
+			.info {
+				margin-left: 20rpx;
+				.name { font-size: 32rpx; font-weight: bold; margin-right: 10rpx; }
+				.address { font-size: 24rpx; color: #999; }
+			}
+		}
+	}
+
+	/* 数据统计 */
+	.stats-card {
+		padding: 30rpx 20rpx;
+		.stats-row {
+			display: flex;
+			justify-content: space-between;
+			.stat-item {
+				flex: 1;
+				text-align: center;
+				.label { font-size: 24rpx; color: #666; margin-bottom: 8rpx; }
+				.value { font-size: 32rpx; font-weight: bold; }
+				.unit { font-size: 22rpx; color: #999; margin-left: 4rpx; }
+				.green { color: #1ecbc3; }
+				.orange { color: #ff9900; }
+			}
+		}
+		.bottom-row {
+			align-items: center;
+			.stat-btn { flex: 1; display: flex; justify-content: flex-end; }
+		}
+	}
+
+	/* 状态栏 */
+	.status-card {
+		.status-header {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			color: #999;
+		}
+	}
+
+	/* 功能宫格 */
+	.function-card {
+		padding: 10rpx 0;
+		.grid-text { font-size: 24rpx; color: #666; margin-top: 14rpx; }
+	}
+
+	/* Tabs */
+	.tabs-container {
+		background-color: #F6F7F9;
+		padding-bottom: 10rpx;
+		z-index: 99; /* 保证吸顶时在列表上方 */
+	}
+
+	/* 列表区域 */
+	.list-container {
+		position: relative;
+		z-index: 1;
+		padding: 0 20rpx;
+	}
+
+	.order-item {
+		background: #fff;
+		border-radius: 20rpx;
+		padding: 30rpx;
+		margin-bottom: 20rpx;
+		
+		.order-header {
+			display: flex;
+			justify-content: space-between;
+			margin-bottom: 20rpx;
+			font-size: 30rpx;
+			font-weight: bold;
+			.text-blue { color: #5ac8fa; font-weight: normal; font-size: 28rpx;}
+		}
+		.order-content {
+			margin-bottom: 20rpx;
+			.row {
+				display: flex;
+				margin-bottom: 10rpx;
+				font-size: 26rpx;
+				.label { color: #999; width: 150rpx; }
+				.val { color: #666; }
+			}
+		}
+		.order-footer {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			border-top: 1rpx solid #f5f5f5;
+			padding-top: 20rpx;
+			.price { color: #fa3534; font-size: 36rpx; font-weight: bold; }
+			.actions { display: flex; }
+		}
+	}
+</style>