From f74222e571d9164a59e01194f35ff1e34f10a423 Mon Sep 17 00:00:00 2001
From: quanyawei <401863037@qq.com>
Date: Fri, 15 Dec 2023 17:12:33 +0800
Subject: [PATCH] fix:热力图播放

---
 src/views/hotMap/components/img/icon-pause.png                    |    0 
 src/views/toCarryOutLegislativeReforms/components/locationMap.vue |  119 +++
 src/views/hotMap/components/colorList.json                        |    0 
 package-lock.json                                                 |  555 ++++++++++++++
 public/index.html                                                 |  125 +-
 src/views/hotMap/index.vue                                        |  445 ++++++++++++
 .vscode/settings.json                                             |    4 
 src/views/hotMap/components/img/round.png                         |    0 
 src/router/dynamicRouter.js                                       |   12 
 src/views/toCarryOutLegislativeReforms/reform/index.vue           |   26 
 src/assets/images/pointMap.png                                    |    0 
 src/views/hotMap/components/timeLinePlay.vue                      |  347 +++++++++
 .eslintrc.js                                                      |   60 -
 src/main.js                                                       |   88 +-
 src/components/Cascader/regionCity.vue                            |   35 
 package.json                                                      |    7 
 src/views/hotMap/components/formatdate.js                         |  127 +++
 cmsdist/index.html                                                |    4 
 src/views/hotMap/components/img/icon-play.png                     |    0 
 src/views/hotMap/components/selectHour.vue                        |  102 ++
 20 files changed, 1,874 insertions(+), 182 deletions(-)

diff --git a/.eslintrc.js b/.eslintrc.js
index 853e4dd..752d712 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -3,7 +3,7 @@
     browser: true,
     es2021: true
   },
-  extends: ['eslint:recommended', 'standard'],
+  extends: ['standard', 'plugin:vue/recommended'],
   overrides: [
     {
       env: {
@@ -16,48 +16,28 @@
     }
   ],
   parserOptions: {
-    ecmaVersion: '12',
-    sourceType: 'module'
+    ecmaVersion: 2021,
+    sourceType: 'module',
+    parser: 'babel-eslint',
+    ecmaFeatures: {
+      // ��� react ������������ jsx ������������,��������� true
+      jsx: false
+    }
+  },
+  globals: {
+    AMap: true,
+    AMapUI: true
   },
   plugins: ['vue'],
   rules: {
-    eqeqeq: ['error', 'always'], // ���������������������������
-    semi: 2, // ���������������������������������
-    'no-use-before-define': [1, 'nofunc'], // ������������������������
-    'max-lines': ['error', { max: 2000, skipBlankLines: true }],
-    'no-mixed-spaces-and-tabs': 'warn', // ���������������������tab������������
-    'newline-per-chained-call': ['error', { ignoreChainWithDepth: 1 }], // promise ������ ���������������������������������������
-    'vue/attribute-hyphenation': ['error', 'always'], // prop������������������������������������������������������������������������������������prop���������������������������������������
-    'vue/html-indent': [
-      'warn',
-      2,
-      {
-        attribute: 1,
-        baseIndent: 1,
-        closeBracket: 0,
-        alignAttributesVertically: true
-      }
-    ],
-    curly: 2, // ������������ if(){} ������{}
-    'vue/prop-name-casing': ['warn', 'camelCase'], //������������������������
-    'vue/this-in-template': ['error', 'never'], //������������template������������this
-    'no-trailing-spaces': 1, //���������������������������������
-    'vue/max-attributes-per-line': [
-      // template���������������������������prop������,������3������������3���������������������������prop���������������������
-      'warn',
-      {
-        singleline: 3,
-        multiline: {
-          max: 1,
-          allowFirstLine: false
-        }
-      }
-    ],
-    'no-catch-shadow': 'error', //������catch������������������������������������������
-    'vue/v-bind-style': ['error', 'shorthand'], // ������������:���������
-    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', // ���������������������������������debugger
     'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
-    'no-unused-vars': 0, // ���������������������������������
-    'spaced-comment': 0 // ������������������ // ��� /* ���������������������
+    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+    camelcase: 'off',
+    'comma-dangle': 'off',
+    '@typescript-eslint/no-explicit-any': 'off',
+    '@typescript-eslint/camelcase': 'off',
+    '@typescript-eslint/no-empty-function': 'off',
+    'lines-between-class-members': 'off',
+    '@typescript-eslint/no-this-alias': 'off'
   }
 }
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 59d224c..022f2c6 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -4,7 +4,7 @@
   // --------------------  ������eslint  --------------------
   //autoFixedOnSave ���������������������������������������������������(>1.41.0)������
   "editor.codeActionsOnSave": {
-    "source.fixAll.eslint": true
+    "source.fixAll.eslint": "explicit"
   },
   "eslint.format.enable": true,
   //autoFix������������������������������������������������
@@ -38,7 +38,7 @@
   // --------------------  vetur ������  --------------------
   // vue������������������������������vetur
   "[vue]": {
-    "editor.defaultFormatter": "octref.vetur"
+    "editor.defaultFormatter": "dbaeumer.vscode-eslint"
   },
   // ���������������������������������
   "vetur.format.defaultFormatter.html": "js-beautify-html",
diff --git a/cmsdist/index.html b/cmsdist/index.html
index 195d728..e56cb39 100644
--- a/cmsdist/index.html
+++ b/cmsdist/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><link rel=icon href=/LOGO.ico><script src="https://webapi.amap.com/maps?v=1.4.15&key=be57d4add7dc10fb7f7924763a2179ae&plugin=AMap.MarkerClusterer"></script><script src="https://webapi.amap.com/loca?v=1.3.2&key=be57d4add7dc10fb7f7924763a2179ae&plugin=AMap.MarkerClusterer"></script><script src="http://api.map.baidu.com/api?type=webgl&v=2.0&ak=U2SoSp52BoVW6bAEMsxQ7Zfe0tuB6VDp"></script><script src="http://api.map.baidu.com/api?v=3.0&ak=U2SoSp52BoVW6bAEMsxQ7Zfe0tuB6VDp"></script><script src=https://mapv.baidu.com/build/mapv.min.js></script><script src=https://mapv.baidu.com/gl/examples/static/common.js></script><script src="https://cdn.jsdelivr.net/npm/echarts/map/js/china.js?v=1598903772045"></script><script src=https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.97/dist/mapvgl.min.js></script><title>������������������������</title><style>body {
+<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><link rel=icon href=/LOGO.ico><script src="https://webapi.amap.com/maps?v=1.4.15&key=c4e73f2c6972766d6a54dffd2f501cac&plugin=AMap.MarkerClusterer"></script><script src="https://webapi.amap.com/loca?v=1.3.2&key=be57d4add7dc10fb7f7924763a2179ae&plugin=AMap.MarkerClusterer"></script><script src="http://api.map.baidu.com/api?type=webgl&v=2.0&ak=U2SoSp52BoVW6bAEMsxQ7Zfe0tuB6VDp"></script><script src="http://api.map.baidu.com/api?v=3.0&ak=U2SoSp52BoVW6bAEMsxQ7Zfe0tuB6VDp"></script><script src=https://mapv.baidu.com/build/mapv.min.js></script><script src=https://mapv.baidu.com/gl/examples/static/common.js></script><script src="https://cdn.jsdelivr.net/npm/echarts/map/js/china.js?v=1598903772045"></script><script src=https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.97/dist/mapvgl.min.js></script><title>������������������������</title><style>body {
       margin: 0px;
       padding: 0px;
       height: 100%;
@@ -16,4 +16,4 @@
       docEl.style.fontSize = docEl.clientWidth / 100 + 'px';
     };
   window.addEventListener(resizeEvt, recalc, false);
-  document.addEventListener('DOMContentLoaded', recalc, false);</script></html>
\ No newline at end of file
+  document.addEventListener('DOMContentLoaded', recalc, false);</script></html>
diff --git a/package-lock.json b/package-lock.json
index 39b2c00..fef7c7d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1013,6 +1013,26 @@
         "to-fast-properties": "^2.0.0"
       }
     },
+    "@eslint-community/eslint-utils": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+      "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+      "requires": {
+        "eslint-visitor-keys": "^3.3.0"
+      },
+      "dependencies": {
+        "eslint-visitor-keys": {
+          "version": "3.4.3",
+          "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+          "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="
+        }
+      }
+    },
+    "@eslint-community/regexpp": {
+      "version": "4.10.0",
+      "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
+      "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA=="
+    },
     "@eslint/eslintrc": {
       "version": "0.4.3",
       "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
@@ -1310,11 +1330,36 @@
         }
       }
     },
+    "@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "requires": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "dependencies": {
+        "@nodelib/fs.stat": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+          "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="
+        }
+      }
+    },
     "@nodelib/fs.stat": {
       "version": "1.1.3",
       "resolved": "https://registry.npm.taobao.org/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz?cache=0&sync_timestamp=1609074523193&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40nodelib%2Ffs.stat%2Fdownload%2F%40nodelib%2Ffs.stat-1.1.3.tgz",
       "integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=",
       "dev": true
+    },
+    "@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "requires": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      }
     },
     "@pawelgalazka/cli": {
       "version": "2.0.3",
@@ -1449,6 +1494,11 @@
       "integrity": "sha1-FZJUFOCtLNdlv+9YhC9+JqesyyQ=",
       "dev": true
     },
