修正多处问题

This commit is contained in:
2026-06-29 13:35:29 +08:00
parent 09e587cb65
commit e85f39ab83
37 changed files with 3545 additions and 2538 deletions
+102 -40
View File
@@ -228,16 +228,36 @@
</view>
</view>
</view>
<!-- 支付密码弹窗 -->
<PayPasswordModal
:visible="showPayPwd"
title="支付验证"
:subtitle="course.courseName"
:amount="course.storedValueAmount || 0"
amount-label="课程金额"
@confirm="onPayPasswordConfirm"
@cancel="onPayPasswordCancel"
/>
</template>
<script setup>
import { ref, computed, onMounted } from 'vue'
import { ref, computed } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
import { getGroupCourseDetail, bookGroupCourse } from '@/api/groupCourse.js'
import { getPrimaryMemberCard } from '@/api/main.js'
import { getMemberId } from '@/utils/request.js'
import PageHeader from '@/components/index/PageHeader.vue'
import PayPasswordModal from '@/components/global/PayPasswordModal.vue'
// 加载状态
const loading = ref(true)
// 支付密码弹窗状态
const showPayPwd = ref(false)
const payPwdLoading = ref(false)
let payPwdResolve = null
// 课程详情数据
const course = ref({
id: '',
@@ -373,48 +393,89 @@ const formatDuration = (startStr, endStr) => {
}
// 预约处理
const handleBooking = () => {
const handleBooking = async () => {
if (!canBook.value) return
const memberId = getMemberId()
if (!memberId) {
uni.showToast({ title: '请先登录', icon: 'none' })
return
}
uni.showModal({
title: '确认预约',
content: `确定要预约「${course.value.courseName}」吗?`,
success: (res) => {
if (res.confirm) {
uni.showLoading({ title: '预约中...' })
bookGroupCourse({
courseId: course.value.id,
memberId: '1', // 模拟会员ID
memberCardRecordId: '1' // 模拟会员卡记录ID
}).then((result) => {
content: `确定要预约「${course.value.courseName}」吗?${course.value.storedValueAmount > 0 ? '\n金额: ¥' + course.value.storedValueAmount : ''}`,
success: async (res) => {
if (!res.confirm) return
// 弹出支付密码输入
const payPassword = await requestPayPassword()
if (!payPassword) return
uni.showLoading({ title: '预约中...' })
try {
const cardRes = await getPrimaryMemberCard(memberId)
const memberCardRecordId = cardRes?.id || cardRes?.data?.id
if (!memberCardRecordId) {
uni.hideLoading()
if (result.success) {
uni.showToast({
title: '预约成功',
icon: 'success'
})
setTimeout(() => {
uni.navigateBack()
}, 1500)
} else {
uni.showToast({
title: result.message || '预约失败',
icon: 'none'
})
}
}).catch((error) => {
uni.hideLoading()
console.error('[detail.vue] 预约失败:', error)
uni.showToast({ title: '请先购买会员卡', icon: 'none' })
return
}
const result = await bookGroupCourse({
courseId: Number(course.value.id),
memberId: Number(memberId),
memberCardRecordId: Number(memberCardRecordId),
payPassword: payPassword
})
uni.hideLoading()
if (result.success) {
uni.showToast({
title: '预约失败',
icon: 'none'
title: '预约成功',
icon: 'success'
})
setTimeout(() => {
uni.redirectTo({ url: '/pages/memberInfo/myCourses' })
}, 1500)
} else {
uni.showToast({
title: result.message || '预约失败',
icon: 'none',
duration: 3000
})
}
} catch (error) {
uni.hideLoading()
console.error('[detail.vue] 预约失败:', error)
const errMsg = error?.message || error?.data?.message || '预约失败'
uni.showToast({
title: errMsg,
icon: 'none',
duration: 3000
})
}
}
})
}
// 弹出支付密码输入框,返回 Promise<string|null>
function requestPayPassword() {
return new Promise((resolve) => {
payPwdResolve = resolve
showPayPwd.value = true
})
}
function onPayPasswordConfirm(password) {
payPwdResolve?.(password)
showPayPwd.value = false
}
function onPayPasswordCancel() {
payPwdResolve?.(null)
showPayPwd.value = false
}
// 获取课程详情
const fetchCourseDetail = async (id) => {
try {
@@ -439,15 +500,13 @@ const fetchCourseDetail = async (id) => {
}
}
// 页面载时获取课程详情
onMounted(() => {
const pages = getCurrentPages()
const currentPage = pages[pages.length - 1]
const options = currentPage.options || {}
const courseId = options.id || '1'
console.log('[detail.vue] 页面挂载,课程ID:', courseId)
fetchCourseDetail(courseId)
// 页面载时获取课程详情
onLoad((options) => {
const courseId = options.id
console.log('[detail.vue] onLoad,课程ID:', courseId)
if (courseId) {
fetchCourseDetail(courseId)
}
})
</script>
@@ -963,7 +1022,10 @@ onMounted(() => {
box-shadow: none;
}
/* 骨架屏样式 */
.booking-btn.disabled text {
color: #c8c8c8;
}
.skeleton {
padding-bottom: calc(140rpx + constant(safe-area-inset-bottom));
padding-bottom: calc(140rpx + env(safe-area-inset-bottom));