index.tsx 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. import { defineComponent, onMounted, reactive } from 'vue';
  2. import styles from './index.module.less';
  3. import {
  4. NButton,
  5. NImage,
  6. NInput,
  7. NModal,
  8. NScrollbar,
  9. NSelect,
  10. NSpace,
  11. NSpin,
  12. useDialog,
  13. useMessage
  14. } from 'naive-ui';
  15. import AddTeaching, {
  16. BOOK_DATA
  17. } from '/src/views/natural-resources/model/add-teaching';
  18. import {
  19. lessonCoursewarePage,
  20. lessonCoursewareRemove,
  21. musicTagTree
  22. } from '../../../api';
  23. import iconUploadBg from '../images/icon-upload-bg.svg';
  24. import { useCatchStore } from '/src/store/modules/catchData';
  25. import { useThrottleFn } from '@vueuse/core';
  26. export default defineComponent({
  27. name: 'select-lessonware',
  28. emits: ['close', 'confirm'],
  29. setup(props, { emit }) {
  30. const catchStore = useCatchStore();
  31. const dialog = useDialog();
  32. const message = useMessage();
  33. const forms = reactive({
  34. loading: false,
  35. list: [] as any[],
  36. teachingStatus: false,
  37. musicTagList: [] as any[],
  38. selectItem: {} as any,
  39. bookVersionId: null,
  40. keyword: null,
  41. currentGradeNum: null
  42. // bookType: null
  43. });
  44. const getLessonCourseware = async () => {
  45. forms.loading = true;
  46. try {
  47. const { data } = await lessonCoursewarePage({
  48. page: 1,
  49. rows: 99,
  50. type: 'COURSEWARE',
  51. enableFlag: 1,
  52. bookVersionId: forms.bookVersionId,
  53. keyword: forms.keyword,
  54. currentGradeNum: forms.currentGradeNum
  55. // bookType: forms.bookType
  56. });
  57. forms.list = data.rows;
  58. } catch {
  59. //
  60. }
  61. forms.loading = false;
  62. };
  63. // 删除教材
  64. const onDelete = async (item: any) => {
  65. dialog.warning({
  66. title: '提示',
  67. content: '是否删除该教材?',
  68. positiveText: '确定',
  69. negativeText: '取消',
  70. onPositiveClick: async () => {
  71. try {
  72. await lessonCoursewareRemove({ id: item.id });
  73. message.success('删除成功');
  74. } catch {
  75. //
  76. }
  77. }
  78. });
  79. };
  80. const throttledFn = useThrottleFn(() => getLessonCourseware(), 500);
  81. const onDetail = (item: any) => {
  82. emit('confirm', item);
  83. emit('close');
  84. };
  85. onMounted(async () => {
  86. // 获取教材分类列表
  87. try {
  88. const { data } = await musicTagTree({});
  89. console.log(data);
  90. const temp = data || [];
  91. temp.forEach((item: any) => {
  92. forms.musicTagList.push({
  93. id: item.id,
  94. name: item.name
  95. });
  96. });
  97. } catch {
  98. //
  99. }
  100. getLessonCourseware();
  101. });
  102. return () => (
  103. <div class={styles.selectLessonware}>
  104. <div class={styles.attendClassSearch}>
  105. <NInput
  106. placeholder="请输入教材名称"
  107. clearable
  108. v-model:value={forms.keyword}
  109. onKeyup={(e: KeyboardEvent) => {
  110. if (e.code === 'Enter') {
  111. throttledFn();
  112. }
  113. }}
  114. onClear={() => throttledFn()}>
  115. {{
  116. prefix: () => (
  117. <span
  118. class="icon-search-input"
  119. onClick={() => throttledFn()}></span>
  120. )
  121. }}
  122. </NInput>
  123. <NSelect
  124. placeholder="全部版本"
  125. clearable
  126. options={[{ id: null, name: '全部版本' }, ...forms.musicTagList]}
  127. labelField="name"
  128. valueField="id"
  129. v-model:value={forms.bookVersionId}
  130. onUpdate:value={() => throttledFn()}
  131. />
  132. <NSelect
  133. placeholder="全部年级"
  134. options={
  135. [{ label: '全部年级', value: null }, ...BOOK_DATA.grades] as any
  136. }
  137. v-model:value={forms.currentGradeNum}
  138. clearable
  139. filterable
  140. onUpdate:value={() => throttledFn()}
  141. />
  142. {/* <NSelect
  143. placeholder="全部册别"
  144. options={
  145. [
  146. { label: '全部册别', value: null },
  147. ...BOOK_DATA.bookTypes
  148. ] as any
  149. }
  150. v-model:value={forms.bookType}
  151. clearable
  152. onUpdate:value={() => throttledFn()}
  153. /> */}
  154. </div>
  155. <NScrollbar class={styles.classList}>
  156. <NSpin show={forms.loading} class={styles.content}>
  157. <NSpace size={[50, 40]}>
  158. <div
  159. class={styles.item}
  160. key={`item--1`}
  161. onClick={() => {
  162. forms.selectItem = {};
  163. forms.teachingStatus = true;
  164. }}>
  165. <div class={styles.cover}>
  166. <div class={styles.itemImg}>
  167. <div class={styles.itemBg}></div>
  168. <NImage
  169. objectFit="cover"
  170. src={iconUploadBg}
  171. lazy
  172. previewDisabled={true}
  173. onLoad={e => {
  174. (e.target as any).dataset.loaded = 'true';
  175. }}
  176. />
  177. </div>
  178. </div>
  179. </div>
  180. {forms.list.map((item: any, index: number) => {
  181. return (
  182. <div
  183. class={styles.item}
  184. key={`item-${index}`}
  185. onClick={() => onDetail(item)}>
  186. <div class={styles.cover}>
  187. <div class={styles.itemImg}>
  188. <div class={styles.itemBg}></div>
  189. <NImage
  190. objectFit="cover"
  191. src={item.coverImg}
  192. lazy
  193. previewDisabled={true}
  194. onLoad={e => {
  195. (e.target as any).dataset.loaded = 'true';
  196. }}
  197. />
  198. {item.customFlag && (
  199. <>
  200. <div class={styles.iconCustom}></div>
  201. <div class={styles.editContainer}>
  202. <div class={styles.editBtnGroup}>
  203. <NButton
  204. size="small"
  205. class={styles.delBtn}
  206. color="#EA4132"
  207. onClick={(e: MouseEvent) => {
  208. e.stopPropagation();
  209. onDelete(item);
  210. }}>
  211. 删除
  212. </NButton>
  213. <NButton
  214. size="small"
  215. class={styles.editBtn}
  216. color="#FFFFFF"
  217. onClick={(e: MouseEvent) => {
  218. e.stopPropagation();
  219. forms.selectItem = item;
  220. forms.teachingStatus = true;
  221. }}>
  222. 编辑
  223. </NButton>
  224. </div>
  225. </div>
  226. </>
  227. )}
  228. </div>
  229. </div>
  230. <div class={styles.itemName}>{item.name}</div>
  231. </div>
  232. );
  233. })}
  234. </NSpace>
  235. </NSpin>
  236. </NScrollbar>
  237. {/* 添加自定义教材 */}
  238. <NModal
  239. v-model:show={forms.teachingStatus}
  240. preset="card"
  241. showIcon={false}
  242. class={['modalTitle background', styles.teachingModal]}
  243. title={'自定义教材'}
  244. blockScroll={false}>
  245. <AddTeaching
  246. item={forms.selectItem}
  247. onClose={() => (forms.teachingStatus = false)}
  248. onConfirm={() => {
  249. getLessonCourseware();
  250. forms.selectItem = {};
  251. }}
  252. />
  253. </NModal>
  254. </div>
  255. );
  256. }
  257. });