+    "@types/semver": {
+      "version": "7.5.6",
+      "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.5.6.tgz",
+      "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A=="
+    },
     "@types/stack-utils": {
       "version": "1.0.1",
       "resolved": "https://registry.npm.taobao.org/@types/stack-utils/download/@types/stack-utils-1.0.1.tgz",
@@ -1481,6 +1531,331 @@
       "resolved": "https://registry.npm.taobao.org/@types/yargs-parser/download/@types/yargs-parser-20.2.0.tgz",
       "integrity": "sha1-3T5mmboyN/A0jNCF5GmHgCBIQvk=",
       "dev": true
+    },
+    "@typescript-eslint/eslint-plugin": {
+      "version": "6.13.2",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.2.tgz",
+      "integrity": "sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==",
+      "requires": {
+        "@eslint-community/regexpp": "^4.5.1",
+        "@typescript-eslint/scope-manager": "6.13.2",
+        "@typescript-eslint/type-utils": "6.13.2",
+        "@typescript-eslint/utils": "6.13.2",
+        "@typescript-eslint/visitor-keys": "6.13.2",
+        "debug": "^4.3.4",
+        "graphemer": "^1.4.0",
+        "ignore": "^5.2.4",
+        "natural-compare": "^1.4.0",
+        "semver": "^7.5.4",
+        "ts-api-utils": "^1.0.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.3.4",
+          "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
+          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "ignore": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.0.tgz",
+          "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg=="
+        },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "semver": {
+          "version": "7.5.4",
+          "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz",
+          "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        }
+      }
+    },
+    "@typescript-eslint/parser": {
+      "version": "6.13.2",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-6.13.2.tgz",
+      "integrity": "sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/scope-manager": "6.13.2",
+        "@typescript-eslint/types": "6.13.2",
+        "@typescript-eslint/typescript-estree": "6.13.2",
+        "@typescript-eslint/visitor-keys": "6.13.2",
+        "debug": "^4.3.4"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.3.4",
+          "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
+          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+          "dev": true,
+          "requires": {
+            "ms": "2.1.2"
+          }
+        }
+      }
+    },
+    "@typescript-eslint/scope-manager": {
+      "version": "6.13.2",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz",
+      "integrity": "sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==",
+      "requires": {
+        "@typescript-eslint/types": "6.13.2",
+        "@typescript-eslint/visitor-keys": "6.13.2"
+      }
+    },
+    "@typescript-eslint/type-utils": {
+      "version": "6.13.2",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-6.13.2.tgz",
+      "integrity": "sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==",
+      "requires": {
+        "@typescript-eslint/typescript-estree": "6.13.2",
+        "@typescript-eslint/utils": "6.13.2",
+        "debug": "^4.3.4",
+        "ts-api-utils": "^1.0.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.3.4",
+          "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
+          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        }
+      }
+    },
+    "@typescript-eslint/types": {
+      "version": "6.13.2",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-6.13.2.tgz",
+      "integrity": "sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg=="
+    },
+    "@typescript-eslint/typescript-estree": {
+      "version": "6.13.2",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz",
+      "integrity": "sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==",
+      "requires": {
+        "@typescript-eslint/types": "6.13.2",
+        "@typescript-eslint/visitor-keys": "6.13.2",
+        "debug": "^4.3.4",
+        "globby": "^11.1.0",
+        "is-glob": "^4.0.3",
+        "semver": "^7.5.4",
+        "ts-api-utils": "^1.0.1"
+      },
+      "dependencies": {
+        "@nodelib/fs.stat": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+          "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="
+        },
+        "array-union": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz",
+          "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "debug": {
+          "version": "4.3.4",
+          "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
+          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "dir-glob": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz",
+          "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+          "requires": {
+            "path-type": "^4.0.0"
+          }
+        },
+        "fast-glob": {
+          "version": "3.3.2",
+          "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz",
+          "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+          "requires": {
+            "@nodelib/fs.stat": "^2.0.2",
+            "@nodelib/fs.walk": "^1.2.3",
+            "glob-parent": "^5.1.2",
+            "merge2": "^1.3.0",
+            "micromatch": "^4.0.4"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "globby": {
+          "version": "11.1.0",
+          "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz",
+          "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+          "requires": {
+            "array-union": "^2.1.0",
+            "dir-glob": "^3.0.1",
+            "fast-glob": "^3.2.9",
+            "ignore": "^5.2.0",
+            "merge2": "^1.4.1",
+            "slash": "^3.0.0"
+          }
+        },
+        "ignore": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.0.tgz",
+          "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg=="
+        },
+        "is-glob": {
+          "version": "4.0.3",
+          "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+          "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+          "requires": {
+            "is-extglob": "^2.1.1"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+        },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "micromatch": {
+          "version": "4.0.5",
+          "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz",
+          "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+          "requires": {
+            "braces": "^3.0.2",
+            "picomatch": "^2.3.1"
+          }
+        },
+        "path-type": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz",
+          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+        },
+        "picomatch": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+          "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
+        },
+        "semver": {
+          "version": "7.5.4",
+          "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz",
+          "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        }
+      }
+    },
+    "@typescript-eslint/utils": {
+      "version": "6.13.2",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-6.13.2.tgz",
+      "integrity": "sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==",
+      "requires": {
+        "@eslint-community/eslint-utils": "^4.4.0",
+        "@types/json-schema": "^7.0.12",
+        "@types/semver": "^7.5.0",
+        "@typescript-eslint/scope-manager": "6.13.2",
+        "@typescript-eslint/types": "6.13.2",
+        "@typescript-eslint/typescript-estree": "6.13.2",
+        "semver": "^7.5.4"
+      },
+      "dependencies": {
+        "@types/json-schema": {
+          "version": "7.0.15",
+          "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz",
+          "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="
+        },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "semver": {
+          "version": "7.5.4",
+          "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz",
+          "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        }
+      }
+    },
+    "@typescript-eslint/visitor-keys": {
+      "version": "6.13.2",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz",
+      "integrity": "sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==",
+      "requires": {
+        "@typescript-eslint/types": "6.13.2",
+        "eslint-visitor-keys": "^3.4.1"
+      },
+      "dependencies": {
+        "eslint-visitor-keys": {
+          "version": "3.4.3",
+          "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+          "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="
+        }
+      }
     },
     "@vue/babel-helper-vue-jsx-merge-props": {
       "version": "1.2.1",
@@ -1721,6 +2096,23 @@
           "optional": true,
           "requires": {
             "vue-eslint-parser": "^2.0.3"
+          },
+          "dependencies": {
+            "vue-eslint-parser": {
+              "version": "2.0.3",
+              "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz",
+              "integrity": "sha512-ZezcU71Owm84xVF6gfurBQUGg8WQ+WZGxgDEQu1IHFBZNx7BFZg3L1yHxrCBNNwbwFtE1GuvfJKMtb6Xuwc/Bw==",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "debug": "^3.1.0",
+                "eslint-scope": "^3.7.1",
+                "eslint-visitor-keys": "^1.0.0",
+                "espree": "^3.5.2",
+                "esquery": "^1.0.0",
+                "lodash": "^4.17.4"
+              }
+            }
           }
         },
         "eslint-scope": {
@@ -3797,8 +4189,8 @@
     },
     "babel-eslint": {
       "version": "10.0.1",
-      "resolved": "https://registry.npm.taobao.org/babel-eslint/download/babel-eslint-10.0.1.tgz",
-      "integrity": "sha1-kZaB3AmWFM19MdRciQhpUJKh+u0=",
+      "resolved": "https://registry.npmmirror.com/babel-eslint/-/babel-eslint-10.0.1.tgz",
+      "integrity": "sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.0.0",
@@ -3811,8 +4203,8 @@
       "dependencies": {
         "eslint-scope": {
           "version": "3.7.1",
-          "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-3.7.1.tgz?cache=0&sync_timestamp=1600070417656&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-scope%2Fdownload%2Feslint-scope-3.7.1.tgz",
-          "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
+          "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-3.7.1.tgz",
+          "integrity": "sha512-ivpbtpUgg9SJS4TLjK7KdcDhqc/E3CGItsvQbBNLkNGUeMhd5qnJcryba/brESS+dg3vrLqPuc/UcS7jRJdN5A==",
           "dev": true,
           "requires": {
             "esrecurse": "^4.1.0",
@@ -6102,6 +6494,11 @@
         }
       }
     },
+    "dayjs": {
+      "version": "1.11.10",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.10.tgz",
+      "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
+    },
     "de-indent": {
       "version": "1.0.2",
       "resolved": "https://registry.npm.taobao.org/de-indent/download/de-indent-1.0.2.tgz",
@@ -7965,7 +8362,6 @@
       "version": "1.4.0",
       "resolved": "https://registry.npm.taobao.org/esquery/download/esquery-1.4.0.tgz?cache=0&sync_timestamp=1612565616129&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesquery%2Fdownload%2Fesquery-1.4.0.tgz",
       "integrity": "sha1-IUj/w4uC6McFff7UhCWz5h8PJKU=",
-      "dev": true,
       "requires": {
         "estraverse": "^5.1.0"
       },
@@ -7973,8 +8369,7 @@
         "estraverse": {
           "version": "5.2.0",
           "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-5.2.0.tgz?cache=0&sync_timestamp=1596642941915&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-5.2.0.tgz",
-          "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=",
-          "dev": true
+          "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA="
         }
       }
     },
@@ -8448,6 +8843,14 @@
       "resolved": "https://registry.npm.taobao.org/fastparse/download/fastparse-1.1.2.tgz",
       "integrity": "sha1-kXKMWllC7O2FMSg8eUQe5BIsNak=",
       "dev": true
