Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5f835afd8b |
@@ -23,13 +23,12 @@
|
||||
</view>
|
||||
<!-- 输入框 -->
|
||||
<view class="input-wrap flex-center-between">
|
||||
<textarea
|
||||
<input
|
||||
v-model.trim="prompt"
|
||||
:show-confirm-bar="false"
|
||||
:adjust-position="true"
|
||||
:auto-height="true"
|
||||
:disabled="loading"
|
||||
:maxlength="500"
|
||||
:maxlength="-1"
|
||||
class="inp"
|
||||
@confirm="sendHandle"
|
||||
@focus="promptInputFocusHandle"
|
||||
@@ -128,7 +127,6 @@ export default {
|
||||
* 怎么申请地理标志保护产品?
|
||||
* 想找个像《去有风的地方》那样的治愈县城
|
||||
* 云南有哪些小众县城适合旅居?
|
||||
* 查询最近一个月的订单
|
||||
*/
|
||||
prompt: '',
|
||||
recordManager: null,
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
</view>
|
||||
<view v-else class="no-data">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/ai-chat-no-data.png'"
|
||||
:src="webUrl + '/orderIcon/nodata1.png'"
|
||||
class="img"
|
||||
mode="widthFix"
|
||||
/>
|
||||
@@ -68,7 +68,7 @@
|
||||
</view>
|
||||
<view v-else class="no-data">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/ai-chat-no-data.png'"
|
||||
:src="webUrl + '/orderIcon/nodata1.png'"
|
||||
class="img"
|
||||
mode="widthFix"
|
||||
/>
|
||||
@@ -99,7 +99,7 @@
|
||||
</view>
|
||||
<view v-else class="no-data">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/ai-chat-no-data.png'"
|
||||
:src="webUrl + '/orderIcon/nodata1.png'"
|
||||
class="img"
|
||||
mode="widthFix"
|
||||
/>
|
||||
@@ -170,7 +170,6 @@ export default {
|
||||
url: '/aiChat/views/history' + paramsStr
|
||||
})
|
||||
}
|
||||
this.$emit('enterHistory')
|
||||
this.closeLayer()
|
||||
},
|
||||
closeLayer() {
|
||||
|
||||
@@ -1,263 +0,0 @@
|
||||
<template>
|
||||
<view
|
||||
class="order-item"
|
||||
>
|
||||
<view class="order-header">
|
||||
<view class="order-shop">
|
||||
<view class="shop-name">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/icon-57.png'"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
lazy-load
|
||||
/>
|
||||
{{ item.merName }}
|
||||
</view>
|
||||
<view class="order-id">
|
||||
订单号:{{ item.orderId }}
|
||||
</view>
|
||||
</view>
|
||||
<view class="status">
|
||||
{{ item.statusName }}
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="item.isGiftCardReceiveBlind === 0" class="product-info-wrap">
|
||||
<view
|
||||
v-for="cartItem in item.cartInfo"
|
||||
:key="cartItem.productId"
|
||||
class="product-info"
|
||||
>
|
||||
<view class="good-img">
|
||||
<image
|
||||
:src="cartItem.productInfo.image"
|
||||
class="img"
|
||||
mode="widthFix"
|
||||
lazy-load
|
||||
/>
|
||||
</view>
|
||||
<view class="name-wrap">
|
||||
<view class="name one-t">
|
||||
{{ cartItem.productInfo.storeName }}
|
||||
</view>
|
||||
<view class="attr">
|
||||
规格:{{ cartItem.productInfo.attrInfo.sku || '' }}
|
||||
</view>
|
||||
</view>
|
||||
<view class="price-num">
|
||||
<view>
|
||||
¥{{ cartItem.truePrice }}
|
||||
</view>
|
||||
<view class="num">
|
||||
x{{ cartItem.cartNum }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view v-else class="product-info-wrap">
|
||||
<view
|
||||
class="product-info product-info2"
|
||||
>
|
||||
<view class="good-img">
|
||||
<image
|
||||
:src="webUrl + '/orderIcon/盲盒礼包.png'"
|
||||
class="img"
|
||||
mode="widthFix"
|
||||
lazy-load
|
||||
/>
|
||||
</view>
|
||||
<view class="name-wrap">
|
||||
<view class="name one-t">
|
||||
盲盒礼物
|
||||
</view>
|
||||
<view class="attr">
|
||||
待收货后展示商品信息
|
||||
</view>
|
||||
</view>
|
||||
<view class="price-num">
|
||||
<view style="color: #fff;">
|
||||
¥0.00
|
||||
</view>
|
||||
<view class="num">
|
||||
x1
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="order-bottom">
|
||||
<view class="time-total">
|
||||
<view class="time">
|
||||
{{ formatDateTime(item.createTime) }}
|
||||
</view>
|
||||
<view class="total">
|
||||
共{{ item.totalNum }}件商品
|
||||
<text v-if="item.isGiftCardReceiveBlind === 0" class="total-txt">
|
||||
总金额<text class="color-red">¥{{ item.totalPrice }}</text>
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="btns">
|
||||
<view class="btn" @click="viewOrderTrack">查看物流</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { formatDateTime } from '@/utils/index'
|
||||
export default {
|
||||
name: 'AiHistoryList',
|
||||
props: {
|
||||
item: {
|
||||
type: Object,
|
||||
default: () => {}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
webUrl: this.$VUE_APP_RESOURCES_URL
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
formatDateTime,
|
||||
viewOrderTrack() {
|
||||
this.$emit('viewOrderTrack', this.item)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="less">
|
||||
.order-item {
|
||||
padding: 20rpx;
|
||||
border-radius: 20rpx;
|
||||
background-color: #fff;
|
||||
box-shadow: 0rpx 6rpx 20rpx rgba(101,101,101,0.16);
|
||||
.order-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
.order-shop {
|
||||
flex: 1;
|
||||
width: calc(100% - 120rpx);
|
||||
.shop-name {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: #333;
|
||||
font-size: 28rpx;
|
||||
line-height: 40rpx;
|
||||
.icon {
|
||||
display: block;
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
margin-right: 10rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
.order-id {
|
||||
margin-top: 20rpx;
|
||||
font-size: 24rpx;
|
||||
color: #666;
|
||||
}
|
||||
.status {
|
||||
width: 100rpx;
|
||||
height: 40rpx;
|
||||
border-radius: 10rpx;
|
||||
color: #fff;
|
||||
font-size: 24rpx;
|
||||
line-height: 40rpx;
|
||||
text-align: center;
|
||||
background: rgba(197,39,51,1);
|
||||
}
|
||||
}
|
||||
.product-info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 20rpx 0;
|
||||
font-size: 28rpx;
|
||||
.good-img {
|
||||
.img {
|
||||
display: block;
|
||||
width: 120rpx;
|
||||
height: 120rpx;
|
||||
border-radius: 8rpx;
|
||||
}
|
||||
}
|
||||
.name-wrap {
|
||||
height: 120rpx;
|
||||
width: calc(100% - 260rpx);
|
||||
.name {
|
||||
line-height: 40rpx;
|
||||
}
|
||||
.attr {
|
||||
display: inline-block;
|
||||
height: 50rpx;
|
||||
max-width: 100%;
|
||||
padding: 0 25rpx;
|
||||
margin: 20rpx 0 0 0;
|
||||
border-radius: 25rpx;
|
||||
line-height: 50rpx;
|
||||
color: #252525;
|
||||
background: rgba(239,239,239,0.39);
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
}
|
||||
.price-num {
|
||||
width: 100rpx;
|
||||
text-align: right;
|
||||
line-height: 40rpx;
|
||||
.num {
|
||||
font-size: 20rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
.product-info2 {
|
||||
.name-wrap {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
.attr {
|
||||
padding: 0;
|
||||
font-size: 24rpx;
|
||||
color: #999;
|
||||
background-color: #fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
.order-bottom {
|
||||
.time-total {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
color: #999;
|
||||
font-size: 22rpx;
|
||||
.total-txt {
|
||||
color: #333;
|
||||
font-size: 28rpx;
|
||||
font-weight: 600;
|
||||
}
|
||||
.color-red {
|
||||
color: #C52733;
|
||||
}
|
||||
}
|
||||
.btns {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
margin: 24rpx 0 0 0;
|
||||
.btn {
|
||||
height: 44rpx;
|
||||
padding: 0 24rpx;
|
||||
border-radius: 22rpx;
|
||||
border: 1rpx solid #C52733;
|
||||
color: #C52733;
|
||||
font-size: 28rpx;
|
||||
line-height: 44rpx;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
+4
-165
@@ -2,7 +2,7 @@ import {
|
||||
getSseConfigV1,
|
||||
getCompletionsV2,
|
||||
deleteChatItemByConversationId,
|
||||
// getAnalyzeKeywordsV1,
|
||||
getAnalyzeKeywordsV1,
|
||||
getAnalyzeKeywordsChangeV1
|
||||
} from '@/api/chat/index'
|
||||
import { VUE_APP_API_URL } from '@/config'
|
||||
@@ -10,37 +10,12 @@ import settings from '@/config/baseSetting.js'
|
||||
import { formatAiMsgContent } from '../utils/aiChat'
|
||||
import cookie from '@/utils/store/cookie'
|
||||
import { handleLoginFailure } from '@/utils'
|
||||
const plugin = requirePlugin('WechatSI')
|
||||
const removeMarkdown = require('remove-markdown')
|
||||
export const chatMixins = {
|
||||
data() {
|
||||
return {
|
||||
token: cookie.get('login_status'),
|
||||
userInfo: cookie.get('userInfo'),
|
||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||
bottomTools: Object.freeze([
|
||||
{
|
||||
icon: 'icon-50',
|
||||
text: '我要送礼',
|
||||
type: 'prompt',
|
||||
prompt: '我要送礼,请给我推荐一些平台的礼品',
|
||||
url: ''
|
||||
},
|
||||
{
|
||||
icon: 'icon-51',
|
||||
text: '订单查询',
|
||||
type: 'prompt',
|
||||
prompt: '订单查询',
|
||||
url: ''
|
||||
},
|
||||
{
|
||||
icon: 'icon-52',
|
||||
text: '拍照识图',
|
||||
type: 'link',
|
||||
prompt: '',
|
||||
url: '/aiChat/views/imageRecognition'
|
||||
}
|
||||
]),
|
||||
scrollData: {},
|
||||
scrollTop: 0,
|
||||
isScrollToBottom: false,
|
||||
@@ -71,11 +46,7 @@ export const chatMixins = {
|
||||
}
|
||||
*/
|
||||
],
|
||||
errorMsg: Object.freeze('您提的问题未能理解,云灵思想跑偏啦,重新整理一下问题或者重新提问,让云灵再试试!'),
|
||||
audioAyy: [],
|
||||
isPlayAudio: false,
|
||||
audioContext: null,
|
||||
audioPlayId: ''
|
||||
errorMsg: Object.freeze('您提的问题未能理解,云灵思想跑偏啦,重新整理一下问题或者重新提问,让云灵再试试!')
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -100,11 +71,9 @@ export const chatMixins = {
|
||||
}.bind(this)).exec()
|
||||
},
|
||||
onUnload() {
|
||||
if (this.audioContext) {
|
||||
this.audioContext.stop()
|
||||
}
|
||||
wx.getBackgroundAudioManager().stop()
|
||||
this.closeWsFn()
|
||||
// console.log('在页面卸载时取消监听')
|
||||
// wx.offKeyboardHeightChange()
|
||||
},
|
||||
created() {
|
||||
const _this = this
|
||||
@@ -175,7 +144,6 @@ export const chatMixins = {
|
||||
},
|
||||
// 重新生成
|
||||
regenerateHandle(item) {
|
||||
this.audioStopHandle()
|
||||
deleteChatItemByConversationId(item.conversationId).then(res => {
|
||||
const { success } = res
|
||||
if (success) {
|
||||
@@ -253,7 +221,6 @@ export const chatMixins = {
|
||||
_this.chatErrorSetContent()
|
||||
})
|
||||
})
|
||||
/*
|
||||
getAnalyzeKeywordsV1({
|
||||
'chatNumber': _this.chatNumber,
|
||||
conversationId,
|
||||
@@ -280,7 +247,6 @@ export const chatMixins = {
|
||||
console.log(_this.chatMessageList[_this.chatMessageListLength - 1])
|
||||
}
|
||||
})
|
||||
*/
|
||||
} else {
|
||||
_this.chatErrorSetContent()
|
||||
}
|
||||
@@ -312,7 +278,6 @@ export const chatMixins = {
|
||||
})
|
||||
},
|
||||
productItemClickHandle(item) {
|
||||
this.audioStopHandle()
|
||||
this.$yrouter.push({
|
||||
path: '/pages/shop/GoodsCon/index',
|
||||
query: {
|
||||
@@ -321,7 +286,6 @@ export const chatMixins = {
|
||||
})
|
||||
},
|
||||
hotelItemClickHandle(item) {
|
||||
this.audioStopHandle()
|
||||
this.$yrouter.push({
|
||||
path: '/pagesInn/inn/innHome',
|
||||
query: {
|
||||
@@ -330,7 +294,6 @@ export const chatMixins = {
|
||||
})
|
||||
},
|
||||
ichItemClickHandle(item) {
|
||||
this.audioStopHandle()
|
||||
this.$yrouter.push({
|
||||
path: '/pkg_product/views/heritage/details',
|
||||
query: {
|
||||
@@ -339,7 +302,6 @@ export const chatMixins = {
|
||||
})
|
||||
},
|
||||
qianxianItemClickHandle(item) {
|
||||
this.audioStopHandle()
|
||||
this.$yrouter.push({
|
||||
path: '/pkg_product/views/famousQianxianShop',
|
||||
query: {
|
||||
@@ -347,10 +309,6 @@ export const chatMixins = {
|
||||
}
|
||||
})
|
||||
},
|
||||
prizeItemClickHandle() {
|
||||
this.audioStopHandle()
|
||||
this.$yrouter.push({ path: '/pkg-video/views/lottery' })
|
||||
},
|
||||
chatErrorSetContent() {
|
||||
this.chatMessageList[this.chatMessageListLength - 1].isError = true
|
||||
this.chatMessageList[this.chatMessageListLength - 1].content = this.errorMsg
|
||||
@@ -441,125 +399,6 @@ export const chatMixins = {
|
||||
} catch (err) {
|
||||
console.log('send failed (' + err.code + ')')
|
||||
}
|
||||
},
|
||||
audioStopHandle() {
|
||||
// Fix bug#4049
|
||||
this.audioAyy = []
|
||||
if (this.audioContext) {
|
||||
this.audioContext.stop()
|
||||
}
|
||||
this.isPlayAudio = false
|
||||
wx.getBackgroundAudioManager().stop()
|
||||
},
|
||||
ttsHandle(item) {
|
||||
this.audioAyy = []
|
||||
if (this.audioContext) {
|
||||
this.audioContext.stop()
|
||||
// this.audioContext.destroy()
|
||||
}
|
||||
// 如果正在播放,点击当前播放的则认为是暂停
|
||||
if (this.isPlayAudio && item.conversationId === this.audioPlayId) {
|
||||
this.isPlayAudio = false
|
||||
this.audioPlayId = ''
|
||||
return
|
||||
}
|
||||
this.isPlayAudio = false
|
||||
this.audioPlayId = item.conversationId
|
||||
const flag = 1
|
||||
if (flag === 1) {
|
||||
console.log(removeMarkdown(item.content).replace(/[\n\t\s]/g, ''))
|
||||
uni.showLoading({
|
||||
title: '合成中...'
|
||||
})
|
||||
this.splitAndSynthesize(removeMarkdown(item.content).replace(/[\n\t\s]/g, ''))
|
||||
} else {
|
||||
// 调试数据
|
||||
this.audioAyy = [
|
||||
'https://ae.weixin.qq.com/cgi-bin/mmasrai-bin/getmedia?filename=1750749075_2f71887cc48d9b3753c39d119862d4bb&filekey=871027724&source=miniapp_plugin',
|
||||
'https://ae.weixin.qq.com/cgi-bin/mmasrai-bin/getmedia?filename=1750749077_0970508786c5e3edc3a68a5eb9de048c&filekey=871027724&source=miniapp_plugin',
|
||||
'https://ae.weixin.qq.com/cgi-bin/mmasrai-bin/getmedia?filename=1750749079_e77cec52cc077ba981892887c3df4cdf&filekey=871027724&source=miniapp_plugin',
|
||||
'https://ae.weixin.qq.com/cgi-bin/mmasrai-bin/getmedia?filename=1750749080_02db4235771f5561cdb73c06d8c67e53&filekey=871027724&source=miniapp_plugin',
|
||||
'https://ae.weixin.qq.com/cgi-bin/mmasrai-bin/getmedia?filename=1750749082_534e455c5d6ac5e9a4192ecf9952851a&filekey=871027724&source=miniapp_plugin',
|
||||
'https://ae.weixin.qq.com/cgi-bin/mmasrai-bin/getmedia?filename=1750749083_78c4a2fecad538561f81c48dc4ecd645&filekey=871027724&source=miniapp_plugin'
|
||||
]
|
||||
this.playNextChunk()
|
||||
}
|
||||
},
|
||||
splitAndSynthesize(text) {
|
||||
const _this = this
|
||||
if (text) {
|
||||
const textLength = text.length
|
||||
const chunkSize = 100
|
||||
const chunk = text.slice(0, textLength > chunkSize ? chunkSize : textLength)
|
||||
plugin.textToSpeech({
|
||||
// 语言
|
||||
lang: 'zh_CN',
|
||||
tts: true,
|
||||
// 要转换的文字
|
||||
content: chunk,
|
||||
success: function(res) {
|
||||
console.log("语音文件路径:", res.filename)
|
||||
_this.audioAyy.push(res.filename)
|
||||
// 首次就立即播放,增强体验
|
||||
if (!_this.isPlayAudio) {
|
||||
_this.playNextChunk()
|
||||
}
|
||||
if (textLength > chunkSize) {
|
||||
// 递归调用,播放一定要按照文本分割顺序
|
||||
_this.splitAndSynthesize(text.substr(chunkSize, textLength))
|
||||
} else {
|
||||
// 最后一条合成,没有正在播放则立即播放
|
||||
if (!_this.isPlayAudio) {
|
||||
_this.playNextChunk()
|
||||
}
|
||||
}
|
||||
uni.hideLoading()
|
||||
},
|
||||
fail: function(err) {
|
||||
console.log("转换失败:", err)
|
||||
uni.hideLoading()
|
||||
}
|
||||
})
|
||||
} else {
|
||||
if (!_this.isPlayAudio) {
|
||||
_this.playNextChunk()
|
||||
}
|
||||
uni.hideLoading()
|
||||
}
|
||||
},
|
||||
playNextChunk() {
|
||||
if (this.audioAyy.length > 0 && this.audioPlayId) {
|
||||
const src = this.audioAyy.shift()
|
||||
this.isPlayAudio = true
|
||||
const audioContext = uni.createInnerAudioContext({
|
||||
// 是否使用 WebAudio 作为底层音频驱动,默认关闭。对于短音频、播放频繁的音频建议开启此选项,开启后将获得更优的性能表现。由于开启此选项后也会带来一定的内存增长,因此对于长音频建议关闭此选项
|
||||
useWebAudioImplement: false
|
||||
})
|
||||
this.audioContext = audioContext
|
||||
audioContext.src = src
|
||||
audioContext.onEnded(() => {
|
||||
audioContext.destroy()
|
||||
this.playNextChunk()
|
||||
})
|
||||
audioContext.play()
|
||||
console.log('------------src:' + src)
|
||||
} else {
|
||||
console.log('------------end')
|
||||
this.isPlayAudio = false
|
||||
}
|
||||
},
|
||||
bottomToolClickHandle(item) {
|
||||
if (item.type === 'prompt') {
|
||||
this.streamReq({
|
||||
prompt: item.prompt,
|
||||
init: 0
|
||||
})
|
||||
}
|
||||
if (item.type === 'link') {
|
||||
uni.navigateTo({
|
||||
url: item.url
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,716 +0,0 @@
|
||||
import {
|
||||
getSseConfigV1,
|
||||
getCompletionsV3,
|
||||
deleteChatItemByConversationId,
|
||||
// getAnalyzeKeywordsV1,
|
||||
getAnalyzeKeywordsChangeV3
|
||||
} from '@/api/chat/index'
|
||||
import {
|
||||
postCartAdd
|
||||
} from '@/api/store'
|
||||
import { VUE_APP_API_URL } from '@/config'
|
||||
import settings from '@/config/baseSetting.js'
|
||||
import { formatAiMsgContent } from '../utils/aiChat'
|
||||
import cookie from '@/utils/store/cookie'
|
||||
import { handleLoginFailure } from '@/utils'
|
||||
const plugin = requirePlugin('WechatSI')
|
||||
const removeMarkdown = require('remove-markdown')
|
||||
export const chatMixinsV2 = {
|
||||
data() {
|
||||
return {
|
||||
token: cookie.get('login_status'),
|
||||
userInfo: cookie.get('userInfo'),
|
||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||
bottomTools: Object.freeze([
|
||||
{
|
||||
icon: 'icon-50',
|
||||
text: '我要送礼',
|
||||
type: 'prompt',
|
||||
prompt: '我要送礼,请给我推荐一些平台的礼品',
|
||||
url: ''
|
||||
},
|
||||
{
|
||||
icon: 'icon-51',
|
||||
text: '订单查询',
|
||||
type: 'prompt',
|
||||
prompt: '帮我查询我的待发货、待收货订单信息',
|
||||
url: ''
|
||||
},
|
||||
{
|
||||
icon: 'icon-52',
|
||||
text: '拍照识图',
|
||||
type: 'link',
|
||||
prompt: '',
|
||||
url: '/aiChat/views/imageRecognition'
|
||||
}
|
||||
]),
|
||||
scrollData: {},
|
||||
scrollTop: 0,
|
||||
isScrollToBottom: false,
|
||||
// 状态栏高度
|
||||
statusBarHeight: 20,
|
||||
bottomSafeDistance: 0,
|
||||
fileHttpStr: Object.freeze(VUE_APP_API_URL + settings.sysPrefix),
|
||||
keyboardHeight: 0,
|
||||
optionsFrom: '',
|
||||
onFocus: false,
|
||||
loading: false,
|
||||
chatNumber: '',
|
||||
infoResData: {},
|
||||
chatMessageList: [
|
||||
/*
|
||||
{
|
||||
type: -2,
|
||||
isError: false,
|
||||
showCursor: false,
|
||||
conversationId: '',
|
||||
prompt: '',
|
||||
nodes: '-------------监听 WebSocket 接受到服务器的消息事件',
|
||||
content: '-------------监听 WebSocket 接受到服务器的消息事件',
|
||||
listQuestion: [
|
||||
'监听 WebSocket 接受到服务器的消息事件',
|
||||
'监听 WebSocket 接受到服务器的消息事件',
|
||||
'监听 WebSocket 接受到服务器的消息事件'
|
||||
]
|
||||
}
|
||||
*/
|
||||
],
|
||||
errorMsg: Object.freeze('您提的问题未能理解,云灵思想跑偏啦,重新整理一下问题或者重新提问,让云灵再试试!'),
|
||||
audioAyy: [],
|
||||
isPlayAudio: false,
|
||||
audioContext: null,
|
||||
audioPlayId: '',
|
||||
showGiftBtn: false,
|
||||
buyLoading: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
chatMessageListLength() {
|
||||
return this.chatMessageList.length
|
||||
}
|
||||
},
|
||||
onPageScroll(e) {
|
||||
this.scrollData = e
|
||||
const scrollTop = e.scrollTop
|
||||
this.scrollTop = scrollTop
|
||||
const query = wx.createSelectorQuery().in(this)
|
||||
query.select('#fixTbabarBody').boundingClientRect(function(rect) {
|
||||
const contentHeight = rect.height
|
||||
const windowInfo = wx.getWindowInfo()
|
||||
const windowHeight = windowInfo.windowHeight
|
||||
if (scrollTop + windowHeight + 30 >= contentHeight) {
|
||||
this.isScrollToBottom = true
|
||||
} else {
|
||||
this.isScrollToBottom = false
|
||||
}
|
||||
}.bind(this)).exec()
|
||||
},
|
||||
onUnload() {
|
||||
if (this.audioContext) {
|
||||
this.audioContext.stop()
|
||||
}
|
||||
wx.getBackgroundAudioManager().stop()
|
||||
this.closeWsFn()
|
||||
},
|
||||
created() {
|
||||
const _this = this
|
||||
uni.getSystemInfo({
|
||||
success: (e) => {
|
||||
let statusBar = 0
|
||||
// #ifdef MP-WEIXIN
|
||||
statusBar = e.statusBarHeight
|
||||
const custom = uni.getMenuButtonBoundingClientRect()
|
||||
_this.rightDistance = e.windowWidth - custom.left + 10
|
||||
// #endif
|
||||
// 状态栏高度
|
||||
_this.statusBarHeight = statusBar
|
||||
_this.bottomSafeDistance = e.safeAreaInsets.bottom
|
||||
}
|
||||
})
|
||||
_this.createdCallbak()
|
||||
},
|
||||
methods: {
|
||||
createdCallbak() {
|
||||
console.log('页面初始话回调')
|
||||
},
|
||||
inputFocusHandle(value) {
|
||||
this.onFocus = value === 1
|
||||
this.scrollToBottomHandle()
|
||||
},
|
||||
historyViewHandle() {
|
||||
console.log(this.$refs.historyView)
|
||||
this.$refs.historyView.showView()
|
||||
},
|
||||
copyContentHandle(data) {
|
||||
uni.setClipboardData({
|
||||
data,
|
||||
success: () => {
|
||||
uni.showToast({
|
||||
title: '已复制'
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
copyMoreInfoHandle(item) {
|
||||
uni.setClipboardData({
|
||||
data: JSON.stringify(item.showMoreInfo),
|
||||
success: () => {
|
||||
uni.showToast({
|
||||
title: '已复制'
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
shareHandle() {
|
||||
wx.showShareMenu({
|
||||
withShareTicket: true,
|
||||
menus: ['shareAppMessage', 'shareTimeline'],
|
||||
success: (res) => {
|
||||
console.log(res)
|
||||
},
|
||||
fail: err => {
|
||||
console.log(err)
|
||||
}
|
||||
})
|
||||
},
|
||||
scrollToBottomHandle() {
|
||||
uni.pageScrollTo({
|
||||
duration: 100,
|
||||
selector: '#bottom_postion'
|
||||
})
|
||||
this.isScrollToBottom = true
|
||||
},
|
||||
// 重新生成
|
||||
regenerateHandle(item) {
|
||||
this.audioStopHandle()
|
||||
deleteChatItemByConversationId(item.conversationId).then(res => {
|
||||
const { success } = res
|
||||
if (success) {
|
||||
this.chatMessageList.splice(this.chatMessageListLength - 1, 1)
|
||||
this.streamReq({
|
||||
prompt: item.prompt,
|
||||
init: 1
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
// 建议提问
|
||||
suggestionItemClickHandle(question) {
|
||||
this.streamReq({
|
||||
prompt: question,
|
||||
init: 0
|
||||
})
|
||||
},
|
||||
// 大家都在问
|
||||
topicItemClickHandle(question) {
|
||||
this.streamReq({
|
||||
prompt: question,
|
||||
init: 0
|
||||
})
|
||||
},
|
||||
streamReq(params) {
|
||||
const _this = this
|
||||
// 需要校验登录状态
|
||||
if (!_this.token) {
|
||||
handleLoginFailure()
|
||||
return
|
||||
}
|
||||
const prompt = params.prompt
|
||||
if (params.init !== 1) {
|
||||
_this.chatMessageList.push({
|
||||
prompt,
|
||||
type: -1
|
||||
})
|
||||
}
|
||||
_this.$nextTick(() => {
|
||||
_this.scrollToBottomHandle()
|
||||
})
|
||||
_this.chatMessageList.push({
|
||||
content: '',
|
||||
nodes: '',
|
||||
isError: false,
|
||||
showCursor: false,
|
||||
conversationId: '',
|
||||
prompt,
|
||||
listQuestion: [],
|
||||
// 特产商品
|
||||
goodsList: [],
|
||||
// 礼品商品
|
||||
giftGoodsList: [],
|
||||
// 非遗文化
|
||||
ichList: [],
|
||||
// 千县名品
|
||||
qianxianList: [],
|
||||
// 抽奖
|
||||
prizeList: [],
|
||||
// 店铺
|
||||
shopList: [],
|
||||
// 地标好物--屏蔽原因:实现此功能时,后端通过AI动态返回的图片不满足需求,后面就不要了
|
||||
landmarksList: [],
|
||||
// 订单
|
||||
orderList: [],
|
||||
type: -2,
|
||||
showMoreInfo: {},
|
||||
currentSwiperIndex: 0,
|
||||
showChangeBtn: true,
|
||||
changeIsRotate: false
|
||||
})
|
||||
_this.loading = true
|
||||
_this.showCursor = false
|
||||
getSseConfigV1({
|
||||
'chatNumber': _this.chatNumber,
|
||||
prompt
|
||||
}).then(resConfig => {
|
||||
const conversationId = resConfig.data.conversationId
|
||||
_this.chatNumber = resConfig.data.chatNumber || ''
|
||||
_this.chatMessageList[_this.chatMessageListLength - 1].showCursor = true
|
||||
_this.chatMessageList[_this.chatMessageListLength - 1].conversationId = conversationId
|
||||
if (conversationId) {
|
||||
_this.initWebSocket(conversationId, () => {
|
||||
getCompletionsV3({
|
||||
conversationId,
|
||||
ws: true,
|
||||
isNoNeedPublicErrorNotification: 1
|
||||
}).then(sseRes => {
|
||||
console.log(sseRes)
|
||||
// _this.closeWsFn()
|
||||
}).catch(err => {
|
||||
console.log(err)
|
||||
_this.chatErrorSetContent()
|
||||
})
|
||||
})
|
||||
} else {
|
||||
_this.chatErrorSetContent()
|
||||
}
|
||||
}).catch(err => {
|
||||
console.log(err)
|
||||
_this.chatErrorSetContent()
|
||||
})
|
||||
},
|
||||
initWebSocket(conversationId, cb) {
|
||||
const _this = this
|
||||
console.log('------------------创建连接')
|
||||
uni.connectSocket({
|
||||
url: VUE_APP_API_URL.replace('https', 'wss') + settings.sysPrefix + `v1/chat/websocket/${_this.userInfo.unionId}-${conversationId}`,
|
||||
header: {
|
||||
'content-type': 'application/json'
|
||||
},
|
||||
timeout: 10 * 1000,
|
||||
success: () => {
|
||||
console.log('------------WebSocket初始化成功')
|
||||
},
|
||||
fail: (err) => {
|
||||
uni.showModal({
|
||||
showCancel: false,
|
||||
content: err
|
||||
})
|
||||
}
|
||||
})
|
||||
uni.onSocketMessage(res => {
|
||||
_this.websocketOnmessage(res)
|
||||
})
|
||||
uni.onSocketOpen(() => {
|
||||
cb && cb()
|
||||
_this.websocketOnopen()
|
||||
})
|
||||
uni.onSocketError(err => {
|
||||
_this.websocketOnerror(err)
|
||||
})
|
||||
},
|
||||
websocketOnmessage(res) {
|
||||
console.log('-------------监听 WebSocket 接受到服务器的消息事件')
|
||||
const resData = JSON.parse(res.data)
|
||||
if (resData) {
|
||||
const message = resData.message
|
||||
console.log(message)
|
||||
if (message && this.chatMessageListLength > 1) {
|
||||
const mesContent = message.content
|
||||
const contentType = message.contentType
|
||||
const finish = message.finish
|
||||
if (contentType === 'text') {
|
||||
if (!finish && mesContent) {
|
||||
this.chatMessageList[this.chatMessageListLength - 1].nodes = formatAiMsgContent(mesContent)
|
||||
this.chatMessageList[this.chatMessageListLength - 1].content = mesContent
|
||||
this.chatMessageList[this.chatMessageListLength - 1].listQuestion = message.listQuestion || []
|
||||
}
|
||||
}
|
||||
if (contentType === 'order') {
|
||||
if (!finish && message.listCards) {
|
||||
this.chatMessageList[this.chatMessageListLength - 1].orderList = message.listCards || []
|
||||
}
|
||||
}
|
||||
if (contentType === 'shop') {
|
||||
if (!finish && message.listCards) {
|
||||
this.chatMessageList[this.chatMessageListLength - 1].shopList = message.listCards || []
|
||||
}
|
||||
}
|
||||
if (contentType === 'gift') {
|
||||
if (!finish && message.listCards) {
|
||||
this.chatMessageList[this.chatMessageListLength - 1].giftGoodsList = message.listCards || []
|
||||
}
|
||||
}
|
||||
if (contentType === 'discount') {
|
||||
if (!finish && message.listCards) {
|
||||
this.chatMessageList[this.chatMessageListLength - 1].prizeList = message.listCards || []
|
||||
}
|
||||
}
|
||||
if (contentType === 'goods') {
|
||||
if (!finish && message.listCards) {
|
||||
this.chatMessageList[this.chatMessageListLength - 1].goodsList = message.listCards || []
|
||||
}
|
||||
}
|
||||
if (contentType === 'famous') {
|
||||
if (!finish && message.listCards) {
|
||||
this.chatMessageList[this.chatMessageListLength - 1].qianxianList = message.listCards || []
|
||||
}
|
||||
}
|
||||
if (contentType === 'ich') {
|
||||
if (!finish && message.listCards) {
|
||||
this.chatMessageList[this.chatMessageListLength - 1].ichList = message.listCards || []
|
||||
}
|
||||
}
|
||||
if (contentType === 'landmarks') {
|
||||
if (!finish && message.listCards) {
|
||||
this.chatMessageList[this.chatMessageListLength - 1].landmarksList = message.listCards || []
|
||||
}
|
||||
}
|
||||
this.$forceUpdate()
|
||||
this.$nextTick(() => {
|
||||
this.scrollToBottomHandle()
|
||||
if (finish) {
|
||||
this.closeWsFn()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
websocketOnopen() {
|
||||
console.log('------------------监听 WebSocket 连接打开事件')
|
||||
// this.websocketSend(JSON.stringify({ msg: '1' }))
|
||||
},
|
||||
websocketOnerror(e) {
|
||||
console.log('-----------------监听 WebSocket 错误事件')
|
||||
console.log(e)
|
||||
},
|
||||
websocketSend(msg) {
|
||||
// 数据发送
|
||||
try {
|
||||
uni.sendSocketMessage({
|
||||
data: msg,
|
||||
success: () => {
|
||||
console.log('-----------发送消息成功了')
|
||||
}
|
||||
})
|
||||
} catch (err) {
|
||||
console.log('send failed (' + err.code + ')')
|
||||
}
|
||||
},
|
||||
onSwiperChange(index, e) {
|
||||
this.chatMessageList[index].currentSwiperIndex = e.detail.current
|
||||
},
|
||||
analyzeKeywordsChangeHandle(conversationId, item) {
|
||||
let idx = -1
|
||||
this.chatMessageList.map((item, index) => {
|
||||
if (item.conversationId === conversationId) {
|
||||
idx = index
|
||||
}
|
||||
})
|
||||
if (idx > -1) {
|
||||
if (this.chatMessageList[idx].changeIsRotate) {
|
||||
return
|
||||
}
|
||||
this.$set(this.chatMessageList[idx], 'changeIsRotate', true)
|
||||
}
|
||||
let listKey = ''
|
||||
// 抽奖和订单查询没有换一换
|
||||
if (item.goodsList.length > 0) {
|
||||
listKey = 'goodsList'
|
||||
}
|
||||
if (item.giftGoodsList.length > 0) {
|
||||
listKey = 'giftGoodsList'
|
||||
}
|
||||
if (item.ichList.length > 0) {
|
||||
listKey = 'ichList'
|
||||
}
|
||||
if (item.qianxianList.length > 0) {
|
||||
listKey = 'qianxianList'
|
||||
}
|
||||
if (item.shopList.length > 0) {
|
||||
listKey = 'shopList'
|
||||
}
|
||||
getAnalyzeKeywordsChangeV3({
|
||||
conversationId
|
||||
}).then(res => {
|
||||
const { success, data } = res
|
||||
if (success) {
|
||||
let changeList = []
|
||||
this.chatMessageList.map((item) => {
|
||||
if (item.conversationId === conversationId) {
|
||||
changeList = data.list || []
|
||||
}
|
||||
})
|
||||
if (idx > -1 && listKey) {
|
||||
this.$set(this.chatMessageList[idx], listKey, changeList)
|
||||
this.$forceUpdate()
|
||||
}
|
||||
setTimeout(() => {
|
||||
this.$set(this.chatMessageList[idx], 'changeIsRotate', false)
|
||||
}, 1000)
|
||||
}
|
||||
}).catch(error => {
|
||||
this.$set(this.chatMessageList[idx], 'changeIsRotate', false)
|
||||
})
|
||||
},
|
||||
productItemClickHandle(item) {
|
||||
this.audioStopHandle()
|
||||
this.$yrouter.push({
|
||||
path: '/pages/shop/GoodsCon/index',
|
||||
query: {
|
||||
id: item.id
|
||||
}
|
||||
})
|
||||
},
|
||||
productItemSupplierClickHandle(item) {
|
||||
if (!item.storeId) {
|
||||
return
|
||||
}
|
||||
this.audioStopHandle()
|
||||
this.$yrouter.push({
|
||||
path: '/pagesInn/inn/innHome',
|
||||
query: {
|
||||
id: item.storeId
|
||||
}
|
||||
})
|
||||
},
|
||||
productItemBuyNowClickHandle(item) {
|
||||
this.audioStopHandle()
|
||||
this.showGiftBtn = false
|
||||
this.cart_num = 1
|
||||
this.addToCart(item)
|
||||
},
|
||||
productItemGiftBuyClickHandle(item) {
|
||||
this.audioStopHandle()
|
||||
this.showGiftBtn = true
|
||||
this.cart_num = 1
|
||||
this.addToCart(item)
|
||||
},
|
||||
buyNowOrGiftBuyReq(type) {
|
||||
const _this = this
|
||||
if (_this.buyLoading) {
|
||||
return
|
||||
}
|
||||
_this.buyLoading = true
|
||||
postCartAdd({
|
||||
productId: _this.m_id,
|
||||
cartNum: _this.attr.productSelect.cart_num,
|
||||
new: 1,
|
||||
uniqueId: _this.attr.productSelect !== undefined ? _this.attr.productSelect.unique : ''
|
||||
}).then(function (res) {
|
||||
try {
|
||||
_this.closeAttrWindow()
|
||||
const { cartId } = res.data
|
||||
if (type === 1) {
|
||||
uni.navigateTo({
|
||||
url: '/pages/order/OrderSubmission/index?id=' + cartId
|
||||
})
|
||||
return
|
||||
}
|
||||
if(type === 2) {
|
||||
uni.navigateTo({
|
||||
url: '/pkg_user/views/gift/gift?cartId=' + cartId
|
||||
})
|
||||
return
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
}).catch(error => {
|
||||
uni.showToast({
|
||||
title: error.msg,
|
||||
icon: "none",
|
||||
duration: 5000
|
||||
})
|
||||
}).finally(() => {
|
||||
_this.buyLoading = false
|
||||
})
|
||||
},
|
||||
closeAttrWindow() {
|
||||
this.$set(this.attr, 'cartAttr', false)
|
||||
},
|
||||
hotelItemClickHandle(item) {
|
||||
this.audioStopHandle()
|
||||
this.$yrouter.push({
|
||||
path: '/pagesInn/inn/innHome',
|
||||
query: {
|
||||
id: item.id
|
||||
}
|
||||
})
|
||||
},
|
||||
ichItemClickHandle(item) {
|
||||
this.audioStopHandle()
|
||||
this.$yrouter.push({
|
||||
path: '/pkg_product/views/heritage/details',
|
||||
query: {
|
||||
id: item.id
|
||||
}
|
||||
})
|
||||
},
|
||||
qianxianItemClickHandle(item) {
|
||||
this.audioStopHandle()
|
||||
this.$yrouter.push({
|
||||
path: '/pkg_product/views/famousQianxianShop',
|
||||
query: {
|
||||
id: item.id
|
||||
}
|
||||
})
|
||||
},
|
||||
prizeItemClickHandle() {
|
||||
this.audioStopHandle()
|
||||
this.$yrouter.push({ path: '/pkg-video/views/lottery' })
|
||||
},
|
||||
chatErrorSetContent() {
|
||||
this.chatMessageList[this.chatMessageListLength - 1].isError = true
|
||||
this.chatMessageList[this.chatMessageListLength - 1].content = this.errorMsg
|
||||
this.chatMessageList[this.chatMessageListLength - 1].nodes = this.errorMsg
|
||||
this.closeWsFn()
|
||||
},
|
||||
closeWsFn() {
|
||||
this.loading = false
|
||||
if (this.chatMessageListLength) {
|
||||
this.chatMessageList[this.chatMessageListLength - 1].showCursor = false
|
||||
}
|
||||
uni.closeSocket({
|
||||
success: () => {
|
||||
console.log('-----关闭连接')
|
||||
}
|
||||
})
|
||||
this.$nextTick(() => {
|
||||
this.scrollToBottomHandle()
|
||||
})
|
||||
},
|
||||
audioStopHandle() {
|
||||
// Fix bug#4049
|
||||
this.audioAyy = []
|
||||
if (this.audioContext) {
|
||||
this.audioContext.stop()
|
||||
}
|
||||
this.isPlayAudio = false
|
||||
wx.getBackgroundAudioManager().stop()
|
||||
},
|
||||
ttsHandle(item) {
|
||||
this.audioAyy = []
|
||||
if (this.audioContext) {
|
||||
this.audioContext.stop()
|
||||
// this.audioContext.destroy()
|
||||
}
|
||||
// 如果正在播放,点击当前播放的则认为是暂停
|
||||
if (this.isPlayAudio && item.conversationId === this.audioPlayId) {
|
||||
this.isPlayAudio = false
|
||||
this.audioPlayId = ''
|
||||
return
|
||||
}
|
||||
this.isPlayAudio = false
|
||||
this.audioPlayId = item.conversationId
|
||||
const flag = 1
|
||||
if (flag === 1) {
|
||||
console.log(removeMarkdown(item.content).replace(/[\n\t\s]/g, ''))
|
||||
uni.showLoading({
|
||||
title: '合成中...'
|
||||
})
|
||||
this.splitAndSynthesize(removeMarkdown(item.content).replace(/[\n\t\s]/g, ''))
|
||||
} else {
|
||||
// 调试数据
|
||||
this.audioAyy = [
|
||||
'https://ae.weixin.qq.com/cgi-bin/mmasrai-bin/getmedia?filename=1750749075_2f71887cc48d9b3753c39d119862d4bb&filekey=871027724&source=miniapp_plugin',
|
||||
'https://ae.weixin.qq.com/cgi-bin/mmasrai-bin/getmedia?filename=1750749077_0970508786c5e3edc3a68a5eb9de048c&filekey=871027724&source=miniapp_plugin',
|
||||
'https://ae.weixin.qq.com/cgi-bin/mmasrai-bin/getmedia?filename=1750749079_e77cec52cc077ba981892887c3df4cdf&filekey=871027724&source=miniapp_plugin',
|
||||
'https://ae.weixin.qq.com/cgi-bin/mmasrai-bin/getmedia?filename=1750749080_02db4235771f5561cdb73c06d8c67e53&filekey=871027724&source=miniapp_plugin',
|
||||
'https://ae.weixin.qq.com/cgi-bin/mmasrai-bin/getmedia?filename=1750749082_534e455c5d6ac5e9a4192ecf9952851a&filekey=871027724&source=miniapp_plugin',
|
||||
'https://ae.weixin.qq.com/cgi-bin/mmasrai-bin/getmedia?filename=1750749083_78c4a2fecad538561f81c48dc4ecd645&filekey=871027724&source=miniapp_plugin'
|
||||
]
|
||||
this.playNextChunk()
|
||||
}
|
||||
},
|
||||
splitAndSynthesize(text) {
|
||||
const _this = this
|
||||
if (text) {
|
||||
const textLength = text.length
|
||||
const chunkSize = 100
|
||||
const chunk = text.slice(0, textLength > chunkSize ? chunkSize : textLength)
|
||||
plugin.textToSpeech({
|
||||
// 语言
|
||||
lang: 'zh_CN',
|
||||
tts: true,
|
||||
// 要转换的文字
|
||||
content: chunk,
|
||||
success: function(res) {
|
||||
console.log("语音文件路径:", res.filename)
|
||||
_this.audioAyy.push(res.filename)
|
||||
// 首次就立即播放,增强体验
|
||||
if (!_this.isPlayAudio) {
|
||||
_this.playNextChunk()
|
||||
}
|
||||
if (textLength > chunkSize) {
|
||||
// 递归调用,播放一定要按照文本分割顺序
|
||||
_this.splitAndSynthesize(text.substr(chunkSize, textLength))
|
||||
} else {
|
||||
// 最后一条合成,没有正在播放则立即播放
|
||||
if (!_this.isPlayAudio) {
|
||||
_this.playNextChunk()
|
||||
}
|
||||
}
|
||||
uni.hideLoading()
|
||||
},
|
||||
fail: function(err) {
|
||||
console.log("转换失败:", err)
|
||||
uni.hideLoading()
|
||||
}
|
||||
})
|
||||
} else {
|
||||
if (!_this.isPlayAudio) {
|
||||
_this.playNextChunk()
|
||||
}
|
||||
uni.hideLoading()
|
||||
}
|
||||
},
|
||||
playNextChunk() {
|
||||
if (this.audioAyy.length > 0 && this.audioPlayId) {
|
||||
const src = this.audioAyy.shift()
|
||||
this.isPlayAudio = true
|
||||
const audioContext = uni.createInnerAudioContext({
|
||||
// 是否使用 WebAudio 作为底层音频驱动,默认关闭。对于短音频、播放频繁的音频建议开启此选项,开启后将获得更优的性能表现。由于开启此选项后也会带来一定的内存增长,因此对于长音频建议关闭此选项
|
||||
useWebAudioImplement: false
|
||||
})
|
||||
this.audioContext = audioContext
|
||||
audioContext.src = src
|
||||
audioContext.onEnded(() => {
|
||||
audioContext.destroy()
|
||||
this.playNextChunk()
|
||||
})
|
||||
audioContext.play()
|
||||
console.log('------------src:' + src)
|
||||
} else {
|
||||
console.log('------------end')
|
||||
this.isPlayAudio = false
|
||||
}
|
||||
},
|
||||
bottomToolClickHandle(item) {
|
||||
if (item.type === 'prompt') {
|
||||
this.streamReq({
|
||||
prompt: item.prompt,
|
||||
init: 0
|
||||
})
|
||||
}
|
||||
if (item.type === 'link') {
|
||||
uni.navigateTo({
|
||||
url: item.url
|
||||
})
|
||||
}
|
||||
},
|
||||
viewOrderTrackHandle(order) {
|
||||
uni.navigateTo({
|
||||
url: '/pages/order/OrderDetails/index?id=' + order.orderId
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
+41
-260
@@ -33,26 +33,16 @@
|
||||
{{ item.prompt }}
|
||||
</view>
|
||||
</view>
|
||||
<view class="item-right-tools">
|
||||
<view class="btn" @click="copyContentHandle(item.prompt)">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/icon-02.png'"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
/>
|
||||
复制
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="item.type === -2" class="chat-message-body">
|
||||
<view v-if="item.nodes && item.nodes.length" class="avatar">
|
||||
<view class="avatar">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/avatar.png'"
|
||||
class="chat-avatar"
|
||||
mode="widthFix"
|
||||
/>
|
||||
</view>
|
||||
<view v-if="item.nodes && item.nodes.length" class="item-left">
|
||||
<view class="item-left">
|
||||
<view class="txt">
|
||||
<view
|
||||
ref="rich-text-box"
|
||||
@@ -107,90 +97,17 @@
|
||||
/>
|
||||
重新生成
|
||||
</view>
|
||||
<view
|
||||
:class="{
|
||||
'playing': audioPlayId === item.conversationId && isPlayAudio
|
||||
}"
|
||||
class="item"
|
||||
@click="ttsHandle(item)"
|
||||
>
|
||||
<image
|
||||
:src="webUrl + '/aiChat/' + ((audioPlayId === item.conversationId && isPlayAudio) ? 'audio-on' : 'audio-off') +'.png'"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
/>
|
||||
语音播放
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 换一换 -->
|
||||
<view
|
||||
v-if="!item.showCursor &&
|
||||
!item.isError &&
|
||||
(item.orderList.length > 0 ||
|
||||
item.giftGoodsList.length > 0 ||
|
||||
item.goodsList.length > 0 ||
|
||||
item.shopList.length > 0 ||
|
||||
item.prizeList.length > 0 ||
|
||||
item.ichList.length > 0 ||
|
||||
item.qianxianList.length > 0
|
||||
)
|
||||
"
|
||||
v-if="item.showMoreInfo.show"
|
||||
class="change-list-wrap"
|
||||
>
|
||||
<!-- 礼品 -->
|
||||
<view
|
||||
v-if="item.giftGoodsList.length > 0"
|
||||
class="recommend-goods-wrap"
|
||||
>
|
||||
<swiper
|
||||
class="goods-swiper"
|
||||
:indicator-dots="false"
|
||||
:autoplay="false"
|
||||
:current="item.currentSwiperIndex"
|
||||
previous-margin="120rpx"
|
||||
next-margin="120rpx"
|
||||
circular
|
||||
@change="e => onSwiperChange(index, e)"
|
||||
>
|
||||
<swiper-item
|
||||
v-for="(goodItem, goodIndex) in item.giftGoodsList"
|
||||
:key="goodIndex"
|
||||
>
|
||||
<view
|
||||
:class="{ 'active': item.currentSwiperIndex === goodIndex }"
|
||||
class="goods-item"
|
||||
@click="productItemClickHandle(goodItem)"
|
||||
>
|
||||
<view class="supplier" @click.stop="productItemSupplierClickHandle(goodItem)">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/icon-57.png'"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
lazy-load
|
||||
/>
|
||||
<text class="s-name">{{ goodItem.merName ||goodItem.storeName }}</text>
|
||||
<u-icon name="arrow-right" color="#999" size="12"></u-icon>
|
||||
</view>
|
||||
<view class="title one-t">{{ goodItem.name }}</view>
|
||||
<image :src="goodItem.img" class="p-img" mode="aspectFill" lazy-load />
|
||||
<view class="price">
|
||||
<text class="unit">¥</text>
|
||||
<text class="num">{{ goodItem.price }}</text>
|
||||
</view>
|
||||
<view class="actions">
|
||||
<view class="btn-buy" @click.stop="productItemBuyNowClickHandle(goodItem)">立即下单</view>
|
||||
<view class="btn-gift" @click.stop="productItemGiftBuyClickHandle(goodItem)">送给朋友</view>
|
||||
</view>
|
||||
</view>
|
||||
</swiper-item>
|
||||
</swiper>
|
||||
</view>
|
||||
<!-- 特产商品 -->
|
||||
<view v-if="item.goodsList.length > 0" class="list-wrap">
|
||||
<view v-if="item.showMoreInfo.showType === '特产商品'" class="list-wrap">
|
||||
<view
|
||||
v-for="(productItem, productIndex) in item.goodsList"
|
||||
v-for="(productItem, productIndex) in item.showMoreInfo.resultItems"
|
||||
:key="productIndex"
|
||||
class="product-item"
|
||||
@click="productItemClickHandle(productItem)"
|
||||
@@ -198,7 +115,6 @@
|
||||
<image
|
||||
:src="productItem.img"
|
||||
class="img"
|
||||
lazy-load
|
||||
/>
|
||||
<view class="product-info">
|
||||
<view class="name one-t">
|
||||
@@ -213,21 +129,19 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 店铺 -->
|
||||
<view v-if="item.shopList.length > 0" class="list-wrap">
|
||||
<view v-if="item.showMoreInfo.showType === '店铺'" class="list-wrap">
|
||||
<view
|
||||
v-for="(hotel, hotelIndex) in item.shopList"
|
||||
v-for="(hotel, hotelIndex) in item.showMoreInfo.resultItems"
|
||||
:key="hotelIndex"
|
||||
class="product-item"
|
||||
@click="hotelItemClickHandle(hotel)"
|
||||
>
|
||||
<view class="hotel-type">
|
||||
{{ hotel.hotelTypeName }}
|
||||
手工体验
|
||||
</view>
|
||||
<image
|
||||
:src="hotel.img + ((hotel.img && hotel.img.indexOf('.mp4') > -1) ? '?vframe/jpg/offset/1' : '')"
|
||||
:src="hotel.img"
|
||||
class="img"
|
||||
lazy-load
|
||||
/>
|
||||
<view class="product-info">
|
||||
<view class="name one-t">
|
||||
@@ -239,10 +153,9 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 非遗 -->
|
||||
<view v-if="item.ichList.length > 0" class="list-wrap">
|
||||
<view v-if="item.showMoreInfo.showType === '非遗文化'" class="list-wrap">
|
||||
<view
|
||||
v-for="(ich, ichIndex) in item.ichList"
|
||||
v-for="(ich, ichIndex) in item.showMoreInfo.resultItems"
|
||||
:key="ichIndex"
|
||||
class="product-item"
|
||||
@click="ichItemClickHandle(ich)"
|
||||
@@ -261,10 +174,9 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 千县 -->
|
||||
<view v-if="item.qianxianList.length > 0" class="list-wrap">
|
||||
<view v-if="item.showMoreInfo.showType === '千县名品'" class="list-wrap">
|
||||
<view
|
||||
v-for="(qianxian, qianxianIndex) in item.qianxianList"
|
||||
v-for="(qianxian, qianxianIndex) in item.showMoreInfo.resultItems"
|
||||
:key="qianxianIndex"
|
||||
class="product-item"
|
||||
@click="qianxianItemClickHandle(qianxian)"
|
||||
@@ -272,7 +184,6 @@
|
||||
<image
|
||||
:src="qianxian.img"
|
||||
class="img"
|
||||
lazy-load
|
||||
/>
|
||||
<view class="product-info">
|
||||
<view class="name name2 one-t">
|
||||
@@ -281,59 +192,15 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 抽奖 -->
|
||||
<view v-if="item.prizeList.length > 0" class="list-wrap prize-list-wrap">
|
||||
<view
|
||||
v-for="(prize, prizeIndex) in item.prizeList"
|
||||
:key="prizeIndex"
|
||||
class="prize-item"
|
||||
@click="prizeItemClickHandle(prize)"
|
||||
>
|
||||
<image
|
||||
:src="prize.img"
|
||||
class="img"
|
||||
mode="widthFix"
|
||||
lazy-load
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 订单 -->
|
||||
<view v-if="item.orderList.length > 0" class="order-list-wrap">
|
||||
<view
|
||||
v-for="(order, orderIndex) in item.orderList"
|
||||
:key="orderIndex"
|
||||
class="order-item-wrap"
|
||||
>
|
||||
<order-item
|
||||
:item="order"
|
||||
@viewOrderTrack="viewOrderTrackHandle"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<view
|
||||
v-if="(item.shopList.length > 0 ||
|
||||
item.goodsList.length > 0 ||
|
||||
item.giftGoodsList.length > 0 ||
|
||||
item.ichList.length > 0 ||
|
||||
item.qianxianList.length > 0 ||
|
||||
item.shopList.length > 0) && item.showChangeBtn
|
||||
"
|
||||
class="change-btn"
|
||||
>
|
||||
<view class="change-btn-content" @click="analyzeKeywordsChangeHandle(item.conversationId, item)">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/icon-53.png'"
|
||||
:class="{
|
||||
'rotate': item.changeIsRotate
|
||||
}"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
/>
|
||||
换一换
|
||||
</view>
|
||||
<view class="change-btn">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/icon-change.png'"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
@click="analyzeKeywordsChangeHandle(item.conversationId, item.showMoreInfo)"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 建议提问 -->
|
||||
<view
|
||||
v-if="index === (chatMessageListLength - 1) && item.listQuestion.length > 0"
|
||||
class="suggestion-wrap"
|
||||
@@ -370,42 +237,24 @@
|
||||
}"
|
||||
class="page-to-bottom"
|
||||
>
|
||||
<view class="down-icon-wrap">
|
||||
<view
|
||||
class="new-chat"
|
||||
@click="createNewHandle"
|
||||
>
|
||||
<image
|
||||
v-if="chatMessageListLength > 0 && !isScrollToBottom && !loading"
|
||||
:src="webUrl + '/aiChat/down.png'"
|
||||
class="icon down-icon"
|
||||
:src="webUrl + '/aiChat/icon-05.png'"
|
||||
class="btn-icon"
|
||||
mode="widthFix"
|
||||
@click="scrollToBottomHandle"
|
||||
/>
|
||||
开启新对话
|
||||
</view>
|
||||
<view class="container">
|
||||
<view
|
||||
v-if="chatNumber"
|
||||
class="new-chat"
|
||||
@click="createNewHandle"
|
||||
>
|
||||
<image
|
||||
:src="webUrl + '/aiChat/icon-54.png'"
|
||||
class="btn-icon"
|
||||
mode="widthFix"
|
||||
/>
|
||||
开启新对话
|
||||
</view>
|
||||
<view
|
||||
v-for="(item, index) in bottomTools"
|
||||
:key="index"
|
||||
class="bottom-tool-item"
|
||||
@click="bottomToolClickHandle(item)"
|
||||
>
|
||||
<image
|
||||
:src="webUrl + '/aiChat/' + item.icon + '.png'"
|
||||
class="tool-icon"
|
||||
mode="widthFix"
|
||||
/>
|
||||
{{ item.text }}
|
||||
</view>
|
||||
</view>
|
||||
<image
|
||||
v-if="chatMessageListLength > 0 && !isScrollToBottom && !loading"
|
||||
:src="webUrl + '/aiChat/down.png'"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
@click="scrollToBottomHandle"
|
||||
/>
|
||||
</view>
|
||||
<bottom-send
|
||||
ref="bottomSend"
|
||||
@@ -419,31 +268,14 @@
|
||||
ref="historyView"
|
||||
:status-bar-height="statusBarHeight"
|
||||
form-module="history"
|
||||
@enter-history="audioStopHandle"
|
||||
/>
|
||||
<ProductWindow
|
||||
ref="attrWindow"
|
||||
:attr="attr"
|
||||
:cart-num="cart_num"
|
||||
:show-ok="!showGiftBtn"
|
||||
:is-gift="showGiftBtn"
|
||||
:padding-bottom="'60px'"
|
||||
class-name="ai-product-window"
|
||||
ok-text="立即购买"
|
||||
@changeFun="changeFun"
|
||||
@ok="buyNowOrGiftBuyReq(1)"
|
||||
@gift="buyNowOrGiftBuyReq(2)"
|
||||
/>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { chatMixinsV2 } from '../mixins/chatMixinsV2.js'
|
||||
import goCartMixin from '@/mixins/goCartMixins'
|
||||
import { chatMixins } from '../mixins/chatMixins.js'
|
||||
import AiHistoryList from '../components/historyList'
|
||||
import BottomSend from '../components/bottomSend.vue'
|
||||
import OrderItem from '../components/orderItem.vue'
|
||||
import ProductWindow from '@/components/ProductWindow'
|
||||
import {
|
||||
historyChatMessage
|
||||
} from '@/api/chat/index'
|
||||
@@ -452,11 +284,9 @@ export default {
|
||||
name: 'AiChatHistoryPage',
|
||||
components: {
|
||||
AiHistoryList,
|
||||
BottomSend,
|
||||
OrderItem,
|
||||
ProductWindow
|
||||
BottomSend
|
||||
},
|
||||
mixins: [chatMixinsV2, goCartMixin],
|
||||
mixins: [chatMixins],
|
||||
data() {
|
||||
return {
|
||||
pageTitle: ''
|
||||
@@ -485,68 +315,19 @@ export default {
|
||||
prompt: item.content
|
||||
})
|
||||
} else {
|
||||
if (['text', 'skill_list'].includes(item.contentType)) {
|
||||
const tempItemData = {
|
||||
if (item.contentType === 'text') {
|
||||
this.chatMessageList.push({
|
||||
...item,
|
||||
nodes: formatAiMsgContent(item.content),
|
||||
prompt: this.getParentPrompt(data, item.parentMessageId),
|
||||
conversationId: item.messageId,
|
||||
showCursor: false,
|
||||
listQuestion: item.listQuestion || [],
|
||||
// 特产商品
|
||||
goodsList: [],
|
||||
// 礼品商品
|
||||
giftGoodsList: [],
|
||||
// 非遗文化
|
||||
ichList: [],
|
||||
// 千县名品
|
||||
qianxianList: [],
|
||||
// 抽奖
|
||||
prizeList: [],
|
||||
// 店铺
|
||||
shopList: [],
|
||||
// 地标好物--屏蔽原因:实现此功能时,后端通过AI动态返回的图片不满足需求,后面就不要了
|
||||
landmarksList: [],
|
||||
// 订单
|
||||
orderList: [],
|
||||
type: -2,
|
||||
showMoreInfo: {},
|
||||
currentSwiperIndex: 0,
|
||||
showChangeBtn: false,
|
||||
changeIsRotate: false
|
||||
}
|
||||
if (item.cardData) {
|
||||
const { contentType, finish, items = [] } = item.cardData
|
||||
if (contentType === 'order') {
|
||||
tempItemData.orderList = items || []
|
||||
}
|
||||
if (contentType === 'shop') {
|
||||
tempItemData.shopList = items || []
|
||||
}
|
||||
if (contentType === 'gift') {
|
||||
tempItemData.giftGoodsList = items || []
|
||||
}
|
||||
if (contentType === 'discount') {
|
||||
tempItemData.prizeList = items || []
|
||||
}
|
||||
if (contentType === 'goods') {
|
||||
tempItemData.goodsList = items || []
|
||||
}
|
||||
if (contentType === 'famous') {
|
||||
tempItemData.qianxianList = items || []
|
||||
}
|
||||
if (contentType === 'ich') {
|
||||
tempItemData.ichList = items || []
|
||||
}
|
||||
if (contentType === 'landmarks') {
|
||||
tempItemData.landmarksList = items || []
|
||||
}
|
||||
}
|
||||
this.chatMessageList.push(tempItemData)
|
||||
type: -2
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
console.log(this.chatMessageList)
|
||||
} catch (err) {
|
||||
uni.showModal({
|
||||
title: '错误提示',
|
||||
|
||||
@@ -1,227 +0,0 @@
|
||||
<template>
|
||||
<view
|
||||
:style="{ 'background-image': 'url(' + webUrl + '/aiChat/bg-05.png)' }"
|
||||
class="image-recognition-page"
|
||||
>
|
||||
<hx-navbar
|
||||
:back="true"
|
||||
:fixed="true"
|
||||
:statusBar="true"
|
||||
left-icon="arrowleft"
|
||||
color="#333"
|
||||
transparent="auto"
|
||||
barPlaceholder="hidden"
|
||||
title="云灵"
|
||||
/>
|
||||
|
||||
<view
|
||||
class="main-content"
|
||||
:style="{ 'padding-top': (44 + statusBarHeight) + 'px' }"
|
||||
>
|
||||
<!-- 拍照区域 -->
|
||||
<view class="camera-section" @click="takePhoto">
|
||||
<view class="dashed-border-box">
|
||||
<view class="icon-wrap">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/icon-55.png'"
|
||||
class="camera-icon"
|
||||
mode="widthFix"
|
||||
/>
|
||||
</view>
|
||||
<view class="main-title">对准商品拍照</view>
|
||||
<view class="sub-tip">示例:特产/零食/茶叶/纪念品</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 底部相册上传按钮 -->
|
||||
<view class="bottom-action">
|
||||
<button class="album-btn" @click="chooseImage">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/icon-56.png'"
|
||||
class="upload-icon"
|
||||
mode="widthFix"
|
||||
/>
|
||||
<text>从相册上传图片进行识别</text>
|
||||
</button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { chatMixins } from '../mixins/chatMixins.js'
|
||||
import { VUE_APP_API_URL } from '@/config'
|
||||
|
||||
export default {
|
||||
name: 'AiChatImageRecognitionPage',
|
||||
mixins: [chatMixins],
|
||||
data() {
|
||||
return {
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
createdCallbak() {
|
||||
// 覆盖 mixins 中的 createdCallbak,避免触发默认逻辑
|
||||
},
|
||||
takePhoto() {
|
||||
if (this.loading) return
|
||||
uni.chooseImage({
|
||||
count: 1,
|
||||
sizeType: ['compressed'],
|
||||
sourceType: ['camera'],
|
||||
success: (res) => {
|
||||
this.handleUpload(res.tempFilePaths[0])
|
||||
}
|
||||
})
|
||||
},
|
||||
chooseImage() {
|
||||
if (this.loading) return
|
||||
uni.chooseImage({
|
||||
count: 1,
|
||||
sizeType: ['compressed'],
|
||||
sourceType: ['album'],
|
||||
success: (res) => {
|
||||
this.handleUpload(res.tempFilePaths[0])
|
||||
}
|
||||
})
|
||||
},
|
||||
handleUpload(filePath) {
|
||||
const _this = this
|
||||
uni.showLoading({ title: '识别中...' })
|
||||
_this.loading = true
|
||||
|
||||
uni.uploadFile({
|
||||
url: `${VUE_APP_API_URL}/api/upload`,
|
||||
filePath: filePath,
|
||||
header: {
|
||||
Authorization: 'Bearer ' + (_this.token || '')
|
||||
},
|
||||
name: 'file',
|
||||
success: (uploadRes) => {
|
||||
const resData = JSON.parse(uploadRes.data)
|
||||
if (resData.link) {
|
||||
_this.performRecognition(resData.link)
|
||||
} else {
|
||||
uni.hideLoading()
|
||||
_this.loading = false
|
||||
_this.$toast('上传失败,请重试')
|
||||
}
|
||||
},
|
||||
fail: (err) => {
|
||||
console.log('Upload Error:', err)
|
||||
uni.hideLoading()
|
||||
_this.loading = false
|
||||
_this.$toast('网络异常,请重试')
|
||||
}
|
||||
})
|
||||
},
|
||||
performRecognition(imageUrl) {
|
||||
// 存储识别到的图片URL
|
||||
uni.setStorageSync('recognitionImage', imageUrl)
|
||||
uni.navigateTo({
|
||||
url: '/aiChat/views/imageRecognitionResult'
|
||||
})
|
||||
uni.hideLoading()
|
||||
this.loading = false
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.image-recognition-page {
|
||||
height: 100vh;
|
||||
background-size: 100% 100%;
|
||||
|
||||
.main-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding: 60rpx 40rpx;
|
||||
height: 100vh;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.camera-section {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-bottom: 60rpx;
|
||||
|
||||
.dashed-border-box {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 600rpx;
|
||||
width: 100%;
|
||||
margin-top: 80rpx;
|
||||
border: 2rpx dashed #DCDFE6;
|
||||
border-radius: 24rpx;
|
||||
background-color: rgba(255, 255, 255, 0.5);
|
||||
|
||||
.icon-wrap {
|
||||
width: 160rpx;
|
||||
height: 160rpx;
|
||||
border-radius: 50%;
|
||||
border: 6rpx solid #7A3DF1;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-bottom: 40rpx;
|
||||
|
||||
.camera-icon {
|
||||
width: 80rpx;
|
||||
height: 80rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.main-title {
|
||||
font-size: 36rpx;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.sub-tip {
|
||||
font-size: 28rpx;
|
||||
color: #999;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.bottom-action {
|
||||
width: 100%;
|
||||
padding-bottom: 60rpx;
|
||||
|
||||
.album-btn {
|
||||
width: 100%;
|
||||
height: 100rpx;
|
||||
background: #3D4CF1;
|
||||
border-radius: 20rpx;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
color: #FFFFFF;
|
||||
font-size: 32rpx;
|
||||
border: none;
|
||||
box-shadow: 0 8rpx 20rpx rgba(61, 76, 241, 0.3);
|
||||
|
||||
.upload-icon {
|
||||
width: 36rpx;
|
||||
height: 36rpx;
|
||||
margin-right: 16rpx;
|
||||
}
|
||||
|
||||
&::after {
|
||||
border: none;
|
||||
}
|
||||
|
||||
&:active {
|
||||
opacity: 0.8;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,338 +0,0 @@
|
||||
<template>
|
||||
<view class="image-recognition-result-page">
|
||||
<view
|
||||
class="page-body"
|
||||
>
|
||||
<view class="header">
|
||||
<view
|
||||
class="header-bg"
|
||||
:style="{ 'background-image': imageUrl ? `url(${imageUrl})` : '' }"
|
||||
/>
|
||||
<view class="header-mask" />
|
||||
<view class="scan-wrap">
|
||||
<image
|
||||
v-if="imageUrl"
|
||||
:src="imageUrl"
|
||||
class="scan-image"
|
||||
mode="aspectFill"
|
||||
/>
|
||||
<view class="corner tl" />
|
||||
<view class="corner tr" />
|
||||
<view class="corner bl" />
|
||||
<view class="corner br" />
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="sheet">
|
||||
<view class="sheet-thumb-row">
|
||||
<image
|
||||
v-if="imageUrl && confidenceFlag"
|
||||
:src="imageUrl"
|
||||
class="sheet-thumb"
|
||||
mode="aspectFill"
|
||||
lazy-load
|
||||
/>
|
||||
<view v-else class="empty-state">
|
||||
<view class="empty-text">未识别到物品,请重新尝试</view>
|
||||
<view class="empty-title">为你推荐</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="sheet-divider" />
|
||||
<view class="goods-grid">
|
||||
<view
|
||||
v-for="(item, index) in goodsList"
|
||||
:key="index"
|
||||
class="goods-card"
|
||||
@click="goGoods(item)"
|
||||
>
|
||||
<image
|
||||
:src="item.img"
|
||||
class="goods-img"
|
||||
mode="aspectFill"
|
||||
lazy-load
|
||||
/>
|
||||
<view class="goods-title">
|
||||
{{ item.name }}
|
||||
</view>
|
||||
<view class="goods-price-row">
|
||||
<view class="price-left">
|
||||
<text class="price-symbol">¥</text>
|
||||
<text class="price-val">{{ item.price }}</text>
|
||||
</view>
|
||||
<image
|
||||
:src="webUrl + '/home/icon-cart.png'"
|
||||
class="cart-btn"
|
||||
mode="aspectFit"
|
||||
lazy-load
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getAnalyzeByImageV3 } from '@/api/chat'
|
||||
import Recommend from '@/components/Recommend'
|
||||
|
||||
export default {
|
||||
name: 'AiChatImageRecognitionResultPage',
|
||||
components: {
|
||||
Recommend
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||
statusBarHeight: 20,
|
||||
imageUrl: '',
|
||||
goodsList: [],
|
||||
confidenceFlag: true
|
||||
}
|
||||
},
|
||||
onLoad(options) {
|
||||
const urlFromQuery = options.imageUrl || ''
|
||||
const urlFromStorage = uni.getStorageSync('recognitionImage') || ''
|
||||
this.imageUrl = urlFromQuery || urlFromStorage || ''
|
||||
if (urlFromStorage) {
|
||||
// uni.removeStorageSync('recognitionImage')
|
||||
}
|
||||
this.init()
|
||||
},
|
||||
methods: {
|
||||
init() {
|
||||
this.loaded = false
|
||||
getAnalyzeByImageV3({
|
||||
imageUrl: this.imageUrl
|
||||
}).then(res => {
|
||||
const { data, success } = res
|
||||
if (success) {
|
||||
this.goodsList = data.cards || []
|
||||
this.confidenceFlag = data.success
|
||||
}
|
||||
}).finally(() => {
|
||||
this.loaded = true
|
||||
})
|
||||
},
|
||||
goGoods(item) {
|
||||
if (!item || !item.id) return
|
||||
uni.navigateTo({
|
||||
url: `/pages/shop/GoodsCon/index?id=${item.id}`
|
||||
})
|
||||
},
|
||||
addToCart() {
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.image-recognition-result-page {
|
||||
min-height: 100vh;
|
||||
background: #fff;
|
||||
|
||||
.page-body {
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.header {
|
||||
position: relative;
|
||||
height: 480rpx;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.header-bg {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-color: #DDE6FF;
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
filter: blur(18rpx);
|
||||
transform: scale(1.2);
|
||||
}
|
||||
|
||||
.header-mask {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: rgba(0, 0, 0, 0.18);
|
||||
}
|
||||
|
||||
.scan-wrap {
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: 45%;
|
||||
width: 320rpx;
|
||||
height: 320rpx;
|
||||
transform: translate(-50%, -52%);
|
||||
border-radius: 24rpx;
|
||||
overflow: hidden;
|
||||
// box-shadow: 0 18rpx 48rpx rgba(0, 0, 0, 0.18);
|
||||
}
|
||||
|
||||
.scan-image {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: 12rpx;
|
||||
transform: scale(0.8);
|
||||
}
|
||||
|
||||
.corner {
|
||||
position: absolute;
|
||||
width: 44rpx;
|
||||
height: 44rpx;
|
||||
border: 6rpx solid rgba(255, 255, 255, 0.95);
|
||||
}
|
||||
|
||||
.corner.tl {
|
||||
left: 16rpx;
|
||||
top: 16rpx;
|
||||
border-right: 0;
|
||||
border-bottom: 0;
|
||||
}
|
||||
.corner.tr {
|
||||
right: 16rpx;
|
||||
top: 16rpx;
|
||||
border-left: 0;
|
||||
border-bottom: 0;
|
||||
}
|
||||
.corner.bl {
|
||||
left: 16rpx;
|
||||
bottom: 16rpx;
|
||||
border-right: 0;
|
||||
border-top: 0;
|
||||
}
|
||||
.corner.br {
|
||||
right: 16rpx;
|
||||
bottom: 16rpx;
|
||||
border-left: 0;
|
||||
border-top: 0;
|
||||
}
|
||||
|
||||
.sheet {
|
||||
position: relative;
|
||||
margin-top: -70rpx;
|
||||
background: #FFFFFF;
|
||||
border-top-left-radius: 42rpx;
|
||||
border-top-right-radius: 42rpx;
|
||||
padding-bottom: calc(env(safe-area-inset-bottom) + 28rpx);
|
||||
}
|
||||
|
||||
.sheet-thumb-row {
|
||||
padding: 28rpx 0 18rpx 0;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.sheet-thumb {
|
||||
width: 100rpx;
|
||||
height: 100rpx;
|
||||
border-radius: 18rpx;
|
||||
display: block;
|
||||
box-shadow: 0 10rpx 24rpx rgba(0, 0, 0, 0.12);
|
||||
}
|
||||
|
||||
.sheet-divider {
|
||||
height: 2rpx;
|
||||
background: #EDEDED;
|
||||
margin: 0 32rpx;
|
||||
}
|
||||
|
||||
.empty-state {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.empty-text {
|
||||
font-size: 28rpx;
|
||||
color: #999;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
.empty-title {
|
||||
font-size: 32rpx;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.goods-grid {
|
||||
padding: 28rpx 24rpx 0 24rpx;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.goods-card {
|
||||
width: 344rpx;
|
||||
background: #FFFFFF;
|
||||
border-radius: 22rpx;
|
||||
overflow: hidden;
|
||||
margin-bottom: 22rpx;
|
||||
box-shadow: 0 10rpx 24rpx rgba(0, 0, 0, 0.06);
|
||||
}
|
||||
|
||||
.goods-img {
|
||||
width: 344rpx;
|
||||
height: 344rpx;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.goods-title {
|
||||
padding: 14rpx 14rpx 0 14rpx;
|
||||
font-size: 28rpx;
|
||||
line-height: 38rpx;
|
||||
color: #333;
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 2;
|
||||
overflow: hidden;
|
||||
min-height: 76rpx;
|
||||
}
|
||||
|
||||
.goods-price-row {
|
||||
padding: 10rpx 14rpx 16rpx 14rpx;
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.price-left {
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
}
|
||||
|
||||
.price-symbol {
|
||||
font-size: 26rpx;
|
||||
color: #C52733;
|
||||
line-height: 1;
|
||||
margin-right: 2rpx;
|
||||
}
|
||||
|
||||
.price-val {
|
||||
font-size: 40rpx;
|
||||
font-weight: bold;
|
||||
color: #C52733;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.origin-price {
|
||||
font-size: 24rpx;
|
||||
color: #999;
|
||||
line-height: 1;
|
||||
margin-left: 12rpx;
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
.cart-btn {
|
||||
width: 52rpx;
|
||||
height: 52rpx;
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
+137
-385
@@ -1,9 +1,6 @@
|
||||
<template>
|
||||
<view
|
||||
:class="{
|
||||
'page-scroll': scrollTop > 0,
|
||||
'new-chat': chatMessageListLength === 0
|
||||
}"
|
||||
:class="scrollTop > 0 ? 'page-scroll' : ''"
|
||||
class="fix-tabbar-page"
|
||||
>
|
||||
<hx-navbar
|
||||
@@ -15,7 +12,7 @@
|
||||
color="#333"
|
||||
transparent="auto"
|
||||
barPlaceholder="hidden"
|
||||
title="云灵"
|
||||
title="云灵AI智能助手"
|
||||
@click-left="clickBackHandle"
|
||||
/>
|
||||
<page-container
|
||||
@@ -35,108 +32,65 @@
|
||||
}"
|
||||
class="fix-tabbar-body"
|
||||
>
|
||||
<!-- <button @click="ttsHandle({
|
||||
content: '是否使用 WebAudio 作为底层音频驱动,默认关闭。对于短音频、播放频繁的音频建议开启此选项,开启后将获得更优的性能表现。由于开启此选项后也会带来一定的内存增长,因此对于长音频建议关闭此选项。临床试验统计分析结果生成系统是服务于医学研究的数据处理平台。系统聚焦临床试验数据,可对患者入组信息、疗效指标、安全性数据等进行标准化统计分析,自动生成包含描述性统计、假设检验、生存分析等内容的结果报告。支持可视化图表输出,如疗效对比柱状图、不良事件分布饼图等,直观呈现数据特征。具备灵活的参数配置功能,可适配不同试验设计与分析需求,助力研究者高效完成数据解读,为药物研发、临床研究结论输出提供精准的统计支持。',
|
||||
conversationId: '123'
|
||||
})">播放</button> -->
|
||||
<block v-if="chatMessageListLength < 1">
|
||||
<view class="home-wrap">
|
||||
<view class="home-focus-wrap">
|
||||
<view class="focus-guide-wrap">
|
||||
<view class="guide-left">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/logo-01.gif'"
|
||||
class="avatar"
|
||||
mode="widthFix"
|
||||
/>
|
||||
</view>
|
||||
<view class="guide-right">
|
||||
<view class="title">{{ settingInfo.helloMessageTitle }}</view>
|
||||
<view class="content">{{ settingInfo.helloMessageContent }}</view>
|
||||
</view>
|
||||
<view class="home-focus-wrap">
|
||||
<view class="focus-guide-wrap">
|
||||
<view class="guide-left">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/logo-01.gif'"
|
||||
class="avatar"
|
||||
mode="widthFix"
|
||||
/>
|
||||
</view>
|
||||
<view class="guide-right">
|
||||
<view class="trangle" />
|
||||
<view class="title">{{ settingInfo.helloMessageTitle }}</view>
|
||||
<view class="content">{{ settingInfo.helloMessageContent }}</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 这里实现商品轮播 -->
|
||||
<!-- <view class="recommend-goods-wrap" v-if="recommendGoodsList.length > 0">
|
||||
<swiper
|
||||
class="goods-swiper"
|
||||
:indicator-dots="false"
|
||||
:autoplay="false"
|
||||
previous-margin="120rpx"
|
||||
next-margin="120rpx"
|
||||
circular
|
||||
@change="onSwiperChange"
|
||||
</view>
|
||||
<view class="topic-wrap">
|
||||
<view class="title">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/icon-01.png'"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
/>
|
||||
<view class="txt">#大家都在问</view>
|
||||
<image
|
||||
:src="webUrl + '/aiChat/icon-01.png'"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
/>
|
||||
</view>
|
||||
<view class="list-wrap">
|
||||
<view
|
||||
:style="{
|
||||
'width': animationWidth,
|
||||
'animation': animationStr
|
||||
}"
|
||||
class="list-cont"
|
||||
>
|
||||
<swiper-item
|
||||
v-for="(item, index) in recommendGoodsList"
|
||||
<view
|
||||
v-for="(item, index) in topicList"
|
||||
:key="index"
|
||||
class="list-item"
|
||||
@click="topicItemClickHandle(item.title)"
|
||||
>
|
||||
<view
|
||||
class="goods-item"
|
||||
:class="{ 'active': currentSwiperIndex === index }"
|
||||
@click="productItemClickHandle(item)"
|
||||
>
|
||||
<view class="supplier">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/icon-57.png'"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
/>
|
||||
<text class="s-name">{{ item.supplierName || '供应商名称' }}</text>
|
||||
<u-icon name="arrow-right" color="#999" size="12"></u-icon>
|
||||
</view>
|
||||
<view class="title one-t">{{ item.productName || item.name || '商品名称' }}</view>
|
||||
<image :src="item.image || item.img" class="p-img" mode="aspectFill" />
|
||||
<view class="price">
|
||||
<text class="unit">¥</text>
|
||||
<text class="num">{{ item.price || '0.00' }}</text>
|
||||
</view>
|
||||
<view class="actions">
|
||||
<view class="btn-buy" @click.stop="productItemBuyNowClickHandle(item)">立即下单</view>
|
||||
<view class="btn-gift" @click.stop="productItemGiftBuyClickHandle(item)">送给朋友</view>
|
||||
</view>
|
||||
</view>
|
||||
</swiper-item>
|
||||
</swiper>
|
||||
</view> -->
|
||||
<view class="topic-wrap">
|
||||
<view class="title">
|
||||
<view class="title-left">大家都在问</view>
|
||||
<view class="title-right" @click="loadData('click')">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/icon-53.png'"
|
||||
:class="{
|
||||
'rotate': topicIsRotate
|
||||
}"
|
||||
v-if="item.isHot"
|
||||
:src="webUrl + '/aiChat/hot.png'"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
/>
|
||||
换一换
|
||||
</view>
|
||||
</view>
|
||||
<view class="list-wrap">
|
||||
<view class="list-cont">
|
||||
<view
|
||||
v-for="(item, index) in topicList"
|
||||
:key="index"
|
||||
class="list-item"
|
||||
@click="topicItemClickHandle(item.title)"
|
||||
>
|
||||
<image
|
||||
v-if="item.isHot"
|
||||
:src="webUrl + '/aiChat/hot.png'"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
/>
|
||||
{{ item.title }}
|
||||
</view>
|
||||
{{ item.title }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
<view v-if="chatMessageListLength > 0" class="chat-wrap">
|
||||
<view class="chat-list-wrap">
|
||||
<view class="chat-wrap">
|
||||
<view v-if="chatMessageListLength > 0" class="chat-list-wrap">
|
||||
<view
|
||||
v-for="(item, index) in chatMessageList"
|
||||
:key="index"
|
||||
@@ -148,16 +102,6 @@
|
||||
{{ item.prompt }}
|
||||
</view>
|
||||
</view>
|
||||
<view class="item-right-tools">
|
||||
<view class="btn" @click="copyContentHandle(item.prompt)">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/icon-02.png'"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
/>
|
||||
复制
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="item.type === -2" class="chat-message-body">
|
||||
<view class="avatar">
|
||||
@@ -222,91 +166,18 @@
|
||||
/>
|
||||
重新生成
|
||||
</view>
|
||||
<view
|
||||
:class="{
|
||||
'playing': audioPlayId === item.conversationId && isPlayAudio
|
||||
}"
|
||||
class="item"
|
||||
@click="ttsHandle(item)"
|
||||
>
|
||||
<image
|
||||
:src="webUrl + '/aiChat/' + ((audioPlayId === item.conversationId && isPlayAudio) ? 'audio-on' : 'audio-off') +'.png'"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
/>
|
||||
语音播放
|
||||
</view>
|
||||
<view class="item item2" @click="copyMoreInfoHandle(item)">拷贝</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 换一换 -->
|
||||
<view
|
||||
v-if="!item.showCursor &&
|
||||
!item.isError &&
|
||||
(item.orderList.length > 0 ||
|
||||
item.giftGoodsList.length > 0 ||
|
||||
item.goodsList.length > 0 ||
|
||||
item.shopList.length > 0 ||
|
||||
item.prizeList.length > 0 ||
|
||||
item.ichList.length > 0 ||
|
||||
item.qianxianList.length > 0
|
||||
)
|
||||
"
|
||||
v-if="item.showMoreInfo.show"
|
||||
class="change-list-wrap"
|
||||
>
|
||||
<!-- 礼品 -->
|
||||
<view
|
||||
v-if="item.giftGoodsList.length > 0"
|
||||
class="recommend-goods-wrap"
|
||||
>
|
||||
<swiper
|
||||
class="goods-swiper"
|
||||
:indicator-dots="false"
|
||||
:autoplay="false"
|
||||
:current="item.currentSwiperIndex"
|
||||
previous-margin="120rpx"
|
||||
next-margin="120rpx"
|
||||
circular
|
||||
@change="e => onSwiperChange(index, e)"
|
||||
>
|
||||
<swiper-item
|
||||
v-for="(goodItem, goodIndex) in item.giftGoodsList"
|
||||
:key="goodIndex"
|
||||
>
|
||||
<view
|
||||
:class="{ 'active': item.currentSwiperIndex === goodIndex }"
|
||||
class="goods-item"
|
||||
@click="productItemClickHandle(goodItem)"
|
||||
>
|
||||
<view class="supplier" @click.stop="productItemSupplierClickHandle(goodItem)">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/icon-57.png'"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
lazy-load
|
||||
/>
|
||||
<text class="s-name">{{ goodItem.merName ||goodItem.storeName }}</text>
|
||||
<u-icon name="arrow-right" color="#999" size="12"></u-icon>
|
||||
</view>
|
||||
<view class="title one-t">{{ goodItem.name }}</view>
|
||||
<image :src="goodItem.img" class="p-img" mode="aspectFill" lazy-load />
|
||||
<view class="price">
|
||||
<text class="unit">¥</text>
|
||||
<text class="num">{{ goodItem.price }}</text>
|
||||
</view>
|
||||
<view class="actions">
|
||||
<view class="btn-buy" @click.stop="productItemBuyNowClickHandle(goodItem)">立即下单</view>
|
||||
<view class="btn-gift" @click.stop="productItemGiftBuyClickHandle(goodItem)">送给朋友</view>
|
||||
</view>
|
||||
</view>
|
||||
</swiper-item>
|
||||
</swiper>
|
||||
</view>
|
||||
<!-- 特产商品 -->
|
||||
<view v-if="item.goodsList.length > 0" class="list-wrap">
|
||||
<view v-if="item.showMoreInfo.showType === '特产商品'" class="list-wrap">
|
||||
<view
|
||||
v-for="(productItem, productIndex) in item.goodsList"
|
||||
v-for="(productItem, productIndex) in item.showMoreInfo.resultItems"
|
||||
:key="productIndex"
|
||||
class="product-item"
|
||||
@click="productItemClickHandle(productItem)"
|
||||
@@ -314,7 +185,6 @@
|
||||
<image
|
||||
:src="productItem.img"
|
||||
class="img"
|
||||
lazy-load
|
||||
/>
|
||||
<view class="product-info">
|
||||
<view class="name one-t">
|
||||
@@ -329,21 +199,19 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 店铺 -->
|
||||
<view v-if="item.shopList.length > 0" class="list-wrap">
|
||||
<view v-if="item.showMoreInfo.showType === '店铺'" class="list-wrap">
|
||||
<view
|
||||
v-for="(hotel, hotelIndex) in item.shopList"
|
||||
v-for="(hotel, hotelIndex) in item.showMoreInfo.resultItems"
|
||||
:key="hotelIndex"
|
||||
class="product-item"
|
||||
@click="hotelItemClickHandle(hotel)"
|
||||
>
|
||||
<view class="hotel-type">
|
||||
{{ hotel.hotelTypeName }}
|
||||
手工体验
|
||||
</view>
|
||||
<image
|
||||
:src="hotel.img + ((hotel.img && hotel.img.indexOf('.mp4') > -1) ? '?vframe/jpg/offset/1' : '')"
|
||||
:src="hotel.img"
|
||||
class="img"
|
||||
lazy-load
|
||||
/>
|
||||
<view class="product-info">
|
||||
<view class="name one-t">
|
||||
@@ -355,10 +223,9 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 非遗 -->
|
||||
<view v-if="item.ichList.length > 0" class="list-wrap">
|
||||
<view v-if="item.showMoreInfo.showType === '非遗文化'" class="list-wrap">
|
||||
<view
|
||||
v-for="(ich, ichIndex) in item.ichList"
|
||||
v-for="(ich, ichIndex) in item.showMoreInfo.resultItems"
|
||||
:key="ichIndex"
|
||||
class="product-item"
|
||||
@click="ichItemClickHandle(ich)"
|
||||
@@ -366,7 +233,6 @@
|
||||
<image
|
||||
:src="ich.img"
|
||||
class="img"
|
||||
lazy-load
|
||||
/>
|
||||
<view class="product-info">
|
||||
<view class="name one-t">
|
||||
@@ -378,10 +244,9 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 千县 -->
|
||||
<view v-if="item.qianxianList.length > 0" class="list-wrap">
|
||||
<view v-if="item.showMoreInfo.showType === '千县名品'" class="list-wrap">
|
||||
<view
|
||||
v-for="(qianxian, qianxianIndex) in item.qianxianList"
|
||||
v-for="(qianxian, qianxianIndex) in item.showMoreInfo.resultItems"
|
||||
:key="qianxianIndex"
|
||||
class="product-item"
|
||||
@click="qianxianItemClickHandle(qianxian)"
|
||||
@@ -389,7 +254,6 @@
|
||||
<image
|
||||
:src="qianxian.img"
|
||||
class="img"
|
||||
lazy-load
|
||||
/>
|
||||
<view class="product-info">
|
||||
<view class="name name2 one-t">
|
||||
@@ -398,59 +262,15 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 抽奖 -->
|
||||
<view v-if="item.prizeList.length > 0" class="list-wrap prize-list-wrap">
|
||||
<view
|
||||
v-for="(prize, prizeIndex) in item.prizeList"
|
||||
:key="prizeIndex"
|
||||
class="prize-item"
|
||||
@click="prizeItemClickHandle(prize)"
|
||||
>
|
||||
<image
|
||||
:src="prize.img"
|
||||
class="img"
|
||||
mode="widthFix"
|
||||
lazy-load
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 订单 -->
|
||||
<view v-if="item.orderList.length > 0" class="order-list-wrap">
|
||||
<view
|
||||
v-for="(order, orderIndex) in item.orderList"
|
||||
:key="orderIndex"
|
||||
class="order-item-wrap"
|
||||
>
|
||||
<order-item
|
||||
:item="order"
|
||||
@viewOrderTrack="viewOrderTrackHandle"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<view
|
||||
v-if="item.shopList.length > 0 ||
|
||||
item.goodsList.length > 0 ||
|
||||
item.giftGoodsList.length > 0 ||
|
||||
item.ichList.length > 0 ||
|
||||
item.qianxianList.length > 0 ||
|
||||
item.shopList.length > 0
|
||||
"
|
||||
class="change-btn"
|
||||
>
|
||||
<view class="change-btn-content" @click="analyzeKeywordsChangeHandle(item.conversationId, item)">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/icon-53.png'"
|
||||
:class="{
|
||||
'rotate': item.changeIsRotate
|
||||
}"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
/>
|
||||
换一换
|
||||
</view>
|
||||
<view class="change-btn">
|
||||
<image
|
||||
:src="webUrl + '/aiChat/icon-change.png'"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
@click="analyzeKeywordsChangeHandle(item.conversationId, item.showMoreInfo)"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 建议提问 -->
|
||||
<view
|
||||
v-if="index === (chatMessageListLength - 1) && item.listQuestion.length > 0"
|
||||
class="suggestion-wrap"
|
||||
@@ -478,11 +298,7 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view
|
||||
v-if="chatNumber"
|
||||
id="bottom_postion"
|
||||
class="bottom-postion"
|
||||
/>
|
||||
<view id="bottom_postion" class="bottom-postion" />
|
||||
</view>
|
||||
</view>
|
||||
<view
|
||||
@@ -491,42 +307,25 @@
|
||||
}"
|
||||
class="page-to-bottom"
|
||||
>
|
||||
<view class="down-icon-wrap">
|
||||
<view
|
||||
v-if="chatNumber"
|
||||
class="new-chat"
|
||||
@click="createNewHandle"
|
||||
>
|
||||
<image
|
||||
v-if="chatMessageListLength > 0 && !isScrollToBottom && !loading"
|
||||
:src="webUrl + '/aiChat/down.png'"
|
||||
class="icon down-icon"
|
||||
:src="webUrl + '/aiChat/icon-05.png'"
|
||||
class="btn-icon"
|
||||
mode="widthFix"
|
||||
@click="scrollToBottomHandle"
|
||||
/>
|
||||
开启新对话
|
||||
</view>
|
||||
<view class="container">
|
||||
<view
|
||||
v-if="chatNumber"
|
||||
class="new-chat"
|
||||
@click="createNewHandle"
|
||||
>
|
||||
<image
|
||||
:src="webUrl + '/aiChat/icon-54.png'"
|
||||
class="btn-icon"
|
||||
mode="widthFix"
|
||||
/>
|
||||
开启新对话
|
||||
</view>
|
||||
<view
|
||||
v-for="(item, index) in bottomTools"
|
||||
:key="index"
|
||||
class="bottom-tool-item"
|
||||
@click="bottomToolClickHandle(item)"
|
||||
>
|
||||
<image
|
||||
:src="webUrl + '/aiChat/' + item.icon + '.png'"
|
||||
class="tool-icon"
|
||||
mode="widthFix"
|
||||
/>
|
||||
{{ item.text }}
|
||||
</view>
|
||||
</view>
|
||||
<image
|
||||
v-if="chatMessageListLength > 0 && !isScrollToBottom && !loading"
|
||||
:src="webUrl + '/aiChat/down.png'"
|
||||
class="icon"
|
||||
mode="widthFix"
|
||||
@click="scrollToBottomHandle"
|
||||
/>
|
||||
</view>
|
||||
<bottom-send
|
||||
ref="bottomSend"
|
||||
@@ -540,58 +339,33 @@
|
||||
<AiHistoryList
|
||||
ref="historyView"
|
||||
:status-bar-height="statusBarHeight"
|
||||
@enter-history="audioStopHandle"
|
||||
/>
|
||||
<ProductWindow
|
||||
ref="attrWindow"
|
||||
:attr="attr"
|
||||
:cart-num="cart_num"
|
||||
:show-ok="!showGiftBtn"
|
||||
:is-gift="showGiftBtn"
|
||||
:padding-bottom="'60px'"
|
||||
class-name="ai-product-window"
|
||||
ok-text="立即购买"
|
||||
@changeFun="changeFun"
|
||||
@ok="buyNowOrGiftBuyReq(1)"
|
||||
@gift="buyNowOrGiftBuyReq(2)"
|
||||
/>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { chatMixinsV2 } from '../mixins/chatMixinsV2.js'
|
||||
import goCartMixin from '@/mixins/goCartMixins'
|
||||
import { chatMixins } from '../mixins/chatMixins.js'
|
||||
import {
|
||||
getAiSystemInfoSetting,
|
||||
getAiSystemInfoTopic
|
||||
} from '@/api/public'
|
||||
import AiHistoryList from '../components/historyList'
|
||||
import BottomSend from '../components/bottomSend.vue'
|
||||
import OrderItem from '../components/orderItem.vue'
|
||||
import ProductWindow from '@/components/ProductWindow'
|
||||
export default {
|
||||
name: 'AiChatIndexPage',
|
||||
components: {
|
||||
AiHistoryList,
|
||||
BottomSend,
|
||||
OrderItem,
|
||||
ProductWindow
|
||||
BottomSend
|
||||
},
|
||||
mixins: [chatMixinsV2, goCartMixin],
|
||||
mixins: [chatMixins],
|
||||
data() {
|
||||
return {
|
||||
cityName: '',
|
||||
animationWidth: '150%',
|
||||
animationStr: '',
|
||||
settingInfo: {},
|
||||
topicList: [],
|
||||
onlyOneToAddCart: false,
|
||||
topicIsRotate: false
|
||||
topicList: []
|
||||
}
|
||||
},
|
||||
onLoad(options) {
|
||||
this.cityName = options.cityName || ''
|
||||
},
|
||||
onShow() {
|
||||
const addNewChat = uni.getStorageSync('addNewChat') === '1'
|
||||
// 从历史界面点击新增对话
|
||||
@@ -601,6 +375,9 @@ export default {
|
||||
this.createNewHandle()
|
||||
}
|
||||
},
|
||||
onUnload() {
|
||||
this.closeWsFn()
|
||||
},
|
||||
methods: {
|
||||
createdCallbak() {
|
||||
this.$nextTick(() => {
|
||||
@@ -613,42 +390,16 @@ export default {
|
||||
this.animationStr = `TranslateXSwiper-${data.systemTopicDivMaxWidth * 10} ${data.systemTopicDivScrollDuration}s infinite linear alternate`
|
||||
}
|
||||
})
|
||||
this.loadData()
|
||||
})
|
||||
},
|
||||
loadData(type = '') {
|
||||
if (this.topicIsRotate) return
|
||||
if (type === 'click') {
|
||||
this.topicIsRotate = true
|
||||
}
|
||||
getAiSystemInfoTopic().then(res => {
|
||||
const { success, data } = res
|
||||
if (success) {
|
||||
// 返回数据先过滤this.topicList,随机保留三条数据
|
||||
let list = data || []
|
||||
if (this.topicList && this.topicList.length > 0) {
|
||||
const currentTitles = this.topicList.map(item => item.title)
|
||||
const filtered = list.filter(item => !currentTitles.includes(item.title))
|
||||
// 如果过滤后的数据不够3条,就不进行过滤
|
||||
if (filtered.length >= 3) {
|
||||
list = filtered
|
||||
}
|
||||
getAiSystemInfoTopic().then(res => {
|
||||
const { success, data } = res
|
||||
if (success) {
|
||||
this.topicList = data || []
|
||||
}
|
||||
list.sort(() => Math.random() - 0.5)
|
||||
this.topicList = list.slice(0, 3)
|
||||
setTimeout(() => {
|
||||
this.topicIsRotate = false
|
||||
}, 1000)
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
// 创建新会话
|
||||
createNewHandle() {
|
||||
this.closeAttrWindow()
|
||||
if (this.audioContext) {
|
||||
this.audioContext.stop()
|
||||
}
|
||||
wx.getBackgroundAudioManager().stop()
|
||||
if (!this.chatNumber) return
|
||||
this.closeWsFn()
|
||||
this.chatNumber = ''
|
||||
@@ -656,7 +407,6 @@ export default {
|
||||
this.loading = false
|
||||
this.getConfigLoading = false
|
||||
this.chatMessageList = []
|
||||
this.loadData()
|
||||
},
|
||||
clickBackHandle() {
|
||||
if (!this.chatNumber) {
|
||||
@@ -721,39 +471,43 @@ export default {
|
||||
opacity: 0.0;
|
||||
}
|
||||
}
|
||||
.home-wrap {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
height: calc(100vh - 240rpx);
|
||||
padding: 0 0 240rpx 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.focus-guide-wrap {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
flex-direction: column;
|
||||
padding: 60rpx 40rpx;
|
||||
.guide-left {
|
||||
.avatar {
|
||||
display: block;
|
||||
width: 230rpx;
|
||||
height: 404rpx;
|
||||
width: 267rpx;
|
||||
height: 530rpx;
|
||||
}
|
||||
}
|
||||
.guide-right {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
padding: 30rpx 0;
|
||||
padding: 30rpx;
|
||||
margin: 0 0 0 40rpx;
|
||||
border-radius: 20rpx;
|
||||
font-size: 28rpx;
|
||||
text-align: center;
|
||||
background-color: #fff;
|
||||
box-shadow: 0rpx 12rpx 30rpx rgba(0,0,0,0.1);
|
||||
.trangle {
|
||||
position: absolute;
|
||||
bottom: 120rpx;
|
||||
left: -15rpx;
|
||||
width: 30rpx;
|
||||
height: 30rpx;
|
||||
background-color: #fff;
|
||||
box-shadow: -30rpx 12rpx 30rpx rgba(0,0,0,0.1);
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
.title {
|
||||
width: 110%;
|
||||
font-weight: bold;
|
||||
font-size: 34rpx;
|
||||
}
|
||||
.content {
|
||||
padding: 30rpx 24rpx 0 24rpx;
|
||||
color: #3D4CF0;
|
||||
padding: 30rpx 0 0 0;
|
||||
color: #999;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -762,48 +516,46 @@ export default {
|
||||
.title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 0 24rpx;
|
||||
color: #3D4CF0;
|
||||
font-size: 28rpx;
|
||||
.title-left {
|
||||
font-size: 32rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
.title-right {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
.txt {
|
||||
width: 186rpx;
|
||||
height: 46rpx;
|
||||
margin: 0 20rpx;
|
||||
border-radius: 24rpx;
|
||||
text-align: center;
|
||||
line-height: 46rpx;
|
||||
color: #fff;
|
||||
font-size: 28rpx;
|
||||
background-color: #3D4CF1;
|
||||
}
|
||||
.icon {
|
||||
display: flex;
|
||||
width: 32rpx;
|
||||
width: 40rpx;
|
||||
height: 32rpx;
|
||||
margin: 0 8rpx 0 0;
|
||||
&.rotate {
|
||||
animation: spin-icon 1s linear;
|
||||
}
|
||||
}
|
||||
}
|
||||
.list-wrap {
|
||||
width: 100%;
|
||||
padding: 40rpx 0 0 0;
|
||||
margin: 60rpx 0 0 0;
|
||||
overflow-x: hidden;
|
||||
.list-cont {
|
||||
padding: 0 24rpx;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
flex-wrap: wrap;
|
||||
width: 750 * 1.5rpx;
|
||||
padding: 0 0 0 24rpx;
|
||||
box-sizing: border-box;
|
||||
// animation: translateXSwiper 10s infinite linear alternate;
|
||||
.list-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 6rpx 12rpx;
|
||||
margin: 0 0 24rpx 0;
|
||||
border-radius: 12rpx;
|
||||
border: 1rpx solid #ddd;
|
||||
height: 48rpx;
|
||||
padding: 0 18rpx;
|
||||
margin: 0 30rpx 30rpx 0;
|
||||
border-radius: 24rpx;
|
||||
font-size: 28rpx;
|
||||
color: #666;
|
||||
background-color: #fff;
|
||||
background: rgba(255,255,255,0.39);
|
||||
box-shadow: 0rpx 6rpx 12rpx rgba(0,0,0,0.1);
|
||||
.icon {
|
||||
display: block;
|
||||
width: 24rpx;
|
||||
|
||||
@@ -37,25 +37,3 @@ export function historyChatMessage(params) {
|
||||
export function deleteChatListByType(type) {
|
||||
return request.delete('/v1/chat/type/' + type, {}, { login: true })
|
||||
}
|
||||
|
||||
export function getWeatherData(params) {
|
||||
return request.get('/v1/chat/weatherData', params, { login: true })
|
||||
}
|
||||
|
||||
export function getHolidayData(params) {
|
||||
return request.get('/v1/chat/holidayData', params, { login: true })
|
||||
}
|
||||
|
||||
export function getCompletionsV3(params) {
|
||||
return request.get('/v1/chat/intent/recognize', params, { login: true })
|
||||
}
|
||||
|
||||
// 通过关键字-搜索列表-换一换
|
||||
export function getAnalyzeKeywordsChangeV3(data) {
|
||||
return request.post('/v1/chat/skill/refresh', data, { login: true })
|
||||
}
|
||||
|
||||
// 以图搜索商品
|
||||
export function getAnalyzeByImageV3(data) {
|
||||
return request.post('/v1/chat/image/recognition', data, { login: true })
|
||||
}
|
||||
|
||||
+1
-61
@@ -63,64 +63,4 @@ export function getGiftCardResend(data) {
|
||||
*/
|
||||
export function getGiftCardSendBackground(data) {
|
||||
return request.get("giftCard/giftCardBackgroundImage", data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建团购礼品
|
||||
* @param {*} data
|
||||
*/
|
||||
export function createGroupBuyGift(data) {
|
||||
return request.post("/travel/giftCardOrder/confirm", data);
|
||||
}
|
||||
/**
|
||||
* 旅居团购礼品卡订单创建
|
||||
* @param {*} data
|
||||
*/
|
||||
export function createSojoumGroupBuyGift(key, data) {
|
||||
return request.post("/travel/giftCardOrder/create/" + key, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 旅居团购礼品卡订单详情
|
||||
* @param {*} params
|
||||
* @returns
|
||||
*/
|
||||
export function fetchSojoumGroupBuyGiftDetail(params) {
|
||||
return request.get("/travel/giftCard/info",params, {
|
||||
login: true
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 领取旅居团购礼品卡
|
||||
* @param {*} params
|
||||
* @returns
|
||||
*/
|
||||
export function receiveSojoumGroupBuyGift(params) {
|
||||
return request.post("/travel/giftCard/receive", params, {
|
||||
login: true
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 旅居礼品卡送礼入口轮播图
|
||||
* @param {*} params
|
||||
* @returns
|
||||
*/
|
||||
export function fetchSojoumGroupBuyGiftCarousel(params) {
|
||||
return request.get("/travel/giftCardTravelBanner",params, {
|
||||
login: true
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算旅居团购礼品订单价格
|
||||
* @param {*} params
|
||||
* @returns
|
||||
*/
|
||||
|
||||
export function computedSojoumGroupBuyGiftOrderPrice(params) {
|
||||
return request.post("/travel/giftCardOrder/computed/" + params.key, params, {
|
||||
login: true
|
||||
})
|
||||
}
|
||||
}
|
||||
+1
-9
@@ -78,12 +78,4 @@ export function getRecipe(params) {
|
||||
*/
|
||||
export function getBanner() {
|
||||
return request.get("/wellness/exhibition/banner")
|
||||
}
|
||||
|
||||
/**
|
||||
* 康养生活-康养旅居顶部配置
|
||||
* @returns
|
||||
*/
|
||||
export function getWellnessTopImage() {
|
||||
return request.get("/wellness/topImage")
|
||||
}
|
||||
}
|
||||
-17
@@ -191,10 +191,6 @@ export function getHotelTypeList() {
|
||||
});
|
||||
}
|
||||
|
||||
export function getHotelBanner(params) {
|
||||
return request.get("/hotelBanner", params);
|
||||
}
|
||||
|
||||
/**
|
||||
* 店铺详情海报
|
||||
* @param id 店铺ID int
|
||||
@@ -277,17 +273,4 @@ export function getMerchantApply() {
|
||||
return request.get("/merchantApply/userHotels", {}, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户评论列表
|
||||
*/
|
||||
export function getCommentList(params) {
|
||||
return request.get("/user/reply/list", params, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加用户评论
|
||||
*/
|
||||
export function addComment(data) {
|
||||
return request.post("/user/reply/add", data, {login: true})
|
||||
}
|
||||
|
||||
|
||||
-54
@@ -55,61 +55,7 @@ export function saveWholesaler(wholesalerInfo) {
|
||||
return request.post("/merchantApply/wholesaler/submit", param, {login: true})
|
||||
}
|
||||
|
||||
export function saveExperienceStore(params) {
|
||||
return request.post("/merchantApply/experienceStore/submit", params, {login: true})
|
||||
}
|
||||
|
||||
export function saveExperienceStoreDraft(params) {
|
||||
return request.post("/merchantApply/experienceStore/saveDraft", params, {login: true})
|
||||
}
|
||||
|
||||
export function getExperienceStoreCategoryList() {
|
||||
return request.get("/experienceStore/categoryList", {}, {login: true})
|
||||
}
|
||||
|
||||
export function getExperienceStoreInfo(params) {
|
||||
return request.get("merchantApply/info/experienceStore", params, {login: true})
|
||||
}
|
||||
|
||||
// 撤销入驻申请
|
||||
export function removeApply() {
|
||||
return request.post("/merchantApply/revoke")
|
||||
}
|
||||
|
||||
// 特色店铺入驻信息
|
||||
export function getHotelInfo(params) {
|
||||
return request.get("merchantApply/info/hotel", params, {login: true})
|
||||
}
|
||||
|
||||
// 获取千县名品店铺类型列表
|
||||
export function getCountyFamousHotelType() {
|
||||
return request.get("/countyFamous/hotelType", {}, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 旅居管家入驻申请详情
|
||||
*/
|
||||
export function getTravelInfo(params) {
|
||||
return request.get("merchantApply/info/travel", params, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 提交旅居管家入驻申请
|
||||
*/
|
||||
export function saveTravel(params) {
|
||||
return request.post("/merchantApply/travel/submit", params, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 旅居管家申请草稿保存
|
||||
*/
|
||||
export function saveTravelDraft(params) {
|
||||
return request.post("/merchantApply/travel/saveDraft", params, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 旅居管家撤销申请
|
||||
*/
|
||||
export function revokeTravel(params) {
|
||||
return request.post("/merchantApply/travel/revoke", params, {login: true})
|
||||
}
|
||||
|
||||
+1
-36
@@ -3,14 +3,6 @@
|
||||
* */
|
||||
import request from "@/utils/request";
|
||||
|
||||
/**
|
||||
* 获取默认地址
|
||||
* @returns {*}
|
||||
*/
|
||||
export function getAddressDefaultSelected() {
|
||||
return request.get("/address/defaultSelected")
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过购物车 id 获取订单信息
|
||||
* @param cartId
|
||||
@@ -186,31 +178,4 @@ export function aginConfirm(params) {
|
||||
*/
|
||||
export function editAddress(params) {
|
||||
return request.post('/order/editAddress', params)
|
||||
}
|
||||
|
||||
/**
|
||||
* 申请修改订单收货地址
|
||||
* @param {*} params
|
||||
* @returns
|
||||
*/
|
||||
export function applyEditAddress(params) {
|
||||
return request.post('/order/applyEditAddress', params)
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单预计到达时间
|
||||
* @param {*} params
|
||||
* @returns
|
||||
*/
|
||||
export function orderExpectedArrivalTime(params) {
|
||||
return request.post('/order/express/estimatedTime', params)
|
||||
}
|
||||
|
||||
/**
|
||||
* 旅居团购订单详情
|
||||
* @param {*} params
|
||||
* @returns
|
||||
*/
|
||||
export function groupOrderDetail(params) {
|
||||
return request.post('/travel/travelGroupOrder/detail/' + params.key, params)
|
||||
}
|
||||
}
|
||||
+1
-29
@@ -159,32 +159,4 @@ export function hadView(data) {
|
||||
|
||||
export function getShareImg(id) {
|
||||
return request.get('/landmarkGoods/poster/' + id, {}, {login: false})
|
||||
}
|
||||
|
||||
export function getLatestExperienceCoupon() {
|
||||
return request.get('/experienceCoupon/latest', {}, {login: true})
|
||||
}
|
||||
|
||||
export function getExperienceCouponList() {
|
||||
return request.get('/experienceCoupon/list', {}, {login: true})
|
||||
}
|
||||
|
||||
export function getExperienceCouponItems(params) {
|
||||
return request.get('/experienceCoupon/items', params, {login: true})
|
||||
}
|
||||
|
||||
export function getExperienceCouponCategoryList(params) {
|
||||
return request.get('/experienceCoupon/categoryList', params, {login: true})
|
||||
}
|
||||
|
||||
export function createExperienceCouponOrder(data) {
|
||||
return request.post('/experienceCoupon/order/create', data, {login: true})
|
||||
}
|
||||
|
||||
export function getExperienceCouponOrderDetail(orderId) {
|
||||
return request.get(`/experienceCoupon/order/detail/${orderId}`, {}, {login: true})
|
||||
}
|
||||
|
||||
export function checkExperienceCoupon(params) {
|
||||
return request.get('/experienceCoupon/check', params, {login: true})
|
||||
}
|
||||
}
|
||||
@@ -222,8 +222,3 @@ export function getAiSystemInfoSetting() {
|
||||
export function getAiSystemInfoTopic() {
|
||||
return request.get('/ai/systemTopic', {}, { login: false })
|
||||
}
|
||||
|
||||
// 获取通用分享配置
|
||||
export function getWeixinShareConfig() {
|
||||
return request.get('/weixinShareConfig', {}, { login: false })
|
||||
}
|
||||
|
||||
+7
-187
@@ -105,12 +105,12 @@ export function getSaleList(params) {
|
||||
}
|
||||
|
||||
// 旅居列表
|
||||
// export function getJiaLouList(params) {
|
||||
// return request.get('/countyFamous/sojourn', params, {login: true})
|
||||
// }
|
||||
export function getJiaLouList(params) {
|
||||
return request.get('/countyFamous/sojourn', params, {login: true})
|
||||
}
|
||||
|
||||
// 旅居详情
|
||||
export function getJiaLouDetail1(id) {
|
||||
export function getJiaLouDetail(id) {
|
||||
return request.get('/countyFamous/sojourn/' + id, {}, {login: true})
|
||||
}
|
||||
|
||||
@@ -141,195 +141,15 @@ export function postJiaLouZan(data) {
|
||||
|
||||
// 旅居资讯查看
|
||||
export function postJiaLouNewsView(data) {
|
||||
return request.post('/travel/news/view', data, {login: true})
|
||||
return request.post('/countyFamous/news/view', data, {login: true})
|
||||
}
|
||||
|
||||
// 旅居资讯点赞
|
||||
export function postJiaLouNewsZan(data) {
|
||||
return request.post('/travel/news/zan', data, {login: true})
|
||||
return request.post('/countyFamous/news/zan', data, {login: true})
|
||||
}
|
||||
|
||||
// 分享旅居
|
||||
export function postJiaLouShare(id) {
|
||||
return request.get('/countyFamous/sojourn/poster/' + id, {login: true})
|
||||
}
|
||||
// 分享旅居1
|
||||
export function postTravelShare(id) {
|
||||
return request.get('/travel/poster/' + id, {login: true})
|
||||
}
|
||||
/**
|
||||
* 获取旅居列表
|
||||
* countyId int 县城ID
|
||||
shopType string 所属板块(countyFamous-千县;wellness-康养)
|
||||
wellnessPlaceCateId int 康养圣地分类ID
|
||||
name string 名称
|
||||
page int 页码
|
||||
limit int 每页数量
|
||||
*/
|
||||
export function getJiaLouList(params) {
|
||||
return request.get('/travel/merchantList', params, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取旅居详情
|
||||
* @param {*} id
|
||||
*/
|
||||
export function getJiaLouDetail(id) {
|
||||
return request.get('/travel/merchant/' + id, {}, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 旅居团购产品列表
|
||||
merId int 商户ID
|
||||
page int 页码
|
||||
limit int 每页数量
|
||||
*/
|
||||
export function getJiaLouProductList(params) {
|
||||
return request.get('/travel/products', params, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 旅居团购产品详情
|
||||
* @param {*} id 产品ID
|
||||
*/
|
||||
export function getJiaLouProductDetail(id) {
|
||||
return request.get('/travel/product/' + id, {}, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 旅居团购产品评论列表
|
||||
* travelGroupProductId int 旅居团购产品ID
|
||||
* type int 0-全部 1-好评 2-中评 3-差评
|
||||
* page int 页码
|
||||
* limit int 每页数量
|
||||
*/
|
||||
export function getJiaLouProductReply(params) {
|
||||
return request.get('/travel/product/reply', params, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取旅居团购产品评论统计
|
||||
* travelGroupProductId int 旅居团购产品ID
|
||||
*/
|
||||
export function getJiaLouProductReplyCount(params) {
|
||||
return request.get('/travel/product/reply/count', params, {login: true})
|
||||
}
|
||||
|
||||
export function getTravelGroupOrderAgreement() {
|
||||
return request.get('/travel/travelGroupOrderAgreement', {}, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 管家列表
|
||||
* merId int 商户ID
|
||||
page int 页码
|
||||
limit int 每页数量
|
||||
*/
|
||||
export function getJiaLouStewardList(params) {
|
||||
return request.get('/travel/steward', params, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 指定月份可预约日期
|
||||
* @param {*} params
|
||||
* travelGroupProductId int 旅居团购产品ID
|
||||
month string 月份(yyyy-MM)
|
||||
*/
|
||||
export function getJiaLouCalendar(params) {
|
||||
return request.get('/travel/product/calendar', params, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取预定必读
|
||||
*/
|
||||
export function getJiaLouBookingRules() {
|
||||
return request.get('/travel/orderRule', {}, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建订单
|
||||
* @param {*} params
|
||||
* travelGroupProductId int 旅居团购产品ID
|
||||
orderStartDate string 订单开始日期(yyyy-MM-dd)
|
||||
orderEndDate string 订单结束日期(yyyy-MM-dd)
|
||||
*/
|
||||
export function createJiaLouOrder(params) {
|
||||
return request.post('/travel/travelGroupOrder/confirm', params, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 旅居团购订单创建
|
||||
* @param {*} params
|
||||
*/
|
||||
export function createJiaLouOrderPay(params) {
|
||||
return request.post('/travel/travelGroupOrder/create/' + params.key, params, {login: true})
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 旅居资讯列表
|
||||
* merId int 旅居管家商户ID
|
||||
page int 页码
|
||||
limit int 每页条数
|
||||
*/
|
||||
export function getJiaLouNewsList(params) {
|
||||
return request.get('/travel/news', params, {login: true})
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 分享管家
|
||||
*/
|
||||
export function getShareHousekeeper(id) {
|
||||
return request.get('/travel/steward/poster/' + id, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 管家详情
|
||||
*/
|
||||
export function getJiaLouStewardDetail(id) {
|
||||
return request.get('/travel/steward/' + id, {}, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取县城资讯详情
|
||||
*/
|
||||
export function getCityNewsDetail(id) {
|
||||
return request.get('/countyFamous/news/' + id, {}, {login: true})
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取县城资讯类别
|
||||
*/
|
||||
export function getCityNewsCategory() {
|
||||
return request.get('/countyFamous/newsCategory', {}, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取县城店铺列表
|
||||
*/
|
||||
export function getCityShopList(params) {
|
||||
return request.get('/countyFamous/hotel', params, {login: true})
|
||||
}
|
||||
|
||||
export function getCountyFamousHotelType() {
|
||||
return request.get('/countyFamous/hotelType', {}, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* ������б�
|
||||
* travelMerchantId int �þ��̻�ID
|
||||
* experienceStoreCategoryId int ��������ID
|
||||
*/
|
||||
export function getExperienceStoreList(params) {
|
||||
return request.get('/experienceStore/list', params, { login: true })
|
||||
}
|
||||
|
||||
export function getExperienceStoreProject(experienceMerchantId) {
|
||||
return request.get('/experienceStoreProject/' + experienceMerchantId, {}, { login: true })
|
||||
}
|
||||
|
||||
export function getExperienceStoreDetail(id) {
|
||||
return request.get('/experienceStore/detail/' + id, {}, { login: true })
|
||||
}
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
import request from "@/utils/request";
|
||||
/**
|
||||
* 获取未读消息数量
|
||||
*/
|
||||
export function getUnreadMessageCount() {
|
||||
return request.get("/user/reply/messages/unreadCount", {}, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 标记消息为已读
|
||||
*/
|
||||
export function markMessagesAsRead() {
|
||||
return request.post("/user/reply/messages/readAll", {}, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取消息列表
|
||||
*/
|
||||
export function getMessageList(params) {
|
||||
return request.get("/user/reply/messages", params, {login: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 回复消息
|
||||
*/
|
||||
export function replyMessage(data) {
|
||||
return request.post("/user/reply/add", data, {login: true})
|
||||
}
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
import request from "@/utils/request";
|
||||
/**
|
||||
* 旅居团购订单详情
|
||||
* @param {*} params
|
||||
* @returns
|
||||
*/
|
||||
export function fetchSojoumOrderDetail(params) {
|
||||
return request.get("/travel/travelGroupOrder/detail/" + params.key, params, {
|
||||
login: true
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 旅居团购订单退款
|
||||
* @param {*} params
|
||||
* @returns
|
||||
*/
|
||||
export function sojoumOrderRefund(params) {
|
||||
return request.post("/travel/travelGroupOrder/refund", params, {
|
||||
login: true
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 旅居团购订单修改入住时间
|
||||
* @param {*} params
|
||||
* @returns
|
||||
*/
|
||||
export function sojoumOrderCheckInTime(params) {
|
||||
return request.post("/travel/travelGroupOrder/changeDate", params, {
|
||||
login: true
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取产品指定月份的预约日历
|
||||
* @param {*} params
|
||||
* travelGroupProductId int 旅居团购产品ID
|
||||
month string 月份(yyyy-MM)
|
||||
* @returns
|
||||
*/
|
||||
export function sojoumOrderCalendar(params) {
|
||||
return request.get("/travel/product/calendar", params, {
|
||||
login: true
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 旅居团购订单退款信息
|
||||
* @param {*} params
|
||||
* @returns
|
||||
*/
|
||||
export function sojoumOrderRefundInfo(params) {
|
||||
return request.post("/travel/travelGroupOrder/refundInfo", params, {
|
||||
login: true
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 旅居团购订单检查日期是否可预约
|
||||
* @param {*} params
|
||||
* @returns
|
||||
*/
|
||||
export function sojoumOrderCheckDate(params) {
|
||||
return request.post("/travel/travelGroupOrder/checkDate", params, {
|
||||
login: true
|
||||
})
|
||||
}
|
||||
|
||||
export function sojoumOrderComment(params) {
|
||||
return request.post("/travel/travelGroupOrder/comment", params, {
|
||||
login: true
|
||||
})
|
||||
}
|
||||
+1
-5
@@ -578,10 +578,6 @@ export function getHistory(params) {
|
||||
return request.get('/history/list', params)
|
||||
}
|
||||
|
||||
export function deleteHistory(id) {
|
||||
return request.delete(`/history/${id}`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 购物车猜你喜欢
|
||||
* @param {*} params
|
||||
@@ -602,4 +598,4 @@ export function queryUserGuide(params) {
|
||||
|
||||
export function setUserGuide(params) {
|
||||
return request.post('/user/guide/status', params)
|
||||
}
|
||||
}
|
||||
+24
-362
@@ -12,14 +12,10 @@ page {
|
||||
min-height: 100vh;
|
||||
background: linear-gradient(155deg, rgba(61, 76, 241, 0.15) 0%, rgba(255,255,255,1) 25%, rgba(255,255,255,1) 75%, rgba(61, 76, 241, 0.15) 100%);
|
||||
// background-color: #fff;
|
||||
// background-size: 100% calc(100vh - 160rpx);
|
||||
// background-size: 100% 100vh;
|
||||
// background-image: url(https://wxapp.xdd618.com/api/file/pic/aiChat/bg.png);
|
||||
// background-repeat: no-repeat;
|
||||
// background-attachment: fixed;
|
||||
&.new-chat {
|
||||
background-size: 100% calc(100vh - 160rpx);
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
.fix-tabbar-header {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
@@ -94,36 +90,28 @@ page {
|
||||
}
|
||||
.page-to-bottom {
|
||||
position: fixed;
|
||||
bottom: 160rpx;
|
||||
bottom: 180rpx;
|
||||
left: 0;
|
||||
right: 0;
|
||||
z-index: 8;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
padding: 0 24rpx;
|
||||
transition: all 0.2s;
|
||||
&.focus {
|
||||
transform: translateY(-40rpx);
|
||||
}
|
||||
.container {
|
||||
display: flex;
|
||||
flex-wrap: nowrap;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
padding: 24rpx;
|
||||
box-sizing: border-box;
|
||||
overflow-x: auto;
|
||||
}
|
||||
.new-chat {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-shrink: 0;
|
||||
height: 64rpx;
|
||||
height: 68rpx;
|
||||
padding: 0 24rpx;
|
||||
margin: 0 20rpx 0 0;
|
||||
border-radius: 16rpx;
|
||||
line-height: 64rpx;
|
||||
border-radius: 40rpx;
|
||||
line-height: 68rpx;
|
||||
font-size: 30rpx;
|
||||
color: #fff;
|
||||
background-color: #3D4CF1;
|
||||
box-shadow: 0rpx 0 12rpx rgba(74,74,74,0.2);
|
||||
background-color: #fff;
|
||||
box-shadow: 0rpx 6rpx 12rpx rgba(0,0,0,0.16);
|
||||
.btn-icon {
|
||||
display: block;
|
||||
width: 40rpx;
|
||||
@@ -131,45 +119,13 @@ page {
|
||||
margin: 0 8rpx 0 0;
|
||||
}
|
||||
}
|
||||
.down-icon-wrap {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
padding: 0 24rpx 0 0;
|
||||
}
|
||||
.icon {
|
||||
display: block;
|
||||
flex-shrink: 0;
|
||||
width: 64rpx;
|
||||
height: 64rpx;
|
||||
border-radius: 16rpx;
|
||||
background-color: #fff;
|
||||
box-shadow: 0rpx 0 12rpx rgba(74,74,74,0.2);
|
||||
}
|
||||
.bottom-tool-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-shrink: 0;
|
||||
height: 64rpx;
|
||||
padding: 0 24rpx;
|
||||
margin: 0 20rpx 0 0;
|
||||
border-radius: 16rpx;
|
||||
font-size: 30rpx;
|
||||
color: #333;
|
||||
background-color: #fff;
|
||||
box-shadow: 0rpx 6rpx 20rpx rgba(74,74,74,0.1);
|
||||
&:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
.tool-icon {
|
||||
display: block;
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
padding: 0;
|
||||
margin: 0 12rpx 0 0;
|
||||
background-color: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
width: 68rpx;
|
||||
height: 68rpx;
|
||||
margin: 0 0 0 24rpx;
|
||||
border-radius: 50%;
|
||||
box-shadow: 0rpx 6rpx 12rpx rgba(0,0,0,0.16);
|
||||
}
|
||||
}
|
||||
.fix-page-bottom {
|
||||
@@ -203,7 +159,7 @@ page {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
min-height: 100rpx;
|
||||
height: 100rpx;
|
||||
width: calc(100% - 122rpx);
|
||||
padding: 6rpx 6rpx 6rpx 24rpx;
|
||||
border-radius: 30rpx;
|
||||
@@ -226,13 +182,11 @@ page {
|
||||
z-index: 5;
|
||||
width: 100%;
|
||||
height: 88rpx;
|
||||
max-height: 220rpx;
|
||||
border: 0;
|
||||
box-sizing: border-box;
|
||||
line-height: 48rpx;
|
||||
line-height: 88rpx;
|
||||
color: #333;
|
||||
font-size: 30rpx;
|
||||
overflow-y: auto;
|
||||
}
|
||||
.placeholder-txt {
|
||||
position: absolute;
|
||||
@@ -515,7 +469,7 @@ page {
|
||||
.txt {
|
||||
max-width: 100%;
|
||||
padding: 20rpx 32rpx;
|
||||
border-radius: 40rpx 0 40rpx 40rpx;
|
||||
border-radius: 40rpx 40rpx 0 40rpx;
|
||||
box-sizing: border-box;
|
||||
color: #fff;
|
||||
font-size: 30rpx;
|
||||
@@ -533,20 +487,6 @@ page {
|
||||
}
|
||||
}
|
||||
}
|
||||
.item-right-tools {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
padding: 20rpx 0 0 0;
|
||||
.btn {
|
||||
display: flex;
|
||||
font-size: 24rpx;
|
||||
.icon {
|
||||
display: block;
|
||||
width: 36rpx;
|
||||
margin: 0 8rpx 0 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
.bottom-btns {
|
||||
position: relative;
|
||||
display: flex;
|
||||
@@ -578,9 +518,6 @@ page {
|
||||
margin: 0;
|
||||
color: transparent;
|
||||
}
|
||||
.playing {
|
||||
color: #3D4CF1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1078,290 +1015,15 @@ page {
|
||||
}
|
||||
}
|
||||
}
|
||||
.prize-list-wrap {
|
||||
display: block;
|
||||
.prize-item {
|
||||
.img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
border-radius: 20rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
.change-btn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 0 0 20rpx 0;
|
||||
.change-btn-content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: #3D4CF0;
|
||||
font-size: 28rpx;
|
||||
.icon {
|
||||
display: block;
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
margin: 0 8rpx 0 0;
|
||||
&.rotate {
|
||||
animation: spin-icon 1s linear;
|
||||
}
|
||||
}
|
||||
.icon {
|
||||
display: block;
|
||||
width: 124rpx;
|
||||
height: 38rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
.weather-holiday-wrap {
|
||||
display: flex;
|
||||
align-items: stretch;
|
||||
justify-content: space-between;
|
||||
gap: 12px;
|
||||
padding: 0 24rpx 48rpx 24rpx;
|
||||
.data-wrap {
|
||||
flex: 1;
|
||||
padding: 20rpx;
|
||||
border-radius: 20rpx;
|
||||
box-sizing: border-box;
|
||||
background-color: #fff;
|
||||
box-shadow: 0rpx 0rpx 20rpx rgba(0,0,0,0.16);
|
||||
}
|
||||
.weather-data {
|
||||
.title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: #3D4CF1;
|
||||
.icon {
|
||||
display: block;
|
||||
width: 100rpx;
|
||||
height: 100rpx;
|
||||
margin: 0 12rpx 0 0;
|
||||
}
|
||||
.tem-wrap {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
}
|
||||
.tem {
|
||||
font-size: 70rpx;
|
||||
line-height: 70rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
.unit {
|
||||
font-size: 36rpx;
|
||||
line-height: 36rpx;
|
||||
}
|
||||
}
|
||||
.loca {
|
||||
display: flex;
|
||||
padding: 24rpx 0;
|
||||
font-size: 26rpx;
|
||||
line-height: 36rpx;
|
||||
color: #333;
|
||||
.addr {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.icon {
|
||||
display: block;
|
||||
width: 24rpx;
|
||||
height: 24rpx;
|
||||
margin: 0 4rpx 0 0;
|
||||
}
|
||||
}
|
||||
.tem-range {
|
||||
padding: 0 0 0 24rpx;
|
||||
}
|
||||
}
|
||||
.content + .content {
|
||||
padding: 12rpx 0 0 0;
|
||||
}
|
||||
.content {
|
||||
color: #3D4CF1;
|
||||
font-size: 26rpx;
|
||||
line-height: 36rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
.txt-loading {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 28rpx;
|
||||
min-height: 200rpx;
|
||||
}
|
||||
.no-weather {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100%;
|
||||
font-size: 26rpx;
|
||||
color: #999;
|
||||
line-height: 38rpx;
|
||||
.img {
|
||||
display: block;
|
||||
width: 226rpx;
|
||||
height: 130rpx;
|
||||
margin: 0 0 12rpx 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
.holiday-data {
|
||||
.title {
|
||||
display: flex;
|
||||
font-size: 24rpx;
|
||||
color: #333;
|
||||
line-height: 36rpx;
|
||||
.day {
|
||||
margin: 0 8rpx 0 0;
|
||||
color: #3D4CF1;
|
||||
font-size: 28rpx;
|
||||
}
|
||||
}
|
||||
.desc {
|
||||
font-size: 24rpx;
|
||||
color: #333;
|
||||
line-height: 36rpx;
|
||||
}
|
||||
.tip {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
padding: 20rpx 0 0 0;
|
||||
.label {
|
||||
display: block;
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
margin: 0 12rpx 0 0;
|
||||
border-radius: 8rpx;
|
||||
text-align: center;
|
||||
line-height: 32rpx;
|
||||
font-size: 24rpx;
|
||||
color: #fff;
|
||||
background-color: #3D4CF1;
|
||||
}
|
||||
.label2 {
|
||||
background-color: #C52733;
|
||||
}
|
||||
.content {
|
||||
width: calc(100% - 44rpx);
|
||||
margin: -6rpx 0 0 0;
|
||||
font-size: 24rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.recommend-goods-wrap {
|
||||
width: calc(100% + 48rpx);
|
||||
padding: 24rpx 0;
|
||||
margin: 0 -24rpx;
|
||||
.goods-swiper {
|
||||
width: 100%;
|
||||
height: 750rpx;
|
||||
}
|
||||
.goods-item {
|
||||
display: block;
|
||||
width: 460rpx;
|
||||
margin: 24rpx auto 0 auto;
|
||||
padding: 24rpx;
|
||||
box-sizing: border-box;
|
||||
background: #fff;
|
||||
border-radius: 20rpx;
|
||||
box-shadow: 0rpx 0 24rpx rgba(0,0,0,0.16);
|
||||
white-space: normal;
|
||||
transition: all 0.3s ease;
|
||||
transform: scale(0.9);
|
||||
opacity: 0.8;
|
||||
&.active {
|
||||
transform: scale(1);
|
||||
opacity: 1;
|
||||
}
|
||||
.supplier {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 24rpx;
|
||||
color: #666;
|
||||
margin-bottom: 16rpx;
|
||||
.icon {
|
||||
display: block;
|
||||
width: 28rpx;
|
||||
height: 28rpx;
|
||||
}
|
||||
.s-name {
|
||||
flex: 1;
|
||||
margin: 0 8rpx;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
.title {
|
||||
font-size: 28rpx;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
margin-bottom: 16rpx;
|
||||
line-height: 40rpx;
|
||||
}
|
||||
.p-img {
|
||||
width: 412rpx;
|
||||
height: 412rpx;
|
||||
margin-bottom: 16rpx;
|
||||
border-radius: 12rpx;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
.price {
|
||||
color: #C52733;
|
||||
text-align: center;
|
||||
margin-bottom: 16rpx;
|
||||
.unit {
|
||||
font-size: 28rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
.num {
|
||||
font-size: 36rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
.actions {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
.btn-buy {
|
||||
width: 160rpx;
|
||||
height: 56rpx;
|
||||
margin: 0 12rpx;
|
||||
line-height: 56rpx;
|
||||
text-align: center;
|
||||
background: #C52733;
|
||||
color: #fff;
|
||||
font-size: 24rpx;
|
||||
border-radius: 28rpx;
|
||||
}
|
||||
.btn-gift {
|
||||
width: 160rpx;
|
||||
height: 56rpx;
|
||||
margin: 0 12rpx;
|
||||
line-height: 52rpx;
|
||||
text-align: center;
|
||||
background: #fff;
|
||||
color: #C52733;
|
||||
font-size: 24rpx;
|
||||
border-radius: 28rpx;
|
||||
border: 2rpx solid #C52733;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.order-list-wrap {
|
||||
width: 100%;
|
||||
padding: 24rpx 0;
|
||||
box-sizing: border-box;
|
||||
.order-item-wrap + .order-item-wrap {
|
||||
margin: 24rpx 0 0 0;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes spin-icon {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
transform: rotate(720deg);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -295,8 +295,4 @@ checkbox .wx-checkbox-input.wx-checkbox-input-checked {
|
||||
font-style: normal;
|
||||
font-size: 28rpx;
|
||||
color: #C2C5CC;
|
||||
}
|
||||
|
||||
.bg-color-hui {
|
||||
background-color: #999 !important;
|
||||
}
|
||||
@@ -37,12 +37,6 @@ input{line-height: normal; box-sizing:border-box;}
|
||||
.line1{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width: 100%;}
|
||||
.line2{word-break:break-all;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
|
||||
.mask{position:fixed;top:0;left:0;right:0;bottom:0;z-index:55;background-color:rgba(0,0,0,0.5);}
|
||||
.ai-product-window.product-window {
|
||||
z-index: 1002;
|
||||
}
|
||||
.ai-product-window.mask {
|
||||
z-index: 1001;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
@dark-color: #333333;
|
||||
@white-color: #fff;
|
||||
|
||||
@colors: #C52733, #333333, #fff, #666, #F0F0F0, #999999, #E92727, #FFC543, #69C573, #A5A5A5;
|
||||
@classnames: primary, dark, white, secondary-dark, grey, dark1, red, yellow, success, dark2;
|
||||
@colors: #C52733, #333333, #fff, #666, #F0F0F0, #999999, #E92727, #FFC543, #69C573;
|
||||
@classnames: primary, dark, white, secondary-dark, grey, dark1, red, yellow, success;
|
||||
/*=====================================*/
|
||||
|
||||
each(@colors, {
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
class="coupons__cover"
|
||||
mode="widthFix"
|
||||
/>
|
||||
<view @click="selectCoupon" class="check-radio" :class="{'v12-primary': data.checked}" v-if="showRadio">
|
||||
<view @click="selectCoupon" class="check-radio" :class="{'v12-primary': data.checked}">
|
||||
<radio
|
||||
v-if="radioModel && data.status === 0"
|
||||
:value="data.id"
|
||||
@@ -50,10 +50,6 @@
|
||||
export default {
|
||||
name: "Coupons",
|
||||
props: {
|
||||
showRadio: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => {
|
||||
|
||||
+11
-38
@@ -14,8 +14,7 @@
|
||||
@change="changeNav"
|
||||
v-if="showTab"
|
||||
/>
|
||||
<!-- 先隐藏 -->
|
||||
<!-- <view class="v12-radius-20 v12-white v12-justify-around v12-pa-3" style="align-items: flex-end;" v-if="!showTab && showRadio">
|
||||
<view class="v12-radius-20 v12-white v12-align-center v12-justify-around v12-pa-3" v-else>
|
||||
<view class="">
|
||||
<view class="v12-text-center v12-font-28">
|
||||
券后价
|
||||
@@ -30,10 +29,7 @@
|
||||
</view>
|
||||
</view>
|
||||
<view class="v12-text-center v12-font-44">
|
||||
<view class="v12-text-center v12-font-28">
|
||||
|
||||
</view>
|
||||
<view class="v12-mt-3 v12-text-center">=</view>
|
||||
=
|
||||
</view>
|
||||
<view class="">
|
||||
<view class="v12-text-center v12-font-28">
|
||||
@@ -49,10 +45,7 @@
|
||||
</view>
|
||||
</view>
|
||||
<view class="v12-text-center v12-font-44">
|
||||
<view class="v12-text-center v12-font-28">
|
||||
|
||||
</view>
|
||||
<view class="v12-mt-3 v12-text-center">-</view>
|
||||
-
|
||||
</view>
|
||||
<view class="">
|
||||
<view class="v12-text-center">
|
||||
@@ -62,13 +55,12 @@
|
||||
{{ selectItem.couponPrice || 0 }}
|
||||
</view>
|
||||
</view>
|
||||
</view> -->
|
||||
</view>
|
||||
|
||||
<view class="list-box">
|
||||
<view class="larg-one v12-mb-3">
|
||||
<Coupons
|
||||
:data="largOne"
|
||||
:showRadio="showRadio"
|
||||
:radio-model="current === 0"
|
||||
@change="selectCoupon"
|
||||
/>
|
||||
@@ -83,7 +75,6 @@
|
||||
>
|
||||
<Coupons
|
||||
:data="item"
|
||||
:showRadio="showRadio"
|
||||
:radio-model="current === 0"
|
||||
@change="selectCoupon"
|
||||
v-if="index !== maxIndex"
|
||||
@@ -102,7 +93,7 @@
|
||||
</view>
|
||||
<button disabled></button>
|
||||
<view
|
||||
v-if="current === 0 && showRadio"
|
||||
v-if="current === 0"
|
||||
:class="{ 'btn-disabled': current === 1 }"
|
||||
class="btn-done bold flex jc-center ai-center v12-primary"
|
||||
@click="setCoupon"
|
||||
@@ -120,10 +111,6 @@ export default {
|
||||
name: 'CouponsPopup',
|
||||
components: { SubSection, Coupons },
|
||||
props: {
|
||||
showRadio: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
twoList: {
|
||||
type: Object,
|
||||
default: {
|
||||
@@ -142,10 +129,6 @@ export default {
|
||||
id: {
|
||||
type: Number,
|
||||
default: 0
|
||||
},
|
||||
couponId1: {
|
||||
type: Number,
|
||||
default: 0
|
||||
}
|
||||
},
|
||||
data() {
|
||||
@@ -159,11 +142,10 @@ export default {
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
couponId1: {
|
||||
id: {
|
||||
immediate: true,
|
||||
handler(value) {
|
||||
console.log(value);
|
||||
|
||||
console.log('couponId', value);
|
||||
if(value) {
|
||||
this.selectCoupon(value)
|
||||
}
|
||||
@@ -174,7 +156,7 @@ export default {
|
||||
list() {
|
||||
const temp = this.current === 0 ? this.twoList['usable'] : this.twoList['unusable']
|
||||
if (this.current === 0) {
|
||||
const localCouponId = this.couponId1 || 0
|
||||
const localCouponId = uni.getStorageSync('couponId') || 0
|
||||
temp.map(item => {
|
||||
item.checked = localCouponId === item.id
|
||||
})
|
||||
@@ -198,8 +180,8 @@ export default {
|
||||
},
|
||||
largOne() {
|
||||
if(this.list[this.maxIndex]) {
|
||||
// this.selectCoupon(this.list[this.maxIndex].id)
|
||||
// uni.setStorageSync('couponId', this.list[this.maxIndex].id)
|
||||
this.selectCoupon(this.list[this.maxIndex].id)
|
||||
uni.setStorageSync('couponId', this.list[this.maxIndex].id)
|
||||
}
|
||||
// this.$emit('max', this.list[this.maxIndex] || {})
|
||||
return this.list[this.maxIndex] || {}
|
||||
@@ -211,17 +193,7 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
close() {
|
||||
|
||||
this.couponId = this.couponId1
|
||||
this.selectItem = this.list.find(e => e.id === this.couponId1) || {}
|
||||
// this.$emit('select', this.selectItem)
|
||||
this.list.map(item => {
|
||||
item.checked = this.couponId1 === item.id
|
||||
})
|
||||
this.$emit('close')
|
||||
// uni.setStorageSync('couponId', this.couponId)
|
||||
// this.$emit('change', this.selectItem || {})
|
||||
// this.$emit('ok', this.couponId)
|
||||
},
|
||||
force2Decimal(value) {
|
||||
return this.$force2Decimal(value);
|
||||
@@ -239,6 +211,7 @@ export default {
|
||||
},
|
||||
setCoupon() {
|
||||
if (this.current === 1) return
|
||||
console.log(this.current, '====1=======');
|
||||
uni.setStorageSync('couponId', this.couponId)
|
||||
this.$emit('change', this.selectItem || {})
|
||||
this.$emit('ok', this.couponId)
|
||||
|
||||
@@ -1,813 +0,0 @@
|
||||
<template>
|
||||
<view class="date-range-picker">
|
||||
<u-popup :show="show" @close="handleClose" mode="center" round="16" closeable>
|
||||
<view class="picker-container">
|
||||
<view class="picker-header">
|
||||
<text class="title">查看可预约日期</text>
|
||||
</view>
|
||||
<view class="v12-align-center v12-justify-between">
|
||||
<view class="v12-my-3">
|
||||
<text class="v12-font-24 v12-dark-text v12-mr-3">请选择入住日期</text>
|
||||
<text class="v12-font-24 v12-primary-text">{{ ` 共计${minBookingDays}天 ` }}</text>
|
||||
</view>
|
||||
<view v-if="originDate" class="v12-font-24 v12-primary-text">
|
||||
原定时间:{{ originDate }}
|
||||
</view>
|
||||
</view>
|
||||
<view class="calendar" @touchstart="onTouchStart" @touchend="onTouchEnd">
|
||||
<view class="calendar-header">
|
||||
<view class="month-nav">
|
||||
<text class="nav-btn" @click="changeMonth(-1)">〈</text>
|
||||
<text class="month-text">{{ currentYear }}年{{ currentMonth + 1 }}月</text>
|
||||
<text class="nav-btn" @click="changeMonth(1)">〉</text>
|
||||
</view>
|
||||
<view class="weekdays">
|
||||
<text v-for="day in ['日', '一', '二', '三', '四', '五', '六']" :key="day" class="weekday v12-dark-text">
|
||||
{{ day }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="calendar-body">
|
||||
<view class="days" :class="[isAnimating ? 'absolute ' + transitionMode + '-enter' : '']">
|
||||
<view
|
||||
v-for="(day, index) in calendarDays"
|
||||
:key="index"
|
||||
class="day"
|
||||
:class="{
|
||||
'empty': !day,
|
||||
'selected': isSelected(day),
|
||||
'in-range': isInRange(day),
|
||||
'start-date': isStartDate(day),
|
||||
'end-date': isEndDate(day),
|
||||
'selecting-start': isSelectingStart(day),
|
||||
'disabled': isDisabled(day),
|
||||
'booked': getDateStatus(day) === '已被预约',
|
||||
'unavailable': getDateStatus(day) === '不可预约',
|
||||
'available': getDateStatus(day) === '可预约'
|
||||
}"
|
||||
@click="selectDate(day)"
|
||||
>
|
||||
<text>{{ day || '' }}</text>
|
||||
<view class="v12-font-20" v-if="day && getDateStatus(day) !== null">{{ getDateStatus(day) }}</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="days absolute" v-if="isAnimating" :class="[transitionMode + '-leave']">
|
||||
<view
|
||||
v-for="(day, index) in prevMonthDays"
|
||||
:key="'prev-' + index"
|
||||
class="day"
|
||||
:class="{
|
||||
'empty': !day,
|
||||
'selected': isSelected(day, prevYear, prevMonth),
|
||||
'in-range': isInRange(day, prevYear, prevMonth),
|
||||
'start-date': isStartDate(day, prevYear, prevMonth),
|
||||
'end-date': isEndDate(day, prevYear, prevMonth),
|
||||
'selecting-start': isSelectingStart(day, prevYear, prevMonth),
|
||||
'disabled': isDisabled(day, prevYear, prevMonth),
|
||||
'booked': getDateStatus(day, prevYear, prevMonth) === '已被预约',
|
||||
'unavailable': getDateStatus(day, prevYear, prevMonth) === '不可预约',
|
||||
'available': getDateStatus(day, prevYear, prevMonth) === '可预约'
|
||||
}"
|
||||
>
|
||||
<text>{{ day || '' }}</text>
|
||||
<view class="v12-font-20" v-if="day && getDateStatus(day, prevYear, prevMonth) !== null">{{ getDateStatus(day, prevYear, prevMonth) }}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="picker-footer">
|
||||
<button class="btn btn-confirm" @click="confirmSelect">立即预订</button>
|
||||
</view>
|
||||
</view>
|
||||
</u-popup>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { sojoumOrderCalendar, sojoumOrderCheckDate } from "@/api/sojoumOrder";
|
||||
export default {
|
||||
name: 'DateRangePicker',
|
||||
|
||||
props: {
|
||||
originDate: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
show: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
value: {
|
||||
type: Array,
|
||||
default: () => [null, null]
|
||||
},
|
||||
minDate: {
|
||||
type: [String, Date],
|
||||
default: null
|
||||
},
|
||||
maxDate: {
|
||||
type: [String, Date],
|
||||
default: null
|
||||
},
|
||||
format: {
|
||||
type: String,
|
||||
default: 'YYYY-MM-DD'
|
||||
},
|
||||
travelGroupProductId: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
minBookingDays: {
|
||||
type: Number,
|
||||
default: 0
|
||||
},
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
currentYear: new Date().getFullYear(),
|
||||
currentMonth: new Date().getMonth(),
|
||||
startDate: null,
|
||||
endDate: null,
|
||||
activeCalendar: 'start', // 'start' or 'end'
|
||||
tempStartDate: null,
|
||||
tempEndDate: null,
|
||||
dateStatusMap: {}, // 存储日期状态
|
||||
selectionState: 'initial', // 'initial' | 'selecting' | 'completed'
|
||||
touchStartX: 0,
|
||||
touchStartY: 0,
|
||||
// 动画相关状态
|
||||
isAnimating: false,
|
||||
transitionMode: '', // 'next' or 'prev'
|
||||
prevYear: null,
|
||||
prevMonth: null,
|
||||
prevMonthDays: []
|
||||
}
|
||||
},
|
||||
|
||||
computed: {
|
||||
calendarDays() {
|
||||
const days = []
|
||||
const firstDay = new Date(this.currentYear, this.currentMonth, 1)
|
||||
const lastDay = new Date(this.currentYear, this.currentMonth + 1, 0)
|
||||
|
||||
// 填充月初空白天数
|
||||
for (let i = 0; i < firstDay.getDay(); i++) {
|
||||
days.push(null)
|
||||
}
|
||||
|
||||
// 填充当月天数
|
||||
for (let i = 1; i <= lastDay.getDate(); i++) {
|
||||
days.push(i)
|
||||
}
|
||||
|
||||
// 填充月末空白天数
|
||||
const remainingDays = 42 - days.length // 保持6行固定高度
|
||||
for (let i = 0; i < remainingDays; i++) {
|
||||
days.push(null)
|
||||
}
|
||||
|
||||
return days
|
||||
}
|
||||
},
|
||||
|
||||
watch: {
|
||||
show(newVal) {
|
||||
if (newVal) {
|
||||
this.initDates()
|
||||
this.getDays()
|
||||
}
|
||||
},
|
||||
currentMonth() {
|
||||
this.getDays()
|
||||
},
|
||||
currentYear() {
|
||||
this.getDays()
|
||||
},
|
||||
value: {
|
||||
handler(newVal) {
|
||||
if (newVal && newVal.length === 2) {
|
||||
this.startDate = newVal[0] ? new Date(newVal[0]) : null
|
||||
this.endDate = newVal[1] ? new Date(newVal[1]) : null
|
||||
this.tempStartDate = this.startDate
|
||||
this.tempEndDate = this.endDate
|
||||
}
|
||||
},
|
||||
immediate: true
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
getDays(){
|
||||
// uni.showLoading({
|
||||
// title: '加载中...',
|
||||
// mask: true,
|
||||
// })
|
||||
sojoumOrderCalendar({
|
||||
travelGroupProductId: this.travelGroupProductId,
|
||||
month: `${this.currentYear}-${String(this.currentMonth + 1).padStart(2, '0')}`
|
||||
}).then(res => {
|
||||
if (res.data) {
|
||||
// 更新日期状态映射,使用合并而不是覆盖,以支持动画时的旧数据显示
|
||||
const newStatusMap = {}
|
||||
res.data.forEach(day => {
|
||||
// inventoryStatus int 状态 (0:可预约, 1:已被预约, 2:不可预约)
|
||||
newStatusMap[day.date] = day.inventoryStatus === 0 ? '可预约' : day.inventoryStatus === 1 ? '已被预约' : '不可预约'
|
||||
})
|
||||
this.dateStatusMap = { ...this.dateStatusMap, ...newStatusMap }
|
||||
}
|
||||
}).finally(() => {
|
||||
uni.hideLoading()
|
||||
})
|
||||
},
|
||||
|
||||
getDateStatus(day, year, month) {
|
||||
if (!day) return null
|
||||
const date = this.formatDate(this.getDateFromDay(day, year, month))
|
||||
return this.dateStatusMap[date]
|
||||
},
|
||||
|
||||
isDisabled(day, year, month) {
|
||||
|
||||
if (!day) return true
|
||||
const date = this.getDateFromDay(day, year, month)
|
||||
// 禁用过去的日期(今天之前的日期)
|
||||
const today = new Date()
|
||||
today.setHours(0, 0, 0, 0)
|
||||
if (date < today) return true
|
||||
|
||||
// 检查最小和最大日期限制
|
||||
if (this.minDate && date < new Date(this.minDate)) return true
|
||||
if (this.maxDate && date > new Date(this.maxDate)) return true
|
||||
|
||||
// 检查预约状态
|
||||
const status = this.getDateStatus(day, year, month)
|
||||
// 只允许选择可预约的日期(状态为"可预约"),其他状态都禁用
|
||||
|
||||
return status !== '可预约'
|
||||
},
|
||||
initDates() {
|
||||
this.tempStartDate = this.startDate
|
||||
this.tempEndDate = this.endDate
|
||||
|
||||
// 根据当前选择状态设置selectionState
|
||||
if (this.tempStartDate && this.tempEndDate) {
|
||||
this.selectionState = 'completed'
|
||||
this.activeCalendar = 'start'
|
||||
} else if (this.tempStartDate) {
|
||||
this.selectionState = 'selecting'
|
||||
this.activeCalendar = 'end'
|
||||
} else {
|
||||
this.selectionState = 'initial'
|
||||
this.activeCalendar = 'start'
|
||||
}
|
||||
|
||||
if (this.startDate) {
|
||||
this.currentYear = this.startDate.getFullYear()
|
||||
this.currentMonth = this.startDate.getMonth()
|
||||
} else {
|
||||
const now = new Date()
|
||||
this.currentYear = now.getFullYear()
|
||||
this.currentMonth = now.getMonth()
|
||||
}
|
||||
},
|
||||
|
||||
changeMonth(delta) {
|
||||
if (this.isAnimating) return
|
||||
|
||||
// Setup animation state
|
||||
this.prevYear = this.currentYear
|
||||
this.prevMonth = this.currentMonth
|
||||
this.prevMonthDays = [...this.calendarDays]
|
||||
this.transitionMode = delta > 0 ? 'next' : 'prev'
|
||||
this.isAnimating = true
|
||||
|
||||
let newMonth = this.currentMonth + delta
|
||||
if (newMonth < 0) {
|
||||
this.currentYear--
|
||||
newMonth = 11
|
||||
} else if (newMonth > 11) {
|
||||
this.currentYear++
|
||||
newMonth = 0
|
||||
}
|
||||
this.currentMonth = newMonth
|
||||
|
||||
// Reset animation state after transition
|
||||
setTimeout(() => {
|
||||
this.isAnimating = false
|
||||
this.prevMonthDays = []
|
||||
}, 300)
|
||||
},
|
||||
|
||||
onTouchStart(e) {
|
||||
if (!e || !e.changedTouches || !e.changedTouches.length) return
|
||||
this.touchStartX = e.changedTouches[0].clientX
|
||||
this.touchStartY = e.changedTouches[0].clientY
|
||||
},
|
||||
|
||||
onTouchEnd(e) {
|
||||
if (!e || !e.changedTouches || !e.changedTouches.length) return
|
||||
const touchEndX = e.changedTouches[0].clientX
|
||||
const touchEndY = e.changedTouches[0].clientY
|
||||
const deltaX = touchEndX - this.touchStartX
|
||||
const deltaY = touchEndY - this.touchStartY
|
||||
if (Math.abs(deltaX) <= Math.abs(deltaY)) return
|
||||
const minDistance = 50
|
||||
if (Math.abs(deltaX) < minDistance) return
|
||||
if (deltaX < 0) {
|
||||
this.changeMonth(1)
|
||||
} else {
|
||||
this.changeMonth(-1)
|
||||
}
|
||||
},
|
||||
|
||||
formatDate(date) {
|
||||
if (!date) return ''
|
||||
const year = date.getFullYear()
|
||||
const month = String(date.getMonth() + 1).padStart(2, '0')
|
||||
const day = String(date.getDate()).padStart(2, '0')
|
||||
return `${year}-${month}-${day}`
|
||||
},
|
||||
|
||||
getDateFromDay(day, year, month) {
|
||||
const y = year !== undefined ? year : this.currentYear
|
||||
const m = month !== undefined ? month : this.currentMonth
|
||||
return day ? new Date(y, m, day) : null
|
||||
},
|
||||
|
||||
// isDisabled(day) {
|
||||
// if (!day) return true
|
||||
// const date = this.getDateFromDay(day)
|
||||
|
||||
// // 禁用过去的日期(今天之前的日期)
|
||||
// const today = new Date()
|
||||
// today.setHours(0, 0, 0, 0)
|
||||
// if (date < today) return true
|
||||
|
||||
// // 检查最小和最大日期限制
|
||||
// if (this.minDate && date < new Date(this.minDate)) return true
|
||||
// if (this.maxDate && date > new Date(this.maxDate)) return true
|
||||
|
||||
// return false
|
||||
// },
|
||||
|
||||
isSelected(day, year, month) {
|
||||
if (!day) return false
|
||||
// const date = this.getDateFromDay(day, year, month) // Unused?
|
||||
return this.isStartDate(day, year, month) || this.isEndDate(day, year, month)
|
||||
},
|
||||
|
||||
isStartDate(day, year, month) {
|
||||
if (!day || !this.tempStartDate) return false
|
||||
const date = this.getDateFromDay(day, year, month)
|
||||
return date.getTime() === this.tempStartDate.getTime()
|
||||
},
|
||||
|
||||
isEndDate(day, year, month) {
|
||||
if (!day || !this.tempEndDate) return false
|
||||
const date = this.getDateFromDay(day, year, month)
|
||||
return date.getTime() === this.tempEndDate.getTime()
|
||||
},
|
||||
|
||||
isInRange(day, year, month) {
|
||||
if (!day || !this.tempStartDate || !this.tempEndDate) return false
|
||||
const date = this.getDateFromDay(day, year, month)
|
||||
return date > this.tempStartDate && date < this.tempEndDate
|
||||
},
|
||||
|
||||
isSelectingStart(day, year, month) {
|
||||
if (!day || !this.tempStartDate || this.tempEndDate) return false
|
||||
// 只有在选择状态且只有开始日期时才显示特殊样式
|
||||
if (this.selectionState !== 'selecting') return false
|
||||
const date = this.getDateFromDay(day, year, month)
|
||||
return date.getTime() === this.tempStartDate.getTime()
|
||||
},
|
||||
|
||||
selectDate(day, year, month) {
|
||||
if (!day || this.isDisabled(day, year, month)) return
|
||||
|
||||
const selectedDate = this.getDateFromDay(day, year, month)
|
||||
|
||||
// 如果设置了最小预订天数,则自动计算结束日期
|
||||
if (this.minBookingDays > 0) {
|
||||
this.tempStartDate = selectedDate
|
||||
const endDate = new Date(selectedDate)
|
||||
endDate.setDate(selectedDate.getDate() + this.minBookingDays - 1)
|
||||
this.tempEndDate = endDate
|
||||
this.selectionState = 'completed'
|
||||
return
|
||||
}
|
||||
|
||||
// 如果已有完整的日期区间(开始日期和结束日期都存在),重置选择
|
||||
if (this.tempStartDate && this.tempEndDate && this.selectionState === 'completed') {
|
||||
// 重置选择状态,将点击的日期作为新的开始日期
|
||||
this.tempStartDate = selectedDate
|
||||
this.tempEndDate = null
|
||||
this.activeCalendar = 'end'
|
||||
this.selectionState = 'selecting'
|
||||
return
|
||||
}
|
||||
|
||||
// 如果点击已选择的开始日期,则取消选择
|
||||
if (this.tempStartDate && selectedDate.getTime() === this.tempStartDate.getTime()) {
|
||||
this.tempStartDate = null
|
||||
this.tempEndDate = null
|
||||
this.activeCalendar = 'start'
|
||||
this.selectionState = 'initial'
|
||||
return
|
||||
}
|
||||
|
||||
// 如果点击已选择的结束日期,则只清除结束日期
|
||||
if (this.tempEndDate && selectedDate.getTime() === this.tempEndDate.getTime()) {
|
||||
this.tempEndDate = null
|
||||
this.activeCalendar = 'end'
|
||||
this.selectionState = 'selecting'
|
||||
return
|
||||
}
|
||||
|
||||
if (this.activeCalendar === 'start' || this.selectionState === 'initial') {
|
||||
// 选择开始日期
|
||||
this.tempStartDate = selectedDate
|
||||
this.tempEndDate = null
|
||||
this.activeCalendar = 'end'
|
||||
this.selectionState = 'selecting'
|
||||
} else if (this.activeCalendar === 'end') {
|
||||
if (selectedDate < this.tempStartDate) {
|
||||
// 如果选择的结束日期小于开始日期,将其设为开始日期
|
||||
this.tempStartDate = selectedDate
|
||||
this.tempEndDate = null
|
||||
this.selectionState = 'selecting'
|
||||
} else {
|
||||
// 设置结束日期,完成选择
|
||||
this.tempEndDate = selectedDate
|
||||
this.selectionState = 'completed'
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
clearDates() {
|
||||
this.tempStartDate = null
|
||||
this.tempEndDate = null
|
||||
this.activeCalendar = 'start'
|
||||
this.selectionState = 'initial'
|
||||
},
|
||||
|
||||
confirmSelect() {
|
||||
// 验证选择的日期数量
|
||||
if (!this.tempStartDate || !this.tempEndDate) {
|
||||
uni.showToast({
|
||||
title: '请选择起始和结束日期',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// 计算选择的天数
|
||||
const daysDiff = Math.floor((this.tempEndDate - this.tempStartDate) / (1000 * 60 * 60 * 24)) + 1
|
||||
|
||||
// 必须要选够天数
|
||||
if (daysDiff !== this.minBookingDays) {
|
||||
uni.showToast({
|
||||
title: `此套餐预约需连续选择${this.minBookingDays}天`,
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// 验证选择的日期范围内是否包含禁用日期
|
||||
// const currentDate = new Date(this.tempStartDate)
|
||||
// while (currentDate <= this.tempEndDate) {
|
||||
// const day = currentDate.getDate()
|
||||
// if (this.isDisabled(day)) {
|
||||
// uni.showToast({
|
||||
// title: '所选日期范围包含不可预约日期,请重新选择',
|
||||
// icon: 'none'
|
||||
// })
|
||||
// return
|
||||
// }
|
||||
// currentDate.setDate(currentDate.getDate() + 1)
|
||||
// }
|
||||
sojoumOrderCheckDate({
|
||||
travelGroupProductId: this.travelGroupProductId,
|
||||
orderStartDate: this.formatDate(this.tempStartDate),
|
||||
orderEndDate: this.formatDate(this.tempEndDate)
|
||||
}).then(res => {
|
||||
if (res.status === 200) {
|
||||
// 验证通过,更新日期并关闭弹窗
|
||||
this.startDate = this.tempStartDate
|
||||
this.endDate = this.tempEndDate
|
||||
this.selectionState = 'completed'
|
||||
this.$emit('input', [
|
||||
this.startDate ? this.formatDate(this.startDate) : null,
|
||||
this.endDate ? this.formatDate(this.endDate) : null
|
||||
])
|
||||
this.handleClose(false)
|
||||
} else {
|
||||
uni.showToast({
|
||||
title: res.msg || '所选日期范围包含不可预约日期,请重新选择',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
handleClose(shouldClear = false) {
|
||||
if (shouldClear) {
|
||||
this.clearDates()
|
||||
this.startDate = null
|
||||
this.endDate = null
|
||||
this.$emit('input', [null, null])
|
||||
} else {
|
||||
// 恢复到原始状态
|
||||
this.tempStartDate = this.startDate
|
||||
this.tempEndDate = this.endDate
|
||||
if (this.startDate && this.endDate) {
|
||||
this.selectionState = 'completed'
|
||||
} else if (this.startDate) {
|
||||
this.selectionState = 'selecting'
|
||||
} else {
|
||||
this.selectionState = 'initial'
|
||||
}
|
||||
}
|
||||
this.$emit('update:show', false)
|
||||
this.$emit('close')
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.date-range-picker {
|
||||
.picker-container {
|
||||
width: 690rpx;
|
||||
background: #FFFFFF;
|
||||
border-radius: 24rpx;
|
||||
padding: 30rpx;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.picker-header {
|
||||
text-align: center;
|
||||
margin-bottom: 30rpx;
|
||||
|
||||
.title {
|
||||
font-size: 32rpx;
|
||||
font-weight: bold;
|
||||
color: #333333;
|
||||
}
|
||||
}
|
||||
|
||||
.date-display {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 30rpx;
|
||||
padding: 20rpx;
|
||||
background: #F8F8F8;
|
||||
border-radius: 12rpx;
|
||||
|
||||
.date-input {
|
||||
flex: 1;
|
||||
|
||||
.label {
|
||||
font-size: 24rpx;
|
||||
color: #999999;
|
||||
margin-bottom: 8rpx;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.value {
|
||||
font-size: 28rpx;
|
||||
color: #333333;
|
||||
|
||||
&.placeholder {
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.separator {
|
||||
margin: 0 20rpx;
|
||||
color: #999999;
|
||||
font-size: 28rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.calendar {
|
||||
.calendar-header {
|
||||
margin-bottom: 20rpx;
|
||||
|
||||
.month-nav {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-evenly;
|
||||
margin-bottom: 20rpx;
|
||||
padding: 0 20rpx;
|
||||
|
||||
.month-text {
|
||||
font-size: 28rpx;
|
||||
color: #333333;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.nav-btn {
|
||||
padding: 10rpx 20rpx;
|
||||
color: #666666;
|
||||
font-size: 32rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.weekdays {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
|
||||
.weekday {
|
||||
width: 14.28%;
|
||||
text-align: center;
|
||||
font-size: 24rpx;
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.days {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
||||
.day {
|
||||
width: 14.28%;
|
||||
height: 80rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 28rpx;
|
||||
color: #333333;
|
||||
position: relative;
|
||||
flex-direction: column;
|
||||
|
||||
&:not(.selected):not(.disabled) {
|
||||
color: #4B97EB;
|
||||
}
|
||||
|
||||
.status-dot {
|
||||
width: 8rpx;
|
||||
height: 8rpx;
|
||||
border-radius: 50%;
|
||||
margin-top: 4rpx;
|
||||
}
|
||||
|
||||
&.empty {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
&.disabled {
|
||||
color: #CCCCCC;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
&.selected {
|
||||
background: #C52733;
|
||||
color: #FFFFFF;
|
||||
.status-dot {
|
||||
background: #FFFFFF;
|
||||
}
|
||||
}
|
||||
|
||||
&.selecting-start {
|
||||
background: #4B97EB;
|
||||
color: #FFFFFF;
|
||||
border-radius: 8rpx;
|
||||
position: relative;
|
||||
|
||||
&::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -2rpx;
|
||||
left: -2rpx;
|
||||
right: -2rpx;
|
||||
bottom: -2rpx;
|
||||
border: 2rpx solid #4B97EB;
|
||||
border-radius: 10rpx;
|
||||
animation: pulse 1.5s infinite;
|
||||
}
|
||||
|
||||
.status-dot {
|
||||
background: #FFFFFF;
|
||||
}
|
||||
}
|
||||
|
||||
&.in-range {
|
||||
background: rgba(197, 39, 51, 0.1);
|
||||
}
|
||||
|
||||
&.start-date {
|
||||
border-top-left-radius: 8rpx;
|
||||
border-bottom-left-radius: 8rpx;
|
||||
}
|
||||
|
||||
&.end-date {
|
||||
border-top-right-radius: 8rpx;
|
||||
border-bottom-right-radius: 8rpx;
|
||||
}
|
||||
|
||||
&.available .status-dot {
|
||||
background: #4CAF50;
|
||||
}
|
||||
|
||||
&.booked .status-dot {
|
||||
background: #FF9800;
|
||||
}
|
||||
|
||||
&.unavailable .status-dot {
|
||||
background: #F44336;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.picker-footer {
|
||||
margin-top: 30rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 0 20rpx;
|
||||
|
||||
.btn {
|
||||
width: 100%;
|
||||
height: 80rpx;
|
||||
border-radius: 40rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 28rpx;
|
||||
|
||||
&.btn-clear {
|
||||
background: #F8F8F8;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
&.btn-confirm {
|
||||
background: #C52733;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0% {
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
}
|
||||
50% {
|
||||
opacity: 0.7;
|
||||
transform: scale(1.05);
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Animation Styles
|
||||
.calendar-body {
|
||||
position: relative;
|
||||
height: 480rpx; // 6 rows * 80rpx
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.days.absolute {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
// height: 100%;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
// Keyframes for sliding
|
||||
@keyframes slide-next-enter {
|
||||
from { transform: translateX(100%); }
|
||||
to { transform: translateX(0); }
|
||||
}
|
||||
@keyframes slide-next-leave {
|
||||
from { transform: translateX(0); }
|
||||
to { transform: translateX(-100%); }
|
||||
}
|
||||
@keyframes slide-prev-enter {
|
||||
from { transform: translateX(-100%); }
|
||||
to { transform: translateX(0); }
|
||||
}
|
||||
@keyframes slide-prev-leave {
|
||||
from { transform: translateX(0); }
|
||||
to { transform: translateX(100%); }
|
||||
}
|
||||
|
||||
.next-enter { animation: slide-next-enter 0.3s forwards; }
|
||||
.next-leave { animation: slide-next-leave 0.3s forwards; }
|
||||
.prev-enter { animation: slide-prev-enter 0.3s forwards; }
|
||||
.prev-leave { animation: slide-prev-leave 0.3s forwards; }
|
||||
</style>
|
||||
@@ -1,13 +1,6 @@
|
||||
<template>
|
||||
<view>
|
||||
<view
|
||||
:class="{
|
||||
'on': attr.cartAttr === true,
|
||||
[className]: className
|
||||
}"
|
||||
:style="{paddingBottom: paddingBottom}"
|
||||
class="product-window"
|
||||
>
|
||||
<view class="product-window" :class="attr.cartAttr === true ? 'on' : ''" :style="{paddingBottom: paddingBottom}">
|
||||
<view class="textpic acea-row row-between-wrapper">
|
||||
<view class="pictrue" @click="previewImg(attrObj.productSelect.image)">
|
||||
<image :src="attrObj.productSelect.image" class="image" />
|
||||
@@ -80,7 +73,7 @@
|
||||
color="#C52733"
|
||||
@click="$emit('ok')"
|
||||
:disabled="(attr.productSelect.stock === 0 && attr.cartAttr)"
|
||||
>{{ okText }}</u-button>
|
||||
>加入购物车</u-button>
|
||||
</view>
|
||||
<view class="v12-px-2 v12-mt-3" v-if="isGift">
|
||||
<u-button
|
||||
@@ -91,13 +84,7 @@
|
||||
>送给朋友</u-button>
|
||||
</view>
|
||||
</view>
|
||||
<view
|
||||
:hidden="attr.cartAttr === false"
|
||||
:class="className"
|
||||
class="mask"
|
||||
@touchmove.prevent
|
||||
@click="closeAttr"
|
||||
></view>
|
||||
<view class="mask" @touchmove.prevent :hidden="attr.cartAttr === false" @click="closeAttr"></view>
|
||||
</view>
|
||||
</template>
|
||||
<script>
|
||||
@@ -131,14 +118,6 @@ export default {
|
||||
cartNum: {
|
||||
type: Number,
|
||||
default: () => 1
|
||||
},
|
||||
okText: {
|
||||
type: String,
|
||||
default: '加入购物车'
|
||||
},
|
||||
className: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
},
|
||||
data() {
|
||||
@@ -151,22 +130,12 @@ export default {
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
'attr.cartAttr': {
|
||||
handler(val) {
|
||||
console.log(val);
|
||||
if(!val) {
|
||||
this.cartNumber = 1
|
||||
}
|
||||
},
|
||||
deep: true,
|
||||
immediate: true
|
||||
},
|
||||
cartNum: {
|
||||
handler(val) {
|
||||
console.log(val, 'cardNum');
|
||||
this.cartNumber = val || 1
|
||||
},
|
||||
deep: true,
|
||||
immediate: true
|
||||
deep: true
|
||||
},
|
||||
cartNumber(val) {
|
||||
if (val > this.attrObj.productSelect.stock) {
|
||||
@@ -204,7 +173,7 @@ export default {
|
||||
this.$emit("changeFun", { action: "changeattr", value: false })
|
||||
},
|
||||
CartNumDes() {
|
||||
if(this.cartNumber <= 1) return
|
||||
if(this.cartNumber === 1) return
|
||||
console.log(this.cartNumber, 'cartNumber');
|
||||
this.cartNumber--
|
||||
this.$emit("changeFun", { action: "ChangeCartNum", value: this.cartNumber })
|
||||
|
||||
+37
-145
@@ -3,74 +3,66 @@
|
||||
<view
|
||||
v-for="(item, evaluateWtapperIndex) in reply"
|
||||
:key="evaluateWtapperIndex"
|
||||
class="evaluateItem v12-pt-3"
|
||||
class="evaluateItem"
|
||||
>
|
||||
<!-- 用户信息头部 -->
|
||||
<view class="user-header v12-px-4">
|
||||
<view class="avatar-box">
|
||||
<image :src="item.avatar" class="avatar" mode="aspectFill" />
|
||||
<view class="pic-text acea-row row-middle">
|
||||
<view class="pictrue">
|
||||
<image :src="item.avatar" class="image" />
|
||||
</view>
|
||||
<view class="user-info">
|
||||
<view class="acea-row row-middle">
|
||||
<view class="name line1">{{ item.nickname }}</view>
|
||||
<view class="time">{{ item.createTime }}</view>
|
||||
<view class="time">{{ item.createTime }} </view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="v12-px-4">
|
||||
<view class="v12-secondary-dark-text v12-font-24 attr-bg"> {{ item.sku }}</view>
|
||||
<view class="start" :class="'star' + item.star"></view>
|
||||
</view>
|
||||
|
||||
<!-- 评论内容 -->
|
||||
<view class="evaluate-infor">{{ item.comment || '此用户没有填写评价'}}</view>
|
||||
|
||||
<!-- 图片/视频列表 -->
|
||||
<view class="imgList">
|
||||
<!-- 视频 -->
|
||||
<view class="evaluate-infor v12-font-24">{{ item.comment }}</view>
|
||||
<view class="imgList acea-row">
|
||||
<view v-if="item.video" class="pictrue">
|
||||
<view
|
||||
@click="pauseOtherVideo('video' + evaluateWtapperIndex)"
|
||||
v-if="activeVideo !== 'video' + evaluateWtapperIndex"
|
||||
class="play-icon"
|
||||
>
|
||||
<u-icon name="play-right-fill" color="#fff" size="48"></u-icon>
|
||||
</view>
|
||||
>
|
||||
<u-icon name="play-right-fill" color="#fff" size="48"></u-icon>
|
||||
</view>
|
||||
<image
|
||||
v-if="activeVideo !== 'video' + evaluateWtapperIndex"
|
||||
:src="item.video + '?vframe/jpg/offset/1'"
|
||||
class="image"
|
||||
mode="aspectFill"
|
||||
@click="pauseOtherVideo('video' + evaluateWtapperIndex)"
|
||||
/>
|
||||
>
|
||||
|
||||
</image>
|
||||
<video
|
||||
v-else
|
||||
:src="item.video"
|
||||
:poster="item.video + '?vframe/jpg/offset/1'"
|
||||
controls
|
||||
autoplay
|
||||
class="image"
|
||||
play-btn-position="center"
|
||||
:id="'video' + evaluateWtapperIndex"
|
||||
class="image"
|
||||
@play="pauseOtherVideo('video' + evaluateWtapperIndex)"
|
||||
/>
|
||||
</view>
|
||||
<!-- 图片 -->
|
||||
<view
|
||||
v-for="(pic, idx) in item.picturesArr"
|
||||
:key="idx"
|
||||
v-for="(itemn, eq) in item.picturesArr"
|
||||
:key="eq"
|
||||
class="pictrue"
|
||||
>
|
||||
<image :src="pic" class="image" mode="aspectFill" @click="previewImage(item.picturesArr, idx)" />
|
||||
<image :src="itemn" class="image" @click="previewImage(item.picturesArr, eq)" />
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 商家回复 -->
|
||||
<view class="reply" v-if="item.merchantReplyContent">
|
||||
<text class="font-color-red">店小二</text>
|
||||
<span class="font-color-red">店小二</span>
|
||||
:{{item.merchantReplyContent}}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { dataFormat } from "@/utils";
|
||||
|
||||
@@ -113,128 +105,28 @@ export default {
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.evaluateWtapper {
|
||||
.evaluateItem {
|
||||
margin-bottom: 30rpx;
|
||||
border-bottom: 1px solid #f5f5f5;
|
||||
padding-bottom: 30rpx;
|
||||
&:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.user-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 12rpx;
|
||||
|
||||
.avatar-box {
|
||||
margin-right: 20rpx;
|
||||
.avatar {
|
||||
width: 70rpx;
|
||||
height: 70rpx;
|
||||
border-radius: 50%;
|
||||
}
|
||||
}
|
||||
|
||||
.user-info {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
|
||||
.name {
|
||||
font-size: 28rpx;
|
||||
color: #333;
|
||||
font-weight: bold;
|
||||
margin-bottom: 4rpx;
|
||||
}
|
||||
|
||||
.time {
|
||||
font-size: 22rpx;
|
||||
color: #999;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.tag-row {
|
||||
margin-bottom: 12rpx;
|
||||
.default-tag {
|
||||
display: inline-block;
|
||||
background: #FFF0F1;
|
||||
color: #FE5261;
|
||||
font-size: 20rpx;
|
||||
padding: 4rpx 12rpx;
|
||||
border-radius: 6rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.star-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 20rpx;
|
||||
.star-icon {
|
||||
margin-right: 4rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.evaluate-infor {
|
||||
font-size: 28rpx;
|
||||
color: #333;
|
||||
line-height: 1.6;
|
||||
margin-bottom: 20rpx;
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
.imgList {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
||||
.pictrue {
|
||||
width: 220rpx;
|
||||
height: 220rpx;
|
||||
margin-right: 15rpx;
|
||||
margin-bottom: 15rpx;
|
||||
border-radius: 12rpx;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
background: #f5f5f5;
|
||||
|
||||
&:nth-child(3n) {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.image {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.play-icon {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
z-index: 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.reply {
|
||||
background: #F5F5F5;
|
||||
border-radius: 12rpx;
|
||||
padding: 20rpx;
|
||||
margin-top: 10rpx;
|
||||
font-size: 24rpx;
|
||||
color: #666;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.attr-bg{
|
||||
background: rgba(197,39,51,0.1);
|
||||
padding: 7rpx 5px;
|
||||
width: fit-content;
|
||||
border-radius: 12rpx;
|
||||
}
|
||||
.time{
|
||||
padding: 0 !important;
|
||||
}
|
||||
.evaluateWtapper .evaluateItem .imgList .pictrue{
|
||||
position: relative;
|
||||
width: 300rpx;
|
||||
.play-icon {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
margin: auto;
|
||||
width: 80rpx;
|
||||
height: 80rpx;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -15,17 +15,10 @@ import {
|
||||
} from '@/api/public'
|
||||
export default {
|
||||
name: 'AiEntrance',
|
||||
props: {
|
||||
cityName: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showImg: false,
|
||||
settingInfo: {},
|
||||
localCityName: uni.getStorageSync('locationCityName') || ''
|
||||
settingInfo: {}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
@@ -43,7 +36,7 @@ export default {
|
||||
},
|
||||
enterAiChat() {
|
||||
uni.navigateTo({
|
||||
url: '/aiChat/views/index?click=1&cityName=' + (this.cityName || this.localCityName)
|
||||
url: '/aiChat/views/index?click=1'
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,485 +0,0 @@
|
||||
<template>
|
||||
<view>
|
||||
<view class="c_total">资讯评论</view>
|
||||
<template v-if="dataList && dataList.length">
|
||||
<view class="c_comment" v-for="(item1, index1) in dataList" :key="item1.id">
|
||||
<!-- 一级评论 -->
|
||||
<CommonComp
|
||||
:data="item1"
|
||||
@likeClick="() => likeClick({ item1, index1 })"
|
||||
@replyClick="() => replyClick({ item1, index1 })"
|
||||
@deleteClick="() => deleteClick({ item1, index1 })"
|
||||
/>
|
||||
<view class="children_item" v-if="item1.children && item1.children.length">
|
||||
<!-- 二级评论 -->
|
||||
<CommonComp
|
||||
v-for="(item2, index2) in item1.childrenShow"
|
||||
:key="item2.id"
|
||||
:data="item2"
|
||||
:pData="item1"
|
||||
@likeClick="() => likeClick({ item1, index1, item2, index2 })"
|
||||
@replyClick="() => replyClick({ item1, index1, item2, index2 })"
|
||||
@deleteClick="() => deleteClick({ item1, index1, item2, index2 })"
|
||||
/>
|
||||
<!-- 展开二级评论 -->
|
||||
<view
|
||||
class="expand_reply"
|
||||
v-if="expandTxtShow({ item1, index1 })"
|
||||
@tap="() => expandReplyFun({ item1, index1 })"
|
||||
>
|
||||
<span class="txt"> 展开{{ item1.children.length - item1.childrenShow.length }}条回复 </span>
|
||||
<uni-icons type="down" size="24" color="#007aff"></uni-icons>
|
||||
</view>
|
||||
<!-- 折叠二级评论 -->
|
||||
<view
|
||||
class="shrink_reply"
|
||||
v-if="shrinkTxtShow({ item1, index1 })"
|
||||
@tap="() => shrinkReplyFun({ item1, index1 })"
|
||||
>
|
||||
<span class="txt"> 收起回复内容 </span>
|
||||
<uni-icons type="up" size="24" color="#007aff"></uni-icons>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
<!-- 空盒子 -->
|
||||
<view class="empty_box" v-else>
|
||||
<uni-icons type="chatboxes" size="36" color="#c0c0c0"></uni-icons>
|
||||
<view>
|
||||
<span class="txt"> 这里是一片荒草地, </span>
|
||||
<span class="txt click" @click="() => newCommentFun()">说点什么...</span>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 评论弹窗 -->
|
||||
<uni-popup ref="cPopupRef" type="bottom" @change="popChange">
|
||||
<view class="c_popup_box">
|
||||
<view class="reply_text">
|
||||
<template v-if="Object.keys(replyTemp).length">
|
||||
<span class="text_aid">回复给</span>
|
||||
<img
|
||||
class="user_avatar"
|
||||
:src="replyTemp.item2 ? replyTemp.item2.user_avatar : replyTemp.item1.user_avatar"
|
||||
/>
|
||||
<span class="text_main">{{ replyTemp.item2 ? replyTemp.item2.user_name : replyTemp.item1.user_name }}</span>
|
||||
</template>
|
||||
<span v-else class="text_main">发表新评论</span>
|
||||
</view>
|
||||
<view class="content">
|
||||
<view class="text_area">
|
||||
<uni-easyinput
|
||||
class="text_area"
|
||||
type="textarea"
|
||||
v-model="commentValue"
|
||||
:placeholder="commentPlaceholder"
|
||||
:focus="focus"
|
||||
trim
|
||||
autoHeight
|
||||
maxlength="300"
|
||||
></uni-easyinput>
|
||||
</view>
|
||||
<view class="send_btn" @tap="() => sendClick()">发送</view>
|
||||
</view>
|
||||
</view>
|
||||
</uni-popup>
|
||||
<!-- 删除弹窗 -->
|
||||
<uni-popup ref="delPopupRef" type="dialog">
|
||||
<uni-popup-dialog
|
||||
mode="base"
|
||||
title=""
|
||||
content="确定删除这条评论吗?"
|
||||
:before-close="true"
|
||||
@close="delCloseFun"
|
||||
@confirm="delConfirmFun"
|
||||
></uni-popup-dialog>
|
||||
</uni-popup>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import CommonComp from "./componets/common";
|
||||
export default {
|
||||
components: { CommonComp },
|
||||
props: {
|
||||
/** 登陆用户信息
|
||||
* id: number // 登陆用户id
|
||||
* user_name: number // 登陆用户名
|
||||
* user_avatar: string // 登陆用户头像地址
|
||||
*/
|
||||
myInfo: {
|
||||
type: Object,
|
||||
default: () => {},
|
||||
},
|
||||
/** 文章作者信息
|
||||
* id: number // 文章作者id
|
||||
* user_name: number // 文章作者名
|
||||
* user_avatar: string // 文章作者头像地址
|
||||
*/
|
||||
userInfo: {
|
||||
type: Object,
|
||||
default: () => {},
|
||||
},
|
||||
/** 评论列表
|
||||
* id: number // 评论id
|
||||
* parent_id: number // 父级评论id
|
||||
* reply_id: number // 被回复人评论id
|
||||
* reply_name: string // 被回复人名称
|
||||
* user_name: string // 用户名
|
||||
* user_avatar: string // 评论者头像地址
|
||||
* user_content: string // 评论内容
|
||||
* is_like: boolean // 是否点赞
|
||||
* like_count: number // 点赞数统计
|
||||
* create_time: string // 创建时间
|
||||
*/
|
||||
tableData: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
// 评论总数
|
||||
tableTotal: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
// 评论删除模式
|
||||
// bind - 当被删除的一级评论存在回复评论, 那么该评论内容变更显示为[当前评论内容已被移除]
|
||||
// only - 仅删除当前评论(后端删除相关联的回复评论, 否则总数显示不对)
|
||||
// all - 删除所有评论包括回复评论
|
||||
deleteMode: {
|
||||
type: String,
|
||||
default: "all",
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
dataList: [], // 渲染数据(前端的格式)
|
||||
replyTemp: {}, // 回复临时数据
|
||||
isNewComment: false, // 是否为新评论
|
||||
focus: false, // 评论弹窗
|
||||
commentValue: "", // 输入框值
|
||||
commentPlaceholder: "说点什么...", // 输入框占位符
|
||||
delTemp: {}, // 删除临时数据
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
tableData: {
|
||||
handler(newVal) {
|
||||
if (newVal.length !== this.dataList.length) {
|
||||
this.dataList = this.treeTransForm(newVal);
|
||||
}
|
||||
},
|
||||
deep: true,
|
||||
immediate: true,
|
||||
},
|
||||
},
|
||||
mounted() {},
|
||||
methods: {
|
||||
// 数据转换
|
||||
treeTransForm(data) {
|
||||
let newData = JSON.parse(JSON.stringify(data));
|
||||
let result = [];
|
||||
let map = {};
|
||||
newData.forEach((item, i) => {
|
||||
item.owner = item.user_id === this.myInfo.user_id; // 是否为当前登陆用户 可以对自己的评论进行删除 不能回复
|
||||
item.author = item.user_id === this.userInfo.user_id; // 是否为作者 显示标记
|
||||
map[item.id] = item;
|
||||
});
|
||||
newData.forEach((item) => {
|
||||
let parent = map[item.parent_id];
|
||||
if (parent) {
|
||||
(parent.children || (parent.children = [])).push(item); // 所有回复
|
||||
if (parent.children.length === 1) {
|
||||
(parent.childrenShow = []).push(item); // 显示的回复
|
||||
}
|
||||
} else {
|
||||
result.push(item);
|
||||
}
|
||||
});
|
||||
return result;
|
||||
},
|
||||
// 点赞
|
||||
setLike(item) {
|
||||
item.is_like = !item.is_like;
|
||||
item.like_count = item.is_like ? item.like_count + 1 : item.like_count - 1;
|
||||
},
|
||||
likeClick({ item1, index1, item2, index2 }) {
|
||||
let item = item2 || item1;
|
||||
this.setLike(item);
|
||||
this.$emit("likeFun", { params: item }, (res) => {
|
||||
// 请求后端失败, 重置点赞
|
||||
setLike(item);
|
||||
});
|
||||
},
|
||||
// 回复
|
||||
replyClick({ item1, index1, item2, index2 }) {
|
||||
this.replyTemp = JSON.parse(JSON.stringify({ item1, index1, item2, index2 }));
|
||||
this.$refs["cPopupRef"].open();
|
||||
},
|
||||
// 发起新评论
|
||||
newCommentFun() {
|
||||
this.isNewComment = true;
|
||||
this.$refs["cPopupRef"].open();
|
||||
},
|
||||
// 评论弹窗
|
||||
popChange(e) {
|
||||
// 关闭弹窗
|
||||
if (!e.show) {
|
||||
this.commentValue = ""; // 清空输入框值
|
||||
this.replyTemp = {}; // 清空被回复人信息
|
||||
this.isNewComment = false; // 恢复是否为新评论默认值
|
||||
}
|
||||
this.focus = e.show;
|
||||
},
|
||||
// 发送评论
|
||||
sendClick({ item1, index1, item2, index2 } = this.replyTemp) {
|
||||
let item = item2 || item1;
|
||||
let params = {};
|
||||
// 新评论
|
||||
if (this.isNewComment) {
|
||||
params = {
|
||||
id: Math.random(), // 评论id
|
||||
parent_id: null, // 父级评论id
|
||||
reply_id: null, // 被回复评论id
|
||||
reply_name: null, // 被回复人名称
|
||||
};
|
||||
} else {
|
||||
// 回复评论
|
||||
params = {
|
||||
id: Math.random(), // 评论id
|
||||
parent_id: item?.parent_id ?? item.id, // 父级评论id
|
||||
reply_id: item.id, // 被回复评论id
|
||||
reply_name: item.user_name, // 被回复人名称
|
||||
};
|
||||
}
|
||||
params = {
|
||||
...params,
|
||||
user_id: this.myInfo.user_id, // 用户id
|
||||
user_name: this.myInfo.user_name, // 用户名
|
||||
user_avatar: this.myInfo.user_avatar, // 用户头像地址
|
||||
user_content: this.commentValue, // 用户评论内容
|
||||
is_like: false, // 是否点赞
|
||||
like_count: 0, // 点赞数统计
|
||||
create_time: "刚刚", // 创建时间
|
||||
owner: true, // 是否为所有者 所有者可以进行删除 管理员默认true
|
||||
};
|
||||
|
||||
uni.showLoading({
|
||||
title: "正在发送",
|
||||
mask: true,
|
||||
});
|
||||
this.$emit("replyFun", { params }, (res) => {
|
||||
uni.hideLoading();
|
||||
// 拿到后端返回的id赋值, 因为删除要用到id
|
||||
params = { ...params, id: res.id };
|
||||
// 新评论
|
||||
if (this.isNewComment) {
|
||||
this.dataList.push(params);
|
||||
} else {
|
||||
// 回复
|
||||
let c_data = this.dataList[index1];
|
||||
(c_data.children || (c_data.children = [])).push(params);
|
||||
// 如果已展开所有回复, 那么此时插入children长度会大于childrenShow长度1, 所以就直接展开显示即可
|
||||
if (c_data.children.length === (c_data.childrenShow || (c_data.childrenShow = [])).length + 1) {
|
||||
c_data.childrenShow.push(params);
|
||||
}
|
||||
}
|
||||
this.$emit("update:tableTotal", this.tableTotal + 1);
|
||||
this.$refs["cPopupRef"].close();
|
||||
});
|
||||
},
|
||||
//删除
|
||||
deleteClick({ item1, index1, item2, index2 }) {
|
||||
this.delTemp = JSON.parse(JSON.stringify({ item1, index1, item2, index2 }));
|
||||
this.$refs["delPopupRef"].open();
|
||||
},
|
||||
// 关闭删除弹窗
|
||||
delCloseFun() {
|
||||
this.delTemp = {};
|
||||
this.$refs["delPopupRef"].close();
|
||||
},
|
||||
// 确定删除
|
||||
delConfirmFun({ item1, index1, item2, index2 } = this.delTemp) {
|
||||
const deleteMode = this.deleteMode;
|
||||
let c_data = this.dataList[index1];
|
||||
uni.showLoading({
|
||||
title: "正在删除",
|
||||
mask: true,
|
||||
});
|
||||
// 删除二级评论
|
||||
if (index2 >= 0) {
|
||||
this.$emit("deleteFun", { params: [c_data.children[index2].id], mode: deleteMode }, (res) => {
|
||||
uni.hideLoading();
|
||||
this.$emit("update:tableTotal", this.tableTotal - 1);
|
||||
c_data.children.splice(index2, 1);
|
||||
c_data.childrenShow.splice(index2, 1);
|
||||
});
|
||||
} else {
|
||||
// 删除一级评论
|
||||
if (c_data?.children?.length) {
|
||||
// 如果一级评论包含回复评论
|
||||
switch (deleteMode) {
|
||||
case "bind":
|
||||
// 一级评论内容展示修改为: 当前评论内容已被移除
|
||||
this.$emit(
|
||||
"deleteFun",
|
||||
{
|
||||
params: [c_data.id],
|
||||
mode: deleteMode,
|
||||
},
|
||||
(res) => {
|
||||
uni.hideLoading();
|
||||
c_data.user_content = "当前评论内容已被移除";
|
||||
}
|
||||
);
|
||||
break;
|
||||
case "only":
|
||||
// 后端自行根据删除的一级评论id, 查找关联的子评论进行删除
|
||||
this.$emit(
|
||||
"deleteFun",
|
||||
{
|
||||
params: [c_data.id],
|
||||
mode: deleteMode,
|
||||
},
|
||||
(res) => {
|
||||
uni.hideLoading();
|
||||
this.$emit("update:tableTotal", this.tableTotal - c_data.children.length + 1);
|
||||
this.dataList.splice(index1, 1);
|
||||
}
|
||||
);
|
||||
break;
|
||||
default:
|
||||
// all
|
||||
// 收集子评论id, 提交给后端统一删除
|
||||
let delIdArr = [c_data.id];
|
||||
c_data.children.forEach((_, i) => {
|
||||
delIdArr.push(_.id);
|
||||
});
|
||||
this.$emit("deleteFun", { params: delIdArr, mode: deleteMode }, (res) => {
|
||||
uni.hideLoading();
|
||||
this.$emit("update:tableTotal", this.tableTotal - c_data.children.length + 1);
|
||||
this.dataList.splice(index1, 1);
|
||||
});
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// 一级评论无回复, 直接删除
|
||||
this.$emit("deleteFun", { params: [c_data.id], mode: deleteMode }, (res) => {
|
||||
uni.hideLoading();
|
||||
this.$emit("update:tableTotal", this.tableTotal - 1);
|
||||
this.dataList.splice(index1, 1);
|
||||
});
|
||||
}
|
||||
}
|
||||
this.delCloseFun();
|
||||
},
|
||||
// 展开评论if
|
||||
expandTxtShow({ item1, index1 }) {
|
||||
return item1.childrenShow?.length && item1.children.length - item1.childrenShow.length;
|
||||
},
|
||||
// 展开更多评论
|
||||
expandReplyFun({ item1, index1 }) {
|
||||
let csLen = this.dataList[index1].childrenShow.length;
|
||||
this.dataList[index1].childrenShow.push(
|
||||
...this.dataList[index1].children.slice(csLen, csLen + 6) // 截取5条评论
|
||||
);
|
||||
},
|
||||
|
||||
// 收起评论if
|
||||
shrinkTxtShow({ item1, index1 }) {
|
||||
return item1.childrenShow?.length >= 2 && item1.children.length - item1.childrenShow.length === 0;
|
||||
},
|
||||
// 收起更多评论
|
||||
shrinkReplyFun({ item1, index1 }) {
|
||||
this.dataList[index1].childrenShow = [];
|
||||
this.dataList[index1].childrenShow.push(
|
||||
...this.dataList[index1].children.slice(0, 1) // 截取1条评论
|
||||
);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
////////////////////////
|
||||
.center {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
////////////////////////
|
||||
.c_total {
|
||||
padding: 20rpx 30rpx 0 30rpx;
|
||||
font-size: 28rpx;
|
||||
}
|
||||
.empty_box {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
padding: 150rpx 10rpx;
|
||||
font-size: 28rpx;
|
||||
.txt {
|
||||
color: $uni-text-color-disable;
|
||||
}
|
||||
.click {
|
||||
color: $uni-color-primary;
|
||||
}
|
||||
}
|
||||
.c_comment {
|
||||
padding: 20rpx 30rpx;
|
||||
font-size: 28rpx;
|
||||
|
||||
.children_item {
|
||||
padding: 20rpx 30rpx;
|
||||
margin-top: 10rpx;
|
||||
margin-left: 80rpx;
|
||||
background-color: $uni-bg-color-grey;
|
||||
.expand_reply,
|
||||
.shrink_reply {
|
||||
margin-top: 10rpx;
|
||||
margin-left: 80rpx;
|
||||
.txt {
|
||||
font-weight: 600;
|
||||
color: $uni-color-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.c_popup_box {
|
||||
background-color: #fff;
|
||||
.reply_text {
|
||||
@extend .center;
|
||||
padding: 20rpx 20rpx 0 20rpx;
|
||||
font-size: 26rpx;
|
||||
.text_aid {
|
||||
color: $uni-text-color-grey;
|
||||
margin-right: 5rpx;
|
||||
}
|
||||
.user_avatar {
|
||||
width: 48rpx;
|
||||
height: 48rpx;
|
||||
border-radius: 50%;
|
||||
margin-right: 6rpx;
|
||||
margin-left: 12rpx;
|
||||
}
|
||||
.text_main {
|
||||
}
|
||||
}
|
||||
.content {
|
||||
@extend .center;
|
||||
.text_area {
|
||||
flex: 1;
|
||||
padding: 20rpx;
|
||||
}
|
||||
.send_btn {
|
||||
@extend .center;
|
||||
justify-content: center;
|
||||
width: 120rpx;
|
||||
height: 60rpx;
|
||||
border-radius: 20rpx;
|
||||
font-size: 28rpx;
|
||||
color: #fff;
|
||||
background-color: $uni-color-primary;
|
||||
margin-right: 20rpx;
|
||||
margin-left: 5rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,182 +0,0 @@
|
||||
<template>
|
||||
<view class="comment_item">
|
||||
<view class="top">
|
||||
<view class="top_left">
|
||||
<img class="user_avatar" :src="data.user_avatar" />
|
||||
<uni-tag v-if="data.author" class="tag" type="primary" :inverted="false" text="作者" size="mini" circle />
|
||||
<span class="user_name">{{ data.user_name }}</span>
|
||||
<span class="user_name">{{ cReplyName }}</span>
|
||||
</view>
|
||||
<view class="top_right" @click="likeClick(data)">
|
||||
<span :class="[data.is_like ? 'active' : '', 'like_count']">{{ cLikeCount }}</span>
|
||||
<uni-icons v-show="data.is_like" type="hand-up-filled" size="24" color="#007aff"></uni-icons>
|
||||
<uni-icons v-show="!data.is_like" type="hand-up" size="24" color="#999"></uni-icons>
|
||||
</view>
|
||||
</view>
|
||||
<view class="content" @click="replyClick(data)">
|
||||
{{ c_content }}
|
||||
<span class="shrink" v-if="isShrink" @click.stop="expandContentFun(data.user_content)">...展开</span>
|
||||
<span
|
||||
class="shrink"
|
||||
v-if="!isShrink && user_content.length > contentShowLength"
|
||||
@click.stop="shrinkContentFun(data.user_content)"
|
||||
>
|
||||
收起</span
|
||||
>
|
||||
</view>
|
||||
<view class="bottom">
|
||||
<span class="create_time">{{ data.create_time }}</span>
|
||||
<span v-if="data.owner" class="delete" @click="deleteClick(data)">删除</span>
|
||||
<!-- <span v-else class="reply" @click="replyClick(props.data)"
|
||||
>回复</span
|
||||
> -->
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
// 评论数据
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => {},
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
// 评论过长处理
|
||||
contentShowLength: 70, // 默认显示评论字符
|
||||
user_content: "",
|
||||
isShrink: false, // 是否收缩评论
|
||||
c_content: "",
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
// 被回复人名称
|
||||
cReplyName: function () {
|
||||
return this.data?.reply_name ? ` ▸ ` + this.data?.reply_name : "";
|
||||
},
|
||||
// 点赞数显示
|
||||
cLikeCount: function () {
|
||||
return this.data.like_count === 0 ? "" : this.$formatCount(this.data.like_count);
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
// 删除变更显示定制
|
||||
"data.user_content": function (newVal, oldVal) {
|
||||
if (newVal !== oldVal) {
|
||||
this.c_content = newVal;
|
||||
}
|
||||
},
|
||||
// 监听isShrink变化,更新c_content
|
||||
isShrink: function (newVal) {
|
||||
this.c_content = newVal ? this.user_content.slice(0, this.contentShowLength + 1) : this.user_content;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
// 展开文字
|
||||
expandContentFun() {
|
||||
this.isShrink = false;
|
||||
},
|
||||
// 收起文字
|
||||
shrinkContentFun() {
|
||||
this.isShrink = true;
|
||||
},
|
||||
// 点赞
|
||||
likeClick(item) {
|
||||
this.$emit("likeClick", item);
|
||||
},
|
||||
// 回复
|
||||
replyClick(item) {
|
||||
// 自己不能回复自己
|
||||
if (item.owner) return;
|
||||
this.$emit("replyClick", item);
|
||||
},
|
||||
// 删除
|
||||
deleteClick(item) {
|
||||
this.$emit("deleteClick", item);
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.user_content = this.data.user_content;
|
||||
this.isShrink = this.user_content.length > this.contentShowLength;
|
||||
this.c_content = this.isShrink ? this.user_content.slice(0, this.contentShowLength + 1) : this.user_content;
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
////////////////////
|
||||
.center {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.ellipsis {
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
////////////////////
|
||||
.comment_item {
|
||||
font-size: 28rpx;
|
||||
.top {
|
||||
@extend .center;
|
||||
justify-content: space-between;
|
||||
.top_left {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
overflow: hidden;
|
||||
.user_avatar {
|
||||
width: 68rpx;
|
||||
height: 68rpx;
|
||||
border-radius: 50%;
|
||||
margin-right: 12rpx;
|
||||
}
|
||||
.tag {
|
||||
margin-right: 6rpx;
|
||||
}
|
||||
.user_name {
|
||||
@extend .ellipsis;
|
||||
max-width: 180rpx;
|
||||
color: #8c8c8c;
|
||||
}
|
||||
}
|
||||
.top_right {
|
||||
@extend .center;
|
||||
.like_count {
|
||||
color: #8c8c8c;
|
||||
&.active {
|
||||
color: #007aff;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.content {
|
||||
padding: 10rpx;
|
||||
margin-left: 70rpx;
|
||||
color: #333;
|
||||
&:active {
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
.shrink {
|
||||
padding: 20rpx 20rpx 20rpx 0rpx;
|
||||
color: #007aff;
|
||||
}
|
||||
}
|
||||
.bottom {
|
||||
padding-left: 80rpx;
|
||||
font-size: 24rpx;
|
||||
.create_time {
|
||||
color: #8c8c8c;
|
||||
}
|
||||
.delete {
|
||||
padding: 20rpx 20rpx 0 20rpx;
|
||||
color: #c0c0c0;
|
||||
}
|
||||
.reply {
|
||||
color: #007aff;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,128 +0,0 @@
|
||||
<template>
|
||||
<u-popup
|
||||
:show="showShare"
|
||||
mode="center"
|
||||
bgColor="transparent"
|
||||
closeable
|
||||
@close="closeShare"
|
||||
>
|
||||
<view class="box-share">
|
||||
<view class="box-img">
|
||||
<image :src="posterUrl" class="main-img" mode="widthFix" />
|
||||
</view>
|
||||
<image
|
||||
:src="webUrl + '/20230608112210135038.png'"
|
||||
mode="widthFix"
|
||||
class="btn"
|
||||
@click="saveImg"
|
||||
/>
|
||||
</view>
|
||||
</u-popup>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||
posterUrl: '',
|
||||
showShare: false
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
closeShare() {
|
||||
this.showShare = false
|
||||
},
|
||||
showView(url) {
|
||||
this.posterUrl = url
|
||||
this.showShare = true
|
||||
},
|
||||
saveImg() {
|
||||
const _this = this
|
||||
uni.getSetting({
|
||||
success: getRes => {
|
||||
if (getRes.authSetting["scope.writePhotosAlbum"]) {
|
||||
_this.downloadImage()
|
||||
} else {
|
||||
uni.authorize({
|
||||
scope: "scope.writePhotosAlbum",
|
||||
success: () => {
|
||||
_this.downloadImage()
|
||||
},
|
||||
fail: () => {
|
||||
uni.openSetting({
|
||||
success: openRes => {
|
||||
console.log(typeof openRes, openRes)
|
||||
},
|
||||
fail: () => {
|
||||
uni.showToast({
|
||||
title: "请在设置中打开对应权限",
|
||||
icon: "none"
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
fail: (err) => {
|
||||
console.log(err, 2)
|
||||
}
|
||||
})
|
||||
},
|
||||
downloadImage() {
|
||||
const _this = this
|
||||
const randomID = () => Math.random().toString(36).substring(2)
|
||||
uni.downloadFile({
|
||||
url: this.posterUrl, // 网络图片的地址
|
||||
filePath: wx.env.USER_DATA_PATH + "/share_" + randomID() + ".png", // 指定的本地文件路径
|
||||
success: downRes => {
|
||||
uni.saveImageToPhotosAlbum({
|
||||
filePath: downRes.filePath, // 临时文件地址
|
||||
success: function () {
|
||||
uni.showToast({
|
||||
title: "保存成功",
|
||||
icon: "success",
|
||||
success() {
|
||||
_this.showShare = false
|
||||
}
|
||||
})
|
||||
},
|
||||
fail: function (err) {
|
||||
uni.showToast({
|
||||
title: err,
|
||||
icon: "none"
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
fail: function (err) {
|
||||
uni.showToast({
|
||||
title: err.errMsg,
|
||||
icon: "error"
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.box-share {
|
||||
width: 600rpx;
|
||||
border-radius: 20rpx;
|
||||
overflow: hidden;
|
||||
}
|
||||
.box-img {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.btn {
|
||||
width: 100%;
|
||||
height: 80rpx;
|
||||
line-height: 80rpx;
|
||||
margin-top: 40rpx;
|
||||
}
|
||||
</style>
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<u-popup :closeOnClickOverlay="true" :show="show" ref="popup" type="bottom">
|
||||
<uni-popup ref="popup" type="bottom">
|
||||
<view class="tpf-time-range-section">
|
||||
<view class="tpf-time-range-title-section flex flex-align-center flex-pack-justify">
|
||||
<text class="tpf-time-range-title-txt tpf-time-range-cancel" @tap="closePopup('cancel')">取消</text>
|
||||
@@ -30,7 +30,7 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</u-popup>
|
||||
</uni-popup>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
@@ -98,7 +98,6 @@ export default{
|
||||
return {
|
||||
startDefaultTimeArr:[0,0],
|
||||
endDefaultTimeArr:[0,0],
|
||||
show: false
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
@@ -111,11 +110,11 @@ export default{
|
||||
if(this.compareTwoTimeRange(this.startDefaultTimeArr,e.detail.value)) this.startDefaultTimeArr = e.detail.value;
|
||||
},
|
||||
open(){
|
||||
this.show = true;
|
||||
this.$refs.popup.open();
|
||||
},
|
||||
closePopup(action=""){
|
||||
if(action == "cancel"){
|
||||
this.show = false;
|
||||
this.$refs.popup.close();
|
||||
return false;
|
||||
}
|
||||
if(this.compareTwoTimeRange(this.startDefaultTimeArr , this.endDefaultTimeArr)){
|
||||
@@ -130,7 +129,7 @@ export default{
|
||||
this.$emit('timeRange',[
|
||||
startTime,endTime
|
||||
]);
|
||||
this.show = false;
|
||||
this.$refs.popup.close();
|
||||
},
|
||||
compareTwoTimeRange(arr1=[],arr2=[]){
|
||||
if(arr1[0]>arr2[0] || (arr1[0] == arr2[0] && arr1[1] > arr2[1])) return true;
|
||||
|
||||
@@ -5,15 +5,13 @@
|
||||
v-if="!item.isFarmerShop"
|
||||
:src="item[imageKey]"
|
||||
class="img"
|
||||
lazy-load
|
||||
/>
|
||||
<image
|
||||
:src="item.farmerShopCover"
|
||||
v-if="item.farmerShopCoverType === 1 && item.isFarmerShop"
|
||||
class="img"
|
||||
mode="heightFix|widthFix"
|
||||
lazy-load
|
||||
/>
|
||||
mode="heightFix|widthFix">
|
||||
</image>
|
||||
<image
|
||||
:src="item.farmerShopCover + '?vframe/jpg/offset/1'"
|
||||
mode="heightFix|widthFix"
|
||||
@@ -22,35 +20,24 @@
|
||||
:show-fullscreen-btn="false"
|
||||
:show-play-btn="false"
|
||||
class="img"
|
||||
:poster="item.farmerShopCover + '?vframe/jpg/offset/1'"
|
||||
lazy-load
|
||||
/>
|
||||
:poster="item.farmerShopCover + '?vframe/jpg/offset/1'">
|
||||
</image>
|
||||
|
||||
<image
|
||||
v-if="item.isOldBrand"
|
||||
:src="webUrl + '/home/old-mark.png'"
|
||||
class="mark-img"
|
||||
lazy-load
|
||||
/>
|
||||
<image
|
||||
v-if="item.isGiftCard"
|
||||
style="left: 0;width: 120rpx;"
|
||||
:src="webUrl + '/home/gift-tag.png'"
|
||||
class="mark-img"
|
||||
lazy-load
|
||||
/>
|
||||
<image
|
||||
v-if="item.isLandmarkGoods"
|
||||
:src="webUrl + '/home/mark-land.png'"
|
||||
class="mark-img"
|
||||
style="right: 20rpx"
|
||||
lazy-load
|
||||
/>
|
||||
<image
|
||||
v-if="item.isCountyFamous"
|
||||
:src="webUrl + '/home/qixian-mark.png'"
|
||||
class="mark-img"
|
||||
lazy-load
|
||||
/>
|
||||
<image
|
||||
v-if="item.isIch"
|
||||
@@ -62,7 +49,6 @@
|
||||
v-if="item.isFarmerShop"
|
||||
:src="webUrl + '/orderIcon/nm.png'"
|
||||
class="mark-img-nm"
|
||||
lazy-load
|
||||
/>
|
||||
</view>
|
||||
<view v-if="item.isFarmerShop" class="more-t v12-pt-2 v12-font-bold v12-font-28 v12-px-2" >{{ item.farmerShopContent }}</view>
|
||||
@@ -79,26 +65,12 @@
|
||||
</view>
|
||||
<view class="price-wrap">
|
||||
<view class="price">
|
||||
<view
|
||||
v-if="item.isNegotiable === 1"
|
||||
class="v12-primary-text v12-font-28 v12-font-weight"
|
||||
>
|
||||
价格面议
|
||||
</view>
|
||||
<text
|
||||
v-else
|
||||
class="price-txt price-red">
|
||||
<text class="v12-font-20">
|
||||
¥
|
||||
</text>
|
||||
{{ item[priceKey] }}
|
||||
</text>
|
||||
<text class="price-txt price-red">¥{{ item[priceKey] }}</text>
|
||||
</view>
|
||||
<view v-if="item.isNegotiable === 0" class="btn" @click.stop="$emit('add', item)">
|
||||
<view class="btn" @click.stop="$emit('add', item)">
|
||||
<image
|
||||
:src="webUrl + '/home/icon-cart.png'"
|
||||
class="img"
|
||||
lazy-load
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
@@ -107,7 +79,7 @@
|
||||
v-if="item.isFarmerShop"
|
||||
class="v12-justify-start v12-align-center v12-pt-2 v12-px-2 v12-pb-2">
|
||||
<view class="btn v12-mr-2">
|
||||
<image :src="item.farmerShopLogo" class="nm-img-logo v12-radius-100" lazy-load />
|
||||
<image :src="item.farmerShopLogo" class="nm-img-logo v12-radius-100"></image>
|
||||
</view>
|
||||
<view class="one-t v12-font-24 v12-dark1-text" style="width:230rpx">{{ item.farmerShopName }}/{{ item.farmerShopCityName || '-' }}</view>
|
||||
</view>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<view
|
||||
:class="currIndex === 4 ? 'curr' : ''"
|
||||
class="name"
|
||||
>吃喝玩乐</view>
|
||||
>寻趣味</view>
|
||||
</view>
|
||||
<view class="tabbar-list">
|
||||
<view
|
||||
@@ -30,6 +30,7 @@
|
||||
@click="gotoPage(item.url, item.type, item.index)"
|
||||
>
|
||||
<view class="img-wrap">
|
||||
<!-- 预加载两张图片,可以在点击切换的时候不闪屏 -->
|
||||
<image
|
||||
:src="item.onIcon"
|
||||
class="img on"
|
||||
@@ -40,12 +41,6 @@
|
||||
/>
|
||||
</view>
|
||||
<view class="name">{{ item.name }}</view>
|
||||
<view
|
||||
v-if="item.name === '消息' && showUnreadBadge"
|
||||
class="badge"
|
||||
>
|
||||
{{ unreadCountText }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
@@ -53,8 +48,6 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import store from '@/store'
|
||||
import { getUnreadMessageCount, getUnreadMessageCountForSeller } from '@/api/rooms'
|
||||
export default {
|
||||
name: 'XddTabbar',
|
||||
props: {
|
||||
@@ -100,57 +93,14 @@ export default {
|
||||
type: 1,
|
||||
index: 3
|
||||
}
|
||||
]],
|
||||
unreadCount: 0
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
isLogin() {
|
||||
return store.getters.isLogin
|
||||
},
|
||||
showUnreadBadge() {
|
||||
return this.isLogin && this.unreadCount > 0
|
||||
},
|
||||
unreadCountText() {
|
||||
if (this.unreadCount > 99) {
|
||||
return '99+'
|
||||
}
|
||||
return this.unreadCount
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
isLogin(val) {
|
||||
if (val) {
|
||||
this.fetchUnreadCount()
|
||||
} else {
|
||||
this.unreadCount = 0
|
||||
uni.$emit('updateUnreadMessageCount', 0)
|
||||
}
|
||||
]]
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.getElementData('#quweiIcon')
|
||||
this.getIconData('#icon1')
|
||||
if (this.isLogin) {
|
||||
this.fetchUnreadCount()
|
||||
}
|
||||
uni.$on('updateUnreadMessageCount', this.handleUpdateUnreadMessageCount)
|
||||
},
|
||||
beforeDestroy() {
|
||||
uni.$off('updateUnreadMessageCount', this.handleUpdateUnreadMessageCount)
|
||||
},
|
||||
methods: {
|
||||
handleUpdateUnreadMessageCount(count) {
|
||||
if (!this.isLogin) {
|
||||
this.unreadCount = 0
|
||||
return
|
||||
}
|
||||
if (typeof count === 'number') {
|
||||
this.unreadCount = count
|
||||
} else {
|
||||
this.fetchUnreadCount()
|
||||
}
|
||||
},
|
||||
getElementData(el) {
|
||||
const query = uni.createSelectorQuery().in(this)
|
||||
query.select(el).boundingClientRect().exec((res)=> {
|
||||
@@ -167,37 +117,10 @@ export default {
|
||||
}
|
||||
})
|
||||
},
|
||||
fetchUnreadCount() {
|
||||
uni.request({
|
||||
url: this.$SERVICE_API_URL + '/unread-num',
|
||||
method: 'POST',
|
||||
data: {
|
||||
uid: store.getters.userInfo.uid
|
||||
},
|
||||
success:(res)=>{
|
||||
if(res.data.status_code === 200) {
|
||||
const count = res.data.content || 0
|
||||
getUnreadMessageCount().then(res => {
|
||||
const { success, data } = res
|
||||
if (success) {
|
||||
const _count = data || 0
|
||||
this.unreadCount = count + _count
|
||||
uni.$emit('updateUnreadMessageCount', this.unreadCount)
|
||||
} else {
|
||||
this.unreadCount = 0
|
||||
uni.$emit('updateUnreadMessageCount', 0)
|
||||
}
|
||||
}).catch(() => {
|
||||
this.unreadCount = 0
|
||||
uni.$emit('updateUnreadMessageCount', 0)
|
||||
})
|
||||
} else {
|
||||
this.unreadCount = 0
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
},
|
||||
/**
|
||||
* 跳转至目标页面
|
||||
* type: 1-tabbar页面,2-非tabbar页面
|
||||
*/
|
||||
gotoPage(url, type = 1, index) {
|
||||
if (this.currIndex === index) return
|
||||
if (type === 1) {
|
||||
@@ -226,7 +149,7 @@ export default {
|
||||
background-repeat: no-repeat;
|
||||
.center-img {
|
||||
position: absolute;
|
||||
top: -20rpx;
|
||||
top: -16rpx;
|
||||
left: 50%;
|
||||
z-index: 5;
|
||||
transform: translateX(-50%);
|
||||
@@ -276,7 +199,6 @@ export default {
|
||||
}
|
||||
.item {
|
||||
width: 140rpx;
|
||||
position: relative;
|
||||
&.curr {
|
||||
.name {
|
||||
color: #C52733;
|
||||
@@ -289,21 +211,6 @@ export default {
|
||||
}
|
||||
}
|
||||
}
|
||||
.badge {
|
||||
position: absolute;
|
||||
top: -4rpx;
|
||||
right: 32rpx;
|
||||
min-width: 28rpx;
|
||||
padding: 0 6rpx;
|
||||
height: 28rpx;
|
||||
line-height: 28rpx;
|
||||
border-radius: 14rpx;
|
||||
background-color: #FF564A;
|
||||
color: #ffffff;
|
||||
font-size: 20rpx;
|
||||
text-align: center;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -257,7 +257,7 @@
|
||||
}
|
||||
.keyboard-item {
|
||||
box-sizing: border-box;
|
||||
width: 33.333%;
|
||||
width: 250rpx;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
|
||||
@@ -75,18 +75,6 @@ const force2Decimal = function change2Decimal(value) {
|
||||
return forceToDecimal(value, 2)
|
||||
}
|
||||
|
||||
const formatCount = function(value) {
|
||||
if (!value) return 0;
|
||||
const num = parseFloat(value);
|
||||
if (isNaN(num)) return 0;
|
||||
if (num >= 10000) {
|
||||
let val = num / 10000;
|
||||
val = parseFloat(val.toFixed(1));
|
||||
return val + '万';
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
const toast = (title = '', position = 'center', success = function() {}) => {
|
||||
uni.showToast({
|
||||
title,
|
||||
@@ -100,7 +88,6 @@ const toast = (title = '', position = 'center', success = function() {}) => {
|
||||
|
||||
Vue.prototype.$force2Decimal = force2Decimal
|
||||
Vue.prototype.$forceToDecimal = forceToDecimal
|
||||
Vue.prototype.$formatCount = formatCount
|
||||
|
||||
Vue.config.productionTip = false
|
||||
App.mpType = 'app'
|
||||
|
||||
+3
-10
@@ -5,7 +5,6 @@
|
||||
"versionName" : "4.0.0",
|
||||
"versionCode" : 4,
|
||||
"transformPx" : false,
|
||||
"sassImplementationName" : "node-sass",
|
||||
/* 5+App特有相关 */
|
||||
"app-plus" : {
|
||||
"usingComponents" : true,
|
||||
@@ -135,8 +134,7 @@
|
||||
"mp-weixin" : {
|
||||
"appid" : "wx9417047e1a0c340b",
|
||||
"setting" : {
|
||||
"urlCheck" : true,
|
||||
"minified" : true
|
||||
"urlCheck" : false
|
||||
},
|
||||
"usingComponents" : true,
|
||||
"permission" : {
|
||||
@@ -148,16 +146,11 @@
|
||||
"plugins" : {
|
||||
"live-player-plugin" : {
|
||||
"version" : "1.3.5",
|
||||
// 最新直播组件版本号
|
||||
//最新直播组件版本号
|
||||
"provider" : "wx2b03c6e691cd7370"
|
||||
},
|
||||
"WechatSI" : {
|
||||
"version" : "0.3.6",
|
||||
// TTS版本号
|
||||
"provider" : "wx069ba97219f66d99"
|
||||
}
|
||||
},
|
||||
// 直播appid
|
||||
//直播appid
|
||||
"optimization" : {
|
||||
"subPackages" : true
|
||||
}
|
||||
|
||||
+9
-26
@@ -14,7 +14,7 @@ export default {
|
||||
isOpen: false,
|
||||
attrTxt: '',
|
||||
attrValue: '',
|
||||
m_id: null,
|
||||
id: null,
|
||||
productValueArr: [],
|
||||
attr: {
|
||||
cartAttr: false,
|
||||
@@ -33,27 +33,12 @@ export default {
|
||||
unique: ''
|
||||
}
|
||||
},
|
||||
cart_num: 1,
|
||||
CartCount: 0,
|
||||
// 只有一个规格时直接加入购物车;AI聊天界面则不直接加入购物车,每次都要显示规格选择弹窗
|
||||
onlyOneToAddCart: true
|
||||
cart_num: 1
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// 获取购物车数量
|
||||
getCartCount () {
|
||||
const isLogin = this.isLogin
|
||||
if (isLogin) {
|
||||
getCartCount({
|
||||
numType: 0
|
||||
}).then(res => {
|
||||
this.CartCount = res.data.count
|
||||
this.$forceUpdate()
|
||||
})
|
||||
}
|
||||
},
|
||||
getSkuActiveStatus(selectedSku) {
|
||||
getProductSkuBySelected({ id: this.m_id, selectedSku }).then(res => {
|
||||
getProductSkuBySelected({ id: this.id, selectedSku }).then(res => {
|
||||
const { success, data } = res
|
||||
if (success) {
|
||||
for (const key in data) {
|
||||
@@ -77,7 +62,7 @@ export default {
|
||||
})
|
||||
},
|
||||
productCon() {
|
||||
getProductDetail(this.m_id).then(res => {
|
||||
getProductDetail(this.id).then(res => {
|
||||
const { data } = res
|
||||
this.storeInfo = {...data.storeInfo}
|
||||
if(data.storeInfo.stock === 0) {
|
||||
@@ -114,8 +99,8 @@ export default {
|
||||
// 是否单一规格
|
||||
const onlyOne = Object.keys(data.productValue).length === 1
|
||||
|
||||
if(onlyOne && this.onlyOneToAddCart) {
|
||||
this.handleOk(() => this.getCartCount())
|
||||
if(onlyOne) {
|
||||
this.handleOk()
|
||||
return
|
||||
}
|
||||
this.attr.cartAttr = !this.isOpen ? true : false
|
||||
@@ -237,7 +222,7 @@ export default {
|
||||
// 点击加入购物车按钮
|
||||
addToCart(item, id = 'id') {
|
||||
console.log(item, 'addToCart --------- item');
|
||||
this.m_id = item[id]
|
||||
this.id = item[id]
|
||||
|
||||
this.$nextTick(() => {
|
||||
this.productCon()
|
||||
@@ -248,7 +233,7 @@ export default {
|
||||
|
||||
|
||||
},
|
||||
handleOk(cb) {
|
||||
handleOk() {
|
||||
const productSelect = this.getAttrItemData(this.attrValue)
|
||||
// 如果有属性,没有选择,提示用户选择
|
||||
const hasNo = (this.attr.productAttr.length && productSelect === undefined && this.isOpen) || productSelect.stock === 0
|
||||
@@ -261,7 +246,7 @@ export default {
|
||||
return
|
||||
}
|
||||
const q = {
|
||||
productId: this.m_id,
|
||||
productId: this.id,
|
||||
cartNum: this.attr.productSelect.cart_num,
|
||||
new: 0,
|
||||
uniqueId: this.attr.productSelect !== undefined ? this.attr.productSelect.unique : ''
|
||||
@@ -276,11 +261,9 @@ export default {
|
||||
icon: "none",
|
||||
duration: 2000
|
||||
})
|
||||
cb && cb()
|
||||
})
|
||||
},
|
||||
ChangeCartNum(changeValue) {
|
||||
if(changeValue === 0) return
|
||||
// changeValue:是否 加|减
|
||||
// 获取当前变动属性
|
||||
const productSelect = this.getAttrItemData(this.attrValue)
|
||||
|
||||
+23
-34
@@ -1,45 +1,34 @@
|
||||
import { getWeixinShareConfig } from '@/api/public'
|
||||
export default{
|
||||
data(){
|
||||
return {
|
||||
//设置默认的分享参数
|
||||
sharePagePath: '/pages/home/index',
|
||||
//设置默认的分享参数
|
||||
share:{
|
||||
title: '云南香道滇官方商城',
|
||||
path: this.sharePagePath,
|
||||
imageUrl: this.$VUE_APP_RESOURCES_URL + '/20210617211221217375.jpg?' + new Date().getTime(),
|
||||
desc: '',
|
||||
content: ''
|
||||
title:'云南香道滇官方商城',
|
||||
path:'/pages/Loading/index',
|
||||
imageUrl:'http://admin-api.xdd618.com/file/pic/20210617211221217375.jpg',
|
||||
desc:'',
|
||||
content:''
|
||||
}
|
||||
}
|
||||
},
|
||||
onShareAppMessage(res) {
|
||||
uni.updateShareMenu({
|
||||
isPrivateMessage: false,
|
||||
withShareTicket: false
|
||||
})
|
||||
return new Promise(async (resolve, reject) => {
|
||||
const { success, data } = await getWeixinShareConfig()
|
||||
if (success) {
|
||||
resolve({
|
||||
title: data.title || this.share.title,
|
||||
path: data.url || this.share.path,
|
||||
imageUrl: data.image || this.share.imageUrl,
|
||||
desc: this.share.desc,
|
||||
content: this.share.content,
|
||||
success(res){
|
||||
uni.showToast({
|
||||
title:'分享成功'
|
||||
})
|
||||
},
|
||||
fail(res){
|
||||
uni.showToast({
|
||||
title:'分享失败',
|
||||
icon:'none'
|
||||
})
|
||||
}
|
||||
return {
|
||||
title:this.share.title,
|
||||
path:this.share.path,
|
||||
imageUrl:this.share.imageUrl,
|
||||
desc:this.share.desc,
|
||||
content:this.share.content,
|
||||
success(res){
|
||||
uni.showToast({
|
||||
title:'分享成功'
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
fail(res){
|
||||
uni.showToast({
|
||||
title:'分享失败',
|
||||
icon:'none'
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Generated
+1716
-1721
File diff suppressed because it is too large
Load Diff
@@ -79,7 +79,6 @@
|
||||
"miniapp-color-thief": "^1.0.5",
|
||||
"number-precision": "^1.5.2",
|
||||
"regenerator-runtime": "^0.12.1",
|
||||
"remove-markdown": "^0.6.2",
|
||||
"uview-ui": "2.0.36",
|
||||
"vconsole": "^3.14.6",
|
||||
"vue": "^2.6.11",
|
||||
|
||||
+87
-131
@@ -22,6 +22,12 @@
|
||||
"navigationBarTitleText": "登录"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/user/RetrievePassword/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "重置密码"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/home/index",
|
||||
"style": {
|
||||
@@ -45,7 +51,7 @@
|
||||
{
|
||||
"path": "pages/home/newZone",
|
||||
"style": {
|
||||
"navigationBarTitleText": "甄选好礼",
|
||||
"navigationBarTitleText": "新品专区",
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
},
|
||||
@@ -88,6 +94,12 @@
|
||||
"navigationBarTitleText": "搜索"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/NotDefined/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "404"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/cloud/haveFun",
|
||||
"style": {
|
||||
@@ -128,6 +140,18 @@
|
||||
"navigationBarTitleText": "商品评价"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/shop/GoodsPromotion/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "促销商品"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/shop/HotNewGoods/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "热门商品"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/shop/GoodsCon/index",
|
||||
"style": {
|
||||
@@ -161,6 +185,24 @@
|
||||
"navigationBarTitleText": "收货地址"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/user/promotion/Poster/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "推广名片"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/user/signIn/Sign/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "签到"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/user/signIn/SignRecord/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "签到记录"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/user/promotion/CashAudit/index",
|
||||
"style": {
|
||||
@@ -213,6 +255,12 @@
|
||||
"navigationBarTitleText": "我的积分"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/user/UserVip/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "用户vip"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/user/promotion/UserCash/index",
|
||||
"style": {
|
||||
@@ -235,8 +283,7 @@
|
||||
"path": "pages/order/MyOrder/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "我的订单",
|
||||
"navigationBarBackgroundColor": "#fff",
|
||||
"navigationStyle": "custom"
|
||||
"navigationBarBackgroundColor": "#fff"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -267,7 +314,7 @@
|
||||
{
|
||||
"path": "pages/order/GoodsReturn/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "申请退款"
|
||||
"navigationBarTitleText": "商品退货"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -296,6 +343,13 @@
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/user/MemberUpgradeIntro/MemberUpgradeIntro",
|
||||
"style": {
|
||||
"navigationBarTitleText": "升级说明",
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/VideoPlayBackList/VideoPlayBackList",
|
||||
"style": {
|
||||
@@ -310,6 +364,31 @@
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/user/UpgradeElectronicProtocol/UpgradeElectronicProtocol",
|
||||
"style": {
|
||||
"navigationBarTitleText": "升级",
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/user/UpgradeProtocolDetail/UpgradeProtocolDetail",
|
||||
"style": {
|
||||
"navigationBarTitleText": "共享股东协议"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/LiveAndShortVideo/LiveAndShortVideo",
|
||||
"style": {
|
||||
"navigationBarTitleText": "直播/视频"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/LiveBroadcastList/LiveBroadcastList",
|
||||
"style": {
|
||||
"navigationBarTitleText": "直播列表"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/user/UserFavorite/UserFavorite",
|
||||
"style": {
|
||||
@@ -368,8 +447,7 @@
|
||||
{
|
||||
"path": "inn/innInfoDetail",
|
||||
"style": {
|
||||
"navigationBarTitleText": "资讯详情",
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
"navigationBarTitleText": "资讯详情"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -430,13 +508,6 @@
|
||||
"navigationBarTitleText": "历史会话"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/message",
|
||||
"style": {
|
||||
"navigationBarTitleText": "互动消息",
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/xiaoZhi",
|
||||
"style": {
|
||||
@@ -471,20 +542,6 @@
|
||||
"style": {
|
||||
"navigationBarTitleText": "采购批发商入驻"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/travelResidence",
|
||||
"style": {
|
||||
"navigationBarTitleText": "旅居商家入驻",
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/experienceStore",
|
||||
"style": {
|
||||
"navigationBarTitleText": "体验店入驻",
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -540,7 +597,7 @@
|
||||
"path": "views/healthFoods",
|
||||
"style": {
|
||||
"navigationBarTitleText": "康养旅居",
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
"navigationBarBackgroundColor": "#FAEED8"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -633,12 +690,6 @@
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/newsInfo",
|
||||
"style": {
|
||||
"navigationBarTitleText": "资讯详情"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/famousQianxianTheme",
|
||||
"style": {
|
||||
@@ -660,28 +711,6 @@
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/oldSojumStore",
|
||||
"style": {
|
||||
"navigationBarTitleText": "",
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/housekeeperDetail",
|
||||
"style": {
|
||||
"navigationBarTitleText": "",
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/groupBuyDetails",
|
||||
"style": {
|
||||
"navigationBarTitleText": "团购详情",
|
||||
"navigationStyle": "custom",
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/famousQianxianInvestment",
|
||||
"style": {
|
||||
@@ -737,58 +766,6 @@
|
||||
"style": {
|
||||
"navigationBarTitleText": "时令尝鲜"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/experienceCoupon",
|
||||
"style": {
|
||||
"navigationBarTitleText": "体验券详情",
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/experienceCouponOrderDetail",
|
||||
"style": {
|
||||
"navigationBarTitleText": "订单核销",
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/experienceProjectDetail",
|
||||
|
||||
"style": {
|
||||
"navigationBarTitleText": "体验项目详情",
|
||||
"navigationBarBackgroundColor": "#FFFFFF",
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/storeLicense",
|
||||
"style": {
|
||||
"navigationBarTitleText": "营业执照",
|
||||
"navigationBarBackgroundColor": "#FFFFFF",
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/submitOrder",
|
||||
"style": {
|
||||
"navigationBarTitleText": "提交订单",
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/sojoumOrderDetails",
|
||||
"style": {
|
||||
"navigationBarTitleText": "订单详情",
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/sojoumOrderRefund",
|
||||
"style": {
|
||||
"navigationBarTitleText": "申请退款",
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -813,13 +790,6 @@
|
||||
"navigationBarTitleText": "好友赠送的礼包"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/gift/receiveDone",
|
||||
"style": {
|
||||
"navigationBarTitleText": "收礼完成",
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/myFavorite",
|
||||
"style": {
|
||||
@@ -885,7 +855,7 @@
|
||||
{
|
||||
"path": "views/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "云灵",
|
||||
"navigationBarTitleText": "云灵AI智能助手",
|
||||
"navigationStyle": "custom",
|
||||
"navigationBarTextStyle": "white"
|
||||
}
|
||||
@@ -893,24 +863,10 @@
|
||||
{
|
||||
"path": "views/history",
|
||||
"style": {
|
||||
"navigationBarTitleText": "云灵",
|
||||
"navigationBarTitleText": "云灵AI智能助手",
|
||||
"navigationStyle": "custom",
|
||||
"navigationBarTextStyle": "white"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/imageRecognition",
|
||||
"style": {
|
||||
"navigationBarTitleText": "拍照识图",
|
||||
"navigationStyle": "custom",
|
||||
"navigationBarTextStyle": "white"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "views/imageRecognitionResult",
|
||||
"style": {
|
||||
"navigationBarTitleText": "云灵"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
+9
-64
@@ -102,13 +102,10 @@
|
||||
<view class="v12-primary-border v12-radius-8 v12-px-1">{{ item.couponName }}</view>
|
||||
</view>
|
||||
<view class="v12-justify-between v12-align-center">
|
||||
<view class="v12-font-40 v12-font-bold v12-primary-text" v-if="!item.isNegotiable">
|
||||
<view class="v12-font-40 v12-font-bold v12-primary-text">
|
||||
<text class="">¥</text>
|
||||
<text class="price-txt price-red">{{ item.price }}</text>
|
||||
</view>
|
||||
<view v-if="item.isNegotiable === 1" class="v12-primary-text v12-font-32 v12-font-weight" @clicks.stop="goRoom(item)">
|
||||
价格面议
|
||||
</view>
|
||||
<view class="btn">
|
||||
<image
|
||||
:src="webUrl + '/home/icon-cart.png'"
|
||||
@@ -160,18 +157,11 @@
|
||||
>
|
||||
<view class="v12-align-center">
|
||||
<CheckboxIcon
|
||||
v-if="good['truePrice'] !== null || isEdit"
|
||||
:default-state="good['state']"
|
||||
:mark="[index, gIndex]"
|
||||
style="margin-right: 24rpx;"
|
||||
@change="onChange"
|
||||
/>
|
||||
<CheckboxIcon
|
||||
v-else
|
||||
:default-state="good['state']"
|
||||
:mark="[index, gIndex]"
|
||||
style="margin-right: 24rpx;"
|
||||
/>
|
||||
<image
|
||||
v-if="good['productInfo']['attrInfo']['image']"
|
||||
:src="good['productInfo']['attrInfo']['image']"
|
||||
@@ -234,7 +224,7 @@
|
||||
</view>
|
||||
</template>
|
||||
<template v-slot:input>
|
||||
<input type="number" class="num-input tc v12-num-input" v-model="good['cartNum']" @change="e => inputChangeHandle(index, gIndex, good, e)"/>
|
||||
<view class="num-input tc v12-num-input">{{ good['cartNum'] }}</view>
|
||||
</template>
|
||||
<template v-slot:plus>
|
||||
<view class="v12-plus-btn v12-font-bold flex jc-center ai-center v12-primary">
|
||||
@@ -440,7 +430,6 @@ export default {
|
||||
},
|
||||
onShow() {
|
||||
this.isEdit = false
|
||||
uni.$emit('updateUnreadMessageCount')
|
||||
if (!this.isLoad) {
|
||||
return
|
||||
}
|
||||
@@ -459,25 +448,6 @@ export default {
|
||||
this.pageToHideHandle()
|
||||
},
|
||||
methods: {
|
||||
goRoom(item) {
|
||||
return
|
||||
console.log(item);
|
||||
const params = {
|
||||
goodsId: item.id,
|
||||
goodsName: item.storeName,
|
||||
skuStr: '',
|
||||
price: item.price,
|
||||
seckillId: '',
|
||||
cover: item.image,
|
||||
goodsData: '',
|
||||
seckillData: '',
|
||||
isNegotiable: item.isNegotiable
|
||||
}
|
||||
const name = ''
|
||||
uni.navigateTo({
|
||||
url: `/pkg_common/views/room?id=${this.storeInfo.merId}&name=${name}¶ms=${JSON.stringify(params)}`
|
||||
})
|
||||
},
|
||||
toLoginHandle() {
|
||||
cookie.set('redirect', '/pages/cart')
|
||||
uni.reLaunch({
|
||||
@@ -592,7 +562,7 @@ export default {
|
||||
this.list = this.list.map(item => {
|
||||
item.state = state
|
||||
item.carts = item.carts.map(good => {
|
||||
good.state = item.isInvalid && !this.isEdit ? false : state
|
||||
good.state = state
|
||||
return good
|
||||
})
|
||||
return item
|
||||
@@ -642,32 +612,7 @@ export default {
|
||||
})
|
||||
this.isAll = shopCheckNumber === this.list.length
|
||||
},
|
||||
inputChangeHandle(index, gIndex, good, e) {
|
||||
|
||||
if(+good.cartNum > good['productInfo']['attrInfo']['stock']) {
|
||||
good.cartNum = good['productInfo']['attrInfo']['stock']
|
||||
}
|
||||
if(good.cartNum < 1) {
|
||||
good.cartNum = 1
|
||||
}
|
||||
const value = +good.cartNum
|
||||
console.log('index', value);
|
||||
const id = good.id
|
||||
// uni.showLoading()
|
||||
changeCartNum(id, value).then(res => {
|
||||
const { success } = res
|
||||
if (success) {
|
||||
// uni.hideLoading()
|
||||
this.$set(this.list[index].carts[gIndex], 'cartNum', value)
|
||||
}
|
||||
}).catch(() => {
|
||||
setTimeout(() => {
|
||||
uni.hideLoading()
|
||||
}, 3000)
|
||||
})
|
||||
},
|
||||
changeNumHandle(index, gIndex, good, e) {
|
||||
console.log(good);
|
||||
const { type } = e
|
||||
const value = good.cartNum + (type === 'plus' ? 1 : -1)
|
||||
console.log('index', value);
|
||||
@@ -905,8 +850,8 @@ export default {
|
||||
border-radius: 28rpx 0rpx 0rpx 28rpx;
|
||||
border: 1px solid #E6E6E6;
|
||||
background-color: rgba(208,208,208,0.39);
|
||||
height: 44rpx;
|
||||
width: 44rpx;
|
||||
height: 40rpx;
|
||||
width: 40rpx;
|
||||
padding: 0 20rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
@@ -914,8 +859,8 @@ export default {
|
||||
border-radius: 0rpx 28rpx 28rpx 0rpx;
|
||||
border: 1px solid #C52733;
|
||||
background-color: #C52733;
|
||||
height: 44rpx;
|
||||
width: 44rpx;
|
||||
height: 40rpx;
|
||||
width: 40rpx;
|
||||
padding: 0 20rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
@@ -1026,7 +971,7 @@ view {
|
||||
right: 0;
|
||||
margin: auto;
|
||||
border-radius: 26rpx;
|
||||
z-index: 9;
|
||||
|
||||
.btn-submit {
|
||||
width: 196rpx;
|
||||
height: 64rpx;
|
||||
@@ -1223,4 +1168,4 @@ view {
|
||||
background-color: #C52733;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
@@ -341,11 +341,10 @@ export default {
|
||||
},
|
||||
async getMapData() {
|
||||
const map = await getLocation()
|
||||
if (map.length > 1) {
|
||||
if (map) {
|
||||
const {latitude, longitude} = map[1]
|
||||
getCurAddress(latitude, longitude, address => {
|
||||
this.location = address.city
|
||||
})
|
||||
const address = await getCurAddress(latitude, longitude)
|
||||
this.location = address[1].data.result.ad_info.city
|
||||
}
|
||||
},
|
||||
init() {
|
||||
|
||||
+48
-11
@@ -74,7 +74,7 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getCurAddress, getLocation } from "@/utils/common"
|
||||
import config from '@/utils/mapConfig'
|
||||
import {
|
||||
getHotelTypeList,
|
||||
getHotelList
|
||||
@@ -124,19 +124,56 @@ export default {
|
||||
})
|
||||
},
|
||||
//获取当前定位地址
|
||||
async getCurAddressFn() {
|
||||
getCurAddress() {
|
||||
const that = this
|
||||
//定位
|
||||
uni.showLoading({
|
||||
title: '定位中...'
|
||||
})
|
||||
const map = await getLocation()
|
||||
if (map.length > 1) {
|
||||
const {latitude, longitude} = map[1]
|
||||
getCurAddress(latitude, longitude, address => {
|
||||
that.cityName = address.city
|
||||
that.paramCity = address.city
|
||||
})
|
||||
}
|
||||
uni.getLocation({
|
||||
type: 'wgs84',
|
||||
success: function(res) {
|
||||
let latitude = res.latitude
|
||||
let longitude = res.longitude
|
||||
// #ifdef H5
|
||||
Vue.jsonp(
|
||||
'https://apis.map.qq.com/ws/geocoder/v1/?location=' + latitude + ',' + longitude + '&key=' +
|
||||
config.key, {
|
||||
output: 'jsonp',
|
||||
}).then(json => {
|
||||
// Success.
|
||||
uni.hideLoading();
|
||||
that.cityName = json.result.ad_info.city
|
||||
that.paramCity = json.result.ad_info.city
|
||||
//定位成功刷新数据
|
||||
that.fetchList()
|
||||
}).catch(err => {
|
||||
uni.hideLoading()
|
||||
})
|
||||
// #endif
|
||||
|
||||
// #ifndef H5
|
||||
uni.request({
|
||||
url: 'https://apis.map.qq.com/ws/geocoder/v1/?location=' + latitude + ',' + longitude +
|
||||
'&key=' + config.key,
|
||||
success: function(res) {
|
||||
uni.hideLoading();
|
||||
|
||||
that.cityName = res.data.result.ad_info.city
|
||||
that.paramCity = res.data.result.ad_info.city
|
||||
//定位成功刷新数据
|
||||
that.fetchList()
|
||||
},
|
||||
fail: function(res) {
|
||||
uni.hideLoading()
|
||||
}
|
||||
})
|
||||
// #endif
|
||||
},
|
||||
fail: function(res) {
|
||||
uni.hideLoading()
|
||||
}
|
||||
})
|
||||
},
|
||||
fetchTypeList() {
|
||||
this.hotelList = []
|
||||
@@ -158,7 +195,7 @@ export default {
|
||||
this.fetchList()
|
||||
uni.removeStorageSync('cityName')
|
||||
} else {
|
||||
this.getCurAddressFn()
|
||||
this.getCurAddress()
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
+18
-74
@@ -76,7 +76,7 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="type-banner-wrap" v-if="typeIndex !== -1">
|
||||
<view class="type-banner-wrap">
|
||||
<view v-if="currType.titleImage" class="title">
|
||||
<image
|
||||
:src="currType.titleImage"
|
||||
@@ -84,7 +84,7 @@
|
||||
class="img"
|
||||
/>
|
||||
</view>
|
||||
<view v-if="hotelBanner.length" class="slider-wrap">
|
||||
<view v-if="currType.carousel" class="slider-wrap">
|
||||
<swiper
|
||||
indicatorDots="true"
|
||||
indicator-color="rgba(255, 255, 255, .3)"
|
||||
@@ -94,12 +94,12 @@
|
||||
style="height: 330rpx;"
|
||||
>
|
||||
<block
|
||||
v-for="(item, bannerIndex) in hotelBanner"
|
||||
v-for="(item, bannerIndex) in currType.carousel"
|
||||
:key="bannerIndex"
|
||||
>
|
||||
<swiper-item>
|
||||
<view class="swiper-item" @click="typeBannerItemClick(item)">
|
||||
<image :src="item.bannerImage" class="img" />
|
||||
<image :src="item.carouselImage" class="img" />
|
||||
</view>
|
||||
</swiper-item>
|
||||
</block>
|
||||
@@ -120,9 +120,9 @@
|
||||
</view>
|
||||
</view>
|
||||
<view class="body" v-else>
|
||||
<view class="v12-justify-between v12-align-center" v-if="hotelList.length > 0">
|
||||
<text class="v12-font-bold" v-if="hotelBanner.length">推荐</text>
|
||||
<view class="v12-dark1-text v12-font-28 v12-align-center refresh-btn" @click="handleRefresh">
|
||||
<view class="v12-justify-between v12-align-center">
|
||||
<text class="v12-font-bold" v-if="currType.carousel">推荐</text>
|
||||
<view class="v12-dark1-text v12-font-28 v12-align-center" @click="handleRefresh">
|
||||
<u-icon name="reload"></u-icon>
|
||||
换一换
|
||||
</view>
|
||||
@@ -163,28 +163,22 @@
|
||||
/>
|
||||
</view>
|
||||
<FunctionGuide @hide="setGuide('findFunIndex')" :maxStep="3" :guideData="functionGuideData" ref="FunctionGuide"></FunctionGuide>
|
||||
<AiEntrance
|
||||
:city-name="cityName"
|
||||
/>
|
||||
<xdd-tabbar :curr-index="4" />
|
||||
</view>
|
||||
</template>
|
||||
<script>
|
||||
import { getHotelList, getHotelTypeList, getAncientTownIcon, getAncientTownList, getHotelBanner } from "@/api/inn.js"
|
||||
import { fetchCity } from "@/api/wenwan"
|
||||
import { getHotelList, getHotelTypeList, getAncientTownIcon, getAncientTownList } from "@/api/inn.js"
|
||||
import { getCurAddress, getLocation } from "@/utils/common"
|
||||
import FunHotelItem from './components/HotelItem'
|
||||
import { pageListenMixins } from '@/mixins/pageListenMixins'
|
||||
import XddTabbar from '@/components/xdd-tabbar'
|
||||
import FunctionGuide from '@/components/FunctionGuide'
|
||||
import AiEntrance from '@/components/aiChat/entrance'
|
||||
import GuideMixins from '@/mixins/GuideMixins'
|
||||
export default {
|
||||
components: {
|
||||
FunHotelItem,
|
||||
XddTabbar,
|
||||
FunctionGuide,
|
||||
AiEntrance
|
||||
FunctionGuide
|
||||
},
|
||||
mixins: [pageListenMixins, GuideMixins],
|
||||
data() {
|
||||
@@ -203,10 +197,7 @@ export default {
|
||||
isNext: false,
|
||||
townConfig: {},
|
||||
townList: [],
|
||||
randomSeed: null,
|
||||
hotelBanner: [],
|
||||
goodCityId: '',
|
||||
cityOptions: []
|
||||
randomSeed: null
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -227,12 +218,8 @@ export default {
|
||||
this.fetchList(random, this.randomSeed)
|
||||
}
|
||||
},
|
||||
onLoad(options) {
|
||||
onLoad() {
|
||||
this.currType = {}
|
||||
if (options && options.city) {
|
||||
this.goodCityId = options.city
|
||||
}
|
||||
this.initGoodCity()
|
||||
getHotelTypeList().then(({data}) => {
|
||||
this.typeList = data
|
||||
this.currType = this.typeIndex === -1 ? {} : data[this.typeIndex]
|
||||
@@ -242,7 +229,6 @@ export default {
|
||||
this.queryGuide('findFunIndex')
|
||||
},
|
||||
onShow() {
|
||||
uni.$emit('updateUnreadMessageCount')
|
||||
const memCityName = uni.getStorageSync('cityName')
|
||||
// this.typeIndex = 0
|
||||
this.name = ''
|
||||
@@ -255,8 +241,7 @@ export default {
|
||||
watch: {
|
||||
cityName: {
|
||||
handler(value) {
|
||||
if (value) {
|
||||
this.updateGoodCityId()
|
||||
if(value) {
|
||||
this.search()
|
||||
}
|
||||
},
|
||||
@@ -455,27 +440,6 @@ export default {
|
||||
this.townConfig = res.data
|
||||
})
|
||||
},
|
||||
initGoodCity() {
|
||||
fetchCity(2).then(({ data }) => {
|
||||
const group = data && data.group ? data.group : []
|
||||
const list = []
|
||||
group.forEach(item => {
|
||||
if (item.city && item.city.length) {
|
||||
list.push(...item.city)
|
||||
}
|
||||
})
|
||||
this.cityOptions = list
|
||||
this.updateGoodCityId()
|
||||
})
|
||||
},
|
||||
updateGoodCityId() {
|
||||
if (!this.cityOptions.length || !this.cityName) return
|
||||
const found = this.cityOptions.find(item => item.cityName === this.cityName)
|
||||
if (found) {
|
||||
this.goodCityId = found.id || found.cityId || this.goodCityId
|
||||
this.fetchHotelBanner()
|
||||
}
|
||||
},
|
||||
goCity() {
|
||||
uni.navigateTo({
|
||||
url: `/pages/chose-city/chose-city?type=2&city=${this.cityName}`
|
||||
@@ -488,11 +452,13 @@ export default {
|
||||
},
|
||||
async getMapData() {
|
||||
const map = await getLocation()
|
||||
if (map.length > 1 && !this.cityName) {
|
||||
if (map.length > 1) {
|
||||
const {latitude, longitude} = map[1]
|
||||
getCurAddress(latitude, longitude, address => {
|
||||
this.cityName = address.city
|
||||
})
|
||||
const address = await getCurAddress(latitude, longitude)
|
||||
if(!this.cityName) {
|
||||
this.cityName = address[1].data.result.ad_info.city
|
||||
}
|
||||
// this.search()
|
||||
}
|
||||
},
|
||||
tapType(index) {
|
||||
@@ -562,24 +528,6 @@ export default {
|
||||
uni.hideLoading()
|
||||
})
|
||||
},
|
||||
fetchHotelBanner() {
|
||||
if (!this.goodCityId) {
|
||||
return
|
||||
}
|
||||
const params = {
|
||||
goodCityId: this.goodCityId
|
||||
}
|
||||
getHotelBanner(params).then(res => {
|
||||
const { success, data } = res
|
||||
if (success && data) {
|
||||
if (Array.isArray(data.hotelBanner)) {
|
||||
this.hotelBanner = data.hotelBanner
|
||||
} else if (Array.isArray(data)) {
|
||||
this.hotelBanner = data
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
typeBannerItemClick(item) {
|
||||
if (!item.hotelId) return
|
||||
uni.navigateTo({ url: `/pagesInn/inn/innHome?id=${item.hotelId}` })
|
||||
@@ -760,10 +708,6 @@ export default {
|
||||
background: #f5f5f5;
|
||||
}
|
||||
|
||||
.refresh-btn {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.city-box {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
:src="webUrl + '/20230803152147141807.png'"
|
||||
class="icon"
|
||||
/>
|
||||
<text class="seeNum-txt v12-font-28">{{ $formatCount(item.pv) }}</text>
|
||||
<text class="seeNum-txt v12-font-28">{{ item.pv }}</text>
|
||||
</view>
|
||||
<view class="flex">
|
||||
<image
|
||||
@@ -73,7 +73,7 @@
|
||||
v-show="item.zan > 0"
|
||||
:class="item.hasZan ? 'on' : ''"
|
||||
class="seeNum-txt v12-font-28 v12-ml-1"
|
||||
>{{ $formatCount(item.zan) }}</text
|
||||
>{{ item.zan }}</text
|
||||
>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
+21
-256
@@ -45,8 +45,6 @@
|
||||
autoplay
|
||||
circular
|
||||
style="height: 510rpx;"
|
||||
:duration="500"
|
||||
@animationfinish="bindSwiperInstance($event, 'banner')"
|
||||
>
|
||||
<block
|
||||
v-for="(item, bannerIndex) in banner"
|
||||
@@ -85,17 +83,6 @@
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
<view
|
||||
v-if="hasExperienceCoupon && experienceCouponImage"
|
||||
class="experience-coupon-banner"
|
||||
@click="goExperienceCoupon"
|
||||
>
|
||||
<image
|
||||
:src="experienceCouponImage"
|
||||
mode="widthFix"
|
||||
class="experience-coupon-img"
|
||||
/>
|
||||
</view>
|
||||
<!-- 千县名品和地标好物 -->
|
||||
<view
|
||||
v-if="landmarkGoodsImage.image || countyFamousImage.image"
|
||||
@@ -127,8 +114,6 @@
|
||||
circular
|
||||
autoplay
|
||||
:interval="3000"
|
||||
:duration="500"
|
||||
@animationfinish="bindSwiperInstance($event, 'homestay')"
|
||||
>
|
||||
<swiper-item
|
||||
v-for="(stay, stayIndex) in contentHomestay"
|
||||
@@ -198,24 +183,7 @@
|
||||
</swiper-item>
|
||||
</swiper> -->
|
||||
<view class="new-zone-wrap">
|
||||
<image @click="toNewZone" class="bg-img" :src="newZone.indexBackgroundImage" mode="aspectFit|aspectFill|widthFix" lazy-load="false"></image>
|
||||
<view class="swiper-wrap-zx v12-mt-2">
|
||||
<swiper :key="newZoneSwiperKey" :autoplay="swiperInstances.newZone" @change="changeIndex" :current="currentIndex" next-margin="40rpx" previous-margin="80rpx" circular style="width: 100%;height: 400rpx;" interval="3000" :duration="500" @animationfinish="bindSwiperInstance($event, 'newZone')">
|
||||
<swiper-item v-for="(item, index) in newZone.indexProducts" :key="index" class="s-item" :class="{'n-actived': currentIndex !== index}">
|
||||
<view class="zx-item" @click="toNewZone">
|
||||
<image :src="item.productImage" style="width: 192rpx; height: 192rpx; border-radius:10rpx"></image>
|
||||
<view class="v12-pa-2">
|
||||
<view class="v12-font-28 more-t v12-font-bold" style="text-align: center;">{{ item.productName }}</view>
|
||||
<view class="v12-primary-text v12-font-bold price-wrap" style="text-align: center;">
|
||||
<text class="v12-font-16">¥</text>
|
||||
<text class="v12-font-24">{{ item.productPrice }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</swiper-item>
|
||||
</swiper>
|
||||
</view>
|
||||
<!-- <view v-if="indexVideo" class="kd" id="xkd">
|
||||
<view v-if="indexVideo" class="kd" id="xkd">
|
||||
<view class="img-wrap" style="padding-top: 10rpx; box-sizing:border-box">
|
||||
<image style="width: 112rpx; height:26rpx" :src="webUrl + '/orderIcon/kd.png'" mode="heightFix|widthFix"></image>
|
||||
</view>
|
||||
@@ -247,7 +215,7 @@
|
||||
</swiper-item>
|
||||
</swiper>
|
||||
</view>
|
||||
</view> -->
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
@@ -316,8 +284,6 @@
|
||||
circular
|
||||
autoplay
|
||||
:interval="3000"
|
||||
:duration="500"
|
||||
@animationfinish="bindSwiperInstance($event, 'productSwiper')"
|
||||
>
|
||||
<swiper-item
|
||||
v-for="(swiperItem, swiperIndex) in item.list"
|
||||
@@ -346,7 +312,6 @@
|
||||
<!-- v9 老用户弹窗 -->
|
||||
|
||||
<u-popup
|
||||
v-if="isOldUserPopupShow"
|
||||
mode="center"
|
||||
bgColor="transparent"
|
||||
:show="isOldUser && oldUserPopup.image && lotteryCanDraw"
|
||||
@@ -388,9 +353,7 @@
|
||||
paddingBottom="200rpx"
|
||||
/>
|
||||
<FunctionGuide :maxStep="15" @hide="setGuide('index')" :guideData="functionGuideData" ref="FunctionGuide"></FunctionGuide>
|
||||
<AiEntrance
|
||||
:city-name="cityName"
|
||||
/>
|
||||
<AiEntrance />
|
||||
<xdd-tabbar :curr-index="0" @getElementData="elementData" @getIcon="getIcon"/>
|
||||
</view>
|
||||
</template>
|
||||
@@ -399,7 +362,7 @@
|
||||
import XddTabbar from '@/components/xdd-tabbar'
|
||||
import XddProductItem from '@/components/xdd-product-item'
|
||||
import { getCouponReceive } from '@/api/user'
|
||||
import { getHomeData } from '@/api/public'
|
||||
import { getHomeData, getShareImage } from '@/api/public'
|
||||
import { sharpBannar } from '@/api/goods'
|
||||
import { pageListenMixins } from '@/mixins/pageListenMixins'
|
||||
import ProductWindow from '@/components/ProductWindow'
|
||||
@@ -416,7 +379,6 @@ import {
|
||||
getLocationSetting,
|
||||
openLocationSettting
|
||||
} from "@/utils/common"
|
||||
import { getWeixinShareConfig } from '@/api/public'
|
||||
export default {
|
||||
name: 'IndexPage',
|
||||
components: {
|
||||
@@ -429,8 +391,6 @@ export default {
|
||||
mixins: [pageListenMixins, goCartMixin, GuideMixins],
|
||||
data() {
|
||||
return {
|
||||
isFirstLoad: true,
|
||||
isOldUserPopupShow: 0,
|
||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||
// 状态栏高度
|
||||
statusBarHeight: 20,
|
||||
@@ -451,10 +411,8 @@ export default {
|
||||
bastRightList: [],
|
||||
// 尖货推荐横幅
|
||||
bannerList: [],
|
||||
// 体验券
|
||||
hasExperienceCoupon: 0,
|
||||
hasUnusedExperienceCoupon: 0,
|
||||
experienceCouponImage: '',
|
||||
// 分享图片
|
||||
shareAppImg: '',
|
||||
// 老用户弹窗
|
||||
isOldUser: true,
|
||||
oldUserPopup: {},
|
||||
@@ -473,23 +431,10 @@ export default {
|
||||
tabIconPostion: {},
|
||||
messageIcon: {},
|
||||
recommendKeyword: [],
|
||||
keywordIndex: 0,
|
||||
shareData: {},
|
||||
currentIndex: 0,
|
||||
newZoneSwiperKey: 0,
|
||||
newZoneResumeTimer: null,
|
||||
// 轮播组件实例
|
||||
swiperInstances: {
|
||||
productSwiper: true,
|
||||
homestay: true,
|
||||
banner: true,
|
||||
festival: true,
|
||||
newZone: true,
|
||||
}
|
||||
keywordIndex: 0
|
||||
}
|
||||
},
|
||||
onLoad() {
|
||||
console.time()
|
||||
// uni.hideTabBar()
|
||||
const _this = this
|
||||
_this.init()
|
||||
@@ -507,89 +452,21 @@ export default {
|
||||
_this.statusBarHeight = statusBar
|
||||
}
|
||||
})
|
||||
getWeixinShareConfig().then(res => {
|
||||
const { success, data } = res
|
||||
if (success) {
|
||||
this.shareData = data
|
||||
}
|
||||
})
|
||||
},
|
||||
onShow() {
|
||||
this.pageToShowHandle()
|
||||
uni.$emit('updateUnreadMessageCount')
|
||||
if (!this.isFirstLoad) {
|
||||
this.refreshPageData()
|
||||
}
|
||||
this.isFirstLoad = false
|
||||
},
|
||||
onHide() {
|
||||
this.pageToHideHandle()
|
||||
},
|
||||
onShareAppMessage() {
|
||||
return {
|
||||
title: '探寻有趣有味的生活方式',
|
||||
path: '/pages/home/index',
|
||||
imageUrl: this.shareAppImg
|
||||
}
|
||||
},
|
||||
onPageScroll(e) {
|
||||
this.scrollTop = e.scrollTop
|
||||
},
|
||||
onShareTimeline() {
|
||||
uni.updateShareMenu({
|
||||
isPrivateMessage: false,
|
||||
withShareTicket: false
|
||||
})
|
||||
return {
|
||||
title: this.shareData.title || this.share.title,
|
||||
query: '',
|
||||
imageUrl: this.shareData.image || this.share.imageUrl
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
changeIndex(e) {
|
||||
this.currentIndex = e.detail.current
|
||||
},
|
||||
// 页面显示时恢复轮播
|
||||
pageToShowHandle() {
|
||||
// 恢复所有轮播组件的自动播放,甄选好礼轮播先停后启,避免 iOS 熄屏恢复后卡顿
|
||||
if (this.newZoneResumeTimer) {
|
||||
clearTimeout(this.newZoneResumeTimer)
|
||||
this.newZoneResumeTimer = null
|
||||
}
|
||||
this.swiperInstances = {
|
||||
productSwiper: true,
|
||||
homestay: true,
|
||||
banner: true,
|
||||
festival: true,
|
||||
newZone: false,
|
||||
}
|
||||
this.currentIndex = 0
|
||||
this.newZoneSwiperKey += 1
|
||||
this.$nextTick(() => {
|
||||
this.newZoneResumeTimer = setTimeout(() => {
|
||||
this.swiperInstances.newZone = true
|
||||
this.newZoneResumeTimer = null
|
||||
}, 120)
|
||||
})
|
||||
},
|
||||
// 页面隐藏时暂停轮播
|
||||
pageToHideHandle() {
|
||||
if (this.newZoneResumeTimer) {
|
||||
clearTimeout(this.newZoneResumeTimer)
|
||||
this.newZoneResumeTimer = null
|
||||
}
|
||||
this.swiperInstances = {
|
||||
productSwiper: false,
|
||||
homestay: false,
|
||||
banner: false,
|
||||
festival: false,
|
||||
newZone: false,
|
||||
}
|
||||
},
|
||||
// 绑定轮播组件实例
|
||||
bindSwiperInstance(e, key) {
|
||||
// this.swiperInstances[key] = e.detail
|
||||
},
|
||||
resetNewZoneCurrentIndex() {
|
||||
const products = (this.newZone && this.newZone.indexProducts) || []
|
||||
if (!products.length || this.currentIndex >= products.length) {
|
||||
this.currentIndex = 0
|
||||
}
|
||||
},
|
||||
changeRecommendKeyword(e) {
|
||||
this.keywordIndex = e
|
||||
},
|
||||
@@ -1426,16 +1303,8 @@ export default {
|
||||
toNewZone() {
|
||||
this.$yrouter.push('/pages/home/newZone')
|
||||
},
|
||||
goExperienceCoupon() {
|
||||
if (this.hasUnusedExperienceCoupon === 0) {
|
||||
uni.navigateTo({
|
||||
url: '/pages/order/MyOrder/index?type=3&tabIndex=1'
|
||||
})
|
||||
return
|
||||
}
|
||||
this.$yrouter.push('/pkg_product/views/experienceCoupon')
|
||||
},
|
||||
init() {
|
||||
getShareImage().then(({ data }) => this.shareAppImg = data)
|
||||
sharpBannar().then(res => {
|
||||
const { data } = res
|
||||
this.bannerList = data.banner || []
|
||||
@@ -1454,12 +1323,12 @@ export default {
|
||||
getLocationPromise().then(mapData => {
|
||||
if (mapData.errMsg) {
|
||||
const { latitude, longitude } = mapData
|
||||
getCurAddress(latitude, longitude, address => {
|
||||
console.log(address)
|
||||
this.cityName = address.city
|
||||
uni.setStorageSync('locationCityName', this.cityName)
|
||||
getCurAddress(latitude, longitude).then(address => {
|
||||
this.cityName = address[1].data.result.ad_info.city
|
||||
this.isLocating = false
|
||||
this.getPageData()
|
||||
}).catch(() => {
|
||||
this.getPageData()
|
||||
})
|
||||
} else {
|
||||
this.isLocating = false
|
||||
@@ -1483,11 +1352,6 @@ export default {
|
||||
_this.$set(_this, 'contentHomestay', data.contentHomestayV2 || [])
|
||||
_this.$set(_this, 'contentFestival', data.contentFestivalV2 || [])
|
||||
_this.$set(_this, 'newZone', data.newGoods || [])
|
||||
_this.resetNewZoneCurrentIndex()
|
||||
_this.$set(_this, 'hasExperienceCoupon', data.hasExperienceCoupon || 0)
|
||||
_this.$set(_this, 'hasUnusedExperienceCoupon', data.hasUnusedExperienceCoupon || 0)
|
||||
_this.$set(_this, 'experienceCouponImage', data.experienceCouponImage || '')
|
||||
_this.$set(_this, 'isOldUserPopupShow', data.isOldUserPopupShow || 0)
|
||||
_this.indexVideo = data.indexVideo ? data.indexVideo.videoUrl : ''
|
||||
_this.bastLeftList = []
|
||||
_this.bastRightList = []
|
||||
@@ -1516,63 +1380,12 @@ export default {
|
||||
}
|
||||
}
|
||||
}
|
||||
this.$nextTick(() => {
|
||||
console.timeEnd()
|
||||
})
|
||||
}
|
||||
uni.hideLoading()
|
||||
}).catch(() => {
|
||||
uni.hideLoading()
|
||||
})
|
||||
},
|
||||
refreshPageData() {
|
||||
getHomeData({ cityName: this.cityName }).then(res => {
|
||||
const { success, data } = res
|
||||
if (success && data) {
|
||||
this.$set(this, 'banner', data.banner || [])
|
||||
this.$set(this, 'menus', data.menus || [])
|
||||
this.$set(this, 'landmarkGoodsImage', data.landmarkGoodsImage || {})
|
||||
this.$set(this, 'countyFamousImage', data.countyFamousImage || {})
|
||||
this.$set(this, 'oldUserPopup', data.oldUserPopup || {})
|
||||
this.$set(this, 'contentHomestay', data.contentHomestayV2 || [])
|
||||
this.$set(this, 'contentFestival', data.contentFestivalV2 || [])
|
||||
this.$set(this, 'newZone', data.newGoods || [])
|
||||
this.resetNewZoneCurrentIndex()
|
||||
this.$set(this, 'hasExperienceCoupon', data.hasExperienceCoupon || 0)
|
||||
this.$set(this, 'hasUnusedExperienceCoupon', data.hasUnusedExperienceCoupon || 0)
|
||||
this.$set(this, 'experienceCouponImage', data.experienceCouponImage || '')
|
||||
this.$set(this, 'isOldUserPopupShow', data.isOldUserPopupShow || 0)
|
||||
this.indexVideo = data.indexVideo ? data.indexVideo.videoUrl : ''
|
||||
this.lotteryCanDraw = data.lotteryCanDraw || false
|
||||
if (data.bastList) {
|
||||
const newBastLeftList = []
|
||||
const newBastRightList = []
|
||||
for (let i = 0; i < data.bastList.length; i++) {
|
||||
if (i % 2 === 0) {
|
||||
if (i === 4 && data.hotelList.length > 0) {
|
||||
newBastLeftList.push({
|
||||
type: 'hotel',
|
||||
list: data.hotelList
|
||||
})
|
||||
}
|
||||
newBastLeftList.push(data.bastList[i])
|
||||
}
|
||||
if (i % 2 === 1) {
|
||||
if (i === 3 && data.contentBest.length > 0) {
|
||||
newBastRightList.push({
|
||||
type: 'swiper',
|
||||
list: data.contentBest
|
||||
})
|
||||
}
|
||||
newBastRightList.push(data.bastList[i])
|
||||
}
|
||||
}
|
||||
this.bastLeftList = newBastLeftList
|
||||
this.bastRightList = newBastRightList
|
||||
}
|
||||
}
|
||||
}).catch(() => {})
|
||||
},
|
||||
goRoll(item) {
|
||||
if (item.uniapp_url) {
|
||||
this.$yrouter.push(item.uniapp_url)
|
||||
@@ -1675,16 +1488,10 @@ export default {
|
||||
success: () => {
|
||||
}
|
||||
})
|
||||
} else {
|
||||
uni.showToast({
|
||||
title: res.msg + '',
|
||||
icon: 'none',
|
||||
duration: 3000
|
||||
})
|
||||
}
|
||||
}).catch((err) => {
|
||||
uni.showToast({
|
||||
title: err.msg + '',
|
||||
title: err.data.msg + '',
|
||||
icon: 'none',
|
||||
duration: 3000
|
||||
})
|
||||
@@ -1725,30 +1532,6 @@ export default {
|
||||
</script>
|
||||
|
||||
<style scoped lang="less">
|
||||
.n-actived{
|
||||
// bottom: 20rpx !important;
|
||||
.zx-item {
|
||||
transform: scale(0.8);
|
||||
}
|
||||
}
|
||||
.s-item{
|
||||
height: fit-content !important;
|
||||
bottom: 10rpx;
|
||||
}
|
||||
.zx-item{
|
||||
width: 192rpx;
|
||||
background: #fff;
|
||||
border-radius: 16rpx;
|
||||
transition: all 0.3s ease-in-out;
|
||||
}
|
||||
.swiper-wrap-zx{
|
||||
position: absolute;
|
||||
bottom: 20rpx;
|
||||
z-index: 2;
|
||||
/* height: 50%; */
|
||||
width: 100%;
|
||||
left: 0;
|
||||
}
|
||||
.swiper-item {
|
||||
height: 100%;
|
||||
}
|
||||
@@ -1911,16 +1694,6 @@ export default {
|
||||
}
|
||||
}
|
||||
}
|
||||
.experience-coupon-banner {
|
||||
position: relative;
|
||||
z-index: 5;
|
||||
padding-top: 16rpx;
|
||||
.experience-coupon-img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
border-radius: 20rpx;
|
||||
}
|
||||
}
|
||||
.hotel-list-wrap {
|
||||
position: relative;
|
||||
width: 344rpx;
|
||||
@@ -2042,14 +1815,6 @@ export default {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
position: relative;
|
||||
.bg-img{
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
.kd{
|
||||
width: 100%;
|
||||
height: 266rpx;
|
||||
@@ -2122,4 +1887,4 @@ export default {
|
||||
.price-wrap{
|
||||
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
+9
-97
@@ -11,7 +11,7 @@
|
||||
</swiper-item>
|
||||
</swiper> -->
|
||||
<view class="swiper-wrap">
|
||||
<swiper @change="handleChange" style="height: 100%;" autoplay circular next-margin="460rpx" interval="4000">
|
||||
<swiper @change="handleChange" style="height: 100%;" autoplay circular next-margin="460rpx" interval="4000">
|
||||
<swiper-item v-for="(item, index) in details.newProducts" :key="index" @click="toGoods(item)">
|
||||
<view class="new-card" :class="{'is-actived': current == index}">
|
||||
<image :src="item.productCover" class="new-card-img" mode="heightFix|widthFix"></image>
|
||||
@@ -29,39 +29,8 @@
|
||||
</swiper>
|
||||
</view>
|
||||
</view>
|
||||
<view class="v12-align-center tabs-wrap v1-py-1 v12-my-4">
|
||||
<view class="tab-item v12-font-bold" v-for="(tab, index) in tabs" :key="index" @click="handleClick(index, tab)">
|
||||
{{ tab.cateName }}
|
||||
<view class="tab-line" v-if="activeIndex == index"></view>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
<view class="product-wrap v12-mt-3">
|
||||
<view class="product-card" v-for="(item, index) in products" :key="index" @click="toGoods(item)">
|
||||
<image :src="item.productImage" class="product-card-img" mode="heightFix|widthFix"></image>
|
||||
<view class="new-info">
|
||||
<view class="v12-font-26 more-t" style="width: 100%;">{{ item.productName }}</view>
|
||||
<view style="width: 100%;" class="v12-font-bold v12-primary-text v12-align-center v12-justify-between">
|
||||
<view>
|
||||
<text>¥</text>
|
||||
<text class=" v12-font-36">{{ item.productPrice }}</text>
|
||||
</view>
|
||||
<view @click.stop="addToCart(item, 'productId')">
|
||||
<u-icon :name="webUrl + '/home/icon-cart.png'" size="24"></u-icon>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<ProductWindow
|
||||
ref="attrWindow"
|
||||
:attr="attr"
|
||||
:cartNum="cart_num"
|
||||
:showOk="true"
|
||||
@changeFun="changeFun"
|
||||
@ok="handleOk(() => this.getCartCount())"
|
||||
/>
|
||||
<!-- <view class="v12-mt-2 v12-align-center">
|
||||
|
||||
<view class="v12-mt-2 v12-align-center">
|
||||
<view class="primary-title" v-if="details.contentTitle">
|
||||
{{ details.contentTitle }}
|
||||
<view class="title-line"></view>
|
||||
@@ -73,47 +42,30 @@
|
||||
</view>
|
||||
<view class="cover-img v12-mt-2" v-for="(item, index) in details.contents" :key="index" @click="toGoods(item)">
|
||||
<image :src="item.contentImage" class="cover-img" mode="heightFix|widthFix"></image>
|
||||
</view> -->
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
<script>
|
||||
import { queryNewZone } from '@/api/activity'
|
||||
import ProductWindow from '@/components/ProductWindow'
|
||||
import goCartMixin from '@/mixins/goCartMixins'
|
||||
import { mapGetters } from 'vuex'
|
||||
export default{
|
||||
components: {
|
||||
ProductWindow
|
||||
},
|
||||
mixins: [goCartMixin],
|
||||
data() {
|
||||
return {
|
||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||
details: {},
|
||||
current: 0,
|
||||
tabs: [],
|
||||
activeIndex: 0,
|
||||
products: []
|
||||
}
|
||||
},
|
||||
onLoad() {
|
||||
queryNewZone().then(res => {
|
||||
this.details = res.data
|
||||
this.tabs = res.data.categories
|
||||
this.handleClick(0, this.tabs[0])
|
||||
})
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(['isLogin', 'location', 'userInfo']),
|
||||
bannerImage() {
|
||||
return this.details.newProducts && this.details.newProducts[this.current] && this.details.newProducts[this.current].bannerImage
|
||||
}
|
||||
|
||||
},
|
||||
methods: {
|
||||
handleClick(index, tab) {
|
||||
this.activeIndex = index
|
||||
this.products = tab.products
|
||||
},
|
||||
handleChange(e) {
|
||||
this.current = e.detail.current
|
||||
},
|
||||
@@ -126,50 +78,10 @@ export default{
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.product-card{
|
||||
width: 342rpx;
|
||||
height: 520rpx;
|
||||
background: #fff;
|
||||
border-radius: 20rpx;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
.product-card-img{
|
||||
width: 344rpx;
|
||||
height: 344rpx;
|
||||
background: rgba(169,56,56,0.39);
|
||||
border-radius: 20rpx;
|
||||
}
|
||||
.product-wrap{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.tab-line{
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 6rpx;
|
||||
background: linear-gradient(to right, #C52733 0%, rgba(202,56,67,0.92) 51%, rgba(255,255,255,0) 100%);
|
||||
border-radius: 6rpx;
|
||||
}
|
||||
.tabs-wrap{
|
||||
overflow: auto;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.tab-item{
|
||||
margin-right: 20rpx;
|
||||
white-space: nowrap;
|
||||
position: relative;
|
||||
&:last-child{
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
.new-info{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
padding: 20rpx;
|
||||
}
|
||||
.box-emp{
|
||||
width: 100%;
|
||||
@@ -180,7 +92,7 @@ export default{
|
||||
width: fit-content;
|
||||
color: #fff;
|
||||
background: #C52733;
|
||||
font-size: 30rpx;
|
||||
font-size: 28rpx;
|
||||
padding: 4rpx 20rpx;
|
||||
}
|
||||
.swiper-wrap{
|
||||
@@ -192,7 +104,7 @@ export default{
|
||||
}
|
||||
.new-card{
|
||||
width: 220rpx;
|
||||
// height: 240rpx;
|
||||
height: 240rpx;
|
||||
background: #fff;
|
||||
border-radius: 20rpx;
|
||||
position: absolute;
|
||||
@@ -248,7 +160,7 @@ export default{
|
||||
}
|
||||
.new-zone-page{
|
||||
min-height: 100vh;
|
||||
// background-color: #fff;
|
||||
background-color: #fff;
|
||||
padding: 20rpx;
|
||||
}
|
||||
.banner-zone{
|
||||
@@ -257,4 +169,4 @@ export default{
|
||||
border-radius: 20rpx !important;
|
||||
position: relative !important;
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
@@ -2,12 +2,11 @@
|
||||
<view class="apply-return">
|
||||
<view class="goodsStyle acea-row row-between" v-for="cart in orderInfo.cartInfo" :key="cart.id">
|
||||
<view class="pictrue">
|
||||
<image v-if="orderInfo.isGiftCardReceiveBlind === 0" :src="cart.productInfo.image" class="image" />
|
||||
<image v-else class="image" :src="webUrl+'/orderIcon/盲盒礼包.png'"></image>
|
||||
<image :src="cart.productInfo.image" class="image" />
|
||||
</view>
|
||||
<view class="text acea-row row-between" >
|
||||
<view class="name line2">{{ orderInfo.isGiftCardReceiveBlind === 0 ? cart.productInfo.storeName : '盲盒礼包' }}</view>
|
||||
<view class="money" v-if="orderInfo.isGiftCardReceiveBlind === 0">
|
||||
<view class="text acea-row row-between">
|
||||
<view class="name line2">{{ cart.productInfo.storeName }}</view>
|
||||
<view class="money">
|
||||
<view>
|
||||
¥{{
|
||||
cart.productInfo.attrInfo
|
||||
@@ -24,7 +23,7 @@
|
||||
<view>退货件数</view>
|
||||
<view class="num">{{ orderInfo.totalNum }}</view>
|
||||
</view>
|
||||
<view class="item acea-row row-between-wrapper" v-if="orderInfo.isGiftCardReceiveBlind === 0">
|
||||
<view class="item acea-row row-between-wrapper">
|
||||
<view>退款金额</view>
|
||||
<view class="num">¥{{ orderInfo.payPrice }}</view>
|
||||
</view>
|
||||
@@ -66,7 +65,6 @@ export default {
|
||||
mixins: [pageListenMixins],
|
||||
data() {
|
||||
return {
|
||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||
url: `${VUE_APP_API_URL}/upload/image`,
|
||||
headers: {
|
||||
Authorization: "Bearer " + this.$store.state.token
|
||||
|
||||
+226
-971
File diff suppressed because it is too large
Load Diff
+102
-348
@@ -1,33 +1,16 @@
|
||||
<template>
|
||||
<view class="order-details" style="padding: 30rpx;" @click="handleBody" v-if="!loading && orderInfo.isTickets !== undefined">
|
||||
<view class="order-details" style="padding: 30rpx;" @click="handleBody">
|
||||
<!-- 给header上与data上加on为退款订单-->
|
||||
<view class=" v12-pa-3 v12-white" :class="refundOrder ? 'on' : ''" style="border-radius: 20rpx;" v-if="!isGift">
|
||||
<view class=" v12-pa-3 v12-white" :class="refundOrder ? 'on' : ''" style="border-radius: 20rpx;">
|
||||
<!-- <view class="status-img-box">
|
||||
<image class="status-img" :src="getStatusImg(orderInfo)" mode=""></image>
|
||||
</view> -->
|
||||
<view :class="refundOrder ? 'on' : ''">
|
||||
<view
|
||||
v-if="isGroup && orderInfo._status._type === 2"
|
||||
class="state v12-primary-text v12-font-32 v12-font-bold"
|
||||
>待使用</view>
|
||||
<view
|
||||
v-else-if="orderInfo.isTickets === 1 && orderInfo._status._type === 2"
|
||||
class="state v12-primary-text v12-font-32 v12-font-bold"
|
||||
>待核销</view>
|
||||
<view
|
||||
v-else
|
||||
class="state v12-primary-text v12-font-32 v12-font-bold"
|
||||
>{{ getStatus(orderInfo) }}</view>
|
||||
<view v-if="isGroup && orderInfo._status._type === 2" class="v12-mt-2 v12-font-24 v12-secondary-dark-text">
|
||||
您已下单成功,请联系商家确认具体的入住时间
|
||||
</view>
|
||||
<view
|
||||
v-if="getStatus(orderInfo)!=='待付款'"
|
||||
:class="{'fails-bg': orderInfo._status._type === -3}"
|
||||
class="v12-mt-2 v12-font-24 v12-secondary-dark-text"
|
||||
>
|
||||
<view class="state v12-primary-text v12-font-32 v12-font-bold" v-if="orderInfo.isTickets===1 && orderInfo._status._type == 2">待核销</view>
|
||||
<view class="state v12-primary-text v12-font-32 v12-font-bold" v-else>{{ getStatus(orderInfo) }}</view>
|
||||
<view v-if="getStatus(orderInfo)!=='待付款'" class="v12-mt-2 v12-font-24 v12-secondary-dark-text" :class="{'fails-bg': orderInfo._status._type == -3}">
|
||||
<view>{{ orderInfo._status._msg }}</view>
|
||||
<view v-if="orderInfo._status._type === -3">驳回原因: {{ orderInfo.refundRejectReason }}</view>
|
||||
<view v-if="orderInfo._status._type == -3">驳回原因: {{ orderInfo.refundRejectReason }}</view>
|
||||
</view>
|
||||
<view class="pending-payments flex ai-center v12-mt-2 v12-font-24 v12-secondary-dark-text" v-else>
|
||||
<text>需支付{{ orderInfo.payPrice }}元,</text>
|
||||
@@ -35,73 +18,20 @@
|
||||
剩余<u-count-down format="HH:mm:ss" autoStart :time="$global.diffSSS(orderInfo.paymentTimeout)" />订单将自动取消
|
||||
</view>
|
||||
<u-divider></u-divider>
|
||||
<template v-if="Number(orderInfo.isAddressUpdate) === 1 && Number(orderInfo.addressUpdateStatus) === 0 && !isrefund">
|
||||
<div class="name v12-mb-3 v12-font-28 v12-font-bold flex ai-center">
|
||||
<text class="v12-mr-3"> {{ orderInfo.oldRealName }}</text>
|
||||
<text class="phone">{{ orderInfo.oldUserPhone }}</text>
|
||||
<text class="v12-font-22 v12-px-2 v12-ml-2 v12-primary-text v12-primary-border" style="border-radius: 8rpx; padding: 2rpx 10rpx;">原地址</text>
|
||||
</div>
|
||||
<div class="v12-font-28 v12-secondary-dark-text v12-justify-between">
|
||||
<text class=" more-t" style="flex: 2;">{{ orderInfo.oldUserAddress }}</text>
|
||||
</div>
|
||||
|
||||
<div class="name v12-mb-3 v12-mt-4 v12-font-28 v12-font-bold flex ai-center">
|
||||
<text class="v12-mr-3"> {{ orderInfo.realName }}</text>
|
||||
<text class="phone">{{ orderInfo.userPhone }}</text>
|
||||
<text class="v12-font-22 v12-px-2 v12-ml-2 v12-primary-text v12-primary-border" style="border-radius: 8rpx; padding: 2rpx 10rpx;">新地址</text>
|
||||
</div>
|
||||
<div class="v12-font-28 v12-secondary-dark-text v12-justify-between">
|
||||
<text class=" more-t" style="flex: 2;">{{ orderInfo.userAddress }}</text>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else-if="Number(orderInfo.isAddressUpdate) === 1 && Number(orderInfo.addressUpdateStatus) === 2 && isrefund">
|
||||
<div class="name v12-mb-3 v12-font-28 v12-font-bold flex ai-center">
|
||||
<text class="v12-mr-3"> {{ orderInfo.oldRealName }}</text>
|
||||
<text class="phone">{{ orderInfo.oldUserPhone }}</text>
|
||||
</div>
|
||||
<div class="v12-font-28 v12-secondary-dark-text v12-justify-between">
|
||||
<text class=" more-t" style="flex: 2;">{{ orderInfo.oldUserAddress }}</text>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div class="name v12-mb-3 v12-font-28 v12-font-bold">
|
||||
<text class="v12-mr-3"> {{ orderInfo.realName }}</text>
|
||||
<text class="phone">{{ orderInfo.userPhone }}</text>
|
||||
</div>
|
||||
<div class="v12-font-28 v12-secondary-dark-text v12-justify-between">
|
||||
<text class=" more-t" style="flex: 2;">{{ orderInfo.userAddress }}</text>
|
||||
<view v-if="canShowModifyAddress(orderInfo)" @click="goAddress" class="v12-btn cancel v12-dark-text v12-dark-border v12-radius-40" >修改地址</view>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<view
|
||||
v-if="!isrefund && Number(orderInfo.isAddressUpdate) === 1 && [0, 2].includes(Number(orderInfo.addressUpdateStatus))"
|
||||
class="v12-mt-3"
|
||||
>
|
||||
<view
|
||||
v-if="Number(orderInfo.addressUpdateStatus) === 0"
|
||||
class="v12-font-24 v12-primary-text"
|
||||
style="background: rgba(246,246,246,0.7); border-radius: 40rpx; padding: 12rpx;"
|
||||
>修改地址正在审核中,请耐心等待</view>
|
||||
<view
|
||||
v-if="Number(orderInfo.addressUpdateStatus) === 2"
|
||||
class="v12-font-24 v12-primary-text"
|
||||
style="background: rgba(246,246,246,0.7); border-radius: 40rpx; padding: 12rpx;"
|
||||
>修改地址审核未通过,商家将按原地址发货,<text v-if="orderInfo.isFastPost !== 0">预计{{ getTime(orderInfo.isFastPost) }}发货</text>
|
||||
(驳回原因:{{ orderInfo.addressUpdateReason }})</view>
|
||||
</view>
|
||||
<div class="name v12-mb-3 v12-font-28 v12-font-bold">
|
||||
<text class="v12-mr-3"> {{ orderInfo.realName }}</text>
|
||||
<text class="phone">{{ orderInfo.userPhone }}</text>
|
||||
</div>
|
||||
<div class="v12-font-28 v12-secondary-dark-text v12-justify-between">
|
||||
<text class=" more-t" style="flex: 2;">{{ orderInfo.userAddress }}</text>
|
||||
<view v-if="getStatus(orderInfo) === '待付款'" @click="goAddress" class="v12-btn cancel v12-dark-text v12-dark-border v12-radius-40" >修改地址</view>
|
||||
</div>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="orderInfo.deliveryId !== null && ([-1, -2, 3, 4].includes(orderInfo._status._type) || (orderInfo._status._type == 2 && orderInfo.isTickets !== 1))">
|
||||
<view
|
||||
v-for="(delivery, index) in orderInfo.deliveryInfo"
|
||||
:key="index"
|
||||
:class="{
|
||||
'order-deliver-item-show': index < 2 || showMoreDeliver
|
||||
}"
|
||||
class="v12-radius-20 v12-white v12-pa-3 v12-mt-4"
|
||||
>
|
||||
<view class="v12-align-center">
|
||||
<!-- <view class="reject-reason" v-if="orderInfo._status._type==-3 && orderInfo.refundRejectReason">驳回原因:{{ orderInfo.refundRejectReason }}</view> -->
|
||||
<view v-if="orderInfo.deliveryId !== null && (orderInfo._status._type == -1 || orderInfo._status._type == -2 || orderInfo._status._type == 4 || orderInfo._status._type == 3 || (orderInfo._status._type == 2 && orderInfo.isTickets!==1))">
|
||||
<view v-if="index < 2 || showMoreDeliver" v-for="(delivery, index) in orderInfo.deliveryInfo" :key="index" class="v12-radius-20 v12-white v12-pa-3 v12-mt-4">
|
||||
<view>
|
||||
<text class="v12-secondary-dark-text v12-font-28">{{ delivery.deliveryName }}:{{ delivery.deliveryId }}</text>
|
||||
<text class="v12-font-22 v12-px-2 v12-py-1 v12-ml-1 v12-primary-text v12-primary-border v12-radius-40" @click="copyClipboard(delivery.deliveryId)">
|
||||
复制
|
||||
@@ -118,18 +48,8 @@
|
||||
<uni-icons type="right" size="20" color="#707070"></uni-icons>
|
||||
</view>
|
||||
</view>
|
||||
<view class="v12-mt-2 time-wrap">
|
||||
<view class="v12-mt-2">
|
||||
<text class="v12-dark-text v12-font-24">{{ logistics[index] && logistics[index].Traces && logistics[index].Traces.length > 0 ? logistics[index] && logistics[index].Traces[logistics[index].Traces.length - 1].acceptTime : '' }}</text>
|
||||
<view
|
||||
v-if="delivery.estimatedTime"
|
||||
:style="{
|
||||
color: '#297EE0;',
|
||||
}"
|
||||
class="v12-font-26 time-box"
|
||||
>
|
||||
<image :src="webUrl+'/orderIcon/787.png'" class="time-bg"></image>
|
||||
{{ delivery.estimatedTime }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="v12-justify-center v12-mt-3" v-if="orderInfo.deliveryInfo.length > 2">
|
||||
@@ -137,23 +57,12 @@
|
||||
</view>
|
||||
</view>
|
||||
<template v-if="!refundOrder">
|
||||
<view
|
||||
v-if="orderInfo.isTickets === 1 && orderInfo._status._type === 2"
|
||||
class="code-box flex jc-center ai-center"
|
||||
>
|
||||
<view v-if="isGroup && orderInfo.verifyCode" class="v12-primary-text v12-font-28 v12-mb-2">核销码:{{ orderInfo.verifyCode }}</view>
|
||||
<view class="code-box flex jc-center ai-center" v-if="orderInfo.isTickets===1 && orderInfo._status._type==2">
|
||||
<image class="code-img" :src="orderInfo.code"/>
|
||||
<view class="v12-justify-center v12-align-center v12-mt-2" v-if="isGroup">
|
||||
<view class="bnt v12-dark-text v12-dark-border cancel v12-mx-1" @click="call(system_store.phone)">商家电话</view>
|
||||
<view class="bnt v12-dark-text v12-dark-border cancel v12-mx-1" @click="showMerchantWechat">商家微信</view>
|
||||
</view>
|
||||
</view>
|
||||
<template v-else>
|
||||
<div
|
||||
v-if="orderInfo.shippingType === 2 && orderInfo.paid === 1"
|
||||
class="writeOff"
|
||||
style="margin-top: 30rpx;border-radius: 24rpx;"
|
||||
>
|
||||
<div class="writeOff" v-if="orderInfo.shippingType === 2 && orderInfo.paid === 1"
|
||||
style="margin-top: 30rpx;border-radius: 24rpx;">
|
||||
<div class="title">核销信息</div>
|
||||
<div class="grayBg">
|
||||
<div class="pictrue">
|
||||
@@ -202,8 +111,8 @@
|
||||
|
||||
<view style="margin-top: 30rpx;border-radius:20rpx;overflow: hidden;" class="v12-white">
|
||||
<!-- <OrderGoods :evaluate="status.type || 0" :cartInfo="orderInfo.cartInfo || []" title="商品信息"></OrderGoods> -->
|
||||
<view class="v12-radius-20 v12-pa-3" v-for="(cart, d) in orderInfo.cartInfo" :key="d" @click="goGoodsCon(cart, orderInfo.isGiftCardReceiveBlind)">
|
||||
<view class="v12-justify-between" v-if="orderInfo.isGiftCardReceiveBlind === 0">
|
||||
<view class="v12-radius-20 v12-pa-3" v-for="(cart, d) in orderInfo.cartInfo" :key="d" @click="goGoodsCon(cart)">
|
||||
<view class="v12-justify-between">
|
||||
<view class="">
|
||||
<image style="width: 120rpx; height: 120rpx" class="v12-radius-8" :src="cart.productInfo.image"></image>
|
||||
</view>
|
||||
@@ -227,21 +136,8 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="v12-justify-between" v-else>
|
||||
<view class="">
|
||||
<image style="width: 120rpx; height: 120rpx" class="v12-radius-8" :src="webUrl+'/orderIcon/盲盒礼包.png'"></image>
|
||||
</view>
|
||||
<view class="v12-justify-between v12-flex-column v12-ml-2 v12-py-2" style="flex: 2">
|
||||
<view class="v12-font-28 v12-dark-text v12-font-bold more-t">
|
||||
盲盒礼物
|
||||
</view>
|
||||
<view class="more-t v12-secondary-dark-text v12-font-24">
|
||||
待收货后展示商品信息
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="" v-if="orderInfo.cartInfo &&( d === orderInfo.cartInfo.length - 1)">
|
||||
<view class="v12-justify-between v12-align-center v12-mt-3 v12-dark-text" v-if="orderInfo.isGiftCardReceiveBlind === 0">
|
||||
<view class="v12-justify-between v12-mt-3 v12-dark-text">
|
||||
<view class="v12-font-24 v12-dark-text">
|
||||
商品总价
|
||||
</view>
|
||||
@@ -252,7 +148,7 @@
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="v12-justify-between v12-align-center v12-mt-3" v-if="orderInfo.payPostage > 0">
|
||||
<view class="v12-justify-between v12-mt-3" v-if="orderInfo.payPostage > 0">
|
||||
<view class="v12-font-24 v12-dark-text">
|
||||
运费
|
||||
</view>
|
||||
@@ -263,7 +159,7 @@
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="v12-justify-between v12-align-center v12-mt-3" v-if="orderInfo.couponPrice > 0">
|
||||
<view class="v12-justify-between v12-mt-3" v-if="orderInfo.couponPrice > 0">
|
||||
<view class="v12-font-24 v12-dark-text">
|
||||
满减优惠
|
||||
</view>
|
||||
@@ -275,19 +171,7 @@
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="v12-justify-between v12-align-center v12-mt-3" v-if="orderInfo.discountPrice > 0 && orderInfo.isGiftCardReceiveBlind === 0">
|
||||
<view class="v12-font-24 v12-dark-text">
|
||||
商品折扣
|
||||
</view>
|
||||
<view class="v12-text-right">
|
||||
-
|
||||
<text class="v12-font-22">¥</text>
|
||||
<text class="v12-font-28">
|
||||
{{ force2Decimal(orderInfo.discountPrice) }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="v12-justify-between v12-align-center v12-mt-3" v-if="orderInfo.useIntegral > 0">
|
||||
<view class="v12-justify-between v12-mt-3" v-if="orderInfo.useIntegral > 0">
|
||||
<view class="v12-font-24 v12-dark-text">
|
||||
积分抵扣
|
||||
</view>
|
||||
@@ -300,7 +184,7 @@
|
||||
</view>
|
||||
</view>
|
||||
<u-divider></u-divider>
|
||||
<view class="v12-justify-between v12-align-center v12-mt-3" v-if="orderInfo.isGiftCardReceiveBlind === 0">
|
||||
<view class="v12-justify-between v12-mt-3">
|
||||
<view class="v12-font-28 v12-font-bold v12-dark-text">
|
||||
实付款
|
||||
</view>
|
||||
@@ -432,29 +316,6 @@
|
||||
<text class="money font-color-red">¥{{ force2Decimal(orderInfo.payPrice) }}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view
|
||||
v-if="isGift"
|
||||
class="gift-wrap"
|
||||
>
|
||||
<view class="v12-justify-between v12-align-center">
|
||||
<view class="v12-font-28 v12-font-bold v12-align-center">
|
||||
<u-icon :name="webUrl + '/icon/gift-primary.png'" size="24"></u-icon>
|
||||
{{ `已领取${orderInfo.giftCardInfo.receiveNum}/${orderInfo.giftCardInfo.giftNum}份礼包` }}
|
||||
</view>
|
||||
<view
|
||||
v-if="orderInfo.giftCardInfo.refundNum > 0"
|
||||
class="v12-font-bold v12-primary-text v12-font-24"
|
||||
>{{ `剩余${orderInfo.giftCardInfo.refundNum}份已退回` }}</view>
|
||||
</view>
|
||||
<view
|
||||
v-for="(receive, index) in orderInfo.giftCardInfo.receiveInfo"
|
||||
:key="index"
|
||||
class="v12-mt-3 v12-justify-between v12-align-center"
|
||||
>
|
||||
<view class="v12-font-24">{{ receive.userNickname }}</view>
|
||||
<view class="v12-font-24">{{ receive.receiveStatus ? '已领取' : '未领取' }}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view style="height:100rpx;" v-if="!refundOrder && offlineStatus"></view>
|
||||
<view class="footer acea-row row-right row-middle" v-if="!refundOrder && offlineStatus">
|
||||
<template v-if="status.type == 0">
|
||||
@@ -481,18 +342,13 @@
|
||||
</template>
|
||||
<template v-if="status.type == 1" >
|
||||
<view class="v12-justify-between " style="width: 100%">
|
||||
<view class="v12-justify-between ">
|
||||
<view v-if="orderInfo.isGiftCardReceiveBlind === 0" class="bnt v12-dark-text v12-dark-border cancel" @click="goRoom(orderInfo)">联系商家</view>
|
||||
<view class="bnt v12-dark-text v12-dark-border cancel" @click="delayOrder">催发货</view>
|
||||
<view v-if="canShowModifyAddress(orderInfo)" class="bnt v12-dark-text v12-dark-border cancel" @click="goAddress">修改地址</view>
|
||||
</view>
|
||||
<view class="bnt v12-dark-text v12-dark-border cancel" @click="goRoom(orderInfo)">联系商家</view>
|
||||
<view class="bnt v12-primary-text v12-primary-border cancel" @click="goGoodsReturn2(orderInfo)">申请退款</view>
|
||||
</view>
|
||||
</template>
|
||||
<template v-if="status.type == 2">
|
||||
<view class="v12-justify-between " style="width: 100%">
|
||||
<view v-if="orderInfo.isGiftCardReceiveBlind === 0" class="bnt v12-dark-text v12-dark-border cancel" @click="goRoom(orderInfo)">联系商家</view>
|
||||
<view class="" v-else></view>
|
||||
<view class="bnt v12-dark-text v12-dark-border cancel" @click="goRoom(orderInfo)">联系商家</view>
|
||||
<view class="v12-justify-between">
|
||||
<view class="btn-more" style="position: relative">
|
||||
<view class=" v12-font-24 v12-mr-2" @click.stop="showMore = !showMore">更多</view>
|
||||
@@ -570,7 +426,7 @@
|
||||
:src="'https://apis.map.qq.com/uri/v1/geocoder?coord=' + system_store.latitude + ',' +system_store.longitude +'&referer=' +mapKey"></iframe>
|
||||
</view>
|
||||
|
||||
<passkeyborad v-if="isShowPayPwdPop" :money="orderInfo.payPrice" showMoney :show="isShowPayPwdPop" ref='payPwdPop' @close="pwdPopClose"
|
||||
<passkeyborad :money="orderInfo.payPrice" showMoney :show="isShowPayPwdPop" ref='payPwdPop' @close="pwdPopClose"
|
||||
@finish="pwdPopFinish"></passkeyborad>
|
||||
|
||||
</view>
|
||||
@@ -579,7 +435,7 @@
|
||||
<script>
|
||||
import passkeyborad from '@/components/yzc-paykeyboard/yzc-paykeyboard'
|
||||
import OrderGoods from "@/components/OrderGoods";
|
||||
import {orderDetail, orderDelay, aginConfirm, express, applyEditAddress, orderExpectedArrivalTime, groupOrderDetail} from "@/api/order";
|
||||
import {orderDetail, orderDelay, aginConfirm, express, editAddress} from "@/api/order";
|
||||
import Payment from "@/components/Payment";
|
||||
import DataFormat from "@/components/DataFormat";
|
||||
import {copyClipboard} from "@/utils";
|
||||
@@ -636,128 +492,61 @@ export default {
|
||||
payPassword: null,
|
||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||
pageKeyId: Object.freeze('userOrderInfo'),
|
||||
logistics: {},
|
||||
isGift: false,
|
||||
isGroup: false,
|
||||
key: "",
|
||||
loading: true,
|
||||
addressEditOrderId: ""
|
||||
logistics: {}
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
isrefund() {
|
||||
const status = Number(this.orderInfo._status._type)
|
||||
return status< 0
|
||||
},
|
||||
refundOrder() {
|
||||
return this.orderInfo.refund_status > 0;
|
||||
},
|
||||
...mapGetters(["userInfo"])
|
||||
},
|
||||
onLoad(opts) {
|
||||
this.isGift = Number(opts.isGift || 0) === 1;
|
||||
this.isGroup = Number(opts.isGroup || 0) === 1;
|
||||
this.key = opts.key || ''
|
||||
},
|
||||
onShow() {
|
||||
const chooseAddress = uni.getStorageSync('updateOrderAddress') || {}
|
||||
const _this = this
|
||||
const chooseAddress = uni.getStorageSync('chooseAddress') || {}
|
||||
const addressId = chooseAddress.id || ''
|
||||
// 监听到选择收货地址
|
||||
if (addressId && this.addressEditOrderId) {
|
||||
uni.setStorageSync('updateOrderAddress', {})
|
||||
if (addressId) {
|
||||
uni.setStorageSync('chooseAddress', {})
|
||||
uni.showModal({
|
||||
title:'确定修改地址吗?',
|
||||
content: '提交后将进入审核流程,请确认是否继续',
|
||||
content: '',
|
||||
showCancel: true,
|
||||
cancelText: '取消',
|
||||
confirmText: '确认',
|
||||
success:(success)=>{
|
||||
if(success.confirm) {
|
||||
uni.showLoading()
|
||||
applyEditAddress({
|
||||
editAddress({
|
||||
addressId,
|
||||
orderId: this.addressEditOrderId
|
||||
}).then(() => {
|
||||
orderId: _this.orderInfo.orderId
|
||||
}).then(res => {
|
||||
uni.showToast({
|
||||
icon: 'success',
|
||||
title: '已提交审核'
|
||||
title: '修改成功!'
|
||||
})
|
||||
this.getDetail()
|
||||
_this.getDetail()
|
||||
}).finally(() => {
|
||||
uni.hideLoading()
|
||||
})
|
||||
} else {
|
||||
this.getDetail()
|
||||
}
|
||||
},
|
||||
complete:(complete)=>{
|
||||
this.addressEditOrderId = ''
|
||||
uni.hideLoading()
|
||||
}
|
||||
})
|
||||
} else {
|
||||
this.id = this.$yroute.query.id;
|
||||
this.isGroup = Number(this.$yroute.query.isGroup || 0) === 1;
|
||||
this.key = this.$yroute.query.key || '';
|
||||
this.getDetail();
|
||||
_this.id = _this.$yroute.query.id;
|
||||
_this.getDetail();
|
||||
}
|
||||
},
|
||||
onUnload() {
|
||||
uni.setStorageSync('needRefreshMyOrderList', 1)
|
||||
},
|
||||
// inject: ["app"],
|
||||
mounted: function () {
|
||||
this.id = this.$yroute.query.id;
|
||||
},
|
||||
methods: {
|
||||
copyClipboard,
|
||||
getTime(type) {
|
||||
const timeMap = {
|
||||
1:"48小时内",
|
||||
2:"72小时内",
|
||||
3:"24小时内",
|
||||
4: "7天内",
|
||||
5: "15天内"
|
||||
}
|
||||
return timeMap[type]
|
||||
},
|
||||
canShowModifyAddress(order) {
|
||||
if (!order || this.isGroup || Number(order.isTickets || 0) === 1) {
|
||||
return false
|
||||
}
|
||||
const type = Number(order._status && order._status._type)
|
||||
if (type !== 1) {
|
||||
return false
|
||||
}
|
||||
const isAddressUpdate = Number(order.isAddressUpdate || 0)
|
||||
const addressUpdateStatus = Number(order.addressUpdateStatus || 0)
|
||||
if (isAddressUpdate === 0) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
},
|
||||
//催发货
|
||||
delayOrder() {
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
title: '您已催促成功,商家正在抓紧备货'
|
||||
})
|
||||
},
|
||||
// 获取预计送达时间
|
||||
getDay(delivery, index) {
|
||||
const params = {
|
||||
orderId: this.orderInfo.orderId,
|
||||
deliveryId: delivery.deliveryId,
|
||||
deliverySn: delivery.deliverySn
|
||||
}
|
||||
orderExpectedArrivalTime(params).then(res => {
|
||||
if(res.success) {
|
||||
this.orderInfo.deliveryInfo[index].estimatedTime = res.data.deliveryTime || ''
|
||||
this.$forceUpdate()
|
||||
}
|
||||
})
|
||||
},
|
||||
goGoodsCon(item, isGiftCardReceiveBlind) {
|
||||
if(isGiftCardReceiveBlind) return
|
||||
goGoodsCon(item) {
|
||||
this.$yrouter.push({
|
||||
path: '/pages/shop/GoodsCon/index',
|
||||
query: {
|
||||
@@ -820,17 +609,10 @@ export default {
|
||||
})
|
||||
},
|
||||
goAddress() {
|
||||
this.addressEditOrderId = this.orderInfo.orderId
|
||||
uni.setStorageSync('updateOrderSourceAddress', {
|
||||
id: this.orderInfo.addressId || this.orderInfo.userAddressId || '',
|
||||
realName: this.orderInfo.realName || this.orderInfo.oldRealName || '',
|
||||
phone: this.orderInfo.userPhone || this.orderInfo.oldUserPhone || '',
|
||||
userAddress: this.orderInfo.userAddress || this.orderInfo.oldUserAddress || ''
|
||||
})
|
||||
this.$yrouter.push({
|
||||
path:'/pages/user/address/AddressManagement/index',
|
||||
query: {
|
||||
choosMode: 4
|
||||
choosMode: 1
|
||||
}
|
||||
})
|
||||
},
|
||||
@@ -864,6 +646,14 @@ export default {
|
||||
query: { id: cart.unique }
|
||||
});
|
||||
},
|
||||
goOrderDetails(order) {
|
||||
this.$yrouter.push({
|
||||
path: "/pages/order/OrderDetails/index",
|
||||
query: {
|
||||
id: order.orderId
|
||||
}
|
||||
});
|
||||
},
|
||||
goRoom(order) {
|
||||
const params = {
|
||||
goodsId: order.cartInfo[0].productId,
|
||||
@@ -1088,78 +878,65 @@ export default {
|
||||
if (type == 1 && combination_id > 0) {
|
||||
status.type = 6;
|
||||
status.class_status = 1;
|
||||
} // 查看拼团
|
||||
if (type == 2 && delivery_type == "express") status.class_status = 2; // 查看物流
|
||||
if (type == 2) status.class_status = 3; // 确认收货
|
||||
if (type == 4 || type === 0) status.class_status = 4; // 删除订单
|
||||
} //查看拼团
|
||||
if (type == 2 && delivery_type == "express") status.class_status = 2; //查看物流
|
||||
if (type == 2) status.class_status = 3; //确认收货
|
||||
if (type == 4 || type === 0) status.class_status = 4; //删除订单
|
||||
if (
|
||||
!seckill_id &&
|
||||
!bargain_id &&
|
||||
!combination_id &&
|
||||
(type == 3 || type == 4)
|
||||
!seckill_id &&
|
||||
!bargain_id &&
|
||||
!combination_id &&
|
||||
(type == 3 || type == 4)
|
||||
)
|
||||
status.class_status = 5; // 再次购买
|
||||
status.class_status = 5; //再次购买
|
||||
if (type == 9) {
|
||||
// 线下付款
|
||||
//线下付款
|
||||
status.class_status = 0;
|
||||
this.offlineStatus = false
|
||||
this.offlineStatus = false;
|
||||
}
|
||||
this.status = status
|
||||
this.status = status;
|
||||
},
|
||||
getDetail() {
|
||||
const id = this.id
|
||||
const id = this.id;
|
||||
if (!id) {
|
||||
uni.showToast({
|
||||
title: "订单不存在",
|
||||
icon: "none",
|
||||
duration: 2000
|
||||
})
|
||||
return
|
||||
});
|
||||
return;
|
||||
}
|
||||
uni.showLoading({
|
||||
title: '加载中'
|
||||
})
|
||||
this.loading = true
|
||||
orderDetail(id).then(res => {
|
||||
this.orderInfo = res.data
|
||||
this.orderInfo._status._type = parseInt(this.orderInfo._status._type)
|
||||
this.getOrderStatus()
|
||||
if (this.orderInfo.combinationId > 0) {
|
||||
this.orderTypeName = "拼团订单"
|
||||
this.orderTypeNameStatus = false
|
||||
} else if (this.orderInfo.bargainId > 0) {
|
||||
this.orderTypeName = "砍价订单"
|
||||
this.orderTypeNameStatus = false
|
||||
} else if (this.orderInfo.seckillId > 0) {
|
||||
this.orderTypeName = "秒杀订单"
|
||||
this.orderTypeNameStatus = false
|
||||
} else if (this.orderInfo.isGiftCardReceive === 1 || this.orderInfo.isGiftCardSend === 1) {
|
||||
this.orderTypeName = "礼包订单"
|
||||
this.orderTypeNameStatus = false
|
||||
}
|
||||
this.system_store = res.data.systemStore || {}
|
||||
this.mapKey = res.data.mapKay
|
||||
this.setOfflinePayStatus(this.orderInfo.offlinePayStatus)
|
||||
const statusType = this.orderInfo._status._type
|
||||
if([-1, -2, 4, 3].includes(statusType) || (statusType === 2 && this.orderInfo.isTickets !== 1)) {
|
||||
for(let i = 0; i < this.orderInfo.deliveryInfo.length; i++) {
|
||||
this.orderInfo.deliveryInfo[i].estimatedTime = ''
|
||||
this.getExpressInfo(this.orderInfo.deliveryInfo[i], i)
|
||||
if (statusType === 2) {
|
||||
this.getDay(this.orderInfo.deliveryInfo[i], i)
|
||||
orderDetail(id)
|
||||
.then(res => {
|
||||
this.orderInfo = res.data;
|
||||
this.getOrderStatus();
|
||||
if (this.orderInfo.combinationId > 0) {
|
||||
this.orderTypeName = "拼团订单";
|
||||
this.orderTypeNameStatus = false;
|
||||
} else if (this.orderInfo.bargainId > 0) {
|
||||
this.orderTypeName = "砍价订单";
|
||||
this.orderTypeNameStatus = false;
|
||||
} else if (this.orderInfo.seckillId > 0) {
|
||||
this.orderTypeName = "秒杀订单";
|
||||
this.orderTypeNameStatus = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.response.data.msg,
|
||||
icon: "none",
|
||||
duration: 2000
|
||||
})
|
||||
}).finally(() => {
|
||||
this.loading = false
|
||||
uni.hideLoading()
|
||||
})
|
||||
this.system_store = res.data.systemStore || {};
|
||||
this.mapKey = res.data.mapKay;
|
||||
this.setOfflinePayStatus(this.orderInfo.offlinePayStatus);
|
||||
const orderInfo = this.orderInfo
|
||||
if(orderInfo._status._type == -1 || orderInfo._status._type == -2 || orderInfo._status._type == 4 || orderInfo._status._type == 3 || (orderInfo._status._type == 2 && orderInfo.isTickets!==1)) {
|
||||
for(let i = 0; i < orderInfo.deliveryInfo.length; i++) {
|
||||
this.getExpressInfo(orderInfo.deliveryInfo[i], i)
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
uni.showToast({
|
||||
title: err.response.data.msg,
|
||||
icon: "none",
|
||||
duration: 2000
|
||||
});
|
||||
});
|
||||
},
|
||||
async toPay(type) {
|
||||
var that = this;
|
||||
@@ -1409,27 +1186,4 @@ export default {
|
||||
text-align: left !important;
|
||||
}
|
||||
}
|
||||
.gift-wrap{
|
||||
background: #fff;
|
||||
border-radius: 20rpx;
|
||||
margin-top: 30rpx;
|
||||
padding: 30rpx;
|
||||
}
|
||||
.time-bg{
|
||||
position: absolute;
|
||||
height: 38rpx;
|
||||
width: 100%;
|
||||
}
|
||||
.time-box{
|
||||
position: relative;
|
||||
margin-left: 10rpx;
|
||||
}
|
||||
.order-deliver-item-show {
|
||||
display: block;
|
||||
}
|
||||
.time-wrap {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,16 +1,15 @@
|
||||
<template>
|
||||
<view class="order-submission" style="padding: 30rpx;">
|
||||
<view class="allAddress" style="background-color: #f6f6f6;">
|
||||
|
||||
<view
|
||||
v-if="shipping_type === 0"
|
||||
class="address acea-row v12-align-start"
|
||||
style="flex-wrap: nowrap;margin: 0 0 30rpx 0;border-radius: 16rpx;"
|
||||
@click="addressTap"
|
||||
class="address acea-row v12-align-start"
|
||||
style="flex-wrap: nowrap;margin: 0 0 30rpx 0;border-radius: 16rpx;"
|
||||
v-if="shipping_type === 0"
|
||||
@click="addressTap"
|
||||
>
|
||||
<image
|
||||
:src="webUrl+'/orderIcon/map.png'"
|
||||
style="flex-shrink: 0;width: 36rpx;height: 36rpx;margin-right: 20rpx;"
|
||||
/>
|
||||
<image style="flex-shrink: 0;width: 36rpx;height: 36rpx;margin-right: 20rpx;"
|
||||
:src="webUrl+'/orderIcon/map.png'" mode=""></image>
|
||||
<view class="acea-row row-between-wrapper" style="flex-wrap: nowrap;flex-grow: 1;">
|
||||
<view class="addressCon" v-if="addressInfo.realName">
|
||||
<view class="more-t">
|
||||
@@ -26,35 +25,32 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<div
|
||||
v-else
|
||||
style="flex-wrap: nowrap;"
|
||||
class="address acea-row row-middle"
|
||||
@click="showStoreList"
|
||||
>
|
||||
<image
|
||||
:src="webUrl+'/20230304135530688212.png'"
|
||||
style="flex-shrink: 0;width: 48rpx;height: 48rpx;margin-right: 20rpx;"
|
||||
/>
|
||||
<div style="flex-wrap: nowrap;" class="address acea-row row-middle" v-else @click="showStoreList">
|
||||
|
||||
<image style="flex-shrink: 0;width: 48rpx;height: 48rpx;margin-right: 20rpx;"
|
||||
:src="webUrl+'/20230304135530688212.png'" mode=""></image>
|
||||
<view class="acea-row row-between-wrapper" style="flex-wrap: nowrap;flex-grow: 1;">
|
||||
<div class="addressCon">
|
||||
<div class="name">
|
||||
{{ isNullOrEmpty(storeItems) ? systemStore.name : storeItems.name }}
|
||||
<span class="phone">{{ isNullOrEmpty(storeItems) ? systemStore.phone : storeItems.phone }}</span>
|
||||
<span
|
||||
class="phone"
|
||||
>{{ isNullOrEmpty(storeItems) ? systemStore.phone : storeItems.phone }}</span>
|
||||
</div>
|
||||
<div>{{ isNullOrEmpty(storeItems) ? systemStore.address : storeItems.address }}</div>
|
||||
</div>
|
||||
<div class="iconfont icon-jiantou"></div>
|
||||
</view>
|
||||
|
||||
</div>
|
||||
</view>
|
||||
<OrderGoods
|
||||
:evaluate="0"
|
||||
:cartInfo="orderGroupInfo.cartInfo"
|
||||
title="商品信息"
|
||||
/>
|
||||
|
||||
<OrderGoods :evaluate="0" :cartInfo="orderGroupInfo.cartInfo" title="商品信息"></OrderGoods>
|
||||
|
||||
<view class="wrapper" style="margin:0;border-radius:0 0 20rpx 20rpx">
|
||||
<view v-if="shipping_type === 0" class="v12-pa-2 acea-row row-between-wrapper" style="flex-wrap: nowrap;">
|
||||
|
||||
|
||||
<view class="v12-pa-2 acea-row row-between-wrapper" style="flex-wrap: nowrap;" v-if="shipping_type === 0">
|
||||
<view class="acea-row row-middle" style="flex-wrap: nowrap;">
|
||||
<!-- <image style="width: 32rpx;height: 32rpx;margin-right: 12rpx;" :src="webUrl+'/20210807230820761721.png'"
|
||||
mode=""></image> -->
|
||||
@@ -68,22 +64,13 @@
|
||||
<view class="v12-pa-2 acea-row row-between-wrapper">
|
||||
<view class="v12-font-24 v12-secondary-dark-text v12-pr-3 v12-text-right" style="width: 140rpx">联系人</view>
|
||||
<view class="discount">
|
||||
<input
|
||||
v-model="contacts"
|
||||
class="v12-font-24"
|
||||
type="text"
|
||||
placeholder="请填写您的联系姓名"
|
||||
/>
|
||||
<input class="v12-font-24" type="text" placeholder="请填写您的联系姓名" v-model="contacts"/>
|
||||
</view>
|
||||
</view>
|
||||
<view class="v12-pa-2 acea-row row-between-wrapper">
|
||||
<view class="v12-font-24 v12-secondary-dark-text v12-pr-3 v12-text-right" style="width: 140rpx">联系电话</view>
|
||||
<view class="discount">
|
||||
<input
|
||||
v-model="contactsTel"
|
||||
type="text"
|
||||
placeholder="请填写您的联系电话"
|
||||
/>
|
||||
<input type="text" placeholder="请填写您的联系电话" v-model="contactsTel"/>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
@@ -93,11 +80,7 @@
|
||||
mode=""></image> -->
|
||||
<text class="v12-font-24 v12-secondary-dark-text v12-pr-3 v12-text-right" style="width: 140rpx;">备注</text>
|
||||
</view>
|
||||
<textarea
|
||||
v-model="mark"
|
||||
placeholder="建议与商家协商一致"
|
||||
class="mark v12-font-24 "
|
||||
/>
|
||||
<textarea v-model="mark" placeholder="建议与商家协商一致" class="mark v12-font-24 "></textarea>
|
||||
</view>
|
||||
</view>
|
||||
<!-- v12 -->
|
||||
@@ -130,7 +113,7 @@
|
||||
<text class="v12-dark-text v12-font-24" >{{ couponList.usable.length === 0 ? '无' : '去选择' }}</text>
|
||||
<text class="iconfont icon-jiantou v12-font-24 v12-dark-text"></text>
|
||||
</view> -->
|
||||
<view class="v12-secondary-dark-text v12-align-center" @click="showCouponsPopup">
|
||||
<view class="v12-secondary-dark-text v12-align-center" @click="changeCoupons">
|
||||
<text class="v12-font-22 ">-¥</text>
|
||||
<text class="v12-font-28">{{ force2Decimal(orderPrice.couponPrice) }}</text>
|
||||
<text class="iconfont icon-jiantou v12-font-24 v12-dark-text"></text>
|
||||
@@ -197,11 +180,11 @@
|
||||
</view>
|
||||
<view class="list" style="margin-top: 0;">
|
||||
<view
|
||||
v-show="isWeixin"
|
||||
:class="active === 'weixin' ? 'on' : ''"
|
||||
class="payItem acea-row row-middle"
|
||||
style="flex-wrap: nowrap; margin-top: 0"
|
||||
@click="payItem('weixin')"
|
||||
class="payItem acea-row row-middle"
|
||||
:class="active === 'weixin' ? 'on' : ''"
|
||||
v-show="isWeixin"
|
||||
@click="payItem('weixin')"
|
||||
style="flex-wrap: nowrap; margin-top: 0"
|
||||
>
|
||||
<view class="name acea-row v12-font-24">
|
||||
<!-- <view class="iconfont icon-weixin2" :class="active === 'weixin' ? 'bounceIn' : ''"></view> -->
|
||||
@@ -215,11 +198,11 @@
|
||||
</label>
|
||||
</view>
|
||||
<view
|
||||
v-show="!isWeixin"
|
||||
:class="active === 'weixin' ? 'on' : ''"
|
||||
class="payItem acea-row row-middle"
|
||||
style="flex-wrap: nowrap; margin-top: 20rpx"
|
||||
@click="payItem('weixin')"
|
||||
class="payItem acea-row row-middle"
|
||||
:class="active === 'weixin' ? 'on' : ''"
|
||||
@click="payItem('weixin')"
|
||||
v-show="!isWeixin"
|
||||
style="flex-wrap: nowrap; margin-top: 20rpx"
|
||||
>
|
||||
<view class="name acea-row v12-font-24">
|
||||
<!-- <view class="iconfont icon-weixin2" :class="active === 'weixin' ? 'bounceIn' : ''"></view> -->
|
||||
@@ -231,12 +214,13 @@
|
||||
<radio style="transform: scale(0.7);" value="" :checked="active === 'weixin'" color="#C52733"/>
|
||||
<text></text>
|
||||
</label>
|
||||
|
||||
</view>
|
||||
<view
|
||||
:class="active === 'yue' ? 'on' : ''"
|
||||
class="payItem acea-row row-middle v12-justify-between"
|
||||
style="flex-wrap: nowrap;"
|
||||
@click="payItem('yue')"
|
||||
class="payItem acea-row row-middle v12-justify-between"
|
||||
:class="active === 'yue' ? 'on' : ''"
|
||||
@click="payItem('yue')"
|
||||
style="flex-wrap: nowrap;"
|
||||
>
|
||||
<view class="name acea-row v12-font-24">
|
||||
<!-- <view style="background-color: #007AFF;" class="iconfont icon-icon-test"
|
||||
@@ -249,31 +233,34 @@
|
||||
<radio style="transform: scale(0.7);" value="" :checked="active === 'yue'" color="#C52733"/>
|
||||
<text></text>
|
||||
</label>
|
||||
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
|
||||
<!-- v9 优惠券开始 -->
|
||||
<u-popup
|
||||
v-if="show"
|
||||
:show="show"
|
||||
:round="10"
|
||||
mode="bottom"
|
||||
close-on-click-overlay
|
||||
@close="close"
|
||||
@close="changeCoupons"
|
||||
>
|
||||
<CouponsPopup
|
||||
v-if="couponList.usable.length > 0 && show"
|
||||
v-if="couponList.usable.length > 0"
|
||||
:two-list="couponList"
|
||||
@change="changeCoupons"
|
||||
@close="close"
|
||||
:currentPrice="force2Decimal(orderPrice.totalPrice)"
|
||||
:id="couponId"
|
||||
:couponId1="couponId"
|
||||
@max="couponMax"
|
||||
:show-tab="false"
|
||||
/>
|
||||
</u-popup>
|
||||
<!-- v9 优惠券结束 -->
|
||||
|
||||
<view style="height:80rpx"></view>
|
||||
<view class="footer v12-justify-end v12-px-3" style="height: 120rpx;">
|
||||
<view class="v12-align-center v12-px-4">
|
||||
@@ -301,7 +288,6 @@
|
||||
@redirect="addressRedirect"
|
||||
/>
|
||||
<passkeyborad
|
||||
v-if="isShowPayPwdPop"
|
||||
ref='payPwdPop'
|
||||
showMoney
|
||||
:money="orderPrice.payPrice"
|
||||
@@ -314,24 +300,19 @@
|
||||
|
||||
<script>
|
||||
import passkeyborad from '@/components/yzc-paykeyboard/yzc-paykeyboard'
|
||||
import OrderGoods from "@/components/OrderGoods"
|
||||
import AddressWindow from "@/components/AddressWindow"
|
||||
import {
|
||||
createOrder,
|
||||
postOrderComputed,
|
||||
postOrderConfirm,
|
||||
getAddressDefaultSelected
|
||||
} from "@/api/order"
|
||||
import {mapGetters} from "vuex"
|
||||
import {weappPay} from "@/libs/wechat"
|
||||
import {isNullOrEmpty, isWeixin} from "@/utils"
|
||||
import blPaymentPasswordInput from '@/components/blPaymentPasswordInput.vue'
|
||||
import uniPopup from '@/components/uni-popup/uni-popup.vue'
|
||||
import OrderGoods from "@/components/OrderGoods";
|
||||
import AddressWindow from "@/components/AddressWindow";
|
||||
import {createOrder, postOrderComputed, postOrderConfirm} from "@/api/order";
|
||||
import {mapGetters} from "vuex";
|
||||
import {weappPay} from "@/libs/wechat";
|
||||
import {isNullOrEmpty, isWeixin} from "@/utils";
|
||||
import blPaymentPasswordInput from '@/components/blPaymentPasswordInput.vue';
|
||||
import uniPopup from '@/components/uni-popup/uni-popup.vue';
|
||||
import CouponsPopup from "@/components/CouponsPopup.vue"
|
||||
import { pageListenMixins } from '@/mixins/pageListenMixins'
|
||||
|
||||
const NAME = "OrderSubmission"
|
||||
const _isWeixin = isWeixin()
|
||||
const NAME = "OrderSubmission",
|
||||
_isWeixin = isWeixin();
|
||||
export default {
|
||||
name: NAME,
|
||||
components: {
|
||||
@@ -381,7 +362,7 @@ export default {
|
||||
unusable: [],
|
||||
usable: []
|
||||
},
|
||||
couponId: null,
|
||||
couponId: uni.getStorageSync('couponId') || 0,
|
||||
couponIndex: -1,
|
||||
show: false,
|
||||
// 是否使用积分开关
|
||||
@@ -395,16 +376,16 @@ export default {
|
||||
pageKeyId: Object.freeze('orderConfirm'),
|
||||
total: 0,
|
||||
couponTitle: '',
|
||||
hasCoupon: false
|
||||
}
|
||||
hasCoupon: false,
|
||||
};
|
||||
},
|
||||
computed: mapGetters(["userInfo", "storeItems"]),
|
||||
watch: {
|
||||
useIntegral() {
|
||||
this.computedPrice('useIntegral')
|
||||
this.computedPrice('useIntegral');
|
||||
},
|
||||
shipping_type() {
|
||||
this.computedPrice('shipping_type')
|
||||
this.computedPrice('shipping_type');
|
||||
},
|
||||
async couponId(value) {
|
||||
this.couponIndex = this.couponList['usable']?.findIndex(item => item.id === +value)
|
||||
@@ -413,6 +394,7 @@ export default {
|
||||
}
|
||||
},
|
||||
onLoad(opts) {
|
||||
console.log(opts);
|
||||
const that = this
|
||||
if (that.$yroute.query.pinkid !== undefined) {
|
||||
that.pinkId = that.$yroute.query.pinkid
|
||||
@@ -425,63 +407,42 @@ export default {
|
||||
that.lotteryRecordId = that.$yroute.query.lotteryRecordId
|
||||
}
|
||||
that.hasCoupon = opts.couponId !== ''
|
||||
that.getCartInfo()
|
||||
},
|
||||
onShow() {
|
||||
const _this = this
|
||||
_this.getCartInfo()
|
||||
//获取用户信息
|
||||
_this.$store.dispatch("getUser", true)
|
||||
// 监听到选择收货地址
|
||||
const chooseAddress = uni.getStorageSync('chooseAddress') || {}
|
||||
// const sourceAddress = uni.getStorageSync('sourceAddress') || {}
|
||||
// 监听到选择收货地址
|
||||
if (chooseAddress.id) {
|
||||
_this.addressInfo = chooseAddress
|
||||
// 地址切换也要重新计算一下
|
||||
// uni.setStorageSync('sourceAddress', _this.addressInfo || '')
|
||||
uni.setStorageSync('sourceAddress', {})
|
||||
_this.computedPrice('onLoad chooseAddress')
|
||||
setTimeout(() => {
|
||||
uni.hideLoading()
|
||||
uni.setStorageSync('chooseAddress', {})
|
||||
}, 1000)
|
||||
}
|
||||
|
||||
},
|
||||
methods: {
|
||||
isNullOrEmpty,
|
||||
couponMax(e) {
|
||||
// this.couponTitle = e.couponTitle
|
||||
// this.couponId = this.$yroute.query.couponId || uni.getStorageSync('couponId') || 0
|
||||
this.couponTitle = e.couponTitle
|
||||
this.couponId = this.$yroute.query.couponId || uni.getStorageSync('couponId') || 0
|
||||
},
|
||||
showStoreList() {
|
||||
this.$store.commit("get_to", "orders")
|
||||
this.$store.commit("get_to", "orders");
|
||||
this.$yrouter.push({
|
||||
path: "/pages/shop/StoreList/index"
|
||||
})
|
||||
});
|
||||
},
|
||||
force2Decimal(value) {
|
||||
return this.$force2Decimal(value)
|
||||
return this.$force2Decimal(value);
|
||||
},
|
||||
usePointsCheckChange(e) {
|
||||
this.computedPrice()
|
||||
},
|
||||
|
||||
/**
|
||||
* 计算订单金额
|
||||
* @param {*} f 有值时 couponId不取默认值
|
||||
*/
|
||||
// 计算订单金额
|
||||
computedPrice(f) {
|
||||
let shipping_type = this.shipping_type;
|
||||
postOrderComputed(this.orderGroupInfo.orderKey, {
|
||||
addressId: this.addressInfo.id,
|
||||
useIntegral: this.useIntegral ? 1 : 0,
|
||||
couponId: this.couponList.usable.length === 0 ? 0 : this.couponId,
|
||||
couponId: this.couponList.usable.length === 0 ? 0 : this.couponId || 0,
|
||||
usePoints: this.usePointsCheck ? 1 : 0,
|
||||
shipping_type: parseInt(this.shipping_type) + 1
|
||||
shipping_type: parseInt(shipping_type) + 1
|
||||
}).then(res => {
|
||||
this.couponList = res.data.result.couponList
|
||||
if(!f) {
|
||||
this.couponId = res.data.result.defaultCouponId
|
||||
}
|
||||
const data = res.data;
|
||||
if (data.status === "EXTEND_ORDER") {
|
||||
this.$yrouter.replace({
|
||||
@@ -489,16 +450,18 @@ export default {
|
||||
query: {
|
||||
id: data.result.orderId
|
||||
}
|
||||
})
|
||||
});
|
||||
} else {
|
||||
this.orderPrice = data.result;
|
||||
console.log(this.orderPrice);
|
||||
|
||||
if (this.usePointsCheck) {
|
||||
this.usePointsNumber = data.result.usedPoints
|
||||
} else {
|
||||
this.usePointsNumber = 0
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
},
|
||||
getCartInfo() {
|
||||
const _this = this
|
||||
@@ -538,18 +501,38 @@ export default {
|
||||
_this.usePointsCheck = true
|
||||
_this.usePointsNumber = data.maxPoints
|
||||
}
|
||||
_this.systemStore = data.systemStore || {}
|
||||
_this.storeSelfMention = data.storeSelfMention
|
||||
if(_this.$yroute.query.address !== undefined ) {
|
||||
_this.addressInfo = JSON.parse(_this.$yroute.query.address) || {}
|
||||
_this.computedPrice()
|
||||
} else {
|
||||
// _this.addressInfo = uni.getStorageSync('sourceAddress') || data.addressInfo || {}
|
||||
getAddressDefaultSelected().then(res => {
|
||||
_this.addressInfo = res.data
|
||||
_this.computedPrice()
|
||||
_this.addressInfo = uni.getStorageSync('chooseAddress') ? uni.getStorageSync('chooseAddress') : data.addressInfo || {}
|
||||
}
|
||||
const chooseAddress = uni.getStorageSync('chooseAddress') || {}
|
||||
const sourceAddress = uni.getStorageSync('sourceAddress') || data.addressInfo || uni.getStorageSync('chooseAddress')
|
||||
// 监听到选择收货地址
|
||||
if (chooseAddress.id && (chooseAddress.id !== sourceAddress.id)) {
|
||||
uni.showModal({
|
||||
title:'确定修改地址吗?',
|
||||
content: '',
|
||||
showCancel: true,
|
||||
cancelText: '取消',
|
||||
confirmText: '确认',
|
||||
success: (res) => {
|
||||
if(res.confirm) {
|
||||
_this.addressInfo = chooseAddress
|
||||
// 地址切换也要重新计算一下
|
||||
uni.setStorageSync('sourceAddress', _this.addressInfo || '')
|
||||
_this.computedPrice('onLoad chooseAddress')
|
||||
}
|
||||
},
|
||||
complete: () => {
|
||||
uni.hideLoading()
|
||||
// uni.setStorageSync('chooseAddress', {})
|
||||
}
|
||||
})
|
||||
}
|
||||
_this.systemStore = data.systemStore || {}
|
||||
_this.storeSelfMention = data.storeSelfMention
|
||||
_this.computedPrice()
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.msg,
|
||||
@@ -559,33 +542,32 @@ export default {
|
||||
})
|
||||
},
|
||||
addressTap: function () {
|
||||
uni.setStorageSync('sourceAddress', this.addressInfo)
|
||||
// 改用跳转页面方式
|
||||
//改用跳转页面方式
|
||||
this.$yrouter.push({
|
||||
path: "/pages/user/address/AddressManagement/index",
|
||||
query: {
|
||||
choosMode: 1
|
||||
}
|
||||
})
|
||||
});
|
||||
},
|
||||
addressRedirect() {
|
||||
this.addressLoaded = false
|
||||
this.showAddress = false
|
||||
this.addressLoaded = false;
|
||||
this.showAddress = false;
|
||||
},
|
||||
payItem: function (index) {
|
||||
this.active = index
|
||||
this.active = index;
|
||||
},
|
||||
changeAddress(addressInfo) {
|
||||
this.addressInfo = addressInfo
|
||||
this.addressInfo = addressInfo;
|
||||
//地址切换也要重新计算一下
|
||||
this.computedPrice('changeAddress')
|
||||
this.computedPrice('changeAddress');
|
||||
},
|
||||
pwdPopClose() {
|
||||
this.isShowPayPwdPop = false
|
||||
this.isShowPayPwdPop = false;
|
||||
},
|
||||
pwdPopFinish(payPwd) {
|
||||
this.payPassword = payPwd
|
||||
this.createOrder(true)
|
||||
this.payPassword = payPwd;
|
||||
this.createOrder(true);
|
||||
},
|
||||
//支付密码输入监听
|
||||
onInput(e) {
|
||||
@@ -593,56 +575,55 @@ export default {
|
||||
},
|
||||
// 支付密码输入确认
|
||||
onConfirm(e) {
|
||||
this.payPassword = e.value
|
||||
this.$refs.popup.close()
|
||||
this.$refs.secrity.clear()
|
||||
this.createOrder(true)
|
||||
this.payPassword = e.value;
|
||||
this.$refs.popup.close();//关闭支付密码弹窗
|
||||
this.$refs.secrity.clear();//清空支付密码
|
||||
this.createOrder(true);
|
||||
},
|
||||
subscribePay() {
|
||||
uni.requestSubscribeMessage({
|
||||
tmplIds: [
|
||||
'7O3wKw7_D4t7yfSOlvecKuOQP8QEPY88uBx2FJg43HE',
|
||||
'TSmTnGibZ8IxWCiRWOvLxha6-0u7tE-V1-WbDCiPkKU',
|
||||
'9Q6xLHe6HyjkU5Zn5k_2zxYPf2y4MxVyUbOSW8pcZRU'
|
||||
],
|
||||
tmplIds: ['7O3wKw7_D4t7yfSOlvecKuOQP8QEPY88uBx2FJg43HE', 'TSmTnGibZ8IxWCiRWOvLxha6-0u7tE-V1-WbDCiPkKU', '9Q6xLHe6HyjkU5Zn5k_2zxYPf2y4MxVyUbOSW8pcZRU'],
|
||||
complete: () => this.createOrder(false)
|
||||
})
|
||||
},
|
||||
createOrder(isyue) {
|
||||
let shipping_type = this.shipping_type;
|
||||
if (!this.active) {
|
||||
uni.showToast({
|
||||
title: "请选择支付方式",
|
||||
icon: "none",
|
||||
duration: 2000
|
||||
})
|
||||
return
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (!this.addressInfo.id && !this.shipping_type) {
|
||||
uni.showToast({
|
||||
title: "请选择收货地址",
|
||||
icon: "none",
|
||||
duration: 2000
|
||||
})
|
||||
return
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.shipping_type) {
|
||||
if (
|
||||
(this.contacts === "" || this.contactsTel === "") &&
|
||||
this.shipping_type
|
||||
(this.contacts === "" || this.contactsTel === "") &&
|
||||
this.shipping_type
|
||||
) {
|
||||
uni.showToast({
|
||||
title: "请填写联系人或联系人电话",
|
||||
icon: "none",
|
||||
duration: 2000
|
||||
})
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (!/^1(3|4|5|7|8|9|6)\d{9}$/.test(this.contactsTel)) {
|
||||
uni.showToast({
|
||||
title: "请填写正确的手机号",
|
||||
icon: "none",
|
||||
duration: 2000
|
||||
})
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (!/^[\u4e00-\u9fa5\w]{2,16}$/.test(this.contacts)) {
|
||||
@@ -650,36 +631,41 @@ export default {
|
||||
title: "请填写您的真实姓名",
|
||||
icon: "none",
|
||||
duration: 2000
|
||||
})
|
||||
return
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
// 判断如果是余额支付,先要输入支付密码
|
||||
|
||||
//判断如果是余额支付,先要输入支付密码
|
||||
if (this.active == 'yue' && !isyue) {
|
||||
// 先判断用户是否绑定过手机
|
||||
//先判断用户是否绑定过手机
|
||||
if (this.userInfo.phone) {
|
||||
// 再判断用户是否设置过支付密码
|
||||
//再判断用户是否设置过支付密码
|
||||
if (this.userInfo.hasPwdPay) {
|
||||
// 显示输入支付密码
|
||||
this.isShowPayPwdPop = true
|
||||
//显示输入支付密码
|
||||
this.isShowPayPwdPop = true;
|
||||
} else {
|
||||
// 设置支付密码
|
||||
this.$yrouter.push("/pkg_user/views/payPassword?isSetMode=true")
|
||||
//设置支付密码
|
||||
this.$yrouter.push("/pkg_user/views/payPassword?isSetMode=true");
|
||||
}
|
||||
} else {
|
||||
// 跳转到绑定手机
|
||||
this.$yrouter.push("/pkg_user/views/bindPhone")
|
||||
//跳转到绑定手机
|
||||
this.$yrouter.push("/pkg_user/views/bindPhone");
|
||||
}
|
||||
return
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
uni.showLoading({
|
||||
title: "生成订单中"
|
||||
})
|
||||
let from = {}
|
||||
});
|
||||
let from = {};
|
||||
if (this.$deviceType == "app") {
|
||||
from.from = "app"
|
||||
from.from = "app";
|
||||
}
|
||||
const params = {
|
||||
console.log(this.storeItems, this.systemStore);
|
||||
|
||||
var params = {
|
||||
realName: this.contacts,
|
||||
phone: this.contactsTel,
|
||||
addressId: this.addressInfo.id,
|
||||
@@ -693,144 +679,131 @@ export default {
|
||||
bargainId: this.orderGroupInfo.bargain_id,
|
||||
from: this.from,
|
||||
mark: this.mark || "",
|
||||
shippingType: parseInt(this.shipping_type) + 1,
|
||||
shippingType: parseInt(shipping_type) + 1,
|
||||
storeId: this.storeItems ? this.storeItems.id : this.systemStore.id,
|
||||
...from
|
||||
}
|
||||
uni.setStorageSync('chooseAddress', {})
|
||||
|
||||
//余额支付的支付密码
|
||||
if (this.active == 'yue') {
|
||||
params.passwordPay = this.payPassword
|
||||
params.passwordPay = this.payPassword;
|
||||
}
|
||||
uni.removeStorageSync('couponId')
|
||||
var that = this
|
||||
createOrder(this.orderGroupInfo.orderKey, params).then(res => {
|
||||
uni.hideLoading()
|
||||
const data = res.data
|
||||
switch (data.status) {
|
||||
case "ORDER_EXIST":
|
||||
case "EXTEND_ORDER":
|
||||
uni.showToast({
|
||||
title: res.msg,
|
||||
icon: "none",
|
||||
duration: 2000
|
||||
})
|
||||
this.$yrouter.replace({
|
||||
path: "/pages/order/OrderDetails/index",
|
||||
query: {
|
||||
id: data.result.orderId
|
||||
}
|
||||
})
|
||||
break;
|
||||
case "PAY_DEFICIENCY":
|
||||
break;
|
||||
case "PAY_ERROR":
|
||||
uni.showToast({
|
||||
title: res.msg,
|
||||
icon: "none",
|
||||
duration: 2000
|
||||
})
|
||||
this.$yrouter.replace({
|
||||
path: "/pages/order/MyOrder/index",
|
||||
query: {
|
||||
type: 1
|
||||
}
|
||||
});
|
||||
break;
|
||||
case "SUCCESS":
|
||||
uni.showToast({
|
||||
title: res.msg,
|
||||
icon: "none",
|
||||
duration: 2000
|
||||
})
|
||||
if (this.orderGroupInfo.cartInfo && this.orderGroupInfo.cartInfo.length === 1) {
|
||||
this.$yrouter.replace({
|
||||
path: "/pages/order/OrderDetails/index",
|
||||
query: {
|
||||
id: data.result.orderId
|
||||
}
|
||||
})
|
||||
} else {
|
||||
this.$yrouter.replace({
|
||||
path: "/pages/order/MyOrder/index",
|
||||
query: {
|
||||
type: 2
|
||||
}
|
||||
})
|
||||
|
||||
var that = this;
|
||||
createOrder(this.orderGroupInfo.orderKey, params)
|
||||
.then(res => {
|
||||
uni.hideLoading();
|
||||
const data = res.data;
|
||||
switch (data.status) {
|
||||
case "ORDER_EXIST":
|
||||
case "EXTEND_ORDER":
|
||||
uni.showToast({
|
||||
title: res.msg,
|
||||
icon: "none",
|
||||
duration: 2000
|
||||
});
|
||||
this.$yrouter.replace({
|
||||
path: "/pages/order/OrderDetails/index",
|
||||
query: {
|
||||
id: data.result.orderId
|
||||
}
|
||||
});
|
||||
break;
|
||||
case "PAY_DEFICIENCY":
|
||||
break;
|
||||
|
||||
case "PAY_ERROR":
|
||||
uni.showToast({
|
||||
title: res.msg,
|
||||
icon: "none",
|
||||
duration: 2000
|
||||
});
|
||||
this.$yrouter.replace({
|
||||
path: "/pages/order/OrderDetails/index",
|
||||
query: {
|
||||
id: data.result.orderId
|
||||
}
|
||||
});
|
||||
break;
|
||||
case "SUCCESS":
|
||||
uni.showToast({
|
||||
title: res.msg,
|
||||
icon: "none",
|
||||
duration: 2000
|
||||
});
|
||||
this.$yrouter.replace({
|
||||
path: "/pages/order/OrderDetails/index",
|
||||
query: {
|
||||
id: data.result.orderId
|
||||
}
|
||||
});
|
||||
break;
|
||||
case "WECHAT_H5_PAY":
|
||||
// H5支付
|
||||
this.$yrouter.replace({
|
||||
path: "/pages/order/OrderDetails/index",
|
||||
query: {
|
||||
id: data.result.orderId
|
||||
}
|
||||
});
|
||||
setTimeout(() => {
|
||||
// location.href = data.result.jsConfig.mweb_url;
|
||||
}, 100);
|
||||
break;
|
||||
case "WECHAT_PAY":
|
||||
// 小程序支付
|
||||
weappPay(data.result.jsConfig).finally(() => {
|
||||
this.$yrouter.replace({
|
||||
path: "/pages/order/OrderDetails/index",
|
||||
query: {
|
||||
id: data.result.orderId
|
||||
}
|
||||
});
|
||||
});
|
||||
break;
|
||||
|
||||
case "WECHAT_APP_PAY":
|
||||
// APP支付
|
||||
weappPay(data.result.jsConfig).finally(() => {
|
||||
this.$yrouter.replace({
|
||||
path: "/pages/order/OrderDetails/index",
|
||||
query: {
|
||||
id: data.result.orderId
|
||||
}
|
||||
});
|
||||
});
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case "WECHAT_H5_PAY":
|
||||
// H5支付
|
||||
this.$yrouter.replace({
|
||||
path: "/pages/order/MyOrder/index",
|
||||
query: {
|
||||
type: 1
|
||||
}
|
||||
})
|
||||
break;
|
||||
case "WECHAT_PAY":
|
||||
// 小程序支付
|
||||
weappPay(data.result.jsConfig).finally(() => {
|
||||
this.$yrouter.replace({
|
||||
path: "/pages/order/MyOrder/index",
|
||||
query: {
|
||||
type: 1
|
||||
}
|
||||
})
|
||||
})
|
||||
break;
|
||||
case "WECHAT_APP_PAY":
|
||||
// APP支付
|
||||
weappPay(data.result.jsConfig).finally(() => {
|
||||
this.$yrouter.replace({
|
||||
path: "/pages/order/MyOrder/index",
|
||||
query: {
|
||||
type: 1
|
||||
}
|
||||
});
|
||||
})
|
||||
break;
|
||||
}
|
||||
}).catch(err => {
|
||||
uni.hideLoading()
|
||||
uni.showToast({
|
||||
title: err.msg ||
|
||||
err.response.data.msg ||
|
||||
err.response.data.message ||
|
||||
"创建订单失败",
|
||||
icon: "none",
|
||||
duration: 2000
|
||||
})
|
||||
}).finally(function () {
|
||||
that.isShowPayPwdPop = false
|
||||
that.$refs.payPwdPop.clear()
|
||||
that.$refs.payPwdPop.close()
|
||||
})
|
||||
})
|
||||
.catch(err => {
|
||||
uni.hideLoading();
|
||||
uni.showToast({
|
||||
title:
|
||||
err.msg ||
|
||||
err.response.data.msg ||
|
||||
err.response.data.message ||
|
||||
"创建订单失败",
|
||||
icon: "none",
|
||||
duration: 2000
|
||||
});
|
||||
}).finally(function () {
|
||||
that.isShowPayPwdPop = false;
|
||||
that.$refs.payPwdPop.clear();//清空支付密码
|
||||
that.$refs.payPwdPop.close();//关闭支付密码弹窗
|
||||
});
|
||||
},
|
||||
close() {
|
||||
this.show = !this.show
|
||||
},
|
||||
showCouponsPopup() {
|
||||
if (this.couponList.usable.length === 0) return
|
||||
this.show = !this.show
|
||||
},
|
||||
// v9-2
|
||||
changeCoupons(item) {
|
||||
if(!item) return
|
||||
if (this.couponList.usable.length === 0) return
|
||||
this.show = !this.show
|
||||
if(!item.id) {
|
||||
this.couponId = 0
|
||||
this.couponTitle = ''
|
||||
this.computedPrice(1)
|
||||
return
|
||||
}
|
||||
this.couponId = item.id
|
||||
this.couponId = uni.getStorageSync('couponId') || 0
|
||||
this.couponTitle = item.couponTitle
|
||||
this.computedPrice(1)
|
||||
// this.couponId = uni.getStorageSync('couponId') || 0
|
||||
// this.couponTitle = item.couponTitle
|
||||
}
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<template>
|
||||
<view class="return-list" ref="container">
|
||||
<view class="goodWrapper" v-for="(order,orderListIndex) in orderList" :key="orderListIndex">
|
||||
<view class="iconfont icon-tuikuanzhong powder" v-if="parseInt(order._status._type) === -1"></view>
|
||||
<view class="iconfont icon-yituikuan" v-if="parseInt(order._status._type) === -2"></view>
|
||||
<image class="iconfont" :src="webUrl+'/20230713110051999762.png'" v-if="parseInt(order._status._type) === -3"/>
|
||||
<view class="iconfont icon-tuikuanzhong powder" v-if="order._status._type === '-1'"></view>
|
||||
<view class="iconfont icon-yituikuan" v-if="order._status._type === '-2'"></view>
|
||||
<image class="iconfont" :src="webUrl+'/20230713110051999762.png'" v-if="order._status._type === '-3'"/>
|
||||
<view class="orderNum">订单号:{{ order.orderId }}</view>
|
||||
<view
|
||||
class="item acea-row row-between-wrapper"
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
<view class="start" :class="'star' + replyData.replyStar"></view>
|
||||
</view>
|
||||
<view>
|
||||
<text class="font-color-red">{{ isTravelGroup ? replyData.replyChance || 0 : replyData.replyChance + '%' || 0 }}</text>
|
||||
<text> {{ ` 好评率` }}</text>
|
||||
<text class="font-color-red">{{ replyData.replyChance || 0 }}%</text>
|
||||
<text>好评率</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="nav acea-row row-middle">
|
||||
@@ -35,7 +35,6 @@
|
||||
<script>
|
||||
import UserEvaluation from "@/components/UserEvaluation";
|
||||
import { getReplyConfig, getReplyList } from "@/api/store";
|
||||
import { getJiaLouProductReply, getJiaLouProductReplyCount } from "@/api/qianxian";
|
||||
import Loading from "@/components/Loading";
|
||||
|
||||
export default {
|
||||
@@ -48,7 +47,6 @@ export default {
|
||||
data: function() {
|
||||
return {
|
||||
product_id: 0,
|
||||
isTravelGroup: false,
|
||||
replyData: {},
|
||||
navList: [
|
||||
{ evaluate: "全部", num: 0 },
|
||||
@@ -67,7 +65,6 @@ export default {
|
||||
},
|
||||
mounted: function() {
|
||||
this.product_id = this.$yroute.query.id;
|
||||
this.isTravelGroup = String(this.$yroute.query.isTravelGroup || '') === '1';
|
||||
this.getProductReplyCount();
|
||||
this.getProductReplyList();
|
||||
},
|
||||
@@ -77,74 +74,27 @@ export default {
|
||||
methods: {
|
||||
getProductReplyCount: function() {
|
||||
let that = this;
|
||||
if (that.isTravelGroup) {
|
||||
getJiaLouProductReplyCount({
|
||||
travelGroupProductId: that.product_id
|
||||
}).then(res => {
|
||||
const data = res.data || {};
|
||||
that.$set(that, "replyData", data);
|
||||
that.navList[0].num = data.sumCount || 0;
|
||||
that.navList[1].num = data.goodCount || 0;
|
||||
that.navList[2].num = data.inCount || 0;
|
||||
that.navList[3].num = data.poorCount || 0;
|
||||
});
|
||||
} else {
|
||||
getReplyConfig(that.product_id).then(res => {
|
||||
const data = res.data || {};
|
||||
that.$set(that, "replyData", data);
|
||||
that.navList[0].num = data.sumCount || 0;
|
||||
that.navList[1].num = data.goodCount || 0;
|
||||
that.navList[2].num = data.inCount || 0;
|
||||
that.navList[3].num = data.poorCount || 0;
|
||||
});
|
||||
}
|
||||
getReplyConfig(that.product_id).then(res => {
|
||||
that.$set(that, "replyData", res.data);
|
||||
that.navList[0].num = res.data.sumCount;
|
||||
that.navList[1].num = res.data.goodCount;
|
||||
that.navList[2].num = res.data.inCount;
|
||||
that.navList[3].num = res.data.poorCount;
|
||||
});
|
||||
},
|
||||
getProductReplyList: function() {
|
||||
let that = this;
|
||||
if (that.loading) return;
|
||||
if (that.loadend) return;
|
||||
if (that.loading) return; //阻止下次请求(false可以进行请求);
|
||||
if (that.loadend) return; //阻止结束当前请求(false可以进行请求);
|
||||
that.loading = true;
|
||||
let q = { page: that.page, limit: that.limit, type: that.currentActive };
|
||||
if (that.isTravelGroup) {
|
||||
getJiaLouProductReply({
|
||||
travelGroupProductId: that.product_id,
|
||||
type: q.type,
|
||||
page: q.page,
|
||||
limit: q.limit
|
||||
}).then(res => {
|
||||
that.loading = false;
|
||||
const pageData = res.data || {};
|
||||
const rawList = Array.isArray(pageData.records) ? pageData.records : [];
|
||||
const list = rawList.map(item => {
|
||||
const productScore = Number(item.productScore) || 0;
|
||||
const serviceScore = Number(item.serviceScore) || 0;
|
||||
let star = productScore || serviceScore || 5;
|
||||
const skuText = '默认';
|
||||
const picturesArr = Array.isArray(item.pics) ? item.pics : [];
|
||||
return {
|
||||
...item,
|
||||
star,
|
||||
sku: item.travelGroupProductName || skuText,
|
||||
picturesArr
|
||||
};
|
||||
});
|
||||
that.reply.push.apply(that.reply, list);
|
||||
that.loadend = list.length < that.limit || !pageData.pages || that.page >= pageData.pages;
|
||||
that.page = that.page + 1;
|
||||
}).catch(() => {
|
||||
that.loading = false;
|
||||
});
|
||||
} else {
|
||||
getReplyList(that.product_id, q).then(res => {
|
||||
that.loading = false;
|
||||
const data = res.data || [];
|
||||
that.reply.push.apply(that.reply, data);
|
||||
that.loadend = data.length < that.limit;
|
||||
that.page = that.page + 1;
|
||||
}).catch(() => {
|
||||
that.loading = false;
|
||||
});
|
||||
}
|
||||
getReplyList(that.product_id, q).then(res => {
|
||||
that.loading = false;
|
||||
//apply();js将一个数组插入另一个数组;
|
||||
that.reply.push.apply(that.reply, res.data);
|
||||
that.loadend = res.data.length < that.limit; //判断所有数据是否加载完成;
|
||||
that.page = that.page + 1;
|
||||
});
|
||||
},
|
||||
changeType: function(index) {
|
||||
let that = this;
|
||||
|
||||
@@ -252,8 +252,7 @@ export default {
|
||||
setHistory(word) {
|
||||
const index = this.historyKey.findIndex(item => item.word === word)
|
||||
if (index > -1) {
|
||||
this.historyKey.splice(index, 1)
|
||||
// return
|
||||
return
|
||||
}
|
||||
this.historyKey.unshift({id: this.$global.generateMixed(10), word })
|
||||
uni.setStorageSync('historyKey', JSON.stringify(this.historyKey))
|
||||
|
||||
@@ -73,12 +73,11 @@
|
||||
:style="giftBg ? 'background: url(' + giftBg + ') no-repeat center/cover' : ''"
|
||||
:class="giftBg ? '' : 'v12-primary'"
|
||||
>
|
||||
<text v-if="storeInfo.discount > 0" class="v12-font-28 v12-yellow-text ll-text">平台限时补贴{{ storeInfo.discount }}折</text>
|
||||
<view class="v12-font-28 v12-align-center" style="height: 74rpx; opacity: 0;">
|
||||
<image class="gift-img" :src="webUrl + '/orderIcon/gift.png'" mode="widthFix" ></image>
|
||||
支持礼包赠送
|
||||
</view>
|
||||
<view @click="toGift" class="v12-white v12-dark-text v12-radius-20 v12-font-28 gift-btn" v-if="!giftBg">
|
||||
<view @click="toGift" class="v12-white v12-dark-text v12-radius-20 v12-font-28 gift-btn" style="opacity: 0;">
|
||||
送给朋友
|
||||
</view>
|
||||
</view>
|
||||
@@ -207,8 +206,7 @@
|
||||
@ok="setCoupon"
|
||||
@change="changeCoupons"
|
||||
@close="changeCoupons()"
|
||||
:showTab="false"
|
||||
:showRadio="false"
|
||||
:showTab="false"
|
||||
:currentPrice="storeInfo.price" />
|
||||
</u-popup>
|
||||
<!-- v9 优惠券结束 -->
|
||||
@@ -275,9 +273,6 @@
|
||||
<image class="logo" :src="webUrl+'/orderIcon/地址.png'" mode="" style="margin-right:0; width: 32rpx; height:32rpx; opacity: 0;"/>
|
||||
<text v-if="storeInfo.isFastPost == 1">预计48小时内发货</text>
|
||||
<text v-if="storeInfo.isFastPost == 2">预计72小时内发货</text>
|
||||
<text v-if="storeInfo.isFastPost == 3">预计24小时内发货</text>
|
||||
<text v-if="storeInfo.isFastPost == 4">预计7天内发货</text>
|
||||
<text v-if="storeInfo.isFastPost == 5">预计15天内发货</text>
|
||||
<text v-if="storeInfo.isFastPost == 0">{{ "预计发货时间:" + storeInfo.postTime }}</text>
|
||||
</view>
|
||||
</view>
|
||||
@@ -659,10 +654,6 @@ export default {
|
||||
},
|
||||
computed: mapGetters(['isLogin', 'location', 'userInfo']),
|
||||
onShareAppMessage() {
|
||||
uni.updateShareMenu({
|
||||
isPrivateMessage: false,
|
||||
withShareTicket: false
|
||||
})
|
||||
return new Promise(async (resolve, reject) => {
|
||||
let result;
|
||||
let params = `?id=${this.id}&partnerId=${this.userInfo.uid}`
|
||||
@@ -688,43 +679,6 @@ export default {
|
||||
}
|
||||
})
|
||||
},
|
||||
onShareTimeline() {
|
||||
uni.updateShareMenu({
|
||||
isPrivateMessage: false,
|
||||
withShareTicket: false
|
||||
})
|
||||
const storeName = this.storeInfo.storeName
|
||||
const promise = new Promise(async (resolve, reject) => {
|
||||
let result = null
|
||||
let query = `id=${this.id}&partnerId=${this.userInfo.uid}`
|
||||
if (this.source === 'famous') {
|
||||
result = await famousGoodsShareImage(this.id)
|
||||
}
|
||||
if (this.source === 'kill') {
|
||||
result = await secKillGoodsShareImage(this.activityId)
|
||||
query += `&activityId=${this.activityId}`
|
||||
}
|
||||
if (result && result.status === 200) {
|
||||
resolve({
|
||||
title: storeName,
|
||||
query,
|
||||
imageUrl: result.data
|
||||
})
|
||||
} else {
|
||||
resolve({
|
||||
title: storeName,
|
||||
query,
|
||||
imageUrl: this.storeInfo.image
|
||||
})
|
||||
}
|
||||
})
|
||||
return {
|
||||
title: storeName,
|
||||
query: `id=${this.id}&partnerId=${this.userInfo.uid}`,
|
||||
imageUrl: this.storeInfo.image,
|
||||
promise
|
||||
}
|
||||
},
|
||||
onLoad(options) {
|
||||
// test data
|
||||
console.log("getLaunchOptionsSync", uni.getLaunchOptionsSync())
|
||||
@@ -901,18 +855,17 @@ export default {
|
||||
})
|
||||
},
|
||||
async getMapData() {
|
||||
const location = uni.getStorageSync('location')
|
||||
let location = uni.getStorageSync('location')
|
||||
if (location.length === 0) {
|
||||
const map = await getLocation()
|
||||
if (map.length > 1) {
|
||||
const {latitude, longitude} = map[1]
|
||||
getCurAddress(latitude, longitude, address => {
|
||||
this.postAddress = address.formattedAddress
|
||||
})
|
||||
let address = await getCurAddress(latitude, longitude)
|
||||
address = address[1].data.result.ad_info
|
||||
location = address.province + address.city + address.district
|
||||
}
|
||||
} else {
|
||||
this.postAddress = location
|
||||
}
|
||||
this.postAddress = location
|
||||
},
|
||||
// 获取当前位置经纬度
|
||||
handleLoacation(toast) {
|
||||
@@ -924,9 +877,9 @@ export default {
|
||||
const map = await getLocation();
|
||||
if (map.length > 1) {
|
||||
const {latitude, longitude} = map[1]
|
||||
getCurAddress(latitude, longitude, address => {
|
||||
that.postAddress = address.formattedAddress
|
||||
})
|
||||
let address = await getCurAddress(latitude, longitude)
|
||||
address = address[1].data.result.ad_info
|
||||
that.postAddress = address.province + address.city + address.district
|
||||
}
|
||||
},
|
||||
fail: err => {
|
||||
@@ -1504,7 +1457,7 @@ export default {
|
||||
path: "/pages/order/OrderSubmission/index",
|
||||
query: {
|
||||
id: res.data.cartId,
|
||||
discount: that.storeInfo.discount,
|
||||
couponId: that.couponId // 优惠券ID
|
||||
}
|
||||
})
|
||||
return
|
||||
@@ -1512,8 +1465,7 @@ export default {
|
||||
if(news === 2) {
|
||||
const coupId = that.couponId ? that.couponId : (that.couponList.usable[0] && that.couponList.usable[0].id || '')
|
||||
uni.navigateTo({
|
||||
// + '&couponId=' + coupId
|
||||
url: '/pkg_user/views/gift/gift?cartId=' + res.data.cartId + (that.storeInfo.discount ? '&discount=' + that.storeInfo.discount : '')
|
||||
url: '/pkg_user/views/gift/gift?cartId=' + res.data.cartId + '&couponId=' + coupId
|
||||
})
|
||||
}
|
||||
if(news === 0) {
|
||||
@@ -2229,8 +2181,4 @@ export default {
|
||||
left: 0;
|
||||
width: 100%;
|
||||
}
|
||||
.ll-text{
|
||||
margin-left: 250rpx;
|
||||
word-break: keep-all;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,22 +1,7 @@
|
||||
<template>
|
||||
<view class="evaluate-con">
|
||||
<view
|
||||
v-if="isTravelGroup && travelOrderInfo && travelOrderInfo.travelGroupOrderInfo && travelOrderInfo.travelGroupOrderInfo.travelGroupProduct"
|
||||
class="goodsStyle acea-row row-between"
|
||||
>
|
||||
<view class="pictrue">
|
||||
<image :src="travelOrderInfo.travelGroupOrderInfo.travelGroupProduct.mainImage" class="image"/>
|
||||
</view>
|
||||
<view class="text acea-row row-between">
|
||||
<view class="name line2">{{ travelOrderInfo.travelGroupOrderInfo.travelGroupProduct.name }}</view>
|
||||
<view class="money">
|
||||
<view>¥{{ travelOrderInfo.travelGroupOrderInfo.travelGroupProduct.price }}</view>
|
||||
<view class="num">x1</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view
|
||||
v-else-if="orderCon.productInfo"
|
||||
v-if="orderCon.productInfo"
|
||||
class="goodsStyle acea-row row-between"
|
||||
>
|
||||
<view class="pictrue">
|
||||
@@ -93,7 +78,6 @@
|
||||
</template>
|
||||
<script>
|
||||
import { postOrderComment, postOrderProduct } from '@/api/store'
|
||||
import { fetchSojoumOrderDetail, sojoumOrderComment } from '@/api/sojoumOrder'
|
||||
import { trim } from '@/utils'
|
||||
import { required } from '@/utils/validate'
|
||||
import { validatorDefaultCatch } from '@/utils/dialog'
|
||||
@@ -120,8 +104,6 @@ export default {
|
||||
productInfo: {}
|
||||
}
|
||||
},
|
||||
isTravelGroup: false,
|
||||
travelOrderInfo: null,
|
||||
scoreList: [
|
||||
{
|
||||
name: '商品质量',
|
||||
@@ -143,19 +125,9 @@ export default {
|
||||
},
|
||||
mounted() {
|
||||
this.unique = this.$yroute.query.id
|
||||
this.isTravelGroup = this.$yroute.query.isTravelGroup === '1'
|
||||
if (this.isTravelGroup) {
|
||||
this.getTravelOrderDetail()
|
||||
} else {
|
||||
this.getOrderProduct()
|
||||
}
|
||||
this.getOrderProduct()
|
||||
},
|
||||
methods: {
|
||||
getTravelOrderDetail() {
|
||||
fetchSojoumOrderDetail({ key: this.unique }).then(res => {
|
||||
this.travelOrderInfo = res.data
|
||||
})
|
||||
},
|
||||
getOrderProduct() {
|
||||
postOrderProduct(this.unique).then(res => {
|
||||
this.orderCon = res.data
|
||||
@@ -193,26 +165,14 @@ export default {
|
||||
} catch (e) {
|
||||
return validatorDefaultCatch(e)
|
||||
}
|
||||
const pics = this.picArr
|
||||
const video = this.videoArr[0] || ''
|
||||
const request = this.isTravelGroup
|
||||
? sojoumOrderComment({
|
||||
orderId: this.unique,
|
||||
comment: expect,
|
||||
pics,
|
||||
video,
|
||||
productScore: product_score,
|
||||
serviceScore: service_score
|
||||
})
|
||||
: postOrderComment({
|
||||
productScore: product_score,
|
||||
serviceScore: service_score,
|
||||
unique: this.unique,
|
||||
pics: this.picArr.join(','),
|
||||
comment: expect,
|
||||
video: this.videoArr.join(',')
|
||||
})
|
||||
request.then(() => {
|
||||
postOrderComment({
|
||||
productScore: product_score,
|
||||
serviceScore: service_score,
|
||||
unique: this.unique,
|
||||
pics: this.picArr.join(','),
|
||||
comment: expect,
|
||||
video: this.videoArr.join(',')
|
||||
}).then(() => {
|
||||
uni.showToast({
|
||||
title: '评价成功',
|
||||
icon: 'success',
|
||||
|
||||
@@ -119,16 +119,7 @@
|
||||
{{ item.name }}
|
||||
</view>
|
||||
<view class="type">
|
||||
<view
|
||||
v-if="item.isTravel === 1"
|
||||
class="type-tag-travel"
|
||||
>
|
||||
旅居店铺
|
||||
</view>
|
||||
<view
|
||||
v-else-if="item.typeName"
|
||||
class="type-tag"
|
||||
>
|
||||
<view v-if="item.typeName" class="type-tag">
|
||||
{{ item.typeName }}
|
||||
</view>
|
||||
<view v-else> </view>
|
||||
@@ -149,17 +140,9 @@
|
||||
@click="goGoodsCon(good.productId)"
|
||||
>
|
||||
<image :src="good.productImage" class="img" />
|
||||
<view class="price" style="width: fit-content;">
|
||||
<text v-if="good.isNegotiable !== 1" class="txt">¥</text>
|
||||
<text v-if="good.isNegotiable !== 1" class="">
|
||||
{{ force2Decimal(good.productPrice) }}
|
||||
</text>
|
||||
<text
|
||||
v-if="good.isNegotiable === 1"
|
||||
class="v12-primary-text v12-font-28 v12-font-weight"
|
||||
>
|
||||
价格面议
|
||||
</text>
|
||||
<view class="price">
|
||||
<text class="txt">¥</text>
|
||||
{{ force2Decimal(good.productPrice) }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
@@ -192,7 +175,7 @@
|
||||
:cartNum="cart_num"
|
||||
:showOk="true"
|
||||
@changeFun="changeFun"
|
||||
@ok="handleOk(() => this.getCartCount())"
|
||||
@ok="handleOk"
|
||||
/>
|
||||
</view>
|
||||
</template>
|
||||
@@ -205,6 +188,9 @@ import NP from 'number-precision'
|
||||
import NoGoodData from '@/components/good/NoData'
|
||||
import Recommend from '@/components/Recommend'
|
||||
import goCartMixin from '@/mixins/goCartMixins'
|
||||
import {
|
||||
getCartCount,
|
||||
} from '@/api/store'
|
||||
export default {
|
||||
name: 'GoodsList',
|
||||
components: {
|
||||
@@ -215,6 +201,7 @@ export default {
|
||||
mixins: [goCartMixin],
|
||||
data () {
|
||||
return {
|
||||
CartCount: 0,
|
||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||
list: [],
|
||||
query: {
|
||||
@@ -245,7 +232,17 @@ export default {
|
||||
!this.loading && this.getList()
|
||||
},
|
||||
methods: {
|
||||
|
||||
// 获取购物车数量
|
||||
getCartCount () {
|
||||
const isLogin = this.isLogin
|
||||
if (isLogin) {
|
||||
getCartCount({
|
||||
numType: 0
|
||||
}).then(res => {
|
||||
this.CartCount = res.data.count
|
||||
})
|
||||
}
|
||||
},
|
||||
goShoppingCart() {
|
||||
this.$yrouter.switchTab('/pages/cart')
|
||||
},
|
||||
@@ -270,18 +267,12 @@ export default {
|
||||
})
|
||||
},
|
||||
hotelItemClick(item) {
|
||||
if (item.isTravel === 1) {
|
||||
uni.navigateTo({
|
||||
url: '/pkg_product/views/sojoumStore?id=' + item.id
|
||||
})
|
||||
} else {
|
||||
this.$yrouter.push({
|
||||
path: '/pagesInn/inn/innHome',
|
||||
query: {
|
||||
id: item.id
|
||||
}
|
||||
})
|
||||
}
|
||||
this.$yrouter.push({
|
||||
path: '/pagesInn/inn/innHome',
|
||||
query: {
|
||||
id: item.id
|
||||
}
|
||||
})
|
||||
},
|
||||
getList() {
|
||||
if (this.loading || this.loadend) {
|
||||
@@ -546,13 +537,6 @@ export default {
|
||||
color: #946300;
|
||||
background: linear-gradient(to bottom, #FDF8B9, #E3A72C);
|
||||
}
|
||||
.type-tag-travel {
|
||||
padding: 2px 6px;
|
||||
border-radius: 3px;
|
||||
font-size: 12px;
|
||||
color: #fff;
|
||||
background: linear-gradient(to bottom, #77E49F, #4FA379);
|
||||
}
|
||||
}
|
||||
.desc {
|
||||
display: flex;
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
:src="webUrl + '/20230803152147141807.png'"
|
||||
class="icon"
|
||||
/>
|
||||
<text class="seeNum-txt v12-font-28">{{ $formatCount(item.pv) }}</text>
|
||||
<text class="seeNum-txt v12-font-28">{{ item.pv }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
@@ -211,9 +211,7 @@ export default {
|
||||
},
|
||||
getActive() {
|
||||
const params = {
|
||||
ancientTownId: this.id,
|
||||
page: 1,
|
||||
pageSize: 9999
|
||||
ancientTownId: this.id
|
||||
}
|
||||
getAncientTownActive(params).then(res => {
|
||||
this.activeties = res.data.records || []
|
||||
|
||||
@@ -27,13 +27,6 @@
|
||||
class="v12-white v12-radius-20 history-card"
|
||||
@click="goodsDetail(historyItem)"
|
||||
>
|
||||
<view class="delete-icon" @click.stop="deleteHistoryItem(historyItem)">
|
||||
<u-icon
|
||||
name="close"
|
||||
color="#fff"
|
||||
size="16"
|
||||
/>
|
||||
</view>
|
||||
<image
|
||||
class="goods-img"
|
||||
:src="historyItem.image"
|
||||
@@ -90,7 +83,7 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getHistory, deleteHistory as deleteHistoryApi } from '@/api/user'
|
||||
import { getHistory } from '@/api/user'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
@@ -186,21 +179,6 @@ export default {
|
||||
}
|
||||
})
|
||||
},
|
||||
deleteHistoryItem(historyItem) {
|
||||
const id = historyItem.id
|
||||
if (!id) return
|
||||
uni.showModal({
|
||||
title: '提示',
|
||||
content: '确认删除该浏览足迹吗?',
|
||||
success: (res) => {
|
||||
if (res.confirm) {
|
||||
deleteHistoryApi(id).then(() => {
|
||||
this.queryHistory()
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
queryHistory() {
|
||||
this.items = []
|
||||
this.isLoad = false
|
||||
@@ -267,7 +245,6 @@ export default {
|
||||
margin-right: 16rpx;
|
||||
border-radius: 20rpx;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
&:nth-child(3n) {
|
||||
margin-right: 0;
|
||||
}
|
||||
@@ -294,19 +271,6 @@ export default {
|
||||
}
|
||||
}
|
||||
}
|
||||
.delete-icon{
|
||||
position: absolute;
|
||||
top: 8rpx;
|
||||
right: 8rpx;
|
||||
z-index: 2;
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
border-radius: 16rpx;
|
||||
// background-color: rgba(0, 0, 0, 0.35);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.active{
|
||||
background: #C52733;
|
||||
color: #fff !important;
|
||||
@@ -319,4 +283,4 @@ export default {
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
</style>
|
||||
</style>
|
||||
@@ -402,7 +402,6 @@ export default {
|
||||
}
|
||||
},
|
||||
onShow() {
|
||||
uni.$emit('updateUnreadMessageCount')
|
||||
if (this.$store.getters.token) {
|
||||
this.isNoLogin = false
|
||||
uni.showLoading({
|
||||
|
||||
@@ -13,11 +13,11 @@
|
||||
<view class="acea-row row-left row-middle">
|
||||
<view class="see-num-box acea-row row-middle" style="margin-right: 20rpx;">
|
||||
<image :src="webUrl+'/20230304131559277594.png'" class="eye-icon" mode=""></image>
|
||||
<text class="see-num-text">{{$formatCount(item.pv||0)}}</text>
|
||||
<text class="see-num-text">{{item.pv||0}}</text>
|
||||
</view>
|
||||
<view class="zan-num-box acea-row row-middle">
|
||||
<img class="zan-icon" :src="webUrl+'/20230304133322439350.png'" />
|
||||
<text class="zan-num-text">{{$formatCount(item.zan||0)}}</text>
|
||||
<text class="zan-num-text">{{item.zan||0}}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
:items="district"
|
||||
></CitySelect>
|
||||
</view>
|
||||
<view class="iconfont icon-dizhi font-color-red" @click="getCurAddressFn()"></view>
|
||||
<view class="iconfont icon-dizhi font-color-red" @click="getCurAddress()"></view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="item acea-row row-between-wrapper" style="flex-wrap: nowrap;">
|
||||
@@ -32,8 +32,7 @@
|
||||
<view class="address-analysis-wrap">
|
||||
<view class="inp">
|
||||
<textarea
|
||||
:value="addressInput"
|
||||
@input="handleAddressInput"
|
||||
v-model.trim="addressInput"
|
||||
placeholder="请粘贴收件人手机号、姓名、收货地址并用空格区分,系统将自动识别地址信息"
|
||||
placeholder-style="font-size:24rpx;color:#C2C5CC;"
|
||||
class="inp-textarea"
|
||||
@@ -75,7 +74,7 @@
|
||||
|
||||
<script type="text/babel">
|
||||
import CitySelect from '@/components/CitySelect'
|
||||
import {getCurAddress, getLocation} from "@/utils/common"
|
||||
import config from '@/utils/mapConfig'
|
||||
import { getAddress, getCity, postAddress, analysisAddress } from '@/api/user'
|
||||
import attrs, { chs_extphone, required } from '@/utils/validate'
|
||||
import { validatorDefaultCatch } from '@/utils/dialog'
|
||||
@@ -127,12 +126,6 @@ export default {
|
||||
this.getUserAddress()
|
||||
this.getCityList()
|
||||
},
|
||||
beforeDestroy() {
|
||||
// 清除定时器,避免内存泄漏
|
||||
if (this.inputTimer) {
|
||||
clearTimeout(this.inputTimer);
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getIndex(value, arr) {
|
||||
var idx = -1
|
||||
@@ -148,17 +141,6 @@ export default {
|
||||
if (!this.addressInput) return
|
||||
this.addressInput = ''
|
||||
},
|
||||
handleAddressInput(e) {
|
||||
// 清除之前的定时器
|
||||
if (this.inputTimer) {
|
||||
clearTimeout(this.inputTimer);
|
||||
}
|
||||
|
||||
// 设置新的定时器,延迟300ms执行
|
||||
this.inputTimer = setTimeout(() => {
|
||||
this.addressInput = e.target.value.trim();
|
||||
}, 300);
|
||||
},
|
||||
// 识别
|
||||
distinguishHandle() {
|
||||
if (!this.addressInput) return
|
||||
@@ -192,33 +174,113 @@ export default {
|
||||
})
|
||||
},
|
||||
//获取当前定位地址
|
||||
async getCurAddressFn() {
|
||||
const that = this
|
||||
getCurAddress() {
|
||||
|
||||
var that = this;
|
||||
//定位
|
||||
uni.showLoading({
|
||||
title: '定位中...'
|
||||
})
|
||||
const map = await getLocation()
|
||||
if (map.length > 1) {
|
||||
const {latitude, longitude} = map[1]
|
||||
getCurAddress(latitude, longitude, address => {
|
||||
that.addressText = address.province + " " + address.city + " " + address.county
|
||||
that.address.province = address.province
|
||||
that.address.city = address.city
|
||||
that.address.district = address.county
|
||||
that.$set(that.userAddress, 'detail', address.formattedAddress)
|
||||
// 设置city_id
|
||||
const pIdx = that.getIndex(that.address.province, that.district)
|
||||
if (pIdx > -1) {
|
||||
const citys = that.district[pIdx].c
|
||||
const cIdx = that.getIndex(that.address.city, citys)
|
||||
if (cIdx > -1) {
|
||||
const city = citys[cIdx]
|
||||
that.address.city_id = city.v
|
||||
console.log('city_id:' + city.v)
|
||||
});
|
||||
|
||||
//this.getLocation();
|
||||
|
||||
uni.getLocation({
|
||||
type: 'wgs84',
|
||||
success: function (res) {
|
||||
let latitude = res.latitude;
|
||||
let longitude = res.longitude;
|
||||
|
||||
console.log('latitude:' + latitude + 'longitude:' + longitude)
|
||||
|
||||
// #ifdef H5
|
||||
Vue.jsonp(
|
||||
'https://apis.map.qq.com/ws/geocoder/v1/?location=' + latitude + ',' + longitude + '&key=' + config.key,
|
||||
{
|
||||
//callbackName: 'QQmap',
|
||||
output: 'jsonp',
|
||||
}).then(json => {
|
||||
// Success.
|
||||
uni.hideLoading();
|
||||
|
||||
that.addressText =
|
||||
json.result.ad_info.province + " " + json.result.ad_info.city + " " + json.result.ad_info.district;
|
||||
that.address.province = json.result.ad_info.province;
|
||||
that.address.city = json.result.ad_info.city;
|
||||
that.address.district = json.result.ad_info.district;
|
||||
that.$set(that.userAddress, 'detail', json.result.formatted_addresses.recommend);
|
||||
//that.userAddress.detail = json.result.formatted_addresses.recommend;
|
||||
// that.$refs.cityselect.adjustDefaultValue();
|
||||
|
||||
//设置city_id
|
||||
var pIdx = that.getIndex(that.address.province, that.district);
|
||||
if (pIdx > -1) {
|
||||
var citys = that.district[pIdx].c;
|
||||
var cIdx = that.getIndex(that.address.city, citys);
|
||||
if (cIdx > -1) {
|
||||
var city = citys[cIdx];
|
||||
that.address.city_id = city.v;
|
||||
console.log('city_id:' + city.v);
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
}).catch(err => {
|
||||
// Failed.
|
||||
console.log('地址解析失败:' + JSON.stringify(err));
|
||||
uni.hideLoading();
|
||||
})
|
||||
// #endif
|
||||
|
||||
// #ifndef H5
|
||||
uni.request({
|
||||
url: 'https://apis.map.qq.com/ws/geocoder/v1/?location=' + latitude + ',' + longitude + '&key=' + config.key,
|
||||
success: function (res) {
|
||||
// console.log('res:'+JSON.stringify(res.data));
|
||||
uni.hideLoading();
|
||||
that.addressText =
|
||||
res.data.result.ad_info.province + " " + res.data.result.ad_info.city + " " + res.data.result.ad_info.district;
|
||||
that.address.province = res.data.result.ad_info.province;
|
||||
that.address.city = res.data.result.ad_info.city;
|
||||
that.address.district = res.data.result.ad_info.district;
|
||||
//that.userAddress.detail = res.data.result.formatted_addresses.recommend;
|
||||
that.$set(that.userAddress, 'detail', res.data.result.formatted_addresses.recommend);
|
||||
// that.$refs.cityselect.adjustDefaultValue();
|
||||
//设置city_id
|
||||
var pIdx = that.getIndex(that.address.province, that.district);
|
||||
if (pIdx > -1) {
|
||||
var citys = that.district[pIdx].c;
|
||||
var cIdx = that.getIndex(that.address.city, citys);
|
||||
if (cIdx > -1) {
|
||||
var city = citys[cIdx];
|
||||
that.address.city_id = city.v;
|
||||
console.log('city_id:' + city.v);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
},
|
||||
fail: function (res) {
|
||||
console.log('地址解析失败');
|
||||
uni.hideLoading();
|
||||
},
|
||||
complete: function () {
|
||||
|
||||
}
|
||||
});
|
||||
// #endif
|
||||
},
|
||||
fail: function (res) {
|
||||
uni.hideLoading();
|
||||
|
||||
// uni.showToast({
|
||||
// title:'城市定位失败:'+JSON.stringify(res),
|
||||
// icon:'none',
|
||||
// duration:2000
|
||||
// })
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
},
|
||||
getCityList: function () {
|
||||
let that = this;
|
||||
|
||||
@@ -9,9 +9,6 @@
|
||||
</view>
|
||||
<view style="position: relative;" class="item" v-for="(item, addressListIndex) in addressList"
|
||||
:key="addressListIndex" @click="tapAddress(item)">
|
||||
<view v-if="choosMode" @click.stop="editAddress(addressListIndex)" style="position: absolute; right: 20rpx; top: 0; z-index: 10; padding: 0;" :style="item.isDefault||item.isDefault=='1' ? 'right: 80rpx' : ''">
|
||||
<text class="iconfont icon-bianji" style="color: #999; font-size: 32rpx;"></text>
|
||||
</view>
|
||||
<view v-if="item.isDefault||item.isDefault=='1' ? true : false" class=""
|
||||
style="position: absolute;top: 0;right: 0;">
|
||||
<image style="width: 72rpx;height: 36rpx;" :src="webUrl+'/20210807165228290910.png'" mode=""></image>
|
||||
@@ -30,7 +27,7 @@
|
||||
<u-icon name="checkbox-mark" color="#C52733" size="20"></u-icon>
|
||||
</view>
|
||||
</view>
|
||||
<view class="operation acea-row row-between-wrapper" v-if="!choosMode">
|
||||
<view v-if="!choosMode" class="operation acea-row row-between-wrapper">
|
||||
<view class="select-btn">
|
||||
<view class="checkbox-wrapper">
|
||||
<checkbox-group @change.stop="radioChange(item.id)">
|
||||
@@ -150,11 +147,6 @@ export default {
|
||||
uni.setStorageSync('giftChooseAddress', item)
|
||||
this.$yrouter.back()
|
||||
}
|
||||
// 来源修改订单地址(复用订单创建页的choosMode但避免污染chooseAddress)
|
||||
if (this.choosMode === 4) {
|
||||
uni.setStorageSync('updateOrderAddress', item)
|
||||
this.$yrouter.back()
|
||||
}
|
||||
},
|
||||
refresh() {
|
||||
this.addressList = []
|
||||
@@ -180,7 +172,7 @@ export default {
|
||||
this.loadend = res.data.length < this.limit
|
||||
this.page = this.page + 1
|
||||
if (this.choosMode === 1) {
|
||||
this.currentId = uni.getStorageSync('sourceAddress') ? uni.getStorageSync('sourceAddress').id : this.addressList.find(e => e.isDefault === 1) ? this.addressList.find(e => e.isDefault === 1).id : null
|
||||
this.currentId = uni.getStorageSync('chooseAddress') ? uni.getStorageSync('chooseAddress').id : this.addressList.find(e => e.isDefault === 1) ? this.addressList.find(e => e.isDefault === 1).id : null
|
||||
}
|
||||
// 来源购物车
|
||||
if (this.choosMode === 2) {
|
||||
@@ -190,24 +182,6 @@ export default {
|
||||
if (this.choosMode === 3) {
|
||||
this.currentId = uni.getStorageSync('giftChooseAddress') ? uni.getStorageSync('giftChooseAddress').id : this.addressList.find(e => e.isDefault === 1) ? this.addressList.find(e => e.isDefault === 1).id : null
|
||||
}
|
||||
// 来源修改订单地址
|
||||
if (this.choosMode === 4) {
|
||||
const sourceAddress = uni.getStorageSync('updateOrderSourceAddress') || {}
|
||||
let currentId = sourceAddress.id || null
|
||||
if (!currentId && sourceAddress.userAddress) {
|
||||
const sourceAddressText = String(sourceAddress.userAddress).replace(/\s+/g, '')
|
||||
const sourceRealName = String(sourceAddress.realName || '').trim()
|
||||
const sourcePhone = String(sourceAddress.phone || '').trim()
|
||||
const matched = this.addressList.find(e => {
|
||||
const addressText = `${e.province || ''}${e.city || ''}${e.district || ''}${e.detail || ''}`.replace(/\s+/g, '')
|
||||
const sameAddress = sourceAddressText && addressText === sourceAddressText
|
||||
const samePerson = sourceRealName && sourcePhone && String(e.realName || '').trim() === sourceRealName && String(e.phone || '').trim() === sourcePhone
|
||||
return sameAddress || samePerson
|
||||
})
|
||||
currentId = matched ? matched.id : null
|
||||
}
|
||||
this.currentId = currentId || (this.addressList.find(e => e.isDefault === 1) ? this.addressList.find(e => e.isDefault === 1).id : null)
|
||||
}
|
||||
})
|
||||
},
|
||||
/**
|
||||
|
||||
@@ -273,7 +273,7 @@
|
||||
:src="webUrl + '/20230803152147141807.png'"
|
||||
class="icon"
|
||||
/>
|
||||
<text class="seeNum-txt">{{ $formatCount(item.pv) }}</text>
|
||||
<text class="seeNum-txt">{{ item.pv }}</text>
|
||||
</view>
|
||||
<view class="flex">
|
||||
<image
|
||||
@@ -292,7 +292,7 @@
|
||||
v-show="item.zan > 0"
|
||||
:class="item.zanVo ? 'on' : ''"
|
||||
class="seeNum-txt"
|
||||
>{{ $formatCount(item.zan) }}</text>
|
||||
>{{ item.zan }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
<view class="">
|
||||
<CitySelect
|
||||
ref="cityselect"
|
||||
:defaultValue="addressText || ''"
|
||||
:defaultValue="addressText"
|
||||
@callback="result"
|
||||
:items="district"
|
||||
></CitySelect>
|
||||
|
||||
+6
-120
@@ -272,7 +272,7 @@
|
||||
:src="webUrl + '/20230803152147141807.png'"
|
||||
class="icon"
|
||||
/>
|
||||
<text class="seeNum-txt">{{ $formatCount(item.pv) }}</text>
|
||||
<text class="seeNum-txt">{{ item.pv }}</text>
|
||||
</view>
|
||||
<view class="flex">
|
||||
<image
|
||||
@@ -291,15 +291,7 @@
|
||||
v-show="item.zan > 0"
|
||||
:class="item.zanVo ? 'on' : ''"
|
||||
class="seeNum-txt"
|
||||
>{{ $formatCount(item.zan) }}</text>
|
||||
</view>
|
||||
<view class="flex" @click="infoClick(item)">
|
||||
<!-- <image
|
||||
:src="webUrl + '/20230803152147141807.png'"
|
||||
class="icon"
|
||||
/> -->
|
||||
<u-icon name="chat" size="24"></u-icon>
|
||||
<text class="seeNum-txt">{{ $formatCount(item.replyCount || 0) }}</text>
|
||||
>{{ item.zan }}</text>
|
||||
</view>
|
||||
<view v-if="isMyInn" class="flex more-btn" @click="toggleMoreHandle(index)">
|
||||
<image
|
||||
@@ -343,77 +335,6 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="comment-list v12-px-3" v-if="item.latestReplyList" @click="infoClick(item)">
|
||||
<view class="v12-mt-2" v-for="(comment, i) in item.latestReplyList" :key="i">
|
||||
<view class="user-info v12-align-center">
|
||||
<view class="user-avatar">
|
||||
<u-avatar :src="comment.userAvatar"></u-avatar>
|
||||
</view>
|
||||
<view class="user-name v12-ml-3">
|
||||
<view class="v12-font-bold v12-dark-text v12-font-32">
|
||||
<text>{{ comment.userNickName }}</text>
|
||||
<text v-if="comment.userIsAdmin" class="v12-ml-1 v12-primary v12-white-text v12-font-24 v12-font-weight-400 v12-px-1 v12-radius-8">
|
||||
{{ '店主' }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="v12-font-22 v12-secondary-dark-text v12-mt-1">
|
||||
<text>{{ formatterTime(comment.createTime) }}</text>
|
||||
<text v-if="comment.at">
|
||||
{{ ' 回复 ' + comment.at.atNickName }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="user-info v12-d-flex" >
|
||||
<view class="user-avatar">
|
||||
<view style="opacity: 0;">
|
||||
<u-avatar></u-avatar>
|
||||
</view>
|
||||
</view>
|
||||
<view class="user-name v12-ml-3">
|
||||
<view class="v12-font-28 v12-dark-text">
|
||||
{{ comment.reply }}
|
||||
</view>
|
||||
<view v-if="comment.children">
|
||||
<view class="v12-mt-2" v-for="(_comment, atIndex) in comment.children" :key="atIndex">
|
||||
<view class="user-info v12-align-center">
|
||||
<view class="user-avatar">
|
||||
<u-avatar size="35" :src="_comment.userAvatar"></u-avatar>
|
||||
</view>
|
||||
<view class="user-name v12-ml-3">
|
||||
<view class="v12-font-bold v12-dark-text v12-font-32">
|
||||
<text>{{ _comment.userNickName }}</text>
|
||||
<text v-if="_comment.userIsAdmin" class="v12-ml-1 v12-primary v12-white-text v12-font-24 v12-font-weight-400 v12-px-1 v12-radius-8">
|
||||
{{ '店主' }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="v12-font-22 v12-secondary-dark-text v12-mt-1">
|
||||
<text>{{ formatterTime(_comment.createTime) }}</text>
|
||||
<text v-if="_comment.at && _comment.parentReplyId !== comment.id">
|
||||
{{ ' 回复 ' + _comment.at.atNickName }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="user-info v12-align-center">
|
||||
<view class="user-avatar">
|
||||
<view style="opacity: 0;">
|
||||
<u-avatar size="35"></u-avatar>
|
||||
</view>
|
||||
</view>
|
||||
<view class="user-name v12-ml-3">
|
||||
<view class="v12-font-28 v12-dark-text">
|
||||
{{ _comment.reply }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
@@ -532,7 +453,7 @@ import {
|
||||
getHotelNewsZan,
|
||||
getHotelShareBackgroundImage,
|
||||
hotelNewsView,
|
||||
getMerchantApply,
|
||||
getMerchantApply
|
||||
} from "@/api/inn.js"
|
||||
import {formatDateTime} from "@/utils"
|
||||
import {getUrlParam} from "@/utils/common.js"
|
||||
@@ -587,8 +508,7 @@ export default {
|
||||
isLoadInfoListSuccess: false,
|
||||
pageKeyId: '',
|
||||
shareImg: '',
|
||||
videoPlayers: [],
|
||||
isView: false
|
||||
videoPlayers: []
|
||||
}
|
||||
},
|
||||
// 必须在页面加 onPageScroll(e){} ,才能滑动显示背景
|
||||
@@ -663,10 +583,6 @@ export default {
|
||||
})
|
||||
},
|
||||
onShareAppMessage() {
|
||||
uni.updateShareMenu({
|
||||
isPrivateMessage: false,
|
||||
withShareTicket: false
|
||||
})
|
||||
return {
|
||||
title: this.inn.name,
|
||||
path: '/pagesInn/inn/innHome?id=' + this.inn.id,
|
||||
@@ -674,21 +590,13 @@ export default {
|
||||
}
|
||||
},
|
||||
onShow() {
|
||||
console.log(this.infoArray);
|
||||
|
||||
if (!this.isLoad) {
|
||||
return
|
||||
}
|
||||
this.fetchInnDetail()
|
||||
if(this.isView) return
|
||||
if(this.activeIndex === 1) {
|
||||
this.fetchInnInfoList()
|
||||
return
|
||||
}
|
||||
if (uni.getStorageSync('hotelInfoPublish') === '1') {
|
||||
this.fetchInnInfoList()
|
||||
return
|
||||
}
|
||||
this.fetchInnDetail()
|
||||
},
|
||||
watch: {
|
||||
activeIndex: {
|
||||
@@ -703,25 +611,6 @@ export default {
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
formatterTime(time) {
|
||||
const now = new Date();
|
||||
const date = new Date(time);
|
||||
const diff = now - date;
|
||||
const diffMin = Math.floor(diff / 1000 / 60);
|
||||
const diffHour = Math.floor(diff / 1000 / 60 / 60);
|
||||
const diffDay = Math.floor(diff / 1000 / 60 / 60 / 24);
|
||||
if (diffMin < 1) {
|
||||
return "刚刚";
|
||||
} else if (diffHour < 1) {
|
||||
return diffMin + "分钟前";
|
||||
} else if (diffDay < 1) {
|
||||
return diffHour + "小时前";
|
||||
} else if (diffDay < 7) {
|
||||
return diffDay + "天前";
|
||||
} else {
|
||||
return date.getFullYear() + "年" + (date.getMonth() + 1) + "月" + date.getDate() + "日";
|
||||
}
|
||||
},
|
||||
goHome(e) {
|
||||
this.id = e.id
|
||||
this.isLoad = false
|
||||
@@ -730,7 +619,6 @@ export default {
|
||||
} else {
|
||||
this.fetchInnInfoList()
|
||||
}
|
||||
this.initPoster()
|
||||
this.fetchInnDetail()
|
||||
// this.fetchGoods(this.id)
|
||||
},
|
||||
@@ -834,7 +722,7 @@ export default {
|
||||
})
|
||||
},
|
||||
infoClick: function (info) {
|
||||
this.$yrouter.push('/pagesInn/inn/innInfoDetail?id=' + info.id)
|
||||
// this.$yrouter.push('/pagesInn/inn/innInfoDetail?id=' + info.id)
|
||||
},
|
||||
coverPlay(){
|
||||
this.videoPlayers.forEach(player => {
|
||||
@@ -864,7 +752,6 @@ export default {
|
||||
}
|
||||
uni.$u.debounce(() => {
|
||||
hotelNewsView({ id: item.id }).finally(() => {
|
||||
this.isView = true
|
||||
this.infoArray.map(info => {
|
||||
if (info.id === item.id) {
|
||||
info.pv += 1
|
||||
@@ -1013,7 +900,6 @@ export default {
|
||||
_this.isLoad = true
|
||||
}
|
||||
}).finally(() => {
|
||||
this.isView = false
|
||||
uni.stopPullDownRefresh()
|
||||
})
|
||||
},
|
||||
|
||||
+47
-853
@@ -1,884 +1,83 @@
|
||||
<template>
|
||||
<view class="info-section">
|
||||
<view class="info-item">
|
||||
<view
|
||||
:class="item.isTop === 1 ? 'info-item-top' : ''"
|
||||
:style="{
|
||||
'background-image': item.isTop
|
||||
? 'url(' + webUrl + '/page/hotel/info-top-bg.png)'
|
||||
: 'none',
|
||||
}"
|
||||
class="info-item-header"
|
||||
>
|
||||
<view class="name">
|
||||
{{ item.name }}
|
||||
</view>
|
||||
<view class="intro">
|
||||
{{ item.intro }}
|
||||
</view>
|
||||
</view>
|
||||
<view class="info-item-body">
|
||||
<view v-if="item.type === 'NT_VIDEO'" class="video">
|
||||
<video
|
||||
:src="item.video"
|
||||
:poster="item.video + '?vframe/jpg/offset/1'"
|
||||
controls
|
||||
play-btn-position="center"
|
||||
class="video-item"
|
||||
:id="'video-item' + index"
|
||||
/>
|
||||
</view>
|
||||
<view v-else>
|
||||
<img-box
|
||||
v-if="item.resources"
|
||||
:imgList="item.resources"
|
||||
:num="item.resources.length"
|
||||
:img-radius="10"
|
||||
style="width: 100%"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<view class="info-item-bottom">
|
||||
<view class="time">
|
||||
{{
|
||||
item.publishTime
|
||||
? item.publishTime.replace(/-/g, ".").substr(0, 10)
|
||||
: ""
|
||||
}}
|
||||
</view>
|
||||
<view class="btns">
|
||||
<view class="flex">
|
||||
<image :src="webUrl + '/20230803152147141807.png'" class="icon" />
|
||||
<text class="seeNum-txt">{{ $formatCount(item.pv) }}</text>
|
||||
<view class="pages-inn-info-detail">
|
||||
<view class="top-box">
|
||||
<view class="title more-t">{{ info.name }}</view>
|
||||
|
||||
<view class="sub flex jc-between ai-center">
|
||||
<text class="datetime">{{ info.createdTime }}</text>
|
||||
<view class="flex ai-center">
|
||||
<view class="flex ai-center" style="margin-right: 28rpx">
|
||||
<image :src="webUrl+'/20230803152147141807.png'"/>
|
||||
<view class="num">{{ info.pv }}</view>
|
||||
</view>
|
||||
<view class="flex">
|
||||
<image
|
||||
v-if="!item.zanVo"
|
||||
:src="webUrl + '/page/hotel/zan-off-2.png'"
|
||||
class="zan-off-icon"
|
||||
@click="likeInfo"
|
||||
/>
|
||||
<image
|
||||
v-else
|
||||
:src="webUrl + '/page/hotel/zan-on-2.png'"
|
||||
class="zan-on-icon"
|
||||
@click="likeInfo"
|
||||
/>
|
||||
<text
|
||||
v-show="item.zan > 0"
|
||||
:class="item.zanVo ? 'on' : ''"
|
||||
class="seeNum-txt"
|
||||
>{{ $formatCount(item.zan) }}</text
|
||||
>
|
||||
</view>
|
||||
<view class="flex">
|
||||
<u-icon name="chat" size="24"></u-icon>
|
||||
<text class="seeNum-txt">{{ $formatCount(item.replyCount || comments.length) }}</text>
|
||||
<view class="flex ai-center" @click="likeInfo">
|
||||
<image :src="webUrl+'/20230803151308999742.png'" v-if="info.zanVo != null"/>
|
||||
<image :src="webUrl+'/20230803151302213857.png'" v-else/>
|
||||
<view class="num">{{ info.zan }}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="v12-px-2">资讯评论</view>
|
||||
<view v-if="comments.length === 0" class="v12-text-center v12-py-2 v12-dark1-text v12-font-24">
|
||||
暂无评论
|
||||
|
||||
<view class="video-box" v-if="info.type==='NT_VIDEO'">
|
||||
<video style="width: 100%;height: 320rpx;" :src="info.video" controls play-btn-position="center"/>
|
||||
</view>
|
||||
<view class="comment-list">
|
||||
<view class="v12-mt-2" v-for="(comment, index) in comments" :key="index" @click="selectComment(comment)">
|
||||
<view class="user-info v12-align-center">
|
||||
<view class="user-avatar">
|
||||
<u-avatar :src="comment.userAvatar"></u-avatar>
|
||||
</view>
|
||||
<view class="user-name v12-ml-3">
|
||||
<view class="v12-font-bold v12-dark-text v12-font-32">
|
||||
<text>{{ comment.userNickName }}</text>
|
||||
<text v-if="comment.userIsAdmin" class="v12-ml-1 v12-primary v12-white-text v12-font-24 v12-font-weight-400 v12-px-1 v12-radius-8">
|
||||
{{ '店主' }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="v12-font-22 v12-secondary-dark-text v12-mt-1">
|
||||
<text>{{ formatterTime(comment.createTime) }}</text>
|
||||
<text v-if="comment.at">
|
||||
{{ ' 回复 ' + comment.at.atNickName }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="user-info v12-d-flex" >
|
||||
<view class="user-avatar">
|
||||
<view style="opacity: 0;">
|
||||
<u-avatar></u-avatar>
|
||||
</view>
|
||||
</view>
|
||||
<view class="user-name v12-ml-3">
|
||||
<view class="v12-font-28 v12-dark-text">
|
||||
{{ comment.reply }}
|
||||
</view>
|
||||
<view v-if="comment.children">
|
||||
<view class="v12-mt-2" v-for="(_comment, atIndex) in comment.children" :key="atIndex" @click.stop="selectComment(_comment)">
|
||||
<view class="user-info v12-align-center">
|
||||
<view class="user-avatar">
|
||||
<u-avatar size="35" :src="_comment.userAvatar"></u-avatar>
|
||||
</view>
|
||||
<view class="user-name v12-ml-3">
|
||||
<view class="v12-font-bold v12-dark-text v12-font-32">
|
||||
<text>{{ _comment.userNickName }}</text>
|
||||
<text v-if="_comment.userIsAdmin" class="v12-ml-1 v12-primary v12-white-text v12-font-24 v12-font-weight-400 v12-px-1 v12-radius-8">
|
||||
{{ '店主' }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="v12-font-22 v12-secondary-dark-text v12-mt-1">
|
||||
<text>{{ formatterTime(_comment.createTime) }}</text>
|
||||
<text v-if="_comment.at && _comment.parentReplyId !== comment.id">
|
||||
{{ ' 回复 ' + _comment.at.atNickName }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="user-info v12-align-center">
|
||||
<view class="user-avatar">
|
||||
<view style="opacity: 0;">
|
||||
<u-avatar size="35"></u-avatar>
|
||||
</view>
|
||||
</view>
|
||||
<view class="user-name v12-ml-3">
|
||||
<view class="v12-font-28 v12-dark-text">
|
||||
<!-- <text class="v12-dark1-text" v-if="_comment.at && _comment.parentReplyId !== comment.id">{{ "@" +_comment.at.atNickName }}</text> -->
|
||||
{{ ' ' + _comment.reply }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="comment.hasMoreChildren" class="more-text" @click.stop="showMoreComment(comment)">
|
||||
{{ '—— 点击展开更多回复 ——' }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
</view>
|
||||
<view class="comment-input-wrap">
|
||||
<view style="width: 100%;">
|
||||
<u-textarea
|
||||
v-model="reply"
|
||||
:prefixIcon="prefixIcon"
|
||||
:maxlength="500"
|
||||
:maxheight="200"
|
||||
:showConfirmBar="false"
|
||||
:autoHeight="reply.length < 40 ? true : false"
|
||||
cursorSpacing="15"
|
||||
placeholder="分享你的观点,让世界听见你的声音..."
|
||||
class="comment-input"
|
||||
@focus="commentInputFocus"
|
||||
@change="commentInputChange"
|
||||
>
|
||||
|
||||
<template slot="prefix">
|
||||
<view class="v12-align-center">
|
||||
<u-icon :name="prefixIcon"></u-icon>
|
||||
<u--text
|
||||
v-if="currentComment.userNickName"
|
||||
:text="'@' + currentComment.userNickName"
|
||||
margin="0 3px 0 0"
|
||||
type="tips"
|
||||
></u--text>
|
||||
</view>
|
||||
</template>
|
||||
</u-textarea>
|
||||
</view>
|
||||
<view class="">
|
||||
<view class="send-btn v12-primary v12-white-text" @click="sendComment">发送</view>
|
||||
</view>
|
||||
|
||||
<view class="content-box">
|
||||
<rich-text :nodes="info.content"/>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getHotelNewsDetail, getHotelNewsZan, getCommentList, addComment } from "@/api/inn"
|
||||
import imgBox from '@/components/imageTypeSet/imagebox.vue'
|
||||
import {getHotelNewsDetail, getHotelNewsZan} from "@/api/inn";
|
||||
|
||||
export default {
|
||||
components: {
|
||||
imgBox
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||
id: null,
|
||||
item: {},
|
||||
comments: [],
|
||||
reply: '',
|
||||
atUid: '',
|
||||
currentComment: {},
|
||||
prefixIcon: 'edit-pen'
|
||||
info: null
|
||||
}
|
||||
},
|
||||
onLoad(options) {
|
||||
this.id = options.id
|
||||
this.init()
|
||||
this.id = options.id;
|
||||
this.init();
|
||||
},
|
||||
methods: {
|
||||
showMoreComment(comment) {
|
||||
const params = {
|
||||
contentId: this.id,
|
||||
contentType: "hotelNews",
|
||||
rootReplyId: comment.id,
|
||||
page: 1,
|
||||
limit: 99999
|
||||
}
|
||||
getCommentList(params).then((res) => {
|
||||
comment.children = res.data.records
|
||||
comment.hasMoreChildren = false
|
||||
})
|
||||
},
|
||||
commentInputChange(e) {
|
||||
// 若删除直接将@用户名整个删除
|
||||
if (e === '') {
|
||||
this.currentComment = {}
|
||||
return
|
||||
}
|
||||
// 若删除@用户名,将@用户名整个删除
|
||||
const usernameLength = `@${this.currentComment.userNickName} `.length
|
||||
if(!e.includes(`@${this.currentComment.userNickName} `) && this.currentComment.userNickName) {
|
||||
this.currentComment = {}
|
||||
// 去除@用户名
|
||||
this.reply = e.slice(usernameLength - 1)
|
||||
}
|
||||
},
|
||||
commentInputFocus(e) {
|
||||
// this.prefixIcon = ''
|
||||
},
|
||||
selectComment(comment) {
|
||||
this.currentComment = comment
|
||||
this.reply = '@' + comment.userNickName + ' '
|
||||
},
|
||||
/**
|
||||
* 格式化时间
|
||||
* @param {*} time 时间
|
||||
* @returns 距离当前时间的时间差
|
||||
* 1. 小于1分钟,显示刚刚
|
||||
* 2. 小于1小时,显示xx分钟前
|
||||
* 3. 小于1天,显示xx小时前
|
||||
* 4. 超过7天,显示日期 xxxx年xx月xx日
|
||||
*/
|
||||
formatterTime(time) {
|
||||
const now = new Date()
|
||||
const date = new Date(time)
|
||||
const diff = now - date
|
||||
const diffMin = Math.floor(diff / 1000 / 60)
|
||||
const diffHour = Math.floor(diff / 1000 / 60 / 60)
|
||||
const diffDay = Math.floor(diff / 1000 / 60 / 60 / 24)
|
||||
if (diffMin < 1) {
|
||||
return "刚刚"
|
||||
} else if (diffHour < 1) {
|
||||
return diffMin + "分钟前"
|
||||
} else if (diffDay < 1) {
|
||||
return diffHour + "小时前"
|
||||
} else if (diffDay < 7) {
|
||||
return diffDay + "天前"
|
||||
} else {
|
||||
return date.getFullYear() + "年" + (date.getMonth() + 1) + "月" + date.getDate() + "日"
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 发评论
|
||||
*/
|
||||
sendComment() {
|
||||
if (!this.reply.trim()) {
|
||||
uni.showToast({
|
||||
title: '请输入评论内容',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
if(this.reply.trim() === ('@' + this.currentComment.userNickName)) {
|
||||
// 请输入回复内容
|
||||
uni.showToast({
|
||||
title: '请输入回复内容',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
uni.showLoading({
|
||||
mask: true
|
||||
})
|
||||
const params = {
|
||||
contentId: this.id,
|
||||
contentType: 'hotelNews',
|
||||
parentReplyId: this.currentComment.parentId || this.currentComment.id,
|
||||
reply: (this.reply.replace('@' + this.currentComment.userNickName, '')).trim(),
|
||||
atUid: this.currentComment.uid || null
|
||||
}
|
||||
addComment(params).then((res) => {
|
||||
uni.hideLoading()
|
||||
this.init()
|
||||
this.reply = ''
|
||||
this.currentComment = {}
|
||||
this.item.replyCount === null ? this.item.replyCount = 1 : this.item.replyCount++
|
||||
})
|
||||
},
|
||||
init() {
|
||||
getHotelNewsDetail(this.id).then(({ data }) => (this.item = data))
|
||||
this.getComment()
|
||||
},
|
||||
// contentId int 评论的目标内容ID,必传
|
||||
// contentType string 评论的目标内容类型,必传(店铺资讯传入值hotelNews)
|
||||
// rootReplyId int 根评论ID
|
||||
// page int 页码
|
||||
// limit int 每页数量
|
||||
getComment() {
|
||||
const params = {
|
||||
contentId: this.id,
|
||||
contentType: "hotelNews",
|
||||
page: 1,
|
||||
limit: 99999
|
||||
}
|
||||
getCommentList(params).then((res) => {
|
||||
this.comments = res.data.records
|
||||
})
|
||||
getHotelNewsDetail(this.id).then(({data}) => this.info = data);
|
||||
},
|
||||
|
||||
likeInfo() {
|
||||
uni.showLoading({
|
||||
mask: true
|
||||
})
|
||||
let that = this;
|
||||
uni.showLoading();
|
||||
getHotelNewsZan(this.id).then((res) => {
|
||||
uni.hideLoading();
|
||||
|
||||
uni.showToast({
|
||||
title: res.msg,
|
||||
mask: false,
|
||||
duration: 1500,
|
||||
success() {
|
||||
if (res.status === 200) that.info = res.data;
|
||||
}
|
||||
})
|
||||
}).catch((err) => {
|
||||
uni.hideLoading()
|
||||
getHotelNewsDetail(this.id).then(({ data }) => (this.item = data))
|
||||
uni.showToast({
|
||||
title: err.msg + '',
|
||||
icon: 'none',
|
||||
mask: false,
|
||||
duration: 1500
|
||||
});
|
||||
})
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="less">
|
||||
@import "@/assets/css/store.less";
|
||||
.comment-list{
|
||||
padding-bottom: 100rpx;
|
||||
}
|
||||
.more-text{
|
||||
color:#1B76F0;
|
||||
font-weight: 400;
|
||||
font-size: 28rpx;
|
||||
}
|
||||
.comment-input-wrap{
|
||||
padding: 20rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
position: -webkit-sticky;
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
bottom: 0;
|
||||
background: #fff;
|
||||
left: 0;
|
||||
}
|
||||
.comment-input{
|
||||
height: 70rpx;
|
||||
background: rgba(246,246,246,0.39);
|
||||
border-radius: 12rpx;
|
||||
}
|
||||
.send-btn{
|
||||
border-radius: 16rpx;
|
||||
width: 96rpx;
|
||||
height: 70rpx;
|
||||
line-height: 70rpx;
|
||||
text-align: center;
|
||||
margin-left: 30rpx;
|
||||
}
|
||||
.my-inn-page {
|
||||
padding: 0 0 100rpx 0;
|
||||
background-color: #f6f6f6;
|
||||
}
|
||||
.cover-box {
|
||||
position: relative;
|
||||
|
||||
.full-img {
|
||||
width: 750rpx;
|
||||
}
|
||||
.video {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.guarantee {
|
||||
margin-right: 16rpx;
|
||||
padding: 8rpx 16rpx;
|
||||
border-radius: 8rpx;
|
||||
background: #0DC5C5;
|
||||
color: #fff;
|
||||
font-size: 22rpx;
|
||||
line-height: 1;
|
||||
}
|
||||
.zan-favorite-wrap {
|
||||
font-size: 32rpx;
|
||||
color: #333;
|
||||
.on {
|
||||
color: #FF564A;
|
||||
}
|
||||
}
|
||||
.zan-box {
|
||||
.img {
|
||||
width: 36rpx;
|
||||
height: 36rpx;
|
||||
margin: 0 8rpx 0 0;
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
.favorite-box {
|
||||
.icon {
|
||||
width: 36rpx;
|
||||
height: 36rpx;
|
||||
margin: 0 8rpx 0 30rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.store-img {
|
||||
width: 686rpx;
|
||||
margin-bottom: 20rpx;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.goods-section {
|
||||
padding: 40rpx 32rpx 0;
|
||||
background: #F5F5FA;
|
||||
|
||||
.item {
|
||||
position: relative;
|
||||
width: 332rpx;
|
||||
height: 528rpx;
|
||||
box-sizing: border-box;
|
||||
margin-right: 22rpx;
|
||||
margin-bottom: 24rpx;
|
||||
border-radius: 8rpx;
|
||||
background: #fff;
|
||||
|
||||
.name {
|
||||
padding: 0 6rpx;
|
||||
font-size: 26rpx;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.price-line {
|
||||
padding: 0 10rpx;
|
||||
font-size: 26rpx;
|
||||
line-height: 38rpx;
|
||||
color: #ED0F0F;
|
||||
}
|
||||
|
||||
.sales-line {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
padding: 8rpx 10rpx 18rpx;
|
||||
border-top: 1rpx solid #EFEFEF;
|
||||
font-size: 24rpx;
|
||||
line-height: 34rpx;
|
||||
color: #8D8D8D;
|
||||
}
|
||||
}
|
||||
|
||||
.item:nth-child(2n) {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.cover {
|
||||
width: 332rpx;
|
||||
height: 332rpx;
|
||||
background: rgba(255, 255, 255, 0.39);
|
||||
border-radius: 8rpx;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.label {
|
||||
width: 40rpx;
|
||||
height: 24rpx;
|
||||
margin-right: 4rpx;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.icon {
|
||||
width: 24rpx;
|
||||
height: 24rpx;
|
||||
margin-right: 6rpx;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.btn {
|
||||
display: flex;
|
||||
padding: 20rpx 0 40rpx 0;
|
||||
justify-content: center;
|
||||
.btn-cont {
|
||||
padding: 13rpx 30rpx;
|
||||
border: 1px solid #0DC5C5;
|
||||
border-radius: 8rpx;
|
||||
color: #0DC5C5;
|
||||
.iconfont {
|
||||
margin: 0 0 0 20rpx;
|
||||
font-size: 24rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.container {
|
||||
position: relative;
|
||||
background: #FFFFFF;
|
||||
}
|
||||
|
||||
.innInfoWrap {
|
||||
position: relative;
|
||||
margin-top: -76rpx;
|
||||
padding: 20rpx 36rpx;
|
||||
line-height: 1;
|
||||
z-index: 1;
|
||||
.bg-color {
|
||||
position: absolute;
|
||||
top: -5px;
|
||||
left: 0;
|
||||
right: 0;
|
||||
z-index: 1;
|
||||
height: 50%;
|
||||
background: linear-gradient(-180deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 100%);
|
||||
|
||||
.box-mask {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
left: 166rpx;
|
||||
box-sizing: border-box;
|
||||
padding: 0 32rpx 12rpx 0;
|
||||
|
||||
.city-section {
|
||||
width: 256rpx;
|
||||
margin-left: 20rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
.body-cont {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
}
|
||||
}
|
||||
|
||||
.inn-logo {
|
||||
flex-shrink: 0;
|
||||
width: 56*2rpx;
|
||||
height: 56*2rpx;
|
||||
margin-right: 18rpx;
|
||||
}
|
||||
|
||||
.inn-logo image {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.inn-name {
|
||||
width: 280rpx;
|
||||
font-size: 32rpx;
|
||||
color: #FFFFFF;
|
||||
line-height: 48rpx;
|
||||
}
|
||||
|
||||
.inn-owner {
|
||||
font-size: 24rpx;
|
||||
color: #8B8F99;
|
||||
}
|
||||
|
||||
.inn-tag-wrap {
|
||||
margin-top: 10rpx;
|
||||
}
|
||||
.inn-signature-wrap {
|
||||
position: relative;
|
||||
z-index: 5;
|
||||
padding: 0 32rpx;
|
||||
margin: 20rpx 0 0 0;
|
||||
.triangle {
|
||||
position: absolute;
|
||||
top: -20rpx;
|
||||
left: 72rpx;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: 20rpx solid transparent;
|
||||
border-right: 20rpx solid transparent;
|
||||
border-bottom: 24rpx solid rgba(243,243,246,0.39);
|
||||
}
|
||||
.inn-signature {
|
||||
position: relative;
|
||||
padding: 20rpx;
|
||||
border-radius: 8rpx;
|
||||
font-size: 24rpx;
|
||||
color: #080F1A;
|
||||
background: rgba(243,243,246,0.39);
|
||||
box-shadow: 0px 6px 12px rgba(0,0,0,0.12);
|
||||
}
|
||||
.share-btn {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: -68rpx;
|
||||
.img {
|
||||
width: 212rpx;
|
||||
height: 60rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
.btLine {
|
||||
width: 100%;
|
||||
height: 6rpx;
|
||||
margin-top: 18rpx;
|
||||
background: #0DC5C5;
|
||||
}
|
||||
.pics-box {
|
||||
margin: 36rpx;
|
||||
background: #fff;
|
||||
}
|
||||
.pics-list {
|
||||
position: relative;
|
||||
padding: 32rpx 0;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.pics-list .pics-item {
|
||||
margin-left: 36rpx;
|
||||
margin-top: 20rpx;
|
||||
}
|
||||
.bottom-view {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: 99;
|
||||
display: flex;
|
||||
height: 70rpx;
|
||||
padding: 15rpx;
|
||||
border-top: 1px solid #f1f1f1;
|
||||
background: #FFFFFF;
|
||||
|
||||
.bottom-btn {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 32rpx;
|
||||
color: #333;
|
||||
line-height: 70rpx;
|
||||
&:first-child {
|
||||
border-right: 1px solid #d5d5d5;
|
||||
}
|
||||
.img {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
margin: 0 12rpx 0 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
.tab-item-active {
|
||||
color:#080F1A;
|
||||
font-size:32rpx;
|
||||
}
|
||||
.tab-item-no-active {
|
||||
color:#A6AAB3;
|
||||
font-size:28rpx;
|
||||
}
|
||||
.map-wrapper {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
height: 200rpx;
|
||||
margin: 40rpx 0 0 0;
|
||||
overflow: hidden;
|
||||
.map-cont {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 2;
|
||||
width: 100%;
|
||||
opacity: 0.3;
|
||||
transform: translateY(-50rpx);
|
||||
}
|
||||
.bg {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
z-index: 3;
|
||||
height: 60rpx;
|
||||
background: linear-gradient(180deg, #FFFFFF 0%, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%);
|
||||
}
|
||||
.map-info {
|
||||
position: relative;
|
||||
z-index: 5;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 40rpx 10rpx 40rpx 32rpx;
|
||||
color: #333;
|
||||
font-size: 14px;
|
||||
justify-content: space-between;
|
||||
.map-info-hd {
|
||||
.icon {
|
||||
display: block;
|
||||
width: 56rpx;
|
||||
height: 56rpx;
|
||||
}
|
||||
}
|
||||
.map-info-bd {
|
||||
flex: 1;
|
||||
padding: 0 60rpx 0 20rpx;
|
||||
line-height: 60rpx;
|
||||
}
|
||||
.map-info-ft {
|
||||
.item + .item {
|
||||
margin: 0 0 0 6rpx;
|
||||
}
|
||||
.item {
|
||||
text-align: center;
|
||||
font-weight: 500;
|
||||
.img {
|
||||
display: block;
|
||||
width: 96rpx;
|
||||
height: 96rpx;
|
||||
margin: 0 0 -16rpx 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.top-tab {
|
||||
margin: 60rpx 0 0 0;
|
||||
border-bottom: 1px solid #ddd;
|
||||
.tab {
|
||||
margin: 0 35rpx;
|
||||
&.hide {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
.info-section,
|
||||
.pics-section,
|
||||
.qualifications-section {
|
||||
position: relative;
|
||||
background-color: #fff;
|
||||
}
|
||||
.info-section,
|
||||
.qualifications-section {
|
||||
padding: 32rpx;
|
||||
}
|
||||
.info-section {
|
||||
word-break: break-all;
|
||||
min-height: 100vh;
|
||||
.info-item + .info-item {
|
||||
margin: 32rpx 0 0 0;
|
||||
}
|
||||
.info-item {
|
||||
border-radius: 10rpx;
|
||||
background-color: #fff;
|
||||
.info-item-header {
|
||||
position: relative;
|
||||
padding: 20rpx 20rpx 0 20rpx;
|
||||
&.info-item-top {
|
||||
padding-top: 60rpx;
|
||||
background-size: 100% 80rpx;
|
||||
background-repeat: no-repeat;
|
||||
background-image: url();
|
||||
}
|
||||
.name {
|
||||
font-size: 16px;
|
||||
color: #333;
|
||||
font-weight: bold;
|
||||
}
|
||||
.intro {
|
||||
margin: 10rpx 0 0 0;
|
||||
color: #666;
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
.info-item-body {
|
||||
padding: 0 20rpx 20rpx 20rpx;
|
||||
.video {
|
||||
padding: 20rpx 0 0 0;
|
||||
.video-item {
|
||||
width: 100%;
|
||||
height: 400rpx;
|
||||
border-radius: 10rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
.info-item-bottom {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 0 20rpx 20rpx 20rpx;
|
||||
margin-bottom: 20rpx;
|
||||
border-bottom: 1px solid #f1f1f1;
|
||||
font-size: 16px;
|
||||
.time {
|
||||
flex: 1;
|
||||
color: #333;
|
||||
}
|
||||
.btns {
|
||||
display: flex;
|
||||
color: #999;
|
||||
.flex + .flex {
|
||||
margin: 0 0 0 32rpx;
|
||||
}
|
||||
.flex {
|
||||
align-items: center;
|
||||
}
|
||||
.icon {
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
margin: 0 8rpx 0 0;
|
||||
}
|
||||
.zan-off-icon {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
}
|
||||
.zan-on-icon {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
}
|
||||
.seeNum-txt {
|
||||
&.on {
|
||||
color: #D81E06;
|
||||
}
|
||||
}
|
||||
.more-btn {
|
||||
position: relative;
|
||||
.more-wrapper {
|
||||
position: absolute;
|
||||
right: -20rpx;
|
||||
top: -150rpx;
|
||||
z-index: 5;
|
||||
width: 200rpx;
|
||||
border-radius: 12rpx;
|
||||
background-color: #fff;
|
||||
box-shadow: 0px 1px 6px rgba(0,0,0,0.16);
|
||||
.more-item + .more-item {
|
||||
border-top: 1px solid #d5d5d5;
|
||||
}
|
||||
.more-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 70rpx;
|
||||
font-size: 14px;
|
||||
color: #333;
|
||||
.more-icon {
|
||||
width: 36rpx;
|
||||
height: 36rpx;
|
||||
margin: 0 10rpx 0 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.tab-no-data {
|
||||
text-align: center;
|
||||
font-size: 32rpx;
|
||||
color: #999;
|
||||
line-height: 200rpx;
|
||||
}
|
||||
.pages-inn-info-detail {
|
||||
.top-box {
|
||||
padding: 40rpx 32rpx 20rpx;
|
||||
@@ -924,9 +123,4 @@ export default {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
}
|
||||
.user-info{
|
||||
view{
|
||||
word-break: break-all;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -77,15 +77,11 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
async getMapData() {
|
||||
uni.showLoading({
|
||||
title: '定位中...'
|
||||
})
|
||||
const map = await getLocation()
|
||||
const map = await getLocation();
|
||||
if (map.length > 1) {
|
||||
const {latitude, longitude} = map[1]
|
||||
getCurAddress(latitude, longitude, address => {
|
||||
this.cityName = address.city
|
||||
})
|
||||
const {latitude, longitude} = map[1];
|
||||
const address = await getCurAddress(latitude, longitude);
|
||||
this.cityName = address[1].data.result['ad_info']['city']
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
v-if="showTake">
|
||||
<view class="btn-box flex">
|
||||
<image style="width: 220rpx;height: 66rpx" :src="webUrl+'/20240124210952306625.png'" mode="scaleToFill"
|
||||
@click="navToPoint"/>
|
||||
@click="navToCoupons"/>
|
||||
<image style="width: 220rpx;height: 66rpx;margin-left: 16rpx;" :src="webUrl+'/20240124210928974187.png'"
|
||||
mode="scaleToFill" @click="closeTakeModel"/>
|
||||
</view>
|
||||
@@ -132,10 +132,6 @@ export default {
|
||||
this.init()
|
||||
},
|
||||
onShareAppMessage() {
|
||||
uni.updateShareMenu({
|
||||
isPrivateMessage: false,
|
||||
withShareTicket: false
|
||||
})
|
||||
return {
|
||||
title: '探寻有趣有味的生活方式',
|
||||
path: '/pkg-video/views/lottery',
|
||||
@@ -143,9 +139,6 @@ export default {
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
navToPoint() {
|
||||
uni.navigateTo({url: '/pages/user/Points/index'})
|
||||
},
|
||||
init() {
|
||||
getDetail().then(res => {
|
||||
if (res.success) {
|
||||
|
||||
+10
-13
@@ -33,18 +33,18 @@
|
||||
<cover-image style="width: 60rpx;height: 60rpx" :src="webUrl+'/20240113230547221591.png'"
|
||||
v-if="item['hasLike']"/>
|
||||
<cover-image style="width: 60rpx;height: 60rpx" :src="webUrl+'/20240113230552152511.png'" v-else/>
|
||||
<cover-view class="one-t tc">{{ $formatCount(item['likeCount']) }}</cover-view>
|
||||
<cover-view class="one-t tc">{{ item['likeCount'] }}</cover-view>
|
||||
</cover-view>
|
||||
<cover-view class="flex flex-col ai-center" style="width:78rpx;margin-right: 16rpx;"
|
||||
@click="changeFav(item)">
|
||||
<cover-image style="width: 60rpx;height: 60rpx" :src="webUrl+'/20240113230535491918.png'"
|
||||
v-if="item['hasFavorite']"/>
|
||||
<cover-image style="width: 60rpx;height: 60rpx" :src="webUrl+'/20240113230541207016.png'" v-else/>
|
||||
<cover-view class="one-t tc">{{ $formatCount(item['favoriteCount']) }}</cover-view>
|
||||
<cover-view class="one-t tc">{{ item['favoriteCount'] }}</cover-view>
|
||||
</cover-view>
|
||||
<cover-view class="flex flex-col ai-center" style="width:78rpx" @click="showDialog=true">
|
||||
<cover-image style="width: 60rpx;height: 60rpx" :src="webUrl+'/20240113230529202260.png'"/>
|
||||
<cover-view class="one-t tc">{{ $formatCount(item['replyCount']) }}</cover-view>
|
||||
<cover-view class="one-t tc">{{ item['replyCount'] }}</cover-view>
|
||||
</cover-view>
|
||||
</cover-view>
|
||||
</cover-view>
|
||||
@@ -56,7 +56,7 @@
|
||||
@close="dialogClose" @open="dialogOpen">
|
||||
<view style="z-index: 100">
|
||||
<cover-view class="tc" style="padding: 20rpx 0 40rpx;font-size: 28rpx">{{
|
||||
$formatCount(list[current]['replyCount'])
|
||||
list[current]['replyCount']
|
||||
}}条评论
|
||||
</cover-view>
|
||||
<scroll-view style="max-height: 740rpx" scroll-y @scrolltolower="fetchReply">
|
||||
@@ -140,17 +140,14 @@ export default {
|
||||
},
|
||||
|
||||
async getMapData() {
|
||||
uni.showLoading({
|
||||
title: '定位中...'
|
||||
})
|
||||
const map = await getLocation()
|
||||
const map = await getLocation();
|
||||
if (map.length > 1) {
|
||||
const {latitude, longitude} = map[1]
|
||||
getCurAddress(latitude, longitude, address => {
|
||||
this.cityName = address.city
|
||||
this.fetchList()
|
||||
})
|
||||
const {latitude, longitude} = map[1];
|
||||
const address = await getCurAddress(latitude, longitude);
|
||||
this.cityName = address[1].data.result['ad_info']['city']
|
||||
}
|
||||
|
||||
await this.fetchList()
|
||||
},
|
||||
|
||||
async fetchList() {
|
||||
|
||||
@@ -1,336 +0,0 @@
|
||||
<template>
|
||||
<view class=" call-message">
|
||||
<view class="comment-list v12-pa-3">
|
||||
<view
|
||||
v-for="(comment, index) in list"
|
||||
:key="index"
|
||||
class="v12-mt-2"
|
||||
>
|
||||
<view class="user-info v12-align-center" @click="toInfo(comment)">
|
||||
<view class="user-avatar">
|
||||
<u-avatar :src="comment.senderUserAvatar"></u-avatar>
|
||||
</view>
|
||||
<view class="user-name v12-ml-3">
|
||||
<view class="v12-font-bold v12-dark-text v12-font-32">
|
||||
<text>{{ comment.senderUserNickname }}</text>
|
||||
<text v-if="comment.senderIsAdmin" class="v12-ml-1 v12-primary v12-white-text v12-font-24 v12-font-weight-400 v12-px-1 v12-radius-8">
|
||||
{{ '店主' }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="v12-font-22 v12-dark2-text v12-mt-1">
|
||||
<text>{{ (comment.isRootReply ? ' 评论了你的资讯内容 ' : '回复了你的评论 ') + timeFormat(comment.senderTime) }}</text>
|
||||
<text v-if="comment.at">
|
||||
{{ ' 回复 ' + comment.at.atNickName }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="user-info v12-d-flex" >
|
||||
<view class="user-avatar" @click="toInfo(comment)">
|
||||
<view style="opacity: 0;">
|
||||
<u-avatar></u-avatar>
|
||||
</view>
|
||||
</view>
|
||||
<view class="user-name v12-ml-3" >
|
||||
<view
|
||||
|
||||
class="v12-font-30 v12-my-2 v12-dark-text"
|
||||
@click="toInfo(comment)"
|
||||
>
|
||||
<!-- {{ comment.parentReply }} -->
|
||||
<!-- <text class="v12-dark1-text">{{ "@" + comment.senderUserNickname }}</text> -->
|
||||
<text
|
||||
v-if="comment.replyAt"
|
||||
class="v12-dark1-text"
|
||||
>{{ "@" + comment.replyAt.atNickName + ' ' }}</text>
|
||||
{{ comment.reply }}
|
||||
</view>
|
||||
<view v-if="!comment.isRootReply" class="v12-font-28 v12-dark2-text" @click="toInfo(comment)">
|
||||
{{ comment.parentReply }}
|
||||
|
||||
</view>
|
||||
<view class="v12-mt-3">
|
||||
<u-button
|
||||
size="normal"
|
||||
:customStyle="{
|
||||
backgroundColor: '#eee',
|
||||
width: '160rpx',
|
||||
height: '50rpx',
|
||||
border: '1px solid #eee',
|
||||
color: '#777',
|
||||
margin: 0
|
||||
}"
|
||||
plain
|
||||
icon="chat"
|
||||
shape="circle"
|
||||
iconColor="#777"
|
||||
@click.stop="showSendBtn(comment)"
|
||||
>回复</u-button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
</view>
|
||||
<view v-show="showBtn" class="v12-align-center v12-justify-center v12-pa-3 v12-white sticky-bottom" :style="{ bottom: inputBoxBottom + 'px' }">
|
||||
<view style="width: 100%">
|
||||
<u-textarea
|
||||
id="input"
|
||||
fixed
|
||||
v-model="content"
|
||||
:maxlength="500"
|
||||
:maxheight="200"
|
||||
:autoHeight="content.length < 40 ? true : false"
|
||||
:showConfirmBar="false"
|
||||
:focus="autoFocus"
|
||||
:cursor="cursorIndex"
|
||||
:customStyle="{
|
||||
backgroundColor: '#f7f7f7',
|
||||
border: '1px solid #f7f7f7',
|
||||
borderRadius: '20rpx'
|
||||
}"
|
||||
:adjustPosition="false"
|
||||
cursorSpacing="85"
|
||||
@blur="onBlur"
|
||||
@focus="commentInputFocus"
|
||||
@change="commentInputChange"
|
||||
>
|
||||
<template slot="prefix">
|
||||
<view class="v12-align-center">
|
||||
<u-icon :name="'edit-pen'"></u-icon>
|
||||
<u--text
|
||||
v-if="currentComment.senderUserNickname"
|
||||
:text="'@' + currentComment.senderUserNickname"
|
||||
margin="0 3px 0 0"
|
||||
type="tips"
|
||||
></u--text>
|
||||
</view>
|
||||
</template>
|
||||
</u-textarea>
|
||||
</view>
|
||||
<view class="v12-primary v12-white-text send-btn" @click="replyMessageHandle">
|
||||
发送
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getMessageList, replyMessage } from '@/api/rooms'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
// 消息列表
|
||||
list: [
|
||||
// parentReply string 被回复的原始评论
|
||||
// reply string 回复评论内容
|
||||
// contentId int 评论的目标内容ID
|
||||
// contentType string 评论的目标内容类型
|
||||
// senderUid int 发送者ID
|
||||
// senderUserAvatar string 发送者头像
|
||||
// senderUserNickname string 发送者昵称
|
||||
// senderIsAdmin boolean 发送者是否是店主
|
||||
// senderTime string 发送时间(yyyy-MM-dd HH:mm:ss)
|
||||
// {
|
||||
// contentId: 1,
|
||||
// parentReply: '这是一条评论',
|
||||
// reply: '这是一条回复',
|
||||
// contentType: 'hotelNews',
|
||||
// senderUid: 1,
|
||||
// senderUserAvatar: '',
|
||||
// senderIsAdmin: true,
|
||||
// senderUserNickname: '张三',
|
||||
// senderTime: '2022-01-01 00:00:00',
|
||||
// }
|
||||
],
|
||||
// 是否自动聚焦
|
||||
autoFocus: false,
|
||||
// 资源路径
|
||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||
// 是否显示发送按钮
|
||||
showBtn: false,
|
||||
content: '',
|
||||
currentComment: {},
|
||||
// 光标位置
|
||||
cursorIndex: 0,
|
||||
inputBoxBottom: 0
|
||||
}
|
||||
},
|
||||
onLoad() {
|
||||
// 监听键盘高度变化
|
||||
uni.onKeyboardHeightChange((res) => {
|
||||
if (res.height) {
|
||||
this.onKeyboardShow(res.height)
|
||||
} else {
|
||||
this.onKeyboardHide()
|
||||
}
|
||||
})
|
||||
},
|
||||
onShow() {
|
||||
this.fetchList()
|
||||
},
|
||||
methods: {
|
||||
|
||||
onKeyboardShow(height) {
|
||||
this.inputBoxBottom = height
|
||||
},
|
||||
onKeyboardHide() {
|
||||
// 处理键盘收起逻辑
|
||||
this.inputBoxBottom = 0
|
||||
},
|
||||
toInfo(comment) {
|
||||
if(!comment.contentAvailable) {
|
||||
// 该内容已删除
|
||||
uni.showToast({
|
||||
title: '该内容已删除',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
if(comment.contentType === 'hotelNews') {
|
||||
this.$yrouter.push('/pagesInn/inn/innInfoDetail?id=' + comment.contentId)
|
||||
} else if(comment.contentType === 'countyFamousNews') {
|
||||
this.$yrouter.push('/pkg_product/views/newsInfo?id=' + comment.contentId)
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 格式化时间
|
||||
* @param {*} time
|
||||
* @returns 返回yyyy-MM-dd 格式
|
||||
*/
|
||||
timeFormat(time) {
|
||||
const date = new Date(time)
|
||||
const year = date.getFullYear()
|
||||
const month = date.getMonth() + 1
|
||||
const day = date.getDate()
|
||||
return `${year}-${month}-${day}`
|
||||
},
|
||||
commentInputChange(e) {
|
||||
// 若删除直接将@用户名整个删除
|
||||
if (e === '') {
|
||||
this.currentComment = {}
|
||||
return
|
||||
}
|
||||
// 若删除@用户名,将@用户名整个删除
|
||||
const usernameLength = `@${this.currentComment.senderUserNickname} `.length
|
||||
if(!e.includes(`@${this.currentComment.senderUserNickname} `) && this.currentComment.senderUserNickname) {
|
||||
this.currentComment = {}
|
||||
// 去除@用户名
|
||||
this.content = e.slice(usernameLength - 1)
|
||||
}
|
||||
},
|
||||
commentInputFocus(e) {
|
||||
// this.prefixIcon = ''
|
||||
},
|
||||
/**
|
||||
* 发送消息
|
||||
*/
|
||||
showSendBtn(item) {
|
||||
// 显示发送按钮
|
||||
this.showBtn = true
|
||||
this.currentComment = item
|
||||
this.content = '@' + item.senderUserNickname + ' '
|
||||
this.cursorIndex = this.content.length
|
||||
this.$nextTick(() => {
|
||||
// 延迟100ms,否则无法聚焦
|
||||
setTimeout(() => {
|
||||
// 自动聚焦
|
||||
this.autoFocus = true
|
||||
}, 100)
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 失焦
|
||||
*/
|
||||
onBlur() {
|
||||
// 隐藏发送按钮
|
||||
this.showBtn = false
|
||||
// 取消自动聚焦
|
||||
this.autoFocus = false
|
||||
},
|
||||
/**
|
||||
* 回复消息
|
||||
* @param {*} item 消息数据
|
||||
*/
|
||||
replyMessageHandle() {
|
||||
if(!this.currentComment.senderUserNickname) {
|
||||
// 未选择需要回复的用户,提示
|
||||
uni.showToast({
|
||||
title: '请选择需要回复的用户',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
if(this.content.trim() === ('@' + this.currentComment.senderUserNickname)) {
|
||||
// 请输入回复内容
|
||||
uni.showToast({
|
||||
title: '请输入回复内容',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
// 点击弹出回复框,输入回复内容,点击发送按钮,发送回复消息
|
||||
uni.showLoading({
|
||||
mask: true
|
||||
})
|
||||
const params = {
|
||||
// 评论的目标内容ID,必传
|
||||
contentId: this.currentComment.contentId,
|
||||
// 评论的目标内容类型,必传(店铺资讯传入值hotelNews)
|
||||
contentType: this.currentComment.contentType,
|
||||
// 评论内容,必传
|
||||
reply: this.content.replace('@' + this.currentComment.senderUserNickname, '').trim(),
|
||||
// @的用户ID
|
||||
atUid: this.currentComment.senderUid,
|
||||
// 回复的评论ID
|
||||
parentReplyId: this.currentComment.parentReplyId
|
||||
}
|
||||
replyMessage(params).then(res => {
|
||||
uni.hideLoading()
|
||||
this.fetchList()
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 查询消息列表
|
||||
*/
|
||||
fetchList() {
|
||||
const params = {
|
||||
page: 1,
|
||||
limit: 999999
|
||||
}
|
||||
getMessageList(params).then(res => {
|
||||
this.list = res.data.records
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.call-message{
|
||||
background: #fff;
|
||||
}
|
||||
.send-btn{
|
||||
width: 96rpx;
|
||||
height: 70rpx;
|
||||
background: #C52733;
|
||||
color: #fff;
|
||||
border-radius: 16rpx;
|
||||
line-height: 70rpx;
|
||||
text-align: center;
|
||||
margin-left: 30rpx;
|
||||
padding: 0 20rpx;
|
||||
}
|
||||
.sticky-bottom{
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
background: #fff;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.user-info{
|
||||
view{
|
||||
word-break: break-all;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -78,7 +78,7 @@
|
||||
<view class="input-box">
|
||||
<textarea
|
||||
v-model="content"
|
||||
maxlength="500"
|
||||
maxlength="150"
|
||||
:auto-height="true"
|
||||
:fixed="true"
|
||||
:show-confirm-bar="false"
|
||||
@@ -279,8 +279,7 @@ export default {
|
||||
},
|
||||
|
||||
userInput(event) {
|
||||
// 只取前500字
|
||||
this.content = event.detail.value.slice(0, 500);
|
||||
this.content = event.detail.value;
|
||||
},
|
||||
|
||||
userSend(msg_type) {
|
||||
|
||||
+22
-129
@@ -1,26 +1,8 @@
|
||||
<template>
|
||||
<view class="common-roomLogs">
|
||||
<image
|
||||
v-if="showImg"
|
||||
:src="settingInfo.messageEnterImage"
|
||||
mode="widthFix"
|
||||
class="common-ai-img"
|
||||
@click="enterAiChat()"
|
||||
/>
|
||||
<view class="v12-align-center" @click="toMessage">
|
||||
<view class="call-message">
|
||||
<u-icon :name="webUrl + '/icon/message.png'" size="25"></u-icon>
|
||||
</view>
|
||||
<view class="v12-ml-2" style="width: 80%">
|
||||
<view class="v12-font-bold v12-font-32">互动消息</view>
|
||||
<view class="v12-secondary-dark-text v12-font-28 v12-mt-3 v12-justify-between">
|
||||
<text>{{ unreadNum > 0 ? `收到${unreadNum}条回复` : '暂无通知'}}</text>
|
||||
<view v-if="unreadNum > 0" class="bage-num v12-font-24 v12-primary v12-white-text v12-radius-100">{{ unreadNum > 99 ? '99+' : unreadNum }}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="list.length > 0" class="v12-mt-3">
|
||||
<view v-if="list.length > 0">
|
||||
<view
|
||||
|
||||
>
|
||||
<u-swipe-action
|
||||
class="v12-mt-3"
|
||||
@@ -33,15 +15,12 @@
|
||||
style="margin-bottom: 10px;"
|
||||
@click.stop="removeRoom(item.room_id)"
|
||||
>
|
||||
<view class="item">
|
||||
<view class="v12-justify-start flex item-cont" @click="goRoom(item)">
|
||||
<image
|
||||
:src="item.store_avatar || webUrl+'/20221114155314348118.png'"
|
||||
class="cover flex-0"
|
||||
/>
|
||||
<view class="cont">
|
||||
<view class="item v12-pa-3">
|
||||
<view class="v12-justify-start flex" @click="goRoom(item)">
|
||||
<image class="cover flex-0" :src="item.store_avatar || webUrl+'/20221114155314348118.png'"/>
|
||||
<view>
|
||||
<view class="flex jc-between ai-center" style="position: relative">
|
||||
<view class="v12-align-center name-wrap">
|
||||
<view class="v12-align-center">
|
||||
<view class="name more-t">{{ item.store_name }}</view>
|
||||
<view v-if="item.is_official" class="guanfang">官方</view>
|
||||
<view v-else class="shangjia">商家</view>
|
||||
@@ -49,8 +28,8 @@
|
||||
<view class="datetime" v-if="item.last_msg">{{ item.last_msg.created_at }}</view>
|
||||
</view>
|
||||
<view class="sub v12-align-center v12-justify-between" v-if="item.last_msg">
|
||||
<view class="one-t" style="width: 80%;">{{ item.last_msg.msg_type=== 0 ? item.last_msg.msg_content : '[图片]' }}</view>
|
||||
<view v-if="item.unread_num > 0" class="unread-num v12-primary">{{ item.unread_num < 99 ? item.unread_num : '99+' }}</view>
|
||||
<view class="one-t" style="width: 90%;">{{ item.last_msg.msg_type===0?item.last_msg.msg_content:'[图片]' }}</view>
|
||||
<view v-if="item.unread_num > 0" class="unread-num v12-primary"> {{ item.unread_num < 99 ? item.unread_num : '99+' }}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
@@ -60,7 +39,7 @@
|
||||
</view>
|
||||
</view>
|
||||
<view class="v4-nodata" v-if="list.length===0">
|
||||
<!-- <image src="@/static/images/img_nodata.png" mode="scaleToFill"/> -->
|
||||
<image src="@/static/images/img_nodata.png" mode="scaleToFill"/>
|
||||
<view class="text">暂无数据</view>
|
||||
</view>
|
||||
</view>
|
||||
@@ -68,76 +47,23 @@
|
||||
|
||||
<script>
|
||||
import { mapGetters } from 'vuex'
|
||||
import { getUnreadMessageCount, markMessagesAsRead } from '@/api/rooms'
|
||||
import {
|
||||
getAiSystemInfoSetting
|
||||
} from '@/api/public'
|
||||
|
||||
export default {
|
||||
name: 'RoomLogs',
|
||||
data() {
|
||||
return {
|
||||
showImg: false,
|
||||
settingInfo: {},
|
||||
webUrl:this.$VUE_APP_RESOURCES_URL,
|
||||
uid: null,
|
||||
list: [],
|
||||
options1: [{text: '删除', style: {color: '#fff', backgroundColor: '#C52733'} }],
|
||||
unreadNum: 0,
|
||||
webUrl: this.$VUE_APP_RESOURCES_URL
|
||||
options1: [{text: '删除', style: {color: '#fff', backgroundColor: '#C52733'} }]
|
||||
}
|
||||
},
|
||||
computed: mapGetters(['userInfo']),
|
||||
onShow() {
|
||||
this.uid = this.userInfo.uid
|
||||
this.fetchList()
|
||||
this.getUnreadMessageCount()
|
||||
getAiSystemInfoSetting().then(res => {
|
||||
const { success, data } = res
|
||||
if (success) {
|
||||
this.settingInfo = data
|
||||
this.showImg = data.showOnAppIndex === 1
|
||||
}
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
enterAiChat() {
|
||||
const cityName = uni.getStorageSync('locationCityName') || ''
|
||||
uni.navigateTo({
|
||||
url: `/aiChat/views/index?click=1&cityName=${cityName}`
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 去消息
|
||||
*/
|
||||
toMessage() {
|
||||
markMessagesAsRead().then(res => {
|
||||
uni.$emit('updateUnreadMessageCount', 0)
|
||||
uni.navigateTo({url: '/pkg_common/views/message'})
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 获取互动消息
|
||||
* @param {*} item
|
||||
*/
|
||||
getUnreadMessageCount(item) {
|
||||
getUnreadMessageCount().then(res => {
|
||||
const count = res.data || 0
|
||||
this.unreadNum = count
|
||||
uni.request({
|
||||
url: this.$SERVICE_API_URL + '/customer-chat-list',
|
||||
method: 'POST',
|
||||
data: {uid: this.uid},
|
||||
success: res => {
|
||||
if (res.data.status_code === 200) {
|
||||
const _count = res.data.content + count
|
||||
uni.$emit('updateUnreadMessageCount', _count)
|
||||
} else {
|
||||
uni.$emit('updateUnreadMessageCount', count)
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
goRoom(item) {
|
||||
uni.navigateTo({url: `/pkg_common/views/room?id=${item.store_id}&name=${item.store_name}`})
|
||||
},
|
||||
@@ -181,23 +107,7 @@ export default {
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style scoped lang="less">
|
||||
.common-ai-img {
|
||||
width: 100%;
|
||||
margin: 0 0 24rpx 0;
|
||||
}
|
||||
.call-message{
|
||||
width: 120rpx;
|
||||
height: 120rpx;
|
||||
background: #C52733;
|
||||
border-radius: 20rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.common-roomLogs{
|
||||
background: #fff;
|
||||
}
|
||||
<style>
|
||||
.common-roomLogs .u-swipe-action-item{
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
@@ -237,32 +147,20 @@ export default {
|
||||
.common-roomLogs {
|
||||
min-height: 100vh;
|
||||
box-sizing: border-box;
|
||||
padding: 24rpx;
|
||||
background: #fff;
|
||||
padding: 32rpx;
|
||||
background: #F5F5F5;
|
||||
|
||||
.item {
|
||||
padding: 24rpx 0;
|
||||
border-radius: 8rpx;
|
||||
border-top: 1rpx solid #eee;
|
||||
background: #FFFFFF;
|
||||
.item-cont {
|
||||
display: flex;
|
||||
.cont {
|
||||
flex: 1;
|
||||
width: calc(100% - 140rpx);
|
||||
}
|
||||
}
|
||||
|
||||
.cover {
|
||||
width: 120rpx;
|
||||
height: 120rpx;
|
||||
width: 80rpx;
|
||||
height: 80rpx;
|
||||
margin-right: 18rpx;
|
||||
border-radius: 20rpx;
|
||||
border-radius: 16rpx;
|
||||
}
|
||||
|
||||
.name-wrap {
|
||||
width: calc(100% - 240rpx);
|
||||
}
|
||||
.name {
|
||||
font-size: 26rpx;
|
||||
font-weight: bold;
|
||||
@@ -274,12 +172,14 @@ export default {
|
||||
font-size: 22rpx;
|
||||
line-height: 32rpx;
|
||||
color: #999999;
|
||||
width: 240rpx;
|
||||
flex-wrap: nowrap;
|
||||
white-space: nowrap;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.sub {
|
||||
width: 100%;
|
||||
width: 548rpx;
|
||||
margin-top: 12rpx;
|
||||
font-size: 24rpx;
|
||||
line-height: 34rpx;
|
||||
@@ -287,11 +187,4 @@ export default {
|
||||
}
|
||||
}
|
||||
}
|
||||
.bage-num {
|
||||
min-width: 40rpx;
|
||||
height: 40rpx;
|
||||
text-align: center;
|
||||
box-sizing: border-box;
|
||||
padding: 4rpx;
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
@@ -1,934 +0,0 @@
|
||||
<template>
|
||||
<view class="container">
|
||||
<view
|
||||
v-if="form.reviewStatus === 2"
|
||||
class="v12-pa-2 reason-box"
|
||||
>
|
||||
驳回原因: {{ form.reviewMsg }}
|
||||
</view>
|
||||
<view
|
||||
v-if="form.isDraft === 0 && form.reviewStatus === 0"
|
||||
class="v12-pa-2 reason-box"
|
||||
>
|
||||
审核中,请耐心等待审核结果
|
||||
</view>
|
||||
<view class="form-item">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
名称:
|
||||
</view>
|
||||
<view class="input">
|
||||
<u-textarea
|
||||
v-model="form.name"
|
||||
border="none"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
placeholder="请输入名称"
|
||||
:placeholder-style="inputPlaceholderStyle"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start">
|
||||
<view>
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
主图:
|
||||
</view>
|
||||
<view class="input">
|
||||
<u-upload
|
||||
:fileList="coverImg.filter(item => item.url)"
|
||||
:disabled="form.isDraft === 0 && (coverImg.length > 0 || form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
:deletable="form.isDraft === 1 || (form.reviewStatus !== 0 && form.reviewStatus !== 1)"
|
||||
:maxCount="1"
|
||||
count="1"
|
||||
name="coverImg"
|
||||
multiple
|
||||
@afterRead="afterRead($event, 'coverImg')"
|
||||
@delete="deletePic($event, 'coverImg')"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<view class="v12-ml-2">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
头像:
|
||||
</view>
|
||||
<view class="input">
|
||||
<u-upload
|
||||
:fileList="avatarImg.filter(item => item.url)"
|
||||
:disabled="form.isDraft === 0 && (avatarImg.length > 0 || form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
:deletable="form.isDraft === 1 || (form.reviewStatus !== 0 && form.reviewStatus !== 1)"
|
||||
:maxCount="1"
|
||||
count="1"
|
||||
name="avatarImg"
|
||||
multiple
|
||||
@afterRead="afterRead($event, 'avatarImg')"
|
||||
@delete="deletePic($event, 'avatarImg')"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="form-item v12-mt-2">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
轮播图:
|
||||
</view>
|
||||
<view class="input">
|
||||
<u-upload
|
||||
:fileList="bannerImg"
|
||||
:disabled="form.isDraft === 0 && (bannerImg.length > 8 || form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
:deletable="form.isDraft === 1 || (form.reviewStatus !== 0 && form.reviewStatus !== 1)"
|
||||
:maxCount="9"
|
||||
count="9"
|
||||
name="bannerImg"
|
||||
multiple
|
||||
@afterRead="afterRead($event, 'bannerImg')"
|
||||
@delete="deletePic($event, 'bannerImg')"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<view class="form-item v12-mt-2">
|
||||
<view class="title">
|
||||
视频:
|
||||
</view>
|
||||
<view class="input">
|
||||
<u-upload
|
||||
v-if="videos.length === 0"
|
||||
accept="video"
|
||||
multiple
|
||||
:max-count="1"
|
||||
:fileList="videos"
|
||||
:disabled="form.isDraft === 0 && (videos.length > 0 || form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
:deletable="form.isDraft === 1 || (form.reviewStatus !== 0 && form.reviewStatus !== 1)"
|
||||
count="1"
|
||||
name="videoImg"
|
||||
:previewFullImage="true"
|
||||
@afterRead="afterRead($event, 'videos', 'video')"
|
||||
@delete="deletePic($event, 'videos')"
|
||||
/>
|
||||
<view
|
||||
v-else
|
||||
class="video-wrapper"
|
||||
>
|
||||
<video
|
||||
:src="videos[0].url"
|
||||
:poster="videos[0].url + '?vframe/jpg/offset/1'"
|
||||
:controls="false"
|
||||
play-btn-position="center"
|
||||
class="video-item"
|
||||
/>
|
||||
<view
|
||||
v-if="form.isDraft === 1 || (form.reviewStatus !== 0 && form.reviewStatus !== 1)"
|
||||
class="delete-badge"
|
||||
@click.stop="deleteVideo(0)"
|
||||
>
|
||||
x
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
公司名称
|
||||
</view>
|
||||
<view
|
||||
class="v12-ml-2"
|
||||
style="flex: 1;"
|
||||
>
|
||||
<input
|
||||
v-model="form.companyName"
|
||||
type="text"
|
||||
:placeholder-style="inputPlaceholderStyle"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
placeholder="请输入公司名称"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider />
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
店铺分类
|
||||
</view>
|
||||
<view
|
||||
class="v12-ml-2"
|
||||
style="flex: 1;"
|
||||
>
|
||||
<picker
|
||||
:value="experienceStoreCategoryIndex"
|
||||
:range="experienceStoreCategoryList"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
range-key="name"
|
||||
mode="selector"
|
||||
@change="handleCategoryChange"
|
||||
>
|
||||
<view class="one-t">
|
||||
<text :style="{'color': form.experienceStoreCategoryName ? '#333' : '#999999'}">
|
||||
{{ form.experienceStoreCategoryName || '请选择店铺分类' }}
|
||||
</text>
|
||||
</view>
|
||||
</picker>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider />
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
简介
|
||||
</view>
|
||||
<view
|
||||
class="v12-ml-2"
|
||||
style="flex: 1;"
|
||||
>
|
||||
<input
|
||||
v-model="form.intro"
|
||||
type="text"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
:placeholder-style="inputPlaceholderStyle"
|
||||
placeholder="请输入简介"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider />
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
联系人
|
||||
</view>
|
||||
<view
|
||||
class="v12-ml-2"
|
||||
style="flex: 1;"
|
||||
>
|
||||
<input
|
||||
v-model="form.contact"
|
||||
type="text"
|
||||
:placeholder-style="inputPlaceholderStyle"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
placeholder="请输入联系人姓名"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider />
|
||||
<view
|
||||
class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center"
|
||||
@click="showTimePicker"
|
||||
>
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
营业时间
|
||||
</view>
|
||||
<view class="v12-ml-2">
|
||||
<view>
|
||||
<text :style="{'color': form.serviceTime ? '#333' : '#999999'}">
|
||||
{{ form.serviceTime || '起始时间' }}
|
||||
</text>
|
||||
-
|
||||
<text :style="{'color': form.serviceEndTime ? '#333' : '#999999'}">
|
||||
{{ form.serviceEndTime || '结束时间' }}
|
||||
</text>
|
||||
</view>
|
||||
<tpf-time-range
|
||||
ref="TimePickerPopupRef"
|
||||
startTime="00:00"
|
||||
endTime="23:59"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
:startDefaultTime="form.serviceTime"
|
||||
:endDefaultTime="form.serviceEndTime"
|
||||
@timeRange="timeRange"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider />
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
省市区
|
||||
</view>
|
||||
<view
|
||||
class="v12-ml-2 one-t"
|
||||
style="flex: 1;"
|
||||
>
|
||||
<CitySelect
|
||||
ref="cityselect"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
:defaultValue="form.area || '请选择'"
|
||||
:items="district"
|
||||
@callback="resultCity"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider />
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
详细地址
|
||||
</view>
|
||||
<view
|
||||
class="v12-ml-2"
|
||||
style="flex: 1;"
|
||||
>
|
||||
<input
|
||||
v-model="form.address"
|
||||
:placeholder-style="inputPlaceholderStyle"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
type="text"
|
||||
placeholder="请输入详细地址"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider />
|
||||
<view
|
||||
class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center"
|
||||
@click="chooLocation"
|
||||
>
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
地理定位
|
||||
</view>
|
||||
<view
|
||||
class="v12-ml-2"
|
||||
style="flex: 1;"
|
||||
>
|
||||
<u--text
|
||||
v-if="form.position"
|
||||
:text="form.position"
|
||||
/>
|
||||
<u--text
|
||||
v-else
|
||||
text="请选择"
|
||||
color="#c0c4cc"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider />
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
商家电话
|
||||
</view>
|
||||
<view
|
||||
class="v12-ml-2"
|
||||
style="flex: 1;"
|
||||
>
|
||||
<u-input
|
||||
v-model="form.phone"
|
||||
type="text"
|
||||
:placeholder-style="inputPlaceholderStyle"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
placeholder="请输入商家电话"
|
||||
maxlength="11"
|
||||
border="none"
|
||||
>
|
||||
<template slot="suffix">
|
||||
<u-code
|
||||
v-if="form.isDraft === 1 || (form.reviewStatus !== 0 && form.reviewStatus !== 1)"
|
||||
ref="uCode"
|
||||
seconds="30"
|
||||
changeText="X秒重新获取"
|
||||
@change="codeChange"
|
||||
/>
|
||||
<u-button
|
||||
v-if="form.isDraft === 1 || (form.reviewStatus !== 0 && form.reviewStatus !== 1)"
|
||||
:text="tips"
|
||||
type="success"
|
||||
color="#4A97FC"
|
||||
@tap="getCode"
|
||||
/>
|
||||
</template>
|
||||
</u-input>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider />
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
填写验证码
|
||||
</view>
|
||||
<view
|
||||
class="v12-ml-2"
|
||||
style="flex: 1;"
|
||||
>
|
||||
<input
|
||||
v-model="form.captcha"
|
||||
type="text"
|
||||
:placeholder-style="inputPlaceholderStyle"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
placeholder="请输入验证码"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider />
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<!-- <text class="required">* </text> -->
|
||||
商家微信
|
||||
</view>
|
||||
<view
|
||||
class="v12-ml-2"
|
||||
style="flex: 1;"
|
||||
>
|
||||
<input
|
||||
v-model="form.wechat"
|
||||
type="text"
|
||||
:placeholder-style="inputPlaceholderStyle"
|
||||
placeholder="请输入微信号"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider />
|
||||
<view class="form-item v12-mt-2">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
资质:
|
||||
</view>
|
||||
<view class="input">
|
||||
<u-upload
|
||||
:fileList="qualificationImg"
|
||||
:disabled="(form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)) || qualificationImg.length > 98"
|
||||
:deletable="form.isDraft === 1 || (form.reviewStatus !== 0 && form.reviewStatus !== 1)"
|
||||
:maxCount="99"
|
||||
count="99"
|
||||
name="qualificationImg"
|
||||
multiple
|
||||
@afterRead="afterRead($event, 'qualificationImg')"
|
||||
@delete="deletePic($event, 'qualificationImg')"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="form.isDraft === 0 && form.reviewStatus !== 1">
|
||||
<view
|
||||
class="v12-primary v12-white-text submit-btn"
|
||||
:style="{'background': form.reviewStatus === 0 ? '#FA979F !important' : '#4A97FC'}"
|
||||
@click="submitForm"
|
||||
>
|
||||
{{ form.reviewStatus === 0 ? '撤销申请' : form.reviewStatus === 2 ? '重新提交' : '提交审核' }}
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="form.reviewStatus === null || (form.isDraft === 1 && form.reviewStatus === 0)">
|
||||
<view
|
||||
class="v12-primary v12-white-text submit-btn"
|
||||
@click="submitForm"
|
||||
>
|
||||
提交审核
|
||||
</view>
|
||||
</view>
|
||||
<u-popup
|
||||
:show="show"
|
||||
mode="center"
|
||||
round="10"
|
||||
@close="show=false"
|
||||
>
|
||||
<view class="popup-body">
|
||||
<view class="tc bold">
|
||||
入驻申请须知
|
||||
</view>
|
||||
<view class="content">
|
||||
<rich-text :nodes="notice" />
|
||||
</view>
|
||||
<view class="agree-box v12-mb-2">
|
||||
<checkbox-group @change="changeAgree">
|
||||
<label>
|
||||
<checkbox
|
||||
value="yes"
|
||||
style="transform:scale(0.8)"
|
||||
/>
|
||||
</label>
|
||||
<text>我已仔细阅读并同意</text>
|
||||
</checkbox-group>
|
||||
</view>
|
||||
<u-button
|
||||
type="error"
|
||||
text="确定"
|
||||
:disabled="!isAgree"
|
||||
@click="savePopup"
|
||||
/>
|
||||
</view>
|
||||
</u-popup>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import CitySelect from '@/components/CitySelect'
|
||||
import { getCity, registerVerify } from '@/api/user'
|
||||
import { uploadVideo, uploadImage } from '@/utils'
|
||||
import {
|
||||
getShopData,
|
||||
saveExperienceStore,
|
||||
saveExperienceStoreDraft,
|
||||
getExperienceStoreCategoryList,
|
||||
getExperienceStoreInfo,
|
||||
removeApply
|
||||
} from '@/api/join'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
CitySelect
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
isAgree: false,
|
||||
show: false,
|
||||
notice: '',
|
||||
tips: '获取验证码',
|
||||
inputPlaceholderStyle: {
|
||||
fontSize: '32rpx'
|
||||
},
|
||||
coverImg: [],
|
||||
avatarImg: [],
|
||||
bannerImg: [],
|
||||
videos: [],
|
||||
district: [],
|
||||
qualificationImg: [],
|
||||
partnerId: 0,
|
||||
experienceStoreCategoryList: [],
|
||||
experienceStoreCategoryIndex: 0,
|
||||
form: {
|
||||
captcha: '',
|
||||
name: '',
|
||||
cover: '',
|
||||
avatar: '',
|
||||
banner: '',
|
||||
video: '',
|
||||
companyName: '',
|
||||
experienceStoreCategoryId: null,
|
||||
experienceStoreCategoryName: '',
|
||||
serviceTime: '00:00',
|
||||
serviceEndTime: '23:59',
|
||||
provinceId: 0,
|
||||
provinceName: '',
|
||||
cityId: 0,
|
||||
cityName: '',
|
||||
areaId: 0,
|
||||
areaName: '',
|
||||
address: '',
|
||||
longitude: 0,
|
||||
latitude: 0,
|
||||
contact: '',
|
||||
phone: '',
|
||||
wechat: '',
|
||||
qualification: '',
|
||||
intro: '',
|
||||
reviewMsg: '',
|
||||
reviewStatus: null,
|
||||
isDraft: null,
|
||||
position: '',
|
||||
area: ''
|
||||
}
|
||||
}
|
||||
},
|
||||
onLoad(opts) {
|
||||
this.partnerId = opts.partnerId
|
||||
this.queryCity()
|
||||
getShopData().then(({ data }) => {
|
||||
this.notice = data.merchantApplyNotice
|
||||
})
|
||||
getExperienceStoreCategoryList().then(({ data }) => {
|
||||
this.experienceStoreCategoryList = data || []
|
||||
if (this.experienceStoreCategoryList.length > 0) {
|
||||
this.experienceStoreCategoryIndex = 0
|
||||
}
|
||||
this.initInfo()
|
||||
})
|
||||
},
|
||||
onUnload() {
|
||||
this.saveDraft()
|
||||
},
|
||||
onHide() {
|
||||
this.saveDraft()
|
||||
},
|
||||
methods: {
|
||||
initInfo() {
|
||||
getExperienceStoreInfo().then(res => {
|
||||
const data = res.data || {}
|
||||
const info = data.experienceStoreInfo || {}
|
||||
if (!info || Object.keys(info).length === 0) {
|
||||
this.form.isDraft = 1
|
||||
this.show = true
|
||||
return
|
||||
}
|
||||
this.form = { ...this.form, ...info }
|
||||
this.coverImg = info.cover ? this.stringToMapArr(info.cover) : []
|
||||
this.avatarImg = info.avatar ? this.stringToMapArr(info.avatar) : []
|
||||
this.bannerImg = info.banner ? this.stringToMapArr(info.banner) : []
|
||||
this.videos = info.video ? this.stringToMapArr(info.video) : []
|
||||
this.qualificationImg = info.qualification ? this.stringToMapArr(info.qualification) : []
|
||||
this.form.reviewStatus = data.reviewStatus != null ? data.reviewStatus : null
|
||||
this.form.reviewMsg = data.reviewMsg || ''
|
||||
this.form.isDraft = data.isDraft != null ? data.isDraft : null
|
||||
this.form.latitude = info.latitude || 0
|
||||
this.form.longitude = info.longitude || 0
|
||||
this.form.position = this.form.longitude && this.form.latitude
|
||||
? this.$forceToDecimal(this.form.longitude, 6) + ',' + this.$forceToDecimal(this.form.latitude, 6)
|
||||
: ''
|
||||
this.form.area = `${this.form.provinceName || ''} ${this.form.cityName || ''} ${this.form.areaName || ''}`.trim()
|
||||
if (this.experienceStoreCategoryList && this.experienceStoreCategoryList.length > 0) {
|
||||
const idx = this.experienceStoreCategoryList.findIndex(item => item.id === this.form.experienceStoreCategoryId)
|
||||
if (idx !== -1) {
|
||||
this.experienceStoreCategoryIndex = idx
|
||||
this.form.experienceStoreCategoryName = this.experienceStoreCategoryList[idx].name
|
||||
}
|
||||
}
|
||||
if (this.form.isDraft === 1 && (this.form.reviewStatus === null || this.form.reviewStatus === undefined)) {
|
||||
this.show = true
|
||||
}
|
||||
}).catch(() => {
|
||||
this.form.isDraft = 1
|
||||
this.show = true
|
||||
})
|
||||
},
|
||||
changeAgree(e) {
|
||||
this.isAgree = e.detail.value.includes('yes')
|
||||
},
|
||||
savePopup() {
|
||||
this.show = false
|
||||
},
|
||||
stringToMapArr(str, split = ',') {
|
||||
return str.split(split).map(item => ({ url: item }))
|
||||
},
|
||||
saveDraft() {
|
||||
this.form.cover = this.coverImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.avatar = this.avatarImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.banner = this.bannerImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.video = this.videos.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.qualification = this.qualificationImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
const params = {
|
||||
experienceStoreInfo: { ...this.form },
|
||||
partnerId: this.partnerId
|
||||
}
|
||||
saveExperienceStoreDraft(params).catch(err => {
|
||||
uni.$u.toast(err.msg)
|
||||
})
|
||||
},
|
||||
handleCategoryChange(e) {
|
||||
const idx = parseInt(e.detail.value)
|
||||
this.experienceStoreCategoryIndex = idx
|
||||
const item = this.experienceStoreCategoryList[idx]
|
||||
if (item) {
|
||||
this.form.experienceStoreCategoryId = item.id
|
||||
this.form.experienceStoreCategoryName = item.name
|
||||
}
|
||||
},
|
||||
submitForm() {
|
||||
if (this.form.reviewStatus === 0 && this.form.isDraft === 0) {
|
||||
this.revokeExperienceStore()
|
||||
return
|
||||
}
|
||||
this.form.cover = this.coverImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.avatar = this.avatarImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.banner = this.bannerImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.video = this.videos.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.qualification = this.qualificationImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
if (!this.form.name) {
|
||||
uni.$u.toast('请输入名称')
|
||||
return
|
||||
}
|
||||
if (!this.form.cover) {
|
||||
uni.$u.toast('请上传主图')
|
||||
return
|
||||
}
|
||||
if (!this.form.avatar) {
|
||||
uni.$u.toast('请上传头像')
|
||||
return
|
||||
}
|
||||
if (!this.form.banner) {
|
||||
uni.$u.toast('请上传轮播图')
|
||||
return
|
||||
}
|
||||
if (!this.form.companyName) {
|
||||
uni.$u.toast('请输入公司名称')
|
||||
return
|
||||
}
|
||||
if (!this.form.experienceStoreCategoryId) {
|
||||
uni.$u.toast('请选择店铺分类')
|
||||
return
|
||||
}
|
||||
if (!this.form.intro) {
|
||||
uni.$u.toast('请输入简介')
|
||||
return
|
||||
}
|
||||
if (!this.form.serviceTime) {
|
||||
uni.$u.toast('请选择营业开始时间')
|
||||
return
|
||||
}
|
||||
if (!this.form.serviceEndTime) {
|
||||
uni.$u.toast('请选择营业结束时间')
|
||||
return
|
||||
}
|
||||
if (!this.form.provinceId) {
|
||||
uni.$u.toast('请选择省份')
|
||||
return
|
||||
}
|
||||
if (!this.form.cityId) {
|
||||
uni.$u.toast('请选择城市')
|
||||
return
|
||||
}
|
||||
if (!this.form.areaId) {
|
||||
uni.$u.toast('请选择区域')
|
||||
return
|
||||
}
|
||||
if (!this.form.address) {
|
||||
uni.$u.toast('请输入详细地址')
|
||||
return
|
||||
}
|
||||
if (!this.form.longitude || !this.form.latitude) {
|
||||
uni.$u.toast('请选择地理定位')
|
||||
return
|
||||
}
|
||||
if (!this.form.qualification) {
|
||||
uni.$u.toast('请上传资质')
|
||||
return
|
||||
}
|
||||
if (!this.form.contact) {
|
||||
uni.$u.toast('请输入联系人姓名')
|
||||
return
|
||||
}
|
||||
if (!this.form.phone) {
|
||||
uni.$u.toast('请输入手机号')
|
||||
return
|
||||
}
|
||||
if (!this.form.captcha) {
|
||||
uni.$u.toast('请输入验证码')
|
||||
return
|
||||
}
|
||||
// if (!this.form.wechat) {
|
||||
// uni.$u.toast('请输入联系微信')
|
||||
// return
|
||||
// }
|
||||
const params = {
|
||||
experienceStoreInfo: { ...this.form },
|
||||
partnerId: this.partnerId,
|
||||
captcha: this.form.captcha
|
||||
}
|
||||
saveExperienceStore(params).then(res => {
|
||||
if (res.status === 200) {
|
||||
uni.showToast({
|
||||
title: '您的入驻申请已提交成功,请耐心等待审核',
|
||||
icon: 'none',
|
||||
success: () => {
|
||||
this.form.isDraft = 0
|
||||
this.form.reviewStatus = 0
|
||||
this.show = false
|
||||
}
|
||||
})
|
||||
}
|
||||
}).catch(err => {
|
||||
uni.$u.toast(err.msg)
|
||||
})
|
||||
},
|
||||
revokeExperienceStore() {
|
||||
uni.showModal({
|
||||
title: '提示',
|
||||
content: '确定撤销申请吗?',
|
||||
success: res => {
|
||||
if (res.confirm) {
|
||||
removeApply().then(result => {
|
||||
if (result.status === 200) {
|
||||
uni.$u.toast('撤销申请成功')
|
||||
this.form.reviewStatus = null
|
||||
this.form.isDraft = 1
|
||||
this.show = true
|
||||
this.initInfo()
|
||||
} else {
|
||||
uni.$u.toast(result.msg || '撤销失败')
|
||||
}
|
||||
}).catch(err => {
|
||||
uni.$u.toast(err.msg)
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
getCode() {
|
||||
if (!this.form.phone) {
|
||||
uni.$u.toast('请输入手机号')
|
||||
return
|
||||
}
|
||||
if (this.form.phone.length !== 11) {
|
||||
uni.$u.toast('请输入11位手机号')
|
||||
return
|
||||
}
|
||||
if (this.$refs.uCode && this.$refs.uCode.canGetCode) {
|
||||
uni.showLoading({
|
||||
title: '正在获取验证码'
|
||||
})
|
||||
registerVerify({
|
||||
phone: this.form.phone,
|
||||
type: 'merchantExperienceStoreApply'
|
||||
}).then(() => {
|
||||
uni.hideLoading()
|
||||
uni.$u.toast('验证码已发送')
|
||||
this.$refs.uCode.start()
|
||||
}).catch(err => {
|
||||
uni.hideLoading()
|
||||
uni.$u.toast(err.msg)
|
||||
})
|
||||
} else {
|
||||
uni.$u.toast('倒计时结束后再发送')
|
||||
}
|
||||
},
|
||||
codeChange(text) {
|
||||
this.tips = text
|
||||
},
|
||||
chooLocation() {
|
||||
if (this.form.isDraft === 0 && (this.form.reviewStatus === 0 || this.form.reviewStatus === 1)) {
|
||||
return
|
||||
}
|
||||
uni.chooseLocation({
|
||||
success: res => {
|
||||
this.form.address = res.address
|
||||
this.form.longitude = this.$forceToDecimal(res.longitude, 6)
|
||||
this.form.latitude = this.$forceToDecimal(res.latitude, 6)
|
||||
this.form.position = this.$forceToDecimal(res.longitude, 6) + ',' + this.$forceToDecimal(res.latitude, 6)
|
||||
}
|
||||
})
|
||||
},
|
||||
resultCity(values) {
|
||||
const address = {
|
||||
province: values.province.name || '',
|
||||
city: values.city.name || '',
|
||||
district: values.district.name || '',
|
||||
provinceId: values.province.id,
|
||||
cityId: values.city.id,
|
||||
areaId: values.district.id
|
||||
}
|
||||
this.form.area = `${address.province || ''} ${address.city || ''} ${address.district || ''}`
|
||||
this.form.areaName = address.district || ''
|
||||
this.form.provinceName = address.province || ''
|
||||
this.form.cityName = address.city || ''
|
||||
this.form.provinceId = address.provinceId
|
||||
this.form.cityId = address.cityId
|
||||
this.form.areaId = address.areaId
|
||||
},
|
||||
queryCity() {
|
||||
getCity().then(({ data }) => {
|
||||
this.district = data
|
||||
})
|
||||
},
|
||||
showTimePicker() {
|
||||
if (this.form.isDraft === 0 && (this.form.reviewStatus === 0 || this.form.reviewStatus === 1)) {
|
||||
return
|
||||
}
|
||||
this.$refs.TimePickerPopupRef.open()
|
||||
},
|
||||
timeRange(e) {
|
||||
this.form.serviceTime = e[0]
|
||||
this.form.serviceEndTime = e[1]
|
||||
this.$forceUpdate()
|
||||
},
|
||||
afterRead(e, imgField, type) {
|
||||
const uploadFunc = type === 'video' ? uploadVideo : uploadImage
|
||||
if (e.file.length > 0) {
|
||||
e.file.forEach(item => {
|
||||
if (!item.url) return
|
||||
uploadFunc(item.url, img => {
|
||||
if (!img) return
|
||||
this[imgField].push({ url: img })
|
||||
})
|
||||
})
|
||||
}
|
||||
},
|
||||
deleteVideo(index) {
|
||||
if (this.form.isDraft === 0 && (this.form.reviewStatus === 0 || this.form.reviewStatus === 1)) {
|
||||
return
|
||||
}
|
||||
uni.showModal({
|
||||
title: '确认删除',
|
||||
content: '确定删除该视频?',
|
||||
success: res => {
|
||||
if (res.confirm) {
|
||||
this.deletePic({ index }, 'videos')
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
deletePic(e, imgField) {
|
||||
if (this.form.isDraft === 0 && (this.form.reviewStatus === 0 || this.form.reviewStatus === 1)) {
|
||||
return
|
||||
}
|
||||
this[imgField].splice(e.index, 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.popup-body {
|
||||
width: 80vw;
|
||||
height: 80vh;
|
||||
padding: 30rpx;
|
||||
overflow: hidden;
|
||||
}
|
||||
.popup-body .content {
|
||||
height: 52vh;
|
||||
overflow-y: auto;
|
||||
margin: 30rpx 0;
|
||||
}
|
||||
.popup-body .agree-box {
|
||||
margin: 60rpx 0;
|
||||
font-size: 28rpx;
|
||||
color: #666;
|
||||
}
|
||||
.popup-body {
|
||||
.title {
|
||||
line-height: 80rpx;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
.container {
|
||||
padding: 20rpx;
|
||||
background: #fff;
|
||||
}
|
||||
.title {
|
||||
font-size: 32rpx;
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
}
|
||||
.required {
|
||||
color: #c52733;
|
||||
}
|
||||
.input {
|
||||
margin-top: 20rpx;
|
||||
}
|
||||
.submit-btn {
|
||||
width: 100%;
|
||||
height: 100rpx;
|
||||
text-align: center;
|
||||
line-height: 100rpx;
|
||||
}
|
||||
.reason-box {
|
||||
background: rgba(255, 160, 167, 0.39);
|
||||
border-radius: 8rpx;
|
||||
color: #c52733;
|
||||
font-size: 30rpx;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
.title {
|
||||
white-space: nowrap;
|
||||
}
|
||||
.video-item {
|
||||
width: 160rpx;
|
||||
height: 160rpx;
|
||||
}
|
||||
.video-wrapper {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
}
|
||||
.delete-badge {
|
||||
position: absolute;
|
||||
top: 0rpx;
|
||||
right: 0rpx;
|
||||
background: #000;
|
||||
color: #fff;
|
||||
padding: 2rpx 8rpx;
|
||||
border-radius: 0 0 0rpx 200rpx;
|
||||
font-size: 22rpx;
|
||||
z-index: 10;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
<style>
|
||||
.input .u-textarea {
|
||||
background-color: #F3F3F3 !important;
|
||||
}
|
||||
</style>
|
||||
@@ -26,23 +26,11 @@
|
||||
mode="widthFix"
|
||||
@click="goto('shop')"
|
||||
/>
|
||||
<!-- <image
|
||||
<image
|
||||
:src="images.wholesalerImage"
|
||||
class="img-item"
|
||||
mode="widthFix"
|
||||
@click="goto('wholesaler')"
|
||||
/> -->
|
||||
<image
|
||||
:src="images.travelImage"
|
||||
class="img-item"
|
||||
mode="widthFix"
|
||||
@click="toTravelResidence"
|
||||
/>
|
||||
<image
|
||||
:src="images.experienceStoreImage"
|
||||
class="img-item"
|
||||
mode="widthFix"
|
||||
@click="goto('experience_store')"
|
||||
/>
|
||||
</view>
|
||||
</template>
|
||||
@@ -62,8 +50,6 @@ export default {
|
||||
hasHotel: null,
|
||||
hasSupplier: null,
|
||||
hasWholesaler: null,
|
||||
hasExperienceStore: null,
|
||||
hasTravel: null,
|
||||
images: null,
|
||||
pageKeyId: Object.freeze('merchantApplyIndex'),
|
||||
canApplyHotel: false
|
||||
@@ -79,25 +65,9 @@ export default {
|
||||
this.hasSupplier = data.hasSupplier
|
||||
this.hasWholesaler = data.hasWholesaler
|
||||
this.canApplyHotel = data.canApplyHotel
|
||||
this.hasTravel = data.hasTravel
|
||||
this.hasExperienceStore = data.hasExperienceStore
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* 跳转旅游 residences
|
||||
*/
|
||||
toTravelResidence() {
|
||||
if (this.hasTravel === 1) {
|
||||
this.$global.goSupplierMini()
|
||||
} else {
|
||||
this.$yrouter.push('/pkg_join/views/travelResidence?partnerId=' + this.partnerId)
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 跳转
|
||||
* @param {string} target - 目标页面
|
||||
*/
|
||||
goto(target) {
|
||||
switch (target) {
|
||||
case 'goods_supplier':
|
||||
@@ -124,13 +94,6 @@ export default {
|
||||
}
|
||||
this.$yrouter.push('/pkg_join/views/shop?partnerId=' + this.partnerId)
|
||||
break
|
||||
case 'experience_store':
|
||||
if(this.hasExperienceStore === 1) {
|
||||
this.$global.goSupplierMini()
|
||||
return
|
||||
}
|
||||
this.$yrouter.push('/pkg_join/views/experienceStore?partnerId=' + this.partnerId)
|
||||
break
|
||||
case 'wholesaler':
|
||||
if (this.hasWholesaler === 1) {
|
||||
this.$global.goSupplierMini()
|
||||
|
||||
+26
-132
@@ -121,7 +121,6 @@
|
||||
:fileList="pics"
|
||||
:maxCount="99999"
|
||||
:disabled="reviewing"
|
||||
:deletable="!reviewing"
|
||||
name="pics"
|
||||
multiple
|
||||
@afterRead="afterRead"
|
||||
@@ -166,7 +165,6 @@
|
||||
:maxCount="9"
|
||||
:fileList="quaPics"
|
||||
:disabled="reviewing"
|
||||
:deletable="!reviewing"
|
||||
name="quaPics"
|
||||
multiple
|
||||
@afterRead="quaAfterRead"
|
||||
@@ -175,54 +173,26 @@
|
||||
</template>
|
||||
</u-cell>
|
||||
</view>
|
||||
<u-form-item prop="isCountyFamous">
|
||||
<u-cell title="县域店铺" :border="false">
|
||||
<u-form-item prop="typeText">
|
||||
<u-cell title="店铺类型" :border="false" isLink>
|
||||
<template #icon>
|
||||
<text class="required">*</text>
|
||||
</template>
|
||||
<template #value>
|
||||
<u-radio-group
|
||||
v-model="form.isCountyFamous"
|
||||
<picker
|
||||
:value="indexType"
|
||||
:range="columnsType"
|
||||
:disabled="reviewing"
|
||||
placement="row"
|
||||
@change="countyFamousChange"
|
||||
mode=selector
|
||||
range-key="name"
|
||||
class="picker"
|
||||
@change="typeChange"
|
||||
>
|
||||
<u-radio
|
||||
:name="0"
|
||||
:customStyle="{marginRight: '16px'}"
|
||||
active-color="red"
|
||||
label="否"
|
||||
/>
|
||||
<u-radio
|
||||
:name="1"
|
||||
active-color="red"
|
||||
label="是"
|
||||
/>
|
||||
</u-radio-group>
|
||||
</template>
|
||||
</u-cell>
|
||||
</u-form-item>
|
||||
<u-form-item prop="typeText">
|
||||
<picker
|
||||
:value="indexType"
|
||||
:range="columnsType"
|
||||
:disabled="reviewing"
|
||||
mode="selector"
|
||||
range-key="name"
|
||||
class="picker"
|
||||
style="width: 100%"
|
||||
@change="typeChange"
|
||||
>
|
||||
<u-cell title="店铺类型" :border="false" isLink>
|
||||
<template #icon>
|
||||
<text class="required">*</text>
|
||||
</template>
|
||||
<template #value>
|
||||
<u--text v-if="form.typeText" :text="form.typeText"></u--text>
|
||||
<u--text v-else text="请选择类型" color="#c0c4cc"></u--text>
|
||||
</template>
|
||||
</u-cell>
|
||||
</picker>
|
||||
</picker>
|
||||
</template>
|
||||
</u-cell>
|
||||
</u-form-item>
|
||||
<u-form-item prop="contact">
|
||||
<u-cell title="联系人姓名" :border="false">
|
||||
@@ -290,7 +260,7 @@
|
||||
</u-cell>
|
||||
</u-form-item>
|
||||
<u-form-item prop="area">
|
||||
<u-cell title="省市区" :border="false" isLink @click="$refs.cityselect.open()">
|
||||
<u-cell title="省市区" :border="false" isLink>
|
||||
<template #icon>
|
||||
<text class="required">*</text>
|
||||
</template>
|
||||
@@ -298,7 +268,7 @@
|
||||
<view class="u-text__value" :class="{'area-item':form.area && form.area.length===0}">
|
||||
<CitySelect
|
||||
ref="cityselect"
|
||||
:defaultValue="form.area || ''"
|
||||
:defaultValue="form.area"
|
||||
:disabled="reviewing"
|
||||
:items="district"
|
||||
@callback="result"
|
||||
@@ -344,15 +314,7 @@
|
||||
<text class="required">*</text>
|
||||
</template>
|
||||
<template #value>
|
||||
<u--text
|
||||
v-if="form.serviceTime && form.serviceEndTime"
|
||||
:text="form.serviceTime + ' - ' + form.serviceEndTime"
|
||||
></u--text>
|
||||
<u--text
|
||||
v-else
|
||||
text="请选择营业时间"
|
||||
color="#c0c4cc"
|
||||
></u--text>
|
||||
<u--text :text="form.serviceTime + ' - ' + form.serviceEndTime"></u--text>
|
||||
<tpf-time-range
|
||||
startTime="00:00"
|
||||
endTime="23:59"
|
||||
@@ -375,9 +337,7 @@
|
||||
<u-cell :border="false">
|
||||
<template #title>
|
||||
<view class="line">
|
||||
<u-textarea
|
||||
:maxlength="-1"
|
||||
autoHeight
|
||||
<u-input
|
||||
v-model="form.content"
|
||||
:disabled="reviewing"
|
||||
border="none"
|
||||
@@ -415,6 +375,7 @@
|
||||
:show="show"
|
||||
mode="center"
|
||||
round="10"
|
||||
closeable
|
||||
@close="show=false"
|
||||
>
|
||||
<view class="popup-body">
|
||||
@@ -449,9 +410,7 @@ import {
|
||||
getShopData,
|
||||
getShopInfo,
|
||||
removeApply,
|
||||
saveShop,
|
||||
getHotelInfo,
|
||||
getCountyFamousHotelType
|
||||
saveShop
|
||||
} from '@/api/join'
|
||||
import {
|
||||
getCity,
|
||||
@@ -486,8 +445,6 @@ export default {
|
||||
qualification: '',
|
||||
type: 0,
|
||||
typeText: '',
|
||||
isCountyFamous: 0,
|
||||
countyFamousHotelType: null,
|
||||
phone: '',
|
||||
captcha: '',
|
||||
area: '',
|
||||
@@ -522,12 +479,6 @@ export default {
|
||||
message: '请上传店铺LOGO',
|
||||
trigger: ['blur', 'change']
|
||||
},
|
||||
'isCountyFamous': {
|
||||
type: 'number',
|
||||
required: true,
|
||||
message: '请选择是否为县域店铺',
|
||||
trigger: ['blur', 'change']
|
||||
},
|
||||
'typeText': {
|
||||
type: 'string',
|
||||
required: true,
|
||||
@@ -584,8 +535,6 @@ export default {
|
||||
}
|
||||
},
|
||||
columnsType: [],
|
||||
hotelTypeList: [],
|
||||
countyFamousHotelTypeList: [],
|
||||
indexType: [0],
|
||||
district: [],
|
||||
address: {},
|
||||
@@ -621,8 +570,6 @@ export default {
|
||||
qualification: '',
|
||||
type: 0,
|
||||
typeText: '',
|
||||
isCountyFamous: 0,
|
||||
countyFamousHotelType: null,
|
||||
phone: '',
|
||||
captcha: '',
|
||||
area: '',
|
||||
@@ -695,32 +642,21 @@ export default {
|
||||
this.district = data
|
||||
})
|
||||
getShopData().then(({data}) => {
|
||||
this.hotelTypeList = data.hotelTypeList || []
|
||||
this.columnsType = this.hotelTypeList
|
||||
this.columnsType = data.hotelTypeList
|
||||
this.notice = data.merchantApplyNotice
|
||||
getCountyFamousHotelType().then(res => {
|
||||
const listData = Array.isArray(res.data)
|
||||
? res.data
|
||||
: (res.data && (res.data.hotelTypeList || res.data.list || res.data.records)) || []
|
||||
this.countyFamousHotelTypeList = listData || []
|
||||
this.initInfo()
|
||||
}).catch(() => {
|
||||
this.initInfo()
|
||||
})
|
||||
this.initInfo()
|
||||
})
|
||||
},
|
||||
|
||||
initInfo(flag) {
|
||||
getHotelInfo().then(({data}) => {
|
||||
initInfo() {
|
||||
getShopInfo().then(({data}) => {
|
||||
if (data.partnerId != null) {
|
||||
this.partnerId = data.partnerId
|
||||
}
|
||||
this.isDraft = data.isDraft
|
||||
this.reviewStatus = data.reviewStatus
|
||||
if(data.isDraft === null || data.isDraft === 1) {
|
||||
if(!flag) {
|
||||
this.show = true
|
||||
}
|
||||
this.show = true
|
||||
}
|
||||
if (data.isDraft !== 1) {
|
||||
switch (data.reviewStatus) {
|
||||
@@ -743,10 +679,6 @@ export default {
|
||||
// 店铺图片
|
||||
this.pics = []
|
||||
this.form = data.hotelInfo
|
||||
if (!this.form.serviceTime || !this.form.serviceEndTime) {
|
||||
this.form.serviceTime = ''
|
||||
this.form.serviceEndTime = ''
|
||||
}
|
||||
this.form.coverVideo = this.form.coverType === 2 ? this.form.cover : ''
|
||||
const picsTemp = this.form.pics.split(',')
|
||||
if (picsTemp.length > 0) {
|
||||
@@ -766,16 +698,7 @@ export default {
|
||||
}
|
||||
})
|
||||
}
|
||||
if (this.form.isCountyFamous !== 1 && this.form.isCountyFamous !== 0) {
|
||||
this.form.isCountyFamous = 0
|
||||
}
|
||||
if (this.form.isCountyFamous === 1) {
|
||||
this.columnsType = this.countyFamousHotelTypeList
|
||||
this.indexType = this.columnsType.findIndex(item => item.id === this.form.countyFamousHotelType)
|
||||
} else {
|
||||
this.columnsType = this.hotelTypeList
|
||||
this.indexType = this.columnsType.findIndex(item => item.id === this.form.type)
|
||||
}
|
||||
this.indexType = this.columnsType.findIndex(item => item.id === this.form.type)
|
||||
if (this.indexType !== -1) {
|
||||
this.form.typeText = this.columnsType[this.indexType].name
|
||||
}
|
||||
@@ -838,42 +761,13 @@ export default {
|
||||
})
|
||||
}
|
||||
},
|
||||
countyFamousChange(e) {
|
||||
const value = parseInt(e)
|
||||
this.form.isCountyFamous = value
|
||||
if (value === 1) {
|
||||
if (this.countyFamousHotelTypeList.length === 0) {
|
||||
getCountyFamousHotelType().then(res => {
|
||||
const listData = Array.isArray(res.data)
|
||||
? res.data
|
||||
: (res.data && (res.data.hotelTypeList || res.data.list || res.data.records)) || []
|
||||
this.countyFamousHotelTypeList = listData || []
|
||||
this.columnsType = this.countyFamousHotelTypeList
|
||||
})
|
||||
} else {
|
||||
this.columnsType = this.countyFamousHotelTypeList
|
||||
}
|
||||
this.indexType = 0
|
||||
this.form.typeText = ''
|
||||
this.form.countyFamousHotelType = null
|
||||
} else {
|
||||
this.columnsType = this.hotelTypeList
|
||||
this.indexType = 0
|
||||
this.form.typeText = ''
|
||||
this.form.type = 0
|
||||
}
|
||||
},
|
||||
typeChange(e) {
|
||||
const idx = parseInt(e.detail.value)
|
||||
this.columnsType.map((item, index) => {
|
||||
if (index === idx) {
|
||||
this.form.typeText = item.name
|
||||
this.indexType = index
|
||||
if (this.form.isCountyFamous === 1) {
|
||||
this.form.countyFamousHotelType = item.id
|
||||
} else {
|
||||
this.form.type = item.id
|
||||
}
|
||||
this.form.type = item.id
|
||||
}
|
||||
})
|
||||
},
|
||||
@@ -969,7 +863,7 @@ export default {
|
||||
title: '您的入驻申请已提交成功,请耐心等待审核',
|
||||
icon: 'none',
|
||||
success: () => {
|
||||
this.initInfo(1)
|
||||
this.initInfo()
|
||||
this.show = false
|
||||
}
|
||||
})
|
||||
|
||||
+14
-47
@@ -36,21 +36,6 @@
|
||||
</template>
|
||||
</u-cell>
|
||||
</u-form-item>
|
||||
<u-form-item prop="businessLicense">
|
||||
<u-cell title="营业执照名称" :border="false">
|
||||
<template #icon>
|
||||
<text class="required">*</text>
|
||||
</template>
|
||||
<template #value>
|
||||
<u-input
|
||||
v-model="formSupplier.businessLicense"
|
||||
:disabled="reviewing"
|
||||
border="none"
|
||||
placeholder="请填写营业执照名称"
|
||||
/>
|
||||
</template>
|
||||
</u-cell>
|
||||
</u-form-item>
|
||||
<u-form-item prop="avatar">
|
||||
<u-cell title="头像" :border="false">
|
||||
<template #label>
|
||||
@@ -147,10 +132,8 @@
|
||||
</template>
|
||||
<template #label>
|
||||
<u-upload
|
||||
v-if="showUpload"
|
||||
:fileList="quaPics"
|
||||
:maxCount="9"
|
||||
:deletable="!reviewing"
|
||||
:disabled="reviewing"
|
||||
name="quaPics"
|
||||
multiple
|
||||
@@ -161,7 +144,7 @@
|
||||
</u-cell>
|
||||
</view>
|
||||
<u-form-item prop="area">
|
||||
<u-cell title="省市区" :border="false" isLink @click="$refs.cityselect.open()">
|
||||
<u-cell title="省市区" :border="false" isLink>
|
||||
<template #icon>
|
||||
<text class="required">*</text>
|
||||
</template>
|
||||
@@ -169,7 +152,7 @@
|
||||
<view class="u-text__value" :class="{'area-item':formSupplier.area && formSupplier.area.length===0}">
|
||||
<CitySelect
|
||||
ref="cityselect"
|
||||
:defaultValue="formSupplier.area || ''"
|
||||
:defaultValue="formSupplier.area"
|
||||
:disabled="reviewing"
|
||||
:items="district"
|
||||
@callback="resultSupplier"
|
||||
@@ -317,7 +300,6 @@
|
||||
:fileList="pics"
|
||||
:maxCount="99999"
|
||||
:disabled="reviewing"
|
||||
:deletable="!reviewing"
|
||||
name="pics"
|
||||
multiple
|
||||
@afterRead="afterRead"
|
||||
@@ -349,7 +331,7 @@
|
||||
</u-cell>
|
||||
</u-form-item>
|
||||
<u-form-item prop="typeText">
|
||||
<u-cell title="店铺类型" :border="false">
|
||||
<u-cell title="店铺类型" :border="false" isLink>
|
||||
<template #icon>
|
||||
<text class="required">*</text>
|
||||
</template>
|
||||
@@ -358,16 +340,13 @@
|
||||
:value="indexType"
|
||||
:range="columnsType"
|
||||
:disabled="reviewing"
|
||||
mode="selector"
|
||||
mode=selector
|
||||
range-key="name"
|
||||
class="picker"
|
||||
@change="typeChange"
|
||||
>
|
||||
<view style="display: flex; align-items: center; justify-content: flex-end;">
|
||||
<u--text v-if="form.typeText" :text="form.typeText"></u--text>
|
||||
<u--text v-else text="请选择类型" color="#c0c4cc"></u--text>
|
||||
<u-icon name="arrow-right" color="#909399" size="18"></u-icon>
|
||||
</view>
|
||||
<u--text v-if="form.typeText" :text="form.typeText"></u--text>
|
||||
<u--text v-else text="请选择类型" color="#c0c4cc"></u--text>
|
||||
</picker>
|
||||
</template>
|
||||
</u-cell>
|
||||
@@ -404,7 +383,7 @@
|
||||
</u-cell>
|
||||
</u-form-item>
|
||||
<u-form-item prop="area">
|
||||
<u-cell title="省市区" :border="false" isLink @click="$refs.cityselect2.open()">
|
||||
<u-cell title="省市区" :border="false" isLink>
|
||||
<template #icon>
|
||||
<text class="required">*</text>
|
||||
</template>
|
||||
@@ -412,7 +391,7 @@
|
||||
<view class="u-text__value" :class="{'area-item':form.area && form.area.length===0}">
|
||||
<CitySelect
|
||||
ref="cityselect2"
|
||||
:defaultValue="form.area || ''"
|
||||
:defaultValue="form.area"
|
||||
:disabled="reviewing"
|
||||
:items="district"
|
||||
@callback="result"
|
||||
@@ -453,7 +432,7 @@
|
||||
<text class="required">*</text>
|
||||
</template>
|
||||
<template #value>
|
||||
<u--text :text="`${form.serviceTime || ''} - ${form.serviceEndTime || ''}`"></u--text>
|
||||
<u--text :text="form.serviceTime + ' - ' + form.serviceEndTime"></u--text>
|
||||
<tpf-time-range
|
||||
startTime="00:00"
|
||||
endTime="23:59"
|
||||
@@ -476,9 +455,7 @@
|
||||
<u-cell :border="false">
|
||||
<template #title>
|
||||
<view class="line">
|
||||
<u-textarea
|
||||
:maxlength="-1"
|
||||
autoHeight
|
||||
<u-input
|
||||
v-model="form.content"
|
||||
:disabled="reviewing"
|
||||
border="none"
|
||||
@@ -513,7 +490,7 @@
|
||||
@cancel="changeRemove(false)"
|
||||
@confirm="onRemove"
|
||||
/>
|
||||
<u-popup :show="show" mode="center" round="10" @close="show=false">
|
||||
<u-popup :show="show" mode="center" round="10" closeable @close="show=false">
|
||||
<view class="popup-body">
|
||||
<view class="tc bold">入驻申请须知</view>
|
||||
<view class="content">
|
||||
@@ -573,7 +550,6 @@ export default {
|
||||
quaPics: [],
|
||||
formSupplier: {
|
||||
name: '',
|
||||
businessLicense: '',
|
||||
avatar: '',
|
||||
contact: '',
|
||||
phone: '',
|
||||
@@ -609,12 +585,6 @@ export default {
|
||||
message: '请填写供应商名称',
|
||||
trigger: ['blur', 'change']
|
||||
},
|
||||
'businessLicense': {
|
||||
type: 'string',
|
||||
required: true,
|
||||
message: '请填写营业执照名称',
|
||||
trigger: ['blur', 'change']
|
||||
},
|
||||
'contact': {
|
||||
type: 'string',
|
||||
required: true,
|
||||
@@ -679,8 +649,7 @@ export default {
|
||||
stateType: 'primary',
|
||||
// 是否为审核中
|
||||
reviewing: false,
|
||||
pageKeyId: '',
|
||||
showUpload: false
|
||||
pageKeyId: ''
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -794,7 +763,6 @@ export default {
|
||||
}
|
||||
this.formSupplier = !this.reviewing && local || {
|
||||
name: '',
|
||||
businessLicense: '',
|
||||
avatar: '',
|
||||
contact: '',
|
||||
phone: '',
|
||||
@@ -891,7 +859,6 @@ export default {
|
||||
initInfo() {
|
||||
// 是否缺少参数区分文玩和特产?
|
||||
getShopInfo().then((res) => {
|
||||
this.showUpload = true
|
||||
const {data} = res
|
||||
// console.log(res, 'initInfo--------');
|
||||
// console.log(data, 'data--------');
|
||||
@@ -961,9 +928,9 @@ export default {
|
||||
this.formSupplier = data.supplierInfo
|
||||
this.formSupplier.typeText = this.columnsSupplierType[this.indexSupplierType].value
|
||||
this.formSupplier.position = this.$forceToDecimal(this.formSupplier.longitude, 6) + ',' + this.$forceToDecimal(this.formSupplier.latitude, 6)
|
||||
this.formSupplier.area = `${this.formSupplier.provinceName || ''} ${this.formSupplier.cityName || ''} ${this.formSupplier.areaName || ''}` || ''
|
||||
this.formSupplier.area = `${this.formSupplier.provinceName || ''} ${this.formSupplier.cityName || ''} ${this.formSupplier.areaName || ''}`
|
||||
this.indexSupplierType = this.columnsSupplierType.findIndex(item => item.key === this.formSupplier.subType)
|
||||
console.log(this.formSupplier);
|
||||
// console.log(this.formSupplier);
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
@@ -1,929 +0,0 @@
|
||||
<template>
|
||||
<view class="container">
|
||||
<view class="v12-pa-2 reason-box" v-if="form.reviewStatus === 2">
|
||||
驳回原因: {{ form.reviewMsg }}
|
||||
</view>
|
||||
<view class="v12-pa-2 reason-box" v-if="form.isDraft === 0 && form.reviewStatus !== 1 &&form.reviewStatus === 0">
|
||||
审核中
|
||||
</view>
|
||||
<view class="form-item">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
名称:
|
||||
</view>
|
||||
<view class="input">
|
||||
<u-textarea
|
||||
border="none"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
placeholder="请输入名称"
|
||||
:placeholder-style="inputPlaceholderStyle"
|
||||
v-model="form.name"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<view class="form-item v12-mt-2">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
营业执照名称:
|
||||
</view>
|
||||
<view class="input">
|
||||
<u-textarea
|
||||
border="none"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
placeholder="请输入营业执照名称"
|
||||
:placeholder-style="inputPlaceholderStyle"
|
||||
v-model="form.businessLicense"
|
||||
autoHeight
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start">
|
||||
<view>
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
主图:
|
||||
</view>
|
||||
<view class="input">
|
||||
<u-upload
|
||||
:fileList="coverImg.filter(item => item.url)"
|
||||
:disabled="form.isDraft === 0 && (coverImg.length > 0 || form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
:deletable="form.isDraft === 1 || (form.reviewStatus !== 0 && form.reviewStatus !== 1)"
|
||||
:maxCount="1"
|
||||
count="1"
|
||||
name="coverImg"
|
||||
multiple
|
||||
@afterRead="afterRead($event, 'coverImg')"
|
||||
@delete="deletePic($event, 'coverImg')"
|
||||
></u-upload>
|
||||
</view>
|
||||
</view>
|
||||
<view class="v12-ml-2">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
头像:
|
||||
</view>
|
||||
<view class="input">
|
||||
<u-upload
|
||||
:fileList="avatarImg.filter(item => item.url)"
|
||||
:disabled="form.isDraft === 0 && (avatarImg.length > 0 || form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
:deletable="form.isDraft === 1 || (form.reviewStatus !== 0 && form.reviewStatus !== 1)"
|
||||
:maxCount="1"
|
||||
count="1"
|
||||
name="avatarImg"
|
||||
multiple
|
||||
@afterRead="afterRead($event, 'avatarImg')"
|
||||
@delete="deletePic($event, 'avatarImg')"
|
||||
></u-upload>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="form-item v12-mt-2">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
轮播图:
|
||||
</view>
|
||||
<view class="input">
|
||||
<u-upload
|
||||
:fileList="bannerImg"
|
||||
:disabled="form.isDraft === 0 && (bannerImg.length > 8 || form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
:deletable="form.isDraft === 1 || (form.reviewStatus !== 0 && form.reviewStatus !== 1)"
|
||||
:maxCount="9"
|
||||
count="9"
|
||||
name="bannerImg"
|
||||
multiple
|
||||
@afterRead="afterRead($event, 'bannerImg')"
|
||||
@delete="deletePic($event, 'bannerImg')"
|
||||
></u-upload>
|
||||
</view>
|
||||
</view>
|
||||
<view class="form-item v12-mt-2">
|
||||
<view class="title">
|
||||
视频:
|
||||
</view>
|
||||
<view class="input">
|
||||
<u-upload
|
||||
v-if="videos.length === 0"
|
||||
accept="video"
|
||||
multiple
|
||||
:max-count="1"
|
||||
:fileList="videos"
|
||||
:disabled="form.isDraft === 0 && (videos.length > 0 || form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
:deletable="form.isDraft === 1 || (form.reviewStatus !== 0 && form.reviewStatus !== 1)"
|
||||
:maxCount="1"
|
||||
count="9"
|
||||
name="bannerImg"
|
||||
:previewFullImage="true"
|
||||
@afterRead="afterRead($event, 'videos', 'video')"
|
||||
@delete="deletePic($event, 'videos')"
|
||||
></u-upload>
|
||||
<view v-else class="video-wrapper">
|
||||
<video
|
||||
:src="videos[0].url"
|
||||
:poster="videos[0].url + '?vframe/jpg/offset/1'"
|
||||
:controls="false"
|
||||
play-btn-position="center"
|
||||
class="video-item"
|
||||
/>
|
||||
<view
|
||||
v-if="form.isDraft === 1 || (form.reviewStatus !== 0 && form.reviewStatus !== 1)"
|
||||
class="delete-badge"
|
||||
@click.stop="deleteVideo(0)"
|
||||
>
|
||||
x
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
公司名称
|
||||
</view>
|
||||
<view class="v12-ml-2" style="flex: 1;">
|
||||
<input
|
||||
type="text"
|
||||
:placeholder-style="inputPlaceholderStyle"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
placeholder="请输入公司名称"
|
||||
v-model="form.companyName"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
简介
|
||||
</view>
|
||||
<view class="v12-ml-2" style="flex: 1;">
|
||||
<input
|
||||
type="text"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
:placeholder-style="inputPlaceholderStyle"
|
||||
placeholder="请输入公司简介"
|
||||
v-model="form.intro"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider></u-divider>
|
||||
<view @click="showTimePicker" class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
营业时间
|
||||
</view>
|
||||
<view class="v12-ml-2">
|
||||
<view color="#999999" :text="`${form.serviceTime || '起始时间'} - ${form.serviceEndTime || '结束时间'}`">
|
||||
<text :style="{'color': form.serviceTime? '#333' : '#999999'}">{{form.serviceTime || '起始时间'}}</text> - <text :style="{'color': form.serviceEndTime? '#333' : '#999999'}">{{form.serviceEndTime || '结束时间'}}</text>
|
||||
</view>
|
||||
<tpf-time-range
|
||||
startTime="00:00"
|
||||
endTime="23:59"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
:startDefaultTime="form.serviceTime"
|
||||
:endDefaultTime="form.serviceEndTime"
|
||||
ref="TimePickerPopupRef"
|
||||
@timeRange="timeRange"
|
||||
>
|
||||
</tpf-time-range>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider></u-divider>
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
省市区
|
||||
</view>
|
||||
<view class="v12-ml-2 one-t" style="flex: 1;">
|
||||
<CitySelect
|
||||
ref="cityselect"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
:defaultValue="form.area || '请选择'"
|
||||
:items="district"
|
||||
@callback="resultCity"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider></u-divider>
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
详细地址
|
||||
</view>
|
||||
<view class="v12-ml-2" style="flex: 1;">
|
||||
<input
|
||||
:placeholder-style="inputPlaceholderStyle"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
type="text"
|
||||
placeholder="请输入详细地址"
|
||||
v-model="form.address"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider></u-divider>
|
||||
<view @click="chooLocation" class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
地理定位
|
||||
</view>
|
||||
<view class="v12-ml-2" style="flex: 1;">
|
||||
<u--text v-if="form.position" :text="form.position"></u--text>
|
||||
<u--text v-else text="请选择" color="#c0c4cc"></u--text>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider></u-divider>
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
商家电话
|
||||
</view>
|
||||
<view class="v12-ml-2" style="flex: 1;">
|
||||
<u-input
|
||||
type="text"
|
||||
:placeholder-style="inputPlaceholderStyle"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
placeholder="请输入商家电话"
|
||||
v-model="form.phone"
|
||||
maxlength="11"
|
||||
border="none"
|
||||
>
|
||||
<template slot="suffix" >
|
||||
<u-code
|
||||
v-if="form.isDraft === 1 || (form.reviewStatus !== 0 && form.reviewStatus !== 1)"
|
||||
ref="uCode"
|
||||
@change="codeChange"
|
||||
seconds="30"
|
||||
changeText="X秒重新获取"
|
||||
></u-code>
|
||||
<u-button
|
||||
v-if="form.isDraft === 1 || (form.reviewStatus !== 0 && form.reviewStatus !== 1)"
|
||||
@tap="getCode"
|
||||
:text="tips"
|
||||
type="success"
|
||||
color="#4A97FC"
|
||||
></u-button>
|
||||
</template>
|
||||
</u-input>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider></u-divider>
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
填写验证码
|
||||
</view>
|
||||
<view class="v12-ml-2" style="flex: 1;">
|
||||
<input
|
||||
type="text"
|
||||
:placeholder-style="inputPlaceholderStyle"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
placeholder="请输入验证码"
|
||||
v-model="form.captcha"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider></u-divider>
|
||||
<view class="form-item v12-mt-2 v12-d-flex v12-justify-start v12-align-center">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
商家微信
|
||||
</view>
|
||||
<view class="v12-ml-2" style="flex: 1;">
|
||||
<input
|
||||
type="text"
|
||||
:placeholder-style="inputPlaceholderStyle"
|
||||
placeholder="请输入微信号"
|
||||
v-model="form.wechat"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1)"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<u-divider></u-divider>
|
||||
<view class="form-item v12-mt-2">
|
||||
<view class="title">
|
||||
文化:
|
||||
</view>
|
||||
<view class="input">
|
||||
<u-upload
|
||||
:fileList="cultureImg"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1) || cultureImg.length > 98"
|
||||
:deletable="form.isDraft === 1 || (form.reviewStatus !== 0 && form.reviewStatus !== 1)"
|
||||
:maxCount="99"
|
||||
count="99"
|
||||
name="cultureImg"
|
||||
multiple
|
||||
@afterRead="afterRead($event, 'cultureImg')"
|
||||
@delete="deletePic($event, 'cultureImg')"
|
||||
></u-upload>
|
||||
</view>
|
||||
</view>
|
||||
<view class="form-item v12-mt-2">
|
||||
<view class="title">
|
||||
<text class="required">* </text>
|
||||
资质:
|
||||
</view>
|
||||
<view class="input">
|
||||
<u-upload
|
||||
:fileList="qualificationImg"
|
||||
:disabled="form.isDraft === 0 && (form.reviewStatus === 0 || form.reviewStatus === 1) || qualificationImg.length > 98"
|
||||
:deletable="form.isDraft === 1 || (form.reviewStatus !== 0 && form.reviewStatus !== 1)"
|
||||
:maxCount="99"
|
||||
count="99"
|
||||
name="qualificationImg"
|
||||
multiple
|
||||
@afterRead="afterRead($event, 'qualificationImg')"
|
||||
@delete="deletePic($event, 'qualificationImg')"
|
||||
></u-upload>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="form.isDraft === 0 && form.reviewStatus !== 1">
|
||||
<view class="v12-primary v12-white-text submit-btn" @click="submitForm" :style="{'background': form.reviewStatus === 0 ? '#FA979F !important' : '#4A97FC'}">
|
||||
{{ form.reviewStatus === 0 ? '撤销申请' : form.reviewStatus === 2 ? '重新提交' : '提交审核' }}
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="form.isDraft === 1">
|
||||
<view class="v12-primary v12-white-text submit-btn" @click="submitForm">
|
||||
{{ '提交审核' }}
|
||||
</view>
|
||||
</view>
|
||||
<u-popup :show="show" mode="center" round="10" @close="show=false"
|
||||
>
|
||||
<view class="popup-body">
|
||||
<view class="tc bold">入驻申请须知</view>
|
||||
<view class="content">
|
||||
<rich-text :nodes="notice" />
|
||||
</view>
|
||||
<view class="agree-box v12-mb-2">
|
||||
<checkbox-group @change="changeAgree">
|
||||
<label>
|
||||
<checkbox value="yes" style="transform:scale(0.8)"/>
|
||||
</label>
|
||||
<text>我已仔细阅读并同意</text>
|
||||
</checkbox-group>
|
||||
</view>
|
||||
<u-button
|
||||
type="error"
|
||||
text="确定"
|
||||
:disabled="!isAgree"
|
||||
@click="save"
|
||||
/>
|
||||
</view>
|
||||
</u-popup>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import CitySelect from '@/components/CitySelect'
|
||||
import {getCity, registerVerify} from '@/api/user'
|
||||
import {
|
||||
chooseImage,
|
||||
uploadVideo,
|
||||
uploadImage
|
||||
} from '@/utils'
|
||||
import {
|
||||
getShopData,
|
||||
getTravelInfo,
|
||||
saveTravel,
|
||||
saveTravelDraft,
|
||||
revokeTravel
|
||||
} from '@/api/join'
|
||||
export default {
|
||||
components: {
|
||||
CitySelect
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
isAgree: false,
|
||||
show: false,
|
||||
notice: '',
|
||||
tips: '获取验证码',
|
||||
inputPlaceholderStyle: {
|
||||
fontSize: '32rpx'
|
||||
},
|
||||
coverImg: [],
|
||||
avatarImg: [],
|
||||
// 轮播图
|
||||
bannerImg: [],
|
||||
videos: [],
|
||||
district: [],
|
||||
// 文化图片
|
||||
cultureImg: [],
|
||||
// 资质图片
|
||||
qualificationImg: [],
|
||||
partnerId: 0,
|
||||
captcha: '',
|
||||
form: {
|
||||
/**
|
||||
*
|
||||
travelInfo object 旅居管家基本信息
|
||||
|- name string 名称
|
||||
|- cover string 主图
|
||||
|- avatar string 头像
|
||||
|- companyName string 公司名称
|
||||
|- video string 视频
|
||||
|- banner string 轮播图(逗号分隔字符串)
|
||||
|- serviceTime string 营业开始时间
|
||||
|- serviceEndTime string 营业结束时间
|
||||
|- provinceId int 省份ID
|
||||
|- provinceName string 省份名称
|
||||
|- cityId int 城市ID
|
||||
|- cityName string 城市名称
|
||||
|- areaId int 区域ID
|
||||
|- areaName string 区域名称
|
||||
|- address string 详细地址
|
||||
|- longitude number 经度
|
||||
|- latitude number 纬度
|
||||
|- contact string 联系人
|
||||
|- phone string 联系方式
|
||||
|- wechat string 联系微信
|
||||
|- culture string 文化(逗号分隔字符串)
|
||||
|- qualification string 资质(逗号分隔字符串)
|
||||
*
|
||||
*/
|
||||
captcha: '',
|
||||
name: '',
|
||||
cover: '',
|
||||
avatar: '',
|
||||
companyName: '',
|
||||
video: '',
|
||||
banner: '',
|
||||
serviceTime: '00:00',
|
||||
serviceEndTime: '23:59',
|
||||
provinceId: 0,
|
||||
provinceName: '',
|
||||
cityId: 0,
|
||||
cityName: '',
|
||||
areaId: 0,
|
||||
areaName: '',
|
||||
address: '',
|
||||
longitude: 0,
|
||||
latitude: 0,
|
||||
contact: '',
|
||||
phone: '',
|
||||
wechat: '',
|
||||
culture: '',
|
||||
qualification: '',
|
||||
reviewMsg: ''
|
||||
}
|
||||
}
|
||||
},
|
||||
onLoad(opts) {
|
||||
this.partnerId = opts.partnerId
|
||||
this.queryCity()
|
||||
getShopData().then(({data}) => {
|
||||
this.notice = data.merchantApplyNotice
|
||||
this.initInfo()
|
||||
})
|
||||
},
|
||||
// onShow() {
|
||||
// },
|
||||
onUnload() {
|
||||
this.saveDraft()
|
||||
},
|
||||
onHide() {
|
||||
// if (this.form.isDraft === 0 && (this.form.reviewStatus === 0 || this.form.reviewStatus === 1)) {
|
||||
// return
|
||||
// }
|
||||
this.saveDraft()
|
||||
|
||||
},
|
||||
methods: {
|
||||
changeAgree(e) {
|
||||
this.isAgree = e.detail.value.includes('yes')
|
||||
},
|
||||
save() {
|
||||
this.show = false
|
||||
},
|
||||
/**
|
||||
* 字符串转换为数组
|
||||
* @param {string} str 字符串
|
||||
* @param {string} split 分隔符
|
||||
* @returns {array} 数组
|
||||
*/
|
||||
stringToMapArr(str, split = ',') {
|
||||
return str.split(split).map(item => ({url: item}))
|
||||
},
|
||||
/**
|
||||
* 保存草稿
|
||||
*/
|
||||
saveDraft() {
|
||||
this.form.cover = this.coverImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.avatar = this.avatarImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.banner = this.bannerImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.video = this.videos.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.culture = this.cultureImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.qualification = this.qualificationImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
const params = {
|
||||
travelInfo: {...this.form},
|
||||
partnerId: this.partnerId,
|
||||
captcha: this.form.captcha
|
||||
}
|
||||
saveTravelDraft(params).then(res => {
|
||||
if (res.status === 200) {
|
||||
// uni.$u.toast('草稿保存成功')
|
||||
}
|
||||
}).catch(err => {
|
||||
uni.$u.toast(err.msg)
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 初始化信息
|
||||
*/
|
||||
initInfo() {
|
||||
getTravelInfo().then(res => {
|
||||
if(res.data.isDraft === null || res.data.isDraft === 1) {
|
||||
this.show = true
|
||||
}
|
||||
const {travelInfo} = res.data || {}
|
||||
if (res.status === 200) {
|
||||
this.form = {...this.form, ...travelInfo}
|
||||
this.coverImg = travelInfo.cover ? this.stringToMapArr(travelInfo.cover) : []
|
||||
this.avatarImg = travelInfo.avatar ? this.stringToMapArr(travelInfo.avatar) : []
|
||||
this.bannerImg = travelInfo.banner ? this.stringToMapArr(travelInfo.banner) : []
|
||||
this.videos = travelInfo.video ? this.stringToMapArr(travelInfo.video) : []
|
||||
this.cultureImg = travelInfo.culture ? this.stringToMapArr(travelInfo.culture) : []
|
||||
this.qualificationImg = travelInfo.qualification ? this.stringToMapArr(travelInfo.qualification) : []
|
||||
this.form.reviewStatus = res.data.reviewStatus
|
||||
this.form.reviewMsg = res.data.reviewMsg
|
||||
this.form.isDraft = res.data.isDraft
|
||||
this.form.latitude = travelInfo.latitude || 0
|
||||
this.form.longitude = travelInfo.longitude || 0
|
||||
this.form.position = this.$forceToDecimal(travelInfo.longitude, 6) + ',' + this.$forceToDecimal(travelInfo.latitude, 6)
|
||||
this.form.area = `${this.form.provinceName || ''} ${this.form.cityName || ''} ${this.form.areaName || ''}`.trim()
|
||||
this.captcha = travelInfo.captcha
|
||||
}
|
||||
}).catch(err => {
|
||||
// uni.$u.toast(err.msg)
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 撤销申请
|
||||
*/
|
||||
revokeTravel() {
|
||||
uni.showModal({
|
||||
title: '提示',
|
||||
content: '确定撤销申请吗?',
|
||||
success: (res) => {
|
||||
if (res.confirm) {
|
||||
revokeTravel().then(res => {
|
||||
if (res.status === 200) {
|
||||
uni.$u.toast('撤销申请成功')
|
||||
this.initInfo()
|
||||
}
|
||||
}).catch(err => {
|
||||
uni.$u.toast(err.msg)
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 提交表单
|
||||
*/
|
||||
submitForm() {
|
||||
if(this.form.reviewStatus === 0 && this.form.isDraft === 0 && this.form.reviewStatus !== 1) {
|
||||
this.revokeTravel()
|
||||
return
|
||||
}
|
||||
if(this.form.isDraft === 0 && (this.form.reviewStatus === 0 || this.form.reviewStatus === 1)) return
|
||||
this.form.cover = this.coverImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.avatar = this.avatarImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.banner = this.bannerImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.video = this.videos.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.culture = this.cultureImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
this.form.qualification = this.qualificationImg.filter(item => item.url).map(item => item.url).join(',')
|
||||
|
||||
if (!this.form.name) {
|
||||
uni.$u.toast('请输入名称')
|
||||
return
|
||||
}
|
||||
if (!this.form.businessLicense) {
|
||||
uni.$u.toast('请输入营业执照名称')
|
||||
return
|
||||
}
|
||||
if (!this.form.cover) {
|
||||
uni.$u.toast('请上传主图')
|
||||
return
|
||||
}
|
||||
if (!this.form.avatar) {
|
||||
uni.$u.toast('请上传头像')
|
||||
return
|
||||
}
|
||||
if (!this.form.companyName) {
|
||||
uni.$u.toast('请输入公司名称')
|
||||
return
|
||||
}
|
||||
if (!this.form.intro) {
|
||||
uni.$u.toast('请输入公司简介')
|
||||
return
|
||||
}
|
||||
if (!this.form.banner) {
|
||||
uni.$u.toast('请上传轮播图')
|
||||
return
|
||||
}
|
||||
// 请选择营业时间
|
||||
if (!this.form.serviceTime) {
|
||||
uni.$u.toast('请选择营业开始时间')
|
||||
return
|
||||
}
|
||||
if (!this.form.serviceEndTime) {
|
||||
uni.$u.toast('请选择营业结束时间')
|
||||
return
|
||||
}
|
||||
// 请选择省市区
|
||||
if (!this.form.provinceId) {
|
||||
uni.$u.toast('请选择省份')
|
||||
return
|
||||
}
|
||||
if (!this.form.cityId) {
|
||||
uni.$u.toast('请选择城市')
|
||||
return
|
||||
}
|
||||
if (!this.form.areaId) {
|
||||
uni.$u.toast('请选择区域')
|
||||
return
|
||||
}
|
||||
if (!this.form.address) {
|
||||
uni.$u.toast('请输入详细地址')
|
||||
return
|
||||
}
|
||||
// 请选择物理位置
|
||||
if (!this.form.longitude) {
|
||||
uni.$u.toast('请选择地理定位')
|
||||
return
|
||||
}
|
||||
if (!this.form.latitude) {
|
||||
uni.$u.toast('请选择地理定位')
|
||||
return
|
||||
}
|
||||
if (!this.form.qualification) {
|
||||
uni.$u.toast('请上传资质')
|
||||
return
|
||||
}
|
||||
if (!this.form.phone) {
|
||||
uni.$u.toast('请输入手机号')
|
||||
return
|
||||
}
|
||||
if (!this.form.wechat) {
|
||||
uni.$u.toast('请输入联系微信')
|
||||
return
|
||||
}
|
||||
const params = {
|
||||
travelInfo: {...this.form},
|
||||
partnerId: this.partnerId,
|
||||
captcha: this.form.captcha
|
||||
}
|
||||
saveTravel(params).then(res => {
|
||||
if (res.status === 200) {
|
||||
uni.showToast({
|
||||
title: '您的入驻申请已提交成功,请耐心等待审核',
|
||||
icon: 'none',
|
||||
success: () => {
|
||||
this.initInfo();
|
||||
this.show = false;
|
||||
}
|
||||
})
|
||||
}
|
||||
}).catch(err => {
|
||||
uni.$u.toast(err.msg)
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 获取验证码
|
||||
*/
|
||||
getCode() {
|
||||
// if (this.reviewing) return
|
||||
if (!this.form.phone) {
|
||||
uni.$u.toast('请输入手机号')
|
||||
return
|
||||
}
|
||||
if (this.form.phone.length !== 11) {
|
||||
uni.$u.toast('请输入11位手机号')
|
||||
return
|
||||
}
|
||||
if (this.$refs.uCode.canGetCode) {
|
||||
uni.showLoading({
|
||||
title: '正在获取验证码'
|
||||
})
|
||||
registerVerify({
|
||||
phone: this.form.phone,
|
||||
type: 'merchantTravelApply'
|
||||
}).then(() => {
|
||||
uni.hideLoading()
|
||||
// 这里此提示会被this.start()方法中的提示覆盖
|
||||
uni.$u.toast('验证码已发送')
|
||||
// 通知验证码组件内部开始倒计时
|
||||
this.$refs.uCode.start()
|
||||
}).catch(err => {
|
||||
uni.hideLoading()
|
||||
uni.$u.toast(err.msg)
|
||||
})
|
||||
} else {
|
||||
uni.$u.toast('倒计时结束后再发送')
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 验证码按钮回调
|
||||
*/
|
||||
codeChange(text) {
|
||||
this.tips = text
|
||||
},
|
||||
/**
|
||||
* 选择位置
|
||||
*/
|
||||
chooLocation() {
|
||||
if(this.form.isDraft === 0 && (this.form.reviewStatus === 0 || this.form.reviewStatus === 1)) return
|
||||
uni.chooseLocation({
|
||||
success: (res) => {
|
||||
console.log(res)
|
||||
this.form.address = res.address
|
||||
this.form.longitude = this.$forceToDecimal(res.longitude, 6)
|
||||
this.form.latitude = this.$forceToDecimal(res.latitude, 6)
|
||||
this.form.position = this.$forceToDecimal(res.longitude, 6) + ',' + this.$forceToDecimal(res.latitude, 6)
|
||||
}
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 选择城市回调
|
||||
* @param {object} e - 事件对象
|
||||
*/
|
||||
resultCity(values) {
|
||||
const address = {
|
||||
province: values.province.name || '',
|
||||
city: values.city.name || '',
|
||||
district: values.district.name || '',
|
||||
provinceId: values.province.id,
|
||||
cityId: values.city.id,
|
||||
areaId: values.district.id
|
||||
}
|
||||
this.form.area = `${address.province || ''} ${address.city || ''} ${address.district || ''}`
|
||||
this.form.areaName = address.district || ''
|
||||
this.form.provinceName = address.province || ''
|
||||
this.form.cityName = address.city || ''
|
||||
this.form.provinceId = address.provinceId
|
||||
this.form.cityId = address.cityId
|
||||
this.form.areaId = address.areaId
|
||||
},
|
||||
/**
|
||||
* 选择城市
|
||||
*/
|
||||
queryCity() {
|
||||
getCity().then(({data}) => {
|
||||
this.district = data
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 显示时间选择器
|
||||
*/
|
||||
showTimePicker() {
|
||||
if(this.form.isDraft === 0 && (this.form.reviewStatus === 0 || this.form.reviewStatus === 1)) {
|
||||
return
|
||||
}
|
||||
this.$refs.TimePickerPopupRef.open()
|
||||
},
|
||||
/**
|
||||
* 选择时间范围
|
||||
* @param {array} e - 时间范围数组,包含开始时间和结束时间
|
||||
*/
|
||||
timeRange(e) {
|
||||
this.form.serviceTime = e[0]
|
||||
this.form.serviceEndTime = e[1]
|
||||
this.$forceUpdate()
|
||||
},
|
||||
/**
|
||||
* 选择图片
|
||||
* @param {string} imgField - 图片字段名
|
||||
*/
|
||||
chooseImage(imgField) {
|
||||
chooseImage(img => {
|
||||
this.form[imgField] = img;
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 上传图片或视频
|
||||
* @param {object} e - 事件对象
|
||||
* @param {string} imgField - 图片字段名
|
||||
* @param {string} type - 类型('video'或'image')
|
||||
*/
|
||||
afterRead(e, imgField, type) {
|
||||
const uploadFunc = type == 'video' ? uploadVideo : uploadImage;
|
||||
if(e.file.length > 0) {
|
||||
e.file.forEach(item => {
|
||||
if(!item.url) return
|
||||
uploadFunc(item.url, img => {
|
||||
if(!img) return
|
||||
this[imgField].push({url: img});
|
||||
console.log(this[imgField], imgField);
|
||||
|
||||
})
|
||||
})
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 删除视频(右上角角标)
|
||||
* @param {number} index - 视频索引
|
||||
*/
|
||||
deleteVideo(index) {
|
||||
if(this.form.isDraft === 0 && (this.form.reviewStatus === 0 || this.form.reviewStatus === 1)) return
|
||||
uni.showModal({
|
||||
title: '确认删除',
|
||||
content: '确定删除该视频?',
|
||||
success: (res) => {
|
||||
if (res.confirm) {
|
||||
this.deletePic({ index }, 'videos')
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 删除图片或视频
|
||||
* @param {object} e - 事件对象
|
||||
* @param {string} imgField - 图片字段名
|
||||
*/
|
||||
deletePic(e, imgField) {
|
||||
this[imgField].splice(e.index, 1);
|
||||
console.log(this[imgField]);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.popup-body {
|
||||
width: 80vw;
|
||||
height: 80vh;
|
||||
padding: 30rpx;
|
||||
overflow: hidden;
|
||||
}
|
||||
.popup-body .content {
|
||||
height: 52vh;
|
||||
overflow-y: auto;
|
||||
margin: 30rpx 0;
|
||||
}
|
||||
.popup-body .agree-box {
|
||||
margin: 60rpx 0;
|
||||
font-size: 28rpx;
|
||||
color: #666;
|
||||
}
|
||||
.popup-body {
|
||||
.title {
|
||||
line-height: 80rpx;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
.container {
|
||||
padding: 20rpx;
|
||||
background: #fff;
|
||||
}
|
||||
.title {
|
||||
font-size: 32rpx;
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
}
|
||||
.required {
|
||||
color: #C52733;
|
||||
}
|
||||
.input{
|
||||
margin-top: 20rpx;
|
||||
}
|
||||
.submit-btn{
|
||||
width: 100%;
|
||||
height: 100rpx;
|
||||
text-align: center;
|
||||
line-height: 100rpx;
|
||||
}
|
||||
.reason-box{
|
||||
background: rgba(255,160,167,0.39);
|
||||
border-radius: 8rpx;
|
||||
color: #C52733;
|
||||
font-size: 30rpx;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
.title{
|
||||
white-space: nowrap;
|
||||
}
|
||||
.video-item{
|
||||
width: 160rpx;
|
||||
height: 160rpx;
|
||||
}
|
||||
.video-wrapper{
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
}
|
||||
.delete-badge{
|
||||
position: absolute;
|
||||
top: 0rpx;
|
||||
right: 0rpx;
|
||||
background: #000;
|
||||
color: #fff;
|
||||
padding: 2rpx 8rpx;
|
||||
border-radius: 0 0 0rpx 200rpx;
|
||||
font-size: 22rpx;
|
||||
z-index: 10;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
<style>
|
||||
.input .u-textarea{
|
||||
background-color: #F3F3F3 !important;
|
||||
}
|
||||
</style>
|
||||
@@ -161,7 +161,7 @@
|
||||
<view class="u-text__value" :class="{'area-item':form.area.length===0}">
|
||||
<CitySelect
|
||||
ref="cityselect"
|
||||
:defaultValue="form.area || ''"
|
||||
:defaultValue="form.area"
|
||||
:disabled="reviewing"
|
||||
:items="district"
|
||||
@callback="result"
|
||||
@@ -207,7 +207,7 @@
|
||||
@cancel="changeRemove(false)"
|
||||
@confirm="onRemove"
|
||||
/>
|
||||
<u-popup :show="show" mode="center" round="10" @close="show=false">
|
||||
<u-popup :show="show" mode="center" round="10" closeable @close="show=false">
|
||||
<view class="popup-body">
|
||||
<view class="tc bold">入驻申请须知</view>
|
||||
<view class="content">
|
||||
@@ -265,12 +265,6 @@ export default {
|
||||
message: '请填写批发商名称',
|
||||
trigger: ['blur', 'change']
|
||||
},
|
||||
'businessLicense': {
|
||||
type: 'string',
|
||||
required: true,
|
||||
message: '请填写营业执照名称',
|
||||
trigger: ['blur', 'change']
|
||||
},
|
||||
'contact': {
|
||||
type: 'string',
|
||||
required: true,
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
:src="topImage"
|
||||
class="top-img"
|
||||
mode="widthFix"
|
||||
@click="topImageClick"
|
||||
/>
|
||||
<view class="page-wrap">
|
||||
<view class="page-2">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
:src="topImage"
|
||||
class="top-img"
|
||||
mode="widthFix"
|
||||
@click="topImageClick"
|
||||
/>
|
||||
<view class="page-wrap">
|
||||
<view class="page-2">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
:src="topImage"
|
||||
class="top-img"
|
||||
mode="widthFix"
|
||||
@click="topImageClick"
|
||||
/>
|
||||
<!-- 第二页 -->
|
||||
<view class="page-wrap">
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
:src="topImage"
|
||||
class="top-img"
|
||||
mode="widthFix"
|
||||
@click="topImageClick"
|
||||
/>
|
||||
<!-- 第二页 -->
|
||||
<view class="page-wrap">
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||
active: 'weixin',
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// 支付方式切换
|
||||
payItem(type) {
|
||||
this.active = type
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,104 +0,0 @@
|
||||
import { getCouponReceive } from '@/api/user'
|
||||
export const themeMixins = {
|
||||
data() {
|
||||
return {
|
||||
isLoad: false,
|
||||
pageData: {},
|
||||
topImage: '',
|
||||
contents: [],
|
||||
pageKeyId: '',
|
||||
templateKey: '',
|
||||
// 模板数据
|
||||
templateProperties: {}
|
||||
}
|
||||
},
|
||||
onShareAppMessage() {
|
||||
uni.updateShareMenu({
|
||||
isPrivateMessage: false,
|
||||
withShareTicket: false
|
||||
})
|
||||
if (this.pageData.forwardTitle && this.pageData.forwardImage) {
|
||||
return {
|
||||
title: this.pageData.forwardTitle,
|
||||
path: this.pageKeyId.indexOf('appContentHomestay') > -1 ? `/pkg_product/views/homestay?id=${this.pageData.id}` : `/pkg_product/views/festival?id=${this.pageData.id}&theme=${this.theme || ''}`,
|
||||
imageUrl: this.pageData.forwardImage
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
title: this.share.title,
|
||||
path: this.share.path,
|
||||
imageUrl: this.share.imageUrl,
|
||||
desc: this.share.desc,
|
||||
content: this.share.content,
|
||||
success(res){
|
||||
uni.showToast({
|
||||
title:'分享成功'
|
||||
})
|
||||
},
|
||||
fail(res){
|
||||
uni.showToast({
|
||||
title:'分享失败',
|
||||
icon:'none'
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
onShareTimeline() {
|
||||
uni.updateShareMenu({
|
||||
isPrivateMessage: false,
|
||||
withShareTicket: false
|
||||
})
|
||||
const title = this.pageData.forwardTitle || this.share.title
|
||||
return {
|
||||
title,
|
||||
query: `id=${this.pageData.id}&theme=${this.theme || ''}`,
|
||||
imageUrl: this.pageData.forwardImage || this.share.imageUrl
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
topImageClick() {
|
||||
if (this.templateProperties.page1CouponEnable === 1 && this.templateProperties.page1CouponId) {
|
||||
getCouponReceive(this.templateProperties.page1CouponId).then(res => {
|
||||
if (res.status === 200) {
|
||||
uni.showToast({
|
||||
title: '领取成功',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
}).catch((err) => {
|
||||
uni.showToast({
|
||||
title: err.msg + '',
|
||||
icon: 'none',
|
||||
duration: 3000
|
||||
})
|
||||
})
|
||||
}
|
||||
},
|
||||
goGoodsOrShop(item) {
|
||||
const id = item.linkId || ''
|
||||
if (!id) return
|
||||
const type = item.type || 1
|
||||
if (type === 1) {
|
||||
uni.navigateTo({
|
||||
url: `/pages/shop/GoodsCon/index?id=${id}&from=festival`
|
||||
})
|
||||
}
|
||||
if (type === 2) {
|
||||
uni.navigateTo({
|
||||
url: `/pagesInn/inn/innHome?id=${id}&from=festival`
|
||||
})
|
||||
}
|
||||
if (type === 3) {
|
||||
uni.navigateTo({
|
||||
url: `/pages/town/index?id=${id}&from=festival`
|
||||
})
|
||||
}
|
||||
if (type === 4) {
|
||||
uni.navigateTo({
|
||||
url: `/pkg_product/views/famousQianxianShop?id=${id}&from=festival`
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,3 @@
|
||||
import { getCouponReceive } from '@/api/user'
|
||||
export const themeTemplateMixins = {
|
||||
props: {
|
||||
topImage: {
|
||||
@@ -13,24 +12,6 @@ export const themeTemplateMixins = {
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
topImageClick() {
|
||||
if (this.templateProperties.page1CouponEnable === 1 && this.templateProperties.page1CouponId) {
|
||||
getCouponReceive(this.templateProperties.page1CouponId).then(res => {
|
||||
if (res.status === 200) {
|
||||
uni.showToast({
|
||||
title: '领取成功',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
}).catch((err) => {
|
||||
uni.showToast({
|
||||
title: err.msg + '',
|
||||
icon: 'none',
|
||||
duration: 3000
|
||||
})
|
||||
})
|
||||
}
|
||||
},
|
||||
itemClick(item) {
|
||||
if (!item.available) return
|
||||
this.$emit('view', item)
|
||||
|
||||
@@ -1,865 +0,0 @@
|
||||
<script>
|
||||
import dayjs from 'dayjs'
|
||||
import { getLatestExperienceCoupon, getExperienceCouponList, getExperienceCouponItems, createExperienceCouponOrder, getExperienceCouponCategoryList } from '@/api/product'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
const webUrl = this.$VUE_APP_RESOURCES_URL
|
||||
return {
|
||||
webUrl,
|
||||
headerImage: webUrl + '/experienceCoupon/header.png',
|
||||
totalCount: 0,
|
||||
selectedCount: 0,
|
||||
initialUsedCount: 0,
|
||||
remainNum: 0,
|
||||
startTime: '',
|
||||
endTime: '',
|
||||
expireDate: '',
|
||||
couponList: [],
|
||||
activeCouponId: null,
|
||||
categoryList: [
|
||||
{ id: 'all', name: '全部体验' }
|
||||
],
|
||||
activeCategoryId: 'all',
|
||||
experienceList: [],
|
||||
selectedProjectIds: [],
|
||||
userLatitude: null,
|
||||
userLongitude: null,
|
||||
merId: ''
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
filteredList() {
|
||||
if (this.activeCategoryId === 'all') {
|
||||
return this.experienceList
|
||||
}
|
||||
return this.experienceList.filter(item => item.categoryId === this.activeCategoryId)
|
||||
},
|
||||
remainCount() {
|
||||
return Math.max(this.totalCount - this.selectedCount, 0)
|
||||
}
|
||||
},
|
||||
onLoad() {
|
||||
this.initPage()
|
||||
},
|
||||
methods: {
|
||||
formatDateByTimestamp(value) {
|
||||
if (value == null || value === '') {
|
||||
return ''
|
||||
}
|
||||
if (typeof value === 'number') {
|
||||
const ts = value > 1000000000000 ? value : value * 1000
|
||||
return dayjs(ts).format('YYYY-MM-DD')
|
||||
}
|
||||
const num = Number(value)
|
||||
if (!Number.isNaN(num)) {
|
||||
const ts = num > 1000000000000 ? num : num * 1000
|
||||
return dayjs(ts).format('YYYY-MM-DD')
|
||||
}
|
||||
return value
|
||||
},
|
||||
initPage() {
|
||||
this.getUserLocation()
|
||||
this.fetchExperienceCoupon()
|
||||
this.fetchCouponList()
|
||||
this.fetchCategoryList()
|
||||
},
|
||||
getUserLocation() {
|
||||
uni.getLocation({
|
||||
type: 'gcj02',
|
||||
success: (res) => {
|
||||
this.userLatitude = res.latitude
|
||||
this.userLongitude = res.longitude
|
||||
this.updateDistances()
|
||||
},
|
||||
fail: (err) => {
|
||||
console.error('获取位置失败', err)
|
||||
}
|
||||
})
|
||||
},
|
||||
updateDistances() {
|
||||
if (!this.experienceList.length || !this.userLatitude || !this.userLongitude) {
|
||||
return
|
||||
}
|
||||
this.experienceList = this.experienceList.map(item => {
|
||||
if (item.latitude && item.longitude) {
|
||||
return {
|
||||
...item,
|
||||
distance: this.calculateDistance(this.userLatitude, this.userLongitude, item.latitude, item.longitude)
|
||||
}
|
||||
}
|
||||
return item
|
||||
})
|
||||
},
|
||||
calculateDistance(lat1, lon1, lat2, lon2) {
|
||||
if (!lat1 || !lon1 || !lat2 || !lon2) return ''
|
||||
const R = 6371 // 地球半径 km
|
||||
const dLat = (lat2 - lat1) * Math.PI / 180
|
||||
const dLon = (lon2 - lon1) * Math.PI / 180
|
||||
const a =
|
||||
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
|
||||
Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
|
||||
Math.sin(dLon / 2) * Math.sin(dLon / 2)
|
||||
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
|
||||
const d = R * c
|
||||
return d.toFixed(1) + 'km'
|
||||
},
|
||||
setActiveCoupon(coupon) {
|
||||
if (!coupon) {
|
||||
return
|
||||
}
|
||||
this.activeCouponId = coupon.id
|
||||
this.activeCategoryId = 'all'
|
||||
this.totalCount = coupon.totalNum || 0
|
||||
const remain = coupon.remainNum != null ? coupon.remainNum : 0
|
||||
this.remainNum = remain
|
||||
this.initialUsedCount = Math.max(this.totalCount - remain, 0)
|
||||
this.selectedProjectIds = []
|
||||
this.selectedCount = this.initialUsedCount
|
||||
this.startTime = coupon.startTime || ''
|
||||
this.endTime = coupon.endTime || ''
|
||||
this.expireDate = this.endTime || this.expireDate
|
||||
this.headerImage = coupon.experienceCouponImage || (this.webUrl + '/experienceCoupon/header.png')
|
||||
this.fetchCategoryList()
|
||||
this.fetchExperienceItems()
|
||||
},
|
||||
fetchExperienceCoupon() {
|
||||
getLatestExperienceCoupon().then(({ data }) => {
|
||||
if (!data) {
|
||||
return
|
||||
}
|
||||
const latest = {
|
||||
...data,
|
||||
startTime: this.formatDateByTimestamp(data.startTime),
|
||||
endTime: this.formatDateByTimestamp(data.endTime)
|
||||
}
|
||||
this.merId = latest.merId || ''
|
||||
this.setActiveCoupon(latest)
|
||||
if (!this.couponList.length) {
|
||||
this.couponList = [latest]
|
||||
}
|
||||
}).catch(() => {})
|
||||
},
|
||||
fetchCouponList() {
|
||||
getExperienceCouponList().then(({ data }) => {
|
||||
const list = (data || []).map(item => ({
|
||||
...item,
|
||||
startTime: this.formatDateByTimestamp(item.startTime),
|
||||
endTime: this.formatDateByTimestamp(item.endTime)
|
||||
}))
|
||||
this.couponList = list
|
||||
if (!this.activeCouponId && list.length > 0) {
|
||||
this.setActiveCoupon(list[0])
|
||||
}
|
||||
}).catch(() => {})
|
||||
},
|
||||
fetchCategoryList() {
|
||||
if (!this.activeCouponId) {
|
||||
this.categoryList = [{ id: 'all', name: '全部体验' }]
|
||||
return
|
||||
}
|
||||
const params = { couponId: this.activeCouponId }
|
||||
getExperienceCouponCategoryList(params).then(({ data }) => {
|
||||
const list = data || []
|
||||
this.categoryList = [
|
||||
{ id: 'all', name: '全部体验' },
|
||||
...list.map(item => ({
|
||||
id: item.id,
|
||||
name: item.name
|
||||
}))
|
||||
]
|
||||
}).catch(() => {
|
||||
this.categoryList = [{ id: 'all', name: '全部体验' }]
|
||||
})
|
||||
},
|
||||
fetchExperienceItems() {
|
||||
if (!this.activeCouponId) {
|
||||
this.experienceList = []
|
||||
return
|
||||
}
|
||||
const params = {
|
||||
couponId: this.activeCouponId
|
||||
}
|
||||
if (this.activeCategoryId && this.activeCategoryId !== 'all') {
|
||||
params.experienceStoreCategoryId = this.activeCategoryId
|
||||
}
|
||||
getExperienceCouponItems(params).then(({ data }) => {
|
||||
const list = data || []
|
||||
const selectedSet = new Set(this.selectedProjectIds)
|
||||
this.experienceList = list.map(item => {
|
||||
const lat = Number(item.latitude || 0)
|
||||
const lon = Number(item.longitude || 0)
|
||||
let distance = ''
|
||||
if (this.userLatitude && this.userLongitude && lat && lon) {
|
||||
distance = this.calculateDistance(this.userLatitude, this.userLongitude, lat, lon)
|
||||
}
|
||||
|
||||
const id = item.id != null ? item.id : (item.projectId != null ? item.projectId : item.merId)
|
||||
|
||||
return {
|
||||
id,
|
||||
experienceMerchantId: item.merId || item.experienceMerchantId || item.storeId || '',
|
||||
title: item.name || '',
|
||||
merId: item.merId || '',
|
||||
subTitle: item.projectName || item.intro || '',
|
||||
distance,
|
||||
latitude: lat,
|
||||
longitude: lon,
|
||||
businessTime: item.serviceTime && item.serviceEndTime ? `${item.serviceTime}-${item.serviceEndTime}` : (item.serviceTime || '00:00-23:59'),
|
||||
tags: item.intro || '',
|
||||
categoryId: this.activeCategoryId === 'all' ? 'all' : this.activeCategoryId,
|
||||
image: item.image || item.cover || '',
|
||||
selected: selectedSet.has(id),
|
||||
rawData: item
|
||||
}
|
||||
})
|
||||
this.selectedCount = this.initialUsedCount + this.selectedProjectIds.length
|
||||
}).catch(() => {
|
||||
this.experienceList = []
|
||||
})
|
||||
},
|
||||
changeCoupon(coupon) {
|
||||
this.setActiveCoupon(coupon)
|
||||
},
|
||||
changeCategory(id) {
|
||||
this.activeCategoryId = id
|
||||
this.fetchExperienceItems()
|
||||
},
|
||||
toggleSelect(item) {
|
||||
if (!item.selected && this.remainCount === 0) {
|
||||
uni.showToast({
|
||||
title: '体验券数量已达上限',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
item.selected = !item.selected
|
||||
const id = item.id
|
||||
if (item.selected) {
|
||||
if (!this.selectedProjectIds.includes(id)) {
|
||||
this.selectedProjectIds.push(id)
|
||||
}
|
||||
} else {
|
||||
this.selectedProjectIds = this.selectedProjectIds.filter(pid => pid !== id)
|
||||
}
|
||||
this.selectedCount = this.initialUsedCount + this.selectedProjectIds.length
|
||||
},
|
||||
goExperienceStoreDetail(item) {
|
||||
console.log(item);
|
||||
const merchantId = item.merId
|
||||
if (!merchantId) {
|
||||
uni.showToast({
|
||||
title: '未找到体验店信息',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
const query = []
|
||||
query.push('experienceMerchantId=' + encodeURIComponent(merchantId))
|
||||
uni.navigateTo({
|
||||
url: '/pkg_product/views/experienceProjectDetail?' + query.join('&')
|
||||
})
|
||||
},
|
||||
submitOrder() {
|
||||
if (!this.activeCouponId) {
|
||||
uni.showToast({
|
||||
title: '当前无可用体验券',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
if (!this.selectedProjectIds.length) {
|
||||
uni.showToast({
|
||||
title: '请先选择体验项目',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
const projectIds = this.selectedProjectIds.slice()
|
||||
const data = {
|
||||
couponId: this.activeCouponId,
|
||||
projectIds
|
||||
}
|
||||
createExperienceCouponOrder(data).then((res) => {
|
||||
if (res.success || (res.data && res.data.status === 'SUCCESS')) {
|
||||
uni.showToast({
|
||||
title: '下单成功',
|
||||
icon: 'success'
|
||||
})
|
||||
setTimeout(() => {
|
||||
uni.navigateTo({
|
||||
url: '/pages/order/MyOrder/index?type=3&tabIndex=1'
|
||||
})
|
||||
}, 1500)
|
||||
} else {
|
||||
uni.showToast({
|
||||
title: res.msg || '下单失败,请稍后重试',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
}).catch(() => {
|
||||
uni.showToast({
|
||||
title: '下单失败,请稍后重试',
|
||||
icon: 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
handleContinueSelect() {
|
||||
this.submitOrder()
|
||||
},
|
||||
handleGoExperience() {
|
||||
this.submitOrder()
|
||||
},
|
||||
handleConfirm() {
|
||||
this.submitOrder()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<view class="experience-coupon-page">
|
||||
<view class="header">
|
||||
<image
|
||||
:src="headerImage"
|
||||
class="header-bg"
|
||||
mode="aspectFill"
|
||||
/>
|
||||
<view class="header-mask" />
|
||||
<view class="header-blur-transition" />
|
||||
<view class="header-content">
|
||||
<scroll-view
|
||||
v-if="couponList.length > 1"
|
||||
scroll-x
|
||||
class="coupon-tabs-scroll"
|
||||
:show-scrollbar="false"
|
||||
>
|
||||
<view class="coupon-tabs">
|
||||
<view
|
||||
v-for="(coupon, index) in couponList"
|
||||
:key="coupon.id"
|
||||
class="header-tag-main"
|
||||
:class="{ active: activeCouponId === coupon.id }"
|
||||
@click="changeCoupon(coupon)"
|
||||
>
|
||||
体验券{{ index + 1}}
|
||||
</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
<view class="header-tag-main active" v-if="couponList.length === 1">请选择您的免费体验券</view>
|
||||
<view class="header-main">
|
||||
|
||||
<view class="line-info flex ai-center">
|
||||
根据您的套餐,您有 <view class="num-badge">{{ totalCount }}</view> 张体验券可以选择
|
||||
</view>
|
||||
<view class="line-status flex ai-center">
|
||||
<view class="status-pill flex ai-center" style="flex-shrink: 0;">
|
||||
<u-icon name="checkmark-circle" color="#fff" size="14" style="margin-left: 6rpx; flex-shrink: 0;" />
|
||||
<text class="status-text" style="white-space: nowrap;">已选清单</text>
|
||||
<view class="count-badge" style="white-space: nowrap;">{{ selectedCount }}/{{ totalCount }}</view>
|
||||
</view>
|
||||
<view class="date-info flex ai-center" style="flex-shrink: 0;">
|
||||
<text style="white-space: nowrap;">请在</text>
|
||||
<view class="date-badge" style="white-space: nowrap;">{{ expireDate }}</view>
|
||||
<text style="white-space: nowrap;">内选择使用</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="line-library flex ai-center">
|
||||
<image :src="webUrl + '/piaoquan.png'" class="icon-shop" mode="widthFix" />
|
||||
<text class="v12-font-32">可用体验券库</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="content">
|
||||
<scroll-view scroll-x class="tabs-scroll" :show-scrollbar="false">
|
||||
<view class="tabs flex">
|
||||
<view
|
||||
v-for="item in categoryList"
|
||||
:key="item.id"
|
||||
class="tab-item"
|
||||
:class="{ active: activeCategoryId === item.id }"
|
||||
@click="changeCategory(item.id)"
|
||||
>
|
||||
{{ item.name }}
|
||||
</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
<view
|
||||
v-if="filteredList.length === 0"
|
||||
class="empty-state"
|
||||
>
|
||||
<image
|
||||
:src="webUrl + '/orderIcon/nodata.png'"
|
||||
class="empty-image"
|
||||
mode="widthFix"
|
||||
/>
|
||||
<view class="empty-text">
|
||||
暂无数据
|
||||
</view>
|
||||
</view>
|
||||
<view
|
||||
v-else
|
||||
class="card-list"
|
||||
>
|
||||
<view
|
||||
v-for="item in filteredList"
|
||||
:key="item.id"
|
||||
class="card"
|
||||
@click="goExperienceStoreDetail(item)"
|
||||
>
|
||||
<image
|
||||
:src="item.image"
|
||||
class="card-image"
|
||||
mode="aspectFill"
|
||||
/>
|
||||
<view class="card-body">
|
||||
<view class="card-title">
|
||||
{{ item.title }}
|
||||
</view>
|
||||
<view class="info-row flex jc-between ai-center">
|
||||
<view class="card-subtitle more-t">
|
||||
{{ item.subTitle }}
|
||||
</view>
|
||||
<view class="meta-distance" v-if="item.distance">
|
||||
<u-icon name="map" color="#999" size="14" style="margin-right: 4rpx;" />
|
||||
<text>距该地{{ item.distance }}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="card-meta">
|
||||
<text class="meta-time">营业时间:{{ item.businessTime }}</text>
|
||||
</view>
|
||||
<view class="card-footer flex jc-center ai-center">
|
||||
<view
|
||||
class="card-btn"
|
||||
:class="{ selected: item.selected }"
|
||||
@click.stop="toggleSelect(item)"
|
||||
>
|
||||
{{ item.selected ? '取消选择' : '选择' }}
|
||||
<view v-if="item.selected" class="check-icon-wrapper">
|
||||
<u-icon name="checkmark" color="#C52733" size="14" bold />
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="bottom-bar" v-if="selectedCount > 0">
|
||||
<view
|
||||
v-if="remainCount > 0"
|
||||
class="bottom-group flex jc-between ai-center"
|
||||
>
|
||||
<view
|
||||
class="btn-outline"
|
||||
>
|
||||
继续选择(还可以选{{ remainCount }}张)
|
||||
</view>
|
||||
<view
|
||||
class="btn-primary"
|
||||
@click="handleGoExperience"
|
||||
>
|
||||
先去体验
|
||||
</view>
|
||||
</view>
|
||||
<view
|
||||
v-else
|
||||
class="bottom-single"
|
||||
>
|
||||
<view
|
||||
class="btn-primary"
|
||||
@click="handleConfirm"
|
||||
>
|
||||
确认
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<style scoped lang="less">
|
||||
.experience-coupon-page {
|
||||
min-height: 100vh;
|
||||
padding-bottom: 140rpx;
|
||||
background: #f5f5f5;
|
||||
color: #333;
|
||||
}
|
||||
.header {
|
||||
position: relative;
|
||||
height: 500rpx;
|
||||
overflow: hidden;
|
||||
}
|
||||
.header-bg {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.header-mask {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
background: linear-gradient(180deg, rgba(0, 0, 0, 0.2) 0%, rgba(0, 0, 0, 0.6) 100%);
|
||||
z-index: 1;
|
||||
}
|
||||
.header-blur-transition {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
height: 200rpx; /* 增加过渡高度让渐变更平缓 */
|
||||
background: linear-gradient(to bottom, rgba(245, 245, 245, 0) 0%, rgba(245, 245, 245, 0.4) 40%, rgba(245, 245, 245, 0.8) 70%, #f5f5f5 100%);
|
||||
pointer-events: none;
|
||||
z-index: 2;
|
||||
}
|
||||
.header-content {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
padding: 32rpx 0;
|
||||
padding-bottom: 120rpx; /* 为下方内容上移留出空间 */
|
||||
box-sizing: border-box;
|
||||
color: #fff;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
z-index: 3;
|
||||
}
|
||||
.header-tag-main {
|
||||
align-self: flex-start;
|
||||
padding: 12rpx 32rpx 12rpx 24rpx;
|
||||
background: #fff;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
font-size: 28rpx;
|
||||
border-radius: 40rpx;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.header-tag-main.active {
|
||||
background: #C52733;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.header-main {
|
||||
margin-bottom: 20rpx;
|
||||
padding: 0 24rpx;
|
||||
}
|
||||
.coupon-tabs-scroll {
|
||||
width: 100%;
|
||||
white-space: nowrap;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
.coupon-tabs {
|
||||
display: flex;
|
||||
gap: 16rpx;
|
||||
padding-right: 24rpx;
|
||||
flex-wrap: nowrap;
|
||||
padding: 0 24rpx;
|
||||
}
|
||||
.coupon-tab-item {
|
||||
padding: 8rpx 24rpx;
|
||||
border-radius: 32rpx;
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border: 1rpx solid rgba(255, 255, 255, 0.4);
|
||||
font-size: 24rpx;
|
||||
color: #fff;
|
||||
&.active {
|
||||
background: #fff;
|
||||
color: #C52733;
|
||||
border-color: #fff;
|
||||
}
|
||||
}
|
||||
.line-info {
|
||||
font-size: 26rpx;
|
||||
margin-bottom: 16rpx;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
.num-badge {
|
||||
background: #C52733;
|
||||
color: #fff;
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 26rpx;
|
||||
margin: 0 8rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
.line-status {
|
||||
justify-content: space-between;
|
||||
gap: 16rpx;
|
||||
margin-bottom: 24rpx;
|
||||
flex-wrap: nowrap;
|
||||
overflow-x: auto;
|
||||
white-space: nowrap;
|
||||
}
|
||||
/* 隐藏滚动条 */
|
||||
.line-status::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
.status-pill {
|
||||
background: #C52733;
|
||||
padding: 6rpx 6rpx 6rpx 20rpx;
|
||||
border-radius: 32rpx;
|
||||
color: #fff;
|
||||
font-size: 22rpx;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.status-text {
|
||||
margin:0 12rpx;
|
||||
}
|
||||
.icon-check {
|
||||
width: 24rpx;
|
||||
height: 24rpx;
|
||||
border-radius: 50%;
|
||||
border: 2rpx solid #fff;
|
||||
margin-right: 8rpx;
|
||||
position: relative;
|
||||
}
|
||||
.icon-check::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 6rpx;
|
||||
top: 4rpx;
|
||||
width: 8rpx;
|
||||
height: 4rpx;
|
||||
border-left: 2rpx solid #fff;
|
||||
border-bottom: 2rpx solid #fff;
|
||||
transform: rotate(-45deg);
|
||||
}
|
||||
.count-badge {
|
||||
background: #fff;
|
||||
color: #333;
|
||||
padding: 4rpx 16rpx;
|
||||
border-radius: 24rpx;
|
||||
font-size: 24rpx;
|
||||
}
|
||||
.date-info {
|
||||
font-size: 26rpx;
|
||||
color: #fff;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.date-badge {
|
||||
background: #C52733;
|
||||
padding: 6rpx 16rpx;
|
||||
border-radius: 100rpx;
|
||||
margin: 0 8rpx;
|
||||
font-size: 32rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
.line-library {
|
||||
font-size: 28rpx;
|
||||
font-weight: 500;
|
||||
.icon-shop {
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
margin-right: 8rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.content {
|
||||
padding: 0;
|
||||
margin-top: -120rpx; /* 将下方内容整体上移,覆盖在渐变区域上 */
|
||||
position: relative;
|
||||
z-index: 4;
|
||||
}
|
||||
|
||||
.tabs-scroll {
|
||||
width: 100%;
|
||||
white-space: nowrap;
|
||||
margin-bottom: 24rpx;
|
||||
}
|
||||
.tabs {
|
||||
display: flex;
|
||||
gap: 16rpx;
|
||||
margin: 0 24rpx;
|
||||
padding-right: 24rpx;
|
||||
}
|
||||
.tab-item {
|
||||
padding: 12rpx 32rpx;
|
||||
border-radius: 32rpx;
|
||||
background: #fff;
|
||||
color: #666;
|
||||
font-size: 26rpx;
|
||||
flex-shrink: 0;
|
||||
font-style: italic;
|
||||
font-weight: bold;
|
||||
&.active {
|
||||
background: #C52733;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
.card-list {
|
||||
padding-bottom: 24rpx;
|
||||
column-count: 2;
|
||||
column-gap: 20rpx;
|
||||
padding: 0 24rpx 24rpx;
|
||||
}
|
||||
.card {
|
||||
margin-bottom: 24rpx;
|
||||
border-radius: 20rpx;
|
||||
overflow: hidden;
|
||||
background: #fff;
|
||||
break-inside: avoid;
|
||||
}
|
||||
.card-image {
|
||||
width: 100%;
|
||||
height: 438rpx;
|
||||
display: block;
|
||||
border-radius: 20rpx;
|
||||
}
|
||||
.card-body {
|
||||
padding: 16rpx;
|
||||
}
|
||||
.card-title {
|
||||
font-size: 28rpx;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
margin-bottom: 8rpx;
|
||||
}
|
||||
.card-subtitle {
|
||||
font-size: 22rpx;
|
||||
color: #999;
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
margin-right: 16rpx;
|
||||
}
|
||||
.info-row {
|
||||
margin-bottom: 8rpx;
|
||||
}
|
||||
.card-meta {
|
||||
font-size: 22rpx;
|
||||
margin-bottom: 16rpx;
|
||||
}
|
||||
.meta-distance {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: #999;
|
||||
flex-shrink: 0;
|
||||
font-size: 22rpx;
|
||||
}
|
||||
.icon-location {
|
||||
width: 20rpx;
|
||||
height: 20rpx;
|
||||
border: 2rpx solid #666;
|
||||
border-radius: 50%;
|
||||
margin-right: 4rpx;
|
||||
position: relative;
|
||||
}
|
||||
.icon-location::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
width: 6rpx;
|
||||
height: 6rpx;
|
||||
background: #666;
|
||||
border-radius: 50%;
|
||||
}
|
||||
.meta-time {
|
||||
display: block;
|
||||
color: #333;
|
||||
font-weight: 500;
|
||||
}
|
||||
.card-footer {
|
||||
margin-top: 12rpx;
|
||||
}
|
||||
.card-btn {
|
||||
width: 100%;
|
||||
height: 64rpx;
|
||||
border-radius: 32rpx;
|
||||
font-size: 26rpx;
|
||||
border: 1rpx solid #C52733;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-weight: bold;
|
||||
position: relative;
|
||||
background: #C52733;
|
||||
color: #fff;
|
||||
}
|
||||
.check-icon-wrapper {
|
||||
position: absolute;
|
||||
right: -8rpx;
|
||||
top: -8rpx;
|
||||
background: #fff;
|
||||
border-radius: 50%;
|
||||
width: 28rpx;
|
||||
height: 28rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 1;
|
||||
/* 缺口在图标的左下角方向 (225deg左右设为透明) */
|
||||
background: linear-gradient(#fff, #fff) padding-box,
|
||||
conic-gradient(from 225deg, transparent 0deg 90deg, #C52733 90deg 360deg) border-box;
|
||||
border: 2rpx solid transparent;
|
||||
box-shadow: 0 0 0 2rpx #fff; /* 外层白边 */
|
||||
}
|
||||
/* 移除之前的伪元素遮挡方案 */
|
||||
|
||||
.bottom-bar {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
padding: 24rpx 32rpx 48rpx;
|
||||
background: #fff;
|
||||
box-shadow: 0 -4rpx 16rpx rgba(0, 0, 0, 0.05);
|
||||
z-index: 10;
|
||||
}
|
||||
.bottom-group {
|
||||
gap: 24rpx;
|
||||
}
|
||||
.btn-outline {
|
||||
flex: 1.2;
|
||||
height: 88rpx;
|
||||
border-radius: 44rpx;
|
||||
border: 2rpx solid #333;
|
||||
text-align: center;
|
||||
font-size: 28rpx;
|
||||
line-height: 84rpx;
|
||||
color: #333;
|
||||
background: #fff;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
}
|
||||
.btn-primary {
|
||||
flex: 1;
|
||||
height: 88rpx;
|
||||
border-radius: 44rpx;
|
||||
text-align: center;
|
||||
font-size: 30rpx;
|
||||
line-height: 88rpx;
|
||||
color: #fff;
|
||||
background: #C52733;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
}
|
||||
.bottom-single .btn-primary {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.empty-state {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 60rpx 0;
|
||||
}
|
||||
.empty-image {
|
||||
width: 320rpx;
|
||||
height: 320rpx;
|
||||
}
|
||||
.empty-text {
|
||||
font-size: 28rpx;
|
||||
color: #999;
|
||||
margin-top: 20rpx;
|
||||
}
|
||||
</style>
|
||||
@@ -1,649 +0,0 @@
|
||||
<template>
|
||||
<view class="coupon-order-detail">
|
||||
<view class="status-banner" :class="{ 'completed': isCompleted || isExpired }">
|
||||
<view v-if="isCompleted">
|
||||
<view class="status-text v12-dark-text">已完成</view>
|
||||
<view class="status-subtext v12-dark-text">期待再次光临</view>
|
||||
</view>
|
||||
<view v-else-if="isExpired">
|
||||
<view class="status-text v12-dark-text">已过期</view>
|
||||
<view class="status-subtext v12-dark-text">很遗憾,你的体验券已过期</view>
|
||||
</view>
|
||||
<text v-else class="status-text">{{ statusText }}</text>
|
||||
</view>
|
||||
|
||||
<view class="qrcode-card" v-if="!isCompleted && !isExpired">
|
||||
<view class="merchant-header" v-if="orderInfo.merchantName" @click="goStoreDetail">
|
||||
<image :src="webUrl + '/orderIcon/shop.png'" class="shop-icon" />
|
||||
<text class="merchant-name">{{ orderInfo.merchantName }}</text>
|
||||
<image :src="webUrl + '/orderIcon/arrow.png'" class="arrow-icon" />
|
||||
</view>
|
||||
<view class="project-name v12-font-34">
|
||||
{{ orderInfo.experienceItemInfo.themeName || '' }}
|
||||
</view>
|
||||
<view class="qrcode-wrap" v-if="orderInfo.code">
|
||||
<image :src="orderInfo.code" class="qrcode-image" mode="aspectFit" />
|
||||
</view>
|
||||
<view class="verify-code">
|
||||
<text class="label">核销码:</text>
|
||||
<text class="value">{{ orderInfo.verifyCode || '-' }}</text>
|
||||
<image :src="webUrl + '/orderIcon/copy.png'" class="copy-icon" @click="copyVerifyCode" v-if="orderInfo.verifyCode" />
|
||||
</view>
|
||||
<view v-if="orderInfo.validityPeriod" class="valid-time">
|
||||
有效期: {{ orderInfo.validityPeriod || '-' }}
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="merchant-card">
|
||||
<view class="merchant-card-top">
|
||||
<image :src="orderInfo.experienceItemInfo.themeImage " class="merchant-avatar" mode="aspectFill" />
|
||||
<view class="merchant-info">
|
||||
<view class="merchant-name-large">{{ orderInfo.merchantName }}</view>
|
||||
<view class="merchant-time" v-if="formattedBusinessTime">营业时间:{{ formattedBusinessTime }}</view>
|
||||
<view class="merchant-actions">
|
||||
<view class="action-btn" @click="openLocation">
|
||||
<u-icon :name="webUrl + '/page/qianxian/icon-addr.png'" color="#fff" size="24"></u-icon>
|
||||
</view>
|
||||
<view class="action-btn" @click="callMerchant">
|
||||
<u-icon :name="webUrl + '/page/qianxian/icon-phone.png'" color="#fff" size="24"></u-icon>
|
||||
</view>
|
||||
</view>
|
||||
<view class="merchant-location-wrap one-t v12-mb-2">
|
||||
<image :src="webUrl + '/orderIcon/map.png'" class="location-icon" />
|
||||
<text class="distance-text" v-if="distanceText">距该地{{ distanceText }}km</text>
|
||||
<text class="address-text">{{ orderInfo.address }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="detail-section">
|
||||
<view class="section-title">订单详情</view>
|
||||
<view class="info-row" v-if="isCompleted || isExpired">
|
||||
<text class="label">名 称:</text>
|
||||
<text class="value">{{ orderInfo.experienceItemInfo && orderInfo.experienceItemInfo.themeName ? orderInfo.experienceItemInfo.themeName : '' }}</text>
|
||||
</view>
|
||||
<view class="info-row">
|
||||
<text class="label">订单号:</text>
|
||||
<view class="value with-copy">
|
||||
<text>{{ orderInfo.orderId || '' }}</text>
|
||||
<image :src="webUrl + '/orderIcon/copy.png'" class="copy-icon" @click="copyOrderId" v-if="orderInfo.orderId" />
|
||||
</view>
|
||||
</view>
|
||||
<view class="info-row">
|
||||
<text class="label">订单类型:</text>
|
||||
<text class="value">{{ orderInfo.orderTypeDesc || '免费体验券' }}</text>
|
||||
</view>
|
||||
<view class="info-row" v-if="isCompleted">
|
||||
<text class="label">核销时间:</text>
|
||||
<text class="value">{{ formatTime(orderInfo.verifyTime) || '-' }}</text>
|
||||
</view>
|
||||
<view class="info-row" v-if="isCompleted">
|
||||
<text class="label">订单状态:</text>
|
||||
<text class="value">核销完成</text>
|
||||
</view>
|
||||
<view class="info-row" v-if="isExpired && orderInfo.endTime">
|
||||
<text class="label">到期时间:</text>
|
||||
<text class="value">{{ orderInfo.endTime || '-' }}</text>
|
||||
</view>
|
||||
<view class="info-row" v-if="isExpired">
|
||||
<text class="label">订单状态:</text>
|
||||
<text class="value">已过期</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="notice-section" v-if="!isCompleted && !isExpired">
|
||||
<view class="section-title">使用须知</view>
|
||||
<view class="rich-text-content">
|
||||
<u-parse :content="orderInfo.experienceItemInfo && orderInfo.experienceItemInfo.useNotice ? orderInfo.experienceItemInfo.useNotice : ''"></u-parse>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="bottom-bar" v-if="isCompleted || isExpired">
|
||||
<view class="home-btn" @click="goHome">
|
||||
<u-icon name="home" color="#C52733" size="38rpx" class="home-icon"></u-icon>
|
||||
<text>返回主页</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getExperienceCouponOrderDetail } from '@/api/product'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||
orderId: '',
|
||||
orderInfo: {},
|
||||
userLatitude: null,
|
||||
userLongitude: null,
|
||||
distanceText: '',
|
||||
pollTimer: null
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
statusText() {
|
||||
const status = this.orderInfo.experienceOrderStatus
|
||||
if (status === 0) {
|
||||
return '待使用'
|
||||
}
|
||||
if (status === 1) {
|
||||
return '已完成'
|
||||
}
|
||||
if (status === 2) {
|
||||
return '已过期'
|
||||
}
|
||||
return ''
|
||||
},
|
||||
isCompleted() {
|
||||
return this.orderInfo.experienceOrderStatus === 1
|
||||
},
|
||||
isExpired() {
|
||||
return this.orderInfo.experienceOrderStatus === 2
|
||||
},
|
||||
formattedBusinessTime() {
|
||||
return (this.orderInfo.serviceTime || '00:00') + '~' + (this.orderInfo.serviceEndTime || '23:59')
|
||||
}
|
||||
},
|
||||
onLoad(options) {
|
||||
if (options && options.orderId) {
|
||||
this.orderId = options.orderId
|
||||
this.fetchDetail()
|
||||
}
|
||||
this.getUserLocation()
|
||||
},
|
||||
onUnload() {
|
||||
uni.setStorageSync('needRefreshMyOrderList', 1)
|
||||
this.stopOrderPoll()
|
||||
},
|
||||
onHide() {
|
||||
this.stopOrderPoll()
|
||||
},
|
||||
methods: {
|
||||
fetchDetail() {
|
||||
if (!this.orderId) {
|
||||
return
|
||||
}
|
||||
getExperienceCouponOrderDetail(this.orderId).then(({ data }) => {
|
||||
this.orderInfo = data || {}
|
||||
this.updateDistance()
|
||||
if (!this.isCompleted && !this.isExpired) {
|
||||
this.startOrderPoll()
|
||||
} else {
|
||||
this.stopOrderPoll()
|
||||
}
|
||||
}).catch(() => {})
|
||||
},
|
||||
startOrderPoll() {
|
||||
if (this.pollTimer || !this.orderId) {
|
||||
return
|
||||
}
|
||||
this.pollTimer = setInterval(() => {
|
||||
if (this.isCompleted || this.isExpired) {
|
||||
this.stopOrderPoll()
|
||||
return
|
||||
}
|
||||
this.fetchDetail()
|
||||
}, 5000)
|
||||
},
|
||||
stopOrderPoll() {
|
||||
if (this.pollTimer) {
|
||||
clearInterval(this.pollTimer)
|
||||
this.pollTimer = null
|
||||
}
|
||||
},
|
||||
getUserLocation() {
|
||||
uni.getLocation({
|
||||
type: 'gcj02',
|
||||
success: res => {
|
||||
this.userLatitude = res.latitude
|
||||
this.userLongitude = res.longitude
|
||||
this.updateDistance()
|
||||
}
|
||||
})
|
||||
},
|
||||
formatTimestamp(timestamp) {
|
||||
if (!timestamp) return ''
|
||||
const date = new Date(Number(timestamp))
|
||||
const year = date.getFullYear()
|
||||
const month = String(date.getMonth() + 1).padStart(2, '0')
|
||||
const day = String(date.getDate()).padStart(2, '0')
|
||||
return `${year}-${month}-${day}`
|
||||
},
|
||||
formatTime(timestamp) {
|
||||
if (!timestamp) return ''
|
||||
const date = new Date(Number(timestamp))
|
||||
const year = date.getFullYear()
|
||||
const month = date.getMonth() + 1
|
||||
const day = date.getDate()
|
||||
return `${year}年${month}月${day}日`
|
||||
},
|
||||
goHome() {
|
||||
uni.switchTab({
|
||||
url: '/pages/home/index'
|
||||
})
|
||||
},
|
||||
updateDistance() {
|
||||
if (
|
||||
this.userLatitude == null ||
|
||||
this.userLongitude == null ||
|
||||
this.orderInfo.latitude == null ||
|
||||
this.orderInfo.longitude == null
|
||||
) {
|
||||
return
|
||||
}
|
||||
const lat1 = Number(this.userLatitude)
|
||||
const lon1 = Number(this.userLongitude)
|
||||
const lat2 = Number(this.orderInfo.latitude)
|
||||
const lon2 = Number(this.orderInfo.longitude)
|
||||
|
||||
const R = 6371
|
||||
const dLat = (lat2 - lat1) * Math.PI / 180
|
||||
const dLon = (lon2 - lon1) * Math.PI / 180
|
||||
const a =
|
||||
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
|
||||
Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
|
||||
Math.sin(dLon / 2) * Math.sin(dLon / 2)
|
||||
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
|
||||
const d = R * c
|
||||
this.distanceText = d.toFixed(1)
|
||||
},
|
||||
callMerchant() {
|
||||
const phone = this.orderInfo.merchantPhone || this.orderInfo.merPhone || (this.orderInfo.experienceItemInfo && this.orderInfo.experienceItemInfo.phone) || this.orderInfo.companyTel;
|
||||
if (phone) {
|
||||
uni.makePhoneCall({
|
||||
phoneNumber: phone
|
||||
})
|
||||
} else {
|
||||
uni.showToast({ title: '暂无商家电话', icon: 'none' })
|
||||
}
|
||||
},
|
||||
openLocation() {
|
||||
if (this.orderInfo.latitude && this.orderInfo.longitude) {
|
||||
uni.openLocation({
|
||||
latitude: Number(this.orderInfo.latitude),
|
||||
longitude: Number(this.orderInfo.longitude),
|
||||
name: this.orderInfo.merchantName,
|
||||
address: this.orderInfo.address
|
||||
})
|
||||
} else {
|
||||
uni.showToast({ title: '暂无位置信息', icon: 'none' })
|
||||
}
|
||||
},
|
||||
goStoreDetail() {
|
||||
const merchantId = this.orderInfo.merId || this.orderInfo.merchantId || this.orderInfo.hotelId
|
||||
if (!merchantId) {
|
||||
uni.showToast({ title: '未找到店铺信息', icon: 'none' })
|
||||
return
|
||||
}
|
||||
uni.navigateTo({
|
||||
url: '/pkg_product/views/experienceProjectDetail?experienceMerchantId=' + encodeURIComponent(merchantId)
|
||||
})
|
||||
},
|
||||
copyVerifyCode() {
|
||||
if (!this.orderInfo.verifyCode) {
|
||||
return
|
||||
}
|
||||
uni.setClipboardData({
|
||||
data: this.orderInfo.verifyCode,
|
||||
success: () => {
|
||||
uni.showToast({
|
||||
title: '已复制核销码',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
copyOrderId() {
|
||||
if (!this.orderInfo.orderId) {
|
||||
return
|
||||
}
|
||||
uni.setClipboardData({
|
||||
data: this.orderInfo.orderId,
|
||||
success: () => {
|
||||
uni.showToast({
|
||||
title: '已复制订单号',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="less">
|
||||
.coupon-order-detail {
|
||||
min-height: 100vh;
|
||||
padding: 24rpx;
|
||||
box-sizing: border-box;
|
||||
background: #f5f5f5;
|
||||
padding-bottom: 120rpx;
|
||||
}
|
||||
|
||||
.status-banner {
|
||||
background: #C52733;
|
||||
border-radius: 16rpx;
|
||||
padding: 24rpx 32rpx;
|
||||
margin-bottom: 24rpx;
|
||||
}
|
||||
|
||||
.status-banner.completed {
|
||||
background: #fff;
|
||||
padding: 32rpx;
|
||||
}
|
||||
|
||||
.status-text {
|
||||
color: #fff;
|
||||
font-size: 32rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.status-text.dark-text {
|
||||
color: #333;
|
||||
font-size: 36rpx;
|
||||
margin-bottom: 8rpx;
|
||||
}
|
||||
|
||||
.status-subtext {
|
||||
font-size: 24rpx;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.qrcode-card {
|
||||
background: #fff;
|
||||
border-radius: 16rpx;
|
||||
padding: 32rpx;
|
||||
margin-bottom: 24rpx;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.merchant-header {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 24rpx;
|
||||
align-self: flex-start;
|
||||
}
|
||||
|
||||
.shop-icon {
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
margin-right: 12rpx;
|
||||
}
|
||||
|
||||
.merchant-name {
|
||||
font-size: 28rpx;
|
||||
color: #333;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.arrow-icon {
|
||||
width: 24rpx;
|
||||
height: 24rpx;
|
||||
margin-left: 8rpx;
|
||||
}
|
||||
|
||||
.project-name {
|
||||
font-size: 36rpx;
|
||||
color: #333;
|
||||
font-weight: bold;
|
||||
margin-bottom: 24rpx;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.qrcode-wrap {
|
||||
width: 336rpx;
|
||||
height: 336rpx;
|
||||
margin-bottom: 24rpx;
|
||||
border-radius: 20px;
|
||||
border: 1px solid #B8B8B8;
|
||||
padding: 20rpx;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.qrcode-image {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.verify-code {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 16rpx;
|
||||
}
|
||||
|
||||
.verify-code .label {
|
||||
font-size: 28rpx;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.verify-code .value {
|
||||
font-size: 40rpx;
|
||||
color: #333;
|
||||
font-weight: bold;
|
||||
margin: 0 16rpx;
|
||||
}
|
||||
|
||||
.copy-icon {
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
}
|
||||
|
||||
.valid-time {
|
||||
font-size: 24rpx;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.merchant-card {
|
||||
background: #fff;
|
||||
border-radius: 16rpx;
|
||||
padding: 24rpx;
|
||||
margin-bottom: 24rpx;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.merchant-card-top {
|
||||
display: flex;
|
||||
position: relative;
|
||||
margin-bottom: 24rpx;
|
||||
}
|
||||
|
||||
.merchant-avatar {
|
||||
width: 220rpx;
|
||||
height: 220rpx;
|
||||
border-radius: 12rpx;
|
||||
margin-right: 24rpx;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.merchant-info {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.merchant-name-large {
|
||||
font-size: 32rpx;
|
||||
color: #333;
|
||||
font-weight: bold;
|
||||
margin-bottom: 8rpx;
|
||||
}
|
||||
|
||||
.merchant-card-bottom {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.merchant-time {
|
||||
font-size: 24rpx;
|
||||
color: #666;
|
||||
margin-bottom: 0;
|
||||
line-height: 1.4;
|
||||
word-break: break-all;
|
||||
flex: 1;
|
||||
padding-right: 24rpx;
|
||||
}
|
||||
|
||||
.merchant-location-wrap {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 24rpx;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.location-icon {
|
||||
width: 24rpx;
|
||||
height: 24rpx;
|
||||
margin-right: 4rpx;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.distance-text {
|
||||
margin-right: 12rpx;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.address-text {
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.merchant-actions {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
flex-shrink: 0;
|
||||
justify-content: flex-end;
|
||||
margin: 20rpx 0;
|
||||
}
|
||||
|
||||
.action-btn {
|
||||
width: 64rpx;
|
||||
height: 64rpx;
|
||||
border-radius: 50%;
|
||||
background: #C52733;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-left: 16rpx;
|
||||
}
|
||||
|
||||
.detail-section {
|
||||
background: #fff;
|
||||
border-radius: 16rpx;
|
||||
padding: 24rpx;
|
||||
margin-bottom: 24rpx;
|
||||
}
|
||||
|
||||
.section-title {
|
||||
font-size: 32rpx;
|
||||
color: #333;
|
||||
font-weight: bold;
|
||||
margin-bottom: 24rpx;
|
||||
}
|
||||
|
||||
.info-row {
|
||||
display: flex;
|
||||
margin-bottom: 16rpx;
|
||||
}
|
||||
|
||||
.info-row:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.info-row .label {
|
||||
font-size: 28rpx;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.info-row .value {
|
||||
font-size: 28rpx;
|
||||
color: #333;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.info-row .value.with-copy {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.info-row .value.with-copy .copy-icon {
|
||||
margin-left: 16rpx;
|
||||
}
|
||||
|
||||
.notice-section {
|
||||
background: #fff;
|
||||
border-radius: 16rpx;
|
||||
padding: 24rpx;
|
||||
}
|
||||
|
||||
.notice-item {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
margin-bottom: 12rpx;
|
||||
}
|
||||
|
||||
.notice-item:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.notice-item .dot {
|
||||
color: #666;
|
||||
margin-right: 8rpx;
|
||||
font-size: 24rpx;
|
||||
}
|
||||
|
||||
.notice-item .text {
|
||||
color: #666;
|
||||
font-size: 26rpx;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.rich-text-content {
|
||||
font-size: 26rpx;
|
||||
color: #666;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.bottom-bar {
|
||||
position: fixed;
|
||||
bottom: 40rpx;
|
||||
left: 0;
|
||||
right: 0;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
padding-bottom: constant(safe-area-inset-bottom);
|
||||
padding-bottom: env(safe-area-inset-bottom);
|
||||
}
|
||||
|
||||
.home-btn {
|
||||
width: 686rpx;
|
||||
height: 88rpx;
|
||||
// background: #E8EBF0;
|
||||
border: 2rpx solid #C52733;
|
||||
border-radius: 44rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 32rpx;
|
||||
color: #C52733;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.home-icon {
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
margin-right: 12rpx;
|
||||
}
|
||||
</style>
|
||||
@@ -1,739 +0,0 @@
|
||||
<template>
|
||||
<view class="experience-project-page">
|
||||
<hx-navbar
|
||||
:fixed="true"
|
||||
:background-color="[0, [0, 0, 0, 0], [0, 0, 0, 0]]"
|
||||
statusBarFontColor="#ffffff"
|
||||
barPlaceholder="hidden"
|
||||
transparent="auto"
|
||||
color="#ffffff"
|
||||
/>
|
||||
<scroll-view scroll-y class="page-scroll">
|
||||
<view class="hero-wrap">
|
||||
<swiper v-if="bannerList.length > 0 || project.video" class="hero-img" circular :autoplay="swiperAutoplay" :interval="3000" @change="handleSwiperChange">
|
||||
<swiper-item v-if="project.video">
|
||||
<video :src="project.video" id="hero-video" class="hero-img" :autoplay="currentSwiperIndex === 0" object-fit="contain" :controls="false" :enable-progress-gesture="false" @play="onVideoPlay" @ended="onVideoEnd" @pause="onVideoEnd" @click="toggleVideo"></video>
|
||||
</swiper-item>
|
||||
<swiper-item v-for="(item, index) in bannerList" :key="index">
|
||||
<image :src="item" class="hero-img" mode="heightFix|widthFix" />
|
||||
</swiper-item>
|
||||
</swiper>
|
||||
<image
|
||||
v-else-if="project.cover"
|
||||
:src="project.cover"
|
||||
class="hero-img"
|
||||
mode="aspectFill"
|
||||
/>
|
||||
</view>
|
||||
<view class="content">
|
||||
<view class="store-card">
|
||||
<view class="store-name">
|
||||
{{ project.name }}
|
||||
</view>
|
||||
<view class="store-intro">
|
||||
{{ project.intro }}
|
||||
</view>
|
||||
<view class="store-tags" style="display: flex; flex-wrap: wrap; align-items: center;">
|
||||
<view style="display: flex; align-items: center; margin-right: 16rpx; border-radius: 44rpx;">
|
||||
<view style="border-radius: 44rpx 0 0 44rpx;font-size: 24rpx; color: #fff; background-color: #C52733; height: 44rpx; display: flex; align-items: center; padding: 0 20rpx; position: relative; z-index: 1;">营业时间</view>
|
||||
<view style="font-size: 24rpx; color: #333; background-color: #fff; border: 2rpx solid #C52733; border-radius: 44rpx; height: 44rpx; display: flex; align-items: center; padding: 0 20rpx 0 16rpx; box-sizing: border-box; margin-left: -20rpx; position: relative; z-index: 2;">
|
||||
{{ project.serviceTime || '00:00' }}~{{ project.serviceEndTime || '23:59' }}
|
||||
</view>
|
||||
</view>
|
||||
<view class="license-tag" @click="handleViewLicense">营业执照</view>
|
||||
</view>
|
||||
<view class="store-meta">
|
||||
<view class="meta-left">
|
||||
<!-- <u-icon
|
||||
:name="webUrl + '/page/qianxian/icon-location.png'"
|
||||
size="20"
|
||||
color="#C52733"
|
||||
/> -->
|
||||
<view class="meta-info">
|
||||
<text class="meta-text">
|
||||
{{ project.cityName }}{{ project.address }}
|
||||
</text>
|
||||
</view>
|
||||
<view v-if="distanceText" class="distance-row">
|
||||
<u-icon :name="webUrl + '/orderIcon/map.png'" size="16"></u-icon>
|
||||
<text class="distance-text">距该地{{ distanceText }}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="meta-actions">
|
||||
<view class="action-item" @click="handleNavigate">
|
||||
<view class="action-icon">
|
||||
<u-icon :name="webUrl + '/page/qianxian/icon-addr.png'" color="#fff" size="24"></u-icon>
|
||||
</view>
|
||||
<text class="action-text">导航</text>
|
||||
</view>
|
||||
<view class="action-item" @click="handleContact">
|
||||
<view class="action-icon">
|
||||
<u-icon :name="webUrl + '/page/qianxian/icon-phone.png'" color="#fff" size="24"></u-icon>
|
||||
</view>
|
||||
<text class="action-text">客服</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="experience-badge-wrap">
|
||||
<view class="experience-badge">
|
||||
<view class="badge-diamond">
|
||||
<view class="badge-icon">
|
||||
<u-icon :name="webUrl + '/icon/zuanshi.png'" color="#F9D24D" size="16"></u-icon>
|
||||
</view>
|
||||
</view>
|
||||
<view class="badge-bg">
|
||||
<text class="badge-text">超值体验</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="section">
|
||||
<!-- <view class="section-title">体验项目</view> -->
|
||||
<swiper
|
||||
v-if="projectList.length > 0"
|
||||
class="experience-swiper"
|
||||
:style="{ height: experienceSwiperHeight ? (experienceSwiperHeight + 'px') : '520rpx' }"
|
||||
circular
|
||||
:autoplay="true"
|
||||
:interval="3000"
|
||||
:indicator-dots="false"
|
||||
indicator-color="rgba(255, 255, 255, .4)"
|
||||
indicator-active-color="#ffffff"
|
||||
@change="handleExperienceSwiperChange"
|
||||
>
|
||||
<swiper-item v-for="(item, index) in projectList" :key="index">
|
||||
<view :id="'experience-card-' + index" class="experience-card">
|
||||
<image
|
||||
v-if="item.projectImage"
|
||||
:src="item.projectImage"
|
||||
class="experience-image"
|
||||
mode="widthFix|heightFix"
|
||||
@load="onExperienceImageLoad"
|
||||
/>
|
||||
<view class="experience-info">
|
||||
<view class="experience-title-wrap">
|
||||
<view class="experience-title">
|
||||
{{ item.themeName || item.projectName }}
|
||||
</view>
|
||||
</view>
|
||||
<view class="experience-subtitle">
|
||||
{{ item.projectIntro || item.detail }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</swiper-item>
|
||||
</swiper>
|
||||
</view>
|
||||
|
||||
<view class="section" v-if="project.detailText || project.remark">
|
||||
<view class="section-title" v-if="project.detailText">详情</view>
|
||||
<view class="detail-list">
|
||||
<view class="v12-font-26" style="color:#666">
|
||||
<u-parse :content="project.detailText"></u-parse>
|
||||
</view>
|
||||
</view>
|
||||
<template v-if="project.remark">
|
||||
<view class="section-title" style="margin-top: 24rpx;">备注</view>
|
||||
<view class="section-text with-dot">
|
||||
<text class="dot"></text>
|
||||
<text>{{ project.remark }}</text>
|
||||
</view>
|
||||
</template>
|
||||
</view>
|
||||
|
||||
<view class="section" v-if="usageNotice">
|
||||
<view class="section-title">使用须知</view>
|
||||
<view class="section-content">
|
||||
<u-parse :content="usageNotice"></u-parse>
|
||||
</view>
|
||||
</view>
|
||||
<view class="bottom-space" />
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getExperienceStoreDetail } from '@/api/qianxian'
|
||||
export default {
|
||||
data() {
|
||||
const webUrl = this.$VUE_APP_RESOURCES_URL
|
||||
return {
|
||||
webUrl,
|
||||
project: {
|
||||
id: '',
|
||||
name: '',
|
||||
cover: '',
|
||||
intro: '',
|
||||
serviceTime: '',
|
||||
serviceEndTime: '',
|
||||
cityName: '',
|
||||
address: '',
|
||||
latitude: '',
|
||||
longitude: '',
|
||||
phone: '',
|
||||
wechat: '',
|
||||
video: '',
|
||||
banner: '',
|
||||
experienceTitle: '',
|
||||
experienceSubTitle: '',
|
||||
detailText: '',
|
||||
remark: '',
|
||||
qualification: ''
|
||||
},
|
||||
detailList: [],
|
||||
experienceMerchantId: '',
|
||||
totalPrice: 0,
|
||||
validFrom: '',
|
||||
validTo: '',
|
||||
usageNotice: '',
|
||||
currentSwiperIndex: 0,
|
||||
videoContext: null,
|
||||
swiperAutoplay: true,
|
||||
isVideoPlaying: false,
|
||||
projectList: [],
|
||||
userLatitude: null,
|
||||
userLongitude: null,
|
||||
distanceText: '',
|
||||
currentExperienceIndex: 0,
|
||||
experienceSwiperHeight: 0
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
bannerList() {
|
||||
if (!this.project.banner) return []
|
||||
return this.project.banner.split(',').filter(item => item)
|
||||
}
|
||||
},
|
||||
onLoad(query) {
|
||||
const decode = v => decodeURIComponent(v || '')
|
||||
const id = query.experienceMerchantId || query.id || ''
|
||||
this.experienceMerchantId = id
|
||||
this.project.id = id
|
||||
this.project.name = decode(query.name)
|
||||
this.project.cover = decode(query.cover)
|
||||
this.project.video = decode(query.video)
|
||||
this.project.banner = decode(query.banner)
|
||||
this.project.intro = decode(query.intro)
|
||||
this.project.serviceTime = query.serviceTime || ''
|
||||
this.project.serviceEndTime = query.serviceEndTime || ''
|
||||
this.project.cityName = decode(query.cityName)
|
||||
this.project.address = decode(query.address)
|
||||
this.project.latitude = query.latitude || ''
|
||||
this.project.longitude = query.longitude || ''
|
||||
this.project.experienceTitle = decode(query.experienceTitle || '')
|
||||
this.project.experienceSubTitle = decode(query.experienceSubTitle || '')
|
||||
this.project.detailText = decode(query.detailText || '')
|
||||
this.project.remark = decode(query.remark || '')
|
||||
this.validFrom = query.validFrom || ''
|
||||
this.validTo = query.validTo || ''
|
||||
this.usageNotice = decode(query.usageNotice || '')
|
||||
this.getUserLocation()
|
||||
if (query.detailList) {
|
||||
try {
|
||||
const list = JSON.parse(decode(query.detailList))
|
||||
if (Array.isArray(list)) {
|
||||
this.detailList = list.map(item => ({
|
||||
name: item.name || '',
|
||||
count: item.count || ''
|
||||
}))
|
||||
}
|
||||
} catch (e) {}
|
||||
}
|
||||
this.fetchProjectDetail()
|
||||
},
|
||||
onReady() {
|
||||
this.videoContext = uni.createVideoContext('hero-video', this)
|
||||
},
|
||||
methods: {
|
||||
handleSwiperChange(e) {
|
||||
this.currentSwiperIndex = e.detail.current
|
||||
if (this.project.video && this.videoContext) {
|
||||
if (this.currentSwiperIndex === 0) {
|
||||
this.videoContext.play()
|
||||
} else {
|
||||
this.videoContext.pause()
|
||||
}
|
||||
}
|
||||
},
|
||||
onVideoPlay() {
|
||||
this.swiperAutoplay = false
|
||||
this.isVideoPlaying = true
|
||||
},
|
||||
onVideoEnd() {
|
||||
this.swiperAutoplay = true
|
||||
this.isVideoPlaying = false
|
||||
},
|
||||
toggleVideo() {
|
||||
if (!this.videoContext) return
|
||||
if (this.isVideoPlaying) {
|
||||
this.videoContext.pause()
|
||||
this.swiperAutoplay = true
|
||||
} else {
|
||||
this.videoContext.play()
|
||||
}
|
||||
},
|
||||
handleExperienceSwiperChange(e) {
|
||||
this.currentExperienceIndex = e.detail.current || 0
|
||||
this.updateExperienceSwiperHeight(this.currentExperienceIndex)
|
||||
},
|
||||
onExperienceImageLoad() {
|
||||
this.updateExperienceSwiperHeight(this.currentExperienceIndex)
|
||||
},
|
||||
updateExperienceSwiperHeight(index) {
|
||||
const targetIndex = Number.isInteger(index) ? index : this.currentExperienceIndex
|
||||
this.$nextTick(() => {
|
||||
const query = uni.createSelectorQuery().in(this)
|
||||
query.select('#experience-card-' + targetIndex).boundingClientRect(rect => {
|
||||
if (rect && rect.height) {
|
||||
this.experienceSwiperHeight = rect.height
|
||||
}
|
||||
}).exec()
|
||||
})
|
||||
},
|
||||
fetchProjectDetail() {
|
||||
if (!this.experienceMerchantId) {
|
||||
return
|
||||
}
|
||||
uni.showLoading({
|
||||
title: '加载中',
|
||||
mask: true
|
||||
})
|
||||
getExperienceStoreDetail(this.experienceMerchantId).then(res => {
|
||||
if (res && res.status === 200) {
|
||||
const data = res.data || {}
|
||||
this.project.name = data.name || this.project.name
|
||||
this.project.cover = data.cover || this.project.cover
|
||||
this.project.video = data.video || this.project.video
|
||||
this.project.banner = data.banner || this.project.banner
|
||||
this.project.intro = data.intro || this.project.intro
|
||||
this.project.serviceTime = data.serviceTime || this.project.serviceTime
|
||||
this.project.serviceEndTime = data.serviceEndTime || this.project.serviceEndTime
|
||||
this.project.cityName = data.cityName || this.project.cityName
|
||||
this.project.address = data.address || this.project.address
|
||||
this.project.latitude = data.latitude || this.project.latitude
|
||||
this.project.longitude = data.longitude || this.project.longitude
|
||||
this.updateDistance()
|
||||
this.project.phone = data.phone || this.project.phone
|
||||
this.project.wechat = data.wechat || this.project.wechat
|
||||
this.project.qualification = data.qualification || this.project.qualification
|
||||
const project = data.project || {}
|
||||
this.project.experienceTitle = project.themeName || this.project.experienceTitle || this.project.name
|
||||
if (project.themeImage) {
|
||||
this.project.cover = project.themeImage
|
||||
}
|
||||
this.project.detailText = project.detail || this.project.detailText
|
||||
this.project.remark = project.remark || this.project.remark
|
||||
this.usageNotice = project.useNotice || this.usageNotice
|
||||
console.log('this.usageNotice', this.usageNotice)
|
||||
if (project.totalPrice != null) {
|
||||
this.totalPrice = project.totalPrice
|
||||
}
|
||||
if (data.totalPrice != null && this.totalPrice === 0) {
|
||||
this.totalPrice = data.totalPrice
|
||||
}
|
||||
if (project.validityStartTime) {
|
||||
this.validFrom = project.validityStartTime
|
||||
}
|
||||
if (project.validityEndTime) {
|
||||
this.validTo = project.validityEndTime
|
||||
}
|
||||
if (project.projectList && project.projectList.length) {
|
||||
this.projectList = project.projectList
|
||||
this.currentExperienceIndex = 0
|
||||
this.detailList = project.projectList.map(item => ({
|
||||
name: item.projectName || '',
|
||||
count: item.projectIntro || ''
|
||||
}))
|
||||
this.updateExperienceSwiperHeight(0)
|
||||
setTimeout(() => {
|
||||
this.updateExperienceSwiperHeight(0)
|
||||
}, 200)
|
||||
}
|
||||
}
|
||||
}).finally(() => {
|
||||
uni.hideLoading()
|
||||
})
|
||||
},
|
||||
getUserLocation() {
|
||||
uni.getLocation({
|
||||
type: 'gcj02',
|
||||
success: res => {
|
||||
this.userLatitude = Number(res.latitude)
|
||||
this.userLongitude = Number(res.longitude)
|
||||
this.updateDistance()
|
||||
}
|
||||
})
|
||||
},
|
||||
calculateDistance(lat1, lon1, lat2, lon2) {
|
||||
if (!lat1 || !lon1 || !lat2 || !lon2) {
|
||||
return ''
|
||||
}
|
||||
const R = 6371
|
||||
const dLat = (lat2 - lat1) * Math.PI / 180
|
||||
const dLon = (lon2 - lon1) * Math.PI / 180
|
||||
const a =
|
||||
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
|
||||
Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
|
||||
Math.sin(dLon / 2) * Math.sin(dLon / 2)
|
||||
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
|
||||
const d = R * c
|
||||
return d.toFixed(1) + 'km'
|
||||
},
|
||||
updateDistance() {
|
||||
const storeLatitude = Number(this.project.latitude)
|
||||
const storeLongitude = Number(this.project.longitude)
|
||||
if (
|
||||
this.userLatitude == null ||
|
||||
this.userLongitude == null ||
|
||||
!storeLatitude ||
|
||||
!storeLongitude
|
||||
) {
|
||||
this.distanceText = ''
|
||||
return
|
||||
}
|
||||
this.distanceText = this.calculateDistance(
|
||||
this.userLatitude,
|
||||
this.userLongitude,
|
||||
storeLatitude,
|
||||
storeLongitude
|
||||
)
|
||||
},
|
||||
handleNavigate() {
|
||||
if (!this.project.latitude || !this.project.longitude) {
|
||||
uni.showToast({
|
||||
title: '暂无位置信息',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
uni.openLocation({
|
||||
latitude: Number(this.project.latitude),
|
||||
longitude: Number(this.project.longitude),
|
||||
name: this.project.name,
|
||||
address: this.project.address
|
||||
})
|
||||
},
|
||||
handleContact() {
|
||||
if (!this.project.phone) {
|
||||
uni.showToast({
|
||||
title: '暂无联系方式',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
uni.makePhoneCall({
|
||||
phoneNumber: this.project.phone
|
||||
})
|
||||
},
|
||||
handleViewLicense() {
|
||||
if (this.project.qualification) {
|
||||
uni.navigateTo({
|
||||
url: `/pkg_product/views/storeLicense?name=${encodeURIComponent(this.project.name)}&images=${encodeURIComponent(this.project.qualification)}`
|
||||
})
|
||||
} else {
|
||||
uni.showToast({
|
||||
title: '暂无营业执照',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="less">
|
||||
.section-content {
|
||||
font-size: 26rpx;
|
||||
color: #666;
|
||||
line-height: 1.6;
|
||||
}
|
||||
.experience-project-page {
|
||||
min-height: 100vh;
|
||||
background: #f5f5f5;
|
||||
}
|
||||
.page-scroll {
|
||||
// height: calc(100vh - 120rpx);
|
||||
}
|
||||
.hero-wrap {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 700rpx;
|
||||
overflow: hidden;
|
||||
}
|
||||
.hero-img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.content {
|
||||
margin-top: -100rpx;
|
||||
padding: 0 24rpx 40rpx;
|
||||
box-sizing: border-box;
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
}
|
||||
.store-card {
|
||||
padding: 32rpx 24rpx;
|
||||
border-radius: 24rpx;
|
||||
background: #ffffff;
|
||||
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.06);
|
||||
}
|
||||
.store-name {
|
||||
color: #333;
|
||||
font-size: 36rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
.store-intro {
|
||||
margin-top: 16rpx;
|
||||
color: #666;
|
||||
font-size: 26rpx;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.store-tags {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-top: 24rpx;
|
||||
gap: 16rpx;
|
||||
}
|
||||
.time-tag {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
border: 1rpx solid #C52733;
|
||||
border-radius: 24rpx;
|
||||
overflow: hidden;
|
||||
height: 40rpx;
|
||||
}
|
||||
.time-tag-label {
|
||||
background: #C52733;
|
||||
color: #ffffff;
|
||||
font-size: 22rpx;
|
||||
padding: 0 16rpx;
|
||||
height: 100%;
|
||||
line-height: 40rpx;
|
||||
}
|
||||
.time-tag-value {
|
||||
color: #333;
|
||||
font-size: 22rpx;
|
||||
padding: 0 16rpx;
|
||||
height: 100%;
|
||||
line-height: 40rpx;
|
||||
background: #ffffff;
|
||||
}
|
||||
.license-tag {
|
||||
border: 1rpx solid #C52733;
|
||||
color: #C52733;
|
||||
font-size: 22rpx;
|
||||
padding: 0 16rpx;
|
||||
border-radius: 24rpx;
|
||||
height: 40rpx;
|
||||
line-height: 40rpx;
|
||||
}
|
||||
.store-meta {
|
||||
margin-top: 32rpx;
|
||||
padding-top: 32rpx;
|
||||
// border-top: 1rpx solid #f0f0f0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.meta-left {
|
||||
flex: 1;
|
||||
// display: flex;
|
||||
align-items: center;
|
||||
padding-right: 32rpx;
|
||||
}
|
||||
.meta-info {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
row-gap: 8rpx;
|
||||
}
|
||||
.distance-row {
|
||||
margin-left: 4rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
column-gap: 8rpx;
|
||||
}
|
||||
.distance-text {
|
||||
font-size: 22rpx;
|
||||
color: #666;
|
||||
margin-top: 8rpx;
|
||||
}
|
||||
.meta-text {
|
||||
margin-left: 12rpx;
|
||||
font-size: 26rpx;
|
||||
color: #333;
|
||||
font-weight: 500;
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 2;
|
||||
overflow: hidden;
|
||||
}
|
||||
.meta-actions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 32rpx;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.action-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
.action-icon {
|
||||
width: 64rpx;
|
||||
height: 64rpx;
|
||||
border-radius: 50%;
|
||||
background: #C52733;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 8rpx;
|
||||
}
|
||||
.action-text {
|
||||
font-size: 22rpx;
|
||||
color: #333;
|
||||
}
|
||||
.section-experience {
|
||||
margin-top: 40rpx;
|
||||
position: relative;
|
||||
}
|
||||
.experience-badge-wrap {
|
||||
z-index: 10;
|
||||
margin-top: 40rpx;
|
||||
margin-left: 20rpx;
|
||||
}
|
||||
.experience-badge {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
height: 44rpx;
|
||||
}
|
||||
.badge-diamond {
|
||||
width: 44rpx;
|
||||
height: 44rpx;
|
||||
background: #ffffff;
|
||||
border: 4rpx solid #C52733;
|
||||
transform: rotate(45deg);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 2;
|
||||
box-sizing: border-box;
|
||||
margin-left: -14rpx;
|
||||
}
|
||||
.badge-icon {
|
||||
transform: rotate(-45deg);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.badge-bg {
|
||||
background: #C52733;
|
||||
border-radius: 0 24rpx 24rpx 0;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 0 20rpx 0 24rpx;
|
||||
margin-left: -16rpx;
|
||||
}
|
||||
.badge-text {
|
||||
color: #ffffff;
|
||||
font-size: 24rpx;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
line-height: 1;
|
||||
}
|
||||
.experience-card {
|
||||
border-radius: 24rpx;
|
||||
background: #C52733;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 8rpx 24rpx rgba(197, 39, 51, 0.15);
|
||||
margin-bottom: 24rpx;
|
||||
}
|
||||
.experience-swiper {
|
||||
margin-top: 16rpx;
|
||||
width: 100%;
|
||||
}
|
||||
.experience-image {
|
||||
width: 100%;
|
||||
height: 360rpx;
|
||||
border-radius: 24rpx;
|
||||
display: block;
|
||||
}
|
||||
.experience-info {
|
||||
padding: 24rpx;
|
||||
}
|
||||
.experience-title-wrap {
|
||||
display: inline-block;
|
||||
background: #ffffff;
|
||||
border-radius: 40rpx;
|
||||
padding: 8rpx 32rpx;
|
||||
margin-bottom: 16rpx;
|
||||
}
|
||||
.experience-title {
|
||||
color: #C52733;
|
||||
font-size: 32rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
.experience-subtitle {
|
||||
color: #ffffff;
|
||||
font-size: 26rpx;
|
||||
opacity: 0.9;
|
||||
}
|
||||
.section {
|
||||
margin-top: 24rpx;
|
||||
padding: 32rpx 24rpx;
|
||||
border-radius: 24rpx;
|
||||
background: #ffffff;
|
||||
}
|
||||
.section-title {
|
||||
font-size: 32rpx;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
margin-bottom: 24rpx;
|
||||
}
|
||||
.detail-list {
|
||||
background: transparent;
|
||||
}
|
||||
.detail-item {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
justify-content: space-between;
|
||||
font-size: 26rpx;
|
||||
color: #666;
|
||||
margin-bottom: 16rpx;
|
||||
}
|
||||
.detail-name {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.detail-count {
|
||||
margin-left: 24rpx;
|
||||
color: #999;
|
||||
}
|
||||
.dot {
|
||||
display: inline-block;
|
||||
width: 8rpx;
|
||||
height: 8rpx;
|
||||
border-radius: 50%;
|
||||
background: #999;
|
||||
margin-top: 14rpx;
|
||||
margin-right: 16rpx;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.section-text {
|
||||
font-size: 26rpx;
|
||||
color: #666;
|
||||
line-height: 1.6;
|
||||
}
|
||||
.with-dot {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
margin-bottom: 16rpx;
|
||||
}
|
||||
.bottom-space {
|
||||
height: 40rpx;
|
||||
}
|
||||
</style>
|
||||
@@ -213,10 +213,6 @@ export default {
|
||||
},
|
||||
computed: mapGetters(['userInfo', 'isLogin']),
|
||||
onShareAppMessage() {
|
||||
uni.updateShareMenu({
|
||||
isPrivateMessage: false,
|
||||
withShareTicket: false
|
||||
})
|
||||
return {
|
||||
title: '探寻有趣有味的生活方式',
|
||||
path: '/pkg_product/views/famousList?partnerId=' + this.userInfo.uid,
|
||||
|
||||
@@ -66,10 +66,6 @@ export default {
|
||||
},
|
||||
computed: mapGetters(['userInfo', 'isLogin']),
|
||||
onShareAppMessage() {
|
||||
uni.updateShareMenu({
|
||||
isPrivateMessage: false,
|
||||
withShareTicket: false
|
||||
})
|
||||
return new Promise(async (resolve, reject) => {
|
||||
const {status, data} = await famousShareImage();
|
||||
if (status === 200) {
|
||||
|
||||
@@ -64,11 +64,11 @@
|
||||
<view class="zan-box flex flex-0 ai-end" @click="zanInn">
|
||||
<template v-if="isLike">
|
||||
<image :src="webUrl + '/icon/icon-like.png'" class="img" />
|
||||
<text class="on">{{ $formatCount(inn.zan) }}</text>
|
||||
<text class="on">{{ inn.zan }}</text>
|
||||
</template>
|
||||
<template v-else>
|
||||
<image :src="webUrl + '/icon/icon-like.png'" class="img" />
|
||||
<text>{{ $formatCount(inn.zan) }}</text>
|
||||
<text>{{ inn.zan }}</text>
|
||||
</template>
|
||||
</view>
|
||||
<view class="flex flex-0 ai-end favorite-box" @click="doneFavorite">
|
||||
@@ -84,7 +84,7 @@
|
||||
mode="scaleToFill"
|
||||
class="icon"
|
||||
/>
|
||||
<text>{{ $formatCount(favoriteCount) }}</text>
|
||||
<text>{{ favoriteCount }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
@@ -148,21 +148,6 @@
|
||||
v-if="activeIndex === 3"
|
||||
class="info-section"
|
||||
>
|
||||
<view class="news-category">
|
||||
<view scroll-x class="news-category-scroll" show-scrollbar="false">
|
||||
<view class="news-category-wrapper">
|
||||
<view
|
||||
v-for="(item, index) in newsCategoryList"
|
||||
:key="index"
|
||||
class="category-item v12-mt-2"
|
||||
:class="{ active: newsCurrent === index }"
|
||||
@click="changeNewsTab(index)"
|
||||
>
|
||||
{{ item.name }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view>
|
||||
<view v-if="infoArray.length > 0" class="info-wrapper">
|
||||
<view class="info-list">
|
||||
@@ -207,24 +192,6 @@
|
||||
:id="'video-item' + index"
|
||||
:poster="item.video + '?vframe/jpg/offset/1'"></video>
|
||||
</view>
|
||||
<view
|
||||
v-if="item.linkHotelId"
|
||||
class="info-shop-entry"
|
||||
@click.stop="handleInfoHotelClick(item)"
|
||||
>
|
||||
<view class="info-shop-logo">
|
||||
<image :src="item.linkHotelLogo" mode="aspectFill" />
|
||||
</view>
|
||||
<view class="info-shop-main">
|
||||
<view class="info-shop-name">
|
||||
{{ item.linkHotelName || '' }}
|
||||
</view>
|
||||
<view class="info-shop-btn">
|
||||
<text style="margin-right: 6rpx;">点击进入</text>
|
||||
<u-icon name="arrow-rightward" size="14" color="#fff"></u-icon>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="info-item-bottom">
|
||||
<view class="time">
|
||||
{{ item.createTime ? item.createTime.replace(/-/g, '.').substr(0, 10) : '' }}
|
||||
@@ -235,7 +202,7 @@
|
||||
:src="webUrl + '/20230803152147141807.png'"
|
||||
class="icon"
|
||||
/>
|
||||
<text class="seeNum-txt">{{ $formatCount(item.pv) }}</text>
|
||||
<text class="seeNum-txt">{{ item.pv }}</text>
|
||||
</view>
|
||||
<view class="flex">
|
||||
<image
|
||||
@@ -254,84 +221,8 @@
|
||||
v-show="item.zan > 0"
|
||||
:class="item.hasZan ? 'on' : ''"
|
||||
class="seeNum-txt"
|
||||
>{{ $formatCount(item.zan) }}</text>
|
||||
|
||||
>{{ item.zan }}</text>
|
||||
</view>
|
||||
<view class="flex" @click="infoClick(item)">
|
||||
<u-icon name="chat" size="24"></u-icon>
|
||||
<text class="seeNum-txt">{{ $formatCount(item.replyCount) || 0}}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="comment-list v12-px-3" v-if="item.latestReplyList" @click="infoClick(item)">
|
||||
<view class="v12-mt-2" v-for="(comment, i) in item.latestReplyList" :key="i">
|
||||
<view class="user-info v12-align-center">
|
||||
<view class="user-avatar">
|
||||
<u-avatar :src="comment.userAvatar"></u-avatar>
|
||||
</view>
|
||||
<view class="user-name v12-ml-3">
|
||||
<view class="v12-font-bold v12-dark-text v12-font-32">
|
||||
<text>{{ comment.userNickName }}</text>
|
||||
<text v-if="comment.userIsAdmin" class="v12-ml-1 v12-primary v12-white-text v12-font-24 v12-font-weight-400 v12-px-1 v12-radius-8">
|
||||
{{ '店主' }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="v12-font-22 v12-secondary-dark-text v12-mt-1">
|
||||
<text>{{ formatterTime(comment.createTime) }}</text>
|
||||
<text v-if="comment.at">
|
||||
{{ ' 回复 ' + comment.at.atNickName }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="user-info v12-d-flex" >
|
||||
<view class="user-avatar">
|
||||
<view style="opacity: 0;">
|
||||
<u-avatar></u-avatar>
|
||||
</view>
|
||||
</view>
|
||||
<view class="user-name v12-ml-3">
|
||||
<view class="v12-font-28 v12-dark-text">
|
||||
{{ comment.reply }}
|
||||
</view>
|
||||
<view v-if="comment.children">
|
||||
<view class="v12-mt-2" v-for="(_comment, atIndex) in comment.children" :key="atIndex">
|
||||
<view class="user-info v12-align-center">
|
||||
<view class="user-avatar">
|
||||
<u-avatar size="35" :src="_comment.userAvatar"></u-avatar>
|
||||
</view>
|
||||
<view class="user-name v12-ml-3">
|
||||
<view class="v12-font-bold v12-dark-text v12-font-32">
|
||||
<text>{{ _comment.userNickName }}</text>
|
||||
<text v-if="_comment.userIsAdmin" class="v12-ml-1 v12-primary v12-white-text v12-font-24 v12-font-weight-400 v12-px-1 v12-radius-8">
|
||||
{{ '店主' }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="v12-font-22 v12-secondary-dark-text v12-mt-1">
|
||||
<text>{{ formatterTime(_comment.createTime) }}</text>
|
||||
<text v-if="_comment.at && _comment.parentReplyId !== comment.id">
|
||||
{{ ' 回复 ' + _comment.at.atNickName }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="user-info v12-align-center">
|
||||
<view class="user-avatar">
|
||||
<view style="opacity: 0;">
|
||||
<u-avatar size="35"></u-avatar>
|
||||
</view>
|
||||
</view>
|
||||
<view class="user-name v12-ml-3">
|
||||
<view class="v12-font-28 v12-dark-text">
|
||||
{{ _comment.reply }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
@@ -483,46 +374,7 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="card-wrap v12-mt-3">
|
||||
<view class="card-cont">
|
||||
<view class="file-wrap v12-radius-20" :class="[{'v12-align-center': investmentFileList.length === 0}, {'v12-justify-center': investmentFileList.length === 0}]">
|
||||
<view v-if="investmentFileList.length > 0" class="file-list">
|
||||
<view class="title v12-justify-between">
|
||||
<view class="title">
|
||||
<image
|
||||
:src="webUrl + '/page/qianxian/icon-02.png'"
|
||||
class="icon"
|
||||
/>
|
||||
招商政策
|
||||
</view>
|
||||
<view v-if="investmentFileList.length > 0" >
|
||||
<view @click="gotoInvestment('', 'investment')">
|
||||
更多政策>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="list-cont">
|
||||
<view
|
||||
v-for="(file, fileIndex) in investmentFileList"
|
||||
:key="fileIndex"
|
||||
class="file-item file-item2"
|
||||
@click="fileItemClick(file)"
|
||||
>
|
||||
<view class="name more-t">
|
||||
· {{ file.title }}
|
||||
</view>
|
||||
<image
|
||||
:src="webUrl + '/page/qianxian/icon-05.png'"
|
||||
class="icon"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view v-else class="no-data">暂无招商政策</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- <view class="project-wrap">
|
||||
<view class="project-wrap">
|
||||
<view class="title">
|
||||
<image
|
||||
:src="webUrl + '/page/qianxian/icon-01.png'"
|
||||
@@ -544,21 +396,20 @@
|
||||
</view>
|
||||
</view>
|
||||
<view v-else class="no-data">暂无产业项目</view>
|
||||
</view> -->
|
||||
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="industryTabIndex === 1">
|
||||
<view class="card-wrap">
|
||||
<!-- <image
|
||||
:src="webUrl + '/page/qianxian/card-bg3.png'"
|
||||
class="bg bg3"
|
||||
:src="webUrl + '/page/qianxian/card-bg2.png'"
|
||||
class="bg"
|
||||
/> -->
|
||||
<view class="card-cont">
|
||||
<view class="tab-wrap">
|
||||
<view
|
||||
v-for="(tab, tabIndex) in industryTab"
|
||||
:key="tabIndex"
|
||||
:class="industryTabIndex === tabIndex ? 'tab-item0' : ''"
|
||||
:class="industryTabIndex === tabIndex ? 'tab-item1' : ''"
|
||||
class="item"
|
||||
@click="industryTabItemClick(tabIndex)"
|
||||
>
|
||||
@@ -569,62 +420,41 @@
|
||||
{{ tab.name }}
|
||||
</view>
|
||||
</view>
|
||||
<view class="village-wrap v12-pt-3">
|
||||
<view class="v12-pa-2 sale-wrap">
|
||||
<view
|
||||
v-for="(type, typeIndex) in shopTypeList"
|
||||
:key="typeIndex"
|
||||
:class="{ saleActive: shopTypeActive === type.id }"
|
||||
@click="handleShopType(type)"
|
||||
>
|
||||
{{ type.name }}
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="shopList.length > 0" class="village-list">
|
||||
<view
|
||||
v-for="(shop, shopIndex) in shopList"
|
||||
:key="shopIndex"
|
||||
class="village-item v12-white"
|
||||
@click="hotelItemClick(shop)"
|
||||
>
|
||||
<view class="img-wrap">
|
||||
<view class="file-wrap" :class="[{'v12-align-center': investmentFileList.length === 0}, {'v12-justify-center': investmentFileList.length === 0}]">
|
||||
<view v-if="investmentFileList.length > 0" class="file-list">
|
||||
<view class="list-cont">
|
||||
<view
|
||||
v-for="(file, fileIndex) in investmentFileList"
|
||||
:key="fileIndex"
|
||||
class="file-item file-item2"
|
||||
@click="fileItemClick(file)"
|
||||
>
|
||||
<view class="name more-t">
|
||||
· {{ file.title }}
|
||||
</view>
|
||||
<image
|
||||
:src="shop.cover + (shop.coverType === 2 ? '?vframe/jpg/offset/1' : '')"
|
||||
class="img"
|
||||
:src="webUrl + '/page/qianxian/icon-05.png'"
|
||||
class="icon"
|
||||
/>
|
||||
<view class="location">
|
||||
<image
|
||||
:src="webUrl + '/page/qianxian/icon-08.png'"
|
||||
class="icon"
|
||||
/>
|
||||
<view class="addr one-t">
|
||||
{{ shop.address }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="info">
|
||||
<view class="intro more-t">
|
||||
{{ shop.content }}
|
||||
</view>
|
||||
<view class="name-wrap">
|
||||
<image
|
||||
:src="shop.logo"
|
||||
class="logo"
|
||||
/>
|
||||
<view class="name one-t">
|
||||
{{ shop.name }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view v-else class="no-data">暂无店铺</view>
|
||||
<view v-else class="no-data">暂无招商政策</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="investmentFileList.length > 0" class="more-btn-wrap">
|
||||
<view class="more-btn" @click="gotoInvestment('', 'investment')">
|
||||
更多政策
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="industryTabIndex === 2">
|
||||
<view class="card-wrap">
|
||||
<!-- <image
|
||||
:src="webUrl + '/page/qianxian/card-bg3.png'"
|
||||
class="bg bg3"
|
||||
/> -->
|
||||
<view class="card-cont">
|
||||
<view class="tab-wrap">
|
||||
<view
|
||||
@@ -669,11 +499,11 @@
|
||||
</view>
|
||||
<view class="info">
|
||||
<view class="intro more-t">
|
||||
{{ jiaLou.intro || '' }}
|
||||
{{ jiaLou.shopIntro }}
|
||||
</view>
|
||||
<view class="name-wrap">
|
||||
<image
|
||||
:src="jiaLou.avatar"
|
||||
:src="jiaLou.logo"
|
||||
class="logo"
|
||||
/>
|
||||
<view class="name one-t">
|
||||
@@ -881,7 +711,6 @@
|
||||
@ok="handleOk"
|
||||
/>
|
||||
<FunctionGuide @hide="setGuide('countyFamousIndex')" :maxStep="2" :guideData="functionGuideData" ref="FunctionGuide"></FunctionGuide>
|
||||
<AiEntrance />
|
||||
</view>
|
||||
</template>
|
||||
|
||||
@@ -903,9 +732,6 @@ import {
|
||||
getShareImg,
|
||||
getSaleList,
|
||||
getJiaLouList,
|
||||
getCityNewsCategory,
|
||||
getCityShopList,
|
||||
getCountyFamousHotelType
|
||||
} from '@/api/qianxian'
|
||||
import ProductWindow from '@/components/ProductWindow'
|
||||
import goCartMixin from '@/mixins/goCartMixins'
|
||||
@@ -917,14 +743,12 @@ import cookie from '@/utils/store/cookie'
|
||||
import { pageListenMixins } from '@/mixins/pageListenMixins'
|
||||
import FunctionGuide from '@/components/FunctionGuide'
|
||||
import GuideMixins from '@/mixins/GuideMixins'
|
||||
import AiEntrance from '@/components/aiChat/entrance'
|
||||
export default {
|
||||
components: {
|
||||
imgBox,
|
||||
XddProductItem,
|
||||
ProductWindow,
|
||||
FunctionGuide,
|
||||
AiEntrance
|
||||
FunctionGuide
|
||||
},
|
||||
mixins: [pageListenMixins, goCartMixin, GuideMixins],
|
||||
data() {
|
||||
@@ -981,7 +805,7 @@ export default {
|
||||
villageList: [],
|
||||
industryTab: [
|
||||
{ name: '项目', icon: '/page/qianxian/icon-04.png' },
|
||||
{ name: '店铺', icon: '/page/qianxian/icon-03.png' },
|
||||
{ name: '招商', icon: '/page/qianxian/icon-03.png' },
|
||||
{ name: '旅居', icon: '/page/qianxian/icon-03.png' },
|
||||
{ name: '租售', icon: '/page/qianxian/icon-07.png' }
|
||||
],
|
||||
@@ -991,23 +815,6 @@ export default {
|
||||
rightList: [],
|
||||
videoPlayers:[],
|
||||
jiaLouList: [],
|
||||
countyId: null,
|
||||
newsCategoryList: [],
|
||||
newsCurrent: 0,
|
||||
shopList: [],
|
||||
shopTypeList: [],
|
||||
shopTypeActive: '',
|
||||
}
|
||||
},
|
||||
onShareAppMessage() {
|
||||
uni.updateShareMenu({
|
||||
isPrivateMessage: false,
|
||||
withShareTicket: false
|
||||
})
|
||||
return {
|
||||
title: this.inn.countyName || this.share.title,
|
||||
path: '/pkg_product/views/famousQianxianShop?id=' + this.id,
|
||||
imageUrl: this.inn.cover || this.share.imageUrl
|
||||
}
|
||||
},
|
||||
// 必须在页面加 onPageScroll(e){} ,才能滑动显示背景
|
||||
@@ -1017,7 +824,6 @@ export default {
|
||||
onLoad(options) {
|
||||
const id = options.id || ''
|
||||
this.id = id
|
||||
|
||||
if (id) {
|
||||
this.partnerId = options.partnerId || null
|
||||
} else {
|
||||
@@ -1026,7 +832,6 @@ export default {
|
||||
const query = options ? decodeURIComponent(options.scene) : decodeURIComponent(obj.query.scene)
|
||||
this.partnerId = getUrlParam(query, 'partnerId') || null
|
||||
this.id = getUrlParam(query, 'id') || null
|
||||
|
||||
}
|
||||
}
|
||||
if (this.partnerId) cookie.set('spread', this.partnerId)
|
||||
@@ -1037,46 +842,8 @@ export default {
|
||||
this.getListReq()
|
||||
this.getsaleList()
|
||||
this.queryGuide('countyFamousIndex')
|
||||
this.getCityNewsCategoryReq()
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* 获取县城资讯类别
|
||||
*/
|
||||
getCityNewsCategoryReq() {
|
||||
getCityNewsCategory().then(res => {
|
||||
if(res.status === 200) {
|
||||
this.newsCategoryList = [{name: '全部', id: ''}].concat(res.data || [])
|
||||
}
|
||||
})
|
||||
},
|
||||
changeNewsTab(index) {
|
||||
if (this.newsCurrent === index) return
|
||||
this.newsCurrent = index
|
||||
this.getInfoReq()
|
||||
},
|
||||
formatterTime(time) {
|
||||
const now = new Date();
|
||||
const date = new Date(time);
|
||||
const diff = now - date;
|
||||
const diffMin = Math.floor(diff / 1000 / 60);
|
||||
const diffHour = Math.floor(diff / 1000 / 60 / 60);
|
||||
const diffDay = Math.floor(diff / 1000 / 60 / 60 / 24);
|
||||
if (diffMin < 1) {
|
||||
return "刚刚";
|
||||
} else if (diffHour < 1) {
|
||||
return diffMin + "分钟前";
|
||||
} else if (diffDay < 1) {
|
||||
return diffHour + "小时前";
|
||||
} else if (diffDay < 7) {
|
||||
return diffDay + "天前";
|
||||
} else {
|
||||
return date.getFullYear() + "年" + (date.getMonth() + 1) + "月" + date.getDate() + "日";
|
||||
}
|
||||
},
|
||||
infoClick(info) {
|
||||
this.$yrouter.push('/pkg_product/views/newsInfo?id=' + info.id)
|
||||
},
|
||||
showFunctionGuide() {
|
||||
if(this._step == this.functionGuideData.step) return
|
||||
if(this.functionGuideData.step == 1) {
|
||||
@@ -1307,7 +1074,6 @@ export default {
|
||||
getCountyFamousCityDetail(this.id).then(res => {
|
||||
const { success, data } = res
|
||||
if (success) {
|
||||
this.countyId = data.countyId
|
||||
const products = data.products || []
|
||||
const farmerShops = data.farmerShops || []
|
||||
this.leftList = this.newSort(products, farmerShops)
|
||||
@@ -1397,12 +1163,10 @@ export default {
|
||||
_this.isLoadInfoListSuccess = false
|
||||
_this.loading = true
|
||||
_this.infoArray = []
|
||||
const categoryId = this.newsCategoryList[this.newsCurrent] ? this.newsCategoryList[this.newsCurrent].id : ''
|
||||
getCountyFamousCityNews({
|
||||
page: 1,
|
||||
limit: 9999,
|
||||
countyFamousDataId: _this.id,
|
||||
categoryId: categoryId
|
||||
countyFamousDataId: _this.id
|
||||
}).then(res => {
|
||||
const { data } = res
|
||||
_this.loading = false
|
||||
@@ -1563,6 +1327,9 @@ export default {
|
||||
})
|
||||
})
|
||||
},
|
||||
infoClick(info) {
|
||||
// this.$yrouter.push('/pagesInn/inn/innInfoDetail?id=' + info.id)
|
||||
},
|
||||
coverPlay(){
|
||||
this.videoPlayers.forEach(player => {
|
||||
const playerCtx = uni.createVideoContext(player, this)
|
||||
@@ -1657,75 +1424,30 @@ export default {
|
||||
}
|
||||
})
|
||||
},
|
||||
handleInfoHotelClick(item) {
|
||||
if (!item || !item.linkHotelId) return
|
||||
const { linkType, linkHotelId } = item
|
||||
if (linkType === 'travel') {
|
||||
uni.navigateTo({ url: `/pkg_product/views/sojoumStore?id=${linkHotelId}` })
|
||||
return
|
||||
}
|
||||
this.hotelItemClick({ id: linkHotelId })
|
||||
},
|
||||
guideItemClickHandle(item) {
|
||||
// 如果没有开启专题页,则不进入
|
||||
if (!item.isContentPage) return
|
||||
uni.navigateTo({ url: `/pkg_product/views/famousQianxianTheme?id=${item.id}` })
|
||||
},
|
||||
sujoumeClickHandle(item) {
|
||||
if(item.dataType === 'countyFamousSojourn') {
|
||||
uni.navigateTo({ url: '/pkg_product/views/oldSojumStore?id=' + item.id })
|
||||
return
|
||||
}
|
||||
uni.navigateTo({ url: '/pkg_product/views/sojoumStore?id=' + item.id })
|
||||
console.log(item);
|
||||
uni.navigateTo({ url: '/pkg_product/views/sojoumStore?id=' + item.id })
|
||||
},
|
||||
industryTabItemClick(index) {
|
||||
if (index === this.industryTabIndex) return
|
||||
this.industryTabIndex = index
|
||||
if (index === 2) {
|
||||
if(index === 2) {
|
||||
const params = {
|
||||
countyId: this.countyId,
|
||||
shopType: 'countyFamous',
|
||||
name: '',
|
||||
countyFamousDataId: this.id,
|
||||
page: 1,
|
||||
limit: 9999
|
||||
}
|
||||
console.log(params);
|
||||
|
||||
getJiaLouList(params).then(res => {
|
||||
this.jiaLouList = res.data.records || []
|
||||
})
|
||||
}
|
||||
if (index === 1) {
|
||||
this.shopTypeActive = ''
|
||||
if (this.shopTypeList.length === 0) {
|
||||
this.getShopTypeList()
|
||||
}
|
||||
this.getShopList()
|
||||
}
|
||||
},
|
||||
getShopTypeList() {
|
||||
getCountyFamousHotelType().then(res => {
|
||||
const listData = Array.isArray(res.data)
|
||||
? res.data
|
||||
: (res.data && (res.data.hotelTypeList || res.data.list || res.data.records)) || []
|
||||
this.shopTypeList = [{ name: '全部', id: '' }].concat(listData || [])
|
||||
})
|
||||
},
|
||||
getShopList() {
|
||||
const params = {
|
||||
countyFamousDataId: this.id,
|
||||
page: 1,
|
||||
limit: 9999
|
||||
}
|
||||
if (this.shopTypeActive) {
|
||||
params.countyFamousHotelType = this.shopTypeActive
|
||||
}
|
||||
getCityShopList(params).then(res => {
|
||||
this.shopList = (res.data && (res.data.records || res.data.list)) || []
|
||||
})
|
||||
},
|
||||
handleShopType(type) {
|
||||
if (this.shopTypeActive === type.id) return
|
||||
this.shopTypeActive = type.id
|
||||
this.getShopList()
|
||||
},
|
||||
fileItemClick(file) {
|
||||
const url = file.attachment || ''
|
||||
@@ -1746,14 +1468,6 @@ export default {
|
||||
gotoInvestment(title = '', type = 'investment', id = '') {
|
||||
uni.navigateTo({ url: `/pkg_product/views/famousQianxianInvestment?id=${id || this.id}&title=${title}&type=${type}` })
|
||||
},
|
||||
hotelItemClick(item) {
|
||||
this.$yrouter.push({
|
||||
path: '/pagesInn/inn/innHome',
|
||||
query: {
|
||||
id: item.id
|
||||
}
|
||||
})
|
||||
},
|
||||
villageItemClick(item) {
|
||||
uni.navigateTo({ url: `/pkg_product/views/famousQianxianVillageShop?id=${item.id}` })
|
||||
}
|
||||
@@ -2137,31 +1851,6 @@ export default {
|
||||
padding: 22rpx;
|
||||
}
|
||||
.info-section {
|
||||
.news-category {
|
||||
padding-bottom: 20rpx;
|
||||
.news-category-scroll {
|
||||
white-space: nowrap;
|
||||
width: 100%;
|
||||
}
|
||||
.news-category-wrapper {
|
||||
overflow: scroll;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.category-item {
|
||||
display: inline-block;
|
||||
padding: 10rpx 30rpx;
|
||||
margin-right: 20rpx;
|
||||
border-radius: 16rpx;
|
||||
font-size: 28rpx;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
&.active {
|
||||
color: #fff;
|
||||
background: #C52733
|
||||
}
|
||||
}
|
||||
}
|
||||
.info-item + .info-item {
|
||||
margin: 22rpx 0 0 0;
|
||||
}
|
||||
@@ -2199,53 +1888,6 @@ export default {
|
||||
}
|
||||
}
|
||||
}
|
||||
.info-shop-entry {
|
||||
margin: 0 20rpx 16rpx 20rpx;
|
||||
padding: 16rpx 20rpx;
|
||||
border-radius: 12rpx;
|
||||
background-color: #fafafa;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
column-gap: 16rpx;
|
||||
}
|
||||
.info-shop-logo {
|
||||
width: 88rpx;
|
||||
height: 88rpx;
|
||||
border-radius: 12rpx;
|
||||
overflow: hidden;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.info-shop-logo image {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.info-shop-main {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
column-gap: 16rpx;
|
||||
}
|
||||
.info-shop-name {
|
||||
flex: 1;
|
||||
font-size: 28rpx;
|
||||
color: #333;
|
||||
font-weight: 500;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
width: 300rpx;
|
||||
}
|
||||
.info-shop-btn {
|
||||
padding: 8rpx 16rpx 8rpx 24rpx;
|
||||
border-radius: 999rpx;
|
||||
background-color: #C52733;
|
||||
color: #fff;
|
||||
font-size: 24rpx;
|
||||
flex-shrink: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.info-item-bottom {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user