wangfukang 7 days ago
parent
commit
db1cc936d6
  1. 7
      package2/IdleTrad/chat.vue
  2. 270
      package2/IdleTrad/detail.vue
  3. 92
      package2/IdleTrad/sessionList.vue
  4. 2
      package2/group/groupBuyList.vue
  5. 7
      package2/group/groupBuySingle.vue
  6. 4
      package2/group/studentStoreList.vue
  7. 13
      package2/myCenter/myPost.vue
  8. 22
      package2/seckill/seckillGroup.vue

7
package2/IdleTrad/chat.vue

@ -34,7 +34,7 @@
:key="item.id" :key="item.id"
:id="'msg-' + item.id" :id="'msg-' + item.id"
> >
<image class="avatar" :src="item.mine ? myAvatar : peerAvatar" mode="aspectFill"></image> <image class="avatar" :src="defaultAvatar" mode="aspectFill"></image>
<view class="message-main"> <view class="message-main">
<view class="bubble text-bubble" :class="{ failed: item.localState == 'failed' }" v-if="item.messageType == 1">{{item.content}}</view> <view class="bubble text-bubble" :class="{ failed: item.localState == 'failed' }" v-if="item.messageType == 1">{{item.content}}</view>
<view class="bubble image-bubble" :class="{ failed: item.localState == 'failed' }" v-else> <view class="bubble image-bubble" :class="{ failed: item.localState == 'failed' }" v-else>
@ -88,8 +88,7 @@
draft: '', draft: '',
scrollIntoView: 'chat-bottom', scrollIntoView: 'chat-bottom',
selfId: String(uni.getStorageSync('id') || ''), selfId: String(uni.getStorageSync('id') || ''),
myAvatar: uni.getStorageSync('avatar') || 'https://jewel-shop.oss-cn-beijing.aliyuncs.com/801c569079da4540990c1cc634186fdd.png', defaultAvatar: '/static/images/img/songshu.png',
defaultAvatar: 'https://jewel-shop.oss-cn-beijing.aliyuncs.com/801c569079da4540990c1cc634186fdd.png',
socketReady: false socketReady: false
} }
}, },
@ -117,7 +116,7 @@
return this.selfId == String(this.session.sellerId) ? '买家同学' : (this.goods.userName || '卖家同学') return this.selfId == String(this.session.sellerId) ? '买家同学' : (this.goods.userName || '卖家同学')
}, },
peerAvatar() { peerAvatar() {
return (this.goods && this.goods.userAvatar) || this.defaultAvatar return this.defaultAvatar
} }
}, },
onLoad(options) { onLoad(options) {

270
package2/IdleTrad/detail.vue

@ -3,7 +3,7 @@
<view class="nav" :style="{ paddingTop: statusBarTop + 'px' }"> <view class="nav" :style="{ paddingTop: statusBarTop + 'px' }">
<view class="nav-btn" @tap="back"><uni-icons type="left" size="24" color="#18372f"></uni-icons></view> <view class="nav-btn" @tap="back"><uni-icons type="left" size="24" color="#18372f"></uni-icons></view>
<view class="nav-title">{{isWant ? '求购详情' : '闲置详情'}}</view> <view class="nav-title">{{isWant ? '求购详情' : '闲置详情'}}</view>
<view class="nav-btn" @tap="share"><uni-icons type="redo" size="22" color="#18372f"></uni-icons></view> <view class="nav-btn"></view>
</view> </view>
<scroll-view scroll-y class="content-scroll" :style="{ paddingTop: navHeight + 'px' }"> <scroll-view scroll-y class="content-scroll" :style="{ paddingTop: navHeight + 'px' }">
@ -31,6 +31,9 @@
<view class="price">{{isWant ? '预算 ¥' : '¥'}}{{displayPrice}}</view> <view class="price">{{isWant ? '预算 ¥' : '¥'}}{{displayPrice}}</view>
<view class="origin" v-if="!isWant && goods.originPrice">¥{{goods.originPrice}}</view> <view class="origin" v-if="!isWant && goods.originPrice">¥{{goods.originPrice}}</view>
<view class="sale-status">{{saleStatusText}}</view> <view class="sale-status">{{saleStatusText}}</view>
<button class="card-share-btn" open-type="share">
<uni-icons type="redo" size="18" color="#21b886"></uni-icons>
</button>
</view> </view>
<view class="title">{{goods.title}}</view> <view class="title">{{goods.title}}</view>
<view class="meta"> <view class="meta">
@ -79,17 +82,18 @@
<image :src="item.userAvatar || defaultAvatar" mode="aspectFill"></image> <image :src="item.userAvatar || defaultAvatar" mode="aspectFill"></image>
<view class="comment-main"> <view class="comment-main">
<view class="comment-name"> <view class="comment-name">
{{item.userName || '校园同学'}} 半径同学
<text v-if="item.sellerReply">卖家</text> <text v-if="item.sellerReply">卖家</text>
</view> </view>
<view class="comment-content">{{item.content}}</view> <view class="comment-content">{{item.content}}</view>
<view class="reply-list" v-if="item.replies && item.replies.length"> <view class="reply-list" v-if="item.replies && item.replies.length">
<view class="reply-item" v-for="reply in item.replies" :key="reply.id"> <view class="reply-item" v-for="reply in item.replies" :key="reply.id">
<text class="reply-name">{{reply.userName || '校园同学'}}</text> <text class="reply-name">半径同学</text>
<text class="seller-badge" v-if="reply.sellerReply">卖家</text> <text class="seller-badge" v-if="reply.sellerReply">卖家</text>
<text class="reply-target" v-if="reply.replyToUserName"> 回复 {{reply.replyToUserName}}</text> <text class="reply-target" v-if="reply.replyToUserName"> 回复 {{reply.replyToUserName}}</text>
<text>{{reply.content}}</text> <text>{{reply.content}}</text>
<text class="reply-action" @tap="replyComment(item, reply)">回复</text> <text class="reply-action" @tap="replyComment(item, reply)">回复</text>
<text class="reply-action reply-delete" v-if="reply.userId == currentUserId" @tap="deleteComment(reply)">删除</text>
</view> </view>
</view> </view>
<view class="comment-actions"> <view class="comment-actions">
@ -137,7 +141,7 @@
</view> </view>
<view class="bar-action" v-if="!isWant" @tap="favorite"> <view class="bar-action" v-if="!isWant" @tap="favorite">
<uni-icons :type="goods && goods.favorited ? 'star-filled' : 'star'" size="22" :color="goods && goods.favorited ? '#ffb22d' : '#59706a'"></uni-icons> <uni-icons :type="goods && goods.favorited ? 'star-filled' : 'star'" size="22" :color="goods && goods.favorited ? '#ffb22d' : '#59706a'"></uni-icons>
<text>收藏</text> <text>收藏 {{favoriteCountText}}</text>
</view> </view>
<view class="bar-action" @tap="reportGoods"> <view class="bar-action" @tap="reportGoods">
<uni-icons type="flag" size="22" color="#59706a"></uni-icons> <uni-icons type="flag" size="22" color="#59706a"></uni-icons>
@ -145,6 +149,17 @@
</view> </view>
<view class="consult-btn" @tap="consult">{{isWant ? '我有货' : '立即咨询'}}</view> <view class="consult-btn" @tap="consult">{{isWant ? '我有货' : '立即咨询'}}</view>
</view> </view>
<view class="page-like-effect" v-if="pageLikeEffects.length">
<view
class="page-like-heart"
:class="effect.className"
:style="effect.style"
v-for="effect in pageLikeEffects"
:key="effect.id"
>
<view class="page-like-heart-shape"></view>
</view>
</view>
<ie-auth-dialog /> <ie-auth-dialog />
</view> </view>
</template> </template>
@ -164,6 +179,7 @@
} from '@/common/fishMarketApi.js' } from '@/common/fishMarketApi.js'
import { getIeProfile } from '@/common/ieApi.js' import { getIeProfile } from '@/common/ieApi.js'
import { ensureIeVerifiedBeforeAction } from '@/common/ieRealNameAuth.js' import { ensureIeVerifiedBeforeAction } from '@/common/ieRealNameAuth.js'
import { buildHomeSharePath } from '@/utils/sharePath.js'
import IeAuthDialog from '@/package2/components/ie-auth-dialog/ie-auth-dialog.vue' import IeAuthDialog from '@/package2/components/ie-auth-dialog/ie-auth-dialog.vue'
export default { export default {
@ -184,9 +200,13 @@
commentSubmitting: false, commentSubmitting: false,
replyTarget: {}, replyTarget: {},
defaultAvatar: '', defaultAvatar: '',
defaultShareImage: '/static/images/img/songshu.png',
currentUserId: uni.getStorageSync('id') || '', currentUserId: uni.getStorageSync('id') || '',
currentImageIndex: 0, currentImageIndex: 0,
imageHeights: {} imageHeights: {},
likeEffectSeq: 0,
likeEffectTimers: {},
pageLikeEffects: []
} }
}, },
computed: { computed: {
@ -238,19 +258,47 @@
}, },
commentPlaceholder() { commentPlaceholder() {
return this.replyTarget && this.replyTarget.id ? '回复 ' + (this.replyTarget.userName || '校园同学') : '写下你的评论' return this.replyTarget && this.replyTarget.id ? '回复 ' + (this.replyTarget.userName || '校园同学') : '写下你的评论'
},
favoriteCountText() {
return this.goods && this.goods.favoriteCount ? this.goods.favoriteCount : 0
} }
}, },
onLoad(options) { onLoad(options) {
this.id = options && options.id ? options.id : '' this.id = options && options.id ? options.id : ''
this.detailType = options && options.type == 'want' ? 'want' : 'goods' this.detailType = options && options.type == 'want' ? 'want' : 'goods'
if (uni.getMenuButtonBoundingClientRect) { if (uni.getMenuButtonBoundingClientRect) {
this.statusBarTop = uni.getMenuButtonBoundingClientRect().top || this.statusBarTop const rect = uni.getMenuButtonBoundingClientRect()
this.statusBarTop = rect.top || this.statusBarTop
} }
this.load() this.load()
}, },
onShareAppMessage() {
return this.buildShareInfo()
},
onShareTimeline() {
const info = this.buildShareInfo()
return {
title: info.title,
query: info.path.split('?')[1] || '',
imageUrl: info.imageUrl
}
},
onUnload() {
Object.keys(this.likeEffectTimers || {}).forEach(key => {
clearTimeout(this.likeEffectTimers[key])
})
this.likeEffectTimers = {}
},
methods: { methods: {
back() { back() {
uni.navigateBack() const pages = getCurrentPages ? getCurrentPages() : []
if (pages && pages.length > 1) {
uni.navigateBack()
return
}
uni.reLaunch({
url: '/pages/index/index?tabIndex=3'
})
}, },
load() { load() {
if (!this.id) return if (!this.id) return
@ -381,19 +429,48 @@
}) })
}, },
likeComment(item) { likeComment(item) {
const shouldAnimate = !item.liked
if (shouldAnimate) {
this.playLikeEffect()
}
toggleFishLike({ commentId: item.id, likeType: 'comment' }).then(res => { toggleFishLike({ commentId: item.id, likeType: 'comment' }).then(res => {
if (!res) return if (!res) return
this.$set(item, 'liked', !!res.liked)
item.likeCount = Number(res.count) || 0 item.likeCount = Number(res.count) || 0
}) })
}, },
favorite() { favorite() {
if (!this.goods) return if (!this.goods) return
const shouldAnimate = !this.goods.favorited
if (shouldAnimate) {
this.playLikeEffect()
}
toggleFishFavorite(this.id).then(res => { toggleFishFavorite(this.id).then(res => {
if (!res) return if (!res) return
this.$set(this.goods, 'favorited', !!res.favorited) this.$set(this.goods, 'favorited', !!res.favorited)
this.$set(this.goods, 'favoriteCount', Number(res.count) || 0) this.$set(this.goods, 'favoriteCount', Number(res.count) || 0)
}) })
}, },
playLikeEffect() {
const burstId = Date.now() + '-' + (++this.likeEffectSeq)
const tracks = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight']
const effects = tracks.map((name, index) => ({
id: burstId + '-' + index,
className: 'page-like-heart--' + name,
style: `left:${6 + ((index * 59) % 86)}%; animation-delay:${index * 95}ms;`
}))
this.pageLikeEffects = effects
const timerKey = 'page'
if (this.likeEffectTimers[timerKey]) {
clearTimeout(this.likeEffectTimers[timerKey])
}
this.likeEffectTimers[timerKey] = setTimeout(() => {
if (this.pageLikeEffects.length && String(this.pageLikeEffects[0].id).indexOf(burstId) === 0) {
this.pageLikeEffects = []
}
delete this.likeEffectTimers[timerKey]
}, 3050)
},
reportGoods() { reportGoods() {
this.report({ complaintType: this.isWant ? 'want' : 'goods', goodsId: this.id }) this.report({ complaintType: this.isWant ? 'want' : 'goods', goodsId: this.id })
}, },
@ -434,7 +511,27 @@
}) })
}, },
share() { share() {
// #ifdef MP-WEIXIN
uni.showShareMenu({
withShareTicket: true,
menus: ['shareAppMessage', 'shareTimeline']
})
uni.showToast({ title: '请点击右上角分享', icon: 'none' })
// #endif
// #ifndef MP-WEIXIN
uni.showToast({ title: '请使用右上角分享', icon: 'none' }) uni.showToast({ title: '请使用右上角分享', icon: 'none' })
// #endif
},
buildShareInfo() {
const title = this.goods && this.goods.title ? this.goods.title : (this.isWant ? '校园二手求购' : '校园二手商品')
const prefix = this.isWant ? '同学正在求购:' : '校园二手好物:'
const typeQuery = this.isWant ? '&type=want' : ''
const targetPath = `/package2/IdleTrad/detail?id=${this.id || ''}${typeQuery}`
return {
title: prefix + title,
path: buildHomeSharePath(targetPath),
imageUrl: this.imageList.length ? this.imageList[0] : this.defaultShareImage
}
}, },
copyText(text, title) { copyText(text, title) {
if (!text) return if (!text) return
@ -554,6 +651,25 @@
font-weight: 800; font-weight: 800;
} }
.card-share-btn {
width: 48rpx;
height: 48rpx;
margin: 0 0 0 12rpx;
padding: 0;
display: flex;
align-items: center;
justify-content: center;
border: 0;
border-radius: 24rpx;
background: #e8fbf3;
line-height: 48rpx;
flex-shrink: 0;
}
.card-share-btn::after {
border: 0;
}
.title { .title {
margin-top: 16rpx; margin-top: 16rpx;
font-size: 34rpx; font-size: 34rpx;
@ -752,6 +868,10 @@
font-weight: 900; font-weight: 900;
} }
.reply-delete {
color: #ef4c3f;
}
.comment-actions { .comment-actions {
margin-top: 10rpx; margin-top: 10rpx;
display: flex; display: flex;
@ -881,6 +1001,142 @@
line-height: 82rpx; line-height: 82rpx;
} }
.page-like-effect {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
overflow: hidden;
pointer-events: none;
z-index: 99999;
}
.page-like-heart {
position: absolute;
bottom: -230rpx;
width: 120rpx;
height: 120rpx;
opacity: 0;
transform-origin: center;
animation-duration: 2600ms;
animation-timing-function: cubic-bezier(.14, .66, .22, 1);
animation-fill-mode: forwards;
}
.page-like-heart-shape {
position: absolute;
left: 50%;
top: 50%;
width: 72%;
height: 72%;
background: linear-gradient(135deg, rgba(255, 176, 207, .72), rgba(255, 88, 148, .36));
border-radius: 18rpx 18rpx 10rpx 18rpx;
box-shadow:
0 18rpx 42rpx rgba(255, 104, 164, .28),
inset 14rpx 18rpx 28rpx rgba(255, 255, 255, .32);
filter: blur(.2rpx);
transform: translate(-50%, -50%) rotate(45deg);
}
.page-like-heart-shape::before,
.page-like-heart-shape::after {
content: '';
position: absolute;
width: 100%;
height: 100%;
border-radius: 50%;
background: inherit;
box-shadow: inherit;
}
.page-like-heart-shape::before {
left: -50%;
top: 0;
}
.page-like-heart-shape::after {
left: 0;
top: -50%;
}
.page-like-heart--one { width: 154rpx; height: 154rpx; animation-name: pageHeartFloatOne; }
.page-like-heart--two { width: 112rpx; height: 112rpx; animation-name: pageHeartFloatTwo; }
.page-like-heart--three { width: 188rpx; height: 188rpx; animation-name: pageHeartFloatThree; }
.page-like-heart--four { width: 92rpx; height: 92rpx; animation-name: pageHeartFloatFour; }
.page-like-heart--five { width: 136rpx; height: 136rpx; animation-name: pageHeartFloatFive; }
.page-like-heart--six { width: 82rpx; height: 82rpx; animation-name: pageHeartFloatSix; }
.page-like-heart--seven { width: 166rpx; height: 166rpx; animation-name: pageHeartFloatSeven; }
.page-like-heart--eight { width: 104rpx; height: 104rpx; animation-name: pageHeartFloatEight; }
.page-like-heart--three .page-like-heart-shape,
.page-like-heart--seven .page-like-heart-shape {
background: linear-gradient(135deg, rgba(255, 198, 220, .66), rgba(255, 103, 158, .28));
filter: blur(1rpx);
}
.page-like-heart--four .page-like-heart-shape,
.page-like-heart--six .page-like-heart-shape,
.page-like-heart--eight .page-like-heart-shape {
background: linear-gradient(135deg, rgba(255, 211, 226, .74), rgba(255, 126, 174, .32));
}
@keyframes pageHeartFloatOne {
0% { opacity: 0; transform: translate3d(0, 0, 0) scale(.68) rotate(-8deg); }
14% { opacity: .82; transform: translate3d(-18rpx, -92rpx, 0) scale(1) rotate(5deg); }
62% { opacity: .52; transform: translate3d(-72rpx, -370rpx, 0) scale(.94) rotate(-12deg); }
100% { opacity: 0; transform: translate3d(-112rpx, -650rpx, 0) scale(.72) rotate(-22deg); }
}
@keyframes pageHeartFloatTwo {
0% { opacity: 0; transform: translate3d(0, 0, 0) scale(.62) rotate(6deg); }
16% { opacity: .7; transform: translate3d(28rpx, -112rpx, 0) scale(.92) rotate(-6deg); }
64% { opacity: .44; transform: translate3d(96rpx, -350rpx, 0) scale(.82) rotate(12deg); }
100% { opacity: 0; transform: translate3d(146rpx, -600rpx, 0) scale(.62) rotate(22deg); }
}
@keyframes pageHeartFloatThree {
0% { opacity: 0; transform: translate3d(0, 0, 0) scale(.64) rotate(-4deg); }
12% { opacity: .64; transform: translate3d(8rpx, -86rpx, 0) scale(.94) rotate(7deg); }
60% { opacity: .38; transform: translate3d(-36rpx, -420rpx, 0) scale(.78) rotate(-12deg); }
100% { opacity: 0; transform: translate3d(-68rpx, -710rpx, 0) scale(.58) rotate(-24deg); }
}
@keyframes pageHeartFloatFour {
0% { opacity: 0; transform: translate3d(0, 0, 0) scale(.58) rotate(12deg); }
18% { opacity: .68; transform: translate3d(-26rpx, -124rpx, 0) scale(.86) rotate(-6deg); }
66% { opacity: .4; transform: translate3d(-112rpx, -320rpx, 0) scale(.72) rotate(14deg); }
100% { opacity: 0; transform: translate3d(-166rpx, -560rpx, 0) scale(.54) rotate(26deg); }
}
@keyframes pageHeartFloatFive {
0% { opacity: 0; transform: translate3d(0, 0, 0) scale(.64) rotate(-10deg); }
14% { opacity: .72; transform: translate3d(34rpx, -96rpx, 0) scale(.96) rotate(6deg); }
62% { opacity: .44; transform: translate3d(68rpx, -380rpx, 0) scale(.78) rotate(-10deg); }
100% { opacity: 0; transform: translate3d(104rpx, -650rpx, 0) scale(.58) rotate(-20deg); }
}
@keyframes pageHeartFloatSix {
0% { opacity: 0; transform: translate3d(0, 0, 0) scale(.52) rotate(8deg); }
20% { opacity: .64; transform: translate3d(6rpx, -132rpx, 0) scale(.8) rotate(-8deg); }
68% { opacity: .36; transform: translate3d(44rpx, -290rpx, 0) scale(.64) rotate(12deg); }
100% { opacity: 0; transform: translate3d(70rpx, -500rpx, 0) scale(.48) rotate(22deg); }
}
@keyframes pageHeartFloatSeven {
0% { opacity: 0; transform: translate3d(0, 0, 0) scale(.62) rotate(-8deg); }
13% { opacity: .62; transform: translate3d(-28rpx, -82rpx, 0) scale(.88) rotate(6deg); }
58% { opacity: .38; transform: translate3d(-86rpx, -390rpx, 0) scale(.72) rotate(-12deg); }
100% { opacity: 0; transform: translate3d(-132rpx, -680rpx, 0) scale(.52) rotate(-22deg); }
}
@keyframes pageHeartFloatEight {
0% { opacity: 0; transform: translate3d(0, 0, 0) scale(.56) rotate(10deg); }
18% { opacity: .66; transform: translate3d(38rpx, -118rpx, 0) scale(.84) rotate(-8deg); }
64% { opacity: .4; transform: translate3d(122rpx, -338rpx, 0) scale(.68) rotate(14deg); }
100% { opacity: 0; transform: translate3d(178rpx, -580rpx, 0) scale(.5) rotate(26deg); }
}
.bottom-space { .bottom-space {
height: 170rpx; height: 170rpx;
} }

