Browse Source

考勤配置

wzdxx1314@163.com 1 năm trước cách đây
mục cha
commit
7fd8fc541f

+ 9 - 0
auto-imports.d.ts

@@ -0,0 +1,9 @@
+/* eslint-disable */
+/* prettier-ignore */
+// @ts-nocheck
+// noinspection JSUnusedGlobalSymbols
+// Generated by unplugin-auto-import
+export {}
+declare global {
+
+}

+ 49 - 0
components.d.ts

@@ -0,0 +1,49 @@
+/* eslint-disable */
+/* prettier-ignore */
+// @ts-nocheck
+// Generated by unplugin-vue-components
+// Read more: https://github.com/vuejs/core/pull/3399
+export {}
+
+declare module 'vue' {
+  export interface GlobalComponents {
+    AppNavbarActions: typeof import('./src/components/navbar/components/AppNavbarActions.vue')['default']
+    BarChart: typeof import('./src/components/va-charts/chart-types/BarChart.vue')['default']
+    BubbleChart: typeof import('./src/components/va-charts/chart-types/BubbleChart.vue')['default']
+    ColorDropdown: typeof import('./src/components/navbar/components/dropdowns/ColorDropdown.vue')['default']
+    ColorDropdownItem: typeof import('./src/components/navbar/components/dropdowns/ColorDropdownItem.vue')['default']
+    DoughnutChart: typeof import('./src/components/va-charts/chart-types/DoughnutChart.vue')['default']
+    HorizontalBarChart: typeof import('./src/components/va-charts/chart-types/HorizontalBarChart.vue')['default']
+    LanguageDropdown: typeof import('./src/components/navbar/components/dropdowns/LanguageDropdown.vue')['default']
+    LineChart: typeof import('./src/components/va-charts/chart-types/LineChart.vue')['default']
+    LineMap: typeof import('./src/components/maps/LineMap.vue')['default']
+    MenuAccordion: typeof import('./src/components/sidebar/menu/MenuAccordion.vue')['default']
+    MenuMinimized: typeof import('./src/components/sidebar/menu/MenuMinimized.vue')['default']
+    MessageDropdown: typeof import('./src/components/navbar/components/dropdowns/MessageDropdown.vue')['default']
+    Navbar: typeof import('./src/components/navbar/Navbar.vue')['default']
+    NotificationDropdown: typeof import('./src/components/navbar/components/dropdowns/NotificationDropdown.vue')['default']
+    PieChart: typeof import('./src/components/va-charts/chart-types/PieChart.vue')['default']
+    ProfileDropdown: typeof import('./src/components/navbar/components/dropdowns/ProfileDropdown.vue')['default']
+    RouterLink: typeof import('vue-router')['RouterLink']
+    RouterView: typeof import('vue-router')['RouterView']
+    SettingsDropdown: typeof import('./src/components/navbar/components/dropdowns/SettingsDropdown.vue')['default']
+    Sidebar: typeof import('./src/components/sidebar/Sidebar.vue')['default']
+    VaChart: typeof import('./src/components/va-charts/VaChart.vue')['default']
+    VaIconCleanCode: typeof import('./src/components/icons/VaIconCleanCode.vue')['default']
+    VaIconColor: typeof import('./src/components/icons/VaIconColor.vue')['default']
+    VaIconFaster: typeof import('./src/components/icons/VaIconFaster.vue')['default']
+    VaIconFree: typeof import('./src/components/icons/VaIconFree.vue')['default']
+    VaIconFresh: typeof import('./src/components/icons/VaIconFresh.vue')['default']
+    VaIconMenu: typeof import('./src/components/icons/VaIconMenu.vue')['default']
+    VaIconMenuCollapsed: typeof import('./src/components/icons/VaIconMenuCollapsed.vue')['default']
+    VaIconMessage: typeof import('./src/components/icons/VaIconMessage.vue')['default']
+    VaIconNotification: typeof import('./src/components/icons/VaIconNotification.vue')['default']
+    VaIconResponsive: typeof import('./src/components/icons/VaIconResponsive.vue')['default']
+    VaIconRich: typeof import('./src/components/icons/VaIconRich.vue')['default']
+    VaIconSlower: typeof import('./src/components/icons/VaIconSlower.vue')['default']
+    VaIconVue: typeof import('./src/components/icons/VaIconVue.vue')['default']
+    VaIconVuestic: typeof import('./src/components/icons/VaIconVuestic.vue')['default']
+    VaMediumEditor: typeof import('./src/components/va-medium-editor/VaMediumEditor.vue')['default']
+    VuesticLogo: typeof import('./src/components/VuesticLogo.vue')['default']
+  }
+}

+ 691 - 1
package-lock.json

@@ -4,6 +4,16 @@
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
+    "3d-tiles-renderer": {
+      "version": "0.3.20",
+      "resolved": "https://registry.npmmirror.com/3d-tiles-renderer/-/3d-tiles-renderer-0.3.20.tgz",
+      "integrity": "sha512-Uhr98kOdQig+VxPv70BPXX2ZxB3cbCUVc19MPjm7hgKNydqnNjRarQkySrLpV6NIZJ35Qab33crlmeZPCanFgA=="
+    },
+    "@amap/amap-jsapi-types": {
+      "version": "0.0.10",
+      "resolved": "https://registry.npmmirror.com/@amap/amap-jsapi-types/-/amap-jsapi-types-0.0.10.tgz",
+      "integrity": "sha512-znvqLGPBy9NRCr1/3650o9vL1aYl/f1YK0+UGn8lBUvHJXND6uMDJGJsl43cEYglw9/tblwIRxjm4pIotOvSCQ=="
+    },
     "@amcharts/amcharts5": {
       "version": "5.4.1",
       "resolved": "https://registry.npmjs.org/@amcharts/amcharts5/-/amcharts5-5.4.1.tgz",
@@ -49,11 +59,25 @@
         "@types/geojson": "^7946.0.8"
       }
     },
+    "@antfu/utils": {
+      "version": "0.7.7",
+      "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.7.tgz",
+      "integrity": "sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==",
+      "dev": true
+    },
     "@babel/parser": {
       "version": "7.22.7",
       "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz",
       "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q=="
     },
+    "@babel/runtime": {
+      "version": "7.23.8",
+      "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.8.tgz",
+      "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==",
+      "requires": {
+        "regenerator-runtime": "^0.14.0"
+      }
+    },
     "@esbuild/android-arm": {
       "version": "0.18.16",
       "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.16.tgz",
@@ -634,6 +658,21 @@
       "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz",
       "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q=="
     },
+    "@math.gl/core": {
+      "version": "3.6.3",
+      "resolved": "https://registry.npmmirror.com/@math.gl/core/-/core-3.6.3.tgz",
+      "integrity": "sha512-jBABmDkj5uuuE0dTDmwwss7Cup5ZwQ6Qb7h1pgvtkEutTrhkcv8SuItQNXmF45494yIHeoGue08NlyeY6wxq2A==",
+      "requires": {
+        "@babel/runtime": "^7.12.0",
+        "@math.gl/types": "3.6.3",
+        "gl-matrix": "^3.4.0"
+      }
+    },
+    "@math.gl/types": {
+      "version": "3.6.3",
+      "resolved": "https://registry.npmmirror.com/@math.gl/types/-/types-3.6.3.tgz",
+      "integrity": "sha512-3uWLVXHY3jQxsXCr/UCNPSc2BG0hNUljhmOBt9l+lNFDp7zHgm0cK2Tw4kj2XfkJy4TgwZTBGwRDQgWEbLbdTA=="
+    },
     "@nodelib/fs.scandir": {
       "version": "2.1.5",
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -660,6 +699,45 @@
         "fastq": "^1.6.0"
       }
     },
+    "@rollup/pluginutils": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
+      "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
+      "dev": true,
+      "requires": {
+        "@types/estree": "^1.0.0",
+        "estree-walker": "^2.0.2",
+        "picomatch": "^2.3.1"
+      }
+    },
+    "@turf/helpers": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmmirror.com/@turf/helpers/-/helpers-6.5.0.tgz",
+      "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw=="
+    },
+    "@turf/intersect": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmmirror.com/@turf/intersect/-/intersect-6.5.0.tgz",
+      "integrity": "sha512-2legGJeKrfFkzntcd4GouPugoqPUjexPZnOvfez+3SfIMrHvulw8qV8u7pfVyn2Yqs53yoVCEjS5sEpvQ5YRQg==",
+      "requires": {
+        "@turf/helpers": "^6.5.0",
+        "@turf/invariant": "^6.5.0",
+        "polygon-clipping": "^0.15.3"
+      }
+    },
+    "@turf/invariant": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmmirror.com/@turf/invariant/-/invariant-6.5.0.tgz",
+      "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==",
+      "requires": {
+        "@turf/helpers": "^6.5.0"
+      }
+    },
+    "@tweenjs/tween.js": {
+      "version": "18.6.4",
+      "resolved": "https://registry.npmmirror.com/@tweenjs/tween.js/-/tween.js-18.6.4.tgz",
+      "integrity": "sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ=="
+    },
     "@types/d3": {
       "version": "7.4.0",
       "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz",
@@ -979,6 +1057,19 @@
       "resolved": "https://registry.npmjs.org/@types/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz",
       "integrity": "sha512-3h04sJhF2rjOq8zUhyomORyKdr0RUts7FAz/JajBKGpTF0JSXjaj9fjWtAqj+pU1fwsGsHzcm3Neew3t/McUXA=="
     },
+    "@types/three": {
+      "version": "0.143.0",
+      "resolved": "https://registry.npmmirror.com/@types/three/-/three-0.143.0.tgz",
+      "integrity": "sha512-c5PonXOt8xk5q4ygmyjOX4Ec+FA7gwfdcMT/PveE9xrJs/0DDcf2lJkWrhEcmvx2ZefQCQBcogABnGqB0P4OsA==",
+      "requires": {
+        "@types/webxr": "*"
+      }
+    },
+    "@types/webxr": {
+      "version": "0.5.10",
+      "resolved": "https://registry.npmmirror.com/@types/webxr/-/webxr-0.5.10.tgz",
+      "integrity": "sha512-n3u5sqXQJhf1CS68mw3Wf16FQ4cRPNBBwdYLFzq3UddiADOim1Pn3Y6PBdDilz1vOJF3ybLxJ8ZEDlLIzrOQZg=="
+    },
     "@typescript-eslint/eslint-plugin": {
       "version": "5.29.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz",
@@ -1246,6 +1337,114 @@
       "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.37.tgz",
       "integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw=="
     },
+    "@vuemap/amap-jsapi-loader": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/@vuemap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.3.tgz",
+      "integrity": "sha512-GdRWm7IAto18TJLySjm8JehNPlvYW8cNaqqnb1CQHvpr7k3zkGdvCrv+7H/Op1HaLMCt4LQsUjEAkiAqUfqZ7A=="
+    },
+    "@vuemap/amap-xyz-layer": {
+      "version": "0.0.10",
+      "resolved": "https://registry.npmmirror.com/@vuemap/amap-xyz-layer/-/amap-xyz-layer-0.0.10.tgz",
+      "integrity": "sha512-NHAGN57EFn2Xpktwx6+fqlVHmu8MvG4gl9fQJT2LepAJSmgFG+o+YtOoJFXwdT8BOg8W5evJNE+CZC0833zZpA==",
+      "requires": {
+        "@math.gl/core": "3.6.3",
+        "earcut": "2.2.4",
+        "gl-matrix": "3.4.3"
+      },
+      "dependencies": {
+        "earcut": {
+          "version": "2.2.4",
+          "resolved": "https://registry.npmmirror.com/earcut/-/earcut-2.2.4.tgz",
+          "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ=="
+        }
+      }
+    },
+    "@vuemap/district-cluster": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmmirror.com/@vuemap/district-cluster/-/district-cluster-0.0.9.tgz",
+      "integrity": "sha512-Ew+3feGbVthSKWLkI1NbzD8p6S/Sp0bQGFHtB0bFgyi8liOu9OnMhqZLhmmiX3lOYElqmEHmVvXTzTtKyKP2lQ==",
+      "requires": {
+        "@amap/amap-jsapi-types": "^0.0.10",
+        "@turf/helpers": "^6.5.0",
+        "@turf/intersect": "^6.5.0",
+        "topojson-client": "3.1.0"
+      }
+    },
+    "@vuemap/layer-3dtiles": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmmirror.com/@vuemap/layer-3dtiles/-/layer-3dtiles-0.0.7.tgz",
+      "integrity": "sha512-af7aLaowepOjQkE2h8HHz5sozXlTKFrCeb3vkzP0qvwERFDnb1dIQJA3Zku25a+TB6UeEFDzn6ATIVbq0BNWIg==",
+      "requires": {
+        "3d-tiles-renderer": "0.3.20",
+        "lodash-es": "^4.17.21",
+        "three": "0.143.0"
+      }
+    },
+    "@vuemap/three-layer": {
+      "version": "0.0.10",
+      "resolved": "https://registry.npmmirror.com/@vuemap/three-layer/-/three-layer-0.0.10.tgz",
+      "integrity": "sha512-w2sIvhzTBa+/SYfl87Z7K/+HVeRPkff/d9RPBwkE1IwxswlwYLq4/P7x+tK+PVFfipMSyAJEcRPyHigFqMljoA==",
+      "requires": {
+        "@amap/amap-jsapi-types": "^0.0.8",
+        "@types/three": "0.143.0",
+        "three": "0.143.0"
+      },
+      "dependencies": {
+        "@amap/amap-jsapi-types": {
+          "version": "0.0.8",
+          "resolved": "https://registry.npmmirror.com/@amap/amap-jsapi-types/-/amap-jsapi-types-0.0.8.tgz",
+          "integrity": "sha512-q0FyZDIJcXjsMLGc3oS9rjfJsErOvt9rcp6AgzY4k14vo7bBhdq4eKwoSdVp/pYjR/rfaKBns5v10ycZOFwf/A=="
+        }
+      }
+    },
+    "@vuemap/unplugin-resolver": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/@vuemap/unplugin-resolver/-/unplugin-resolver-2.0.0.tgz",
+      "integrity": "sha512-jhSZCxBwXN5txjlV1zRGfsLS+G+wrTA8oQWkBD0g3A0Wqn9Hvq0KKDAePA23m+gwZk4xqOMi1gBoUiqqiIoaMw==",
+      "dev": true
+    },
+    "@vuemap/vue-amap": {
+      "version": "2.0.24",
+      "resolved": "https://registry.npmmirror.com/@vuemap/vue-amap/-/vue-amap-2.0.24.tgz",
+      "integrity": "sha512-n4EEm2nortHsq93cvmV72/2nZd5MITmIvI4TyICeofehtDgvXWOrBY5QWiOgCFqm4Tt7KMSxH6tSYyMh2C1pow==",
+      "requires": {
+        "@vuemap/amap-jsapi-loader": "1.0.3",
+        "@vuemap/amap-xyz-layer": "0.0.10",
+        "@vuemap/district-cluster": "0.0.9",
+        "@vuemap/vue-amap-util": "2.0.7",
+        "lodash-es": "^4.17.21"
+      }
+    },
+    "@vuemap/vue-amap-extra": {
+      "version": "2.0.11",
+      "resolved": "https://registry.npmmirror.com/@vuemap/vue-amap-extra/-/vue-amap-extra-2.0.11.tgz",
+      "integrity": "sha512-AfVaAaASc676lSeaxrV5T/opLUPjgWleKHZV2v+3b3at7GWuFSyvtZCFILRBuh4svRhlp/C3uOBgS6bpVUv5FA==",
+      "requires": {
+        "@tweenjs/tween.js": "^18.6.4",
+        "@vuemap/layer-3dtiles": "0.0.7",
+        "@vuemap/three-layer": "0.0.10",
+        "@vuemap/vue-amap-util": "2.0.7",
+        "color": "^4.2.3",
+        "lodash-es": "^4.17.21",
+        "three": "0.143.0"
+      }
+    },
+    "@vuemap/vue-amap-loca": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmmirror.com/@vuemap/vue-amap-loca/-/vue-amap-loca-2.0.6.tgz",
+      "integrity": "sha512-+bsJbpoU+4N40JVJpLE96usEDhsHonegec2HqwAgOo3I992munMAM8CMvEOGlv0QXivRqyp6kW85oTmGLVRknQ==",
+      "requires": {
+        "@vuemap/vue-amap-util": "2.0.7"
+      }
+    },
+    "@vuemap/vue-amap-util": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmmirror.com/@vuemap/vue-amap-util/-/vue-amap-util-2.0.7.tgz",
+      "integrity": "sha512-POv4dRwweE+q+rnREZmPDc0LqUHVO8PMncJRS1D3jXksQgMQNg+WK+yCDpvPqVIaAQSteeCV/NOwF0ZX/6vJXg==",
+      "requires": {
+        "uppercamelcase": "^1.1.0"
+      }
+    },
     "@zeit/schemas": {
       "version": "2.29.0",
       "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.29.0.tgz",
@@ -1758,7 +1957,7 @@
     },
     "cleave.js": {
       "version": "1.6.0",
-      "resolved": "https://registry.npmmirror.com/cleave.js/-/cleave.js-1.6.0.tgz",
+      "resolved": "https://registry.npmjs.org/cleave.js/-/cleave.js-1.6.0.tgz",
       "integrity": "sha512-ivqesy3j5hQVG3gywPfwKPbi/7ZSftY/UNp5uphnqjr25yI2CP8FS2ODQPzuLXXnNLi29e2+PgPkkiKUXLs/Nw==",
       "dev": true
     },
