Commit 227ea0fff03c7f78f8c04a05feee049a9e12605b

Authored by Andy
2 parents ae083634 93ff2951

Merge branch 'test' of http://gitlab.renniting.cn/web_developers/lzsandtable into test

build/utils.js
... ... @@ -60,7 +60,14 @@ exports.cssLoaders = function (options) {
60 60 postcss: generateLoaders(),
61 61 less: generateLoaders('less'),
62 62 sass: generateLoaders('sass', { indentedSyntax: true }),
63   - scss: generateLoaders('sass'),
  63 + scss: generateLoaders('sass').concat(
  64 + {
  65 + loader: 'sass-resources-loader',
  66 + options: {
  67 + resources: path.resolve(__dirname, '../src/style/mixin.scss')//引入的scss文件位置
  68 + }
  69 + }
  70 + ),
64 71 stylus: generateLoaders('stylus'),
65 72 styl: generateLoaders('stylus')
66 73 }
... ...
package-lock.json
... ... @@ -3132,6 +3132,14 @@
3132 3132 "safer-buffer": "^2.1.0"
3133 3133 }
3134 3134 },
  3135 + "echarts": {
  3136 + "version": "4.1.0",
  3137 + "resolved": "http://registry.npm.taobao.org/echarts/download/echarts-4.1.0.tgz",
  3138 + "integrity": "sha1-1YjJX3PBqZKLnHPVt2l1HDGFvNw=",
  3139 + "requires": {
  3140 + "zrender": "4.0.4"
  3141 + }
  3142 + },
3135 3143 "ee-first": {
3136 3144 "version": "1.1.1",
3137 3145 "resolved": "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz",
... ... @@ -10349,6 +10357,45 @@
10349 10357 "semver": "^5.5.0"
10350 10358 }
10351 10359 },
  10360 + "sass-resources-loader": {
  10361 + "version": "2.0.0",
  10362 + "resolved": "http://registry.npm.taobao.org/sass-resources-loader/download/sass-resources-loader-2.0.0.tgz",
  10363 + "integrity": "sha1-iFacVC+/HxjzOmV4t3zFs2xWkR0=",
  10364 + "dev": true,
  10365 + "requires": {
  10366 + "async": "^2.1.4",
  10367 + "chalk": "^1.1.3",
  10368 + "glob": "^7.1.1",
  10369 + "loader-utils": "^1.0.4"
  10370 + },
  10371 + "dependencies": {
  10372 + "ansi-styles": {
  10373 + "version": "2.2.1",
  10374 + "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz",
  10375 + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
  10376 + "dev": true
  10377 + },
  10378 + "chalk": {
  10379 + "version": "1.1.3",
  10380 + "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz",
  10381 + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
  10382 + "dev": true,
  10383 + "requires": {
  10384 + "ansi-styles": "^2.2.1",
  10385 + "escape-string-regexp": "^1.0.2",
  10386 + "has-ansi": "^2.0.0",
  10387 + "strip-ansi": "^3.0.0",
  10388 + "supports-color": "^2.0.0"
  10389 + }
  10390 + },
  10391 + "supports-color": {
  10392 + "version": "2.0.0",
  10393 + "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz",
  10394 + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
  10395 + "dev": true
  10396 + }
  10397 + }
  10398 + },
