2022-04-15 11:16:14 +00:00
|
|
|
|
<template>
|
|
|
|
|
|
<div class="menu-edit">
|
|
|
|
|
|
<el-card shadow="never">
|
|
|
|
|
|
<el-page-header :content="id ? '编辑菜单' : '新增菜单'" @back="$router.back()" />
|
2022-04-22 07:55:56 +00:00
|
|
|
|
|
2022-04-22 08:30:21 +00:00
|
|
|
|
<select-icon class="m-t-20 text-center"></select-icon>
|
2022-04-15 11:16:14 +00:00
|
|
|
|
</el-card>
|
|
|
|
|
|
|
|
|
|
|
|
<el-card class="m-t-15" shadow="never">
|
|
|
|
|
|
<div class="m-t-15">
|
|
|
|
|
|
<el-form
|
2022-04-18 06:42:34 +00:00
|
|
|
|
ref="formRefs"
|
2022-04-15 11:16:14 +00:00
|
|
|
|
:model="formData"
|
|
|
|
|
|
label-width="120px"
|
|
|
|
|
|
size="small"
|
|
|
|
|
|
style="max-width: 460px"
|
|
|
|
|
|
>
|
2022-04-19 03:02:05 +00:00
|
|
|
|
<el-form-item label="菜单类型">
|
|
|
|
|
|
<el-radio-group v-model="formData.menuType">
|
2022-04-15 11:16:14 +00:00
|
|
|
|
<el-radio
|
|
|
|
|
|
:label="menuDataType.CATALOG"
|
|
|
|
|
|
@change="changeType(menuDataType.CATALOG)"
|
|
|
|
|
|
>
|
|
|
|
|
|
目录
|
|
|
|
|
|
</el-radio>
|
|
|
|
|
|
<el-radio
|
|
|
|
|
|
:label="menuDataType.MENU"
|
|
|
|
|
|
@change="changeType(menuDataType.MENU)"
|
|
|
|
|
|
>
|
|
|
|
|
|
菜单
|
|
|
|
|
|
</el-radio>
|
|
|
|
|
|
<el-radio
|
|
|
|
|
|
:label="menuDataType.BUTTON"
|
|
|
|
|
|
@change="changeType(menuDataType.BUTTON)"
|
|
|
|
|
|
>
|
|
|
|
|
|
按钮
|
|
|
|
|
|
</el-radio>
|
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
|
|
|
|
<el-form-item label="父级菜单">
|
|
|
|
|
|
<el-cascader
|
2022-04-19 03:02:05 +00:00
|
|
|
|
v-model="formData.pid"
|
2022-04-15 11:16:14 +00:00
|
|
|
|
style="width: 340px"
|
|
|
|
|
|
:options="menuList"
|
|
|
|
|
|
:props="{
|
|
|
|
|
|
checkStrictly: true,
|
|
|
|
|
|
emitPath: false,
|
2022-04-19 03:02:05 +00:00
|
|
|
|
label: 'menuName',
|
2022-04-15 11:16:14 +00:00
|
|
|
|
value: 'id'
|
|
|
|
|
|
}"
|
|
|
|
|
|
clearable
|
|
|
|
|
|
></el-cascader>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
2022-04-19 03:02:05 +00:00
|
|
|
|
<div v-if="(formData.menuType == menuDataType.BUTTON) == ''">
|
2022-04-22 11:09:08 +00:00
|
|
|
|
<!-- <el-form-item label="请选择图标">
|
2022-04-19 03:02:05 +00:00
|
|
|
|
<el-input
|
|
|
|
|
|
v-model="formData.menuIcon"
|
|
|
|
|
|
show-word-limit
|
|
|
|
|
|
placeholder="请输入图标"
|
|
|
|
|
|
></el-input>
|
2022-04-22 11:09:08 +00:00
|
|
|
|
</el-form-item> -->
|
|
|
|
|
|
|
|
|
|
|
|
<el-form-item label="请选择图标">
|
2022-04-24 10:52:27 +00:00
|
|
|
|
<div class="flex">
|
|
|
|
|
|
<!-- <el-input readonly>
|
|
|
|
|
|
<template #prefix>
|
|
|
|
|
|
<el-icon class="el-input__icon">
|
|
|
|
|
|
<search class="f-s-20" />
|
|
|
|
|
|
</el-icon>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
</el-input> -->
|
|
|
|
|
|
|
|
|
|
|
|
<select-icon></select-icon>
|
|
|
|
|
|
</div>
|
2022-04-18 06:42:34 +00:00
|
|
|
|
</el-form-item>
|
|
|
|
|
|
</div>
|
2022-04-15 11:16:14 +00:00
|
|
|
|
|
|
|
|
|
|
<el-form-item label="菜单名称">
|
2022-04-19 03:02:05 +00:00
|
|
|
|
<el-input
|
|
|
|
|
|
v-model="formData.menuName"
|
|
|
|
|
|
show-word-limit
|
|
|
|
|
|
placeholder="请输入名称"
|
|
|
|
|
|
></el-input>
|
2022-04-15 11:16:14 +00:00
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
2022-04-19 03:02:05 +00:00
|
|
|
|
<div v-if="formData.menuType == menuDataType.BUTTON">
|
|
|
|
|
|
<el-form-item label="菜单权限字符">
|
|
|
|
|
|
<el-input
|
|
|
|
|
|
v-model="formData.perms"
|
|
|
|
|
|
show-word-limit
|
|
|
|
|
|
placeholder="请输入"
|
|
|
|
|
|
></el-input>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div v-if="(formData.menuType == menuDataType.BUTTON) == ''">
|
2022-04-18 06:42:34 +00:00
|
|
|
|
<el-form-item label="路由地址">
|
2022-04-19 03:02:05 +00:00
|
|
|
|
<el-input
|
|
|
|
|
|
v-model="formData.paths"
|
|
|
|
|
|
show-word-limit
|
|
|
|
|
|
placeholder="请输入"
|
|
|
|
|
|
></el-input>
|
2022-04-15 11:16:14 +00:00
|
|
|
|
</el-form-item>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
2022-04-19 03:02:05 +00:00
|
|
|
|
<div v-if="formData.menuType == menuDataType.MENU">
|
2022-04-18 06:42:34 +00:00
|
|
|
|
<el-form-item label="组件路径">
|
2022-04-19 03:02:05 +00:00
|
|
|
|
<el-input
|
|
|
|
|
|
v-model="formData.component"
|
|
|
|
|
|
show-word-limit
|
|
|
|
|
|
placeholder="请输入"
|
|
|
|
|
|
></el-input>
|
2022-04-18 06:42:34 +00:00
|
|
|
|
</el-form-item>
|
2022-04-19 03:02:05 +00:00
|
|
|
|
|
|
|
|
|
|
<el-form-item label="菜单权限字符">
|
|
|
|
|
|
<el-input
|
|
|
|
|
|
v-model="formData.perms"
|
|
|
|
|
|
show-word-limit
|
|
|
|
|
|
placeholder="请输入"
|
|
|
|
|
|
></el-input>
|
2022-04-15 11:16:14 +00:00
|
|
|
|
</el-form-item>
|
2022-04-19 03:02:05 +00:00
|
|
|
|
|
2022-04-18 06:42:34 +00:00
|
|
|
|
<el-form-item label="路由参数">
|
2022-04-19 03:02:05 +00:00
|
|
|
|
<el-input
|
|
|
|
|
|
v-model="formData.params"
|
|
|
|
|
|
show-word-limit
|
|
|
|
|
|
placeholder="请输入"
|
|
|
|
|
|
></el-input>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
|
|
|
|
<el-form-item label="选中菜单">
|
|
|
|
|
|
<el-input
|
|
|
|
|
|
v-model="formData.selected"
|
|
|
|
|
|
show-word-limit
|
|
|
|
|
|
placeholder="请输入选中菜单路径"
|
|
|
|
|
|
></el-input>
|
2022-04-15 11:16:14 +00:00
|
|
|
|
</el-form-item>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
2022-04-19 03:02:05 +00:00
|
|
|
|
<el-form-item label="菜单排序">
|
|
|
|
|
|
<el-input
|
|
|
|
|
|
v-model="formData.menuSort"
|
|
|
|
|
|
show-word-limit
|
|
|
|
|
|
type="number"
|
|
|
|
|
|
placeholder="请输入排序"
|
|
|
|
|
|
></el-input>
|
|
|
|
|
|
</el-form-item>
|
2022-04-18 06:42:34 +00:00
|
|
|
|
|
2022-04-19 03:02:05 +00:00
|
|
|
|
<div v-if="formData.menuType == menuDataType.MENU">
|
|
|
|
|
|
<el-form-item label="是否缓存">
|
|
|
|
|
|
<el-radio-group v-model="formData.isCache">
|
|
|
|
|
|
<el-radio :label="1">缓存</el-radio>
|
|
|
|
|
|
<el-radio :label="0">不缓存</el-radio>
|
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div v-if="(formData.menuType == menuDataType.BUTTON) == ''">
|
|
|
|
|
|
<el-form-item label="显示状态">
|
|
|
|
|
|
<el-radio-group v-model="formData.isShow">
|
|
|
|
|
|
<el-radio :label="1">显示</el-radio>
|
|
|
|
|
|
<el-radio :label="0">隐藏</el-radio>
|
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
|
|
|
|
<el-form-item label="菜单状态">
|
|
|
|
|
|
<el-radio-group v-model="formData.isDisable">
|
|
|
|
|
|
<el-radio :label="0">正常</el-radio>
|
|
|
|
|
|
<el-radio :label="1">停用</el-radio>
|
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
</div>
|
2022-04-15 11:16:14 +00:00
|
|
|
|
</el-form>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</el-card>
|
2022-04-18 06:42:34 +00:00
|
|
|
|
<footer-btns>
|
|
|
|
|
|
<el-button type="primary" size="small" @click="onSubmit">保存</el-button>
|
|
|
|
|
|
</footer-btns>
|
2022-04-15 11:16:14 +00:00
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
|
|
|
import { useAdmin } from '@/core/hooks/app'
|
|
|
|
|
|
import { onMounted, reactive, ref } from 'vue'
|
2022-04-18 06:42:34 +00:00
|
|
|
|
import FooterBtns from '@/components/footer-btns/index.vue'
|
|
|
|
|
|
import type { ElForm, ElMessage } from 'element-plus'
|
2022-04-15 11:16:14 +00:00
|
|
|
|
import { apiConfigGetMenu, apiMenuDetail, apiMenuAdd, apiMenuEdit, apiMenuDelete } from '@/api/auth'
|
2022-04-22 07:55:56 +00:00
|
|
|
|
import SelectIcon from './select-icon/index.vue'
|
2022-04-15 11:16:14 +00:00
|
|
|
|
|
|
|
|
|
|
const menuDataType = {
|
|
|
|
|
|
CATALOG: 'M', // 目录
|
|
|
|
|
|
MENU: 'C', // 菜单
|
|
|
|
|
|
BUTTON: 'A' // 按钮
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const { router, route } = useAdmin()
|
|
|
|
|
|
const id: any = route.query.id
|
|
|
|
|
|
|
2022-04-18 06:42:34 +00:00
|
|
|
|
const formRefs = ref<InstanceType<typeof ElForm>>()
|
2022-04-15 11:16:14 +00:00
|
|
|
|
|
|
|
|
|
|
// 父级菜单选择
|
|
|
|
|
|
const menuList = ref<any>([])
|
2022-04-18 06:42:34 +00:00
|
|
|
|
|
|
|
|
|
|
// 表单数据
|
|
|
|
|
|
const formData = ref({
|
|
|
|
|
|
pid: '', // 上级ID
|
2022-04-19 03:02:05 +00:00
|
|
|
|
menuType: 'M', // 菜单类型
|
2022-04-18 06:42:34 +00:00
|
|
|
|
menuName: '', // 菜单名称
|
|
|
|
|
|
menuIcon: '', // 菜单图标
|
|
|
|
|
|
menuSort: '', // 菜单排序
|
|
|
|
|
|
perms: '', // 菜单权限字符
|
|
|
|
|
|
paths: '', // 路由路径
|
|
|
|
|
|
component: '', // 前端组件
|
2022-04-19 03:02:05 +00:00
|
|
|
|
selected: '', // 选中路径
|
|
|
|
|
|
params: '', // 路由参数
|
|
|
|
|
|
isShow: 1, // 是否显示:0=否, 1=是
|
|
|
|
|
|
isCache: 0, // 是否缓存:0=否, 1=是
|
|
|
|
|
|
isDisable: 0 // 是否禁用: 0=否, 1=是
|
2022-04-18 06:42:34 +00:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
// 获取详情
|
|
|
|
|
|
const getMenuDetail = async (id: number) => {
|
2022-04-22 07:55:56 +00:00
|
|
|
|
;(formData.value as {}) = await apiMenuDetail({ id })
|
2022-04-18 06:42:34 +00:00
|
|
|
|
getFatherMenu()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取父级菜单选择
|
|
|
|
|
|
const getFatherMenu = async () => {
|
|
|
|
|
|
const menus = (await apiConfigGetMenu()) || []
|
|
|
|
|
|
menuList.value = [{ id: 0, menuName: '顶级' }, ...menus]
|
|
|
|
|
|
console.log(menuList.value, '---------------menuaList.value')
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 添加菜单
|
|
|
|
|
|
const handleMenuAdd = async () => {
|
|
|
|
|
|
await apiMenuAdd({ ...formData.value })
|
|
|
|
|
|
router.back()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 编辑菜单
|
|
|
|
|
|
const handleMenuEdit = async () => {
|
|
|
|
|
|
await apiMenuEdit({ ...formData.value })
|
|
|
|
|
|
router.back()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 保存
|
|
|
|
|
|
const onSubmit = () => {
|
|
|
|
|
|
formRefs.value?.validate()?.then(valid => {
|
|
|
|
|
|
if (!valid) {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!id) handleMenuAdd()
|
|
|
|
|
|
else handleMenuEdit()
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 切换
|
2022-04-19 03:02:05 +00:00
|
|
|
|
const changeType = (val: string) => {
|
|
|
|
|
|
menuDataType.value = val
|
|
|
|
|
|
}
|
2022-04-18 06:42:34 +00:00
|
|
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
|
if (id) getMenuDetail(id)
|
|
|
|
|
|
getFatherMenu()
|
|
|
|
|
|
})
|
2022-04-15 11:16:14 +00:00
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style lang="scss" scoped></style>
|