index.tsx 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. import { defineComponent, reactive } from 'vue';
  2. import styles from './index.module.less';
  3. import { NTabs, NTabPane, NModal } from 'naive-ui';
  4. import SelectMusicModal from '../../model/select-music';
  5. import { usePrepareStore } from '/src/store/modules/prepareLessons';
  6. import SelectResources from '../../model/select-resources';
  7. import SelectMusic from './components/select-music';
  8. import ResourceItem from './components/resource-item';
  9. import TrainUpdate from '/src/views/attend-class/model/train-update';
  10. import requestOrigin from 'umi-request';
  11. export default defineComponent({
  12. name: 'resource-main',
  13. setup() {
  14. const prepareStore = usePrepareStore();
  15. const forms = reactive({
  16. tabType: 'shareResources',
  17. selectMusicStatus: false,
  18. selectResourceStatus: false,
  19. editStatus: false,
  20. editItem: {} as any
  21. });
  22. const onAdd = async (item: any) => {
  23. let xmlStatus = 'init';
  24. // 第一个声部小节
  25. let firstMeasures: any = null;
  26. try {
  27. // 获取文件
  28. const res = await requestOrigin.get(item.xmlFileUrl, {
  29. mode: 'cors'
  30. });
  31. const xmlParse = new DOMParser().parseFromString(res, 'text/xml');
  32. const parts = xmlParse.getElementsByTagName('part');
  33. firstMeasures = parts[0]?.getElementsByTagName('measure');
  34. xmlStatus = 'success';
  35. } catch (error) {
  36. xmlStatus = 'error';
  37. }
  38. // 判断读取小节数
  39. if (xmlStatus == 'success') {
  40. item.practiceChapterMax = firstMeasures.length;
  41. } else {
  42. item.practiceChapterMax = 0;
  43. }
  44. item.coursewareKnowledgeDetailId = prepareStore.getSelectKey;
  45. item.subjectId = prepareStore.getSubjectId;
  46. forms.editItem = item;
  47. forms.editStatus = true;
  48. };
  49. return () => (
  50. <div
  51. class={[
  52. styles['resource-main'],
  53. forms.selectMusicStatus || forms.selectResourceStatus
  54. ? styles.resourceClose
  55. : ''
  56. ]}>
  57. {prepareStore.getTabType === 'courseware' ? (
  58. <NTabs
  59. animated
  60. value={forms.tabType}
  61. paneClass={styles.paneTitle}
  62. paneWrapperClass={styles.paneWrapperContainer}
  63. onUpdate:value={(val: string) => {
  64. forms.tabType = val;
  65. }}>
  66. {{
  67. suffix: () => (
  68. <div
  69. class={styles.iconScreen}
  70. onClick={() => {
  71. forms.selectResourceStatus = true;
  72. prepareStore.setSelectResourceStatus(true);
  73. }}>
  74. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
  75. <g fill="none">
  76. <path
  77. d="M5 6a1 1 0 0 1 1-1h2a1 1 0 0 0 0-2H6a3 3 0 0 0-3 3v2a1 1 0 0 0 2 0V6zm0 12a1 1 0 0 0 1 1h2a1 1 0 1 1 0 2H6a3 3 0 0 1-3-3v-2a1 1 0 1 1 2 0v2zM18 5a1 1 0 0 1 1 1v2a1 1 0 1 0 2 0V6a3 3 0 0 0-3-3h-2a1 1 0 1 0 0 2h2zm1 13a1 1 0 0 1-1 1h-2a1 1 0 1 0 0 2h2a3 3 0 0 0 3-3v-2a1 1 0 1 0-2 0v2z"
  78. fill="#198CFE"></path>
  79. </g>
  80. </svg>
  81. </div>
  82. ),
  83. default: () => (
  84. <>
  85. <NTabPane
  86. name="shareResources"
  87. tab="共享资源"
  88. displayDirective="show:lazy">
  89. <ResourceItem type="shareResources" />
  90. </NTabPane>
  91. <NTabPane
  92. name="myResources"
  93. tab="我的资源"
  94. displayDirective="show:lazy">
  95. <ResourceItem type="myResources" />
  96. </NTabPane>
  97. <NTabPane
  98. name="myCollect"
  99. tab="我的收藏"
  100. displayDirective="show:lazy">
  101. <ResourceItem type="myCollect" />
  102. </NTabPane>
  103. </>
  104. )
  105. }}
  106. </NTabs>
  107. ) : (
  108. <NTabs
  109. animated
  110. value="selectMusic"
  111. paneClass={styles.paneTitle}
  112. justifyContent="center"
  113. paneWrapperClass={styles.paneWrapperContainer}>
  114. {{
  115. suffix: () => (
  116. <div
  117. class={styles.iconScreen}
  118. onClick={() => {
  119. forms.selectMusicStatus = true;
  120. prepareStore.setSelectMusicStatus(true);
  121. }}>
  122. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
  123. <g fill="none">
  124. <path
  125. d="M5 6a1 1 0 0 1 1-1h2a1 1 0 0 0 0-2H6a3 3 0 0 0-3 3v2a1 1 0 0 0 2 0V6zm0 12a1 1 0 0 0 1 1h2a1 1 0 1 1 0 2H6a3 3 0 0 1-3-3v-2a1 1 0 1 1 2 0v2zM18 5a1 1 0 0 1 1 1v2a1 1 0 1 0 2 0V6a3 3 0 0 0-3-3h-2a1 1 0 1 0 0 2h2zm1 13a1 1 0 0 1-1 1h-2a1 1 0 1 0 0 2h2a3 3 0 0 0 3-3v-2a1 1 0 1 0-2 0v2z"
  126. fill="#198CFE"></path>
  127. </g>
  128. </svg>
  129. </div>
  130. ),
  131. default: () => (
  132. <NTabPane name="selectMusic" tab="选择曲目">
  133. <SelectMusic />
  134. </NTabPane>
  135. )
  136. }}
  137. </NTabs>
  138. )}
  139. <NModal
  140. v-model:show={forms.selectResourceStatus}
  141. onUpdate:show={(val: any) => {
  142. if (!val) {
  143. prepareStore.setSelectResourceStatus(val);
  144. }
  145. }}
  146. class={['modalTitle', styles.selectMusicModal]}
  147. preset="card"
  148. title={'选择资源'}>
  149. <SelectResources />
  150. </NModal>
  151. <NModal
  152. v-model:show={forms.selectMusicStatus}
  153. onUpdate:show={(val: any) => {
  154. if (!val) {
  155. prepareStore.setSelectMusicStatus(val);
  156. }
  157. }}
  158. class={['modalTitle', styles.selectMusicModal]}
  159. preset="card"
  160. title={'选择曲目'}>
  161. <SelectMusicModal onAdd={(item: any) => onAdd(item)} />
  162. </NModal>
  163. <NModal
  164. v-model:show={forms.editStatus}
  165. class={['modalTitle background', styles.trainEditModal]}
  166. preset="card"
  167. title="训练设置">
  168. <TrainUpdate
  169. item={forms.editItem}
  170. onClose={() => (forms.editStatus = false)}
  171. onConfirm={() => {
  172. forms.editItem = {};
  173. prepareStore.setIsAddTrain(true);
  174. }}
  175. />
  176. </NModal>
  177. </div>
  178. );
  179. }
  180. });