Commit 9287779ac911857f66b0149df2da33126b59af0a
1 parent
00e29fae
add 官网嵌入车主平台 架构
Showing
10 changed files
with
180 additions
and
201 deletions
src/components/SvgIcon/index.vue
| 1 | <template> | 1 | <template> |
| 2 | - <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" /> | ||
| 3 | - <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners"> | 2 | + <svg :class="svgClass" aria-hidden="true" v-on="$listeners"> |
| 4 | <use :xlink:href="iconName" /> | 3 | <use :xlink:href="iconName" /> |
| 5 | </svg> | 4 | </svg> |
| 6 | </template> | 5 | </template> |
| 7 | 6 | ||
| 8 | <script> | 7 | <script> |
| 9 | -// doc: https://panjiachen.github.io/vue-element-admin-site/feature/component/svg-icon.html#usage | ||
| 10 | -import { isExternal } from '@/utils/validate' | ||
| 11 | - | ||
| 12 | -export default { | ||
| 13 | - name: 'SvgIcon', | ||
| 14 | - props: { | ||
| 15 | - iconClass: { | ||
| 16 | - type: String, | ||
| 17 | - required: true | ||
| 18 | - }, | ||
| 19 | - className: { | ||
| 20 | - type: String, | ||
| 21 | - default: '' | ||
| 22 | - } | ||
| 23 | - }, | ||
| 24 | - computed: { | ||
| 25 | - isExternal() { | ||
| 26 | - return isExternal(this.iconClass) | ||
| 27 | - }, | ||
| 28 | - iconName() { | ||
| 29 | - return `#icon-${this.iconClass}` | ||
| 30 | - }, | ||
| 31 | - svgClass() { | ||
| 32 | - if (this.className) { | ||
| 33 | - return 'svg-icon ' + this.className | ||
| 34 | - } else { | ||
| 35 | - return 'svg-icon' | 8 | + export default { |
| 9 | + name: 'SvgIcon', | ||
| 10 | + props: { | ||
| 11 | + iconClass: { | ||
| 12 | + type: String, | ||
| 13 | + required: true | ||
| 14 | + }, | ||
| 15 | + className: { | ||
| 16 | + type: String, | ||
| 17 | + default: '' | ||
| 36 | } | 18 | } |
| 37 | }, | 19 | }, |
| 38 | - styleExternalIcon() { | ||
| 39 | - return { | ||
| 40 | - mask: `url(${this.iconClass}) no-repeat 50% 50%`, | ||
| 41 | - '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%` | 20 | + computed: { |
| 21 | + iconName() { | ||
| 22 | + return `#icon-${this.iconClass}` | ||
| 23 | + }, | ||
| 24 | + svgClass() { | ||
| 25 | + if (this.className) { | ||
| 26 | + return 'svg-icon ' + this.className | ||
| 27 | + } else { | ||
| 28 | + return 'svg-icon' | ||
| 29 | + } | ||
| 42 | } | 30 | } |
| 43 | } | 31 | } |
| 44 | } | 32 | } |
| 45 | -} | ||
| 46 | </script> | 33 | </script> |
| 47 | 34 | ||
| 48 | <style scoped> | 35 | <style scoped> |
| 49 | -.svg-icon { | ||
| 50 | - width: 1em; | ||
| 51 | - height: 1em; | ||
| 52 | - vertical-align: -0.15em; | ||
| 53 | - fill: currentColor; | ||
| 54 | - overflow: hidden; | ||
| 55 | -} | ||
| 56 | - | ||
| 57 | -.svg-external-icon { | ||
| 58 | - background-color: currentColor; | ||
| 59 | - mask-size: cover!important; | ||
| 60 | - display: inline-block; | ||
| 61 | -} | 36 | + .svg-icon { |
| 37 | + width: 1em; | ||
| 38 | + height: 1em; | ||
| 39 | + vertical-align: -0.15em; | ||
| 40 | + fill: currentColor; | ||
| 41 | + overflow: hidden; | ||
| 42 | + } | ||
| 62 | </style> | 43 | </style> |
src/components/VHeader.vue
| @@ -38,7 +38,7 @@ export default { | @@ -38,7 +38,7 @@ export default { | ||
| 38 | } | 38 | } |
| 39 | </script> | 39 | </script> |
| 40 | 40 | ||
| 41 | -<style scoped lang="scss"> | 41 | +<style lang="scss"> |
| 42 | /* http://meyerweb.com/eric/tools/css/reset/ | 42 | /* http://meyerweb.com/eric/tools/css/reset/ |
| 43 | v4.0 | 20180602 | 43 | v4.0 | 20180602 |
| 44 | License: none (public domain) | 44 | License: none (public domain) |
src/components/config.js deleted
| 1 | -let config = { | ||
| 2 | - "entity": null, | ||
| 3 | - "childs": [ | ||
| 4 | - { | ||
| 5 | - "entity": { | ||
| 6 | - "id": 1, //id标识 | ||
| 7 | - "title": "中心首页", //菜单标题 | ||
| 8 | - "icon": "el-icon-s-home",//菜单logo | ||
| 9 | - "url": "/views/dashboard",//菜单路径 | ||
| 10 | - }, | ||
| 11 | - }, | ||
| 12 | - { | ||
| 13 | - "entity": { | ||
| 14 | - "id": 2, | ||
| 15 | - "title": "我的钱包", | ||
| 16 | - "icon": "el-icon-bank-card", | ||
| 17 | - "url": "example", | ||
| 18 | - }, | ||
| 19 | - "childs": [ | ||
| 20 | - { | ||
| 21 | - "entity": { | ||
| 22 | - "id": 2-1, | ||
| 23 | - "title": "我的账户", | ||
| 24 | - "url": "account", | ||
| 25 | - }, | ||
| 26 | - "childs": null | ||
| 27 | - }, | ||
| 28 | - { | ||
| 29 | - "entity": { | ||
| 30 | - "id": 2-2, | ||
| 31 | - "title": "我的卡券", | ||
| 32 | - "url": "cardticket", | ||
| 33 | - } | ||
| 34 | - }, | ||
| 35 | - ] | ||
| 36 | - }, | ||
| 37 | - { | ||
| 38 | - "entity": { | ||
| 39 | - "id": 3, | ||
| 40 | - "title": "我的订单", | ||
| 41 | - "icon": "el-icon-tickets", | ||
| 42 | - "url": "order", | ||
| 43 | - }, | ||
| 44 | - | ||
| 45 | - }, | ||
| 46 | - { | ||
| 47 | - "entity": { | ||
| 48 | - "id": 4, | ||
| 49 | - "title": "欠费补缴", | ||
| 50 | - "icon": "el-icon-document-checked", | ||
| 51 | - "url": "payback", | ||
| 52 | - } | ||
| 53 | - }, | ||
| 54 | - { | ||
| 55 | - "entity": { | ||
| 56 | - "id": 5, | ||
| 57 | - "title": "我的车辆", | ||
| 58 | - "icon": "el-icon-truck", | ||
| 59 | - "url": "mycar", | ||
| 60 | - } | ||
| 61 | - }, | ||
| 62 | - { | ||
| 63 | - "entity": { | ||
| 64 | - "id": 6, | ||
| 65 | - "title": "个人中心", | ||
| 66 | - "icon": "el-icon-s-custom", | ||
| 67 | - "url": "mycar", | ||
| 68 | - }, | ||
| 69 | - "childs": [ | ||
| 70 | - { | ||
| 71 | - "entity": { | ||
| 72 | - "id": 6-1, | ||
| 73 | - "title": "个人资料", | ||
| 74 | - "url": "information", | ||
| 75 | - }, | ||
| 76 | - "childs": null | ||
| 77 | - }, | ||
| 78 | - { | ||
| 79 | - "entity": { | ||
| 80 | - "id": 6-2, | ||
| 81 | - "title": "我的评价", | ||
| 82 | - "url": "myevaluate", | ||
| 83 | - } | ||
| 84 | - }, | ||
| 85 | - ] | ||
| 86 | - }, | ||
| 87 | - ] | ||
| 88 | -} | ||
| 89 | -export default config |
src/layout/components/Navbar.vue
| @@ -2,7 +2,7 @@ | @@ -2,7 +2,7 @@ | ||
| 2 | <div class="navbar"> | 2 | <div class="navbar"> |
| 3 | <hamburger :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" /> | 3 | <hamburger :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" /> |
| 4 | 4 | ||
| 5 | - <!--<breadcrumb class="breadcrumb-container" />--> | 5 | + <breadcrumb class="breadcrumb-container" /> |
| 6 | 6 | ||
| 7 | <div class="right-menu"> | 7 | <div class="right-menu"> |
| 8 | <el-dropdown class="avatar-container" trigger="click"> | 8 | <el-dropdown class="avatar-container" trigger="click"> |
| @@ -11,9 +11,19 @@ | @@ -11,9 +11,19 @@ | ||
| 11 | <i class="el-icon-caret-bottom" /> | 11 | <i class="el-icon-caret-bottom" /> |
| 12 | </div> | 12 | </div> |
| 13 | <el-dropdown-menu slot="dropdown" class="user-dropdown"> | 13 | <el-dropdown-menu slot="dropdown" class="user-dropdown"> |
| 14 | - | 14 | + <router-link to="/"> |
| 15 | + <el-dropdown-item> | ||
| 16 | + Home | ||
| 17 | + </el-dropdown-item> | ||
| 18 | + </router-link> | ||
| 19 | + <a target="_blank" href="https://github.com/PanJiaChen/vue-admin-template/"> | ||
| 20 | + <el-dropdown-item>Github</el-dropdown-item> | ||
| 21 | + </a> | ||
| 22 | + <a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/#/"> | ||
| 23 | + <el-dropdown-item>Docs</el-dropdown-item> | ||
| 24 | + </a> | ||
| 15 | <el-dropdown-item divided> | 25 | <el-dropdown-item divided> |
| 16 | - <span style="display:block;" @click="logout">退出</span> | 26 | + <span style="display:block;" @click="logout">Log Out</span> |
| 17 | </el-dropdown-item> | 27 | </el-dropdown-item> |
| 18 | </el-dropdown-menu> | 28 | </el-dropdown-menu> |
| 19 | </el-dropdown> | 29 | </el-dropdown> |
| @@ -23,12 +33,12 @@ | @@ -23,12 +33,12 @@ | ||
| 23 | 33 | ||
| 24 | <script> | 34 | <script> |
| 25 | import { mapGetters } from 'vuex' | 35 | import { mapGetters } from 'vuex' |
| 26 | -// import Breadcrumb from '@/components/Breadcrumb' | 36 | +import Breadcrumb from '@/components/Breadcrumb' |
| 27 | import Hamburger from '@/components/Hamburger' | 37 | import Hamburger from '@/components/Hamburger' |
| 28 | 38 | ||
| 29 | export default { | 39 | export default { |
| 30 | components: { | 40 | components: { |
| 31 | - // Breadcrumb, | 41 | + Breadcrumb, |
| 32 | Hamburger | 42 | Hamburger |
| 33 | }, | 43 | }, |
| 34 | computed: { | 44 | computed: { |
src/layout/components/Sidebar/index.vue
| @@ -12,7 +12,7 @@ | @@ -12,7 +12,7 @@ | ||
| 12 | :collapse-transition="false" | 12 | :collapse-transition="false" |
| 13 | mode="vertical" | 13 | mode="vertical" |
| 14 | > | 14 | > |
| 15 | - <sidebar-item v-for="route in routes" :key="route.path" :item="route" :base-path="route.path" /> | 15 | + <sidebar-item v-for="route in totalList" :key="route.path" :item="route" :base-path="route.path" /> |
| 16 | </el-menu> | 16 | </el-menu> |
| 17 | </el-scrollbar> | 17 | </el-scrollbar> |
| 18 | </div> | 18 | </div> |
| @@ -51,6 +51,9 @@ export default { | @@ -51,6 +51,9 @@ export default { | ||
| 51 | isCollapse() { | 51 | isCollapse() { |
| 52 | return !this.sidebar.opened | 52 | return !this.sidebar.opened |
| 53 | } | 53 | } |
| 54 | - } | 54 | + }, |
| 55 | + created(){ | ||
| 56 | + this.totalList = config.children | ||
| 57 | + }, | ||
| 55 | } | 58 | } |
| 56 | </script> | 59 | </script> |
src/main.js
| @@ -4,7 +4,7 @@ import 'normalize.css/normalize.css' // A modern alternative to CSS resets | @@ -4,7 +4,7 @@ import 'normalize.css/normalize.css' // A modern alternative to CSS resets | ||
| 4 | 4 | ||
| 5 | import ElementUI from 'element-ui' | 5 | import ElementUI from 'element-ui' |
| 6 | import 'element-ui/lib/theme-chalk/index.css' | 6 | import 'element-ui/lib/theme-chalk/index.css' |
| 7 | -import locale from 'element-ui/lib/locale/lang/en' // lang i18n | 7 | +// import locale from 'element-ui/lib/locale/lang/en' // lang i18n |
| 8 | 8 | ||
| 9 | import '@/styles/index.scss' // global css | 9 | import '@/styles/index.scss' // global css |
| 10 | 10 | ||
| @@ -34,7 +34,7 @@ Object.keys(filters).forEach(key => { | @@ -34,7 +34,7 @@ Object.keys(filters).forEach(key => { | ||
| 34 | Vue.filter(key, filters[key]) | 34 | Vue.filter(key, filters[key]) |
| 35 | }) | 35 | }) |
| 36 | // set ElementUI lang to EN | 36 | // set ElementUI lang to EN |
| 37 | -Vue.use(ElementUI, { locale }) | 37 | +Vue.use(ElementUI) |
| 38 | 38 | ||
| 39 | Vue.config.productionTip = false | 39 | Vue.config.productionTip = false |
| 40 | 40 |
src/router/index.js
| @@ -4,7 +4,6 @@ import Router from 'vue-router' | @@ -4,7 +4,6 @@ import Router from 'vue-router' | ||
| 4 | import Layout from '@/layout' | 4 | import Layout from '@/layout' |
| 5 | import home from '@/views/home' | 5 | import home from '@/views/home' |
| 6 | // 引用 news 子路由配置文件 | 6 | // 引用 news 子路由配置文件 |
| 7 | -import parkservice from './parkservice.js' | ||
| 8 | Vue.use(Router) | 7 | Vue.use(Router) |
| 9 | 8 | ||
| 10 | /* Layout */ | 9 | /* Layout */ |
| @@ -56,12 +55,59 @@ export const constantRoutes = [ | @@ -56,12 +55,59 @@ export const constantRoutes = [ | ||
| 56 | }, | 55 | }, |
| 57 | { | 56 | { |
| 58 | path: '/service', | 57 | path: '/service', |
| 59 | - component: Layout, | 58 | + redirect:'/dashboard', |
| 59 | + component: () => import('@/views/service'), | ||
| 60 | meta: { | 60 | meta: { |
| 61 | title: '停车服务' | 61 | title: '停车服务' |
| 62 | 62 | ||
| 63 | }, | 63 | }, |
| 64 | - children: parkservice | 64 | + children:[ |
| 65 | + { | ||
| 66 | + path: '/dashboard', | ||
| 67 | + component: () => import('@/views/dashboard/index'), | ||
| 68 | + meta: { title: '服务首页', icon: 'dashboard' } | ||
| 69 | + }, | ||
| 70 | + | ||
| 71 | + { | ||
| 72 | + path: '/account', | ||
| 73 | + component: () => import('@/views/account/index'), | ||
| 74 | + meta: { title: '我的账户',icon: 'money' } | ||
| 75 | + | ||
| 76 | + }, | ||
| 77 | + { | ||
| 78 | + path: '/cardticket', | ||
| 79 | + component: () => import('@/views/cardticket/index'), | ||
| 80 | + meta: { title: '我的卡券', icon: 'card' } | ||
| 81 | + }, | ||
| 82 | + | ||
| 83 | + { | ||
| 84 | + path: '/order', | ||
| 85 | + component: () => import('@/views/order/index'), | ||
| 86 | + meta: { title: '我的订单', icon: 'form' } | ||
| 87 | + }, | ||
| 88 | + { | ||
| 89 | + path: '/payback', | ||
| 90 | + component: () => import('@/views/payback/index'), | ||
| 91 | + meta: { title: '欠费补缴', icon: 'nested' } | ||
| 92 | + }, | ||
| 93 | + | ||
| 94 | + { | ||
| 95 | + path: '/mycar', | ||
| 96 | + component: () => import('@/views/mycar/index'), | ||
| 97 | + meta: { title: '我的车辆', icon: 'car' } | ||
| 98 | + | ||
| 99 | + }, | ||
| 100 | + { | ||
| 101 | + path: '/information', | ||
| 102 | + component: () => import('@/views/information/index'), | ||
| 103 | + meta: { title: '个人资料' ,icon: 'people'} | ||
| 104 | + }, | ||
| 105 | + { | ||
| 106 | + path: '/myevaluate', | ||
| 107 | + component: () => import('@/views/myevaluate/index'), | ||
| 108 | + meta: { title: '我的评价',icon: 'skill' } | ||
| 109 | + } | ||
| 110 | + ] | ||
| 65 | }, | 111 | }, |
| 66 | { | 112 | { |
| 67 | path: '/center', | 113 | path: '/center', |
src/router/parkservice.js deleted
| 1 | - | ||
| 2 | - | ||
| 3 | -export default [ | ||
| 4 | - | ||
| 5 | - { | ||
| 6 | - path: '/dashboard', | ||
| 7 | - component: () => import('@/views/dashboard/index'), | ||
| 8 | - meta: { title: '服务首页', icon: 'dashboard' } | ||
| 9 | - }, | ||
| 10 | - | ||
| 11 | - { | ||
| 12 | - path: '/account', | ||
| 13 | - component: () => import('@/views/account/index'), | ||
| 14 | - meta: { title: '我的账户',icon: 'money' } | ||
| 15 | - | ||
| 16 | - }, | ||
| 17 | - { | ||
| 18 | - path: 'cardticket', | ||
| 19 | - component: () => import('@/views/cardticket/index'), | ||
| 20 | - meta: { title: '我的卡券', icon: 'card' } | ||
| 21 | - }, | ||
| 22 | - | ||
| 23 | - { | ||
| 24 | - path: '/order', | ||
| 25 | - component: () => import('@/views/order/index'), | ||
| 26 | - meta: { title: '我的订单', icon: 'form' } | ||
| 27 | - }, | ||
| 28 | - { | ||
| 29 | - path: '/payback', | ||
| 30 | - component: () => import('@/views/payback/index'), | ||
| 31 | - meta: { title: '欠费补缴', icon: 'nested' } | ||
| 32 | - }, | ||
| 33 | - | ||
| 34 | - { | ||
| 35 | - path: '/mycar', | ||
| 36 | - component: () => import('@/views/mycar/index'), | ||
| 37 | - meta: { title: '我的车辆', icon: 'car' } | ||
| 38 | - | ||
| 39 | - }, | ||
| 40 | - { | ||
| 41 | - path: '/information', | ||
| 42 | - component: () => import('@/views/information/index'), | ||
| 43 | - meta: { title: '个人资料' ,icon: 'people'} | ||
| 44 | - }, | ||
| 45 | - { | ||
| 46 | - path: '/myevaluate', | ||
| 47 | - component: () => import('@/views/myevaluate/index'), | ||
| 48 | - meta: { title: '我的评价',icon: 'skill' } | ||
| 49 | - } | ||
| 50 | -] | ||
| 51 | - |
src/styles/element-ui.scss
| 1 | // cover some element-ui styles | 1 | // cover some element-ui styles |
| 2 | - | 2 | +@import url("//unpkg.com/element-ui@2.10.1/lib/theme-chalk/index.css"); |
| 3 | .el-breadcrumb__inner, | 3 | .el-breadcrumb__inner, |
| 4 | .el-breadcrumb__inner a { | 4 | .el-breadcrumb__inner a { |
| 5 | font-weight: 400 !important; | 5 | font-weight: 400 !important; |
src/views/service.vue
| 1 | + | ||
| 2 | +<template> | ||
| 3 | + <div > | ||
| 4 | + <el-container style="min-height: 550px"> | ||
| 5 | + <el-aside width="210px" style="background-color: rgb(84, 92, 100);"> | ||
| 6 | + <!--左侧菜单组件--> | ||
| 7 | + <el-menu | ||
| 8 | + default-active="2" | ||
| 9 | + class="el-menu-vertical-demo" | ||
| 10 | + @open="handleOpen" | ||
| 11 | + @close="handleClose" | ||
| 12 | + background-color="#545c64" | ||
| 13 | + text-color="#fff" | ||
| 14 | + active-text-color="#409eff" router> | ||
| 15 | + <el-menu-item index="/dashboard" class="is-active"> | ||
| 16 | + <i class="el-icon-menu "></i> | ||
| 17 | + <span slot="title">服务首页</span> | ||
| 18 | + </el-menu-item> | ||
| 19 | + <el-submenu index="1"> | ||
| 20 | + <template slot="title"> | ||
| 21 | + <i class="el-icon-bank-card"></i> | ||
| 22 | + <span>我的钱包</span> | ||
| 23 | + </template> | ||
| 24 | + <el-menu-item index="/account">我的账户</el-menu-item> | ||
| 25 | + <el-menu-item index="/cardticket">我的卡券</el-menu-item> | ||
| 26 | + </el-submenu> | ||
| 27 | + <el-menu-item index="/order"> | ||
| 28 | + <i class="el-icon-tickets"></i> | ||
| 29 | + <span slot="title">我的订单</span> | ||
| 30 | + </el-menu-item> | ||
| 31 | + <el-menu-item index="/payback"> | ||
| 32 | + <i class="el-icon-finished"></i> | ||
| 33 | + <span slot="title">欠费补缴</span> | ||
| 34 | + </el-menu-item> | ||
| 35 | + <el-menu-item index="/mycar"> | ||
| 36 | + <i class="el-icon-truck"></i> | ||
| 37 | + <span slot="title">我的车辆</span> | ||
| 38 | + </el-menu-item> | ||
| 39 | + <el-submenu index="2"> | ||
| 40 | + <template slot="title"> | ||
| 41 | + <i class="el-icon-user-solid"></i> | ||
| 42 | + <span>个人中心</span> | ||
| 43 | + </template> | ||
| 44 | + <el-menu-item index="/information">个人资料</el-menu-item> | ||
| 45 | + <el-menu-item index="/myevaluate">我的评价</el-menu-item> | ||
| 46 | + </el-submenu> | ||
| 47 | + </el-menu> | ||
| 48 | + </el-aside> | ||
| 49 | + | ||
| 50 | + <el-main class="app-container"> | ||
| 51 | + <router-view :key="key" /> | ||
| 52 | + </el-main> | ||
| 53 | + </el-container> | ||
| 54 | + | ||
| 55 | + </div> | ||
| 56 | + | ||
| 57 | +</template> | ||
| 58 | + | ||
| 59 | +<script> | ||
| 60 | + export default { | ||
| 61 | + computed: { | ||
| 62 | + key() { | ||
| 63 | + return this.index | ||
| 64 | + } | ||
| 65 | + }, | ||
| 66 | + methods: { | ||
| 67 | + handleOpen(key, keyPath) { | ||
| 68 | + console.log(key, keyPath); | ||
| 69 | + }, | ||
| 70 | + handleClose(key, keyPath) { | ||
| 71 | + console.log(key, keyPath); | ||
| 72 | + } | ||
| 73 | + } | ||
| 74 | + } | ||
| 75 | + | ||
| 76 | +</script> | ||
| 77 | +<style scoped> | ||
| 78 | + | ||
| 79 | +</style> |