@@ -1855,6 +2054,15 @@
       "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
       "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="
     },
+    "color": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmmirror.com/color/-/color-4.2.3.tgz",
+      "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+      "requires": {
+        "color-convert": "^2.0.1",
+        "color-string": "^1.9.0"
+      }
+    },
     "color-convert": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -1868,6 +2076,15 @@
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
     },
+    "color-string": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz",
+      "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+      "requires": {
+        "color-name": "^1.0.0",
+        "simple-swizzle": "^0.2.2"
+      }
+    },
     "colorette": {
       "version": "2.0.19",
       "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
@@ -3188,6 +3405,23 @@
         "has-symbols": "^1.0.2"
       }
     },
+    "hasown": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz",
+      "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.2"
+      },
+      "dependencies": {
+        "function-bind": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
+          "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+          "dev": true
+        }
+      }
+    },
     "human-signals": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz",
@@ -3285,6 +3519,11 @@
         "has-tostringtag": "^1.0.0"
       }
     },
+    "is-arrayish": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz",
+      "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+    },
     "is-binary-path": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@@ -3586,12 +3825,59 @@
         }
       }
     },
+    "local-pkg": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.0.tgz",
+      "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==",
+      "dev": true,
+      "requires": {
+        "mlly": "^1.4.2",
+        "pkg-types": "^1.0.3"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "8.11.3",
+          "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.11.3.tgz",
+          "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+          "dev": true
+        },
+        "mlly": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.5.0.tgz",
+          "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==",
+          "dev": true,
+          "requires": {
+            "acorn": "^8.11.3",
+            "pathe": "^1.1.2",
+            "pkg-types": "^1.0.3",
+            "ufo": "^1.3.2"
+          }
+        },
+        "pathe": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz",
+          "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+          "dev": true
+        },
+        "ufo": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.3.2.tgz",
+          "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==",
+          "dev": true
+        }
+      }
+    },
     "lodash": {
       "version": "4.17.21",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
       "dev": true
     },
+    "lodash-es": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
+      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+    },
     "lodash.merge": {
       "version": "4.6.2",
       "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -3794,6 +4080,12 @@
         "ufo": "^1.1.2"
       }
     },
+    "moment": {
+      "version": "2.30.1",
+      "resolved": "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz",
+      "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+      "dev": true
+    },
     "ms": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -4059,6 +4351,22 @@
       "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz",
       "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g=="
     },
+    "polygon-clipping": {
+      "version": "0.15.7",
+      "resolved": "https://registry.npmmirror.com/polygon-clipping/-/polygon-clipping-0.15.7.tgz",
+      "integrity": "sha512-nhfdr83ECBg6xtqOAJab1tbksbBAOMUltN60bU+llHVOL0e5Onm1WpAXXWXVB39L8AJFssoIhEVuy/S90MmotA==",
+      "requires": {
+        "robust-predicates": "^3.0.2",
+        "splaytree": "^3.1.0"
+      },
+      "dependencies": {
+        "robust-predicates": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.2.tgz",
+          "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="
+        }
+      }
+    },
     "polylabel": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/polylabel/-/polylabel-1.1.0.tgz",
@@ -4277,6 +4585,11 @@
         "picomatch": "^2.2.1"
       }
     },
+    "regenerator-runtime": {
+      "version": "0.14.1",
+      "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+    },
     "regexp.prototype.flags": {
       "version": "1.4.3",
       "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
@@ -4481,6 +4794,12 @@
         "get-assigned-identifiers": "^1.1.0"
       }
     },
+    "scule": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/scule/-/scule-1.2.0.tgz",
+      "integrity": "sha512-CRCmi5zHQnSoeCik9565PONMg0kfkvYmcSqrbOJY4txFfy1wvVULV4FDaiXhUblUgahdqz3F2NwHZ8i4eBTwUw==",
+      "dev": true
+    },
     "seedrandom": {
       "version": "3.0.5",
       "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
@@ -4600,6 +4919,14 @@
       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
       "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
     },
+    "simple-swizzle": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+      "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+      "requires": {
+        "is-arrayish": "^0.3.1"
+      }
+    },
     "slash": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -4639,6 +4966,11 @@
       "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
       "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
     },
