index.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <template>
  2. <div style="padding: 0px 0px 8px 8px">
  3. <el-card shadow="never" :body-style="{ paddingBottom: '0' }" style="margin-top: 8px">
  4. <el-form :inline="true" @submit.stop.prevent>
  5. <el-form-item label="姓名">
  6. <el-input v-model="state.filter.name" placeholder="姓名" @keyup.enter="onQuery" />
  7. </el-form-item>
  8. <el-form-item>
  9. <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
  10. <el-button v-auth="'api:admin:tenant:add'" type="primary" icon="ele-Plus" @click="onAdd"> 新增 </el-button>
  11. </el-form-item>
  12. </el-form>
  13. </el-card>
  14. <el-card shadow="never" style="margin-top: 8px">
  15. <el-table v-loading="state.loading" :data="state.tenantListData" row-key="id" style="width: 100%">
  16. <el-table-column prop="name" label="企业名称" min-width="120" show-overflow-tooltip />
  17. <el-table-column prop="code" label="企业编码" width="120" show-overflow-tooltip />
  18. <el-table-column prop="realName" label="姓名" width="120" show-overflow-tooltip />
  19. <el-table-column prop="phone" label="手机号" width="120" show-overflow-tooltip />
  20. <el-table-column prop="email" label="邮箱" min-width="180" show-overflow-tooltip />
  21. <el-table-column label="状态" width="80" align="center" fixed="right">
  22. <template #default="{ row }">
  23. <el-switch
  24. v-if="auth('api:admin:tenant:set-enable')"
  25. v-model="row.enabled"
  26. :loading="row.loading"
  27. :active-value="true"
  28. :inactive-value="false"
  29. inline-prompt
  30. active-text="启用"
  31. inactive-text="禁用"
  32. :before-change="() => onSetEnable(row)"
  33. />
  34. <template v-else>
  35. <el-tag type="success" v-if="row.enabled">启用</el-tag>
  36. <el-tag type="danger" v-else>禁用</el-tag>
  37. </template>
  38. </template>
  39. </el-table-column>
  40. <el-table-column label="操作" width="140" header-align="center" align="center" fixed="right">
  41. <template #default="{ row }">
  42. <el-button v-auth="'api:admin:tenant:update'" icon="ele-EditPen" size="small" text type="primary" @click="onEdit(row)">编辑</el-button>
  43. <my-dropdown-more v-auths="['api:admin:permission:assign', 'api:admin:tenant:delete']">
  44. <template #dropdown>
  45. <el-dropdown-menu>
  46. <el-dropdown-item v-if="auth('api:admin:permission:assign')" @click="onSetTenantMenu(row)">菜单权限</el-dropdown-item>
  47. <el-dropdown-item v-if="auth('api:admin:tenant:delete')" @click="onDelete(row)">删除租户</el-dropdown-item>
  48. </el-dropdown-menu>
  49. </template>
  50. </my-dropdown-more>
  51. </template>
  52. </el-table-column>
  53. </el-table>
  54. <div class="my-flex my-flex-end" style="margin-top: 20px">
  55. <el-pagination
  56. v-model:currentPage="state.pageInput.currentPage"
  57. v-model:page-size="state.pageInput.pageSize"
  58. :total="state.total"
  59. :page-sizes="[10, 20, 50, 100]"
  60. small
  61. background
  62. @size-change="onSizeChange"
  63. @current-change="onCurrentChange"
  64. layout="total, sizes, prev, pager, next, jumper"
  65. />
  66. </div>
  67. </el-card>
  68. <tenant-form ref="tenantFormRef" :title="state.tenantFormTitle"></tenant-form>
  69. <set-tenant-menu ref="setTenantMenuRef"></set-tenant-menu>
  70. </div>
  71. </template>
  72. <script lang="ts" setup name="admin/tenant">
  73. import { ref, reactive, onMounted, getCurrentInstance, onUnmounted, defineAsyncComponent } from 'vue'
  74. import { TenantListOutput, PageInputTenantGetPageDto } from '/@/api/admin/data-contracts'
  75. import { TenantApi } from '/@/api/admin/Tenant'
  76. import eventBus from '/@/utils/mitt'
  77. import { auth } from '/@/utils/authFunction'
  78. // 引入组件
  79. const TenantForm = defineAsyncComponent(() => import('./components/tenant-form.vue'))
  80. const MyDropdownMore = defineAsyncComponent(() => import('/@/components/my-dropdown-more/index.vue'))
  81. const SetTenantMenu = defineAsyncComponent(() => import('./components/set-tenant-menu.vue'))
  82. const { proxy } = getCurrentInstance() as any
  83. const tenantFormRef = ref()
  84. const setTenantMenuRef = ref()
  85. const state = reactive({
  86. loading: false,
  87. tenantFormTitle: '',
  88. total: 0,
  89. filter: {
  90. name: '',
  91. },
  92. pageInput: {
  93. currentPage: 1,
  94. pageSize: 20,
  95. } as PageInputTenantGetPageDto,
  96. tenantListData: [] as Array<TenantListOutput>,
  97. })
  98. onMounted(() => {
  99. onQuery()
  100. eventBus.on('refreshTenant', async () => {
  101. onQuery()
  102. })
  103. })
  104. onUnmounted(() => {
  105. eventBus.off('refreshTenant')
  106. })
  107. const onQuery = async () => {
  108. state.loading = true
  109. state.pageInput.filter = state.filter
  110. const res = await new TenantApi().getPage(state.pageInput).catch(() => {
  111. state.loading = false
  112. })
  113. state.tenantListData = res?.data?.list ?? []
  114. state.total = res?.data?.total ?? 0
  115. state.loading = false
  116. }
  117. const onAdd = () => {
  118. state.tenantFormTitle = '新增租户'
  119. tenantFormRef.value.open()
  120. }
  121. const onEdit = (row: TenantListOutput) => {
  122. state.tenantFormTitle = '编辑租户'
  123. tenantFormRef.value.open(row)
  124. }
  125. const onDelete = (row: TenantListOutput) => {
  126. proxy.$modal
  127. .confirmDelete(`确定要删除【${row.name}】?`)
  128. .then(async () => {
  129. await new TenantApi().delete({ id: row.id }, { loading: true, showSuccessMessage: true })
  130. onQuery()
  131. })
  132. .catch(() => {})
  133. }
  134. const onSetEnable = (row: TenantListOutput & { loading: boolean }) => {
  135. return new Promise((resolve, reject) => {
  136. proxy.$modal
  137. .confirm(`确定要${row.enabled ? '禁用' : '启用'}【${row.name}】?`)
  138. .then(async () => {
  139. row.loading = true
  140. const res = await new TenantApi()
  141. .setEnable({ tenantId: row.id, enabled: !row.enabled }, { showSuccessMessage: true })
  142. .catch(() => {
  143. reject(new Error('Error'))
  144. })
  145. .finally(() => {
  146. row.loading = false
  147. })
  148. if (res && res.success) {
  149. resolve(true)
  150. } else {
  151. reject(new Error('Cancel'))
  152. }
  153. })
  154. .catch(() => {
  155. reject(new Error('Cancel'))
  156. })
  157. })
  158. }
  159. const onSizeChange = (val: number) => {
  160. state.pageInput.pageSize = val
  161. onQuery()
  162. }
  163. const onCurrentChange = (val: number) => {
  164. state.pageInput.currentPage = val
  165. onQuery()
  166. }
  167. const onSetTenantMenu = (tenant: TenantListOutput) => {
  168. if (!((tenant?.id as number) > 0)) {
  169. proxy.$modal.msgWarning('请选择租户')
  170. return
  171. }
  172. setTenantMenuRef.value.open(tenant)
  173. }
  174. </script>
  175. <style scoped lang="scss"></style>