Merge branch 'dev' into test

This commit is contained in:
lifizer
2024-07-25 08:55:23 +08:00
18 changed files with 259 additions and 166 deletions
+8
View File
@@ -228,3 +228,11 @@ export function setTopHotelNew(data) {
export function getHotelShareBackgroundImage(id) {
return request.get("/api/hotelMain/shareImage/" + id, {}, {login: true})
}
/**
* 店铺资讯
* @param id 店铺资讯ID int
* */
export function hotelNewsView(data) {
return request.post("/api/hotelNews/view", data, {login: true})
}
+3
View File
@@ -59,6 +59,9 @@
font-size: 24rpx;
text-align: right;
}
.value2 {
width: auto;
}
.red {
color: #FF564A;
+6
View File
@@ -67,6 +67,12 @@ export default {
computed: {
list() {
const temp = this.current === 0 ? this.twoList['usable'] : this.twoList['unusable']
if (this.current === 0) {
const localCouponId = uni.getStorageSync('couponId') || 0
temp.map(item => {
item.checked = localCouponId === item.id
})
}
return this.$global.deepClone(temp)
},
canUse() {
+1
View File
@@ -75,6 +75,7 @@
current: cind,
indicator: 'default'
});
this.$emit('click')
},
getheight() {
let that = this;
+13 -6
View File
@@ -207,12 +207,19 @@ export default {
goRefund(order) {
// fix bug#1631
if (this.type === 4 || parseInt(order._status._type) === 3) {
uni.showToast({
title: '订单已收货,如需退款请联系客服',
mask: false,
icon: 'none',
duration: 3000
})
// 打开售后的目的就是开启已完成/待评价订单的退款功能,确认打开售后之后,小程序用户再点击申请退款,就可以进入退款申请填写页面,正常走退款流程,提交退款申请以后,订单状态变为退款中
if (order.refundSystemStatus === 0) {
uni.showToast({
title: '订单已收货,如需退款请联系客服',
mask: false,
icon: 'none',
duration: 3000
})
} else {
uni.navigateTo({
url: `/pkg_orders/views/refund?id=${order.orderId}`
})
}
} else {
uni.navigateTo({
url: `/pkg_orders/views/refund?id=${order.orderId}`
-1
View File
@@ -432,7 +432,6 @@ export default {
item.checked = false
}
})
uni.removeStorageSync('couponId')
} else {
uni.removeStorageSync('couponId')
}
+35 -15
View File
@@ -154,19 +154,20 @@
<!-- v6服务项目开始 -->
<view class="service-section goods-section" v-if="storeInfo && storeInfo.isTickets!=1">
<view class="cell flex jc-between ai-center" @click="changeCoupons()" v-if="couponList['usable'].length>0">
<view>
<template v-for="(item, index) in couponList.usable">
<text
v-if="index < 2"
:key="index"
class="coupon-label tc"
>
{{ item.couponTitle }}
</text>
</template>
<view
v-if="couponListLimit2ToShow.length > 0"
class="cell flex jc-between ai-center"
@click="changeCoupons()"
>
<view
v-for="(item, index) in couponListLimit2ToShow"
:key="index"
class="coupon-label tc"
>
{{ item.couponTitle }}
</view>
<view class="value">优惠详情
<view class="value value2">
优惠详情
<uni-icons type="right" size="13" color="#707070"></uni-icons>
</view>
</view>
@@ -188,7 +189,9 @@
<view class="sub-title flex ai-end">
<image class="icon-time" :src="webUrl+'/20230106150523489905.png'" mode="scaleToFill"/>
<view class="text">
{{ storeInfo.isFastPost == 1 ? "预计48小时内发货" : "预计发货时间:" + storeInfo.postTime }}
<text v-if="storeInfo.isFastPost == 1">预计48小时内发货</text>
<text v-if="storeInfo.isFastPost == 2">预计72小时内发货</text>
<text v-if="storeInfo.isFastPost == 0">{{ "预计发货时间:" + storeInfo.postTime }}</text>
</view>
</view>
</view>
@@ -507,8 +510,9 @@ export default {
show: false,
uniqueId: null,
isFavorite: false,
pageKeyId: ''
};
pageKeyId: '',
couponListLimit2ToShow: []
}
},
computed: mapGetters(["isLogin", "location", "userInfo"]),
onShareAppMessage() {
@@ -917,6 +921,22 @@ export default {
// data.couponList['unusable']?.map(item => item.status = 2)
this.$set(this, 'couponList', data.couponList)
const usableList = data.couponList.usable
if (usableList.length > 0) {
const tempType = {}
const tempTypeArr = []
usableList.map(usableItem => {
if (!tempType[usableItem.type + '']) {
tempType[usableItem.type + ''] = 1
tempTypeArr.push(usableItem)
}
})
if (tempTypeArr.length >= 2) {
this.couponListLimit2ToShow = [tempTypeArr[0], tempTypeArr[1]]
} else {
this.couponListLimit2ToShow = [tempTypeArr[0]]
}
}
this.$set(this, 'replyCount', data.replyCount)
this.$set(this, 'replyChance', data.replyChance)
this.reply = data.reply ? [data.reply] : []
+34 -15
View File
@@ -232,6 +232,7 @@
controls
play-btn-position="center"
class="video-item"
@play="infoItemViewClick(item)"
/>
</view>
<view v-else>
@@ -240,6 +241,7 @@
:num="item.resources.length"
:img-radius="10"
style="width: 100%;"
@click="infoItemViewClick(item)"
/>
</view>
</view>
@@ -258,21 +260,21 @@
<view class="flex">
<image
v-if="!item.zanVo"
:src="webUrl + '/page/hotel/zan-off.png'"
:src="webUrl + '/page/hotel/zan-off-2.png'"
class="zan-off-icon"
@click="likeInfoItemHandle(item, index, 1)"
@click="likeInfoItemHandle(item, index, item.zan + 1, 1)"
/>
<image
v-else
:src="webUrl + '/page/hotel/zan-on.png'"
:src="webUrl + '/page/hotel/zan-on-2.png'"
class="zan-on-icon"
@click="likeInfoItemHandle(item, index, 0)"
@click="likeInfoItemHandle(item, index, item.zan -1, 0)"
/>
<!-- <image
:src="webUrl + '/20230803151302213857.png'"
class="icon"
/>
<text class="seeNum-txt">{{ item.zan }}</text> -->
<text
v-show="item.zan > 0"
:class="item.zanVo ? 'on' : ''"
class="seeNum-txt"
>{{ item.zan }}</text>
</view>
<view v-if="isMyInn" class="flex more-btn" @click="toggleMoreHandle(index)">
<image
@@ -422,7 +424,8 @@ import {
postHotelNewsDel,
setTopHotelNew,
getHotelNewsZan,
getHotelShareBackgroundImage
getHotelShareBackgroundImage,
hotelNewsView
} from "@/api/inn.js"
import {formatDateTime} from "@/utils"
import {getUrlParam} from "@/utils/common.js"
@@ -657,6 +660,17 @@ export default {
infoClick: function (info) {
// this.$yrouter.push('/pagesInn/inn/innInfoDetail?id=' + info.id)
},
infoItemViewClick(item) {
uni.$u.debounce(() => {
hotelNewsView({ id: item.id }).finally(() => {
this.infoArray.map(info => {
if (info.id === item.id) {
info.pv += 1
}
})
})
}, 500)
},
publishBtnClick: function () {
this.$yrouter.push('/pagesInn/inn/innInfoPublish?hotelId=' + this.inn.id)
},
@@ -916,15 +930,15 @@ export default {
}, 3000)
})
},
likeInfoItemHandle(item, index, value) {
likeInfoItemHandle(item, index, value, voValue) {
getHotelNewsZan(item.id).then(res => {
const { success } = res
if (success) {
this.$dialog.toast({
mes: '操作成功!'
})
this.$set(this.infoArray[index], 'zanVo', value)
// this.fetchInnInfoList()
this.$set(this.infoArray[index], 'zan', value)
this.$set(this.infoArray[index], 'zanVo', voValue)
}
})
}
@@ -1374,13 +1388,18 @@ export default {
margin: 0 8rpx 0 0;
}
.zan-off-icon {
width: 138rpx;
width: 40rpx;
height: 40rpx;
}
.zan-on-icon {
width: 80rpx;
width: 40rpx;
height: 40rpx;
}
.seeNum-txt {
&.on {
color: #D81E06;
}
}
.more-btn {
position: relative;
.more-wrapper {
+12 -12
View File
@@ -330,36 +330,36 @@ export default {
})
},
submit() {
if (this.innApplyInfo.logo.length === 0) {
this.$dialog.error('请上传店铺LOGO图片')
if (!this.innApplyInfo.logo) {
this.$dialog.error('请上传店铺LOGO')
return
}
if (this.innApplyInfo.cover.length === 0 && this.innApplyInfo.coverType === 1) {
if (!this.innApplyInfo.cover && this.innApplyInfo.coverType === 1) {
this.$dialog.error('请上传店铺封面图片')
return
}
if (this.innApplyInfo.coverVideo.length === 0 && this.innApplyInfo.coverType === 2) {
if (!this.innApplyInfo.coverVideo && this.innApplyInfo.coverType === 2) {
this.$dialog.error('请上传店铺封面视频')
return
}
if (this.innApplyInfo.ownerName.length === 0) {
if (!this.innApplyInfo.ownerName) {
this.$dialog.error('请输入店主名字')
return
}
if (this.innApplyInfo.content.length === 0) {
if (!this.innApplyInfo.content) {
this.$dialog.error('请输入一句话介绍')
return
}
if (this.innApplyInfo.desc.length === 0) {
this.$dialog.error('请输入店铺简介')
return
}
// if (!this.innApplyInfo.desc) {
// this.$dialog.error('请输入店铺简介')
// return
// }
if (this.uploadedFilesArray.length === 0) {
this.$dialog.error('请上传至少一张店铺图片')
this.$dialog.error('请上传店铺图片')
return
}
if (this.uploadedQualificationFilesArray.length === 0) {
this.$dialog.error('请上传至少一张店铺资质图片')
this.$dialog.error('请上传资质图片')
return
}
// 深拷贝
+6 -16
View File
@@ -49,15 +49,13 @@
</template>
<script>
import {userUnionId} from "@/api/public";
export default {
name: "room",
data() {
return {
webUrl: this.$VUE_APP_RESOURCES_URL,
token: null,
unionId: null,
uid: null,
userInfo: null,
storeId: null,
merName: null,
@@ -82,7 +80,8 @@ export default {
}
this.token = uni.getStorageSync("login_status");
this.userInfo = uni.getStorageSync("userInfo");
this.getUnionId();
this.uid = this.userInfo.uid
this.connectSocketInit()
},
onUnload() {
if (this.socketOpen) {
@@ -90,15 +89,6 @@ export default {
}
},
methods: {
getUnionId() {
userUnionId().then(res => {
if (res.success) {
this.unionId = res.data;
this.connectSocketInit();
}
});
},
getUploadToken() {
let that = this;
@@ -136,7 +126,7 @@ export default {
let param = {
type: "msg",
user_type: 0,
unionid: that.unionId,
uid: that.uid,
username: that.userInfo.nickname,
header: that.userInfo.avatar,
room_id: that.roomId,
@@ -201,7 +191,7 @@ export default {
let param = {
type: "msg",
user_type: 0,
unionid: this.unionId,
uid: this.uid,
username: this.userInfo.nickname,
header: this.userInfo.avatar,
room_id: this.roomId,
@@ -217,7 +207,7 @@ export default {
let param = {
type: "join",
user_type: 0,
unionid: this.unionId,
uid: this.uid,
username: this.userInfo.nickname,
header: this.userInfo.avatar,
store_id: this.storeId
+24 -27
View File
@@ -1,17 +1,21 @@
<template>
<view class="common-roomLogs">
<view class="item flex" v-for="(item,index) in list" :key="index" @click="goRoom(item)"
v-if="list.length>0">
<image class="cover flex-0" :src="item.store_avatar || webUrl+'/20221114155314348118.png'"/>
<view>
<view class="flex jc-between ai-center">
<view class="name">{{ item.store_name }}</view>
<view class="datetime" v-if="item.last_msg">{{ item.last_msg.created_at }}</view>
<view v-if="list.length > 0">
<view
v-for="(item,index) in list"
:key="index" @click="goRoom(item)"
class="item flex"
>
<image class="cover flex-0" :src="item.store_avatar || webUrl+'/20221114155314348118.png'"/>
<view>
<view class="flex jc-between ai-center">
<view class="name">{{ item.store_name }}</view>
<view class="datetime" v-if="item.last_msg">{{ item.last_msg.created_at }}</view>
</view>
<view class="sub one-t" v-if="item.last_msg">{{ item.last_msg.msg_type===0?item.last_msg.msg_content:'[图片]' }}</view>
</view>
<view class="sub one-t" v-if="item.last_msg">{{ item.last_msg.msg_type===0?item.last_msg.msg_content:'[图片]' }}</view>
</view>
</view>
<view class="v4-nodata" v-if="list.length===0">
<image src="@/static/images/img_nodata.png" mode="scaleToFill"/>
<view class="text">暂无数据</view>
@@ -20,42 +24,35 @@
</template>
<script>
import {userUnionId} from "@/api/public";
import { mapGetters } from 'vuex'
export default {
name: "roomLogs",
name: 'RoomLogs',
data() {
return {
webUrl:this.$VUE_APP_RESOURCES_URL,
unionId: null,
uid: null,
list: []
}
},
computed: mapGetters(['userInfo']),
onShow() {
this.getUnionId();
this.uid = this.userInfo.uid
this.fetchList()
},
methods: {
goRoom(item) {
uni.navigateTo({url: `/pkg_common/views/room?id=${item.store_id}&name=${item.store_name}`})
},
getUnionId() {
userUnionId().then(res => {
if (res.success) {
this.unionId = res.data;
this.fetchList();
}
});
},
fetchList() {
const _this = this
uni.request({
url: this.$SERVICE_API_URL + "/customer-chat-list",
method: "POST",
data: {unionid: this.unionId},
url: _this.$SERVICE_API_URL + '/customer-chat-list',
method: 'POST',
data: {uid: _this.uid},
success: res => {
if (res.data.status_code === 200) {
this.list = res.data.content;
_this.list = res.data.content
}
}
})
+19 -16
View File
@@ -218,6 +218,7 @@
<u-input
v-model="form.phone"
:disabled="reviewing"
maxlength="11"
type="number"
border="none"
placeholder="请填写联系方式"
@@ -537,8 +538,8 @@ export default {
},
getCode() {
if (this.reviewing) return
if (this.form.phone.length === 0) {
uni.$u.toast('请输入手机号')
if (!this.form.phone) {
uni.$u.toast('请输入手机号')
return
}
if (this.form.phone.length !== 11) {
@@ -584,20 +585,22 @@ export default {
}
this.isDraft = data.isDraft
this.reviewStatus = data.reviewStatus
switch (data.reviewStatus) {
case 0:
this.stateTitle = '审核中'
this.stateType = 'primary'
this.reviewing = true
break
case 1:
this.reviewing = false
break
case 2:
this.stateTitle = '审核驳回:' + data.reviewMsg
this.stateType = 'error'
this.reviewing = false
break
if (data.isDraft !== 1) {
switch (data.reviewStatus) {
case 0:
this.stateTitle = '审核中'
this.stateType = 'primary'
this.reviewing = true
break
case 1:
this.reviewing = false
break
case 2:
this.stateTitle = '审核驳回:' + data.reviewMsg
this.stateType = 'error'
this.reviewing = false
break
}
}
if (data.hotelInfo) {
// 店铺图片
+20 -17
View File
@@ -76,6 +76,7 @@
<template #value>
<u-input
v-model="formSupplier.phone"
maxlength="11"
:disabled="reviewing"
type="number"
border="none"
@@ -718,11 +719,11 @@ export default {
},
getCode() {
if (this.reviewing) return
if (this.form.phone.length === 0) {
uni.$u.toast('请输入手机号')
if (!this.formSupplier.phone) {
uni.$u.toast('请输入手机号')
return
}
if (this.form.phone.length !== 11) {
if (this.formSupplier.phone.length !== 11) {
uni.$u.toast('请输入11位手机号')
return
}
@@ -765,20 +766,22 @@ export default {
}
this.isDraft = data.isDraft
this.reviewStatus = data.reviewStatus
switch (data.reviewStatus) {
case 0:
this.stateTitle = '审核中'
this.stateType = 'primary'
this.reviewing = true
break
case 1:
this.reviewing = false
break
case 2:
this.stateTitle = '审核驳回:' + data.reviewMsg
this.stateType = 'error'
this.reviewing = false
break
if (data.isDraft !== 1) {
switch (data.reviewStatus) {
case 0:
this.stateTitle = '审核中'
this.stateType = 'primary'
this.reviewing = true
break
case 1:
this.reviewing = false
break
case 2:
this.stateTitle = '审核驳回:' + data.reviewMsg
this.stateType = 'error'
this.reviewing = false
break
}
}
if (data.hotelInfo) {
// 店铺图片
+34 -21
View File
@@ -77,6 +77,7 @@
<u-input
v-model="form.phone"
:disabled="reviewing"
maxlength="11"
type="number"
border="none"
placeholder="请填写联系方式"
@@ -136,11 +137,16 @@
v-if="!form.qualification"
class="btn-upload"
>上传图片</view>
<image
v-else
:src="form.qualification"
class="img-preview"
/>
<view v-else>
<view v-if="qualificationArr.length > 0" class="flex">
<image
v-for="(item, index) in qualificationArr"
:key="index"
:src="item"
class="img-preview"
/>
</view>
</view>
</view>
</template>
</u-cell>
@@ -298,6 +304,7 @@ export default {
},
district: [],
address: {},
qualificationArr: [],
isAgree: false,
show: false,
notice: '',
@@ -327,8 +334,8 @@ export default {
},
getCode() {
if (this.reviewing) return
if (this.form.phone.length === 0) {
uni.$u.toast('请输入手机号')
if (!this.form.phone) {
uni.$u.toast('请输入手机号')
return
}
if (this.form.phone.length !== 11) {
@@ -372,23 +379,28 @@ export default {
this.isDraft = data.isDraft
this.reviewStatus = data.reviewStatus
}
switch (data.reviewStatus) {
case 0:
this.stateTitle = '审核中'
this.stateType = 'primary'
this.reviewing = true
break;
case 1:
this.reviewing = false
break;
case 2:
this.stateTitle = '审核驳回:' + data.reviewMsg
this.stateType = 'error'
this.reviewing = false
break;
if (data.isDraft !== 1) {
switch (data.reviewStatus) {
case 0:
this.stateTitle = '审核中'
this.stateType = 'primary'
this.reviewing = true
break;
case 1:
this.reviewing = false
break;
case 2:
this.stateTitle = '审核驳回:' + data.reviewMsg
this.stateType = 'error'
this.reviewing = false
break;
}
}
if (data.wholesalerInfo) {
this.form = data.wholesalerInfo
if (this.form.qualification) {
this.qualificationArr = this.form.qualification.split(',')
}
this.form.position = this.$forceToDecimal(this.form.longitude, 6) + ',' + this.$forceToDecimal(this.form.latitude, 6)
this.form.area = `${this.form.provinceName} ${this.form.cityName} ${this.form.areaName}`
}
@@ -403,6 +415,7 @@ export default {
break
case 'licence':
this.form.qualification = img
this.qualificationArr = [img]
break
}
})
+2 -2
View File
@@ -258,8 +258,8 @@ export default {
font-size: 12px;
color: #fff;
.good-img {
width: 96px;
height: 96px;
width: 90px;
height: 90px;
.img {
width: 100%;
height: 100%;
+17 -9
View File
@@ -7,13 +7,13 @@
type="text"
placeholder="搜索内容"
placeholder-style="color:#949494"
@confirm="search"
@confirm="searchClick"
>
<image
:src="webUrl+'/20220903142935869059.png'"
class="icon"
mode="scaleToFill"
@click="search"
@click="searchClick"
/>
</view>
<swiper
@@ -101,7 +101,7 @@
@click="goStore(item.id)"
>
<image
:src="item.cover"
:src="item.cover + (item.coverType === 2 ? '?vframe/jpg/offset/1' : '')"
class="cover"
mode="scaleToFill"
/>
@@ -115,7 +115,11 @@
<view class="one-t">{{ item.name }}</view>
</view>
</view>
<view class="item" @click="goGoods(item.id)" v-else>
<view
v-else
class="item"
@click="goGoods(item.id)"
>
<image
:src="item.image"
class="cover"
@@ -178,7 +182,7 @@ export default {
})
fetchCity(4).then(({data}) => {
this.asideList = data.group
this.search()
this.searchReq()
})
},
changeTab(index) {
@@ -187,13 +191,17 @@ export default {
this.page = 1
this.dataList = []
this.tabIndex = index
this.search()
this.searchReq()
},
onLower() {
this.page++
this.search()
this.searchReq()
},
search() {
searchClick() {
this.page = 1
this.searchReq()
},
searchReq() {
let param = {
page: this.page,
limit: 10,
@@ -235,7 +243,7 @@ export default {
this.asideIndex = index
this.page = 1
this.dataList = []
this.search()
this.searchReq()
},
goStore(id) {
uni.navigateTo({
+24 -8
View File
@@ -1,15 +1,33 @@
<template>
<view class="container">
<mescroll-body ref="mescrollRef" top="0" bottom="0" class='cotent-scroll' :up="upOption" :down="downOption"
@up="upCallback" @down="downCallback" @init="mescrollInit" @emptyclick="emptyClick">
<mescroll-body
ref="mescrollRef"
:up="upOption"
:down="downOption"
top="0"
bottom="0"
class='cotent-scroll'
@up="upCallback"
@down="downCallback"
@init="mescrollInit"
@emptyclick="emptyClick"
>
<view id="dataList" class="data-list acea-row row-column">
<view class="item acea-row row-column" :style="{'background':card.bgColor}" :key="index"
v-for="(card, index) in list" @click="cardClick(card)">
<view
v-for="(card, index) in list"
:key="index"
:style="{'background':card.bgColor}"
class="item acea-row row-column"
@click="cardClick(card)"
>
<view class="acea-row row-column">
<view class="acea-row row-between">
<view class="txt-bankname">{{ card.bankName }}</view>
<view class="unbind-btn" @click="unbindCard(index)">解除绑定</view>
<view
v-if="!isSelectMode"
class="unbind-btn"
@click.stop="unbindCard(index)"
>解除绑定</view>
</view>
<view class="acea-row row-middle" style="margin-top: 58rpx;flex-wrap: nowrap;">
<view class="acea-row row-left" style="flex: 1;margin-right: 18rpx;">
@@ -151,8 +169,6 @@ export default {
// });
uni.setStorageSync("selectedBankCard", JSON.stringify(card));
this.$yrouter.back();
} else {
}
},
addBtnClick: function () {
+1 -1
View File
@@ -20,7 +20,7 @@
<view class="list flex flex-wrap" v-if="list.length">
<view class="item" v-for="item in list" :key="item.id" @click="goStore(item)">
<image class="image" :src="item.cover" mode="scaleToFill"></image>
<image class="image" :src="item.cover + (item.coverType === 2 ? '?vframe/jpg/offset/1' : '')" mode="scaleToFill"></image>
<view class="title more-t">{{ item.content }}</view>