| | |
| | | <!-- update-end- author:sunjianlei --- date:20191009 --- for: 提升右键菜单的层级 --> |
| | | <a-tabs |
| | | @contextmenu.native="e => onContextmenu(e)" |
| | | v-if="$route.meta.title!=='首页'&&multipage" |
| | | v-if="multipage" |
| | | :active-key="activePage" |
| | | class="tab-layout-tabs" |
| | | style="height:52px" |
| | |
| | | @change="changePage" |
| | | @tabClick="tabCallBack" |
| | | @edit="editPage"> |
| | | <a-tab-pane :id="page.path" :key="page.path" v-for="page in pageList" |
| | | :closable="!(page.meta.title=='首页')"> |
| | | <span slot="tab" :pagekey="page.path">{{ page.meta.title }}</span> |
| | | <a-tab-pane :id="page.fullPath" :key="page.fullPath" v-for="page in pageList" :closable="!(page.meta.title=='首页')"> |
| | | <span slot="tab" :pagekey="page.fullPath">{{ page.meta.title }}</span> |
| | | </a-tab-pane> |
| | | </a-tabs> |
| | | <div :style="{padding: $route.meta.title=='首页'?'0':'12px 12px 0'}"> |
| | | <div style="margin: 12px 12px 0;"> |
| | | <!-- update-begin-author:taoyan date:20201221 for:此处删掉transition标签 不知道为什么加上后 页面路由切换的时候即1及菜单切到2及菜单的时候 两个菜单页面会同时出现300-500秒左右 --> |
| | | <keep-alive v-if="multipage"> |
| | | <router-view v-if="reloadFlag"/> |
| | |
| | | </template> |
| | | <!-- update-end-author:taoyan date:20201221 for:此处删掉transition标签 不知道为什么加上后 页面路由切换的时候即1及菜单切到2及菜单的时候 两个菜单页面会同时出现300-500秒左右 --> |
| | | </div> |
| | | <!-- update-begin-author:zyf date:20211129 for:qiankun 挂载子应用盒子 --> |
| | | <div id="content" class="app-view-box"></div> |
| | | <!-- update-end-author:zyf date:20211129 for: qiankun 挂载子应用盒子--> |
| | | </global-layout> |
| | | </template> |
| | | |
| | |
| | | import { triggerWindowResizeEvent } from '@/utils/util' |
| | | import Vue from 'vue' |
| | | import { CACHE_INCLUDED_ROUTES } from '@/store/mutation-types' |
| | | import registerApps from "@/qiankun"; |
| | | |
| | | const indexKey = '/dashboard/analysis' |
| | | |
| | |
| | | { key: '2', icon: 'arrow-right', text: '关闭右侧' }, |
| | | { key: '3', icon: 'close', text: '关闭其它' } |
| | | ], |
| | | reloadFlag: true |
| | | reloadFlag:true |
| | | } |
| | | }, |
| | | /* update_begin author:wuxianquan date:20190828 for: 关闭当前tab页,供子页面调用 ->望菜单能配置外链,直接弹出新页面而不是嵌入iframe #428 */ |
| | | provide() { |
| | | return { |
| | | closeCurrent: this.closeCurrent |
| | | provide(){ |
| | | return{ |
| | | closeCurrent:this.closeCurrent, |
| | | changeTitle: this.changeTitle, |
| | | changeTabTitle: this.changeTabTitle, |
| | | } |
| | | }, |
| | | /* update_end author:wuxianquan date:20190828 for: 关闭当前tab页,供子页面调用->望菜单能配置外链,直接弹出新页面而不是嵌入iframe #428 */ |
| | |
| | | this.pageList.push(currentRoute) |
| | | this.linkList.push(currentRoute.fullPath) |
| | | this.activePage = currentRoute.fullPath |
| | | this.$bus.$on('clickMenuTitleSelected', this.clickMenuTitleSelected) |
| | | }, |
| | | mounted() { |
| | | if (process.env.VUE_APP_QIANKUN == 'true') { |
| | | //update-begin-author:zyf date:20211129 for:qiankun 注册子应用 |
| | | if (!window.qiankunStarted) { |
| | | window.qiankunStarted = true; |
| | | registerApps(); |
| | | } |
| | | //update-end-author:zyf date:20211129 for:qiankun 注册子应用 |
| | | } |
| | | }, |
| | | watch: { |
| | | '$route': function(newRoute) { |
| | |
| | | this.activePage = newRoute.fullPath |
| | | if (!this.multipage) { |
| | | this.linkList = [newRoute.fullPath] |
| | | this.pageList = [Object.assign({}, newRoute)] |
| | | this.pageList = [Object.assign({},newRoute)] |
| | | // update-begin-author:taoyan date:20200211 for: TASK #3368 【路由缓存】首页的缓存设置有问题,需要根据后台的路由配置来实现是否缓存 |
| | | } else if (indexKey == newRoute.fullPath) { |
| | | } else if(indexKey==newRoute.fullPath) { |
| | | //首页时 判断是否缓存 没有缓存 刷新之 |
| | | if (newRoute.meta.keepAlive === false) { |
| | | this.routeReload() |
| | | } |
| | | // update-end-author:taoyan date:20200211 for: TASK #3368 【路由缓存】首页的缓存设置有问题,需要根据后台的路由配置来实现是否缓存 |
| | | } else if (this.linkList.indexOf(newRoute.fullPath) < 0) { |
| | | }else if (this.linkList.indexOf(newRoute.fullPath) < 0) { |
| | | this.linkList.push(newRoute.fullPath) |
| | | this.pageList.push(Object.assign({}, newRoute)) |
| | | this.pageList.push(Object.assign({},newRoute)) |
| | | //// update-begin-author:sunjianlei date:20200103 for: 如果新增的页面配置了缓存路由,那么就强制刷新一遍 #842 |
| | | // if (newRoute.meta.keepAlive) { |
| | | // this.routeReload() |
| | |
| | | } else if (this.linkList.indexOf(newRoute.fullPath) >= 0) { |
| | | let oldIndex = this.linkList.indexOf(newRoute.fullPath) |
| | | let oldPositionRoute = this.pageList[oldIndex] |
| | | this.pageList.splice(oldIndex, 1, Object.assign({}, newRoute, { meta: oldPositionRoute.meta })) |
| | | this.pageList.splice(oldIndex, 1, Object.assign({},newRoute,{meta:oldPositionRoute.meta})) |
| | | } |
| | | }, |
| | | 'activePage': function(key) { |
| | | let index = this.linkList.lastIndexOf(key) |
| | | let waitRouter = this.pageList[index] |
| | | // 【TESTA-523】修复:不允许重复跳转路由异常 |
| | | if (waitRouter.path !== this.$route.fullPath) { |
| | | if (waitRouter.fullPath !== this.$route.fullPath) { |
| | | this.$router.push(Object.assign({}, waitRouter)) |
| | | } |
| | | this.changeTitle(waitRouter.meta.title) |
| | | }, |
| | | 'multipage': function(newVal) { |
| | | if (this.reloadFlag) { |
| | | if(this.reloadFlag){ |
| | | if (!newVal) { |
| | | this.linkList = [this.$route.fullPath] |
| | | this.pageList = [this.$route] |
| | |
| | | if (this.multipage && this.linkList.indexOf(indexKey) === -1) { |
| | | this.addIndexToFirst() |
| | | } |
| | | } |
| | | }, |
| | | // update-end-author:sunjianlei date:20191223 for: 修复从单页模式切换回多页模式后首页不居第一位的 BUG |
| | | }, |
| | | methods: { |
| | |
| | | // update-end-author:sunjianlei date:20191223 for: 修复从单页模式切换回多页模式后首页不居第一位的 BUG |
| | | |
| | | // update-begin-author:sunjianlei date:20200120 for: 动态更改页面标题 |
| | | /** |
| | | * 修改当前页面的窗口标题 |
| | | * @param title 要修改的新标题 |
| | | */ |
| | | changeTitle(title) { |
| | | let projectTitle = 'MDC智慧车间' |
| | | let projectTitle = "MDC智慧车间" |
| | | // 首页特殊处理 |
| | | if (this.$route.path === indexKey) { |
| | | document.title = projectTitle |
| | | } else { |
| | | document.title = title + ' · ' + projectTitle |
| | | } |
| | | }, |
| | | /** |
| | | * 修改tab标签的标题 |
| | | * @param title 要修改的新标题 |
| | | * @param fullPath 要修改的路由全路径,如果不填就是修改当前路由 |
| | | */ |
| | | changeTabTitle(title, fullPath = '') { |
| | | if (title) { |
| | | let currentRoute = this.pageList.find((r) => r.fullPath === (fullPath ? fullPath : this.$route.fullPath)) |
| | | if (currentRoute != null) { |
| | | currentRoute.meta = {...currentRoute.meta, title} |
| | | } |
| | | } |
| | | }, |
| | | // update-end-author:sunjianlei date:20200120 for: 动态更改页面标题 |
| | |
| | | tabCallBack() { |
| | | this.$nextTick(() => { |
| | | //update-begin-author:taoyan date: 20201211 for:【新版】online报错 JT-100 |
| | | setTimeout(() => { |
| | | setTimeout(()=>{ |
| | | //省市区组件里面给window绑定了个resize事件 导致切换页面的时候触发了他的resize,但是切换页面,省市区组件还没被销毁前就触发了该事件,导致控制台报错,加个延迟 |
| | | triggerWindowResizeEvent() |
| | | }, 20) |
| | | },20) |
| | | //update-end-author:taoyan date: 20201211 for:【新版】online报错 JT-100 |
| | | }) |
| | | }, |
| | |
| | | this.$message.warning('这是最后一页,不能再关闭了啦') |
| | | return |
| | | } |
| | | let removeRoute = this.pageList.filter(item => item.path == key) |
| | | this.pageList = this.pageList.filter(item => item.path !== key) |
| | | console.log("this.pageList ",this.pageList ); |
| | | let removeRoute = this.pageList.filter(item => item.fullPath == key) |
| | | this.pageList = this.pageList.filter(item => item.fullPath !== key) |
| | | let index = this.linkList.indexOf(key) |
| | | this.linkList = this.linkList.filter(item => item !== key) |
| | | index = index >= this.linkList.length ? this.linkList.length - 1 : index |
| | |
| | | let cacheRouterArray = Vue.ls.get(CACHE_INCLUDED_ROUTES) || [] |
| | | if (removeRoute && removeRoute[0]) { |
| | | let componentName = removeRoute[0].meta.componentName |
| | | if (cacheRouterArray.includes(componentName)) { |
| | | console.log("key: ", key); |
| | | console.log("componentName: ", componentName); |
| | | if(cacheRouterArray.includes(componentName)){ |
| | | cacheRouterArray.splice(cacheRouterArray.findIndex(item => item === componentName), 1) |
| | | Vue.ls.set(CACHE_INCLUDED_ROUTES, cacheRouterArray) |
| | | } |
| | | this.emitPageClosed(removeRoute[0]) |
| | | } |
| | | //update-end--Author:scott Date:20201015 for:路由缓存问题,关闭了tab页时再打开就不刷新 #842 |
| | | this.tabCallBack() |
| | | |
| | | }, |
| | | // 触发 page-closed (页面关闭)全局事件 |
| | | emitPageClosed(closedRoute) { |
| | |
| | | } |
| | | }, |
| | | /* update_begin author:wuxianquan date:20190828 for: 关闭当前tab页,供子页面调用->望菜单能配置外链,直接弹出新页面而不是嵌入iframe #428 */ |
| | | closeCurrent() { |
| | | this.remove(this.activePage) |
| | | closeCurrent(){ |
| | | this.remove(this.activePage); |
| | | }, |
| | | /* update_end author:wuxianquan date:20190828 for: 关闭当前tab页,供子页面调用->望菜单能配置外链,直接弹出新页面而不是嵌入iframe #428 */ |
| | | closeOthers(pageKey) { |
| | | let index = this.linkList.indexOf(pageKey) |
| | | if (pageKey == indexKey || pageKey.indexOf('?ticke=') >= 0) { |
| | | if (pageKey == indexKey || pageKey.indexOf('?ticke=')>=0) { |
| | | this.linkList = this.linkList.slice(index, index + 1) |
| | | this.pageList = this.pageList.slice(index, index + 1) |
| | | this.activePage = this.linkList[0] |
| | |
| | | let indexContent = this.pageList.slice(0, 1)[0] |
| | | this.linkList = this.linkList.slice(index, index + 1) |
| | | this.pageList = this.pageList.slice(index, index + 1) |
| | | this.linkList.unshift(indexContent.path) |
| | | this.linkList.unshift(indexContent.fullPath) |
| | | this.pageList.unshift(indexContent) |
| | | this.activePage = this.linkList[1] |
| | | } |
| | |
| | | let index = this.linkList.indexOf(pageKey) |
| | | this.linkList = this.linkList.slice(index) |
| | | this.pageList = this.pageList.slice(index) |
| | | this.linkList.unshift(indexContent.path) |
| | | this.linkList.unshift(indexContent.fullPath) |
| | | this.pageList.unshift(indexContent) |
| | | // 若将激活页一并关闭则显示导航栏除首页第一个页面 |
| | | if (this.linkList.indexOf(this.activePage) < 0) { |
| | | this.activePage = this.linkList[1] |
| | | this.activePage = this.linkList[0] |
| | | } |
| | | }, |
| | | closeRight(pageKey) { |
| | | let index = this.linkList.indexOf(pageKey) |
| | | this.linkList = this.linkList.slice(0, index + 1) |
| | | this.pageList = this.pageList.slice(0, index + 1) |
| | | // 若将激活页一并关闭则显示导航栏最后一个页面 |
| | | if (this.linkList.indexOf(this.activePage) < 0) { |
| | | if (this.linkList.indexOf(this.activePage < 0)) { |
| | | this.activePage = this.linkList[this.linkList.length - 1] |
| | | } |
| | | }, |
| | | //update-begin-author:taoyan date:20190430 for:动态路由title显示配置的菜单title而不是其对应路由的title |
| | | dynamicRouterShow(key, title) { |
| | | dynamicRouterShow(key,title){ |
| | | let keyIndex = this.linkList.indexOf(key) |
| | | if (keyIndex >= 0) { |
| | | if(keyIndex>=0){ |
| | | let currRouter = this.pageList[keyIndex] |
| | | let meta = Object.assign({}, currRouter.meta, { title: title }) |
| | | this.pageList.splice(keyIndex, 1, Object.assign({}, currRouter, { meta: meta })) |
| | | let meta = Object.assign({},currRouter.meta,{title:title}) |
| | | this.pageList.splice(keyIndex, 1, Object.assign({},currRouter,{meta:meta})) |
| | | if (key === this.activePage) { |
| | | this.changeTitle(title) |
| | | } |
| | |
| | | //update-end-author:taoyan date:20190430 for:动态路由title显示配置的菜单title而不是其对应路由的title |
| | | |
| | | //update-begin-author:taoyan date:20191008 for:路由刷新 |
| | | routeReload() { |
| | | routeReload(){ |
| | | this.reloadFlag = false |
| | | let ToggleMultipage = 'ToggleMultipage' |
| | | this.$store.dispatch(ToggleMultipage, false) |
| | | this.$nextTick(() => { |
| | | this.$store.dispatch(ToggleMultipage, true) |
| | | let ToggleMultipage = "ToggleMultipage" |
| | | this.$store.dispatch(ToggleMultipage,false) |
| | | this.$nextTick(()=>{ |
| | | this.$store.dispatch(ToggleMultipage,true) |
| | | this.reloadFlag = true |
| | | }) |
| | | }, |
| | | //update-end-author:taoyan date:20191008 for:路由刷新 |
| | | //新增一个返回方法 |
| | | excuteCallback(callback) { |
| | | excuteCallback(callback){ |
| | | callback() |
| | | }, |
| | | |
| | | clickMenuTitleSelected(selectedMenus) { |
| | | //console.log("新的路由",newRoute) |
| | | this.activePage = selectedMenus[0].path |
| | | if (!this.multipage) { |
| | | this.linkList = [this.linkList[0], selectedMenus[0].path] |
| | | this.pageList = [this.pageList[0], Object.assign({}, selectedMenus[0])] |
| | | // update-begin-author:taoyan date:20200211 for: TASK #3368 【路由缓存】首页的缓存设置有问题,需要根据后台的路由配置来实现是否缓存 |
| | | } else if (indexKey == selectedMenus[0].path) { |
| | | //首页时 判断是否缓存 没有缓存 刷新之 |
| | | if (selectedMenus[0].meta.keepAlive === false) { |
| | | this.routeReload() |
| | | } |
| | | // update-end-author:taoyan date:20200211 for: TASK #3368 【路由缓存】首页的缓存设置有问题,需要根据后台的路由配置来实现是否缓存 |
| | | } else { |
| | | // selectedMenus.forEach(menuItem => { |
| | | // if (!this.linkList.includes(menuItem.path)) { |
| | | // console.log('触发增加') |
| | | // this.linkList.push(menuItem.path) |
| | | // this.pageList.push(menuItem) |
| | | // } else { |
| | | // console.log('触发没有增加') |
| | | // let oldIndex = this.linkList.indexOf(menuItem.path) |
| | | // let oldPositionRoute = this.pageList[oldIndex] |
| | | // this.pageList.splice(oldIndex, 1, Object.assign({}, menuItem, { meta: oldPositionRoute.meta })) |
| | | // } |
| | | // }) |
| | | // 点击标题后在导航栏覆盖前一个标题所展开的下级菜单 |
| | | this.linkList = [this.linkList[0], ...selectedMenus.map(item => item.path)] |
| | | this.pageList = [this.pageList[0], ...selectedMenus] |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="less"> |
| | | |
| | | /* |
| | | * The following styles are auto-applied to elements with |
| | | * transition="page-transition" when their visibility is toggled |
| | | * by Vue.js. |
| | | * |
| | | * You can easily play with the page transition by editing |
| | | * these styles. |
| | | */ |
| | | /* |
| | | * The following styles are auto-applied to elements with |
| | | * transition="page-transition" when their visibility is toggled |
| | | * by Vue.js. |
| | | * |
| | | * You can easily play with the page transition by editing |
| | | * these styles. |
| | | */ |
| | | |
| | | .page-transition-enter { |
| | | opacity: 0; |
| | | .page-transition-enter { |
| | | opacity: 0; |
| | | } |
| | | |
| | | .page-transition-leave-active { |
| | | opacity: 0; |
| | | } |
| | | |
| | | .page-transition-enter .page-transition-container, |
| | | .page-transition-leave-active .page-transition-container { |
| | | -webkit-transform: scale(1.1); |
| | | transform: scale(1.1); |
| | | } |
| | | |
| | | /*美化弹出Tab样式*/ |
| | | .ant-tabs-nav-container { |
| | | margin-top: 4px; |
| | | } |
| | | |
| | | /* 修改 ant-tabs 样式 */ |
| | | .tab-layout-tabs.ant-tabs { |
| | | border-bottom: 1px solid #ccc; |
| | | border-left: 1px solid #ccc; |
| | | background-color: white; |
| | | padding: 0 20px; |
| | | |
| | | .ant-tabs-bar { |
| | | margin: 4px 0 0; |
| | | border: none; |
| | | } |
| | | |
| | | .page-transition-leave-active { |
| | | opacity: 0; |
| | | } |
| | | } |
| | | |
| | | .page-transition-enter .page-transition-container, |
| | | .page-transition-leave-active .page-transition-container { |
| | | -webkit-transform: scale(1.1); |
| | | transform: scale(1.1); |
| | | } |
| | | .tab-layout-tabs.ant-tabs { |
| | | |
| | | /*美化弹出Tab样式*/ |
| | | .ant-tabs-nav-container { |
| | | margin-top: 4px; |
| | | } |
| | | &.ant-tabs-card .ant-tabs-tab { |
| | | |
| | | /* 修改 ant-tabs 样式 */ |
| | | .tab-layout-tabs.ant-tabs { |
| | | border-bottom: 1px solid #ccc; |
| | | border-left: 1px solid #ccc; |
| | | background-color: white; |
| | | padding: 0 20px; |
| | | |
| | | .ant-tabs-bar { |
| | | margin: 4px 0 0; |
| | | border: none; |
| | | } |
| | | |
| | | } |
| | | |
| | | .tab-layout-tabs.ant-tabs { |
| | | |
| | | &.ant-tabs-card .ant-tabs-tab { |
| | | |
| | | padding: 0 20px 0 2px !important; |
| | | padding: 0 24px !important; |
| | | background-color: white !important; |
| | | /*margin-right: 10px !important;*/ |
| | | margin-right: 10px !important; |
| | | |
| | | .ant-tabs-close-x { |
| | | width: 12px !important; |
| | | height: 12px !important; |
| | | opacity: 0 !important; |
| | | cursor: pointer !important; |
| | | font-size: 12px !important; |
| | | margin: 0 !important; |
| | | position: absolute; |
| | | top: 36%; |
| | | right: 6px; |
| | | } |
| | | .ant-tabs-close-x { |
| | | width: 12px !important; |
| | | height: 12px !important; |
| | | opacity: 0 !important; |
| | | cursor: pointer !important; |
| | | font-size: 12px !important; |
| | | margin: 0 !important; |
| | | position: absolute; |
| | | top: 36%; |
| | | right: 6px; |
| | | } |
| | | |
| | | &:hover .ant-tabs-close-x { |
| | | opacity: 1 !important; |
| | | } |
| | | |
| | | &:hover .ant-tabs-close-x { |
| | | opacity: 1 !important; |
| | | } |
| | | |
| | | } |
| | | |
| | | .tab-layout-tabs.ant-tabs.ant-tabs-card > .ant-tabs-bar { |
| | | .ant-tabs-tab { |
| | | border: none !important; |
| | | border-bottom: 1px solid transparent !important; |
| | | } |
| | | .ant-tabs-tab-active { |
| | | border-color: @primary-color!important; |
| | | } |
| | | } |
| | | |
| | | .tab-layout-tabs.ant-tabs.ant-tabs-card > .ant-tabs-bar { |
| | | .ant-tabs-tab { |
| | | border: none !important; |
| | | border-bottom: 1px solid transparent !important; |
| | | } |
| | | .ant-tabs-tab-active { |
| | | border-color: @primary-color!important; |
| | | } |
| | | } |
| | | |
| | | |
| | | </style> |
| | |
| | | <template> |
| | | <div class="footer"> |
| | | <div class="copyright" |
| | | :style="{background:$route.meta.title==='首页'?'#151548':'',color:$route.meta.title==='首页'?'#fff':''}"> |
| | | <div class="copyright"> |
| | | Copyright |
| | | <a-icon type="copyright"/> |
| | | 2024 <span>2015-2025 灵秀智能</span> |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: 'LayoutFooter' |
| | | } |
| | | export default { |
| | | name: 'LayoutFooter' |
| | | } |
| | | </script> |
| | | |
| | | <style lang="less" scoped> |
| | | .footer { |
| | | text-align: center; |
| | | .footer { |
| | | text-align: center; |
| | | |
| | | .links { |
| | | margin-bottom: 8px; |
| | | .links { |
| | | margin-bottom: 8px; |
| | | |
| | | a { |
| | | color: rgba(0, 0, 0, .45); |
| | | a { |
| | | color: rgba(0, 0, 0, .45); |
| | | |
| | | &:hover { |
| | | color: rgba(0, 0, 0, .65); |
| | | } |
| | | &:hover { |
| | | color: rgba(0, 0, 0, .65); |
| | | } |
| | | |
| | | &:not(:last-child) { |
| | | margin-right: 40px; |
| | | } |
| | | &:not(:last-child) { |
| | | margin-right: 40px; |
| | | } |
| | | } |
| | | .copyright { |
| | | color: rgba(0, 0, 0, .45); |
| | | font-size: 14px; |
| | | } |
| | | } |
| | | |
| | | .copyright { |
| | | color: rgba(0, 0, 0, .45); |
| | | font-size: 14px; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | /> |
| | | |
| | | <!-- layout content --> |
| | | <a-layout-content |
| | | :style="{ height: '100%', paddingTop: fixedHeader ? '59px' : '0' ,background: $route.meta.title=='首页'?'#151548':''}"> |
| | | <a-layout-content :style="{ height: '100%', paddingTop: fixedHeader ? '59px' : '0' }"> |
| | | <slot></slot> |
| | | </a-layout-content> |
| | | |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import SideMenu from '@/components/menu/SideMenu' |
| | | import GlobalHeader from '@/components/page/GlobalHeader' |
| | | import GlobalFooter from '@/components/page/GlobalFooter' |
| | | import { triggerWindowResizeEvent } from '@/utils/util' |
| | | import { mapActions, mapState } from 'vuex' |
| | | import { mixin, mixinDevice } from '@/utils/mixin.js' |
| | | // update-start---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------ |
| | | // import SettingDrawer from '@/components/setting/SettingDrawer' |
| | | // 注释这个因为在个人设置模块已经加载了SettingDrawer页面 |
| | | // update-end ---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------ |
| | | import SideMenu from '@/components/menu/SideMenu' |
| | | import GlobalHeader from '@/components/page/GlobalHeader' |
| | | import GlobalFooter from '@/components/page/GlobalFooter' |
| | | import { triggerWindowResizeEvent } from '@/utils/util' |
| | | import { mapActions, mapState } from 'vuex' |
| | | import { mixin, mixinDevice } from '@/utils/mixin.js' |
| | | // update-start---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------ |
| | | // import SettingDrawer from '@/components/setting/SettingDrawer' |
| | | // 注释这个因为在个人设置模块已经加载了SettingDrawer页面 |
| | | // update-end ---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------ |
| | | |
| | | export default { |
| | | name: 'GlobalLayout', |
| | | components: { |
| | | SideMenu, |
| | | GlobalHeader, |
| | | GlobalFooter, |
| | | // update-start---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------ |
| | | // // SettingDrawer |
| | | // 注释这个因为在个人设置模块已经加载了SettingDrawer页面 |
| | | // update-end ---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------ |
| | | export default { |
| | | name: 'GlobalLayout', |
| | | components: { |
| | | SideMenu, |
| | | GlobalHeader, |
| | | GlobalFooter, |
| | | // update-start---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------ |
| | | // // SettingDrawer |
| | | // 注释这个因为在个人设置模块已经加载了SettingDrawer页面 |
| | | // update-end ---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------ |
| | | |
| | | }, |
| | | mixins: [mixin, mixinDevice], |
| | | data() { |
| | | return { |
| | | collapsed: false, |
| | | activeMenu:{}, |
| | | menus: [] |
| | | } |
| | | }, |
| | | computed: { |
| | | ...mapState({ |
| | | // 主路由 |
| | | mainRouters: state => state.permission.addRouters, |
| | | // 后台菜单 |
| | | permissionMenuList: state => state.user.permissionList |
| | | }) |
| | | }, |
| | | watch: { |
| | | sidebarOpened(val) { |
| | | this.collapsed = !val |
| | | } |
| | | }, |
| | | created() { |
| | | //--update-begin----author:scott---date:20190320------for:根据后台菜单配置,判断是否路由菜单字段,动态选择是否生成路由(为了支持参数URL菜单)------ |
| | | //this.menus = this.mainRouters.find((item) => item.path === '/').children; |
| | | this.menus = this.permissionMenuList |
| | | |
| | | //--update-begin----author:liusq---date:20210223------for:关于测边菜单遮挡内容问题详细说明 #2255 |
| | | this.collapsed=!this.sidebarOpened; |
| | | //--update-begin----author:liusq---date:20210223------for:关于测边菜单遮挡内容问题详细说明 #2255 |
| | | |
| | | // 根据后台配置菜单,重新排序加载路由信息 |
| | | //console.log('----加载菜单逻辑----') |
| | | //console.log(this.mainRouters) |
| | | //console.log(this.permissionMenuList) |
| | | //console.log('----navTheme------'+this.navTheme) |
| | | //--update-end----author:scott---date:20190320------for:根据后台菜单配置,判断是否路由菜单字段,动态选择是否生成路由(为了支持参数URL菜单)------ |
| | | }, |
| | | methods: { |
| | | ...mapActions(['setSidebar']), |
| | | toggle() { |
| | | this.collapsed = !this.collapsed |
| | | this.setSidebar(!this.collapsed) |
| | | triggerWindowResizeEvent() |
| | | }, |
| | | menuSelect() { |
| | | if (!this.isDesktop()) { |
| | | this.collapsed = false |
| | | } |
| | | }, |
| | | //update-begin-author:taoyan date:20190430 for:动态路由title显示配置的菜单title而不是其对应路由的title |
| | | myMenuSelect(value){ |
| | | //此处触发动态路由被点击事件 |
| | | this.findMenuBykey(this.menus,value.key) |
| | | this.$emit("dynamicRouterShow",value.key,this.activeMenu.meta.title) |
| | | }, |
| | | findMenuBykey(menus,key){ |
| | | for(let i of menus){ |
| | | if(i.path==key){ |
| | | this.activeMenu = {...i} |
| | | }else if(i.children && i.children.length>0){ |
| | | this.findMenuBykey(i.children,key) |
| | | } |
| | | } |
| | | }, |
| | | //update-end-author:taoyan date:20190430 for:动态路由title显示配置的菜单title而不是其对应路由的title |
| | | |
| | | // update-begin-author:sunjianlei date:20210409 for: 修复动态功能测试菜单、带参数菜单标题错误、展开错误的问题 |
| | | handleUpdateMenuTitle(value) { |
| | | this.findMenuBykey(this.menus, value.path) |
| | | this.activeMenu.meta.title = value.meta.title |
| | | this.$emit('dynamicRouterShow', value.path, this.activeMenu.meta.title) |
| | | }, |
| | | // update-end-author:sunjianlei date:20210409 for: 修复动态功能测试菜单、带参数菜单标题错误、展开错误的问题 |
| | | |
| | | }, |
| | | mixins: [mixin, mixinDevice], |
| | | data() { |
| | | return { |
| | | collapsed: false, |
| | | activeMenu:{}, |
| | | menus: [] |
| | | } |
| | | }, |
| | | computed: { |
| | | ...mapState({ |
| | | // 主路由 |
| | | mainRouters: state => state.permission.addRouters, |
| | | // 后台菜单 |
| | | permissionMenuList: state => state.user.permissionList |
| | | }) |
| | | }, |
| | | watch: { |
| | | sidebarOpened(val) { |
| | | this.collapsed = !val |
| | | } |
| | | }, |
| | | created() { |
| | | //--update-begin----author:scott---date:20190320------for:根据后台菜单配置,判断是否路由菜单字段,动态选择是否生成路由(为了支持参数URL菜单)------ |
| | | //this.menus = this.mainRouters.find((item) => item.path === '/').children; |
| | | this.menus = this.permissionMenuList |
| | | |
| | | //--update-begin----author:liusq---date:20210223------for:关于测边菜单遮挡内容问题详细说明 #2255 |
| | | this.collapsed=!this.sidebarOpened; |
| | | //--update-begin----author:liusq---date:20210223------for:关于测边菜单遮挡内容问题详细说明 #2255 |
| | | |
| | | // 根据后台配置菜单,重新排序加载路由信息 |
| | | //console.log('----加载菜单逻辑----') |
| | | //console.log(this.mainRouters) |
| | | //console.log(this.permissionMenuList) |
| | | //console.log('----navTheme------'+this.navTheme) |
| | | //--update-end----author:scott---date:20190320------for:根据后台菜单配置,判断是否路由菜单字段,动态选择是否生成路由(为了支持参数URL菜单)------ |
| | | }, |
| | | methods: { |
| | | ...mapActions(['setSidebar']), |
| | | toggle() { |
| | | this.collapsed = !this.collapsed |
| | | this.setSidebar(!this.collapsed) |
| | | triggerWindowResizeEvent() |
| | | }, |
| | | menuSelect() { |
| | | if (!this.isDesktop()) { |
| | | this.collapsed = false |
| | | } |
| | | }, |
| | | //update-begin-author:taoyan date:20190430 for:动态路由title显示配置的菜单title而不是其对应路由的title |
| | | myMenuSelect(value){ |
| | | //此处触发动态路由被点击事件 |
| | | this.findMenuBykey(this.menus,value.key) |
| | | this.$emit("dynamicRouterShow",value.key,this.activeMenu.meta.title) |
| | | }, |
| | | findMenuBykey(menus,key){ |
| | | for(let i of menus){ |
| | | if(i.path==key){ |
| | | this.activeMenu = {...i} |
| | | }else if(i.children && i.children.length>0){ |
| | | this.findMenuBykey(i.children,key) |
| | | } |
| | | } |
| | | }, |
| | | //update-end-author:taoyan date:20190430 for:动态路由title显示配置的菜单title而不是其对应路由的title |
| | | |
| | | // update-begin-author:sunjianlei date:20210409 for: 修复动态功能测试菜单、带参数菜单标题错误、展开错误的问题 |
| | | handleUpdateMenuTitle(value) { |
| | | this.findMenuBykey(this.menus, value.path) |
| | | this.activeMenu.meta.title = value.meta.title |
| | | this.$emit('dynamicRouterShow', value.path, this.activeMenu.meta.title) |
| | | }, |
| | | // update-end-author:sunjianlei date:20210409 for: 修复动态功能测试菜单、带参数菜单标题错误、展开错误的问题 |
| | | |
| | | } |
| | | } |
| | | |
| | | </script> |
| | | |
| | | <style lang="less"> |
| | | body { |
| | | // 打开滚动条固定显示 |
| | | // 注释原因:issues/I5VK11 |
| | | //overflow-y: scroll; |
| | | body { |
| | | // 打开滚动条固定显示 |
| | | // 注释原因:issues/I5VK11 |
| | | //overflow-y: scroll; |
| | | |
| | | &.colorWeak { |
| | | filter: invert(80%); |
| | | } |
| | | &.colorWeak { |
| | | filter: invert(80%); |
| | | } |
| | | } |
| | | |
| | | .layout { |
| | | min-height: 100vh !important; |
| | | overflow-x: hidden; |
| | | .layout { |
| | | min-height: 100vh !important; |
| | | overflow-x: hidden; |
| | | |
| | | &.mobile { |
| | | &.mobile { |
| | | |
| | | .ant-layout-content { |
| | | .ant-layout-content { |
| | | |
| | | .content { |
| | | margin: 24px 0 0; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * ant-table-wrapper |
| | | * 覆盖的表格手机模式样式,如果想修改在手机上表格最低宽度,可以在这里改动 |
| | | */ |
| | | .ant-table-wrapper { |
| | | .ant-table-content { |
| | | overflow-y: auto; |
| | | } |
| | | .ant-table-body { |
| | | // update-begin---author:sunjianlei Date:20220104 for: 【JTC-480】移动端不支持左右拖动,需要注释掉此段代码 ------------ |
| | | //min-width: 800px; |
| | | // update-end---author:sunjianlei Date:20220104 for: 【JTC-480】移动端不支持左右拖动,需要注释掉此段代码 ------------ |
| | | } |
| | | } |
| | | .sidemenu { |
| | | .ant-header-fixedHeader { |
| | | |
| | | &.ant-header-side-opened, &.ant-header-side-closed { |
| | | width: 100% |
| | | } |
| | | } |
| | | } |
| | | |
| | | .topmenu { |
| | | /* 必须为 topmenu 才能启用流式布局 */ |
| | | &.content-width-Fluid { |
| | | .header-index-wide { |
| | | margin-left: 0; |
| | | } |
| | | } |
| | | } |
| | | .header, .top-nav-header-index { |
| | | .user-wrapper .action { |
| | | padding: 0 12px; |
| | | } |
| | | .content { |
| | | margin: 24px 0 0; |
| | | } |
| | | } |
| | | |
| | | &.ant-layout-has-sider { |
| | | flex-direction: row; |
| | | /** |
| | | * ant-table-wrapper |
| | | * 覆盖的表格手机模式样式,如果想修改在手机上表格最低宽度,可以在这里改动 |
| | | */ |
| | | .ant-table-wrapper { |
| | | .ant-table-content { |
| | | overflow-y: auto; |
| | | } |
| | | .ant-table-body { |
| | | // update-begin---author:sunjianlei Date:20220104 for: 【JTC-480】移动端不支持左右拖动,需要注释掉此段代码 ------------ |
| | | //min-width: 800px; |
| | | // update-end---author:sunjianlei Date:20220104 for: 【JTC-480】移动端不支持左右拖动,需要注释掉此段代码 ------------ |
| | | } |
| | | } |
| | | .sidemenu { |
| | | .ant-header-fixedHeader { |
| | | |
| | | .trigger { |
| | | font-size: 22px; |
| | | line-height: 42px; |
| | | padding: 0 18px; |
| | | cursor: pointer; |
| | | transition: color 300ms, background 300ms; |
| | | |
| | | &:hover { |
| | | background: rgba(255, 255, 255, 0.3); |
| | | &.ant-header-side-opened, &.ant-header-side-closed { |
| | | width: 100% |
| | | } |
| | | } |
| | | } |
| | | |
| | | .topmenu { |
| | | .ant-header-fixedHeader { |
| | | position: fixed; |
| | | top: 0; |
| | | right: 0; |
| | | z-index: 9; |
| | | width: 100%; |
| | | transition: width .2s; |
| | | |
| | | &.ant-header-side-opened { |
| | | width: 100%; |
| | | } |
| | | |
| | | &.ant-header-side-closed { |
| | | width: 100%; |
| | | } |
| | | } |
| | | /* 必须为 topmenu 才能启用流式布局 */ |
| | | &.content-width-Fluid { |
| | | .header-index-wide { |
| | | max-width: unset; |
| | | margin-left: 24px; |
| | | } |
| | | |
| | | .page-header-index-wide { |
| | | max-width: unset; |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | .sidemenu { |
| | | .ant-header-fixedHeader { |
| | | position: fixed; |
| | | top: 0; |
| | | right: 0; |
| | | z-index: 9; |
| | | width: 100%; |
| | | transition: width .2s; |
| | | |
| | | &.ant-header-side-opened { |
| | | width: calc(100% - 200px) |
| | | } |
| | | |
| | | &.ant-header-side-closed { |
| | | width: calc(100% - 80px) |
| | | margin-left: 0; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .header { |
| | | height: 64px; |
| | | padding: 0 12px 0 0; |
| | | background: #fff; |
| | | box-shadow: 0 1px 4px rgba(0, 21, 41, .08); |
| | | position: relative; |
| | | } |
| | | |
| | | .header, .top-nav-header-index { |
| | | .user-wrapper .action { |
| | | padding: 0 12px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | &.ant-layout-has-sider { |
| | | flex-direction: row; |
| | | } |
| | | |
| | | .trigger { |
| | | font-size: 22px; |
| | | line-height: 42px; |
| | | padding: 0 18px; |
| | | cursor: pointer; |
| | | transition: color 300ms, background 300ms; |
| | | |
| | | &:hover { |
| | | background: rgba(255, 255, 255, 0.3); |
| | | } |
| | | } |
| | | |
| | | .topmenu { |
| | | .ant-header-fixedHeader { |
| | | position: fixed; |
| | | top: 0; |
| | | right: 0; |
| | | z-index: 9; |
| | | width: 100%; |
| | | transition: width .2s; |
| | | |
| | | &.ant-header-side-opened { |
| | | width: 100%; |
| | | } |
| | | |
| | | &.ant-header-side-closed { |
| | | width: 100%; |
| | | } |
| | | } |
| | | /* 必须为 topmenu 才能启用流式布局 */ |
| | | &.content-width-Fluid { |
| | | .header-index-wide { |
| | | max-width: unset; |
| | | margin-left: 24px; |
| | | } |
| | | |
| | | .page-header-index-wide { |
| | | max-width: unset; |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | .sidemenu { |
| | | .ant-header-fixedHeader { |
| | | position: fixed; |
| | | top: 0; |
| | | right: 0; |
| | | z-index: 9; |
| | | width: 100%; |
| | | transition: width .2s; |
| | | |
| | | &.ant-header-side-opened { |
| | | width: calc(100% - 200px) |
| | | } |
| | | |
| | | &.ant-header-side-closed { |
| | | width: calc(100% - 80px) |
| | | } |
| | | } |
| | | } |
| | | |
| | | .header { |
| | | height: 64px; |
| | | padding: 0 12px 0 0; |
| | | background: #fff; |
| | | box-shadow: 0 1px 4px rgba(0, 21, 41, .08); |
| | | position: relative; |
| | | } |
| | | |
| | | .header, .top-nav-header-index { |
| | | |
| | | .user-wrapper { |
| | | float: right; |
| | | height: 100%; |
| | | |
| | | .action { |
| | | cursor: pointer; |
| | | padding: 0 14px; |
| | | display: inline-block; |
| | | transition: all .3s; |
| | | |
| | | height: 70%; |
| | | line-height: 46px; |
| | | |
| | | &.action-full { |
| | | height: 100%; |
| | | } |
| | | |
| | | &:hover { |
| | | background: rgba(255, 255, 255, 0.3); |
| | | } |
| | | |
| | | .avatar { |
| | | margin: 20px 10px 20px 0; |
| | | color: #1890ff; |
| | | background: hsla(0, 0%, 100%, .85); |
| | | vertical-align: middle; |
| | | } |
| | | |
| | | .icon { |
| | | font-size: 16px; |
| | | padding: 4px; |
| | | } |
| | | |
| | | .anticon { |
| | | color: inherit; |
| | | } |
| | | } |
| | | } |
| | | |
| | | &.dark { |
| | | .user-wrapper { |
| | | float: right; |
| | | height: 100%; |
| | | |
| | | .action { |
| | | cursor: pointer; |
| | | padding: 0 14px; |
| | | display: inline-block; |
| | | transition: all .3s; |
| | | |
| | | height: 70%; |
| | | line-height: 46px; |
| | | |
| | | &.action-full { |
| | | height: 100%; |
| | | } |
| | | color: black; |
| | | |
| | | &:hover { |
| | | background: rgba(255, 255, 255, 0.3); |
| | | } |
| | | |
| | | .avatar { |
| | | margin: 20px 10px 20px 0; |
| | | color: #1890ff; |
| | | background: hsla(0, 0%, 100%, .85); |
| | | vertical-align: middle; |
| | | } |
| | | |
| | | .icon { |
| | | font-size: 16px; |
| | | padding: 4px; |
| | | background: rgba(0, 0, 0, 0.05); |
| | | } |
| | | |
| | | .anticon { |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | &.dark { |
| | | .user-wrapper { |
| | | |
| | | .action { |
| | | color: black; |
| | | |
| | | &:hover { |
| | | background: rgba(0, 0, 0, 0.05); |
| | | } |
| | | |
| | | .anticon { |
| | | color: inherit; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | &.mobile { |
| | | .top-nav-header-index { |
| | | |
| | | .header-index-wide { |
| | | |
| | | .header-index-left { |
| | | |
| | | .trigger { |
| | | color: rgba(255, 255, 255, 0.85); |
| | | padding: 0 12px; |
| | | } |
| | | |
| | | .logo.top-nav-header { |
| | | text-align: center; |
| | | width: 56px; |
| | | line-height: 58px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .user-wrapper .action .avatar { |
| | | margin: 20px 0; |
| | | } |
| | | |
| | | &.light { |
| | | |
| | | .header-index-wide { |
| | | |
| | | .header-index-left { |
| | | .trigger { |
| | | color: rgba(0, 0, 0, 0.65); |
| | | } |
| | | } |
| | | } |
| | | // |
| | | } |
| | | } |
| | | } |
| | | |
| | | &.tablet { |
| | | // overflow: hidden; text-overflow:ellipsis; white-space: nowrap; |
| | | .top-nav-header-index { |
| | | |
| | | .header-index-wide { |
| | | |
| | | .header-index-left { |
| | | .logo > a { |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | &.mobile { |
| | | .top-nav-header-index { |
| | | box-shadow: 0 1px 4px rgba(0, 21, 41, .08); |
| | | position: relative; |
| | | transition: background .3s, width .2s; |
| | | |
| | | .header-index-wide { |
| | | width: 100%; |
| | | margin: auto; |
| | | padding: 0 20px 0 0; |
| | | display: flex; |
| | | height: 59px; |
| | | |
| | | .ant-menu.ant-menu-horizontal { |
| | | border: none; |
| | | height: 64px; |
| | | line-height: 64px; |
| | | } |
| | | |
| | | .header-index-left { |
| | | flex: 1 1; |
| | | display: flex; |
| | | |
| | | .trigger { |
| | | color: rgba(255, 255, 255, 0.85); |
| | | padding: 0 12px; |
| | | } |
| | | |
| | | .logo.top-nav-header { |
| | | width: 165px; |
| | | height: 64px; |
| | | position: relative; |
| | | line-height: 64px; |
| | | transition: all .3s; |
| | | overflow: hidden; |
| | | |
| | | img { |
| | | display: inline-block; |
| | | vertical-align: middle; |
| | | height: 32px; |
| | | } |
| | | |
| | | h1 { |
| | | color: #fff; |
| | | display: inline-block; |
| | | vertical-align: top; |
| | | font-size: 16px; |
| | | margin: 0 0 0 12px; |
| | | font-weight: 400; |
| | | } |
| | | text-align: center; |
| | | width: 56px; |
| | | line-height: 58px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .header-index-right { |
| | | float: right; |
| | | height: 59px; |
| | | overflow: hidden; |
| | | .action:hover { |
| | | background-color: rgba(0, 0, 0, 0.05); |
| | | } |
| | | } |
| | | .user-wrapper .action .avatar { |
| | | margin: 20px 0; |
| | | } |
| | | |
| | | &.light { |
| | | background-color: #fff; |
| | | |
| | | .header-index-wide { |
| | | |
| | | .header-index-left { |
| | | .logo { |
| | | h1 { |
| | | color: #002140; |
| | | } |
| | | .trigger { |
| | | color: rgba(0, 0, 0, 0.65); |
| | | } |
| | | } |
| | | } |
| | | // |
| | | } |
| | | } |
| | | } |
| | | |
| | | &.dark { |
| | | &.tablet { |
| | | // overflow: hidden; text-overflow:ellipsis; white-space: nowrap; |
| | | .top-nav-header-index { |
| | | |
| | | .user-wrapper { |
| | | .header-index-wide { |
| | | |
| | | .action { |
| | | color: white; |
| | | |
| | | &:hover { |
| | | background: rgba(255, 255, 255, 0.3); |
| | | } |
| | | .header-index-left { |
| | | .logo > a { |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | } |
| | | } |
| | | .header-index-wide .header-index-left .trigger:hover { |
| | | background: rgba(255, 255, 255, 0.3); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | // 内容区 |
| | | .layout-content { |
| | | margin: 24px 24px 0px; |
| | | height: 64px; |
| | | padding: 0 12px 0 0; |
| | | } |
| | | |
| | | } |
| | | |
| | | .topmenu { |
| | | .page-header-index-wide { |
| | | margin: 0 auto; |
| | | width: 100%; |
| | | } |
| | | } |
| | | |
| | | // drawer-sider 自定义 |
| | | .ant-drawer.drawer-sider { |
| | | .sider { |
| | | box-shadow: none; |
| | | } |
| | | |
| | | &.dark { |
| | | .ant-drawer-content { |
| | | background-color: rgb(0, 21, 41); |
| | | } |
| | | } |
| | | &.light { |
| | | box-shadow: none; |
| | | .ant-drawer-content { |
| | | background-color: #fff; |
| | | } |
| | | } |
| | | |
| | | .ant-drawer-body { |
| | | padding: 0 |
| | | } |
| | | } |
| | | |
| | | // 菜单样式 |
| | | .sider { |
| | | box-shadow: 2px 116px 6px 0 rgba(0, 21, 41, .35); |
| | | .top-nav-header-index { |
| | | box-shadow: 0 1px 4px rgba(0, 21, 41, .08); |
| | | position: relative; |
| | | z-index: 10; |
| | | transition: background .3s, width .2s; |
| | | |
| | | &.ant-fixed-sidemenu { |
| | | position: fixed; |
| | | height: 100%; |
| | | } |
| | | .header-index-wide { |
| | | width: 100%; |
| | | margin: auto; |
| | | padding: 0 20px 0 0; |
| | | display: flex; |
| | | height: 59px; |
| | | |
| | | .logo { |
| | | height: 64px; |
| | | position: relative; |
| | | line-height: 64px; |
| | | padding-left: 24px; |
| | | -webkit-transition: all .3s; |
| | | transition: all .3s; |
| | | background: #002140; |
| | | overflow: hidden; |
| | | |
| | | img, h1 { |
| | | display: inline-block; |
| | | vertical-align: middle; |
| | | .ant-menu.ant-menu-horizontal { |
| | | border: none; |
| | | height: 64px; |
| | | line-height: 64px; |
| | | } |
| | | |
| | | img { |
| | | height: 32px; |
| | | .header-index-left { |
| | | flex: 1 1; |
| | | display: flex; |
| | | |
| | | .logo.top-nav-header { |
| | | width: 165px; |
| | | height: 64px; |
| | | position: relative; |
| | | line-height: 64px; |
| | | transition: all .3s; |
| | | overflow: hidden; |
| | | |
| | | img { |
| | | display: inline-block; |
| | | vertical-align: middle; |
| | | height: 32px; |
| | | } |
| | | |
| | | h1 { |
| | | color: #fff; |
| | | display: inline-block; |
| | | vertical-align: top; |
| | | font-size: 16px; |
| | | margin: 0 0 0 12px; |
| | | font-weight: 400; |
| | | } |
| | | } |
| | | } |
| | | |
| | | h1 { |
| | | color: #fff; |
| | | font-size: 18px; |
| | | margin: 0 0 0 8px; |
| | | font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; |
| | | font-weight: 600; |
| | | .header-index-right { |
| | | float: right; |
| | | height: 59px; |
| | | overflow: hidden; |
| | | .action:hover { |
| | | background-color: rgba(0, 0, 0, 0.05); |
| | | } |
| | | } |
| | | } |
| | | |
| | | &.light { |
| | | background-color: #fff; |
| | | box-shadow: 2px 116px 8px 0 rgba(29, 35, 41, 0.05); |
| | | |
| | | .logo { |
| | | background: #fff; |
| | | box-shadow: 1px 1px 0 0 #e8e8e8; |
| | | |
| | | h1 { |
| | | color: unset; |
| | | .header-index-wide { |
| | | .header-index-left { |
| | | .logo { |
| | | h1 { |
| | | color: #002140; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .ant-menu-light { |
| | | border-right-color: transparent; |
| | | &.dark { |
| | | |
| | | .user-wrapper { |
| | | |
| | | .action { |
| | | color: white; |
| | | |
| | | &:hover { |
| | | background: rgba(255, 255, 255, 0.3); |
| | | } |
| | | } |
| | | } |
| | | .header-index-wide .header-index-left .trigger:hover { |
| | | background: rgba(255, 255, 255, 0.3); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | // 外置的样式控制 |
| | | .user-dropdown-menu-wrapper.ant-dropdown-menu { |
| | | padding: 4px 0; |
| | | // 内容区 |
| | | .layout-content { |
| | | margin: 24px 24px 0px; |
| | | height: 64px; |
| | | padding: 0 12px 0 0; |
| | | } |
| | | |
| | | .ant-dropdown-menu-item { |
| | | width: 160px; |
| | | } |
| | | |
| | | .topmenu { |
| | | .page-header-index-wide { |
| | | margin: 0 auto; |
| | | width: 100%; |
| | | } |
| | | } |
| | | |
| | | // drawer-sider 自定义 |
| | | .ant-drawer.drawer-sider { |
| | | .sider { |
| | | box-shadow: none; |
| | | } |
| | | |
| | | &.dark { |
| | | .ant-drawer-content { |
| | | background-color: rgb(0, 21, 41); |
| | | } |
| | | } |
| | | &.light { |
| | | box-shadow: none; |
| | | .ant-drawer-content { |
| | | background-color: #fff; |
| | | } |
| | | } |
| | | |
| | | .ant-drawer-body { |
| | | padding: 0 |
| | | } |
| | | } |
| | | |
| | | // 菜单样式 |
| | | .sider { |
| | | box-shadow: 2px 116px 6px 0 rgba(0, 21, 41, .35); |
| | | position: relative; |
| | | z-index: 10; |
| | | |
| | | &.ant-fixed-sidemenu { |
| | | position: fixed; |
| | | height: 100%; |
| | | } |
| | | |
| | | .logo { |
| | | height: 64px; |
| | | position: relative; |
| | | line-height: 64px; |
| | | padding-left: 24px; |
| | | -webkit-transition: all .3s; |
| | | transition: all .3s; |
| | | background: #002140; |
| | | overflow: hidden; |
| | | |
| | | img, h1 { |
| | | display: inline-block; |
| | | vertical-align: middle; |
| | | } |
| | | |
| | | .ant-dropdown-menu-item > .anticon:first-child, |
| | | .ant-dropdown-menu-item > a > .anticon:first-child, |
| | | .ant-dropdown-menu-submenu-title > .anticon:first-child |
| | | .ant-dropdown-menu-submenu-title > a > .anticon:first-child { |
| | | min-width: 12px; |
| | | img { |
| | | height: 32px; |
| | | } |
| | | |
| | | h1 { |
| | | color: #fff; |
| | | font-size: 18px; |
| | | margin: 0 0 0 8px; |
| | | font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; |
| | | font-weight: 600; |
| | | } |
| | | } |
| | | |
| | | &.light { |
| | | background-color: #fff; |
| | | box-shadow: 2px 116px 8px 0 rgba(29, 35, 41, 0.05); |
| | | |
| | | .logo { |
| | | background: #fff; |
| | | box-shadow: 1px 1px 0 0 #e8e8e8; |
| | | |
| | | h1 { |
| | | color: unset; |
| | | } |
| | | } |
| | | |
| | | .ant-menu-light { |
| | | border-right-color: transparent; |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | // 外置的样式控制 |
| | | .user-dropdown-menu-wrapper.ant-dropdown-menu { |
| | | padding: 4px 0; |
| | | |
| | | .ant-dropdown-menu-item { |
| | | width: 160px; |
| | | } |
| | | |
| | | .ant-dropdown-menu-item > .anticon:first-child, |
| | | .ant-dropdown-menu-item > a > .anticon:first-child, |
| | | .ant-dropdown-menu-submenu-title > .anticon:first-child |
| | | .ant-dropdown-menu-submenu-title > a > .anticon:first-child { |
| | | min-width: 12px; |
| | | margin-right: 8px; |
| | | } |
| | | |
| | | } |
| | | |
| | | // 数据列表 样式 |
| | | .table-alert { |
| | | margin-bottom: 16px; |
| | | } |
| | | |
| | | .table-page-search-wrapper { |
| | | |
| | | .ant-form-inline { |
| | | |
| | | .ant-form-item { |
| | | display: flex; |
| | | margin-bottom: 24px; |
| | | margin-right: 0; |
| | | |
| | | .ant-form-item-control-wrapper { |
| | | flex: 1 1; |
| | | display: inline-block; |
| | | vertical-align: middle; |
| | | } |
| | | |
| | | > .ant-form-item-label { |
| | | line-height: 32px; |
| | | padding-right: 8px; |
| | | width: auto; |
| | | } |
| | | .ant-form-item-control { |
| | | height: 32px; |
| | | line-height: 32px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .table-page-search-submitButtons { |
| | | display: block; |
| | | margin-bottom: 24px; |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | } |
| | | |
| | | .content { |
| | | |
| | | .table-operator { |
| | | margin-bottom: 18px; |
| | | |
| | | button { |
| | | margin-right: 8px; |
| | | } |
| | | |
| | | } |
| | | |
| | | // 数据列表 样式 |
| | | .table-alert { |
| | | margin-bottom: 16px; |
| | | } |
| | | |
| | | .table-page-search-wrapper { |
| | | |
| | | .ant-form-inline { |
| | | |
| | | .ant-form-item { |
| | | display: flex; |
| | | margin-bottom: 24px; |
| | | margin-right: 0; |
| | | |
| | | .ant-form-item-control-wrapper { |
| | | flex: 1 1; |
| | | display: inline-block; |
| | | vertical-align: middle; |
| | | } |
| | | |
| | | > .ant-form-item-label { |
| | | line-height: 32px; |
| | | padding-right: 8px; |
| | | width: auto; |
| | | } |
| | | .ant-form-item-control { |
| | | height: 32px; |
| | | line-height: 32px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .table-page-search-submitButtons { |
| | | display: block; |
| | | margin-bottom: 24px; |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | } |
| | | |
| | | .content { |
| | | |
| | | .table-operator { |
| | | margin-bottom: 18px; |
| | | |
| | | button { |
| | | margin-right: 8px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <div class="page-container"> |
| | | <div class="content-container"> |
| | | <div style="width: 50%" class="left-col"> |
| | | <dv-border-box-9 style="padding: 30px 20px 0"> |
| | | <div id="running_state_chart" style="width:100%;height: 300px"></div> |
| | | <div id="efficiency_chart" style="width: 100%;height: 465px"></div> |
| | | </dv-border-box-9> |
| | | <div class="home-container"> |
| | | <div class="left-card"> |
| | | <div class="card"> |
| | | <h2 class="card-title">卡片1</h2> |
| | | <div class="card-content"> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div style="width: 50%" class="middle-col"> |
| | | <dv-border-box-9 style="padding: 10px 10px 0"> |
| | | <!-- 添加"我的待办"标题 --> |
| | | <div class="flow-todo-title">我的待办</div> |
| | | |
| | | <!-- 右侧两个小卡片 --> |
| | | <div class="right-cards"> |
| | | <div class="card top-card"> |
| | | <h2 class="card-title">我的待办</h2> |
| | | <div class="card-content"> |
| | | <!-- 嵌入FlowTodo组件并设置默认分类 --> |
| | | <flow-todo |
| | | ref="flowTodo" |
| | | class="embedded-flow-todo" |
| | | :defaultCategories="['drApproval','ggApproval','programConfirmApproval']" |
| | | ></flow-todo> |
| | | </dv-border-box-9> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="card bottom-card"> |
| | | <h2 class="card-title">卡片2</h2> |
| | | <div class="card-content"> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | // 确保组件加载后使用默认分类查询数据 |
| | | this.$nextTick(() => { |
| | | if (this.$refs.flowTodo) { |
| | | // 触发查询,使用默认的category条件[1,2] |
| | | this.$refs.flowTodo.searchQuery() |
| | | } |
| | | }) |
| | |
| | | } |
| | | </script> |
| | | |
| | | <style lang="less" scoped> |
| | | .page-container { |
| | | background-color: #000b29; |
| | | <style scoped> |
| | | .home-container { |
| | | display: flex; |
| | | min-height: 100vh; |
| | | padding: 15px; |
| | | |
| | | .content-container { |
| | | padding-top: 5px; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | gap: 15px; |
| | | |
| | | .left-col, .middle-col { |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .middle-col { |
| | | .dv-border-box-9 { |
| | | background-color: #000b29; |
| | | flex-grow: 1; |
| | | } |
| | | |
| | | .flow-todo-title { |
| | | color: #fff; |
| | | font-size: 18px; |
| | | font-weight: bold; |
| | | margin-bottom: 15px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .embedded-flow-todo { |
| | | width: 100%; |
| | | height: 340px; /* 控制高度为右侧一半区域 */ |
| | | overflow: auto; |
| | | background-color: inherit; |
| | | } |
| | | } |
| | | } |
| | | padding: 20px; |
| | | box-sizing: border-box; |
| | | gap: 20px; |
| | | background-color: #f5f7fa; |
| | | } |
| | | |
| | | // 嵌入组件样式调整 |
| | | .embedded-flow-todo { |
| | | // 隐藏查询区域、操作按钮和选择提示 |
| | | /deep/ .table-page-search-wrapper, |
| | | /deep/ .table-operator, |
| | | /deep/ .ant-alert { |
| | | display: none !important; |
| | | } |
| | | |
| | | // 隐藏多选框列 |
| | | /deep/ .ant-table-selection-column { |
| | | display: none !important; |
| | | } |
| | | |
| | | // 表格边框样式 |
| | | /deep/ .ant-table { |
| | | border: 1px solid rgba(9, 9, 9, 0.1) !important; |
| | | border-collapse: collapse !important; |
| | | } |
| | | /deep/ .ant-table-thead > tr > th { |
| | | border: 1px solid rgba(9, 9, 9, 0.1) !important; |
| | | } |
| | | /deep/ .ant-table-tbody > tr > td { |
| | | border: 1px solid rgba(9, 9, 9, 0.1) !important; |
| | | } |
| | | |
| | | // 表格样式调整 |
| | | /deep/ .ant-table, |
| | | /deep/ .ant-table-tbody > tr > td, |
| | | /deep/ .ant-table-thead > tr > th, |
| | | /deep/ .ant-table-thead > tr > th span { |
| | | background-color: transparent !important; |
| | | color: #000000 !important; |
| | | } |
| | | |
| | | // 分页控件样式 |
| | | /deep/ .ant-pagination-item, |
| | | /deep/ .ant-pagination-prev, |
| | | /deep/ .ant-pagination-next { |
| | | background-color: rgb(255, 255, 255) !important; |
| | | border-color: rgb(255, 255, 255) !important; |
| | | } |
| | | |
| | | /deep/ .ant-pagination-item a, |
| | | /deep/ .ant-pagination-prev a, |
| | | /deep/ .ant-pagination-next a { |
| | | color: #000000 !important; |
| | | } |
| | | |
| | | /deep/ .ant-pagination-item-active { |
| | | background-color: rgba(33, 186, 198, 0.6) !important; |
| | | border-color: rgba(33, 186, 198, 0.8) !important; |
| | | } |
| | | |
| | | /deep/ .ant-card { |
| | | background-color: transparent !important; |
| | | border: none !important; |
| | | } |
| | | |
| | | // 操作列链接样式 |
| | | /deep/ .ant-table-tbody > tr > td a { |
| | | color: #40a9ff !important; |
| | | } |
| | | .left-card { |
| | | flex: 1; |
| | | min-width: 0; |
| | | } |
| | | |
| | | // 边框组件样式 |
| | | /deep/ .dv-border-box-9 { |
| | | --color: rgba(33, 186, 198, 0.6) !important; |
| | | background-color: #000b29 !important; |
| | | .right-cards { |
| | | flex: 1; |
| | | min-width: 0; |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 20px; |
| | | } |
| | | </style> |
| | | |
| | | .card { |
| | | background: #ffffff; |
| | | border-radius: 8px; |
| | | box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08); |
| | | padding: 10px; |
| | | height: 100%; |
| | | display: flex; |
| | | flex-direction: column; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .top-card { |
| | | flex: 1; |
| | | } |
| | | |
| | | .bottom-card { |
| | | flex: 1; |
| | | } |
| | | |
| | | .card-title { |
| | | margin: 0 0 15px 0; |
| | | color: #333; |
| | | font-size: 18px; |
| | | font-weight: 600; |
| | | padding-bottom: 10px; |
| | | border-bottom: 1px solid #eee; |
| | | } |
| | | |
| | | .card-content { |
| | | flex: 1; |
| | | overflow: auto; |
| | | } |
| | | |
| | | /* 清除待办页面查询条件、选中条数、复选框 */ |
| | | .embedded-flow-todo >>> .table-page-search-wrapper { |
| | | display: none !important; |
| | | } |
| | | |
| | | .embedded-flow-todo >>> .table-operator { |
| | | display: none !important; |
| | | } |
| | | |
| | | .embedded-flow-todo >>> .ant-alert.ant-alert-info { |
| | | display: none !important; |
| | | } |
| | | |
| | | .embedded-flow-todo >>> .ant-table-thead .ant-table-selection-column, |
| | | .embedded-flow-todo >>> .ant-table-tbody .ant-table-selection-column { |
| | | display: none !important; |
| | | } |
| | | |
| | | .embedded-flow-todo >>> .ant-table-selection { |
| | | display: none !important; |
| | | } |
| | | .embedded-flow-todo >>> .ant-table-row-selected { |
| | | background: transparent !important; |
| | | } |
| | | |
| | | .embedded-flow-todo >>> .a-table { |
| | | margin-top: 0 !important; |
| | | border-top: none !important; |
| | | } |
| | | |
| | | @media (max-width: 992px) { |
| | | .home-container { |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .left-card, .right-cards { |
| | | width: 100%; |
| | | } |
| | | |
| | | .left-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | } |
| | | </style> |