feat:新增菜单、部门页面

This commit is contained in:
chenchun
2024-09-02 18:16:07 +08:00
parent b648f09f16
commit bc83362b35
6 changed files with 46 additions and 46 deletions

View File

@@ -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}`, {});
}; };
/** 新增菜单 */ /** 新增菜单 */

View File

@@ -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;
} }
" "
/> />

View File

@@ -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]"

View File

@@ -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加父节点parentIdparentId取父节点id const data = (await getListMenu(form)).data.items; // 这里是返回一维数组结构前端自行处理成树结构返回格式要求唯一id加父节点parentIdparentId取父节点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"
} }

View File

@@ -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" }
]
}); });

View File

@@ -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 {