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.

1343 lines
36 KiB

5 months ago
<template>
<view class="dynamic-technician-detail" v-if="detail.id">
<!-- #ifdef H5 -->
<view @tap="$util.goUrl({url:`/pages/service`})" class="abs"
:class="[{'back-user-ios': configInfo.isIos},{'back-user-android': !configInfo.isIos}]"
style="margin-top:25rpx;z-index: 999;" v-if="options.pid">
<view class="iconshouye iconfont"></view>
<view class="back-user_text">回到首页</view>
</view>
<!-- #endif -->
<!-- #ifndef H5 -->
<uni-nav-bar :fixed="true" :shadow="false" :statusBar="true"
:leftIcon="options.pid ? 'iconshouye11' : 'icon-left'" :title="detail.type == 1?'动态详情':' '" color="#ffffff"
:backgroundColor="detail.type == 1?primaryColor:'none'">
</uni-nav-bar>
<view :style="{height:`${configInfo.navBarHeight}px`}" v-if="detail.type == 1"></view>
<!-- #endif -->
<block v-if="detail.type == 1">
<view class="banner-info rel">
<view @tap.stop="$refs.show_item.open()" class="menu-info flex-center c-base abs radius">
<i class="iconfont icon-caidan"></i>
</view>
<banner @change="goBanner" :list="detail.imgs" :margin="0" :autoplay="true"
:indicatorActiveColor="primaryColor" :dotWidth="20" :dotBottom="30" :height="654"
v-if="detail.imgs.length > 0">
</banner>
</view>
<view class="pd-lg fill-base">
<view class="dynamic-info flex-center">
<image mode="aspectFill" class="avatar radius" :src="detail.coach_info.work_img"></image>
<view class="flex-1 ml-md">
<view class="flex-between">
<view>
<view class="f-mini-title c-black text-bold max-270 ellipsis">
{{detail.coach_info.coach_name}}
</view>
<view class="flex-y-center f-icontext c-caption mt-sm" :style="{color:primaryColor}"><i
class="iconfont" :class="[iconType[detail.coach_info.work_status]]"
style="font-size: 24rpx;margin-right:5rpx"></i>{{textType[detail.coach_info.work_status]}}
</view>
</view>
<view class="flex-y-center f-caption">
<view class="app-follow-btn flex-center c-base radius"
:style="{background:detail.status==1?'#FC8218':'#FF6262'}" v-if="detail.status!=2">
{{detail.status==1?'审核中': '已驳回'}}
</view>
<block v-else>
<view @tap.stop="getServiceList" class="app-follow-btn flex-center radius"
:style="{color:primaryColor,border:`1rpx solid ${primaryColor}`}">预约</view>
<view @tap.stop="toChangeItem(1)" class="app-follow-btn flex-center radius ml-md"
:style="{background:detail.follow_status ? primaryColor:'#fff',color:detail.follow_status ? '#fff' :primaryColor,border:`1rpx solid ${primaryColor}`}">
<i class="iconfont icon-jia-bold"
v-if="!detail.follow_status"></i>{{detail.follow_status?'已关注':'关注'}}
</view>
</block>
</view>
</view>
</view>
</view>
<view class="f-mini-title c-black text-bold mt-lg">{{detail.title}}</view>
<view class="dynamic-content f-paragraph mt-lg mb-lg">
<span v-if="!showText">
<span>{{detail.text.substring(0,42) + '...'}}</span>
<span @tap.stop="toShowHide('showText')" class="pl-md" :style="{color:primaryColor}"
v-if="detail.have_show_text">
展开
<text class="iconfont iconxia ml-sm" style="font-size: 24rpx;"></text>
</span>
</span>
<block v-if="showText">
<view>
<text decode="emsp" style="word-break:break-all;">{{detail.text}}</text>
</view>
<span @tap.stop="toShowHide('showText')" class="mt-sm" :style="{color:primaryColor}"
v-if="detail.have_show_text">
收起
<text class="iconfont iconshang ml-sm" style="font-size: 24rpx;"></text>
</span>
</block>
</view>
<view class="flex-between">
<view class="f-caption c-caption">{{detail.friend_time}}</view>
<view class="flex-y-center f-desc c-desc"> <i class="iconfont iconjuli"
:style="{color:primaryColor}"></i>
{{detail.distance}}
</view>
</view>
</view>
<view class="space-md"></view>
<view class="comment-list-info pl-lg pr-lg fill-base">
<view class="flex-y-center f-mini-title c-title text-bold b-1px-b" style="height: 95rpx;">全部评论</view>
<view class="no-data-item flex-center mt-lg" v-if="list.data.length == 0">
<image mode="aspectFill" class="avatar radius"
src="https://lbqny.migugu.com/admin/anmo/mine/dynamic-user.png">
</image>
<view class="text flex-1 flex-y-center ml-md pl-lg f-icontext radius">评论千万条, 礼貌第一条</view>
</view>
<view @longpress="toDel(index)" class="list-item flex-warp pt-lg" v-for="(item,index) in list.data"
:key="index">
<image mode="aspectFill" class="avatar radius" :src="item.avatarUrl"></image>
<view class="flex-1 ml-md pb-lg" :class="[{'b-1px-b':index != list.total-1}]">
<view class="flex-between" style="height: 72rpx;">
<view class="text flex-y-center f-caption">
<view class="max-380 ellipsis">{{item.nickName}}</view>
<view class="examine-btn flex-center f-icontext ml-md radius" v-if="item.status==1">
审核中
</view>
</view>
<view class="f-icontext c-caption">{{item.friend_time}}</view>
</view>
<view class="comment f-paragraph mt-sm"> {{item.text}} </view>
</view>
</view>
</view>
<load-more :noMore="list.current_page>=list.last_page&&list.data.length>0" :loading="loading"
v-if="loading">
</load-more>
<view :class="[{'space-footer':detail.status != 2},{'space-max-footer':detail.status == 2}]"></view>
</block>
<block v-if="detail.type == 2">
<view class="video-box rel">
<view @tap.stop="$refs.show_item.open()" class="menu-info type-video flex-center c-title abs radius"
:style="{top:videoNavHeight}">
<i class="iconfont icon-caidan"></i>
</view>
<view class="video-poster rel" v-show="!isPlay && videoContexts == null">
<image mode="aspectFill" class="video-poster" :src="detail.cover"></image>
<view @tap.stop="playAndPauseVideo" class="video-poster flex-center abs">
<view class="play-video flex-center c-base radius">
<i class="iconfont icon-play-video"></i>
</view>
</view>
</view>
<!-- #ifdef APP-PLUS -->
<video :id="`video_${detail.id}`" class="video_item" :controls="true" :src="detail.imgs[0]"
@play="onPlay" @pause="onPause" @ended="onEnded" @timeupdate="onTimeUpdate" @waiting="onWaiting"
@progress="onProgress" @loadedmetadata="onLoadedMetaData" @fullscreenchange="screenChange"
v-show="isPlay">
</video>
<!-- #endif -->
<!-- #ifndef APP-PLUS -->
<video @tap.stop="playAndPauseVideo" :id="`video_${detail.id}`" class="video_item" :loop="false"
enable-play-gesture enable-progress-gesture :show-center-play-btn="true" :controls="false"
:src="detail.imgs[0]" object-fit="contain" @play="onPlay" @pause="onPause" @ended="onEnded"
@timeupdate="onTimeUpdate" @waiting="onWaiting" @progress="onProgress"
@loadedmetadata="onLoadedMetaData" v-show="isPlay">
</video>
<!-- #endif -->
</view>
</block>
<fixed position="bottom" zIndex="994" v-if="(detail.type == 1 && detail.status == 2) || detail.type == 2">
<view class="bottom-info" :class="[{'b-1px-t': detail.type == 1},{'type-video': detail.type == 2}]">
<block v-if="detail.type == 2">
<view class="dynamic-info flex-center pd-lg">
<image mode="aspectFill" class="avatar radius" :src="detail.coach_info.work_img"></image>
<view class="flex-1 flex-y-center ml-sm c-base">
<view class="f-paragraph text-bold ellipsis"
:style="{maxWidth: detail.coach_info.is_work ? '240rpx' :'340rpx'}">
{{detail.coach_info.coach_name}}
</view>
<view class="flex-y-center f-icontext ml-sm"><i class="iconfont"
:class="[iconType[detail.coach_info.work_status]]"
style="font-size: 24rpx;margin-right:5rpx"></i>{{textType[detail.coach_info.work_status]}}
</view>
<view class="flex-y-center f-caption">
<block v-if="detail.status!=2">
<view class="app-follow-btn flex-center c-base radius ml-sm"
:style="{background:detail.status==1?'#FC8218':'#FF6262',borderColor:detail.status==1?'#FC8218':'#FF6262'}">
{{detail.status==1?'审核中': '已驳回'}}
</view>
<view @tap.stop="toChangeItem(3)"
class="app-follow-btn flex-center c-base radius ml-sm"
:style="{background:primaryColor,borderColor:primaryColor}">
全部评论
</view>
</block>
<block v-else>
<view @tap.stop="getServiceList" class="app-follow-btn flex-center radius ml-sm">预约
</view>
<view @tap.stop="toChangeItem(1)" class="app-follow-btn flex-center radius ml-sm"
:style="{background:detail.follow_status ? primaryColor:'',border: detail.follow_status ? `1rpx solid ${primaryColor}`:``}">
<i class="iconfont icon-jia-bold"
v-if="!detail.follow_status"></i>{{detail.follow_status?'已关注':'关注'}}
</view>
</block>
</view>
</view>
</view>
<view class="pl-lg pr-lg c-base">
<view class="f-mini-title text-bold pb-lg">{{detail.title}}</view>
<view class="dynamic-content f-paragraph pb-lg">
<span v-if="!showText">
<span class="c-base">{{detail.text.substring(0,42) + '...'}}</span>
<span @tap.stop="toShowHide('showText')" class="pl-md" :style="{color:primaryColor}"
v-if="detail.have_show_text">
展开
<text class="iconfont iconxia ml-sm" style="font-size: 24rpx;"></text>
</span>
</span>
<block v-if="showText">
<view>
<text decode="emsp" class="c-base"
style="word-break:break-all;">{{detail.text}}</text>
</view>
<span @tap.stop="toShowHide('showText')" class="mt-sm" :style="{color:primaryColor}"
v-if="detail.have_show_text">
收起
<text class="iconfont iconshang ml-sm" style="font-size: 24rpx;"></text>
</span>
</block>
</view>
<view class="flex-between pb-lg">
<view class="f-caption">{{detail.friend_time}}</view>
<view class="flex-y-center f-desc"> <i class="iconfont iconjuli"></i>
{{detail.distance}}
</view>
</view>
<view class="space-sm" v-if="detail.status != 2"></view>
</view>
</block>
<view class="comment-thumbs-info flex-between f-caption pl-lg pr-lg"
:class="[{'fill-black':detail.type == 2}]" v-if="detail.status == 2">
<view @tap.stop="toChangeItem(3)" class="input-text flex-y-center radius"
:class="[{'flex-1':showComment}]">
<i class="iconfont icon-edit ml-md mr-sm"></i>
<input class="input" type="text" placeholder="说点什么..." :disabled="true" />
</view>
<view v-if="showComment"></view>
<view class="flex-y-center" v-else>
<view @tap.stop="toChangeItem(2)" class="thumbs-comment-btn flex-y-center">
<i class="iconfont"
:class="[{'icon-shoucang':!detail.thumbs_status},{'icon-shoucang-fill':detail.thumbs_status}]"
:style="{color:detail.thumbs_status?primaryColor:''}"></i>
{{!detail.thumbs_num ? '点赞' : detail.thumbs_num}}
</view>
<view @tap.stop="toChangeItem(3)" class="thumbs-comment-btn flex-y-center pl-lg">
<i class="iconfont icon-pinglun"></i>
{{!detail.comment_num ? '评论' : detail.comment_num}}
</view>
</view>
</view>
<view class="video-comment-black fix" v-if="detail.type == 2 && detail.status != 2">
</view>
<view class="space-safe" :class="[{'fill-black':detail.type == 2}]"></view>
</view>
</fixed>
<common-popup @confirm="confirmDel" ref="del_item" type="DELETE_ORDER" title="删除评论" desc="请确认是否删除评论,删除后将无法恢复"
:info="popupInfo"></common-popup>
<common-popup @confirm="confirmDel" ref="del_dynamic_item" type="DELETE_ORDER" title="删除动态"
desc="请确认是否删除动态,删除后将无法恢复" :info="popupInfo"></common-popup>
<!-- 操作项 -->
<uni-popup ref="show_item" type="bottom">
<view class="show-popup pd-lg">
<view @tap.stop="toChangeItem(4)" class="show-item flex-center f-paragraph text-bold mt-md radius-16"
v-if="detail.status!=1">编辑
</view>
<view @tap.stop="toChangeItem(5)" class="show-item flex-center f-paragraph text-bold mt-md radius-16">删除
</view>
<view @tap.stop="toChangeItem(6)" class="show-item flex-center f-paragraph text-bold mt-md radius-16"
v-if="detail.status == 3 && detail.check_text && detail.check_text.length > 0">驳回原因
</view>
<view @tap.stop="$refs.show_item.close()"
class="show-item flex-center f-paragraph text-bold mt-md radius-16" :style="{color:primaryColor}">取消
</view>
<view class="space-safe"></view>
</view>
</uni-popup>
<!-- 查看驳回原因 -->
<uni-popup ref="check_text_item" type="bottom">
<view class="comment-popup fill-base rel">
<i @tap.stop="$refs.check_text_item.close()" class="iconfont icon-add rotate-45 abs"></i>
<view class="flex-center f-mini-title c-title text-bold pd-lg">驳回原因</view>
<view class="pd-lg f-paragraph" style="max-height: 70vh;overflow-y: auto;">
<text decode="emsp" style="word-break:break-all;">{{detail.check_text}}</text>
</view>
<view class="space-safe"></view>
</view>
</uni-popup>
<!-- 查看全部评论 -->
<uni-popup ref="comment_item" type="bottom" :zIndex="995">
<view class="comment-popup fill-base rel">
<i @tap.stop="$refs.comment_item.close()" class="iconfont icon-add rotate-45 abs"
style="z-index: 997;"></i>
<view class="flex-center f-mini-title c-title text-bold ml-lg mr-lg pt-lg pb-lg b-1px-b">全部评论
</view>
<scroll-view scroll-y @scrolltolower="scrolltolower" :scroll-with-animation="true" lower-threshold="100"
class="scroll-list">
<view class="no-data-item flex-center pd-lg" v-if="list.data.length == 0">
<image mode="aspectFill" class="avatar radius"
src="https://lbqny.migugu.com/admin/anmo/mine/dynamic-user.png">
</image>
<view class="text flex-1 flex-y-center ml-md pl-lg f-icontext radius">评论千万条, 礼貌第一条</view>
</view>
<view @longpress="toDel(index)" class="list-item flex-warp pt-lg pl-lg pr-lg"
v-for="(item,index) in list.data" :key="index">
<image mode="aspectFill" class="avatar radius" :src="item.avatarUrl"></image>
<view class="flex-1 ml-md pb-lg" :class="[{'b-1px-b':index != list.total-1}]">
<view class="flex-between" style="height: 72rpx;">
<view class="text flex-y-center f-caption">
<view class="max-380 ellipsis">{{item.nickName}}</view>
<view class="examine-btn flex-center f-icontext ml-md radius" v-if="item.status==1">
审核中
</view>
</view>
<view class="f-icontext c-caption">{{item.friend_time}}</view>
</view>
<view class="comment f-paragraph mt-sm"> {{item.text}} </view>
</view>
</view>
<load-more :noMore="list.current_page>=list.last_page&&list.data.length>0" :loading="loading"
v-if="loading">
</load-more>
</scroll-view>
<view class="comment-thumbs-info flex-center pd-lg f-caption b-1px-t" v-if="detail.status == 2">
<view class="input-text flex-y-center radius">
<i class="iconfont icon-edit ml-md mr-sm"></i>
<input ref="elInput" :adjust-position="true" :focus="inputFocus" @blur="inputBlur"
@confirm="toComment" v-model="subForm.text" maxlength="200" class="input" type="text"
placeholder="说点什么..." />
</view>
</view>
<view class="space-safe"></view>
</view>
</uni-popup>
<!-- 预约技- -->
<uni-popup ref="technician_item" type="bottom">
<view class="technician-popup fill-base">
<view @tap.stop="toTechnicianInfo" class="pd-lg flex-center">
<image mode="aspectFill" class="item-avatar radius" :src="detail.coach_info.work_img"></image>
<view class="flex-1 flex-between ml-md">
<view class="flex-y-center f-caption c-caption">
<view class="f-title c-title text-bold mr-sm max-350 ellipsis">
{{detail.coach_info.coach_name}}
</view>从业{{detail.coach_info.work_time}}
</view>
<view class="flex-y-center f-caption c-caption">更多详情<i class="iconfont icongengduo"
style="font-size: 22rpx;"></i></view>
</view>
</view>
<view class="space-sm fill-body"></view>
<scroll-view scroll-y @touchmove.stop.prevent class="list-content">
<view class="technician-list-item flex-center pd-lg fill-base radius-16"
:class="[{'b-1px-t':index != 0}]" v-for="(item,index) in serviceList" :key="index">
<image @tap.stop="goDetail(index)" mode="aspectFill" class="avatar lg radius-16"
:src="item.cover"></image>
<view class="flex-1 ml-md">
<view @tap.stop="goDetail(index)" class="f-title c-title max-510 ellipsis">
{{item.title}}
</view>
<view class="f-caption c-caption mt-sm mb-sm ellipsis">{{item.total_sale}}人选择</view>
<view class="flex-between">
<view class="flex-y-baseline f-desc c-caption max-350 ellipsis">
<view class="text-delete mr-sm" v-if="item.init_price">¥{{item.init_price}}
</view>
<view class="f-title c-warning mr-sm">¥{{item.price}}</view>/
{{item.time_long}}分钟
</view>
<view class="flex-warp">
<block v-if="item.num">
<button @tap.stop="changeNum(-1,index)" class="reduce"
:style="{borderColor:primaryColor,color:primaryColor}"><i
class="iconfont icon-jian-bold"></i></button>
<button class="addreduce clear-btn">{{item.num || 0}}</button>
</block>
<button @tap.stop="changeNum(1,index)" class="add"
:style="{background:primaryColor,borderColor:primaryColor}"><i
class="iconfont icon-jia-bold"></i></button>
</view>
</view>
</view>
</view>
</scroll-view>
<view style="margin: 0 100rpx;" v-if="!loading&&serviceList.length<=0">
<abnor></abnor>
</view>
<view class="space-sm fill-body"></view>
<view class="flex-between pd-lg b-1px-t" v-if="carList.car_count > 0">
<view class="flex-center">合计<view class="f-title c-warning text-bold ml-sm">
¥{{carList.car_price}}
</view>
</view>
<view @tap.stop="toOrder" class="order-btn flex-center f-desc c-base radius"
:style="{background: primaryColor}">提交订单
</view>
</view>
<view class="space-safe"></view>
</view>
</uni-popup>
</view>
</template>
<script>
import {
mapState,
mapActions,
mapMutations
} from "vuex"
export default {
data() {
return {
iconType: {
1: 'icon-kefuwu',
2: 'iconjishifuwu',
3: 'iconkeyuyue'
},
textType: {
1: '可服务',
2: '服务中',
3: '可预约',
4: '不可预约'
},
options: {},
detail: {},
videoNavHeight: '15px',
showText: false,
loading: true,
param: {
page: 1
},
list: {
data: []
},
serviceList: [],
videoContexts: null,
isPlay: false,
scrollTop: 0,
pageScrollTop: 0,
showComment: false,
inputFocus: false,
subForm: {
text: ''
},
rule: [{
name: "text",
checkType: "isNotNull",
errorMsg: "请输入评论内容",
regType: 2
}],
popupInfo: {},
lockTap: false,
}
},
computed: mapState({
primaryColor: state => state.config.configInfo.primaryColor,
subColor: state => state.config.configInfo.subColor,
configInfo: state => state.config.configInfo,
userInfo: state => state.user.userInfo,
location: state => state.user.location,
isGzhLogin: state => state.user.isGzhLogin,
carList: state => state.order.carList,
}),
onLoad(options) {
this.$util.showLoading()
this.options = options
this.param.dynamic_id = options.id
this.$util.showLoading()
this.initIndex()
},
onUnload() {
if (this.isPlay) {
this.videoContexts.pause()
}
},
onPageScroll(e) {
let {
scrollTop
} = e
this.pageScrollTop = scrollTop
},
onPullDownRefresh() {
// #ifndef APP-PLUS
uni.showNavigationBarLoading()
// #endif
this.initRefresh();
uni.stopPullDownRefresh()
},
onReachBottom() {
if (this.list.current_page >= this.list.last_page || this.loading) return;
this.param.page = this.param.page + 1;
this.loading = true;
this.getList();
},
methods: {
...mapActions(['getConfigInfo', 'getUserInfo', 'getCarList', 'getServiceCoachList']),
...mapMutations(['updateUserItem']),
async initIndex(refresh = false) {
let {
pid = 0
} = this.options
let {
isGzhLogin
} = this
let {
id: uid = 0
} = this.userInfo
if (pid && !uid) {
// #ifdef H5
if (isGzhLogin) {
setTimeout(() => {
this.getUserInfo()
}, 1000)
} else {
this.getUserInfo()
}
// #endif
// #ifndef H5
await this.getUserInfo()
// #endif
}
if (!this.configInfo.id || refresh) {
await this.getConfigInfo()
}
await this.getDetail()
await this.getList()
let {
navBarHeight
} = this.configInfo
// #ifdef MP-WEIXIN
this.videoNavHeight = navBarHeight * 1 + 15 + 'px'
// #endif
// #ifdef APP-PLUS
this.videoNavHeight = navBarHeight * 1 / 2 + 'px'
// #endif
// #ifdef H5
if (!refresh && this.$jweixin.isWechat()) {
await this.$jweixin.initJssdk();
this.$jweixin.wxReady(() => {
this.$jweixin.hideOptionMenu()
})
}
// #endif
this.$util.setNavigationBarColor({
bg: this.primaryColor
})
},
initRefresh() {
this.param.page = 1
this.initIndex(true)
},
async getDetail() {
let {
id
} = this.options
let {
location
} = this
if (!location.lat) {
// #ifdef H5
if (this.$jweixin.isWechat()) {
this.$util.showLoading()
// await this.$jweixin.initJssdk();
await this.$jweixin.wxReady2();
let {
latitude: lat = 0,
longitude: lng = 0
} = await this.$jweixin.getWxLocation()
location = {
lng,
lat,
address: '定位失败',
province: '',
city: '',
district: ''
}
if (lat && lng) {
let key = `${lat},${lng}`
let data = await this.$api.base.getMapInfo({
location: key
})
let {
status,
result
} = JSON.parse(data)
if (status == 0) {
let {
address,
address_component
} = result
let {
province,
city,
district
} = address_component
location = {
lng,
lat,
address,
province,
city,
district
}
}
}
}
// #endif
// #ifndef H5
location = await this.$util.getBmapLocation()
// #endif
this.updateUserItem({
key: 'location',
val: location
})
}
let {
lat = 0, lng = 0
} = location
let data = await this.$api.dynamic.coachDynamicInfo({
id,
lat,
lng
})
let have_show_text = data.text.length > 42
data.have_show_text = have_show_text
this.showText = !have_show_text
this.detail = data
this.$util.hideAll()
},
async getList() {
let {
list: oldList,
param
} = this
let newList = await this.$api.dynamic.commentList(param)
if (this.param.page == 1) {
this.list = newList
} else {
newList.data = oldList.data.concat(newList.data)
this.list = newList
}
this.loading = false
this.$util.hideAll()
},
goBanner(current) {
this.$util.previewImage({
current,
urls: this.detail.imgs
})
},
scrolltolower(e) {
if (this.list.current_page >= this.list.last_page || this.loading) return;
this.param.page = this.param.page + 1;
this.loading = true;
this.getList();
},
toShowHide(key) {
this[key] = !this[key]
},
inputBlur() {
if (this.showComment) {
this.$refs.comment_item.close()
}
this.$nextTick(() => {
this.showComment = false
this.inputFocus = false
}, 0)
},
// type 1关注,2点赞,3查看全部评论,4编辑评论,5删除评论,6驳回原因
async toChangeItem(type) {
let {
id,
coach_id,
cover: image,
type: dynamic_type,
follow_status,
thumbs_status,
thumbs_num,
} = this.detail
switch (type) {
case 1:
case 2:
let methodArr = {
1: {
methodKey: 'dynamic',
methodModel: 'followAddOrCancek',
param: {
dynamic_id: id,
coach_id
}
},
2: {
methodKey: 'dynamic',
methodModel: 'thumbsAddOrCancek',
param: {
dynamic_id: id
}
}
}
let {
methodKey,
methodModel,
param
} = methodArr[type]
await this.$api[methodKey][methodModel](param)
if (type == 1) {
this.detail.follow_status = follow_status ? 0 : 1
} else {
let num = thumbs_status ? -1 : 1
this.detail.thumbs_num = thumbs_num + num
this.detail.thumbs_status = num > 0 ? 1 : 0
}
break;
case 3:
this.showText = false
let {
scrollTop,
pageScrollTop
} = this
if (dynamic_type == 1 && (!scrollTop || (scrollTop && pageScrollTop < scrollTop))) {
if (!scrollTop) {
let {
navBarHeight = 88
} = this.configInfo
const query = uni.createSelectorQuery().in(this);
query.select('.comment-list-info').boundingClientRect(data => {
this.scrollTop = data.top - navBarHeight
uni.pageScrollTo({
scrollTop: data.top - navBarHeight,
duration: 0
})
}).exec();
} else {
uni.pageScrollTo({
scrollTop: scrollTop,
duration: 0
})
}
}
this.showComment = dynamic_type == 1
this.$refs.comment_item.open()
setTimeout(() => {
this.$nextTick(() => {
this.inputFocus = true
// this.$refs.elInput.focus()
}, 10)
}, 200)
break;
case 4:
this.$refs.show_item.close()
this.$util.goUrl({
url: `/dynamic/pages/technician/edit?id=${id}`
})
break;
case 5:
case 6:
this.$refs.show_item.close()
let refs_key = type == 5 ? 'del_dynamic_item' : 'check_text_item'
if (type == 5) {
this.popupInfo = {
id,
name: ``,
image,
index: -1,
}
}
this.$refs[refs_key].open()
break;
}
},
//表单验证
validate(param) {
let validate = new this.$util.Validate();
this.rule.map(item => {
let {
name,
} = item
validate.add(param[name], item);
})
let message = validate.start();
return message;
},
async toComment() {
let subForm = this.$util.deepCopy(this.subForm)
let {
id
} = this.options
subForm.dynamic_id = id
let msg = this.validate(subForm)
if (msg) return
subForm.text = subForm.text.substring(0, 200)
if (this.lockTap) return
this.lockTap = true
this.$util.showLoading()
try {
let {
status = 1
} = await this.$api.dynamic.commentAdd(subForm)
this.$util.hideAll()
this.$util.showToast({
title: status == 1 ? '正在审核中' : `评论成功`
})
this.lockTap = false
this.subForm.text = ''
if (this.showComment) {
this.$refs.comment_item.close()
}
this.$nextTick(() => {
this.showComment = false
this.inputFocus = false
}, 0)
setTimeout(() => {
this.initRefresh()
}, 1000)
} catch (e) {
setTimeout(() => {
this.lockTap = false
this.$util.hideAll()
}, 2000)
}
},
toDel(index) {
let {
id,
cover: image,
status
} = this.list.data[index]
this.popupInfo = {
id,
name: ``,
image: ``,
index,
status
}
this.$refs.del_item.open()
},
// 确认:删除评论/动态
async confirmDel() {
let {
id,
index,
status
} = this.popupInfo
let {
comment_num
} = this.detail
if (this.lockTap) return
this.lockTap = true
this.$util.showLoading()
let refs_key = index == -1 ? 'del_dynamic_item' : 'del_item'
let methodModel = index == -1 ? 'dynamicDel' : 'commentDel'
try {
await this.$api.dynamic[methodModel]({
id
})
this.lockTap = false
this.$util.hideAll()
this.$util.showToast({
title: `删除成功`
})
this.$refs[refs_key].close()
if (index != -1) {
this.list.data.splice(index, 1)
if (status != 1) {
this.detail.comment_num = comment_num - 1
}
} else {
setTimeout(() => {
this.$util.back()
this.$util.goUrl({
url: 1,
openType: `navigateBack`
})
}, 2000)
}
} catch (e) {
setTimeout(() => {
this.lockTap = false
this.$util.hideAll()
}, 2000)
}
},
async getServiceList() {
let {
is_work
} = this.detail.coach_info
if (!is_work) {
this.$util.showToast({
title: `${this.$t('action.attendantName')}未上班`
})
return
}
let {
coach_id
} = this.detail
await this.getCarList({
coach_id
})
let {
data
} = await this.$api.service.coachServiceList({
coach_id
})
let arr = []
if (this.carList.list && this.carList.list.length > 0) {
this.carList.list.map(item => {
arr.push(item.service_id)
})
}
if (data && data.length > 0) {
data.map(item => {
if (arr.includes(item.id)) {
let carInd = arr.findIndex(aitem => {
return aitem == item.id
})
item.num = this.carList.list[carInd].num
item.cart_id = this.carList.list[carInd].id
}
})
}
this.serviceList = data
this.$refs.technician_item.open()
},
// 加/减数量
async changeNum(mol, serInd) {
let {
coach_id
} = this.detail
let {
id: service_id,
cart_id = 0
} = this.serviceList[serInd]
if (this.lockTap) return;
this.lockTap = true;
let methodModel = mol > 0 ? 'addCar' : 'delCar'
let param = mol > 0 ? {
service_id,
coach_id,
num: 1
} : {
id: cart_id,
num: 1
}
if (methodModel == 'delCar' && !param.id) {
this.lockTap = false
return
}
try {
let add_cart_id = await this.$api.order[methodModel](param)
let {
num = 0,
cart_id = 0
} = this.serviceList[serInd]
this.serviceList[serInd].num = num + mol
if (add_cart_id && mol > 0 && !cart_id) {
this.serviceList[serInd].cart_id = add_cart_id
}
if (this.serviceList[serInd].num < 1) {
this.serviceList[serInd].cart_id = 0
}
await this.getCarList({
coach_id
})
this.lockTap = false
} catch (e) {
this.lockTap = false
}
},
// 下单
toOrder() {
if (this.carList.car_count < 1) {
this.$util.showToast({
title: `请选择服务`
})
return
}
let {
coach_id: id
} = this.detail
this.$refs.technician_item.close()
this.$util.goUrl({
url: `/user/pages/order?id=${id}`
})
},
toTechnicianInfo() {
let {
coach_id
} = this.detail
this.$refs.technician_item.close()
this.$util.goUrl({
url: `/user/pages/technician-info?id=${coach_id}`
})
},
screenChange(e) {
let {
fullScreen = false
} = e.detail
if (!fullScreen) {
this.$nextTick(() => {
this.videoContexts.pause()
this.videoContexts = null
this.isPlay = false
})
}
},
playAndPauseVideo() {
let {
videoContexts = null
} = this
let isPlay = this.$util.deepCopy(this.isPlay)
if (videoContexts == null) {
let {
id
} = this.detail
this.videoContexts = uni.createVideoContext(`video_${id}`, this)
this.isPlay = true
}
let methodModel = !isPlay ? 'play' : 'pause'
this.$nextTick(() => {
// #ifdef APP-PLUS
if (!isPlay) {
this.videoContexts.requestFullScreen({
direction: 0
})
}
// #endif
this.videoContexts[methodModel]()
})
},
onPlay(e) {
this.isPlay = true
},
onPause(e) {
this.isPlay = false
},
onEnded(e) {
// #ifdef APP-PLUS
this.videoContexts.exitFullScreen()
// #endif
// #ifndef APP-PLUS
this.isPlay = false
// #endif
},
onError(e) {},
onTimeUpdate(e) {},
onWaiting(e) {},
onProgress(e) {},
onLoadedMetaData(e) {}
}
}
</script>
<style lang="scss">
.dynamic-technician-detail {
.banner-info {
width: 750rpx;
height: 654rpx;
}
.menu-info {
top: 30rpx;
right: 30rpx;
width: 60rpx;
height: 60rpx;
background: rgba(2, 2, 2, 0.5);
z-index: 99991
}
.menu-info.type-video {
background: rgba(255, 255, 255, 0.5);
}
.dynamic-info {
.avatar {
width: 84rpx;
height: 84rpx;
}
.app-follow-btn {
width: 116rpx;
height: 56rpx;
transform: rotateZ(360deg);
.iconfont {
font-size: 24rpx;
margin-right: 6rpx;
}
}
}
.dynamic-content {
color: #222;
line-height: 40rpx;
}
.hide-text {
height: 180rpx;
overflow: hidden;
}
.video-box {
width: 100%;
height: calc(100vh - 100rpx);
padding-bottom: calc(env(safe-area-inset-bottom) / 2);
.video-poster {
width: 100%;
height: 100%;
.play-video {
width: 88rpx;
height: 88rpx;
background: rgba(2, 2, 2, 0.5);
.iconfont {
font-size: 38rpx;
}
}
}
.video-poster.abs {
top: 0;
left: 0;
z-index: 1;
}
.video_item {
width: 100%;
height: 100%;
}
}
.no-data-item {
padding-bottom: 280rpx;
.avatar {
width: 54rpx;
height: 54rpx;
}
.text {
width: 616rpx;
height: 56rpx;
color: #C7C7C7;
background: #F7F7F7;
}
}
.list-item {
.avatar {
width: 72rpx;
height: 72rpx;
}
.text {
color: #ADADAD;
}
.comment {
color: #3A3A3A;
line-height: 1.4;
}
.examine-btn {
width: 82rpx;
height: 34rpx;
color: #F96246;
background: rgba(249, 98, 70, 0.1);
}
}
.bottom-info {
width: 750rpx;
background: #fff;
.dynamic-info {
.avatar {
width: 66rpx;
height: 66rpx;
}
.ml-sm {
margin-left: 15rpx;
}
.app-follow-btn {
width: 110rpx;
height: 45rpx;
transform: rotateZ(360deg);
border: 1rpx solid #fff;
.iconfont {
font-size: 24rpx;
margin-right: 6rpx;
}
}
}
.dynamic-content {
max-height: 20vh;
overflow-y: auto;
}
.comment-thumbs-info {
height: 100rpx;
.input-text {
width: 372rpx;
height: 68rpx;
background: #F6F6F6;
.iconfont {
color: #C7C7C7;
font-size: 24rpx;
}
.input {
width: 294rpx;
}
}
.thumbs-comment-btn {
min-width: 102rpx;
color: #343434;
.iconfont {
font-size: 44rpx;
margin-right: 6rpx;
}
}
}
.video-comment-black {
bottom: 0;
height: 100rpx;
height: calc(100rpx + env(safe-area-inset-bottom) / 2);
padding-bottom: calc(env(safe-area-inset-bottom) / 2);
background: #000;
z-index: -1;
}
}
.bottom-info.type-video {
padding-top: 150rpx;
background: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, #000000 100%);
.input-text {
background: #191919;
.input {
color: #fff;
}
}
.thumbs-comment-btn {
color: #fff;
}
}
.show-popup {
width: 750rpx;
background: #F3F3F5;
border-radius: 30rpx 30rpx 0 0;
.avatar {
width: 84rpx;
height: 84rpx;
}
.show-item {
color: #222;
height: 100rpx;
background: #fff;
}
}
.comment-popup {
width: 750rpx;
border-radius: 30rpx 30rpx 0 0;
.icon-add {
font-size: 36rpx;
top: 32rpx;
right: 32rpx;
}
.scroll-list {
max-height: 70vh;
}
.comment-thumbs-info {
height: 100rpx;
.input-text {
width: 690rpx;
height: 68rpx;
background: #F6F6F6;
.iconfont {
color: #C7C7C7;
font-size: 24rpx;
}
.input {
width: 612rpx;
}
}
}
}
.technician-popup {
border-radius: 20rpx 20rpx 0 0;
.item-avatar {
width: 90rpx;
height: 90rpx;
background: #f4f6f8;
}
.icon-close {
font-size: 50rpx;
}
.technician-text {
max-height: 150rpx;
}
.list-content {
max-height: 50vh;
}
.order-btn {
width: 200rpx;
height: 72rpx;
}
}
}
</style>