修改系统
This commit is contained in:
		
							
								
								
									
										25
									
								
								stdiet-ui/src/layout/components/Sidebar/FixiOSBug.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								stdiet-ui/src/layout/components/Sidebar/FixiOSBug.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| export default { | ||||
|   computed: { | ||||
|     device() { | ||||
|       return this.$store.state.app.device | ||||
|     } | ||||
|   }, | ||||
|   mounted() { | ||||
|     // In order to fix the click on menu on the ios device will trigger the mouseleave bug | ||||
|     this.fixBugIniOS() | ||||
|   }, | ||||
|   methods: { | ||||
|     fixBugIniOS() { | ||||
|       const $subMenu = this.$refs.subMenu | ||||
|       if ($subMenu) { | ||||
|         const handleMouseleave = $subMenu.handleMouseleave | ||||
|         $subMenu.handleMouseleave = (e) => { | ||||
|           if (this.device === 'mobile') { | ||||
|             return | ||||
|           } | ||||
|           handleMouseleave(e) | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										29
									
								
								stdiet-ui/src/layout/components/Sidebar/Item.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								stdiet-ui/src/layout/components/Sidebar/Item.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| <script> | ||||
| export default { | ||||
|   name: 'MenuItem', | ||||
|   functional: true, | ||||
|   props: { | ||||
|     icon: { | ||||
|       type: String, | ||||
|       default: '' | ||||
|     }, | ||||
|     title: { | ||||
|       type: String, | ||||
|       default: '' | ||||
|     } | ||||
|   }, | ||||
|   render(h, context) { | ||||
|     const { icon, title } = context.props | ||||
|     const vnodes = [] | ||||
|  | ||||
|     if (icon) { | ||||
|       vnodes.push(<svg-icon icon-class={icon}/>) | ||||
|     } | ||||
|  | ||||
|     if (title) { | ||||
|       vnodes.push(<span slot='title'>{(title)}</span>) | ||||
|     } | ||||
|     return vnodes | ||||
|   } | ||||
| } | ||||
| </script> | ||||
							
								
								
									
										43
									
								
								stdiet-ui/src/layout/components/Sidebar/Link.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								stdiet-ui/src/layout/components/Sidebar/Link.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| <template> | ||||
|   <component :is="type" v-bind="linkProps(to)"> | ||||
|     <slot /> | ||||
|   </component> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import { isExternal } from '@/utils/validate' | ||||
|  | ||||
| export default { | ||||
|   props: { | ||||
|     to: { | ||||
|       type: String, | ||||
|       required: true | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     isExternal() { | ||||
|       return isExternal(this.to) | ||||
|     }, | ||||
|     type() { | ||||
|       if (this.isExternal) { | ||||
|         return 'a' | ||||
|       } | ||||
|       return 'router-link' | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     linkProps(to) { | ||||
|       if (this.isExternal) { | ||||
|         return { | ||||
|           href: to, | ||||
|           target: '_blank', | ||||
|           rel: 'noopener' | ||||
|         } | ||||
|       } | ||||
|       return { | ||||
|         to: to | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
							
								
								
									
										84
									
								
								stdiet-ui/src/layout/components/Sidebar/Logo.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								stdiet-ui/src/layout/components/Sidebar/Logo.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| <template> | ||||
|   <div class="sidebar-logo-container" :class="{'collapse':collapse}"> | ||||
|     <transition name="sidebarLogoFade"> | ||||
|       <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/"> | ||||
|         <img v-if="logo" :src="logo" class="sidebar-logo"> | ||||
|         <h1 v-else class="sidebar-title">{{ title }} </h1> | ||||
|       </router-link> | ||||
|       <router-link v-else key="expand" class="sidebar-logo-link" to="/"> | ||||
|         <img v-if="logo" :src="logo" class="sidebar-logo"> | ||||
|         <h1 class="sidebar-title">{{ title }} </h1> | ||||
|       </router-link> | ||||
|     </transition> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import logoImg from '@/assets/logo/logo.png' | ||||
|  | ||||
| export default { | ||||
|   name: 'SidebarLogo', | ||||
|   props: { | ||||
|     collapse: { | ||||
|       type: Boolean, | ||||
|       required: true | ||||
|     } | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       title: '管理系统', | ||||
|       logo: logoImg | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .sidebarLogoFade-enter-active { | ||||
|   transition: opacity 1.5s; | ||||
| } | ||||
|  | ||||
| .sidebarLogoFade-enter, | ||||
| .sidebarLogoFade-leave-to { | ||||
|   opacity: 0; | ||||
| } | ||||
|  | ||||
| .sidebar-logo-container { | ||||
|   position: relative; | ||||
|   width: 100%; | ||||
|   height: 50px; | ||||
|   line-height: 50px; | ||||
|   background: #2b2f3a; | ||||
|   text-align: center; | ||||
|   overflow: hidden; | ||||
|  | ||||
|   & .sidebar-logo-link { | ||||
|     height: 100%; | ||||
|     width: 100%; | ||||
|  | ||||
|     & .sidebar-logo { | ||||
|       width: 32px; | ||||
|       height: 32px; | ||||
|       vertical-align: middle; | ||||
|       margin-right: 12px; | ||||
|     } | ||||
|  | ||||
|     & .sidebar-title { | ||||
|       display: inline-block; | ||||
|       margin: 0; | ||||
|       color: #fff; | ||||
|       font-weight: 600; | ||||
|       line-height: 50px; | ||||
|       font-size: 14px; | ||||
|       font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif; | ||||
|       vertical-align: middle; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   &.collapse { | ||||
|     .sidebar-logo { | ||||
|       margin-right: 0px; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										93
									
								
								stdiet-ui/src/layout/components/Sidebar/SidebarItem.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								stdiet-ui/src/layout/components/Sidebar/SidebarItem.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | ||||
| <template> | ||||
|   <div v-if="!item.hidden"> | ||||
|     <template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow"> | ||||
|       <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)"> | ||||
|         <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}"> | ||||
|           <item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="onlyOneChild.meta.title" /> | ||||
|         </el-menu-item> | ||||
|       </app-link> | ||||
|     </template> | ||||
|  | ||||
|     <el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body> | ||||
|       <template slot="title"> | ||||
|         <item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" /> | ||||
|       </template> | ||||
|       <sidebar-item | ||||
|         v-for="child in item.children" | ||||
|         :key="child.path" | ||||
|         :is-nest="true" | ||||
|         :item="child" | ||||
|         :base-path="resolvePath(child.path)" | ||||
|         class="nest-menu" | ||||
|       /> | ||||
|     </el-submenu> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import path from 'path' | ||||
| import { isExternal } from '@/utils/validate' | ||||
| import Item from './Item' | ||||
| import AppLink from './Link' | ||||
| import FixiOSBug from './FixiOSBug' | ||||
|  | ||||
| export default { | ||||
|   name: 'SidebarItem', | ||||
|   components: { Item, AppLink }, | ||||
|   mixins: [FixiOSBug], | ||||
|   props: { | ||||
|     // route object | ||||
|     item: { | ||||
|       type: Object, | ||||
|       required: true | ||||
|     }, | ||||
|     isNest: { | ||||
|       type: Boolean, | ||||
|       default: false | ||||
|     }, | ||||
|     basePath: { | ||||
|       type: String, | ||||
|       default: '' | ||||
|     } | ||||
|   }, | ||||
|   data() { | ||||
|     this.onlyOneChild = null | ||||
|     return {} | ||||
|   }, | ||||
|   methods: { | ||||
|     hasOneShowingChild(children = [], parent) { | ||||
|       const showingChildren = children.filter(item => { | ||||
|         if (item.hidden) { | ||||
|           return false | ||||
|         } else { | ||||
|           // Temp set(will be used if only has one showing child) | ||||
|           this.onlyOneChild = item | ||||
|           return true | ||||
|         } | ||||
|       }) | ||||
|  | ||||
|       // When there is only one child router, the child router is displayed by default | ||||
|       if (showingChildren.length === 1) { | ||||
|         return true | ||||
|       } | ||||
|  | ||||
|       // Show parent if there are no child router to display | ||||
|       if (showingChildren.length === 0) { | ||||
|         this.onlyOneChild = { ... parent, path: '', noShowingChildren: true } | ||||
|         return true | ||||
|       } | ||||
|  | ||||
|       return false | ||||
|     }, | ||||
|     resolvePath(routePath) { | ||||
|       if (isExternal(routePath)) { | ||||
|         return routePath | ||||
|       } | ||||
|       if (isExternal(this.basePath)) { | ||||
|         return this.basePath | ||||
|       } | ||||
|       return path.resolve(this.basePath, routePath) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
							
								
								
									
										57
									
								
								stdiet-ui/src/layout/components/Sidebar/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								stdiet-ui/src/layout/components/Sidebar/index.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| <template> | ||||
|     <div :class="{'has-logo':showLogo}"> | ||||
|         <logo v-if="showLogo" :collapse="isCollapse" /> | ||||
|         <el-scrollbar wrap-class="scrollbar-wrapper"> | ||||
|             <el-menu | ||||
|                 :default-active="activeMenu" | ||||
|                 :collapse="isCollapse" | ||||
|                 :background-color="variables.menuBg" | ||||
|                 :text-color="variables.menuText" | ||||
|                 :unique-opened="true" | ||||
|                 :active-text-color="settings.theme" | ||||
|                 :collapse-transition="false" | ||||
|                 mode="vertical" | ||||
|             > | ||||
|                 <sidebar-item | ||||
|                     v-for="(route, index) in permission_routes" | ||||
|                     :key="route.path  + index" | ||||
|                     :item="route" | ||||
|                     :base-path="route.path" | ||||
|                 /> | ||||
|             </el-menu> | ||||
|         </el-scrollbar> | ||||
|     </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import { mapGetters, mapState } from "vuex"; | ||||
| import Logo from "./Logo"; | ||||
| import SidebarItem from "./SidebarItem"; | ||||
| import variables from "@/assets/styles/variables.scss"; | ||||
|  | ||||
| export default { | ||||
|     components: { SidebarItem, Logo }, | ||||
|     computed: { | ||||
|         ...mapState(["settings"]), | ||||
|         ...mapGetters(["permission_routes", "sidebar"]), | ||||
|         activeMenu() { | ||||
|             const route = this.$route; | ||||
|             const { meta, path } = route; | ||||
|             // if set path, the sidebar will highlight the path you set | ||||
|             if (meta.activeMenu) { | ||||
|                 return meta.activeMenu; | ||||
|             } | ||||
|             return path; | ||||
|         }, | ||||
|         showLogo() { | ||||
|             return this.$store.state.settings.sidebarLogo; | ||||
|         }, | ||||
|         variables() { | ||||
|             return variables; | ||||
|         }, | ||||
|         isCollapse() { | ||||
|             return !this.sidebar.opened; | ||||
|         } | ||||
|     } | ||||
| }; | ||||
| </script> | ||||
		Reference in New Issue
	
	Block a user