index.tsx 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  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. bookVersionPage
  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. removeVisiable: false,
  43. removeRow: {} as any
  44. // bookType: null
  45. });
  46. const getLessonCourseware = async () => {
  47. forms.loading = true;
  48. try {
  49. const { data } = await lessonCoursewarePage({
  50. page: 1,
  51. rows: 99,
  52. type: 'COURSEWARE',
  53. enableFlag: 1,
  54. bookVersionId: forms.bookVersionId,
  55. keyword: forms.keyword,
  56. currentGradeNum: forms.currentGradeNum
  57. // bookType: forms.bookType
  58. });
  59. forms.list = data.rows;
  60. } catch {
  61. //
  62. }
  63. forms.loading = false;
  64. };
  65. // 删除教材
  66. const onDelete = async (item: any) => {
  67. try {
  68. await lessonCoursewareRemove({ id: forms.removeRow.id });
  69. message.success('删除成功');
  70. getLessonCourseware();
  71. forms.removeVisiable = false;
  72. } catch (e) {
  73. console.log(e);
  74. }
  75. };
  76. const throttledFn = useThrottleFn(() => getLessonCourseware(), 500);
  77. const onDetail = (item: any) => {
  78. emit('confirm', item);
  79. emit('close');
  80. };
  81. onMounted(async () => {
  82. // 获取教材分类列表
  83. try {
  84. const { data } = await bookVersionPage({
  85. page: 1,
  86. rows: 99,
  87. type: 'COURSEWARE'
  88. });
  89. const temp = data.rows || [];
  90. temp.forEach((item: any) => {
  91. forms.musicTagList.push({
  92. id: item.id,
  93. name: item.name
  94. });
  95. });
  96. } catch {
  97. //
  98. }
  99. getLessonCourseware();
  100. });
  101. return () => (
  102. <div class={styles.selectLessonware}>
  103. <div class={styles.attendClassSearch}>
  104. <NInput
  105. placeholder="请输入教材名称"
  106. clearable
  107. v-model:value={forms.keyword}
  108. onKeyup={(e: KeyboardEvent) => {
  109. if (e.code === 'Enter') {
  110. throttledFn();
  111. }
  112. }}
  113. onClear={() => throttledFn()}>
  114. {{
  115. prefix: () => (
  116. <span
  117. class="icon-search-input"
  118. onClick={() => throttledFn()}></span>
  119. )
  120. }}
  121. </NInput>
  122. <NSelect
  123. placeholder="全部版本"
  124. clearable
  125. options={[{ id: null, name: '全部版本' }, ...forms.musicTagList]}
  126. labelField="name"
  127. valueField="id"
  128. v-model:value={forms.bookVersionId}
  129. onUpdate:value={() => throttledFn()}
  130. />
  131. <NSelect
  132. placeholder="全部年级"
  133. options={
  134. [{ label: '全部年级', value: null }, ...BOOK_DATA.grades] as any
  135. }
  136. v-model:value={forms.currentGradeNum}
  137. clearable
  138. filterable
  139. onUpdate:value={() => throttledFn()}
  140. />
  141. {/* <NSelect
  142. placeholder="全部册别"
  143. options={
  144. [
  145. { label: '全部册别', value: null },
  146. ...BOOK_DATA.bookTypes
  147. ] as any
  148. }
  149. v-model:value={forms.bookType}
  150. clearable
  151. onUpdate:value={() => throttledFn()}
  152. /> */}
  153. </div>
  154. <NScrollbar class={styles.classList}>
  155. <NSpin show={forms.loading} class={styles.content}>
  156. <NSpace size={[50, 40]}>
  157. <div
  158. class={styles.item}
  159. key={`item--1`}
  160. onClick={() => {
  161. forms.selectItem = {};
  162. forms.teachingStatus = true;
  163. }}>
  164. <div class={styles.cover}>
  165. <div class={styles.itemImg}>
  166. <div class={styles.itemBg}></div>
  167. <NImage
  168. objectFit="cover"
  169. src={iconUploadBg}
  170. lazy
  171. previewDisabled={true}
  172. onLoad={e => {
  173. (e.target as any).dataset.loaded = 'true';
  174. }}
  175. />
  176. </div>
  177. </div>
  178. </div>
  179. {forms.list.map((item: any, index: number) => {
  180. return (
  181. <div
  182. class={styles.item}
  183. key={`item-${index}`}
  184. onClick={() => onDetail(item)}>
  185. <div class={styles.cover}>
  186. <div class={styles.itemImg}>
  187. <div class={styles.itemBg}></div>
  188. <NImage
  189. objectFit="cover"
  190. src={item.coverImg}
  191. lazy
  192. previewDisabled={true}
  193. onLoad={e => {
  194. (e.target as any).dataset.loaded = 'true';
  195. }}
  196. />
  197. {item.customFlag && (
  198. <>
  199. <div class={styles.iconCustom}></div>
  200. <div class={styles.editContainer}>
  201. <div class={styles.editBtnGroup}>
  202. <NButton
  203. size="small"
  204. class={styles.delBtn}
  205. color="#EA4132"
  206. onClick={(e: MouseEvent) => {
  207. e.stopPropagation();
  208. // onDelete(item);
  209. forms.removeVisiable = true;
  210. forms.removeRow = item;
  211. }}>
  212. 删除
  213. </NButton>
  214. <NButton
  215. size="small"
  216. class={styles.editBtn}
  217. color="#FFFFFF"
  218. onClick={(e: MouseEvent) => {
  219. e.stopPropagation();
  220. forms.selectItem = item;
  221. forms.teachingStatus = true;
  222. }}>
  223. 编辑
  224. </NButton>
  225. </div>
  226. </div>
  227. </>
  228. )}
  229. </div>
  230. </div>
  231. <div class={styles.itemName}>{item.name}</div>
  232. </div>
  233. );
  234. })}
  235. </NSpace>
  236. </NSpin>
  237. </NScrollbar>
  238. {/* 添加自定义教材 */}
  239. <NModal
  240. v-model:show={forms.teachingStatus}
  241. preset="card"
  242. showIcon={false}
  243. class={['modalTitle background', styles.teachingModal]}
  244. title={'自定义教材'}
  245. blockScroll={false}>
  246. <AddTeaching
  247. item={forms.selectItem}
  248. onClose={() => (forms.teachingStatus = false)}
  249. onConfirm={() => {
  250. getLessonCourseware();
  251. forms.selectItem = {};
  252. }}
  253. />
  254. </NModal>
  255. <NModal
  256. v-model:show={forms.removeVisiable}
  257. preset="card"
  258. class={['modalTitle', styles.removeVisiable]}
  259. title={'删除教材'}>
  260. <div class={styles.studentRemove}>
  261. <p>是否删除该教材</p>
  262. <NSpace class={styles.btnGroup} justify="center">
  263. <NButton round type="primary" onClick={onDelete}>
  264. 确定
  265. </NButton>
  266. <NButton round onClick={() => (forms.removeVisiable = false)}>
  267. 取消
  268. </NButton>
  269. </NSpace>
  270. </div>
  271. </NModal>
  272. </div>
  273. );
  274. }
  275. });