|
@@ -1,165 +1,332 @@
|
|
|
-import {
|
|
|
- defineComponent
|
|
|
-} from 'vue';
|
|
|
+import { defineComponent, nextTick, onMounted, reactive, ref } from 'vue';
|
|
|
import styles from './index.module.less';
|
|
|
import TheSearch from '/src/components/TheSearch';
|
|
|
import recommendTitle from './images/reommon_title.png';
|
|
|
import newTitle from './images/new_title.png';
|
|
|
import hotTitle from './images/hot_title.png';
|
|
|
-import { NScrollbar } from 'naive-ui';
|
|
|
+import { NScrollbar, NSpin } from 'naive-ui';
|
|
|
import TheNoticeBar from '/src/components/TheNoticeBar';
|
|
|
import { useRouter } from 'vue-router';
|
|
|
+import { api_musicSheetQueryByTag } from './api';
|
|
|
+import { api_musicSheetPage } from '../xiaoku-ai/api';
|
|
|
+import TheEmpty from '/src/components/TheEmpty';
|
|
|
+import titleBg from './images/title-bg.png'
|
|
|
+
|
|
|
+export const formatUsedNum = (num: number) => {
|
|
|
+ if (num < 10000) {
|
|
|
+ return num;
|
|
|
+ } else {
|
|
|
+ const n = num / 10000;
|
|
|
+ return Number(n.toFixed(1)) + '万';
|
|
|
+ }
|
|
|
+};
|
|
|
|
|
|
export default defineComponent({
|
|
|
name: 'xiaoku-list',
|
|
|
setup() {
|
|
|
- const router = useRouter()
|
|
|
+ const router = useRouter();
|
|
|
+ const state = reactive({
|
|
|
+ HOT: [] as any,
|
|
|
+ NEW: [] as any,
|
|
|
+ RECOMMEND: [] as any,
|
|
|
+ isSearch: false, // 是否点击搜索
|
|
|
+ keyword: null as any,
|
|
|
+ list: [] as any,
|
|
|
+ loading: false as any,
|
|
|
+ finshed: false,
|
|
|
+ page: 1,
|
|
|
+ rows: 20
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /** 获取三个模块 */
|
|
|
+ const getDetail = async () => {
|
|
|
+ try {
|
|
|
+ const { data } = await api_musicSheetQueryByTag();
|
|
|
+ state.RECOMMEND = data.RECOMMEND || [];
|
|
|
+ state.HOT = data.HOT || [];
|
|
|
+ state.NEW = data.NEW || [];
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ /** 获取更多 */
|
|
|
+ const getList = async () => {
|
|
|
+ state.loading = true;
|
|
|
+ try {
|
|
|
+ const { data } = await api_musicSheetPage({ keyword: state.keyword, page: state.page, rows: state.rows });
|
|
|
+ const result = data.rows || [];
|
|
|
+ result.forEach((item: any) => {
|
|
|
+ if (item.musicSheetName) {
|
|
|
+ const regex = new RegExp(state.keyword, 'gi');
|
|
|
+ const highlightedText = item.musicSheetName.replace(
|
|
|
+ regex,
|
|
|
+ `<span>$&</span>`
|
|
|
+ );
|
|
|
+ item.musicNameReg = highlightedText;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ state.list = [...state.list, ...data.rows];
|
|
|
+ state.finshed = state.page >= data.pages;
|
|
|
+ console.log(data, state.list, 'list');
|
|
|
+ } catch (e) {
|
|
|
+ //
|
|
|
+ console.log(e, 'e');
|
|
|
+ }
|
|
|
+ state.loading = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ const spinRef = ref();
|
|
|
+ const handleResh = () => {
|
|
|
+ if (state.loading || state.finshed) return;
|
|
|
+ state.page = state.page + 1;
|
|
|
+ getList();
|
|
|
+ };
|
|
|
+
|
|
|
+ const __initSpin = () => {
|
|
|
+ const obv = new IntersectionObserver(entries => {
|
|
|
+ if (entries[0].intersectionRatio > 0) {
|
|
|
+ handleResh();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ obv.observe(spinRef.value);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查看更多
|
|
|
+ const onMore = (type?: '' | 'RECOMMEND' | 'NEW' | 'HOT') => {
|
|
|
+ router.push({
|
|
|
+ path: '/xiaoku-detail',
|
|
|
+ query: {
|
|
|
+ type: type
|
|
|
+ }
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ onMounted(() => {
|
|
|
+ getDetail();
|
|
|
+ });
|
|
|
return () => (
|
|
|
<div class={styles.list}>
|
|
|
- <h2 class={styles.topTitle}>海量曲目 任你选择</h2>
|
|
|
+ <h2 class={styles.topTitle}>
|
|
|
+ <img src={titleBg} />
|
|
|
+ </h2>
|
|
|
|
|
|
<div class={styles.searchSection}>
|
|
|
<TheSearch
|
|
|
round
|
|
|
class={styles.searchInput}
|
|
|
onSearch={val => {
|
|
|
- // forms.keyword = val;
|
|
|
- // getList();
|
|
|
+ if(val && val.trim()) {
|
|
|
+ state.isSearch = true;
|
|
|
+ state.keyword = val.trim()
|
|
|
+ state.loading = true;
|
|
|
+ state.finshed = false;
|
|
|
+ state.list = []
|
|
|
+ getList();
|
|
|
+ nextTick(() => {
|
|
|
+ __initSpin()
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ state.isSearch = false;
|
|
|
+ }
|
|
|
}}
|
|
|
/>
|
|
|
|
|
|
- <div class={styles.moreMusic}>全部曲目</div>
|
|
|
+ <div class={styles.moreMusic} onClick={() => onMore()}>全部曲目</div>
|
|
|
</div>
|
|
|
|
|
|
- <div class={styles.container}>
|
|
|
- <>
|
|
|
- <div class={[styles.section, styles.recommendSection]}>
|
|
|
- <div class={styles.sectionTitle}>
|
|
|
- <img src={recommendTitle} class={styles.imgTitle} />
|
|
|
-
|
|
|
- <div class={styles.moreBtn}>更多</div>
|
|
|
- </div>
|
|
|
-
|
|
|
+ {state.isSearch ? (
|
|
|
+ <div class={styles.searchContainer}>
|
|
|
<NScrollbar>
|
|
|
- {[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(() => (
|
|
|
- <div class={styles.item} onClick={() => {
|
|
|
- router.push({
|
|
|
- path: '/xiaoku-detail'
|
|
|
- })
|
|
|
- }}>
|
|
|
- <div class={[styles.num]}>01</div>
|
|
|
- <div class={styles.img}>
|
|
|
- <img
|
|
|
- referrerpolicy="no-referrer"
|
|
|
- src="https://lanhu-oss.lanhuapp.com/SketchPnge5215a88a6a2d4a1aba30956f78102bf01fac5e63f33b045c1427d94330297dd"
|
|
|
- />
|
|
|
+ <div class={styles.sectionContainer}>
|
|
|
+ {state.list.map((item: any) => (
|
|
|
+ <div class={styles.sectionItem}>
|
|
|
+ <div class={styles.img} style={{ marginLeft: 0 }}>
|
|
|
+ <img referrerpolicy="no-referrer" src={item.titleImg} />
|
|
|
</div>
|
|
|
<div class={styles.infos}>
|
|
|
- <div class={styles.topName}>
|
|
|
- <TheNoticeBar text='玩具兵进行曲玩具兵进行曲玩具兵进行曲玩具兵进行曲玩具兵进行曲玩具兵进行曲' />
|
|
|
- </div>
|
|
|
+ <div
|
|
|
+ class={styles.topName}
|
|
|
+ v-html={item.musicNameReg}></div>
|
|
|
<div class={styles.types}>
|
|
|
<div class={styles.hot}>
|
|
|
- <span>1.8万</span>
|
|
|
+ <span>{formatUsedNum(item.usedNum)}</span>
|
|
|
</div>
|
|
|
- <div class={styles.sing}>演唱</div>
|
|
|
- <div class={styles.song}>演奏</div>
|
|
|
- <div class={styles.author}>耶寒尔</div>
|
|
|
+ {item.audioPlayTypes?.includes('SING') && (
|
|
|
+ <div class={styles.sing}>演唱</div>
|
|
|
+ )}
|
|
|
+ {item.audioPlayTypes?.includes('PLAY') && (
|
|
|
+ <div class={styles.song}>演奏</div>
|
|
|
+ )}
|
|
|
+
|
|
|
+ <div class={styles.author}>{item.composer}</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
))}
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ ref={spinRef}
|
|
|
+ class={[styles.loadingWrap, state.finshed && styles.showLoading]}>
|
|
|
+ <NSpin show={true}></NSpin>
|
|
|
+ </div>
|
|
|
</NScrollbar>
|
|
|
+
|
|
|
+ {!state.loading && state.list.length === 0 && (
|
|
|
+ <div class={styles.empty}>
|
|
|
+ <TheEmpty></TheEmpty>
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
</div>
|
|
|
- <div class={[styles.section, styles.hotSection]}>
|
|
|
- <div class={styles.sectionTitle}>
|
|
|
- <img src={hotTitle} class={styles.imgTitle} />
|
|
|
+ ) : (
|
|
|
+ <div class={styles.container}>
|
|
|
+ <div class={[styles.section, styles.recommendSection]}>
|
|
|
+ <div class={styles.sectionTitle}>
|
|
|
+ <img src={recommendTitle} class={styles.imgTitle} />
|
|
|
|
|
|
- <div class={styles.moreBtn}>更多</div>
|
|
|
- </div>
|
|
|
+ <div class={styles.moreBtn}>更多</div>
|
|
|
+ </div>
|
|
|
|
|
|
- <NScrollbar>
|
|
|
- {[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(() => (
|
|
|
- <div class={styles.item}>
|
|
|
- <div class={[styles.num]}>01</div>
|
|
|
- <div class={styles.img}>
|
|
|
- <img
|
|
|
- referrerpolicy="no-referrer"
|
|
|
- src="https://lanhu-oss.lanhuapp.com/SketchPnge5215a88a6a2d4a1aba30956f78102bf01fac5e63f33b045c1427d94330297dd"
|
|
|
- />
|
|
|
- </div>
|
|
|
- <div class={styles.infos}>
|
|
|
- <div class={styles.topName}>玩具兵进行曲玩具兵进行曲玩具兵进行曲玩具兵进行曲玩具兵进行曲玩具兵进行曲</div>
|
|
|
- <div class={styles.types}>
|
|
|
- <div class={styles.hot}>
|
|
|
- <span>1.8万</span>
|
|
|
+ <NScrollbar>
|
|
|
+ {state.RECOMMEND.map((item: any, index: number) => (
|
|
|
+ <div
|
|
|
+ class={styles.item}
|
|
|
+ onClick={() => {
|
|
|
+ onMore('RECOMMEND');
|
|
|
+ }}>
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.num,
|
|
|
+ index === 0 ? styles.num1 : '',
|
|
|
+ index === 1 ? styles.num2 : '',
|
|
|
+ index === 2 ? styles.num3 : ''
|
|
|
+ ]}>
|
|
|
+ {(index + 1).toString().padStart(2, '0')}
|
|
|
+ </div>
|
|
|
+ <div class={styles.img}>
|
|
|
+ <img referrerpolicy="no-referrer" src={item.titleImg} />
|
|
|
+ </div>
|
|
|
+ <div class={styles.infos}>
|
|
|
+ <div class={styles.topName}>
|
|
|
+ <TheNoticeBar text={item.musicSheetName} />
|
|
|
+ </div>
|
|
|
+ <div class={styles.types}>
|
|
|
+ <div class={styles.hot}>
|
|
|
+ <span>{formatUsedNum(item.usedNum)}</span>
|
|
|
+ </div>
|
|
|
+ {item.audioPlayTypes?.includes('SING') && (
|
|
|
+ <div class={styles.sing}>演唱</div>
|
|
|
+ )}
|
|
|
+ {item.audioPlayTypes?.includes('PLAY') && (
|
|
|
+ <div class={styles.song}>演奏</div>
|
|
|
+ )}
|
|
|
+
|
|
|
+ <div class={styles.author}>{item.composer}</div>
|
|
|
</div>
|
|
|
- <div class={styles.sing}>演唱</div>
|
|
|
- <div class={styles.song}>演奏</div>
|
|
|
- <div class={styles.author}>耶寒尔</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- ))}
|
|
|
- </NScrollbar>
|
|
|
- </div>
|
|
|
- <div class={[styles.section, styles.newSection]}>
|
|
|
- <div class={styles.sectionTitle}>
|
|
|
- <img src={newTitle} class={styles.imgTitle} />
|
|
|
-
|
|
|
- <div class={styles.moreBtn}>更多</div>
|
|
|
+ ))}
|
|
|
+ </NScrollbar>
|
|
|
</div>
|
|
|
+ <div class={[styles.section, styles.hotSection]}>
|
|
|
+ <div class={styles.sectionTitle}>
|
|
|
+ <img src={hotTitle} class={styles.imgTitle} />
|
|
|
+ <div class={styles.moreBtn}>更多</div>
|
|
|
+ </div>
|
|
|
|
|
|
- <NScrollbar>
|
|
|
- {[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(() => (
|
|
|
- <div class={styles.item}>
|
|
|
- <div class={[styles.num]}>01</div>
|
|
|
- <div class={styles.img}>
|
|
|
- <img
|
|
|
- referrerpolicy="no-referrer"
|
|
|
- src="https://lanhu-oss.lanhuapp.com/SketchPnge5215a88a6a2d4a1aba30956f78102bf01fac5e63f33b045c1427d94330297dd"
|
|
|
- />
|
|
|
- </div>
|
|
|
- <div class={styles.infos}>
|
|
|
- <div class={styles.topName}>玩具兵进行曲玩具兵进行曲玩具兵进行曲玩具兵进行曲玩具兵进行曲玩具兵进行曲</div>
|
|
|
- <div class={styles.types}>
|
|
|
- <div class={styles.hot}>
|
|
|
- <span>1.8万</span>
|
|
|
+ <NScrollbar>
|
|
|
+ {state.HOT.map((item: any, index: number) => (
|
|
|
+ <div
|
|
|
+ class={styles.item}
|
|
|
+ onClick={() => {
|
|
|
+ onMore('HOT');
|
|
|
+ }}>
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.num,
|
|
|
+ index === 0 ? styles.num1 : '',
|
|
|
+ index === 1 ? styles.num2 : '',
|
|
|
+ index === 2 ? styles.num3 : ''
|
|
|
+ ]}>
|
|
|
+ {(index + 1).toString().padStart(2, '0')}
|
|
|
+ </div>
|
|
|
+ <div class={styles.img}>
|
|
|
+ <img referrerpolicy="no-referrer" src={item.titleImg} />
|
|
|
+ </div>
|
|
|
+ <div class={styles.infos}>
|
|
|
+ <div class={styles.topName}>
|
|
|
+ <TheNoticeBar text={item.musicSheetName} />
|
|
|
+ </div>
|
|
|
+ <div class={styles.types}>
|
|
|
+ <div class={styles.hot}>
|
|
|
+ <span>{formatUsedNum(item.usedNum)}</span>
|
|
|
+ </div>
|
|
|
+ {item.audioPlayTypes?.includes('SING') && (
|
|
|
+ <div class={styles.sing}>演唱</div>
|
|
|
+ )}
|
|
|
+ {item.audioPlayTypes?.includes('PLAY') && (
|
|
|
+ <div class={styles.song}>演奏</div>
|
|
|
+ )}
|
|
|
+
|
|
|
+ <div class={styles.author}>{item.composer}</div>
|
|
|
</div>
|
|
|
- <div class={styles.sing}>演唱</div>
|
|
|
- <div class={styles.song}>演奏</div>
|
|
|
- <div class={styles.author}>耶寒尔</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- ))}
|
|
|
- </NScrollbar>
|
|
|
- </div></>
|
|
|
- </div>
|
|
|
-
|
|
|
- {/* <div class={styles.sectionContainer}>
|
|
|
- <div class={styles.sectionItem}>
|
|
|
- <div class={styles.img}>
|
|
|
- <img
|
|
|
- referrerpolicy="no-referrer"
|
|
|
- src="https://lanhu-oss.lanhuapp.com/SketchPnge5215a88a6a2d4a1aba30956f78102bf01fac5e63f33b045c1427d94330297dd"
|
|
|
- />
|
|
|
+ ))}
|
|
|
+ </NScrollbar>
|
|
|
</div>
|
|
|
- <div class={styles.infos}>
|
|
|
- <div class={styles.topName}>
|
|
|
- <span>玩具</span>兵进行曲玩具兵进行曲玩具兵进行曲玩具兵进行曲玩具兵进行曲玩具兵进行曲
|
|
|
- </div>
|
|
|
- <div class={styles.types}>
|
|
|
- <div class={styles.hot}>
|
|
|
- <span>1.8万</span>
|
|
|
- </div>
|
|
|
- <div class={styles.sing}>演唱</div>
|
|
|
- <div class={styles.song}>演奏</div>
|
|
|
- <div class={styles.author}>耶寒尔</div>
|
|
|
+ <div class={[styles.section, styles.newSection]}>
|
|
|
+ <div class={styles.sectionTitle}>
|
|
|
+ <img src={newTitle} class={styles.imgTitle} />
|
|
|
+
|
|
|
+ <div class={styles.moreBtn}>更多</div>
|
|
|
</div>
|
|
|
+
|
|
|
+ <NScrollbar>
|
|
|
+ {state.NEW.map((item: any, index: number) => (
|
|
|
+ <div
|
|
|
+ class={styles.item}
|
|
|
+ onClick={() => {
|
|
|
+ onMore('NEW');
|
|
|
+ }}>
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.num,
|
|
|
+ index === 0 ? styles.num1 : '',
|
|
|
+ index === 1 ? styles.num2 : '',
|
|
|
+ index === 2 ? styles.num3 : ''
|
|
|
+ ]}>
|
|
|
+ {(index + 1).toString().padStart(2, '0')}
|
|
|
+ </div>
|
|
|
+ <div class={styles.img}>
|
|
|
+ <img referrerpolicy="no-referrer" src={item.titleImg} />
|
|
|
+ </div>
|
|
|
+ <div class={styles.infos}>
|
|
|
+ <div class={styles.topName}>
|
|
|
+ <TheNoticeBar text={item.musicSheetName} />
|
|
|
+ </div>
|
|
|
+ <div class={styles.types}>
|
|
|
+ <div class={styles.hot}>
|
|
|
+ <span>{formatUsedNum(item.usedNum)}</span>
|
|
|
+ </div>
|
|
|
+ {item.audioPlayTypes?.includes('SING') && (
|
|
|
+ <div class={styles.sing}>演唱</div>
|
|
|
+ )}
|
|
|
+ {item.audioPlayTypes?.includes('PLAY') && (
|
|
|
+ <div class={styles.song}>演奏</div>
|
|
|
+ )}
|
|
|
+
|
|
|
+ <div class={styles.author}>{item.composer}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ ))}
|
|
|
+ </NScrollbar>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div> */}
|
|
|
+ )}
|
|
|
</div>
|
|
|
);
|
|
|
}
|