|
|
@@ -9,15 +9,7 @@
|
|
|
>
|
|
|
<el-divider border-style="dashed" class="mt-0 mb-10">基本设置</el-divider>
|
|
|
|
|
|
- <el-form-item label="类型" prop="menuType">
|
|
|
- <el-radio-group v-model="formParams.menuType" name="menuTypeGroup">
|
|
|
- <el-radio-button :label="0">目录</el-radio-button>
|
|
|
- <el-radio-button :label="1">菜单</el-radio-button>
|
|
|
- <el-radio-button :label="2">按钮</el-radio-button>
|
|
|
- </el-radio-group>
|
|
|
- </el-form-item>
|
|
|
-
|
|
|
- <el-form-item :label="`上级${getTypeLable}`" prop="parentId">
|
|
|
+ <el-form-item label="上级菜单" prop="parentId">
|
|
|
<el-tree-select
|
|
|
rowKey="key"
|
|
|
:data="getPermissionList"
|
|
|
@@ -29,12 +21,12 @@
|
|
|
|
|
|
<el-row :gutter="24">
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item :label="`${getTypeLable}名称`" prop="menuName">
|
|
|
- <el-input :placeholder="`${getTypeLable}名称`" v-model="formParams.menuName" />
|
|
|
+ <el-form-item label="菜单名称" prop="menuName">
|
|
|
+ <el-input placeholder="菜单名称" v-model="formParams.menuName" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item :label="`${getTypeLable}图标`" prop="icon">
|
|
|
+ <el-form-item label="菜单图标" prop="icon">
|
|
|
<template #label>
|
|
|
<div class="flex items-center">
|
|
|
<el-tooltip trigger="hover">
|
|
|
@@ -42,21 +34,20 @@
|
|
|
<QuestionCircleOutlined />
|
|
|
</el-icon>
|
|
|
<template #content>
|
|
|
- {{ getTypeLable }}图标,填写图标组件名称,需在 `src\router\router-icons.ts`
|
|
|
- 中导入并映射
|
|
|
+ 菜单图标,填写图标组件名称,需在 `src\router\router-icons.ts` 中导入并映射
|
|
|
</template>
|
|
|
</el-tooltip>
|
|
|
- <span>{{ getTypeLable }}图标</span>
|
|
|
+ <span>菜单图标</span>
|
|
|
</div>
|
|
|
</template>
|
|
|
- <el-input :placeholder="`${getTypeLable}图标映射名称`" v-model="formParams.icon" />
|
|
|
+ <el-input placeholder="菜单图标映射名称" v-model="formParams.icon" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
|
|
|
<el-row :gutter="24">
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item prop="routeUrl" v-if="formParams.menuType != 2">
|
|
|
+ <el-form-item prop="routeUrl">
|
|
|
<template #label>
|
|
|
<div class="flex items-center">
|
|
|
<el-tooltip trigger="hover">
|
|
|
@@ -72,7 +63,7 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item prop="routeName" v-if="formParams.menuType != 2">
|
|
|
+ <el-form-item prop="routeName">
|
|
|
<template #label>
|
|
|
<div class="flex items-center">
|
|
|
<el-tooltip trigger="hover">
|
|
|
@@ -91,43 +82,8 @@
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
|
|
|
- <el-row :gutter="24" v-if="formParams.menuType > 0">
|
|
|
- <el-col :span="12">
|
|
|
- <el-form-item prop="permissionCode">
|
|
|
- <template #label>
|
|
|
- <div class="flex items-center">
|
|
|
- <el-tooltip trigger="hover">
|
|
|
- <el-icon :size="18" class="mr-1 text-gray-400 cursor-pointer">
|
|
|
- <QuestionCircleOutlined />
|
|
|
- </el-icon>
|
|
|
- <template #content> 权限标识,也是权限字符,比如 `system:menu:list` </template>
|
|
|
- </el-tooltip>
|
|
|
- <span>权限标识</span>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <el-input placeholder="权限标识 system:user:add" v-model="formParams.permissionCode" />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="12">
|
|
|
- <el-form-item prop="permissionName">
|
|
|
- <template #label>
|
|
|
- <div class="flex items-center">
|
|
|
- <el-tooltip trigger="hover">
|
|
|
- <el-icon :size="18" class="mr-1 text-gray-400 cursor-pointer">
|
|
|
- <QuestionCircleOutlined />
|
|
|
- </el-icon>
|
|
|
- <template #content>权限名称 对应 权限标识 `中文名称`</template>
|
|
|
- </el-tooltip>
|
|
|
- <span>权限名称</span>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <el-input placeholder="权限名称" v-model="formParams.permissionName" />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
-
|
|
|
<el-row :gutter="24">
|
|
|
- <el-col v-if="formParams.menuType != 2" :span="12">
|
|
|
+ <el-col :span="12">
|
|
|
<el-form-item prop="redirect">
|
|
|
<template #label>
|
|
|
<div class="flex items-center">
|
|
|
@@ -135,9 +91,9 @@
|
|
|
<el-icon :size="18" class="mr-1 text-gray-400 cursor-pointer">
|
|
|
<QuestionCircleOutlined />
|
|
|
</el-icon>
|
|
|
- <template #content
|
|
|
- >默认跳转路由地址,如:`/system/menu/menu` 多级路由情况下适用</template
|
|
|
- >
|
|
|
+ <template #content>
|
|
|
+ 默认跳转路由地址,如:`/system/menu/menu` 多级路由情况下适用
|
|
|
+ </template>
|
|
|
</el-tooltip>
|
|
|
<span>默认路由</span>
|
|
|
</div>
|
|
|
@@ -152,7 +108,7 @@
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
|
|
|
- <el-row :gutter="24" v-if="formParams.menuType != 2">
|
|
|
+ <el-row :gutter="24">
|
|
|
<el-col>
|
|
|
<el-form-item prop="component">
|
|
|
<template #label>
|
|
|
@@ -185,18 +141,18 @@
|
|
|
<el-icon :size="18" class="mr-1 text-gray-400 cursor-pointer">
|
|
|
<QuestionCircleOutlined />
|
|
|
</el-icon>
|
|
|
- <template #content> 选择停用则路由将不会出现在侧边栏,也不能被访问 </template>
|
|
|
+ <template #content>选择停用则路由将不会出现在侧边栏,也不能被访问</template>
|
|
|
</el-tooltip>
|
|
|
- <span>{{ getTypeLable }}状态</span>
|
|
|
+ <span>菜单状态</span>
|
|
|
</div>
|
|
|
</template>
|
|
|
- <el-radio-group v-model="formParams.status" name="statusGroup">
|
|
|
+ <el-radio-group v-model="formParams.isDisabled">
|
|
|
<el-radio-button :label="0">正常</el-radio-button>
|
|
|
<el-radio-button :label="1">停用</el-radio-button>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- <el-col :span="12" v-if="formParams.menuType != 2">
|
|
|
+ <el-col :span="12">
|
|
|
<el-form-item label="根路由" prop="isRoot">
|
|
|
<template #label>
|
|
|
<div class="flex items-center">
|
|
|
@@ -204,21 +160,19 @@
|
|
|
<el-icon :size="18" class="mr-1 text-gray-400 cursor-pointer">
|
|
|
<QuestionCircleOutlined />
|
|
|
</el-icon>
|
|
|
- <template #content
|
|
|
- >如果使用 `顶部混合菜单`,必须传 true,否则左侧会显示异常</template
|
|
|
- >
|
|
|
+ <template #content>如果使用 `顶部混合菜单`,必须传 true,否则左侧会显示异常</template>
|
|
|
</el-tooltip>
|
|
|
<span>根路由</span>
|
|
|
</div>
|
|
|
</template>
|
|
|
- <el-switch v-model="formParams.isRoot" />
|
|
|
+ <el-switch v-model="formParams.isRoot" :active-value="1" :inactive-value="0" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
|
|
|
- <el-row :gutter="24" v-if="formParams.menuType != 2">
|
|
|
+ <el-row :gutter="24">
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item prop="isVisible">
|
|
|
+ <el-form-item>
|
|
|
<template #label>
|
|
|
<div class="flex items-center">
|
|
|
<el-tooltip trigger="hover">
|
|
|
@@ -230,7 +184,7 @@
|
|
|
<span>显示状态</span>
|
|
|
</div>
|
|
|
</template>
|
|
|
- <el-radio-group v-model="formParams.isVisible" name="isVisibleGroup">
|
|
|
+ <el-radio-group v-model="formParams.isHidden">
|
|
|
<el-radio-button :label="0">显示</el-radio-button>
|
|
|
<el-radio-button :label="1">隐藏</el-radio-button>
|
|
|
</el-radio-group>
|
|
|
@@ -252,14 +206,14 @@
|
|
|
</div>
|
|
|
</template>
|
|
|
<el-radio-group v-model="formParams.isCache" name="isCacheGroup">
|
|
|
- <el-radio-button :label="0">缓存</el-radio-button>
|
|
|
- <el-radio-button :label="1">不缓存</el-radio-button>
|
|
|
+ <el-radio-button :label="0">不缓存</el-radio-button>
|
|
|
+ <el-radio-button :label="1">缓存</el-radio-button>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
|
|
|
- <el-row :gutter="24" v-if="formParams.menuType != 2">
|
|
|
+ <el-row :gutter="24">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="是否外链" prop="isFrame">
|
|
|
<template #label>
|
|
|
@@ -273,9 +227,9 @@
|
|
|
<span>是否外链</span>
|
|
|
</div>
|
|
|
</template>
|
|
|
- <el-radio-group v-model="formParams.isFrame" name="isFrameGroup">
|
|
|
- <el-radio-button :label="0">是</el-radio-button>
|
|
|
- <el-radio-button :label="1">否</el-radio-button>
|
|
|
+ <el-radio-group v-model="formParams.isFrame">
|
|
|
+ <el-radio-button :label="0">否</el-radio-button>
|
|
|
+ <el-radio-button :label="1">是</el-radio-button>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
@@ -295,17 +249,13 @@
|
|
|
<span>简化路由</span>
|
|
|
</div>
|
|
|
</template>
|
|
|
- <el-switch v-model="formParams.alwaysShow" />
|
|
|
+ <el-switch v-model="formParams.isAlwaysShow" :active-value="1" :inactive-value="0" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
- <el-row :gutter="24" v-if="formParams.menuType != 2">
|
|
|
+ <el-row :gutter="24">
|
|
|
<el-col>
|
|
|
- <el-form-item
|
|
|
- label="外部地址"
|
|
|
- prop="frameSrc"
|
|
|
- v-if="formParams.menuType != 2 && formParams.isFrame === 0"
|
|
|
- >
|
|
|
+ <el-form-item label="外部地址" prop="frameSrc" v-if="formParams.isFrame === 1">
|
|
|
<el-input placeholder="内联外部地址" v-model="formParams.frameSrc" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
@@ -319,11 +269,12 @@
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
import { ref, computed } from 'vue';
|
|
|
- import { ElMessage } from 'element-plus';
|
|
|
+ import { ElMessage, FormInstance } from 'element-plus';
|
|
|
import { addMenu, editMenu } from '@/api/system/menu';
|
|
|
import { QuestionCircleOutlined } from '@vicons/antd';
|
|
|
import { replaceParams } from '@/utils/helper/treeHelper';
|
|
|
import { cloneDeep } from 'lodash-es';
|
|
|
+ import { MenuDetail } from '@/types/menu/type';
|
|
|
|
|
|
const emit = defineEmits(['change']);
|
|
|
|
|
|
@@ -338,36 +289,34 @@
|
|
|
},
|
|
|
});
|
|
|
|
|
|
- const message = ElMessage;
|
|
|
- const formRef: any = ref(null);
|
|
|
+ const formRef = ref<FormInstance>();
|
|
|
const subLoading = ref(false);
|
|
|
|
|
|
- const defaultValueRef = () => ({
|
|
|
+ const defaultFormParams: MenuDetail = {
|
|
|
id: null,
|
|
|
parentId: null,
|
|
|
- activeMenu: '',
|
|
|
- affix: false,
|
|
|
- alwaysShow: false,
|
|
|
- icon: '',
|
|
|
- isRoot: 1,
|
|
|
- isCache: 1,
|
|
|
- isFrame: 1,
|
|
|
- isVisible: 0,
|
|
|
menuName: '',
|
|
|
- menuType: 0,
|
|
|
- openType: 1,
|
|
|
- status: 0,
|
|
|
- orderNum: null,
|
|
|
- permissionCode: '',
|
|
|
- permissionName: '',
|
|
|
- query: '',
|
|
|
- routeUrl: '',
|
|
|
+ menuCode: '',
|
|
|
routeName: '',
|
|
|
+ routeUrl: '',
|
|
|
+ component: '',
|
|
|
redirect: '',
|
|
|
- component: '', //目录默认 LAYOUT 多级菜单目录 设置 ParentLayout
|
|
|
- });
|
|
|
+ orderNum: null,
|
|
|
+ icon: '',
|
|
|
+ isHidden: 0,
|
|
|
+ isDisabled: 0,
|
|
|
+ isAlwaysShow: 0,
|
|
|
+ isRoot: 0,
|
|
|
+ isAffix: 0,
|
|
|
+ isCache: 0,
|
|
|
+ isFrame: 0,
|
|
|
+ frameSrc: '',
|
|
|
+ openType: 1,
|
|
|
+ query: '',
|
|
|
+ children: []
|
|
|
+ };
|
|
|
|
|
|
- const formParams: any = ref(defaultValueRef());
|
|
|
+ const formParams = ref({ ...defaultFormParams });
|
|
|
|
|
|
const getPermissionList = computed(() => {
|
|
|
// 可根据需要是否需要嵌套这个 避免出现选择器出现 0 的情况
|
|
|
@@ -380,15 +329,10 @@
|
|
|
];
|
|
|
});
|
|
|
|
|
|
- const getTypeLable = computed(() => {
|
|
|
- const typsStr = ['目录', '菜单', '按钮'];
|
|
|
- return typsStr[formParams.value.menuType];
|
|
|
- });
|
|
|
-
|
|
|
const rules = {
|
|
|
menuName: {
|
|
|
required: true,
|
|
|
- message: `${getTypeLable.value}名称`,
|
|
|
+ message: '菜单名称',
|
|
|
trigger: 'blur',
|
|
|
},
|
|
|
routeUrl: {
|
|
|
@@ -413,20 +357,20 @@
|
|
|
},
|
|
|
};
|
|
|
|
|
|
- function setData(data) {
|
|
|
+ function setData(data: MenuDetail) {
|
|
|
formParams.value = data;
|
|
|
formRef.value?.resetFields();
|
|
|
}
|
|
|
|
|
|
function formSubmit() {
|
|
|
subLoading.value = true;
|
|
|
- formRef.value.validate((valid) => {
|
|
|
+ formRef.value?.validate((valid) => {
|
|
|
if (valid) {
|
|
|
if (!formParams.value.id) {
|
|
|
addMenu(formParams.value)
|
|
|
.then(() => {
|
|
|
subLoading.value = false;
|
|
|
- message.success('添加成功');
|
|
|
+ ElMessage.success('添加成功');
|
|
|
handleReset();
|
|
|
emit('change');
|
|
|
})
|
|
|
@@ -437,7 +381,7 @@
|
|
|
editMenu(formParams.value)
|
|
|
.then(() => {
|
|
|
subLoading.value = false;
|
|
|
- message.success('修改成功');
|
|
|
+ ElMessage.success('修改成功');
|
|
|
handleReset();
|
|
|
emit('change');
|
|
|
})
|
|
|
@@ -447,14 +391,14 @@
|
|
|
}
|
|
|
} else {
|
|
|
subLoading.value = false;
|
|
|
- message.error('请填写完整信息');
|
|
|
+ ElMessage.error('请填写完整信息');
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
function handleReset() {
|
|
|
- formRef.value.resetFields();
|
|
|
- formParams.value = Object.assign(formParams.value, defaultValueRef());
|
|
|
+ formRef.value?.resetFields();
|
|
|
+ formParams.value = Object.assign(formParams.value, defaultFormParams);
|
|
|
}
|
|
|
|
|
|
defineExpose({
|