|
@@ -3,7 +3,10 @@ import {
|
|
|
TransitionGroup,
|
|
|
computed,
|
|
|
defineComponent,
|
|
|
- reactive
|
|
|
+ nextTick,
|
|
|
+ onMounted,
|
|
|
+ reactive,
|
|
|
+ ref
|
|
|
} from 'vue';
|
|
|
import styles from './index.module.less';
|
|
|
import icon_back from './images/icon_back.svg';
|
|
@@ -12,11 +15,12 @@ import {
|
|
|
NBreadcrumb,
|
|
|
NBreadcrumbItem,
|
|
|
NButton,
|
|
|
+ NEmpty,
|
|
|
NImage,
|
|
|
- NSpace
|
|
|
+ NSpace,
|
|
|
+ NSpin
|
|
|
} from 'naive-ui';
|
|
|
import TheSearch from '/src/components/TheSearch';
|
|
|
-import listData from './data.json';
|
|
|
import { IMusicItem } from './type';
|
|
|
import icon_arrow from './images/icon_arrow.svg';
|
|
|
import icon_play from './images/icon_play.svg';
|
|
@@ -24,30 +28,91 @@ import icon_pause from './images/icon_pause.svg';
|
|
|
import icon_goXiaoku from './images/icon_goXiaoku.svg';
|
|
|
import icon_favitor from '/src/common/images/icon-collect-default.png';
|
|
|
import icon_favitorActive from '/src/common/images/icon-collect-active.png';
|
|
|
-import { useRouter } from 'vue-router';
|
|
|
+import { useRoute, useRouter } from 'vue-router';
|
|
|
import PlayItem from './component/play-item';
|
|
|
import PlayLoading from './component/play-loading';
|
|
|
import TheNoticeBar from '/src/components/TheNoticeBar';
|
|
|
+import { api_musicSheetPage, api_subjectList } from '../xiaoku-ai/api';
|
|
|
+import { useUserStore } from '/src/store/modules/users';
|
|
|
|
|
|
export default defineComponent({
|
|
|
name: 'XiaokuMusic',
|
|
|
setup() {
|
|
|
+ const user = useUserStore();
|
|
|
+ const route = useRoute();
|
|
|
const router = useRouter();
|
|
|
+ const forms = reactive({
|
|
|
+ page: 1,
|
|
|
+ rows: 20,
|
|
|
+ status: true,
|
|
|
+ keyword: '', // 关键词
|
|
|
+ musicSheetCategoriesId: route.query.id || ''
|
|
|
+ });
|
|
|
const data = reactive({
|
|
|
- tags: [
|
|
|
- { name: '全部', id: 0 },
|
|
|
- { name: '竖笛', id: 1 },
|
|
|
- { name: '排箫', id: 2 },
|
|
|
- { name: '口风琴', id: 3 },
|
|
|
- { name: '陶笛', id: 4 },
|
|
|
- { name: '葫芦丝', id: 5 }
|
|
|
- ],
|
|
|
+ loading: false,
|
|
|
+ finshed: false,
|
|
|
+ reshing: false,
|
|
|
+ tags: [] as any[],
|
|
|
tagIndex: 0,
|
|
|
- list: listData.rows as unknown as IMusicItem[],
|
|
|
+ list: [] as unknown as IMusicItem[],
|
|
|
listActive: 0,
|
|
|
playState: 'pause' as 'play' | 'pause',
|
|
|
showPlayer: false
|
|
|
});
|
|
|
+ const getSubjects = async () => {
|
|
|
+ const res = await api_subjectList();
|
|
|
+ if (Array.isArray(res?.data)) {
|
|
|
+ data.tags = [{ name: '全部', id: 0 }, ...res.data];
|
|
|
+ }
|
|
|
+ };
|
|
|
+ const getList = async () => {
|
|
|
+ data.loading = true;
|
|
|
+ let res = {} as any;
|
|
|
+ try {
|
|
|
+ res = await api_musicSheetPage({
|
|
|
+ ...forms,
|
|
|
+ musicSubject: data.tagIndex ? data.tagIndex : ''
|
|
|
+ });
|
|
|
+ } catch (error) {
|
|
|
+ console.log(error);
|
|
|
+ }
|
|
|
+ if (data.reshing) {
|
|
|
+ data.list = [];
|
|
|
+ data.reshing = false;
|
|
|
+ }
|
|
|
+ if (res?.code === 200 && Array.isArray(res?.data?.rows)) {
|
|
|
+ data.list = [...data.list, ...res.data.rows];
|
|
|
+ data.finshed = res.data.rows.length < forms.rows;
|
|
|
+ console.log('🚀 ~ data.finshed:', data.finshed);
|
|
|
+ }
|
|
|
+ data.loading = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ const handleGetList = () => {
|
|
|
+ forms.page = 1;
|
|
|
+ data.finshed = false;
|
|
|
+ getList();
|
|
|
+ };
|
|
|
+ const spinRef = ref();
|
|
|
+ const handleResh = () => {
|
|
|
+ console.log(data.finshed);
|
|
|
+ if (data.loading || data.finshed) return;
|
|
|
+ forms.page = forms.page + 1;
|
|
|
+ getList();
|
|
|
+ };
|
|
|
+
|
|
|
+ onMounted(async () => {
|
|
|
+ getSubjects();
|
|
|
+ await getList();
|
|
|
+ const obv = new IntersectionObserver(entries => {
|
|
|
+ if (entries[0].intersectionRatio > 0) {
|
|
|
+ handleResh();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ nextTick(() => {
|
|
|
+ obv.observe(spinRef.value);
|
|
|
+ });
|
|
|
+ });
|
|
|
|
|
|
/** 改变模仿的曲谱 */
|
|
|
const handleChange = (item: IMusicItem) => {
|
|
@@ -114,90 +179,115 @@ export default defineComponent({
|
|
|
曲谱列表
|
|
|
</NBreadcrumbItem>
|
|
|
<img class={styles.separator} src={icon_separator} />
|
|
|
- <NBreadcrumbItem>一年级上册人教版(2013版)</NBreadcrumbItem>
|
|
|
+ <NBreadcrumbItem>{route.query.name}</NBreadcrumbItem>
|
|
|
</NBreadcrumb>
|
|
|
</NSpace>
|
|
|
- <div class={styles.wrap}>
|
|
|
+ <div
|
|
|
+ class={styles.wrap}
|
|
|
+ style={{ paddingBottom: data.showPlayer ? '108Px' : '' }}>
|
|
|
<div class={styles.content}>
|
|
|
<div class={styles.tools}>
|
|
|
- <div class={styles.tags}>
|
|
|
- <NSpace size={[24, 12]} wrap={false}>
|
|
|
- {data.tags.map((item, index) => (
|
|
|
- <NButton
|
|
|
- round
|
|
|
- textColor={data.tagIndex === index ? '#fff' : '#000'}
|
|
|
- color={data.tagIndex === index ? '#198CFE' : '#fff'}
|
|
|
- onClick={() => (data.tagIndex = index)}>
|
|
|
- {item.name}
|
|
|
- </NButton>
|
|
|
- ))}
|
|
|
- </NSpace>
|
|
|
- </div>
|
|
|
- <TheSearch round />
|
|
|
+ <NSpace
|
|
|
+ style={{ width: '100%' }}
|
|
|
+ size={[24, 12]}
|
|
|
+ wrapItem={false}>
|
|
|
+ {data.tags.map(item => (
|
|
|
+ <NButton
|
|
|
+ round
|
|
|
+ textColor={data.tagIndex === item.id ? '#fff' : '#000'}
|
|
|
+ color={data.tagIndex === item.id ? '#198CFE' : '#fff'}
|
|
|
+ onClick={() => {
|
|
|
+ data.tagIndex = item.id;
|
|
|
+ data.reshing = true;
|
|
|
+ handleGetList();
|
|
|
+ }}>
|
|
|
+ {item.name}
|
|
|
+ </NButton>
|
|
|
+ ))}
|
|
|
+ </NSpace>
|
|
|
+ <TheSearch
|
|
|
+ style={{ marginLeft: 'auto' }}
|
|
|
+ round
|
|
|
+ onSearch={val => {
|
|
|
+ forms.keyword = val;
|
|
|
+ data.reshing = true;
|
|
|
+ handleGetList();
|
|
|
+ }}
|
|
|
+ />
|
|
|
</div>
|
|
|
|
|
|
- <div
|
|
|
- class={styles.contentWrap}
|
|
|
- style={{ paddingBottom: data.showPlayer ? '90px' : '' }}>
|
|
|
+ <div class={styles.contentWrap}>
|
|
|
<div class={styles.musicList}>
|
|
|
<div class={styles.wrapList}>
|
|
|
{data.list.map((item: IMusicItem, index) => {
|
|
|
return (
|
|
|
- <div
|
|
|
- class={[
|
|
|
- styles.item,
|
|
|
- data.listActive === index && styles.active
|
|
|
- ]}
|
|
|
- onClick={() => handleChange(item)}>
|
|
|
- <div class={styles.img}>
|
|
|
- <NImage
|
|
|
- lazy
|
|
|
- objectFit="cover"
|
|
|
- previewDisabled={true}
|
|
|
- src={item.titleImg}
|
|
|
- onLoad={e => {
|
|
|
- (e.target as any).dataset.loaded = 'true';
|
|
|
- }}
|
|
|
- />
|
|
|
- <PlayLoading
|
|
|
- class={[
|
|
|
- data.listActive === index &&
|
|
|
- data.playState === 'play'
|
|
|
- ? ''
|
|
|
- : styles.showPlayLoading
|
|
|
- ]}
|
|
|
- />
|
|
|
- </div>
|
|
|
- <div class={styles.title}>
|
|
|
- <div class={styles.titleName}>
|
|
|
- <TheNoticeBar text={item.musicSheetName} />
|
|
|
+ <div class={styles.itemContainer}>
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.item,
|
|
|
+ data.listActive === index && styles.active
|
|
|
+ ]}
|
|
|
+ onClick={() => handleChange(item)}>
|
|
|
+ <div class={styles.img}>
|
|
|
+ <NImage
|
|
|
+ lazy
|
|
|
+ objectFit="cover"
|
|
|
+ previewDisabled={true}
|
|
|
+ src={item.titleImg}
|
|
|
+ onLoad={e => {
|
|
|
+ (e.target as any).dataset.loaded = 'true';
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ <PlayLoading
|
|
|
+ class={[
|
|
|
+ data.listActive === index &&
|
|
|
+ data.playState === 'play'
|
|
|
+ ? ''
|
|
|
+ : styles.showPlayLoading
|
|
|
+ ]}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class={styles.title}>
|
|
|
+ <div class={styles.titleName}>
|
|
|
+ <TheNoticeBar text={item.musicSheetName} />
|
|
|
+ </div>
|
|
|
+ <div class={styles.titleDes}>{item.composer}</div>
|
|
|
</div>
|
|
|
- <div class={styles.titleDes}>{item.composer}</div>
|
|
|
+ <NButton
|
|
|
+ color="#259CFE"
|
|
|
+ textColor="#fff"
|
|
|
+ round
|
|
|
+ class={styles.btn}
|
|
|
+ type="primary"
|
|
|
+ onClick={(e: Event) => {
|
|
|
+ e.stopPropagation();
|
|
|
+ handlePlay(item);
|
|
|
+ }}>
|
|
|
+ 试听
|
|
|
+ <img
|
|
|
+ src={
|
|
|
+ data.listActive === index &&
|
|
|
+ data.playState === 'play'
|
|
|
+ ? icon_pause
|
|
|
+ : icon_play
|
|
|
+ }
|
|
|
+ />
|
|
|
+ </NButton>
|
|
|
+ <img class={styles.arrow} src={icon_arrow} />
|
|
|
</div>
|
|
|
- <NButton
|
|
|
- color="#259CFE"
|
|
|
- textColor="#fff"
|
|
|
- round
|
|
|
- class={styles.btn}
|
|
|
- type="primary"
|
|
|
- onClick={(e: Event) => {
|
|
|
- e.stopPropagation();
|
|
|
- handlePlay(item);
|
|
|
- }}>
|
|
|
- 试听
|
|
|
- <img
|
|
|
- src={
|
|
|
- data.listActive === index &&
|
|
|
- data.playState === 'play'
|
|
|
- ? icon_pause
|
|
|
- : icon_play
|
|
|
- }
|
|
|
- />
|
|
|
- </NButton>
|
|
|
- <img class={styles.arrow} src={icon_arrow} />
|
|
|
</div>
|
|
|
);
|
|
|
})}
|
|
|
+ {!data.finshed && (
|
|
|
+ <div ref={spinRef} class={styles.loadingWrap}>
|
|
|
+ <NSpin show={true}></NSpin>
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+ {!data.loading && data.list.length === 0 && (
|
|
|
+ <div class={styles.empty}>
|
|
|
+ <NEmpty />
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
@@ -206,18 +296,22 @@ export default defineComponent({
|
|
|
{activeItem.value.musicSheetName}
|
|
|
</div>
|
|
|
<img
|
|
|
+ style={{ display: activeItem.value.id ? '' : 'none' }}
|
|
|
class={styles.goBtn}
|
|
|
src={icon_goXiaoku}
|
|
|
onClick={() => {
|
|
|
handleChangeAudio('pause');
|
|
|
const origin = /(localhost|192)/.test(location.host)
|
|
|
- ? 'https://dev.kt.colexiu.com'
|
|
|
+ ? 'https://test.lexiaoya.cn'
|
|
|
: location.origin;
|
|
|
- const src = `${origin}/instrument?platform=pc&id=${activeItem.value.id}`;
|
|
|
+ const src = `${origin}/instrument?platform=pc&id=${activeItem.value.id}&Authorization=${user.getToken}`;
|
|
|
window.open(src);
|
|
|
}}
|
|
|
/>
|
|
|
- <div class={styles.favitor} onClick={() => handleFavitor()}>
|
|
|
+ <div
|
|
|
+ style={{ display: activeItem.value.id ? '' : 'none' }}
|
|
|
+ class={styles.favitor}
|
|
|
+ onClick={() => handleFavitor()}>
|
|
|
<Transition name="favitor" mode="out-in">
|
|
|
{activeItem.value.delFlag ? (
|
|
|
<img src={icon_favitorActive} key="1" />
|