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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<!--
* titlelayout 侧边栏
-->
<div class="p-layout-aside g_flex_column_between" :class="state.collapsed ? 'g_w_80' : 'g_w_199'">
<!-- 顶部logo -->
<div class="m-logo g_flex_row_start_c g_cursor_point g_flex_none g_pl_24" @click="goHome">
<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";
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":
items.push(getItem(item.title, item.id, item.component, () => h(UsergroupAddOutlined)));
break;
case "projectData":
items.push(getItem(item.title, item.id, item.component, () => h(FileProtectOutlined)));
break;
case "personData":
items.push(getItem(item.title, item.id, item.component, () => h(UserOutlined)));
break;
case "message":
items.push(getItem(item.title, item.id, item.component, () => h(MessageOutlined)));
break;
case "record":
items.push(getItem(item.title, item.id, item.component, () => h(VideoCameraOutlined)));
break;
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>