+    "splaytree": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmmirror.com/splaytree/-/splaytree-3.1.2.tgz",
+      "integrity": "sha512-4OM2BJgC5UzrhVnnJA4BkHKGtjXNzzUfpQjCO8I05xYPsfS/VuQDwjCGGMi8rYQilHEV4j8NBqTFbls/PZEE7A=="
+    },
     "static-eval": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz",
@@ -4737,6 +5069,15 @@
       "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
       "dev": true
     },
+    "strip-literal": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-1.3.0.tgz",
+      "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==",
+      "dev": true,
+      "requires": {
+        "acorn": "^8.10.0"
+      }
+    },
     "supercluster": {
       "version": "7.1.5",
       "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz",
@@ -4808,6 +5149,11 @@
       "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
       "dev": true
     },
+    "three": {
+      "version": "0.143.0",
+      "resolved": "https://registry.npmmirror.com/three/-/three-0.143.0.tgz",
+      "integrity": "sha512-oKcAGYHhJ46TGEuHjodo2n6TY2R6lbvrkp+feKZxqsUL/WkH7GKKaeu6RHeyb2Xjfk2dPLRKLsOP0KM2VgT8Zg=="
+    },
     "through": {
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -4840,6 +5186,21 @@
         "is-number": "^7.0.0"
       }
     },
+    "topojson-client": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/topojson-client/-/topojson-client-3.1.0.tgz",
+      "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==",
+      "requires": {
+        "commander": "2"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.20.3",
+          "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
+          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+        }
+      }
+    },
     "tslib": {
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
@@ -4910,6 +5271,125 @@
         "tiny-inflate": "^1.0.0"
       }
     },
+    "unimport": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npmmirror.com/unimport/-/unimport-3.7.1.tgz",
+      "integrity": "sha512-V9HpXYfsZye5bPPYUgs0Otn3ODS1mDUciaBlXljI4C2fTwfFpvFZRywmlOu943puN9sncxROMZhsZCjNXEpzEQ==",
+      "dev": true,
+      "requires": {
+        "@rollup/pluginutils": "^5.1.0",
+        "acorn": "^8.11.2",
+        "escape-string-regexp": "^5.0.0",
+        "estree-walker": "^3.0.3",
+        "fast-glob": "^3.3.2",
+        "local-pkg": "^0.5.0",
+        "magic-string": "^0.30.5",
+        "mlly": "^1.4.2",
+        "pathe": "^1.1.1",
+        "pkg-types": "^1.0.3",
+        "scule": "^1.1.1",
+        "strip-literal": "^1.3.0",
+        "unplugin": "^1.5.1"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "8.11.3",
+          "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.11.3.tgz",
+          "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+          "dev": true
+        },
+        "escape-string-regexp": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+          "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+          "dev": true
+        },
+        "estree-walker": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz",
+          "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+          "dev": true,
+          "requires": {
+            "@types/estree": "^1.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==",
+          "dev": true,
+          "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"
+          }
+        },
+        "glob-parent": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+          "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "magic-string": {
+          "version": "0.30.5",
+          "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.5.tgz",
+          "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+          "dev": true,
+          "requires": {
+            "@jridgewell/sourcemap-codec": "^1.4.15"
+          }
+        },
+        "mlly": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.5.0.tgz",
+          "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==",
+          "dev": true,
+          "requires": {
+            "acorn": "^8.11.3",
+            "pathe": "^1.1.2",
+            "pkg-types": "^1.0.3",
+            "ufo": "^1.3.2"
+          },
+          "dependencies": {
+            "pathe": {
+              "version": "1.1.2",
+              "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz",
+              "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+              "dev": true
+            }
+          }
+        },
+        "ufo": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.3.2.tgz",
+          "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==",
+          "dev": true
+        },
+        "unplugin": {
+          "version": "1.6.0",
+          "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.6.0.tgz",
+          "integrity": "sha512-BfJEpWBu3aE/AyHx8VaNE/WgouoQxgH9baAiH82JjX8cqVyi3uJQstqwD5J+SZxIK326SZIhsSZlALXVBCknTQ==",
+          "dev": true,
+          "requires": {
+            "acorn": "^8.11.2",
+            "chokidar": "^3.5.3",
+            "webpack-sources": "^3.2.3",
+            "webpack-virtual-modules": "^0.6.1"
+          }
+        },
+        "webpack-virtual-modules": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz",
+          "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==",
+          "dev": true
+        }
+      }
+    },
     "unplugin": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.4.0.tgz",
@@ -4922,6 +5402,192 @@
         "webpack-virtual-modules": "^0.5.0"
       }
     },
+    "unplugin-auto-import": {
+      "version": "0.17.3",
+      "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-0.17.3.tgz",
+      "integrity": "sha512-0cn0wr8X579TtdZKUAps0dDVrYzttx38ImdxZjmCeNlMDJX8UuSjO83vFqgS4ClNDIGWAute+xl9j5vRSX+vsw==",
+      "dev": true,
+      "requires": {
+        "@antfu/utils": "^0.7.7",
+        "@rollup/pluginutils": "^5.1.0",
+        "fast-glob": "^3.3.2",
+        "local-pkg": "^0.5.0",
+        "magic-string": "^0.30.5",
+        "minimatch": "^9.0.3",
+        "unimport": "^3.7.0",
+        "unplugin": "^1.6.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "8.11.3",
+          "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.11.3.tgz",
+          "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+          "dev": true
+        },
+        "brace-expansion": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+          "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+          "dev": true,
+          "requires": {
+            "balanced-match": "^1.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==",
+          "dev": true,
+          "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"
+          }
+        },
+        "glob-parent": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+          "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "magic-string": {
+          "version": "0.30.5",
+          "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.5.tgz",
+          "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+          "dev": true,
+          "requires": {
+            "@jridgewell/sourcemap-codec": "^1.4.15"
+          }
+        },
+        "minimatch": {
+          "version": "9.0.3",
+          "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz",
+          "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
+        },
+        "unplugin": {
+          "version": "1.6.0",
+          "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.6.0.tgz",
+          "integrity": "sha512-BfJEpWBu3aE/AyHx8VaNE/WgouoQxgH9baAiH82JjX8cqVyi3uJQstqwD5J+SZxIK326SZIhsSZlALXVBCknTQ==",
+          "dev": true,
+          "requires": {
+            "acorn": "^8.11.2",
+            "chokidar": "^3.5.3",
+            "webpack-sources": "^3.2.3",
+            "webpack-virtual-modules": "^0.6.1"
+          }
+        },
+        "webpack-virtual-modules": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz",
+          "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==",
+          "dev": true
+        }
+      }
+    },
+    "unplugin-vue-components": {
+      "version": "0.26.0",
+      "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.26.0.tgz",
+      "integrity": "sha512-s7IdPDlnOvPamjunVxw8kNgKNK8A5KM1YpK5j/p97jEKTjlPNrA0nZBiSfAKKlK1gWZuyWXlKL5dk3EDw874LQ==",
+      "dev": true,
+      "requires": {
+        "@antfu/utils": "^0.7.6",
+        "@rollup/pluginutils": "^5.0.4",
+        "chokidar": "^3.5.3",
+        "debug": "^4.3.4",
+        "fast-glob": "^3.3.1",
+        "local-pkg": "^0.4.3",
+        "magic-string": "^0.30.3",
+        "minimatch": "^9.0.3",
+        "resolve": "^1.22.4",
+        "unplugin": "^1.4.0"
+      },
+      "dependencies": {
+        "brace-expansion": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+          "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+          "dev": true,
+          "requires": {
+            "balanced-match": "^1.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==",
+          "dev": true,
+          "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"
+          }
+        },
+        "glob-parent": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+          "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "is-core-module": {
+          "version": "2.13.1",
+          "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz",
+          "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+          "dev": true,
+          "requires": {
+            "hasown": "^2.0.0"
+          }
+        },
+        "local-pkg": {
+          "version": "0.4.3",
+          "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.3.tgz",
+          "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==",
+          "dev": true
+        },
+        "magic-string": {
+          "version": "0.30.5",
+          "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.5.tgz",
+          "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+          "dev": true,
+          "requires": {
+            "@jridgewell/sourcemap-codec": "^1.4.15"
+          }
+        },
+        "minimatch": {
+          "version": "9.0.3",
+          "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz",
+          "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
+        },
+        "resolve": {
+          "version": "1.22.8",
+          "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz",
+          "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+          "dev": true,
+          "requires": {
+            "is-core-module": "^2.13.0",
+            "path-parse": "^1.0.7",
+            "supports-preserve-symlinks-flag": "^1.0.0"
+          }
+        }
+      }
+    },
     "update-browserslist-db": {
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
@@ -4941,6 +5607,21 @@
         "registry-url": "3.1.0"
       }
     },
