backend/src/views/basicSettings/tenants/index.vue
2026-03-11 11:11:57 +08:00

294 lines
7.0 KiB
Vue

<template>
<div class="container-box">
<div class="header-bar">
<h2>租户管理</h2>
<div class="header-actions">
<el-button type="primary" @click="editRef.open()">
<el-icon>
<Plus />
</el-icon>
添加租户
</el-button>
<el-button @click="refresh">
<el-icon>
<Refresh />
</el-icon>
刷新
</el-button>
</div>
</div>
<el-divider></el-divider>
<el-form :inline="true" :model="searchForm" class="search-form">
<el-form-item label="租户名称">
<el-input
v-model="searchForm.tenant_name"
placeholder="请输入租户名称"
clearable
@keyup.enter="handleSearch"
/>
</el-form-item>
<el-form-item label="租户编码">
<el-input
v-model="searchForm.tenant_code"
placeholder="请输入租户编码"
clearable
@keyup.enter="handleSearch"
/>
</el-form-item>
<el-form-item label="联系人">
<el-input
v-model="searchForm.contact_person"
placeholder="请输入联系人"
clearable
@keyup.enter="handleSearch"
/>
</el-form-item>
<el-form-item label="联系电话">
<el-input
v-model="searchForm.contact_phone"
placeholder="请输入联系电话"
clearable
@keyup.enter="handleSearch"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSearch">查询</el-button>
<el-button @click="resetSearch">重置</el-button>
</el-form-item>
</el-form>
<!-- 租户列表表格 -->
<el-table :data="tenants" style="width: 100%" v-loading="loading">
<el-table-column prop="id" label="ID" align="center" fixed="left" />
<el-table-column
prop="tenant_name"
label="租户名称"
min-width="220"
align="center"
/>
<el-table-column
prop="tenant_code"
label="租户编码"
min-width="120"
align="center"
/>
<el-table-column
prop="contact_person"
label="联系人"
min-width="120"
align="center"
/>
<el-table-column
prop="contact_phone"
label="联系电话"
min-width="120"
align="center"
/>
<el-table-column
prop="contact_email"
label="电子邮箱"
min-width="180"
align="center"
/>
<el-table-column
prop="address"
label="租户地址"
min-width="300"
align="center"
/>
<el-table-column prop="status" label="租户状态" width="80" align="center">
<template #default="scope">
<el-tag :type="scope.row.status === 1 ? 'success' : 'danger'">{{
scope.row.status === 1 ? "启用" : "禁用"
}}</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="280" align="center" fixed="right">
<template #default="scope">
<!-- <el-button size="small" @click="handleQualification(scope.row)">资质</el-button> -->
<el-button text size="small" @click="handleAddUser(scope.row)"
>增加用户</el-button
>
<el-button text size="small" @click="handlePreview(scope.row)"
>查看</el-button
>
<el-button text size="small" @click="editRef.open(scope.row.id)"
>编辑</el-button
>
<el-button
text
size="small"
type="danger"
@click="handleDelete(scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<EditModal ref="editRef" @success="refresh" />
<DetailDrawer ref="detailRef" />
<Qualification ref="qualificationRef" />
<AddUser ref="addUserRef" />
<!-- 分页 -->
<div class="pagination-bar">
<el-pagination
:current-page="page"
:page-size="pageSize"
:total="total"
@current-change="handlePageChange"
layout="total, prev, pager, next"
/>
</div>
</div>
</template>
<script setup lang="ts">
import { getTenantList, deleteTenant } from "@/api/tenant";
import { onMounted, ref, reactive } from "vue";
import { useRouter } from "vue-router";
import EditModal from "./components/edit.vue";
import DetailDrawer from "./components/detail.vue";
import Qualification from "./components/qualification.vue";
import AddUser from "./components/adduser.vue";
const total = ref(0);
const page = ref(1);
const pageSize = ref(10);
const loading = ref(false);
const router = useRouter();
const tenants = ref([]);
const editRef = ref();
const detailRef = ref();
const addUserRef = ref();
const qualificationRef = ref();
// 删除
const handleDelete = (row) => {
ElMessageBox.confirm("确定要删除该租户吗?", "提示", {
type: "warning",
})
.then(() => {
deleteTenant(row.id).then((res) => {
if (res.code === 200) {
ElMessage.success("删除成功");
refresh();
}
});
})
.catch(() => {});
};
// 查看
const handlePreview = (row: any) => {
detailRef.value.open(row.id);
};
//增加用户
const handleAddUser = (row: any) => {
addUserRef.value.open(row.id);
};
// 资质
const handleQualification = (row: any) => {
qualificationRef.value.open(row.id);
};
// 分页改变
const handlePageChange = (val: number) => {
page.value = val;
refresh();
};
// 搜索表单数据
const searchForm = reactive({
tenant_name: "",
tenant_code: "",
contact_person: "",
contact_phone: "",
});
// 执行查询(回到第一页再刷新)
const handleSearch = () => {
page.value = 1;
refresh();
};
// 重置查询
const resetSearch = () => {
searchForm.tenant_name = "";
searchForm.tenant_code = "";
searchForm.contact_person = "";
searchForm.contact_phone = "";
handleSearch();
};
// 刷新
const refresh = () => {
loading.value = true;
// 整合分页参数和搜索参数
const queryParams = {
page: page.value,
pageSize: pageSize.value,
...searchForm,
};
getTenantList(queryParams)
.then((res) => {
if (res.code === 200) {
tenants.value = res.data.list;
total.value = res.data.total;
}
})
.finally(() => {
loading.value = false;
});
};
// 获取租户列表
onMounted(() => {
refresh();
});
</script>
<style lang="less" scoped>
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
span {
font-size: 1.4rem;
font-weight: 700;
}
}
:deep(.el-alert__title) {
color: #f56c6c !important;
}
.name-link {
color: #3973ff;
cursor: pointer;
text-decoration: none;
transition: color 0.3s;
&:hover {
color: #66b1ff;
text-decoration: underline;
}
}
.search-form {
background: #f9f9f9;
padding: 20px 20px 0 20px;
border-radius: 4px;
margin-bottom: 20px;
}
</style>