import { computed, defineComponent, onMounted, reactive, ref, watch } from 'vue' import { Image, Tabs, Tab, List, Button, Popup, Dialog, Sticky, Swipe, SwipeItem } from 'vant' import styles from './index.module.less' import TheSticky from '@/components/the-sticky' import ColHeader from '@/components/col-header' import { useWindowScroll, useEventListener } from '@vueuse/core' import request from '@/helpers/request' import iconMenu from './images/icon-menu.png' import iconRightTop from './images/icon-right-top.png' import iconAlbumCover from '../../images/icon-album-cover.png' import iconTimer from './images/icon-timer.png' import { state as baseState, setLogout } from '@/state' import Song from '../component/song' import { useRoute, useRouter } from 'vue-router' import ColResult from '@/components/col-result' import { moneyFormat } from '@/helpers/utils' import { orderStatus } from '@/views/order-detail/orderStatus' import { postMessage } from '@/helpers/native-message' import { browser } from '@/helpers/utils' // Import Swiper Vue.js components // import Swiper core and required modules import { Pagination } from 'swiper/modules' import { Swiper, SwiperSlide } from 'swiper/vue' // Import Swiper styles import 'swiper/css' import 'swiper/css/pagination' import CourseItem from '../lessonCourseware/component/CourseItem' export default defineComponent({ name: 'train-tool', setup() { const subjectType = sessionStorage.getItem('tool-subject-type') sessionStorage.removeItem('tool-subject-type') const route = useRoute() const router = useRouter() const background = ref('rgba(55, 205, 177, 0)') const color = ref('#fff') const state = reactive({ details: {} as any, buy: route.query.buy as any, albumId: route.query.albumId || null, activeTab: route.query.subjectType || 'SUBJECT', loadingAlbum: false, loading: false, finished: false, isError: false, list: [] as any, popupStatus: false, selectMember: {} as any, // 购买的月份 ensembleCounts: false, musicCounts: false, subjectCounts: false, coursewareCounts: false, tenantAlbumStatus: 0 as any, ablumStatus: false, heightV: 0, hasBuyStatus: true, // 是否能继续购买 albumList: [] as any // 专辑列表 }) const params = reactive({ page: 1, rows: 20 }) const apiSuffix = ref( baseState.platformType === 'STUDENT' ? '/api-student' : '/api-teacher' ) const isSingleAlbum = computed(() => { const query = route.query if (query.taId || (query.albumId && state.buy === '1')) { return true } else { return false } }) const getDetails = async () => { state.loadingAlbum = true try { // tenantGroupAlbum/buyAlbumInfo // 当我的曲目过来的时候才走单个查询 if (state.albumId && state.buy === '1') { let url = apiSuffix.value + '/userTenantAlbumRecord/detail' if (state.albumId) { url = url + '?albumId=' + state.albumId } const { data } = await request.post(url) state.albumList = [data || {}] state.details = data || {} } else { const url = apiSuffix.value + `/tenantGroupAlbum/buyAlbumInfo?tenantGroupAlbumId=${ route.query.taId || '' }&tenantAlbumId=${state.albumId || ''}` // if (state.albumId) { // url = url + '?albumId=' + state.albumId // } const { data } = await request.get(url) state.albumList = data || [] if (state.albumList.length > 0) { state.details = state.albumList[0] } else { // state.albumList if (!browser().isApp) { Dialog.alert({ title: '提示', message: '该专辑不可购买', confirmButtonText: '确定', confirmButtonColor: '#2dc7aa' }).then(() => { if (browser().isApp) { postMessage({ api: 'back' }) } else { setLogout() router.replace({ path: '/login' as any, query: { returnUrl: '/train-tool', ...route.query } }) } }) } } } } catch { // } state.loadingAlbum = false } watch( () => state.details, () => { state.ensembleCounts = state.details?.ensembleCounts <= 0 ? false : true state.subjectCounts = state.details?.subjectCounts <= 0 ? false : true state.musicCounts = state.details?.musicCounts <= 0 ? false : true state.coursewareCounts = state.details?.coursewareCounts <= 0 ? false : true if (state.subjectCounts) { state.activeTab = 'SUBJECT' } else if (state.musicCounts) { state.activeTab = 'MUSIC' } else if (state.ensembleCounts) { state.activeTab = 'ENSEMBLE' } else if (state.coursewareCounts) { state.activeTab = 'COURSEWARE' } // 带的参数 if (route.query.subjectType == 'SUBJECT' && state.subjectCounts) { state.activeTab = 'SUBJECT' } else if (route.query.subjectType == 'MUSIC' && state.musicCounts) { state.activeTab = 'MUSIC' } else if ( route.query.subjectType == 'ENSEMBLE' && state.ensembleCounts ) { state.activeTab = 'ENSEMBLE' } else if ( route.query.subjectType == 'COURSEWARE' && state.coursewareCounts ) { state.activeTab = 'COURSEWARE' } // subjectType 缓存 if (subjectType == 'SUBJECT' && state.subjectCounts) { state.activeTab = 'SUBJECT' } else if (subjectType == 'MUSIC' && state.musicCounts) { state.activeTab = 'MUSIC' } else if (subjectType == 'ENSEMBLE' && state.ensembleCounts) { state.activeTab = 'ENSEMBLE' } else if (subjectType == 'COURSEWARE' && state.coursewareCounts) { state.activeTab = 'COURSEWARE' } if (state.details.buyTimesFlag) { if (state.details.buyedTimes >= state.details.buyTimes) { state.hasBuyStatus = false } else { state.hasBuyStatus = true } } else { state.hasBuyStatus = true } } ) const FetchList = async (hideLoading = false) => { if (state.loading) { return } state.loading = true state.isError = false const tempParams = { albumId: state.details.id || null, subjectType: state.activeTab, ...params } try { const { data } = await request.post( `${apiSuffix.value}/tenantAlbumMusic/page`, { hideLoading, data: tempParams } ) if (state.list.length > 0 && data.pageNo === 1) { return } state.list = state.list.concat(data.rows || []) params.page = data.pageNo + 1 // showContact.value = state.list.length > 0 state.loading = false state.finished = data.pageNo >= data.totalPage params.page = data.pageNo + 1 } catch (error) { state.isError = true } state.loading = false } onMounted(async () => { useEventListener(document, 'scroll', evt => { const { y } = useWindowScroll() if (y.value > 20) { background.value = `rgba(255, 255, 255)` } else { background.value = 'transparent' } }) state.loading = true state.loadingAlbum = true await getDetails() await FetchList() state.loadingAlbum = false state.loading = false // 为了处理 swiper 会不显示的问题 document.body.scrollIntoView() window.scrollTo(1, 0) }) const onSubmit = async () => { const album = state.details const details = state.details orderStatus.orderObject.orderType = 'TENANT_ALBUM' orderStatus.orderObject.orderName = details.name orderStatus.orderObject.orderDesc = details.name orderStatus.orderObject.actualPrice = album.actualPrice // orderStatus.orderObject.recomUserId = route.query.recomUserId || 0 // orderStatus.orderObject.activityId = route.query.activityId || 0 orderStatus.orderObject.orderNo = '' orderStatus.orderObject.orderList = [ { orderType: 'TENANT_ALBUM', goodsName: details.name, actualPrice: album.actualPrice, price: album.actualPrice, ...details, ...album } ] const res = await request.post('/api-student/userOrder/getPendingOrder', { data: { goodType: 'TENANT_ALBUM', bizId: details.id } }) const result = res.data if (result) { state.popupStatus = false Dialog.confirm({ title: '提示', message: '您有一个未支付的订单,是否继续支付?', theme: 'round-button', className: 'confirm-button-group', cancelButtonText: '取消订单', confirmButtonText: '继续支付' }) .then(async () => { orderStatus.orderObject.orderNo = result.orderNo orderStatus.orderObject.actualPrice = result.actualPrice orderStatus.orderObject.discountPrice = result.discountPrice orderStatus.orderObject.paymentConfig = { ...result.paymentConfig, paymentVendor: result.paymentVendor, paymentVersion: result.paymentVersion } routerTo() }) .catch(() => { Dialog.close() // 只用取消订单,不用做其它处理 cancelPayment(result.orderNo) }) } else { routerTo() } } const routerTo = () => { const album = state.details router.push({ path: '/orderDetail', query: { orderType: 'ALBUM', album: album.id } }) } const cancelPayment = async (orderNo: string) => { try { await request.post('/api-student/userOrder/orderCancel/v2', { data: { orderNo } }) } catch { // } } return () => (
{!state.loading && !state.details.id && state.buy != '1' ? ( <> { console.log(height, 'height', height) state.heightV = height }} > {!state.loading && (
)} ) : ( !state.loadingAlbum && ( <> { state.heightV = height }} > {/* */}
{isSingleAlbum.value ? (
{state.details?.buyTimesFlag && ( 限购:{state.details?.buyedTimes}/ {state.details?.buyTimes}次 )}
) : ( state.albumList && state.albumList.length > 0 && ( {}} onTransitionEnd={(swiper: any) => { state.details = state.albumList[swiper.activeIndex] state.ensembleCounts = state.details?.ensembleCounts <= 0 ? false : true state.subjectCounts = state.details?.subjectCounts <= 0 ? false : true state.musicCounts = state.details?.musicCounts <= 0 ? false : true state.coursewareCounts = state.details?.coursewareCounts <= 0 ? false : true if (state.subjectCounts) { state.activeTab = 'SUBJECT' } else if (state.musicCounts) { state.activeTab = 'MUSIC' } else if (state.ensembleCounts) { state.activeTab = 'ENSEMBLE' } else if (state.coursewareCounts) { state.activeTab = 'COURSEWARE' } params.page = 1 state.list = [] FetchList(true) }} > {state.albumList.map((album: any) => (
{album.buyTimesFlag && ( 限购{album.buyedTimes}/{album.buyTimes}次 )}
))}
) )}
{state.details?.name}
{state.details?.describe}
{state.buy != '1' && baseState.platformType === 'STUDENT' && (
有效期:{state.details?.purchaseNum || 0}天
{(state.details?.originalPrice || 0) > (state.details?.actualPrice || 0) && ( 原价:¥ {moneyFormat(state.details?.originalPrice || 0)} )} ¥{moneyFormat(state.details?.actualPrice || 0)}
)}
{ state.activeTab = val params.page = 1 state.list = [] FetchList() }} > {state.subjectCounts && ( )} {state.musicCounts && ( )} {state.ensembleCounts && ( )} {state.coursewareCounts && ( )}
{state.list && state.list.length ? ( state.activeTab === 'COURSEWARE' ? ( { return { name: item.musicSheetName, coverImg: item.titleImg, id: item.id } })} onItemClick={row => { sessionStorage.setItem( 'tool-subject-type', state.activeTab as any ) router.push({ path: '/courseList', query: { id: row.id, albumId: state.details.id, taId: state.details.tenantGroupAlbumId // 当通过我的曲目进来的时候 这个值为空 } }) }} /> ) : ( { sessionStorage.setItem( 'tool-subject-type', state.activeTab as any ) router.push({ path: '/music-detail', query: { id: item.id, tenantAlbumId: item.tenantAlbumId, taId: state.details.tenantGroupAlbumId // 当通过我的曲目进来的时候 这个值为空 } }) }} /> ) ) : ( !state.loading && ( ) )}
{baseState.platformType === 'STUDENT' && state.buy != '1' && (
)} ) )}
) } })