+    "uppercamelcase": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/uppercamelcase/-/uppercamelcase-1.1.0.tgz",
+      "integrity": "sha512-C7YEMvhgrvTEKEEVqA7LXNID/1TvvIwYZqNIKLquS6y/MGSkRQAav9LnTTILlC1RqUM8eTVBOe1U/fnB652PRA==",
+      "requires": {
+        "camelcase": "^1.2.1"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-1.2.1.tgz",
+          "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g=="
+        }
+      }
+    },
     "uri-js": {
       "version": "4.4.1",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
@@ -4999,6 +5680,15 @@
         "@vue/shared": "3.2.37"
       }
     },
+    "vue-amap": {
+      "version": "0.5.10",
+      "resolved": "https://registry.npmmirror.com/vue-amap/-/vue-amap-0.5.10.tgz",
+      "integrity": "sha512-9ViNCev1vx32+zZ5RvF/TmUZNbwL9QrdA2/OnD2GlXMfQBkJy7D08Vb7379t6guqnopDPtWJ8K6gg72h9+4GUg==",
+      "dev": true,
+      "requires": {
+        "uppercamelcase": "^1.1.0"
+      }
+    },
     "vue-chartjs": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/vue-chartjs/-/vue-chartjs-4.1.1.tgz",

+ 8 - 0
package.json

@@ -23,6 +23,9 @@
     "@amcharts/amcharts5-geodata": "^5.0.3",
     "@fortawesome/fontawesome-free": "^6.1.1",
     "@gtm-support/vue-gtm": "^2.0.0",
+    "@vuemap/vue-amap": "^2.0.24",
+    "@vuemap/vue-amap-extra": "^2.0.11",
+    "@vuemap/vue-amap-loca": "^2.0.6",
     "chart.js": "^3.8.0",
     "epic-spinners": "^2.0.0",
     "flag-icons": "^6.6.4",
@@ -51,6 +54,7 @@
     "@vitejs/plugin-vue": "^4.2.3",
     "@vue/eslint-config-prettier": "^7.0.0",
     "@vue/eslint-config-typescript": "^10.0.0",
+    "@vuemap/unplugin-resolver": "^2.0.0",
     "autoprefixer": "^10.4.13",
     "axios": "^1.6.5",
     "eslint": "^8.13.0",
@@ -58,12 +62,16 @@
     "eslint-plugin-vue": "^8.7.0",
     "husky": "^8.0.1",
     "lint-staged": "^13.0.1",
+    "moment": "^2.30.1",
     "postcss": "^8.4.31",
     "prettier": "^2.6.2",
     "qs": "^6.11.2",
     "tailwindcss": "^3.2.4",
     "typescript": "^4.5.4",
+    "unplugin-auto-import": "^0.17.3",
+    "unplugin-vue-components": "^0.26.0",
     "vite": "^4.4.12",
+    "vue-amap": "^0.5.10",
     "vue-eslint-parser": "^8.3.0",
     "vue-tsc": "^0.35.0",
     "vuestic-ui": "^1.8.7"

+ 14 - 0
src/App.vue

@@ -35,4 +35,18 @@
   .va-toast__content {
     color: white;
   }
+  .workSpace {
+    width: 100%;
+    flex: 1;
+  }
+  .table {
+    margin-top: 20px;
+    width: 100%;
+  }
+  .va-table-responsive {
+    width: 100%;
+  }
+  .va-table {
+    width: 100%;
+  }
 </style>

+ 18 - 1
src/api/api.js

