feat:新增菜单、部门页面
This commit is contained in:
@@ -12,8 +12,8 @@ export const getListMenu = query => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/** 查询菜单详细 */
|
/** 查询菜单详细 */
|
||||||
export const getMenu = menuId => {
|
export const getMenu = id => {
|
||||||
return http.request<Result>("get", `/menu/${menuId}`, {});
|
return http.request<Result>("get", `/menu/${id}`, {});
|
||||||
};
|
};
|
||||||
|
|
||||||
/** 新增菜单 */
|
/** 新增菜单 */
|
||||||
|
|||||||
@@ -22,24 +22,24 @@ const props = withDefaults(defineProps<FormProps>(), {
|
|||||||
menuType: 0,
|
menuType: 0,
|
||||||
higherMenuOptions: [],
|
higherMenuOptions: [],
|
||||||
parentId: 0,
|
parentId: 0,
|
||||||
title: "",
|
menuName: "",
|
||||||
name: "",
|
name: "",
|
||||||
path: "",
|
router: "",
|
||||||
component: "",
|
component: "",
|
||||||
rank: 99,
|
orderNum: 99,
|
||||||
redirect: "",
|
redirect: "",
|
||||||
icon: "",
|
icon: "",
|
||||||
extraIcon: "",
|
extraIcon: "",
|
||||||
enterTransition: "",
|
enterTransition: "",
|
||||||
leaveTransition: "",
|
leaveTransition: "",
|
||||||
activePath: "",
|
activePath: "",
|
||||||
auths: "",
|
permissionCode: "",
|
||||||
frameSrc: "",
|
frameSrc: "",
|
||||||
frameLoading: true,
|
frameLoading: true,
|
||||||
keepAlive: false,
|
keepAlive: false,
|
||||||
hiddenTag: false,
|
hiddenTag: false,
|
||||||
fixedTag: false,
|
fixedTag: false,
|
||||||
showLink: true,
|
isShow: true,
|
||||||
showParent: false
|
showParent: false
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
@@ -88,7 +88,7 @@ defineExpose({ getRef });
|
|||||||
placeholder="请选择上级菜单"
|
placeholder="请选择上级菜单"
|
||||||
>
|
>
|
||||||
<template #default="{ node, data }">
|
<template #default="{ node, data }">
|
||||||
<span>{{ transformI18n(data.title) }}</span>
|
<span>{{ transformI18n(data.menuName) }}</span>
|
||||||
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
|
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
|
||||||
</template>
|
</template>
|
||||||
</el-cascader>
|
</el-cascader>
|
||||||
@@ -98,7 +98,7 @@ defineExpose({ getRef });
|
|||||||
<re-col :value="12" :xs="24" :sm="24">
|
<re-col :value="12" :xs="24" :sm="24">
|
||||||
<el-form-item label="菜单名称" prop="title">
|
<el-form-item label="菜单名称" prop="title">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="newFormInline.title"
|
v-model="newFormInline.menuName"
|
||||||
clearable
|
clearable
|
||||||
placeholder="请输入菜单名称"
|
placeholder="请输入菜单名称"
|
||||||
/>
|
/>
|
||||||
@@ -115,9 +115,9 @@ defineExpose({ getRef });
|
|||||||
</re-col>
|
</re-col>
|
||||||
|
|
||||||
<re-col v-if="newFormInline.menuType !== 3" :value="12" :xs="24" :sm="24">
|
<re-col v-if="newFormInline.menuType !== 3" :value="12" :xs="24" :sm="24">
|
||||||
<el-form-item label="路由路径" prop="path">
|
<el-form-item label="路由路径" prop="router">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="newFormInline.path"
|
v-model="newFormInline.router"
|
||||||
clearable
|
clearable
|
||||||
placeholder="请输入路由路径"
|
placeholder="请输入路由路径"
|
||||||
/>
|
/>
|
||||||
@@ -222,9 +222,9 @@ defineExpose({ getRef });
|
|||||||
</re-col>
|
</re-col>
|
||||||
<re-col v-if="newFormInline.menuType === 3" :value="12" :xs="24" :sm="24">
|
<re-col v-if="newFormInline.menuType === 3" :value="12" :xs="24" :sm="24">
|
||||||
<!-- 按钮级别权限设置 -->
|
<!-- 按钮级别权限设置 -->
|
||||||
<el-form-item label="权限标识" prop="auths">
|
<el-form-item label="权限标识" prop="orderNum">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="newFormInline.auths"
|
v-model="newFormInline.orderNum"
|
||||||
clearable
|
clearable
|
||||||
placeholder="请输入权限标识"
|
placeholder="请输入权限标识"
|
||||||
/>
|
/>
|
||||||
@@ -268,11 +268,11 @@ defineExpose({ getRef });
|
|||||||
>
|
>
|
||||||
<el-form-item label="菜单">
|
<el-form-item label="菜单">
|
||||||
<Segmented
|
<Segmented
|
||||||
:modelValue="newFormInline.showLink ? 0 : 1"
|
:modelValue="newFormInline.isShow ? false : true"
|
||||||
:options="showLinkOptions"
|
:options="showLinkOptions"
|
||||||
@change="
|
@change="
|
||||||
({ option: { value } }) => {
|
({ option: { value } }) => {
|
||||||
newFormInline.showLink = value;
|
newFormInline.isShow = value;
|
||||||
}
|
}
|
||||||
"
|
"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ const {
|
|||||||
>
|
>
|
||||||
<el-form-item label="菜单名称:" prop="title">
|
<el-form-item label="菜单名称:" prop="title">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="form.title"
|
v-model="form.menuName"
|
||||||
placeholder="请输入菜单名称"
|
placeholder="请输入菜单名称"
|
||||||
clearable
|
clearable
|
||||||
class="!w-[180px]"
|
class="!w-[180px]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import editForm from "../form.vue";
|
import editForm from "../form.vue";
|
||||||
import { handleTree } from "@/utils/tree";
|
import { handleTree } from "@/utils/tree";
|
||||||
import { message } from "@/utils/message";
|
import { message } from "@/utils/message";
|
||||||
import { getMenuList } from "@/api/system";
|
import { getListMenu } from "@/api/system/menu";
|
||||||
import { transformI18n } from "@/plugins/i18n";
|
import { transformI18n } from "@/plugins/i18n";
|
||||||
import { addDialog } from "@/components/ReDialog";
|
import { addDialog } from "@/components/ReDialog";
|
||||||
import { reactive, ref, onMounted, h } from "vue";
|
import { reactive, ref, onMounted, h } from "vue";
|
||||||
@@ -11,7 +11,7 @@ import { cloneDeep, isAllEmpty, deviceDetection } from "@pureadmin/utils";
|
|||||||
|
|
||||||
export function useMenu() {
|
export function useMenu() {
|
||||||
const form = reactive({
|
const form = reactive({
|
||||||
title: ""
|
menuName: ""
|
||||||
});
|
});
|
||||||
|
|
||||||
const formRef = ref();
|
const formRef = ref();
|
||||||
@@ -34,7 +34,7 @@ export function useMenu() {
|
|||||||
const columns: TableColumnList = [
|
const columns: TableColumnList = [
|
||||||
{
|
{
|
||||||
label: "菜单名称",
|
label: "菜单名称",
|
||||||
prop: "title",
|
prop: "menuName",
|
||||||
align: "left",
|
align: "left",
|
||||||
cellRenderer: ({ row }) => (
|
cellRenderer: ({ row }) => (
|
||||||
<>
|
<>
|
||||||
@@ -43,7 +43,7 @@ export function useMenu() {
|
|||||||
style: { paddingTop: "1px" }
|
style: { paddingTop: "1px" }
|
||||||
})}
|
})}
|
||||||
</span>
|
</span>
|
||||||
<span>{transformI18n(row.title)}</span>
|
<span>{transformI18n(row.menuName)}</span>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
@@ -63,7 +63,7 @@ export function useMenu() {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "路由路径",
|
label: "路由路径",
|
||||||
prop: "path"
|
prop: "router"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "组件路径",
|
label: "组件路径",
|
||||||
@@ -73,17 +73,17 @@ export function useMenu() {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "权限标识",
|
label: "权限标识",
|
||||||
prop: "auths"
|
prop: "permissionCode"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "排序",
|
label: "排序",
|
||||||
prop: "rank",
|
prop: "orderNum",
|
||||||
width: 100
|
width: 100
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "隐藏",
|
label: "显示",
|
||||||
prop: "showLink",
|
prop: "isShow",
|
||||||
formatter: ({ showLink }) => (showLink ? "否" : "是"),
|
formatter: ({ isShow }) => (isShow ? "否" : "是"),
|
||||||
width: 100
|
width: 100
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -106,18 +106,16 @@ export function useMenu() {
|
|||||||
|
|
||||||
async function onSearch() {
|
async function onSearch() {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
const { data } = await getMenuList(); // 这里是返回一维数组结构,前端自行处理成树结构,返回格式要求:唯一id加父节点parentId,parentId取父节点id
|
const data = (await getListMenu(form)).data.items; // 这里是返回一维数组结构,前端自行处理成树结构,返回格式要求:唯一id加父节点parentId,parentId取父节点id
|
||||||
let newData = data;
|
let newData = data;
|
||||||
if (!isAllEmpty(form.title)) {
|
if (!isAllEmpty(form.menuName)) {
|
||||||
// 前端搜索菜单名称
|
// 前端搜索菜单名称
|
||||||
newData = newData.filter(item =>
|
newData = newData.filter(item =>
|
||||||
transformI18n(item.title).includes(form.title)
|
transformI18n(item.title).includes(form.menuName)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
dataList.value = handleTree(newData); // 处理成树结构
|
dataList.value = handleTree(newData); // 处理成树结构
|
||||||
setTimeout(() => {
|
loading.value = false;
|
||||||
loading.value = false;
|
|
||||||
}, 500);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatHigherMenuOptions(treeList) {
|
function formatHigherMenuOptions(treeList) {
|
||||||
@@ -139,24 +137,24 @@ export function useMenu() {
|
|||||||
menuType: row?.menuType ?? 0,
|
menuType: row?.menuType ?? 0,
|
||||||
higherMenuOptions: formatHigherMenuOptions(cloneDeep(dataList.value)),
|
higherMenuOptions: formatHigherMenuOptions(cloneDeep(dataList.value)),
|
||||||
parentId: row?.parentId ?? 0,
|
parentId: row?.parentId ?? 0,
|
||||||
title: row?.title ?? "",
|
title: row?.menuName ?? "",
|
||||||
name: row?.name ?? "",
|
name: row?.name ?? "",
|
||||||
path: row?.path ?? "",
|
router: row?.router ?? "",
|
||||||
component: row?.component ?? "",
|
component: row?.component ?? "",
|
||||||
rank: row?.rank ?? 99,
|
orderNum: row?.orderNum ?? 99,
|
||||||
redirect: row?.redirect ?? "",
|
redirect: row?.redirect ?? "",
|
||||||
icon: row?.icon ?? "",
|
icon: row?.icon ?? "",
|
||||||
extraIcon: row?.extraIcon ?? "",
|
extraIcon: row?.extraIcon ?? "",
|
||||||
enterTransition: row?.enterTransition ?? "",
|
enterTransition: row?.enterTransition ?? "",
|
||||||
leaveTransition: row?.leaveTransition ?? "",
|
leaveTransition: row?.leaveTransition ?? "",
|
||||||
activePath: row?.activePath ?? "",
|
activePath: row?.activePath ?? "",
|
||||||
auths: row?.auths ?? "",
|
permissionCode: row?.permissionCode ?? "",
|
||||||
frameSrc: row?.frameSrc ?? "",
|
frameSrc: row?.frameSrc ?? "",
|
||||||
frameLoading: row?.frameLoading ?? true,
|
frameLoading: row?.frameLoading ?? true,
|
||||||
keepAlive: row?.keepAlive ?? false,
|
keepAlive: row?.keepAlive ?? false,
|
||||||
hiddenTag: row?.hiddenTag ?? false,
|
hiddenTag: row?.hiddenTag ?? false,
|
||||||
fixedTag: row?.fixedTag ?? false,
|
fixedTag: row?.fixedTag ?? false,
|
||||||
showLink: row?.showLink ?? true,
|
showLink: row?.isShow ?? true,
|
||||||
showParent: row?.showParent ?? false
|
showParent: row?.showParent ?? false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -171,7 +169,7 @@ export function useMenu() {
|
|||||||
const curData = options.props.formInline as FormItemProps;
|
const curData = options.props.formInline as FormItemProps;
|
||||||
function chores() {
|
function chores() {
|
||||||
message(
|
message(
|
||||||
`您${title}了菜单名称为${transformI18n(curData.title)}的这条数据`,
|
`您${title}了菜单名称为${transformI18n(curData.menuName)}的这条数据`,
|
||||||
{
|
{
|
||||||
type: "success"
|
type: "success"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,10 @@ import type { FormRules } from "element-plus";
|
|||||||
|
|
||||||
/** 自定义表单规则校验 */
|
/** 自定义表单规则校验 */
|
||||||
export const formRules = reactive(<FormRules>{
|
export const formRules = reactive(<FormRules>{
|
||||||
title: [{ required: true, message: "菜单名称为必填项", trigger: "blur" }],
|
menuName: [{ required: true, message: "菜单名称为必填项", trigger: "blur" }],
|
||||||
name: [{ required: true, message: "路由名称为必填项", trigger: "blur" }],
|
name: [{ required: true, message: "路由名称为必填项", trigger: "blur" }],
|
||||||
path: [{ required: true, message: "路由路径为必填项", trigger: "blur" }],
|
router: [{ required: true, message: "路由路径为必填项", trigger: "blur" }],
|
||||||
auths: [{ required: true, message: "权限标识为必填项", trigger: "blur" }]
|
permissionCode: [
|
||||||
|
{ required: true, message: "权限标识为必填项", trigger: "blur" }
|
||||||
|
]
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,24 +3,24 @@ interface FormItemProps {
|
|||||||
menuType: number;
|
menuType: number;
|
||||||
higherMenuOptions: Record<string, unknown>[];
|
higherMenuOptions: Record<string, unknown>[];
|
||||||
parentId: number;
|
parentId: number;
|
||||||
title: string;
|
menuName: string;
|
||||||
name: string;
|
name: string;
|
||||||
path: string;
|
router: string;
|
||||||
component: string;
|
component: string;
|
||||||
rank: number;
|
orderNum: number;
|
||||||
redirect: string;
|
redirect: string;
|
||||||
icon: string;
|
icon: string;
|
||||||
extraIcon: string;
|
extraIcon: string;
|
||||||
enterTransition: string;
|
enterTransition: string;
|
||||||
leaveTransition: string;
|
leaveTransition: string;
|
||||||
activePath: string;
|
activePath: string;
|
||||||
auths: string;
|
permissionCode: string;
|
||||||
frameSrc: string;
|
frameSrc: string;
|
||||||
frameLoading: boolean;
|
frameLoading: boolean;
|
||||||
keepAlive: boolean;
|
keepAlive: boolean;
|
||||||
hiddenTag: boolean;
|
hiddenTag: boolean;
|
||||||
fixedTag: boolean;
|
fixedTag: boolean;
|
||||||
showLink: boolean;
|
isShow: boolean;
|
||||||
showParent: boolean;
|
showParent: boolean;
|
||||||
}
|
}
|
||||||
interface FormProps {
|
interface FormProps {
|
||||||
|
|||||||
Reference in New Issue
Block a user