index.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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.rackingStatus" :checked-value="0" :un-checked-value="1"></Switch>
  30. </template>
  31. <template #totalNum="{ record }">
  32. <div>{{ record.totalNum }}课时</div>
  33. {{ record.startTime }}-{{ record.endTime }}
  34. </template>
  35. <template #img="{ text }">
  36. <TableImg :img-list="[text]" :size="60" simpleShow></TableImg>
  37. </template>
  38. </BasicTable>
  39. <!-- 表单区域 -->
  40. </div>
  41. <coursesModel @register="registerModal"></coursesModel>
  42. </template>
  43. <script lang="ts" name="courses" setup>
  44. import { Switch } from 'ant-design-vue';
  45. import { router } from '/@/router';
  46. import coursesModel from './components/coursesModel.vue';
  47. import { ref, reactive, computed, unref } from 'vue';
  48. import { BasicTable, TableImg, TableAction } from '/@/components/Table';
  49. import { useModal } from '/@/components/Modal';
  50. import { useListPage } from '/@/hooks/system/useListPage';
  51. import { columns, searchFormSchema } from './courses.data';
  52. import { list, deleteOne, editPriceRules, queryCourseList } from './courses.api';
  53. import { useUserStore } from '/@/store/modules/user';
  54. import { useMessage } from '/@/hooks/web/useMessage';
  55. import { useShopInfoStore } from '/@/store/modules/shopInfo';
  56. import { useRouteTabText } from '/@/hooks/web/useRouteTab';
  57. const queryParam = reactive<any>({});
  58. const userStore = useUserStore();
  59. const { createMessage } = useMessage();
  60. useShopInfoStore().getCurrentDep();
  61. //注册model
  62. const [registerModal, { openModal }] = useModal();
  63. //注册table数据
  64. const { prefixCls, tableContext } = useListPage({
  65. tableProps: {
  66. title: 'courses',
  67. api: list,
  68. columns,
  69. canResize: false,
  70. formConfig: {
  71. //labelWidth: 120,
  72. schemas: searchFormSchema,
  73. autoSubmitOnEnter: true,
  74. showAdvancedButton: true,
  75. fieldMapToNumber: [],
  76. fieldMapToTime: [],
  77. autoAdvancedCol: 4,
  78. },
  79. actionColumn: {
  80. width: 180,
  81. fixed: 'right',
  82. },
  83. beforeFetch: (params) => {
  84. return Object.assign(params, queryParam);
  85. },
  86. },
  87. });
  88. const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;
  89. /**
  90. * 编辑事件
  91. */
  92. function handleView(record: Recordable) {
  93. router.push({ name: 'businessManagement-publishcourses', query: { type: 2, id: record.id } });
  94. }
  95. function handleEdit(record: Recordable) {
  96. router.push({ name: 'businessManagement-publishcourses', query: { type: 1, id: record.id } });
  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: handleEdit.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. popConfirm: {
  135. title: '是否确认删除',
  136. confirm: handleDelete.bind(null, record),
  137. placement: 'topLeft',
  138. },
  139. // auth: 'courses:nm_courses:delete',
  140. },
  141. {
  142. label: '编辑补课课表',
  143. onClick: handleEditCourses.bind(null, record),
  144. // auth: 'courses:nm_courses:delete',
  145. },
  146. ];
  147. }
  148. async function handleEditCourses(record) {
  149. const res = await queryCourseList({ coursesType: 1, id: record.id });
  150. openModal(true, {
  151. record,
  152. isUpdate: false,
  153. showFooter: true,
  154. });
  155. }
  156. useRouteTabText(['发布课程', '编辑课程', '查看课程']);
  157. </script>
  158. <style lang="less" scoped>
  159. :deep(.ant-picker),
  160. :deep(.ant-input-number) {
  161. width: 100%;
  162. }
  163. </style>