index.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <template>
  2. <div class="h-full overflow-hidden">
  3. <n-card title="事件管理" :bordered="false" class="rounded-16px shadow-sm">
  4. <n-space class="pb-12px" justify="space-between">
  5. <n-space>
  6. <n-button type="primary" @click="handleAddTable">
  7. <icon-ic-round-plus class="mr-4px text-20px" />
  8. 新增
  9. </n-button>
  10. <n-button type="success">
  11. <icon-uil:export class="mr-4px text-20px" />
  12. 导出Excel
  13. </n-button>
  14. </n-space>
  15. <n-space align="center" :size="18">
  16. <n-input-group>
  17. <n-input v-model:value="eventName" />
  18. <n-button type="primary" @click="handleSearch">搜索</n-button>
  19. </n-input-group>
  20. <n-button size="small" type="primary" @click="getTableData">
  21. <icon-mdi-refresh class="mr-4px text-16px" :class="{ 'animate-spin': loading }" />
  22. 刷新表格
  23. </n-button>
  24. </n-space>
  25. </n-space>
  26. <n-data-table :columns="columns" :data="tableData" :loading="loading" :pagination="pagination" />
  27. <table-action-modal v-model:visible="visible" :type="modalType" :edit-data="editData" />
  28. <table-condition-modal
  29. v-model:conditionVisible="conditionVisible"
  30. :type="modalConditionType"
  31. :edit-data="editData"
  32. />
  33. <table-setting-modal v-model:settingVisible="settingVisible" :type="ModalSettingType" :edit-data="editData" />
  34. </n-card>
  35. </div>
  36. </template>
  37. <script setup lang="tsx">
  38. import { reactive, ref } from 'vue';
  39. import type { Ref } from 'vue';
  40. import { NButton, NPopconfirm, NSpace, NTag } from 'naive-ui';
  41. import type { DataTableColumns, PaginationProps } from 'naive-ui';
  42. import { EventIsShowLabels } from '@/constants';
  43. import { useBoolean, useLoading } from '@/hooks';
  44. import { fetchEventDelete, fetchEventList } from '@/service/api/event';
  45. import type { ModalType } from './components/table-action-modal.vue';
  46. import type { ModalConditionType } from './components/table-condition-modal.vue';
  47. import TableSettingModal, { ModalSettingType } from './components/table-setting-model.vue';
  48. import TableActionModal from './components/table-action-modal.vue';
  49. import TableConditionModal from './components/table-condition-modal.vue';
  50. const { loading, startLoading, endLoading } = useLoading(false);
  51. const { bool: visible, setTrue: openModal } = useBoolean();
  52. const { bool: conditionVisible, setTrue: openEventModal } = useBoolean();
  53. const { bool: settingVisible, setTrue: openSettingModal } = useBoolean();
  54. const eventName = ref('');
  55. const tableData = ref<BackgroundEvent.Event[]>([]);
  56. function setTableData(data: BackgroundEvent.Event[]) {
  57. tableData.value = data;
  58. }
  59. async function getTableData() {
  60. startLoading();
  61. const { data } = await fetchEventList(1, 100, eventName.value);
  62. if (data) {
  63. setTimeout(() => {
  64. setTableData(data);
  65. endLoading();
  66. }, 1000);
  67. }
  68. }
  69. const columns: Ref<DataTableColumns<BackgroundEvent.Event>> = ref([
  70. {
  71. type: 'selection',
  72. align: 'center'
  73. },
  74. {
  75. key: 'index',
  76. title: '序号',
  77. align: 'center'
  78. },
  79. {
  80. key: 'name',
  81. title: '事件名称',
  82. align: 'center'
  83. },
  84. {
  85. key: 'is_show',
  86. title: '是否启用',
  87. align: 'center',
  88. render: row => {
  89. if (row.is_show) {
  90. const tagTypes: Record<BackgroundEvent.IsShowKey, NaiveUI.ThemeColor> = {
  91. '0': 'error',
  92. '1': 'success',
  93. '2': 'warning'
  94. };
  95. return <NTag type={tagTypes[row.is_show]}>{EventIsShowLabels[row.is_show]}</NTag>;
  96. }
  97. return <span></span>;
  98. }
  99. },
  100. {
  101. key: 'remarks',
  102. title: '事件描述',
  103. align: 'center'
  104. },
  105. {
  106. key: 'conditions',
  107. title: '事件执行条件',
  108. align: 'center',
  109. render: row => {
  110. return (
  111. <NSpace justify={'center'}>
  112. <NButton type="info" size={'small'} onClick={() => handleCondition(row.id)}>
  113. 设置
  114. </NButton>
  115. </NSpace>
  116. );
  117. }
  118. },
  119. {
  120. key: 'actions',
  121. title: '操作',
  122. align: 'center',
  123. render: row => {
  124. return (
  125. <NSpace justify={'center'}>
  126. <NButton type="info" size={'small'} onClick={() => handleEditTable(row.id)}>
  127. 编辑
  128. </NButton>
  129. <NButton type="warning" size={'small'} onClick={() => handleSetting(row.id)}>
  130. 影响设置
  131. </NButton>
  132. <NPopconfirm onPositiveClick={() => handleDeleteTable(row.id)}>
  133. {{
  134. default: () => '确认删除',
  135. trigger: () => (
  136. <NButton type="error" size={'small'}>
  137. 删除
  138. </NButton>
  139. )
  140. }}
  141. </NPopconfirm>
  142. </NSpace>
  143. );
  144. }
  145. }
  146. ]) as Ref<DataTableColumns<BackgroundEvent.Event>>;
  147. const modalType = ref<ModalType>('add');
  148. const modalConditionType = ref<ModalConditionType>('add');
  149. const modalSettingType = ref<ModalSettingType>('add');
  150. function setModalType(type: ModalType) {
  151. modalType.value = type;
  152. }
  153. function setModalConditionType(type: ModalConditionType) {
  154. modalConditionType.value = type;
  155. }
  156. function setModalSettingType(type: ModalSettingType) {
  157. modalSettingType.value = type;
  158. }
  159. const editData = ref<BackgroundEvent.Event | null>(null);
  160. function setEditData(data: BackgroundEvent.Event | null) {
  161. editData.value = data;
  162. }
  163. function handleAddTable() {
  164. openModal();
  165. setModalType('add');
  166. }
  167. function handleEditTable(rowId: number) {
  168. const findItem = tableData.value.find(item => item.id === rowId);
  169. if (findItem) {
  170. setEditData(findItem);
  171. }
  172. setModalType('edit');
  173. openModal();
  174. }
  175. /**
  176. * 影响设置
  177. */
  178. function handleSetting(rowId: number) {
  179. const findItem = tableData.value.find(item => item.id === rowId);
  180. if (findItem) {
  181. setEditData(findItem);
  182. }
  183. setModalSettingType('edit');
  184. openSettingModal();
  185. }
  186. /*
  187. * 执行条件设置
  188. */
  189. function handleCondition(rowId: number) {
  190. const findItem = tableData.value.find(item => item.id === rowId);
  191. if (findItem) {
  192. setEditData(findItem);
  193. }
  194. setModalConditionType('edit');
  195. openEventModal();
  196. }
  197. function handleDeleteTable(rowId: number) {
  198. const data = fetchEventDelete(rowId);
  199. data.then(res => {
  200. if (res.data) {
  201. window.$message?.success('删除成功!');
  202. }
  203. });
  204. init();
  205. }
  206. const pagination: PaginationProps = reactive({
  207. page: 1,
  208. pageSize: 10,
  209. showSizePicker: true,
  210. pageSizes: [10, 15, 20, 25, 30],
  211. onChange: (page: number) => {
  212. pagination.page = page;
  213. },
  214. onUpdatePageSize: (pageSize: number) => {
  215. pagination.pageSize = pageSize;
  216. pagination.page = 1;
  217. }
  218. });
  219. function handleSearch() {
  220. if (!eventName.value) {
  221. window.$message?.warning('请输入字段名称');
  222. } else {
  223. window.$message?.warning(eventName.value);
  224. }
  225. }
  226. function init() {
  227. getTableData();
  228. }
  229. // 初始化
  230. init();
  231. </script>
  232. <style scoped></style>