index.vue 6.9 KB

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