index.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <template>
  2. <div>
  3. <!--引用表格-->
  4. <BasicTable @register="registerTable" :rowSelection="rowSelection">
  5. <!--插槽:table标题-->
  6. <template #tableTitle>
  7. <a-button
  8. type="primary"
  9. @click="router.push({ name: 'businessManagement-publishcourses', query: { type: 0 } })"
  10. preIcon="ant-design:plus-outlined"
  11. >
  12. 新增</a-button
  13. >
  14. <a-dropdown v-if="selectedRowKeys.length > 0">
  15. <a-button v-auth="'courses:nm_courses:deleteBatch'"
  16. >批量操作
  17. <Icon icon="mdi:chevron-down"></Icon>
  18. </a-button>
  19. </a-dropdown>
  20. </template>
  21. <!--操作栏-->
  22. <template #action="{ record }">
  23. <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" />
  24. </template>
  25. <!--字段回显插槽-->
  26. <template v-slot:bodyCell="{ column, record, index, text }"> </template>
  27. <template #price="{ record }"> {{ record.sellingPrice }}/{{ record.originalPrice }} </template>
  28. <template #priceType="{ record }">
  29. <Switch v-model:checked="record.priceType" :checked-value="0" :un-checked-value="1"></Switch>
  30. </template>
  31. <template #img="{ text }">
  32. <TableImg :img-list="[text]" :size="60" simpleShow></TableImg>
  33. </template>
  34. </BasicTable>
  35. <!-- 表单区域 -->
  36. <coursesModal @register="registerModal" @success="handleSuccess"></coursesModal>
  37. </div>
  38. </template>
  39. <script lang="ts" name="courses" setup>
  40. import { Switch } from 'ant-design-vue';
  41. import { ref, reactive, computed, unref } from 'vue';
  42. import { BasicTable, TableImg, TableAction } from '/@/components/Table';
  43. import { useModal } from '/@/components/Modal';
  44. import { useListPage } from '/@/hooks/system/useListPage';
  45. import coursesModal from './components/coursesModal.vue';
  46. import { columns, searchFormSchema } from './courses.data';
  47. import { list, deleteOne } from './courses.api';
  48. import { useUserStore } from '/@/store/modules/user';
  49. import { useMessage } from '/@/hooks/web/useMessage';
  50. const queryParam = reactive<any>({});
  51. const checkedKeys = ref<Array<string | number>>([]);
  52. const userStore = useUserStore();
  53. const { createMessage } = useMessage();
  54. //注册model
  55. const [registerModal, { openModal }] = useModal();
  56. //注册table数据
  57. const { prefixCls, tableContext } = useListPage({
  58. tableProps: {
  59. title: 'courses',
  60. api: list,
  61. columns,
  62. canResize: false,
  63. formConfig: {
  64. //labelWidth: 120,
  65. schemas: searchFormSchema,
  66. autoSubmitOnEnter: true,
  67. showAdvancedButton: true,
  68. fieldMapToNumber: [],
  69. fieldMapToTime: [],
  70. autoAdvancedCol: 4,
  71. },
  72. actionColumn: {
  73. width: 180,
  74. fixed: 'right',
  75. },
  76. beforeFetch: (params) => {
  77. return Object.assign(params, queryParam);
  78. },
  79. },
  80. });
  81. const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;
  82. /**
  83. * 编辑事件
  84. */
  85. function handleView(record: Recordable) {
  86. router.push({ name: 'businessManagement-publishcourses', query: { type: 1, id: record.id } });
  87. }
  88. /**
  89. * 详情
  90. */
  91. function handleDetail(record: Recordable) {
  92. openModal(true, {
  93. record,
  94. isUpdate: true,
  95. showFooter: false,
  96. });
  97. }
  98. /**
  99. * 删除事件
  100. */
  101. async function handleDelete(record) {
  102. await deleteOne({ id: record.id }, handleSuccess);
  103. }
  104. /**
  105. * 成功回调
  106. */
  107. function handleSuccess() {
  108. (selectedRowKeys.value = []) && reload();
  109. }
  110. /**
  111. * 操作栏
  112. */
  113. function getTableAction(record) {
  114. return [
  115. {
  116. label: '查看',
  117. onClick: handleView.bind(null, record),
  118. // auth: 'courses:nm_courses:edit',
  119. },
  120. {
  121. label: '编辑',
  122. onClick: handleView.bind(null, record),
  123. // auth: 'courses:nm_courses:edit',
  124. },
  125. ];
  126. }
  127. /**
  128. * 下拉操作栏
  129. */
  130. function getDropDownAction(record) {
  131. return [
  132. {
  133. label: '详情',
  134. onClick: handleDetail.bind(null, record),
  135. },
  136. {
  137. label: '删除',
  138. popConfirm: {
  139. title: '是否确认删除',
  140. confirm: handleDelete.bind(null, record),
  141. placement: 'topLeft',
  142. },
  143. // auth: 'courses:nm_courses:delete',
  144. },
  145. ];
  146. }
  147. </script>
  148. <script lang="ts">
  149. import { router } from '/@/router';
  150. import { useMultipleTabStore } from '@/store/modules/multipleTab';
  151. import { storeToRefs } from 'pinia';
  152. const typeList = ['发布课程', '查看课程'];
  153. export default {
  154. async beforeRouteLeave(to, from, next) {
  155. to.meta.title = typeList[Number(to.query.type)];
  156. const { getTabList } = storeToRefs(useMultipleTabStore());
  157. const closeTab = getTabList.value.filter((it) => it.name == to.name).filter((it) => it.fullPath != to.fullPath);
  158. if (closeTab.length) {
  159. useMultipleTabStore().closeTabByKey(closeTab[0].fullPath, router);
  160. }
  161. await useMultipleTabStore().updateCacheTab();
  162. next();
  163. },
  164. };
  165. </script>
  166. <style lang="less" scoped>
  167. :deep(.ant-picker),
  168. :deep(.ant-input-number) {
  169. width: 100%;
  170. }
  171. </style>