You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

288 lines
8.7 KiB
Vue

2 years ago
<template>
<!--
* titlelayout 侧边栏
-->
<div class="p-layout-aside g_flex_column_between" :class="state.collapsed ? 'g_w_80' : 'g_w_199'">
<!-- 顶部logo -->
2 years ago
<div class="m-logo g_flex_row_start_c g_cursor_point g_flex_none g_pl_24" @click="goHome">
2 years ago
<div class="logo-box g_mr_2">
<img src="../assets/image/logo.svg" alt class="img" />
</div>
<div class="g_flex_column_center g_fs_16 g_fw_600" v-if="!state.collapsed"></div>
</div>
<!-- 中间菜单 -->
<div class="m-menu g_clear_scroll g_flex_1">
<a-menu v-model:selectedKeys="state.selectedKeys" v-model:open-keys="state.openKeys" mode="inline" :items="items" @click="onOpenClick" :inline-collapsed="state.collapsed"></a-menu>
</div>
<!-- 底部折叠按钮 -->
<div class="m-toggle g_flex_none g_border_top_e g_flex_column_center g_h_48" :class="!state.collapsed ? 'g_flex_row_start g_ml_0' : 'g_flex_row_center'" v-show="items.length > 0">
<div class="btn g_cursor_point g_flex_c" @click="toggleCollapsed">
<MenuUnfoldOutlined v-if="state.collapsed" />
<MenuFoldOutlined v-else />
</div>
</div>
</div>
</template>
<script setup>
import { createFromIconfontCN } from "@ant-design/icons-vue";
// import { menuApi } from "../api/menu";
import { h, reactive, onMounted, ref, watch } from "vue";
import { TagsOutlined, HomeOutlined, ShoppingOutlined,MessageOutlined,FileProtectOutlined, VideoCameraOutlined,UserOutlined,UsergroupAddOutlined, ApartmentOutlined, TeamOutlined, ContainerOutlined, AccountBookOutlined, BarChartOutlined, MailOutlined, SettingOutlined, AuditOutlined, SketchOutlined, MenuUnfoldOutlined, MenuFoldOutlined, SolutionOutlined } from "@ant-design/icons-vue";
2 years ago
import { useStore } from "../stores/counter.ts";
import { useRouter, useRoute } from "vue-router";
import { mockMenuList } from "../utils/mock.js";
const storeJS = useStore();
const router = useRouter();
const route = useRoute();
function getItem(label, url, key, icon, children, type) {
return {
key,
url,
icon,
children,
label,
type,
};
}
const menuList = ref([]);
const items = reactive([]);
onMounted(() => {
state.rootSubmenuKeys = [];
// menuApi().then((data) => {})
// console.log('原始数据:',data.data.menus);
console.log("菜单mock", mockMenuList.menus);
menuList.value = mockMenuList.menus;
menuList.value.forEach((item, index) => {
state.rootSubmenuKeys.push("sub_menu_" + item.id + "_$$_not_set_key");
if (item.childrenList.length > 0) {
let childrens = reactive([]);
for (var i = 0; i != item.childrenList.length; ++i) {
childrens.push(getItem(item.childrenList[i].title, item.id, item.childrenList[i].component));
}
switch (item.menuName) {
case "JobManagement":
items.push(getItem(item.title, item.id, item.component, () => h(ShoppingOutlined), childrens));
break;
case "NotesManagement":
items.push(getItem(item.title, item.id, item.component, () => h(SolutionOutlined), childrens));
break;
case "upstreamAnddownstream":
items.push(getItem(item.title, item.id, item.component, () => h(ApartmentOutlined), childrens));
break;
case "TownsmanManagement":
items.push(getItem(item.title, item.id, item.component, () => h(UserOutlined), childrens));
break;
case "AgencyManagement":
items.push(getItem(item.title, item.id, item.component, () => h(ApartmentOutlined), childrens));
break;
case "teammanagement":
items.push(getItem(item.title, item.id, item.component, () => h(TeamOutlined), childrens));
break;
case "OrderManagement":
items.push(getItem(item.title, item.id, item.component, () => h(ContainerOutlined), childrens));
break;
case "BillCenter":
items.push(getItem(item.title, item.id, item.component, () => h(AccountBookOutlined), childrens));
break;
case "group":
items.push(getItem(item.title, item.id, item.component, () => h(BarChartOutlined), childrens));
break;
case "container":
items.push(getItem(item.title, item.id, item.component, () => h(MailOutlined), childrens));
break;
case "GlobalConfig":
items.push(getItem(item.title, item.id, item.component, () => h(SettingOutlined), childrens));
break;
case "FirmConfig":
items.push(getItem(item.title, item.id, item.component, () => h(AuditOutlined), childrens));
break;
// case 'TagManagement':
// items.push(getItem(item.title, item.id, item.component, () => h(TagsOutlined), childrens))
// break
// case "ServiceMarket":
// items.push(getItem(item.title,item.id, item.component, () => h(AuditOutlined), childrens));
// break;
default:
break;
}
} else {
switch (item.menuName) {
case "HomePage":
2 years ago
items.push(getItem(item.title, item.id, item.component, () => h(UsergroupAddOutlined)));
2 years ago
break;
2 years ago
case "projectData":
2 years ago
items.push(getItem(item.title, item.id, item.component, () => h(FileProtectOutlined)));
2 years ago
break;
case "personData":
2 years ago
items.push(getItem(item.title, item.id, item.component, () => h(UserOutlined)));
2 years ago
break;
case "message":
2 years ago
items.push(getItem(item.title, item.id, item.component, () => h(MessageOutlined)));
2 years ago
break;
case "record":
items.push(getItem(item.title, item.id, item.component, () => h(VideoCameraOutlined)));
break;
2 years ago
case "ServiceMarket":
items.push(getItem(item.title, item.id, item.component, () => h(SketchOutlined)));
break;
default:
break;
}
}
});
getInit(route);
});
watch(route, (val) => {
getInit(val);
});
const getInit = ($data) => {
let _index = -1,
_path = $data.path;
/*
* 二级页面来源view/components/breadcrumb.vue
*/
console.log("侧边栏:", $data);
switch (_path) {
case "/merchantManagement/roleManagementDetail":
_path = "/merchantManagement/roleManagement";
break;
case "/merchantManagement/billDetail":
_path = "/merchantManagement/mineBill";
break;
case "/merchantManagement/shareJobDetail":
if ($data.query.form == "joblist") {
_path = "/merchantManagement/jobList";
} else {
_path = "/merchantManagement/shareJob";
}
break;
case "/merchantManagement/jobDetail":
_path = "/merchantManagement/jobList";
break;
case "/merchantManagement/recordJob":
_path = "/merchantManagement/jobList";
break;
case "/merchantManagement/jobForm":
_path = "/merchantManagement/jobList";
break;
case "/merchantManagement/upstreamDetail":
_path = "/merchantManagement/upstream";
break;
case "/merchantManagement/downstreamDetail":
_path = "/merchantManagement/downstream";
break;
case "/merchantManagement/recruit":
_path = "/merchantManagement/miniProgramList";
break;
default:
break;
}
/* 侧边栏存在页面处理 */
items.forEach((item, index) => {
if (item.children) {
// 多级
item.children.forEach((itm, inx) => {
if (itm.key == _path + ".vue") {
_index = index + "-" + inx;
}
});
} else {
// 一级
if (item.key == _path + ".vue") {
_index = index;
}
}
});
// 匹配
if (_index > -1 || _index) {
if (typeof _index == "number") {
// 一级
state.selectedKeys = [_path + ".vue"];
state.openKeys = [_path + ".vue"];
}
if (typeof _index == "string") {
// 多级
let _father = 0,
_son = 0;
_father = Number(_index.split("-")[0]);
_son = Number(_index.split("-")[1]);
if (items[_father].children) {
state.selectedKeys = [items[_father].children[_son].key];
state.openKeys = ["sub_menu_" + _father + "_$$_not_set_key"];
}
}
}
};
const state = reactive({
collapsed: false,
rootSubmenuKeys: [],
openKeys: [],
selectedKeys: [],
});
const onOpenClick = (openKeys) => {
router.push({ path: openKeys.key.slice(0, -4) });
state.openKeys = [openKeys.keyPath[0]];
console.log([openKeys.keyPath[0]]);
};
const goHome = () => {
router.push("/merchantManagement/homePage");
};
const toggleCollapsed = () => {
state.collapsed = !state.collapsed;
storeJS.$state.layoutData.isToggle = state.collapsed;
};
</script>
<style lang="less" scoped>
.anticon:before {
display: block !important;
}
.p-layout-aside {
height: 100vh;
border-right: 1px solid #eee;
.m-logo {
border-bottom: 1px solid #eee;
height: 56px;
.logo-box {
.img {
width: 30px;
height: auto;
}
}
}
.m-menu {
max-height: calc(100vh - 104px);
overflow-y: auto;
}
.m-toggle {
padding: 2px;
.btn {
width: 58px;
height: calc(100% - 0px);
padding-left: 16px;
padding-right: 16px;
color: #333;
border-radius: 8px;
margin-left: 2px;
i,
svg {
font-size: 18px;
}
&:hover {
color: #1677ff;
background-color: rgba(0, 0, 0, 0.06);
}
}
}
}
/deep/ .ant-menu-light.ant-menu-root.ant-menu-inline {
border-inline-end: 1px solid transparent;
}
</style>