瀏覽代碼

区域停车主题、设备运营主题、停车饱和预警、停车缺口分析、停车难易指数、全局停车诱导、"区域停车发展分析"、"路内泊位设置推荐"、停车盲点挖招、服务发布功能、公告功能、消息中心功能

zbb 1 年之前
父節點
當前提交
fcb1bc467a

+ 3 - 5
src/components/lineChart.vue

@@ -135,18 +135,16 @@ export default {
135 135
         markLine: this.markLine,
136 136
         hoverAnimation: this.symbolSize === 4,
137 137
         encode: encode,
138
-        lineStyle: { width: 2 },
138
+        lineStyle: { width: 2 , color:encode.col},
139 139
         itemStyle: {
140
-          color: this.colorIdx ? this.colors[this.colorIdx] : this.colors[idx],
140
+          color: encode.col ? encode.col:this.colorIdx ? this.colors[this.colorIdx] : this.colors[idx],
141 141
         },
142 142
         areaStyle: {
143 143
           opacity: this.showArea ? 1 : 0,
144 144
           color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
145 145
             {
146 146
               offset: 0,
147
-              color: this.colorIdx
148
-                ? this.colors[this.colorIdx]
149
-                : this.colors[idx],
147
+              color: encode.col ? encode.col:this.colorIdx ? this.colors[this.colorIdx] : this.colors[idx],
150 148
             },
151 149
             {
152 150
               offset: 1,

+ 1 - 1
src/components/vtableNew.vue

@@ -18,7 +18,7 @@
18 18
       <tbody v-if="!isAutoScroll">
19 19
         <tr v-for="(item, idx) in datas" :key="idx">
20 20
           <td style="width:20px;textAlign: center;" v-if="showIdx">{{getIdxPad(idx+1)}}</td>
21
-          <td :style="`width:${column.width}`" :class="getTdClass(column, item[column.rowIdx])" v-for="(column, cId) in columns" :key="cId">
21
+          <td :style="`width:${column.width};`" :class="getTdClass(column, item[column.rowIdx])" v-for="(column, cId) in columns" :key="cId">
22 22
             <div>
23 23
               <div class="value-block">
24 24
                 {{!isNaN(item[column.rowIdx]) ? isAbs ? Math.abs(item[column.rowIdx]) : item[column.rowIdx] : item[column.rowIdx] }}

+ 61 - 13
src/pages/index/components/access_data_analysis.vue

@@ -1,18 +1,23 @@
1 1
 <template>
2 2
   <div class="body-wrapper">
3
-    <div class="search-card" style="display: flex; justify-content: space-between;">
4
-      <el-select v-model="value" placeholder="请选择所在区" style="margin-left: 15px;padding: 10px">
5
-        <el-option
6
-          v-for="item in options"
7
-          :key="item.value"
8
-          :label="item.label"
9
-          :value="item.value">
10
-        </el-option>
11
-      </el-select>
12
-      <el-input class="input-wrapper" v-model="searchWords" placeholder="请输入停车场名称" style="margin-left: 15px;padding: 9px">
13
-        <el-button slot="append" class="searchbtn" @click="handleSearch" style="background-color: #2a2a2a"> 确认</el-button>
14
-      </el-input>
15
-    </div>
3
+      <el-form class="form-wrapper" :inline="true" :model="formInline">
4
+        <el-form-item label="所在区">
5
+          <el-select v-model="formInline.region" placeholder="请选择所在区">
6
+            <el-option
7
+              v-for="item in options"
8
+              :key="item.value"
9
+              :label="item.label"
10
+              :value="item.value">
11
+            </el-option>
12
+          </el-select>
13
+        </el-form-item>
14
+        <el-form-item label="停车场名称">
15
+          <el-input v-model="formInline.interfaceName" placeholder="请输入停车场名称"></el-input>
16
+        </el-form-item>
17
+        <el-form-item>
18
+          <el-button type="primary" @click="onSubmit">查询</el-button>
19
+        </el-form-item>
20
+      </el-form>
16 21
     <div style="display: flex; justify-content: space-between;">
17 22
       <div style="width: 50%; height: 300px">
18 23
         <barchart
@@ -61,6 +66,10 @@ export default {
61 66
   },
62 67
   data() {
63 68
     return {
69
+      formInline: {
70
+        interfaceName: '',
71
+        region: ''
72
+      },
64 73
         options: [{
65 74
           value: '源汇区',
66 75
           label: '源汇区'
@@ -77,6 +86,7 @@ export default {
77 86
           value: '舞阳县',
78 87
           label: '舞阳县'
79 88
         }],
89
+      value: '',
80 90
       modelPieColor: ["#4382f6", "#9078f8", "#79a7db", "#FF9800", "#9C27B0"],
81 91
       modelPieColor1: ["#4382f6", "#9078f8", "#6aa1e1", "#FF9800", "#9C27B0"],
82 92
       modelData: {
@@ -131,4 +141,42 @@ export default {
131 141
   width: 100%;
132 142
   height: 99%;
133 143
 }
144
+
145
+.form-wrapper {
146
+  margin-bottom: 20px;
147
+}
148
+/deep/ .el-input__inner {
149
+  background: #2d3744;
150
+  border: none;
151
+  border-radius: 0;
152
+}
153
+/deep/ .el-select {
154
+  height: 40px;
155
+  .el-input__inner {
156
+    height: 40px;
157
+  }
158
+  .el-input__prefix, .el-input__suffix {
159
+    height: 40px;
160
+  }
161
+
162
+  /* 下面设置右侧按钮居中 */
163
+  .el-input__suffix {
164
+    top: 0px;
165
+    display: flex;
166
+    justify-content: center;
167
+    align-items: center;
168
+    flex-wrap: nowrap;
169
+    flex-direction: row;
170
+    align-content: flex-start;
171
+  }
172
+  /* 输入框加上上下边是 32px + 2px =34px */
173
+  .el-input__icon {
174
+    line-height: 0px;
175
+  }
176
+}
177
+/deep/ .form-wrapper .el-button {
178
+  background: linear-gradient(90deg,#0158d9,#3c97e4);
179
+  width: 100px;
180
+  height: 40px;
181
+}
134 182
 </style>

+ 134 - 0
src/pages/index/components/announcement_function.vue

@@ -0,0 +1,134 @@
1
+<template>
2
+  <div class="body-wrapper">
3
+    <div>
4
+      <h2 style="color: white;margin-bottom: 20px;display: inline-block;width: 90%">公告信息</h2>
5
+      <el-button>发布公告</el-button>
6
+    </div>
7
+    <el-table :data="tableData" style="background: #2a2a2a;border-color: #333;">
8
+      <el-table-column v-for="(item, index) in columns" :key="index" :label="item.label" :prop="item.key">
9
+      </el-table-column>
10
+    </el-table>
11
+    <div class="table-pagination">
12
+      <el-pagination :background="false" layout="total, prev, pager, next" :total="total" @current-change="handlePageChange"
13
+                     :current-page.sync="pageNum" :page-size.sync="pageSize">
14
+      </el-pagination>
15
+    </div>
16
+  </div>
17
+</template>
18
+<script>
19
+import api from "@/api/audit.js";
20
+
21
+export default {
22
+  components: {},
23
+  data() {
24
+    return {
25
+      columns: [
26
+        {
27
+          label: '发布标题',
28
+          key: 'publicTitle'
29
+        },
30
+        {
31
+          label: '发布时间',
32
+          key: 'publicTime'
33
+        },
34
+        {
35
+          label: '发布人',
36
+          key: 'publicPerson'
37
+        }
38
+      ],
39
+      tableData: [{"publicTitle":'预警提示',"publicTime":'2023-12-29 10:00:00',"publicPerson":'李玉'},
40
+        {"publicTitle":'停车时限',"publicTime":'2023-12-31 11:00:00',"publicPerson":'张玮'},
41
+        {"publicTitle":'设备故障',"publicTime":'2023-12-30 10:00:00',"publicPerson":'李玉'},],
42
+      total: 3,
43
+      pageSize: 10,
44
+      pageNum: 1,
45
+      radio: '2',
46
+      dialogVisible: false,
47
+      selRow: {},
48
+      searchWords: undefined
49
+    }
50
+  },
51
+  mounted() {
52
+    this.getTableData()
53
+  },
54
+  watch: {
55
+  },
56
+  methods: {
57
+    handlePageChange() {
58
+      this.getTableData()
59
+    },
60
+    handleAudit(row) {
61
+      this.selRow = row
62
+      this.dialogVisible = true
63
+    },
64
+    handleCancelApply(row) {
65
+      console.log('enter handle cancel apply')
66
+    },
67
+    handleConfirm() {
68
+      const {id} = this.selRow
69
+      console.log('radio', this.radio)
70
+      api.applyResource({id, applyType: this.radio}).then(res => {
71
+        if(res.success) {
72
+          this.dialogVisible = false
73
+          this.$message({
74
+            message: '审核成功!',
75
+            type: 'success'
76
+          })
77
+          this.getTableData()
78
+        }
79
+      })
80
+    },
81
+    getTableData() {
82
+      const {pageNum, pageSize, searchWords} = this
83
+      api.applyList({pageNum, pageSize, resourceName: searchWords}).then(res => {
84
+        this.tableData = []
85
+        res.data.records.map((item, index) => {
86
+          const newItem = {...item}
87
+          newItem.applyTypeText = this.getApplyTypeText(item.applyType)
88
+          this.tableData.push(newItem)
89
+        })
90
+        this.total = res.data.total
91
+      })
92
+    },
93
+    getApplyTypeText(val) {
94
+      if (!val){
95
+        return '未申请'
96
+      }
97
+      const textMap = {
98
+        1: '待审批',
99
+        2: '审批通过',
100
+        3: '审批驳回'
101
+      }
102
+      return textMap[val]
103
+    },
104
+    handleSearch() {
105
+      this.pageNum = 1
106
+      this.getTableData()
107
+    }
108
+  }
109
+}
110
+</script>
111
+<style  lang="scss" scoped>
112
+.body-wrapper {
113
+  padding: 20px;
114
+  background: #0c0c0c;
115
+  /deep/ .el-button {
116
+    background-color: #0158d9;
117
+    color: honeydew;
118
+    border: none;
119
+    width: 100px;
120
+    height: 40px;
121
+  }
122
+  .table-pagination{
123
+    text-align: right;
124
+  }
125
+}
126
+.audit-dialog{
127
+  .mg-bt{
128
+    margin-bottom: 24px;
129
+  }
130
+  .label{
131
+    text-align: right;
132
+  }
133
+}
134
+</style>

+ 138 - 0
src/pages/index/components/berth_recommend.vue

@@ -0,0 +1,138 @@
1
+<template>
2
+  <div class="body-wrapper">
3
+    <div class="body-wrapper" style="height: 300px;">
4
+      <div style="color: white;font-size: 23px;margin-bottom: 20px">各区域停车缺口</div>
5
+      <linechart
6
+        :autoStop="false"
7
+        :top="30"
8
+        :bottom="30"
9
+        :left="40"
10
+        :legendTop="0"
11
+        :dataset="linedata"
12
+        :tooltipFormat="lineTooltipFormat"
13
+        :encode="[
14
+              { x: 'month', y: 'lastYearAmount', seriesName: '预警值',col:'red' },
15
+              { x: 'month', y: 'thisYearAmount', seriesName: '缺口',bool:'true' },
16
+            ]"
17
+        id="sxcyfzqk"
18
+      />
19
+      <div class="body-wrapper" style=" height: 450px">
20
+        <div style="color: white;font-size: 23px;margin-bottom: 20px">各区域路内泊位</div>
21
+        <el-table :data="tableData" style="background: #2a2a2a;border-color: #333;">
22
+          <el-table-column v-for="(item, index) in columns" :key="index" :label="item.label" :prop="item.key">
23
+          </el-table-column>
24
+        </el-table>
25
+        <div class="table-pagination">
26
+          <el-pagination :background="false" layout="total, prev, pager, next" :total="total" @current-change="handlePageChange"
27
+                         :current-page.sync="pageNum" :page-size.sync="pageSize">
28
+          </el-pagination>
29
+        </div>
30
+      </div>
31
+    </div>
32
+  </div>
33
+</template>
34
+<script>
35
+import linechart from "@/components/lineChart";
36
+
37
+export default {
38
+  components: {
39
+    linechart,
40
+  },
41
+  data() {
42
+    return {
43
+      linedata: [{month: '老街街道',lastYearAmount: 30, thisYearAmount: 20}, {month: '马路街街道', lastYearAmount:30, thisYearAmount:50}
44
+        , {month: '顺河街街道', lastYearAmount:30, thisYearAmount:30}, {month: '干河陈街道', lastYearAmount:30, thisYearAmount:30}
45
+        , {month: '大刘镇', lastYearAmount:30, thisYearAmount:0}, {month: '阴阳赵镇', lastYearAmount:30, thisYearAmount:0}],
46
+      columns: [
47
+        {
48
+          label: '街道名称',
49
+          key: 'jd'
50
+        },
51
+        {
52
+          label: '缺口程度(%)',
53
+          key: 'qk'
54
+        },
55
+        {
56
+          label: '推荐策略',
57
+          key: 'tj'
58
+        }
59
+      ],
60
+      tableData: [{"jd": '老街街道',"qk": 30,"tj":"建议设置路内泊车"}
61
+        ,{"jd":'马路街街道',"qk": 20,"tj":"--"}
62
+        ,{"jd":'顺河街街道',"qk": 50,"tj":"建议设置路内泊车"}
63
+        ,{"jd":'干河陈街道',"qk": 30,"tj":"--"}
64
+        ,{"jd":'大刘镇',"qk": 20,"tj":"建议设置路内泊车"}
65
+        ,{"jd":'阴阳赵镇',"qk": 50,"tj":"--"}],
66
+      total: 3,
67
+      pageSize: 10,
68
+      pageNum: 1,
69
+      radio: '2',
70
+      dialogVisible: false,
71
+      selRow: {},
72
+      searchWords: undefined,
73
+    }
74
+  },
75
+  mounted() {
76
+    this.getTableData()
77
+  },
78
+  watch: {
79
+  },
80
+  methods: {
81
+    lineTooltipFormat(params) {
82
+      const data = params[0].data;
83
+      return `<div class="line-tooltip">
84
+        <div style="color: ${params[1].color}">${params[1].seriesName}: ${
85
+        params[0].data.thisYearAmount || "--"
86
+      }(%)</div>
87
+        <div style="color: red">${params[0].seriesName}: ${
88
+        params[0].data.lastYearAmount || "--"
89
+      }(%)</div>
90
+      </div>`;
91
+    },
92
+    handlePageChange() {
93
+      this.getTableData()
94
+    },
95
+    handleCancelApply(row) {
96
+      console.log('enter handle cancel apply')
97
+    },
98
+    handleConfirm() {
99
+      const {id} = this.selRow
100
+      console.log('radio', this.radio)
101
+      api.applyResource({id, applyType: this.radio}).then(res => {
102
+        if(res.success) {
103
+          this.dialogVisible = false
104
+          this.$message({
105
+            message: '审核成功!',
106
+            type: 'success'
107
+          })
108
+          this.getTableData()
109
+        }
110
+      })
111
+    },
112
+    getTableData() {
113
+      const {pageNum, pageSize, searchWords} = this
114
+      api.applyList({pageNum, pageSize, resourceName: searchWords}).then(res => {
115
+        this.tableData = []
116
+        res.data.records.map((item, index) => {
117
+          const newItem = {...item}
118
+          newItem.applyTypeText = this.getApplyTypeText(item.applyType)
119
+          this.tableData.push(newItem)
120
+        })
121
+        this.total = res.data.total
122
+      })
123
+    },
124
+  }
125
+}
126
+</script>
127
+<style  lang="scss" scoped>
128
+
129
+.body-wrapper {
130
+  width: 100%;
131
+  height: 100%;
132
+  box-sizing: border-box;
133
+  background: #0c0c0c;
134
+  .table-pagination{
135
+    text-align: right;
136
+  }
137
+}
138
+</style>

+ 1 - 0
src/pages/index/components/berths_information.vue

@@ -106,6 +106,7 @@ export default {
106 106
         value: '人民东路',
107 107
         label: '人民东路'
108 108
       }],
109
+      value: '',
109 110
       modelPieColor: ["#4382f6","#9078f8"],
110 111
       modelData: {
111 112
         list: [{name: '占用位', value: 100}, {name: '空闲位', value: 100}]

+ 138 - 0
src/pages/index/components/blind_spot_digging.vue

@@ -0,0 +1,138 @@
1
+<template>
2
+  <div class="body-wrapper">
3
+    <div class="body-wrapper" style="height: 300px;">
4
+      <div style="color: white;font-size: 23px;margin-bottom: 20px">各区域停车盲点</div>
5
+      <linechart
6
+        :autoStop="false"
7
+        :top="30"
8
+        :bottom="30"
9
+        :left="40"
10
+        :legendTop="0"
11
+        :dataset="linedata"
12
+        :tooltipFormat="lineTooltipFormat"
13
+        :encode="[
14
+              { x: 'month', y: 'lastYearAmount', seriesName: '预警值',col:'red' },
15
+              { x: 'month', y: 'thisYearAmount', seriesName: '盲点',bool:'true' },
16
+            ]"
17
+        id="sxcyfzqk"
18
+      />
19
+      <div class="body-wrapper" style=" height: 450px">
20
+        <div style="color: white;font-size: 23px;margin-bottom: 20px">各区域优化建议</div>
21
+        <el-table :data="tableData" style="background: #2a2a2a;border-color: #333;">
22
+          <el-table-column v-for="(item, index) in columns" :key="index" :label="item.label" :prop="item.key">
23
+          </el-table-column>
24
+        </el-table>
25
+        <div class="table-pagination">
26
+          <el-pagination :background="false" layout="total, prev, pager, next" :total="total" @current-change="handlePageChange"
27
+                         :current-page.sync="pageNum" :page-size.sync="pageSize">
28
+          </el-pagination>
29
+        </div>
30
+      </div>
31
+    </div>
32
+  </div>
33
+</template>
34
+<script>
35
+import linechart from "@/components/lineChart";
36
+
37
+export default {
38
+  components: {
39
+    linechart,
40
+  },
41
+  data() {
42
+    return {
43
+      linedata: [{month: '老街街道',lastYearAmount: 30, thisYearAmount: 20}, {month: '马路街街道', lastYearAmount:30, thisYearAmount:50}
44
+        , {month: '顺河街街道', lastYearAmount:30, thisYearAmount:30}, {month: '干河陈街道', lastYearAmount:30, thisYearAmount:30}
45
+        , {month: '大刘镇', lastYearAmount:30, thisYearAmount:0}, {month: '阴阳赵镇', lastYearAmount:30, thisYearAmount:0}],
46
+      columns: [
47
+        {
48
+          label: '街道名称',
49
+          key: 'jd'
50
+        },
51
+        {
52
+          label: '缺口程度(%)',
53
+          key: 'qk'
54
+        },
55
+        {
56
+          label: '推荐策略',
57
+          key: 'tj'
58
+        }
59
+      ],
60
+      tableData: [{"jd": '老街街道',"qk": 30,"tj":"建议提升停车盲点的停车资源利用率"}
61
+        ,{"jd":'马路街街道',"qk": 20,"tj":"--"}
62
+        ,{"jd":'顺河街街道',"qk": 10,"tj":"建议提升停车盲点的停车资源利用率"}
63
+        ,{"jd":'干河陈街道',"qk": 0,"tj":"--"}
64
+        ,{"jd":'大刘镇',"qk": 0,"tj":"建议提升停车盲点的停车资源利用率"}
65
+        ,{"jd":'阴阳赵镇',"qk": 10,"tj":"--"}],
66
+      total: 3,
67
+      pageSize: 10,
68
+      pageNum: 1,
69
+      radio: '2',
70
+      dialogVisible: false,
71
+      selRow: {},
72
+      searchWords: undefined,
73
+    }
74
+  },
75
+  mounted() {
76
+    this.getTableData()
77
+  },
78
+  watch: {
79
+  },
80
+  methods: {
81
+    lineTooltipFormat(params) {
82
+      const data = params[0].data;
83
+      return `<div class="line-tooltip">
84
+        <div style="color: ${params[1].color}">${params[1].seriesName}: ${
85
+        params[0].data.thisYearAmount || "--"
86
+      }(%)</div>
87
+        <div style="color: red">${params[0].seriesName}: ${
88
+        params[0].data.lastYearAmount || "--"
89
+      }(%)</div>
90
+      </div>`;
91
+    },
92
+    handlePageChange() {
93
+      this.getTableData()
94
+    },
95
+    handleCancelApply(row) {
96
+      console.log('enter handle cancel apply')
97
+    },
98
+    handleConfirm() {
99
+      const {id} = this.selRow
100
+      console.log('radio', this.radio)
101
+      api.applyResource({id, applyType: this.radio}).then(res => {
102
+        if(res.success) {
103
+          this.dialogVisible = false
104
+          this.$message({
105
+            message: '审核成功!',
106
+            type: 'success'
107
+          })
108
+          this.getTableData()
109
+        }
110
+      })
111
+    },
112
+    getTableData() {
113
+      const {pageNum, pageSize, searchWords} = this
114
+      api.applyList({pageNum, pageSize, resourceName: searchWords}).then(res => {
115
+        this.tableData = []
116
+        res.data.records.map((item, index) => {
117
+          const newItem = {...item}
118
+          newItem.applyTypeText = this.getApplyTypeText(item.applyType)
119
+          this.tableData.push(newItem)
120
+        })
121
+        this.total = res.data.total
122
+      })
123
+    },
124
+  }
125
+}
126
+</script>
127
+<style  lang="scss" scoped>
128
+
129
+.body-wrapper {
130
+  width: 100%;
131
+  height: 100%;
132
+  box-sizing: border-box;
133
+  background: #0c0c0c;
134
+  .table-pagination{
135
+    text-align: right;
136
+  }
137
+}
138
+</style>

+ 262 - 0
src/pages/index/components/gap_analysis.vue

@@ -0,0 +1,262 @@
1
+<template>
2
+  <div>
3
+    <div style="color: #d5d3d3" class="middle-map">
4
+      <div align="center" style="color: white;font-size: 23px;margin-bottom: 20px">停车缺口分析</div>
5
+      <el-select v-model="value" filterable remote reserve-keyword placeholder="请选择时段">
6
+        <el-option
7
+          v-for="item in options"
8
+          :key="item.value"
9
+          :label="item.label"
10
+          :value="item.value">
11
+        </el-option>
12
+      </el-select>
13
+      <div style="height: 450px">
14
+        <div class="bottom" id="map"></div>
15
+      </div>
16
+    </div>
17
+      <div class="body-wrapper" style="height: 300px">
18
+        <div align="center" style="color: white;font-size: 23px;margin-bottom: 20px">停车缺口变化趋势</div>
19
+        <linechart
20
+          :autoStop="false"
21
+          :top="30"
22
+          :bottom="30"
23
+          :left="40"
24
+          :legendTop="0"
25
+          :dataset="linedata"
26
+          :tooltipFormat="lineTooltipFormat"
27
+          :encode="[
28
+              { x: 'month', y: 'thisYearAmount', seriesName: '缺口程度',bool:'true' },
29
+            ]"
30
+          id="sxcyfzqk"
31
+        />
32
+      </div>
33
+  </div>
34
+</template>
35
+
36
+<script>
37
+import * as echarts from 'echarts'
38
+import * as geoJson from '../../../util/411100.json'
39
+import linechart from "@/components/lineChart";
40
+
41
+export default {
42
+  components: {
43
+    linechart,
44
+  },
45
+  data() {
46
+    return {
47
+      linedata: [{month: '8:00', thisYearAmount: 21}, {month: '10:00', thisYearAmount:22}
48
+        , {month: '12:00', thisYearAmount:23}, {month: '14:00', thisYearAmount:25}
49
+        , {month: '16:00', thisYearAmount:28}, {month: '18:00', thisYearAmount:31}
50
+        , {month: '20:00', thisYearAmount:34}, {month: '22:00', thisYearAmount:36}
51
+        , {month: '0:00', thisYearAmount:38}, {month: '2:00', thisYearAmount:39}
52
+        , {month: '4:00', thisYearAmount:40}, {month: '6:00', thisYearAmount:41}],
53
+      options: [{
54
+        value: '日间时段',
55
+        label: '日间时段'
56
+      }, {
57
+        value: '夜间时段',
58
+        label: '夜间时段'
59
+      }],
60
+      value: '',
61
+      dqIndex: -1,
62
+      timer: null,
63
+      option: {
64
+        visualMap: {
65
+          show: true,
66
+          type: "continuous",
67
+          left: "0%",
68
+          bottom: "0%",
69
+          calculable: true,
70
+          textStyle: {
71
+            color: "white",
72
+          },
73
+          text: ["(%)"],
74
+          min: 0,
75
+          max: 100,
76
+          inRange: {
77
+            color: ["#4FC9FB","#36ADFC","#1788D1","#0E6BAE","#1871A2","#0D4D7D"],
78
+          },
79
+        },
80
+        geo: {
81
+          map: "luohe",
82
+          // aspectScale: 1,
83
+          roam: false,
84
+          itemStyle: {
85
+            normal: {
86
+              borderColor: "#2ab8ff",
87
+              borderWidth: 2.5,
88
+              areaColor: "#12235c",
89
+            },
90
+            emphasis: {
91
+              areaColor: "#2AB8FF",
92
+              shadowColor: "rgba(42,184,255, 0.7)",
93
+              shadowOffsetY: 5,
94
+              shadowOffsetX: 5,
95
+              shadowBlur: 5,
96
+            },
97
+          },
98
+        },
99
+        tooltip: {
100
+          confine: true,
101
+          formatter: this.mapTooltip,
102
+          position: "inside",
103
+          backgroundColor: "transparent",
104
+        },
105
+        series: [
106
+          {
107
+            type: "map",
108
+            // roam: true,
109
+            label: {
110
+              normal: {
111
+                textStyle: {
112
+                  color: "#fff",
113
+                },
114
+              },
115
+              emphasis: {
116
+                show: false,
117
+                textStyle: {
118
+                  color: "#fff",
119
+                },
120
+              },
121
+            },
122
+            itemStyle: {
123
+              normal: {
124
+                borderColor: "#76bef5",
125
+                borderWidth: 1.5,
126
+                areaColor: "#4282de",
127
+              },
128
+              emphasis: {
129
+                areaColor: "#002aff",
130
+                borderWidth: 0,
131
+                color: "green",
132
+              },
133
+            },
134
+            roam: false,
135
+            map: "luohe", //使用
136
+            data: [],
137
+          },
138
+        ],
139
+      },
140
+      curData: {},
141
+      dataSource: null,
142
+      totalAll: '0',
143
+    };
144
+  },
145
+  methods: {
146
+    lineTooltipFormat(params) {
147
+      const data = params[0].data;
148
+      return `<div class="line-tooltip">
149
+        <div style="color: ${params[0].color}">${params[0].seriesName}: ${
150
+        params[0].data.thisYearAmount || "--"
151
+      }</div>
152
+      </div>`;
153
+    },
154
+    setIntervalMap(chart) {
155
+      this.timer = setInterval(() => {
156
+        chart.dispatchAction({
157
+          type: "showTip",
158
+          seriesIndex: 0,
159
+          dataIndex: this.dqIndex + 1,
160
+        });
161
+        this.dqIndex++;
162
+        if (this.dqIndex > 4) {
163
+          this.dqIndex = -1;
164
+        }
165
+      }, 3000);
166
+    },
167
+    mapTooltip(data) {
168
+      return `<div class="map-tooltip">
169
+        <div class="map-tooltip-name">${data.name}:<span class="map-tooltip-value">${data.value}%</span></div>
170
+      </div>`;
171
+    },
172
+  },
173
+  mounted() {
174
+    let arr = []
175
+    let dataSoure = {
176
+      '411102': {quyuName: '源汇区', zb: 40},
177
+      '411103': {quyuName: '郾城区', zb: 60},
178
+      '411104': {quyuName: '召陵区', zb: 40},
179
+      '411121': {quyuName: '舞阳县', zb: 50},
180
+      '411122': {quyuName: '临颍县', zb: 30}}
181
+    for (const key in dataSoure) {
182
+      if (key !== '411100') {
183
+        arr.push({
184
+          name: dataSoure[key].quyuName,
185
+          value: Number(dataSoure[key].zb),
186
+        });
187
+      }
188
+    }
189
+    let mapMax = Math.max(...arr.map(item => item.value))
190
+    let mapMin = Math.min(...arr.map(item => item.value))
191
+    console.log(mapMin, '111')
192
+    console.log(mapMax, '222')
193
+    let chart = echarts.init(document.getElementById("map"));
194
+    echarts.registerMap("luohe", geoJson);
195
+    this.option.series[0].data = arr;
196
+    this.option.visualMap.min = mapMin;
197
+    this.option.visualMap.max = mapMax;
198
+    chart.setOption(this.option);
199
+    this.dqIndex = -1;
200
+    this.setIntervalMap(chart);
201
+    //鼠标移入静止播放
202
+    chart.on("mouseover", (e) => {
203
+      clearInterval(this.timer);
204
+      chart.dispatchAction({
205
+        type: "showTip",
206
+        seriesIndex: 0,
207
+        dataIndex: e.dataIndex,
208
+      });
209
+    });
210
+    chart.on("mouseout", (e) => {
211
+      clearInterval(this.timer);
212
+      //鼠标移出后先把上次的高亮取消
213
+      chart.dispatchAction({
214
+        type: "downplay",
215
+        seriesIndex: 0,
216
+        dataIndex: e.dataIndex,
217
+      });
218
+      this.setIntervalMap(chart);
219
+    });
220
+  },
221
+};
222
+</script>
223
+
224
+<style>
225
+.el-input__inner{
226
+  color:#eee;
227
+  border-color: #212121;
228
+  background-color: rgba(1, 28, 82, 0.8);
229
+}
230
+</style>
231
+<style  lang="scss" scoped>
232
+.body-wrapper {
233
+  width: 100%;
234
+  height: 100%;
235
+  box-sizing: border-box;
236
+  background: #0c0c0c;
237
+}
238
+</style>
239
+<style lang="less" scoped>
240
+.middle-map {
241
+  width: 100%;
242
+  height: 100%;
243
+  .bottom {
244
+    height: 90%;
245
+    width: 100%;
246
+  }
247
+  /deep/.map-tooltip {
248
+    font-size: 18px;
249
+    padding: 10px 20px;
250
+    background: url("../../../../static/img/u231.png");
251
+    background-size: 100% 100%;
252
+    .map-tooltip-name {
253
+      color: #00e4ff;
254
+    }
255
+    .map-tooltip-value {
256
+      color: white;
257
+      margin-left: 20px;
258
+    }
259
+  }
260
+}
261
+
262
+</style>

+ 139 - 0
src/pages/index/components/message.vue

@@ -0,0 +1,139 @@
1
+<template>
2
+  <div class="body-wrapper">
3
+    <div>
4
+      <h2 style="color: white;margin-bottom: 20px;">消息中心</h2>
5
+    </div>
6
+    <el-table :data="tableData" style="background: #2a2a2a;border-color: #333;">
7
+      <el-table-column v-for="(item, index) in columns" :key="index" :label="item.label" :prop="item.key">
8
+      </el-table-column>
9
+      <el-table-column label="操作" width="150">
10
+      <div slot-scope="scope">
11
+        <el-button
12
+          size="mini">详情</el-button>
13
+      </div>
14
+    </el-table-column>
15
+    </el-table>
16
+    <div class="table-pagination">
17
+      <el-pagination :background="false" layout="total, prev, pager, next" :total="total" @current-change="handlePageChange"
18
+                     :current-page.sync="pageNum" :page-size.sync="pageSize">
19
+      </el-pagination>
20
+    </div>
21
+  </div>
22
+</template>
23
+<script>
24
+import api from "@/api/audit.js";
25
+
26
+export default {
27
+  components: {},
28
+  data() {
29
+    return {
30
+      columns: [
31
+        {
32
+          label: '标题',
33
+          key: 'title'
34
+        },
35
+        {
36
+          label: '消息类型',
37
+          key: 'messageType'
38
+        },
39
+        {
40
+          label: '发布时间',
41
+          key: 'publicTime'
42
+        },
43
+      ],
44
+      tableData: [{"title":'系统升级',"messageType":'公告',"publicTime":'2023-12-29 10:00:00'},
45
+        {"title":'预警提示',"messageType":'系统通知',"publicTime":'2023-12-25 10:00:00'},
46
+        {"title":'故障提醒',"messageType":'系统通知',"publicTime":'2023-12-29 10:00:00'},],
47
+      total: 3,
48
+      pageSize: 10,
49
+      pageNum: 1,
50
+      radio: '2',
51
+      dialogVisible: false,
52
+      selRow: {},
53
+      searchWords: undefined
54
+    }
55
+  },
56
+  mounted() {
57
+    this.getTableData()
58
+  },
59
+  watch: {
60
+  },
61
+  methods: {
62
+    handlePageChange() {
63
+      this.getTableData()
64
+    },
65
+    handleAudit(row) {
66
+      this.selRow = row
67
+      this.dialogVisible = true
68
+    },
69
+    handleCancelApply(row) {
70
+      console.log('enter handle cancel apply')
71
+    },
72
+    handleConfirm() {
73
+      const {id} = this.selRow
74
+      console.log('radio', this.radio)
75
+      api.applyResource({id, applyType: this.radio}).then(res => {
76
+        if(res.success) {
77
+          this.dialogVisible = false
78
+          this.$message({
79
+            message: '审核成功!',
80
+            type: 'success'
81
+          })
82
+          this.getTableData()
83
+        }
84
+      })
85
+    },
86
+    getTableData() {
87
+      const {pageNum, pageSize, searchWords} = this
88
+      api.applyList({pageNum, pageSize, resourceName: searchWords}).then(res => {
89
+        this.tableData = []
90
+        res.data.records.map((item, index) => {
91
+          const newItem = {...item}
92
+          newItem.applyTypeText = this.getApplyTypeText(item.applyType)
93
+          this.tableData.push(newItem)
94
+        })
95
+        this.total = res.data.total
96
+      })
97
+    },
98
+    getApplyTypeText(val) {
99
+      if (!val){
100
+        return '未申请'
101
+      }
102
+      const textMap = {
103
+        1: '待审批',
104
+        2: '审批通过',
105
+        3: '审批驳回'
106
+      }
107
+      return textMap[val]
108
+    },
109
+    handleSearch() {
110
+      this.pageNum = 1
111
+      this.getTableData()
112
+    }
113
+  }
114
+}
115
+</script>
116
+<style  lang="scss" scoped>
117
+.body-wrapper {
118
+  padding: 20px;
119
+  background: #0c0c0c;
120
+  /deep/ .el-button {
121
+    background-color: #0158d9;
122
+    color: honeydew;
123
+    border: none;
124
+    width: 50px;
125
+    height: 25px;
126
+  }
127
+  .table-pagination{
128
+    text-align: right;
129
+  }
130
+}
131
+.audit-dialog{
132
+  .mg-bt{
133
+    margin-bottom: 24px;
134
+  }
135
+  .label{
136
+    text-align: right;
137
+  }
138
+}
139
+</style>

+ 132 - 0
src/pages/index/components/park_development_analysis.vue

@@ -0,0 +1,132 @@
1
+<template>
2
+  <div>
3
+    <div style="color: #d5d3d3" class="middle-map">
4
+      <div align="center" style="color: white;font-size: 23px;margin-bottom: 20px">区域综合评估</div>
5
+      <el-table :data="tableData" style="background: #2a2a2a;border-color: #333;">
6
+        <el-table-column v-for="(item, index) in columns" :key="index" :label="item.label" :prop="item.key">
7
+        </el-table-column>
8
+      </el-table>
9
+      <div class="table-pagination">
10
+        <el-pagination :background="false" layout="total, prev, pager, next" :total="total" @current-change="handlePageChange"
11
+                       :current-page.sync="pageNum" :page-size.sync="pageSize">
12
+        </el-pagination>
13
+      </div>
14
+    </div>
15
+    <div class="body-wrapper" style="height: 300px">
16
+      <div align="center" style="color: white;font-size: 23px;margin-bottom: 20px">停车发展评估</div>
17
+      <el-table :data="tableData1" style="background: #2a2a2a;border-color: #333;">
18
+        <el-table-column v-for="(item, index) in columns1" :key="index" :label="item.label" :prop="item.key">
19
+        </el-table-column>
20
+      </el-table>
21
+    </div>
22
+  </div>
23
+</template>
24
+
25
+<script>
26
+
27
+export default {
28
+  data() {
29
+    return {
30
+      columns: [
31
+        {
32
+          label: '区县',
33
+          key: 'district'
34
+        },
35
+        {
36
+          label: '周边区域开发',
37
+          key: 'surroundingArea'
38
+        },
39
+        {
40
+          label: '停车资源供给',
41
+          key: 'parkingResource'
42
+        },
43
+        {
44
+          label: '公共交通设施发展',
45
+          key: 'publicTransport'
46
+        },
47
+        {
48
+          label: '道路资源供给',
49
+          key: 'roadResource'
50
+        },
51
+      ],
52
+      tableData: [{"district":'临颍县',"surroundingArea":'轻微开发',"parkingResource":'充足',"publicTransport":' 欠缺',"roadResource":'充足'}
53
+      ,{"district":'源汇区',"surroundingArea":'轻微开发',"parkingResource":'充足',"publicTransport":' 欠缺',"roadResource":'充足'}
54
+      ,{"district":'郾城区',"surroundingArea":'轻微开发',"parkingResource":'充足',"publicTransport":' 欠缺',"roadResource":'充足'}
55
+      ,{"district":'召陵区',"surroundingArea":'轻微开发',"parkingResource":'充足',"publicTransport":' 欠缺',"roadResource":'充足'}
56
+      ,{"district":'舞阳县',"surroundingArea":'轻微开发',"parkingResource":'充足',"publicTransport":' 欠缺',"roadResource":'充足'},],
57
+      total: 3,
58
+      pageSize: 10,
59
+      pageNum: 1,
60
+      radio: '2',
61
+      dialogVisible: false,
62
+      selRow: {},
63
+      searchWords: undefined,
64
+      columns1: [
65
+        {
66
+          label: '姓名',
67
+          key: 'name'
68
+        },
69
+        {
70
+          label: '停车发展评估',
71
+          key: 'assessment'
72
+        }
73
+      ],
74
+      tableData1: [{"name":'舞阳区',"assessment":'不建议进行停车发展'}
75
+        ,{"name":'源汇区',"assessment":'不建议进行停车发展'}
76
+        ,{"name":'郾城区',"assessment":'建议进行停车发展'}
77
+        ,{"name":'召陵区',"assessment":'建议进行停车发展'}
78
+        ,],
79
+    };
80
+  },
81
+  methods: {
82
+    handlePageChange() {
83
+      this.getTableData()
84
+    },
85
+    handleCancelApply(row) {
86
+      console.log('enter handle cancel apply')
87
+    },
88
+    handleConfirm() {
89
+      const {id} = this.selRow
90
+      console.log('radio', this.radio)
91
+      api.applyResource({id, applyType: this.radio}).then(res => {
92
+        if(res.success) {
93
+          this.dialogVisible = false
94
+          this.$message({
95
+            message: '审核成功!',
96
+            type: 'success'
97
+          })
98
+          this.getTableData()
99
+        }
100
+      })
101
+    },
102
+    getTableData() {
103
+      const {pageNum, pageSize, searchWords} = this
104
+      api.applyList({pageNum, pageSize, resourceName: searchWords}).then(res => {
105
+        this.tableData = []
106
+        res.data.records.map((item, index) => {
107
+          const newItem = {...item}
108
+          newItem.applyTypeText = this.getApplyTypeText(item.applyType)
109
+          this.tableData.push(newItem)
110
+        })
111
+        this.total = res.data.total
112
+      })
113
+    },
114
+  },
115
+  mounted() {
116
+    this.getTableData()
117
+  },
118
+};
119
+</script>
120
+<style  lang="scss" scoped>
121
+
122
+.middle-map {
123
+  width: 100%;
124
+  height: 100%;
125
+  box-sizing: border-box;
126
+  background: #0c0c0c;
127
+  .table-pagination{
128
+    text-align: right;
129
+  }
130
+}
131
+</style>
132
+

+ 262 - 0
src/pages/index/components/park_easy.vue

@@ -0,0 +1,262 @@
1
+<template>
2
+  <div>
3
+    <div style="color: #d5d3d3" class="middle-map">
4
+      <div align="center" style="color: white;font-size: 23px;margin-bottom: 20px">停车难易指数</div>
5
+      <el-select v-model="value" filterable remote reserve-keyword placeholder="请选择时段">
6
+        <el-option
7
+          v-for="item in options"
8
+          :key="item.value"
9
+          :label="item.label"
10
+          :value="item.value">
11
+        </el-option>
12
+      </el-select>
13
+      <div style="height: 450px">
14
+        <div class="bottom" id="map"></div>
15
+      </div>
16
+    </div>
17
+    <div class="body-wrapper" style="height: 300px">
18
+      <div align="center" style="color: white;font-size: 23px;margin-bottom: 20px">停车难易指数变化趋势</div>
19
+      <linechart
20
+        :autoStop="false"
21
+        :top="30"
22
+        :bottom="30"
23
+        :left="40"
24
+        :legendTop="0"
25
+        :dataset="linedata"
26
+        :tooltipFormat="lineTooltipFormat"
27
+        :encode="[
28
+              { x: 'month', y: 'thisYearAmount', seriesName: '缺口程度',bool:'true' },
29
+            ]"
30
+        id="sxcyfzqk"
31
+      />
32
+    </div>
33
+  </div>
34
+</template>
35
+
36
+<script>
37
+import * as echarts from 'echarts'
38
+import * as geoJson from '../../../util/411100.json'
39
+import linechart from "@/components/lineChart";
40
+
41
+export default {
42
+  components: {
43
+    linechart,
44
+  },
45
+  data() {
46
+    return {
47
+      linedata: [{month: '8:00', thisYearAmount: 21}, {month: '10:00', thisYearAmount:22}
48
+        , {month: '12:00', thisYearAmount:23}, {month: '14:00', thisYearAmount:25}
49
+        , {month: '16:00', thisYearAmount:28}, {month: '18:00', thisYearAmount:31}
50
+        , {month: '20:00', thisYearAmount:34}, {month: '22:00', thisYearAmount:36}
51
+        , {month: '0:00', thisYearAmount:38}, {month: '2:00', thisYearAmount:39}
52
+        , {month: '4:00', thisYearAmount:40}, {month: '6:00', thisYearAmount:41}],
53
+      options: [{
54
+        value: '日间时段',
55
+        label: '日间时段'
56
+      }, {
57
+        value: '夜间时段',
58
+        label: '夜间时段'
59
+      }],
60
+      value: '',
61
+      dqIndex: -1,
62
+      timer: null,
63
+      option: {
64
+        visualMap: {
65
+          show: true,
66
+          type: "continuous",
67
+          left: "0%",
68
+          bottom: "0%",
69
+          calculable: true,
70
+          textStyle: {
71
+            color: "white",
72
+          },
73
+          text: ["(%)"],
74
+          min: 0,
75
+          max: 100,
76
+          inRange: {
77
+            color: ["#4FC9FB","#36ADFC","#1788D1","#0E6BAE","#1871A2","#0D4D7D"],
78
+          },
79
+        },
80
+        geo: {
81
+          map: "luohe",
82
+          // aspectScale: 1,
83
+          roam: false,
84
+          itemStyle: {
85
+            normal: {
86
+              borderColor: "#2ab8ff",
87
+              borderWidth: 2.5,
88
+              areaColor: "#12235c",
89
+            },
90
+            emphasis: {
91
+              areaColor: "#2AB8FF",
92
+              shadowColor: "rgba(42,184,255, 0.7)",
93
+              shadowOffsetY: 5,
94
+              shadowOffsetX: 5,
95
+              shadowBlur: 5,
96
+            },
97
+          },
98
+        },
99
+        tooltip: {
100
+          confine: true,
101
+          formatter: this.mapTooltip,
102
+          position: "inside",
103
+          backgroundColor: "transparent",
104
+        },
105
+        series: [
106
+          {
107
+            type: "map",
108
+            // roam: true,
109
+            label: {
110
+              normal: {
111
+                textStyle: {
112
+                  color: "#fff",
113
+                },
114
+              },
115
+              emphasis: {
116
+                show: false,
117
+                textStyle: {
118
+                  color: "#fff",
119
+                },
120
+              },
121
+            },
122
+            itemStyle: {
123
+              normal: {
124
+                borderColor: "#76bef5",
125
+                borderWidth: 1.5,
126
+                areaColor: "#4282de",
127
+              },
128
+              emphasis: {
129
+                areaColor: "#002aff",
130
+                borderWidth: 0,
131
+                color: "green",
132
+              },
133
+            },
134
+            roam: false,
135
+            map: "luohe", //使用
136
+            data: [],
137
+          },
138
+        ],
139
+      },
140
+      curData: {},
141
+      dataSource: null,
142
+      totalAll: '0',
143
+    };
144
+  },
145
+  methods: {
146
+    lineTooltipFormat(params) {
147
+      const data = params[0].data;
148
+      return `<div class="line-tooltip">
149
+        <div style="color: ${params[0].color}">${params[0].seriesName}: ${
150
+        params[0].data.thisYearAmount || "--"
151
+      }</div>
152
+      </div>`;
153
+    },
154
+    setIntervalMap(chart) {
155
+      this.timer = setInterval(() => {
156
+        chart.dispatchAction({
157
+          type: "showTip",
158
+          seriesIndex: 0,
159
+          dataIndex: this.dqIndex + 1,
160
+        });
161
+        this.dqIndex++;
162
+        if (this.dqIndex > 4) {
163
+          this.dqIndex = -1;
164
+        }
165
+      }, 3000);
166
+    },
167
+    mapTooltip(data) {
168
+      return `<div class="map-tooltip">
169
+        <div class="map-tooltip-name">${data.name}:<span class="map-tooltip-value">${data.value}%</span></div>
170
+      </div>`;
171
+    },
172
+  },
173
+  mounted() {
174
+    let arr = []
175
+    let dataSoure = {
176
+      '411102': {quyuName: '源汇区', zb: 40},
177
+      '411103': {quyuName: '郾城区', zb: 60},
178
+      '411104': {quyuName: '召陵区', zb: 40},
179
+      '411121': {quyuName: '舞阳县', zb: 50},
180
+      '411122': {quyuName: '临颍县', zb: 30}}
181
+    for (const key in dataSoure) {
182
+      if (key !== '411100') {
183
+        arr.push({
184
+          name: dataSoure[key].quyuName,
185
+          value: Number(dataSoure[key].zb),
186
+        });
187
+      }
188
+    }
189
+    let mapMax = Math.max(...arr.map(item => item.value))
190
+    let mapMin = Math.min(...arr.map(item => item.value))
191
+    console.log(mapMin, '111')
192
+    console.log(mapMax, '222')
193
+    let chart = echarts.init(document.getElementById("map"));
194
+    echarts.registerMap("luohe", geoJson);
195
+    this.option.series[0].data = arr;
196
+    this.option.visualMap.min = mapMin;
197
+    this.option.visualMap.max = mapMax;
198
+    chart.setOption(this.option);
199
+    this.dqIndex = -1;
200
+    this.setIntervalMap(chart);
201
+    //鼠标移入静止播放
202
+    chart.on("mouseover", (e) => {
203
+      clearInterval(this.timer);
204
+      chart.dispatchAction({
205
+        type: "showTip",
206
+        seriesIndex: 0,
207
+        dataIndex: e.dataIndex,
208
+      });
209
+    });
210
+    chart.on("mouseout", (e) => {
211
+      clearInterval(this.timer);
212
+      //鼠标移出后先把上次的高亮取消
213
+      chart.dispatchAction({
214
+        type: "downplay",
215
+        seriesIndex: 0,
216
+        dataIndex: e.dataIndex,
217
+      });
218
+      this.setIntervalMap(chart);
219
+    });
220
+  },
221
+};
222
+</script>
223
+
224
+<style>
225
+.el-input__inner{
226
+  color:#eee;
227
+  border-color: #212121;
228
+  background-color: rgba(1, 28, 82, 0.8);
229
+}
230
+</style>
231
+<style  lang="scss" scoped>
232
+.body-wrapper {
233
+  width: 100%;
234
+  height: 100%;
235
+  box-sizing: border-box;
236
+  background: #0c0c0c;
237
+}
238
+</style>
239
+<style lang="less" scoped>
240
+.middle-map {
241
+  width: 100%;
242
+  height: 100%;
243
+  .bottom {
244
+    height: 90%;
245
+    width: 100%;
246
+  }
247
+  /deep/.map-tooltip {
248
+    font-size: 18px;
249
+    padding: 10px 20px;
250
+    background: url("../../../../static/img/u231.png");
251
+    background-size: 100% 100%;
252
+    .map-tooltip-name {
253
+      color: #00e4ff;
254
+    }
255
+    .map-tooltip-value {
256
+      color: white;
257
+      margin-left: 20px;
258
+    }
259
+  }
260
+}
261
+
262
+</style>

+ 234 - 0
src/pages/index/components/park_guidance.vue

@@ -0,0 +1,234 @@
1
+<template>
2
+  <div>
3
+    <div style="color: #d5d3d3" class="middle-map">
4
+      <div align="center" style="color: white;font-size: 23px;margin-bottom: 20px">实施停车饱和度</div>
5
+      <div style="height: 450px">
6
+        <div class="bottom" id="map"></div>
7
+      </div>
8
+    </div>
9
+    <div class="body-wrapper" style="height: 300px">
10
+      <div align="center" style="color: white;font-size: 23px;margin-bottom: 20px">停车建议</div>
11
+      <el-table :data="tableData" style="background: #2a2a2a;border-color: #333;">
12
+        <el-table-column v-for="(item, index) in columns" :key="index" :label="item.label" :prop="item.key">
13
+        </el-table-column>
14
+      </el-table>
15
+    </div>
16
+  </div>
17
+</template>
18
+
19
+<script>
20
+import * as echarts from 'echarts'
21
+import * as geoJson from '../../../util/411100.json'
22
+import linechart from "@/components/lineChart";
23
+
24
+export default {
25
+  components: {
26
+    linechart,
27
+  },
28
+  data() {
29
+    return {
30
+      columns: [
31
+        {
32
+          label: '区域',
33
+          key: 'area'
34
+        },
35
+        {
36
+          label: '建议',
37
+          key: 'advice'
38
+        }
39
+      ],
40
+      tableData: [{"area":'舞阳区',"advice":'建议车辆引流到源汇区'}],
41
+      dqIndex: -1,
42
+      timer: null,
43
+      option: {
44
+        visualMap: {
45
+          show: true,
46
+          type: "continuous",
47
+          left: "0%",
48
+          bottom: "0%",
49
+          calculable: true,
50
+          textStyle: {
51
+            color: "white",
52
+          },
53
+          text: ["(%)"],
54
+          min: 0,
55
+          max: 100,
56
+          inRange: {
57
+            color: ["#4FC9FB","#36ADFC","#1788D1","#0E6BAE","#1871A2","#0D4D7D"],
58
+          },
59
+        },
60
+        geo: {
61
+          map: "luohe",
62
+          // aspectScale: 1,
63
+          roam: false,
64
+          itemStyle: {
65
+            normal: {
66
+              borderColor: "#2ab8ff",
67
+              borderWidth: 2.5,
68
+              areaColor: "#12235c",
69
+            },
70
+            emphasis: {
71
+              areaColor: "#2AB8FF",
72
+              shadowColor: "rgba(42,184,255, 0.7)",
73
+              shadowOffsetY: 5,
74
+              shadowOffsetX: 5,
75
+              shadowBlur: 5,
76
+            },
77
+          },
78
+        },
79
+        tooltip: {
80
+          confine: true,
81
+          formatter: this.mapTooltip,
82
+          position: "inside",
83
+          backgroundColor: "transparent",
84
+        },
85
+        series: [
86
+          {
87
+            type: "map",
88
+            // roam: true,
89
+            label: {
90
+              normal: {
91
+                textStyle: {
92
+                  color: "#fff",
93
+                },
94
+              },
95
+              emphasis: {
96
+                show: false,
97
+                textStyle: {
98
+                  color: "#fff",
99
+                },
100
+              },
101
+            },
102
+            itemStyle: {
103
+              normal: {
104
+                borderColor: "#76bef5",
105
+                borderWidth: 1.5,
106
+                areaColor: "#4282de",
107
+              },
108
+              emphasis: {
109
+                areaColor: "#002aff",
110
+                borderWidth: 0,
111
+                color: "green",
112
+              },
113
+            },
114
+            roam: false,
115
+            map: "luohe", //使用
116
+            data: [],
117
+          },
118
+        ],
119
+      },
120
+      curData: {},
121
+      dataSource: null,
122
+      totalAll: '0',
123
+    };
124
+  },
125
+  methods: {
126
+    setIntervalMap(chart) {
127
+      this.timer = setInterval(() => {
128
+        chart.dispatchAction({
129
+          type: "showTip",
130
+          seriesIndex: 0,
131
+          dataIndex: this.dqIndex + 1,
132
+        });
133
+        this.dqIndex++;
134
+        if (this.dqIndex > 4) {
135
+          this.dqIndex = -1;
136
+        }
137
+      }, 3000);
138
+    },
139
+    mapTooltip(data) {
140
+      return `<div class="map-tooltip">
141
+        <div class="map-tooltip-name">${data.name}:<span class="map-tooltip-value">${data.value}%</span></div>
142
+      </div>`;
143
+    },
144
+  },
145
+  mounted() {
146
+    let arr = []
147
+    let dataSoure = {
148
+      '411102': {quyuName: '源汇区', zb: 40},
149
+      '411103': {quyuName: '郾城区', zb: 60},
150
+      '411104': {quyuName: '召陵区', zb: 40},
151
+      '411121': {quyuName: '舞阳县', zb: 50},
152
+      '411122': {quyuName: '临颍县', zb: 30}}
153
+    for (const key in dataSoure) {
154
+      if (key !== '411100') {
155
+        arr.push({
156
+          name: dataSoure[key].quyuName,
157
+          value: Number(dataSoure[key].zb),
158
+        });
159
+      }
160
+    }
161
+    let mapMax = Math.max(...arr.map(item => item.value))
162
+    let mapMin = Math.min(...arr.map(item => item.value))
163
+    console.log(mapMin, '111')
164
+    console.log(mapMax, '222')
165
+    let chart = echarts.init(document.getElementById("map"));
166
+    echarts.registerMap("luohe", geoJson);
167
+    this.option.series[0].data = arr;
168
+    this.option.visualMap.min = mapMin;
169
+    this.option.visualMap.max = mapMax;
170
+    chart.setOption(this.option);
171
+    this.dqIndex = -1;
172
+    this.setIntervalMap(chart);
173
+    //鼠标移入静止播放
174
+    chart.on("mouseover", (e) => {
175
+      clearInterval(this.timer);
176
+      chart.dispatchAction({
177
+        type: "showTip",
178
+        seriesIndex: 0,
179
+        dataIndex: e.dataIndex,
180
+      });
181
+    });
182
+    chart.on("mouseout", (e) => {
183
+      clearInterval(this.timer);
184
+      //鼠标移出后先把上次的高亮取消
185
+      chart.dispatchAction({
186
+        type: "downplay",
187
+        seriesIndex: 0,
188
+        dataIndex: e.dataIndex,
189
+      });
190
+      this.setIntervalMap(chart);
191
+    });
192
+  },
193
+};
194
+</script>
195
+
196
+<style>
197
+.el-input__inner{
198
+  color:#eee;
199
+  border-color: #212121;
200
+  background-color: rgba(1, 28, 82, 0.8);
201
+}
202
+</style>
203
+<style  lang="scss" scoped>
204
+.body-wrapper {
205
+  width: 100%;
206
+  height: 100%;
207
+  box-sizing: border-box;
208
+  background: #0c0c0c;
209
+}
210
+</style>
211
+<style lang="less" scoped>
212
+.middle-map {
213
+  width: 100%;
214
+  height: 100%;
215
+  .bottom {
216
+    height: 90%;
217
+    width: 100%;
218
+  }
219
+  /deep/.map-tooltip {
220
+    font-size: 18px;
221
+    padding: 10px 20px;
222
+    background: url("../../../../static/img/u231.png");
223
+    background-size: 100% 100%;
224
+    .map-tooltip-name {
225
+      color: #00e4ff;
226
+    }
227
+    .map-tooltip-value {
228
+      color: white;
229
+      margin-left: 20px;
230
+    }
231
+  }
232
+}
233
+
234
+</style>

+ 74 - 2
src/pages/index/components/parking_area.vue

@@ -39,9 +39,9 @@
39 39
       </div>
40 40
     </div>
41 41
     <div style="display: flex; justify-content: space-between;margin-top: 5%">
42
-      <div style="width: 50%; height: 300px;">
42
+      <div style="width: 100%; height: 500px;">
43 43
         <div align="center" style="color: white">停车热度时空分布</div>
44
-
44
+        <div class="bottom" id="map"></div>
45 45
       </div>
46 46
     </div>
47 47
   </div>
@@ -49,6 +49,8 @@
49 49
 <script>
50 50
 import linechart from "@/components/lineChart";
51 51
 import barchart from "@/components/barChart";
52
+import * as echarts from 'echarts';
53
+import * as geoJson from '../../../util/411100.json';
52 54
 
53 55
 
54 56
 export default {
@@ -58,6 +60,49 @@ export default {
58 60
   },
59 61
   data() {
60 62
     return {
63
+      option: {
64
+        backgroundColor: '#0c0c0c',
65
+        visualMap: {
66
+          bottom: 100,
67
+          left: 100,
68
+          min: 0,
69
+          max: 100,
70
+          color: ['#ff4601', '#fffc00', '#87cffa'],
71
+          calculable: true,
72
+          textStyle: {
73
+            color: '#fff',
74
+            fontSize: 12
75
+          },
76
+          seriesIndex: 0
77
+        },
78
+        geo: {
79
+          map: 'luohe',
80
+          show: true,
81
+          roam: false,
82
+          label: {
83
+            emphasis: {
84
+              show: false
85
+            }
86
+          },
87
+          itemStyle: {
88
+            normal: {
89
+              areaColor: '#17439a',
90
+              borderColor: '#fff'
91
+            },
92
+            emphasis: {
93
+              areaColor: '#17439a',
94
+              borderColor: '#fff'
95
+            }
96
+          }
97
+        },
98
+        series: [{
99
+          name: 'AQI',
100
+          type: 'heatmap',
101
+          coordinateSystem: 'geo',
102
+          blurSize: 40,
103
+          data: []
104
+        }]
105
+      },
61 106
       linedata1: [{month: '00:00', lastAmount: 68}, {month: '01:30', lastAmount:71}
62 107
         , {month: '02:30', lastAmount:83}, {month: '03:30', lastAmount:87}, {month: '04:30', lastAmount:75}
63 108
         , {month: '05:30', lastAmount:69}, {month: '06:30', lastAmount:59}],
@@ -66,6 +111,27 @@ export default {
66 111
     }
67 112
   },
68 113
   mounted() {
114
+    let data = [
115
+      ["114.00647", "33.55627", 9034],
116
+      ["114.00694", "33.58723", 5803],
117
+      ["113.59848", "33.43243", 5508],
118
+      ["114.09399", "33.58601", 1200],
119
+      ["113.93661", "33.81123", 4000]
120
+    ]
121
+    let areaData = [];
122
+    data.map(item => { //扩大热力图效果
123
+      areaData.push(...new Array(3).fill(item))
124
+    })
125
+    let mapMax = Math.max(...data.map(item => item[2]))
126
+    let mapMin = Math.min(...data.map(item => item[2]))
127
+    let chart = echarts.init(document.getElementById("map"));
128
+    echarts.registerMap("luohe", geoJson);
129
+
130
+    // echarts.registerMap('china', china)
131
+    this.option.series[0].data = areaData;
132
+    this.option.visualMap.min = mapMin;
133
+    this.option.visualMap.max = mapMax;
134
+    chart.setOption(this.option);
69 135
   },
70 136
   watch: {
71 137
 
@@ -111,3 +177,9 @@ export default {
111 177
 
112 178
 
113 179
 </style>
180
+<style lang="less" scoped>
181
+  .bottom {
182
+    height: 100%;
183
+    width: 100%;
184
+  }
185
+</style>

+ 216 - 0
src/pages/index/components/saturation_warning.vue

@@ -0,0 +1,216 @@
1
+<template>
2
+  <div class="body-wrapper">
3
+    <div style="color: white;font-size: 23px;margin-bottom: 20px">全市停车饱和度</div>
4
+    <el-form class="form-wrapper" :inline="true" :model="formInline">
5
+      <el-form-item label="区县:">
6
+        <el-select v-model="formInline.region0" placeholder="区县" class="cur-select">
7
+          <el-option label="源汇区" value="源汇区"></el-option>
8
+          <el-option label="郾城区" value="郾城区"></el-option>
9
+          <el-option label="召陵区" value="召陵区"></el-option>
10
+          <el-option label="舞阳县" value="舞阳县"></el-option>
11
+          <el-option label="临颍县" value="临颍县"></el-option>
12
+        </el-select>
13
+      </el-form-item>
14
+      <el-form-item label="街道:">
15
+        <el-select v-model="formInline.region1" placeholder="街道" class="cur-select">
16
+          <el-option label="老街街道" value="老街街道"></el-option>
17
+          <el-option label="马路街街道" value="马路街街道"></el-option>
18
+          <el-option label="顺河街街道" value="顺河街街道"></el-option>
19
+          <el-option label="干河陈街道" value="干河陈街道"></el-option>
20
+          <el-option label="大刘镇" value="大刘镇"></el-option>
21
+          <el-option label="阴阳赵镇" value="阴阳赵镇"></el-option>
22
+          <el-option label="空冢郭镇" value="空冢郭镇"></el-option>
23
+          <el-option label="问十乡" value="问十乡"></el-option>
24
+        </el-select>
25
+      </el-form-item>
26
+      <el-form-item label="路内停车场:">
27
+        <el-select v-model="formInline.region2" placeholder="路内停车场" class="cur-select">
28
+          <el-option label="南街村景区-停车场" value="南街村景区-停车场"></el-option>
29
+          <el-option label="漯河市中医院-地上停车场" value="漯河市中医院-地上停车场"></el-option>
30
+        </el-select>
31
+      </el-form-item>
32
+      <el-form-item label="路外停车场:">
33
+        <el-select v-model="formInline.region3" placeholder="路外停车场" class="cur-select">
34
+          <el-option label="市图书馆停车场" value="市图书馆停车场"></el-option>
35
+          <el-option label="中山公园停车场" value="中山公园停车场"></el-option>
36
+          <el-option label="市中心医院停车场" value="市中心医院停车场"></el-option>
37
+          <el-option label="妇幼保健院停车场" value="妇幼保健院停车场"></el-option>
38
+        </el-select>
39
+      </el-form-item>
40
+    </el-form>
41
+    <div class="body-wrapper" style="height: 300px;">
42
+      <linechart
43
+        :autoStop="false"
44
+        :top="30"
45
+        :bottom="30"
46
+        :left="40"
47
+        :legendTop="0"
48
+        yAxisName="(%)"
49
+        :dataset="linedata"
50
+        :tooltipFormat="lineTooltipFormat"
51
+        :encode="[
52
+              { x: 'month', y: 'lastYearAmount', seriesName: '预警值',col:'red' },
53
+              { x: 'month', y: 'thisYearAmount', seriesName: '饱和度',bool:'true' },
54
+            ]"
55
+        id="sxcyfzqk"
56
+      />
57
+      <div class="body-wrapper" style=" height: 450px">
58
+        <div style="color: white;font-size: 23px;margin-bottom: 20px">网格化停车饱和预警</div>
59
+        <el-table :data="tableData" style="background: #2a2a2a;border-color: #333;">
60
+          <el-table-column v-for="(item, index) in columns" :key="index" :label="item.label" :prop="item.key">
61
+          </el-table-column>
62
+        </el-table>
63
+        <div class="table-pagination">
64
+          <el-pagination :background="false" layout="total, prev, pager, next" :total="total" @current-change="handlePageChange"
65
+                         :current-page.sync="pageNum" :page-size.sync="pageSize">
66
+          </el-pagination>
67
+        </div>
68
+      </div>
69
+    </div>
70
+  </div>
71
+</template>
72
+<script>
73
+import linechart from "@/components/lineChart";
74
+import vtable from "@/components/vtableNew";
75
+
76
+export default {
77
+  components: {
78
+    linechart,
79
+    vtable,
80
+  },
81
+  data() {
82
+    return {
83
+      formInline: {
84
+        region0: '',
85
+        region1: '',
86
+        region2: '',
87
+        region3: '',
88
+      },
89
+      linedata: [{month: '8:00',lastYearAmount: 80, thisYearAmount: 90}, {month: '10:00', lastYearAmount:80, thisYearAmount:70}
90
+        , {month: '12:00', lastYearAmount:80, thisYearAmount:60}, {month: '14:00', lastYearAmount:80, thisYearAmount:75}
91
+        , {month: '16:00', lastYearAmount:80, thisYearAmount:60}, {month: '18:00', lastYearAmount:80, thisYearAmount:90}
92
+        , {month: '20:00', lastYearAmount:80, thisYearAmount:70}, {month: '22:00', lastYearAmount:80, thisYearAmount:60}
93
+        , {month: '0:00', lastYearAmount:80, thisYearAmount:75}, {month: '2:00', lastYearAmount:80, thisYearAmount:60}
94
+        , {month: '4:00', lastYearAmount:80, thisYearAmount:73}, {month: '6:00', lastYearAmount:80, thisYearAmount:60}],
95
+      columns: [
96
+        {
97
+          label: '街道名称',
98
+          key: 'jd'
99
+        },
100
+        {
101
+          label: '剩余停车位',
102
+          key: 'sy'
103
+        }
104
+      ],
105
+      tableData: [{"jd": '老街街道',"sy": 30}
106
+        ,{"jd":'马路街街道',"sy": 70}
107
+        ,{"jd":'顺河街街道',"sy": 80}
108
+        ,{"jd":'干河陈街道',"sy": 30}
109
+        ,{"jd":'大刘镇',"sy": 62}
110
+        ,{"jd":'阴阳赵镇',"sy": 44}
111
+        ,{"jd":'空冢郭镇',"sy": 30}
112
+        ,{"jd":'问十乡',"sy": 97}],
113
+      total: 3,
114
+      pageSize: 10,
115
+      pageNum: 1,
116
+      radio: '2',
117
+      dialogVisible: false,
118
+      selRow: {},
119
+      searchWords: undefined
120
+    }
121
+  },
122
+  mounted() {
123
+    this.getTableData()
124
+  },
125
+  watch: {
126
+  },
127
+  methods: {
128
+    handlePageChange() {
129
+      this.getTableData()
130
+    },
131
+    handleCancelApply(row) {
132
+      console.log('enter handle cancel apply')
133
+    },
134
+    handleConfirm() {
135
+      const {id} = this.selRow
136
+      console.log('radio', this.radio)
137
+      api.applyResource({id, applyType: this.radio}).then(res => {
138
+        if(res.success) {
139
+          this.dialogVisible = false
140
+          this.$message({
141
+            message: '审核成功!',
142
+            type: 'success'
143
+          })
144
+          this.getTableData()
145
+        }
146
+      })
147
+    },
148
+    getTableData() {
149
+      const {pageNum, pageSize, searchWords} = this
150
+      api.applyList({pageNum, pageSize, resourceName: searchWords}).then(res => {
151
+        this.tableData = []
152
+        res.data.records.map((item, index) => {
153
+          const newItem = {...item}
154
+          newItem.applyTypeText = this.getApplyTypeText(item.applyType)
155
+          this.tableData.push(newItem)
156
+        })
157
+        this.total = res.data.total
158
+      })
159
+    },
160
+    lineTooltipFormat(params) {
161
+      const data = params[0].data;
162
+      return `<div class="line-tooltip">
163
+        <div style="color: ${params[1].color}">${params[1].seriesName}: ${
164
+        params[0].data.thisYearAmount || "--"
165
+      }(%)</div>
166
+        <div style="color: red">${params[0].seriesName}: ${
167
+        params[0].data.lastYearAmount || "--"
168
+      }(%)</div>
169
+      </div>`;
170
+    },
171
+  }
172
+}
173
+</script>
174
+<style  lang="scss" scoped>
175
+.form-wrapper {
176
+  margin-bottom: 20px;
177
+}
178
+/deep/ .el-input__inner {
179
+  background: #2d3744;
180
+  border: none;
181
+  border-radius: 0;
182
+}
183
+/deep/ .el-select {
184
+  height: 40px;
185
+  .el-input__inner {
186
+    height: 40px;
187
+  }
188
+  .el-input__prefix, .el-input__suffix {
189
+    height: 40px;
190
+  }
191
+
192
+  /* 下面设置右侧按钮居中 */
193
+  .el-input__suffix {
194
+    top: 0px;
195
+    display: flex;
196
+    justify-content: center;
197
+    align-items: center;
198
+    flex-wrap: nowrap;
199
+    flex-direction: row;
200
+    align-content: flex-start;
201
+  }
202
+  /* 输入框加上上下边是 32px + 2px =34px */
203
+  .el-input__icon {
204
+    line-height: 0px;
205
+  }
206
+}
207
+.body-wrapper {
208
+  width: 100%;
209
+  height: 100%;
210
+  box-sizing: border-box;
211
+  background: #0c0c0c;
212
+  .table-pagination{
213
+    text-align: right;
214
+  }
215
+}
216
+</style>

+ 217 - 0
src/pages/index/components/service_operations.vue

@@ -0,0 +1,217 @@
1
+<template>
2
+  <div style="color: #d5d3d3" class="middle-map">
3
+    <el-select v-model="value" filterable remote reserve-keyword placeholder="请选择区域层级">
4
+      <el-option
5
+        v-for="item in options"
6
+        :key="item.value"
7
+        :label="item.label"
8
+        :value="item.value">
9
+      </el-option>
10
+    </el-select>
11
+    <div class="bottom" id="map"></div>
12
+  </div>
13
+</template>
14
+
15
+<script>
16
+import * as echarts from 'echarts'
17
+import * as geoJson from '../../../util/411100.json'
18
+
19
+export default {
20
+  data() {
21
+    return {
22
+      options: [{
23
+        value: '行政区',
24
+        label: '行政区'
25
+      }, {
26
+        value: '重点区域',
27
+        label: '重点区域'
28
+      }, {
29
+        value: '具体道路',
30
+        label: '具体道路'
31
+      }],
32
+      value: '',
33
+      dqIndex: -1,
34
+      timer: null,
35
+      option: {
36
+        visualMap: {
37
+          show: true,
38
+          type: "continuous",
39
+          left: "0%",
40
+          bottom: "0%",
41
+          calculable: true,
42
+          textStyle: {
43
+            color: "white",
44
+          },
45
+          text: ["(%)"],
46
+          min: 0,
47
+          max: 100,
48
+          inRange: {
49
+            color: ["#4FC9FB","#36ADFC","#1788D1","#0E6BAE","#1871A2","#0D4D7D"],
50
+          },
51
+        },
52
+        geo: {
53
+          map: "luohe",
54
+          // aspectScale: 1,
55
+          roam: false,
56
+          itemStyle: {
57
+            normal: {
58
+              borderColor: "#2ab8ff",
59
+              borderWidth: 2.5,
60
+              areaColor: "#12235c",
61
+            },
62
+            emphasis: {
63
+              areaColor: "#2AB8FF",
64
+              shadowColor: "rgba(42,184,255, 0.7)",
65
+              shadowOffsetY: 5,
66
+              shadowOffsetX: 5,
67
+              shadowBlur: 5,
68
+            },
69
+          },
70
+        },
71
+        tooltip: {
72
+          confine: true,
73
+          formatter: this.mapTooltip,
74
+          position: "inside",
75
+          backgroundColor: "transparent",
76
+        },
77
+        series: [
78
+          {
79
+            type: "map",
80
+            // roam: true,
81
+            label: {
82
+              normal: {
83
+                textStyle: {
84
+                  color: "#fff",
85
+                },
86
+              },
87
+              emphasis: {
88
+                show: false,
89
+                textStyle: {
90
+                  color: "#fff",
91
+                },
92
+              },
93
+            },
94
+            itemStyle: {
95
+              normal: {
96
+                borderColor: "#76bef5",
97
+                borderWidth: 1.5,
98
+                areaColor: "#4282de",
99
+              },
100
+              emphasis: {
101
+                areaColor: "#002aff",
102
+                borderWidth: 0,
103
+                color: "green",
104
+              },
105
+            },
106
+            roam: false,
107
+            map: "luohe", //使用
108
+            data: [],
109
+          },
110
+        ],
111
+      },
112
+      curData: {},
113
+      dataSource: null,
114
+      totalAll: '0',
115
+    };
116
+  },
117
+  methods: {
118
+    setIntervalMap(chart) {
119
+      this.timer = setInterval(() => {
120
+        chart.dispatchAction({
121
+          type: "showTip",
122
+          seriesIndex: 0,
123
+          dataIndex: this.dqIndex + 1,
124
+        });
125
+        this.dqIndex++;
126
+        if (this.dqIndex > 4) {
127
+          this.dqIndex = -1;
128
+        }
129
+      }, 3000);
130
+    },
131
+    mapTooltip(data) {
132
+      return `<div class="map-tooltip">
133
+        <div class="map-tooltip-name">${data.name}:<span class="map-tooltip-value">${data.value}%</span></div>
134
+      </div>`;
135
+    },
136
+  },
137
+  mounted() {
138
+    let arr = []
139
+    let dataSoure = {
140
+      '411102': {quyuName: '源汇区', zb: 40},
141
+      '411103': {quyuName: '郾城区', zb: 60},
142
+      '411104': {quyuName: '召陵区', zb: 40},
143
+      '411121': {quyuName: '舞阳县', zb: 50},
144
+      '411122': {quyuName: '临颍县', zb: 30}}
145
+    for (const key in dataSoure) {
146
+      if (key !== '411100') {
147
+        arr.push({
148
+          name: dataSoure[key].quyuName,
149
+          value: Number(dataSoure[key].zb),
150
+        });
151
+      }
152
+    }
153
+    let mapMax = Math.max(...arr.map(item => item.value))
154
+    let mapMin = Math.min(...arr.map(item => item.value))
155
+    console.log(mapMin, '111')
156
+    console.log(mapMax, '222')
157
+    let chart = echarts.init(document.getElementById("map"));
158
+    echarts.registerMap("luohe", geoJson);
159
+    this.option.series[0].data = arr;
160
+    this.option.visualMap.min = mapMin;
161
+    this.option.visualMap.max = mapMax;
162
+    chart.setOption(this.option);
163
+    this.dqIndex = -1;
164
+    this.setIntervalMap(chart);
165
+    //鼠标移入静止播放
166
+    chart.on("mouseover", (e) => {
167
+      clearInterval(this.timer);
168
+      chart.dispatchAction({
169
+        type: "showTip",
170
+        seriesIndex: 0,
171
+        dataIndex: e.dataIndex,
172
+      });
173
+    });
174
+    chart.on("mouseout", (e) => {
175
+      clearInterval(this.timer);
176
+      //鼠标移出后先把上次的高亮取消
177
+      chart.dispatchAction({
178
+        type: "downplay",
179
+        seriesIndex: 0,
180
+        dataIndex: e.dataIndex,
181
+      });
182
+      this.setIntervalMap(chart);
183
+    });
184
+  },
185
+};
186
+</script>
187
+
188
+<style>
189
+.el-input__inner{
190
+  color:#eee;
191
+  border-color: #212121;
192
+  background-color: rgba(1, 28, 82, 0.8);
193
+}
194
+</style>
195
+<style lang="less" scoped>
196
+.middle-map {
197
+  width: 100%;
198
+  height: 100%;
199
+  .bottom {
200
+    height: 90%;
201
+    width: 100%;
202
+  }
203
+  /deep/.map-tooltip {
204
+    font-size: 18px;
205
+    padding: 10px 20px;
206
+    background: url("../../../../static/img/u231.png");
207
+    background-size: 100% 100%;
208
+    .map-tooltip-name {
209
+      color: #00e4ff;
210
+    }
211
+    .map-tooltip-value {
212
+      color: white;
213
+      margin-left: 20px;
214
+    }
215
+  }
216
+}
217
+</style>

+ 138 - 0
src/pages/index/components/service_publish.vue

@@ -0,0 +1,138 @@
1
+<template>
2
+  <div class="body-wrapper">
3
+    <div>
4
+      <h2 style="color: white;margin-bottom: 20px;display: inline-block;width: 90%">服务发布列表</h2>
5
+      <el-button>配置服务</el-button>
6
+    </div>
7
+    <el-table :data="tableData" style="background: #2a2a2a;border-color: #333;">
8
+      <el-table-column v-for="(item, index) in columns" :key="index" :label="item.label" :prop="item.key">
9
+      </el-table-column>
10
+    </el-table>
11
+    <div class="table-pagination">
12
+      <el-pagination :background="false" layout="total, prev, pager, next" :total="total" @current-change="handlePageChange"
13
+                     :current-page.sync="pageNum" :page-size.sync="pageSize">
14
+      </el-pagination>
15
+    </div>
16
+  </div>
17
+</template>
18
+<script>
19
+import api from "@/api/audit.js";
20
+
21
+export default {
22
+  components: {},
23
+  data() {
24
+    return {
25
+      columns: [
26
+        {
27
+          label: '接口名称',
28
+          key: 'interfaceName'
29
+        },
30
+        {
31
+          label: '接口地址',
32
+          key: 'interfaceAddress'
33
+        },
34
+        {
35
+          label: '提交状态',
36
+          key: 'submitState'
37
+        },
38
+        {
39
+          label: '发布状态',
40
+          key: 'publicState'
41
+        }
42
+      ],
43
+      tableData: [{"interfaceName":'消息通知',"interfaceAddress":'http://39.106.16.100/notification',"submitState":'已提交',"publicState":' 未发布'}
44
+        ,{"interfaceName":'预警提醒',"interfaceAddress":'http://39.106.16.100/warning',"submitState":'已提交',"publicState":' 未发布'},
45
+        ,{"interfaceName":'剩余车位推送',"interfaceAddress":'http://39.106.16.100/seatpush',"submitState":'已提交',"publicState":' 已发布'},],
46
+      total: 3,
47
+      pageSize: 10,
48
+      pageNum: 1,
49
+      radio: '2',
50
+      dialogVisible: false,
51
+      selRow: {},
52
+      searchWords: undefined
53
+    }
54
+  },
55
+  mounted() {
56
+    this.getTableData()
57
+  },
58
+  watch: {
59
+  },
60
+  methods: {
61
+    handlePageChange() {
62
+      this.getTableData()
63
+    },
64
+    handleAudit(row) {
65
+      this.selRow = row
66
+      this.dialogVisible = true
67
+    },
68
+    handleCancelApply(row) {
69
+      console.log('enter handle cancel apply')
70
+    },
71
+    handleConfirm() {
72
+      const {id} = this.selRow
73
+      console.log('radio', this.radio)
74
+      api.applyResource({id, applyType: this.radio}).then(res => {
75
+        if(res.success) {
76
+          this.dialogVisible = false
77
+          this.$message({
78
+            message: '审核成功!',
79
+            type: 'success'
80
+          })
81
+          this.getTableData()
82
+        }
83
+      })
84
+    },
85
+    getTableData() {
86
+      const {pageNum, pageSize, searchWords} = this
87
+      api.applyList({pageNum, pageSize, resourceName: searchWords}).then(res => {
88
+        this.tableData = []
89
+        res.data.records.map((item, index) => {
90
+          const newItem = {...item}
91
+          newItem.applyTypeText = this.getApplyTypeText(item.applyType)
92
+          this.tableData.push(newItem)
93
+        })
94
+        this.total = res.data.total
95
+      })
96
+    },
97
+    getApplyTypeText(val) {
98
+      if (!val){
99
+        return '未申请'
100
+      }
101
+      const textMap = {
102
+        1: '待审批',
103
+        2: '审批通过',
104
+        3: '审批驳回'
105
+      }
106
+      return textMap[val]
107
+    },
108
+    handleSearch() {
109
+      this.pageNum = 1
110
+      this.getTableData()
111
+    }
112
+  }
113
+}
114
+</script>
115
+<style  lang="scss" scoped>
116
+.body-wrapper {
117
+  padding: 20px;
118
+  background: #0c0c0c;
119
+  /deep/ .el-button {
120
+    background-color: #0158d9;
121
+    color: honeydew;
122
+    border: none;
123
+    width: 100px;
124
+    height: 40px;
125
+  }
126
+  .table-pagination{
127
+    text-align: right;
128
+  }
129
+}
130
+.audit-dialog{
131
+  .mg-bt{
132
+    margin-bottom: 24px;
133
+  }
134
+  .label{
135
+    text-align: right;
136
+  }
137
+}
138
+</style>

+ 11 - 1
src/pages/index/layouts/indexLayout.vue

@@ -38,7 +38,7 @@ export default {
38 38
       menu: [
39 39
         {name: 'demo1', url: '/demo1'},
40 40
         {name: 'demo2', url: '/demo2'},
41
-        {name: 'bmap', url: '/bmap'},
41
+        {name: '车辆迁徒分析', url: '/bmap'},
42 42
         {name: 'hot_map', url: '/hot_map'},
43 43
         {name: 'heat_map', url: '/heat_map'},
44 44
         {name: '静态资源', url: '/static_resource'},
@@ -67,6 +67,16 @@ export default {
67 67
         {name: '区域停车主题', url: '/parking_area'},
68 68
         {name: '设备运营主题', url: '/service_operations'},
69 69
         {name: '操作日志', url: '/operation_log'},
70
+        {name: '停车饱和预警', url: '/saturation_warning'},
71
+        {name: '停车缺口分析', url: '/gap_analysis'},
72
+        {name: '停车难易指数', url: '/park_easy'},
73
+        {name: '全局停车诱导', url: '/park_guidance'},
74
+        {name: '区域停车发展分析', url: '/park_development_analysis'},
75
+        {name: '路内泊位设置推荐', url: '/berth_recommend'},
76
+        {name: '停车盲点挖招', url: '/blind_spot_digging'},
77
+        {name: '服务发布功能', url: '/service_publish'},
78
+        {name: '公告功能', url: '/announcement_function'},
79
+        {name: '消息中心功能', url: '/message'},
70 80
       ]
71 81
     }
72 82
   },

+ 50 - 0
src/router/index.js

@@ -174,6 +174,56 @@ export default new Router({
174 174
           path: "/operation_log",
175 175
           component: () => import("../pages/index/components/operation_log.vue")
176 176
         },
177
+        {
178
+          name: "saturation_warning",
179
+          path: "/saturation_warning",
180
+          component: () => import("../pages/index/components/saturation_warning.vue")
181
+        },
182
+        {
183
+          name: "gap_analysis",
184
+          path: "/gap_analysis",
185
+          component: () => import("../pages/index/components/gap_analysis.vue")
186
+        },
187
+        {
188
+          name: "park_easy",
189
+          path: "/park_easy",
190
+          component: () => import("../pages/index/components/park_easy.vue")
191
+        },
192
+        {
193
+          name: "park_guidance",
194
+          path: "/park_guidance",
195
+          component: () => import("../pages/index/components/park_guidance.vue")
196
+        },
197
+        {
198
+          name: "park_development_analysis",
199
+          path: "/park_development_analysis",
200
+          component: () => import("../pages/index/components/park_development_analysis.vue")
201
+        },
202
+        {
203
+          name: "berth_recommend",
204
+          path: "/berth_recommend",
205
+          component: () => import("../pages/index/components/berth_recommend.vue")
206
+        },
207
+        {
208
+          name: "blind_spot_digging",
209
+          path: "/blind_spot_digging",
210
+          component: () => import("../pages/index/components/blind_spot_digging.vue")
211
+        },
212
+        {
213
+          name: "service_publish",
214
+          path: "/service_publish",
215
+          component: () => import("../pages/index/components/service_publish.vue")
216
+        },
217
+        {
218
+          name: "announcement_function",
219
+          path: "/announcement_function",
220
+          component: () => import("../pages/index/components/announcement_function.vue")
221
+        },
222
+        {
223
+          name: "message",
224
+          path: "/message",
225
+          component: () => import("../pages/index/components/message.vue")
226
+        },
177 227
       ]
178 228
     }
179 229
   ]