diff --git a/assets/peakCoalImages/coommon/long-seconfary-title-bg.png b/assets/peakCoalImages/common/long-seconfary-title-bg.png
similarity index 100%
rename from assets/peakCoalImages/coommon/long-seconfary-title-bg.png
rename to assets/peakCoalImages/common/long-seconfary-title-bg.png
diff --git a/assets/peakCoalImages/coommon/no-data.png b/assets/peakCoalImages/common/no-data.png
similarity index 100%
rename from assets/peakCoalImages/coommon/no-data.png
rename to assets/peakCoalImages/common/no-data.png
diff --git a/assets/peakCoalImages/coommon/small-seconfary-title-bg.png b/assets/peakCoalImages/common/small-seconfary-title-bg.png
similarity index 100%
rename from assets/peakCoalImages/coommon/small-seconfary-title-bg.png
rename to assets/peakCoalImages/common/small-seconfary-title-bg.png
diff --git a/assets/peakCoalImages/common/third-level-label-icon.png b/assets/peakCoalImages/common/third-level-label-icon.png
new file mode 100644
index 0000000..3e196a0
Binary files /dev/null and b/assets/peakCoalImages/common/third-level-label-icon.png differ
diff --git a/assets/peakCoalImages/left/pollutant-type-active-bg.png b/assets/peakCoalImages/left/pollutant-type-active-bg.png
new file mode 100644
index 0000000..5a4ac78
Binary files /dev/null and b/assets/peakCoalImages/left/pollutant-type-active-bg.png differ
diff --git a/assets/peakCoalImages/left/pollutant-type-default-bg.png b/assets/peakCoalImages/left/pollutant-type-default-bg.png
new file mode 100644
index 0000000..e87000a
Binary files /dev/null and b/assets/peakCoalImages/left/pollutant-type-default-bg.png differ
diff --git a/assets/peakCoalImages/right/warning-type-pie-bg.png b/assets/peakCoalImages/right/warning-type-pie-bg.png
new file mode 100644
index 0000000..155501e
Binary files /dev/null and b/assets/peakCoalImages/right/warning-type-pie-bg.png differ
diff --git a/components/AirQuality.vue b/components/AirQuality.vue
index e3b0834..e2a394d 100644
--- a/components/AirQuality.vue
+++ b/components/AirQuality.vue
@@ -10,17 +10,99 @@
           90%
         
       
