feat: 为部门管理页面添加完整的分页功能
- 添加分页状态管理(currentPage, pageSize, total, allOrgs) - 实现两个数据加载函数(fetchOrgs 用于分页、fetchAllOrgs 用于下拉框) - 添加分页事件处理函数 handlePageChange - 实现删除功能及确认对话框 handleDelete - 更新 UI 组件:表格 loading 状态、删除按钮、分页控件 - 修改 save() 函数完成后重置分页至第一页 - 更新 onMounted 初始化时同时加载分页数据和所有部门数据 - 下拉框改为使用 allOrgs 确保显示完整部门列表
This commit is contained in:
parent
e42dbecf41
commit
11c1104ab1
|
|
@ -4,26 +4,39 @@
|
||||||
<h2>组织架构管理</h2>
|
<h2>组织架构管理</h2>
|
||||||
<el-button type="primary" @click="openDialog()">新增公司</el-button>
|
<el-button type="primary" @click="openDialog()">新增公司</el-button>
|
||||||
</div>
|
</div>
|
||||||
<el-table :data="orgs" border>
|
<el-table :data="orgs" border v-loading="loading">
|
||||||
<el-table-column prop="name" label="公司名称" />
|
<el-table-column prop="name" label="公司名称" />
|
||||||
<el-table-column label="上级公司">
|
<el-table-column label="上级公司">
|
||||||
<template #default="{ row }">{{ row.parent ? orgs.find(o=>o.id===row.parent)?.name : '(集团)' }}</template>
|
<template #default="{ row }">{{ row.parent ? allOrgs.find(o=>o.id===row.parent)?.name : '(集团)' }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="email" label="联系邮箱" />
|
<el-table-column prop="email" label="联系邮箱" />
|
||||||
<el-table-column label="状态">
|
<el-table-column label="状态">
|
||||||
<template #default="{ row }"><el-tag :type="row.is_active?'success':'danger'">{{ row.is_active?'启用':'停用' }}</el-tag></template>
|
<template #default="{ row }"><el-tag :type="row.is_active?'success':'danger'">{{ row.is_active?'启用':'停用' }}</el-tag></template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" width="120">
|
<el-table-column label="操作" width="180">
|
||||||
<template #default="{ row }"><el-button size="small" @click="openDialog(row)">编辑</el-button></template>
|
<template #default="{ row }">
|
||||||
|
<el-button size="small" @click="openDialog(row)">编辑</el-button>
|
||||||
|
<el-button size="small" type="danger" @click="handleDelete(row.id)">删除</el-button>
|
||||||
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
<div style="margin-top:16px;text-align:right">
|
||||||
|
<el-pagination
|
||||||
|
v-model:current-page="currentPage"
|
||||||
|
v-model:page-size="pageSize"
|
||||||
|
:page-sizes="[20]"
|
||||||
|
:total="total"
|
||||||
|
layout="total, prev, pager, next"
|
||||||
|
@current-change="handlePageChange"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<el-dialog v-model="dialogVisible" :title="editing ? '编辑公司' : '新增公司'" width="480px">
|
<el-dialog v-model="dialogVisible" :title="editing ? '编辑公司' : '新增公司'" width="480px">
|
||||||
<el-form :model="form" label-width="90px">
|
<el-form :model="form" label-width="90px">
|
||||||
<el-form-item label="公司名称"><el-input v-model="form.name" /></el-form-item>
|
<el-form-item label="公司名称"><el-input v-model="form.name" /></el-form-item>
|
||||||
<el-form-item label="上级公司">
|
<el-form-item label="上级公司">
|
||||||
<el-select v-model="form.parent" clearable placeholder="不选则为集团顶级">
|
<el-select v-model="form.parent" clearable placeholder="不选则为集团顶级">
|
||||||
<el-option v-for="o in orgs" :key="o.id" :value="o.id" :label="o.name" />
|
<el-option v-for="o in allOrgs" :key="o.id" :value="o.id" :label="o.name" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="联系邮箱"><el-input v-model="form.email" /></el-form-item>
|
<el-form-item label="联系邮箱"><el-input v-model="form.email" /></el-form-item>
|
||||||
|
|
@ -39,18 +52,46 @@
|
||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, reactive, onMounted } from 'vue'
|
import { ref, reactive, onMounted } from 'vue'
|
||||||
import { manageOrganizations, createOrganization, updateOrganization } from '@/api/organizations'
|
import { manageOrganizations, createOrganization, updateOrganization, deleteOrganization } from '@/api/organizations'
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||||
|
|
||||||
const orgs = ref([])
|
const orgs = ref([])
|
||||||
|
const allOrgs = ref([])
|
||||||
const dialogVisible = ref(false)
|
const dialogVisible = ref(false)
|
||||||
const editing = ref(null)
|
const editing = ref(null)
|
||||||
const saving = ref(false)
|
const saving = ref(false)
|
||||||
|
const loading = ref(false)
|
||||||
|
const currentPage = ref(1)
|
||||||
|
const pageSize = ref(20)
|
||||||
|
const total = ref(0)
|
||||||
const form = reactive({ name: '', parent: null, email: '', description: '', is_active: true })
|
const form = reactive({ name: '', parent: null, email: '', description: '', is_active: true })
|
||||||
|
|
||||||
const fetchOrgs = async () => {
|
const fetchOrgs = async (page = 1) => {
|
||||||
const { data } = await manageOrganizations()
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const { data } = await manageOrganizations(page)
|
||||||
orgs.value = data.results
|
orgs.value = data.results
|
||||||
|
total.value = data.count
|
||||||
|
currentPage.value = page
|
||||||
|
} catch (error) {
|
||||||
|
ElMessage.error('加载部门列表失败,请重试')
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const fetchAllOrgs = async () => {
|
||||||
|
try {
|
||||||
|
let allResults = []
|
||||||
|
for (let i = 1; i <= 5; i++) {
|
||||||
|
const { data } = await manageOrganizations(i)
|
||||||
|
allResults = allResults.concat(data.results)
|
||||||
|
if (i === Math.ceil(data.count / 20)) break
|
||||||
|
}
|
||||||
|
allOrgs.value = allResults
|
||||||
|
} catch (error) {
|
||||||
|
ElMessage.error('加载部门列表失败')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function openDialog(org = null) {
|
function openDialog(org = null) {
|
||||||
|
|
@ -67,8 +108,35 @@ async function save() {
|
||||||
else await createOrganization(form)
|
else await createOrganization(form)
|
||||||
ElMessage.success('保存成功')
|
ElMessage.success('保存成功')
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
fetchOrgs()
|
fetchOrgs(1)
|
||||||
|
fetchAllOrgs()
|
||||||
} catch { ElMessage.error('保存失败') } finally { saving.value = false }
|
} catch { ElMessage.error('保存失败') } finally { saving.value = false }
|
||||||
}
|
}
|
||||||
onMounted(fetchOrgs)
|
|
||||||
|
function handlePageChange(newPage) {
|
||||||
|
fetchOrgs(newPage)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleDelete(id) {
|
||||||
|
try {
|
||||||
|
await ElMessageBox.confirm(
|
||||||
|
'此操作将永久删除该部门,是否继续?',
|
||||||
|
'警告',
|
||||||
|
{ confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' }
|
||||||
|
)
|
||||||
|
await deleteOrganization(id)
|
||||||
|
ElMessage.success('删除成功')
|
||||||
|
fetchOrgs(1)
|
||||||
|
fetchAllOrgs()
|
||||||
|
} catch (error) {
|
||||||
|
if (error !== 'cancel') {
|
||||||
|
ElMessage.error('删除失败')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
fetchOrgs()
|
||||||
|
fetchAllOrgs()
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue