2024-05-28 11:20:52 +08:00

245 lines
8.0 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="84px" :rules="formRules">
<!-- 账号输入框 -->
<el-form-item label="账号" prop="account">
<el-input v-model="formData.account" :disabled="formData.root == 1" placeholder="请输入账号" clearable />
</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>
<el-form-item label="组织" prop="org_id">
<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" />
</el-select>
</el-form-item>
<el-form-item label="归属部门" prop="dept_id">
<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" />
</el-select>
</el-form-item>
<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" />
</el-select>
</el-form-item>
<!-- 角色选择框 -->
<el-form-item label="角色" prop="role_id">
<el-select v-model="formData.role_id" :disabled="formData.root == 1" class="flex-1" multiple
placeholder="请选择角色" clearable>
<el-option v-if="formData.root == 1" label="系统管理员" :value="0" />
<el-option v-for="(item, index) in optionsData.role" :key="index" :label="item.name"
:value="item.id" />
</el-select>
</el-form-item>
<!-- 密码输入框 -->
<el-form-item label="密码" prop="password">
<el-input v-model="formData.password" show-password clearable placeholder="请输入密码" />
</el-form-item>
<!-- 确认密码输入框 -->
<!-- <el-form-item label="确认密码" prop="password_confirm">
<el-input v-model="formData.password_confirm" show-password clearable placeholder="请输入确认密码" />
</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>
<el-switch v-model="formData.multipoint_login" :active-value="1" :inactive-value="0" />
<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'
import { getAll } from '@/api/org/organization'
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const orglist = reactive([])
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑管理员' : '新增管理员'
})
const formData = reactive({
id: '',
account: '',
name: '',
dept_id: [],
job_id: [],
role_id: [],
org_id: [],
avatar: '',
password: '',
// password_confirm: '',
disable: 0,
multipoint_login: 1,
root: 0
})
const dept = reactive([])
const jobs = ref([])
const depts = ref([])
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[]
}>({
role: {
api: roleAll
}
})
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()
}
const area_change = (e: any) => {
formData.dept_id = '';
formData.job_id = '';
if (!e) return
depts.value = []
deptAll({ org_id: e }).then((res) => {
Object.assign(depts.value, res)
})
}
const area_change1 = (e: any) => {
jobs.value = []
if (!e) return
jobsAll({ dept_id: e }).then((res) => {
Object.assign(jobs.value, res)
formData.job_id = ''
})
}
const getlista = () => {
getAll().then((res) => {
Object.assign(orglist, res)
})
}
const setFormData = async (row: any) => {
formRules.password = []
// formRules.password_confirm = [
// {
// validator: passwordConfirmValidator,
// trigger: 'blur'
// }
// ]
const data = await adminDetail({
id: row.id
})
if (mode.value != 'add') {
deptAll({ org_id: data.org_id }).then((res) => {
Object.assign(depts.value, res)
})
jobsAll({ dept_id: data.dept_id }).then((res) => {
Object.assign(jobs.value, res)
})
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
}
const handleClose = () => {
emit('close')
}
getlista()
defineExpose({
open,
setFormData
})
</script>