2022-04-08 02:42:44 +00:00
|
|
|
|
<template>
|
|
|
|
|
|
<div class="role-edit">
|
|
|
|
|
|
<el-card shadow="never">
|
|
|
|
|
|
<el-page-header :content="id ? '编辑角色' : '新增角色'" @back="$router.back()" />
|
|
|
|
|
|
</el-card>
|
|
|
|
|
|
|
|
|
|
|
|
<el-card shadow="never" class="m-t-15">
|
|
|
|
|
|
<el-form
|
|
|
|
|
|
ref="formRef"
|
|
|
|
|
|
:rules="rules"
|
|
|
|
|
|
class="ls-form"
|
|
|
|
|
|
:model="formData"
|
|
|
|
|
|
label-width="150px"
|
|
|
|
|
|
size="small"
|
|
|
|
|
|
>
|
|
|
|
|
|
<!-- 名称 -->
|
|
|
|
|
|
<el-form-item label="名称" prop="name">
|
|
|
|
|
|
<el-input v-model="formData.name" placeholder="请输入名称"></el-input>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
<!-- 备注 -->
|
2022-04-13 09:38:53 +00:00
|
|
|
|
<el-form-item label="备注" prop="remark">
|
2022-04-08 02:42:44 +00:00
|
|
|
|
<el-input
|
2022-04-13 09:38:53 +00:00
|
|
|
|
v-model="formData.remark"
|
2022-04-08 02:42:44 +00:00
|
|
|
|
placeholder="请输入备注"
|
|
|
|
|
|
type="textarea"
|
|
|
|
|
|
:autosize="{ minRows: 4, maxRows: 6 }"
|
|
|
|
|
|
></el-input>
|
|
|
|
|
|
</el-form-item>
|
2022-04-15 07:32:37 +00:00
|
|
|
|
<!-- 排序 -->
|
2022-04-29 03:26:26 +00:00
|
|
|
|
<el-form-item label="排序" prop="sort">
|
2022-04-15 07:32:37 +00:00
|
|
|
|
<el-input v-model="formData.sort" placeholder="请输入" type="number"></el-input>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item label="状态">
|
|
|
|
|
|
<el-switch v-model="formData.isDisable" :active-value="0" :inactive-value="1" />
|
|
|
|
|
|
</el-form-item>
|
2022-04-08 02:42:44 +00:00
|
|
|
|
<!-- 权限 -->
|
|
|
|
|
|
<el-form-item label="权限" prop="auth_keys">
|
|
|
|
|
|
<div class="flex" style="margin-top: 3px">
|
|
|
|
|
|
<el-button type="text" size="mini" @click="allSelect()"> 全选 </el-button>
|
|
|
|
|
|
<el-button type="text" size="mini" @click="close()"> 全不选 </el-button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<el-tree
|
|
|
|
|
|
ref="treeRef"
|
|
|
|
|
|
:data="menu.permissionsTree"
|
2022-04-19 10:26:55 +00:00
|
|
|
|
node-key="id"
|
2022-04-08 02:42:44 +00:00
|
|
|
|
default-expand-all
|
|
|
|
|
|
icon="ArrowRight"
|
|
|
|
|
|
:props="{
|
2022-04-15 07:32:37 +00:00
|
|
|
|
children: 'children',
|
2022-08-01 03:59:09 +00:00
|
|
|
|
label: 'menuName',
|
2022-04-08 02:42:44 +00:00
|
|
|
|
}"
|
|
|
|
|
|
empty-text=""
|
|
|
|
|
|
show-checkbox
|
|
|
|
|
|
@check-change="handlePermissionsCheckChange"
|
|
|
|
|
|
/>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
</el-form>
|
|
|
|
|
|
</el-card>
|
|
|
|
|
|
|
|
|
|
|
|
<footer-btns>
|
|
|
|
|
|
<el-button type="primary" size="small" @click="onSubmit">保存</el-button>
|
|
|
|
|
|
</footer-btns>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script lang="ts">
|
2022-08-01 03:59:09 +00:00
|
|
|
|
import { defineComponent, reactive, onMounted, Ref, ref, toRefs } from 'vue'
|
|
|
|
|
|
import { apiConfigGetMenu, apiConfigGetAuth, apiRoleAdd, apiRoleEdit, apiRoleDetail } from '@/api/auth'
|
|
|
|
|
|
import { ElInput, ElForm } from 'element-plus'
|
|
|
|
|
|
import FooterBtns from '@/components/footer-btns/index.vue'
|
|
|
|
|
|
import { useAdmin } from '@/core/hooks/app'
|
|
|
|
|
|
import { flatten } from '@/utils/util'
|
|
|
|
|
|
import { ElMessage } from 'element-plus'
|
2022-04-24 10:52:27 +00:00
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
export default defineComponent({
|
|
|
|
|
|
components: {
|
|
|
|
|
|
FooterBtns,
|
|
|
|
|
|
},
|
|
|
|
|
|
setup() {
|
|
|
|
|
|
const { route, router } = useAdmin()
|
|
|
|
|
|
const formRef: Ref<typeof ElForm | null> = ref(null)
|
|
|
|
|
|
const treeRef: Ref<typeof ElForm | null> = ref(null)
|
|
|
|
|
|
const id: Ref<Number | null> = ref(null) // 当前编辑角色ID
|
2022-04-08 02:42:44 +00:00
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
// 表单数据
|
|
|
|
|
|
const { formData, menu } = toRefs(
|
|
|
|
|
|
reactive({
|
|
|
|
|
|
formData: {
|
|
|
|
|
|
name: '', // 角色名称
|
|
|
|
|
|
remark: '', // 备注
|
|
|
|
|
|
menus: [], // 权限,就选中的菜单id
|
|
|
|
|
|
isDisable: 0,
|
|
|
|
|
|
sort: '',
|
|
|
|
|
|
menuIds: '', // 菜单ID数组,逗号隔开
|
|
|
|
|
|
},
|
2022-04-08 02:42:44 +00:00
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
menu: {
|
|
|
|
|
|
permissionsTree: [], // 菜单
|
|
|
|
|
|
allAuthKeys: [], // 菜单全部的id
|
|
|
|
|
|
},
|
|
|
|
|
|
})
|
|
|
|
|
|
)
|
2022-04-08 02:42:44 +00:00
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
// 表单验证
|
|
|
|
|
|
const rules = {
|
|
|
|
|
|
name: [
|
|
|
|
|
|
{
|
|
|
|
|
|
required: true,
|
|
|
|
|
|
message: '请输入角色名称',
|
|
|
|
|
|
trigger: ['blur'],
|
|
|
|
|
|
pattern: /(^[^\s]*$)/, // 不能输入空格
|
|
|
|
|
|
},
|
|
|
|
|
|
],
|
|
|
|
|
|
sort: [
|
|
|
|
|
|
{
|
|
|
|
|
|
required: true,
|
|
|
|
|
|
message: '请输入排序',
|
|
|
|
|
|
trigger: 'blur',
|
|
|
|
|
|
pattern: /(^[0-9]\d*$)/,
|
|
|
|
|
|
},
|
|
|
|
|
|
],
|
|
|
|
|
|
}
|
2022-04-08 02:42:44 +00:00
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
// 确定提交
|
|
|
|
|
|
const onSubmit = () => {
|
|
|
|
|
|
formRef.value?.validate((valid: boolean) => {
|
|
|
|
|
|
if (!valid) {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
2022-04-08 02:42:44 +00:00
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
id.value ? roleEdit() : roleAdd()
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
2022-04-08 02:42:44 +00:00
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
const getMenu = () => {
|
|
|
|
|
|
apiConfigGetMenu()
|
|
|
|
|
|
.then((res: any) => {
|
|
|
|
|
|
// 获取菜单
|
|
|
|
|
|
menu.value.permissionsTree = res
|
|
|
|
|
|
console.log('res', res)
|
2022-04-08 02:42:44 +00:00
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
// 数组扁平化
|
|
|
|
|
|
const menuFlatten = flatten(res, [], 'children')
|
|
|
|
|
|
// console.log(menuFlatten)
|
|
|
|
|
|
// 获取菜单全部 id
|
|
|
|
|
|
menu.value.allAuthKeys = menuFlatten.map((item: any) => item.id) as never
|
|
|
|
|
|
})
|
|
|
|
|
|
.catch((err: any) => {
|
|
|
|
|
|
console.log('err', err)
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
2022-04-08 02:42:44 +00:00
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
// 添加角色
|
|
|
|
|
|
const roleAdd = () => {
|
|
|
|
|
|
// 选择中的权限id字符串
|
|
|
|
|
|
formData.value.menus.length == 0
|
|
|
|
|
|
? (formData.value.menuIds = '')
|
|
|
|
|
|
: (formData.value.menuIds = formData.value.menus.join(','))
|
2022-04-24 10:52:27 +00:00
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
apiRoleAdd({ ...formData.value })
|
|
|
|
|
|
.then((res: any) => {
|
|
|
|
|
|
console.log('res', res)
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
router.back()
|
|
|
|
|
|
}, 500)
|
|
|
|
|
|
ElMessage({ type: 'success', message: '保存成功' })
|
|
|
|
|
|
})
|
|
|
|
|
|
.catch((err: any) => {
|
|
|
|
|
|
console.log('err', err)
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
// 编辑角色
|
|
|
|
|
|
const roleEdit = () => {
|
|
|
|
|
|
// 选择中的权限id字符串
|
|
|
|
|
|
formData.value.menus.length == 0
|
|
|
|
|
|
? (formData.value.menuIds = '')
|
|
|
|
|
|
: (formData.value.menuIds = formData.value.menus.join(','))
|
|
|
|
|
|
|
|
|
|
|
|
apiRoleEdit({
|
|
|
|
|
|
...formData.value,
|
|
|
|
|
|
id: id.value,
|
2022-04-08 02:42:44 +00:00
|
|
|
|
})
|
2022-08-01 03:59:09 +00:00
|
|
|
|
.then((res: any) => {
|
|
|
|
|
|
console.log('res', res)
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
router.back()
|
|
|
|
|
|
}, 500)
|
|
|
|
|
|
ElMessage({ type: 'success', message: '保存成功' })
|
|
|
|
|
|
})
|
|
|
|
|
|
.catch((err: any) => {
|
|
|
|
|
|
console.log('err', err)
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 角色详情
|
|
|
|
|
|
const roleDetail = () => {
|
|
|
|
|
|
apiRoleDetail({
|
|
|
|
|
|
id: id.value,
|
2022-04-08 02:42:44 +00:00
|
|
|
|
})
|
2022-08-01 03:59:09 +00:00
|
|
|
|
.then((res: any) => {
|
|
|
|
|
|
console.log('res', res)
|
2022-04-08 02:42:44 +00:00
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
formData.value = res
|
2022-04-08 02:42:44 +00:00
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
treeRef.value?.setCheckedKeys(res.menus)
|
|
|
|
|
|
})
|
|
|
|
|
|
.catch((err: any) => {
|
|
|
|
|
|
console.log('err', err)
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
2022-04-08 02:42:44 +00:00
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
// 权限树触发函数
|
|
|
|
|
|
const handlePermissionsCheckChange = (data: any, checked: boolean) => {
|
|
|
|
|
|
console.log(data)
|
|
|
|
|
|
if (!data.id) {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
const index = formData.value.menus.findIndex((item) => item == data.id)
|
|
|
|
|
|
if (checked) {
|
|
|
|
|
|
index == -1 && (formData.value.menus as any).push(data.id)
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
2022-04-08 02:42:44 +00:00
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
if (index != -1) {
|
|
|
|
|
|
formData.value.menus.splice(index, 1)
|
|
|
|
|
|
}
|
2022-04-08 02:42:44 +00:00
|
|
|
|
}
|
2022-08-01 03:59:09 +00:00
|
|
|
|
|
|
|
|
|
|
// 全选
|
|
|
|
|
|
const allSelect = () => {
|
|
|
|
|
|
treeRef.value?.setCheckedKeys(menu.value.allAuthKeys)
|
2022-04-08 02:42:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
// 全不选
|
|
|
|
|
|
const close = () => {
|
|
|
|
|
|
treeRef.value?.setCheckedKeys([])
|
2022-04-08 02:42:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
onMounted(() => {
|
|
|
|
|
|
const query: any = route.query
|
|
|
|
|
|
if (query.id) {
|
|
|
|
|
|
id.value = query.id * 1
|
|
|
|
|
|
roleDetail()
|
|
|
|
|
|
}
|
2022-04-08 02:42:44 +00:00
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
getMenu()
|
|
|
|
|
|
})
|
2022-04-08 02:42:44 +00:00
|
|
|
|
|
2022-08-01 03:59:09 +00:00
|
|
|
|
return {
|
|
|
|
|
|
id,
|
|
|
|
|
|
formData,
|
|
|
|
|
|
menu,
|
|
|
|
|
|
formRef,
|
|
|
|
|
|
treeRef,
|
|
|
|
|
|
rules,
|
|
|
|
|
|
getMenu,
|
|
|
|
|
|
roleAdd,
|
|
|
|
|
|
roleEdit,
|
|
|
|
|
|
roleDetail,
|
|
|
|
|
|
onSubmit,
|
|
|
|
|
|
handlePermissionsCheckChange,
|
|
|
|
|
|
close,
|
|
|
|
|
|
allSelect,
|
2022-04-08 02:42:44 +00:00
|
|
|
|
}
|
2022-08-01 03:59:09 +00:00
|
|
|
|
},
|
|
|
|
|
|
})
|
2022-04-08 02:42:44 +00:00
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
2022-08-01 03:59:09 +00:00
|
|
|
|
.role-edit {
|
|
|
|
|
|
:deep .el-textarea {
|
|
|
|
|
|
width: 340px;
|
|
|
|
|
|
}
|
2022-04-08 02:42:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
</style>
|