|
@@ -0,0 +1,281 @@
|
|
|
+import dayjs from 'dayjs'
|
|
|
+import isBetween from 'dayjs/plugin/isBetween'
|
|
|
+dayjs.extend(isBetween)
|
|
|
+import { List, Image, Calendar, Cell } from 'vant'
|
|
|
+import OFullRefresh from '@/components/the-full-refresh'
|
|
|
+import DetailItem from './modals/detail-item'
|
|
|
+import { defineComponent, onMounted, reactive, ref, computed } from 'vue'
|
|
|
+import { useRoute } from 'vue-router'
|
|
|
+import styles from './exercis-detail.module.less'
|
|
|
+import request from '@/helpers/request'
|
|
|
+import { state as baseState } from '@/state'
|
|
|
+import TheSticky from '@/components/the-sticky'
|
|
|
+import ColHeader from '@/components/col-header'
|
|
|
+import ColResult from '@/components/col-result'
|
|
|
+import bgImg from '../images/bg-image.png'
|
|
|
+import iconStudent from '@common/images/icon_student.png'
|
|
|
+import iconLogo from '../member-center/images/icon-logo-default.png'
|
|
|
+import iconLogoActive from '../member-center/images/icon-logo.png'
|
|
|
+
|
|
|
+export default defineComponent({
|
|
|
+ name: 'exercis-detail',
|
|
|
+ setup() {
|
|
|
+ const route = useRoute()
|
|
|
+ const state = reactive({
|
|
|
+ showPopoverTime: false,
|
|
|
+ currentDate: [dayjs().format('YYYY'), dayjs().format('MM')],
|
|
|
+ isClick: false,
|
|
|
+ practiceMonthName: route.query.practiceMonthName
|
|
|
+ ? route.query.practiceMonthName
|
|
|
+ : dayjs().format('YYYY') + '年' + dayjs().format('MM') + '月',
|
|
|
+ userTrainOverView: {
|
|
|
+ trainDays: 0,
|
|
|
+ trainNum: 0,
|
|
|
+ trainTime: 0
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ const userInfo = computed(() => {
|
|
|
+ const users = baseState.user.data
|
|
|
+ return {
|
|
|
+ username: users?.username,
|
|
|
+ phone: users?.phone,
|
|
|
+ avatar: users?.heardUrl,
|
|
|
+ id: users?.userId,
|
|
|
+ memberRankSettingId: users?.memberRankSettingId,
|
|
|
+ isVip: users?.isVip,
|
|
|
+ membershipDays: users?.membershipDays,
|
|
|
+ membershipEndTime: users?.membershipEndTime
|
|
|
+ }
|
|
|
+ })
|
|
|
+ const forms = reactive({
|
|
|
+ practiceMonth: dayjs().day(1).format('YYYYMMDD'),
|
|
|
+ startTime: '2023-09',
|
|
|
+ endTime: dayjs().day(7).format('YYYY-MM-DD'),
|
|
|
+ page: 1,
|
|
|
+ rows: 20
|
|
|
+ })
|
|
|
+ const refreshing = ref(false)
|
|
|
+ const loading = ref(false)
|
|
|
+ const finished = ref(false)
|
|
|
+ const showContact = ref(false)
|
|
|
+ const list = ref([])
|
|
|
+ const getList = async () => {
|
|
|
+ if (state.isClick) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ state.isClick = true
|
|
|
+ if (refreshing.value) {
|
|
|
+ list.value = []
|
|
|
+ forms.page = 1
|
|
|
+ refreshing.value = false
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ const { data } = await request.get(
|
|
|
+ `/api-student/sysMusicRecord/studentTrainData`,
|
|
|
+ {
|
|
|
+ params: { ...forms }
|
|
|
+ }
|
|
|
+ )
|
|
|
+
|
|
|
+ // 在第一页的时候才处理数据显示
|
|
|
+ if (data.detail.pageNo === 1) {
|
|
|
+ state.userTrainOverView = data.userTrainOverView
|
|
|
+ }
|
|
|
+ if (list.value.length > 0 && data.detail.pageNo === 1) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ list.value = list.value.concat(data.detail.rows || [])
|
|
|
+ forms.page = data.detail.pageNo + 1
|
|
|
+ showContact.value = list.value.length > 0
|
|
|
+ loading.value = false
|
|
|
+ finished.value = data.detail.pageNo >= data.detail.totalPage
|
|
|
+ } catch {
|
|
|
+ showContact.value = false
|
|
|
+ finished.value = true
|
|
|
+ }
|
|
|
+ state.isClick = false
|
|
|
+ }
|
|
|
+
|
|
|
+ onMounted(async () => {
|
|
|
+ await getList()
|
|
|
+ })
|
|
|
+
|
|
|
+ const checkTimer = (val: any) => {
|
|
|
+ // forms.practiceMonth = val.selectedValues[0] + val.selectedValues[1]
|
|
|
+ // state.practiceMonthName =
|
|
|
+ // val.selectedValues[0] + '年' + val.selectedValues[1] + '月'
|
|
|
+ state.showPopoverTime = false
|
|
|
+ refreshing.value = true
|
|
|
+ getList()
|
|
|
+ }
|
|
|
+
|
|
|
+ const onRefresh = () => {
|
|
|
+ finished.value = false
|
|
|
+ // 重新加载数据
|
|
|
+ // 将 loading 设置为 true,表示处于加载状态
|
|
|
+ loading.value = true
|
|
|
+ getList()
|
|
|
+ }
|
|
|
+
|
|
|
+ return () => (
|
|
|
+ <div class={[styles.exercisContainer]}>
|
|
|
+ <div class={styles.topWrap}>
|
|
|
+ <TheSticky position="top">
|
|
|
+ <ColHeader
|
|
|
+ border={false}
|
|
|
+ background={'transparent'}
|
|
|
+ color={'#333333'}
|
|
|
+ />
|
|
|
+ <Cell
|
|
|
+ class={styles.userMember}
|
|
|
+ labelClass={styles.timeRemaining}
|
|
|
+ v-slots={{
|
|
|
+ icon: () => (
|
|
|
+ <div class={styles.userImgSection}>
|
|
|
+ <Image
|
|
|
+ class={styles.userImg}
|
|
|
+ src={userInfo.value.avatar || iconStudent}
|
|
|
+ fit="cover"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ ),
|
|
|
+ title: () => (
|
|
|
+ <div class={styles.userInfo}>
|
|
|
+ <span class={styles.name}>{userInfo.value.username}</span>
|
|
|
+ <Image
|
|
|
+ class={styles.level}
|
|
|
+ src={userInfo.value.isVip ? iconLogoActive : iconLogo}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ ),
|
|
|
+ label: () => <div class={styles.subjectName}></div>
|
|
|
+ }}
|
|
|
+ ></Cell>
|
|
|
+ </TheSticky>
|
|
|
+ </div>
|
|
|
+ <img class={styles.bgImg} src={bgImg} />
|
|
|
+ {/* <div class={styles.topInfoRight}>
|
|
|
+ <div class={styles.infoDay}>
|
|
|
+ <p class={styles.infoDayMain}>
|
|
|
+ {infoDetail.value.practiceDays
|
|
|
+ ? infoDetail.value.practiceDays
|
|
|
+ : 0}
|
|
|
+ </p>
|
|
|
+ <p class={styles.infoDaysub}>
|
|
|
+ <img src={iconDays} />
|
|
|
+ 练习天数(天)
|
|
|
+ </p>
|
|
|
+ </div>
|
|
|
+ <div class={styles.infoTime}>
|
|
|
+ <p class={styles.infoDayMain}>
|
|
|
+ {infoDetail.value.practiceTimes
|
|
|
+ ? Math.floor(infoDetail.value.practiceTimes / 60)
|
|
|
+ : 0}
|
|
|
+
|
|
|
+ </p>
|
|
|
+ <p class={styles.infoDaysub}>
|
|
|
+ <img src={iconClock} />
|
|
|
+ 练习时长(分钟)
|
|
|
+ </p>
|
|
|
+ </div>
|
|
|
+ </div> */}
|
|
|
+ {/* <CellGroup inset>
|
|
|
+ <Cell
|
|
|
+ class={styles.select}
|
|
|
+ center
|
|
|
+ isLink
|
|
|
+ onClick={() => (state.showPopoverTime = true)}
|
|
|
+ >
|
|
|
+ {{
|
|
|
+ // icon: () => <img class={styles.icon} src={iconData} />,
|
|
|
+ title: () => (
|
|
|
+ <div class="van-ellipsis">{state.practiceMonthName}</div>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </Cell>
|
|
|
+ </CellGroup>
|
|
|
+ */}
|
|
|
+ {showContact.value ? (
|
|
|
+ <OFullRefresh
|
|
|
+ v-model:modelValue={refreshing.value}
|
|
|
+ onRefresh={onRefresh}
|
|
|
+ style={{ minHeight: `calc(100vh - var(--header-height))` }}
|
|
|
+ >
|
|
|
+ <List
|
|
|
+ loading-text=" "
|
|
|
+ finished={finished.value}
|
|
|
+ finished-text=" "
|
|
|
+ onLoad={getList}
|
|
|
+ >
|
|
|
+ {list.value.map((item: any) => (
|
|
|
+ <DetailItem item={item} />
|
|
|
+ ))}
|
|
|
+ </List>
|
|
|
+ </OFullRefresh>
|
|
|
+ ) : (
|
|
|
+ <div
|
|
|
+ style={{
|
|
|
+ height: `calc(100vh - var(--header-height))`,
|
|
|
+ display: 'flex',
|
|
|
+ alignItems: 'center'
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <ColResult tips="暂无学练统计" btnStatus={false} />
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+
|
|
|
+ <Calendar
|
|
|
+ v-model:show={state.showPopoverTime}
|
|
|
+ firstDayOfWeek={1}
|
|
|
+ showConfirm={false}
|
|
|
+ type="range"
|
|
|
+ title="周期选择"
|
|
|
+ maxRange={7}
|
|
|
+ minDate={new Date('2023-02-27')}
|
|
|
+ defaultDate={[
|
|
|
+ dayjs(forms.practiceMonth).toDate(),
|
|
|
+ dayjs(forms.endTime).toDate()
|
|
|
+ ]}
|
|
|
+ style={{
|
|
|
+ height: '70%'
|
|
|
+ }}
|
|
|
+ onSelect={(item: any) => {
|
|
|
+ forms.practiceMonth = ''
|
|
|
+ forms.endTime = ''
|
|
|
+ if (
|
|
|
+ !dayjs(item[0]).isBetween(
|
|
|
+ dayjs(forms.practiceMonth),
|
|
|
+ dayjs(forms.endTime)
|
|
|
+ )
|
|
|
+ ) {
|
|
|
+ const week = dayjs(item[0]).day()
|
|
|
+ if (week === 0) {
|
|
|
+ // 星期天
|
|
|
+ forms.practiceMonth = dayjs(item[0])
|
|
|
+ .subtract(6, 'day')
|
|
|
+ .format('YYYYMMDD')
|
|
|
+ forms.endTime = dayjs(item[0]).format('YYYY-MM-DD')
|
|
|
+ } else if (week === 1) {
|
|
|
+ // 星期一
|
|
|
+ forms.practiceMonth = dayjs(item[0]).format('YYYYMMDD')
|
|
|
+ forms.endTime = dayjs(item[0])
|
|
|
+ .add(6, 'day')
|
|
|
+ .format('YYYY-MM-DD')
|
|
|
+ } else {
|
|
|
+ forms.practiceMonth = dayjs(item[0])
|
|
|
+ .subtract(week - 1, 'day')
|
|
|
+ .format('YYYYMMDD')
|
|
|
+ forms.endTime = dayjs(item[0])
|
|
|
+ .add(7 - week, 'day')
|
|
|
+ .format('YYYY-MM-DD')
|
|
|
+ }
|
|
|
+ }
|
|
|
+ state.showPopoverTime = false
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }
|
|
|
+})
|