+    },
+    "fastq": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz",
+      "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+      "requires": {
+        "reusify": "^1.0.4"
+      }
     },
     "faye-websocket": {
       "version": "0.11.3",
@@ -9196,7 +9599,6 @@
       "version": "5.1.2",
       "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.2.tgz",
       "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=",
-      "dev": true,
       "requires": {
         "is-glob": "^4.0.1"
       }
@@ -9309,6 +9711,11 @@
       "version": "4.2.6",
       "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.6.tgz",
       "integrity": "sha1-/wQLKwhTsjw9MQJ1I3BvGIXXa+4="
+    },
+    "graphemer": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz",
+      "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="
     },
     "growly": {
       "version": "1.3.0",
@@ -10386,8 +10793,7 @@
     "is-extglob": {
       "version": "2.1.1",
       "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "dev": true
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
     },
     "is-finite": {
       "version": "1.1.0",
@@ -10409,7 +10815,6 @@
       "version": "4.0.1",
       "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz",
       "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=",
-      "dev": true,
       "requires": {
         "is-extglob": "^2.1.1"
       }
@@ -12731,8 +13136,7 @@
     "merge2": {
       "version": "1.4.1",
       "resolved": "https://registry.npm.taobao.org/merge2/download/merge2-1.4.1.tgz",
-      "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=",
-      "dev": true
+      "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4="
     },
     "methods": {
       "version": "1.1.2",
@@ -13031,8 +13435,7 @@
     "natural-compare": {
       "version": "1.4.0",
       "resolved": "https://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz",
-      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
-      "dev": true
+      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
     },
     "needle": {
       "version": "2.9.0",
@@ -17251,6 +17654,11 @@
         "inherits": "~2.0.3"
       }
     },
+    "queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
+    },
     "randomatic": {
       "version": "3.1.1",
       "resolved": "https://registry.npm.taobao.org/randomatic/download/randomatic-3.1.1.tgz",
@@ -17744,6 +18152,11 @@
       "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
       "dev": true
     },
+    "reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
+    },
     "rgb-regex": {
       "version": "1.0.1",
       "resolved": "https://registry.npm.taobao.org/rgb-regex/download/rgb-regex-1.0.1.tgz",
@@ -17786,6 +18199,14 @@
       "integrity": "sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU=",
       "dev": true,
       "optional": true
+    },
+    "run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "requires": {
+        "queue-microtask": "^1.2.2"
+      }
     },
     "run-queue": {
       "version": "1.0.3",
@@ -20280,6 +20701,11 @@
       "integrity": "sha1-8shUBoALmw90yfdGW4HqrSQSUvg=",
       "dev": true
     },
+    "ts-api-utils": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
+      "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg=="
+    },
     "tsconfig": {
       "version": "7.0.0",
       "resolved": "https://registry.npm.taobao.org/tsconfig/download/tsconfig-7.0.0.tgz",
@@ -20854,30 +21280,86 @@
       }
     },
     "vue-eslint-parser": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npm.taobao.org/vue-eslint-parser/download/vue-eslint-parser-2.0.3.tgz?cache=0&sync_timestamp=1614679548045&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-eslint-parser%2Fdownload%2Fvue-eslint-parser-2.0.3.tgz",
-      "integrity": "sha1-wmjJbG2Uz+PZOKX3WTlZsMozYNE=",
-      "dev": true,
-      "optional": true,
+      "version": "9.3.2",
+      "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz",
+      "integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==",
       "requires": {
-        "debug": "^3.1.0",
-        "eslint-scope": "^3.7.1",
-        "eslint-visitor-keys": "^1.0.0",
-        "espree": "^3.5.2",
-        "esquery": "^1.0.0",
-        "lodash": "^4.17.4"
+        "debug": "^4.3.4",
+        "eslint-scope": "^7.1.1",
+        "eslint-visitor-keys": "^3.3.0",
+        "espree": "^9.3.1",
+        "esquery": "^1.4.0",
+        "lodash": "^4.17.21",
+        "semver": "^7.3.6"
       },
       "dependencies": {
-        "eslint-scope": {
-          "version": "3.7.3",
-          "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-3.7.3.tgz?cache=0&sync_timestamp=1600070417656&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-scope%2Fdownload%2Feslint-scope-3.7.3.tgz",
-          "integrity": "sha1-u1ByANPRf2AkdjYWC0gmKEsQhTU=",
-          "dev": true,
-          "optional": true,
+        "acorn": {
+          "version": "8.11.2",
+          "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.11.2.tgz",
+          "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w=="
+        },
+        "acorn-jsx": {
+          "version": "5.3.2",
+          "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+          "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="
+        },
+        "debug": {
+          "version": "4.3.4",
+          "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
+          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
           "requires": {
-            "esrecurse": "^4.1.0",
-            "estraverse": "^4.1.1"
+            "ms": "2.1.2"
           }
+        },
+        "eslint-scope": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz",
+          "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+          "requires": {
+            "esrecurse": "^4.3.0",
+            "estraverse": "^5.2.0"
+          }
+        },
+        "eslint-visitor-keys": {
+          "version": "3.4.3",
+          "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+          "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="
+        },
+        "espree": {
+          "version": "9.6.1",
+          "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz",
+          "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+          "requires": {
+            "acorn": "^8.9.0",
+            "acorn-jsx": "^5.3.2",
+            "eslint-visitor-keys": "^3.4.1"
+          }
+        },
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
+        },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "semver": {
+          "version": "7.5.4",
+          "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz",
+          "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
         }
       }
     },
@@ -21033,6 +21515,11 @@
       "integrity": "sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU=",
       "dev": true
     },
