更新会员端个人页面中团课签到记录显示
This commit was merged in pull request #50.
This commit is contained in:
@@ -71,6 +71,33 @@
|
|||||||
<text class="sign-status" :class="record.status">{{ record.statusLabel }}</text>
|
<text class="sign-status" :class="record.status">{{ record.statusLabel }}</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
<view v-if="signInRecords.length === 0" class="empty-hint">
|
||||||
|
<text>暂无签到记录</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view class="sign-section">
|
||||||
|
<view class="sign-header">
|
||||||
|
<view class="section-title-row">
|
||||||
|
<text class="section-symbol">✓</text>
|
||||||
|
<text class="section-title">团课签到记录</text>
|
||||||
|
</view>
|
||||||
|
<text class="section-more">最近{{ courseCheckInRecords.length }}条</text>
|
||||||
|
</view>
|
||||||
|
<view v-for="(record, idx) in courseCheckInRecords" :key="'gc' + idx" class="sign-item">
|
||||||
|
<view class="sign-left">
|
||||||
|
<text class="sign-date">{{ record.fullDate }}</text>
|
||||||
|
<text class="sign-time">{{ record.shortTime }}</text>
|
||||||
|
</view>
|
||||||
|
<view class="sign-right">
|
||||||
|
<text class="sign-type">{{ record.courseName }}</text>
|
||||||
|
<text class="sign-source">{{ record.location }}</text>
|
||||||
|
<text class="sign-status success">已签到</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view v-if="courseCheckInRecords.length === 0" class="empty-hint">
|
||||||
|
<text>暂无团课签到记录</text>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<view class="bottom-safe"></view>
|
<view class="bottom-safe"></view>
|
||||||
@@ -116,6 +143,7 @@
|
|||||||
<script>
|
<script>
|
||||||
const store = require('../../store/index')
|
const store = require('../../store/index')
|
||||||
const memberApi = require('../../api/member')
|
const memberApi = require('../../api/member')
|
||||||
|
const bookingApi = require('../../api/booking')
|
||||||
const defaultAvatar = require('../../common/img/20200414210134_qbeyi.jpg')
|
const defaultAvatar = require('../../common/img/20200414210134_qbeyi.jpg')
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -131,6 +159,7 @@
|
|||||||
totalSignInDays: 0, monthSignInCount: 0
|
totalSignInDays: 0, monthSignInCount: 0
|
||||||
},
|
},
|
||||||
signInRecords: [],
|
signInRecords: [],
|
||||||
|
courseCheckInRecords: [],
|
||||||
// 编辑弹窗
|
// 编辑弹窗
|
||||||
showEdit: false,
|
showEdit: false,
|
||||||
saving: false,
|
saving: false,
|
||||||
@@ -171,10 +200,20 @@
|
|||||||
async loadData() {
|
async loadData() {
|
||||||
this.loading = true
|
this.loading = true
|
||||||
try {
|
try {
|
||||||
const [memberResult, signInResult] = await Promise.allSettled([
|
const memberInfo = store.getMemberInfo()
|
||||||
|
const memberId = memberInfo ? (memberInfo.memberId || memberInfo.id) : null
|
||||||
|
|
||||||
|
const promises = [
|
||||||
memberApi.getMemberInfo(),
|
memberApi.getMemberInfo(),
|
||||||
memberApi.getCheckInRecords({ page: 0, size: 5 })
|
memberApi.getCheckInRecords({ page: 0, size: 5 })
|
||||||
])
|
]
|
||||||
|
if (memberId) {
|
||||||
|
promises.push(bookingApi.getMemberBookings(memberId))
|
||||||
|
}
|
||||||
|
|
||||||
|
const results = await Promise.allSettled(promises)
|
||||||
|
const [memberResult, signInResult] = results
|
||||||
|
|
||||||
if (memberResult.status === 'fulfilled') {
|
if (memberResult.status === 'fulfilled') {
|
||||||
const info = memberResult.value
|
const info = memberResult.value
|
||||||
this.userInfo = {
|
this.userInfo = {
|
||||||
@@ -203,6 +242,38 @@
|
|||||||
statusLabel: r.status === 'SUCCESS' || r.status === 1 ? '成功' : '失败'
|
statusLabel: r.status === 'SUCCESS' || r.status === 1 ? '成功' : '失败'
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
// 处理团课签到记录(预约状态为「已出席」的课程)
|
||||||
|
if (results.length >= 3 && results[2].status === 'fulfilled') {
|
||||||
|
const bookings = results[2].value
|
||||||
|
const arr = Array.isArray(bookings) ? bookings : (bookings && bookings.content ? bookings.content : [])
|
||||||
|
this.courseCheckInRecords = arr
|
||||||
|
.filter(b => String(b.status) === '2')
|
||||||
|
.map(b => {
|
||||||
|
const st = b.courseStartTime || ''
|
||||||
|
const dt = st ? new Date(st.replace(/ /, 'T')) : null
|
||||||
|
const y = dt && !isNaN(dt) ? String(dt.getFullYear()) : ''
|
||||||
|
const mo = dt && !isNaN(dt) ? String(dt.getMonth() + 1).padStart(2, '0') : ''
|
||||||
|
const d = dt && !isNaN(dt) ? String(dt.getDate()).padStart(2, '0') : ''
|
||||||
|
const hh = dt && !isNaN(dt) ? String(dt.getHours()).padStart(2, '0') : '--'
|
||||||
|
const mm = dt && !isNaN(dt) ? String(dt.getMinutes()).padStart(2, '0') : '--'
|
||||||
|
const inTime = b.checkInTime || b.updatedAt || ''
|
||||||
|
const indt = inTime ? new Date(inTime.replace(/ /, 'T')) : null
|
||||||
|
let checkInTimeStr = ''
|
||||||
|
if (indt && !isNaN(indt)) {
|
||||||
|
checkInTimeStr = String(indt.getMonth() + 1).padStart(2, '0') + '-' +
|
||||||
|
String(indt.getDate()).padStart(2, '0') + ' ' +
|
||||||
|
String(indt.getHours()).padStart(2, '0') + ':' +
|
||||||
|
String(indt.getMinutes()).padStart(2, '0')
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
courseName: b.courseName || '未命名课程',
|
||||||
|
location: b.location || '',
|
||||||
|
fullDate: y + '-' + mo + '-' + d,
|
||||||
|
shortTime: hh + ':' + mm,
|
||||||
|
checkInTime: checkInTimeStr || (mo + '-' + d)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('个人中心数据加载失败:', e)
|
console.error('个人中心数据加载失败:', e)
|
||||||
} finally {
|
} finally {
|
||||||
@@ -318,11 +389,12 @@
|
|||||||
.sign-date { font-size: 14px; font-weight: 600; color: #1E1E1E; }
|
.sign-date { font-size: 14px; font-weight: 600; color: #1E1E1E; }
|
||||||
.sign-time { font-size: 12px; color: #7A7E84; margin-top: 2px; }
|
.sign-time { font-size: 12px; color: #7A7E84; margin-top: 2px; }
|
||||||
.sign-right { display: flex; align-items: center; }
|
.sign-right { display: flex; align-items: center; }
|
||||||
.sign-type { font-size: 12px; color: #7A7E84; margin-right: 6px; }
|
.sign-type { font-size: 12px; color: #7A7E84; margin-right: 6px; max-width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||||
.sign-source { font-size: 11px; color: #BDBDBD; background: #F5F7FA; padding: 1px 6px; border-radius: 8px; margin-right: 6px; }
|
.sign-source { font-size: 11px; color: #BDBDBD; background: #F5F7FA; padding: 1px 6px; border-radius: 8px; margin-right: 6px; }
|
||||||
.sign-status { font-size: 12px; font-weight: 600; padding: 3px 10px; border-radius: 20px; }
|
.sign-status { font-size: 12px; font-weight: 600; padding: 3px 10px; border-radius: 20px; }
|
||||||
.sign-status.success { background: rgba(0,230,118,0.15); color: #00C853; }
|
.sign-status.success { background: rgba(0,230,118,0.15); color: #00C853; }
|
||||||
.sign-status.fail { background: rgba(255,82,82,0.15); color: #FF5252; }
|
.sign-status.fail { background: rgba(255,82,82,0.15); color: #FF5252; }
|
||||||
|
.empty-hint { text-align: center; padding: 20px 0; color: #BDBDBD; font-size: 13px; }
|
||||||
.bottom-safe { height: 50px; }
|
.bottom-safe { height: 50px; }
|
||||||
/* 编辑弹窗 */
|
/* 编辑弹窗 */
|
||||||
.edit-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); z-index: 1000; display: flex; align-items: center; justify-content: center; }
|
.edit-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); z-index: 1000; display: flex; align-items: center; justify-content: center; }
|
||||||
|
|||||||
Reference in New Issue
Block a user