index.tsx 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. import { defineComponent, onMounted, reactive } from 'vue';
  2. import styles from './index.module.less';
  3. import CardType from '/src/components/card-type';
  4. import Pagination from '/src/components/pagination';
  5. import SearchGroupResources from './search-group-resources';
  6. import { favorite, materialQueryPage, materialRemoveAll } from '../../api';
  7. import { NModal, NSpin, useDialog, useMessage } from 'naive-ui';
  8. import TheEmpty from '/src/components/TheEmpty';
  9. import UploadModal from './upload-modal';
  10. import CardPreview from '@/components/card-preview';
  11. import resourceDefault from '../../images/resource-default.svg';
  12. import resourceChecked from '../../images/resource-checked.svg';
  13. export default defineComponent({
  14. name: 'share-resources',
  15. setup() {
  16. const message = useMessage();
  17. const dialog = useDialog();
  18. const state = reactive({
  19. searchWord: '',
  20. loading: false,
  21. pageTotal: 0,
  22. pagination: {
  23. page: 1,
  24. rows: 20
  25. },
  26. searchGroup: {
  27. type: '', //
  28. keyword: '',
  29. bookVersionId: null,
  30. subjectId: null,
  31. sourceType: 3
  32. },
  33. tableList: [] as any,
  34. uploadStatus: false,
  35. show: false,
  36. item: {} as any,
  37. editStatus: false, // 是否编辑
  38. editList: [] as any, // TOD
  39. editIds: [] as any // 编辑的
  40. });
  41. const getList = async () => {
  42. try {
  43. state.loading = true;
  44. const { data } = await materialQueryPage({
  45. ...state.searchGroup,
  46. ...state.pagination
  47. });
  48. state.loading = false;
  49. state.pageTotal = Number(data.total);
  50. const tempRows = data.rows || [];
  51. const temp: any = [];
  52. tempRows.forEach((row: any) => {
  53. temp.push({
  54. id: row.id,
  55. coverImg: row.coverImg,
  56. type: row.type,
  57. title: row.name,
  58. isCollect: !!row.favoriteFlag,
  59. isSelected: row.sourceFrom === 'PLATFORM' ? true : false,
  60. content: row.content,
  61. subjectId: row.subjectIds,
  62. enableFlag: row.enableFlag ? 1 : 0,
  63. openFlag: row.openFlag
  64. });
  65. });
  66. state.tableList = temp || [];
  67. } catch {
  68. state.loading = false;
  69. }
  70. };
  71. // 收藏
  72. const onCollect = async (item: any) => {
  73. try {
  74. await favorite({
  75. materialId: item.id,
  76. favoriteFlag: item.isCollect ? 0 : 1,
  77. type: item.type
  78. });
  79. item.isCollect = !item.isCollect;
  80. } catch {
  81. //
  82. }
  83. };
  84. const onSearch = async (item: any) => {
  85. state.pagination.page = 1;
  86. state.searchGroup = Object.assign(state.searchGroup, item);
  87. getList();
  88. };
  89. // 批量删除
  90. const onDelete = async () => {
  91. try {
  92. if (state.editIds.length <= 0) {
  93. message.error('至少选择一条资源进行删除');
  94. return;
  95. }
  96. dialog.warning({
  97. title: '提示',
  98. content: '你确定删除该资源?',
  99. positiveText: '确定',
  100. negativeText: '取消',
  101. onPositiveClick: async () => {
  102. await materialRemoveAll(state.editIds);
  103. message.success('删除成功');
  104. onSearch(state.searchGroup);
  105. state.editIds = [];
  106. }
  107. });
  108. } catch {
  109. //
  110. }
  111. };
  112. onMounted(() => {
  113. getList();
  114. });
  115. return () => (
  116. <>
  117. <SearchGroupResources
  118. onSearch={(item: any) => onSearch(item)}
  119. onUpload={() => {
  120. state.editList = [];
  121. state.uploadStatus = true;
  122. }}
  123. onUpdate={() => {
  124. // 修改
  125. const list: any[] = [];
  126. state.tableList.forEach((item: any) => {
  127. if (state.editIds.indexOf(item.id) > -1) {
  128. list.push(item);
  129. }
  130. });
  131. state.editList = list || [];
  132. if (state.editList.length <= 0) {
  133. message.error('至少选择一条资源进行编辑');
  134. return;
  135. }
  136. state.uploadStatus = true;
  137. }}
  138. onEdit={(status: boolean) => {
  139. // 点击编辑
  140. state.editStatus = status;
  141. if (!state.editStatus) {
  142. state.editIds = [];
  143. }
  144. }}
  145. onSelectAll={(status: boolean) => {
  146. // 全选
  147. if (status) {
  148. const tempIds: any[] = [];
  149. state.tableList.forEach((item: any) => {
  150. tempIds.push(item.id);
  151. });
  152. state.editIds = tempIds;
  153. } else {
  154. state.editIds = [];
  155. }
  156. }}
  157. onDelete={onDelete}
  158. />
  159. <NSpin v-model:show={state.loading} style={{ 'min-height': '50vh' }}>
  160. <div class={styles.list}>
  161. {state.tableList.map((item: any) => (
  162. <div class={styles.itemSection}>
  163. <CardType
  164. item={item}
  165. disabledMouseHover={false}
  166. onClick={(val: any) => {
  167. if (val.type === 'IMG') return;
  168. state.show = true;
  169. state.item = val;
  170. }}
  171. onCollect={(item: any) => onCollect(item)}
  172. />
  173. {/* 编辑模式 */}
  174. {state.editStatus && (
  175. <div
  176. class={[
  177. styles.itemBg,
  178. state.editIds.includes(item.id)
  179. ? styles.itemBgChecked
  180. : ''
  181. ]}
  182. onClick={() => {
  183. const index = state.editIds.indexOf(item.id);
  184. if (index > -1) {
  185. state.editIds.splice(index, 1);
  186. } else {
  187. state.editIds.push(item.id);
  188. }
  189. }}>
  190. <img
  191. src={
  192. state.editIds.includes(item.id)
  193. ? resourceChecked
  194. : resourceDefault
  195. }
  196. class={styles.resourceDefault}
  197. />
  198. </div>
  199. )}
  200. </div>
  201. ))}
  202. {!state.loading && state.tableList.length <= 0 && (
  203. <TheEmpty description="暂无资源" />
  204. )}
  205. </div>
  206. </NSpin>
  207. <Pagination
  208. v-model:page={state.pagination.page}
  209. v-model:pageSize={state.pagination.rows}
  210. v-model:pageTotal={state.pageTotal}
  211. onList={getList}
  212. />
  213. {/* 弹窗查看 */}
  214. <CardPreview v-model:show={state.show} item={state.item} />
  215. <NModal
  216. v-model:show={state.uploadStatus}
  217. preset="card"
  218. showIcon={false}
  219. class={['modalTitle background', styles.attendClassModal]}
  220. title={state.editStatus ? '修改资源' : '上传资源'}
  221. blockScroll={false}>
  222. <UploadModal
  223. onClose={() => (state.uploadStatus = false)}
  224. onConfirm={() => {
  225. state.editIds = [];
  226. state.editList = [];
  227. onSearch(state.searchGroup);
  228. }}
  229. list={state.editList}
  230. />
  231. </NModal>
  232. </>
  233. );
  234. }
  235. });