index.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <template>
  2. <div class="default-main ba-table-box">
  3. <el-alert class="ba-table-alert" v-if="baTable.table.remark" :title="baTable.table.remark" type="info"
  4. show-icon />
  5. <!-- 表格顶部菜单 -->
  6. <TableHeader :buttons="['refresh', 'columnDisplay']">
  7. <el-input class="form-input" v-model="baTable.table.filter!.name" @input="onSearchInput"
  8. placeholder="企业名称" clearable />
  9. <el-select class="form-input" v-model="baTable.table.filter!.status" @change="onSearchInput"
  10. placeholder="状态" clearable>
  11. <el-option label="正常" value="1" />
  12. <el-option label="禁用" value="0" />
  13. </el-select>
  14. <template #quickSearchPrepend>
  15. <el-button type="primary" @click="onAdd">添加</el-button>
  16. </template>
  17. </TableHeader>
  18. <!-- 表格 -->
  19. <!-- 要使用`el-table`组件原有的属性,直接加在Table标签上即可 -->
  20. <Table>
  21. <template #status>
  22. <el-table-column prop="status" align="center" label="状态" min-width="150">
  23. <template #default="scope">
  24. <el-switch v-model="scope.row.status" active-value="1" inactive-value="0" />
  25. </template>
  26. </el-table-column>
  27. </template>
  28. <template #operate>
  29. <el-table-column prop="operate" align="center" label="操作" min-width="150">
  30. <template #default="scope">
  31. <el-button type="primary" size="small" @click="onEdit(scope.row)">编辑</el-button>
  32. <el-button type="danger" size="small" @click="del(scope.row)">删除</el-button>
  33. </template>
  34. </el-table-column>
  35. </template>
  36. </Table>
  37. <!-- 表单 -->
  38. <PopupForm />
  39. </div>
  40. </template>
  41. <script setup lang="ts">
  42. import { onMounted, provide, } from 'vue'
  43. import { cloneDeep } from 'lodash-es'
  44. import baTableClass from '/@/utils/baTable'
  45. import Table from '/@/components/table/index.vue'
  46. import TableHeader from '/@/components/table/header/index.vue'
  47. import PopupForm from './popupForm.vue'
  48. import { baTableApi } from '/@/api/common'
  49. import { useI18n } from 'vue-i18n'
  50. defineOptions({
  51. name: 'company/index',
  52. })
  53. const { t } = useI18n()
  54. const baTable = new baTableClass(
  55. new baTableApi('/admin/company.index/'),
  56. {
  57. column: [
  58. { label: '编号', prop: 'id', align: 'center', width: 70 },
  59. {
  60. label: '企业名称',
  61. prop: 'name',
  62. align: 'center',
  63. minWidth: 120
  64. },
  65. {
  66. label: '创建人',
  67. prop: 'creator',
  68. align: 'center',
  69. minWidth: 150
  70. },
  71. {
  72. label: '状态',
  73. prop: 'status',
  74. align: 'center',
  75. render: 'slot',
  76. slotName: 'status',
  77. minWidth: 150
  78. },
  79. {
  80. label: '创建时间',
  81. prop: 'create_time',
  82. align: 'center',
  83. minWidth: 160
  84. },
  85. {
  86. label: '操作',
  87. align: 'center',
  88. render: 'slot',
  89. slotName: 'operate',
  90. operator: false,
  91. },
  92. ],
  93. dblClickNotEditColumn: [undefined,],
  94. },
  95. {
  96. defaultItems: {
  97. status: '1',
  98. },
  99. }
  100. )
  101. // 设置假数据
  102. baTable.getData = () => {
  103. baTable.table.loading = true
  104. // 模拟异步请求
  105. return new Promise<void>((resolve) => {
  106. setTimeout(() => {
  107. // 根据筛选条件过滤数据
  108. let filteredData = [
  109. {
  110. id: 1,
  111. name: '聚德科技',
  112. creator: '张三',
  113. status: '1',
  114. create_time: '2025-01-10 10:00:00',
  115. },
  116. {
  117. id: 2,
  118. name: '棱镜科技',
  119. creator: '李四',
  120. status: '1',
  121. create_time: '2025-01-11 09:00:00',
  122. },
  123. {
  124. id: 3,
  125. name: '测试公司',
  126. creator: '王五',
  127. status: '0',
  128. create_time: '2025-01-12 11:00:00',
  129. },
  130. {
  131. id: 4,
  132. name: '示例企业',
  133. creator: '赵六',
  134. status: '1',
  135. create_time: '2025-01-13 14:00:00',
  136. },
  137. {
  138. id: 5,
  139. name: '腾达科技',
  140. creator: '刘七',
  141. status: '0',
  142. create_time: '2025-01-14 08:30:00',
  143. },
  144. ]
  145. // 根据筛选条件过滤
  146. const nameFilter = baTable.table.filter?.name
  147. const statusFilter = baTable.table.filter?.status
  148. if (nameFilter) {
  149. filteredData = filteredData.filter(item =>
  150. item.name.includes(nameFilter.trim())
  151. )
  152. }
  153. if (statusFilter) {
  154. filteredData = filteredData.filter(item =>
  155. item.status === statusFilter
  156. )
  157. }
  158. baTable.table.data = filteredData
  159. baTable.table.total = filteredData.length
  160. baTable.table.loading = false
  161. resolve()
  162. }, 300)
  163. })
  164. }
  165. provide('baTable', baTable)
  166. // 搜索
  167. const onSearchInput = () => {
  168. baTable.table.filter!.page = 1
  169. baTable.getData()
  170. }
  171. // 删除
  172. const del = (row: TableRow) => {
  173. baTable.onTableAction('delete', { row })
  174. }
  175. const openForm = (type: 'Add' | 'Edit', row?: TableRow) => {
  176. if (type === 'Edit' && !row) return
  177. baTable.form.items = row ? cloneDeep(row) : cloneDeep(baTable.form.defaultItems)
  178. baTable.form.operate = type
  179. baTable.form.operateIds = row && baTable.table.pk ? [row[baTable.table.pk]] : []
  180. }
  181. const onAdd = () => openForm('Add')
  182. const onEdit = (row: TableRow) => openForm('Edit', row)
  183. onMounted(() => {
  184. baTable.mount()
  185. baTable.getData()
  186. })
  187. </script>
  188. <style scoped lang="scss">
  189. .form-input {
  190. width: 180px;
  191. margin:0 5px;
  192. }
  193. </style>