index.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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="fieldName" />
  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. </n-card>
  29. </div>
  30. </template>
  31. <script setup lang="tsx">
  32. import { reactive, ref } from 'vue';
  33. import type { Ref } from 'vue';
  34. import { NButton, NPopconfirm, NSpace } from 'naive-ui';
  35. import type { DataTableColumns, PaginationProps } from 'naive-ui';
  36. import { useBoolean, useLoading } from '@/hooks';
  37. import { fetchFieldList } from '@/service/api/event';
  38. import TableActionModal from './components/table-action-modal.vue';
  39. import type { ModalType } from './components/table-action-modal.vue';
  40. const { loading, startLoading, endLoading } = useLoading(false);
  41. const { bool: visible, setTrue: openModal } = useBoolean();
  42. const fieldName = ref('');
  43. const tableData = ref<BackgroundField.Field[]>([]);
  44. function setTableData(data: BackgroundField.Field[]) {
  45. tableData.value = data;
  46. }
  47. async function getTableData() {
  48. startLoading();
  49. const { data } = await fetchFieldList();
  50. if (data) {
  51. setTimeout(() => {
  52. setTableData(data);
  53. endLoading();
  54. }, 1000);
  55. }
  56. }
  57. const columns: Ref<DataTableColumns<BackgroundField.Field>> = ref([
  58. {
  59. type: 'selection',
  60. align: 'center'
  61. },
  62. {
  63. key: 'index',
  64. title: '序号',
  65. align: 'center'
  66. },
  67. {
  68. key: 'fieldName',
  69. title: '字段名称',
  70. align: 'center'
  71. },
  72. {
  73. key: 'fieldType',
  74. title: '字段类型',
  75. align: 'center'
  76. },
  77. {
  78. key: 'componentsType',
  79. title: '组件类型',
  80. align: 'center'
  81. },
  82. {
  83. key: 'filedLen',
  84. title: '字段长度',
  85. align: 'center'
  86. },
  87. {
  88. key: 'minValue',
  89. title: '最小值',
  90. align: 'center'
  91. },
  92. {
  93. key: 'maxValue',
  94. title: '最大值',
  95. align: 'center'
  96. },
  97. {
  98. key: 'actions',
  99. title: '操作',
  100. align: 'center',
  101. render: row => {
  102. return (
  103. <NSpace justify={'center'}>
  104. <NButton size={'small'} onClick={() => handleEditTable(row.id)}>
  105. 编辑
  106. </NButton>
  107. <NPopconfirm onPositiveClick={() => handleDeleteTable(row.id)}>
  108. {{
  109. default: () => '确认删除',
  110. trigger: () => <NButton size={'small'}>删除</NButton>
  111. }}
  112. </NPopconfirm>
  113. </NSpace>
  114. );
  115. }
  116. }
  117. ]) as Ref<DataTableColumns<BackgroundField.Field>>;
  118. const modalType = ref<ModalType>('add');
  119. function setModalType(type: ModalType) {
  120. modalType.value = type;
  121. }
  122. const editData = ref<BackgroundField.Field | null>(null);
  123. function setEditData(data: BackgroundField.Field | null) {
  124. editData.value = data;
  125. }
  126. function handleAddTable() {
  127. openModal();
  128. setModalType('add');
  129. }
  130. function handleEditTable(rowId: number) {
  131. const findItem = tableData.value.find(item => item.id === rowId);
  132. if (findItem) {
  133. setEditData(findItem);
  134. }
  135. setModalType('edit');
  136. openModal();
  137. }
  138. function handleDeleteTable(rowId: number) {
  139. window.$message?.info(`点击了删除,rowId为${rowId}`);
  140. }
  141. const pagination: PaginationProps = reactive({
  142. page: 1,
  143. pageSize: 10,
  144. showSizePicker: true,
  145. pageSizes: [10, 15, 20, 25, 30],
  146. onChange: (page: number) => {
  147. pagination.page = page;
  148. },
  149. onUpdatePageSize: (pageSize: number) => {
  150. pagination.pageSize = pageSize;
  151. pagination.page = 1;
  152. }
  153. });
  154. function handleSearch() {
  155. if (!fieldName.value) {
  156. window.$message?.warning('请输入字段名称');
  157. } else {
  158. console.log(fieldName.value);
  159. }
  160. }
  161. function init() {
  162. getTableData();
  163. }
  164. // 初始化
  165. init();
  166. </script>
  167. <style scoped></style>