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) {
...@@ -25,11 +25,15 @@ const BasicLayout = { ...@@ -25,11 +25,15 @@ const BasicLayout = {
} }
const result = { const result = {
...item, ...item,
locale locale,
}; };
if (!item.leaf) { if (!item.leaf) {
const menus = this.formatter(item.children, `${parentPath}${item.path}/`, locale); const menus = this.formatter(
item.children,
`${parentPath}${item.path}/`,
locale
);
// Reduce memory usage // Reduce memory usage
result.menus = menus; result.menus = menus;
} }
...@@ -46,8 +50,8 @@ const BasicLayout = { ...@@ -46,8 +50,8 @@ const BasicLayout = {
*/ */
getBreadcrumbNameMap() { getBreadcrumbNameMap() {
const routerMap = {}; const routerMap = {};
const mergeMenuAndRouter = data => { const mergeMenuAndRouter = (data) => {
data.forEach(menuItem => { data.forEach((menuItem) => {
if (menuItem.menus) { if (menuItem.menus) {
mergeMenuAndRouter(menuItem.menus); mergeMenuAndRouter(menuItem.menus);
} }
...@@ -60,8 +64,8 @@ const BasicLayout = { ...@@ -60,8 +64,8 @@ const BasicLayout = {
}, },
matchParamsPath(pathname) { matchParamsPath(pathname) {
const breadcrumbNameMap = this.getBreadcrumbNameMap() const breadcrumbNameMap = this.getBreadcrumbNameMap();
const pathKey = Object.keys(breadcrumbNameMap).find(key => const pathKey = Object.keys(breadcrumbNameMap).find((key) =>
pathToRegexp(key).test(pathname) pathToRegexp(key).test(pathname)
); );
return breadcrumbNameMap[pathKey]; return breadcrumbNameMap[pathKey];
...@@ -72,75 +76,87 @@ const BasicLayout = { ...@@ -72,75 +76,87 @@ const BasicLayout = {
if (!currRouterData) { if (!currRouterData) {
return this.settings.leftMenuTitle; return this.settings.leftMenuTitle;
} }
const message = this.$t(currRouterData.locale || currRouterData.name) const message = this.$t(currRouterData.locale || currRouterData.name);
return `${message} - ${this.settings.leftMenuTitle}`; return `${message} - ${this.settings.leftMenuTitle}`;
}, },
onResizeCollapsed() { onResizeCollapsed() {
if (window.innerWidth <= 900) { if (window.innerWidth <= 900) {
this.$store.commit('global/UpdateChangeLayoutCollapsed', true) this.$store.commit("global/UpdateChangeLayoutCollapsed", true);
} else { } else {
this.$store.commit('global/UpdateChangeLayoutCollapsed', false) this.$store.commit("global/UpdateChangeLayoutCollapsed", false);
}
} }
}, },
},
computed: { computed: {
...mapGetters({ ...mapGetters({
collapsed: "global/getChangeLayoutCollapsed", collapsed: "global/getChangeLayoutCollapsed",
settings: "global/settings", settings: "global/settings",
menuNav: "global/nav/getMenuNav" menuNav: "global/nav/getMenuNav",
}), }),
getContentStyle() { getContentStyle() {
return { return {
margin: '24px 24px 0', margin: "24px 24px 0",
paddingTop: this.settings.fixedHeader ? 64 : 0, paddingTop: this.settings.fixedHeader ? 64 : 0,
} };
},
getSiderShadow() {
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;`;
}, },
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
next(vm => { next((vm) => {
// 通过 `vm` 访问组件实例 // 通过 `vm` 访问组件实例
document.title = vm.getPageTitle(to.path) document.title = vm.getPageTitle(to.path);
}) });
}, },
beforeRouteUpdate(to, from, next) { beforeRouteUpdate(to, from, next) {
this.$store.commit('global/UpdateBasicLayoutSpinning', true) this.$store.commit("global/UpdateBasicLayoutSpinning", true);
document.title = this.getPageTitle(to.path) document.title = this.getPageTitle(to.path);
this.$nextTick(() => { this.$nextTick(() => {
next(); next();
}) });
}, },
mounted() { mounted() {
this.$store.dispatch('global/nav/getMenuNav'); this.$store.dispatch("global/nav/getMenuNav");
this.onResizeCollapsed() this.onResizeCollapsed();
window.onresize = () => { window.onresize = () => {
// 通过捕获系统的onresize事件触发我们需要执行的事件 // 通过捕获系统的onresize事件触发我们需要执行的事件
this.onResizeCollapsed() this.onResizeCollapsed();
} };
}, },
render() { render() {
const { collapsed, getContentStyle, logo } = this; const { collapsed, getContentStyle, logo } = this;
const { layout } = this.settings; const { layout, fixedHeader, fixSiderbar } = this.settings;
const isTop = layout === 'topmenu'; const isTop = layout === "topmenu";
const isMobile = false; const isMobile = false;
const menuData = this.getMenuData(); const menuData = this.getMenuData();
eventBus.breadcrumbNameMap = this.getBreadcrumbNameMap() eventBus.breadcrumbNameMap = this.getBreadcrumbNameMap();
return ( return (
<Layout class="ai-basic-layout-container"> <Layout class="ai-basic-layout-container">
{isTop && !isMobile ? null : ( {isTop && !isMobile ? null : (
<SiderMenu collapsed={collapsed} menuData={menuData} logo={logo}/> <SiderMenu
collapsed={collapsed}
fixSiderbar={fixSiderbar}
menuData={menuData}
logo={logo}
/>
)} )}
{fixSiderbar ? <div style={this.getSiderShadow}></div> : null}
<Layout> <Layout>
<Header menuData={menuData} logo={logo}/> <Header menuData={menuData} logo={logo} />
<div v-show={fixedHeader} style={{ width: "100%", height: "64px" }} />
<Layout.Content style={getContentStyle}> <Layout.Content style={getContentStyle}>
<router-view /> <router-view />
</Layout.Content> </Layout.Content>
<Footer /> <Footer />
</Layout> </Layout>
</Layout> </Layout>
) );
} },
} };
export default BasicLayout export default BasicLayout;
\ No newline at end of file
...@@ -27,12 +27,11 @@ const HeaderView = { ...@@ -27,12 +27,11 @@ 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
...@@ -64,8 +63,6 @@ const HeaderView = { ...@@ -64,8 +63,6 @@ const HeaderView = {
<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