index.tsx 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. import { defineComponent, onMounted, reactive, ref } from 'vue';
  2. import styles from './index.module.less';
  3. import {
  4. NBreadcrumb,
  5. NBreadcrumbItem,
  6. // NScrollbar,
  7. NSlider,
  8. NSpace,
  9. NSpin
  10. } from 'naive-ui';
  11. import icon_back from '../../xiaoku-music/images/icon_back.png';
  12. // import icon_default from '../../xiaoku-music/images/icon_default.png';
  13. // import icon_separator from '../../xiaoku-music/images/icon_separator.png';
  14. import iconT from '../images/icon-t.png';
  15. import iconAddT from '../images/icon-add-t.png';
  16. import iconPlusT from '../images/icon-plus-t.png';
  17. import {
  18. api_lessonCoursewareDetail_listKnowledge,
  19. api_lessonCoursewareKnowledgeDetail
  20. } from '../api';
  21. import TheEmpty from '/src/components/TheEmpty';
  22. import { useRouter } from 'vue-router';
  23. export default defineComponent({
  24. name: 'cotnent-knowledge',
  25. setup() {
  26. const router = useRouter();
  27. const show = ref(false);
  28. const content = ref(false);
  29. const musicContentRef = ref();
  30. const state = reactive({
  31. fontSize: 18,
  32. tableList: [] as any,
  33. selectKey: null,
  34. details: {} as any
  35. });
  36. const getDetails = async () => {
  37. show.value = true;
  38. content.value = true;
  39. try {
  40. const { data } = await api_lessonCoursewareDetail_listKnowledge({
  41. type: 'COURSEWARE'
  42. });
  43. state.tableList = data || [];
  44. if (state.tableList.length) {
  45. const item =
  46. state.tableList[0].lessonCoursewareDetailKnowledgeDetailList;
  47. state.tableList[0].selected = true;
  48. if (item && item.length) {
  49. const child = item[0];
  50. state.selectKey = child.id;
  51. await getDetail();
  52. }
  53. }
  54. } catch {
  55. //
  56. }
  57. content.value = false;
  58. show.value = false;
  59. };
  60. const getDetail = async () => {
  61. content.value = true;
  62. try {
  63. const { data } = await api_lessonCoursewareKnowledgeDetail({
  64. id: state.selectKey
  65. });
  66. state.details = data;
  67. } catch {
  68. //
  69. }
  70. content.value = false;
  71. };
  72. onMounted(() => {
  73. getDetails();
  74. });
  75. return () => (
  76. <div class={styles.container}>
  77. <NSpace align="center" wrapItem={false} size={16}>
  78. <img
  79. style={{ cursor: 'pointer' }}
  80. src={icon_back}
  81. class={styles.iconBack}
  82. onClick={() => {
  83. //
  84. router.push('/');
  85. }}
  86. />
  87. <NBreadcrumb separator="">
  88. <NBreadcrumbItem
  89. onClick={() => {
  90. //
  91. }}>
  92. 乐理知识
  93. </NBreadcrumbItem>
  94. </NBreadcrumb>
  95. </NSpace>
  96. <div class={[styles.wrap]}>
  97. <div class={styles.content}>
  98. <div class={styles.contentWrap}>
  99. <div class={styles.directoryList}>
  100. <div
  101. class={[
  102. styles.scrollBar,
  103. !show.value && state.tableList.length <= 0
  104. ? styles.empty
  105. : ''
  106. ]}
  107. style={{ minHeight: '100%' }}>
  108. <NSpin show={show.value}>
  109. <div class={[styles.listSection]}>
  110. {state.tableList.map((item: any, index: number) => (
  111. <div class={styles.treeParent} key={'parent' + index}>
  112. <div
  113. class={[styles.treeItem, styles.parentItem]}
  114. onClick={() => {
  115. state.tableList.forEach((child: any) => {
  116. if (item.id !== child.id) {
  117. child.selected = false;
  118. }
  119. });
  120. item.selected = item.selected ? false : true;
  121. }}>
  122. {item.lessonCoursewareDetailKnowledgeDetailList &&
  123. item.lessonCoursewareDetailKnowledgeDetailList
  124. .length > 0 && (
  125. <span
  126. class={[
  127. styles.arrow,
  128. item.selected ? styles.arrowSelect : ''
  129. ]}></span>
  130. )}
  131. <p
  132. class={[
  133. styles.title,
  134. item.selected ? styles.titleSelect : ''
  135. ]}>
  136. <span
  137. class={[
  138. styles.dir,
  139. item.selected ? styles.dirSelect : ''
  140. ]}></span>
  141. {item.name}
  142. </p>
  143. </div>
  144. {item.selected &&
  145. item.lessonCoursewareDetailKnowledgeDetailList &&
  146. item.lessonCoursewareDetailKnowledgeDetailList.map(
  147. (child: any, j: number) => (
  148. <div
  149. key={'child' + j}
  150. class={[
  151. styles.treeItem,
  152. styles.childItem,
  153. styles.animation,
  154. state.selectKey === child.id
  155. ? styles.childSelect
  156. : ''
  157. ]}
  158. onClick={() => {
  159. if (state.selectKey === child.id) return;
  160. state.selectKey = child.id;
  161. getDetail();
  162. musicContentRef.value.$el.scrollTo(0, 0);
  163. }}>
  164. <span class={styles.childArrow}></span>
  165. <p class={styles.title}>{child.name}</p>
  166. </div>
  167. )
  168. )}
  169. </div>
  170. ))}
  171. </div>
  172. </NSpin>
  173. {!show.value && state.tableList.length <= 0 && (
  174. <TheEmpty style={{ height: '100%' }} />
  175. )}
  176. </div>
  177. </div>
  178. <div class={styles.musicStaff}>
  179. <NSpin
  180. show={content.value}
  181. ref={musicContentRef}
  182. class={
  183. !content.value && !state.details?.desc ? styles.empty : ''
  184. }>
  185. {state.details?.desc ? (
  186. <div
  187. class={styles.musicContent}
  188. v-html={state.details?.desc}
  189. style={{ fontSize: state.fontSize + 'px' }}></div>
  190. ) : (
  191. ''
  192. )}
  193. {!content.value && !state.details?.desc && <TheEmpty />}
  194. </NSpin>
  195. </div>
  196. <div class={styles.changeSizeSection}>
  197. <img src={iconT} class={styles.iconT} />
  198. <img
  199. src={iconAddT}
  200. class={styles.iconAddT}
  201. onClick={() => {
  202. if (state.fontSize >= 32) return;
  203. state.fontSize += 1;
  204. }}
  205. />
  206. <NSlider
  207. v-model:value={state.fontSize}
  208. vertical
  209. min={12}
  210. max={32}
  211. />
  212. <img
  213. src={iconPlusT}
  214. class={styles.iconPlusT}
  215. onClick={() => {
  216. if (state.fontSize <= 12) return;
  217. state.fontSize -= 1;
  218. }}
  219. />
  220. </div>
  221. </div>
  222. </div>
  223. </div>
  224. </div>
  225. );
  226. }
  227. });