edu/admin/src/views/permission/role/edit.vue

277 lines
9.4 KiB
Vue
Raw Normal View History

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>