92
package2/IdleTrad/sessionList.vue

@ -2,7 +2,10 @@
<view class="session-page"> <view class="session-page">
<view class="header" :style="{ paddingTop: statusBarTop + 'px' }"> <view class="header" :style="{ paddingTop: statusBarTop + 'px' }">
<view class="back" @tap="back"><uni-icons type="left" size="22" color="#15362f"></uni-icons></view> <view class="back" @tap="back"><uni-icons type="left" size="22" color="#15362f"></uni-icons></view>
<view class="title">我的咨询</view> <view class="title-row">
<view class="title">我的咨询</view>
<view class="read-all-btn" v-if="chatUnread + commentUnread > 0" @tap="markAllRead">一键已读</view>
</view>
<view class="subtitle">我咨询的和咨询我的都在这里</view> <view class="subtitle">我咨询的和咨询我的都在这里</view>
<view class="message-tabs"> <view class="message-tabs">
<view class="message-tab" :class="{ active: activeTab == 'chat' }" @tap="switchTab('chat')"> <view class="message-tab" :class="{ active: activeTab == 'chat' }" @tap="switchTab('chat')">
@ -27,10 +30,11 @@
</view> </view>
<view class="goods-meta"> <view class="goods-meta">
<text v-if="item.goodsPrice !== ''">¥{{item.goodsPrice}}</text> <text v-if="item.goodsPrice !== ''">¥{{item.goodsPrice}}</text>
<text>{{item.lastChatTime || item.firstConsultTime || item.createTime || ''}}</text> <text>{{item.displayTime}}</text>
</view> </view>
<view class="session-desc">{{item.desc}}</view> <view class="session-desc">{{item.desc}}</view>
</view> </view>
<view class="delete-btn" @tap.stop="deleteItem(item)">删除</view>
</view> </view>
<view class="empty" v-if="!list.length && !loading">暂无咨询记录</view> <view class="empty" v-if="!list.length && !loading">暂无咨询记录</view>
@ -45,7 +49,10 @@
import { import {
pageMyFishSessions, pageMyFishSessions,
pageMyFishMessageComments, pageMyFishMessageComments,
getFishUnreadSummary deleteMyFishSessionMessage,
deleteMyFishCommentMessage,
getFishUnreadSummary,
markAllFishUnreadRead
} from '@/common/fishMarketApi.js' } from '@/common/fishMarketApi.js'
export default { export default {
@ -127,6 +134,42 @@
}) })
}).catch(() => {}) }).catch(() => {})
}, },
markAllRead() {
if (this.loading) return
uni.showModal({
title: '一键已读',
content: '确定将所有消息和留言标记为已读吗?',
confirmText: '已读',
success: (res) => {
if (!res.confirm) return
markAllFishUnreadRead().then(() => {
this.chatUnread = 0
this.commentUnread = 0
uni.$emit('fishUnreadChange', { chatUnread: 0, commentUnread: 0, fishUnread: 0 })
uni.showToast({ title: '已全部标记已读', icon: 'none' })
this.reload()
})
}
})
},
deleteItem(item) {
if (!item || !item.id) return
const isComment = this.activeTab == 'comment'
uni.showModal({
title: '删除记录',
content: isComment ? '确定删除这条留言提醒吗?' : '确定删除这条消息记录吗?',
confirmText: '删除',
confirmColor: '#e34d59',
success: (res) => {
if (!res.confirm) return
const request = isComment ? deleteMyFishCommentMessage : deleteMyFishSessionMessage
request(item.id).then(() => {
uni.showToast({ title: '删除成功', icon: 'none' })
this.reload()
})
}
})
},
formatBadgeCount(count) { formatBadgeCount(count) {
const value = Number(count) || 0 const value = Number(count) || 0
return value > 99 ? '99+' : value return value > 99 ? '99+' : value
@ -143,6 +186,7 @@
goodsTitle: session.displayTitle || '', goodsTitle: session.displayTitle || '',
goodsCover: session.displayCover || '', goodsCover: session.displayCover || '',
goodsPrice: session.displayPrice !== undefined && session.displayPrice !== null ? session.displayPrice : '', goodsPrice: session.displayPrice !== undefined && session.displayPrice !== null ? session.displayPrice : '',
displayTime: this.formatDisplayTime(session.lastChatTime || session.firstConsultTime || session.createTime),
desc: isWant ? (role == 'seller' ? '你正在响应这条求购' : '同学正在响应你的求购') : (role == 'seller' ? '买家正在咨询这件商品' : '你正在咨询这件商品') desc: isWant ? (role == 'seller' ? '你正在响应这条求购' : '同学正在响应你的求购') : (role == 'seller' ? '买家正在咨询这件商品' : '你正在咨询这件商品')
} }
}) })
@ -157,10 +201,18 @@
goodsTitle: comment.displayTitle || '', goodsTitle: comment.displayTitle || '',
goodsCover: comment.displayCover || '', goodsCover: comment.displayCover || '',
goodsPrice: comment.displayPrice !== undefined && comment.displayPrice !== null ? comment.displayPrice : '', goodsPrice: comment.displayPrice !== undefined && comment.displayPrice !== null ? comment.displayPrice : '',
displayTime: this.formatDisplayTime(comment.createTime),
desc: (comment.replyToUserName ? (comment.userName || '校园同学') + ' 回复 ' + comment.replyToUserName + ':' : '') + (comment.content || '') desc: (comment.replyToUserName ? (comment.userName || '校园同学') + ' 回复 ' + comment.replyToUserName + ':' : '') + (comment.content || '')
} }
}) })
}, },
formatDisplayTime(value) {
if (!value) return ''
const text = String(value).replace(/T/g, ' ')
const match = text.match(/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2})/)
if (!match) return text
return `${match[1]}-${match[2]}-${match[3]} ${match[4]}:${match[5]}`
},
openItem(item) { openItem(item) {
if (this.activeTab == 'comment') { if (this.activeTab == 'comment') {
if (!item.goodsId) return if (!item.goodsId) return
@ -202,12 +254,35 @@
align-items: center; align-items: center;
} }
.title-row {
margin-top: 8rpx;
display: flex;
align-items: center;
justify-content: space-between;
}
.title { .title {
flex: 1;
margin-top: 8rpx; margin-top: 8rpx;
font-size: 42rpx; font-size: 42rpx;
font-weight: 900; font-weight: 900;
} }
.title-row .title {
margin-top: 0;
}
.read-all-btn {
margin-left: 20rpx;
padding: 10rpx 20rpx;
border-radius: 24rpx;
background: #e8fbf3;
color: #18a878;
font-size: 22rpx;
font-weight: 900;
white-space: nowrap;
}
.subtitle { .subtitle {
margin-top: 8rpx; margin-top: 8rpx;
color: #71857f; color: #71857f;
@ -293,6 +368,17 @@
margin-left: 18rpx; margin-left: 18rpx;
} }
.delete-btn {
margin-left: 16rpx;
padding: 12rpx 18rpx;
border-radius: 22rpx;
background: #fff1f2;
color: #e34d59;
font-size: 22rpx;
font-weight: 900;
flex-shrink: 0;
}
.top-row { .top-row {
display: flex; display: flex;
align-items: center; align-items: center;

2
package2/group/groupBuyList.vue

@ -152,7 +152,7 @@
<text v-else>{{item._groupTip}}</text> <text v-else>{{item._groupTip}}</text>
</view> </view>
<view class="shop-deal1"> <view class="shop-deal1">
<text>{{item.saleCount != null ? item.saleCount : 0}}</text>人跟拼 已售{{item.saleCount != null ? item.saleCount : 0}}
</view> </view>
</view> </view>
<view class="self-delivery-row" v-if="item.supportShopDelivery == 1"> <view class="self-delivery-row" v-if="item.supportShopDelivery == 1">

7
package2/group/groupBuySingle.vue

@ -46,7 +46,7 @@
<text :class="{'shop-status-disabled': !hasOpenKitchenVideo(shopItem)}" @tap.stop="goDetail('openKitchen')"> <text :class="{'shop-status-disabled': !hasOpenKitchenVideo(shopItem)}" @tap.stop="goDetail('openKitchen')">
{{getOpenKitchenText(shopItem)}} {{getOpenKitchenText(shopItem)}}
</text> </text>
<text>{{getDineInText(shopItem)}}</text> <text :class="{'shop-status-disabled': shopItem.supportDineIn != 1}">{{getDineInText(shopItem)}}</text>
</view> </view>
<view class="shop-content-center"> <view class="shop-content-center">
<view class="shop-rate"> <view class="shop-rate">
@ -3465,11 +3465,6 @@
white-space: nowrap; white-space: nowrap;
} }
text:last-child {
background: rgba(255, 116, 77, 0.12);
color: #ff744d;
}
.shop-status-disabled { .shop-status-disabled {
background: rgba(225, 231, 228, 0.72) !important; background: rgba(225, 231, 228, 0.72) !important;
color: #87938f !important; color: #87938f !important;

4
package2/group/studentStoreList.vue

@ -85,7 +85,7 @@
<view @tap.stop="buyingye" v-if="item.status === 0" class="closed-mask"> <view @tap.stop="buyingye" v-if="item.status === 0" class="closed-mask">
<view class="closed-text">休息中</view> <view class="closed-text">休息中</view>
</view> </view>
<view class="rank-tag">热度 {{index + 1}}</view> <view class="rank-tag">销量 {{item.saleCount != null ? item.saleCount : 0}}</view>
<view class="live-dot"></view> <view class="live-dot"></view>
<view class="shop-sticker">{{item.uiLiveText}}</view> <view class="shop-sticker">{{item.uiLiveText}}</view>
<view class="shop-top"> <view class="shop-top">
@ -1603,7 +1603,7 @@
border-radius: 999rpx; border-radius: 999rpx;
background: #fff0dc; background: #fff0dc;
color: #e96632; color: #e96632;
font-size: 18rpx; font-size: 20rpx;
font-weight: 900; font-weight: 900;
} }

13
package2/myCenter/myPost.vue

@ -128,6 +128,11 @@
if (this.loadedOnce) { if (this.loadedOnce) {
this.reload() this.reload()
} }
if (uni.$off) uni.$off('fishMarketChanged', this.reload)
if (uni.$on) uni.$on('fishMarketChanged', this.reload)
},
onUnload() {
if (uni.$off) uni.$off('fishMarketChanged', this.reload)
}, },
methods: { methods: {
back() { back() {
@ -194,8 +199,7 @@
const request = this.activeTab == 'goods' const request = this.activeTab == 'goods'
? updateMyFishGoodsStatus({ goodsId: item.id, status }) ? updateMyFishGoodsStatus({ goodsId: item.id, status })
: updateMyFishWantStatus({ wantId: item.id, status }) : updateMyFishWantStatus({ wantId: item.id, status })
return request.then(res => { return request.then(() => {
if (!res && res !== true) return
uni.showToast({ title: status == 3 ? '已删除' : (status == 2 ? '已下架' : '已上架'), icon: 'none' }) uni.showToast({ title: status == 3 ? '已删除' : (status == 2 ? '已下架' : '已上架'), icon: 'none' })
this.reload() this.reload()
}) })
@ -280,7 +284,7 @@
if (item.saleStatus == 2) return '已预定' if (item.saleStatus == 2) return '已预定'
if (item.saleStatus == 3) return '已卖出' if (item.saleStatus == 3) return '已卖出'
if (item.status == 2) return '已下架' if (item.status == 2) return '已下架'
return '正常' return '已上架'
}, },
handleCardAction(item) { handleCardAction(item) {
if (this.activeTab == 'favorites') { if (this.activeTab == 'favorites') {
@ -300,8 +304,7 @@
confirmColor: '#ef4c3f', confirmColor: '#ef4c3f',
success: (res) => { success: (res) => {
if (!res.confirm) return if (!res.confirm) return
toggleFishFavorite(item.goodsId).then(result => { toggleFishFavorite(item.goodsId).then(() => {
if (!result && result !== false) return
uni.showToast({ title: '已取消收藏', icon: 'none' }) uni.showToast({ title: '已取消收藏', icon: 'none' })
this.reload() this.reload()
}) })

22
package2/seckill/seckillGroup.vue

@ -18,7 +18,7 @@
<view class="hero-sub">限时开抢 · 拼着更划算</view> <view class="hero-sub">限时开抢 · 拼着更划算</view>
</view> </view>
<view class="hero-card"> <view class="hero-card">
<view class="hero-bowl"></view> <!-- <view class="hero-bowl"></view> -->
<view class="hero-badge">立即抢</view> <view class="hero-badge">立即抢</view>
</view> </view>
</view> </view>
@ -269,6 +269,7 @@
shopPhone: item.shopPhone, shopPhone: item.shopPhone,
shopAddress: item.shopAddress, shopAddress: item.shopAddress,
getAreaId: item.getAreaId, getAreaId: item.getAreaId,
shoArea: item.shoArea,
attributeList: item.attributeList, attributeList: item.attributeList,
raw: item raw: item
} }
@ -409,11 +410,11 @@
contactPhone: item.shopPhone, contactPhone: item.shopPhone,
shopPhone: item.shopPhone, shopPhone: item.shopPhone,
shopAddress: item.shopAddress, shopAddress: item.shopAddress,
shopArea: item.getAreaId shopArea: item.shoArea || item.getAreaId
} }
uni.navigateTo({ uni.navigateTo({
url: '/package1/buyFood/buyFood?cart=' + encodeURIComponent(JSON.stringify(cart)) + url: '/package1/buyFood/buyFood?cart=' + encodeURIComponent(JSON.stringify(cart)) +
'&shopItem=' + encodeURIComponent(JSON.stringify(shopItem)) + '&packageFee=0' '&shopItem=' + encodeURIComponent(JSON.stringify(shopItem)) + '&packageFee=0&seckillOrder=1'
}) })
}, },
back() { back() {
@ -576,20 +577,21 @@
} }
.hero-card { .hero-card {
width: 230rpx; margin-top: 30rpx;
height: 210rpx; width: 200rpx;
height: 180rpx;
position: relative; position: relative;
animation: heroFloat 3s ease-in-out infinite; animation: heroFloat 3s ease-in-out infinite;
} }
.hero-bowl { .hero-bowl {
width: 138rpx; width: 120rpx;
height: 138rpx; height: 120rpx;
margin: 24rpx auto 0; margin: 14rpx auto 0;
border-radius: 50%; border-radius: 50%;
background: linear-gradient(145deg, #fff 0%, #ffe8b9 100%); background: linear-gradient(145deg, #fff 0%, #ffe8b9 100%);
color: #ff5630; color: #ff5630;
font-size: 60rpx; font-size: 50rpx;
font-weight: 900; font-weight: 900;
line-height: 138rpx; line-height: 138rpx;
text-align: center; text-align: center;
@ -607,7 +609,7 @@
line-height: 48rpx; line-height: 48rpx;
text-align: center; text-align: center;
position: absolute; position: absolute;
right: 8rpx; right: 42rpx;
bottom: 14rpx; bottom: 14rpx;
box-shadow: 0 10rpx 18rpx rgba(169, 40, 0, 0.18); box-shadow: 0 10rpx 18rpx rgba(169, 40, 0, 0.18);
animation: badgeBeat 1.4s ease-in-out infinite; animation: badgeBeat 1.4s ease-in-out infinite;

Loading…
Cancel
Save