Skip to content

Commit c0d5a56

Browse files
committed
Vue3 重构:REVIEW 部门管理
1 parent 44dc02a commit c0d5a56

File tree

5 files changed

+251
-275
lines changed

5 files changed

+251
-275
lines changed

src/views/system/dept/DeptForm.vue

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
<template>
2+
<Dialog :title="modelTitle" v-model="modelVisible">
3+
<el-form
4+
ref="formRef"
5+
:model="formData"
6+
:rules="formRules"
7+
label-width="80px"
8+
v-loading="formLoading"
9+
>
10+
<el-form-item label="上级部门" prop="parentId">
11+
<el-tree-select
12+
v-model="formData.parentId"
13+
:data="deptTree"
14+
:props="{ value: 'id', label: 'name', children: 'children' }"
15+
value-key="deptId"
16+
placeholder="请选择上级部门"
17+
check-strictly
18+
default-expand-all
19+
/>
20+
</el-form-item>
21+
<el-form-item label="部门名称" prop="name">
22+
<el-input v-model="formData.name" placeholder="请输入部门名称" />
23+
</el-form-item>
24+
<el-form-item label="显示排序" prop="sort">
25+
<el-input-number v-model="formData.sort" controls-position="right" :min="0" />
26+
</el-form-item>
27+
<el-form-item label="负责人" prop="leaderUserId">
28+
<el-select
29+
v-model="formData.leaderUserId"
30+
placeholder="请输入负责人"
31+
clearable
32+
style="width: 100%"
33+
>
34+
<el-option
35+
v-for="item in userList"
36+
:key="item.id"
37+
:label="item.nickname"
38+
:value="item.id"
39+
/>
40+
</el-select>
41+
</el-form-item>
42+
<el-form-item label="联系电话" prop="phone">
43+
<el-input v-model="formData.phone" placeholder="请输入联系电话" maxlength="11" />
44+
</el-form-item>
45+
<el-form-item label="邮箱" prop="email">
46+
<el-input v-model="formData.email" placeholder="请输入邮箱" maxlength="50" />
47+
</el-form-item>
48+
<el-form-item label="状态" prop="status">
49+
<el-select v-model="formData.status" placeholder="请选择状态" clearable>
50+
<el-option
51+
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
52+
:key="dict.value"
53+
:label="dict.label"
54+
:value="dict.value"
55+
/>
56+
</el-select>
57+
</el-form-item>
58+
</el-form>
59+
<template #footer>
60+
<el-button type="primary" @click="submitForm">确 定</el-button>
61+
<el-button @click="modelVisible = false">取 消</el-button>
62+
</template>
63+
</Dialog>
64+
</template>
65+
<script setup lang="ts">
66+
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
67+
import { handleTree } from '@/utils/tree'
68+
import * as DeptApi from '@/api/system/dept'
69+
import * as UserApi from '@/api/system/user'
70+
import { CommonStatusEnum } from '@/utils/constants'
71+
const { t } = useI18n() // 国际化
72+
const message = useMessage() // 消息弹窗
73+
74+
const modelVisible = ref(false) // 弹窗的是否展示
75+
const modelTitle = ref('') // 弹窗的标题
76+
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
77+
const formType = ref('') // 表单的类型:create - 新增;update - 修改
78+
const formData = ref({
79+
id: undefined,
80+
title: '',
81+
parentId: undefined,
82+
name: undefined,
83+
sort: undefined,
84+
leaderUserId: undefined,
85+
phone: undefined,
86+
email: undefined,
87+
status: CommonStatusEnum.ENABLE
88+
})
89+
const formRules = reactive({
90+
parentId: [{ required: true, message: '上级部门不能为空', trigger: 'blur' }],
91+
name: [{ required: true, message: '部门名称不能为空', trigger: 'blur' }],
92+
sort: [{ required: true, message: '显示排序不能为空', trigger: 'blur' }],
93+
email: [{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }],
94+
phone: [
95+
{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }
96+
]
97+
})
98+
const formRef = ref() // 表单 Ref
99+
const deptTree = ref() // 树形结构
100+
const userList = ref<UserApi.UserVO[]>([]) // 用户列表
101+
102+
/** 打开弹窗 */
103+
const open = async (type: string, id?: number) => {
104+
modelVisible.value = true
105+
modelTitle.value = t('action.' + type)
106+
formType.value = type
107+
resetForm()
108+
// 修改时,设置数据
109+
if (id) {
110+
formLoading.value = true
111+
try {
112+
formData.value = await DeptApi.getDeptApi(id)
113+
} finally {
114+
formLoading.value = false
115+
}
116+
}
117+
// 获得用户列表
118+
userList.value = await UserApi.getSimpleUserList()
119+
// 获得部门树
120+
await getTree()
121+
}
122+
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
123+
124+
/** 提交表单 */
125+
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
126+
const submitForm = async () => {
127+
// 校验表单
128+
if (!formRef) return
129+
const valid = await formRef.value.validate()
130+
if (!valid) return
131+
// 提交请求
132+
formLoading.value = true
133+
try {
134+
const data = formData.value as unknown as DeptApi.DeptVO
135+
if (formType.value === 'create') {
136+
await DeptApi.createDeptApi(data)
137+
message.success(t('common.createSuccess'))
138+
} else {
139+
await DeptApi.updateDeptApi(data)
140+
message.success(t('common.updateSuccess'))
141+
}
142+
modelVisible.value = false
143+
// 发送操作成功的事件
144+
emit('success')
145+
} finally {
146+
formLoading.value = false
147+
}
148+
}
149+
150+
/** 重置表单 */
151+
const resetForm = () => {
152+
formData.value = {
153+
id: undefined,
154+
title: '',
155+
parentId: undefined,
156+
name: undefined,
157+
sort: undefined,
158+
leaderUserId: undefined,
159+
phone: undefined,
160+
email: undefined,
161+
status: CommonStatusEnum.ENABLE
162+
}
163+
formRef.value?.resetFields()
164+
}
165+
166+
/** 获得部门树 */
167+
const getTree = async () => {
168+
deptTree.value = []
169+
const data = await DeptApi.listSimpleDeptApi()
170+
let dept: Tree = { id: 0, name: '顶级部门', children: [] }
171+
dept.children = handleTree(data)
172+
deptTree.value.push(dept)
173+
}
174+
</script>

src/views/system/dept/form.vue

Lines changed: 0 additions & 187 deletions
This file was deleted.

0 commit comments

Comments
 (0)