241 lines
7.8 KiB
Vue
Raw Normal View History

2023-11-09 09:26:37 +08:00
<template>
<div class="edit-popup">
2023-12-12 11:29:58 +08:00
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
2023-11-09 09:26:37 +08:00
<el-form ref="formRef" :model="formData" label-width="84px" :rules="formRules">
<!-- 账号输入框 -->
<el-form-item label="账号" prop="account">
2023-12-12 11:29:58 +08:00
<el-input v-model="formData.account" :disabled="formData.root == 1" placeholder="请输入账号" clearable />
2023-11-09 09:26:37 +08:00
</el-form-item>
<!-- 管理员头像 -->
<el-form-item label="头像">
<div>
<div>
<material-picker v-model="formData.avatar" :limit="1" />
</div>
<div class="form-tips">建议尺寸100*100px支持jpgjpegpng格式</div>
</div>
</el-form-item>
<!-- 名称输入框 -->
<el-form-item label="名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入名称" clearable />
</el-form-item>
2023-12-12 11:29:58 +08:00
<el-form-item label="组织" prop="org_id">
2024-02-26 18:22:03 +08:00
<el-select clearable v-model="formData.org_id" placeholder="请选择组织" @change="area_change" class="flex-1">
<el-option v-for=" (item, index) in orglist" :key="index" :label="item.name" :value="item.id" />
2023-12-12 11:29:58 +08:00
</el-select>
</el-form-item>
2023-11-09 09:26:37 +08:00
<el-form-item label="归属部门" prop="dept_id">
2024-02-26 18:22:03 +08:00
<el-select class="flex-1" v-model="formData.dept_id" clearable placeholder="请选择部门"
@change="area_change1">
<el-option v-for="(item, index) in depts" :key="index" :label="item.name" :value="item.id" />
2023-12-12 11:29:58 +08:00
</el-select>
2023-11-09 09:26:37 +08:00
</el-form-item>
2023-12-12 11:29:58 +08:00
<el-form-item label="岗位" prop="job_id">
<el-select class="flex-1" v-model="formData.job_id" clearable placeholder="请选择岗位">
<el-option v-for="(item, index) in jobs" :key="index" :label="item.name" :value="item.id" />
2023-11-09 09:26:37 +08:00
</el-select>
</el-form-item>
<!-- 角色选择框 -->
<el-form-item label="角色" prop="role_id">
2024-02-26 18:22:03 +08:00
<el-select v-model="formData.role_id" :disabled="formData.root == 1" class="flex-1" multiple
placeholder="请选择角色" clearable>
2023-11-09 09:26:37 +08:00
<el-option v-if="formData.root == 1" label="系统管理员" :value="0" />
2024-02-26 18:22:03 +08:00
<el-option v-for="(item, index) in optionsData.role" :key="index" :label="item.name"
:value="item.id" />
2023-11-09 09:26:37 +08:00
</el-select>
</el-form-item>
<!-- 密码输入框 -->
<el-form-item label="密码" prop="password">
2023-12-12 11:29:58 +08:00
<el-input v-model="formData.password" show-password clearable placeholder="请输入密码" />
2023-11-09 09:26:37 +08:00
</el-form-item>
<!-- 确认密码输入框 -->
<el-form-item label="确认密码" prop="password_confirm">
2023-12-12 11:29:58 +08:00
<el-input v-model="formData.password_confirm" show-password clearable placeholder="请输入确认密码" />
2023-11-09 09:26:37 +08:00
</el-form-item>
<!-- 管理员状态 -->
<el-form-item label="管理员状态" v-if="formData.root != 1">
<el-switch v-model="formData.disable" :active-value="0" :inactive-value="1" />
</el-form-item>
<!-- 多处登录 -->
<el-form-item label="多处登录">
<div>
2023-12-12 11:29:58 +08:00
<el-switch v-model="formData.multipoint_login" :active-value="1" :inactive-value="0" />
2023-11-09 09:26:37 +08:00
<div class="form-tips">允许多人同时在线登录</div>
</div>
</el-form-item>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup>
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { useDictOptions } from '@/hooks/useDictOptions'
import { adminAdd, adminDetail, adminEdit } from '@/api/perms/admin'
import { roleAll } from '@/api/perms/role'
import { jobsAll } from '@/api/org/post'
import { deptAll } from '@/api/org/department'
2023-12-12 11:29:58 +08:00
import { getAll } from '@/api/org/organization'
2023-11-09 09:26:37 +08:00
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
2023-12-12 11:29:58 +08:00
const orglist = reactive([])
2023-11-09 09:26:37 +08:00
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑管理员' : '新增管理员'
})
const formData = reactive({
id: '',
account: '',
name: '',
dept_id: [],
2023-12-12 11:29:58 +08:00
job_id: [],
2023-11-09 09:26:37 +08:00
role_id: [],
2023-12-12 11:29:58 +08:00
org_id: [],
2023-11-09 09:26:37 +08:00
avatar: '',
password: '',
password_confirm: '',
disable: 0,
multipoint_login: 1,
root: 0
})
2023-12-12 11:29:58 +08:00
const dept = reactive([])
2024-02-26 18:22:03 +08:00
const jobs = ref([])
const depts = ref([])
2023-11-09 09:26:37 +08:00
const passwordConfirmValidator = (rule: object, value: string, callback: any) => {
if (formData.password) {
if (!value) callback(new Error('请再次输入密码'))
if (value !== formData.password) callback(new Error('两次输入密码不一致!'))
}
callback()
}
const formRules = reactive({
account: [
{
required: true,
message: '请输入账号',
trigger: ['blur']
}
],
name: [
{
required: true,
message: '请输入名称',
trigger: ['blur']
}
],
role_id: [
{
type: 'array',
required: true,
message: '请选择角色',
trigger: ['blur']
}
],
password: [
{
required: true,
message: '请输入密码',
trigger: ['blur']
}
] as any[],
password_confirm: [
{
required: true,
message: '请输入确认密码',
trigger: ['blur']
},
{
validator: passwordConfirmValidator,
trigger: 'blur'
}
] as any[]
})
const { optionsData } = useDictOptions<{
role: any[]
2023-12-12 11:29:58 +08:00
2023-11-09 09:26:37 +08:00
}>({
role: {
api: roleAll
}
2023-12-12 11:29:58 +08:00
2023-11-09 09:26:37 +08:00
})
const handleSubmit = async () => {
await formRef.value?.validate()
mode.value == 'edit' ? await adminEdit(formData) : await adminAdd(formData)
popupRef.value?.close()
emit('success')
}
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
}
2023-12-12 11:29:58 +08:00
const area_change = (e: any) => {
2024-02-26 18:22:03 +08:00
depts.value = []
2023-12-12 11:29:58 +08:00
deptAll({ org_id: e }).then((res) => {
2024-02-26 18:22:03 +08:00
Object.assign(depts.value, res)
2023-12-12 11:29:58 +08:00
})
}
const area_change1 = (e: any) => {
2024-02-26 18:22:03 +08:00
jobs.value = []
2023-12-12 11:29:58 +08:00
jobsAll({ dept_id: e }).then((res) => {
2024-02-26 18:22:03 +08:00
Object.assign(jobs.value, res)
formData.job_id = ''
2023-12-12 11:29:58 +08:00
})
}
const getlista = () => {
getAll().then((res) => {
Object.assign(orglist, res)
2023-11-09 09:26:37 +08:00
2023-12-12 11:29:58 +08:00
})
}
2023-11-09 09:26:37 +08:00
const setFormData = async (row: any) => {
formRules.password = []
formRules.password_confirm = [
{
validator: passwordConfirmValidator,
trigger: 'blur'
}
]
const data = await adminDetail({
id: row.id
})
2023-12-12 11:29:58 +08:00
if (mode.value != 'add') {
deptAll({ org_id: data.org_id }).then((res) => {
2024-02-26 18:22:03 +08:00
Object.assign(depts.value, res)
2023-12-12 11:29:58 +08:00
})
jobsAll({ dept_id: data.dept_id }).then((res) => {
2024-02-26 18:22:03 +08:00
Object.assign(jobs.value, res)
2023-12-12 11:29:58 +08:00
})
}
2023-11-09 09:26:37 +08:00
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
2023-12-12 11:29:58 +08:00
2023-11-09 09:26:37 +08:00
}
2023-12-12 11:29:58 +08:00
2023-11-09 09:26:37 +08:00
}
const handleClose = () => {
emit('close')
}
2023-12-12 11:29:58 +08:00
getlista()
2023-11-09 09:26:37 +08:00
defineExpose({
open,
setFormData
})
</script>