|
@@ -0,0 +1,236 @@
|
|
|
+import { defineComponent, onMounted, reactive, ref } from 'vue';
|
|
|
+import styles from './index.module.less';
|
|
|
+import {
|
|
|
+ NBreadcrumb,
|
|
|
+ NBreadcrumbItem,
|
|
|
+ // NScrollbar,
|
|
|
+ NSlider,
|
|
|
+ NSpace,
|
|
|
+ NSpin
|
|
|
+} from 'naive-ui';
|
|
|
+import icon_back from '../../xiaoku-music/images/icon_back.png';
|
|
|
+// import icon_default from '../../xiaoku-music/images/icon_default.png';
|
|
|
+// import icon_separator from '../../xiaoku-music/images/icon_separator.png';
|
|
|
+import iconT from '../images/icon-t.png';
|
|
|
+import iconAddT from '../images/icon-add-t.png';
|
|
|
+import iconPlusT from '../images/icon-plus-t.png';
|
|
|
+import {
|
|
|
+ api_lessonCoursewareDetail_listKnowledge,
|
|
|
+ api_lessonCoursewareKnowledgeDetail
|
|
|
+} from '../api';
|
|
|
+import TheEmpty from '/src/components/TheEmpty';
|
|
|
+import { useRouter } from 'vue-router';
|
|
|
+
|
|
|
+export default defineComponent({
|
|
|
+ name: 'cotnent-knowledge',
|
|
|
+ setup() {
|
|
|
+ const router = useRouter();
|
|
|
+ const show = ref(false);
|
|
|
+ const content = ref(false);
|
|
|
+ const musicContentRef = ref();
|
|
|
+ const state = reactive({
|
|
|
+ fontSize: 18,
|
|
|
+ tableList: [] as any,
|
|
|
+ selectKey: null,
|
|
|
+ details: {} as any
|
|
|
+ });
|
|
|
+
|
|
|
+ const getDetails = async () => {
|
|
|
+ show.value = true;
|
|
|
+ content.value = true;
|
|
|
+ try {
|
|
|
+ const { data } = await api_lessonCoursewareDetail_listKnowledge({
|
|
|
+ type: 'COURSEWARE'
|
|
|
+ });
|
|
|
+
|
|
|
+ state.tableList = data || [];
|
|
|
+ if (state.tableList.length) {
|
|
|
+ const item =
|
|
|
+ state.tableList[0].lessonCoursewareDetailKnowledgeDetailList;
|
|
|
+ state.tableList[0].selected = true;
|
|
|
+ if (item && item.length) {
|
|
|
+ const child = item[0];
|
|
|
+ state.selectKey = child.id;
|
|
|
+ await getDetail();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ content.value = false;
|
|
|
+ show.value = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ const getDetail = async () => {
|
|
|
+ content.value = true;
|
|
|
+ try {
|
|
|
+ const { data } = await api_lessonCoursewareKnowledgeDetail({
|
|
|
+ id: state.selectKey
|
|
|
+ });
|
|
|
+
|
|
|
+ state.details = data;
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ content.value = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ onMounted(() => {
|
|
|
+ getDetails();
|
|
|
+ });
|
|
|
+ return () => (
|
|
|
+ <div class={styles.container}>
|
|
|
+ <NSpace align="center" wrapItem={false} size={16}>
|
|
|
+ <img
|
|
|
+ style={{ cursor: 'pointer' }}
|
|
|
+ src={icon_back}
|
|
|
+ class={styles.iconBack}
|
|
|
+ onClick={() => {
|
|
|
+ //
|
|
|
+ router.push('/');
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ <NBreadcrumb separator="">
|
|
|
+ <NBreadcrumbItem
|
|
|
+ onClick={() => {
|
|
|
+ //
|
|
|
+ }}>
|
|
|
+ 乐理知识
|
|
|
+ </NBreadcrumbItem>
|
|
|
+ </NBreadcrumb>
|
|
|
+ </NSpace>
|
|
|
+ <div class={[styles.wrap]}>
|
|
|
+ <div class={styles.content}>
|
|
|
+ <div class={styles.contentWrap}>
|
|
|
+ <div class={styles.directoryList}>
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.scrollBar,
|
|
|
+ !show.value && state.tableList.length <= 0
|
|
|
+ ? styles.empty
|
|
|
+ : ''
|
|
|
+ ]}
|
|
|
+ style={{ minHeight: '100%' }}>
|
|
|
+ <NSpin show={show.value}>
|
|
|
+ <div class={[styles.listSection]}>
|
|
|
+ {state.tableList.map((item: any, index: number) => (
|
|
|
+ <div class={styles.treeParent} key={'parent' + index}>
|
|
|
+ <div
|
|
|
+ class={[styles.treeItem, styles.parentItem]}
|
|
|
+ onClick={() => {
|
|
|
+ state.tableList.forEach((child: any) => {
|
|
|
+ if (item.id !== child.id) {
|
|
|
+ child.selected = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ item.selected = item.selected ? false : true;
|
|
|
+ }}>
|
|
|
+ {item.lessonCoursewareDetailKnowledgeDetailList &&
|
|
|
+ item.lessonCoursewareDetailKnowledgeDetailList
|
|
|
+ .length > 0 && (
|
|
|
+ <span
|
|
|
+ class={[
|
|
|
+ styles.arrow,
|
|
|
+ item.selected ? styles.arrowSelect : ''
|
|
|
+ ]}></span>
|
|
|
+ )}
|
|
|
+ <p
|
|
|
+ class={[
|
|
|
+ styles.title,
|
|
|
+ item.selected ? styles.titleSelect : ''
|
|
|
+ ]}>
|
|
|
+ <span
|
|
|
+ class={[
|
|
|
+ styles.dir,
|
|
|
+ item.selected ? styles.dirSelect : ''
|
|
|
+ ]}></span>
|
|
|
+ {item.name}
|
|
|
+ </p>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ {item.selected &&
|
|
|
+ item.lessonCoursewareDetailKnowledgeDetailList &&
|
|
|
+ item.lessonCoursewareDetailKnowledgeDetailList.map(
|
|
|
+ (child: any, j: number) => (
|
|
|
+ <div
|
|
|
+ key={'child' + j}
|
|
|
+ class={[
|
|
|
+ styles.treeItem,
|
|
|
+ styles.childItem,
|
|
|
+ styles.animation,
|
|
|
+ state.selectKey === child.id
|
|
|
+ ? styles.childSelect
|
|
|
+ : ''
|
|
|
+ ]}
|
|
|
+ onClick={() => {
|
|
|
+ if (state.selectKey === child.id) return;
|
|
|
+ state.selectKey = child.id;
|
|
|
+ getDetail();
|
|
|
+ musicContentRef.value.$el.scrollTo(0, 0);
|
|
|
+ }}>
|
|
|
+ <span class={styles.childArrow}></span>
|
|
|
+ <p class={styles.title}>{child.name}</p>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ ))}
|
|
|
+ </div>
|
|
|
+ </NSpin>
|
|
|
+ {!show.value && state.tableList.length <= 0 && (
|
|
|
+ <TheEmpty style={{ height: '100%' }} />
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class={styles.musicStaff}>
|
|
|
+ <NSpin
|
|
|
+ show={content.value}
|
|
|
+ ref={musicContentRef}
|
|
|
+ class={
|
|
|
+ !content.value && !state.details?.desc ? styles.empty : ''
|
|
|
+ }>
|
|
|
+ {state.details?.desc ? (
|
|
|
+ <div
|
|
|
+ class={styles.musicContent}
|
|
|
+ v-html={state.details?.desc}
|
|
|
+ style={{ fontSize: state.fontSize + 'px' }}></div>
|
|
|
+ ) : (
|
|
|
+ ''
|
|
|
+ )}
|
|
|
+ {!content.value && !state.details?.desc && <TheEmpty />}
|
|
|
+ </NSpin>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class={styles.changeSizeSection}>
|
|
|
+ <img src={iconT} class={styles.iconT} />
|
|
|
+ <img
|
|
|
+ src={iconAddT}
|
|
|
+ class={styles.iconAddT}
|
|
|
+ onClick={() => {
|
|
|
+ if (state.fontSize >= 32) return;
|
|
|
+ state.fontSize += 1;
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ <NSlider
|
|
|
+ v-model:value={state.fontSize}
|
|
|
+ vertical
|
|
|
+ min={12}
|
|
|
+ max={32}
|
|
|
+ />
|
|
|
+ <img
|
|
|
+ src={iconPlusT}
|
|
|
+ class={styles.iconPlusT}
|
|
|
+ onClick={() => {
|
|
|
+ if (state.fontSize <= 12) return;
|
|
|
+ state.fontSize -= 1;
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+});
|