Compare commits

..

No commits in common. "54515c6e238b68280825457d802c851857c9fe44" and "6a7e216e4f0046323be57a06925957c5b0a4423d" have entirely different histories.

16 changed files with 244 additions and 70 deletions

View File

@ -96,7 +96,6 @@ Page({
heat: item.heat || 0, // 使用后端返回的热度字段 heat: item.heat || 0, // 使用后端返回的热度字段
isFree: item.priceType === 'free', isFree: item.priceType === 'free',
price: item.priceText || '', price: item.priceText || '',
participants: item.current_participants || item.currentParticipants || 0,
status: item.status || ((item.current_participants || item.currentParticipants || 0) >= (item.max_participants || item.maxParticipants || 0) && (item.max_participants || item.maxParticipants || 0) > 0 ? 'full' : 'upcoming'), status: item.status || ((item.current_participants || item.currentParticipants || 0) >= (item.max_participants || item.maxParticipants || 0) && (item.max_participants || item.maxParticipants || 0) > 0 ? 'full' : 'upcoming'),
activityGuideQrcode: item.activityGuideQrcode || item.activity_guide_qrcode || '' activityGuideQrcode: item.activityGuideQrcode || item.activity_guide_qrcode || ''
})) }))
@ -276,16 +275,19 @@ Page({
return return
} }
// 2025-02-04: 点击报名直接显示二维码弹窗,不再请求后端报名接口 wx.showModal({
const qrCode = activity.activityGuideQrcode || activity.activity_guide_qrcode || this.data.qrcodeImageUrl || 'https://ai-c.maimanji.com/api/common/qrcode?type=group' title: '确认报名',
this.setData({ content: '确定要报名参加这个活动吗?',
qrcodeImageUrl: qrCode, success: (res) => {
showQrcodeModal: true if (res.confirm) {
this.handleSignUp(id, index)
}
}
}) })
}, },
/** /**
* 处理报名 (Deprecated) * 处理报名
*/ */
async handleSignUp(activityId, index) { async handleSignUp(activityId, index) {
try { try {

View File

@ -76,7 +76,7 @@
<!-- 底部操作栏 --> <!-- 底部操作栏 -->
<view class="activity-footer"> <view class="activity-footer">
<view class="participants"> <view class="participants">
<text class="participant-text">{{item.participants}}人已报名</text> <!-- <text class="participant-text">{{item.participants}}人已报名</text> -->
</view> </view>
<view class="signup-btn" catchtap="onSignUp" data-id="{{item.id}}" data-index="{{index}}"> <view class="signup-btn" catchtap="onSignUp" data-id="{{item.id}}" data-index="{{index}}">
立即报名 立即报名

View File

@ -152,7 +152,7 @@
<!-- 报名信息 --> <!-- 报名信息 -->
<view class="activity-footer"> <view class="activity-footer">
<view class="participants"> <view class="participants">
<text class="participant-text">{{item.participants}}人已报名</text> <!-- <text class="participant-text">{{item.participants}}人已报名</text> -->
</view> </view>
<view class="signup-btn {{item.isSignedUp ? 'signed' : ''}}" <view class="signup-btn {{item.isSignedUp ? 'signed' : ''}}"
catchtap="onSignUp" catchtap="onSignUp"

View File

@ -258,12 +258,59 @@ Page({
return return
} }
// 2025-02-04: 点击报名直接显示二维码弹窗,不再请求后端报名接口 try {
const qrCode = activity.activityGuideQrcode || activity.activity_guide_qrcode || this.data.qrcodeImageUrl || 'https://ai-c.maimanji.com/api/common/qrcode?type=group' if (activity.isSignedUp) {
this.setData({ // 取消报名
qrcodeImageUrl: qrCode, const res = await api.activity.cancelSignup(id)
showQrcodeModal: true if (res.success) {
wx.showToast({ title: '已取消报名', icon: 'success' })
this.loadActivityList() // 刷新列表获取最新人数
}
} else {
// 报名
const res = await api.activity.signup(id)
if (res.success) {
wx.showToast({ title: '报名成功', icon: 'success' })
this.loadActivityList() // 刷新列表获取最新人数
} else {
// 检查是否需要显示二维码(后端开关关闭或活动已结束)
if (res.code === 'QR_CODE_REQUIRED' || res.error === 'QR_CODE_REQUIRED' || res.code === 'ACTIVITY_ENDED' || res.error === '活动已结束') {
if (activity.activityGuideQrcode || activity.activity_guide_qrcode) {
this.setData({ qrcodeImageUrl: activity.activityGuideQrcode || activity.activity_guide_qrcode })
}
this.setData({ showQrcodeModal: true })
if (res.code === 'ACTIVITY_ENDED' || res.error === '活动已结束') {
wx.showToast({ title: '活动已结束,进群查看更多', icon: 'none' })
}
} else {
wx.showToast({
title: res.error || '报名失败',
icon: 'none'
}) })
}
}
}
} catch (err) {
console.error('报名操作失败', err)
// 捕获特定错误码以显示二维码
const isQrRequired = err && (err.code === 'QR_CODE_REQUIRED' || (err.data && err.data.code === 'QR_CODE_REQUIRED'))
const isActivityEnded = err && (err.code === 'ACTIVITY_ENDED' || (err.data && err.data.code === 'ACTIVITY_ENDED') || err.error === '活动已结束')
if (isQrRequired || isActivityEnded) {
if (activity.activityGuideQrcode || activity.activity_guide_qrcode) {
this.setData({ qrcodeImageUrl: activity.activityGuideQrcode || activity.activity_guide_qrcode })
}
this.setData({ showQrcodeModal: true })
if (isActivityEnded) {
wx.showToast({ title: '活动已结束,进群查看更多', icon: 'none' })
}
} else {
wx.showToast({
title: err.error || err.message || '操作失败',
icon: 'none'
})
}
}
}, },
/** /**

View File

@ -109,7 +109,7 @@
<!-- 报名信息 --> <!-- 报名信息 -->
<view class="activity-footer"> <view class="activity-footer">
<view class="participants"> <view class="participants">
<text class="participant-text">{{item.participants}}人已报名</text> <!-- <text class="participant-text">{{item.participants}}人已报名</text> -->
</view> </view>
<view class="signup-btn {{item.isSignedUp ? 'signed' : ''}}" <view class="signup-btn {{item.isSignedUp ? 'signed' : ''}}"
catchtap="onSignUp" catchtap="onSignUp"

View File

@ -241,7 +241,7 @@
</view> </view>
<view class="option-info"> <view class="option-info">
<text class="option-title">成为会员</text> <text class="option-title">成为会员</text>
<text class="option-desc">心伴会员 品质服务</text> <text class="option-desc">解锁更多权益</text>
</view> </view>
</view> </view>
<view class="option-btn hearts-btn"> <view class="option-btn hearts-btn">

View File

@ -104,9 +104,7 @@ Page({
'exchange_vip': '兑换会员', 'exchange_vip': '兑换会员',
'exchange_gift': '兑换礼品', 'exchange_gift': '兑换礼品',
'admin': '管理员操作', 'admin': '管理员操作',
'system': '系统赠送', 'system': '系统赠送'
'register': '新客平台赠送奖励',
'login': '每日登录奖励'
} }
return sourceMap[source] || source return sourceMap[source] || source
}, },

View File

@ -49,7 +49,7 @@
<view wx:if="{{transactions.length > 0}}" class="records-list"> <view wx:if="{{transactions.length > 0}}" class="records-list">
<view wx:for="{{transactions}}" wx:key="id" class="record-item"> <view wx:for="{{transactions}}" wx:key="id" class="record-item">
<view class="record-left"> <view class="record-left">
<text class="record-title">{{item.description === '首次注册赠送100爱心值' ? '新客平台赠送奖励' : (item.description || formatSource(item.source))}}</text> <text class="record-title">{{item.description || formatSource(item.source)}}</text>
<text class="record-time">{{formatTime(item.created_at)}}</text> <text class="record-time">{{formatTime(item.created_at)}}</text>
</view> </view>
<view class="record-right"> <view class="record-right">

View File

@ -259,12 +259,57 @@ Page({
return return
} }
// 2025-02-04: 点击报名直接显示二维码弹窗,不再请求后端报名接口 try {
const qrCode = activity.activityGuideQrcode || activity.activity_guide_qrcode || this.data.qrcodeImageUrl || 'https://ai-c.maimanji.com/api/common/qrcode?type=group' if (activity.isSignedUp) {
this.setData({ // 取消报名
qrcodeImageUrl: qrCode, const res = await api.activity.cancelSignup(id)
showQrcodeModal: true if (res.success) {
wx.showToast({ title: '已取消报名', icon: 'success' })
this.loadActivityList()
}
} else {
// 报名
const res = await api.activity.signup(id)
if (res.success) {
wx.showToast({ title: '报名成功', icon: 'success' })
this.loadActivityList()
} else {
// 检查是否需要显示二维码(后端开关关闭或活动已结束)
if (res.code === 'QR_CODE_REQUIRED' || res.error === 'QR_CODE_REQUIRED' || res.code === 'ACTIVITY_ENDED' || res.error === '活动已结束') {
if (activity.activityGuideQrcode || activity.activity_guide_qrcode) {
this.setData({ qrcodeImageUrl: activity.activityGuideQrcode || activity.activity_guide_qrcode })
}
this.setData({ showQrcodeModal: true })
} else {
wx.showToast({
title: res.error || '操作失败',
icon: 'none'
}) })
}
}
}
} catch (err) {
console.error('报名操作失败', err)
// 捕获特定错误码以显示二维码
const isQrRequired = err && (err.code === 'QR_CODE_REQUIRED' || (err.data && err.data.code === 'QR_CODE_REQUIRED'))
const isActivityEnded = err && (err.code === 'ACTIVITY_ENDED' || (err.data && err.data.code === 'ACTIVITY_ENDED') || err.error === '活动已结束')
if (isQrRequired || isActivityEnded) {
if (activity.activityGuideQrcode || activity.activity_guide_qrcode) {
this.setData({ qrcodeImageUrl: activity.activityGuideQrcode || activity.activity_guide_qrcode })
}
this.setData({ showQrcodeModal: true })
if (isActivityEnded) {
wx.showToast({ title: '活动已结束,进群查看更多', icon: 'none' })
}
} else {
wx.showToast({
title: err.error || err.message || '操作失败',
icon: 'none'
})
}
}
}, },
/** /**

View File

@ -76,11 +76,12 @@
<view class="activity-info"> <view class="activity-info">
<text class="activity-title">{{item.title}}</text> <text class="activity-title">{{item.title}}</text>
<view class="activity-meta"> <view class="activity-meta">
<view class="meta-item meta-date"> <view class="meta-item">
<image src="/images/icon-clock.png" class="meta-icon" mode="aspectFit"></image> <image src="/images/icon-clock.png" class="meta-icon" mode="aspectFit"></image>
<text class="meta-text">{{item.date}}</text> <text class="meta-text">{{item.date}}</text>
</view> </view>
<view class="meta-item meta-location"> <view class="meta-row">
<view class="meta-item">
<image src="/images/icon-location.png" class="meta-icon" mode="aspectFit"></image> <image src="/images/icon-location.png" class="meta-icon" mode="aspectFit"></image>
<text class="meta-text">{{item.location}}</text> <text class="meta-text">{{item.location}}</text>
</view> </view>
@ -89,10 +90,11 @@
<text class="meta-text heat-text">{{item.heat}}</text> <text class="meta-text heat-text">{{item.heat}}</text>
</view> </view>
</view> </view>
</view>
<view class="activity-footer"> <view class="activity-footer">
<view class="participants"> <view class="participants">
<text class="participant-text">{{item.participants}}人已报名</text> <!-- <text class="participant-text">{{item.participants}}人已报名</text> -->
</view> </view>
<view class="signup-btn {{item.isSignedUp ? 'signed' : ''}}" catchtap="onSignUp" data-id="{{item.id}}" data-index="{{index}}"> <view class="signup-btn {{item.isSignedUp ? 'signed' : ''}}" catchtap="onSignUp" data-id="{{item.id}}" data-index="{{index}}">
{{item.isSignedUp ? '已报名' : '立即报名'}} {{item.isSignedUp ? '已报名' : '立即报名'}}

View File

@ -357,14 +357,6 @@ page {
color: #43A047; color: #43A047;
} }
.meta-date {
flex-shrink: 0;
}
.meta-date .meta-text {
white-space: nowrap;
}
.meta-icon { .meta-icon {
width: 28rpx; width: 28rpx;
height: 28rpx; height: 28rpx;
@ -375,17 +367,12 @@ page {
color: #4A5565; color: #4A5565;
} }
.meta-location { .meta-row {
flex: 1; display: flex;
min-width: 0; align-items: center;
justify-content: flex-end; justify-content: space-between;
} width: 100%;
margin-top: 8rpx;
.meta-location .meta-text {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
text-align: right;
} }
/* 活动底部 */ /* 活动底部 */

View File

@ -100,7 +100,7 @@
<view class="icon-wrap-sm"> <view class="icon-wrap-sm">
<image src="/images/icon-trending-up.png" class="card-icon-img" mode="aspectFit" /> <image src="/images/icon-trending-up.png" class="card-icon-img" mode="aspectFit" />
</view> </view>
<text class="card-name">我的业绩</text> <text class="card-name">业绩数据</text>
</view> </view>
<view class="card-bottom"> <view class="card-bottom">
<text class="card-num">¥{{counts.performance || '0.00'}}</text> <text class="card-num">¥{{counts.performance || '0.00'}}</text>

View File

@ -211,12 +211,58 @@ Page({
return return
} }
// 2025-02-04: 点击报名直接显示二维码弹窗,不再请求后端报名接口 try {
const qrCode = activity.activityGuideQrcode || activity.activity_guide_qrcode || this.data.qrcodeImageUrl || 'https://ai-c.maimanji.com/api/common/qrcode?type=group' if (activity.isSignedUp) {
this.setData({ // 取消报名
qrcodeImageUrl: qrCode, const res = await api.activity.cancelSignup(id)
showQrcodeModal: true if (res.success) {
wx.showToast({ title: '已取消报名', icon: 'success' })
this.loadActivityList()
}
} else {
// 报名
const res = await api.activity.signup(id)
if (res.success) {
wx.showToast({ title: '报名成功', icon: 'success' })
this.loadActivityList()
} else {
// 检查是否需要显示二维码
if (res.code === 'QR_CODE_REQUIRED' || res.error === 'QR_CODE_REQUIRED' || res.code === 'ACTIVITY_ENDED' || res.error === '活动已结束') {
if (activity.activityGuideQrcode || activity.activity_guide_qrcode) {
this.setData({ qrcodeImageUrl: activity.activityGuideQrcode || activity.activity_guide_qrcode })
}
this.setData({ showQrcodeModal: true })
if (res.code === 'ACTIVITY_ENDED' || res.error === '活动已结束') {
wx.showToast({ title: '活动已结束,进群查看更多', icon: 'none' })
}
} else {
wx.showToast({
title: res.error || '操作失败',
icon: 'none'
}) })
}
}
}
} catch (err) {
console.error('报名操作失败', err)
const isQrRequired = err && (err.code === 'QR_CODE_REQUIRED' || (err.data && err.data.code === 'QR_CODE_REQUIRED'))
const isActivityEnded = err && (err.code === 'ACTIVITY_ENDED' || (err.data && err.data.code === 'ACTIVITY_ENDED') || err.error === '活动已结束')
if (isQrRequired || isActivityEnded) {
if (activity.activityGuideQrcode || activity.activity_guide_qrcode) {
this.setData({ qrcodeImageUrl: activity.activityGuideQrcode || activity.activity_guide_qrcode })
}
this.setData({ showQrcodeModal: true })
if (isActivityEnded) {
wx.showToast({ title: '活动已结束,进群查看更多', icon: 'none' })
}
} else {
wx.showToast({
title: err.error || err.message || '操作失败',
icon: 'none'
})
}
}
}, },
/** /**

View File

@ -95,7 +95,7 @@
<!-- 报名信息 --> <!-- 报名信息 -->
<view class="activity-footer"> <view class="activity-footer">
<view class="participants"> <view class="participants">
<text class="participant-text">{{item.participants}}人已报名</text> <!-- <text class="participant-text">{{item.participants}}人已报名</text> -->
</view> </view>
<view class="signup-btn {{item.isSignedUp ? 'signed' : ''}}" catchtap="onSignUp" data-id="{{item.id}}" data-index="{{index}}"> <view class="signup-btn {{item.isSignedUp ? 'signed' : ''}}" catchtap="onSignUp" data-id="{{item.id}}" data-index="{{index}}">
{{item.isSignedUp ? '已报名' : '立即报名'}} {{item.isSignedUp ? '已报名' : '立即报名'}}

View File

@ -249,12 +249,59 @@ Page({
return return
} }
// 2025-02-04: 点击报名直接显示二维码弹窗,不再请求后端报名接口 try {
const qrCode = activity.activityGuideQrcode || activity.activity_guide_qrcode || this.data.qrcodeImageUrl if (activity.isSignedUp) {
this.setData({ // 取消报名
qrcodeImageUrl: qrCode, const res = await api.activity.cancelSignup(id)
showQrcodeModal: true if (res.success) {
wx.showToast({ title: '已取消报名', icon: 'success' })
this.loadActivityList()
}
} else {
// 报名
const res = await api.activity.signup(id)
if (res.success) {
wx.showToast({ title: '报名成功', icon: 'success' })
this.loadActivityList()
} else {
// 检查是否需要显示二维码(后端开关关闭或活动已结束)
if (res.code === 'QR_CODE_REQUIRED' || res.error === 'QR_CODE_REQUIRED' || res.code === 'ACTIVITY_ENDED' || res.error === '活动已结束') {
if (activity.activityGuideQrcode || activity.activity_guide_qrcode) {
this.setData({ qrcodeImageUrl: activity.activityGuideQrcode || activity.activity_guide_qrcode })
}
this.setData({ showQrcodeModal: true })
if (res.code === 'ACTIVITY_ENDED' || res.error === '活动已结束') {
wx.showToast({ title: '活动已结束,进群查看更多', icon: 'none' })
}
} else {
wx.showToast({
title: res.error || '报名失败',
icon: 'none'
}) })
}
}
}
} catch (err) {
console.error('报名操作失败', err)
// 捕获特定错误码以显示二维码
const isQrRequired = err && (err.code === 'QR_CODE_REQUIRED' || (err.data && err.data.code === 'QR_CODE_REQUIRED'))
const isActivityEnded = err && (err.code === 'ACTIVITY_ENDED' || (err.data && err.data.code === 'ACTIVITY_ENDED') || err.error === '活动已结束')
if (isQrRequired || isActivityEnded) {
if (activity.activityGuideQrcode || activity.activity_guide_qrcode) {
this.setData({ qrcodeImageUrl: activity.activityGuideQrcode || activity.activity_guide_qrcode })
}
this.setData({ showQrcodeModal: true })
if (isActivityEnded) {
wx.showToast({ title: '活动已结束,进群查看更多', icon: 'none' })
}
} else {
wx.showToast({
title: err.error || err.message || '操作失败',
icon: 'none'
})
}
}
}, },
/** /**

View File

@ -87,7 +87,7 @@
<!-- 报名信息 --> <!-- 报名信息 -->
<view class="activity-footer"> <view class="activity-footer">
<view class="participants"> <view class="participants">
<text class="participant-text">{{item.participants}}人已报名</text> <!-- <text class="participant-text">{{item.participants}}人已报名</text> -->
</view> </view>
<view class="signup-btn {{item.isSignedUp ? 'signed' : ''}}" <view class="signup-btn {{item.isSignedUp ? 'signed' : ''}}"
catchtap="onSignUp" catchtap="onSignUp"