Commit 59fd57592d4cc5c696b733ee493ef0c58b30805c

Authored by 王彪总
1 parent 8a1d70bb

feat(map): 替换腾讯地图为高德地图并优化检查点功能

- 将腾讯地图API替换为高德地图API
- 移除检查点经纬度输入框的禁用状态
- 重构地图组件中的标记点和路径绘制逻辑
- 添加地图覆盖物清理功能
- 更新登录页面UI设计
- 修改系统标题和公司名称显示
- 添加property路由模块
- 修复API请求参数中的硬编码值
install.md
1   -# HC 小区管理系统前段安装教程
  1 +# 西荣物业 小区管理系统前段安装教程
2 2 ## 一、项目构建
3 3 ### 1. 安装依赖
4 4 ```bash
... ... @@ -37,4 +37,4 @@ server {
37 37 proxy_pass http://192.168.1.109:8008;
38 38 }
39 39 }
40   -```
41 40 \ No newline at end of file
  41 +```
... ...
package-lock.json
1 1 {
2   - "name": "micro-community-web",
  2 + "name": "xirong_property",
3 3 "version": "1.0.0",
4 4 "lockfileVersion": 3,
5 5 "requires": true,
6 6 "packages": {
7 7 "": {
8   - "name": "micro-community-web",
  8 + "name": "xirong_property",
9 9 "version": "1.0.0",
10 10 "dependencies": {
11 11 "@tinymce/tinymce-vue": "^3.2.8",
12 12 "axios": "^0.21.1",
13 13 "echarts": "^5.6.0",
14 14 "element-ui": "^2.15.6",
15   - "formiojs": "^4.21.7",
16 15 "qrcodejs2": "^0.0.2",
17 16 "tinymce": "^5.10.7",
18 17 "vue": "^2.6.14",
... ... @@ -1572,47 +1571,6 @@
1572 1571 "node": ">=6.9.0"
1573 1572 }
1574 1573 },
1575   - "node_modules/@formio/bootstrap3": {
1576   - "version": "2.12.4-rc.1",
1577   - "resolved": "https://registry.npmjs.org/@formio/bootstrap3/-/bootstrap3-2.12.4-rc.1.tgz",
1578   - "integrity": "sha512-4B5rs+w9tAk5i+wbdw2/NrTxPqnDX7/W19tiTd9lfXnIGQmaj0ecMEVqDmOJg8pIlyU02g3c4ih6JnA/JVmUbA==",
1579   - "dependencies": {
1580   - "resize-observer-polyfill": "^1.5.1"
1581   - }
1582   - },
1583   - "node_modules/@formio/choices.js": {
1584   - "version": "10.2.1",
1585   - "resolved": "https://registry.npmjs.org/@formio/choices.js/-/choices.js-10.2.1.tgz",
1586   - "integrity": "sha512-NCE5u7jG3XGokJP16MyAbVSUptKu/mpJYAxd4PPIoLiO/l9Do5uoOQ0MgNb9qG9qABJiOX+qNRE8q8RybY/SwQ==",
1587   - "dependencies": {
1588   - "deepmerge": "^4.2.2",
1589   - "fuse.js": "^6.6.2",
1590   - "redux": "^4.2.0"
1591   - }
1592   - },
1593   - "node_modules/@formio/choices.js/node_modules/deepmerge": {
1594   - "version": "4.3.1",
1595   - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
1596   - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
1597   - "engines": {
1598   - "node": ">=0.10.0"
1599   - }
1600   - },
1601   - "node_modules/@formio/semantic": {
1602   - "version": "2.6.1",
1603   - "resolved": "https://registry.npmjs.org/@formio/semantic/-/semantic-2.6.1.tgz",
1604   - "integrity": "sha512-obp1BT5UnzD+uYBbqmnsTfO2hGxI2A2iR/cj3P5JUFLYSBpnr3TS2ShQ7Ee5GCRRtJPu0JnljuJj+YSKLCMuhg=="
1605   - },
1606   - "node_modules/@formio/text-mask-addons": {
1607   - "version": "3.8.0-formio.4",
1608   - "resolved": "https://registry.npmjs.org/@formio/text-mask-addons/-/text-mask-addons-3.8.0-formio.4.tgz",
1609   - "integrity": "sha512-vhkeIyuL+1rtC9S4IW8O3JCwroPtvJrkrcMO4wyELNqMIgQRKbiyBAitZfUP4tY04xdB5lxAinbzdwb+NMdX6w=="
1610   - },
1611   - "node_modules/@formio/vanilla-text-mask": {
1612   - "version": "5.1.1-formio.1",
1613   - "resolved": "https://registry.npmjs.org/@formio/vanilla-text-mask/-/vanilla-text-mask-5.1.1-formio.1.tgz",
1614   - "integrity": "sha512-rYBlvIPMNUd6sAaduOaiIwI4vfTAjHDRonko2qJn2RP1O//TQ7rcFIPYVYePJZ4OtOpwHiHAvAIh79McphZotQ=="
1615   - },
1616 1574 "node_modules/@hapi/address": {
1617 1575 "version": "2.1.4",
1618 1576 "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz",
... ... @@ -2111,15 +2069,6 @@
2111 2069 "node": ">=8.0"
2112 2070 }
2113 2071 },
2114   - "node_modules/@popperjs/core": {
2115   - "version": "2.11.8",
2116   - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
2117   - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
2118   - "funding": {
2119   - "type": "opencollective",
2120   - "url": "https://opencollective.com/popperjs"
2121   - }
2122   - },
2123 2072 "node_modules/@soda/friendly-errors-webpack-plugin": {
2124 2073 "version": "1.8.1",
2125 2074 "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz",
... ... @@ -2144,11 +2093,6 @@
2144 2093 "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==",
2145 2094 "dev": true
2146 2095 },
2147   - "node_modules/@sphinxxxx/color-conversion": {
2148   - "version": "2.2.2",
2149   - "resolved": "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz",
2150   - "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw=="
2151   - },
2152 2096 "node_modules/@tinymce/tinymce-vue": {
2153 2097 "version": "3.2.8",
2154 2098 "resolved": "https://registry.npmjs.org/@tinymce/tinymce-vue/-/tinymce-vue-3.2.8.tgz",
... ... @@ -2324,12 +2268,6 @@
2324 2268 "integrity": "sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==",
2325 2269 "dev": true
2326 2270 },
2327   - "node_modules/@types/trusted-types": {
2328   - "version": "2.0.7",
2329   - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
2330   - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
2331   - "optional": true
2332   - },
2333 2271 "node_modules/@types/uglify-js": {
2334 2272 "version": "3.17.5",
2335 2273 "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.5.tgz",
... ... @@ -3197,11 +3135,6 @@
3197 3135 "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
3198 3136 "dev": true
3199 3137 },
3200   - "node_modules/abortcontroller-polyfill": {
3201   - "version": "1.7.8",
3202   - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.8.tgz",
3203   - "integrity": "sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ=="
3204   - },
3205 3138 "node_modules/accepts": {
3206 3139 "version": "1.3.8",
3207 3140 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
... ... @@ -3294,11 +3227,6 @@
3294 3227 "integrity": "sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==",
3295 3228 "dev": true
3296 3229 },
3297   - "node_modules/animation-frame-polyfill": {
3298   - "version": "1.0.2",
3299   - "resolved": "https://registry.npmjs.org/animation-frame-polyfill/-/animation-frame-polyfill-1.0.2.tgz",
3300   - "integrity": "sha512-PvO5poSMoHhaoNNgHPo+oqs/0L9UqjsUbqv0iOXVqLh6HX85fsOVQTUrzSBvjdZz7hydARlgLELyzJJKIrPJAQ=="
3301   - },
3302 3230 "node_modules/ansi-colors": {
3303 3231 "version": "3.2.4",
3304 3232 "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
... ... @@ -3462,11 +3390,6 @@
3462 3390 "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
3463 3391 "dev": true
3464 3392 },
3465   - "node_modules/array-from": {
3466   - "version": "2.1.1",
3467   - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz",
3468   - "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg=="
3469   - },
3470 3393 "node_modules/array-union": {
3471 3394 "version": "1.0.2",
3472 3395 "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
... ... @@ -3665,11 +3588,6 @@
3665 3588 "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
3666 3589 "dev": true
3667 3590 },
3668   - "node_modules/atoa": {
3669   - "version": "1.0.0",
3670   - "resolved": "https://registry.npmjs.org/atoa/-/atoa-1.0.0.tgz",
3671   - "integrity": "sha512-VVE1H6cc4ai+ZXo/CRWoJiHXrA1qfA31DPnx6D20+kSI547hQN5Greh51LQ1baMRMfxO5K5M4ImMtZbZt2DODQ=="
3672   - },
3673 3591 "node_modules/atob": {
3674 3592 "version": "2.1.2",
3675 3593 "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
... ... @@ -3682,11 +3600,6 @@
3682 3600 "node": ">= 4.5.0"
3683 3601 }
3684 3602 },
3685   - "node_modules/autocompleter": {
3686   - "version": "7.1.0",
3687   - "resolved": "https://registry.npmjs.org/autocompleter/-/autocompleter-7.1.0.tgz",
3688   - "integrity": "sha512-uCToOnq7eAD/GJAteDbYuQ7ksDtrYWOy5CIAq43wh0dT+5frMpPlyD9tp+y5fz8KIcsP+zR2MjzoTAdW5aJESw=="
3689   - },
3690 3603 "node_modules/autoprefixer": {
3691 3604 "version": "9.8.8",
3692 3605 "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz",
... ... @@ -4135,19 +4048,6 @@
4135 4048 "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
4136 4049 "dev": true
4137 4050 },
4138   - "node_modules/browser-cookies": {
4139   - "version": "1.2.0",
4140   - "resolved": "https://registry.npmjs.org/browser-cookies/-/browser-cookies-1.2.0.tgz",
4141   - "integrity": "sha512-cg2WuoOJo+F+g2XjEaP8nmeRp1vDHjt7sqpKJMsTNXKrpyIBNVslYJeehvs6FEddj8usV2+qyRSBEX244yN5/g=="
4142   - },
4143   - "node_modules/browser-md5-file": {
4144   - "version": "1.1.1",
4145   - "resolved": "https://registry.npmjs.org/browser-md5-file/-/browser-md5-file-1.1.1.tgz",
4146   - "integrity": "sha512-9h2UViTtZPhBa7oHvp5mb7MvJaX5OKEPUsplDwJ800OIV+In7BOR3RXOMB78obn2iQVIiS3WkVLhG7Zu1EMwbw==",
4147   - "dependencies": {
4148   - "spark-md5": "^2.0.2"
4149   - }
4150   - },
4151 4051 "node_modules/browserify-aes": {
4152 4052 "version": "1.2.0",
4153 4053 "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
... ... @@ -5087,11 +4987,6 @@
5087 4987 "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
5088 4988 "dev": true
5089 4989 },
5090   - "node_modules/compare-versions": {
5091   - "version": "5.0.3",
5092   - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.3.tgz",
5093   - "integrity": "sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A=="
5094   - },
5095 4990 "node_modules/component-emitter": {
5096 4991 "version": "1.3.1",
5097 4992 "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz",
... ... @@ -5271,15 +5166,6 @@
5271 5166 "node": ">= 0.6"
5272 5167 }
5273 5168 },
5274   - "node_modules/contra": {
5275   - "version": "1.9.4",
5276   - "resolved": "https://registry.npmjs.org/contra/-/contra-1.9.4.tgz",
5277   - "integrity": "sha512-N9ArHAqwR/lhPq4OdIAwH4e1btn6EIZMAz4TazjnzCiVECcWUPTma+dRAM38ERImEJBh8NiCCpjoQruSZ+agYg==",
5278   - "dependencies": {
5279   - "atoa": "1.0.0",
5280   - "ticky": "1.0.1"
5281   - }
5282   - },
5283 5169 "node_modules/convert-source-map": {
5284 5170 "version": "2.0.0",
5285 5171 "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
... ... @@ -5627,14 +5513,6 @@
5627 5513 "sha.js": "^2.4.8"
5628 5514 }
5629 5515 },
5630   - "node_modules/create-point-cb": {
5631   - "version": "1.2.0",
5632   - "resolved": "https://registry.npmjs.org/create-point-cb/-/create-point-cb-1.2.0.tgz",
5633   - "integrity": "sha512-r4l6IO/YGI7hIZRMLggOzwM6XO80+Fdcv4hx1fXCEdU+hKd7zZki6i+cbYfK9OliMwMYx1wPfQLU/snvS+Dygw==",
5634   - "dependencies": {
5635   - "type-func": "^1.0.1"
5636   - }
5637   - },
5638 5516 "node_modules/cross-spawn": {
5639 5517 "version": "6.0.6",
5640 5518 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz",
... ... @@ -5660,14 +5538,6 @@
5660 5538 "semver": "bin/semver"
5661 5539 }
5662 5540 },
5663   - "node_modules/crossvent": {
5664   - "version": "1.5.5",
5665   - "resolved": "https://registry.npmjs.org/crossvent/-/crossvent-1.5.5.tgz",
5666   - "integrity": "sha512-MY4xhBYEnVi+pmTpHCOCsCLYczc0PVtGdPBz6NXNXxikLaUZo4HdAeUb1UqAo3t3yXAloSelTmfxJ+/oUqkW5w==",
5667   - "dependencies": {
5668   - "custom-event": "^1.0.0"
5669   - }
5670   - },
5671 5541 "node_modules/crypto-browserify": {
5672 5542 "version": "3.12.1",
5673 5543 "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz",
... ... @@ -5963,16 +5833,6 @@
5963 5833 "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
5964 5834 "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
5965 5835 },
5966   - "node_modules/custom-event": {
5967   - "version": "1.0.1",
5968   - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
5969   - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg=="
5970   - },
5971   - "node_modules/custom-event-polyfill": {
5972   - "version": "1.0.7",
5973   - "resolved": "https://registry.npmjs.org/custom-event-polyfill/-/custom-event-polyfill-1.0.7.tgz",
5974   - "integrity": "sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w=="
5975   - },
5976 5836 "node_modules/cyclist": {
5977 5837 "version": "1.0.2",
5978 5838 "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz",
... ... @@ -6416,11 +6276,6 @@
6416 6276 "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
6417 6277 "dev": true
6418 6278 },
6419   - "node_modules/dialog-polyfill": {
6420   - "version": "0.5.6",
6421   - "resolved": "https://registry.npmjs.org/dialog-polyfill/-/dialog-polyfill-0.5.6.tgz",
6422   - "integrity": "sha512-ZbVDJI9uvxPAKze6z146rmfUZjBqNEwcnFTVamQzXH+svluiV7swmVIGr7miwADgfgt1G2JQIytypM9fbyhX4w=="
6423   - },
6424 6279 "node_modules/diffie-hellman": {
6425 6280 "version": "5.0.3",
6426 6281 "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
... ... @@ -6487,19 +6342,6 @@
6487 6342 "node": ">=6.0.0"
6488 6343 }
6489 6344 },
6490   - "node_modules/dom-autoscroller": {
6491   - "version": "2.3.4",
6492   - "resolved": "https://registry.npmjs.org/dom-autoscroller/-/dom-autoscroller-2.3.4.tgz",
6493   - "integrity": "sha512-HcAdt/2Dq9x4CG6LWXc2x9Iq0MJPAu8fuzHncclq7byufqYEYVtx9sZ/dyzR+gdj4qwEC9p27Lw1G2HRRYX6jQ==",
6494   - "dependencies": {
6495   - "animation-frame-polyfill": "^1.0.0",
6496   - "create-point-cb": "^1.0.0",
6497   - "dom-mousemove-dispatcher": "^1.0.1",
6498   - "dom-plane": "^1.0.1",
6499   - "dom-set": "^1.0.1",
6500   - "type-func": "^1.0.1"
6501   - }
6502   - },
6503 6345 "node_modules/dom-converter": {
6504 6346 "version": "0.2.0",
6505 6347 "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
... ... @@ -6509,19 +6351,6 @@
6509 6351 "utila": "~0.4"
6510 6352 }
6511 6353 },
6512   - "node_modules/dom-mousemove-dispatcher": {
6513   - "version": "1.0.1",
6514   - "resolved": "https://registry.npmjs.org/dom-mousemove-dispatcher/-/dom-mousemove-dispatcher-1.0.1.tgz",
6515   - "integrity": "sha512-NMdqqMbgW8kqOdmod2hkS+9hD/v7h4XoSvwU9qqe+wAA/O+ba0jhpbfW0Kb/fCyR0RX9jf4dwfQrl04LQX4FzQ=="
6516   - },
6517   - "node_modules/dom-plane": {
6518   - "version": "1.0.2",
6519   - "resolved": "https://registry.npmjs.org/dom-plane/-/dom-plane-1.0.2.tgz",
6520   - "integrity": "sha512-/tR67G6ZGSciXoZLsD706yLxEXvX3mG/OWE8YNYj3A1yU/RAimtPXzklVTu5Y5xoeMoloA/Y+MaNjQm9apgAww==",
6521   - "dependencies": {
6522   - "create-point-cb": "^1.0.0"
6523   - }
6524   - },
6525 6354 "node_modules/dom-serializer": {
6526 6355 "version": "1.4.1",
6527 6356 "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
... ... @@ -6545,16 +6374,6 @@
6545 6374 "url": "https://github.com/fb55/entities?sponsor=1"
6546 6375 }
6547 6376 },
6548   - "node_modules/dom-set": {
6549   - "version": "1.1.1",
6550   - "resolved": "https://registry.npmjs.org/dom-set/-/dom-set-1.1.1.tgz",
6551   - "integrity": "sha512-sUi2aSvRsK3Ixx++gwX9cnaWk9ZxGVFry8+HnTRVmDimybU5PaiI4wX0o00mVtjFKlQNZLmtGoPTLorYbN0+Rw==",
6552   - "dependencies": {
6553   - "array-from": "^2.1.1",
6554   - "is-array": "^1.0.1",
6555   - "iselement": "^1.1.4"
6556   - }
6557   - },
6558 6377 "node_modules/domain-browser": {
6559 6378 "version": "1.2.0",
6560 6379 "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
... ... @@ -6592,14 +6411,6 @@
6592 6411 "url": "https://github.com/fb55/domhandler?sponsor=1"
6593 6412 }
6594 6413 },
6595   - "node_modules/dompurify": {
6596   - "version": "3.2.6",
6597   - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz",
6598   - "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==",
6599   - "optionalDependencies": {
6600   - "@types/trusted-types": "^2.0.7"
6601   - }
6602   - },
6603 6414 "node_modules/domutils": {
6604 6415 "version": "2.8.0",
6605 6416 "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
... ... @@ -6641,20 +6452,6 @@
6641 6452 "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
6642 6453 "dev": true
6643 6454 },
6644   - "node_modules/downloadjs": {
6645   - "version": "1.4.7",
6646   - "resolved": "https://registry.npmjs.org/downloadjs/-/downloadjs-1.4.7.tgz",
6647   - "integrity": "sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q=="
6648   - },
6649   - "node_modules/dragula": {
6650   - "version": "3.7.3",
6651   - "resolved": "https://registry.npmjs.org/dragula/-/dragula-3.7.3.tgz",
6652   - "integrity": "sha512-/rRg4zRhcpf81TyDhaHLtXt6sEywdfpv1cRUMeFFy7DuypH2U0WUL0GTdyAQvXegviT4PJK4KuMmOaIDpICseQ==",
6653   - "dependencies": {
6654   - "contra": "1.9.4",
6655   - "crossvent": "1.5.5"
6656   - }
6657   - },
6658 6455 "node_modules/dunder-proto": {
6659 6456 "version": "1.0.1",
6660 6457 "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
... ... @@ -7449,7 +7246,8 @@
7449 7246 "node_modules/eventemitter3": {
7450 7247 "version": "4.0.7",
7451 7248 "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
7452   - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
  7249 + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
  7250 + "dev": true
7453 7251 },
7454 7252 "node_modules/events": {
7455 7253 "version": "3.3.0",
... ... @@ -7769,12 +7567,8 @@
7769 7567 "node_modules/fast-deep-equal": {
7770 7568 "version": "3.1.3",
7771 7569 "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
7772   - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
7773   - },
7774   - "node_modules/fast-diff": {
7775   - "version": "1.3.0",
7776   - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
7777   - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="
  7570 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
  7571 + "dev": true
7778 7572 },
7779 7573 "node_modules/fast-glob": {
7780 7574 "version": "2.2.7",
... ... @@ -7793,11 +7587,6 @@
7793 7587 "node": ">=4.0.0"
7794 7588 }
7795 7589 },
7796   - "node_modules/fast-json-patch": {
7797   - "version": "3.1.1",
7798   - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz",
7799   - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ=="
7800   - },
7801 7590 "node_modules/fast-json-stable-stringify": {
7802 7591 "version": "2.1.0",
7803 7592 "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
... ... @@ -7822,14 +7611,6 @@
7822 7611 "node": ">=0.8.0"
7823 7612 }
7824 7613 },
7825   - "node_modules/fetch-ponyfill": {
7826   - "version": "7.1.0",
7827   - "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-7.1.0.tgz",
7828   - "integrity": "sha512-FhbbL55dj/qdVO3YNK7ZEkshvj3eQ7EuIGV2I6ic/2YiocvyWv+7jg2s4AyS0wdRU75s3tA8ZxI/xPigb0v5Aw==",
7829   - "dependencies": {
7830   - "node-fetch": "~2.6.1"
7831   - }
7832   - },
7833 7614 "node_modules/figgy-pudding": {
7834 7615 "version": "3.5.2",
7835 7616 "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
... ... @@ -8130,63 +7911,6 @@
8130 7911 "node": ">= 0.12"
8131 7912 }
8132 7913 },
8133   - "node_modules/formiojs": {
8134   - "version": "4.21.7",
8135   - "resolved": "https://registry.npmjs.org/formiojs/-/formiojs-4.21.7.tgz",
8136   - "integrity": "sha512-DDXPhXABxdEbpyfv0C8SAS6zt92luGFXqe0usPHxSHvlP960GQkhS//WV7TAMrRsjj1WTIqqv3XZha8qTknG3Q==",
8137   - "dependencies": {
8138   - "@formio/bootstrap3": "2.12.4-rc.1",
8139   - "@formio/choices.js": "10.2.1",
8140   - "@formio/semantic": "2.6.1",
8141   - "@formio/text-mask-addons": "^3.8.0-formio.4",
8142   - "@formio/vanilla-text-mask": "^5.1.1-formio.1",
8143   - "abortcontroller-polyfill": "^1.7.5",
8144   - "autocompleter": "^7.0.1",
8145   - "browser-cookies": "^1.2.0",
8146   - "browser-md5-file": "^1.1.1",
8147   - "compare-versions": "^5.0.1",
8148   - "core-js": "^3.26.1",
8149   - "custom-event-polyfill": "^1.0.7",
8150   - "dialog-polyfill": "^0.5.6",
8151   - "dom-autoscroller": "^2.3.4",
8152   - "dompurify": "^3.0.5",
8153   - "downloadjs": "^1.4.7",
8154   - "dragula": "^3.7.3",
8155   - "eventemitter3": "^4.0.7",
8156   - "fast-deep-equal": "^3.1.3",
8157   - "fast-json-patch": "^3.1.1",
8158   - "fetch-ponyfill": "^7.1.0",
8159   - "i18next": "22.4.12",
8160   - "idb": "^7.1.1",
8161   - "inputmask": "^5.0.9",
8162   - "ismobilejs": "^1.1.1",
8163   - "json-logic-js": "^2.0.2",
8164   - "jstimezonedetect": "^1.0.7",
8165   - "jwt-decode": "^3.1.2",
8166   - "lodash": "^4.17.21",
8167   - "moment": "^2.29.4",
8168   - "moment-timezone": "^0.5.40",
8169   - "native-promise-only": "^0.8.1",
8170   - "quill": "^2.0.0-dev.3",
8171   - "signature_pad": "^4.1.4",
8172   - "string-hash": "^1.1.3",
8173   - "tippy.js": "^6.3.7",
8174   - "uuid": "^9.0.0",
8175   - "vanilla-picker": "^2.12.1"
8176   - }
8177   - },
8178   - "node_modules/formiojs/node_modules/uuid": {
8179   - "version": "9.0.1",
8180   - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
8181   - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
8182   - "funding": [
8183   - "https://github.com/sponsors/broofa",
8184   - "https://github.com/sponsors/ctavan"
8185   - ],
8186   - "bin": {
8187   - "uuid": "dist/bin/uuid"
8188   - }
8189   - },
8190 7914 "node_modules/forwarded": {
8191 7915 "version": "0.2.0",
8192 7916 "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
... ... @@ -8317,14 +8041,6 @@
8317 8041 "url": "https://github.com/sponsors/ljharb"
8318 8042 }
8319 8043 },
8320   - "node_modules/fuse.js": {
8321   - "version": "6.6.2",
8322   - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz",
8323   - "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==",
8324   - "engines": {
8325   - "node": ">=10"
8326   - }
8327   - },
8328 8044 "node_modules/gensync": {
8329 8045 "version": "1.0.0-beta.2",
8330 8046 "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
... ... @@ -9104,28 +8820,6 @@
9104 8820 "node": ">=8.12.0"
9105 8821 }
9106 8822 },
9107   - "node_modules/i18next": {
9108   - "version": "22.4.12",
9109   - "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.4.12.tgz",
9110   - "integrity": "sha512-2lE+vRXxQ3lGLub1CVbwgO0IfkLHmUSDVOAVdPh22CsxttMXi+35n2qgxh2wZIkKl6t/NMzPfgFPRDiFQOmiCg==",
9111   - "funding": [
9112   - {
9113   - "type": "individual",
9114   - "url": "https://locize.com"
9115   - },
9116   - {
9117   - "type": "individual",
9118   - "url": "https://locize.com/i18next.html"
9119   - },
9120   - {
9121   - "type": "individual",
9122   - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
9123   - }
9124   - ],
9125   - "dependencies": {
9126   - "@babel/runtime": "^7.20.6"
9127   - }
9128   - },
9129 8823 "node_modules/iconv-lite": {
9130 8824 "version": "0.4.24",
9131 8825 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
... ... @@ -9150,11 +8844,6 @@
9150 8844 "node": ">= 6"
9151 8845 }
9152 8846 },
9153   - "node_modules/idb": {
9154   - "version": "7.1.1",
9155   - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
9156   - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="
9157   - },
9158 8847 "node_modules/ieee754": {
9159 8848 "version": "1.2.1",
9160 8849 "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
... ... @@ -9345,11 +9034,6 @@
9345 9034 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
9346 9035 "dev": true
9347 9036 },
9348   - "node_modules/inputmask": {
9349   - "version": "5.0.9",
9350   - "resolved": "https://registry.npmjs.org/inputmask/-/inputmask-5.0.9.tgz",
9351   - "integrity": "sha512-s0lUfqcEbel+EQXtehXqwCJGShutgieOaIImFKC/r4reYNvX3foyrChl6LOEvaEgxEbesePIrw1Zi2jhZaDZbQ=="
9352   - },
9353 9037 "node_modules/inquirer": {
9354 9038 "version": "7.3.3",
9355 9039 "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
... ... @@ -9491,11 +9175,6 @@
9491 9175 "url": "https://github.com/sponsors/ljharb"
9492 9176 }
9493 9177 },
9494   - "node_modules/is-array": {
9495   - "version": "1.0.1",
9496   - "resolved": "https://registry.npmjs.org/is-array/-/is-array-1.0.1.tgz",
9497   - "integrity": "sha512-gxiZ+y/u67AzpeFmAmo4CbtME/bs7J2C++su5zQzvQyaxUqVzkh69DI+jN+KZuSO6JaH6TIIU6M6LhqxMjxEpw=="
9498   - },
9499 9178 "node_modules/is-array-buffer": {
9500 9179 "version": "3.0.5",
9501 9180 "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
... ... @@ -10100,22 +9779,12 @@
10100 9779 "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
10101 9780 "dev": true
10102 9781 },
10103   - "node_modules/iselement": {
10104   - "version": "1.1.4",
10105   - "resolved": "https://registry.npmjs.org/iselement/-/iselement-1.1.4.tgz",
10106   - "integrity": "sha512-4Q519eWmbHO1pbimiz7H1iJRUHVmAmfh0viSsUD+oAwVO4ntZt7gpf8i8AShVBTyOvRTZNYNBpUxOIvwZR+ffw=="
10107   - },
10108 9782 "node_modules/isexe": {
10109 9783 "version": "2.0.0",
10110 9784 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
10111 9785 "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
10112 9786 "dev": true
10113 9787 },
10114   - "node_modules/ismobilejs": {
10115   - "version": "1.1.1",
10116   - "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz",
10117   - "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw=="
10118   - },
10119 9788 "node_modules/isobject": {
10120 9789 "version": "3.0.1",
10121 9790 "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
... ... @@ -10183,11 +9852,6 @@
10183 9852 "node": ">=6"
10184 9853 }
10185 9854 },
10186   - "node_modules/json-logic-js": {
10187   - "version": "2.0.5",
10188   - "resolved": "https://registry.npmjs.org/json-logic-js/-/json-logic-js-2.0.5.tgz",
10189   - "integrity": "sha512-rTT2+lqcuUmj4DgWfmzupZqQDA64AdmYqizzMPWj3DxGdfFNsxPpcNVSaTj4l8W2tG/+hg7/mQhxjU3aPacO6g=="
10190   - },
10191 9855 "node_modules/json-parse-better-errors": {
10192 9856 "version": "1.0.2",
10193 9857 "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
... ... @@ -10260,16 +9924,6 @@
10260 9924 "node": ">=0.6.0"
10261 9925 }
10262 9926 },
10263   - "node_modules/jstimezonedetect": {
10264   - "version": "1.0.7",
10265   - "resolved": "https://registry.npmjs.org/jstimezonedetect/-/jstimezonedetect-1.0.7.tgz",
10266   - "integrity": "sha512-ARADHortktl9IZ1tr4GHwGPIAzgz3mLNCbR/YjWtRtc/O0o634O3NeFlpLjv95EvuDA5dc8z6yfgbS8nUc4zcQ=="
10267   - },
10268   - "node_modules/jwt-decode": {
10269   - "version": "3.1.2",
10270   - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz",
10271   - "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A=="
10272   - },
10273 9927 "node_modules/killable": {
10274 9928 "version": "1.0.1",
10275 9929 "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
... ... @@ -10431,18 +10085,14 @@
10431 10085 "node_modules/lodash": {
10432 10086 "version": "4.17.21",
10433 10087 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
10434   - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
  10088 + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
  10089 + "dev": true
10435 10090 },
10436 10091 "node_modules/lodash-es": {
10437 10092 "version": "4.17.21",
10438 10093 "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
10439 10094 "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
10440 10095 },
10441   - "node_modules/lodash.clonedeep": {
10442   - "version": "4.5.0",
10443   - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
10444   - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
10445   - },
10446 10096 "node_modules/lodash.debounce": {
10447 10097 "version": "4.0.8",
10448 10098 "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
... ... @@ -10455,12 +10105,6 @@
10455 10105 "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==",
10456 10106 "dev": true
10457 10107 },
10458   - "node_modules/lodash.isequal": {
10459   - "version": "4.5.0",
10460   - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
10461   - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
10462   - "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead."
10463   - },
10464 10108 "node_modules/lodash.kebabcase": {
10465 10109 "version": "4.1.1",
10466 10110 "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
... ... @@ -10963,25 +10607,6 @@
10963 10607 "mkdirp": "bin/cmd.js"
10964 10608 }
10965 10609 },
10966   - "node_modules/moment": {
10967   - "version": "2.30.1",
10968   - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
10969   - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
10970   - "engines": {
10971   - "node": "*"
10972   - }
10973   - },
10974   - "node_modules/moment-timezone": {
10975   - "version": "0.5.48",
10976   - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz",
10977   - "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==",
10978   - "dependencies": {
10979   - "moment": "^2.29.4"
10980   - },
10981   - "engines": {
10982   - "node": "*"
10983   - }
10984   - },
10985 10610 "node_modules/move-concurrently": {
10986 10611 "version": "1.0.1",
10987 10612 "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
... ... @@ -11085,11 +10710,6 @@
11085 10710 "node": ">=0.10.0"
11086 10711 }
11087 10712 },
11088   - "node_modules/native-promise-only": {
11089   - "version": "0.8.1",
11090   - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
11091   - "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg=="
11092   - },
11093 10713 "node_modules/natural-compare": {
11094 10714 "version": "1.4.0",
11095 10715 "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
... ... @@ -11133,25 +10753,6 @@
11133 10753 "dev": true,
11134 10754 "optional": true
11135 10755 },
11136   - "node_modules/node-fetch": {
11137   - "version": "2.6.13",
11138   - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz",
11139   - "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==",
11140   - "dependencies": {
11141   - "whatwg-url": "^5.0.0"
11142   - },
11143   - "engines": {
11144   - "node": "4.x || >=6.0.0"
11145   - },
11146   - "peerDependencies": {
11147   - "encoding": "^0.1.0"
11148   - },
11149   - "peerDependenciesMeta": {
11150   - "encoding": {
11151   - "optional": true
11152   - }
11153   - }
11154   - },
11155 10756 "node_modules/node-forge": {
11156 10757 "version": "0.10.0",
11157 10758 "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
... ... @@ -11879,11 +11480,6 @@
11879 11480 "no-case": "^2.2.0"
11880 11481 }
11881 11482 },
11882   - "node_modules/parchment": {
11883   - "version": "3.0.0",
11884   - "resolved": "https://registry.npmjs.org/parchment/-/parchment-3.0.0.tgz",
11885   - "integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A=="
11886   - },
11887 11483 "node_modules/parent-module": {
11888 11484 "version": "1.0.1",
11889 11485 "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
... ... @@ -13100,38 +12696,6 @@
13100 12696 "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
13101 12697 "dev": true
13102 12698 },
13103   - "node_modules/quill": {
13104   - "version": "2.0.3",
13105   - "resolved": "https://registry.npmjs.org/quill/-/quill-2.0.3.tgz",
13106   - "integrity": "sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw==",
13107   - "dependencies": {
13108   - "eventemitter3": "^5.0.1",
13109   - "lodash-es": "^4.17.21",
13110   - "parchment": "^3.0.0",
13111   - "quill-delta": "^5.1.0"
13112   - },
13113   - "engines": {
13114   - "npm": ">=8.2.3"
13115   - }
13116   - },
13117   - "node_modules/quill-delta": {
13118   - "version": "5.1.0",
13119   - "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz",
13120   - "integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==",
13121   - "dependencies": {
13122   - "fast-diff": "^1.3.0",
13123   - "lodash.clonedeep": "^4.5.0",
13124   - "lodash.isequal": "^4.5.0"
13125   - },
13126   - "engines": {
13127   - "node": ">= 12.0.0"
13128   - }
13129   - },
13130   - "node_modules/quill/node_modules/eventemitter3": {
13131   - "version": "5.0.1",
13132   - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
13133   - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
13134   - },
13135 12699 "node_modules/randombytes": {
13136 12700 "version": "2.1.0",
13137 12701 "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
... ... @@ -13245,14 +12809,6 @@
13245 12809 "node": ">=8.10.0"
13246 12810 }
13247 12811 },
13248   - "node_modules/redux": {
13249   - "version": "4.2.1",
13250   - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
13251   - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
13252   - "dependencies": {
13253   - "@babel/runtime": "^7.9.2"
13254   - }
13255   - },
13256 12812 "node_modules/reflect.getprototypeof": {
13257 12813 "version": "1.0.10",
13258 12814 "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
... ... @@ -14295,11 +13851,6 @@
14295 13851 "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
14296 13852 "dev": true
14297 13853 },
14298   - "node_modules/signature_pad": {
14299   - "version": "4.2.0",
14300   - "resolved": "https://registry.npmjs.org/signature_pad/-/signature_pad-4.2.0.tgz",
14301   - "integrity": "sha512-YLWysmaUBaC5wosAKkgbX7XI+LBv2w5L0QUcI6Jc4moHYzv9BUBJtAyNLpWzHjtjKTeWOH6bfP4a4pzf0UinfQ=="
14302   - },
14303 13854 "node_modules/simple-swizzle": {
14304 13855 "version": "0.2.2",
14305 13856 "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
... ... @@ -14635,11 +14186,6 @@
14635 14186 "deprecated": "See https://github.com/lydell/source-map-url#deprecated",
14636 14187 "dev": true
14637 14188 },
14638   - "node_modules/spark-md5": {
14639   - "version": "2.0.2",
14640   - "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-2.0.2.tgz",
14641   - "integrity": "sha512-9WfT+FYBEvlrOOBEs484/zmbtSX4BlGjzXih1qIEWA1yhHbcqgcMHkiwXoWk2Sq1aJjLpcs6ZKV7JxrDNjIlNg=="
14642   - },
14643 14189 "node_modules/spdx-correct": {
14644 14190 "version": "3.2.0",
14645 14191 "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
... ... @@ -14888,11 +14434,6 @@
14888 14434 "safe-buffer": "~5.1.0"
14889 14435 }
14890 14436 },
14891   - "node_modules/string-hash": {
14892   - "version": "1.1.3",
14893   - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
14894   - "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A=="
14895   - },
14896 14437 "node_modules/string-width": {
14897 14438 "version": "4.2.3",
14898 14439 "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
... ... @@ -15567,11 +15108,6 @@
15567 15108 "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
15568 15109 "dev": true
15569 15110 },
15570   - "node_modules/ticky": {
15571   - "version": "1.0.1",
15572   - "resolved": "https://registry.npmjs.org/ticky/-/ticky-1.0.1.tgz",
15573   - "integrity": "sha512-RX35iq/D+lrsqhcPWIazM9ELkjOe30MSeoBHQHSsRwd1YuhJO5ui1K1/R0r7N3mFvbLBs33idw+eR6j+w6i/DA=="
15574   - },
15575 15111 "node_modules/timers-browserify": {
15576 15112 "version": "2.0.12",
15577 15113 "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
... ... @@ -15595,14 +15131,6 @@
15595 15131 "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-5.10.7.tgz",
15596 15132 "integrity": "sha512-9UUjaO0R7FxcFo0oxnd1lMs7H+D0Eh+dDVo5hKbVe1a+VB0nit97vOqlinj+YwgoBDt6/DSCUoWqAYlLI8BLYA=="
15597 15133 },
15598   - "node_modules/tippy.js": {
15599   - "version": "6.3.7",
15600   - "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz",
15601   - "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==",
15602   - "dependencies": {
15603   - "@popperjs/core": "^2.9.0"
15604   - }
15605   - },
15606 15134 "node_modules/tmp": {
15607 15135 "version": "0.0.33",
15608 15136 "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
... ... @@ -15701,11 +15229,6 @@
15701 15229 "node": ">=0.8"
15702 15230 }
15703 15231 },
15704   - "node_modules/tr46": {
15705   - "version": "0.0.3",
15706   - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
15707   - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
15708   - },
15709 15232 "node_modules/tryer": {
15710 15233 "version": "1.0.1",
15711 15234 "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
... ... @@ -15780,11 +15303,6 @@
15780 15303 "url": "https://github.com/sponsors/sindresorhus"
15781 15304 }
15782 15305 },
15783   - "node_modules/type-func": {
15784   - "version": "1.0.3",
15785   - "resolved": "https://registry.npmjs.org/type-func/-/type-func-1.0.3.tgz",
15786   - "integrity": "sha512-YA90CUk+i00tWESPNRMahywXhAz+12NLJLKlOWrgHIbqaFXjdZrWstRghaibOW/IxhPjui4SmXxO/03XSGRIjA=="
15787   - },
15788 15306 "node_modules/type-is": {
15789 15307 "version": "1.6.18",
15790 15308 "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
... ... @@ -16338,14 +15856,6 @@
16338 15856 "spdx-expression-parse": "^3.0.0"
16339 15857 }
16340 15858 },
16341   - "node_modules/vanilla-picker": {
16342   - "version": "2.12.3",
16343   - "resolved": "https://registry.npmjs.org/vanilla-picker/-/vanilla-picker-2.12.3.tgz",
16344   - "integrity": "sha512-qVkT1E7yMbUsB2mmJNFmaXMWE2hF8ffqzMMwe9zdAikd8u2VfnsVY2HQcOUi2F38bgbxzlJBEdS1UUhOXdF9GQ==",
16345   - "dependencies": {
16346   - "@sphinxxxx/color-conversion": "^2.2.2"
16347   - }
16348   - },
16349 15859 "node_modules/vary": {
16350 15860 "version": "1.1.2",
16351 15861 "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
... ... @@ -16903,11 +16413,6 @@
16903 16413 "defaults": "^1.0.3"
16904 16414 }
16905 16415 },
16906   - "node_modules/webidl-conversions": {
16907   - "version": "3.0.1",
16908   - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
16909   - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
16910   - },
16911 16416 "node_modules/webpack": {
16912 16417 "version": "4.47.0",
16913 16418 "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.47.0.tgz",
... ... @@ -17656,15 +17161,6 @@
17656 17161 "node": ">=0.8.0"
17657 17162 }
17658 17163 },
17659   - "node_modules/whatwg-url": {
17660   - "version": "5.0.0",
17661   - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
17662   - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
17663   - "dependencies": {
17664   - "tr46": "~0.0.3",
17665   - "webidl-conversions": "^3.0.0"
17666   - }
17667   - },
17668 17164 "node_modules/which": {
17669 17165 "version": "1.3.1",
17670 17166 "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
... ...
package.json
1 1 {
2   - "name": "property_web",
  2 + "name": "xirong_property",
3 3 "version": "1.0.0",
4 4 "private": true,
5 5 "scripts": {
... ...
public/img/logo.png deleted

2.36 KB

public/index.html
... ... @@ -19,21 +19,19 @@
19 19 window.scriptLoadErrors.push({ name: scriptName, error: error.message });
20 20 }
21 21 </script>
22   - <script src="https://map.qq.com/api/gljs?v=1.exp&key="></script>
  22 +
23 23  
24 24 <!-- Qs 库 - 主 CDN -->
25 25 <script src="/js/jessibuca/jessibuca.js"></script>
26 26 <script src="/formjs/js/form-viewer.umd.js"></script>
27   -
28   -
29   -
30   - <!-- 可以在这里添加更多全局脚本 -->
31 27 </head>
32 28 <body>
33 29 <noscript>
34 30 <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
35 31 </noscript>
36 32 <div id="app"></div>
  33 + <!-- 高德地图 JS API -->
  34 + <script src="https://webapi.amap.com/maps?v=1.4.15&key=3239bc04f77a5c89b2b5e628da96b6ed"></script>
37 35 <!-- built files will be auto injected -->
38 36 </body>
39 37  
... ...
public/js/vcCore/vc-cn.js
... ... @@ -3,17 +3,17 @@
3 3 */
4 4 (function(window) {
5 5 window.lang = {
6   - "systemName": "HC小區管理系統",
7   - "systemSimpleName": "HC",
  6 + "systemName": "西荣物业小區管理系統",
  7 + "systemSimpleName": "西荣物业",
8 8 "subSystemName": "小區管理系統",
9 9 "companyTeam": "java110團隊",
10   - "welcome": "歡迎訪問HC小區管理系統",
  10 + "welcome": "歡迎訪問西荣物业小區管理系統",
11 11 "signOut": "退出",
12 12 "signIn": "登錄",
13 13 "register": "註冊",
14 14 "moreCommunity": "更多小區",
15 15 "moreMsg": "查看全部消息",
16   - "title": "HC小區管理系統",
  16 + "title": "西荣物业小區管理系統",
17 17 "noAccount": "還沒有賬號?",
18 18 "areyouhasaccount": "已經有賬戶了?",
19 19 "indexContext": {
... ... @@ -1265,4 +1265,4 @@
1265 1265 "chooseQuestionAnswer": { "查询": "查詢", "选择": "選擇", "操作": "操作", "输入问卷信息名称": "輸入問卷資訊名稱", "开始时间": "開始時間", "选择问卷信息": "選擇問卷資訊", "问卷名称": "問卷名稱", "问卷类型": "問卷類型", "备注": "備註", "问卷": "問卷", "结束时间": "結束時間" },
1266 1266 "addAttrSpec": { "字符串": "字串", "否": "否", "小区属性": "社區屬性", "规格名称": "規格名稱", "说明": "說明", "必填": "必填", "设备属性": "設備屬性", "查询显示": "查詢顯示", "展示": "展示", "是": "是", "值类型": "數值型別", "整数": "整数", "停车场属性": "停車場屬性", "添加属性配置": "新增屬性配置", "属性表": "屬性表", "房屋属性": "房屋屬性", "业主属性": "屋主屬性", "车辆属性": "車輛屬性", "金额": "金額", "规格类型": "規格類型" }
1267 1267 }
1268   -})(window)
1269 1268 \ No newline at end of file
  1269 +})(window)
... ...
public/js/vcCore/vc-en.js
... ... @@ -3,8 +3,8 @@
3 3 */
4 4 (function(window) {
5 5 window.lang = {
6   - "systemName": "HC Community System",
7   - "systemSimpleName": "HC",
  6 + "systemName": "西荣物业 Community System",
  7 + "systemSimpleName": "西荣物业",
8 8 "subSystemName": "CommunityManagement",
9 9 "companyTeam": "java110 Round data team",
10 10 "welcome": "welcome community management",
... ... @@ -1193,4 +1193,4 @@
1193 1193 "addAttrSpec": { "必填,请填写说明": "required,please fill in the description", "字符串": " String", "否": "No", "小区属性": "Community Attribute", "规格名称": "Specification Name", "说明": "Description", "必填": "Required", "设备属性": "Equipment attribute", "查询显示": "query display", "展示": "display", "是": "yes", "值类型": "value type", "整数": "Integer", "必填,请填写规格名称": "required,please fill in the specification name", "停车场属性": "parking lot attribute", "添加属性配置": "add attribute configuration", "属性表": "Attribute table", "房屋属性": "House attribute", "业主属性": "Owner attribute", "车辆属性": "Vehicle attribute", "金额": "Amount", "规格类型": "Spec Type" }
1194 1194 }
1195 1195  
1196   -})(window)
1197 1196 \ No newline at end of file
  1197 +})(window)
... ...
public/js/vcCore/vc-tibetan.js
... ... @@ -3,18 +3,18 @@
3 3 */
4 4 (function(window) {
5 5 window.lang = {
6   - "systemName": "HCགཞིས་ཁུལ་དོ་དམ་མ་ལག",
7   - "systemSimpleName": "HC",
  6 + "systemName": "西荣物业གཞིས་ཁུལ་དོ་དམ་མ་ལག",
  7 + "systemSimpleName": "西荣物业",
8 8 "subSystemName": "གཞིས་ཁུལ་དོ་དམ་མ་ལག",
9 9 "companyTeam": "java110ཚོགས་པ།",
10   - "welcome": "འཚམས་འདྲིར་ཕེབས་པར་དགའ་བསུ་ཞུ། HCགཞིས་ཁུལ་དོ་དམ་མ་ལག",
  10 + "welcome": "འཚམས་འདྲིར་ཕེབས་པར་དགའ་བསུ་ཞུ། 西荣物业གཞིས་ཁུལ་དོ་དམ་མ་ལག",
11 11 "signOut": "ཕྱིར་འཐེན།",
12 12 "signIn": "ཐོ་འགོད།",
13 13 "register": "ཐོ་འགོད།",
14 14 "moreCommunity": "སྡེ་ཁུལ་དེ་བས་མང་བ།",
15 15 "moreMsg": "གནས་ཚུལ་ཚང་མར་གཟིགས་པ།",
16   - "title": "HCགཞིས་ཁུལ་དོ་དམ་མ་ལག",
  16 + "title": "西荣物业གཞིས་ཁུལ་དོ་དམ་མ་ལག",
17 17 "noAccount": "ད་དུང་རྩིས་ཨང་མེད་དམ།",
18 18 "areyouhasaccount": "རྩིས་ཐོ་ཡོད་སོང་ངམ།"
19 19 }
20   -})(window)
21 20 \ No newline at end of file
  21 +})(window)
... ...
public/js/vcCore/vc-zh-cn.js
... ... @@ -3,17 +3,17 @@
3 3 */
4 4 (function(window) {
5 5 window.lang = {
6   - "systemName": "HC",
7   - "systemSimpleName": "HC",
  6 + "systemName": "西荣物业",
  7 + "systemSimpleName": "西荣物业",
8 8 "subSystemName": "小区管理系统",
9 9 "companyTeam": "java110团队",
10   - "welcome": "欢迎访问HC小区管理系统",
  10 + "welcome": "欢迎访问西荣物业小区管理系统",
11 11 "signOut": "退出",
12 12 "signIn": "登录",
13 13 "register": "注册",
14 14 "moreCommunity": "更多小区",
15 15 "moreMsg": "查看全部消息",
16   - "title": "HC小区管理系统",
  16 + "title": "西荣物业小区管理系统",
17 17 "noAccount": "还没有账号? ",
18 18 "areyouhasaccount": "已经有账户了?",
19 19 "保存": "保存",
... ... @@ -1211,4 +1211,4 @@
1211 1211 "addAttrSpec": { "字符串": "字符串", "否": "否", "小区属性": "小区属性", "规格名称": "规格名称", "说明": "说明", "必填": "必填", "设备属性": "设备属性", "查询显示": "查询显示", "展示": "展示", "是": "是", "值类型": "值类型", "整数": "整数", "停车场属性": "停车场属性", "添加属性配置": "添加属性配置", "属性表": "属性表", "房屋属性": "房屋属性", "业主属性": "业主属性", "车辆属性": "车辆属性", "金额": "金额", "规格类型": "规格类型" }
1212 1212  
1213 1213 }
1214   -})(window)
1215 1214 \ No newline at end of file
  1215 +})(window)
... ...
readme.md
1   -# HC物业管理系统pcweb端(vue2+elementui)
  1 +# 西荣物业物业管理系统pcweb端(vue2+elementui)
2 2  
3 3 ## 说明
4   - HC小区管理系统是一套saas物业管理的系统,包括 房产、业主、 费用 (可以线上缴费)、报修(可以线上报修)、投诉建议、采购、巡检、停车、门径、道闸、监控、工作流、问卷和公告等功能。
  4 + 西荣物业小区管理系统是一套saas物业管理的系统,包括 房产、业主、 费用 (可以线上缴费)、报修(可以线上报修)、投诉建议、采购、巡检、停车、门径、道闸、监控、工作流、问卷和公告等功能。
5 5  
6 6 相关代码:<br/><br/>
7 7 1、[物业系统前端](https://gitee.com/java110/MicroCommunityWeb) : 物业员工使用电脑端<br/>
... ... @@ -11,7 +11,7 @@
11 11  
12 12 ## 如何使用
13 13  
14   -[操作手册](http://www.homecommunity.cn/pages/hc/addCommunity_cn.html)
  14 +[操作手册](http://www.homecommunity.cn/pages/西荣物业/addCommunity_cn.html)
15 15  
16 16 ## 产品
17 17  
... ... @@ -92,4 +92,4 @@ npm install .
92 92  
93 93 您可以fork 代码后,commit后 pull request合并代码
94 94  
95   -联系作者:17797173942(微信号)
96 95 \ No newline at end of file
  96 +联系作者:17797173942(微信号)
... ...
src/api/community/cityAreaApi.js
... ... @@ -6,7 +6,7 @@ export function getAreaTree() {
6 6 request({
7 7 url: '/area.queryAreaTree',
8 8 method: 'get',
9   - params: { hc: 1.8 }
  9 + params: { 西荣物业: 1.8 }
10 10 }).then(response => {
11 11 const res = response.data
12 12  
... ... @@ -29,7 +29,7 @@ export function getAreaDetail(params) {
29 29 const res = response.data
30 30  
31 31 resolve(res)
32   -
  32 +
33 33 }).catch(error => {
34 34 reject(error)
35 35 })
... ... @@ -97,4 +97,4 @@ export function deleteArea(data) {
97 97 reject(error)
98 98 })
99 99 })
100   -}
101 100 \ No newline at end of file
  101 +}
... ...
src/components/inspection/AInspectionRouteMap.vue
1   -<template>
  1 +<template>
2 2 <div id="aInspectionRouteMap" class="map-container"></div>
3 3 </template>
4 4  
... ... @@ -10,26 +10,12 @@ export default {
10 10 data() {
11 11 return {
12 12 map: null,
13   - points: []
  13 + points: [],
  14 + markers: [],
  15 + polyline: null
14 16 }
15 17 },
16   - async created() {
17   - await this.loadQQMapScript()
18   - },
19 18 methods: {
20   - loadQQMapScript() {
21   - if (window.TMap) {
22   - return Promise.resolve();
23   - }
24   -
25   - return new Promise((resolve, reject) => {
26   - const script = document.createElement('script');
27   - script.src = `https://map.qq.com/api/gljs?v=1.exp&key=您的腾讯地图KEY`;
28   - script.onload = resolve;
29   - script.onerror = reject;
30   - document.head.appendChild(script);
31   - });
32   - },
33 19 async initMap(params) {
34 20 try {
35 21 const { data } = await listAdminInspectionRoutePoints({
... ... @@ -46,32 +32,53 @@ export default {
46 32 initMapView() {
47 33 if (!this.points || this.points.length === 0) return
48 34  
49   - // 这里需要根据实际地图API实现地图初始化
50   - // 示例代码,需要替换为实际地图API调用
51   - console.log('Initialize map with points:', this.points)
  35 + this.clearMap()
52 36  
53   - // 示例:使用腾讯地图API
54   - if (window.TMap) {
55   - const center = new window.TMap.LatLng(this.points[0].lat, this.points[0].lng)
56   - this.map = new window.TMap.Map(document.getElementById('aInspectionRouteMap'), {
57   - center: center,
58   - zoom: 17
59   - })
  37 + const center = [this.points[0].lng, this.points[0].lat]
  38 + this.map = new window.AMap.Map(document.getElementById('aInspectionRouteMap'), {
  39 + center: center,
  40 + zoom: 17,
  41 + resizeEnable: true
  42 + })
60 43  
61   - // 添加标记点
62   - const markers = this.points.map(point => ({
63   - position: new window.TMap.LatLng(point.lat, point.lng),
64   - properties: {
65   - title: point.inspectionName
66   - }
67   - }))
  44 + const path = []
  45 + this.points.forEach(point => {
  46 + const marker = new window.AMap.Marker({
  47 + map: this.map,
  48 + position: [point.lng, point.lat],
  49 + title: point.inspectionName,
  50 + icon: new window.AMap.Icon({
  51 + size: new window.AMap.Size(25, 35),
  52 + imageSize: new window.AMap.Size(25, 35),
  53 + image: '/img/maper.png'
  54 + })
  55 + })
  56 + this.markers.push(marker)
  57 + path.push([point.lng, point.lat])
  58 + })
68 59  
69   - new window.TMap.MultiMarker({
  60 + if (path.length > 1) {
  61 + this.polyline = new window.AMap.Polyline({
70 62 map: this.map,
71   - geometries: markers
  63 + path: path,
  64 + strokeColor: '#3777FF',
  65 + strokeWeight: 6,
  66 + strokeOpacity: 0.8
72 67 })
73 68 }
  69 + },
  70 + clearMap() {
  71 + this.markers.forEach(m => m.setMap(null))
  72 + this.markers = []
  73 + if (this.polyline) { this.polyline.setMap(null); this.polyline = null }
  74 + if (this.map) {
  75 + this.map.destroy()
  76 + this.map = null
  77 + }
74 78 }
  79 + },
  80 + beforeDestroy() {
  81 + this.clearMap()
75 82 }
76 83 }
77 84 </script>
... ... @@ -81,4 +88,4 @@ export default {
81 88 height: 600px;
82 89 width: 100%;
83 90 }
84   -</style>
85 91 \ No newline at end of file
  92 +</style>
... ...
src/components/inspection/AInspectionTaskMap.vue
1   -<template>
  1 +<template>
2 2 <div id="aInspectionTaskMap" class="map-container"></div>
3 3 </template>
4 4  
... ... @@ -10,13 +10,13 @@ export default {
10 10 data() {
11 11 return {
12 12 map: null,
13   - points: []
  13 + points: [],
  14 + markers: []
14 15 }
15 16 },
16 17 methods: {
17 18 loadData(params) {
18 19 console.log(params)
19   - //this.initMap(params)
20 20 },
21 21 async initMap(params) {
22 22 try {
... ... @@ -35,50 +35,43 @@ export default {
35 35 initMapView() {
36 36 if (!this.points || this.points.length === 0) return
37 37  
38   - // 这里需要根据实际地图API实现地图初始化
39   - // 示例代码,需要替换为实际地图API调用
40   - console.log('Initialize task map with points:', this.points)
41   -
42   - // 示例:使用腾讯地图API
43   - if (window.TMap) {
44   - const center = new window.TMap.LatLng(this.points[0].lat, this.points[0].lng)
45   - this.map = new window.TMap.Map(document.getElementById('aInspectionTaskMap'), {
46   - center: center,
47   - zoom: 17
  38 + this.clearMap()
  39 +
  40 + const center = [this.points[0].lng, this.points[0].lat]
  41 + this.map = new window.AMap.Map(document.getElementById('aInspectionTaskMap'), {
  42 + center: center,
  43 + zoom: 17,
  44 + resizeEnable: true
  45 + })
  46 +
  47 + this.points.forEach(point => {
  48 + const isDone = point.state === '20200405'
  49 + const icon = new window.AMap.Icon({
  50 + size: new window.AMap.Size(25, 35),
  51 + imageSize: new window.AMap.Size(25, 35),
  52 + image: isDone ? '/img/inspection_done.png' : '/img/inspection.png'
48 53 })
49   -
50   - // 添加标记点
51   - const markers = this.points.map(point => ({
52   - position: new window.TMap.LatLng(point.lat, point.lng),
53   - properties: {
54   - title: point.inspectionName,
55   - status: point.state
56   - }
57   - }))
58   -
59   - new window.TMap.MultiMarker({
  54 +
  55 + const marker = new window.AMap.Marker({
60 56 map: this.map,
61   - styles: {
62   - normal: new window.TMap.MarkerStyle({
63   - width: 25,
64   - height: 35,
65   - src: '/img/inspection.png',
66   - anchor: { x: 16, y: 32 }
67   - }),
68   - done: new window.TMap.MarkerStyle({
69   - width: 25,
70   - height: 35,
71   - src: '/img/inspection_done.png',
72   - anchor: { x: 16, y: 32 }
73   - })
74   - },
75   - geometries: markers.map(marker => ({
76   - ...marker,
77   - styleId: marker.properties.status === '20200405' ? 'done' : 'normal'
78   - }))
  57 + position: [point.lng, point.lat],
  58 + title: point.inspectionName,
  59 + icon: icon
79 60 })
  61 + this.markers.push(marker)
  62 + })
  63 + },
  64 + clearMap() {
  65 + this.markers.forEach(m => m.setMap(null))
  66 + this.markers = []
  67 + if (this.map) {
  68 + this.map.destroy()
  69 + this.map = null
80 70 }
81 71 }
  72 + },
  73 + beforeDestroy() {
  74 + this.clearMap()
82 75 }
83 76 }
84 77 </script>
... ... @@ -88,4 +81,4 @@ export default {
88 81 height: 600px;
89 82 width: 100%;
90 83 }
91   -</style>
92 84 \ No newline at end of file
  85 +</style>
... ...
src/components/inspection/addInspectionPoint.vue
... ... @@ -61,13 +61,13 @@
61 61 <el-col :span="12">
62 62 <el-form-item :label="$t('addInspectionPoint.lng')">
63 63 <el-input v-model="addInspectionPointInfo.lng" :placeholder="$t('addInspectionPoint.placeholder.lng')"
64   - disabled />
  64 + />
65 65 </el-form-item>
66 66 </el-col>
67 67 <el-col :span="12">
68 68 <el-form-item :label="$t('addInspectionPoint.lat')">
69 69 <el-input v-model="addInspectionPointInfo.lat" :placeholder="$t('addInspectionPoint.placeholder.lat')"
70   - disabled />
  70 + />
71 71 </el-form-item>
72 72 </el-col>
73 73 </el-row>
... ...
src/components/inspection/editInspectionPoint.vue
... ... @@ -60,13 +60,13 @@
60 60 <el-col :span="12">
61 61 <el-form-item :label="$t('editInspectionPoint.lng')">
62 62 <el-input v-model="editInspectionPointInfo.lng" :placeholder="$t('editInspectionPoint.placeholder.lng')"
63   - disabled />
  63 + />
64 64 </el-form-item>
65 65 </el-col>
66 66 <el-col :span="12">
67 67 <el-form-item :label="$t('editInspectionPoint.lat')">
68 68 <el-input v-model="editInspectionPointInfo.lat" :placeholder="$t('editInspectionPoint.placeholder.lat')"
69   - disabled />
  69 + />
70 70 </el-form-item>
71 71 </el-col>
72 72 </el-row>
... ...
src/components/inspection/inspectionRouteMap.vue
1   -<template>
  1 +<template>
2 2 <div class="inspection-route-map-container">
3 3 <div id="inspectionRouteMap" style="width: 100%; height: 600px;"></div>
4 4 </div>
... ... @@ -14,50 +14,32 @@ export default {
14 14 return {
15 15 map: null,
16 16 communityId: '',
17   - routePoints: []
  17 + routePoints: [],
  18 + markers: [],
  19 + texts: [],
  20 + polylines: []
18 21 }
19 22 },
20 23 async mounted() {
21 24 this.communityId = getCommunityId()
22   - // 延迟初始化地图,确保DOM已经渲染
23 25 },
24 26 methods: {
25 27 loadData(route) {
26 28 this.initMap()
27   -
28 29 this.loadRoute(route)
29 30 },
30 31  
31 32 initMap() {
32   - // 若已有地图或图层,先清理避免重复初始化
33   - if (this.markerLayer) {
34   - this.markerLayer.setMap(null)
35   - this.markerLayer = null
36   - }
37   - if (this.labelLayer) {
38   - this.labelLayer.setMap(null)
39   - this.labelLayer = null
40   - }
41   - if (this.polylineLayer) {
42   - this.polylineLayer.setMap(null)
43   - this.polylineLayer = null
44   - }
45   - if (this.map) {
46   - this.map.destroy()
47   - this.map = null
48   - }
  33 + this.clearAll()
49 34  
50   - // 默认中心点(北京)
51   - const center = new window.TMap.LatLng(39.916527, 116.397128)
  35 + const center = [116.397128, 39.916527]
  36 + const container = document.getElementById('inspectionRouteMap')
  37 + if (!container) return
52 38  
53   - // 创建地图实例
54   - this.map = new window.TMap.Map(document.getElementById('inspectionRouteMap'), {
  39 + this.map = new window.AMap.Map(container, {
55 40 center: center,
56 41 zoom: 13,
57   - baseMap: {
58   - type: 'vector',
59   - features: ['base', 'building2d', 'point']
60   - }
  42 + resizeEnable: true
61 43 })
62 44 },
63 45  
... ... @@ -84,101 +66,92 @@ export default {
84 66 addPointsToMap(points) {
85 67 if (!this.map || !points || points.length === 0) return
86 68  
87   - // 清除之前的标记
88   - if (this.markerLayer) this.markerLayer.setMap(null)
89   - if (this.labelLayer) this.labelLayer.setMap(null)
90   - if (this.polylineLayer) this.polylineLayer.setMap(null)
  69 + this.clearOverlays()
91 70  
92   - const geometriesMarker = []
93   - const geometriesLabel = []
94 71 const path = []
95 72  
96 73 points.forEach(point => {
97 74 if (!point.lat || !point.lng) return
98 75  
99   - const position = new window.TMap.LatLng(point.lat, point.lng)
  76 + const position = [point.lng, point.lat]
100 77  
101   - // 添加标记
102   - geometriesMarker.push({
103   - id: point.inspectionId,
104   - styleId: 'myStyle',
105   - position: position
  78 + const marker = new window.AMap.Marker({
  79 + map: this.map,
  80 + position: position,
  81 + icon: new window.AMap.Icon({
  82 + size: new window.AMap.Size(25, 35),
  83 + imageSize: new window.AMap.Size(25, 35),
  84 + image: '/img/maper.png'
  85 + })
106 86 })
  87 + this.markers.push(marker)
107 88  
108   - // 添加标签
109   - geometriesLabel.push({
110   - id: `label_${point.inspectionId}`,
111   - styleId: 'label',
  89 + const text = new window.AMap.Text({
  90 + map: this.map,
  91 + text: point.inspectionName,
112 92 position: position,
113   - content: point.inspectionName
  93 + offset: new window.AMap.Pixel(0, 15),
  94 + style: {
  95 + color: '#3777FF',
  96 + 'font-size': '12px',
  97 + 'background-color': 'rgba(255,255,255,0.8)',
  98 + 'padding': '2px 4px',
  99 + 'border-radius': '2px'
  100 + }
114 101 })
  102 + this.texts.push(text)
115 103  
116   - // 添加路径点
117 104 path.push(position)
118 105 })
119 106  
120   - // 创建标记图层
121   - this.markerLayer = new window.TMap.MultiMarker({
122   - map: this.map,
123   - styles: {
124   - "myStyle": new window.TMap.MarkerStyle({
125   - width: 25,
126   - height: 35,
127   - src: '/img/maper.png',
128   - anchor: { x: 32, y: 32 }
129   - })
130   - },
131   - geometries: geometriesMarker
132   - })
133   -
134   - // 创建标签图层
135   - this.labelLayer = new window.TMap.MultiLabel({
136   - map: this.map,
137   - styles: {
138   - 'label': new window.TMap.LabelStyle({
139   - color: '#3777FF',
140   - size: 20,
141   - offset: { x: 0, y: 15 },
142   - angle: 0,
143   - alignment: 'center',
144   - verticalAlignment: 'middle'
145   - })
146   - },
147   - geometries: geometriesLabel
148   - })
149   -
150   - // 创建路径图层
151   - this.polylineLayer = new window.TMap.MultiPolyline({
152   - map: this.map,
153   - styles: {
154   - 'style_blue': new window.TMap.PolylineStyle({
155   - color: '#3777FF',
156   - width: 6,
157   - borderWidth: 5,
158   - borderColor: '#FFF',
159   - lineCap: 'butt'
160   - })
161   - },
162   - geometries: [{
163   - id: 'pl_1',
164   - styleId: 'style_blue',
165   - paths: path
166   - }]
167   - })
  107 + if (path.length > 1) {
  108 + // 外层(描边)
  109 + const outerPolyline = new window.AMap.Polyline({
  110 + map: this.map,
  111 + path: path,
  112 + strokeColor: '#FFF',
  113 + strokeWeight: 10,
  114 + strokeOpacity: 1,
  115 + lineJoin: 'round'
  116 + })
  117 + this.polylines.push(outerPolyline)
  118 +
  119 + // 内层(主线)
  120 + this.polylines.push(new window.AMap.Polyline({
  121 + map: this.map,
  122 + path: path,
  123 + strokeColor: '#3777FF',
  124 + strokeWeight: 6,
  125 + strokeOpacity: 0.9,
  126 + lineJoin: 'round'
  127 + }))
  128 + }
168 129  
169   - // 如果有路径点,调整地图中心点和缩放级别
170 130 if (path.length > 0) {
171 131 this.map.setCenter(path[0])
172 132 this.map.setZoom(16)
173 133 }
  134 + },
  135 +
  136 + clearAll() {
  137 + this.clearOverlays()
  138 + if (this.map) {
  139 + this.map.destroy()
  140 + this.map = null
  141 + }
  142 + },
  143 +
  144 + clearOverlays() {
  145 + this.markers.forEach(m => m.setMap(null))
  146 + this.markers = []
  147 + this.texts.forEach(t => t.setMap(null))
  148 + this.texts = []
  149 + this.polylines.forEach(p => p.setMap(null))
  150 + this.polylines = []
174 151 }
175 152 },
176 153 beforeDestroy() {
177   - // 组件销毁时清除地图实例
178   - if (this.map) {
179   - this.map.destroy()
180   - this.map = null
181   - }
  154 + this.clearAll()
182 155 }
183 156 }
184 157 </script>
... ... @@ -188,4 +161,4 @@ export default {
188 161 width: 100%;
189 162 height: 100%;
190 163 }
191   -</style>
192 164 \ No newline at end of file
  165 +</style>
... ...
src/components/inspection/inspectionTaskMap.vue
1   -<template>
  1 +<template>
2 2 <div class="inspection-task-map-container">
3 3 <div id="inspectionTaskMap" style="width: 100%; height: 600px;"></div>
4 4 </div>
... ... @@ -15,53 +15,31 @@ export default {
15 15 map: null,
16 16 communityId: '',
17 17 taskPoints: [],
18   - markerLayer: null,
19   - labelLayer: null,
20   - polylineLayer: null
  18 + markers: [],
  19 + texts: [],
  20 + polylines: []
21 21 }
22 22 },
23 23 mounted() {
24 24 this.communityId = getCommunityId()
25   - // 延迟初始化地图,确保DOM已经渲染
26 25 },
27 26 methods: {
28 27 loadData(task) {
29   - console.log('loadData',task)
  28 + console.log('loadData', task)
30 29 this.initMap()
31 30 this.loadTask(task)
32 31 },
33 32 initMap() {
34   - // 若已有地图或图层,先清理避免重复初始化
35   - if (this.markerLayer) {
36   - this.markerLayer.setMap(null)
37   - this.markerLayer = null
38   - }
39   - if (this.labelLayer) {
40   - this.labelLayer.setMap(null)
41   - this.labelLayer = null
42   - }
43   - if (this.polylineLayer) {
44   - this.polylineLayer.setMap(null)
45   - this.polylineLayer = null
46   - }
47   - if (this.map) {
48   - this.map.destroy()
49   - this.map = null
50   - }
51   - console.log('initMap',this.map)
  33 + this.clearAll()
52 34  
53   - // 默认中心点(北京)
54   - const center = new window.TMap.LatLng(39.916527, 116.397128)
55   - console.log('center',center)
  35 + const center = [116.397128, 39.916527]
  36 + const container = document.getElementById('inspectionTaskMap')
  37 + if (!container) return
56 38  
57   - // 创建地图实例
58   - this.map = new window.TMap.Map(document.getElementById('inspectionTaskMap'), {
  39 + this.map = new window.AMap.Map(container, {
59 40 center: center,
60 41 zoom: 13,
61   - baseMap: {
62   - type: 'vector',
63   - features: ['base', 'building2d', 'point']
64   - }
  42 + resizeEnable: true
65 43 })
66 44 },
67 45  
... ... @@ -88,133 +66,98 @@ export default {
88 66 addPointsToMap(points) {
89 67 if (!this.map || !points || points.length === 0) return
90 68  
91   - // 清除之前的标记
92   - if (this.markerLayer) this.markerLayer.setMap(null)
93   - if (this.labelLayer) this.labelLayer.setMap(null)
94   - if (this.polylineLayer) this.polylineLayer.setMap(null)
  69 + this.clearOverlays()
95 70  
96   - const geometriesMarker = []
97   - const geometriesLabel = []
98 71 const path = []
99 72  
100 73 points.forEach(point => {
101 74 if (!point.lat || !point.lng) return
102 75  
103   - const position = new window.TMap.LatLng(point.lat, point.lng)
  76 + const position = [point.lng, point.lat]
  77 + const isDone = point.state === '20200405'
104 78  
105   - // 确定状态对应的样式
106   - const markerStyle = point.state === '20200405' ? 'myStyle_red' : 'myStyle'
107   - const labelStyle = point.state === '20200405' ? 'label_red' : 'label'
108   -
109   - // 添加标记
110   - geometriesMarker.push({
111   - id: point.inspectionId,
112   - styleId: markerStyle,
113   - position: position
  79 + // 标记
  80 + const markerIcon = new window.AMap.Icon({
  81 + size: new window.AMap.Size(25, 35),
  82 + imageSize: new window.AMap.Size(25, 35),
  83 + image: isDone ? '/img/inspection_do.png' : '/img/inspection.png'
  84 + })
  85 + const marker = new window.AMap.Marker({
  86 + map: this.map,
  87 + position: position,
  88 + icon: markerIcon
114 89 })
  90 + this.markers.push(marker)
115 91  
116   - // 添加标签
117   - geometriesLabel.push({
118   - id: `label_${point.inspectionId}`,
119   - styleId: labelStyle,
  92 + // 标签
  93 + const text = new window.AMap.Text({
  94 + map: this.map,
  95 + text: point.inspectionName,
120 96 position: position,
121   - content: point.inspectionName
  97 + offset: new window.AMap.Pixel(0, 15),
  98 + style: {
  99 + color: isDone ? '#CC0000' : '#3777FF',
  100 + 'font-size': '12px',
  101 + 'background-color': 'rgba(255,255,255,0.8)',
  102 + 'padding': '2px 4px',
  103 + 'border-radius': '2px'
  104 + }
122 105 })
  106 + this.texts.push(text)
123 107  
124   - // 添加路径点
125 108 path.push(position)
126 109 })
127 110  
128   - // 创建标记图层
129   - this.markerLayer = new window.TMap.MultiMarker({
130   - map: this.map,
131   - styles: {
132   - "myStyle": new window.TMap.MarkerStyle({
133   - width: 25,
134   - height: 35,
135   - src: '/img/inspection.png',
136   - anchor: { x: 32, y: 32 }
137   - }),
138   - "myStyle_red": new window.TMap.MarkerStyle({
139   - width: 25,
140   - height: 35,
141   - src: '/img/inspection_do.png',
142   - anchor: { x: 32, y: 32 }
143   - })
144   - },
145   - geometries: geometriesMarker
146   - })
147   -
148   - // 创建标签图层
149   - this.labelLayer = new window.TMap.MultiLabel({
150   - map: this.map,
151   - styles: {
152   - 'label': new window.TMap.LabelStyle({
153   - color: '#3777FF',
154   - size: 20,
155   - offset: { x: 0, y: 15 },
156   - angle: 0,
157   - alignment: 'center',
158   - verticalAlignment: 'middle'
159   - }),
160   - 'label_red': new window.TMap.LabelStyle({
161   - color: '#CC0000',
162   - size: 20,
163   - offset: { x: 0, y: 15 },
164   - angle: 0,
165   - alignment: 'center',
166   - verticalAlignment: 'middle'
167   - })
168   - },
169   - geometries: geometriesLabel
170   - })
171   -
172   - // 创建路径图层
173   - this.polylineLayer = new window.TMap.MultiPolyline({
174   - map: this.map,
175   - styles: {
176   - 'style_blue': new window.TMap.PolylineStyle({
177   - color: '#3777FF',
178   - width: 6,
179   - borderWidth: 5,
180   - borderColor: '#FFF',
181   - lineCap: 'butt'
182   - }),
183   - 'style_red': new window.TMap.PolylineStyle({
184   - color: '#CC0000',
185   - width: 6,
186   - borderWidth: 5,
187   - borderColor: '#FFF',
188   - lineCap: 'butt'
189   - })
190   - },
191   - geometries: [
192   - {
193   - id: 'pl_1',
194   - styleId: 'style_blue',
195   - paths: path
196   - },
197   - {
198   - id: 'pl_2',
199   - styleId: 'style_red',
200   - paths: path
201   - }
202   - ]
203   - })
  111 + // 路径 - 双色双层折线模拟描边效果
  112 + if (path.length > 1) {
  113 + // 外层(描边)
  114 + const outerPolyline = new window.AMap.Polyline({
  115 + map: this.map,
  116 + path: path,
  117 + strokeColor: '#FFF',
  118 + strokeWeight: 10,
  119 + strokeOpacity: 1,
  120 + lineJoin: 'round'
  121 + })
  122 + this.polylines.push(outerPolyline)
  123 +
  124 + // 内层(主线)
  125 + const innerPolyline = new window.AMap.Polyline({
  126 + map: this.map,
  127 + path: path,
  128 + strokeColor: '#3777FF',
  129 + strokeWeight: 6,
  130 + strokeOpacity: 0.9,
  131 + lineJoin: 'round'
  132 + })
  133 + this.polylines.push(innerPolyline)
  134 + }
204 135  
205   - // 如果有路径点,调整地图中心点和缩放级别
206 136 if (path.length > 0) {
207 137 this.map.setCenter(path[0])
208 138 this.map.setZoom(16)
209 139 }
  140 + },
  141 +
  142 + clearAll() {
  143 + this.clearOverlays()
  144 + if (this.map) {
  145 + this.map.destroy()
  146 + this.map = null
  147 + }
  148 + },
  149 +
  150 + clearOverlays() {
  151 + this.markers.forEach(m => m.setMap(null))
  152 + this.markers = []
  153 + this.texts.forEach(t => t.setMap(null))
  154 + this.texts = []
  155 + this.polylines.forEach(p => p.setMap(null))
  156 + this.polylines = []
210 157 }
211 158 },
212 159 beforeDestroy() {
213   - // 组件销毁时清除地图实例
214   - if (this.map) {
215   - this.map.destroy()
216   - this.map = null
217   - }
  160 + this.clearAll()
218 161 }
219 162 }
220 163 </script>
... ... @@ -224,4 +167,4 @@ export default {
224 167 width: 100%;
225 168 height: 100%;
226 169 }
227   -</style>
228 170 \ No newline at end of file
  171 +</style>
... ...
src/components/inspection/selectMapPos.vue
1   -<template>
  1 +<template>
2 2 <div class="select-map-pos-container">
3   - <div id="selectMap" style="width: 100%; height: 100%;"></div>
  3 + <div id="selectMap" class="map-view"></div>
  4 + <div class="map-hint">点击地图选择位置,经纬度将自动填充</div>
4 5 </div>
5 6 </template>
6 7  
... ... @@ -24,118 +25,97 @@ export default {
24 25 return {
25 26 map: null,
26 27 marker: null,
27   - communityId: '',
28   - mapData: {
29   - lat: 0,
30   - lng: 0
31   - }
  28 + communityId: ''
32 29 }
33 30 },
34 31 mounted() {
35 32 this.communityId = getCommunityId()
36   -
37 33 },
38 34 methods: {
39 35 initMap(_data) {
40   - // 清除现有地图
41   - let _lng = 116.397128;
42   - let _lat = 39.916527;
  36 + let _lng = 116.397128
  37 + let _lat = 39.916527
43 38  
44   - if (_data.lng) {
45   - _lng = _data.lng;
46   - }
  39 + if (_data.lng) _lng = _data.lng
  40 + if (_data.lat) _lat = _data.lat
47 41  
48   - if (_data.lat) {
49   - _lat = _data.lat;
50   - }
51   - try {
52   - if (this.map) {
53   - this.map.destroy();
54   - }
55   - } catch (e) {
56   - console.log(e)
  42 + if (this.map) {
  43 + this.map.destroy()
  44 + this.map = null
57 45 }
  46 + this.marker = null
  47 +
  48 + const map = new window.AMap.Map('selectMap', {
  49 + center: [_lng, _lat],
  50 + zoom: 13,
  51 + resizeEnable: true
  52 + })
  53 +
  54 + const _this = this
  55 +
  56 + map.on('click', function (ev) {
  57 + const lng = ev.lnglat.getLng()
  58 + const lat = ev.lnglat.getLat()
58 59  
  60 + _this.$emit('position-change', { lat, lng })
59 61  
60   - let addMap = new window.TMap.Map('selectMap', {
61   - center: new window.TMap.LatLng(_lat, _lng),
62   - zoom: 13
63   - });
64   - // $that.addMapInfo.addMap = addMap;
65   - let marker;
66   - //添加监听事件 获取鼠标点击事件
67   - let _this = this
68   - addMap.on('click', function (event) {
69   - console.log(event)
70   - if (!marker) {
71   - marker = new window.TMap.MultiMarker({
72   - styleId: "marker",
73   - position: event.latLng,
74   - map: addMap,
75   - id: "1",
76   - });
  62 + if (!_this.marker) {
  63 + _this.marker = new window.AMap.Marker({
  64 + position: [lng, lat],
  65 + map: map,
  66 + icon: new window.AMap.Icon({
  67 + size: new window.AMap.Size(25, 35),
  68 + imageSize: new window.AMap.Size(25, 35),
  69 + image: '/img/maper.png'
  70 + })
  71 + })
  72 + } else {
  73 + _this.marker.setPosition([lng, lat])
77 74 }
78   - console.log(event)
79   - //marker.setPosition(event.latLng);
80   - _this.$emit('position-change', {
81   - lat: event.latLng.lat,
82   - lng: event.latLng.lng
83   - })
  75 + })
84 76  
85   - marker.updateGeometries([
86   - {
87   - "styleId": "marker",
88   - "id": "1",
89   - "position": event.latLng,
90   - }
91   - ])
92   - });
93   - //为地图注册click事件获取鼠标点击出的经纬度坐标
94   -
95   - this.map = addMap;
  77 + this.map = map
  78 +
  79 + // 如果传入了已有坐标,在地图上显示标记
  80 + if (_data.lng && _data.lat) {
  81 + this.marker = new window.AMap.Marker({
  82 + map: this.map,
  83 + position: [_lng, _lat],
  84 + icon: new window.AMap.Icon({
  85 + size: new window.AMap.Size(25, 35),
  86 + imageSize: new window.AMap.Size(25, 35),
  87 + image: '/img/maper.png'
  88 + })
  89 + })
  90 + }
96 91 },
97 92  
98   -
99 93 addMarker(position) {
100   - // 清除现有标记
101 94 if (this.marker) {
102 95 this.marker.setMap(null)
  96 + this.marker = null
103 97 }
104 98  
105   - // 创建新标记
106   - let TMap = window.TMap
107   -
108   - this.marker = new TMap.MultiMarker({
  99 + this.marker = new window.AMap.Marker({
109 100 map: this.map,
110   - styles: {
111   - "marker": new TMap.MarkerStyle({
112   - width: 25,
113   - height: 35,
114   - src: '/img/maper.png',
115   - anchor: { x: 32, y: 32 }
116   - })
117   - },
118   - geometries: [{
119   - id: '1',
120   - styleId: 'marker',
121   - position: position
122   - }]
  101 + position: position,
  102 + icon: new window.AMap.Icon({
  103 + size: new window.AMap.Size(25, 35),
  104 + imageSize: new window.AMap.Size(25, 35),
  105 + image: '/img/maper.png'
  106 + })
123 107 })
124 108  
125   - // 移动地图中心到标记位置
126 109 this.map.setCenter(position)
127 110 this.map.setZoom(16)
128 111 },
129 112  
130 113 updatePosition(lat, lng) {
131 114 if (!this.map) return
132   -
133   - const position = new window.TMap.LatLng(lat, lng)
134   - this.addMarker(position)
  115 + this.addMarker([lng, lat])
135 116 }
136 117 },
137 118 beforeDestroy() {
138   - // 组件销毁时清除地图实例
139 119 if (this.map) {
140 120 this.map.destroy()
141 121 this.map = null
... ... @@ -147,6 +127,16 @@ export default {
147 127 <style scoped>
148 128 .select-map-pos-container {
149 129 width: 100%;
150   - height: 100%;
151 130 }
152   -</style>
153 131 \ No newline at end of file
  132 +.map-view {
  133 + width: 100%;
  134 + height: 400px;
  135 + border: 1px solid #dcdfe6;
  136 + border-radius: 4px;
  137 +}
  138 +.map-hint {
  139 + font-size: 12px;
  140 + color: #909399;
  141 + margin-top: 6px;
  142 +}
  143 +</style>
... ...
src/components/store/InitData.vue
... ... @@ -68,22 +68,22 @@ export default {
68 68 try {
69 69 // 保存token
70 70 this.$store.dispatch('user/setToken', user.token)
71   -
  71 +
72 72 // 验证是否有店铺
73 73 await queryStoreByUser({ _uId: 'ccdd00opikookjuhyyttvhnnjuuu' })
74   -
  74 +
75 75 // 加载权限
76   - const { datas } = await queryUserPrivilege({ a: 'HC' })
  76 + const { datas } = await queryUserPrivilege({ a: '西荣物业' })
77 77 const privileges = datas.map(item => item.pId)
78 78 this.$store.dispatch('user/setPrivileges', privileges)
79   -
  79 +
80 80 // 加载小区信息
81 81 const { communitys } = await listMyEnteredCommunitys({
82 82 _uId: 'ccdd00opikookjuhyyttvhnnjuuu',
83 83 page: 1,
84 84 row: 3
85 85 })
86   -
  86 +
87 87 if (communitys && communitys.length > 0) {
88 88 this.$store.dispatch('community/setCurrentCommunity', communitys[0])
89 89 this.$store.dispatch('community/setCommunitys', communitys)
... ... @@ -100,4 +100,4 @@ export default {
100 100 this.initData()
101 101 }
102 102 }
103   -</script>
104 103 \ No newline at end of file
  104 +</script>
... ...
src/components/system/ViewMap.vue
1   -<template>
  1 +<template>
2 2 <el-dialog
3 3 :title="$t('common.map')"
4 4 :visible.sync="viewMapInfo.showMap"
... ... @@ -8,7 +8,7 @@
8 8 :close-on-press-escape="true"
9 9 >
10 10 <div class="map-container">
11   - <div id="qqmapcontainer" style="width: 100%; height: 500px; background-color: antiquewhite;"></div>
  11 + <div id="qqmapcontainer" style="width: 100%; height: 500px;"></div>
12 12 </div>
13 13 </el-dialog>
14 14 </template>
... ... @@ -42,30 +42,23 @@ export default {
42 42 this.$nextTick(() => this.initMap())
43 43 },
44 44 initMap() {
45   - const center = new window.TMap.LatLng(this.viewMapInfo.lat, this.viewMapInfo.lng)
46 45 const container = document.getElementById('qqmapcontainer')
47   - this.viewMapInfo.map = new window.TMap.Map(container, {
48   - center,
  46 + if (!container) return
  47 +
  48 + this.viewMapInfo.map = new window.AMap.Map(container, {
  49 + center: [this.viewMapInfo.lng, this.viewMapInfo.lat],
49 50 zoom: 17.2,
50   - viewMode: '2D'
  51 + resizeEnable: true
51 52 })
52   - new window.TMap.MultiMarker({
53   - id: 'marker-layer',
  53 +
  54 + new window.AMap.Marker({
  55 + position: [this.viewMapInfo.lng, this.viewMapInfo.lat],
54 56 map: this.viewMapInfo.map,
55   - styles: {
56   - marker: new window.TMap.MarkerStyle({
57   - width: 25,
58   - height: 35,
59   - anchor: { x: 16, y: 32 },
60   - src: 'https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/markerDefault.png'
61   - })
62   - },
63   - geometries: [{
64   - id: 'demo',
65   - styleId: 'marker',
66   - position: new window.TMap.LatLng(this.viewMapInfo.lat, this.viewMapInfo.lng),
67   - properties: { title: 'marker' }
68   - }]
  57 + icon: new window.AMap.Icon({
  58 + size: new window.AMap.Size(25, 35),
  59 + imageSize: new window.AMap.Size(25, 35),
  60 + image: 'https://webapi.amap.com/theme/v1.3/markers/n/mark_r.png'
  61 + })
69 62 })
70 63 },
71 64 closeMap() {
... ... @@ -76,7 +69,6 @@ export default {
76 69 }
77 70 },
78 71 wgs84togcj02(lng, lat) {
79   - // Placeholder for coordinate conversion
80 72 return { lon: lng, lat }
81 73 }
82 74 }
... ... @@ -88,4 +80,4 @@ export default {
88 80 width: 100%;
89 81 height: 500px;
90 82 }
91   -</style>
92 83 \ No newline at end of file
  84 +</style>
... ...
src/router/index.js
... ... @@ -17,6 +17,7 @@ import systemRouter from &#39;./systemRouter&#39;
17 17 import communityRouter from './communityRouter'
18 18 import workRouter from './workRouter'
19 19 import feeRouter from './feeRouter'
  20 +import propertyRouter from './propertyRouter'
20 21  
21 22 Vue.use(VueRouter)
22 23  
... ... @@ -724,6 +725,7 @@ const routes = [
724 725 ...communityRouter,
725 726 ...workRouter,
726 727 ...feeRouter,
  728 + ...propertyRouter,
727 729 // 其他子路由可以在这里添加
728 730 ]
729 731 },
... ...
src/views/layout/layout.vue
... ... @@ -3,7 +3,7 @@
3 3 <!-- 顶部导航 -->
4 4 <el-header height="60px" class="app-header">
5 5 <div class="header-left">
6   - <div class="logo" @click="_toIndex">{{ systemInfo.systemSimpleTitle }}</div>
  6 + <div @click="_toIndex">{{ systemInfo.systemSimpleTitle }}</div>
7 7 <el-menu mode="horizontal" :default-active="activeMenu" class="header-menu" background-color="#1e2132"
8 8 text-color="#fff" active-text-color="#409EFF">
9 9 <template v-for="(item, index) in catalogs">
... ... @@ -685,4 +685,4 @@ export default {
685 685 bottom: 0;
686 686 width: 100px;
687 687 }
688   -</style>
689 688 \ No newline at end of file
  689 +</style>
... ...
src/views/user/login/Login.vue
1   -<template>
2   - <div class="login-container">
3   - <div class="login-card">
4   - <div class="login-title" v-if="logo">
5   - <img :src="logo" alt="logo">
6   - </div>
7   - <el-form :model="loginForm" :rules="rules" ref="loginForm">
8   - <el-form-item prop="username">
9   - <el-input v-model="loginForm.username" :placeholder="$t('login.usernamePlaceholder')"></el-input>
10   - </el-form-item>
11   - <el-form-item prop="passwd">
12   - <el-input v-model="loginForm.passwd" type="password" :placeholder="$t('login.passwordPlaceholder')"></el-input>
13   - </el-form-item>
14   - <el-form-item prop="validateCode" class="captcha-item">
15   - <div class="captcha-container">
16   - <el-input v-model="loginForm.validateCode" :placeholder="$t('login.captchaPlaceholder')"></el-input>
17   - <img :src="captchaUrl" @click="refreshCaptcha" class="captcha-img" alt="验证码">
  1 +<template>
  2 + <div class="login-wrapper">
  3 + <!-- 左侧品牌面板 -->
  4 + <div class="login-brand">
  5 + <div class="brand-overlay"></div>
  6 + <div class="brand-content">
  7 + <h1 class="brand-title">西荣物业</h1>
  8 + <p class="brand-subtitle">智慧社区管理平台</p>
  9 + <div class="brand-features">
  10 + <div class="feature-item">
  11 + <i class="el-icon-s-home"></i>
  12 + <span>智能物业管理</span>
  13 + </div>
  14 + <div class="feature-item">
  15 + <i class="el-icon-s-data"></i>
  16 + <span>数据驱动决策</span>
18 17 </div>
19   - </el-form-item>
20   - <el-form-item>
21   - <el-button type="primary" @click="submitForm('loginForm')" :loading="loading">{{ $t('login.login')
22   - }}</el-button>
23   - </el-form-item>
24   - </el-form>
25   - <!-- Add a white line and copyright info below the form -->
26   - <div class="divider"></div>
27   - <div class="copyright">©2020-2026 <span v-html="companyName"></span></div>
  18 + <div class="feature-item">
  19 + <i class="el-icon-s-custom"></i>
  20 + <span>高效社区服务</span>
  21 + </div>
  22 + </div>
  23 + </div>
  24 + <div class="brand-footer">©2020-2026 <span v-html="companyName"></span></div>
28 25 </div>
29   - <select-login-user ref="selectLoginUserRef" @select="handleSelect"></select-login-user>
  26 +
  27 + <!-- 右侧登录面板 -->
  28 + <div class="login-form-panel">
  29 + <div class="form-card">
  30 + <h2 class="form-title">欢迎登录</h2>
  31 + <p class="form-desc">请输入您的账号信息</p>
  32 +
  33 + <el-form
  34 + :model="loginForm"
  35 + :rules="rules"
  36 + ref="loginForm"
  37 + class="login-form"
  38 + @submit.native.prevent
  39 + >
  40 + <el-form-item prop="username">
  41 + <el-input
  42 + v-model="loginForm.username"
  43 + :placeholder="$t('login.usernamePlaceholder')"
  44 + prefix-icon="el-icon-user"
  45 + size="medium"
  46 + />
  47 + </el-form-item>
  48 +
  49 + <el-form-item prop="passwd">
  50 + <el-input
  51 + v-model="loginForm.passwd"
  52 + type="password"
  53 + :placeholder="$t('login.passwordPlaceholder')"
  54 + prefix-icon="el-icon-lock"
  55 + size="medium"
  56 + @keyup.enter.native="submitForm('loginForm')"
  57 + />
  58 + </el-form-item>
  59 +
  60 + <el-form-item prop="validateCode">
  61 + <div class="captcha-row">
  62 + <el-input
  63 + v-model="loginForm.validateCode"
  64 + :placeholder="$t('login.captchaPlaceholder')"
  65 + prefix-icon="el-icon-picture-outline"
  66 + size="medium"
  67 + class="captcha-input"
  68 + @keyup.enter.native="submitForm('loginForm')"
  69 + />
  70 + <img
  71 + :src="captchaUrl"
  72 + @click="refreshCaptcha"
  73 + class="captcha-img"
  74 + title="点击刷新验证码"
  75 + alt="验证码"
  76 + />
  77 + </div>
  78 + </el-form-item>
  79 +
  80 + <el-form-item>
  81 + <el-button
  82 + type="primary"
  83 + @click="submitForm('loginForm')"
  84 + :loading="loading"
  85 + class="login-btn"
  86 + size="medium"
  87 + >
  88 + {{ loading ? '登录中...' : $t('login.login') }}
  89 + </el-button>
  90 + </el-form-item>
  91 + </el-form>
  92 + </div>
  93 + </div>
  94 +
  95 + <select-login-user ref="selectLoginUserRef" @select="handleSelect" />
30 96 </div>
31 97 </template>
32 98  
33 99 <script>
34 100 import { login, getCaptcha, _loadStaffPrivileges } from '@/api/user/loginApi';
35 101 import { _loadCommunityInfo } from '@/api/community/communityApi';
36   -import {listSystemInfo} from '@/api/system/systemInfoManageApi'
  102 +import { listSystemInfo } from '@/api/system/systemInfoManageApi';
37 103 import selectLoginUser from '@/components/user/selectLoginUser.vue';
38 104  
39   -
40 105 export default {
41 106 name: 'Login',
  107 + components: { selectLoginUser },
42 108 data() {
43 109 return {
44   - logo: '',
45   - companyName:'',
  110 + companyName: '',
46 111 loginForm: {
47 112 username: '',
48 113 passwd: '',
... ... @@ -65,58 +130,54 @@ export default {
65 130 },
66 131 created() {
67 132 localStorage.clear();
68   - this.getSystemInfo()
  133 + this.getSystemInfo();
69 134 setTimeout(() => {
70 135 this.refreshCaptcha();
71 136 }, 1000);
72   -
73   - },
74   - components: {
75   - selectLoginUser
76 137 },
77 138 methods: {
78 139 async getSystemInfo() {
79   - const { data } = await listSystemInfo({ page: 1, row: 1 });
80   - this.logo = data[0].logoUrl
81   - this.companyName = data[0].companyName
  140 + try {
  141 + const { data } = await listSystemInfo({ page: 1, row: 1 });
  142 + this.companyName = data[0].companyName;
  143 + } catch (e) {
  144 + console.error('获取系统信息失败', e);
  145 + }
82 146 },
83 147 async submitForm(formName) {
84 148 this.$refs[formName].validate(async (valid) => {
85   - if (valid) {
86   - this.loading = true;
87   - try {
88   - const { data } = await login(this.loginForm).catch(error => {
89   - this.$message.error(error);
90   - this.refreshCaptcha();
91   - return { data: [] };
92   - });
93   - if (!data || data.length == 0) {
94   - return;
95   - }
96   -
97   - if (data && data.length > 1) {
98   - this.$refs.selectLoginUserRef.openDialog(data);
99   - return;
100   - }
101   - this.handleSelect(data[0]);
102   - } catch (error) {
103   - console.error('登录失败:', error);
  149 + if (!valid) return false;
  150 + this.loading = true;
  151 + try {
  152 + const { data } = await login(this.loginForm).catch((error) => {
  153 + this.$message.error(error);
104 154 this.refreshCaptcha();
105   - } finally {
  155 + return { data: [] };
  156 + });
  157 + if (!data || data.length === 0) {
106 158 this.loading = false;
  159 + return;
107 160 }
108   - } else {
109   - return false;
  161 + if (data.length > 1) {
  162 + this.$refs.selectLoginUserRef.openDialog(data);
  163 + this.loading = false;
  164 + return;
  165 + }
  166 + this.handleSelect(data[0]);
  167 + } catch (error) {
  168 + console.error('登录失败:', error);
  169 + this.refreshCaptcha();
  170 + this.loading = false;
110 171 }
111 172 });
112 173 },
113 174 async handleSelect(_userData) {
114 175 localStorage.setItem('token', _userData.token);
115   - let _user = {
  176 + const _user = {
116 177 userId: _userData.userId,
117 178 name: _userData.name,
118 179 tel: _userData.tel
119   - }
  180 + };
120 181 localStorage.setItem('user', JSON.stringify(_user));
121 182 await _loadStaffPrivileges();
122 183 await _loadCommunityInfo();
... ... @@ -125,7 +186,6 @@ export default {
125 186 async refreshCaptcha() {
126 187 try {
127 188 const res = await getCaptcha();
128   - console.log(res);
129 189 this.captchaUrl = res;
130 190 } catch (error) {
131 191 console.error('获取验证码失败:', error);
... ... @@ -137,99 +197,279 @@ export default {
137 197 </script>
138 198  
139 199 <style scoped>
140   -.login-container {
  200 +.login-wrapper {
141 201 display: flex;
142   - justify-content: center;
143   - align-items: center;
144 202 height: 100vh;
145   - background: url('/img/login-bg_x.png') no-repeat center center;
146   - background-size: cover;
  203 + overflow: hidden;
  204 + font-family: 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', sans-serif;
  205 +}
  206 +
  207 +/* ===== 左侧品牌面板 ===== */
  208 +.login-brand {
  209 + width: 42%;
147 210 position: relative;
  211 + background: linear-gradient(135deg, #0c2646 0%, #1a4a7a 40%, #1e6eb8 100%);
  212 + display: flex;
  213 + flex-direction: column;
  214 + justify-content: center;
  215 + align-items: center;
148 216 overflow: hidden;
149 217 }
150 218  
151   -.login-card {
152   - width: 300px;
153   - padding: 20px;
154   - background-color: rgba(0, 0, 0, 0.5);
155   - border-radius: 4px;
  219 +.brand-overlay {
156 220 position: absolute;
157   - left: 50%;
158   - top: 35%;
159   - margin: -150px 0 0 -150px;
160   - z-index: 99;
161   - text-align: center;
162   - padding: 30px;
163   - box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
  221 + inset: 0;
  222 + background:
  223 + radial-gradient(ellipse at 20% 50%, rgba(255, 255, 255, 0.06) 0%, transparent 60%),
  224 + radial-gradient(ellipse at 80% 80%, rgba(30, 159, 255, 0.15) 0%, transparent 50%);
164 225 }
165 226  
166   -.login-card .login-title {
  227 +/* 装饰圆环 */
  228 +.login-brand::before {
  229 + content: '';
  230 + position: absolute;
  231 + width: 600px;
  232 + height: 600px;
  233 + border-radius: 50%;
  234 + border: 1px solid rgba(255, 255, 255, 0.06);
  235 + top: -200px;
  236 + right: -200px;
  237 +}
  238 +
  239 +.login-brand::after {
  240 + content: '';
  241 + position: absolute;
  242 + width: 400px;
  243 + height: 400px;
  244 + border-radius: 50%;
  245 + border: 1px solid rgba(255, 255, 255, 0.04);
  246 + bottom: -100px;
  247 + left: -100px;
  248 +}
  249 +
  250 +.brand-content {
  251 + position: relative;
  252 + z-index: 2;
  253 + text-align: center;
167 254 color: #fff;
  255 + padding: 0 60px;
  256 +}
  257 +
  258 +.brand-title {
  259 + font-size: 42px;
  260 + font-weight: 700;
  261 + letter-spacing: 8px;
  262 + margin: 0 0 12px 0;
  263 + text-shadow: 0 2px 12px rgba(0, 0, 0, 0.3);
  264 +}
  265 +
  266 +.brand-subtitle {
  267 + font-size: 16px;
  268 + font-weight: 300;
  269 + letter-spacing: 4px;
  270 + opacity: 0.8;
  271 + margin: 0 0 48px 0;
  272 +}
  273 +
  274 +.brand-features {
  275 + display: flex;
  276 + flex-direction: column;
  277 + gap: 20px;
  278 + text-align: left;
  279 +}
  280 +
  281 +.feature-item {
  282 + display: flex;
  283 + align-items: center;
  284 + gap: 14px;
  285 + font-size: 14px;
  286 + font-weight: 300;
  287 + opacity: 0.75;
  288 + letter-spacing: 1px;
  289 + transition: opacity 0.3s;
  290 +}
  291 +
  292 +.feature-item:hover {
  293 + opacity: 1;
  294 +}
  295 +
  296 +.feature-item i {
  297 + font-size: 20px;
  298 + width: 36px;
  299 + height: 36px;
  300 + line-height: 36px;
168 301 text-align: center;
169   - font-size: 48px;
  302 + background: rgba(255, 255, 255, 0.1);
  303 + border-radius: 8px;
  304 + backdrop-filter: blur(4px);
170 305 }
171 306  
172   -.el-form-item {
173   - margin-bottom: 20px;
  307 +.brand-footer {
  308 + position: absolute;
  309 + bottom: 32px;
  310 + z-index: 2;
  311 + color: rgba(255, 255, 255, 0.45);
  312 + font-size: 12px;
  313 + letter-spacing: 1px;
174 314 }
175 315  
176   -.el-input__inner {
  316 +/* ===== 右侧登录面板 ===== */
  317 +.login-form-panel {
  318 + flex: 1;
  319 + display: flex;
  320 + justify-content: center;
  321 + align-items: center;
  322 + background: #f5f7fa;
  323 + position: relative;
  324 +}
  325 +
  326 +/* 面板装饰 */
  327 +.login-form-panel::before {
  328 + content: '';
  329 + position: absolute;
  330 + top: 60px;
  331 + right: 80px;
  332 + width: 120px;
  333 + height: 120px;
  334 + background: linear-gradient(135deg, rgba(30, 110, 184, 0.04) 0%, rgba(30, 110, 184, 0.01) 100%);
  335 + border-radius: 24px;
  336 + transform: rotate(12deg);
  337 +}
  338 +
  339 +.login-form-panel::after {
  340 + content: '';
  341 + position: absolute;
  342 + bottom: 80px;
  343 + left: 60px;
  344 + width: 80px;
  345 + height: 80px;
  346 + background: linear-gradient(135deg, rgba(30, 110, 184, 0.03) 0%, rgba(30, 110, 184, 0.01) 100%);
  347 + border-radius: 16px;
  348 + transform: rotate(-8deg);
  349 +}
  350 +
  351 +.form-card {
  352 + position: relative;
  353 + z-index: 1;
  354 + width: 400px;
  355 + padding: 48px 44px 40px;
177 356 background: #fff;
178   - border: none;
179   - border-radius: 5px;
180   - color: #333;
181   - height: 40px;
  357 + border-radius: 16px;
  358 + box-shadow:
  359 + 0 4px 24px rgba(0, 0, 0, 0.04),
  360 + 0 16px 48px rgba(0, 0, 0, 0.04);
  361 +}
  362 +
  363 +.form-title {
  364 + font-size: 26px;
  365 + font-weight: 600;
  366 + color: #1a1a2e;
  367 + margin: 0 0 8px 0;
  368 + letter-spacing: 1px;
  369 +}
  370 +
  371 +.form-desc {
  372 + font-size: 14px;
  373 + color: #999;
  374 + margin: 0 0 36px 0;
  375 +}
  376 +
  377 +.login-form .el-form-item {
  378 + margin-bottom: 22px;
  379 +}
  380 +
  381 +.login-form >>> .el-input__inner {
  382 + border: 1px solid #e4e7ed;
  383 + border-radius: 8px;
  384 + height: 44px;
  385 + line-height: 44px;
  386 + background: #fafbfc;
  387 + transition: all 0.3s;
  388 + font-size: 14px;
  389 +}
  390 +
  391 +.login-form >>> .el-input__inner:focus,
  392 +.login-form >>> .el-input__inner:hover {
  393 + border-color: #1e6eb8;
  394 + background: #fff;
  395 + box-shadow: 0 0 0 3px rgba(30, 110, 184, 0.06);
  396 +}
  397 +
  398 +.login-form >>> .el-input__prefix {
  399 + color: #b0b8c4;
  400 + line-height: 44px;
182 401 }
183 402  
184   -.captcha-container {
  403 +.login-form >>> .el-input--prefix .el-input__inner {
  404 + padding-left: 38px;
  405 +}
  406 +
  407 +.captcha-row {
185 408 display: flex;
  409 + gap: 12px;
186 410 align-items: center;
187   - gap: 10px;
188 411 }
189 412  
190   -.captcha-item .el-input {
191   - width: 70%;
192   - height: 38px;
193   - line-height: 1.3;
194   - border-width: 1px;
195   - border-style: solid;
196   - background-color: #fff;
197   - border-radius: 2px;
  413 +.captcha-input {
  414 + flex: 1;
198 415 }
199 416  
200 417 .captcha-img {
201   - height: 40px;
  418 + height: 44px;
  419 + width: 120px;
  420 + border-radius: 8px;
202 421 cursor: pointer;
203   - border-radius: 5px;
  422 + border: 1px solid #e4e7ed;
  423 + transition: all 0.3s;
  424 + object-fit: cover;
  425 +}
  426 +
  427 +.captcha-img:hover {
  428 + border-color: #1e6eb8;
  429 + box-shadow: 0 0 0 3px rgba(30, 110, 184, 0.08);
204 430 }
205 431  
206   -.el-button--primary {
  432 +.login-btn {
207 433 width: 100%;
208   - background: #1E9FFF;
  434 + height: 46px;
  435 + border-radius: 8px;
  436 + font-size: 16px;
  437 + letter-spacing: 4px;
209 438 border: none;
210   - border-radius: 100px;
211   - font-size: 14px;
212   - height: 38px;
  439 + background: linear-gradient(135deg, #1e6eb8 0%, #155d9e 100%);
  440 + transition: all 0.3s;
  441 + margin-top: 4px;
213 442 }
214 443  
215   -.el-button--primary:hover {
216   - opacity: 0.8;
217   - color: #fff;
  444 +.login-btn:hover {
  445 + background: linear-gradient(135deg, #2580cc 0%, #1a6aaf 100%);
  446 + box-shadow: 0 6px 20px rgba(30, 110, 184, 0.35);
  447 + transform: translateY(-1px);
218 448 }
219 449  
220   -/* Style for the white line */
221   -.divider {
222   - width: 100%;
223   - height: 1px;
224   - background-color: #fff;
225   - margin: 10px 0;
  450 +.login-btn:active {
  451 + transform: translateY(0);
226 452 }
227 453  
228   -/* Style for the copyright text */
229   -.copyright {
230   - color: #fff;
231   - font-size: 14px;
232   - text-align: center;
233   - margin-top: 10px;
  454 +.login-btn.is-loading {
  455 + background: linear-gradient(135deg, #1e6eb8 0%, #155d9e 100%);
  456 +}
  457 +
  458 +/* ===== 响应式 ===== */
  459 +@media (max-width: 768px) {
  460 + .login-brand {
  461 + display: none;
  462 + }
  463 +
  464 + .form-card {
  465 + width: 90%;
  466 + max-width: 400px;
  467 + padding: 36px 28px 30px;
  468 + }
  469 +
  470 + .login-form-panel::before,
  471 + .login-form-panel::after {
  472 + display: none;
  473 + }
234 474 }
235   -</style>
236 475 \ No newline at end of file
  476 +</style>
... ...
src/views/user/login/LoginLang.js
... ... @@ -5,7 +5,7 @@ export const messages = {
5 5 en: {
6 6 ...enLocale,
7 7 login: {
8   - title: 'HC Smart Community',
  8 + title: '西荣物业 Smart Community',
9 9 username: 'Username',
10 10 password: 'Password',
11 11 captcha: 'Verification Code',
... ... @@ -23,7 +23,7 @@ export const messages = {
23 23 zh: {
24 24 ...zhLocale,
25 25 login: {
26   - title: 'HC智慧社区',
  26 + title: '西荣物业智慧社区',
27 27 username: '用户名',
28 28 password: '密码',
29 29 captcha: '验证码',
... ... @@ -38,4 +38,4 @@ export const messages = {
38 38 relCdName:'角色'
39 39 }
40 40 }
41   -}
42 41 \ No newline at end of file
  42 +}
... ...
vue.config.js
1 1 module.exports = {
  2 + chainWebpack: config => {
  3 + config.plugin('html').tap(args => {
  4 + args[0].title = '西荣物业'
  5 + return args
  6 + })
  7 + },
2 8 devServer: {
3 9 port: 3000, // 设置开发服务器端口
4 10 open: true, // 自动打开浏览器
5 11 proxy: {
6   - '/app': {
7   - target: 'https://demo.homecommunity.cn/app', // 后端API地址
8   - changeOrigin: true,
9   - pathRewrite: {
10   - '^/app': ''
11   - }
12   - },
13   - '/callComponent': {
14   - target: 'https://demo.homecommunity.cn/callComponent', // 后端API地址
15   - changeOrigin: true,
16   - pathRewrite: {
17   - '^/callComponent': ''
18   - }
19   - }
20 12 // '/app': {
21   - // target: 'http://localhost:8008/app', // 后端API地址
  13 + // target: 'https://demo.homecommunity.cn/app', // 后端API地址
22 14 // changeOrigin: true,
23 15 // pathRewrite: {
24 16 // '^/app': ''
25 17 // }
26 18 // },
27 19 // '/callComponent': {
28   - // target: 'http://localhost:8008/callComponent', // 后端API地址
  20 + // target: 'https://demo.homecommunity.cn/callComponent', // 后端API地址
29 21 // changeOrigin: true,
30 22 // pathRewrite: {
31 23 // '^/callComponent': ''
32 24 // }
33 25 // }
  26 + '/app': {
  27 + target: 'http://localhost:8008/app', // 后端API地址
  28 + changeOrigin: true,
  29 + pathRewrite: {
  30 + '^/app': ''
  31 + }
  32 + },
  33 + '/callComponent': {
  34 + target: 'http://localhost:8008/callComponent', // 后端API地址
  35 + changeOrigin: true,
  36 + pathRewrite: {
  37 + '^/callComponent': ''
  38 + }
  39 + }
34 40 },
35 41 // 关键:禁止开发服务器对静态资源添加 hash
36 42 historyApiFallback: {
... ... @@ -41,4 +47,4 @@ module.exports = {
41 47 ]
42 48 }
43 49 }
44   -}
45 50 \ No newline at end of file
  51 +}
... ...