mini
All checks were successful
Deploy to Server / deploy (push) Successful in 40s

This commit is contained in:
jeremygan2021
2026-02-24 00:31:57 +08:00
parent 0d01a5f2a8
commit 441e080328
15 changed files with 535 additions and 106 deletions

View File

@@ -185,6 +185,36 @@
}
}
.schedule-section {
.schedule-box {
background: #111;
padding: 30px;
border-radius: 16px;
border: 1px solid rgba(0, 240, 255, 0.2);
.time-row {
display: flex;
margin-bottom: 16px;
font-size: 28px;
&:last-child {
margin-bottom: 0;
}
.label {
color: #888;
width: 160px;
}
.value {
color: #00f0ff;
flex: 1;
font-weight: bold;
}
}
}
}
.desc-text {
color: #aaa;
font-size: 28px;

View File

@@ -56,6 +56,17 @@ export default function CourseDetail() {
if (loading) return <View className='page-container'><Text style={{color:'#fff'}}>Loading...</Text></View>
if (!detail) return <View className='page-container'><Text style={{color:'#fff'}}>Not Found</Text></View>
const formatDateTime = (dateStr: string) => {
if (!dateStr) return ''
const date = new Date(dateStr)
const year = date.getFullYear()
const month = (date.getMonth() + 1).toString().padStart(2, '0')
const day = date.getDate().toString().padStart(2, '0')
const hour = date.getHours().toString().padStart(2, '0')
const minute = date.getMinutes().toString().padStart(2, '0')
return `${year}/${month}/${day} ${hour}:${minute}`
}
return (
<View className='page-container'>
<ScrollView scrollY className='scroll-content'>
@@ -109,6 +120,27 @@ export default function CourseDetail() {
</View>
</View>
{/* 开课时间 */}
{detail.is_fixed_schedule && (detail.start_time || detail.end_time) && (
<View className='section schedule-section'>
<Text className='section-title'></Text>
<View className='schedule-box'>
{detail.start_time && (
<View className='time-row'>
<Text className='label'></Text>
<Text className='value'>{formatDateTime(detail.start_time)}</Text>
</View>
)}
{detail.end_time && (
<View className='time-row'>
<Text className='label'></Text>
<Text className='value'>{formatDateTime(detail.end_time)}</Text>
</View>
)}
</View>
</View>
)}
{/* 课程简介 */}
<View className='section'>
<Text className='section-title'></Text>

View File

@@ -92,9 +92,31 @@ export default function Checkout() {
}, [items])
const submitOrder = async () => {
if (!address) {
Taro.showToast({ title: '请选择收货地址', icon: 'none' })
return
// 免费课程不需要地址
const isFreeCourse = params.type === 'course' && items.length > 0 && Number(items[0].price) === 0
if (!address && !isFreeCourse) {
// 尝试调用 chooseAddress
try {
await chooseAddress()
if (!address) {
Taro.showToast({ title: '请选择收货地址', icon: 'none' })
return
}
} catch (e) {
Taro.showToast({ title: '请选择收货地址', icon: 'none' })
return
}
}
// 如果是免费课程且没有地址,使用默认值
const orderAddress = address || {
userName: '免费课程学员',
telNumber: '13800000000',
provinceName: '',
cityName: '',
countyName: '',
detailInfo: '线上课程'
}
Taro.showLoading({ title: '提交中...' })
@@ -102,11 +124,13 @@ export default function Checkout() {
try {
const orderPromises = items.map(item => {
const type = params.type || 'config'
// 构造订单数据
const orderData: any = {
quantity: item.quantity,
customer_name: address.userName,
phone_number: address.telNumber,
shipping_address: `${address.provinceName}${address.cityName}${address.countyName}${address.detailInfo}`,
customer_name: orderAddress.userName,
phone_number: orderAddress.telNumber,
shipping_address: `${orderAddress.provinceName}${orderAddress.cityName}${orderAddress.countyName}${orderAddress.detailInfo}`,
ref_code: Taro.getStorageSync('ref_code') || ''
}

View File

@@ -23,7 +23,19 @@ export default function Payment() {
const handlePay = async () => {
if (!order) return
setLoading(true)
// 如果是免费订单,直接显示成功并跳转
if (parseFloat(order.total_price) <= 0) {
Taro.showToast({ title: '报名成功', icon: 'success' })
setTimeout(() => {
Taro.redirectTo({ url: '/pages/order/list' })
}, 1500)
setLoading(false)
return
}
try {
const params = await prepayMiniprogram(order.id)
@@ -81,7 +93,9 @@ export default function Payment() {
</View>
<View className='btn-area safe-area-bottom'>
<Button className='btn-pay' onClick={handlePay} loading={loading}></Button>
<Button className='btn-pay' onClick={handlePay} loading={loading}>
{parseFloat(order.total_price) <= 0 ? '确认报名' : '微信支付'}
</Button>
</View>
</View>
)