index.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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 #operate>
  22. <el-table-column prop="operate" align="center" label="操作" min-width="210">
  23. <template #default="scope">
  24. <el-button type="primary" size="small" @click="onEdit(scope.row)">编辑</el-button>
  25. <el-button type="danger" size="small" @click="handleDelete(scope.row)">删除</el-button>
  26. <el-button type="primary" plain size="small" @click="detail(scope.row)">详情</el-button>
  27. </template>
  28. </el-table-column>
  29. </template>
  30. </Table>
  31. <!-- 表单 -->
  32. <PopupForm @success="baTable.getIndex()" />
  33. <!-- 详情弹框 -->
  34. <DetailDialog ref="detailDialogRef" />
  35. </div>
  36. </template>
  37. <script setup lang="ts">
  38. import { provide, useTemplateRef } from 'vue'
  39. import { cloneDeep } from 'lodash-es'
  40. import baTableClass from '/@/utils/baTable'
  41. import Table from '/@/components/table/index.vue'
  42. import TableHeader from '/@/components/table/header/index.vue'
  43. import PopupForm from './popupForm.vue'
  44. import DetailDialog from './detailDialog.vue'
  45. import { baTableApi } from '/@/api/common'
  46. import { useI18n } from 'vue-i18n'
  47. import { del } from '/@/api/backend/userCenter/user'
  48. import { ElMessageBox } from 'element-plus'
  49. defineOptions({
  50. name: 'userCenter/user',
  51. })
  52. const { t } = useI18n()
  53. const baTable = new baTableClass(
  54. new baTableApi('/admin/userCenter.user/'),
  55. {
  56. column: [
  57. { label: '编号', prop: 'id', align: 'center', width: 70 },
  58. {
  59. label: '用户名',
  60. prop: 'name',
  61. align: 'center',
  62. minWidth: 120
  63. },
  64. {
  65. label: '邮箱',
  66. prop: 'email',
  67. align: 'center',
  68. minWidth: 170
  69. },
  70. {
  71. label: '企业',
  72. prop: 'company',
  73. align: 'center',
  74. minWidth: 160
  75. },
  76. {
  77. label: '状态',
  78. prop: 'status',
  79. align: 'center',
  80. render: 'tag',
  81. custom: { '1': 'success', '0': 'danger' },
  82. replaceValue: { '1': '启用', '0': '禁用' },
  83. minWidth: 150
  84. },
  85. {
  86. label: '邀请人',
  87. prop: 'inviter',
  88. align: 'center',
  89. minWidth: 120
  90. },
  91. {
  92. label: '创建时间',
  93. prop: 'create_time',
  94. align: 'center',
  95. minWidth: 160
  96. },
  97. {
  98. label: '最后登录时间',
  99. prop: 'last_login_time',
  100. align: 'center',
  101. minWidth: 160
  102. },
  103. {
  104. label: '操作',
  105. align: 'center',
  106. render: 'slot',
  107. slotName: 'operate',
  108. operator: false,
  109. },
  110. ],
  111. dblClickNotEditColumn: [undefined,],
  112. },
  113. {
  114. defaultItems: {
  115. status: '1',
  116. },
  117. }
  118. )
  119. baTable.mount()
  120. baTable.getData()
  121. provide('baTable', baTable)
  122. // 搜索
  123. const onSearchInput = () => {
  124. baTable.table.filter!.page = 1
  125. baTable.getData()
  126. }
  127. // 删除
  128. const handleDelete = (row: TableRow) => {
  129. ElMessageBox.confirm(`确定删除用户"${row.name}"吗?`, '提示', {
  130. confirmButtonText: '确定',
  131. cancelButtonText: '取消',
  132. type: 'warning',
  133. }).then(() => {
  134. del({ id: row.id }).then(() => {
  135. baTable.getIndex()
  136. })
  137. })
  138. }
  139. const openForm = (type: 'Add' | 'Edit', row?: TableRow) => {
  140. if (type === 'Edit' && !row) return
  141. baTable.form.items = row ? cloneDeep(row) : cloneDeep(baTable.form.defaultItems)
  142. baTable.form.operate = type
  143. baTable.form.operateIds = row && baTable.table.pk ? [row[baTable.table.pk]] : []
  144. }
  145. const onAdd = () => openForm('Add')
  146. const onEdit = (row: TableRow) => openForm('Edit', row)
  147. // 详情弹框引用
  148. const detailDialogRef = useTemplateRef('detailDialogRef')
  149. // 详情
  150. const detail = (row: TableRow) => {
  151. if (detailDialogRef.value) {
  152. detailDialogRef.value.open(row)
  153. }
  154. }
  155. </script>
  156. <style scoped lang="scss">
  157. .form-input {
  158. width: 160px;
  159. margin:0 5px;
  160. }
  161. </style>