Commit 1fdaca01 by sendya

fix: merge mixin, fix user-layout 320px css

parent e8e2426a
<template> <template>
<div id="userLayout" class="user-layout-wrapper"> <div id="userLayout" :class="['user-layout-wrapper', device]">
<div class="container"> <div class="container">
<div class="top"> <div class="top">
<div class="header"> <div class="header">
...@@ -31,10 +31,12 @@ ...@@ -31,10 +31,12 @@
<script> <script>
import RouteView from "@/components/layouts/RouteView" import RouteView from "@/components/layouts/RouteView"
import { mixinDevice } from '@/utils/mixin.js'
export default { export default {
name: "UserLayout", name: "UserLayout",
components: { RouteView }, components: { RouteView },
mixins: [mixinDevice],
data () { data () {
return {} return {}
}, },
...@@ -51,6 +53,15 @@ ...@@ -51,6 +53,15 @@
#userLayout.user-layout-wrapper { #userLayout.user-layout-wrapper {
height: 100%; height: 100%;
&.mobile {
.container {
.main {
max-width: 368px;
width: 98%;
}
}
}
.container { .container {
width: 100%; width: 100%;
min-height: 100%; min-height: 100%;
...@@ -105,6 +116,7 @@ ...@@ -105,6 +116,7 @@
} }
.main { .main {
min-width: 260px;
width: 368px; width: 368px;
margin: 0 auto; margin: 0 auto;
} }
......
<template> <template>
<a-layout-sider <a-layout-sider
:class="['sider', device === 'desktop' ? null : 'shadow', theme, fixSiderbar ? 'ant-fixed-sidemenu' : null ]" :class="['sider', isDesktop() ? null : 'shadow', theme, fixSiderbar ? 'ant-fixed-sidemenu' : null ]"
width="256px" width="256px"
:collapsible="collapsible" :collapsible="collapsible"
v-model="collapsed" v-model="collapsed"
...@@ -21,11 +21,12 @@ ...@@ -21,11 +21,12 @@
import ALayoutSider from "ant-design-vue/es/layout/Sider" import ALayoutSider from "ant-design-vue/es/layout/Sider"
import Logo from '../tools/Logo' import Logo from '../tools/Logo'
import SMenu from './index' import SMenu from './index'
import { mapState } from 'vuex' import { mixin, mixinDevice } from '@/utils/mixin.js'
export default { export default {
name: "SideMenu", name: "SideMenu",
components: { ALayoutSider, Logo, SMenu }, components: { ALayoutSider, Logo, SMenu },
mixins: [mixin, mixinDevice],
props: { props: {
mode: { mode: {
type: String, type: String,
...@@ -52,15 +53,6 @@ ...@@ -52,15 +53,6 @@
required: true required: true
} }
}, },
created () {
},
computed: {
...mapState({
device: state => state.app.device,
fixSiderbar: state => state.app.fixSiderbar,
})
},
methods: { methods: {
onSelect (obj) { onSelect (obj) {
this.$emit('menuSelect', obj) this.$emit('menuSelect', obj)
......
...@@ -43,21 +43,26 @@ ...@@ -43,21 +43,26 @@
import SMenu from '../menu/' import SMenu from '../menu/'
import Logo from '../tools/Logo' import Logo from '../tools/Logo'
import { mapState } from 'vuex' import { mixin } from '@/utils/mixin.js'
export default { export default {
name: "LayoutHeader", name: "GlobalHeader",
components: { components: {
UserMenu, UserMenu,
SMenu, SMenu,
Logo Logo
}, },
mixins: [mixin],
props: { props: {
mode: { mode: {
type: String, type: String,
// sidemenu, topmenu // sidemenu, topmenu
default: 'sidemenu' default: 'sidemenu'
}, },
menus: {
type: Array,
required: true
},
theme: { theme: {
type: String, type: String,
required: false, required: false,
...@@ -76,24 +81,12 @@ ...@@ -76,24 +81,12 @@
}, },
data() { data() {
return { return {
menus: [],
headerBarFixed: false, headerBarFixed: false,
} }
}, },
mounted () { mounted () {
window.addEventListener('scroll', this.handleScroll) window.addEventListener('scroll', this.handleScroll)
}, },
created() {
this.menus = this.mainMenu.find((item) => item.path === '/').children
},
computed: {
...mapState({
mainMenu: state => state.permission.addRouters,
sidebarOpened: state => state.app.sidebar.opened,
fixedHeader: state => state.app.fixedHeader,
autoHideHeader: state => state.app.autoHideHeader,
}),
},
methods: { methods: {
handleScroll () { handleScroll () {
if (this.autoHideHeader) { if (this.autoHideHeader) {
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<template v-if="layoutMode === 'sidemenu'"> <template v-if="layoutMode === 'sidemenu'">
<a-drawer <a-drawer
v-if="device === 'mobile'" v-if="device === 'mobile'"
:wrapClassName="'drawer-sider ' + theme" :wrapClassName="'drawer-sider ' + navTheme"
placement="left" placement="left"
@close="() => this.collapsed = false" @close="() => this.collapsed = false"
:closable="false" :closable="false"
...@@ -14,16 +14,16 @@ ...@@ -14,16 +14,16 @@
mode="inline" mode="inline"
:menus="menus" :menus="menus"
@menuSelect="menuSelect" @menuSelect="menuSelect"
:theme="theme" :theme="navTheme"
:collapsed="false" :collapsed="false"
:collapsible="true"></side-menu> :collapsible="true"></side-menu>
</a-drawer> </a-drawer>
<side-menu <side-menu
v-else v-else
mode="inline"
:menus="menus" :menus="menus"
:theme="theme" :theme="navTheme"
:mode="menuMode"
:collapsed="collapsed" :collapsed="collapsed"
:collapsible="true"></side-menu> :collapsible="true"></side-menu>
</template> </template>
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
<template v-else> <template v-else>
<a-drawer <a-drawer
v-if="device === 'mobile'" v-if="device === 'mobile'"
:wrapClassName="'drawer-sider ' + theme" :wrapClassName="'drawer-sider ' + navTheme"
placement="left" placement="left"
@close="() => this.collapsed = false" @close="() => this.collapsed = false"
:closable="false" :closable="false"
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
mode="inline" mode="inline"
:menus="menus" :menus="menus"
@menuSelect="menuSelect" @menuSelect="menuSelect"
:theme="theme" :theme="navTheme"
:collapsed="false" :collapsed="false"
:collapsible="true"></side-menu> :collapsible="true"></side-menu>
</a-drawer> </a-drawer>
...@@ -49,7 +49,14 @@ ...@@ -49,7 +49,14 @@
<a-layout :class="[layoutMode, `content-width-${contentWidth}`]" :style="{ paddingLeft: fixSiderbar && device === 'desktop' ? `${sidebarOpened ? 256 : 80}px` : '0' }"> <a-layout :class="[layoutMode, `content-width-${contentWidth}`]" :style="{ paddingLeft: fixSiderbar && device === 'desktop' ? `${sidebarOpened ? 256 : 80}px` : '0' }">
<!-- layout header --> <!-- layout header -->
<global-header :mode="layoutMode" :theme="theme" :collapsed="collapsed" :device="device" @toggle="toggle"/> <global-header
:mode="layoutMode"
:menus="menus"
:theme="navTheme"
:collapsed="collapsed"
:device="device"
@toggle="toggle"
/>
<!-- layout content --> <!-- layout content -->
<a-layout-content :style="{ margin: '24px 24px 0', height: '100%', paddingTop: fixedHeader ? '64px' : '0' }"> <a-layout-content :style="{ margin: '24px 24px 0', height: '100%', paddingTop: fixedHeader ? '64px' : '0' }">
...@@ -71,41 +78,33 @@ ...@@ -71,41 +78,33 @@
import GlobalHeader from '@/components/page/GlobalHeader' import GlobalHeader from '@/components/page/GlobalHeader'
import GlobalFooter from '@/components/page/GlobalFooter' import GlobalFooter from '@/components/page/GlobalFooter'
import SettingDrawer from '@/components/setting/SettingDrawer' import SettingDrawer from '@/components/setting/SettingDrawer'
import { triggerResize } from '@/utils/util' import { triggerWindowResizeEvent } from '@/utils/util'
import { mapState, mapActions } from 'vuex' import { mapState, mapActions } from 'vuex'
import { mixin, mixinDevice } from '@/utils/mixin.js'
export default { export default {
name: "BasicLayout", name: "GlobalLayout",
components: { components: {
SideMenu, SideMenu,
GlobalHeader, GlobalHeader,
GlobalFooter, GlobalFooter,
SettingDrawer SettingDrawer
}, },
mixins: [mixin, mixinDevice],
data () { data () {
return { return {
// light, dark
menuTheme: 'light',
// inline, horizontal
menuMode: 'inline',
collapsed: false, collapsed: false,
menus: [] menus: []
} }
}, },
computed: { computed: {
...mapState({ ...mapState({
// 主路由
mainMenu: state => state.permission.addRouters, mainMenu: state => state.permission.addRouters,
layoutMode: state => state.app.layout,
sidebarOpened: state => state.app.sidebar.opened,
fixedHeader: state => state.app.fixedHeader,
fixSiderbar: state => state.app.fixSiderbar,
contentWidth: state => state.app.contentWidth,
theme: state => state.app.theme,
device: state => state.app.device,
}) })
}, },
watch: { watch: {
sidebarOpened(val) { sidebarOpened(val) {
console.log('watch',val)
this.collapsed = !val this.collapsed = !val
}, },
}, },
...@@ -116,11 +115,11 @@ ...@@ -116,11 +115,11 @@
...mapActions(['setSidebar']), ...mapActions(['setSidebar']),
toggle() { toggle() {
this.collapsed = !this.collapsed this.collapsed = !this.collapsed
triggerResize()
this.setSidebar(!this.collapsed) this.setSidebar(!this.collapsed)
triggerWindowResizeEvent()
}, },
menuSelect() { menuSelect() {
if (this.device !== 'desktop') { if (!this.isDesktop()) {
this.collapsed = false this.collapsed = false
} }
} }
......
...@@ -160,39 +160,25 @@ ...@@ -160,39 +160,25 @@
import SettingItem from '@/components/setting/SettingItem' import SettingItem from '@/components/setting/SettingItem'
import config from '@/defaultSettings' import config from '@/defaultSettings'
import { updateTheme, updateColorWeak, colorList } from '@/components/tools/setting' import { updateTheme, updateColorWeak, colorList } from '@/components/tools/setting'
import { mapState } from 'vuex' import { mixin, mixinDevice } from '@/utils/mixin.js'
export default { export default {
components: { components: {
DetailList, DetailList,
SettingItem SettingItem
}, },
mixins: [mixin, mixinDevice],
data() { data() {
return { return {
visible: true, visible: true,
colorList, colorList,
} }
}, },
computed: {
...mapState({
navTheme: state => state.app.theme,
layoutMode: state => state.app.layout,
primaryColor: state => state.app.color,
colorWeak: state => state.app.weak,
fixedHeader: state => state.app.fixedHeader,
fixSiderbar: state => state.app.fixSiderbar,
autoHideHeader: state => state.app.autoHideHeader,
contentWidth: state => state.app.contentWidth,
}),
},
watch: { watch: {
}, },
mounted () { mounted () {
const vm = this const vm = this
/*this.$nextTick(() => {
vm.visible = false
})*/
setTimeout(() => { setTimeout(() => {
vm.visible = false vm.visible = false
}, 16) }, 16)
......
...@@ -17,7 +17,7 @@ export default { ...@@ -17,7 +17,7 @@ export default {
primaryColor: '#1890FF', // primary color of ant design primaryColor: '#1890FF', // primary color of ant design
navTheme: 'dark', // theme for nav menu navTheme: 'dark', // theme for nav menu
layout: 'sidemenu', // 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: 'Fixed', // layout of content: Fluid or Fixed, only works when layout is topmenu
fixedHeader: false, // sticky header fixedHeader: false, // sticky header
fixSiderbar: false, // sticky siderbar fixSiderbar: false, // sticky siderbar
autoHideHeader: false, // auto hide header autoHideHeader: false, // auto hide header
......
// import Vue from 'vue'
import { mapState } from "vuex";
// const mixinsComputed = Vue.config.optionMergeStrategies.computed
// const mixinsMethods = Vue.config.optionMergeStrategies.methods
const mixin = {
computed: {
...mapState({
layoutMode: state => state.app.layout,
navTheme: state => state.app.theme,
primaryColor: state => state.app.color,
colorWeak: state => state.app.weak,
fixedHeader: state => state.app.fixedHeader,
fixSiderbar: state => state.app.fixSiderbar,
contentWidth: state => state.app.contentWidth,
autoHideHeader: state => state.app.autoHideHeader,
sidebarOpened: state => state.app.sidebarOpened
})
}
}
const mixinDevice = {
computed: {
...mapState({
device: state => state.app.device,
})
},
methods: {
isMobile () {
return this.device === 'mobile'
},
isDesktop () {
return this.device === 'desktop'
}
}
}
export { mixin, mixinDevice }
\ No newline at end of file
...@@ -13,7 +13,7 @@ export function welcome() { ...@@ -13,7 +13,7 @@ export function welcome() {
/** /**
* 触发 window.resize * 触发 window.resize
*/ */
export function triggerResize() { export function triggerWindowResizeEvent() {
let event = document.createEvent('HTMLEvents') let event = document.createEvent('HTMLEvents')
event.initEvent('resize', true, true) event.initEvent('resize', true, true)
event.eventType = 'message' event.eventType = 'message'
......
<script> <script>
import { mapState } from "vuex"
import { colorList } from '@/components/tools/setting' import { colorList } from '@/components/tools/setting'
import ASwitch from 'ant-design-vue/es/switch' import ASwitch from 'ant-design-vue/es/switch'
import AList from "ant-design-vue/es/list" import AList from "ant-design-vue/es/list"
import AListItem from "ant-design-vue/es/list/Item" import AListItem from "ant-design-vue/es/list/Item"
import { mixin } from '@/utils/mixin.js'
const Meta = AListItem.Meta const Meta = AListItem.Meta
...@@ -14,16 +14,11 @@ ...@@ -14,16 +14,11 @@
ASwitch, ASwitch,
Meta Meta
}, },
mixins: [mixin],
data () { data () {
return { return {
} }
}, },
computed: {
...mapState({
theme: state => state.app.theme,
color: state => state.app.color
})
},
filters: { filters: {
themeFilter(theme) { themeFilter(theme) {
const themeMap = { const themeMap = {
...@@ -58,14 +53,14 @@ ...@@ -58,14 +53,14 @@
</span> </span>
</Meta> </Meta>
<div slot="actions"> <div slot="actions">
<ASwitch checkedChildren="暗色" unCheckedChildren="白色" defaultChecked={this.theme === 'dark' && true || false} onChange={this.onChange} /> <ASwitch checkedChildren="暗色" unCheckedChildren="白色" defaultChecked={this.navTheme === 'dark' && true || false} onChange={this.onChange} />
</div> </div>
</AListItem> </AListItem>
<AListItem> <AListItem>
<Meta> <Meta>
<a slot="title">主题色</a> <a slot="title">主题色</a>
<span slot="description"> <span slot="description">
页面风格配色: <a domPropsInnerHTML={ this.colorFilter(this.color) }/> 页面风格配色: <a domPropsInnerHTML={ this.colorFilter(this.primaryColor) }/>
</span> </span>
</Meta> </Meta>
</AListItem> </AListItem>
......
...@@ -51,13 +51,14 @@ ...@@ -51,13 +51,14 @@
<script> <script>
import PageLayout from '@/components/page/PageLayout' import PageLayout from '@/components/page/PageLayout'
import RouteView from "@/components/layouts/RouteView" import RouteView from "@/components/layouts/RouteView"
import { mapState } from 'vuex' import { mixinDevice } from '@/utils/mixin.js'
export default { export default {
components: { components: {
RouteView, RouteView,
PageLayout PageLayout
}, },
mixins: [mixinDevice],
data () { data () {
return { return {
// horizontal inline // horizontal inline
...@@ -87,11 +88,6 @@ ...@@ -87,11 +88,6 @@
pageTitle: '' pageTitle: ''
} }
}, },
computed: {
...mapState({
device: state => state.app.device,
})
},
created () { created () {
this.updateMenu() this.updateMenu()
}, },
...@@ -121,9 +117,9 @@ ...@@ -121,9 +117,9 @@
border-right: unset; border-right: unset;
border-bottom: 1px solid #e8e8e8; border-bottom: 1px solid #e8e8e8;
width: 100%; width: 100%;
height: 48px; height: 50px;
overflow-x: hidden; overflow-x: auto;
overflow-y: auto; overflow-y: scroll;
} }
.account-settings-info-right { .account-settings-info-right {
padding: 20px 40px; padding: 20px 40px;
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
</template> </template>
<a-card :bordered="false" title="流程进度"> <a-card :bordered="false" title="流程进度">
<a-steps :direction="device==='mobile' && 'vertical' || 'horizontal'" :current="1" progressDot> <a-steps :direction="isMobile() && 'vertical' || 'horizontal'" :current="1" progressDot>
<a-step title="创建项目"> <a-step title="创建项目">
</a-step> </a-step>
<a-step title="部门初审"> <a-step title="部门初审">
...@@ -133,7 +133,7 @@ ...@@ -133,7 +133,7 @@
</template> </template>
<script> <script>
import { mapState } from 'vuex' import { mixinDevice } from '@/utils/mixin.js'
import PageLayout from '@/components/page/PageLayout' import PageLayout from '@/components/page/PageLayout'
import DetailList from '@/components/tools/DetailList' import DetailList from '@/components/tools/DetailList'
...@@ -146,6 +146,7 @@ ...@@ -146,6 +146,7 @@
DetailList, DetailList,
DetailListItem DetailListItem
}, },
mixins: [mixinDevice],
data () { data () {
return { return {
tabList: [ tabList: [
...@@ -295,12 +296,7 @@ ...@@ -295,12 +296,7 @@
} }
return statusTypeMap[type] return statusTypeMap[type]
} }
}, }
computed: {
...mapState({
device: state => state.app.device,
})
},
} }
</script> </script>
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
2016-12-12 ~ 2017-12-12 2016-12-12 ~ 2017-12-12
</a-col> </a-col>
</a-row> </a-row>
<a-steps :current="1" :direction="device === 'mobile' && directionType.vertical || directionType.horizontal" progressDot> <a-steps :current="1" :direction="isMobile() && directionType.vertical || directionType.horizontal" progressDot>
<a-step > <a-step >
<span style="font-size: 14px" slot="title">创建项目</span> <span style="font-size: 14px" slot="title">创建项目</span>
<template slot="description"> <template slot="description">
...@@ -61,7 +61,7 @@ ...@@ -61,7 +61,7 @@
<script> <script>
import Result from './Result' import Result from './Result'
import { mapState } from 'vuex' import { mixinDevice } from '@/utils/mixin.js'
const directionType = { const directionType = {
horizontal: 'horizontal', horizontal: 'horizontal',
...@@ -73,6 +73,7 @@ ...@@ -73,6 +73,7 @@
components: { components: {
Result Result
}, },
mixins: [mixinDevice],
data () { data () {
return { return {
title: '提交成功', title: '提交成功',
...@@ -82,11 +83,6 @@ ...@@ -82,11 +83,6 @@
' “单据”的需求,下面这个灰色区域可以呈现比较复杂的内容。', ' “单据”的需求,下面这个灰色区域可以呈现比较复杂的内容。',
directionType directionType
} }
},
computed: {
...mapState({
device: state => state.app.device,
})
} }
} }
</script> </script>
......
...@@ -90,7 +90,7 @@ ...@@ -90,7 +90,7 @@
</template> </template>
<script> <script>
import { mapState } from 'vuex' import { mixinDevice } from '@/utils/mixin.js'
import { getSmsCaptcha } from '@/api/login' import { getSmsCaptcha } from '@/api/login'
const levelNames = { const levelNames = {
...@@ -115,6 +115,7 @@ ...@@ -115,6 +115,7 @@
name: "Register", name: "Register",
components: { components: {
}, },
mixins: [mixinDevice],
data() { data() {
return { return {
form: null, form: null,
...@@ -131,9 +132,6 @@ ...@@ -131,9 +132,6 @@
} }
}, },
computed: { computed: {
...mapState({
isMobile: state => state.app.device === 'mobile',
}),
passwordLevelClass () { passwordLevelClass () {
return levelClass[this.state.passwordLevel] return levelClass[this.state.passwordLevel]
}, },
...@@ -198,7 +196,7 @@ ...@@ -198,7 +196,7 @@
}, },
handlePasswordInputClick () { handlePasswordInputClick () {
if (!this.isMobile) { if (!this.isMobile()) {
this.state.passwordLevelChecked = true this.state.passwordLevelChecked = true
return; return;
} }
......
...@@ -52,12 +52,14 @@ module.exports = { ...@@ -52,12 +52,14 @@ module.exports = {
devServer: { devServer: {
proxy: { proxy: {
'/api': { '/api': {
target: 'https://mock.ihx.me/mock/5baf3052f7da7e07e04a5116/antd-pro', // target: 'https://mock.ihx.me/mock/5baf3052f7da7e07e04a5116/antd-pro',
target: 'https://www.easy-mock.com/mock/5b7bce071f130e5b7fe8cd7d/antd-pro',
ws: false, ws: false,
changeOrigin: true changeOrigin: true
}, },
'/gateway': { '/gateway': {
target: 'https://mock.ihx.me/mock/5baf3052f7da7e07e04a5116/antd-pro', target: 'https://www.easy-mock.com/mock/5b7bce071f130e5b7fe8cd7d/antd-pro',
ws: false,
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
'^/gateway': '/api' '^/gateway': '/api'
......
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