<template>
|
<el-dialog class="gd-dialog" v-model="visible" :title="dialogTitle" @closed="handleClosed" destroy-on-close
|
:close-on-click-modal="false">
|
<!-- <div class="detail-row-view" v-if="dialogReadonly">-->
|
<el-row class="detail-row-view" v-if="dialogReadonly">
|
<el-col :span="12">
|
<div class="label">角色名称</div>
|
<div class="val">{{ formData.roleName }}</div>
|
</el-col>
|
<el-col :span="12">
|
<div class="label">角色别名</div>
|
<div class="val">{{ formData.roleAlias }}</div>
|
</el-col>
|
<el-col :span="12">
|
<div class="label">上级角色</div>
|
<div class="val">{{ formData.parentName || '-' }}</div>
|
</el-col>
|
<el-col :span="12">
|
<div class="label">角色排序</div>
|
<div class="val">{{ formData.sort }}</div>
|
</el-col>
|
</el-row>
|
<!-- </div>-->
|
|
<el-form class="gd-dialog-form" v-else ref="formRef" :model="formData" :rules="rules" label-width="100px">
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="角色名称" prop="roleName">
|
<el-input class="gd-input" v-model="formData.roleName" maxlength="50" placeholder="请输入" clearable />
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="角色别名" prop="roleAlias">
|
<el-input class="gd-input" v-model="formData.roleAlias" maxlength="50" placeholder="请输入" clearable />
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="上级角色" prop="parentId">
|
<el-tree-select
|
class="gd-select"
|
popper-class="gd-tree-select-popper"
|
v-model="formData.parentId"
|
:data="roleTree"
|
:props="treeProps"
|
node-key="id"
|
check-strictly
|
clearable
|
/>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="角色排序" prop="sort">
|
<el-input-number class="gd-input" v-model="formData.sort" :min="0" :controls="false" placeholder="请输入" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
</el-form>
|
|
<template #footer>
|
<el-button v-if="dialogMode != 'view'" color="#F2F3F5" @click="handleCancel">{{ dialogReadonly ? '关闭' : '取消' }}</el-button>
|
<el-button color="#4C34FF" v-if="!dialogReadonly" type="primary" :loading="submitting" :disabled="submitting" @click="handleSubmit">
|
保存
|
</el-button>
|
</template>
|
</el-dialog>
|
</template>
|
|
<script setup>
|
import { computed, ref } from 'vue'
|
import { ElMessage } from 'element-plus'
|
import { add, getRoleTreeById, update } from '@/api/system/role'
|
import { fieldRules } from '@ztzf/utils'
|
import { saveOperationLog } from '@ztzf/apis'
|
import { useRoute } from 'vue-router'
|
|
const initForm = () => ({
|
roleName: '',
|
roleAlias: '',
|
parentId: '',
|
parentName: '',
|
sort: 0,
|
sysType: 6
|
})
|
|
const treeProps = {
|
label: 'title',
|
children: 'children',
|
value: 'id',
|
}
|
|
const emit = defineEmits(['success'])
|
const formRef = ref(null)
|
const formData = ref(initForm())
|
const visible = ref(false)
|
const dialogMode = ref('add')
|
const submitting = ref(false)
|
const dialogReadonly = computed(() => dialogMode.value === 'view')
|
const route = useRoute()
|
const dialogTitle = computed(() => {
|
if (dialogMode.value === 'edit') return '编辑'
|
if (dialogMode.value === 'view') return '查看'
|
return '新增'
|
})
|
const roleTree = ref([])
|
|
const rules = {
|
roleName: fieldRules(true, 50),
|
roleAlias: fieldRules(true, 50),
|
parentId: fieldRules(false),
|
sort: fieldRules(true),
|
}
|
|
function handleCancel() {
|
visible.value = false
|
}
|
|
async function handleSubmit() {
|
const isValid = await formRef.value?.validate().catch(() => false)
|
if (!isValid) return
|
submitting.value = true
|
try {
|
if (dialogMode.value === 'edit') {
|
await update(formData.value)
|
saveOperationLog({
|
requestUri: route.path,
|
title: `${route.name || '角色管理'}-编辑`,
|
type: 1,
|
})
|
} else {
|
await add(formData.value)
|
saveOperationLog({
|
requestUri: route.path,
|
title: `${route.name || '角色管理'}-新增`,
|
type: 1,
|
})
|
}
|
ElMessage.success(dialogMode.value === 'add' ? '新增成功' : '更新成功')
|
visible.value = false
|
emit('success')
|
} finally {
|
submitting.value = false
|
}
|
}
|
|
async function loadRoleTree(roleId) {
|
const res = await getRoleTreeById(roleId)
|
roleTree.value = res?.data?.data ?? []
|
}
|
|
function handleClosed() {
|
formData.value = initForm()
|
}
|
|
async function open({ mode, row } = {}) {
|
dialogMode.value = mode || 'add'
|
visible.value = true
|
if (dialogMode.value === 'add') {
|
formData.value = initForm()
|
await loadRoleTree()
|
return
|
}
|
formData.value = { ...row }
|
await loadRoleTree(row?.id)
|
}
|
|
defineExpose({ open })
|
</script>
|