10352 10399 "sax": {
10353 10400 "version": "1.2.4",
10354 10401 "resolved": "http://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz",
... ... @@ -12660,6 +12707,11 @@
12660 12707 "requires": {
12661 12708 "camelcase": "^3.0.0"
12662 12709 }
  12710 + },
  12711 + "zrender": {
  12712 + "version": "4.0.4",
  12713 + "resolved": "http://registry.npm.taobao.org/zrender/download/zrender-4.0.4.tgz",
  12714 + "integrity": "sha1-kQ5g2IjwDJWZBz8jdY3SM0X+SP0="
12663 12715 }
12664 12716 }
12665 12717 }
... ...
package.json
... ... @@ -11,6 +11,7 @@
11 11 "build": "node build/build.js"
12 12 },
13 13 "dependencies": {
  14 + "echarts": "^4.1.0",
14 15 "vue": "^2.5.2"
15 16 },
16 17 "devDependencies": {
... ... @@ -50,6 +51,7 @@
50 51 "postcss-url": "^7.2.1",
51 52 "rimraf": "^2.6.0",
52 53 "sass-loader": "^7.1.0",
  54 + "sass-resources-loader": "^2.0.0",
53 55 "semver": "^5.3.0",
54 56 "shelljs": "^0.7.6",
55 57 "style-loader": "^0.23.1",
... ...
src/components/HelloWorld.vue deleted
1   -<template>
2   - <div class="hello">
3   - <h1>{{ msg }}</h1>
4   - <h2>Essential Links</h2>
5   - <ul>
6   - <li>
7   - <a
8   - href="https://vuejs.org"
9   - target="_blank"
10   - >
11   - Core Docs
12   - </a>
13   - </li>
14   - <li>
15   - <a
16   - href="https://forum.vuejs.org"
17   - target="_blank"
18   - >
19   - Forum
20   - </a>
21   - </li>
22   - <li>
23   - <a
24   - href="https://chat.vuejs.org"
25   - target="_blank"
26   - >
27   - Community Chat
28   - </a>
29   - </li>
30   - <li>
31   - <a
32   - href="https://twitter.com/vuejs"
33   - target="_blank"
34   - >
35   - Twitter
36   - </a>
37   - </li>
38   - <br>
39   - <li>
40   - <a
41   - href="http://vuejs-templates.github.io/webpack/"
42   - target="_blank"
43   - >
44   - Docs for This Template
45   - </a>
46   - </li>
47   - </ul>
48   - <h2>Ecosystem</h2>
49   - <ul>
50   - <li>
51   - <a
52   - href="http://router.vuejs.org/"
53   - target="_blank"
54   - >
55   - vue-router
56   - </a>
57   - </li>
58   - <li>
59   - <a
60   - href="http://vuex.vuejs.org/"
61   - target="_blank"
62   - >
63   - vuex
64   - </a>
65   - </li>
66   - <li>
67   - <a
68   - href="http://vue-loader.vuejs.org/"
69   - target="_blank"
70   - >
71   - vue-loader
72   - </a>
73   - </li>
74   - <li>
75   - <a
76   - href="https://github.com/vuejs/awesome-vue"
77   - target="_blank"
78   - >
79   - awesome-vue
80   - </a>
81   - </li>
82   - </ul>
83   - </div>
84   -</template>
85   -
86   -<script>
87   -export default {
88   - name: 'HelloWorld',
89   - data () {
90   - return {
91   - msg: 'Welcome to Your Vue.js App'
92   - }
93   - }
94   -}
95   -</script>
96   -
97   -<!-- Add "scoped" attribute to limit CSS to this component only -->
98   -<style scoped>
99   -h1, h2 {
100   - font-weight: normal;
101   -}
102   -ul {
103   - list-style-type: none;
104   - padding: 0;
105   -}
106   -li {
107   - display: inline-block;
108   - margin: 0 10px;
109   -}
110   -a {
111   - color: #42b983;
112   -}
113   -</style>
src/components/VBerth.vue 0 → 100644
  1 +<template>
  2 + <div class="theme-wrap">
  3 + <card-title> <span>泊位消息</span></card-title>
  4 + <div class="theme-body">
  5 + <account-num>
  6 + <span>总计</span>
  7 + </account-num>
  8 + <ul class="income-echart">
  9 + <li>
  10 + <pie-echart :chart-data="pieChartData"></pie-echart>
  11 + </li>
  12 + <li class="berth-inf">
  13 + <p><span class="free-berth">{{11834|filterTotal}}</span><span>空余</span></p>
  14 + <p><span class="buss-berth">{{4496|filterTotal}}</span><span>占有</span></p>
  15 + </li>
  16 + </ul>
  17 + </div>
  18 + </div>
  19 +</template>
  20 +
  21 +<script>
  22 +import CardTitle from './base/CardTitle'
  23 +import AccountNum from './base/AccountNum'
  24 +import PieEchart from './base/PieEchart'
  25 +export default {
  26 + name: 'VBerth',
  27 + components: {
  28 + CardTitle,
  29 + AccountNum,
  30 + PieEchart
  31 + },
  32 + data() {
  33 + return {
  34 + pieChartData: {
  35 + yData: [1,1],
  36 + legendData: ['空余','占有']
  37 + },
  38 + }
  39 + },
  40 + mounted(){
  41 + //this.drawBar();
  42 + },
  43 + methods: {
  44 +
  45 + }
  46 +}
  47 +</script>
  48 +
  49 +<style scoped lang="scss">
  50 + .theme-wrap {
  51 + height: 100%;
  52 + }
  53 + .theme-body {
  54 + height: calc(100% - 30px);
  55 + margin-left: 20px;
  56 + }
  57 + .income-echart{
  58 + height: 70%;
  59 + display: flex;
  60 + >li{
  61 + flex: 1;
  62 + }
  63 + .berth-inf{
  64 + p{
  65 + height: 50%;
  66 + display: flex;
  67 + align-items: center;
  68 + justify-content: space-between;
  69 + padding-right: 20px;
  70 + }
  71 + .free-berth{
  72 + @include fontStyle(24px);
  73 + background-image: $fontBlue;
  74 + }
  75 + .buss-berth{
  76 + @include fontStyle(24px);
  77 + background-image: $fontOrange;
  78 + }
  79 + }
  80 + }
  81 +
  82 +</style>
... ...
src/components/VEquipment.vue 0 → 100644
  1 +<template>
  2 + <div class="theme-wrap">
  3 + <card-title> <span>设备监控消息</span></card-title>
  4 + <div class="theme-body">
  5 +
  6 + </div>
  7 + </div>
  8 +</template>
  9 +
  10 +<script>
  11 +import CardTitle from './base/CardTitle'
  12 +export default {
  13 + name: 'VEquipment',
  14 + components: {
  15 + CardTitle
  16 + },
  17 + data() {
  18 + return {
  19 +
  20 + }
  21 + },
  22 + mounted(){
  23 + },
  24 + methods: {
  25 +
  26 + }
  27 +}
  28 +</script>
  29 +
  30 +<style scoped lang="scss">
  31 + .theme-wrap {
  32 + height: 100%;
  33 + }
  34 + .theme-body {
  35 + height: calc(100% - 30px);
  36 + margin-left: 20px;
  37 + }
  38 +
  39 +
  40 +</style>
... ...
src/components/VIncome.vue 0 → 100644
  1 +<template>
  2 + <div class="theme-wrap">
  3 + <card-title> <span>收入消息</span></card-title>
  4 + <div class="theme-body">
  5 + <account-num>
  6 + <span>总计</span>
  7 + </account-num>
  8 + <div class="income-echart" id="income-echart">
  9 + <bar-chart :chart-data="pieChartData"></bar-chart>
  10 + </div>
  11 + </div>
  12 + </div>
  13 +</template>
  14 +
  15 +<script>
  16 +import CardTitle from './base/CardTitle'
  17 +import AccountNum from './base/AccountNum'
  18 +import barChart from './base/barChart'
  19 +export default {
  20 + name: 'VIncome',
  21 + components: {
  22 + CardTitle,
  23 + AccountNum,
  24 + barChart
  25 + },
  26 + data() {
  27 + return {
  28 + pieChartData: {
  29 + yData: [1,1],
  30 + legendData: ['空余','占有']
  31 + },
  32 + }
  33 + },
  34 + mounted(){
  35 + //this.drawBar();
  36 + },
  37 + methods: {
  38 +
  39 + }
  40 +}
  41 +</script>
  42 +
  43 +<style scoped lang="scss">
  44 + .theme-wrap {
  45 + height: 100%;
  46 + }
  47 + .theme-body {
  48 + height: calc(100% - 30px);
  49 + margin-left: 20px;
  50 + }
  51 + .income-echart{
  52 + height: 70%;
  53 + }
  54 +
  55 +</style>
... ...
src/components/VInout.vue 0 → 100644
  1 +<template>
  2 + <div class="theme-wrap">
  3 + <card-title> <span>进出场消息</span></card-title>
  4 + <div class="theme-body">
  5 + <div class="access-title">
  6 + <p><span><span class="access-icon"></span>万达停车场 京A243547 进场</span> <span>07:20</span></p>
  7 + </div>
  8 + <div class="access-img" :style="{backgroundImage:'url('+imgUrl+')'}"></div>
  9 + </div>
  10 + </div>
  11 +</template>
  12 +
  13 +<script>
  14 +import CardTitle from './base/CardTitle'
  15 +import AccountNum from './base/AccountNum'
  16 +export default {
  17 + name: 'VInout',
  18 + components: {
  19 + CardTitle,
  20 + AccountNum
  21 + },
  22 + data(){
  23 + return{
  24 + sideNum: 23454,
  25 + closeNum: 23454,
  26 + imgUrl: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1552297151876&di=fcc094f43d6caaf4b9526dabbefd1243&imgtype=0&src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20190124%2F1fc9d7e14be54986b9e2e055a2b5ccc1.jpeg'}
  27 + }
  28 +}
  29 +</script>
  30 +
  31 +<style scoped lang="scss">
  32 + .theme-wrap {
  33 + height: 100%;
  34 + }
  35 + .theme-body {
  36 + height: calc(100% - 30px);
  37 + margin-left: 20px;
  38 + }
  39 + .access-title{
  40 + height: 30% ;
  41 + display: flex;
  42 + align-items: center;
  43 + p {
  44 + width: 99%;
  45 + padding-right: 20px;
  46 + height: 26px;
  47 + line-height: 26px;
  48 + display: flex;
  49 + justify-content: space-between;
  50 + background: linear-gradient(to right, rgba(0, 45, 140, .1) , rgba(0, 45, 140, .7));
  51 +
  52 + }
  53 + .access-icon{
  54 + display: inline-block;
  55 + vertical-align: middle;
  56 + width: 22px;
  57 + height: 26px;
  58 + margin-right: 10px;
  59 + background: url("../images/content/access-icon.png") no-repeat 0 center;
  60 + background-size: 22px 22px;
  61 + }
  62 + }
  63 + .access-img{
  64 + width: 93%;
  65 + height: 60%;
  66 + background-repeat: no-repeat;
  67 + background-size: 100% 100%;
  68 + }
  69 +
  70 +</style>
... ...
src/components/VParking.vue 0 → 100644
  1 +<template>
  2 + <div class="theme-wrap">
  3 + <card-title> <span>停车场消息</span></card-title>
  4 + <div class="theme-body">
  5 + <account-num>
  6 + <span>总计</span>
  7 + </account-num>
  8 + <ul class="theme-container">
  9 + <li class="roadside">
  10 + <p>{{sideNum|filterTotal}}</p>
  11 + <p>路侧</p>
  12 + </li>
  13 + <li class="roadclose">
  14 + <p>{{closeNum|filterTotal}}</p>
  15 + <p>封闭</p>
  16 + </li>
  17 + </ul>
  18 + </div>
  19 + </div>
  20 +</template>
  21 +
  22 +<script>
  23 +import CardTitle from './base/CardTitle'
  24 +import AccountNum from './base/AccountNum'
  25 +export default {
  26 + name: 'VParking',
  27 + components: {
  28 + CardTitle,
  29 + AccountNum
  30 + },
  31 + data(){
  32 + return{
  33 + sideNum: 23454,
  34 + closeNum: 23454
  35 + }
  36 + }
  37 +}
  38 +</script>
  39 +
  40 +<style scoped lang="scss">
  41 + .theme-wrap {
  42 + height: 100%;
  43 + }
  44 + .theme-body {
  45 + height: calc(100% - 30px);
  46 + margin-left: 20px;
  47 + }
  48 + .theme-container{
  49 + height: 70%;
  50 + display: flex;
  51 + align-items: center;
  52 + >li{
  53 + flex: 1;
  54 + height: 57px;
  55 + padding-left: 70px;
  56 + display: flex;
  57 + flex-direction: column;
  58 + justify-content: space-between;
  59 + &:nth-of-type(1){
  60 + p{
  61 + &:first-child{
  62 + @include fontStyle(24px);
  63 + background-image: $fontBlue;
  64 + }
  65 + &:last-child{
  66 + font-size: 14px;
  67 + }
  68 + }
  69 + }
  70 + &:nth-of-type(2){
  71 + p{
  72 + &:first-child{
  73 + @include fontStyle(24px);
  74 + background-image: $fontOrange;
  75 + }
  76 + &:last-child{
  77 + font-size: 14px;
  78 + }
  79 + }
  80 + }
  81 + }
  82 +
  83 + .roadside{
  84 + background: url("../images/content/roadside.png") no-repeat 0 center;
  85 + }
  86 + .roadclose{
  87 + background: url("../images/content/roadclose.png") no-repeat 0 center;
  88 + }
  89 + }
  90 +
  91 +</style>
... ...
src/components/VToll.vue 0 → 100644
  1 +<template>
  2 + <div class="theme-wrap">
  3 + <card-title> <span>收费员消息</span></card-title>
  4 + <div class="theme-body">
  5 + <account-num>
  6 + <span>应签到</span>
  7 + </account-num>
  8 + <ul class="theme-container">
  9 + <li class="roadside">
  10 + <p>{{sideNum|filterTotal}}</p>
  11 + <p>已签到</p>
  12 + </li>
  13 + <li class="roadclose">
  14 + <p>{{closeNum|filterTotal}}</p>
  15 + <p>未签到</p>
  16 + </li>
  17 + </ul>
  18 + </div>
  19 + </div>
  20 +</template>
  21 +
  22 +<script>
  23 +import CardTitle from './base/CardTitle'
  24 +import AccountNum from './base/AccountNum'
  25 +export default {
  26 + name: 'VToll',
  27 + components: {
  28 + CardTitle,
  29 + AccountNum
  30 + },
  31 + data(){
  32 + return{
  33 + sideNum: 23454,
  34 + closeNum: 23454
  35 + }
  36 + }
  37 +}
  38 +</script>
  39 +
  40 +<style scoped lang="scss">
  41 + .theme-wrap {
  42 + height: 100%;
  43 + }
  44 + .theme-body {
  45 + height: calc(100% - 30px);
  46 + margin-left: 20px;
  47 + }
  48 + .theme-container{
  49 + height: 70%;
  50 + display: flex;
  51 + align-items: center;
  52 + >li{
  53 + flex: 1;
  54 + height: 49px;
  55 + padding-left: 70px;
  56 + display: flex;
  57 + flex-direction: column;
  58 + justify-content: space-between;
  59 + &:nth-of-type(1){
  60 + p{
  61 + &:first-child{
  62 + @include fontStyle(24px);
  63 + background-image: $fontBlue;
  64 + }
  65 + &:last-child{
  66 + font-size: 14px;
  67 + }
  68 + }
  69 + }
  70 + &:nth-of-type(2){
  71 + p{
  72 + &:first-child{
  73 + @include fontStyle(24px);
  74 + background-image: $fontOrange;
  75 + }
  76 + &:last-child{
  77 + font-size: 14px;
  78 + }
  79 + }
  80 + }
  81 + }
  82 +
  83 + .roadside{
  84 + background: url("../images/content/sign.png") no-repeat 0 center;
  85 + }
  86 + .roadclose{
  87 + background: url("../images/content/nosign.png") no-repeat 0 center;
  88 + }
  89 + }
  90 +
  91 +</style>
... ...
src/components/base/AccountNum.vue 0 → 100644
  1 +<template>
  2 + <div class="total-wrap">
  3 + <slot></slot>
  4 + <div class="total-main" >
  5 + <div v-for="item in total" :key="item" :class="item !==',' ? 'eleNumBg':'noeleNumBg'" >
  6 + {{item}}
  7 + </div>
  8 + </div>
  9 + </div>
  10 +</template>
  11 +
  12 +<script>
  13 +import { formaterTotal } from '../../utils/formate'
  14 +export default {
  15 + name: 'AccountNum',
  16 + data(){
  17 + return {
  18 + total: formaterTotal(219706)
  19 + }
  20 + }
  21 +}
  22 +</script>
  23 +
  24 +<style scoped lang="scss">
  25 + .total-wrap{
  26 + height: 30%;
  27 + display: flex;
  28 + align-items: center;
  29 + span{
  30 + display: inline-block;
  31 + width: 50px;
  32 + text-align: left;
  33 + }
  34 + .total-main{
  35 + /*margin-left: 10px;*/
  36 + padding: 5px 5px 5px 0;
  37 + background: url("../../images/content/numBorder.svg") no-repeat;
  38 + background-size: 100% 100%;
  39 + }
  40 + .eleNumBg{
  41 + width: 20px;
  42 + height: 30px;
  43 + display: inline-block;
  44 + margin-left: 5px;
  45 + line-height: 30px;
  46 + font-size: 22px;
  47 + font-weight: 600;
  48 + text-align: center;
  49 + background: url("../../images/content/numBg.svg") no-repeat;
  50 + background-size: 100% 100%;
  51 + }
  52 + .noeleNumBg{
  53 + width: 10px;
  54 + height: 30px;
  55 + display: inline-block;
  56 + margin-left: 5px;
  57 + line-height: 30px;
  58 + font-size: 22px;
  59 + font-weight: 600;
  60 + text-align: center;
  61 + }
  62 + }
  63 +</style>
... ...
src/components/base/CardTitle.vue 0 → 100644
  1 +<template>
  2 + <div class="theme-title">
  3 + <slot></slot>
  4 + </div>
  5 +</template>
  6 +
  7 +<script>
  8 +export default {
  9 + name: 'CardTitle'
  10 +}
  11 +</script>
  12 +
  13 +<style scoped lang="scss">
  14 + .theme-title {
  15 + height: 30px;
  16 + line-height: 30px;
  17 + background: url("../../images/content/cardTitleBg.png") no-repeat;
  18 + background-size: 100% 100%;
  19 + }
  20 +
  21 + .theme-title span {
  22 + margin-left: 60px;
  23 + position: relative;
  24 + font-size: 14px;
  25 + }
  26 +
  27 + .theme-title span:before {
  28 + content: '';
  29 + background: url('../../images/content/cardTitleSide.png') no-repeat;
  30 + background-size: 100% 100%;
  31 + position: absolute;
  32 + width: 40px;
  33 + height: 13px;
  34 + top: 3px;
  35 + left: -47px;
  36 + }
  37 +
  38 + .theme-title span:after {
  39 + content: '';
  40 + background: url('../../images/content/cardTitleSide.png') no-repeat;
  41 + background-size: 100% 100%;
  42 + position: absolute;
  43 + width: 40px;
  44 + height: 13px;
  45 + top: 3px;
  46 + right: -50px;
  47 + }
  48 +</style>
... ...
src/components/base/PieEchart.vue 0 → 100644
  1 +<template>
  2 + <div :class="className" :style="{height:height,width:width}"></div>
  3 +</template>
  4 +
  5 +<script>
  6 +import echarts from 'echarts'
  7 +
  8 +require('echarts/theme/macarons') // echarts theme
  9 +import {debounce} from '../../utils/debounce'
  10 +
  11 +export default {
  12 + name: 'PieEchart',
  13 + props: {
  14 + className: {
  15 + type: String,
  16 + default: 'chart'
  17 + },
  18 + width: {
  19 + type: String,
  20 + default: '100%'
  21 + },
  22 + height: {
  23 + type: String,
  24 + default: '100%'
  25 + },
  26 + autoResize: {
  27 + type: Boolean,
  28 + default: true
  29 + },
  30 + chartData: {
  31 + type: Object,
  32 + required: true
  33 + }
  34 + },
  35 + data() {
  36 + return {
  37 + chart: null
  38 + }
  39 + },
  40 + watch: {
  41 + chartData: function () {
  42 + this.$nextTick(()=>{
  43 + this.initChart()
  44 + })
  45 + }
  46 + },
  47 + mounted() {
  48 + this.initChart()
  49 + if (this.autoResize) {
  50 + this.__resizeHandler = debounce(() => {
  51 + if (this.chart) {
  52 + this.chart.resize()
  53 + }
  54 + }, 100)
  55 + window.addEventListener('resize', this.__resizeHandler)
  56 + }
  57 + },
  58 + beforeDestroy() {
  59 + if (!this.chart) {
  60 + return
  61 + }
  62 + if (this.autoResize) {
  63 + window.removeEventListener('resize', this.__resizeHandler)
  64 + }
  65 +
  66 + this.chart.dispose()
  67 + this.chart = null
  68 + },
  69 + methods: {
  70 + setOptions({yData} = {}) {
  71 + this.chart.setOption(
  72 + {
  73 + tooltip: {
  74 + show:false
  75 + },
  76 + series: [
  77 + {
  78 + type: 'pie',
  79 + radius: ['60%', '75%'],
  80 + center: ['50%', '50%'],
  81 + hoverAnimation:false,
  82 + label: {
  83 + show: false
  84 + },
  85 + lableLine: {
  86 + show: false
  87 + },
  88 + data: [
  89 + {
  90 + value: yData[0],
  91 + name: '空余',
  92 + itemStyle: {
  93 + normal: {
  94 + color: {
  95 + colorStops: [{
  96 + offset: 0,
  97 + color: '#00CAFE' // 0% 处的颜色
  98 + }, {
  99 + offset: 1,
  100 + color: '#2772F4' // 100% 处的颜色
  101 + }]
  102 + },
  103 + }
  104 + }
  105 + },
  106 + {
  107 + value: yData[1],
  108 + name: '占有',
  109 +
  110 + itemStyle: {
  111 + normal: {
  112 + color: {
  113 + colorStops: [{
  114 + offset: 0,
  115 + color: '#FFBA00' // 0% 处的颜色
  116 + }, {
  117 + offset: 1,
  118 + color: '#FF8100' // 100% 处的颜色
  119 + }]
  120 + },
  121 + }
  122 + }
  123 + },
  124 +
  125 + ],
  126 + animationType: 'scale',
  127 + animationEasing: 'elasticOut'
  128 + },
  129 + {
  130 + name: '', type: 'pie',
  131 + clockWise: true,hoverAnimation: false,
  132 + radius: ['90%', '90%'],
  133 + label: { normal: { position: 'center' }},
  134 + data: [{
  135 + value: 0,
  136 + label: {
  137 + normal: {
  138 + formatter: '30.5%',//小数点后一位
  139 + textStyle: {
  140 + color: '#fe8b53',
  141 + fontSize: 18,
  142 + fontWeight: 'normal'
  143 + }
  144 + }
  145 + }
  146 + }, {
  147 + tooltip: {show: false},
  148 + label: {
  149 + normal: {
  150 + formatter: '\n占有',
  151 + textStyle: {
  152 + color: '#bbeaf9',fontSize: 12
  153 + }
  154 + }
  155 + }
  156 + }]
  157 + }
  158 +
  159 + ]
  160 + }
  161 + )
  162 + },
  163 + initChart() {
  164 + this.chart = echarts.init(this.$el)
  165 + this.setOptions(this.chartData)
  166 + },
  167 +
  168 + }
  169 +}
  170 +</script>
... ...
src/components/base/barChart.vue 0 → 100644
  1 +<template>
  2 + <div :class="className" :style="{height:height,width:width}"></div>
  3 +</template>
  4 +
  5 +<script>
  6 +import echarts from 'echarts'
  7 +
  8 +require('echarts/theme/macarons') // echarts theme
  9 +import {debounce} from '../../utils/debounce'
  10 +
  11 +export default {
  12 + name: 'barChart',
  13 + props: {
  14 + className: {
  15 + type: String,
  16 + default: 'chart'
  17 + },
  18 + width: {
  19 + type: String,
  20 + default: '100%'
  21 + },
  22 + height: {
  23 + type: String,
  24 + default: '100%'
  25 + },
  26 + autoResize: {
  27 + type: Boolean,
  28 + default: true
  29 + },
  30 + chartData: {
  31 + type: Object,
  32 + required: true
  33 + }
  34 + },
  35 + data() {
  36 + return {
  37 + chart: null
  38 + }
  39 + },
  40 + watch: {
  41 + chartData: function () {
  42 + this.$nextTick(()=>{
  43 + this.initChart()
  44 + })
  45 + }
  46 + },
  47 + mounted() {
  48 + this.initChart()
  49 + if (this.autoResize) {
  50 + this.__resizeHandler = debounce(() => {
  51 + if (this.chart) {
  52 + this.chart.resize()
  53 + }
  54 + }, 100)
  55 + window.addEventListener('resize', this.__resizeHandler)
  56 + }
  57 + },
  58 + beforeDestroy() {
  59 + if (!this.chart) {
  60 + return
  61 + }
  62 + if (this.autoResize) {
  63 + window.removeEventListener('resize', this.__resizeHandler)
  64 + }
  65 +
  66 + this.chart.dispose()
  67 + this.chart = null
  68 + },
  69 + methods: {
  70 + setOptions({yData} = {}) {
  71 + this.chart.setOption(
  72 + {
  73 +
  74 + grid: {
  75 + top: 0,
  76 + left: 0,
  77 + right: '20',
  78 + bottom: -10,
  79 + containLabel: true
  80 + },
  81 + title:{show:false},
  82 + xAxis: {
  83 + show: false,//尽管显示false,但仍然占用空间containLabel为true的话[echarts bug]
  84 + nameGap:0
  85 + },
  86 + yAxis: [{
  87 + show: true,
  88 + nameLocation:'start',
  89 + //data: ['支付宝', '微信', '其它'],
  90 + data: [
  91 + {
  92 + value:'支付宝',
  93 + textStyle:{
  94 + color:'#01AEFE'
  95 + }
  96 + },
  97 + {
  98 + value:'微信',
  99 + textStyle:{
  100 + color:'#06C406'
  101 + }
  102 + },
  103 + {
  104 + value:'其它',
  105 + textStyle:{
  106 + color:'#FFAB00'
  107 + }
  108 + }
  109 + ],//右侧Y轴值
  110 + inverse: true,
  111 + axisLine: {show: false},
  112 + splitLine: {show: false},
  113 + axisTick: {show: false },
  114 + axisLabel: {
  115 + //margin:-20,
  116 + // nameTextStyle:{
  117 + // align:'left'
  118 + // }
  119 + }
  120 + }, {
  121 + show: true,
  122 + inverse: true,
  123 + data: [
  124 + {
  125 + value:1000,
  126 + textStyle:{
  127 + color:'#01AEFE'
  128 + }
  129 + },
  130 + {
  131 + value:200,
  132 + textStyle:{
  133 + color:'#06C406'
  134 + }
  135 + },
  136 + {
  137 + value:300,
  138 + textStyle:{
  139 + color:'#FFAB00'
  140 + }
  141 + }
  142 + ],//右侧Y轴值
  143 + axisLabel: {
  144 + textStyle: {fontSize: 12,},
  145 + },
  146 + axisLine: { show: false },
  147 + splitLine: { show: false},
  148 + axisTick: {show: false},
  149 + }],
  150 + series: [{
  151 + name: '条',
  152 + type: 'bar',
  153 + yAxisIndex: 0,
  154 + data: [1000,200,300],
  155 + data:[
  156 + {
  157 + value:1000,
  158 + itemStyle: {
  159 + normal: {
  160 + color: {
  161 + type: 'linear',
  162 + x: 0,
  163 + x1: 1,
  164 + colorStops: [{
  165 + offset: 0,
  166 + color: '#2772F4'
  167 + }, {
  168 + offset: 1,
  169 + color: '#00CAFE'
  170 + }]
  171 + }
  172 + },
  173 + }
  174 + },
  175 + {
  176 + value:200,
  177 + itemStyle: {
  178 + normal: {
  179 + color: {
  180 + type: 'linear',
  181 + x: 0,
  182 + x1: 1,
  183 + colorStops: [{
  184 + offset: 0,
  185 + color: '#02C202'
  186 + }, {
  187 + offset: 1,
  188 + color: '#51EC51'
  189 + }]
  190 + }
  191 + },
  192 + }
  193 + },
  194 + {
  195 + value:300,
  196 + itemStyle: {
  197 + normal: {
  198 + color: {
  199 + type: 'linear',
  200 + x: 0,
  201 + x1: 1,
  202 + colorStops: [{
  203 + offset: 0,
  204 + color: '#FD8811'
  205 + }, {
  206 + offset: 1,
  207 + color: '#FFAB00'
  208 + }]
  209 + }
  210 + },
  211 + }
  212 + },
  213 +
  214 +
  215 + ],
  216 + barWidth: '40%',
  217 +
  218 + label: {
  219 + normal: {show: false}
  220 + },
  221 + }, {
  222 + name: '框',
  223 + type: 'bar',
  224 + yAxisIndex: 1,
  225 + barGap: '-100%',
  226 + data: [1500,1500,1500],//百分比
  227 + barWidth: '40%',
  228 + itemStyle: {
  229 + normal: {
  230 + color: 'none',
  231 + borderColor: '#157ADB',
  232 + borderWidth: 0.5,
  233 + //barBorderRadius: 15,
  234 + }
  235 + }
  236 + }, ]
  237 + }
  238 + )
  239 + },
  240 + initChart() {
  241 + this.chart = echarts.init(this.$el)
  242 + this.setOptions(this.chartData)
  243 + },
  244 +
  245 + }
  246 +}
  247 +</script>
... ...
src/images/content/access-icon.png 0 → 100644

853 Bytes

src/images/content/cardTitleBg.png 0 → 100644

2.18 KB

src/images/content/cardTitleSide.png 0 → 100644

1.5 KB

src/images/content/nosign.png 0 → 100644

2.03 KB

src/images/content/numBg.svg 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
  3 +<svg version="1.1" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
  4 + viewBox="0 0 20 29" style="enable-background:new 0 0 20 29;" xml:space="preserve">
  5 +<style type="text/css">
  6 + .st0{fill-rule:evenodd;clip-rule:evenodd;fill:url(#XMLID_44_);}
  7 +</style>
  8 +<linearGradient id="XMLID_44_" gradientUnits="userSpaceOnUse" x1="10" y1="1.028133e-05" x2="10" y2="29">
  9 + <stop offset="0" style="stop-color:#574DFE"/>
  10 + <stop offset="1" style="stop-color:#4BD3FF"/>
  11 +</linearGradient>
  12 +<path id="XMLID_2_" class="st0" d="M18,29H2c-1.1,0-2-0.9-2-2v-9.5L2.5,15h14.9l2.5,2.5V27C20,28.1,19.1,29,18,29z M2.5,14L0,11.5V2
  13 + c0-1.1,0.9-2,2-2h16c1.1,0,2,0.9,2,2v9.5L17.5,14H2.5z"/>
  14 +</svg>
... ...
src/images/content/numBorder.svg 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
  3 +<svg version="1.1" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
  4 + viewBox="0 0 155 39" style="enable-background:new 0 0 155 39;" xml:space="preserve">
  5 +<style type="text/css">
  6 + .st0{opacity:0.1;}
  7 + .st1{fill:#157ADB;}
  8 + .st2{opacity:0.5;fill-rule:evenodd;clip-rule:evenodd;fill:#157ADB;}
  9 +</style>
  10 +<g id="XMLID_14_" class="st0">
  11 + <path id="XMLID_77_" class="st1" d="M154,1v37H1V1H154 M155,0H0v39h155V0L155,0z"/>
  12 +</g>
  13 +<path id="XMLID_15_" class="st2" d="M154,39h-4v-1h4v-4h1v4v1H154z M154,1h-4V0h4h1v1v4h-1V1z M0,39v-1v-4h1v4h4v1H1H0z M1,5H0V1V0
  14 + h1h4v1H1V5z"/>
  15 +</svg>
... ...
src/images/content/roadclose.png 0 → 100644

1.57 KB

src/images/content/roadside.png 0 → 100644

1.22 KB

src/images/content/sign.png 0 → 100644

2.13 KB

src/main.js
... ... @@ -3,6 +3,12 @@
3 3 import Vue from 'vue'
4 4 import App from './App'
5 5 import './style/reset.css'
  6 +
  7 +import * as filters from './utils/filters'
  8 +Object.keys(filters).forEach(key => {
  9 + Vue.filter(key, filters[key])
  10 +})
  11 +
6 12 Vue.config.productionTip = false
7 13  
8 14 /* eslint-disable no-new */
... ...
src/style/mixin.scss 0 → 100644
  1 +@mixin fontStyle($size){
  2 + font-size: $size;
  3 + font-weight:bold;
  4 + -webkit-background-clip: text;
  5 + -webkit-text-fill-color: transparent;
  6 +}
  7 +
  8 +$fontBlue: -webkit-gradient(linear, 0 0, 0 bottom, from(rgba(0,202,254, 1)), to(rgba(39,114,244, 1)));
  9 +$fontOrange: -webkit-gradient(linear, 0 0, 0 bottom, from(rgba(255,186,0, 1)), to(rgba(255,129,0, 1)));
... ...
src/style/reset.css
... ... @@ -61,7 +61,7 @@ body{
61 61 background: url("../images/bg.jpg") no-repeat;
62 62 background-size: 100% 100%;
63 63 overflow: hidden;
64   - /*background-size:100% 100%;*/
  64 + font-size: 14px;
65 65 /*默认颜色*/
66 66 }
67 67  
... ...
src/utils/debounce.js 0 → 100644
  1 +export function debounce(func, wait, immediate) {
  2 + let timeout, args, context, timestamp, result
  3 +
  4 + const later = function() {
  5 + // 据上一次触发时间间隔
  6 + const last = +new Date() - timestamp
  7 +
  8 + // 上次被包装函数被调用时间间隔last小于设定时间间隔wait
  9 + if (last < wait && last > 0) {
  10 + timeout = setTimeout(later, wait - last)
  11 + } else {
  12 + timeout = null
  13 + // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
  14 + if (!immediate) {
  15 + result = func.apply(context, args)
  16 + if (!timeout) context = args = null
  17 + }
  18 + }
  19 + }
  20 +
  21 + return function(...args) {
  22 + context = this
  23 + timestamp = +new Date()
  24 + const callNow = immediate && !timeout
  25 + // 如果延时不存在,重新设定延时
  26 + if (!timeout) timeout = setTimeout(later, wait)
  27 + if (callNow) {
  28 + result = func.apply(context, args)
  29 + context = args = null
  30 + }
  31 +
  32 + return result
  33 + }
  34 +}
... ...
src/utils/filters.js 0 → 100644
  1 +export function filterTotal(val) {
  2 + let str = val.toString()
  3 + let newStr = ''
  4 + let count = 0
  5 + for(let i=str.length-1;i>=0;i--){
  6 + if(count % 3 == 0 && count!= 0){
  7 + newStr = str.charAt(i)+","+newStr
  8 + }else{
  9 + newStr = str.charAt(i)+newStr
  10 + }
  11 + count++
  12 + }
  13 + return newStr
  14 +}
... ...
src/utils/formate.js
... ... @@ -3,7 +3,7 @@ function formateday() {
3 3 let str = ''
4 4 let year = date.getFullYear()
5 5 let month = date.getMonth()+1<10? "0"+ (date.getMonth()+1) : date.getMonth()+1
6   - let day = date.getDate()<10 ? "0"+date.getDate() : date.getDate
  6 + let day = date.getDate()<10 ? "0"+date.getDate() : date.getDate()
7 7 str = year +"-"+ month +"-"+ day
8 8 return str
9 9 }
... ... @@ -19,4 +19,19 @@ function formateTime() {
19 19 return str
20 20 }
21 21  
22   -export { formateday, formateTime }
  22 +function formaterTotal(val) {
  23 + let str = val.toString()
  24 + let newStr = ''
  25 + let count = 0
  26 + for(let i=str.length-1;i>=0;i--){
  27 + if(count % 3 == 0 && count!= 0){
  28 + newStr = str.charAt(i)+","+newStr
  29 + }else{
  30 + newStr = str.charAt(i)+newStr
  31 + }
  32 + count++
  33 + }
  34 + return newStr.split("")
  35 +}
  36 +
  37 +export { formateday, formateTime, formaterTotal }
... ...
src/view/VHome.vue
... ... @@ -3,17 +3,29 @@
3 3 <v-header></v-header>
4 4 <ul class="main-wrap">
5 5 <li class="main-left">
6   - <div class="frame-wrap"></div>
7   - <div class="frame-wrap frame-wrap-center"></div>
8   - <div class="frame-wrap"></div>
  6 + <div class="frame-wrap">
  7 + <v-parking></v-parking>
  8 + </div>
  9 + <div class="frame-wrap frame-wrap-center">
  10 + <v-toll></v-toll>
  11 + </div>
  12 + <div class="frame-wrap">
  13 + <v-inout></v-inout>
  14 + </div>
9 15 </li>
10 16 <li class="main-center">
11 17 <v-map></v-map>
12 18 </li>
13 19 <li class="main-right">
14   - <div class="frame-wrap"></div>
15   - <div class="frame-wrap frame-wrap-center"></div>
16   - <div class="frame-wrap"></div>
  20 + <div class="frame-wrap">
  21 + <v-income></v-income>
  22 + </div>
  23 + <div class="frame-wrap frame-wrap-center">
  24 + <v-berth></v-berth>
  25 + </div>
  26 + <div class="frame-wrap">
  27 + <v-equipment></v-equipment>
  28 + </div>
17 29 </li>
18 30 </ul>
19 31 </div>
... ... @@ -22,11 +34,23 @@
22 34 <script>
23 35 import VHeader from '../components/VHeader'
24 36 import VMap from '../components/VMap'
  37 +import VParking from '../components/VParking'
  38 +import VToll from '../components/VToll'
  39 +import VInout from '../components/VInout'
  40 +import VIncome from '../components/VIncome'
  41 +import VBerth from '../components/VBerth'
  42 +import VEquipment from '../components/VEquipment'
25 43 export default {
26 44 name: 'VHome',
27 45 components: {
28 46 VHeader,
29   - VMap
  47 + VMap,
  48 + VParking,
  49 + VToll,
  50 + VInout,
  51 + VIncome,
  52 + VBerth,
  53 + VEquipment
30 54 }
31 55 }
32 56 </script>
... ... @@ -57,11 +81,14 @@ export default {
57 81 }
58 82 .frame-wrap{
59 83 height: calc((100% - 20px)/3);
60   - border-image-source: url("../images/content/frame-wrap.png");
61   - border-image-slice: 10 16 15 10 fill;
62   - border-width: 10px 16px 15px 10px;
63   - border-style: solid;
64   - background-clip: border-box;
  84 + background: url("../images/content/frame-wrap.png");
  85 + background-size: 100% 100%;
  86 + overflow: hidden;
  87 + /*border-image-source: url("../images/content/frame-wrap.png");*/
  88 + /*border-image-slice: 3 16 11 3 fill;*/
  89 + /*border-width: 3px 18px 11px 3px;*/
  90 + /*border-style: solid;*/
  91 + /*background-clip: border-box;*/
65 92 }
66 93  
67 94 </style>
... ...