|
@@ -1,46 +1,64 @@
|
|
|
<template>
|
|
<template>
|
|
|
<div>
|
|
<div>
|
|
|
<PlusPage
|
|
<PlusPage
|
|
|
- ref="plusPageInstance"
|
|
|
|
|
- :columns="tableConfig"
|
|
|
|
|
- :request="getList"
|
|
|
|
|
- :before-search-submit="handleBeforeSearch"
|
|
|
|
|
- :is-card="true"
|
|
|
|
|
- :search="{
|
|
|
|
|
- labelWidth: 100,
|
|
|
|
|
- showNumber: 3
|
|
|
|
|
- }"
|
|
|
|
|
- :table="{
|
|
|
|
|
- actionBar: { buttons, type: 'link', width: 140 },
|
|
|
|
|
- adaptive: { offsetBottom: 50 },
|
|
|
|
|
- treeProps: { children: 'children' },
|
|
|
|
|
- rowKey: 'menuId'
|
|
|
|
|
- }"
|
|
|
|
|
- :pagination="false"
|
|
|
|
|
|
|
+ ref="plusPageInstance"
|
|
|
|
|
+ :columns="tableConfig"
|
|
|
|
|
+ :request="getList"
|
|
|
|
|
+ :before-search-submit="handleBeforeSearch"
|
|
|
|
|
+ :is-card="true"
|
|
|
|
|
+ :search="{
|
|
|
|
|
+ labelWidth: 100,
|
|
|
|
|
+ showNumber: 3
|
|
|
|
|
+ }"
|
|
|
|
|
+ :table="{
|
|
|
|
|
+ actionBar: { buttons, type: 'link', width: 140 },
|
|
|
|
|
+ adaptive: { offsetBottom: 50 },
|
|
|
|
|
+ treeProps: { children: 'children' },
|
|
|
|
|
+ rowKey: 'menuId'
|
|
|
|
|
+ }"
|
|
|
|
|
+ :pagination="false"
|
|
|
>
|
|
>
|
|
|
<template #table-title>
|
|
<template #table-title>
|
|
|
<el-row class="button-row">
|
|
<el-row class="button-row">
|
|
|
- <el-button size="default" type="success" @click="handleCreate">新增</el-button>
|
|
|
|
|
|
|
+ <el-button size="default" type="success" @click="handleCreate"
|
|
|
|
|
+ >新增</el-button
|
|
|
|
|
+ >
|
|
|
</el-row>
|
|
</el-row>
|
|
|
</template>
|
|
</template>
|
|
|
</PlusPage>
|
|
</PlusPage>
|
|
|
<!-- 弹窗编辑 -->
|
|
<!-- 弹窗编辑 -->
|
|
|
<PlusDialogForm
|
|
<PlusDialogForm
|
|
|
- ref="dialogForm"
|
|
|
|
|
- v-model="form"
|
|
|
|
|
- v-model:visible="dialogVisible"
|
|
|
|
|
- @confirm="handleSubmit"
|
|
|
|
|
- @close="handleClose"
|
|
|
|
|
- :form="{ columns, labelPosition: 'right',labelWidth: 100, rules, rowProps: {gutter: 20}, colProps: {span: 12} }"
|
|
|
|
|
- :dialog="{ title: dialogTitle + '菜单', width: 800, confirmLoading }"
|
|
|
|
|
|
|
+ ref="dialogForm"
|
|
|
|
|
+ v-model="form"
|
|
|
|
|
+ v-model:visible="dialogVisible"
|
|
|
|
|
+ :form="{
|
|
|
|
|
+ columns,
|
|
|
|
|
+ labelPosition: 'right',
|
|
|
|
|
+ labelWidth: 100,
|
|
|
|
|
+ rules,
|
|
|
|
|
+ rowProps: { gutter: 20 },
|
|
|
|
|
+ colProps: { span: 12 }
|
|
|
|
|
+ }"
|
|
|
|
|
+ :dialog="{ title: dialogTitle + '菜单', width: 800, confirmLoading }"
|
|
|
|
|
+ @confirm="handleSubmit"
|
|
|
|
|
+ @close="handleClose"
|
|
|
/>
|
|
/>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script lang="ts" setup>
|
|
<script lang="ts" setup>
|
|
|
-import {computed, defineOptions, h, nextTick, onMounted, reactive, ref, toRefs} from "vue";
|
|
|
|
|
-import type {FormRules} from 'element-plus'
|
|
|
|
|
-import {ElMessage} from "element-plus";
|
|
|
|
|
|
|
+import {
|
|
|
|
|
+ computed,
|
|
|
|
|
+ defineOptions,
|
|
|
|
|
+ h,
|
|
|
|
|
+ nextTick,
|
|
|
|
|
+ onMounted,
|
|
|
|
|
+ reactive,
|
|
|
|
|
+ ref,
|
|
|
|
|
+ toRefs
|
|
|
|
|
+} from "vue";
|
|
|
|
|
+import type { FormRules } from "element-plus";
|
|
|
|
|
+import { ElMessage } from "element-plus";
|
|
|
import {
|
|
import {
|
|
|
type FieldValues,
|
|
type FieldValues,
|
|
|
type PlusColumn,
|
|
type PlusColumn,
|
|
@@ -49,7 +67,7 @@ import {
|
|
|
PlusPageInstance,
|
|
PlusPageInstance,
|
|
|
useTable
|
|
useTable
|
|
|
} from "plus-pro-components";
|
|
} from "plus-pro-components";
|
|
|
-import {cloneDeep} from "lodash-es";
|
|
|
|
|
|
|
+import { cloneDeep } from "lodash-es";
|
|
|
import {
|
|
import {
|
|
|
addMenu,
|
|
addMenu,
|
|
|
deleteMenu,
|
|
deleteMenu,
|
|
@@ -72,13 +90,12 @@ interface TableRow {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
onMounted(async () => {
|
|
onMounted(async () => {
|
|
|
- await getSystem()
|
|
|
|
|
-})
|
|
|
|
|
-
|
|
|
|
|
|
|
+ await getSystem();
|
|
|
|
|
+});
|
|
|
|
|
|
|
|
// 菜单列表
|
|
// 菜单列表
|
|
|
const menuList = ref([]);
|
|
const menuList = ref([]);
|
|
|
-const plusPageInstance = ref<PlusPageInstance | null>(null)
|
|
|
|
|
|
|
+const plusPageInstance = ref<PlusPageInstance | null>(null);
|
|
|
|
|
|
|
|
const getList = async (query: Record<string, any>) => {
|
|
const getList = async (query: Record<string, any>) => {
|
|
|
let res = await getSystemMenuList(query);
|
|
let res = await getSystemMenuList(query);
|
|
@@ -86,8 +103,8 @@ const getList = async (query: Record<string, any>) => {
|
|
|
menuList.value = list;
|
|
menuList.value = list;
|
|
|
return {
|
|
return {
|
|
|
data: list,
|
|
data: list,
|
|
|
- total: list.length,
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ total: list.length
|
|
|
|
|
+ };
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const listToTree = (data: object[]) => {
|
|
const listToTree = (data: object[]) => {
|
|
@@ -111,12 +128,12 @@ const listToTree = (data: object[]) => {
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
return parentList;
|
|
return parentList;
|
|
|
-}
|
|
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
// 重新请求列表接口
|
|
// 重新请求列表接口
|
|
|
const refresh = () => {
|
|
const refresh = () => {
|
|
|
- plusPageInstance.value?.getList()
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ plusPageInstance.value?.getList();
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
// 搜索之前函数
|
|
// 搜索之前函数
|
|
|
const handleBeforeSearch = (values: any) => {
|
|
const handleBeforeSearch = (values: any) => {
|
|
@@ -124,9 +141,9 @@ const handleBeforeSearch = (values: any) => {
|
|
|
return cloneDeep(values);
|
|
return cloneDeep(values);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-const dialogTitle = computed(() => (state.isCreate ? '新增' : '编辑'))
|
|
|
|
|
|
|
+const dialogTitle = computed(() => (state.isCreate ? "新增" : "编辑"));
|
|
|
|
|
|
|
|
-const {buttons} = useTable<TableRow[]>();
|
|
|
|
|
|
|
+const { buttons } = useTable<TableRow[]>();
|
|
|
|
|
|
|
|
const systemList = ref([]);
|
|
const systemList = ref([]);
|
|
|
|
|
|
|
@@ -136,8 +153,8 @@ const getSystem = async () => {
|
|
|
systemList.value = res.data.map((item: any) => ({
|
|
systemList.value = res.data.map((item: any) => ({
|
|
|
label: item.sysName,
|
|
label: item.sysName,
|
|
|
value: item.sysCode
|
|
value: item.sysCode
|
|
|
- }))
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ }));
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
// 表格数据
|
|
// 表格数据
|
|
|
const tableConfig: PlusColumn[] = [
|
|
const tableConfig: PlusColumn[] = [
|
|
@@ -147,7 +164,7 @@ const tableConfig: PlusColumn[] = [
|
|
|
width: 180,
|
|
width: 180,
|
|
|
tableColumnProps: {
|
|
tableColumnProps: {
|
|
|
showOverflowTooltip: true
|
|
showOverflowTooltip: true
|
|
|
- },
|
|
|
|
|
|
|
+ }
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "图标",
|
|
label: "图标",
|
|
@@ -155,13 +172,11 @@ const tableConfig: PlusColumn[] = [
|
|
|
hideInSearch: true,
|
|
hideInSearch: true,
|
|
|
width: 80,
|
|
width: 80,
|
|
|
// 返回一个组件
|
|
// 返回一个组件
|
|
|
- render: (value) =>
|
|
|
|
|
- h('i',
|
|
|
|
|
- {
|
|
|
|
|
- class: `${value} iconfont`,
|
|
|
|
|
- style: {fontSize: '16px'}
|
|
|
|
|
- },
|
|
|
|
|
- )
|
|
|
|
|
|
|
+ render: value =>
|
|
|
|
|
+ h("i", {
|
|
|
|
|
+ class: `${value} iconfont`,
|
|
|
|
|
+ style: { fontSize: "16px" }
|
|
|
|
|
+ })
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "排序",
|
|
label: "排序",
|
|
@@ -190,10 +205,10 @@ const tableConfig: PlusColumn[] = [
|
|
|
valueType: "tag",
|
|
valueType: "tag",
|
|
|
hideInSearch: true,
|
|
hideInSearch: true,
|
|
|
fieldProps: value => ({
|
|
fieldProps: value => ({
|
|
|
- type: value === '0' ? 'primary' : 'danger'
|
|
|
|
|
|
|
+ type: value === "0" ? "primary" : "danger"
|
|
|
}),
|
|
}),
|
|
|
fieldSlots: {
|
|
fieldSlots: {
|
|
|
- default: ({value}) => (value === '0' ? '正常' : '停用')
|
|
|
|
|
|
|
+ default: ({ value }) => (value === "0" ? "正常" : "停用")
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
@@ -204,20 +219,23 @@ const tableConfig: PlusColumn[] = [
|
|
|
hideInTable: true,
|
|
hideInTable: true,
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
clearable: true,
|
|
clearable: true,
|
|
|
- placeholder: '请选择系统',
|
|
|
|
|
- style: {width: '100%'}
|
|
|
|
|
|
|
+ placeholder: "请选择系统",
|
|
|
|
|
+ style: { width: "100%" }
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "菜单状态",
|
|
label: "菜单状态",
|
|
|
prop: "status",
|
|
prop: "status",
|
|
|
valueType: "select",
|
|
valueType: "select",
|
|
|
- options: [{label: '正常', value: '0'}, {label: '停用', value: '1'}],
|
|
|
|
|
|
|
+ options: [
|
|
|
|
|
+ { label: "正常", value: "0" },
|
|
|
|
|
+ { label: "停用", value: "1" }
|
|
|
|
|
+ ],
|
|
|
hideInTable: true,
|
|
hideInTable: true,
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
clearable: true,
|
|
clearable: true,
|
|
|
- placeholder: '请选择菜单状态',
|
|
|
|
|
- style: {width: '100%'}
|
|
|
|
|
|
|
+ placeholder: "请选择菜单状态",
|
|
|
|
|
+ style: { width: "100%" }
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
@@ -241,23 +259,23 @@ interface State {
|
|
|
selectedIds: number[];
|
|
selectedIds: number[];
|
|
|
isCreate: boolean;
|
|
isCreate: boolean;
|
|
|
form: {
|
|
form: {
|
|
|
- component: string, // 组件路径
|
|
|
|
|
- icon: string, // 菜单图标
|
|
|
|
|
- isCache: string, // 是否缓存 (0缓存 1不缓存)
|
|
|
|
|
- isFrame: string, // 是否外链 (0是 1否)
|
|
|
|
|
- menuName: string,// 菜单名称
|
|
|
|
|
- menuType: string, // 菜单类型(M目录 C菜单 F按钮)
|
|
|
|
|
- orderNum: string,// 显示排序
|
|
|
|
|
- parentId: number,// 上级菜单
|
|
|
|
|
- path: string, // 路由地址
|
|
|
|
|
- perms: string, // 权限标识
|
|
|
|
|
- query: string, // 路由参数
|
|
|
|
|
- routeName: string, // 路由名称
|
|
|
|
|
- status: string, // 菜单状态(0正常 1停用)
|
|
|
|
|
- systemCode: string, // 系统编码
|
|
|
|
|
- url: string, // 网关URL
|
|
|
|
|
- urlmatch: string, // 网关权限
|
|
|
|
|
- visible: string, // 显示状态(0显示 1隐藏)
|
|
|
|
|
|
|
+ component: string; // 组件路径
|
|
|
|
|
+ icon: string; // 菜单图标
|
|
|
|
|
+ isCache: string; // 是否缓存 (0缓存 1不缓存)
|
|
|
|
|
+ isFrame: string; // 是否外链 (0是 1否)
|
|
|
|
|
+ menuName: string; // 菜单名称
|
|
|
|
|
+ menuType: string; // 菜单类型(M目录 C菜单 F按钮)
|
|
|
|
|
+ orderNum: string; // 显示排序
|
|
|
|
|
+ parentId: number; // 上级菜单
|
|
|
|
|
+ path: string; // 路由地址
|
|
|
|
|
+ perms: string; // 权限标识
|
|
|
|
|
+ query: string; // 路由参数
|
|
|
|
|
+ routeName: string; // 路由名称
|
|
|
|
|
+ status: string; // 菜单状态(0正常 1停用)
|
|
|
|
|
+ systemCode: string; // 系统编码
|
|
|
|
|
+ url: string; // 网关URL
|
|
|
|
|
+ urlmatch: string; // 网关权限
|
|
|
|
|
+ visible: string; // 显示状态(0显示 1隐藏)
|
|
|
};
|
|
};
|
|
|
rules: FormRules;
|
|
rules: FormRules;
|
|
|
}
|
|
}
|
|
@@ -271,301 +289,305 @@ const state = reactive<State>({
|
|
|
form: {
|
|
form: {
|
|
|
component: null, // 组件路径
|
|
component: null, // 组件路径
|
|
|
icon: null, // 菜单图标
|
|
icon: null, // 菜单图标
|
|
|
- isCache: '0', // 是否缓存 (0缓存 1不缓存)
|
|
|
|
|
- isFrame: '1', // 是否外链 (0是 1否)
|
|
|
|
|
- menuName: null,// 菜单名称
|
|
|
|
|
- menuType: 'M', // 菜单类型(M目录 C菜单 F按钮)
|
|
|
|
|
- orderNum: null,// 显示排序
|
|
|
|
|
- parentId: 0,// 上级菜单
|
|
|
|
|
|
|
+ isCache: "0", // 是否缓存 (0缓存 1不缓存)
|
|
|
|
|
+ isFrame: "1", // 是否外链 (0是 1否)
|
|
|
|
|
+ menuName: null, // 菜单名称
|
|
|
|
|
+ menuType: "M", // 菜单类型(M目录 C菜单 F按钮)
|
|
|
|
|
+ orderNum: null, // 显示排序
|
|
|
|
|
+ parentId: 0, // 上级菜单
|
|
|
path: null, // 路由地址
|
|
path: null, // 路由地址
|
|
|
perms: null, // 权限标识
|
|
perms: null, // 权限标识
|
|
|
query: null, // 路由参数
|
|
query: null, // 路由参数
|
|
|
routeName: null, // 路由名称
|
|
routeName: null, // 路由名称
|
|
|
- status: '0', // 菜单状态(0正常 1停用)
|
|
|
|
|
|
|
+ status: "0", // 菜单状态(0正常 1停用)
|
|
|
systemCode: null, // 系统编码
|
|
systemCode: null, // 系统编码
|
|
|
url: null, // 网关URL
|
|
url: null, // 网关URL
|
|
|
urlmatch: null, // 网关权限
|
|
urlmatch: null, // 网关权限
|
|
|
- visible: '0', // 显示状态(0显示 1隐藏)
|
|
|
|
|
|
|
+ visible: "0" // 显示状态(0显示 1隐藏)
|
|
|
},
|
|
},
|
|
|
rules: {
|
|
rules: {
|
|
|
- parentId: [{required: true, message: '请选择上级菜单', trigger: 'blur'}],
|
|
|
|
|
- orderNum: [{required: true, message: '请输入排序', trigger: 'blur'}],
|
|
|
|
|
- menuName: [{required: true, message: '请输入菜单名称', trigger: 'blur'}],
|
|
|
|
|
- path: [{required: true, message: '请输入路由地址', trigger: 'blur'}],
|
|
|
|
|
|
|
+ parentId: [{ required: true, message: "请选择上级菜单", trigger: "blur" }],
|
|
|
|
|
+ orderNum: [{ required: true, message: "请输入排序", trigger: "blur" }],
|
|
|
|
|
+ menuName: [{ required: true, message: "请输入菜单名称", trigger: "blur" }],
|
|
|
|
|
+ path: [{ required: true, message: "请输入路由地址", trigger: "blur" }]
|
|
|
}
|
|
}
|
|
|
-})
|
|
|
|
|
|
|
+});
|
|
|
|
|
|
|
|
const columns: PlusColumn[] = [
|
|
const columns: PlusColumn[] = [
|
|
|
{
|
|
{
|
|
|
- label: '上级菜单',
|
|
|
|
|
- prop: 'parentId',
|
|
|
|
|
- colProps: {span: 24},
|
|
|
|
|
- valueType: 'tree-select',
|
|
|
|
|
|
|
+ label: "上级菜单",
|
|
|
|
|
+ prop: "parentId",
|
|
|
|
|
+ colProps: { span: 24 },
|
|
|
|
|
+ valueType: "tree-select",
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
- placeholder: '请选择上级菜单',
|
|
|
|
|
|
|
+ placeholder: "请选择上级菜单",
|
|
|
clearable: true,
|
|
clearable: true,
|
|
|
showSearch: true,
|
|
showSearch: true,
|
|
|
checkStrictly: true,
|
|
checkStrictly: true,
|
|
|
defaultExpandAll: false,
|
|
defaultExpandAll: false,
|
|
|
- style: {width: '100%'},
|
|
|
|
|
|
|
+ style: { width: "100%" },
|
|
|
data: computed(() => {
|
|
data: computed(() => {
|
|
|
- return [{menuId: 0, menuName: '主类目', children: [...menuList.value]},]
|
|
|
|
|
|
|
+ return [
|
|
|
|
|
+ { menuId: 0, menuName: "主类目", children: [...menuList.value] }
|
|
|
|
|
+ ];
|
|
|
}),
|
|
}),
|
|
|
// el-tree-select 组件属性
|
|
// el-tree-select 组件属性
|
|
|
props: {
|
|
props: {
|
|
|
- label: 'menuName',
|
|
|
|
|
- value: 'menuId',
|
|
|
|
|
- children: 'children'
|
|
|
|
|
|
|
+ label: "menuName",
|
|
|
|
|
+ value: "menuId",
|
|
|
|
|
+ children: "children"
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "系统编码",
|
|
label: "系统编码",
|
|
|
prop: "systemCode",
|
|
prop: "systemCode",
|
|
|
- valueType: 'input',
|
|
|
|
|
- colProps: {span: 24},
|
|
|
|
|
|
|
+ valueType: "input",
|
|
|
|
|
+ colProps: { span: 24 },
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
- placeholder: '请输入系统编码',
|
|
|
|
|
|
|
+ placeholder: "请输入系统编码",
|
|
|
clearable: true
|
|
clearable: true
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "菜单类型",
|
|
label: "菜单类型",
|
|
|
prop: "menuType",
|
|
prop: "menuType",
|
|
|
- valueType: 'radio',
|
|
|
|
|
- colProps: {span: 24},
|
|
|
|
|
|
|
+ valueType: "radio",
|
|
|
|
|
+ colProps: { span: 24 },
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
- placeholder: '请选择菜单类型',
|
|
|
|
|
|
|
+ placeholder: "请选择菜单类型",
|
|
|
clearable: true,
|
|
clearable: true,
|
|
|
options: [
|
|
options: [
|
|
|
- {label: '目录', value: 'M'},
|
|
|
|
|
- {label: '菜单', value: 'C'},
|
|
|
|
|
- {label: '按钮', value: 'F'}
|
|
|
|
|
- ],
|
|
|
|
|
- },
|
|
|
|
|
|
|
+ { label: "目录", value: "M" },
|
|
|
|
|
+ { label: "菜单", value: "C" },
|
|
|
|
|
+ { label: "按钮", value: "F" }
|
|
|
|
|
+ ]
|
|
|
|
|
+ }
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "菜单图标",
|
|
label: "菜单图标",
|
|
|
prop: "icon",
|
|
prop: "icon",
|
|
|
- valueType: 'input',
|
|
|
|
|
- colProps: {span: 12},
|
|
|
|
|
|
|
+ valueType: "input",
|
|
|
|
|
+ colProps: { span: 12 },
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
- placeholder: '请输入菜单图标',
|
|
|
|
|
- clearable: true,
|
|
|
|
|
|
|
+ placeholder: "请输入菜单图标",
|
|
|
|
|
+ clearable: true
|
|
|
},
|
|
},
|
|
|
- hideInForm: computed(() => form.value.menuType === 'F')
|
|
|
|
|
|
|
+ hideInForm: computed(() => form.value.menuType === "F")
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "显示排序",
|
|
label: "显示排序",
|
|
|
prop: "orderNum",
|
|
prop: "orderNum",
|
|
|
- valueType: 'input-number',
|
|
|
|
|
- colProps: {span: 12},
|
|
|
|
|
|
|
+ valueType: "input-number",
|
|
|
|
|
+ colProps: { span: 12 },
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
- placeholder: '请输入显示排序',
|
|
|
|
|
- style: {width: '100%'},
|
|
|
|
|
|
|
+ placeholder: "请输入显示排序",
|
|
|
|
|
+ style: { width: "100%" },
|
|
|
min: 0
|
|
min: 0
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "菜单名称",
|
|
label: "菜单名称",
|
|
|
prop: "menuName",
|
|
prop: "menuName",
|
|
|
- colProps: {span: 12},
|
|
|
|
|
|
|
+ colProps: { span: 12 },
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
- placeholder: '请输入菜单名称',
|
|
|
|
|
|
|
+ placeholder: "请输入菜单名称",
|
|
|
clearable: true
|
|
clearable: true
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "路由名称",
|
|
label: "路由名称",
|
|
|
prop: "routeName",
|
|
prop: "routeName",
|
|
|
- colProps: {span: 12},
|
|
|
|
|
|
|
+ colProps: { span: 12 },
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
- placeholder: '请输入路由名称',
|
|
|
|
|
|
|
+ placeholder: "请输入路由名称",
|
|
|
clearable: true
|
|
clearable: true
|
|
|
},
|
|
},
|
|
|
- hideInForm: computed(() => form.value.menuType !== 'C')
|
|
|
|
|
|
|
+ hideInForm: computed(() => form.value.menuType !== "C")
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "是否外链",
|
|
label: "是否外链",
|
|
|
prop: "isFrame",
|
|
prop: "isFrame",
|
|
|
- valueType: 'radio',
|
|
|
|
|
- colProps: {span: 12},
|
|
|
|
|
|
|
+ valueType: "radio",
|
|
|
|
|
+ colProps: { span: 12 },
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
options: [
|
|
options: [
|
|
|
- {label: '是', value: '0'},
|
|
|
|
|
- {label: '否', value: '1'}
|
|
|
|
|
|
|
+ { label: "是", value: "0" },
|
|
|
|
|
+ { label: "否", value: "1" }
|
|
|
]
|
|
]
|
|
|
},
|
|
},
|
|
|
- tooltip: '选择是外链则路由地址需要以`http(s)://`开头',
|
|
|
|
|
- hideInForm: computed(() => form.value.menuType === 'F')
|
|
|
|
|
|
|
+ tooltip: "选择是外链则路由地址需要以`http(s)://`开头",
|
|
|
|
|
+ hideInForm: computed(() => form.value.menuType === "F")
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "路由地址",
|
|
label: "路由地址",
|
|
|
prop: "path",
|
|
prop: "path",
|
|
|
- colProps: {span: 12},
|
|
|
|
|
|
|
+ colProps: { span: 12 },
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
- placeholder: '请输入路由地址',
|
|
|
|
|
|
|
+ placeholder: "请输入路由地址",
|
|
|
clearable: true
|
|
clearable: true
|
|
|
},
|
|
},
|
|
|
- tooltip: "访问的路由地址,如:`role`,如外网地址需内链访问则以`http(s)://`开头",
|
|
|
|
|
- hideInForm: computed(() => form.value.menuType === 'F')
|
|
|
|
|
|
|
+ tooltip:
|
|
|
|
|
+ "访问的路由地址,如:`role`,如外网地址需内链访问则以`http(s)://`开头",
|
|
|
|
|
+ hideInForm: computed(() => form.value.menuType === "F")
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "组件路径",
|
|
label: "组件路径",
|
|
|
prop: "component",
|
|
prop: "component",
|
|
|
- colProps: {span: 12},
|
|
|
|
|
|
|
+ colProps: { span: 12 },
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
- placeholder: '请输入组件路径',
|
|
|
|
|
|
|
+ placeholder: "请输入组件路径",
|
|
|
clearable: true
|
|
clearable: true
|
|
|
},
|
|
},
|
|
|
tooltip: "访问的组件路径,如:`system/role/index`,默认在`views`目录下",
|
|
tooltip: "访问的组件路径,如:`system/role/index`,默认在`views`目录下",
|
|
|
- hideInForm: computed(() => form.value.menuType !== 'C')
|
|
|
|
|
|
|
+ hideInForm: computed(() => form.value.menuType !== "C")
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "权限字符",
|
|
label: "权限字符",
|
|
|
prop: "perms",
|
|
prop: "perms",
|
|
|
- colProps: {span: 12},
|
|
|
|
|
|
|
+ colProps: { span: 12 },
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
- placeholder: '请输入权限标识',
|
|
|
|
|
|
|
+ placeholder: "请输入权限标识",
|
|
|
clearable: true
|
|
clearable: true
|
|
|
},
|
|
},
|
|
|
- tooltip: "控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasPermi('system:role:list')`)",
|
|
|
|
|
- hideInForm: computed(() => form.value.menuType === 'M')
|
|
|
|
|
|
|
+ tooltip:
|
|
|
|
|
+ "控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasPermi('system:role:list')`)",
|
|
|
|
|
+ hideInForm: computed(() => form.value.menuType === "M")
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "网关URL",
|
|
label: "网关URL",
|
|
|
prop: "url",
|
|
prop: "url",
|
|
|
- colProps: {span: 12},
|
|
|
|
|
|
|
+ colProps: { span: 12 },
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
- placeholder: '请输入URL',
|
|
|
|
|
|
|
+ placeholder: "请输入URL",
|
|
|
clearable: true
|
|
clearable: true
|
|
|
- },
|
|
|
|
|
|
|
+ }
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "网关权限",
|
|
label: "网关权限",
|
|
|
prop: "urlmatch",
|
|
prop: "urlmatch",
|
|
|
- colProps: {span: 12},
|
|
|
|
|
|
|
+ colProps: { span: 12 },
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
- placeholder: '请输入网关权限标识',
|
|
|
|
|
|
|
+ placeholder: "请输入网关权限标识",
|
|
|
clearable: true
|
|
clearable: true
|
|
|
},
|
|
},
|
|
|
- tooltip: "控制器中定义的权限字符",
|
|
|
|
|
|
|
+ tooltip: "控制器中定义的权限字符"
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "路由参数",
|
|
label: "路由参数",
|
|
|
prop: "query",
|
|
prop: "query",
|
|
|
- colProps: {span: 12},
|
|
|
|
|
|
|
+ colProps: { span: 12 },
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
- placeholder: '请输入路由参数',
|
|
|
|
|
|
|
+ placeholder: "请输入路由参数",
|
|
|
clearable: true
|
|
clearable: true
|
|
|
},
|
|
},
|
|
|
- tooltip: "访问路由的默认传递参数,如:`{\"id\": 1, \"name\": \"ry\"}`",
|
|
|
|
|
- hideInForm: computed(() => form.value.menuType !== 'C')
|
|
|
|
|
|
|
+ tooltip: '访问路由的默认传递参数,如:`{"id": 1, "name": "ry"}`',
|
|
|
|
|
+ hideInForm: computed(() => form.value.menuType !== "C")
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "是否缓存",
|
|
label: "是否缓存",
|
|
|
prop: "isCache",
|
|
prop: "isCache",
|
|
|
- valueType: 'radio',
|
|
|
|
|
- colProps: {span: 12},
|
|
|
|
|
|
|
+ valueType: "radio",
|
|
|
|
|
+ colProps: { span: 12 },
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
options: [
|
|
options: [
|
|
|
- {label: '是', value: '0'},
|
|
|
|
|
- {label: '否', value: '1'}
|
|
|
|
|
|
|
+ { label: "是", value: "0" },
|
|
|
|
|
+ { label: "否", value: "1" }
|
|
|
]
|
|
]
|
|
|
},
|
|
},
|
|
|
tooltip: "选择是则会被`keep-alive`缓存,需要匹配组件的`name`和地址保持一致",
|
|
tooltip: "选择是则会被`keep-alive`缓存,需要匹配组件的`name`和地址保持一致",
|
|
|
- hideInForm: computed(() => form.value.menuType !== 'C')
|
|
|
|
|
|
|
+ hideInForm: computed(() => form.value.menuType !== "C")
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "显示状态",
|
|
label: "显示状态",
|
|
|
prop: "visible",
|
|
prop: "visible",
|
|
|
- valueType: 'radio',
|
|
|
|
|
- colProps: {span: 12},
|
|
|
|
|
|
|
+ valueType: "radio",
|
|
|
|
|
+ colProps: { span: 12 },
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
options: [
|
|
options: [
|
|
|
- {label: '显示', value: '0'},
|
|
|
|
|
- {label: '隐藏', value: '1'}
|
|
|
|
|
|
|
+ { label: "显示", value: "0" },
|
|
|
|
|
+ { label: "隐藏", value: "1" }
|
|
|
]
|
|
]
|
|
|
},
|
|
},
|
|
|
tooltip: "选择隐藏则路由将不会出现在侧边栏,但仍然可以访问",
|
|
tooltip: "选择隐藏则路由将不会出现在侧边栏,但仍然可以访问",
|
|
|
- hideInForm: computed(() => form.value.menuType === 'F')
|
|
|
|
|
|
|
+ hideInForm: computed(() => form.value.menuType === "F")
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
label: "菜单状态",
|
|
label: "菜单状态",
|
|
|
prop: "status",
|
|
prop: "status",
|
|
|
- valueType: 'radio',
|
|
|
|
|
- colProps: {span: 12},
|
|
|
|
|
|
|
+ valueType: "radio",
|
|
|
|
|
+ colProps: { span: 12 },
|
|
|
fieldProps: {
|
|
fieldProps: {
|
|
|
options: [
|
|
options: [
|
|
|
- {label: '正常', value: '0'},
|
|
|
|
|
- {label: '停用', value: '1'}
|
|
|
|
|
|
|
+ { label: "正常", value: "0" },
|
|
|
|
|
+ { label: "停用", value: "1" }
|
|
|
]
|
|
]
|
|
|
},
|
|
},
|
|
|
tooltip: "选择停用则路由将不会出现在侧边栏,也不能被访问"
|
|
tooltip: "选择停用则路由将不会出现在侧边栏,也不能被访问"
|
|
|
- },
|
|
|
|
|
-]
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+];
|
|
|
|
|
|
|
|
// 创建
|
|
// 创建
|
|
|
const handleCreate = (): void => {
|
|
const handleCreate = (): void => {
|
|
|
form.value = {
|
|
form.value = {
|
|
|
component: null, // 组件路径
|
|
component: null, // 组件路径
|
|
|
icon: null, // 菜单图标
|
|
icon: null, // 菜单图标
|
|
|
- isCache: '0', // 是否缓存 (0缓存 1不缓存)
|
|
|
|
|
- isFrame: '1', // 是否外链 (0是 1否)
|
|
|
|
|
- menuName: null,// 菜单名称
|
|
|
|
|
- menuType: 'M', // 菜单类型(M目录 C菜单 F按钮)
|
|
|
|
|
- orderNum: null,// 显示排序
|
|
|
|
|
- parentId: 0,// 上级菜单
|
|
|
|
|
|
|
+ isCache: "0", // 是否缓存 (0缓存 1不缓存)
|
|
|
|
|
+ isFrame: "1", // 是否外链 (0是 1否)
|
|
|
|
|
+ menuName: null, // 菜单名称
|
|
|
|
|
+ menuType: "M", // 菜单类型(M目录 C菜单 F按钮)
|
|
|
|
|
+ orderNum: null, // 显示排序
|
|
|
|
|
+ parentId: 0, // 上级菜单
|
|
|
path: null, // 路由地址
|
|
path: null, // 路由地址
|
|
|
perms: null, // 权限标识
|
|
perms: null, // 权限标识
|
|
|
query: null, // 路由参数
|
|
query: null, // 路由参数
|
|
|
routeName: null, // 路由名称
|
|
routeName: null, // 路由名称
|
|
|
- status: '0', // 菜单状态(0正常 1停用)
|
|
|
|
|
|
|
+ status: "0", // 菜单状态(0正常 1停用)
|
|
|
systemCode: null, // 系统编码
|
|
systemCode: null, // 系统编码
|
|
|
url: null, // 网关URL
|
|
url: null, // 网关URL
|
|
|
urlmatch: null, // 网关权限
|
|
urlmatch: null, // 网关权限
|
|
|
- visible: '0', // 显示状态(0显示 1隐藏)
|
|
|
|
|
- }
|
|
|
|
|
- state.isCreate = true
|
|
|
|
|
- state.dialogVisible = true
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ visible: "0" // 显示状态(0显示 1隐藏)
|
|
|
|
|
+ };
|
|
|
|
|
+ state.isCreate = true;
|
|
|
|
|
+ state.dialogVisible = true;
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
const handleSubmit = async (values: FieldValues) => {
|
|
const handleSubmit = async (values: FieldValues) => {
|
|
|
- console.log(values, 'Submit')
|
|
|
|
|
- confirmLoading.value = true
|
|
|
|
|
|
|
+ console.log(values, "Submit");
|
|
|
|
|
+ confirmLoading.value = true;
|
|
|
if (state.isCreate) {
|
|
if (state.isCreate) {
|
|
|
try {
|
|
try {
|
|
|
- let params = form.value
|
|
|
|
|
- let res = await addMenu(params)
|
|
|
|
|
|
|
+ let params = form.value;
|
|
|
|
|
+ let res = await addMenu(params);
|
|
|
if (res.code === 200) {
|
|
if (res.code === 200) {
|
|
|
- ElMessage.success('新增成功')
|
|
|
|
|
- confirmLoading.value = false
|
|
|
|
|
- dialogVisible.value = false
|
|
|
|
|
- refresh()
|
|
|
|
|
|
|
+ ElMessage.success("新增成功");
|
|
|
|
|
+ confirmLoading.value = false;
|
|
|
|
|
+ dialogVisible.value = false;
|
|
|
|
|
+ refresh();
|
|
|
} else {
|
|
} else {
|
|
|
- ElMessage.error(res.msg)
|
|
|
|
|
|
|
+ ElMessage.error(res.msg);
|
|
|
}
|
|
}
|
|
|
} finally {
|
|
} finally {
|
|
|
- confirmLoading.value = false
|
|
|
|
|
|
|
+ confirmLoading.value = false;
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
|
// 编辑
|
|
// 编辑
|
|
|
try {
|
|
try {
|
|
|
- let params = form.value
|
|
|
|
|
- let res = await updateMenu(params)
|
|
|
|
|
|
|
+ let params = form.value;
|
|
|
|
|
+ let res = await updateMenu(params);
|
|
|
if (res.code === 200) {
|
|
if (res.code === 200) {
|
|
|
- ElMessage.success('修改成功')
|
|
|
|
|
- confirmLoading.value = false
|
|
|
|
|
- dialogVisible.value = false
|
|
|
|
|
- refresh()
|
|
|
|
|
|
|
+ ElMessage.success("修改成功");
|
|
|
|
|
+ confirmLoading.value = false;
|
|
|
|
|
+ dialogVisible.value = false;
|
|
|
|
|
+ refresh();
|
|
|
} else {
|
|
} else {
|
|
|
- ElMessage.error(res.msg)
|
|
|
|
|
|
|
+ ElMessage.error(res.msg);
|
|
|
}
|
|
}
|
|
|
} finally {
|
|
} finally {
|
|
|
- confirmLoading.value = false
|
|
|
|
|
|
|
+ confirmLoading.value = false;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
const handleClose = () => {
|
|
const handleClose = () => {
|
|
|
/*// 重置表单
|
|
/*// 重置表单
|
|
@@ -574,8 +596,8 @@ const handleClose = () => {
|
|
|
dialogForm.value.formInstance.resetFields()
|
|
dialogForm.value.formInstance.resetFields()
|
|
|
}
|
|
}
|
|
|
})*/
|
|
})*/
|
|
|
- console.log(dialogForm.value.formInstance)
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ console.log(dialogForm.value.formInstance);
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
buttons.value = [
|
|
buttons.value = [
|
|
|
{
|
|
{
|
|
@@ -588,11 +610,11 @@ buttons.value = [
|
|
|
},
|
|
},
|
|
|
onClick(params) {
|
|
onClick(params) {
|
|
|
getSystemMenuDetailById(params.row.menuId).then(res => {
|
|
getSystemMenuDetailById(params.row.menuId).then(res => {
|
|
|
- form.value = res.data
|
|
|
|
|
- state.isCreate = false
|
|
|
|
|
- state.dialogVisible = true
|
|
|
|
|
- })
|
|
|
|
|
- },
|
|
|
|
|
|
|
+ form.value = res.data;
|
|
|
|
|
+ state.isCreate = false;
|
|
|
|
|
+ state.dialogVisible = true;
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
// 新增
|
|
// 新增
|
|
@@ -602,57 +624,57 @@ buttons.value = [
|
|
|
type: "success"
|
|
type: "success"
|
|
|
},
|
|
},
|
|
|
onClick(params) {
|
|
onClick(params) {
|
|
|
- console.log("新增", params)
|
|
|
|
|
|
|
+ console.log("新增", params);
|
|
|
form.value = {
|
|
form.value = {
|
|
|
component: null, // 组件路径
|
|
component: null, // 组件路径
|
|
|
icon: null, // 菜单图标
|
|
icon: null, // 菜单图标
|
|
|
- isCache: '0', // 是否缓存 (0缓存 1不缓存)
|
|
|
|
|
- isFrame: '1', // 是否外链 (0是 1否)
|
|
|
|
|
- menuName: null,// 菜单名称
|
|
|
|
|
- menuType: 'M', // 菜单类型(M目录 C菜单 F按钮)
|
|
|
|
|
- orderNum: null,// 显示排序
|
|
|
|
|
- parentId: params.row.menuId,// 上级菜单
|
|
|
|
|
|
|
+ isCache: "0", // 是否缓存 (0缓存 1不缓存)
|
|
|
|
|
+ isFrame: "1", // 是否外链 (0是 1否)
|
|
|
|
|
+ menuName: null, // 菜单名称
|
|
|
|
|
+ menuType: "M", // 菜单类型(M目录 C菜单 F按钮)
|
|
|
|
|
+ orderNum: null, // 显示排序
|
|
|
|
|
+ parentId: params.row.menuId, // 上级菜单
|
|
|
path: null, // 路由地址
|
|
path: null, // 路由地址
|
|
|
perms: null, // 权限标识
|
|
perms: null, // 权限标识
|
|
|
query: null, // 路由参数
|
|
query: null, // 路由参数
|
|
|
routeName: null, // 路由名称
|
|
routeName: null, // 路由名称
|
|
|
- status: '0', // 菜单状态(0正常 1停用)
|
|
|
|
|
|
|
+ status: "0", // 菜单状态(0正常 1停用)
|
|
|
systemCode: null, // 系统编码
|
|
systemCode: null, // 系统编码
|
|
|
url: null, // 网关URL
|
|
url: null, // 网关URL
|
|
|
urlmatch: null, // 网关权限
|
|
urlmatch: null, // 网关权限
|
|
|
- visible: '0', // 显示状态(0显示 1隐藏)
|
|
|
|
|
- }
|
|
|
|
|
- state.isCreate = true
|
|
|
|
|
- state.dialogVisible = true
|
|
|
|
|
- },
|
|
|
|
|
|
|
+ visible: "0" // 显示状态(0显示 1隐藏)
|
|
|
|
|
+ };
|
|
|
|
|
+ state.isCreate = true;
|
|
|
|
|
+ state.dialogVisible = true;
|
|
|
|
|
+ }
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
// 删除
|
|
// 删除
|
|
|
text: "删除",
|
|
text: "删除",
|
|
|
code: "delete",
|
|
code: "delete",
|
|
|
// props v0.1.16 版本新增计算属性支持
|
|
// props v0.1.16 版本新增计算属性支持
|
|
|
- props: computed(() => ({type: "danger"})),
|
|
|
|
|
|
|
+ props: computed(() => ({ type: "danger" })),
|
|
|
confirm: {
|
|
confirm: {
|
|
|
options: {
|
|
options: {
|
|
|
draggable: true,
|
|
draggable: true,
|
|
|
message: "确定删除此数据吗?"
|
|
message: "确定删除此数据吗?"
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
- onConfirm: async (params) => {
|
|
|
|
|
|
|
+ onConfirm: async params => {
|
|
|
try {
|
|
try {
|
|
|
- let res = await deleteMenu(params.row.menuId)
|
|
|
|
|
|
|
+ let res = await deleteMenu(params.row.menuId);
|
|
|
if (res.code === 200) {
|
|
if (res.code === 200) {
|
|
|
- ElMessage.success('删除成功')
|
|
|
|
|
- refresh()
|
|
|
|
|
|
|
+ ElMessage.success("删除成功");
|
|
|
|
|
+ refresh();
|
|
|
} else {
|
|
} else {
|
|
|
- ElMessage.error(res.msg)
|
|
|
|
|
|
|
+ ElMessage.error(res.msg);
|
|
|
}
|
|
}
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
- ElMessage.error('删除失败')
|
|
|
|
|
|
|
+ ElMessage.error("删除失败");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
];
|
|
];
|
|
|
|
|
|
|
|
-const {form, confirmLoading, rules, dialogVisible} = toRefs(state)
|
|
|
|
|
|
|
+const { form, confirmLoading, rules, dialogVisible } = toRefs(state);
|
|
|
</script>
|
|
</script>
|