<template>
|
|
<view class="technician-Detail">
|
|
<van-nav-bar class="technician-Detail-Top" title="技师详情" left-arrow @click-left="back" safe-area-inset-top />
|
|
|
|
<view class="technician-Detail-img">
|
|
<van-swipe class="my-swipe" :autoplay="3000" indicator-color="white">
|
|
<van-swipe-item v-for="(item,index) in technicianImages" :key="index">
|
|
<image :src="item" style="width: 100%;" mode="widthFix"></image>
|
|
</van-swipe-item>
|
|
<template #indicator="{ active, total }">
|
|
<!-- <div class="custom-indicator">{{ active + 1 }}/{{ total }}</div> -->
|
|
</template>
|
|
</van-swipe>
|
|
<view class="technician-Detail-img-text">下单付款后商家会在10分钟内联系你哦~</view>
|
|
</view>
|
|
|
|
<view class="techni-content">
|
|
<view class="userInfo">
|
|
<view class="img-box">
|
|
<image @click="showImage(technicianDetail.image)" :src="technicianDetail.image" mode="aspectFill">
|
|
</image>
|
|
</view>
|
|
<view class="base-info">
|
|
<view class="username-tag">
|
|
<view class="username">{{ technicianDetail.title }}</view>
|
|
<view v-if="technicianDetail.isVip" class="tag">
|
|
<image src="@/static/order/s.png" mode="aspectFit"></image>
|
|
<view class="auth">官方认证</view>
|
|
</view>
|
|
</view>
|
|
<view class="build">
|
|
<view class="sex">
|
|
<image src="../../static/technician/sex.png" mode="aspectFit"></image>
|
|
</view>
|
|
<view class="address">
|
|
{{ technicianDetail.area }}
|
|
</view>
|
|
<view class="cm">
|
|
{{ technicianDetail.cm }}
|
|
</view>
|
|
<view class="weight">
|
|
{{ technicianDetail.kg /2 }}kg
|
|
</view>
|
|
<view class="real-name">
|
|
<image src="../../static/technician/real-name.png" mode="aspectFit"></image>
|
|
<view class="desc">实名</view>
|
|
</view>
|
|
</view>
|
|
|
|
<view class="service-experience">
|
|
<view class="experience">
|
|
{{ technicianDetail.experience }}年经验
|
|
</view>
|
|
<view class="service-num">
|
|
近期服务过{{ technicianDetail.isFw }}次
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<view class="view">
|
|
<view class="service-description">
|
|
<div v-for="item in serviceDescList" class="sesc-item">
|
|
<image src="../../static/technician/desc.png" mode="aspectFit"></image>
|
|
<view>{{ item }}</view>
|
|
</div>
|
|
</view>
|
|
</view>
|
|
|
|
<view class="line">
|
|
<view></view>
|
|
</view>
|
|
|
|
<view class="text">
|
|
<div class="colleact-info">
|
|
<view style="color: #454545;">个人介绍</view>
|
|
<view v-if="collect == 0" class="selective-technician">
|
|
<view @click.stop="addCollect(technicianDetail.id)" class="btn">
|
|
立即收藏
|
|
</view>
|
|
</view>
|
|
</div>
|
|
<view style="color: #A1A1A1; margin-top: 5px;">
|
|
{{ technicianDetail.notes }}
|
|
</view>
|
|
</view>
|
|
|
|
<!-- <view class="ServicesAvailable">
|
|
<view>服务项目</view>
|
|
</view> -->
|
|
|
|
<van-tabs class="tabs" v-model:active="activeTag">
|
|
<van-tab title="服务项目">
|
|
<van-empty v-if="projectList.length <= 0" image="/static/empty/message-list.png" image-size="400rpx"
|
|
description="暂无服务" />
|
|
<view v-else class="server-list">
|
|
<view v-for="item in projectList" class="server-item" @click="toPayOrder(item)">
|
|
<view class="img-box">
|
|
<image :src="item.image" mode="aspectFill"></image>
|
|
</view>
|
|
<view class="server-info">
|
|
<view class="server-title">{{ item.title }}</view>
|
|
<view class="time-coupon">
|
|
<image src="@/static/home/time-icon.png"></image>
|
|
<view class="time">{{ item.times }}分钟</view>
|
|
<!-- <view class="coupon">{{ item.subTitle }}</view> -->
|
|
</view>
|
|
<view class="price">
|
|
<view class="current-price">
|
|
<text class="unit">¥</text>{{ item.price }}
|
|
</view>
|
|
<view class="original-price">
|
|
<text class="unit">¥</text>{{ item.oldPrice }}
|
|
</view>
|
|
</view>
|
|
<view class="sales-volume">
|
|
<image src="@/static/icons/icon1.png"></image>
|
|
<view class="desc">已售出{{ item.payNum }}+单</view>
|
|
</view>
|
|
</view>
|
|
<view class="selective-technician">
|
|
<view @click.stop="toPayOrder(item)"
|
|
:class="{ notAvailable : technicianDetail.bookable != 'Y' }" class="btn">
|
|
{{ technicianDetail.bookable == 'Y' ? '立即预约' : '不可预约' }}
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</van-tab>
|
|
|
|
<van-tab title="健康证">
|
|
<view class="health-certificate">
|
|
<van-empty v-if="!technicianDetail.healthCertificate" image="/static/empty/order.png" image-size="400rpx"
|
|
description="技师暂未上传健康证" />
|
|
<view v-else class="health-certificate-main">
|
|
<image @click="showImage(technicianDetail.healthCertificate)"
|
|
:src="technicianDetail.healthCertificate" mode="widthFix" style="width: 100%;"></image>
|
|
</view>
|
|
</view>
|
|
</van-tab>
|
|
|
|
<van-tab title="营业证">
|
|
<view class="health-certificate">
|
|
<van-empty v-if="!technicianDetail.businessLicense" image="/static/empty/order.png" image-size="400rpx"
|
|
description="技师暂未上传健康证" />
|
|
<view v-else class="health-certificate-main">
|
|
<image @click="showImage(technicianDetail.businessLicense)"
|
|
:src="technicianDetail.businessLicense" mode="widthFix" style="width: 100%;"></image>
|
|
</view>
|
|
</view>
|
|
</van-tab>
|
|
|
|
<van-tab title="用户评论">
|
|
<view class="review bg-white mar-10 box-s">
|
|
<!-- <view class="review-title">用户评论({{ countReviewNum }}+条)</view> -->
|
|
<view class="review-classify">
|
|
<view @click="selectReview(0)" class="review-classify-item"
|
|
:class="{'select-classify' : reviewQueryParams.fraction == 0}">
|
|
好评
|
|
<text class="num">{{ goodReputationNum }}</text>
|
|
</view>
|
|
<view @click="selectReview(1)" class="review-classify-item"
|
|
:class="{'select-classify' : reviewQueryParams.fraction == 1}">
|
|
中评
|
|
<text class="num">{{ mediumReviewNum }}</text>
|
|
</view>
|
|
<view @click="selectReview(2)" class="review-classify-item"
|
|
:class="{'select-classify' : reviewQueryParams.fraction == 2}">
|
|
差评
|
|
<text class="num">{{ negativeComment }}</text>
|
|
</view>
|
|
</view>
|
|
|
|
<van-list v-if="reviewList.length > 0" v-model:loading="loading" :finished="finished"
|
|
finished-text="没有更多了" @load="onLoad">
|
|
<reviewListVue :list="reviewList"></reviewListVue>
|
|
</van-list>
|
|
|
|
<van-empty v-else image="/static/empty/record.png" image-size="400rpx" description="暂无评论" />
|
|
|
|
</view>
|
|
</van-tab>
|
|
</van-tabs>
|
|
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import {
|
|
showImagePreview
|
|
} from 'vant';
|
|
import reviewListVue from '@/components/review/reviewList/reviewList.vue'
|
|
|
|
export default {
|
|
components : { reviewListVue },
|
|
data() {
|
|
return {
|
|
searchKeyword: '',
|
|
technicianDetail: {},
|
|
projectList: [],
|
|
queryParams: {
|
|
pageNo: 1,
|
|
pageSize: 100,
|
|
fraction: 0
|
|
},
|
|
loading: false,
|
|
finished: false,
|
|
serviceDescList: ['实名认证', '头像认证', '健康证', '按摩师证'],
|
|
collect: 0,
|
|
technicianImages: [],
|
|
activeTag: 0,
|
|
goodReputationNum: 0, //好评数量
|
|
mediumReviewNum: 0, //中评数量
|
|
negativeComment: 0, //差评数量
|
|
countReviewNum: 0, //总评论条数
|
|
reviewList: [],
|
|
reviewQueryParams: {
|
|
pageNo: 1,
|
|
pageSize: 10,
|
|
fraction: 0,
|
|
tenantId : '',
|
|
// projectId : '1797549059400646658',
|
|
type : 0
|
|
},
|
|
}
|
|
},
|
|
onShow() {
|
|
this.getTechnicianDetail()
|
|
},
|
|
methods: {
|
|
//获取技师详情
|
|
getTechnicianDetail() {
|
|
this.$api('getTechnicianDetail', {
|
|
id: this.$route.query.id
|
|
}, res => {
|
|
if (res.code == 200) {
|
|
this.collect = res.result.collect
|
|
this.technicianDetail = res.result.msgTechnician
|
|
this.reviewQueryParams.tenantId = this.technicianDetail.id
|
|
this.getReview(this.reviewQueryParams.fraction)
|
|
|
|
if (!res.result.msgTechnician.images) { //如果用户没有上传个人相册,那么这里给个默认值
|
|
this.technicianImages = this.technicianDetail.image ? this.technicianDetail.image.split(',') : []
|
|
} else {
|
|
this.technicianImages = res.result.msgTechnician.images.split(',')
|
|
}
|
|
this.projectList = res.result.list
|
|
}
|
|
})
|
|
},
|
|
back() {
|
|
uni.switchTab({
|
|
url: '/pages/index/technician'
|
|
})
|
|
},
|
|
toPayOrder(item) {
|
|
if (this.technicianDetail.bookable != 'Y') {
|
|
return uni.showToast({
|
|
title: '技师未开启接单',
|
|
icon: 'none'
|
|
})
|
|
}
|
|
this.$api('createVipOrder', {
|
|
projectId: item.id,
|
|
technicianId: this.$route.query.id
|
|
}, res => {
|
|
if (res.code == 200) {
|
|
if (res.code == 200) {
|
|
let {
|
|
distance,
|
|
id,
|
|
setKmOpen
|
|
} = this.$route.query
|
|
uni.navigateTo({ //setKmOpen 是否开启假距离 distance 距离信息
|
|
url: `/pages/order/payOrder?orderId=${res.result.id}&distance=${distance}&id=${id}¤t=technicianDetail&setKmOpen=${setKmOpen}`
|
|
})
|
|
}
|
|
}
|
|
})
|
|
},
|
|
addCollect(tenId) { //新增收藏
|
|
this.$api('addCollect', {
|
|
tenId
|
|
}, res => {
|
|
if (res.code == 200) {
|
|
uni.showToast({
|
|
title: '收藏成功',
|
|
icon: 'none'
|
|
})
|
|
this.getTechnicianDetail()
|
|
}
|
|
})
|
|
},
|
|
//放大显示图片
|
|
showImage(imgUrl) {
|
|
if(imgUrl){
|
|
showImagePreview({
|
|
images: [imgUrl],
|
|
closeable: true,
|
|
});
|
|
}
|
|
},
|
|
//选择了评论
|
|
selectReview(index) {
|
|
this.reviewQueryParams.fraction = index;
|
|
this.reviewQueryParams.pageSize + 10;
|
|
this.getReview(index)
|
|
},
|
|
//获取评论
|
|
getReview(index) {
|
|
this.loading = true
|
|
this.$api('getCommentList', this.reviewQueryParams, res => {
|
|
if (res.code == 200) {
|
|
this.reviewList = res.result;
|
|
// if(res.result.total > this.queryParams.pageSize){
|
|
// this.finished = true;
|
|
// }
|
|
this.finished = true;
|
|
this.loading = false;
|
|
|
|
if (index > -1) {
|
|
let list = ['goodReputationNum', 'mediumReviewNum', 'negativeComment']
|
|
let a = list[index];
|
|
this[a] = res.result.length
|
|
}
|
|
}
|
|
})
|
|
},
|
|
//滑动到屏幕底部
|
|
onLoad(){
|
|
console.log('触发');
|
|
this.queryParams.pageSize += 10;
|
|
this.getReview()
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.technician-Detail {
|
|
width: 750rpx;
|
|
background: #F5F5F5;
|
|
margin: 0 auto;
|
|
|
|
.technician-Detail-Top {
|
|
background-color: var(--van-primary-color);
|
|
|
|
::v-deep .van-nav-bar__title {
|
|
color: #fff;
|
|
}
|
|
|
|
::v-deep i {
|
|
color: #fff;
|
|
}
|
|
}
|
|
|
|
.technician-Detail-img {
|
|
position: relative;
|
|
max-height: 900rpx;
|
|
overflow: hidden;
|
|
|
|
.my-swipe .van-swipe-item {
|
|
color: #fff;
|
|
font-size: 20px;
|
|
line-height: 150px;
|
|
text-align: center;
|
|
}
|
|
|
|
.custom-indicator {
|
|
position: absolute;
|
|
right: 15rpx;
|
|
bottom: 80rpx;
|
|
padding: 5rpx 10rpx;
|
|
font-size: 20rpx;
|
|
background: rgba(0, 0, 0, 0.1);
|
|
}
|
|
|
|
.technician-Detail-img-text {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
position: absolute;
|
|
left: 0;
|
|
bottom: 0;
|
|
width: 100%;
|
|
height: 80rpx;
|
|
background: rgba(255, 255, 255, .6);
|
|
color: #4E4E50;
|
|
}
|
|
}
|
|
|
|
.techni-content {
|
|
width: calc(100% - 40rpx);
|
|
margin: 10rpx 20rpx 0rpx 20rpx;
|
|
|
|
.userInfo {
|
|
display: flex;
|
|
background: white;
|
|
border-radius: 10rpx;
|
|
box-sizing: border-box;
|
|
padding: 20rpx 10rpx 0rpx 10rpx;
|
|
color: #666666;
|
|
|
|
.img-box {
|
|
width: 120rpx;
|
|
height: 120rpx;
|
|
overflow: hidden;
|
|
border-radius: 50%;
|
|
|
|
&::v-deep div {
|
|
background-position: center top !important;
|
|
background-size: 100% !important;
|
|
}
|
|
|
|
image {
|
|
width: 120rpx;
|
|
height: 120rpx;
|
|
}
|
|
}
|
|
|
|
.base-info {
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: space-between;
|
|
box-sizing: border-box;
|
|
padding-left: 15rpx;
|
|
width: calc(100% - 120rpx);
|
|
|
|
.username-tag {
|
|
display: flex;
|
|
align-items: center;
|
|
|
|
.username {
|
|
margin-right: 5rpx;
|
|
color: #333333;
|
|
font-size: 26rpx;
|
|
}
|
|
|
|
.tag {
|
|
position: relative;
|
|
display: flex;
|
|
align-items: center;
|
|
|
|
image {
|
|
height: 45rpx;
|
|
width: 90rpx;
|
|
vertical-align: middle;
|
|
}
|
|
|
|
.auth {
|
|
position: absolute;
|
|
white-space: nowrap;
|
|
color: #FF6200;
|
|
left: 23rpx;
|
|
font-size: 17rpx;
|
|
}
|
|
}
|
|
}
|
|
|
|
.build {
|
|
display: flex;
|
|
align-items: center;
|
|
|
|
.sex {
|
|
width: 25rpx;
|
|
height: 25rpx;
|
|
|
|
image {
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
}
|
|
|
|
.real-name {
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 0rpx 3rpx;
|
|
border: 1px solid #3484E8;
|
|
color: #3484E8;
|
|
font-size: 22rpx;
|
|
|
|
image {
|
|
width: 18rpx;
|
|
height: 18rpx;
|
|
}
|
|
}
|
|
|
|
>view {
|
|
border-right: 1px solid #ccc;
|
|
padding: 0rpx 8rpx;
|
|
|
|
&:nth-child(1) {
|
|
padding-left: 0;
|
|
}
|
|
|
|
&:nth-last-child(2) {
|
|
border-right: none;
|
|
}
|
|
}
|
|
}
|
|
|
|
.service-experience {
|
|
display: flex;
|
|
|
|
.experience {
|
|
color: #ED9044;
|
|
margin-right: 20rpx;
|
|
}
|
|
|
|
.service-num {}
|
|
}
|
|
}
|
|
}
|
|
|
|
.service-description {
|
|
display: flex;
|
|
background: white;
|
|
justify-content: space-between;
|
|
padding: 30rpx 10rpx;
|
|
|
|
.sesc-item {
|
|
display: flex;
|
|
color: #FFD777;
|
|
|
|
image {
|
|
width: 30rpx;
|
|
height: 30rpx;
|
|
}
|
|
}
|
|
}
|
|
|
|
.line {
|
|
padding: 0rpx 10rpx;
|
|
background: white;
|
|
|
|
view {
|
|
border-bottom: 2px dashed #EBE7E7;
|
|
}
|
|
}
|
|
|
|
.text {
|
|
background: white;
|
|
box-sizing: border-box;
|
|
padding: 10rpx 10rpx 30rpx 10rpx;
|
|
border-bottom-left-radius: 10rpx;
|
|
border-bottom-right-radius: 10rpx;
|
|
}
|
|
|
|
.review {
|
|
padding: 0rpx 20rpx 40rpx 20rpx;
|
|
|
|
.review-title {
|
|
padding: 25rpx 20rpx;
|
|
font-size: 32rpx;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.review-classify {
|
|
display: flex;
|
|
padding: 30rpx 0rpx 30rpx 0rpx;
|
|
|
|
.review-classify-item {
|
|
background: #EEEDED;
|
|
padding: 5rpx 15rpx;
|
|
border-radius: 5rpx;
|
|
margin-right: 15rpx;
|
|
color: #666;
|
|
}
|
|
|
|
.select-classify {
|
|
background: #ECFCF1;
|
|
color: #55B16E;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.ServicesAvailable {
|
|
margin-top: 10px;
|
|
border-radius: 5px;
|
|
background-color: #fff;
|
|
padding: 10px 0px;
|
|
font-size: 16px;
|
|
|
|
view {
|
|
border-left: 4px outset #55B16E;
|
|
margin-left: 10px;
|
|
padding-left: 10px;
|
|
}
|
|
}
|
|
|
|
.tabs {
|
|
margin-top: 20rpx;
|
|
|
|
&::v-deep .van-tabs__wrap {
|
|
border-radius: 10rpx;
|
|
}
|
|
}
|
|
|
|
.server-list {
|
|
padding-bottom: 80rpx;
|
|
|
|
.server-item {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
justify-content: space-between;
|
|
background: white;
|
|
border-radius: 15rpx;
|
|
box-sizing: border-box;
|
|
padding: 15rpx;
|
|
margin: 20rpx 0rpx;
|
|
|
|
.img-box {
|
|
width: 150rpx;
|
|
height: 150rpx;
|
|
border-radius: 10rpx;
|
|
overflow: hidden;
|
|
|
|
image {
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
}
|
|
|
|
.server-info {
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: space-around;
|
|
width: calc(100% - 330rpx);
|
|
box-sizing: border-box;
|
|
padding: 0 10rpx;
|
|
|
|
.server-title {}
|
|
|
|
.time-coupon,
|
|
.price {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
align-items: center;
|
|
}
|
|
|
|
.time-coupon {
|
|
font-size: 26rpx;
|
|
|
|
image {
|
|
width: 22rpx;
|
|
height: 22rpx;
|
|
}
|
|
|
|
.time {
|
|
color: #B8B8B8;
|
|
margin-left: 6rpx;
|
|
}
|
|
|
|
.coupon {
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
background: #F29E45;
|
|
color: white;
|
|
width: 140rpx;
|
|
height: 45rpx;
|
|
border-radius: 10rpx;
|
|
margin-left: 10rpx;
|
|
}
|
|
}
|
|
|
|
.price {
|
|
display: flex;
|
|
align-items: center;
|
|
color: #B8B8B8;
|
|
|
|
.current-price {
|
|
font-size: 30rpx;
|
|
font-weight: 600;
|
|
color: #D34430;
|
|
margin-right: 5rpx;
|
|
}
|
|
|
|
.unit {
|
|
font-size: 20rpx;
|
|
}
|
|
}
|
|
|
|
.sales-volume {
|
|
display: flex;
|
|
align-items: center;
|
|
color: #B8B8B8;
|
|
font-size: 26rpx;
|
|
|
|
image {
|
|
width: 23rpx;
|
|
height: 23rpx;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.selective-technician {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
align-items: center;
|
|
width: 170rpx;
|
|
|
|
.btn {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
height: 60rpx;
|
|
width: 170rpx;
|
|
border-radius: 40rpx;
|
|
color: white;
|
|
background: linear-gradient(170deg, #53CEAC, #5AC796);
|
|
}
|
|
|
|
.notAvailable {
|
|
background: #ccc;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
.health-certificate {
|
|
padding-bottom: 80rpx;
|
|
|
|
.health-certificate-main {
|
|
margin: 15rpx 0rpx 30rpx 0rpx;
|
|
background: white;
|
|
min-height: 30vh;
|
|
border-radius: 10rpx;
|
|
box-sizing: border-box;
|
|
padding: 15rpx;
|
|
}
|
|
}
|
|
|
|
.colleact-info {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
font-size: 28rpx;
|
|
align-items: center;
|
|
height: 60rpx;
|
|
|
|
.selective-technician {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
align-items: center;
|
|
|
|
.btn {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
height: 50rpx;
|
|
width: 170rpx;
|
|
border-radius: 40rpx;
|
|
color: white;
|
|
background: linear-gradient(170deg, #53CEAC, #5AC796);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
</style>
|