123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- <script setup lang="ts">
- import { useI18n } from '@/hooks/web/useI18n'
- import { ElInput, ElCard, ElTree, ElTreeSelect, ElSelect, ElOption } from 'element-plus'
- import { handleTree } from '@/utils/tree'
- import { onMounted, ref, unref, watch } from 'vue'
- import * as DeptApi from '@/api/system/dept'
- import { Form, FormExpose } from '@/components/Form'
- import { modelSchema } from './dept.data'
- import { DeptVO } from '@/api/system/dept/types'
- import { useMessage } from '@/hooks/web/useMessage'
- import { getListSimpleUsersApi } from '@/api/system/user'
- const message = useMessage()
- interface Tree {
- id: number
- name: string
- children?: Tree[]
- }
- const defaultProps = {
- children: 'children',
- label: 'name',
- value: 'id'
- }
- const { t } = useI18n() // 国际化
- const loading = ref(false) // 遮罩层
- const dialogVisible = ref(false) // 是否显示弹出层
- const showForm = ref(false) // 显示form表单
- const formTitle = ref('部门信息') // 显示form标题
- const deptParentId = ref(0) // 上级ID
- // 创建form表单
- const formRef = ref<FormExpose>()
- // ========== 创建部门树结构 ==========
- const filterText = ref('')
- const deptOptions = ref() // 树形结构
- const treeRef = ref<InstanceType<typeof ElTree>>()
- const getTree = async () => {
- const res = await DeptApi.listSimpleDeptApi()
- deptOptions.value = handleTree(res)
- }
- const filterNode = (value: string, data: Tree) => {
- if (!value) return true
- return data.name.includes(value)
- }
- watch(filterText, (val) => {
- treeRef.value!.filter(val)
- })
- // 用户列表
- const userOption = ref()
- const leaderUserId = ref()
- const getUserList = async () => {
- const res = await getListSimpleUsersApi()
- userOption.value = res
- }
- // 新增
- const handleAdd = (data: { id: number }) => {
- // 重置表单
- deptParentId.value = data.id
- formTitle.value = '新增部门'
- unref(formRef)?.getElFormRef()?.resetFields()
- showForm.value = true
- }
- // 编辑
- const handleUpdate = async (data: { id: number }) => {
- const res = await DeptApi.getDeptApi(data.id)
- formTitle.value = '修改- ' + res?.name
- deptParentId.value = res.parentId
- leaderUserId.value = res.leaderUserId
- unref(formRef)?.setValues(res)
- showForm.value = true
- }
- // 删除
- const handleDelete = async (data: { id: number }) => {
- message
- .confirm(t('common.delDataMessage'), t('common.confirmTitle'))
- .then(async () => {
- await DeptApi.deleteDeptApi(data.id)
- message.success(t('common.delSuccess'))
- })
- .catch(() => {})
- await getTree()
- }
- // 提交按钮
- const submitForm = async () => {
- loading.value = true
- // 提交请求
- try {
- const data = unref(formRef)?.formModel as DeptVO
- data.parentId = deptParentId.value
- data.leaderUserId = leaderUserId.value
- if (formTitle.value.startsWith('新增')) {
- await DeptApi.createDeptApi(data)
- } else if (formTitle.value.startsWith('修改')) {
- await DeptApi.updateDeptApi(data)
- }
- // 操作成功,重新加载列表
- dialogVisible.value = false
- } finally {
- loading.value = false
- }
- }
- onMounted(async () => {
- await getTree()
- await getUserList()
- })
- </script>
- <template>
- <div class="flex">
- <el-card class="w-1/3 dept" :gutter="12" shadow="always">
- <template #header>
- <div class="card-header">
- <span>部门列表</span>
- <el-button type="primary" v-hasPermi="['system:dept:create']" @click="handleAdd">
- 新增根节点
- </el-button>
- </div>
- </template>
- <div class="custom-tree-container">
- <!-- <p>部门列表</p> -->
- <!-- 操作工具栏 -->
- <el-input v-model="filterText" placeholder="搜索部门" />
- <el-tree
- ref="treeRef"
- node-key="id"
- :data="deptOptions"
- :props="defaultProps"
- :highlight-current="true"
- default-expand-all
- :filter-node-method="filterNode"
- :expand-on-click-node="false"
- >
- <template #default="{ node, data }">
- <span class="custom-tree-node">
- <span>{{ node.label }}</span>
- <span>
- <el-button link v-hasPermi="['system:dept:create']" @click="handleAdd(data)">
- <Icon icon="ep:plus" class="mr-1px" />
- </el-button>
- <el-button link v-hasPermi="['system:dept:update']" @click="handleUpdate(data)">
- <Icon icon="ep:edit" class="mr-1px" />
- </el-button>
- <el-button link v-hasPermi="['system:dept:delete']" @click="handleDelete(data)">
- <Icon icon="ep:delete" class="mr-1px" />
- </el-button>
- </span>
- </span>
- </template>
- </el-tree>
- </div>
- </el-card>
- <el-card class="w-2/3 dept" style="margin-left: 10px" :gutter="12" shadow="hover">
- <template #header>
- <div class="card-header">
- <span>{{ formTitle }}</span>
- </div>
- </template>
- <div v-if="!showForm">
- <span><p>请从左侧选择部门</p></span>
- </div>
- <div v-if="showForm">
- <!-- 操作工具栏 -->
- <Form :schema="modelSchema" ref="formRef">
- <template #parentId>
- <el-tree-select
- node-key="id"
- v-model="deptParentId"
- :props="defaultProps"
- :data="deptOptions"
- check-strictly
- />
- </template>
- <template #leaderUserId>
- <el-select v-model="leaderUserId">
- <el-option
- v-for="item in userOption"
- :key="parseInt(item.id)"
- :label="item.nickname"
- :value="parseInt(item.id)"
- />
- </el-select>
- </template>
- </Form>
- <!-- 操作按钮 -->
- <el-button
- type="primary"
- v-hasPermi="['system:dept:update']"
- :loading="loading"
- @click="submitForm"
- >
- {{ t('action.save') }}
- </el-button>
- <el-button type="danger" @click="showForm = false">取消</el-button>
- </div>
- </el-card>
- </div>
- </template>
- <style scoped>
- .dept {
- height: 600px;
- max-height: 1800px;
- }
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
- .custom-tree-node {
- flex: 1;
- display: flex;
- align-items: center;
- justify-content: space-between;
- font-size: 14px;
- padding-right: 8px;
- }
- </style>
|