Commit 5237c65e authored by wanli's avatar wanli

🐞 fix(前端布局bug): 修复前端布局bug

parent 7807af36
...@@ -50,7 +50,7 @@ const SettingDrawer = { ...@@ -50,7 +50,7 @@ const SettingDrawer = {
nextState.config = true; nextState.config = true;
this.$store.commit('global/UpdateDefaultSettings', this.settings); this.$store.commit('global/UpdateDefaultSettings', this.settings);
this.$store.commit('global/UpdateDefaultSettings', nextState); this.$store.commit('global/UpdateDefaultSettings', nextState);
message.loading("正在编译主题!", 3); message.loading("正在编译主题!", 1.5);
this.$store.dispatch("global/defaultSettings", true); this.$store.dispatch("global/defaultSettings", true);
}, },
...@@ -63,7 +63,8 @@ const SettingDrawer = { ...@@ -63,7 +63,8 @@ const SettingDrawer = {
}, },
render() { render() {
const { collapse } = this; const { collapse } = this;
const { primaryColor, layout, navTheme } = this.settings; const { primaryColor, layout, navTheme, contentWidth, fixedHeader, fixSiderbar, autoHideHeader } = this.settings;
return ( return (
<Drawer <Drawer
title="界面设置" title="界面设置"
...@@ -135,7 +136,7 @@ const SettingDrawer = { ...@@ -135,7 +136,7 @@ const SettingDrawer = {
<h3 class="setting-title">其它设置</h3> <h3 class="setting-title">其它设置</h3>
<div class="setting-item"> <div class="setting-item">
<p>内容区域宽度</p> <p>内容区域宽度</p>
<a-radio-group size="small" default-value="Fluid" button-style="solid" onChange={(e) => { <a-radio-group value={contentWidth} size="small" default-value="Fluid" button-style="solid" onChange={(e) => {
this.changeSetting("contentWidth", e.target.value); this.changeSetting("contentWidth", e.target.value);
}}> }}>
<a-radio-button value="Fluid"> <a-radio-button value="Fluid">
...@@ -148,19 +149,19 @@ const SettingDrawer = { ...@@ -148,19 +149,19 @@ const SettingDrawer = {
</div> </div>
<div class="setting-item"> <div class="setting-item">
<p>固定HEADER</p> <p>固定HEADER</p>
<a-switch size="small" default-checked onChange={(e) => { <a-switch checked={fixedHeader} size="small" onChange={(e) => {
this.changeSetting("fixedHeader", e); this.changeSetting("fixedHeader", e);
}} /> }} />
</div> </div>
<div class="setting-item"> <div class="setting-item">
<p>自动隐藏HEADER</p> <p>自动隐藏HEADER</p>
<a-switch size="small" default-checked onChange={(e) => { <a-switch checked={autoHideHeader} size="small" onChange={(e) => {
this.changeSetting("autoHideHeader", e); this.changeSetting("autoHideHeader", e);
}} /> }} />
</div> </div>
<div class="setting-item"> <div class="setting-item">
<p>固定侧边栏</p> <p>固定侧边栏</p>
<a-switch size="small" default-checked onChange={(e) => { <a-switch checked={fixSiderbar} size="small" onChange={(e) => {
this.changeSetting("fixSiderbar", e); this.changeSetting("fixSiderbar", e);
}} /> }} />
</div> </div>
......
<template> <template>
<a-layout-sider v-model="collapsed" width="256" :class="`ai-sider-menu sider ${fixSiderbar?'fixSiderbar':'',settings.navTheme==='light'?'light':'dark'}`" :theme="settings.navTheme"> <a-layout-sider
v-model="collapsed"
width="256"
:class="[
'ai-sider-menu sider',
fixSiderbar ? 'fixSiderbar' : '',
settings.navTheme === 'light' ? 'light' : 'dark',
]"
:theme="settings.navTheme"
>
<div class="logo" key="logo" id="logo"> <div class="logo" key="logo" id="logo">
<router-link to="/"> <router-link to="/">
<img :src="logo" alt="logo" /> <img :src="logo" alt="logo" />
<h1>{{ settings.leftMenuTitle }}</h1> <h1>{{ settings.leftMenuTitle }}</h1>
</router-link> </router-link>
</div> </div>
<a-base-menu :collapsed="collapsed" :menuData="menuData" :theme="settings.navTheme" :layout="settings.layout" styles="padding: '16px 0'; width: '100%'"/> <a-base-menu
:collapsed="collapsed"
:menuData="menuData"
:theme="settings.navTheme"
:layout="settings.layout"
styles="padding: '16px 0'; width: '100%'"
/>
</a-layout-sider> </a-layout-sider>
</template> </template>
...@@ -18,26 +33,32 @@ export default { ...@@ -18,26 +33,32 @@ export default {
props: { props: {
collapsed: { collapsed: {
default: false, default: false,
type: Boolean type: Boolean,
}, },
fixSiderbar: { fixSiderbar: {
default: false, default: false,
type: Boolean type: Boolean,
}, },
menuData: { menuData: {
default: () => [], default: () => [],
type: Array type: Array,
}, },
logo: { type: String } logo: { type: String },
}, },
computed: { computed: {
...mapGetters({ ...mapGetters({
settings: "global/settings" settings: "global/settings",
}) }),
siderStyle() {
let width = 256;
if (this.collapsed) width = 80;
return `width: ${width}px; min-width: ${width}px; max-width: ${width}px;transition: all 0.2s;background: #001529;`;
},
}, },
components: { components: {
ALayoutSider: Layout.Sider, ALayoutSider: Layout.Sider,
ABaseMenu ABaseMenu,
}, },
}; };
</script> </script>
...@@ -35,6 +35,10 @@ ...@@ -35,6 +35,10 @@
z-index: 10; z-index: 10;
&.fixSiderbar { &.fixSiderbar {
position: fixed; position: fixed;
height: 100vh;
min-width: 100vh;
max-height: 100vh;
overflow-y: auto;
top: 0; top: 0;
left: 0; left: 0;
} }
......
/* /*
* @Author: your name * @Author: your name
* @Date: 2021-07-15 09:33:39 * @Date: 2021-07-15 09:33:39
* @LastEditTime: 2021-07-23 10:58:39 * @LastEditTime: 2021-07-23 15:56:21
* @LastEditors: Please set LastEditors * @LastEditors: Please set LastEditors
* @Description: In User Settings Edit * @Description: In User Settings Edit
* @FilePath: \evm-store\tools\frontend\src\defaultSettings.js * @FilePath: \evm-store\tools\frontend\src\defaultSettings.js
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
export default { export default {
navTheme: 'dark', // theme for nav menu navTheme: 'dark', // theme for nav menu
primaryColor: '#1890FF', // primary color of ant design primaryColor: '#1890FF', // primary color of ant design
layout: 'topmenu', // nav menu position: sidemenu or topmenu layout: 'sidemenu', // nav menu position: sidemenu or topmenu
contentWidth: 'Fluid', // layout of content: Fluid or Fixed, only works when layout is topmenu contentWidth: 'Fluid', // layout of content: Fluid or Fixed, only works when layout is topmenu
fixedHeader: true, // sticky header fixedHeader: true, // sticky header
autoHideHeader: false, // auto hide header autoHideHeader: false, // auto hide header
......
import './BasicLayout.less' import "./BasicLayout.less";
import { Layout } from "ant-design-vue"; import { Layout } from "ant-design-vue";
import pathToRegexp from 'path-to-regexp'; import pathToRegexp from "path-to-regexp";
import SiderMenu from "@/components/SiderMenu"; import SiderMenu from "@/components/SiderMenu";
import Header from './Header'; import Header from "./Header";
import Footer from './Footer'; import Footer from "./Footer";
import eventBus from '@/utils/eventBus.js' import eventBus from "@/utils/eventBus.js";
import logo from "@/assets/app-store.svg"; import logo from "@/assets/app-store.svg";
import { mapGetters } from "vuex"; import { mapGetters } from "vuex";
const BasicLayout = { const BasicLayout = {
data: () => ({ data: () => ({
layout: 'topmenu', layout: "topmenu",
logo logo,
}), }),
methods: { methods: {
formatter(data, parentPath = '', parentName) { formatter(data, parentPath = "", parentName) {
return data.map(item => { return data.map((item) => {
let locale = 'menu'; let locale = "menu";
if (parentName && item.name) { if (parentName && item.name) {
locale = `${parentName}.${item.name}`; locale = `${parentName}.${item.name}`;
} else if (item.name) { } else if (item.name) {
locale = `menu.${item.name}`; locale = `menu.${item.name}`;
} else if (parentName) { } else if (parentName) {
locale = parentName; locale = parentName;
} }
const result = { const result = {
...item, ...item,
locale locale,
}; };
if (!item.leaf) {
const menus = this.formatter(item.children, `${parentPath}${item.path}/`, locale);
// Reduce memory usage
result.menus = menus;
}
delete result.children;
return result;
});
},
getMenuData() {
return this.formatter(this.menuNav.data);
},
/**
* 获取面包屑映射
* @param {Object} menuData 菜单配置
*/
getBreadcrumbNameMap() {
const routerMap = {};
const mergeMenuAndRouter = data => {
data.forEach(menuItem => {
if (menuItem.menus) {
mergeMenuAndRouter(menuItem.menus);
}
// Reduce memory usage
routerMap[menuItem.path] = menuItem;
});
};
mergeMenuAndRouter(this.getMenuData());
return routerMap;
},
matchParamsPath(pathname) {
const breadcrumbNameMap = this.getBreadcrumbNameMap()
const pathKey = Object.keys(breadcrumbNameMap).find(key =>
pathToRegexp(key).test(pathname)
);
return breadcrumbNameMap[pathKey];
},
getPageTitle(pathname) { if (!item.leaf) {
const currRouterData = this.matchParamsPath(pathname); const menus = this.formatter(
if (!currRouterData) { item.children,
return this.settings.leftMenuTitle; `${parentPath}${item.path}/`,
} locale
const message = this.$t(currRouterData.locale || currRouterData.name) );
return `${message} - ${this.settings.leftMenuTitle}`; // Reduce memory usage
}, result.menus = menus;
onResizeCollapsed() {
if (window.innerWidth <= 900) {
this.$store.commit('global/UpdateChangeLayoutCollapsed', true)
} else {
this.$store.commit('global/UpdateChangeLayoutCollapsed', false)
}
} }
delete result.children;
return result;
});
}, },
computed: { getMenuData() {
...mapGetters({ return this.formatter(this.menuNav.data);
collapsed: "global/getChangeLayoutCollapsed",
settings: "global/settings",
menuNav: "global/nav/getMenuNav"
}),
getContentStyle() {
return {
margin: '24px 24px 0',
paddingTop: this.settings.fixedHeader ? 64 : 0,
}
},
}, },
beforeRouteEnter(to, from, next) { /**
next(vm => { * 获取面包屑映射
// 通过 `vm` 访问组件实例 * @param {Object} menuData 菜单配置
document.title = vm.getPageTitle(to.path) */
}) getBreadcrumbNameMap() {
const routerMap = {};
const mergeMenuAndRouter = (data) => {
data.forEach((menuItem) => {
if (menuItem.menus) {
mergeMenuAndRouter(menuItem.menus);
}
// Reduce memory usage
routerMap[menuItem.path] = menuItem;
});
};
mergeMenuAndRouter(this.getMenuData());
return routerMap;
}, },
beforeRouteUpdate(to, from, next) {
this.$store.commit('global/UpdateBasicLayoutSpinning', true) matchParamsPath(pathname) {
document.title = this.getPageTitle(to.path) const breadcrumbNameMap = this.getBreadcrumbNameMap();
this.$nextTick(() => { const pathKey = Object.keys(breadcrumbNameMap).find((key) =>
next(); pathToRegexp(key).test(pathname)
}) );
return breadcrumbNameMap[pathKey];
}, },
mounted() {
this.$store.dispatch('global/nav/getMenuNav');
this.onResizeCollapsed() getPageTitle(pathname) {
const currRouterData = this.matchParamsPath(pathname);
if (!currRouterData) {
return this.settings.leftMenuTitle;
}
const message = this.$t(currRouterData.locale || currRouterData.name);
return `${message} - ${this.settings.leftMenuTitle}`;
},
onResizeCollapsed() {
if (window.innerWidth <= 900) {
this.$store.commit("global/UpdateChangeLayoutCollapsed", true);
} else {
this.$store.commit("global/UpdateChangeLayoutCollapsed", false);
}
},
},
computed: {
...mapGetters({
collapsed: "global/getChangeLayoutCollapsed",
settings: "global/settings",
menuNav: "global/nav/getMenuNav",
}),
getContentStyle() {
return {
margin: "24px 24px 0",
paddingTop: this.settings.fixedHeader ? 64 : 0,
};
},
getSiderShadow() {
let width = 256;
if (this.collapsed) width = 80;
window.onresize = () => { return `width: ${width}px; min-width: ${width}px; max-width: ${width}px;transition: all 0.2s;background: #001529;`;
// 通过捕获系统的onresize事件触发我们需要执行的事件
this.onResizeCollapsed()
}
}, },
render() { },
const { collapsed, getContentStyle, logo } = this; beforeRouteEnter(to, from, next) {
const { layout } = this.settings; next((vm) => {
const isTop = layout === 'topmenu'; // 通过 `vm` 访问组件实例
const isMobile = false; document.title = vm.getPageTitle(to.path);
const menuData = this.getMenuData(); });
eventBus.breadcrumbNameMap = this.getBreadcrumbNameMap() },
return ( beforeRouteUpdate(to, from, next) {
<Layout class="ai-basic-layout-container"> this.$store.commit("global/UpdateBasicLayoutSpinning", true);
{isTop && !isMobile ? null : ( document.title = this.getPageTitle(to.path);
<SiderMenu collapsed={collapsed} menuData={menuData} logo={logo}/> this.$nextTick(() => {
)} next();
});
},
mounted() {
this.$store.dispatch("global/nav/getMenuNav");
this.onResizeCollapsed();
<Layout> window.onresize = () => {
<Header menuData={menuData} logo={logo}/> // 通过捕获系统的onresize事件触发我们需要执行的事件
<Layout.Content style={getContentStyle}> this.onResizeCollapsed();
<router-view /> };
</Layout.Content> },
<Footer /> render() {
</Layout> const { collapsed, getContentStyle, logo } = this;
</Layout> const { layout, fixedHeader, fixSiderbar } = this.settings;
) const isTop = layout === "topmenu";
} const isMobile = false;
} const menuData = this.getMenuData();
export default BasicLayout eventBus.breadcrumbNameMap = this.getBreadcrumbNameMap();
\ No newline at end of file return (
<Layout class="ai-basic-layout-container">
{isTop && !isMobile ? null : (
<SiderMenu
collapsed={collapsed}
fixSiderbar={fixSiderbar}
menuData={menuData}
logo={logo}
/>
)}
{fixSiderbar ? <div style={this.getSiderShadow}></div> : null}
<Layout>
<Header menuData={menuData} logo={logo} />
<div v-show={fixedHeader} style={{ width: "100%", height: "64px" }} />
<Layout.Content style={getContentStyle}>
<router-view />
</Layout.Content>
<Footer />
</Layout>
</Layout>
);
},
};
export default BasicLayout;
...@@ -27,45 +27,42 @@ const HeaderView = { ...@@ -27,45 +27,42 @@ const HeaderView = {
}, },
render() { render() {
const { menuData, logo } = this; const { menuData, logo } = this;
const { layout, navTheme, fixedHeader, leftMenuTitle } = this.settings; const { layout, navTheme, leftMenuTitle } = this.settings;
const isTop = layout === "topmenu"; const isTop = layout === "topmenu";
const isMobile = false; const isMobile = false;
return ( return (
<div> <Header style={this.headerStyle}>
<Header style={this.headerStyle}> {isTop && !isMobile ? (
{isTop && !isMobile ? ( // <TopNavHeader
// <TopNavHeader // theme={navTheme}
// theme={navTheme} // mode="horizontal"
// mode="horizontal" // Authorized={Authorized}
// Authorized={Authorized} // onCollapse={handleMenuCollapse}
// onCollapse={handleMenuCollapse} // onNoticeClear={this.handleNoticeClear}
// onNoticeClear={this.handleNoticeClear} // onMenuClick={this.handleMenuClick}
// onMenuClick={this.handleMenuClick} // onNoticeVisibleChange={this.handleNoticeVisibleChange}
// onNoticeVisibleChange={this.handleNoticeVisibleChange} // {...this.props}
// {...this.props} // />
// /> <TopNavHeader
<TopNavHeader theme={navTheme}
theme={navTheme} layout={layout}
layout={layout} mode="horizontal"
mode="horizontal" menuData={menuData}
menuData={menuData} logo={logo}
logo={logo} title={leftMenuTitle}
title={leftMenuTitle} />
/> ) : (
) : ( // <GlobalHeader
// <GlobalHeader // onCollapse={handleMenuCollapse}
// onCollapse={handleMenuCollapse} // onNoticeClear={this.handleNoticeClear}
// onNoticeClear={this.handleNoticeClear} // onMenuClick={this.handleMenuClick}
// onMenuClick={this.handleMenuClick} // onNoticeVisibleChange={this.handleNoticeVisibleChange}
// onNoticeVisibleChange={this.handleNoticeVisibleChange} // {...this.props}
// {...this.props} // />
// /> <GlobalHeader theme={navTheme} layout={layout} />
<GlobalHeader theme={navTheme} layout={layout} /> )}
)} </Header>
</Header>
<div v-show={fixedHeader} class="placeholder-element" />
</div>
); );
}, },
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment