修复生产环境下主题色修改功能失效的问题

页面结构可切换初步

样式名称修改
master
toesbieya 6 years ago
parent 4e8ec3a26d
commit 667c32fe42
  1. 2
      vue/src/component/form/Anchor/index.vue
  2. 13
      vue/src/component/menu/NavMenu/style.scss
  3. 2
      vue/src/globalMethod/Guide/utils.js
  4. 9
      vue/src/layout/component/Aside/OnePart/index.vue
  5. 9
      vue/src/layout/component/Aside/TwoPart/root.vue
  6. 30
      vue/src/layout/component/Header/Navbar/index.vue
  7. 10
      vue/src/layout/component/Header/index.vue
  8. 6
      vue/src/layout/component/Logo.vue
  9. 2
      vue/src/layout/component/Page/component/BackToTop.vue
  10. 97
      vue/src/layout/component/Page/index.vue
  11. 31
      vue/src/layout/component/Page/style.scss
  12. 34
      vue/src/layout/component/SettingDrawer.vue
  13. 48
      vue/src/layout/index.vue
  14. 3
      vue/src/layout/store/aside.js
  15. 4
      vue/src/layout/store/page.js
  16. 2
      vue/src/view/example/cool/fluidPage.vue
  17. 11
      vue/vue.config.js

@ -26,7 +26,7 @@ export default {
bounds: {type: Number, default: 0}, bounds: {type: Number, default: 0},
getContainer: { getContainer: {
type: Function, type: Function,
default: () => document.querySelector('#app .router-main>.scroll-container') default: () => document.querySelector('#app .page-main>.scroll-container')
}, },
}, },

@ -6,6 +6,19 @@
display: none; display: none;
} }
//hover时菜单左侧图标放大
.el-menu-item,
.el-submenu__title {
> .icon, > .el-tooltip > .icon {
transition: transform .1s;
}
&:hover > .icon,
&:hover > .el-tooltip > .icon {
transform: scale(1.2);
}
}
/*-------侧边栏垂直菜单开始---------*/ /*-------侧边栏垂直菜单开始---------*/
.el-menu--vertical.el-menu { .el-menu--vertical.el-menu {
overflow-y: auto; overflow-y: auto;

@ -32,7 +32,7 @@ export function getStyleProperty(element, propertyName, prefixVendor = false) {
} }
export function inMainPage(element) { export function inMainPage(element) {
const appView = document.querySelector('.router-main') const appView = document.querySelector('.page-main')
if (!appView) throw new Error('路由页面未加载') if (!appView) throw new Error('路由页面未加载')
return appView.contains(element) return appView.contains(element)
} }

@ -69,6 +69,11 @@ export default {
//true //true
return this.mouseOutside return this.mouseOutside
},
//logo
showLogo() {
return pageGetters.showLogo && (this.isMobile || pageGetters.position === 'left-right')
} }
}, },
@ -159,15 +164,13 @@ export default {
render() { render() {
if (this.menus.length <= 0) return if (this.menus.length <= 0) return
const showLogo = pageGetters.showLogo && pageGetters.logoPosition === 'aside'
const aside = ( const aside = (
<aside <aside
class={{'aside': true, 'sidebar': true, 'collapse': this.collapse}} class={{'aside': true, 'sidebar': true, 'collapse': this.collapse}}
on-mouseleave={() => this.mouseOutside = true} on-mouseleave={() => this.mouseOutside = true}
on-mouseenter={() => this.mouseOutside = false} on-mouseenter={() => this.mouseOutside = false}
> >
{showLogo && <logo show-title={!this.collapse}/>} {this.showLogo && <logo show-title={!this.collapse}/>}
<nav-menu <nav-menu
menus={this.menus} menus={this.menus}
collapse={this.collapse} collapse={this.collapse}

@ -52,6 +52,11 @@ export default {
computed: { computed: {
menus() { menus() {
return appGetters.menus.map(root => ({...root, children: undefined})) return appGetters.menus.map(root => ({...root, children: undefined}))
},
//logo
showLogo() {
return pageGetters.showLogo && pageGetters.position === 'left-right'
} }
}, },
@ -99,8 +104,6 @@ export default {
}, },
render() { render() {
const showLogo = pageGetters.showLogo && pageGetters.logoPosition === 'aside'
return ( return (
<div class="root-sidebar-container"> <div class="root-sidebar-container">
<div <div
@ -108,7 +111,7 @@ export default {
on-mouseleave={() => this.mouseOutside = true} on-mouseleave={() => this.mouseOutside = true}
on-mouseenter={() => this.mouseOutside = false} on-mouseenter={() => this.mouseOutside = false}
> >
{showLogo && <logo show-title={!this.mouseOutside}/>} {this.showLogo && <logo show-title={!this.mouseOutside}/>}
<ul class="el-menu el-menu--vertical"> <ul class="el-menu el-menu--vertical">
{this.menus.map(({fullPath, meta: {title, icon}}) => ( {this.menus.map(({fullPath, meta: {title, icon}}) => (
<item <item

@ -4,9 +4,11 @@ import GuideMixin from '@/mixin/guide'
import Bell from "./component/Bell" import Bell from "./component/Bell"
import Hamburger from './component/Hamburger' import Hamburger from './component/Hamburger'
import HeadMenu from "./component/HeadMenu" import HeadMenu from "./component/HeadMenu"
import Logo from "@/layout/component/Logo"
import SettingDrawer from '@/layout/component/SettingDrawer' import SettingDrawer from '@/layout/component/SettingDrawer'
import {getters as appGetters} from "@/layout/store/app" import {getters as appGetters} from "@/layout/store/app"
import {getters as asideGetters, mutations as asideMutations} from "@/layout/store/aside" import {getters as asideGetters, mutations as asideMutations} from "@/layout/store/aside"
import {getters as pageGetters} from "@/layout/store/page"
import {getSidebarMenus} from "@/layout/util" import {getSidebarMenus} from "@/layout/util"
import {elConfirm} from "@/util/message" import {elConfirm} from "@/util/message"
import {refreshPage} from "@/util/route" import {refreshPage} from "@/util/route"
@ -16,7 +18,7 @@ export default {
mixins: [GuideMixin.navbar], mixins: [GuideMixin.navbar],
components: {Hamburger, Bell, HeadMenu, SettingDrawer}, components: {Bell, Hamburger, HeadMenu, Logo, SettingDrawer},
data: () => ({settingDrawer: false}), data: () => ({settingDrawer: false}),
@ -38,6 +40,14 @@ export default {
} }
}, },
renderLogo() {
const render =
!appGetters.isMobile
&& pageGetters.showLogo
&& pageGetters.position === 'top-bottom'
if (render) return <logo show-title/>
},
renderHamburger() { renderHamburger() {
// //
// //
@ -107,7 +117,9 @@ export default {
render() { render() {
return ( return (
<nav class="navbar"> <nav class="navbar">
<div style="flex: 0.5"> {this.renderLogo()}
<div style="flex: 1">
{this.renderHamburger()} {this.renderHamburger()}
{this.renderHeadMenuMenu()} {this.renderHeadMenuMenu()}
</div> </div>
@ -133,7 +145,7 @@ export default {
align-items: center; align-items: center;
flex-wrap: nowrap; flex-wrap: nowrap;
height: $nav-height; height: $nav-height;
padding: 0 12px; padding-left: 12px;
transition: height .3s ease-in-out; transition: height .3s ease-in-out;
position: relative; position: relative;
z-index: 9; z-index: 9;
@ -163,6 +175,18 @@ export default {
} }
} }
.logo-container {
width: auto;
min-width: 192px;
padding-left: 0;
> .logo-link > h1 {
font-weight: 400;
color: #303133;
font-size: 16px;
}
}
.avatar-wrapper { .avatar-wrapper {
display: flex; display: flex;
align-items: center; align-items: center;

@ -4,15 +4,13 @@ import VNavbar from './Navbar'
import TagsView from './TagsView' import TagsView from './TagsView'
export default { export default {
name: "Header", functional: true,
components: {VNavbar, TagsView},
render() { render() {
return ( return (
<header class="header-container"> <header>
<v-navbar/> <VNavbar/>
{tagsViewGetters.enabled && <tags-view/>} {tagsViewGetters.enabled && <TagsView/>}
</header> </header>
) )
} }

@ -17,7 +17,7 @@ export default {
<div class={logoClass}> <div class={logoClass}>
<router-link class="logo-link" to="/"> <router-link class="logo-link" to="/">
<img src={`${process.env.BASE_URL}static/img/logo.svg`}/> <img src={`${process.env.BASE_URL}static/img/logo.svg`}/>
{showTitle && <h1 class="logo-title">{title}</h1>} {showTitle && <h1>{title}</h1>}
</router-link> </router-link>
</div> </div>
) )
@ -46,12 +46,12 @@ $logoSize: 30px;
height: $logoSize; height: $logoSize;
vertical-align: middle; vertical-align: middle;
& + .logo-title { & + h1 {
margin-left: 12px; margin-left: 12px;
} }
} }
.logo-title { > h1 {
display: inline-block; display: inline-block;
margin: 0; margin: 0;
color: #ffffff; color: #ffffff;

@ -4,7 +4,7 @@ export default {
render() { render() {
return ( return (
<el-backtop target=".router-main .scroll-container" visibility-height={400} bottom={66}> <el-backtop target=".page-main .scroll-container" visibility-height={400} bottom={66}>
<div class="back-to-top"> <div class="back-to-top">
<v-icon icon="el-icon-top"/> <v-icon icon="el-icon-top"/>
</div> </div>

@ -11,42 +11,45 @@ export default {
components: {BackToTop, PageHeader, PageView, PageFooter}, components: {BackToTop, PageHeader, PageView, PageFooter},
methods: { computed: {
renderPage() { renderPageHeader() {
const render = pageGetters.showPageHeader && this.$route.meta.pageHeader !== false return pageGetters.showPageHeader && this.$route.meta.pageHeader !== false
const className = {'scroll-container': true, 'has-page-header': render}
const {enabled, cachedViews, transitionName} = tagsViewGetters
return (
<div v-show={!pageGetters.showIframe} class={className}>
{render && <page-header/>}
<page-view include={cachedViews} transition-name={transitionName} cacheable={enabled}/>
<page-footer/>
</div>
)
}, },
renderIframe() { pageClass() {
const {showIframe, iframeList, currentIframe} = pageGetters return {'scroll-container': true, 'has-page-header': this.renderPageHeader}
return iframeList.map(src => (
<iframe
v-show={showIframe && src === currentIframe}
id={src}
key={src}
src={src}
frameborder="0"
height="100%"
width="100%"
/>
))
} }
}, },
render() { render() {
const {showIframe, iframeList, currentIframe} = pageGetters
const {cachedViews, transitionName, enabled} = tagsViewGetters
return ( return (
<main class="router-main"> <main class="page-main">
{this.renderPage()} <div v-show={!showIframe} class={this.pageClass}>
{this.renderIframe()} {this.renderPageHeader && <page-header/>}
<page-view
include={cachedViews}
transition-name={transitionName}
cacheable={enabled}
/>
<page-footer/>
</div>
{iframeList.map(src => (
<iframe
v-show={showIframe && src === currentIframe}
id={src}
key={src}
src={src}
frameborder="0"
height="100%"
width="100%"
/>
))}
{pageGetters.showBackToTop && <back-to-top/>} {pageGetters.showBackToTop && <back-to-top/>}
</main> </main>
) )
@ -54,4 +57,36 @@ export default {
} }
</script> </script>
<style lang="scss" src="./style.scss"></style> <style lang="scss">
@import "~@/asset/style/variables.scss";
.page-main {
position: relative;
flex: 1;
overflow: hidden;
background-color: #f0f2f5;
> .scroll-container {
height: 100%;
display: flex;
flex-direction: column;
overflow-y: overlay;
overflow-x: inherit;
> .page-view {
margin: $page-view-margin;
flex: 1;
}
}
.back-to-top {
height: 100%;
width: 100%;
background-color: #f2f5f6;
box-shadow: 0 0 6px rgba(0, 0, 0, .12);
text-align: center;
line-height: 40px;
color: #1989fa;
}
}
</style>

@ -1,31 +0,0 @@
@import "~@/asset/style/variables.scss";
.router-main {
position: relative;
flex: 1;
overflow: hidden;
background-color: #f0f2f5;
> .scroll-container {
height: 100%;
display: flex;
flex-direction: column;
overflow-y: overlay;
overflow-x: inherit;
> .page-view {
margin: $page-view-margin;
flex: 1;
}
}
.back-to-top {
height: 100%;
width: 100%;
background-color: #f2f5f6;
box-shadow: 0 0 6px rgba(0, 0, 0, .12);
text-align: center;
line-height: 40px;
color: #1989fa;
}
}

@ -33,15 +33,15 @@
<el-switch :value="pageGetters.showLogo" @input="changePageShowLogo"/> <el-switch :value="pageGetters.showLogo" @input="changePageShowLogo"/>
</div> </div>
<div class="drawer-item"> <div class="drawer-item">
<span>logo位置</span> <span>分层结构</span>
<el-select <el-select
:value="pageGetters.logoPosition" :value="pageGetters.position"
size="mini" size="mini"
style="width: 80px" style="width: 80px"
@input="changePageLogoPosition" @input="changePagePosition"
> >
<el-option value="aside" label="侧栏"/> <el-option value="top-bottom" label="上下"/>
<el-option value="head" label="顶栏"/> <el-option value="left-right" label="左右"/>
</el-select> </el-select>
</div> </div>
<div class="drawer-item"> <div class="drawer-item">
@ -142,6 +142,8 @@ export default {
navMode: 'mix' navMode: 'mix'
}, },
page: { page: {
showLogo: true,
position: 'left-right',
showPageHeader: true, showPageHeader: true,
showBackToTop: true showBackToTop: true
}, },
@ -169,10 +171,11 @@ export default {
appMutations.color(app.color) appMutations.color(app.color)
appMutations.navMode(app.navMode) appMutations.navMode(app.navMode)
pageMutations.showLogo(page.showLogo)
pageMutations.position(page.position)
pageMutations.showPageHeader(page.showPageHeader) pageMutations.showPageHeader(page.showPageHeader)
pageMutations.showBackToTop(page.showBackToTop) pageMutations.showBackToTop(page.showBackToTop)
asideMutations.showLogo(aside.showLogo)
asideMutations.uniqueOpen(aside.uniqueOpen) asideMutations.uniqueOpen(aside.uniqueOpen)
asideMutations.collapse(aside.collapse) asideMutations.collapse(aside.collapse)
asideMutations.showParentOnCollapse(aside.showParentOnCollapse) asideMutations.showParentOnCollapse(aside.showParentOnCollapse)
@ -188,6 +191,8 @@ export default {
app.color = appGetters.color app.color = appGetters.color
app.navMode = appGetters.navMode app.navMode = appGetters.navMode
page.showLogo = pageGetters.showLogo
page.position = pageGetters.position
page.showPageHeader = pageGetters.showPageHeader page.showPageHeader = pageGetters.showPageHeader
page.showBackToTop = pageGetters.showBackToTop page.showBackToTop = pageGetters.showBackToTop
@ -218,8 +223,8 @@ export default {
changePageShowLogo(v) { changePageShowLogo(v) {
pageMutations.showLogo(v) pageMutations.showLogo(v)
}, },
changePageLogoPosition(v) { changePagePosition(v) {
pageMutations.logoPosition(v) pageMutations.position(v)
}, },
changePageShowHeader(v) { changePageShowHeader(v) {
pageMutations.showPageHeader(v) pageMutations.showPageHeader(v)
@ -254,11 +259,13 @@ export default {
created() { created() {
//change //change
for (const key of Object.keys(this)) { for (const [key, value] of Object.entries(this)) {
if (!key.startsWith('change')) continue if (typeof value !== 'function' || !key.startsWith('change')) {
const originMethod = this[key] continue
}
this[key] = (...arg) => { this[key] = (...arg) => {
originMethod.apply(this, arg) value.apply(this, arg)
this.saveSetting() this.saveSetting()
} }
} }
@ -269,6 +276,9 @@ export default {
setLocalPersonalSettings(this.setting) setLocalPersonalSettings(this.setting)
this.updateLayoutStore() this.updateLayoutStore()
//
this.changeThemeColor(this.setting.app.color)
} }
} }
</script> </script>

@ -4,6 +4,7 @@ import VAside from './component/Aside'
import VHeader from './component/Header' import VHeader from './component/Header'
import VPage from './component/Page' import VPage from './component/Page'
import {getters as appGetters, mutations as appMutations} from "@/layout/store/app" import {getters as appGetters, mutations as appMutations} from "@/layout/store/app"
import {getters as pageGetters} from "@/layout/store/page"
import {getters as tagsViewGetters} from "@/layout/store/tagsView" import {getters as tagsViewGetters} from "@/layout/store/tagsView"
import {debounce} from "@/util" import {debounce} from "@/util"
import {isMobile} from "@/util/browser" import {isMobile} from "@/util/browser"
@ -16,23 +17,33 @@ export default {
components: {VAside, VHeader, VPage}, components: {VAside, VHeader, VPage},
computed: { computed: {
containerClass() { isLeftRight() {
const arr = ['main-container', 'has-nav', `nav-mode-${appGetters.navMode}`] return pageGetters.position === 'left-right'
tagsViewGetters.enabled && arr.push('has-tags-view') },
return arr wrapperClass() {
} return {
}, 'app-wrapper': true,
'flex-column': !this.isLeftRight
methods: {
$_resizeHandler() {
if (!document.hidden) {
appMutations.isMobile(isMobile())
} }
},
containerClass() {
return [
'main-container',
'has-nav',
`nav-mode-${appGetters.navMode}`,
this.isLeftRight && 'flex-column',
tagsViewGetters.enabled && 'has-tags-view'
]
},
renderAside() {
return appGetters.isMobile || ['aside', 'aside-two-part', 'mix'].includes(appGetters.navMode)
} }
}, },
mounted() { mounted() {
this.$_resizeHandler = debounce(this.$_resizeHandler) this.$_resizeHandler = debounce(() => {
!document.hidden && appMutations.isMobile(isMobile())
})
this.$_resizeHandler() this.$_resizeHandler()
window.addEventListener('resize', this.$_resizeHandler) window.addEventListener('resize', this.$_resizeHandler)
@ -43,13 +54,12 @@ export default {
}, },
render() { render() {
const renderAide = appGetters.isMobile || appGetters.navMode !== 'head'
return ( return (
<section class="app-wrapper"> <section class={this.wrapperClass}>
{renderAide && <v-aside/>} {this.isLeftRight ? this.renderAside && <v-aside/> : <v-header/>}
<section class={this.containerClass}> <section class={this.containerClass}>
<v-header/> {this.isLeftRight ? <v-header/> : <v-aside/>}
<v-page/> <v-page/>
</section> </section>
</section> </section>
@ -59,6 +69,11 @@ export default {
</script> </script>
<style lang="scss"> <style lang="scss">
.app-wrapper.flex-column,
.main-container.flex-column {
flex-direction: column;
}
.app-wrapper { .app-wrapper {
display: flex; display: flex;
position: relative; position: relative;
@ -70,7 +85,6 @@ export default {
flex: 1; flex: 1;
overflow: hidden; overflow: hidden;
position: relative; position: relative;
flex-direction: column;
} }
} }
</style> </style>

@ -10,9 +10,6 @@ const state = {
//抽屉模式时的显隐 //抽屉模式时的显隐
show: false, show: false,
//显示顶部logo
showLogo: true,
//手风琴效果 //手风琴效果
uniqueOpen: true, uniqueOpen: true,

@ -13,8 +13,8 @@ const state = {
//是否显示侧边栏或顶部导航栏的logo //是否显示侧边栏或顶部导航栏的logo
showLogo: true, showLogo: true,
//logo位置,侧边栏('aside')、顶部导航栏('head //分层结构,上下('top-bottom')、左右('left-right'
logoPosition: 'aside', position: 'left-right',
//是否显示页头 //是否显示页头
showPageHeader: true, showPageHeader: true,
//是否显示返回顶部按钮 //是否显示返回顶部按钮

@ -38,7 +38,7 @@ export default {
}, },
mounted() { mounted() {
this.parentDom = document.querySelector('.router-main') this.parentDom = document.querySelector('.page-main')
this.width = this.parentDom.clientWidth this.width = this.parentDom.clientWidth
this.height = this.parentDom.clientHeight this.height = this.parentDom.clientHeight
this.$_resizeHandler = debounce(() => { this.$_resizeHandler = debounce(() => {

@ -56,6 +56,12 @@ module.exports = {
} }
}, },
plugins: [ plugins: [
new ThemeColorReplacer({
fileName: 'css/theme-colors.[contenthash:8].css',
matchColors: forElementUI.getElementUISeries('#1890ff'),
changeSelector: forElementUI.changeSelector,
injectCss: true
}),
new CompressionWebpackPlugin({ new CompressionWebpackPlugin({
filename: '[path].gz[query]', filename: '[path].gz[query]',
algorithm: 'gzip', algorithm: 'gzip',
@ -64,11 +70,6 @@ module.exports = {
minRatio: 0.8, minRatio: 0.8,
deleteOriginalAssets: false, //是否删除源文件 deleteOriginalAssets: false, //是否删除源文件
}), }),
new ThemeColorReplacer({
fileName: 'css/theme-colors.[contenthash:8].css',
matchColors: forElementUI.getElementUISeries('#1890ff'),
changeSelector: forElementUI.changeSelector
}),
settings.isDev ? EMPTY_PLUGIN : new BundleAnalyzerPlugin() settings.isDev ? EMPTY_PLUGIN : new BundleAnalyzerPlugin()
] ]
}, },

Loading…
Cancel
Save