@@ -20,7 +20,7 @@ instance.interceptors.request.use(
   (config) => {
     config.headers['Accept'] = ''
     config.headers['X-Requested-With'] = 'XMLHttpRequest'
-    // config.headers['Authorization'] = localStorage.getItem('token')
+    config.headers[localStorage.getItem('tokenName')] = localStorage.getItem('tokenValue')
     return config
   },
   (error) => {
@@ -127,4 +127,21 @@ export default {
   deleteRole(params) {
     return fetch('/sysRole?id=' + params.id, params, 'delete')
   },
+
+  //业务打卡功能 /workAddr
+  addWorkPoint(params) {
+    return fetch('/workAddr', params, 'post')
+  },
+  getWorkPointList(params) {
+    return fetch('/workAddr', params, 'get')
+  },
+  deleteWorkPoint(params) {
+    return fetch('/workAddr?id=' + params.id, params, 'delete')
+  },
+  editWorkPoint(params) {
+    return fetch('/workAddr', params, 'put')
+  },
+  getWorkPointDetial(params) {
+    return fetch('/workAddr/' + params.id, params, 'get')
+  },
 }

+ 93 - 0
src/components/amap.vue

@@ -0,0 +1,93 @@
+<template>
+  <div class='map'>
+    <el-amap
+      ref='map'
+      :center="center"
+      :zoom="zoom"
+    >
+      <el-amap-marker  :position=" circleCenter"></el-amap-marker>
+      <el-amap-mouse-tool
+        v-if="created"
+        :type="type"
+        :auto-clear="true"
+        @draw="draw"
+      />
+      <el-amap-circle
+        :center="circleCenter"
+        :radius="radius"
+        :visible="true"
+        ref='circle'
+      />
+    </el-amap>
+    <div class='btnBox'>
+      <VaButton
+        color="info"
+        gradient
+        :round='false'
+        @click='created = true'
+        icon='edit'
+        class="mr-6 mb-2"
+      >
+        开始绘制
+      </VaButton>
+      <VaButton
+        :round='false'
+        color="danger"
+        gradient
+        @click='deleteDraw'
+        icon='delete'
+      >
+        删除绘制
+      </VaButton>
+    </div>
+  </div>
+
+</template>
+
+<script>
+  export default {
+    name: 'amap',
+    data(){
+      return {
+        zoom:11,
+        center:[119.508417,32.422529],
+        created:false,
+        type:'circle',
+        circleCenter:[0,0],
+        radius:0
+      }
+    },
+    methods:{
+      deleteDraw(){
+        this.circleCenter = []
+        this.radius = 0
+      },
+      setCircle(data){
+        this.circleCenter = data.center
+        this.radius = data.radius
+        setTimeout(()=>{this.$refs.map.$$getInstance().setBounds(this.$refs.circle.$$getInstance().getBounds())},1000)
+
+        // console.log(this.$refs.circle.$$getInstance().getBounds())
+      },
+      draw(e,target){
+        this.circleCenter = e.center
+        this.radius = e.radius
+        this.$emit('drawEnd',e)
+        this.created = false
+      },
+    },
+  }
+</script>
+
+<style scoped>
+  .map{
+    width: 100%;
+    height: 400px;
+    position: relative;
+  }
+  .btnBox{
+    position: absolute;
+    right: 0px;
+    top:10px;
+  }
+</style>

+ 11 - 1
src/main.ts

@@ -7,6 +7,16 @@ import router from './router'
 import vuesticGlobalConfig from './services/vuestic-ui/global-config'
 import App from './App.vue'
 import api from './api/api'
+import VueAMap, {initAMapApiLoader} from '@vuemap/vue-amap';
+import '@vuemap/vue-amap/dist/style.css'
+initAMapApiLoader({
+  key: 'a1ae930c41668c400b2b8ccc0270c5cb',
+  securityJsCode: '031ab4952072e0533e9845762d120ffe', // 新版key需要配合安全密钥使用
+  //Loca:{
+  //  version: '2.0.0'
+  //} // 如果需要使用loca组件库,需要加载Loca
+})
+
 const app = createApp(App)
 app.config.globalProperties.$api = api
 let toastObj = {
@@ -24,10 +34,10 @@ let toastObj = {
   },
 }
 app.config.globalProperties.$toast = toastObj
-
 app.use(stores)
 app.use(router)
 app.use(i18n)
+app.use(VueAMap)
 app.use(createVuestic({ config: vuesticGlobalConfig }))
 if (import.meta.env.VITE_APP_GTM_ENABLED) {
   app.use(

+ 104 - 0
src/pages/attendanceSetting/attendancePoint/index.vue

@@ -0,0 +1,104 @@
+<template>
+  <div class='workSpace'>
+    <searchForm ref='searchForm' :keys='["addrName"]' @on-search='onSearch'>
+      <addPointBtn class="addPointBtn" @after-op="getList()"></addPointBtn>
+    </searchForm>
+    <VaCard tag="b" class="table">
+      <div class="va-table-responsive">
+        <VaDataTable :items="users" :columns="columns" :loading="loading">
+          <template #cell(setting)="{ rowData }">
+            <setPointTimeBtn :params='rowData' @after-op='getList()'></setPointTimeBtn>
+            <editPointBtn :params='rowData' @after-op='getList()'></editPointBtn>
+            <deletePointBtn :params='rowData' @after-op='getList()'></deletePointBtn>
+          </template>
+          <template #cell(addrIn)="{ value }">
+            <span>{{ getTime(value) }}</span>
+          </template>
+          <template #cell(addrQuit)="{ value }">
+            <span>{{ getTime(value) }}</span>
+          </template>
+        </VaDataTable>
+      </div>
+      <div class="pagination">
+        <VaPagination
+          @click="update"
+          v-model="pageInfo.pageNum"
+          :total="pageInfo.total"
+          :page-size="pageInfo.pageSize"
+          :visible-pages="4"
+          class="justify-center sm:justify-start"
+        />
+      </div>
+    </VaCard>
+  </div>
+</template>
+
+<script>
+  import searchForm from '../module/searchForm.vue'
+  import addPointBtn from './module/addPointBtn.vue'
+  import setPointTimeBtn from './module/setPointTimeBtn.vue'
+  import deletePointBtn from './module/deletePointBtn.vue'
+  import editPointBtn from './module/editPointBtn.vue'
+  import dict from '../../../common/dict.js'
+  import moment from 'moment'
+  export default {
+    name: 'index',
+    components:{
+      searchForm,
+      addPointBtn,setPointTimeBtn,deletePointBtn,editPointBtn
+    },
+    mounted() {
+      this.getList()
+    },
+    methods:{
+      onSearch(){
+        this.pageInfo.pageNum = 1
+        this.getList()
+      },
+      getTime(time){
+        if(time){
+          return moment(new Date(parseInt(time))).format('hh:mm:ss')
+        }else{
+          return '-'
+        }
+      },
+      update(){
+        this.getList()
+      },
+      getList(){
+        let params = {
+          pageNum: Math.ceil(this.pageInfo.pageNum / this.pageInfo.pageSize),
+          pageSize: this.pageInfo.pageSize,
+          addrName: this.$refs.searchForm.form.addrName,
+        }
+        this.$api.getWorkPointList(params).then(res=>{
+          this.users = res.result.records
+        })
+      },
+    },
+    data(){
+      return {
+        pageInfo:{
+          ...dict.pageInfo
+        },
+        users:[],
+        columns:[
+          { key: 'addrName', label: '打卡点名称' },
+          { key: 'addrLng', label: '经度' },
+          { key: 'addrLat', label: '纬度' },
+          { key: 'addrRange', label: '范围' },
+          { key: 'addrIn', label: '上班时间' },
+          { key: 'addrQuit', label: '下班时间' },
+          { key: 'setting', label: '设置' },
+        ],
+        loading:false
+      }
+    },
+  }
+</script>
+
+<style scoped>
+.addPointBtn{
+  margin-left: 12px;
+}
+</style>

+ 45 - 0
src/pages/attendanceSetting/attendancePoint/module/addPointBtn.vue

@@ -0,0 +1,45 @@
+
+<template>
+  <div class="opBtn">
+    <VaButton :round="false" color="info" gradient @click="showModal = true"> 新增考勤点</VaButton>
+    <VaModal :modelValue="showModal" :noDismiss="true" blur @cancel='showModal=false' @ok="submit" ok-text="提交" cancelText="取消">
+      <h3 class="va-h3">考勤点信息</h3>
+      <pointForm ref="pointForm"></pointForm>
+    </VaModal>
+  </div>
+</template>
+
+<script>
+  import pointForm from './pointForm.vue'
+  export default {
+    name: 'addPointBtn',
+    components: {
+      pointForm,
+    },
+    methods: {
+      submit() {
+        let params = {
+          ...this.$refs.pointForm.form
+        }
+        this.$api.addWorkPoint(params).then(res=>{
+          this.$toast.success({message:res.message})
+          this.showModal = false
+          this.$emit('after-op')
+        })
+      },
+    },
+    data() {
+      return {
+        showModal: false,
+      }
+    },
+  }
+</script>
+
+<style scoped>
+  .opBtn {
+    display: inline-block;
+    vertical-align: 11%;
+  }
+</style>
+

+ 32 - 0
src/pages/attendanceSetting/attendancePoint/module/deletePointBtn.vue

@@ -0,0 +1,32 @@
+
+<template>
+  <VaButton size="small" :round="false" color="danger" class="mr-6 mb-2" @click="goDelete" icon="delete">
+    删除
+  </VaButton>
+</template>
+
+<script>
+  export default {
+    name: 'deletePointBtn',
+    props: {
+      params: {
+        default: () => {},
+      },
+    },
+    methods: {
+      goDelete() {
+        this.$vaModal
+          .confirm({ message: '确定删除此打卡点?', title: '提醒?', size: 'medium', okText: '确定', cancelText: '取消' })
+          .then((ok) => {
+            let params = { id: this.params.id }
+            this.$api.deleteWorkPoint(params).then((res) => {
+              this.$toast.success({ message: res.message })
+              this.$emit('after-op')
+            })
+          })
+      },
+    },
+  }
+</script>
+
+<style scoped></style>

+ 57 - 0
src/pages/attendanceSetting/attendancePoint/module/editPointBtn.vue

@@ -0,0 +1,57 @@
+
+<template>
+  <div class='opBtn'>
+    <VaButton color="info" :round="false" size="small" icon="edit" class="mr-6 mb-2" @click="getPointDetial">
+      编辑考勤点
+    </VaButton>
+    <VaModal :modelValue="showModal" :noDismiss="true" blur @cancel='showModal=false' @ok="submit" ok-text="提交" cancelText="取消">
+      <h3 class="va-h3">考勤点信息</h3>
+      <pointForm ref="pointForm"></pointForm>
+    </VaModal>
+  </div>
+</template>
+
+<script>
+  import pointForm from './pointForm.vue'
+  export default {
+    name: 'editPointBtn',
+    props:{
+      params:{
+        default:()=>{}
+      }
+    },
+    components: {
+      pointForm,
+    },
+    methods: {
+      getPointDetial(){
+        this.showModal = true
+        this.$api.getWorkPointDetial({id:this.params.id}).then(res=>{
+          this.$refs.pointForm.setData(res.result)
+        })
+      },
+      submit() {
+        let params = {
+          id:this.params.id,
+          ...this.$refs.pointForm.form
+        }
+        this.$api.editWorkPoint(params).then(res=>{
+          this.$toast.success({message:res.message})
+          this.showModal = false
+          this.$emit('after-op')
+        })
+      },
+    },
+    data() {
+      return {
+        showModal: false,
+      }
+    },
+  }
+</script>
+
+<style scoped>
+
+</style>
+
+

+ 68 - 0
src/pages/attendanceSetting/attendancePoint/module/pointForm.vue

@@ -0,0 +1,68 @@
+<template>
+  <VaForm ref="myForm">
+    <div class="label">
+      <VaInput name="firstName" label="考勤点名称" v-model="form.addrName" />
+    </div>
+    <div class='label'>
+      <amap ref='amap' @drawEnd='drawEnd'></amap>
+    </div>
+    <div class="label">
+      <VaInput name="firstName" readonly label="考勤点经度" v-model="form.addrLng" />
+    </div>
+    <div class="label">
+      <VaInput name="firstName" readonly label="考勤点纬度" v-model="form.addrLat" />
+    </div>
+    <div class="label">
+      <VaInput name="firstName" readonly label="考勤范围" v-model="form.addrRange" />
+    </div>
+  </VaForm>
+</template>
+
+<script>
+  import amap from '../../../../components/amap.vue'
+  let defaultForm = {
+    addrLng: '',
+    addrLat: '',
+    addrRange: '',
+    addrName: '',
+  }
+  export default {
+    name: 'pointForm',
+    components:{
+      amap
+    },
+    methods: {
+      setData(data) {
+        Object.keys(this.form).forEach((x) => {
+          this.form[x] = data[x]
+        })
+        if(data.addrLng && data.addrLat && data.addrRange){
+          this.$refs.amap.setCircle({
+            center:[data.addrLng,data.addrLat],
+            radius:data.addrRange
+          })
+        }
+
+      },
+      drawEnd(data){
+        this.form.addrLng = data.center[0]
+        this.form.addrLat = data.center[1]
+        this.form.addrRange = data.radius
+      },
+    },
+    data() {
+      return {
+        form: {
+          ...defaultForm,
+        },
+      }
+    },
+  }
+</script>
+
+<style scoped>
+  .label {
+    margin-top: 20px;
+  }
+
+</style>

+ 59 - 0
src/pages/attendanceSetting/attendancePoint/module/setPointTimeBtn.vue

@@ -0,0 +1,59 @@
+<template>
+  <div class="opBtn">
+    <VaButton color="info" :round="false" size="small" icon="edit" class="mr-6 mb-2" @click="setTime">
+      设置考勤时间
+    </VaButton>
+    <VaModal
+      :modelValue="showModal"
+      :noDismiss="true"
+      @cancel="showModal = false"
+      @ok="submit"
+      ok-text="提交"
+      cancelText="取消"
+    >
+      <h3 class="va-h3">打卡时间设置</h3>
+      <timeForm ref="timeForm"></timeForm>
+    </VaModal>
+  </div>
+</template>
+
+<script>
+  import timeForm from './timeForm.vue'
+  export default {
+    name: 'setPointTimeBtn',
+    components:{timeForm},
+    props:{
+      params:{
+        default:()=>{}
+      }
+    },
+    methods:{
+      setTime(){
+        this.showModal = true
+        this.$nextTick(()=>{
+          this.$refs.timeForm.setData(this.params)
+        })
+      },
+      submit(){
+        let params = {
+          id:this.params.id,
+          ...this.$refs.timeForm.getData()
+        }
+        this.$api.editWorkPoint(params).then(res=>{
+          this.$toast.success({message:res.message})
+          this.$emit('after-op')
+          this.showModal = false
+        })
+      },
+    },
+    data(){
+      return {
+        showModal:false
+      }
+    },
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 52 - 0
src/pages/attendanceSetting/attendancePoint/module/timeForm.vue

@@ -0,0 +1,52 @@
+
+<template>
+  <VaForm ref="myForm">
+    <div class="label">
+      <VaTimeInput  v-model="form.addrIn" label='上班打卡时间' class='input'/>
+    </div>
+    <div class="label">
+      <VaTimeInput  v-model="form.addrQuit" label='下班打卡时间'  class='input'/>
+    </div>
+  </VaForm>
+</template>
+
+<script>
+  let defaultForm = {
+    addrIn: '',
+    addrQuit: '',
+  }
+  export default {
+    name: 'timeForm',
+    methods: {
+      setData(data) {
+        Object.keys(this.form).forEach((x) => {
+          this.form[x] = data[x]? new Date(parseInt(data[x])):''
+        })
+      },
+      getData(){
+        return {
+          addrIn: this.form.addrIn.getTime() %  86400000,
+          addrQuit: this.form.addrQuit.getTime() %  86400000
+        }
+      },
+    },
+    data() {
+      return {
+        form: {
+          ...defaultForm,
+        },
+      }
+    },
+  }
+</script>
+
+<style scoped>
+  .label {
+    margin-top: 20px;
+    /*display: flex;*/
+  }
+  .input{
+    width: 100%;
+  }
+</style>
+

+ 34 - 24
src/pages/attendanceSetting/module/searchForm.vue

@@ -1,28 +1,29 @@
 <template>
   <va-card class="col-span-12">
     <!--    <va-card-title>测试</va-card-title>-->
-    <div class="searchBox">
-      <VaInput v-if="keys.includes('userName')" v-model="form.firstName" class="input" label="用户名" />
+    <div class="searchBox" @keypress="keypress">
+      <VaInput v-if="keys.includes('userName')" v-model="form.addrName" class="input" label="用户名" />
+      <VaInput v-if="keys.includes('addrName')" v-model="form.addrName" class="input" label="考勤点名称" />
 
-      <VaDateInput
-        class="input"
-        v-if="keys.includes('month')"
-        manual-input
-        :format="format"
-        label="选择月份"
-        type="month"
-      />
-      <VaDateInput
-        class="input"
-        label="选择时间段"
-        v-model="value"
-        :readonly="false"
-        :format-date="formatDate"
-        :parse-date="parseDate"
-      />
+<!--      <VaDateInput-->
+<!--        class="input"-->
+<!--        v-if="keys.includes('month')"-->
+<!--        manual-input-->
+<!--        :format="format"-->
+<!--        label="选择月份"-->
+<!--        type="month"-->
+<!--      />-->
+<!--      <VaDateInput-->
+<!--        class="input"-->
+<!--        label="选择时间段"-->
+<!--        v-model="value"-->
+<!--        :readonly="false"-->
+<!--        :format-date="formatDate"-->
+<!--        :parse-date="parseDate"-->
+<!--      />-->
       <div class="btn-box">
-        <VaButton :round="false" icon="search"> 搜索</VaButton>
-        <VaButton :round="false" icon="refresh" preset="secondary" border-color="primary" style="margin-left: 10px">
+        <VaButton :round="false" icon="search" @click="$emit('on-search')"> 搜索</VaButton>
+        <VaButton :round="false"   @click="clear" icon="refresh" preset="secondary" border-color="primary" style="margin-left: 10px">
           重置
         </VaButton>
         <slot></slot>
@@ -38,7 +39,9 @@
     return d
   }
   const nextWeek = datePlusDay(new Date(), 7)
-
+  let defaultForm = {
+    addrName:''
+  }
   export default {
     name: 'searchForm',
     props: {
@@ -50,12 +53,20 @@
       return {
         value: { start: new Date(), end: nextWeek },
         form: {
-          firstName: '',
-          lastName: '',
+          ...defaultForm
         },
       }
     },
     methods: {
+      keypress(v) {
+        if (v.keyCode == 13) {
+          this.$emit('on-search')
+        }
+      },
+      clear() {
+        this.form = { ...defaultForm }
+        this.$emit('on-search')
+      },
       formatDate(date) {
         return `${date.getDate()}/${date.getMonth() + 1}/${date.getFullYear()}`
       },
@@ -88,6 +99,5 @@
     //width: 200px;
     display: flex;
     align-items: center;
-    margin-top: 18px;
   }
 </style>

+ 2 - 0
src/pages/auth/login/Login.vue

@@ -100,6 +100,8 @@
     $api
       .login(params)
       .then((res) => {
+        localStorage.setItem('tokenName',res.result.tokenName)
+        localStorage.setItem('tokenValue',res.result.tokenValue)
         loading.value = false
         $toast.success({ message: '登录成功' })
         setTimeout(() => {

+ 0 - 21
src/pages/system/roleManage/index.vue

@@ -5,27 +5,6 @@
     </searchForm>
     <VaCard tag="b" class="table">
       <div class="va-table-responsive">
-        <!--        <table class="va-table">-->
-        <!--          <thead>-->
-        <!--          <tr>-->
-        <!--            <th>角色名称</th>-->
-        <!--            <th>设置</th>-->
-        <!--          </tr>-->
-        <!--          </thead>-->
-        <!--          <tbody>-->
-        <!--          <tr-->
-        <!--            v-for="user in users"-->
-        <!--            :key="user.id"-->
-        <!--          >-->
-        <!--            <td>{{ user.fullName }}</td>-->
-        <!--            <td>-->
-        <!--              <permissionSetting></permissionSetting>-->
-        <!--              <previewManByRoleBtn></previewManByRoleBtn>-->
-        <!--              <deleteRoleBtn></deleteRoleBtn>-->
-        <!--            </td>-->
-        <!--          </tr>-->
-        <!--          </tbody>-->
-        <!--        </table>-->
         <VaDataTable :items="users" :columns="columns" :loading="loading">
           <template #cell(setting)="{ rowData }">
             <permissionSetting :params="rowData"></permissionSetting>

+ 1 - 0
src/pages/system/userManage/module/addUserBtn.vue

@@ -36,6 +36,7 @@
         let params = { ...this.$refs.userForm.getData(), orgId: this.orgId }
         this.$api.addUser(params).then((res) => {
           this.$toast.success({ message: res.message })
+          this.showModal =false
           this.$emit('after-op')
         })
       },

+ 2 - 2
src/pages/system/userManage/module/userForm.vue

@@ -19,7 +19,7 @@
       <VaInput name="email" v-model="form.email" label="邮箱" />
     </div>
     <div class="label">
-      <VaDateInput :format="formatFn" :formatDate="formatFn" class="input" v-model="form.birthDate" label="生日" />
+      <VaDateInput class="input" v-model="form.birthDate" label="生日" />
     </div>
   </VaForm>
 </template>
@@ -30,7 +30,7 @@
     userName: '',
     phone: '',
     email: '',
-    birthDate: '',
+    birthDate: new Date(),
     roleId: [],
     gender: '男',
   }

+ 3 - 16
src/pages/system/userManage/module/workSpace.vue

@@ -43,8 +43,8 @@
             <editUserBtn :params="rowData"></editUserBtn>
             <deleteUserBtn @after-op="afterOp" :params="rowData"></deleteUserBtn>
           </template>
-          <template #cell(status)="{ value }">
-            <VaChip size="small" :color="'success'" class="mr-6 mb-2"> 使用中 </VaChip>
+          <template #cell(birthDate)="{ value }">
+            <VaChip size="small" :color="'success'" class="mr-6 mb-2"> {{value}} </VaChip>
           </template>
         </VaDataTable>
       </div>
@@ -120,18 +120,5 @@
 </script>
 
 <style scoped lang="less">
-  .workSpace {
-    width: 100%;
-    flex: 1;
-  }
-  .table {
-    margin-top: 20px;
-    width: 100%;
-  }
-  .va-table-responsive {
-    width: 100%;
-  }
-  .va-table {
-    width: 100%;
-  }
+
 </style>

+ 4 - 5
src/router/index.ts

@@ -73,11 +73,10 @@ const routes: Array<RouteRecordRaw> = [
             meta: {
               wikiLink: 'https://github.com/epicmaxco/vuestic-admin/wiki/Charts',
             },
-          },
-          {
-            name: 'roleManage',
-            path: 'roleManage',
-            component: () => import('../pages/system/roleManage/index.vue'),
+          }, {
+            name: 'attendancePoint',
+            path: 'attendancePoint',
+            component: () => import('../pages/attendanceSetting/attendancePoint/index.vue'),
             meta: {
               wikiLink: 'https://github.com/epicmaxco/vuestic-admin/wiki/Charts',
             },

+ 1 - 2
vite.config.ts

@@ -3,7 +3,6 @@ import vue from '@vitejs/plugin-vue'
 import { resolve, dirname } from 'node:path'
 import { fileURLToPath } from 'url'
 import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite'
-
 // https://vitejs.dev/config/
 export default defineConfig({
   server: {
@@ -25,6 +24,6 @@ export default defineConfig({
     vue(),
     VueI18nPlugin({
       include: resolve(dirname(fileURLToPath(import.meta.url)), './src/i18n/locales/**'),
-    }),
+    })
   ],
 })