-      
+
+      
     
   
 
 
 
 
@@ -87,7 +120,7 @@ export default {
 
 .latest-warning {
   margin-top: 43px;
-  height: 984px;
+  height: 784px;
   width: 100%;
   background-image: linear-gradient(62deg, rgba(8, 31, 55, 0.10) 0%, rgba(18, 50, 81, 0.10) 100%);
   /*  border: 1px solid transparent; !* 先将边框颜色设置为透明 *!
@@ -103,6 +136,7 @@ export default {
     .warning-data-list {
       height: 100%;
       padding-top: 20px;
+
       .seamless-scroll {
         height: 100%;
         overflow: hidden;
@@ -113,5 +147,34 @@ export default {
       }
     }
   }
+
+  .right-tab {
+    height: 100%;
+    .flex-row;
+    justify-content: space-between;
+    width: 580px;
+
+    .tab-type {
+      width: 144px;
+      height: 59px;
+      background: url("assets/peakCoalImages/left/pollutant-type-default-bg.png") no-repeat;
+      font-family: MicrosoftYaHei;
+      font-size: 29.97px;
+      color: rgba(216, 240, 255, 0.50);
+      letter-spacing: 0;
+      text-align: center;
+      line-height: 59px;
+      text-shadow: 0 0 11px #0091FF;
+      font-weight: 400;
+      cursor: pointer;
+    }
+
+    .active-tab {
+      background: url("assets/peakCoalImages/left/pollutant-type-active-bg.png") no-repeat;
+      color: #D8F0FF;
+      text-shadow: 0 0 33px #0091FF;
+      font-weight: 400;
+    }
+  }
 }
 
diff --git a/components/OverviewPollutants.vue b/components/OverviewPollutants.vue
index fd80723..df50417 100644
--- a/components/OverviewPollutants.vue
+++ b/components/OverviewPollutants.vue
@@ -16,16 +16,27 @@
           
         
       
+
+      
     
   
 
 
 
 
 
diff --git a/components/SecondaryTitle.vue b/components/SecondaryTitle.vue
index 4fec2f7..40b080c 100644
--- a/components/SecondaryTitle.vue
+++ b/components/SecondaryTitle.vue
@@ -30,14 +30,14 @@ export default {
 .secondary-title {
   width: 100%;
   height: 84px;
-  background: url("assets/peakCoalImages/coommon/small-seconfary-title-bg.png") no-repeat;
+  background: url("assets/peakCoalImages/common/small-seconfary-title-bg.png") no-repeat;
   background-size: 100% 100%;
   .clear-fix;
 
   &.longBg {
     width: 100%;
     height: 84px;
-    background: url("assets/peakCoalImages/coommon/long-seconfary-title-bg.png") no-repeat;
+    background: url("assets/peakCoalImages/common/long-seconfary-title-bg.png") no-repeat;
     background-size: 100% 100%;
   }
 
@@ -64,7 +64,7 @@ export default {
 .longBg {
   width: 100%;
   height: 84px;
-  background: url("assets/peakCoalImages/coommon/long-seconfary-title-bg.png") no-repeat;
+  background: url("assets/peakCoalImages/common/long-seconfary-title-bg.png") no-repeat;
   background-size: 100% 100%;
 }*/
 
diff --git a/components/ThirdLevelLabel.vue b/components/ThirdLevelLabel.vue
new file mode 100644
index 0000000..32321be
--- /dev/null
+++ b/components/ThirdLevelLabel.vue
@@ -0,0 +1,72 @@
+
+
+  
+
+
+
+
+
diff --git a/components/WarningInfoItem.vue b/components/WarningInfoItem.vue
index a7b8563..9779435 100644
--- a/components/WarningInfoItem.vue
+++ b/components/WarningInfoItem.vue
@@ -23,7 +23,7 @@
 
 
 
+
+
diff --git a/components/charts/COTrendCharts.vue b/components/charts/COTrendCharts.vue
new file mode 100644
index 0000000..6392021
--- /dev/null
+++ b/components/charts/COTrendCharts.vue
@@ -0,0 +1,200 @@
+
+
+  
+
+  
+
+
+
+
+
diff --git a/components/charts/ElectricityWaterCharts.vue b/components/charts/ElectricityWaterCharts.vue
new file mode 100644
index 0000000..841e01a
--- /dev/null
+++ b/components/charts/ElectricityWaterCharts.vue
@@ -0,0 +1,210 @@
+
+
+  
+
+  
+
+
+
+
+
diff --git a/components/charts/PollutantTrendCharts.vue b/components/charts/PollutantTrendCharts.vue
new file mode 100644
index 0000000..81d8fab
--- /dev/null
+++ b/components/charts/PollutantTrendCharts.vue
@@ -0,0 +1,196 @@
+
+
+  
+
+  
+
+
+
+
+
diff --git a/components/charts/ProduceTrendChart.vue b/components/charts/ProduceTrendChart.vue
new file mode 100644
index 0000000..0a092bf
--- /dev/null
+++ b/components/charts/ProduceTrendChart.vue
@@ -0,0 +1,219 @@
+
+
+  
+
+  
+
+
+
+
+
diff --git a/components/charts/WarningTypeChart.vue b/components/charts/WarningTypeChart.vue
new file mode 100644
index 0000000..5402a39
--- /dev/null
+++ b/components/charts/WarningTypeChart.vue
@@ -0,0 +1,180 @@
+
+
+  
+
+  
+
+
+
+
+
diff --git a/package.json b/package.json
index 43684c8..09d611b 100644
--- a/package.json
+++ b/package.json
@@ -20,7 +20,8 @@
     "vue-echarts": "^4.1.0",
     "vue-seamless-scroll": "^1.1.23",
     "vue-server-renderer": "^2.7.10",
-    "vue-template-compiler": "^2.7.10"
+    "vue-template-compiler": "^2.7.10",
+    "lodash": "^4.17.21"
   },
   "devDependencies": {
     "less": "^4.2.0",
diff --git a/pages/visual/PeakCoalView.vue b/pages/visual/PeakCoalView.vue
index de7306f..3a81c95 100644
--- a/pages/visual/PeakCoalView.vue
+++ b/pages/visual/PeakCoalView.vue
@@ -106,7 +106,6 @@ export default {
       const innerHeight = window.innerHeight
       const widthScale = innerWidth / baseWidth
       const scaleHeight = baseHeight * widthScale
-      console.log('scaleHeight:', scaleHeight)
       if (scaleHeight <= innerHeight) {
         origin = 'left top'
         scale = widthScale
diff --git a/utils/esresize.js b/utils/esresize.js
new file mode 100644
index 0000000..2588208
--- /dev/null
+++ b/utils/esresize.js
@@ -0,0 +1,105 @@
+let EleResize = {
+    _handleResize: function (e) {
+        let ele = e.target || e.srcElement
+        let trigger = ele.__resizeTrigger__
+        if (trigger) {
+            let handlers = trigger.__z_resizeListeners
+            if (handlers) {
+                let size = handlers.length
+                for (let i = 0; i < size; i++) {
+                    let h = handlers[i]
+                    let handler = h.handler
+                    let context = h.context
+                    handler.apply(context, [e])
+                }
+            }
+        }
+    },
+    _removeHandler: function (ele, handler, context) {
+        let handlers = ele.__z_resizeListeners
+        if (handlers) {
+            let size = handlers.length
+            for (let i = 0; i < size; i++) {
+                let h = handlers[i]
+                if (h.handler === handler && h.context === context) {
+                    handlers.splice(i, 1)
+                    return
+                }
+            }
+        }
+    },
+    _createResizeTrigger: function (ele) {
+        let obj = document.createElement('object')
+        obj.setAttribute('style',
+            'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden;opacity: 0; pointer-events: none; z-index: -1;')
+        obj.onload = EleResize._handleObjectLoad
+        obj.type = 'text/html'
+        ele.appendChild(obj)
+        obj.data = 'about:blank'
+        return obj
+    },
+    _handleObjectLoad: function (evt) {
+        this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__
+        this.contentDocument.defaultView.addEventListener('resize', EleResize._handleResize)
+    }
+}
+if (document.attachEvent) { // ie9-10
+    EleResize.on = function (ele, handler, context) {
+        let handlers = ele.__z_resizeListeners
+        if (!handlers) {
+            handlers = []
+            ele.__z_resizeListeners = handlers
+            ele.__resizeTrigger__ = ele
+            ele.attachEvent('onresize', EleResize._handleResize)
+        }
+        handlers.push({
+            handler: handler,
+            context: context
+        })
+    }
+    EleResize.off = function (ele, handler, context) {
+        let handlers = ele.__z_resizeListeners
+        if (handlers) {
+            EleResize._removeHandler(ele, handler, context)
+            if (handlers.length === 0) {
+                ele.detachEvent('onresize', EleResize._handleResize)
+                delete ele.__z_resizeListeners
+            }
+        }
+    }
+} else {
+    EleResize.on = function (ele, handler, context) {
+        let handlers = ele.__z_resizeListeners
+        if (!handlers) {
+            handlers = []
+            ele.__z_resizeListeners = handlers
+
+            if (getComputedStyle(ele, null).position === 'static') {
+                ele.style.position = 'relative'
+            }
+            let obj = EleResize._createResizeTrigger(ele)
+            ele.__resizeTrigger__ = obj
+            obj.__resizeElement__ = ele
+        }
+        handlers.push({
+            handler: handler,
+            context: context
+        })
+    }
+    EleResize.off = function (ele, handler, context) {
+        let handlers = ele.__z_resizeListeners
+        if (handlers) {
+            EleResize._removeHandler(ele, handler, context)
+            if (handlers.length === 0) {
+                let trigger = ele.__resizeTrigger__
+                if (trigger) {
+                    trigger.contentDocument.defaultView.removeEventListener('resize', EleResize._handleResize)
+                    ele.removeChild(trigger)
+                    delete ele.__resizeTrigger__
+                }
+                delete ele.__z_resizeListeners
+            }
+        }
+    }
+}
+export {EleResize}