|
|
@@ -1,8 +1,7 @@
|
|
|
<template>
|
|
|
<ErrorPage404 v-if="!isExist"></ErrorPage404>
|
|
|
<div :class="mobile ? 'mobileMain' : ''"
|
|
|
- :style="{marginTop: mainMarginTop}"
|
|
|
- style="margin-bottom: 30px !important;"
|
|
|
+ :style="{marginTop: mainMarginTop, marginBottom: mobile ? '0 !important' : '30px !important'}"
|
|
|
v-else>
|
|
|
<div class="consult-detail-wrapper" v-if="!mobile">
|
|
|
<div class="userinfo-wrapper">
|
|
|
@@ -36,13 +35,14 @@
|
|
|
</div>
|
|
|
<div class="experience-text">
|
|
|
<img src="@/assets/img/consult/experience-icon@2x.png">
|
|
|
- <span>工作年限:{{ consultDetail.user.work_year_name}}</span>
|
|
|
+ <span>工作年限:{{ consultDetail.user.work_year_name }}</span>
|
|
|
</div>
|
|
|
<el-button class="all-buy-btn" @click="handleClickAllBuyBtn">付费咨询</el-button>
|
|
|
</div>
|
|
|
<div class="stats-content">
|
|
|
- <div v-if="consultDetail.user.zx_rating" class="rating-text">响应率:<span>{{ consultDetail.user.zxRatingText }}</span></div>
|
|
|
- <div v-if="consultDetail.user.zx_total_num" class="num-text">约聊人数:<span>{{ consultDetail.user.zx_total_num }}人</span></div>
|
|
|
+ <div class="rating-text">响应度:<span>{{ consultDetail.user.zxRatingText }}</span></div>
|
|
|
+ <div class="num-text">回复率:<span>{{ consultDetail.user.zxRatingPercent }}</span></div>
|
|
|
+ <!-- <div v-if="consultDetail.user.zx_total_num" class="num-text">约聊人数:<span>{{ consultDetail.user.zx_total_num }}人</span></div> -->
|
|
|
</div>
|
|
|
<!-- 行家自述内容 -->
|
|
|
<div class="self-description-content">
|
|
|
@@ -211,7 +211,94 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="consult-detail-wrapper-mobile" v-else>
|
|
|
-
|
|
|
+ <!-- 用户信息 -->
|
|
|
+ <div class="userinfo-wrapper">
|
|
|
+ <div class="user-content">
|
|
|
+ <img :src="consultDetail.user.icon_url" alt="avatar" class="avatar">
|
|
|
+ <div class="user-intro-content">
|
|
|
+ <div class="nickname-content">
|
|
|
+ <span class="nickname">{{ consultDetail.user.nickname }}</span>
|
|
|
+ <img class="user-level" v-if="consultDetail.user.freework_level == 3" src="@/assets/img/common/cert-f3@2x.png">
|
|
|
+ <img class="user-level" v-if="consultDetail.user.freework_level == 2" src="@/assets/img/common/cert-f2@2x.png">
|
|
|
+ </div>
|
|
|
+ <div ref="descriptionText" class="description-text">{{ consultDetail.sale_summary }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="stats-content">
|
|
|
+ <div class="stats-info">
|
|
|
+ <div class="stats-item">响应度:<span>{{ consultDetail.user.zxRatingText }}</span></div>
|
|
|
+ <div class="stats-item">回复率:<span>{{ consultDetail.user.zxRatingPercent }}</span></div>
|
|
|
+ </div>
|
|
|
+ <div class="other-user-info">工作年限:{{ consultDetail.user.work_year_name }} {{ consultDetail.user.city_op_name }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <!-- 话题列表 -->
|
|
|
+ <div class="consult-list-wrapper common-card-mobile">
|
|
|
+ <div class="common-title-mobile">擅长话题</div>
|
|
|
+ <div class="consult-list">
|
|
|
+ <div
|
|
|
+ class="consult-item"
|
|
|
+ v-for="(item, index) in consultDetail.sale_list"
|
|
|
+ :key="item.sale_id">
|
|
|
+ <div class="consult-item-header">{{ item.title }}</div>
|
|
|
+ <div class="consult-item-content">
|
|
|
+ <!-- 展开时 -->
|
|
|
+ <div class="content-info-expand" v-show="item.expand">
|
|
|
+ <div style="width: 100%; white-space: pre-wrap;">{{ item.content }}</div>
|
|
|
+ <img v-if="item.img_array.length && item.img_array[0]" :src="item.img_array[0]" alt="">
|
|
|
+ </div>
|
|
|
+ <!-- 收起时 -->
|
|
|
+ <div class="content-info" v-show="!item.expand">{{ item.content }}</div>
|
|
|
+ </div>
|
|
|
+ <div class="consult-item-pay">
|
|
|
+ <div class="expand-wrapper" @click="handleClickExpand(index)">
|
|
|
+ <span v-show="item.showExpand">{{ item.expand ? '收起' : '展开' }}</span>
|
|
|
+ <img v-show="item.showExpand" class="expand-icon" :src="item.expand ? ExpandTopIcon : ExpandDownIcon" alt="expand">
|
|
|
+ </div>
|
|
|
+ <div class="price-wrapper">
|
|
|
+ <div class="price-text">¥{{ item.price }}</div>
|
|
|
+ <el-button
|
|
|
+ :loading="item.loading"
|
|
|
+ @click="handleClickPay(item.sale_id, index)"
|
|
|
+ class="pay-btn">付费咨询</el-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <!-- 为什么选择我 -->
|
|
|
+ <div class="why-me-wrapper common-card-mobile">
|
|
|
+ <div class="common-title-mobile">为什么选择我</div>
|
|
|
+ <div class="why-me-content">{{ consultDetail.sale_summary_choose || '' }}</div>
|
|
|
+ </div>
|
|
|
+ <!-- 技能商品 -->
|
|
|
+ <div class="skill-list-wrapper common-card-mobile">
|
|
|
+ <div class="common-title-mobile">技能商品</div>
|
|
|
+ <div class="skill-list" v-if="skillList.length">
|
|
|
+ <div
|
|
|
+ class="skill-item"
|
|
|
+ v-for="item in skillList"
|
|
|
+ :key="item.sale_id"
|
|
|
+ @click="handleClickSkillItem(item.sale_id)">
|
|
|
+ <img class="cover" :src="`${item.coverImage}?x-oss-process=image/resize,w_800`" alt="skillCover,cover">
|
|
|
+ <div class="owner-wrapper">
|
|
|
+ <img class="avatar" :src="item.user.icon_url" alt="avatar">
|
|
|
+ <div class="nickname">{{ item.user.nickname }}</div>
|
|
|
+ </div>
|
|
|
+ <div class="title">{{ item.title }}</div>
|
|
|
+ <div class="price-wrapper">
|
|
|
+ <div class="price-text">¥{{ item.price }}</div>
|
|
|
+ <div class="buy-num">{{ item.buy_num }}人已学习</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="skill-empty"></div>
|
|
|
+ </div>
|
|
|
+ <!-- 发起咨询按钮 -->
|
|
|
+ <div class="consult-btn" @click="handleClickMobileAllBuyBtn">
|
|
|
+ <img src="@/assets/img/consult/consult-btn-icon@2x.png" alt="">
|
|
|
+ <span>发起咨询</span>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
<!-- 约聊时间选择 modal -->
|
|
|
<el-dialog
|
|
|
@@ -361,6 +448,144 @@
|
|
|
<div class="tips-text">超过48小时未确认将全额退款</div>
|
|
|
</div>
|
|
|
</el-dialog>
|
|
|
+ <!-- 移动端:约聊时间选择 modal -->
|
|
|
+ <el-drawer
|
|
|
+ :visible.sync="isShowMobileSelectTimeDialog"
|
|
|
+ direction="btt"
|
|
|
+ size="380px">
|
|
|
+ <div class="mobile-time-dialog-title" slot="title">选择预约时间</div>
|
|
|
+ <div class="mobile-time-dialog-content">
|
|
|
+ <div class="date-wrapper">
|
|
|
+ <div class="title">日期</div>
|
|
|
+ <div class="date-list-wrapper">
|
|
|
+ <div
|
|
|
+ class="date-item"
|
|
|
+ :class="currentDateIndex === index ? 'active' : ''"
|
|
|
+ v-for="(item, index) in orderTime"
|
|
|
+ :key="index"
|
|
|
+ @click="handleClickDialogDate(index)">
|
|
|
+ {{ item.date }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="time-wrapper">
|
|
|
+ <div class="title">时间</div>
|
|
|
+ <div class="time-list-wrapper">
|
|
|
+ <div
|
|
|
+ class="time-list-item"
|
|
|
+ v-show="currentDateIndex === index"
|
|
|
+ v-for="(item, index) in orderTime"
|
|
|
+ :key="`time-${index}`">
|
|
|
+ <!-- empty info -->
|
|
|
+ <div class="time-empty" v-if="item.time.length === 1 && item.time[0].date === '00:00'">
|
|
|
+ 当前日期无服务
|
|
|
+ </div>
|
|
|
+ <template v-else>
|
|
|
+ <div
|
|
|
+ class="time-item"
|
|
|
+ :class="selectedOrderTime === timeItem.value ? 'active' : ''"
|
|
|
+ v-for="timeItem in item.time"
|
|
|
+ :key="timeItem.value"
|
|
|
+ @click="handleClickDialogTime(timeItem.value)">
|
|
|
+ {{ timeItem.date }}
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="action-wrapper">
|
|
|
+ <el-button
|
|
|
+ class="confirm-btn"
|
|
|
+ @click="handleClickDialogConfirm">确认</el-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-drawer>
|
|
|
+ <!-- 移动端:选择话题 & 时间 drawer -->
|
|
|
+ <el-dialog
|
|
|
+ :visible.sync="isShowMobileSelectConsultDialog"
|
|
|
+ width="85%"
|
|
|
+ center
|
|
|
+ @close="handleSelectConsultClose">
|
|
|
+ <div class="select-consult-title" slot="title">选择咨询话题</div>
|
|
|
+ <div class="select-consult-content">
|
|
|
+ <div class="select-consult-list">
|
|
|
+ <div
|
|
|
+ class="select-consult-item"
|
|
|
+ :class="{ 'active': item.sale_id == selectedConsultItem.sale_id }"
|
|
|
+ v-for="(item, index) in consultDetail.sale_list"
|
|
|
+ :key="`select-consult-${item.sale_id}`"
|
|
|
+ @click="handleSelectConsultItem(item, index)">
|
|
|
+ {{ item.title }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="time-wrapper" @click="handleClickSelectTime">
|
|
|
+ <div class="time-title">
|
|
|
+ <img src="@/assets/img/consult/time-icon@2x.png" alt="">
|
|
|
+ <span>预约时间</span>
|
|
|
+ </div>
|
|
|
+ <div class="selected-time">
|
|
|
+ <span>{{ selectedOrderTime2 || '选择时间' }}</span>
|
|
|
+ <img src="@/assets/img/consult/right-arrow@2x.png" alt="">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="action-wrapper">
|
|
|
+ <el-button
|
|
|
+ class="confirm-btn"
|
|
|
+ @click="handleSelectConsultConfirm">{{ selectedConsultItem.sale_id ? `¥${selectedConsultItem.price}向TA咨询` : '选择话题' }}</el-button>
|
|
|
+ </div>
|
|
|
+ <div class="tips-text">超过48小时未确认将全额退款</div>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+ <!-- <el-drawer
|
|
|
+ :visible.sync="isShowMobileSelectConsultDialog"
|
|
|
+ direction="btt"
|
|
|
+ size="500px">
|
|
|
+ <div class="mobile-select-consult-title" slot="title">选择咨询话题</div>
|
|
|
+ <div class="mobile-select-consult-content">
|
|
|
+ <div class="select-consult-list">
|
|
|
+ <div
|
|
|
+ class="select-consult-item"
|
|
|
+ :class="{ 'active': item.sale_id == selectedConsultItem.sale_id }"
|
|
|
+ v-for="(item, index) in consultDetail.sale_list"
|
|
|
+ :key="`select-consult-${item.sale_id}`"
|
|
|
+ @click="handleSelectConsultItem(item, index)">
|
|
|
+ {{ item.title }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="time-wrapper" @click="handleClickSelectTime">
|
|
|
+ <div class="time-title">
|
|
|
+ <img src="@/assets/img/consult/time-icon@2x.png" alt="">
|
|
|
+ <span>预约时间</span>
|
|
|
+ </div>
|
|
|
+ <div class="selected-time">
|
|
|
+ <span>{{ selectedOrderTime2 || '选择时间' }}</span>
|
|
|
+ <img src="@/assets/img/consult/right-arrow@2x.png" alt="">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="action-wrapper">
|
|
|
+ <el-button
|
|
|
+ class="confirm-btn"
|
|
|
+ @click="handleSelectConsultConfirm">{{ selectedConsultItem.sale_id ? `¥${selectedConsultItem.price}向TA咨询` : '选择话题' }}</el-button>
|
|
|
+ </div>
|
|
|
+ <div class="tips-text">超过48小时未确认将全额退款</div>
|
|
|
+ </div>
|
|
|
+ </el-drawer> -->
|
|
|
+ <!-- 支付成功 dialog -->
|
|
|
+ <el-dialog
|
|
|
+ :visible.sync="isShowPaySuccess"
|
|
|
+ width="85%"
|
|
|
+ top="calc(50vh - 130px)"
|
|
|
+ center>
|
|
|
+ <div class="pay-success-title" slot="title">支付成功</div>
|
|
|
+ <div class="pay-success-content">
|
|
|
+ <div class="pay-success-text">等待服务方接单,届时请留意手机短信。具体订单信息,请登录电脑端查看。</div>
|
|
|
+ <div class="action-wrapper">
|
|
|
+ <el-button
|
|
|
+ class="confirm-btn"
|
|
|
+ @click="handleClickPayConfirm">确定</el-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
@@ -429,11 +654,17 @@ export default {
|
|
|
commentContent: '',
|
|
|
// 是否展示选择咨询 dialog
|
|
|
isShowSelectConsultDialog: false,
|
|
|
+ // 是否展示移动端选择咨询 dialog
|
|
|
+ isShowMobileSelectConsultDialog: false,
|
|
|
// 选择的咨询话题
|
|
|
selectedConsultItem: {},
|
|
|
selectedConsultIndex: -1,
|
|
|
// 从选中咨询 dialog 选择的时间
|
|
|
- selectedOrderTime2: ''
|
|
|
+ selectedOrderTime2: '',
|
|
|
+ // 是否展示移动端时间选择 modal
|
|
|
+ isShowMobileSelectTimeDialog: false,
|
|
|
+ // 是否展示支付成功
|
|
|
+ isShowPaySuccess: false
|
|
|
}
|
|
|
},
|
|
|
components: {
|
|
|
@@ -478,7 +709,7 @@ export default {
|
|
|
},
|
|
|
mainMarginTop () {
|
|
|
if (this.mobile && this.showWxHeader) {
|
|
|
- return '64px !important'
|
|
|
+ return '0px !important'
|
|
|
} else if (this.mobile) {
|
|
|
return '0px !important'
|
|
|
} else {
|
|
|
@@ -509,11 +740,15 @@ export default {
|
|
|
}, 800)
|
|
|
}
|
|
|
|
|
|
- // 获取评论列表
|
|
|
- this.commentPagination.wid = this.uid
|
|
|
- this._getCommentList()
|
|
|
- // 监听页面滚动
|
|
|
- window.addEventListener('scroll', this._handleScroll, true)
|
|
|
+ if (!this.mobile) {
|
|
|
+ // 获取评论列表
|
|
|
+ this.commentPagination.wid = this.uid
|
|
|
+ this._getCommentList()
|
|
|
+ // 监听页面滚动
|
|
|
+ window.addEventListener('scroll', this._handleScroll, true)
|
|
|
+ } else {
|
|
|
+ window.proginnMobile = this
|
|
|
+ }
|
|
|
},
|
|
|
methods: {
|
|
|
/**
|
|
|
@@ -631,7 +866,11 @@ export default {
|
|
|
}
|
|
|
self.orderTime = orderTime
|
|
|
self.actionSaleId = saleId
|
|
|
- self.isShowSelectTimeDialog = true
|
|
|
+ if (self.mobile) {
|
|
|
+ self.isShowMobileSelectTimeDialog = true
|
|
|
+ } else {
|
|
|
+ self.isShowSelectTimeDialog = true
|
|
|
+ }
|
|
|
}
|
|
|
console.log(res)
|
|
|
})
|
|
|
@@ -686,7 +925,11 @@ export default {
|
|
|
consultItem.orderTime[0].time[0].date !== '00:00') {
|
|
|
this.selectedOrderTime = consultItem.orderTime[0].time[0].value
|
|
|
}
|
|
|
- this.isShowSelectTimeDialog = true
|
|
|
+ if (this.mobile) {
|
|
|
+ this.isShowMobileSelectTimeDialog = true
|
|
|
+ } else {
|
|
|
+ this.isShowSelectTimeDialog = true
|
|
|
+ }
|
|
|
} else {
|
|
|
this._getConsultTime(saleId, index)
|
|
|
}
|
|
|
@@ -717,7 +960,7 @@ export default {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- if (this.isShowSelectConsultDialog) {
|
|
|
+ if (this.isShowSelectConsultDialog || this.isShowMobileSelectConsultDialog) {
|
|
|
// 从选择咨询话题 modal 中打开
|
|
|
this.selectedOrderTime2 = this.selectedOrderTime
|
|
|
} else {
|
|
|
@@ -729,13 +972,28 @@ export default {
|
|
|
next: '/wo/purchased?type=3'
|
|
|
}
|
|
|
if (!this.userinfo || !this.userinfo.nickname) {
|
|
|
- location.href = this.baseUrl + "/?loginbox=show&next=" + encodeURIComponent(location.href)
|
|
|
+ // 未登录
|
|
|
+ if (this.deviceType.android || this.deviceType.ios) {
|
|
|
+ // 端
|
|
|
+ location.href = "proginn://login?backToPage=true";
|
|
|
+ } else {
|
|
|
+ // web
|
|
|
+ location.href = this.baseUrl + "/?loginbox=show&next=" + encodeURIComponent(location.href)
|
|
|
+ }
|
|
|
} else {
|
|
|
- location.href = `/pay?${qs.stringify(query)}`
|
|
|
+ // 跳转支付
|
|
|
+ if (this.deviceType.android || this.deviceType.ios) {
|
|
|
+ // 端
|
|
|
+ location.href = "proginn://pay?" + qs.stringify(query)
|
|
|
+ } else {
|
|
|
+ // web
|
|
|
+ location.href = `/pay?${qs.stringify(query)}`
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
this.isShowSelectTimeDialog = false
|
|
|
+ this.isShowMobileSelectTimeDialog = false
|
|
|
},
|
|
|
/**
|
|
|
* 点击约聊 modal 的取消
|
|
|
@@ -961,15 +1219,64 @@ export default {
|
|
|
product_type: 503,
|
|
|
product_id: this.selectedConsultItem.sale_id,
|
|
|
obj: this.selectedOrderTime2,
|
|
|
- next: location.href + '?act=pay'
|
|
|
+ next: '/wo/purchased?type=3'
|
|
|
}
|
|
|
if (!this.userinfo || !this.userinfo.nickname) {
|
|
|
- location.href = this.baseUrl + "/?loginbox=show&next=" + encodeURIComponent(location.href)
|
|
|
+ // 未登录
|
|
|
+ if (this.deviceType.android || this.deviceType.ios) {
|
|
|
+ // 端
|
|
|
+ location.href = "proginn://login?backToPage=true";
|
|
|
+ } else {
|
|
|
+ // web
|
|
|
+ location.href = this.baseUrl + "/?loginbox=show&next=" + encodeURIComponent(location.href)
|
|
|
+ }
|
|
|
} else {
|
|
|
- location.href = `/pay?${qs.stringify(query)}`
|
|
|
+ // 跳转支付
|
|
|
+ if (this.deviceType.android || this.deviceType.ios) {
|
|
|
+ // 端
|
|
|
+ location.href = "proginn://pay?" + qs.stringify(query)
|
|
|
+ } else {
|
|
|
+ // web
|
|
|
+ location.href = `/pay?${qs.stringify(query)}`
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
this.isShowSelectConsultDialog = false
|
|
|
+ this.isShowMobileSelectConsultDialog = false
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 点击 mobile 的一项技能时
|
|
|
+ */
|
|
|
+ handleClickSkillItem (saleId) {
|
|
|
+ location.href = `/s/${saleId}`
|
|
|
+ // if (this.deviceType.android || this.deviceType.ios) {
|
|
|
+ // // 端跳转
|
|
|
+ // let jumpUrl = `${this.baseUrl}/s/${saleId}`
|
|
|
+ // location.href = `proginn://webview?url=${jumpUrl}`
|
|
|
+ // } else {
|
|
|
+ // // web 跳转
|
|
|
+ // location.href = `/s/${saleId}`
|
|
|
+ // }
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 点击移动端 - 全部咨询按钮
|
|
|
+ */
|
|
|
+ handleClickMobileAllBuyBtn () {
|
|
|
+ this.isShowMobileSelectConsultDialog = true
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 展示支付成功
|
|
|
+ */
|
|
|
+ showPaySuccess () {
|
|
|
+ const self = this
|
|
|
+ this.isShowPaySuccess = true
|
|
|
+
|
|
|
+ setTimeout(() => {
|
|
|
+ self.isShowPaySuccess = false
|
|
|
+ }, 5000)
|
|
|
+ },
|
|
|
+ handleClickPayConfirm () {
|
|
|
+ this.isShowPaySuccess = false
|
|
|
}
|
|
|
}
|
|
|
}
|