|
|
@@ -1,29 +1,34 @@
|
|
|
<template>
|
|
|
<view class="enroll-page">
|
|
|
<view class="section-card">
|
|
|
- <text class="section-title">可报名班次</text>
|
|
|
- <text class="card-desc">选择您想参加的班次,填写报名信息</text>
|
|
|
+ <text class="section-title">选择课程</text>
|
|
|
+ <text class="card-desc">课程决定学习内容,报名后按所选期次(班次)进班上课</text>
|
|
|
<view v-if="loading" class="empty-tip">加载中…</view>
|
|
|
- <view v-else-if="classList.length === 0" class="empty-tip">暂无可报名班次</view>
|
|
|
+ <view v-else-if="courseGroups.length === 0" class="empty-tip">暂无可报名课程</view>
|
|
|
<view v-else>
|
|
|
- <view class="class-card" v-for="item in classList" :key="item.id">
|
|
|
- <view class="class-head">
|
|
|
- <text class="class-name">{{ item.name }}</text>
|
|
|
- <text class="class-price" v-if="item.memberPrice > 0 && item.memberPrice < item.price">
|
|
|
- 会员价 ¥{{ fenToYuan(item.memberPrice) }}
|
|
|
- </text>
|
|
|
- <text class="class-price" v-else-if="item.price > 0">¥{{ fenToYuan(item.price) }}</text>
|
|
|
- <text class="class-price-free" v-else>免费</text>
|
|
|
+ <view class="course-group" v-for="(g, gi) in courseGroups" :key="gi">
|
|
|
+ <view class="group-head">
|
|
|
+ <text class="group-course">{{ g.courseName }}</text>
|
|
|
</view>
|
|
|
- <text class="class-time">{{ item.time || '时间待定' }}</text>
|
|
|
- <text class="class-place">{{ item.place || '地点待定' }}</text>
|
|
|
- <view class="class-foot">
|
|
|
- <text class="class-capacity">
|
|
|
- 已报名 {{ item.num }} / {{ item.capacity }}
|
|
|
- <text v-if="isFull(item)" class="full-tag">已满</text>
|
|
|
- <text v-else class="remain-tag">余 {{ item.capacity - item.num }}</text>
|
|
|
- </text>
|
|
|
- <button class="enroll-btn" :disabled="isFull(item)" @click="goForm(item.id)">立即报名</button>
|
|
|
+ <view class="class-card" v-for="item in g.classes" :key="item.id">
|
|
|
+ <view class="class-head">
|
|
|
+ <text class="class-name">{{ item.name }}</text>
|
|
|
+ <text class="class-price" v-if="item.memberPrice > 0 && item.memberPrice < item.price">
|
|
|
+ 会员价 ¥{{ fenToYuan(item.memberPrice) }}
|
|
|
+ </text>
|
|
|
+ <text class="class-price" v-else-if="item.price > 0">¥{{ fenToYuan(item.price) }}</text>
|
|
|
+ <text class="class-price-free" v-else>免费</text>
|
|
|
+ </view>
|
|
|
+ <text class="class-time">{{ item.time || '时间待定' }}</text>
|
|
|
+ <text class="class-place">{{ item.place || '地点待定' }}</text>
|
|
|
+ <view class="class-foot">
|
|
|
+ <text class="class-capacity">
|
|
|
+ 已报名 {{ item.num }} / {{ item.capacity }}
|
|
|
+ <text v-if="isFull(item)" class="full-tag">已满</text>
|
|
|
+ <text v-else class="remain-tag">余 {{ item.capacity - item.num }}</text>
|
|
|
+ </text>
|
|
|
+ <button class="enroll-btn" :disabled="isFull(item)" @click="goForm(item)">立即报名</button>
|
|
|
+ </view>
|
|
|
</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
@@ -36,7 +41,10 @@
|
|
|
<view v-else>
|
|
|
<view class="mine-item" v-for="item in mineList" :key="item.id">
|
|
|
<view class="mine-head">
|
|
|
- <text class="mine-class">{{ item.className || ('班次' + item.classId) }}</text>
|
|
|
+ <text class="mine-class">
|
|
|
+ <text v-if="item.courseName" class="mine-course">{{ item.courseName }}</text>
|
|
|
+ {{ item.className || '' }}
|
|
|
+ </text>
|
|
|
<text class="mine-status">{{ statusLabel(item.status) }}</text>
|
|
|
</view>
|
|
|
<text class="mine-time" v-if="item.createdAt">报名时间:{{ formatDateTime(item.createdAt) }}</text>
|
|
|
@@ -67,6 +75,24 @@ export default {
|
|
|
this.loadClasses()
|
|
|
this.loadMine()
|
|
|
},
|
|
|
+ computed: {
|
|
|
+ // 报名对象=课程:可报名班次按课程分组(一组=一门课程下的各期班次)
|
|
|
+ courseGroups() {
|
|
|
+ var groups = []
|
|
|
+ var index = {}
|
|
|
+ var list = this.classList || []
|
|
|
+ for (var i = 0; i < list.length; i++) {
|
|
|
+ var item = list[i]
|
|
|
+ var key = item.courseId || ('course-' + item.id)
|
|
|
+ if (!index[key]) {
|
|
|
+ index[key] = { courseId: item.courseId, courseName: item.courseName || '课程', classes: [] }
|
|
|
+ groups.push(index[key])
|
|
|
+ }
|
|
|
+ index[key].classes.push(item)
|
|
|
+ }
|
|
|
+ return groups
|
|
|
+ }
|
|
|
+ },
|
|
|
methods: {
|
|
|
fenToYuan: fenToYuan,
|
|
|
formatDateTime: formatDateTime,
|
|
|
@@ -94,12 +120,15 @@ export default {
|
|
|
return item.capacity != null && item.num != null && item.num >= item.capacity
|
|
|
},
|
|
|
statusLabel(status) {
|
|
|
- var map = { pending: '待支付', paid: '已支付', confirmed: '已确认', cancelled: '已取消' }
|
|
|
+ var map = { pending: '待支付', paid: '已支付', reviewing: '进班审核中', confirmed: '已进班', rejected: '进班被拒', cancelled: '已取消' }
|
|
|
return map[status] || status || '未知'
|
|
|
},
|
|
|
- goForm(classId) {
|
|
|
+ goForm(item) {
|
|
|
var userInfo = uni.getStorageSync('userInfo') || {}
|
|
|
- uni.navigateTo({ url: '/pages/enroll/form?classId=' + classId + '&name=' + (userInfo.name || '') + '&phone=' + (userInfo.phone || '') })
|
|
|
+ // 报名对象=课程:透传 courseId(报名单挂课程)+ 课程名,班次为所选期次
|
|
|
+ var courseName = ''
|
|
|
+ if (item.courseName) courseName = item.courseName
|
|
|
+ uni.navigateTo({ url: '/pages/enroll/form?classId=' + item.id + '&courseId=' + (item.courseId || '') + '&courseName=' + encodeURIComponent(courseName) + '&className=' + encodeURIComponent(item.name || '') + '&name=' + (userInfo.name || '') + '&phone=' + (userInfo.phone || '') })
|
|
|
},
|
|
|
goPay(item) {
|
|
|
uni.navigateTo({ url: '/pages/pay/index?enrollmentId=' + item.id })
|
|
|
@@ -130,7 +159,10 @@ export default {
|
|
|
.section-title { display: block; font-size: 32rpx; font-weight: 700; color: #1E293B; margin-bottom: 8rpx; border-left: 8rpx solid #F97316; padding-left: 16rpx; }
|
|
|
.card-desc { display: block; font-size: 26rpx; color: #64748B; margin-bottom: 24rpx; }
|
|
|
.empty-tip { font-size: 26rpx; color: #94A3B8; padding: 32rpx 0; text-align: center; }
|
|
|
-.class-card { border: 2rpx solid #E2E8F0; border-radius: 12rpx; padding: 24rpx; margin-bottom: 20rpx; }
|
|
|
+.course-group { margin-bottom: 8rpx; }
|
|
|
+.group-head { display: flex; align-items: center; margin-bottom: 16rpx; }
|
|
|
+.group-course { font-size: 28rpx; font-weight: 600; color: #1E293B; }
|
|
|
+.class-card { border: 2rpx solid #E2E8F0; border-radius: 12rpx; padding: 24rpx; margin-bottom: 20rpx; margin-left: 16rpx; }
|
|
|
.class-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12rpx; }
|
|
|
.class-name { font-size: 30rpx; font-weight: 600; color: #1E293B; flex: 1; }
|
|
|
.class-price { font-size: 28rpx; color: #F97316; font-weight: 600; }
|
|
|
@@ -146,7 +178,8 @@ export default {
|
|
|
.mine-item { padding: 20rpx 0; border-bottom: 1rpx solid #F1F5F9; }
|
|
|
.mine-item:last-child { border-bottom: none; }
|
|
|
.mine-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8rpx; }
|
|
|
-.mine-class { font-size: 28rpx; color: #1E293B; font-weight: 500; }
|
|
|
+.mine-class { font-size: 28rpx; color: #1E293B; font-weight: 500; flex: 1; }
|
|
|
+.mine-course { font-weight: 700; margin-right: 8rpx; }
|
|
|
.mine-status { font-size: 24rpx; color: #F97316; }
|
|
|
.mine-time { font-size: 24rpx; color: #94A3B8; }
|
|
|
.mine-actions { display: flex; justify-content: flex-end; margin-top: 16rpx; }
|