Files
gym-manage/gym-manage-uniapp/pages/memberInfo/checkInHistory.vue
T
2026-06-29 13:35:29 +08:00

144 lines
5.6 KiB
Vue

<template>
<view class="scroll-container theme-light">
<view class="bt-page">
<PageHeader title="签到记录" subtitle="" :show-back="true" />
<view class="mi-mod-tabs">
<view
v-for="tab in tabs"
:key="tab.key"
class="bt-tab"
:class="{ 'bt-tab--active': activeFilter === tab.key }"
hover-class="mi-tap-tab--hover"
:hover-stay-time="150"
@tap="activeFilter = tab.key"
>
<text class="bt-tab__text">{{ tab.label }}</text>
</view>
</view>
<view class="bt-page__body">
<view class="bt-card">
<text class="bt-card__title" v-if="filteredList.length > 0"> {{ filteredList.length }} 条记录</text>
<view
v-for="item in filteredList"
:key="item.id"
class="mi-mod-checkin-row"
hover-class="mi-tap-row--hover"
:hover-stay-time="150"
@tap="showDetail(item)"
>
<view class="mi-mod-checkin-row__icon" :class="'mi-mod-checkin-row__icon--' + item.tagTheme">
<image class="mi-mod-checkin-row__icon-img" src="https://gymfuture.oss-cn-chengdu.aliyuncs.com/static/images/usercheck.png" mode="aspectFit" />
</view>
<view class="mi-mod-checkin-row__info">
<text class="mi-mod-checkin-row__title">{{ item.title }}</text>
<text class="mi-mod-checkin-row__time">{{ item.time }} · {{ item.location }}</text>
</view>
<view class="mi-mod-checkin-row__tag" :class="'mi-mod-checkin-row__tag--' + item.tagTheme">
<text class="mi-mod-checkin-row__tag-text">{{ item.tag }}</text>
</view>
</view>
<view v-if="filteredList.length === 0 && !loading" class="bt-empty">
<text class="bt-empty__text">暂无签到记录</text>
</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import { ref, computed, onMounted } from 'vue'
import PageHeader from '@/components/index/PageHeader.vue'
import { getCheckInRecords } from '@/api/main.js'
const tabs = ref([
{ key: 'all', label: '全部' },
{ key: 'signin', label: '签到' }
])
const activeFilter = ref('all')
const list = ref([])
const loading = ref(false)
const filteredList = computed(() => {
if (activeFilter.value === 'all') return list.value
// "签到" tab: 筛选普通签到记录(非团课/私教类)
if (activeFilter.value === 'signin') {
return list.value.filter((i) => i.tagTheme === 'default')
}
return list.value.filter((i) => i.tagTheme === activeFilter.value)
})
async function fetchCheckInHistory() {
if (loading.value) return
loading.value = true
console.log('[checkInHistory] 开始获取签到记录')
try {
const res = await getCheckInRecords({ page: 0, size: 50 })
console.log('[checkInHistory] getCheckInRecords 返回:', JSON.stringify(res, null, 2))
const records = res?.data?.content || res?.content || []
if (Array.isArray(records) && records.length > 0) {
list.value = records.map((record) => ({
id: record.id,
title: record.courseName || record.name || '签到',
time: formatCheckInTime(record.checkInTime || record.createTime),
location: record.location || record.address || '',
tag: record.courseType || record.type || '签到',
tagTheme: getTagTheme(record.courseType || record.type)
}))
} else {
list.value = []
}
} catch (e) {
console.error('[checkInHistory] 获取签到记录失败:', e)
list.value = []
} finally {
loading.value = false
}
}
function formatCheckInTime(timeStr) {
if (!timeStr) return ''
try {
const d = new Date(timeStr)
const month = d.getMonth() + 1
const day = d.getDate()
const hour = d.getHours().toString().padStart(2, '0')
const minute = d.getMinutes().toString().padStart(2, '0')
return `${month}${day}${hour}:${minute}`
} catch {
return timeStr
}
}
function getTagTheme(type) {
if (!type) return 'default'
const t = type.toLowerCase()
if (t.includes('团课') || t.includes('group')) return 'primary'
if (t.includes('私教') || t.includes('personal')) return 'accent'
if (t.includes('线上') || t.includes('online')) return 'info'
return 'default'
}
function showDetail(item) {
uni.showModal({
title: item.title,
content: `${item.time}\n${item.location ? '地点:' + item.location + '\n' : ''}类型:${item.tag}`,
showCancel: false
})
}
onMounted(() => {
fetchCheckInHistory()
})
</script>
<style lang="scss">
@import '@/common/style/base.css';
@import '@/common/style/memberInfo/pages/page-reset.css';
@import '@/common/style/memberInfo/pages/sub-page-base.css';
@import '@/common/style/memberInfo/member-info-component-reset.css';
@import '@/common/style/memberInfo/member-info-tap.css';
@import '@/common/style/memberInfo/pages/body-test-common.css';
@import '@/common/style/memberInfo/pages/module-pages-common.css';
</style>