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

389 lines
8.3 KiB

<template>
<view class="collect">
<mNavbar title="我的收藏" :leftClick="leftClick"></mNavbar>
<view v-if="collectList.length > 0" class="collect-list">
<view @click="gototechnicianDetail(item.technician)" v-for="item in collectList" :key="item.id" class="collect-item">
<view class="collect-main">
<view class="technician-head b-relative">
<view class="img-box">
<image :src="item.technician.image" mode="aspectFill" class="bg"></image>
<image v-if="item.technician.icon" :src="item.technician.icon" mode="aspectFit" class="hot">
</image>
<view v-if="item.technician.bookable == 'Y'" class="available-for-service">
<image src="@/static/address/lightning-icon.png" mode="aspectFit"></image>
<text class="desc">可服务</text>
</view>
</view>
</view>
<view class="detail-info">
<view class="technician-base-info">
<view class="name-and-level">
<view class="technician-name">{{ item.technician.title }}</view>
<van-icon name="star" color="#E8615E" size="25rpx" />
<text class="score">{{ item.technician.level }}</text>
</view>
<view @click.stop="calcelCollect(item.technician.id)" class="alert-collect">
<image src="@/static/collect/alert-collect-icon.png"></image>
<text class="alert-add-collect">取消收藏</text>
</view>
</view>
<view class="appointed-time">
<view class="capsule">
<view class="earliest-reducible">最早可约</view>
<view class="today">今天{{ item.technician.useTime}}</view>
</view>
</view>
<view class="technician-desc">
{{ item.technician.notes }}
</view>
</view>
</view>
<view class="public-praise">
<view class="server-num">已服务{{ item.technician.isFw }}+单</view>
<view class="evaluate-collect-subscribe">
<view class="evaluate-collect">
<image src="@/static/collect/review-icon.png" mode="aspectFit"></image>
<view class="evaluate-num">{{item.technician.pinNum}}评价</view>
<image src="@/static/collect/alert-collect-icon.png" mode="aspectFit"></image>
<view class="collect-num">{{ item.technician.collectNum }}收藏</view>
</view>
<view @click="gototechnicianDetail(item.technician)" class="subscribe"
:class="{ notAvailable : item.technician.bookable != 'Y' }">立即预约</view>
</view>
</view>
</view>
</view>
<van-empty v-else image="/static/empty/collect.png" image-size="400rpx" description="暂无收藏技师"/>
</view>
</template>
<script>
import mNavbar from '../../components/base/m-navbar.vue'
import {
showConfirmDialog
} from 'vant';
export default {
components: {
mNavbar
},
data() {
return {
queryParams: {
pageNo: 1,
pageSize: 10
},
collectList: [],
}
},
onShow() {
this.getList()
},
methods: {
//list列表滑动到底部自动新增数据列表
onLoad() {
this.queryParams.pageSize += 10
this.getAddressList()
},
//返回个人中心
leftClick() {
uni.switchTab({
url: '/pages/index/center'
})
},
//获取收藏列表
getList() {
this.$api('getCollectList', this.queryParams, res => {
if (res.code == 200) {
this.collectList = res.result.records
}
})
},
//跳转技师详情
gototechnicianDetail(technician) {
uni.navigateTo({
url: '/pages/technician/technicianDetail?id=' + technician.id
})
},
//取消收藏
calcelCollect(tenId) {
showConfirmDialog({
title: '删除收藏',
message: '确认取消此收藏?取消后数据不可恢复',
}).then(() => {
this.$api('calcelCollect', {
tenId
}, res => {
if (res.code == 200) {
uni.showToast({
title: '取消成功',
icon: 'none'
})
this.getList()
}
})
}).catch(() => {});
}
}
}
</script>
<style lang="scss" scoped>
.collect {
width: 750rpx;
margin: 0 auto;
background: #F5F5F5;
min-height: 100vh;
box-sizing: border-box;
.collect-list {
padding: 20rpx;
.collect-item {
background: white;
border-radius: 20rpx;
padding: 20rpx;
margin-bottom: 20rpx;
.collect-main {
display: flex;
.technician-head {
width: 150rpx;
height: 150rpx;
border-radius: 10rpx;
border: 1px solid #5EBAA2;
.img-box {
.bg {
width: 150rpx;
height: 150rpx;
border-radius: 10rpx;
overflow: hidden;
&::v-deep div {
background-position: center top !important;
background-size: 100% !important;
}
image {
width: 100%;
}
}
.hot {
position: absolute;
left: -28rpx;
top: -34rpx;
width: 80rpx;
height: 80rpx;
}
.available-for-service {
display: flex;
justify-content: center;
align-items: center;
position: absolute;
left: 50%;
bottom: -13rpx;
width: 70%;
height: 40rpx;
background: #60C285;
border-radius: 10rpx;
color: white;
transform: translate(-50%);
.desc {
font-size: 18rpx;
}
image {
width: 23rpx;
height: 23rpx;
vertical-align: middle;
}
}
}
}
.detail-info {
display: flex;
flex-direction: column;
justify-content: space-between;
width: calc(100% - 150rpx);
padding-left: 15rpx;
.technician-base-info {
display: flex;
justify-content: space-between;
height: 45rpx;
.name-and-level {
display: flex;
align-items: center;
.technician-name {
color: #333;
font-size: 28rpx;
font-weight: 500;
margin-right: 10rpx;
}
.score {
color: #E8615E;
margin-left: 5rpx;
font-size: 20rpx;
}
}
.alert-collect {
display: flex;
align-items: center;
color: #6E6E6E;
font-size: 20rpx;
.alert-add-collect {
margin-left: 5rpx;
color: #FC9A37;
}
}
text {
display: block;
}
}
.appointed-time {
width: 48%;
background: #E7FDF7;
height: 40rpx;
border-radius: 22.5rpx;
font-size: 20rpx;
color: #5DB9A3;
.capsule {
display: flex;
height: 100%;
align-items: center;
.earliest-reducible {
display: flex;
align-items: center;
justify-content: center;
width: 50%;
height: 100%;
color: white;
border-radius: 20rpx;
background: #52CFB0;
}
.today {
width: 50%;
text-align: center;
}
}
}
.technician-desc {
color: #666666;
overflow: hidden;
min-height: 2em;
font-size: 22rpx;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
text-overflow: ellipsis;
}
image {
width: 25rpx;
height: 25rpx;
}
}
}
.public-praise {
display: flex;
align-items: center;
margin-top: 20rpx;
font-size: 26rpx;
.server-num {
width: 170rpx;
font-size: 22rpx;
color: #666666;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.evaluate-collect-subscribe {
width: calc(100% - 170rpx);
display: flex;
justify-content: space-between;
padding-left: 15rpx;
.evaluate-collect {
display: flex;
align-items: center;
.evaluate-num {
color: #B6B6B6;
margin-right: 20rpx;
}
.collect-num {
color: #B6B6B6;
}
image {
margin-right: 5rpx;
}
}
.subscribe {
display: flex;
align-items: center;
justify-content: center;
height: 60rpx;
width: 180rpx;
border-radius: 40rpx;
color: white;
background: linear-gradient(170deg, #53CEAC, #5AC796);
}
.notAvailable {
background: #ccc;
}
}
image {
width: 25rpx;
height: 25rpx;
}
}
}
}
}
</style>