4 changed files with 585 additions and 1 deletions
@ -0,0 +1,571 @@ |
|||||
|
<template> |
||||
|
<view class="container"> |
||||
|
<!-- 搜索框 --> |
||||
|
<view class="search-container"> |
||||
|
<u-search |
||||
|
v-model="searchPhone" |
||||
|
placeholder="请输入手机号" |
||||
|
:show-action="false" |
||||
|
:clearabled="true" |
||||
|
bg-color="#fff" |
||||
|
shape="square" |
||||
|
@search="handleSearch" |
||||
|
@clear="handleClear" |
||||
|
> |
||||
|
<template v-slot:prefix> |
||||
|
<u-icon name="search" size="16" color="#999"></u-icon> |
||||
|
</template> |
||||
|
</u-search> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 预约列表 --> |
||||
|
<view class="appointment-list"> |
||||
|
<scroll-view scroll-y="true"> |
||||
|
<view |
||||
|
class="appointment-card" |
||||
|
v-for="item in filteredAppointmentList" |
||||
|
:key="item.id" |
||||
|
> |
||||
|
<!-- 卡片头部 --> |
||||
|
<view class="card-header"> |
||||
|
<u-icon name="home" size="16" color="#08B3B3"></u-icon> |
||||
|
<text class="community-info" |
||||
|
>{{ item.community }} | {{ item.houseType }}</text |
||||
|
> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 卡片内容 --> |
||||
|
<view class="card-content"> |
||||
|
<view class="info-row"> |
||||
|
<text class="label">预约人:</text> |
||||
|
<text class="value">{{ item.appointee }}</text> |
||||
|
</view> |
||||
|
<view class="info-row"> |
||||
|
<text class="label">预约人电话:</text> |
||||
|
<text class="value">{{ item.phone }}</text> |
||||
|
</view> |
||||
|
<view class="info-row"> |
||||
|
<text class="label">预约时间:</text> |
||||
|
<text class="value">{{ item.appointmentTime }}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 操作按钮 --> |
||||
|
<view class="actionButtons"> |
||||
|
<button class="btn process" @click="handleViewHouse(item)"> |
||||
|
看房登记 |
||||
|
</button> |
||||
|
</view> |
||||
|
</view> |
||||
|
</scroll-view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 空状态 --> |
||||
|
<u-empty |
||||
|
v-if="filteredAppointmentList.length === 0 && !loading" |
||||
|
text="暂无预约信息" |
||||
|
mode="list" |
||||
|
></u-empty> |
||||
|
|
||||
|
<!-- 加载状态 --> |
||||
|
<u-loading-page |
||||
|
v-if="loading" |
||||
|
:loading="true" |
||||
|
text="加载中..." |
||||
|
></u-loading-page> |
||||
|
|
||||
|
<!-- 看房登记弹框 --> |
||||
|
<u-popup |
||||
|
:show="showRegisterPopup" |
||||
|
mode="center" |
||||
|
:round="16" |
||||
|
@close="handleClosePopup" |
||||
|
bgColor="transparent" |
||||
|
> |
||||
|
<view class="register-popup" @click="showStatusDropdown = false"> |
||||
|
<view class="popup-close" @click.stop="handleClosePopup"> |
||||
|
<u-icon |
||||
|
name="/static/img/close-circle.png" |
||||
|
size="22" |
||||
|
color="#666" |
||||
|
></u-icon> |
||||
|
</view> |
||||
|
<view class="popup-title" style="letter-spacing: 1rpx">看房登记</view> |
||||
|
|
||||
|
<view class="form-container"> |
||||
|
<!-- 看房状态 --> |
||||
|
<view class="form-item"> |
||||
|
<text class="required">*</text> |
||||
|
<text class="form-label"> 看房状态 </text> |
||||
|
<view class="dropdown" @click.stop="toggleStatusDropdown"> |
||||
|
<u-input |
||||
|
v-model="viewingStatusText" |
||||
|
placeholder="请选择看房状态" |
||||
|
:disabled="true" |
||||
|
:border="true" |
||||
|
shape="round" |
||||
|
:custom-style="{ backgroundColor: '#fff' }" |
||||
|
> |
||||
|
<template v-slot:suffix> |
||||
|
<u-icon |
||||
|
:class="{ 'arrow-open': showStatusDropdown }" |
||||
|
name="arrow-down" |
||||
|
size="14" |
||||
|
color="#999" |
||||
|
></u-icon> |
||||
|
</template> |
||||
|
</u-input> |
||||
|
<view v-if="showStatusDropdown" class="dropdown-list"> |
||||
|
<view |
||||
|
v-for="opt in statusColumns" |
||||
|
:key="opt.value" |
||||
|
class="dropdown-item" |
||||
|
@click.stop="selectStatus(opt)" |
||||
|
> |
||||
|
{{ opt.text }} |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 看房说明 --> |
||||
|
<view class="form-item" style="flex-direction: column"> |
||||
|
<text class="form-label">看房说明</text> |
||||
|
<u-textarea |
||||
|
v-model="viewingDescription" |
||||
|
placeholder="请输入看房说明" |
||||
|
:border="true" |
||||
|
shape="round" |
||||
|
:custom-style="{ backgroundColor: '#fff' }" |
||||
|
:maxlength="200" |
||||
|
:count="true" |
||||
|
></u-textarea> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 操作按钮 --> |
||||
|
<view class="popup-actions"> |
||||
|
<u-button |
||||
|
type="default" |
||||
|
plain |
||||
|
:custom-style="{ |
||||
|
background: '#ffffff', |
||||
|
color: '#B0B0B0', |
||||
|
borderColor: '#D7D7D7', |
||||
|
height: '35px', |
||||
|
}" |
||||
|
shape="circle" |
||||
|
@click="handleCancel" |
||||
|
> |
||||
|
取消 |
||||
|
</u-button> |
||||
|
<u-button |
||||
|
type="primary" |
||||
|
:custom-style="{ |
||||
|
background: '#22C1C3', |
||||
|
color: '#ffffff', |
||||
|
borderColor: '#22C1C3', |
||||
|
height: '35px', |
||||
|
}" |
||||
|
shape="circle" |
||||
|
@click="handleConfirm" |
||||
|
> |
||||
|
确定 |
||||
|
</u-button> |
||||
|
</view> |
||||
|
</view> |
||||
|
</u-popup> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
data() { |
||||
|
return { |
||||
|
searchPhone: "", // 搜索手机号 |
||||
|
loading: false, // 加载状态 |
||||
|
appointmentList: [ |
||||
|
{ |
||||
|
id: 1, |
||||
|
community: "西海岸路乐业社区", |
||||
|
houseType: "三居室", |
||||
|
appointee: "杨斌", |
||||
|
phone: "13362000010", |
||||
|
appointmentTime: "2025-08-06 上午09:00-12:00", |
||||
|
idCard: "370832199606062001", |
||||
|
}, |
||||
|
{ |
||||
|
id: 2, |
||||
|
community: "西海岸路乐业社区", |
||||
|
houseType: "三居室", |
||||
|
appointee: "曲曼", |
||||
|
phone: "17700020202", |
||||
|
appointmentTime: "2025-08-06 上午09:00-12:00", |
||||
|
idCard: "370832199606062002", |
||||
|
}, |
||||
|
], |
||||
|
showRegisterPopup: false, // 看房登记弹框显示状态 |
||||
|
currentAppointment: {}, // 当前选中的预约信息 |
||||
|
viewingStatus: "1", // 看房状态 (1: 已看房, 2: 未看房) |
||||
|
viewingStatusText: "已看房", // 看房状态文本 |
||||
|
viewingDescription: "", // 看房说明 |
||||
|
showStatusDropdown: false, // 看房状态下拉 |
||||
|
statusColumns: [ |
||||
|
{ |
||||
|
text: "已看房", |
||||
|
value: "1", |
||||
|
}, |
||||
|
], |
||||
|
}; |
||||
|
}, |
||||
|
computed: { |
||||
|
// 过滤后的预约列表 |
||||
|
filteredAppointmentList() { |
||||
|
if (!this.searchPhone) { |
||||
|
return this.appointmentList; |
||||
|
} |
||||
|
return this.appointmentList.filter( |
||||
|
(item) => |
||||
|
item.phone.includes(this.searchPhone) || |
||||
|
item.appointee.includes(this.searchPhone) |
||||
|
); |
||||
|
}, |
||||
|
}, |
||||
|
onLoad() { |
||||
|
this.loadAppointmentList(); |
||||
|
}, |
||||
|
// 下拉刷新 |
||||
|
onPullDownRefresh() { |
||||
|
this.loadAppointmentList(); |
||||
|
}, |
||||
|
// 上拉加载 |
||||
|
onReachBottom() {}, |
||||
|
methods: { |
||||
|
// 加载预约列表 |
||||
|
loadAppointmentList() { |
||||
|
this.loading = true; |
||||
|
// 模拟API调用 |
||||
|
setTimeout(() => { |
||||
|
this.loading = false; |
||||
|
// 停止下拉刷新 |
||||
|
uni.stopPullDownRefresh(); |
||||
|
}, 1000); |
||||
|
}, |
||||
|
|
||||
|
// 搜索预约 |
||||
|
handleSearch(value) { |
||||
|
console.log("搜索:", value); |
||||
|
// 搜索逻辑通过computed属性自动处理 |
||||
|
}, |
||||
|
|
||||
|
// 清空搜索 |
||||
|
handleClear() { |
||||
|
this.searchPhone = ""; |
||||
|
}, |
||||
|
|
||||
|
// 看房登记 |
||||
|
handleViewHouse(item) { |
||||
|
this.currentAppointment = item; |
||||
|
this.viewingStatus = item.viewingStatus || "1"; // 如果有已有的看房状态,则使用 |
||||
|
this.viewingStatusText = |
||||
|
this.statusColumns.find((col) => col.value === this.viewingStatus) |
||||
|
?.text || "已看房"; |
||||
|
this.viewingDescription = item.viewingDescription || ""; |
||||
|
this.showRegisterPopup = true; |
||||
|
}, |
||||
|
|
||||
|
// 关闭弹框 |
||||
|
handleClosePopup() { |
||||
|
this.showRegisterPopup = false; |
||||
|
this.currentAppointment = {}; |
||||
|
this.viewingStatus = "1"; |
||||
|
this.viewingStatusText = "已看房"; |
||||
|
this.viewingDescription = ""; |
||||
|
this.showStatusDropdown = false; |
||||
|
}, |
||||
|
|
||||
|
// 内联下拉切换与选择 |
||||
|
toggleStatusDropdown() { |
||||
|
this.showStatusDropdown = !this.showStatusDropdown; |
||||
|
}, |
||||
|
selectStatus(opt) { |
||||
|
this.viewingStatus = opt.value; |
||||
|
this.viewingStatusText = opt.text; |
||||
|
this.showStatusDropdown = false; |
||||
|
}, |
||||
|
|
||||
|
// 确定看房登记 |
||||
|
handleConfirm() { |
||||
|
if (!this.viewingStatus) { |
||||
|
uni.showToast({ |
||||
|
title: "请选择看房状态", |
||||
|
icon: "none", |
||||
|
}); |
||||
|
return; |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
// 取消看房登记 |
||||
|
handleCancel() { |
||||
|
this.handleClosePopup(); |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.container { |
||||
|
min-height: 100vh; |
||||
|
background-color: #f8f8f8; |
||||
|
padding: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.search-container { |
||||
|
margin-bottom: 30rpx; |
||||
|
} |
||||
|
|
||||
|
.appointment-list { |
||||
|
.appointment-card { |
||||
|
background-color: #fff; |
||||
|
border-radius: 16rpx; |
||||
|
padding: 30rpx; |
||||
|
margin-bottom: 20rpx; |
||||
|
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.05); |
||||
|
position: relative; |
||||
|
transition: all 0.3s ease; |
||||
|
|
||||
|
&:active { |
||||
|
transform: scale(0.98); |
||||
|
} |
||||
|
|
||||
|
.card-header { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
margin-bottom: 24rpx; |
||||
|
|
||||
|
.community-info { |
||||
|
margin-left: 16rpx; |
||||
|
font-size: 32rpx; |
||||
|
font-weight: 600; |
||||
|
color: #333; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.card-content { |
||||
|
background: #fbfbfb; |
||||
|
padding: 20rpx; |
||||
|
|
||||
|
.info-row { |
||||
|
display: flex; |
||||
|
margin-bottom: 16rpx; |
||||
|
|
||||
|
&:last-child { |
||||
|
margin-bottom: 0; |
||||
|
} |
||||
|
|
||||
|
.label { |
||||
|
color: #999; |
||||
|
font-size: 28rpx; |
||||
|
min-width: 160rpx; |
||||
|
text-align: right; |
||||
|
} |
||||
|
|
||||
|
.value { |
||||
|
color: #333; |
||||
|
font-size: 28rpx; |
||||
|
flex: 1; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.actionButtons { |
||||
|
display: flex; |
||||
|
justify-content: flex-end; |
||||
|
align-items: center; |
||||
|
margin-top: 20rpx; |
||||
|
margin-left: auto; |
||||
|
gap: 20rpx; |
||||
|
width: fit-content; |
||||
|
} |
||||
|
|
||||
|
.btn { |
||||
|
height: 52rpx; |
||||
|
line-height: 46rpx; |
||||
|
border-radius: 52rpx; |
||||
|
background-color: rgba(255, 255, 255, 1); |
||||
|
color: rgba(8, 179, 179, 1); |
||||
|
font-size: 28rpx; |
||||
|
text-align: center; |
||||
|
font-family: AlibabaPuHui-regular; |
||||
|
border: 2rpx solid rgba(8, 179, 179, 1); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* 看房登记弹框样式 */ |
||||
|
.register-popup { |
||||
|
width: 76%; |
||||
|
padding: 36rpx 50rpx 32rpx; |
||||
|
background: radial-gradient( |
||||
|
110% 140% at 80% 0%, |
||||
|
rgba(35, 217, 208, 0.35) 0%, |
||||
|
rgba(35, 217, 208, 0.18) 22%, |
||||
|
rgba(255, 255, 255, 0) 60% |
||||
|
), |
||||
|
radial-gradient( |
||||
|
120% 140% at 0% 100%, |
||||
|
rgba(255, 173, 199, 0.28) 0%, |
||||
|
rgba(255, 173, 199, 0.12) 28%, |
||||
|
rgba(255, 255, 255, 0) 58% |
||||
|
), |
||||
|
#ffffff; |
||||
|
border-radius: 45rpx; |
||||
|
box-shadow: 0 12rpx 28rpx rgba(0, 0, 0, 0.18); |
||||
|
border: 1rpx solid rgba(0, 0, 0, 0.06); |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
align-items: center; |
||||
|
position: relative; |
||||
|
|
||||
|
.popup-close { |
||||
|
position: absolute; |
||||
|
top: -35rpx; |
||||
|
right: -48rpx; |
||||
|
} |
||||
|
|
||||
|
.popup-title { |
||||
|
font-size: 40rpx; |
||||
|
font-weight: 700; |
||||
|
color: #111; |
||||
|
margin-bottom: 36rpx; |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
.form-container { |
||||
|
width: 100%; |
||||
|
margin-bottom: 32rpx; |
||||
|
|
||||
|
.appointment-info { |
||||
|
background-color: #fafafa; |
||||
|
border-radius: 16rpx; |
||||
|
padding: 24rpx 30rpx; |
||||
|
margin-bottom: 28rpx; |
||||
|
border: 1rpx solid #efefef; |
||||
|
box-shadow: none; |
||||
|
|
||||
|
.info-item { |
||||
|
display: flex; |
||||
|
margin-bottom: 16rpx; |
||||
|
align-items: center; |
||||
|
|
||||
|
&:last-child { |
||||
|
margin-bottom: 0; |
||||
|
} |
||||
|
|
||||
|
.label { |
||||
|
color: #6c757d; |
||||
|
font-size: 28rpx; |
||||
|
min-width: 200rpx; |
||||
|
font-weight: 500; |
||||
|
} |
||||
|
|
||||
|
.value { |
||||
|
color: #495057; |
||||
|
font-size: 28rpx; |
||||
|
flex: 1; |
||||
|
font-weight: 400; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.form-item { |
||||
|
margin-bottom: 30rpx; |
||||
|
display: flex; |
||||
|
|
||||
|
&:last-child { |
||||
|
margin-bottom: 0; |
||||
|
} |
||||
|
.required { |
||||
|
color: #ff0000; |
||||
|
font-size: 28rpx; |
||||
|
margin-top: 16rpx; |
||||
|
} |
||||
|
.form-label { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
font-size: 30rpx; |
||||
|
margin-bottom: 16rpx; |
||||
|
white-space: nowrap; |
||||
|
margin-right: 20rpx; |
||||
|
} |
||||
|
.u-input, |
||||
|
.u-textarea { |
||||
|
background-color: #fff; |
||||
|
border: 1rpx solid #e6e6e6; |
||||
|
border-radius: 14rpx; |
||||
|
padding: 20rpx; |
||||
|
font-size: 28rpx; |
||||
|
color: #333; |
||||
|
min-height: 80rpx; |
||||
|
transition: all 0.3s ease; |
||||
|
|
||||
|
&:focus { |
||||
|
border-color: #08b3b3; |
||||
|
box-shadow: 0 0 0 2rpx rgba(8, 179, 179, 0.1); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.u-textarea { |
||||
|
padding-top: 16rpx; |
||||
|
min-height: 120rpx; |
||||
|
resize: none; |
||||
|
} |
||||
|
|
||||
|
/* 下拉样式 */ |
||||
|
.dropdown { |
||||
|
position: relative; |
||||
|
} |
||||
|
.dropdown-list { |
||||
|
position: absolute; |
||||
|
top: calc(100% + 8rpx); |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
background: #ffffff; |
||||
|
border: 1rpx solid #e6e6e6; |
||||
|
border-radius: 14rpx; |
||||
|
box-shadow: 0 8rpx 20rpx rgba(0, 0, 0, 0.08); |
||||
|
z-index: 9; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
.dropdown-item { |
||||
|
padding: 22rpx 24rpx; |
||||
|
font-size: 28rpx; |
||||
|
color: #333; |
||||
|
} |
||||
|
.dropdown-item:active { |
||||
|
background: #f6f7fb; |
||||
|
} |
||||
|
.arrow-open { |
||||
|
transform: rotate(180deg); |
||||
|
transition: transform 0.2s ease; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.popup-actions { |
||||
|
width: 100%; |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
margin-top: 36rpx; |
||||
|
gap: 28rpx; |
||||
|
|
||||
|
.u-button { |
||||
|
flex: 1; |
||||
|
border-radius: 48rpx; |
||||
|
font-size: 30rpx; |
||||
|
height: 88rpx; |
||||
|
line-height: 88rpx; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</style> |
After Width: | Height: | Size: 1.3 KiB |
Loading…
Reference in new issue