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

272 lines
9.9 KiB
Vue
Raw Normal View History

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>