+    "vue-time-slider": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/vue-time-slider/-/vue-time-slider-1.0.5.tgz",
+      "integrity": "sha512-ApKBsxbLyFWqZWriYeTdTXKS6qkxNO/dJ1j9MvWGbYx5sX+Sq+4GrrQ5n/r04Kun1uHyLWi7DyB1bf+btzfpbA=="
+    },
     "vuex": {
       "version": "3.1.0",
       "resolved": "https://registry.npm.taobao.org/vuex/download/vuex-3.1.0.tgz?cache=0&sync_timestamp=1612277384353&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvuex%2Fdownload%2Fvuex-3.1.0.tgz",
diff --git a/package.json b/package.json
index 656292a..34f39b3 100644
--- a/package.json
+++ b/package.json
@@ -16,10 +16,12 @@
     "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml"
   },
   "dependencies": {
+    "@typescript-eslint/eslint-plugin": "^6.13.2",
     "angular-expressions": "^1.1.5",
     "axios": "0.18.0",
     "clipboard": "^2.0.10",
     "crypto-js": "^4.0.0",
+    "dayjs": "^1.11.10",
     "docxtemplater": "^3.32.4",
     "docxtemplater-image-module-free": "^1.1.1",
     "echarts": "^5.2.2",
@@ -52,10 +54,12 @@
     "vue-amap": "^0.5.10",
     "vue-amp": "^0.0.1",
     "vue-baidu-map": "^0.21.22",
+    "vue-eslint-parser": "^9.3.2",
     "vue-json-excel": "^0.3.0",
     "vue-mapvgl": "^0.0.32",
     "vue-router": "3.0.6",
     "vue-seamless-scroll": "^1.1.23",
+    "vue-time-slider": "^1.0.5",
     "vuex": "3.1.0",
     "xlsx": "^0.16.9",
     "xlsx-style": "^0.8.13"
@@ -65,6 +69,7 @@
     "@babel/eslint-parser": "^7.16.5",
     "@babel/plugin-proposal-optional-chaining": "^7.21.0",
     "@babel/register": "7.0.0",
+    "@typescript-eslint/parser": "^6.13.2",
     "@vue/cli-plugin-babel": "3.6.0",
     "@vue/cli-plugin-eslint": "3.6.0",
     "@vue/cli-plugin-unit-jest": "3.6.3",
@@ -72,7 +77,7 @@
     "@vue/test-utils": "1.0.0-beta.29",
     "autoprefixer": "^9.5.1",
     "babel-core": "7.0.0-bridge.0",
-    "babel-eslint": "10.0.1",
+    "babel-eslint": "^10.0.1",
     "babel-jest": "23.6.0",
     "chalk": "2.4.2",
     "connect": "3.6.6",
diff --git a/public/index.html b/public/index.html
index 6215bc1..427dccd 100644
--- a/public/index.html
+++ b/public/index.html
@@ -1,64 +1,71 @@
-<!DOCTYPE html>
+<!doctype html>
 <html>
-<head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
-  <link rel="icon" href="<%= BASE_URL %>LOGO.ico">
-  <!-- <script src="https://webapi.amap.com/maps?v=1.4.15&key=be57d4add7dc10fb7f7924763a2179ae&plugin=AMap.MarkerClusterer"></script> -->
-  <!-- <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" /> -->
-  <script
-    src="https://webapi.amap.com/maps?v=1.4.15&key=be57d4add7dc10fb7f7924763a2179ae&plugin=AMap.MarkerClusterer"></script>
-  <script
-    src="https://webapi.amap.com/loca?v=1.3.2&key=be57d4add7dc10fb7f7924763a2179ae&plugin=AMap.MarkerClusterer"></script>
-  <!--    <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />-->
-  <!--    <script src="https://cdn.bootcss.com/jquery/3.5.0/jquery.js"></script>-->
-  <script type="text/javascript"
-    src="https://api.map.baidu.com/api?type=webgl&v=2.0&ak=U2SoSp52BoVW6bAEMsxQ7Zfe0tuB6VDp"></script>
-  <script src="https://api.map.baidu.com/api?v=3.0&ak=U2SoSp52BoVW6bAEMsxQ7Zfe0tuB6VDp"></script>
-  <script src="https://mapv.baidu.com/build/mapv.min.js"></script>
-  <script type="text/javascript" src="https://mapv.baidu.com/gl/examples/static/common.js"></script>
-  <!-- <script src="https://cdn.jsdelivr.net/npm/echarts/map/js/china.js?v=1598903772045"></script> -->
-  <script src="https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.97/dist/mapvgl.min.js"></script>
-  <!-- <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> -->
-  <!-- <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/require.js/2.3.6/require.min.js"></script> -->
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+    <meta
+      name="viewport"
+      content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
+    />
+    <link rel="icon" href="<%= BASE_URL %>LOGO.ico" />
+    <!-- <script src="https://webapi.amap.com/maps?v=1.4.15&key=be57d4add7dc10fb7f7924763a2179ae&plugin=AMap.MarkerClusterer"></script> -->
+    <!-- <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" /> -->
+    <script>
+      window._AMapSecurityConfig = {
+        securityJsCode: '20fcbbc1782d2853f433831e61fab769'
+      }
+    </script>
+    <script src="https://webapi.amap.com/maps?v=1.4.15&key=c4e73f2c6972766d6a54dffd2f501cac&plugin=AMap.MarkerClusterer"></script>
+    <script src="https://webapi.amap.com/loca?v=1.3.2&key=c4e73f2c6972766d6a54dffd2f501cac&plugin=AMap.MarkerClusterer"></script>
+    <!--    <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />-->
+    <!--    <script src="https://cdn.bootcss.com/jquery/3.5.0/jquery.js"></script>-->
+    <script
+      type="text/javascript"
+      src="https://api.map.baidu.com/api?type=webgl&v=2.0&ak=U2SoSp52BoVW6bAEMsxQ7Zfe0tuB6VDp"
+    ></script>
+    <script src="https://api.map.baidu.com/api?v=3.0&ak=U2SoSp52BoVW6bAEMsxQ7Zfe0tuB6VDp"></script>
+    <script src="https://mapv.baidu.com/build/mapv.min.js"></script>
+    <script
+      type="text/javascript"
+      src="https://mapv.baidu.com/gl/examples/static/common.js"
+    ></script>
+    <!-- <script src="https://cdn.jsdelivr.net/npm/echarts/map/js/china.js?v=1598903772045"></script> -->
+    <script src="https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.97/dist/mapvgl.min.js"></script>
+    <!-- <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> -->
+    <!-- <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/require.js/2.3.6/require.min.js"></script> -->
 
-  <title>
-    <%= webpackConfig.name %>
-  </title>
-  <style>
-    body {
-      margin: 0px;
-      padding: 0px;
-      height: 100%;
-    }
+    <title><%= webpackConfig.name %></title>
+    <style>
+      body {
+        margin: 0px;
+        padding: 0px;
+        height: 100%;
+      }
 
-    html {
-      overflow-y: hidden;
-    }
-  </style>
-</head>
+      html {
+        overflow-y: hidden;
+      }
+    </style>
+  </head>
 
-<body>
-  <noscript>
-    <strong>
-      <%= webpackConfig.name %> ������������javaScript������
-    </strong>
-  </noscript>
-  <div id="app"></div>
-</body>
-<script>
-  var docEl = document.documentElement,
-    //���������������������������������������������������������������������������������������������������
-    //���������������������������������orientationChange������������������������������resize ���������
-    //���������������������������������������������������������������������������������������������������
-    resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
-    recalc = function () {
-      //���������������������1:50���������375������������������������������������������������������������
-      docEl.style.fontSize = docEl.clientWidth / 100 + 'px';
-    };
-  window.addEventListener(resizeEvt, recalc, false);
-  document.addEventListener('DOMContentLoaded', recalc, false);
-</script>
-
+  <body>
+    <noscript>
+      <strong> <%= webpackConfig.name %> ������������javaScript������ </strong>
+    </noscript>
+    <div id="app"></div>
+  </body>
+  <script>
+    var docEl = document.documentElement,
+      //���������������������������������������������������������������������������������������������������
+      //���������������������������������orientationChange������������������������������resize ���������
+      //���������������������������������������������������������������������������������������������������
+      resizeEvt =
+        'orientationchange' in window ? 'orientationchange' : 'resize',
+      recalc = function () {
+        //���������������������1:50���������375������������������������������������������������������������
+        docEl.style.fontSize = docEl.clientWidth / 100 + 'px'
+      }
+    window.addEventListener(resizeEvt, recalc, false)
+    document.addEventListener('DOMContentLoaded', recalc, false)
+  </script>
 </html>
diff --git a/src/assets/images/pointMap.png b/src/assets/images/pointMap.png
new file mode 100644
index 0000000..805bb56
--- /dev/null
+++ b/src/assets/images/pointMap.png
Binary files differ
diff --git a/src/components/Cascader/regionCity.vue b/src/components/Cascader/regionCity.vue
index 2b39be2..93bc792 100644
--- a/src/components/Cascader/regionCity.vue
+++ b/src/components/Cascader/regionCity.vue
@@ -1,18 +1,27 @@
 <template>
   <div>
     <el-cascader
+      ref="myCascader"
       v-model="newRegion"
       placeholder="���������/���"
       :options="options"
+      :size="selectSize"
       clearable
       style="flex:1"
+      @change="getvalue"
     />
   </div>
 </template>
 
 <script>
 export default {
-  data() {
+  props: {
+    selectSize: {
+      type: String,
+      default: 'medium '
+    },
+  },
+  data () {
     return {
       form: {
         name: '',
@@ -25,15 +34,17 @@
         desc: ''
       },
       options: [],
-      newRegion: []
+      newRegion: [],
+      form1: {}
     }
   },
   watch: {
-    newRegion(n, o) {
+    newRegion (n, o) {
+      console.log(n, o)
       this.$emit('regionCode', n[this.newRegion.length - 1])
     }
   },
-  created() {
+  created () {
     const runAsync = new Promise((resolve, reject) => {
       this.$request({
         url: '/organization/getMapPath',
@@ -68,7 +79,22 @@
     runAsync.then(() => {
       this.newRegion = [Number(this.$store.state.regionCode.toString().substr(0, 2) + '0000'),
         Number(this.$store.state.regionCode.toString().substr(0, 4) + '00')]
+      this.$nextTick(() => {
+        this.getvalue()
+      })
     })
+  },
+  methods: {
+    getvalue () {
+      if (this.newRegion.length > 0) { // ������������������������������change������������������������������������������������������������������������������
+        const { label: org, value: orgid } =
+          this.$refs.myCascader.getCheckedNodes()[0]
+        this.form1 = { org, orgid }
+      } else {
+        this.form1 = {}
+      }
+      this.$emit('regionForm', this.form1)
+    },
   }
 }
 </script>
@@ -78,4 +104,3 @@
   text-align: center;
 }
 </style>
-
diff --git a/src/main.js b/src/main.js
index db2981c..d4f3b30 100644
--- a/src/main.js
+++ b/src/main.js
@@ -20,31 +20,15 @@
 import '@/permission' // permission control
 // clipboard������������������������������������������������JS������
 import clipboard from 'clipboard'
-// ���������vue���������
-Vue.prototype.$clipboard = clipboard
 
 // ������������
 import AMap from 'vue-amap'
-Vue.use(AMap)
-AMap.initAMapApiLoader({
-  key: 'be57d4add7dc10fb7f7924763a2179ae',
-  plugin: ['AMap.moveAnimation', 'AMap.Autocomplete', 'AMap.PlaceSearch', 'AMap.Scale',
-    'AMap.OverView', 'AMap.ToolBar', 'AMap.MapType', 'AMap.PolyEditor', 'AMap.CircleEditor',
-    'AMap.DistrictSearch'],
-  // ������������ sdk ��������� 1.4.4
-  v: '1.4.4'
-})
-
-Vue.prototype.$AMap = AMap
 // crypto������
 import { Encrypt } from '@/utils/AES.js'
 
 import { getToken } from '@/utils/auth'
 
 import request from '@/utils/request'
-
-Vue.prototype.$request = request.service
-Vue.prototype.$axiosRequest = request.reqServe
 // Vue.prototype.$postRequest=request.reqServe1
 /**
  * If you don't want to use mock-server
@@ -55,11 +39,40 @@
  * please remove it before going online! ! !
  */
 import { mockXHR } from '../mock'
+
+import echarts from 'echarts'
+
+import JsonExcel from 'vue-json-excel'
+// ���������vue���������
+Vue.prototype.$clipboard = clipboard
+Vue.use(AMap)
+AMap.initAMapApiLoader({
+  key: 'c4e73f2c6972766d6a54dffd2f501cac',
+  plugin: [
+    'AMap.moveAnimation',
+    'AMap.Autocomplete',
+    'AMap.PlaceSearch',
+    'AMap.Scale',
+    'AMap.OverView',
+    'AMap.ToolBar',
+    'AMap.MapType',
+    'AMap.PolyEditor',
+    'AMap.CircleEditor',
+    'AMap.DistrictSearch'
+  ],
+  // ������������ sdk ��������� 1.4.4
+  v: '1.4.4'
+})
+window._AMapSecurityConfig = {
+  securityJsCode: '20fcbbc1782d2853f433831e61fab769'
+}
+Vue.prototype.$AMap = AMap
+
+Vue.prototype.$request = request.service
+Vue.prototype.$axiosRequest = request.reqServe
 if (process.env.NODE_ENV === 'production') {
   mockXHR()
 }
-
-import echarts from 'echarts'
 
 Vue.prototype.$Cookies = Cookies
 
@@ -72,25 +85,26 @@
 Vue.config.productionTip = false
 Vue.prototype.$axios = axios
 Vue.prototype.$Bus = Bus
-
-import JsonExcel from 'vue-json-excel'
-Vue.component('downloadExcel', JsonExcel)
+Vue.component('DownloadExcel', JsonExcel)
 
 function getServerConfig() {
   return new Promise((resolve, reject) => {
-    axios.get('/serverConfig.json').then((result) => {
-      //   console.log(result) // ������������������������
-      const config = result.data
-      for (const key in config) {
-        Vue.prototype[key] = config[key]
-      }
-      // ������������������������������������Vue���
-      // console.log(Vue.prototype.BASE_ADDR)
-      resolve()
-    }).catch((error) => {
-      console.log(error)
-      reject()
-    })
+    axios
+      .get('/serverConfig.json')
+      .then(result => {
+        //   console.log(result) // ������������������������
+        const config = result.data
+        for (const key in config) {
+          Vue.prototype[key] = config[key]
+        }
+        // ������������������������������������Vue���
+        // console.log(Vue.prototype.BASE_ADDR)
+        resolve()
+      })
+      .catch(error => {
+        console.log(error)
+        reject()
+      })
   })
 }
 
@@ -118,11 +132,13 @@
   for (const k in opt) {
     ret = new RegExp('(' + k + ')').exec(fmt)
     if (ret) {
-      fmt = fmt.replace(ret[1], (ret[1].length === 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, '0')))
+      fmt = fmt.replace(
+        ret[1],
+        ret[1].length === 1 ? opt[k] : opt[k].padStart(ret[1].length, '0')
+      )
     }
   }
   return fmt
 }
-
 
 init()
diff --git a/src/router/dynamicRouter.js b/src/router/dynamicRouter.js
index 5358aeb..b84d58a 100644
--- a/src/router/dynamicRouter.js
+++ b/src/router/dynamicRouter.js
@@ -79,6 +79,12 @@
   component: () => import('@/views/airPollutionCalendar/index'),
   meta: { title: '������������������������', icon: 'example' }
 }
+const heatMap = {
+  path: 'charts/heatMap',
+  name: 'heatMap',
+  component: () => import('@/views/hotMap/index'),
+  meta: { title: '���������������', icon: 'example' }
+}
 
 // const PM5PM10ForecastChart = {
 //   path: 'charts/PM5PM10ForecastChart',
@@ -200,7 +206,8 @@
 const summaryPage = {
   path: 'toCarryOutLegislativeReforms/summaryPage',
   name: 'summaryPage',
-  component: () => import('@/views/toCarryOutLegislativeReforms/summaryPage/index'),
+  component: () =>
+    import('@/views/toCarryOutLegislativeReforms/summaryPage/index'),
   meta: { title: '������������', icon: 'example' }
 }
 const reform = {
@@ -232,6 +239,7 @@
   heatmap: heatmap,
   hexagon: hexagon,
   airPollutionCalendar: airPollutionCalendar,
+  heatMap: heatMap,
   averageContrast: averageContrast,
   industryContributionRate,
   regionalContributionRate,
@@ -263,7 +271,7 @@
 export function routerMenus() {
   const routersMenu = JSON.parse(store.state.user.menus)
   // ��������������������������������� ���������������������������
-  console.log('routersMenu',routersMenu)
+  console.log('routersMenu', routersMenu)
   const currentRoutes = router.options.routes
   if (routersMenu.length > 0) {
     routersMenu.forEach(item => {
diff --git a/src/views/hotMap/components/colorList.json b/src/views/hotMap/components/colorList.json
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/views/hotMap/components/colorList.json
diff --git a/src/views/hotMap/components/formatdate.js b/src/views/hotMap/components/formatdate.js
new file mode 100644
index 0000000..a647d01
--- /dev/null
+++ b/src/views/hotMap/components/formatdate.js
@@ -0,0 +1,127 @@
+/**
+ * @name: ���������������
+ * @msg: ��� Date ��������������� Date ������������������������ String
+ * ���(M)������(d)���12������(h)���24������(H)������(m)������(s)������(E)���������(q) ��������� 1-2 ������������
+ * ���(y)��������� 1-4 ���������������������(S)��������� 1 ������������(��� 1-3 ������������)
+ * eg:
+ * dateFormat(new Date(), "yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
+ * dateFormat(new Date(), "yyyy-MM-dd E HH:mm:ss") ==> 2009-03-10 ��� 20:09:04
+ * dateFormat(new Date(), "yyyy-MM-dd EE hh:mm:ss") ==> 2009-03-10 ������ 08:09:04
+ * dateFormat(new Date(), "yyyy-MM-dd EEE hh:mm:ss") ==> 2009-03-10 ��������� 08:09:04
+ * dateFormat(new Date(), "yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
+ *
+ * @param {*} date
+ * @param {*} format
+ * @return {*}
+ */
+export function dateFormat(date, format) {
+  let iDate = null
+  if (typeof date === 'number') {
+    iDate = new Date(date)
+  } else if (typeof date === 'string') {
+    date = date.replace(/-/g, '/')
+    if (date.indexOf('T') > -1) {
+      const dotIndex = date.indexOf('.')
+      date = date.substr(0, dotIndex)
+      date = date.replace('T', ' ')
+      date = new Date(date).getTime()
+    }
+
+    if (!isNaN(Number(date))) {
+      date = Number(date)
+    }
+
+    iDate = new Date(date)
+  } else if (date instanceof Date) {
+    iDate = date
+  } else {
+    return false
+  }
+
+  // ������
+  // let timestamp = iDate.getTime()/1000 - 8 * 60 * 60;
+  // iDate = new Date(timestamp*1000);
+
+  const o = {
+    'M+': iDate.getMonth() + 1, // ������
+    'd+': iDate.getDate(), // ���
+    'h+': iDate.getHours() % 24 === 0 ? '00' : iDate.getHours() % 24, // ������
+    'H+': iDate.getHours(), // ������
+    'm+': iDate.getMinutes(), // ���
+    's+': iDate.getSeconds(), // ���
+    'q+': Math.floor((iDate.getMonth() + 3) / 3), // ������
+    S: iDate.getMilliseconds() // ������
+  }
+
+  if (!format) {
+    format = 'yyyy-MM-dd hh:mm:ss'
+  }
+  const week = {
+    0: '\u65e5',
+    1: '\u4e00',
+    2: '\u4e8c',
+    3: '\u4e09',
+    4: '\u56db',
+    5: '\u4e94',
+    6: '\u516d'
+  }
+  if (/(y+)/.test(format)) {
+    format = format.replace(
+      RegExp.$1,
+      (iDate.getFullYear() + '').substr(4 - RegExp.$1.length)
+    )
+  }
+  if (/(E+)/.test(format)) {
+    format = format.replace(
+      RegExp.$1,
+      (RegExp.$1.length > 1
+        ? RegExp.$1.length > 2
+          ? '\u661f\u671f'
+          : '\u5468'
+        : '') + week[iDate.getDay() + '']
+    )
+  }
+  for (const k in o) {
+    if (new RegExp('(' + k + ')').test(format)) {
+      format = format.replace(
+        RegExp.$1,
+        RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
+      )
+    }
+  }
+
+  return format
+}
+
+/**
+ * @name: ������������������������������
+ * @param {*} count ������
+ * @param {*} type ���������������������������before������������������
+ */
+export function getDays(count, type) {
+  const list = []
+  if (type && type === 'before') {
+    for (let i = 0; i < count; i++) {
+      list.unshift(
+        dateFormat(
+          new Date(
+            new Date().setDate(new Date().getDate() - i)
+          ).toLocaleDateString(),
+          'MM-dd'
+        )
+      )
+    }
+  } else {
+    for (let i = 0; i < count; i++) {
+      list.push(
+        dateFormat(
+          new Date(
+            new Date().setDate(new Date().getDate() + i)
+          ).toLocaleDateString(),
+          'MM-dd'
+        )
+      )
+    }
+  }
+  return list
+}
diff --git a/src/views/hotMap/components/img/icon-pause.png b/src/views/hotMap/components/img/icon-pause.png
new file mode 100644
index 0000000..831d4c2
--- /dev/null
+++ b/src/views/hotMap/components/img/icon-pause.png
Binary files differ
diff --git a/src/views/hotMap/components/img/icon-play.png b/src/views/hotMap/components/img/icon-play.png
new file mode 100644
index 0000000..a2ef607
--- /dev/null
+++ b/src/views/hotMap/components/img/icon-play.png
Binary files differ
diff --git a/src/views/hotMap/components/img/round.png b/src/views/hotMap/components/img/round.png
new file mode 100644
index 0000000..8ebbab3
--- /dev/null
+++ b/src/views/hotMap/components/img/round.png
Binary files differ
diff --git a/src/views/hotMap/components/selectHour.vue b/src/views/hotMap/components/selectHour.vue
new file mode 100644
index 0000000..13839ff
--- /dev/null
+++ b/src/views/hotMap/components/selectHour.vue
@@ -0,0 +1,102 @@
+<template>
+  <el-date-picker
+    ref="timeBox"
+    :key="dataType"
+    v-model="value1"
+    class="box"
+    size="small"
+    :type="dataType"
+    range-separator="���"
+    :start-placeholder="startPlaceholderData"
+    :end-placeholder="endPlaceholderData"
+    popper-class="tpc"
+    :format="format"
+    :append-to-body="true"
+    :default-value="new Date()"
+    :value-format="valueFormat"
+    :picker-options="pickerOptions"
+  />
+</template>
+
+<script>
+// ���������������������������������������������������������js������������������js���json������������������������������
+// ���������import������������������from'������������������';
+
+export default {
+// import ���������������������������������������������������
+  components: {},
+  props: {
+    dataType: {
+      type: String,
+      default: 'datetimerange'
+    },
+  },
+  data () {
+    // ������������������
+    return {
+      newValue1: [],
+      value1: [],
+      format: 'yyyy-MM-dd HH',
+      valueFormat: 'yyyy-MM-dd HH',
+      startPlaceholderData: '������������������',
+      endPlaceholderData: '������������������',
+      pickerOptions: {
+        disabledDate: (time) => {
+          return time.getTime() > new Date()
+        },
+      },
+    }
+  },
+  // ������������ ���������data������
+  computed: {},
+  // ������data������������������
+  watch: {
+    value1 (nv, ov) {
+      console.log(nv, ov)
+      this.newValue1 = nv
+      this.sendPicker()
+    },
+    dataType (nv, ov) {
+      this.value1 = []
+      if (nv === 'datetimerange') {
+        this.startPlaceholderData = '������������������'
+        this.endPlaceholderData = '������������������'
+        this.format = 'yyyy-MM-dd HH'
+        this.valueFormat = 'yyyy-MM-dd HH'
+      } else if (nv === 'daterange') {
+        this.startPlaceholderData = '������������'
+        this.endPlaceholderData = '������������'
+        this.format = 'yyyy-MM-dd'
+        this.valueFormat = 'yyyy-MM-dd'
+      } else if (nv === 'monthrange') {
+        this.format = 'yyyy-MM'
+        this.valueFormat = 'yyyy-MM'
+        this.startPlaceholderData = '������������'
+        this.endPlaceholderData = '������������'
+      }
+    }
+  },
+  // ������������ - ��������������������������������� this ���������
+  created () {
+    // this.currentHour()
+  },
+  methods: {
+    sendPicker () {
+      this.$emit('selectHourData', this.newValue1)
+    }
+  } // ���������������keep-alive������������������������������������
+}
+</script>
+<style  lang="scss">
+ /* ������������ ������������ */
+  .box .el-range-separator{
+    width: 20px !important;
+  }
+  /* ������������ ��������� */
+  .tpc .el-time-spinner__wrapper {
+    width:100% !important;
+  }
+  .tpc .el-scrollbar:nth-of-type(2) {
+    display: none !important;
+  }
+</style>
diff --git a/src/views/hotMap/components/timeLinePlay.vue b/src/views/hotMap/components/timeLinePlay.vue
new file mode 100644
index 0000000..d9c0622
--- /dev/null
+++ b/src/views/hotMap/components/timeLinePlay.vue
@@ -0,0 +1,347 @@
+<template>
+  <div class="timeLineBox">
+    <div class="iconePlay">
+      <i
+        class="menu-icon"
+        :class="{'icon-play': !playing, 'icon-pause': playing}"
+        @click="togglePlay"
+      />
+    </div>
+    <div class="dayDataList">
+      <div class="oneDayData">
+        <div
+          v-for="item in dataFormList"
+          :key="item.id"
+          class="oneDataBox"
+          :class="{'minWdth': dateType==='hour'}"
+        >
+          <div
+            class="lineBox"
+            :class="{'borLeft': dateType!=='hour','activeBg': (activeIndex > item.id )&&(dateType!=='hour')}"
+            @click="changeActiveIndex(item.id,item)"
+          >
+            <!-- ������ -->
+            <div
+              v-if="dateType==='hour'"
+              class="hourData"
+            >
+              <el-tooltip
+                v-for="val in item.hourListTime"
+                :key="val.value"
+                transition=""
+                :open-delay="450"
+                popper-class="tooltip-style"
+                effect="dark"
+                :content="val.name"
+                :disabled="val.isShow"
+                placement="top"
+              >
+                <div
+                  class="oneHourData"
+                  :class="{'cursorNot': val.isShow}"
+                  @click.stop="changeActiveIndex(val.id,val)"
+                >
+                  <div
+                    class="hourLineBox"
+                    :class="{'activeBg': activeIndex > val.id,'activeIhShow': val.isShow}"
+                  />
+                  <div v-if="((parseInt(val.name, 10) % 3)===0)&&val.name!=='9999'">
+                    {{ val.name }}
+                  </div>
+                </div>
+              </el-tooltip>
+            </div>
+          </div>
+          <div
+            class="dataFont"
+            :class="{'mgTop': dateType==='hour'}"
+          >
+            {{ item.name }}
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+// ���������������������������������������������������������js������������������js���json������������������������������
+// ���������import������������������from'������������������';
+import _ from 'lodash'
+export default {
+// import ���������������������������������������������������
+  components: {},
+  props: {
+    options: {
+      type: Object,
+      default () {
+        return {}
+      }
+    },
+    dateTimes: {
+      type: Array,
+      default () {
+        return []
+      }
+    },
+    // ���������������
+    dateType: {
+      type: String,
+      default () {
+        return ''
+      }
+    }
+  },
+  data () {
+    // ������������������
+    return {
+      intervalTimer: null, // ���������
+      playing: false,
+      activeIndex: 0,
+      activeItem: {},
+      timeLineData: [ // ������������
+        {
+          id: 0,
+          name: '2019-01-01',
+          index: 1,
+          hourList: [
+            {
+              name: '00:00',
+              value: 0,
+              isShow: false
+            }
+          ]
+        },
+
+      ],
+    }
+  },
+  // ������������ ���������data������
+  computed: {
+    dataFormList () {
+      let dataList = _.cloneDeep(this.dateTimes)
+      let hourListTime = dataList[dataList.length - 1].hourListTime
+      if (hourListTime.length < 24 && this.dateType === 'hour') {
+        const newArr = hourListTime.concat(Array(24 - hourListTime.length).fill({
+          id: 9999,
+          name: '9999',
+          isShow: true
+        }))
+        console.log('newArr', newArr)
+        dataList[dataList.length - 1].hourListTime = newArr
+      }
+      return dataList
+    }
+  },
+  // ������data������������������
+  watch: {
+    dateTimes: {
+      handler (newVal, oldVal) {
+        this.activeIndex = 0
+        this.playing = false
+        console.log('newVal', newVal)
+      },
+      deep: true
+    },
+
+    playing () {
+      if (this.playing) {
+        console.log('������������', this.dataFormList)
+        console.log('this.activeIndex', this.activeIndex)
+        clearInterval(this.intervalTimer)
+        if (this.dateType === 'hour' && this.activeIndex === this.dataFormList[0].idLength) {
+          this.activeIndex = 1
+        } else if (this.dateType !== 'hour' && this.activeIndex === this.dataFormList.length) {
+          this.activeIndex = 1
+        } else {
+          this.activeIndex = (this.activeIndex + 1)
+        }
+        this.intervalTimer = setInterval(() => {
+          if (this.dateType === 'hour' && this.activeIndex === this.dataFormList[0].idLength) {
+            // this.activeIndex = 1
+            this.playing = false
+          } else if (this.dateType !== 'hour' && this.activeIndex === this.dataFormList.length) {
+            // this.activeIndex = 1
+            this.playing = false
+          } else {
+            this.activeIndex = (this.activeIndex + 1)
+          }
+          console.log('this.activeIndex', this.activeIndex)
+        }, this.options.speed * 1000)
+      } else {
+        console.log('������������')
+        if (this.intervalTimer) {
+          clearInterval(this.intervalTimer)
+          this.intervalTimer = null
+        }
+      }
+    },
+    activeIndex () {
+      let activeItem = {}
+      if ((this.activeIndex > this.dataFormList.length) && this.dateType !== 'hour') {
+        this.playing = false
+        this.activeIndex = this.dataFormList.length
+      } else if (this.activeIndex > this.dataFormList[0].idLength && this.dateType === 'hour') {
+        this.playing = false
+        this.activeIndex = this.dataFormList[0].idLength
+      }
+
+      if (this.dateType === 'hour') {
+        this.dataFormList.forEach(element => {
+          element.hourListTime.forEach(item => {
+            if (item.id === (this.activeIndex - 1)) {
+              activeItem = {
+                id: item.id,
+                name: `${element.name} ${item.name}`,
+              }
+            }
+          })
+        })
+      } else {
+        activeItem = this.dataFormList[this.activeIndex - 1]
+      }
+      console.log('activeItem', activeItem, this.activeIndex)
+      this.$emit('getDateFun', activeItem)
+    }
+  },
+  // ������������ - ��������������������������������� this ���������
+  created () {
+  },
+  methods: {
+    changeActiveIndex (data, item) {
+      if (item.isShow && this.dateType === 'hour') {
+        return
+      }
+      this.activeItem = item
+      this.activeIndex = data + 1
+      console.log('changeActiveIndex', data, item)
+      if (this.playing) {
+        this.playing = false
+      }
+    },
+    /**
+     * @name: ���������������
+     */
+    togglePlay () {
+      this.playing = !this.playing
+    },
+  } // ���������������keep-alive������������������������������������
+}
+</script>
+<style scoped  lang="scss">
+.timeLineBox{
+    background: hsla(0,0%,80%,.8);
+    width:100%;
+    box-shadow: 1px 1px 5px #666;
+    cursor: pointer;
+    padding: 10px;
+    padding-bottom: 5px;
+    padding-top: 10px;
+    display: flex;
+    align-items: center;
+    .dayDataList{
+       width: calc(100% - 60px);
+       overflow: auto;
+      .oneDayData{
+        display: flex;
+        // justify-content: space-around;
+        .oneDataBox{
+          font-size: 16px;
+          flex: 1;
+          text-align: center;
+          min-width: 100px;
+          border-left: 1px solid #fff;
+          .lineBox{
+            width: 100%;
+            height: 10px;
+            background-color: rgba(0, 0, 0, 0.3);
+            .hourData{
+              display: flex;
+              width:100%;
+              justify-content: space-around;
+              .oneHourData{
+                flex: 1;
+                text-align: center;
+                min-width: 20px;
+                .hourLineBox{
+                  width: 100%;
+                  height: 10px;
+                  // border-left: 1px solid #fff;
+                  border-right: 1px solid #fff;
+                }
+              }
+            }
+          }
+          .dataFont{
+            margin-top: 5px;
+            padding-top: 5px;
+            border-top: 1px solid #fff;
+            // border-top: 1px solid #fff;
+          }
+        }
+      }
+    }
+
+}
+.minWdth{
+  min-width: 500px!important;
+}
+.iconePlay{
+  margin-right: 10px;
+  width: 50px;
+  text-align: center;
+}
+.menu-icon {
+  font-size: 20px;
+  width: 43px;
+  height: 43px;
+  background-size: cover;
+  background-repeat: no-repeat;
+  display: inline-block;
+  &.icon-play {
+    background-image: url('./img/icon-play.png');
+  }
+
+  &.icon-pause {
+    background-image: url('./img/icon-pause.png');
+  }
+  &.menu-icon-disabled {
+    cursor: no-drop;
+    opacity: 0.5;
+  }
+}
+.textCenter{
+  text-align: center;
+}
+.activeBg{
+  background: green !important;
+}
+.activeIhShow{
+  border: none!important;
+  background: #fff !important;
+  pointer-events:none;
+}
+.mgTop{
+  margin-top: 20px!important;
+}
+.borLeft{
+  // border-left:1px solid #fff;
+}
+.cursorNot{
+  cursor: not-allowed;
+}
+</style>
+<style>
+ .tooltip-style.el-tooltip__popper {
+      background: green;
+    }
+ .tooltip-style.el-tooltip__popper.is-dark {
+      background: green;
+    }
+.tooltip-style.el-tooltip__popper[x-placement^='top'] .popper__arrow:after{
+  border-top-color:green;
+}
+.el-tooltip__popper[x-placement^='top'] .popper__arrow{
+  border-top-color:green;
+}
+</style>
diff --git a/src/views/hotMap/index.vue b/src/views/hotMap/index.vue
new file mode 100644
index 0000000..9d5c190
--- /dev/null
+++ b/src/views/hotMap/index.vue
@@ -0,0 +1,445 @@
+<template>
+  <div class="content">
+    <div class="formInBox ">
+      <el-form
+        :inline="true"
+        :model="formInline"
+      >
+        <el-form-item>
+          <el-radio-group
+            v-model="formInline.pollutant"
+            size="small"
+            @input="getPollutant"
+          >
+            <el-radio-button
+              v-for="item in sensorArr"
+              :key="item.code"
+              :label="item.name"
+            />
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item>
+          <RegionCity
+            :select-size="'small'"
+            @regionForm="regionData"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-radio-group
+            v-model="formInline.dateRadio"
+            size="small"
+          >
+            <el-radio-button label="������" />
+            <el-radio-button label="���" />
+            <el-radio-button label="���" />
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item>
+          <selectHour
+            :data-type="dataType"
+            @selectHourData="selectHourData"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button
+            type="primary"
+            size="small"
+            @click="onSubmit"
+          >
+            ������
+          </el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div id="mapd" />
+    <div class="timeLine">
+      <Main
+        v-if="dateTimes.length > 0&&formInline.city!==''"
+        :options="options"
+        :date-times="dateTimes"
+        :date-type="formInline.dayType"
+        @getDateFun="getDateFun"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+import _ from 'lodash'
+import RegionCity from '@/components/Cascader/regionCity'
+import selectHour from './components/selectHour.vue'
+import Main from './components/timeLinePlay.vue'
+export default {
+  components: { RegionCity, selectHour, Main },
+  data () {
+    return {
+      map: null,
+      heatmap: null,
+      markerClusterer: null,
+      city: '������',
+      formInline: {
+        city: '',
+        cityCode: '',
+        dayType: 'hour',
+        starTime: '',
+        endTime: '',
+        dateRadio: '������',
+        pollutant: 'PM10',
+      },
+      selectSensor: {code: 'a34002', name: 'PM10', maxNumber: 500},
+      sensorArr: [
+        { code: 'a34002', name: 'PM10', maxNumber: 500 },
+        { code: 'a34004', name: 'PM2.5', maxNumber: 350 },
+        { code: 'a21026', name: 'SO2', maxNumber: 2100 },
+        { code: 'a21004', name: 'NO2', maxNumber: 750 },
+        { code: 'a21005', name: 'CO', maxNumber: 48 },
+        { code: 'a05024', name: 'O3', maxNumber: 1000 },
+        { code: 'a99054', name: 'TVOC', maxNumber: 4 }
+      ],
+      heatMapData: [],
+      dataType: 'datetimerange',
+      options: {
+        speed: 2
+      },
+      polygon: null,
+      dateTimes: [],
+      activeItem: {},
+      markerList: []
+    }
+  },
+  watch: {
+    'formInline.dateRadio': {
+      handler: function (newVal, oldVal) {
+        if (newVal === '������') {
+          this.dataType = 'datetimerange'
+          this.formInline.dayType = 'hour'
+          this.dateTimes = []
+        } else if (newVal === '���') {
+          this.dataType = 'daterange'
+          this.dateTimes = []
+          this.formInline.dayType = 'day'
+        } else if (newVal === '���') {
+          this.dataType = 'monthrange'
+          this.dateTimes = []
+          this.formInline.dayType = 'month'
+        }
+      },
+      deep: true
+    },
+    'formInline.city': {
+      handler: function (newVal, oldVal) {
+        console.log('newVal', newVal === '')
+        if (newVal !== '') {
+          this.map.clearMap()
+          this.init1()
+          this.map.setCity(newVal)
+          if (!!this.formInline.starTime && !!this.formInline.endTime) {
+            this.onSubmit()
+          }
+        }
+      },
+      deep: true
+    },
+    activeItem: {
+      handler (newVal, oldVal) {
+        if (this.markerList.length > 0) {
+          console.log('2222', this.map.getAllOverlays('marker'))
+          this.map.remove(this.markerList)
+          this.map.clearMap()
+          this.markerList = []
+          // this.markerClusterer = null
+        }
+        this.getData(newVal.name)
+      },
+      deep: true
+    }
+  },
+  mounted () {
+    this.$nextTick(() => {
+      this.initMap()
+      this.createHeatMap()
+    })
+  },
+
+  destroyed () {
+    if (this.map) {
+      this.map.destroy()
+    }
+  },
+  methods: {
+    getDateFun (item) {
+      console.log(item)
+      this.activeItem = item
+    },
+    getPollutant (data) {
+      this.selectSensor = _.find(this.sensorArr, { name: data })
+      console.log(this.selectSensor)
+    },
+    // ���������������
+    initMap () {
+      var map = new AMap.Map('mapd', {
+        resizeEnable: true,
+        zooms: [3, 18],
+        zoom: 11,
+      })
+      this.map = map
+      // let that = this
+    },
+    init1 () { // ������������
+      var that = this
+      if (that.polygon) {
+        that.map.remove(that.polygon)
+      }
+      AMap.plugin('AMap.DistrictSearch', function () {
+        new AMap.DistrictSearch({
+          extensions: 'all',
+          subdistrict: 0
+        }).search(that.formInline.city, function (status, result) { // ���������������������������������������������������
+          var outer = [
+            new AMap.LngLat(-360, 90, true),
+            new AMap.LngLat(-360, -90, true),
+            new AMap.LngLat(360, -90, true),
+            new AMap.LngLat(360, 90, true)
+          ]
+          var holes = result.districtList[0].boundaries
+          var pathArray = [outer]
+          pathArray.push.apply(pathArray, holes)
+          that.polygon = new AMap.Polygon({
+            pathL: pathArray,
+            strokeColor: 'red', // ������������������
+            strokeWeight: 3,
+            fillColor: '#FFF', // ���������������������
+            fillOpacity: 1
+          })
+          that.polygon.setPath(pathArray)
+          that.map.add(that.polygon)
+        })
+      })
+    },
+    getData (newVal) {
+      this.$request({
+        url: '/heatMap/query',
+        method: 'get',
+        params: {
+          code: this.formInline.cityCode,
+          startTime: newVal,
+          type: this.selectSensor.code,
+          form: this.formInline.dayType
+        }
+      })
+        .then(res => {
+          if (res.data !== '0') {
+            if (this.heatmap === null) {
+              this.createHeatMap()
+            }
+            this.map.clearMap()
+            this.heatMapData = res.data
+            this.heatmap.setDataSet({
+              data: this.heatMapData,
+              max: this.selectSensor.maxNumber
+            })
+            // let zoomLevel = this.map.getZoom()
+            //
+            this.setMarkers(this.heatMapData)
+          } else {
+            this.heatmap = null
+          }
+        })
+        .catch(err => {
+          console.log(err)
+        })
+    },
+
+    setMarkers (curData) {
+      curData.forEach((item, index) => {
+        let div = document.createElement('div')
+        let bgColor = 'hsla(180, 100%, 50%, 0.7)'
+        let fontColor = '#000'
+        let borderColor = 'hsl(180, 100%, 40%)'
+        let shadowColor = 'hsl(180, 100%, 50%)'
+        div.id = 'pint' + index
+        div.style.backgroundColor = bgColor
+        let size = 40
+        div.style.width = div.style.height = size + 'px'
+        div.style.border = 'solid 1px ' + borderColor
+        div.style.borderRadius = size / 2 + 'px'
+        div.style.boxShadow = '0 0 1px ' + shadowColor
+        div.innerHTML = Math.floor(Number(item.count))
+        div.style.lineHeight = size + 'px'
+        div.style.color = fontColor
+        div.style.fontSize = '14px'
+        div.style.textAlign = 'center'
+        let marker = new AMap.Marker({
+          position: [item.lng, item.lat],
+          title: item.name,
+          extData: Math.floor(Number(item.count)),
+          anchor: 'center',
+          // ��� html ������ content
+          content: div,
+          // ��� icon ��� [center bottom] ���������
+          offset: new AMap.Pixel(3, 10)
+        })
+        this.markerList.push(marker)
+      })
+      this.map.add(this.markerList)
+      var count = this.markerList.length
+      // eslint-disable-next-line no-new
+      if (this.markerClusterer) {
+        this.markerClusterer.clearMarkers()
+      }
+      let that = this
+      AMap.plugin('AMap.MarkerClusterer', function () {
+        that.markerClusterer = new AMap.MarkerClusterer(that.map, that.markerList, {
+          gridSize: 100,
+          renderClusterMarker: function (context) {
+            let contNumber = 0
+            context.markers.forEach(item => {
+              contNumber += item.getExtData()
+            })
+            let factor = Math.pow(context.count / count, 1 / 18)
+            let div = document.createElement('div')
+            let Hue = 180 - factor * 180
+            let bgColor = 'hsla(' + Hue + ',100%,50%,0.7)'
+            let fontColor = 'hsla(' + Hue + ',100%,20%,1)'
+            let borderColor = 'hsla(' + Hue + ',100%,40%,1)'
+            let shadowColor = 'hsla(' + Hue + ',100%,50%,1)'
+            div.style.backgroundColor = bgColor
+            let size = Math.round(30 + Math.pow(context.count / count, 1 / 5) * 20)
+            div.style.width = div.style.height = size + 'px'
+            div.style.border = 'solid 1px ' + borderColor
+            div.style.borderRadius = size / 2 + 'px'
+            div.style.boxShadow = '0 0 1px ' + shadowColor
+            div.innerHTML = contNumber
+            div.style.lineHeight = size + 'px'
+            div.style.color = fontColor
+            div.style.fontSize = '14px'
+            div.style.textAlign = 'center'
+            context.marker.setOffset(new AMap.Pixel(-size / 2, -size / 2))
+            context.marker.setContent(div)
+          }
+        })
+      })
+    },
+    getDayListData () {
+      this.$request({
+        url: '/heatMap/queryTime',
+        method: 'get',
+        params: {
+          type: this.formInline.dayType,
+          startTime: this.formInline.starTime,
+          endTime: this.formInline.endTime,
+        }
+      })
+        .then(res => {
+          this.dateTimes = res.data
+        })
+        .catch(err => {
+          console.log(err)
+        })
+    },
+    createHeatMap () {
+      let that = this
+      this.map.plugin(['AMap.Heatmap'], function () {
+        // ���������heatmap������
+        that.heatmap = new AMap.Heatmap(that.map, {
+          radius: 100, // ������������
+          opacity: [0.2, 0.8],
+          gradient: {
+            '0': '#d81e06',
+            '0.2': '#ea9518',
+            '0.4': '#fd8200',
+            '0.6': '#fd0001',
+            '0.8': '#95014b',
+            '1': '#7e0226'
+          }
+        })
+      })
+    },
+
+    onSubmit () {
+      if (!!this.formInline.city && !!this.formInline.starTime && !!this.formInline.endTime) {
+        this.getDayListData()
+        this.getData(this.formInline.starTime)
+        this.map.setZoom(12)
+      } else {
+        this.$message({
+          showClose: true,
+          duration: 2000,
+          message: '������������������������������',
+          type: 'error'
+        })
+      }
+    },
+    regionData (city) {
+      console.log(city)
+      if (city.org) {
+        this.formInline.city = city.org
+        this.formInline.cityCode = city.orgid
+      } else {
+        this.formInline.city = ''
+        this.formInline.cityCode = ''
+      }
+    },
+    selectHourData (data) {
+      if (data) {
+        this.formInline.starTime = data[0]
+        this.formInline.endTime = data[1]
+      } else {
+        this.formInline.starTime = ''
+        this.formInline.endTime = ''
+      }
+    },
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.content{
+   width: 100%;
+  height: 100%;
+  position: relative;
+  .formInBox{
+    display: flex;
+    justify-content: flex-start;
+    align-items: center;
+    position: absolute;
+    padding: 5px 10px;
+    width: 100%;
+    z-index: 999;
+    background: rgba(204,204,204,0.5);
+    /deep/.el-form-item{
+      margin-bottom: 0px;
+    }
+  }
+}
+#mapd {
+  width: 100%;
+  height: 100%;
+  resize: both;
+  z-index: 0;
+}
+.timeLine{
+   position: absolute;
+    padding: 5px 10px;
+    bottom: 15px;
+    width: 100%;
+    z-index: 999;
+}
+/deep/.menu-icon {
+  font-size: 20px;
+  width: 30px;
+  height: 30px;
+  background-size: cover;
+  background-repeat: no-repeat;
+  display: inline-block;
+  background-image: url('./components/img/round.png');
+}
+/deep/.menu-font{
+  font-size: 16px;
+  text-align: center;
+  max-width: 120px;
+}
+/deep/.amap-logo,/deep/.amap-copyright{
+  display: none!important;
+}
+</style>
diff --git a/src/views/toCarryOutLegislativeReforms/components/locationMap.vue b/src/views/toCarryOutLegislativeReforms/components/locationMap.vue
new file mode 100644
index 0000000..847753a
--- /dev/null
+++ b/src/views/toCarryOutLegislativeReforms/components/locationMap.vue
@@ -0,0 +1,119 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :visible.sync="visible"
+      top="30px"
+      width="1000px"
+      center
+      :before-close="close"
+    >
+      <div class="searchBox">
+        <el-input
+          v-model="placeSearch"
+          placeholder="���������������"
+          class="input-with-select"
+        >
+          <el-button
+            slot="append"
+            icon="el-icon-search"
+            @click="search"
+          />
+        </el-input>
+      </div>
+      <div id="panel" />
+      <div
+        v-if="visible"
+        class="mapBox"
+      >
+        <div id="mapd" />
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    visible: { type: Boolean, required: true }
+  },
+  data () {
+    return {
+      title: '������������',
+      map: null,
+      placeSearch: null
+    }
+  },
+  mounted () {
+    this.$nextTick(() => {
+      this.initMap()
+    })
+  },
+  destroyed () {
+    if (this.map) {
+      this.map.destroy()
+    }
+  },
+  methods: {
+    // ���������������
+    initMap () {
+      let map = new AMap.Map('mapd', {
+        resizeEnable: true,
+        zooms: [3, 18],
+        zoom: 15,
+        center: [120.9781494, 31.4265156]
+      })
+      this.map = map
+
+      const lnglat = new AMap.LngLat('120.9781494', '31.4265156')
+      const marker = new AMap.Marker({
+        position: lnglat
+      })
+
+      // ������������������������������������������������������
+      marker.setAnimation('AMAP_ANIMATION_BOUNCE')
+      marker.setMap(this.map)
+      AMap.service(['AMap.PlaceSearch'], function () {
+        // ���������������������
+        var placeSearch = new AMap.PlaceSearch({
+          pageSize: 5, // ������������������������
+          pageIndex: 1, // ������
+          city: '010', // ���������������
+          citylimit: true, // ���������������������������������������������
+          map: map, // ���������������������������
+          panel: 'panel', // ���������������������������������������������
+          autoFitView: true // ������������������������������������������ Marker���������������������������������
+        })
+        // ���������������
+        placeSearch.search('������������')
+      })
+    },
+    search () {
+      let this_ = this
+    },
+    close () {
+      this.$emit('update:visible', false)
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+/deep/.el-dialog__body {
+  height: 600px;
+  .searchBox {
+    margin-bottom: 10px;
+  }
+  .mapBox {
+    width: 100%;
+    height: 100%;
+    padding-bottom: 30px;
+  }
+}
+#mapd {
+  width: 100%;
+  height: 100%;
+  resize: both;
+  z-index: 0;
+}
+</style>
diff --git a/src/views/toCarryOutLegislativeReforms/reform/index.vue b/src/views/toCarryOutLegislativeReforms/reform/index.vue
index b12d231..5f05f20 100644
--- a/src/views/toCarryOutLegislativeReforms/reform/index.vue
+++ b/src/views/toCarryOutLegislativeReforms/reform/index.vue
@@ -2,7 +2,7 @@
   <div v-loading="loading" class="main">
     <div>
       <searchBar v-if="searchType" :search-type="'reform'" @handleSearch="handleSearchBut" @handleAdd="handleOpenDialog(null, 'add')" />
-      <newWorkOrder v-if="centerDialogVisible" ref="newWorkOrder" :parent-form-data="parentFormData" :title="title" :page-state="pageState" :visible.sync="centerDialogVisible" @handleSubmit="newHandleSubmit" />
+      <newWorkOrder v-if="centerDialogVisible" ref="newWorkOrder" :isToMap.sync='isToMap' :parent-form-data="parentFormData" :title="title" :page-state="pageState" :visible.sync="centerDialogVisible" @handleSubmit="newHandleSubmit" />
       <!-- <el-divider></el-divider> -->
       <div class="tab">
         <div class="exportBox">
@@ -229,6 +229,7 @@
         <el-button type="primary" @click="handleEditChange">��� ���</el-button>
       </span>
     </el-dialog>
+    <mapContainer :visible.sync="isToMap" v-if="isToMap"></mapContainer>
   </div>
 </template>
 
@@ -238,18 +239,21 @@
 import _ from 'lodash'
 import qs from 'qs'
 import searchBar from '@/views/toCarryOutLegislativeReforms/components/queryForm'
+import mapContainer from '@/views/toCarryOutLegislativeReforms/components/locationMap'
 import newWorkOrder from '@/views/toCarryOutLegislativeReforms/components/newWorkOrder'
 import workOrderInformation from '@/views/toCarryOutLegislativeReforms/components/workOrderInformation'
 export default {
   components: {
     searchBar,
     newWorkOrder,
+    mapContainer,
     workOrderInformation
   },
   // mixins: [mixins],
   data() {
     return {
       loading: false,
+      isToMap: false,
       selectionRows: [],
       errorClass: 'errorClass',
       searchType: 'reform',
@@ -295,6 +299,11 @@
       sealList: []
     }
   },
+  watch: {
+    isToMap(newVal, oldVal) {
+      this.isToMap = newVal
+    }
+  },
   computed: {
     updataEscalationUnitIdFormatter: function () {
       const data = this.unitList.find(
@@ -322,8 +331,23 @@
     this.handleSearch({ isInvalid: 0, state: [9, 20, 30] })
     this.getUnitList()
     this.getContaminateList()
+    if (navigator.geolocation) {
+      navigator.geolocation.getCurrentPosition(
+        this.successCallback,
+        this.errorCallback
+      )
+    } else {
+      alert('���������������������������������������������')
+    }
   },
   methods: {
+    successCallback(position) {
+      const latitude = position.coords.latitude // ������
+      const longitude = position.coords.longitude // ������
+      console.log('���������' + longitude)
+      console.log('���������' + latitude)
+    },
+    errorCallback() {},
     handleSelectionChange(rows) {
       console.log(rows)
       this.selectionRows = rows

--
Gitblit v1.8.0