更多登录ui修改;修复【全局优化】批量删除时,勾选的数据被删除了,上面的“已选择X顶”没有更新;修复物联网卡导入逻辑修改

* feat: 设备根据标签进行搜索功能

* fix: bug#23370

* fix: bug#17573

* fix: bug#23378

* fix: bug#20292

* fix: bug#23158

* fix: bug#23057

* fix: bug#23583

* fix: bug#23576

* fix: bug#23597、告警等级过长组件优化

* fix: 物联网卡导入逻辑

* fix: 物联网卡导入

* fix: 更多登录ui修改;修复【全局优化】批量删除时,勾选的数据被删除了,上面的“已选择X顶”没有更新;修复物联网卡导入逻辑修改

* fix: 更多登录ui修改

* fix:【全局优化】批量删除时,勾选的数据被删除了,上面的“已选择X顶”没有更新

* fix: 物联网卡导入逻辑修改

* fix: 组织新增排序修改;

* fix: 组织新增排序修改

* fix: bug#23669、 23517、23758、23752、23744

* fix: 组件库更新

* fix: bug#23758、23752、23744

* feat: 新增设备根据标签进行搜索功能

* feat: 场景联动条件编辑

* feat: 新增设备根据标签进行搜索功能

* fix: 修改编辑条件名称
This commit is contained in:
qiaochuLei 2024-04-11 11:11:40 +08:00 committed by GitHub
parent 4c52039964
commit a9a6a096e6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
37 changed files with 2248 additions and 1178 deletions

353
package-lock.json generated
View File

@ -8,6 +8,7 @@
"name": "jetlinks-vue",
"version": "0.0.0",
"dependencies": {
"@ant-design/icons-vue": "^7.0.1",
"@liveqing/liveplayer-v3": "^3.7.10",
"@types/marked": "^4.0.8",
"@vitejs/plugin-vue-jsx": "^3.0.0",
@ -31,6 +32,7 @@
"nrm": "^1.2.5",
"pinia": "^2.0.28",
"rollup-plugin-copy": "^3.4.0",
"rxjs": "^7.8.1",
"unplugin-auto-import": "^0.12.1",
"unplugin-vue-components": "^0.22.12",
"v-clipboard3": "^0.1.4",
@ -130,9 +132,9 @@
"integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw=="
},
"node_modules/@ant-design/icons-vue": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz",
"integrity": "sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==",
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-7.0.1.tgz",
"integrity": "sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==",
"dependencies": {
"@ant-design/colors": "^6.0.0",
"@ant-design/icons-svg": "^4.2.1"
@ -1944,6 +1946,32 @@
"resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.12.0.tgz",
"integrity": "sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ=="
},
"node_modules/@vueuse/router": {
"version": "9.13.0",
"resolved": "https://registry.npmjs.org/@vueuse/router/-/router-9.13.0.tgz",
"integrity": "sha512-lcL6auSUGMGZMdDzZJb02QDe909AChzMXoxqFS3gL2E8mHmIx0SrNor+33UkqvvBPi18vXpDq/R7tPd9fxWwTg==",
"dependencies": {
"@vueuse/shared": "9.13.0",
"vue-demi": "*"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"vue-router": ">=4.0.0-rc.1"
}
},
"node_modules/@vueuse/router/node_modules/@vueuse/shared": {
"version": "9.13.0",
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz",
"integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
"dependencies": {
"vue-demi": "*"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/@vueuse/shared": {
"version": "9.12.0",
"resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.12.0.tgz",
@ -2273,6 +2301,18 @@
"vue": ">=3.2.0"
}
},
"node_modules/ant-design-vue/node_modules/@ant-design/icons-vue": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz",
"integrity": "sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==",
"dependencies": {
"@ant-design/colors": "^6.0.0",
"@ant-design/icons-svg": "^4.2.1"
},
"peerDependencies": {
"vue": ">=3.0.3"
}
},
"node_modules/anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@ -3015,6 +3055,62 @@
"integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
"dev": true
},
"node_modules/colorpicker-v3": {
"version": "2.10.2",
"resolved": "https://registry.npmjs.org/colorpicker-v3/-/colorpicker-v3-2.10.2.tgz",
"integrity": "sha512-ZWPq5wcugS3NcL7DwYqVSP5mE/x45FK31olGpig+Tko5jUXk0danfEYi1Aei3lgYs+Z0zAfhbhqVuDgOdUs5Mw==",
"dependencies": {
"@vueuse/core": "^7.5.5",
"vue": "^3.2.25"
}
},
"node_modules/colorpicker-v3/node_modules/@vueuse/core": {
"version": "7.7.1",
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-7.7.1.tgz",
"integrity": "sha512-PRRgbATMpoeUmkCEBtUeJgOwtew8s+4UsEd+Pm7MhkjL2ihCNrSqxNVtM6NFE4uP2sWnkGcZpCjPuNSxowJ1Ow==",
"dependencies": {
"@vueuse/shared": "7.7.1",
"vue-demi": "*"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"@vue/composition-api": "^1.1.0",
"vue": "^2.6.0 || ^3.2.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
},
"vue": {
"optional": true
}
}
},
"node_modules/colorpicker-v3/node_modules/@vueuse/core/node_modules/@vueuse/shared": {
"version": "7.7.1",
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-7.7.1.tgz",
"integrity": "sha512-rN2qd22AUl7VdBxihagWyhUNHCyVk9IpvBTTfHoLH9G7rGE552X1f+zeCfehuno0zXif13jPw+icW/wn2a0rnQ==",
"dependencies": {
"vue-demi": "*"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"@vue/composition-api": "^1.1.0",
"vue": "^2.6.0 || ^3.2.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
},
"vue": {
"optional": true
}
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@ -7825,11 +7921,15 @@
},
"node_modules/npm/node_modules/ansicolors": {
"version": "0.3.2",
"resolved": "http://registry.jetlinks.cn/ansicolors/-/ansicolors-0.3.2.tgz",
"integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==",
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/ansistyles": {
"version": "0.1.3",
"resolved": "http://registry.jetlinks.cn/ansistyles/-/ansistyles-0.1.3.tgz",
"integrity": "sha512-6QWEyvMgIXX0eO972y7YPBLSBsq7UWKFAoNNTLGaOJ9bstcEL9sCbcjf96dVfNDdUsRoGOK82vWFJlKApXds7g==",
"inBundle": true,
"license": "MIT"
},
@ -7842,6 +7942,8 @@
},
"node_modules/npm/node_modules/archy": {
"version": "1.0.0",
"resolved": "http://registry.jetlinks.cn/archy/-/archy-1.0.0.tgz",
"integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==",
"inBundle": true,
"license": "MIT"
},
@ -8054,6 +8156,8 @@
},
"node_modules/npm/node_modules/cli-columns": {
"version": "3.1.2",
"resolved": "http://registry.jetlinks.cn/cli-columns/-/cli-columns-3.1.2.tgz",
"integrity": "sha512-iQYpDgpPPmCjn534ikQOhi+ydP6uMar+DtJ6a0In4aGL/PKqWfao75s6eF81quQQaz7isGz+goNECLARRZswdg==",
"inBundle": true,
"license": "MIT",
"dependencies": {
@ -8195,6 +8299,8 @@
},
"node_modules/npm/node_modules/columnify": {
"version": "1.5.4",
"resolved": "http://registry.jetlinks.cn/columnify/-/columnify-1.5.4.tgz",
"integrity": "sha512-rFl+iXVT1nhLQPfGDw+3WcS8rmm7XsLKUmhsGE3ihzzpIikeGrTaZPIRKYWeLsLBypsHzjXIvYEltVUZS84XxQ==",
"inBundle": true,
"license": "MIT",
"dependencies": {
@ -8715,6 +8821,10 @@
},
"node_modules/npm/node_modules/init-package-json": {
"version": "2.0.5",
"resolved": "http://registry.jetlinks.cn/init-package-json/-/init-package-json-2.0.5.tgz",
"integrity": "sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA==",
"resolved": "http://registry.jetlinks.cn/init-package-json/-/init-package-json-2.0.5.tgz",
"integrity": "sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA==",
"inBundle": true,
"license": "ISC",
"dependencies": {
@ -8747,6 +8857,8 @@
},
"node_modules/npm/node_modules/is-cidr": {
"version": "4.0.2",
"resolved": "http://registry.jetlinks.cn/is-cidr/-/is-cidr-4.0.2.tgz",
"integrity": "sha512-z4a1ENUajDbEl/Q6/pVBpTR1nBjjEE1X7qb7bmWYanNnPoKAvUCPFKeXV6Fe4mgTkWKBqiHIcwsI3SndiO5FeA==",
"inBundle": true,
"license": "BSD-2-Clause",
"dependencies": {
@ -8885,6 +8997,8 @@
},
"node_modules/npm/node_modules/libnpmaccess": {
"version": "4.0.3",
"resolved": "http://registry.jetlinks.cn/libnpmaccess/-/libnpmaccess-4.0.3.tgz",
"integrity": "sha512-sPeTSNImksm8O2b6/pf3ikv4N567ERYEpeKRPSmqlNt1dTZbvgpJIzg5vAhXHpw2ISBsELFRelk0jEahj1c6nQ==",
"inBundle": true,
"license": "ISC",
"dependencies": {
@ -8899,6 +9013,8 @@
},
"node_modules/npm/node_modules/libnpmdiff": {
"version": "2.0.4",
"resolved": "http://registry.jetlinks.cn/libnpmdiff/-/libnpmdiff-2.0.4.tgz",
"integrity": "sha512-q3zWePOJLHwsLEUjZw3Kyu/MJMYfl4tWCg78Vl6QGSfm4aXBUSVzMzjJ6jGiyarsT4d+1NH4B1gxfs62/+y9iQ==",
"inBundle": true,
"license": "ISC",
"dependencies": {
@ -8917,6 +9033,8 @@
},
"node_modules/npm/node_modules/libnpmexec": {
"version": "2.0.1",
"resolved": "http://registry.jetlinks.cn/libnpmexec/-/libnpmexec-2.0.1.tgz",
"integrity": "sha512-4SqBB7eJvJWmUKNF42Q5qTOn20DRjEE4TgvEh2yneKlAiRlwlhuS9MNR45juWwmoURJlf2K43bozlVt7OZiIOw==",
"inBundle": true,
"license": "ISC",
"dependencies": {
@ -8938,6 +9056,8 @@
},
"node_modules/npm/node_modules/libnpmfund": {
"version": "1.1.0",
"resolved": "http://registry.jetlinks.cn/libnpmfund/-/libnpmfund-1.1.0.tgz",
"integrity": "sha512-Kfmh3pLS5/RGKG5WXEig8mjahPVOxkik6lsbH4iX0si1xxNi6eeUh/+nF1MD+2cgalsQif3O5qyr6mNz2ryJrQ==",
"inBundle": true,
"license": "ISC",
"dependencies": {
@ -8946,6 +9066,8 @@
},
"node_modules/npm/node_modules/libnpmhook": {
"version": "6.0.3",
"resolved": "http://registry.jetlinks.cn/libnpmhook/-/libnpmhook-6.0.3.tgz",
"integrity": "sha512-3fmkZJibIybzmAvxJ65PeV3NzRc0m4xmYt6scui5msocThbEp4sKFT80FhgrCERYDjlUuFahU6zFNbJDHbQ++g==",
"inBundle": true,
"license": "ISC",
"dependencies": {
@ -8958,6 +9080,8 @@
},
"node_modules/npm/node_modules/libnpmorg": {
"version": "2.0.3",
"resolved": "http://registry.jetlinks.cn/libnpmorg/-/libnpmorg-2.0.3.tgz",
"integrity": "sha512-JSGl3HFeiRFUZOUlGdiNcUZOsUqkSYrg6KMzvPZ1WVZ478i47OnKSS0vkPmX45Pai5mTKuwIqBMcGWG7O8HfdA==",
"inBundle": true,
"license": "ISC",
"dependencies": {
@ -8970,6 +9094,8 @@
},
"node_modules/npm/node_modules/libnpmpack": {
"version": "2.0.1",
"resolved": "http://registry.jetlinks.cn/libnpmpack/-/libnpmpack-2.0.1.tgz",
"integrity": "sha512-He4/jxOwlaQ7YG7sIC1+yNeXeUDQt8RLBvpI68R3RzPMZPa4/VpxhlDo8GtBOBDYoU8eq6v1wKL38sq58u4ibQ==",
"inBundle": true,
"license": "ISC",
"dependencies": {
@ -8983,6 +9109,8 @@
},
"node_modules/npm/node_modules/libnpmpublish": {
"version": "4.0.2",
"resolved": "http://registry.jetlinks.cn/libnpmpublish/-/libnpmpublish-4.0.2.tgz",
"integrity": "sha512-+AD7A2zbVeGRCFI2aO//oUmapCwy7GHqPXFJh3qpToSRNU+tXKJ2YFUgjt04LPPAf2dlEH95s6EhIHM1J7bmOw==",
"inBundle": true,
"license": "ISC",
"dependencies": {
@ -8998,6 +9126,8 @@
},
"node_modules/npm/node_modules/libnpmsearch": {
"version": "3.1.2",
"resolved": "http://registry.jetlinks.cn/libnpmsearch/-/libnpmsearch-3.1.2.tgz",
"integrity": "sha512-BaQHBjMNnsPYk3Bl6AiOeVuFgp72jviShNBw5aHaHNKWqZxNi38iVNoXbo6bG/Ccc/m1To8s0GtMdtn6xZ1HAw==",
"inBundle": true,
"license": "ISC",
"dependencies": {
@ -9009,6 +9139,8 @@
},
"node_modules/npm/node_modules/libnpmteam": {
"version": "2.0.4",
"resolved": "http://registry.jetlinks.cn/libnpmteam/-/libnpmteam-2.0.4.tgz",
"integrity": "sha512-FPrVJWv820FZFXaflAEVTLRWZrerCvfe7ZHSMzJ/62EBlho2KFlYKjyNEsPW3JiV7TLSXi3vo8u0gMwIkXSMTw==",
"inBundle": true,
"license": "ISC",
"dependencies": {
@ -9021,6 +9153,8 @@
},
"node_modules/npm/node_modules/libnpmversion": {
"version": "1.2.1",
"resolved": "http://registry.jetlinks.cn/libnpmversion/-/libnpmversion-1.2.1.tgz",
"integrity": "sha512-AA7x5CFgBFN+L4/JWobnY5t4OAHjQuPbAwUYJ7/NtHuyLut5meb+ne/aj0n7PWNiTGCJcRw/W6Zd2LoLT7EZuQ==",
"inBundle": true,
"license": "ISC",
"dependencies": {
@ -9322,6 +9456,8 @@
},
"node_modules/npm/node_modules/node-gyp/node_modules/npmlog": {
"version": "4.1.2",
"resolved": "http://registry.jetlinks.cn/npmlog/-/npmlog-4.1.2.tgz",
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"inBundle": true,
"license": "ISC",
"dependencies": {
@ -9380,6 +9516,8 @@
},
"node_modules/npm/node_modules/npm-audit-report": {
"version": "2.1.5",
"resolved": "http://registry.jetlinks.cn/npm-audit-report/-/npm-audit-report-2.1.5.tgz",
"integrity": "sha512-YB8qOoEmBhUH1UJgh1xFAv7Jg1d+xoNhsDYiFQlEFThEBui0W1vIz2ZK6FVg4WZjwEdl7uBQlm1jy3MUfyHeEw==",
"inBundle": true,
"license": "ISC",
"dependencies": {
@ -9468,6 +9606,8 @@
},
"node_modules/npm/node_modules/npm-profile": {
"version": "5.0.4",
"resolved": "http://registry.jetlinks.cn/npm-profile/-/npm-profile-5.0.4.tgz",
"integrity": "sha512-OKtU7yoAEBOnc8zJ+/uo5E4ugPp09sopo+6y1njPp+W99P8DvQon3BJYmpvyK2Bf1+3YV5LN1bvgXRoZ1LUJBA==",
"inBundle": true,
"license": "ISC",
"dependencies": {
@ -9497,11 +9637,15 @@
},
"node_modules/npm/node_modules/npm-user-validate": {
"version": "1.0.1",
"resolved": "http://registry.jetlinks.cn/npm-user-validate/-/npm-user-validate-1.0.1.tgz",
"integrity": "sha512-uQwcd/tY+h1jnEaze6cdX/LrhWhoBxfSknxentoqmIuStxUExxjWd3ULMLFPiFUrZKbOVMowH6Jq2FRWfmhcEw==",
"inBundle": true,
"license": "BSD-2-Clause"
},
"node_modules/npm/node_modules/npmlog": {
"version": "5.0.1",
"resolved": "http://registry.jetlinks.cn/npmlog/-/npmlog-5.0.1.tgz",
"integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
"inBundle": true,
"license": "ISC",
"dependencies": {
@ -9513,6 +9657,8 @@
},
"node_modules/npm/node_modules/npmlog/node_modules/are-we-there-yet": {
"version": "2.0.0",
"resolved": "http://registry.jetlinks.cn/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
"integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
"inBundle": true,
"license": "ISC",
"dependencies": {
@ -9565,6 +9711,8 @@
},
"node_modules/npm/node_modules/opener": {
"version": "1.5.2",
"resolved": "http://registry.jetlinks.cn/opener/-/opener-1.5.2.tgz",
"integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
"inBundle": true,
"license": "(WTFPL OR MIT)",
"bin": {
@ -9723,6 +9871,8 @@
},
"node_modules/npm/node_modules/qrcode-terminal": {
"version": "0.12.0",
"resolved": "http://registry.jetlinks.cn/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz",
"integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==",
"inBundle": true,
"bin": {
"qrcode-terminal": "bin/qrcode-terminal.js"
@ -10155,11 +10305,15 @@
},
"node_modules/npm/node_modules/text-table": {
"version": "0.2.0",
"resolved": "http://registry.jetlinks.cn/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/tiny-relative-date": {
"version": "1.3.0",
"resolved": "http://registry.jetlinks.cn/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz",
"integrity": "sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==",
"inBundle": true,
"license": "MIT"
},
@ -10427,6 +10581,14 @@
"node": ">=6"
}
},
"node_modules/onigasm": {
"version": "2.2.5",
"resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz",
"integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==",
"dependencies": {
"lru-cache": "^5.1.1"
}
},
"node_modules/only": {
"version": "0.0.2",
"resolved": "https://registry.jetlinks.cn/only/-/only-0.0.2.tgz",
@ -11447,10 +11609,9 @@
}
},
"node_modules/rxjs": {
"version": "7.8.0",
"resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.0.tgz",
"integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==",
"dev": true,
"version": "7.8.1",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
"integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
"dependencies": {
"tslib": "^2.1.0"
}
@ -11700,6 +11861,11 @@
"tslib": "^2.0.3"
}
},
"node_modules/sortablejs": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.2.tgz",
"integrity": "sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA=="
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@ -12929,6 +13095,22 @@
"vue": "^3.2.37"
}
},
"node_modules/vuedraggable": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-4.1.0.tgz",
"integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==",
"dependencies": {
"sortablejs": "1.14.0"
},
"peerDependencies": {
"vue": "^3.0.1"
}
},
"node_modules/vuedraggable/node_modules/sortablejs": {
"version": "1.14.0",
"resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz",
"integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w=="
},
"node_modules/warning": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
@ -13349,9 +13531,9 @@
"integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw=="
},
"@ant-design/icons-vue": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz",
"integrity": "sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==",
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-7.0.1.tgz",
"integrity": "sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==",
"requires": {
"@ant-design/colors": "^6.0.0",
"@ant-design/icons-svg": "^4.2.1"
@ -14683,6 +14865,25 @@
"resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.12.0.tgz",
"integrity": "sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ=="
},
"@vueuse/router": {
"version": "9.13.0",
"resolved": "https://registry.npmjs.org/@vueuse/router/-/router-9.13.0.tgz",
"integrity": "sha512-lcL6auSUGMGZMdDzZJb02QDe909AChzMXoxqFS3gL2E8mHmIx0SrNor+33UkqvvBPi18vXpDq/R7tPd9fxWwTg==",
"requires": {
"@vueuse/shared": "9.13.0",
"vue-demi": "*"
},
"dependencies": {
"@vueuse/shared": {
"version": "9.13.0",
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz",
"integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
"requires": {
"vue-demi": "*"
}
}
}
},
"@vueuse/shared": {
"version": "9.12.0",
"resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.12.0.tgz",
@ -14975,6 +15176,17 @@
"shallow-equal": "^1.0.0",
"vue-types": "^3.0.0",
"warning": "^4.0.0"
},
"dependencies": {
"@ant-design/icons-vue": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz",
"integrity": "sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==",
"requires": {
"@ant-design/colors": "^6.0.0",
"@ant-design/icons-svg": "^4.2.1"
}
}
}
},
"anymatch": {
@ -15578,6 +15790,36 @@
"integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
"dev": true
},
"colorpicker-v3": {
"version": "2.10.2",
"resolved": "https://registry.npmjs.org/colorpicker-v3/-/colorpicker-v3-2.10.2.tgz",
"integrity": "sha512-ZWPq5wcugS3NcL7DwYqVSP5mE/x45FK31olGpig+Tko5jUXk0danfEYi1Aei3lgYs+Z0zAfhbhqVuDgOdUs5Mw==",
"requires": {
"@vueuse/core": "^7.5.5",
"vue": "^3.2.25"
},
"dependencies": {
"@vueuse/core": {
"version": "7.7.1",
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-7.7.1.tgz",
"integrity": "sha512-PRRgbATMpoeUmkCEBtUeJgOwtew8s+4UsEd+Pm7MhkjL2ihCNrSqxNVtM6NFE4uP2sWnkGcZpCjPuNSxowJ1Ow==",
"requires": {
"@vueuse/shared": "7.7.1",
"vue-demi": "*"
},
"dependencies": {
"@vueuse/shared": {
"version": "7.7.1",
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-7.7.1.tgz",
"integrity": "sha512-rN2qd22AUl7VdBxihagWyhUNHCyVk9IpvBTTfHoLH9G7rGE552X1f+zeCfehuno0zXif13jPw+icW/wn2a0rnQ==",
"requires": {
"vue-demi": "*"
}
}
}
}
}
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@ -19297,10 +19539,14 @@
},
"ansicolors": {
"version": "0.3.2",
"resolved": "http://registry.jetlinks.cn/ansicolors/-/ansicolors-0.3.2.tgz",
"integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==",
"bundled": true
},
"ansistyles": {
"version": "0.1.3",
"resolved": "http://registry.jetlinks.cn/ansistyles/-/ansistyles-0.1.3.tgz",
"integrity": "sha512-6QWEyvMgIXX0eO972y7YPBLSBsq7UWKFAoNNTLGaOJ9bstcEL9sCbcjf96dVfNDdUsRoGOK82vWFJlKApXds7g==",
"bundled": true
},
"aproba": {
@ -19311,6 +19557,8 @@
},
"archy": {
"version": "1.0.0",
"resolved": "http://registry.jetlinks.cn/archy/-/archy-1.0.0.tgz",
"integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==",
"bundled": true
},
"are-we-there-yet": {
@ -19470,6 +19718,8 @@
},
"cli-columns": {
"version": "3.1.2",
"resolved": "http://registry.jetlinks.cn/cli-columns/-/cli-columns-3.1.2.tgz",
"integrity": "sha512-iQYpDgpPPmCjn534ikQOhi+ydP6uMar+DtJ6a0In4aGL/PKqWfao75s6eF81quQQaz7isGz+goNECLARRZswdg==",
"bundled": true,
"requires": {
"string-width": "^2.0.0",
@ -19562,6 +19812,8 @@
},
"columnify": {
"version": "1.5.4",
"resolved": "http://registry.jetlinks.cn/columnify/-/columnify-1.5.4.tgz",
"integrity": "sha512-rFl+iXVT1nhLQPfGDw+3WcS8rmm7XsLKUmhsGE3ihzzpIikeGrTaZPIRKYWeLsLBypsHzjXIvYEltVUZS84XxQ==",
"bundled": true,
"requires": {
"strip-ansi": "^3.0.0",
@ -19947,6 +20199,8 @@
},
"init-package-json": {
"version": "2.0.5",
"resolved": "http://registry.jetlinks.cn/init-package-json/-/init-package-json-2.0.5.tgz",
"integrity": "sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA==",
"bundled": true,
"requires": {
"npm-package-arg": "^8.1.5",
@ -19970,6 +20224,8 @@
},
"is-cidr": {
"version": "4.0.2",
"resolved": "http://registry.jetlinks.cn/is-cidr/-/is-cidr-4.0.2.tgz",
"integrity": "sha512-z4a1ENUajDbEl/Q6/pVBpTR1nBjjEE1X7qb7bmWYanNnPoKAvUCPFKeXV6Fe4mgTkWKBqiHIcwsI3SndiO5FeA==",
"bundled": true,
"requires": {
"cidr-regex": "^3.1.1"
@ -20074,6 +20330,8 @@
},
"libnpmaccess": {
"version": "4.0.3",
"resolved": "http://registry.jetlinks.cn/libnpmaccess/-/libnpmaccess-4.0.3.tgz",
"integrity": "sha512-sPeTSNImksm8O2b6/pf3ikv4N567ERYEpeKRPSmqlNt1dTZbvgpJIzg5vAhXHpw2ISBsELFRelk0jEahj1c6nQ==",
"bundled": true,
"requires": {
"aproba": "^2.0.0",
@ -20084,6 +20342,8 @@
},
"libnpmdiff": {
"version": "2.0.4",
"resolved": "http://registry.jetlinks.cn/libnpmdiff/-/libnpmdiff-2.0.4.tgz",
"integrity": "sha512-q3zWePOJLHwsLEUjZw3Kyu/MJMYfl4tWCg78Vl6QGSfm4aXBUSVzMzjJ6jGiyarsT4d+1NH4B1gxfs62/+y9iQ==",
"bundled": true,
"requires": {
"@npmcli/disparity-colors": "^1.0.1",
@ -20098,6 +20358,8 @@
},
"libnpmexec": {
"version": "2.0.1",
"resolved": "http://registry.jetlinks.cn/libnpmexec/-/libnpmexec-2.0.1.tgz",
"integrity": "sha512-4SqBB7eJvJWmUKNF42Q5qTOn20DRjEE4TgvEh2yneKlAiRlwlhuS9MNR45juWwmoURJlf2K43bozlVt7OZiIOw==",
"bundled": true,
"requires": {
"@npmcli/arborist": "^2.3.0",
@ -20115,6 +20377,8 @@
},
"libnpmfund": {
"version": "1.1.0",
"resolved": "http://registry.jetlinks.cn/libnpmfund/-/libnpmfund-1.1.0.tgz",
"integrity": "sha512-Kfmh3pLS5/RGKG5WXEig8mjahPVOxkik6lsbH4iX0si1xxNi6eeUh/+nF1MD+2cgalsQif3O5qyr6mNz2ryJrQ==",
"bundled": true,
"requires": {
"@npmcli/arborist": "^2.5.0"
@ -20122,6 +20386,8 @@
},
"libnpmhook": {
"version": "6.0.3",
"resolved": "http://registry.jetlinks.cn/libnpmhook/-/libnpmhook-6.0.3.tgz",
"integrity": "sha512-3fmkZJibIybzmAvxJ65PeV3NzRc0m4xmYt6scui5msocThbEp4sKFT80FhgrCERYDjlUuFahU6zFNbJDHbQ++g==",
"bundled": true,
"requires": {
"aproba": "^2.0.0",
@ -20130,6 +20396,8 @@
},
"libnpmorg": {
"version": "2.0.3",
"resolved": "http://registry.jetlinks.cn/libnpmorg/-/libnpmorg-2.0.3.tgz",
"integrity": "sha512-JSGl3HFeiRFUZOUlGdiNcUZOsUqkSYrg6KMzvPZ1WVZ478i47OnKSS0vkPmX45Pai5mTKuwIqBMcGWG7O8HfdA==",
"bundled": true,
"requires": {
"aproba": "^2.0.0",
@ -20138,6 +20406,8 @@
},
"libnpmpack": {
"version": "2.0.1",
"resolved": "http://registry.jetlinks.cn/libnpmpack/-/libnpmpack-2.0.1.tgz",
"integrity": "sha512-He4/jxOwlaQ7YG7sIC1+yNeXeUDQt8RLBvpI68R3RzPMZPa4/VpxhlDo8GtBOBDYoU8eq6v1wKL38sq58u4ibQ==",
"bundled": true,
"requires": {
"@npmcli/run-script": "^1.8.3",
@ -20147,6 +20417,8 @@
},
"libnpmpublish": {
"version": "4.0.2",
"resolved": "http://registry.jetlinks.cn/libnpmpublish/-/libnpmpublish-4.0.2.tgz",
"integrity": "sha512-+AD7A2zbVeGRCFI2aO//oUmapCwy7GHqPXFJh3qpToSRNU+tXKJ2YFUgjt04LPPAf2dlEH95s6EhIHM1J7bmOw==",
"bundled": true,
"requires": {
"normalize-package-data": "^3.0.2",
@ -20158,6 +20430,8 @@
},
"libnpmsearch": {
"version": "3.1.2",
"resolved": "http://registry.jetlinks.cn/libnpmsearch/-/libnpmsearch-3.1.2.tgz",
"integrity": "sha512-BaQHBjMNnsPYk3Bl6AiOeVuFgp72jviShNBw5aHaHNKWqZxNi38iVNoXbo6bG/Ccc/m1To8s0GtMdtn6xZ1HAw==",
"bundled": true,
"requires": {
"npm-registry-fetch": "^11.0.0"
@ -20165,6 +20439,8 @@
},
"libnpmteam": {
"version": "2.0.4",
"resolved": "http://registry.jetlinks.cn/libnpmteam/-/libnpmteam-2.0.4.tgz",
"integrity": "sha512-FPrVJWv820FZFXaflAEVTLRWZrerCvfe7ZHSMzJ/62EBlho2KFlYKjyNEsPW3JiV7TLSXi3vo8u0gMwIkXSMTw==",
"bundled": true,
"requires": {
"aproba": "^2.0.0",
@ -20173,6 +20449,8 @@
},
"libnpmversion": {
"version": "1.2.1",
"resolved": "http://registry.jetlinks.cn/libnpmversion/-/libnpmversion-1.2.1.tgz",
"integrity": "sha512-AA7x5CFgBFN+L4/JWobnY5t4OAHjQuPbAwUYJ7/NtHuyLut5meb+ne/aj0n7PWNiTGCJcRw/W6Zd2LoLT7EZuQ==",
"bundled": true,
"requires": {
"@npmcli/git": "^2.0.7",
@ -20392,6 +20670,8 @@
},
"npmlog": {
"version": "4.1.2",
"resolved": "http://registry.jetlinks.cn/npmlog/-/npmlog-4.1.2.tgz",
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"bundled": true,
"requires": {
"are-we-there-yet": "~1.1.2",
@ -20436,6 +20716,8 @@
},
"npm-audit-report": {
"version": "2.1.5",
"resolved": "http://registry.jetlinks.cn/npm-audit-report/-/npm-audit-report-2.1.5.tgz",
"integrity": "sha512-YB8qOoEmBhUH1UJgh1xFAv7Jg1d+xoNhsDYiFQlEFThEBui0W1vIz2ZK6FVg4WZjwEdl7uBQlm1jy3MUfyHeEw==",
"bundled": true,
"requires": {
"chalk": "^4.0.0"
@ -20502,6 +20784,8 @@
},
"npm-profile": {
"version": "5.0.4",
"resolved": "http://registry.jetlinks.cn/npm-profile/-/npm-profile-5.0.4.tgz",
"integrity": "sha512-OKtU7yoAEBOnc8zJ+/uo5E4ugPp09sopo+6y1njPp+W99P8DvQon3BJYmpvyK2Bf1+3YV5LN1bvgXRoZ1LUJBA==",
"bundled": true,
"requires": {
"npm-registry-fetch": "^11.0.0"
@ -20523,10 +20807,14 @@
},
"npm-user-validate": {
"version": "1.0.1",
"resolved": "http://registry.jetlinks.cn/npm-user-validate/-/npm-user-validate-1.0.1.tgz",
"integrity": "sha512-uQwcd/tY+h1jnEaze6cdX/LrhWhoBxfSknxentoqmIuStxUExxjWd3ULMLFPiFUrZKbOVMowH6Jq2FRWfmhcEw==",
"bundled": true
},
"npmlog": {
"version": "5.0.1",
"resolved": "http://registry.jetlinks.cn/npmlog/-/npmlog-5.0.1.tgz",
"integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
"bundled": true,
"requires": {
"are-we-there-yet": "^2.0.0",
@ -20537,6 +20825,8 @@
"dependencies": {
"are-we-there-yet": {
"version": "2.0.0",
"resolved": "http://registry.jetlinks.cn/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
"integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
"bundled": true,
"requires": {
"delegates": "^1.0.0",
@ -20574,6 +20864,8 @@
},
"opener": {
"version": "1.5.2",
"resolved": "http://registry.jetlinks.cn/opener/-/opener-1.5.2.tgz",
"integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
"bundled": true
},
"p-map": {
@ -20688,6 +20980,8 @@
},
"qrcode-terminal": {
"version": "0.12.0",
"resolved": "http://registry.jetlinks.cn/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz",
"integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==",
"bundled": true
},
"qs": {
@ -20994,10 +21288,14 @@
},
"text-table": {
"version": "0.2.0",
"resolved": "http://registry.jetlinks.cn/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"bundled": true
},
"tiny-relative-date": {
"version": "1.3.0",
"resolved": "http://registry.jetlinks.cn/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz",
"integrity": "sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==",
"bundled": true
},
"treeverse": {
@ -21250,6 +21548,14 @@
"mimic-fn": "^2.1.0"
}
},
"onigasm": {
"version": "2.2.5",
"resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz",
"integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==",
"requires": {
"lru-cache": "^5.1.1"
}
},
"only": {
"version": "0.0.2",
"resolved": "https://registry.jetlinks.cn/only/-/only-0.0.2.tgz",
@ -22037,10 +22343,9 @@
}
},
"rxjs": {
"version": "7.8.0",
"resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.0.tgz",
"integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==",
"dev": true,
"version": "7.8.1",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
"integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
"requires": {
"tslib": "^2.1.0"
}
@ -22254,6 +22559,11 @@
"tslib": "^2.0.3"
}
},
"sortablejs": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.2.tgz",
"integrity": "sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA=="
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@ -23156,6 +23466,21 @@
"vue": "^3.2.37"
}
},
"vuedraggable": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-4.1.0.tgz",
"integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==",
"requires": {
"sortablejs": "1.14.0"
},
"dependencies": {
"sortablejs": {
"version": "1.14.0",
"resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz",
"integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w=="
}
}
},
"warning": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",

View File

@ -26,7 +26,7 @@
"event-source-polyfill": "^1.0.31",
"global": "^4.4.0",
"jetlinks-store": "^0.0.3",
"jetlinks-ui-components": "^1.0.34-12",
"jetlinks-ui-components": "^1.0.38",
"js-cookie": "^3.0.1",
"jsencrypt": "^3.3.2",
"less": "^4.1.3",

View File

@ -115,7 +115,7 @@ export const deviceImport = (productId: string, fileUrl: string, autoDeploy: boo
* @returns
*/
export const deviceExport = (productId: string, type: string, params?: any) => server.get(`/device-instance${!!productId ? `/${productId}` : ''}/export.${type}`, params, {responseType: 'blob'})
export const deviceExportPath = (productId: string, type: string) => (`${BASE_API_PATH}/device-instance${!!productId ? `/${productId}` : ''}/export.${type}`)
/**
* ID是否重复
* @param id id
@ -607,7 +607,7 @@ export const metadataMapById = (type: 'device' | 'product', productId: string, d
export const getMetadataMapById = (type: 'device' | 'product', productId: string) => server.get(`/device/metadata/mapping/${type}/${productId}`)
export const getInkingDevices = (data: string[],pluginId:any) => server.post(`/plugin/mapping/device/${pluginId}/_all`, data)
export const getInkingDevices = (data: string[],accessId:any) => server.post(`/plugin/mapping/device/${accessId}/_all`, data)
export const getProtocolMetadata = (id: string, transport: string) => server.get(`/protocol/${id}/${transport}/metadata`)

View File

@ -0,0 +1,53 @@
<template>
<Ellipsis placement="topLeft" style="max-width:80px;">
<span class="dot" :style="{ backgroundColor: _color}"></span>
<span>{{ text }}</span>
</Ellipsis>
</template>
<script setup lang="ts">
// import { StatusColorEnum } from '@/utils/consts.ts';
import { getHexColor } from './color'
const props = defineProps({
text: {
type: String,
},
status: {
type: [String, Number],
default: 'default',
// validator: (value) => {
// //
// return Object.keys(StatusColorEnum).includes(value);
// },
},
/**
* 自定义status值颜色
* @example {
* 1: 'success',
* 0: 'error'
* }
*/
statusNames: {
type: Object,
default: () => ({
'success': 'success',
'warning': 'warning',
'error': 'error',
'default': 'default',
})
},
});
const _color = computed(() => {
return getHexColor(props.statusNames[props.status], 1)
})
</script>
<style lang="less" scoped>
.dot{
display: inline-block;
width: 6px;
height: 6px;
border-radius: 50%;
margin: 0 10px
}
</style>

View File

@ -52,10 +52,17 @@
>
<div class="card-state-content">
<BadgeStatus
v-if="!customBadge"
:status="status"
:text="statusText"
:statusNames="statusNames"
></BadgeStatus>
<CustomBadgeStatus
v-else
:status="status"
:text="statusText"
:statusNames="statusNames">
</CustomBadgeStatus>
</div>
</div>
</div>
@ -89,6 +96,7 @@
<script setup lang="ts" name='CardBox'>
import BadgeStatus from '@/components/BadgeStatus/index.vue';
import CustomBadgeStatus from '@/components/BadgeStatus/CustomBadgeStatus.vue'
import color, { getHexColor } from '../BadgeStatus/color';
import type { ActionsType } from '@/components/Table';
import { PropType } from 'vue';
@ -143,6 +151,10 @@ const props = defineProps({
disabled: {
type: Boolean,
default: false,
},
customBadge:{
type: Boolean,
default: false
}
});

View File

@ -55,7 +55,8 @@ export const defaultBranches = [
},
then: [],
executeAnyway: true,
branchId: Math.floor(Math.random() * 100000000)
branchId: Math.floor(Math.random() * 100000000),
branchName:'条件1'
},
];

View File

@ -154,7 +154,6 @@ export const TokenLose = () => {
* @returns {Promise<never>}
*/
const errorHandler = (error: any) => {
if (error.response) {
const data = error.response.data
const status = error.response.status
@ -182,7 +181,13 @@ const errorHandler = (error: any) => {
} else if (status === 403) {
showNotification('Forbidden', (data.message + '').substr(0, 90), '403')
} else if (status === 500) {
//处理预置点位接口无预置点位导致超时--特殊处理
const queryPreset = new RegExp('/function/QueryPreset')
if(queryPreset.test(error.config.url)){
showNotification('Server Side Error', ('该通道无预置点位' + '').substr(0, 90), '500')
}else{
showNotification('Server Side Error', (data.message + '').substr(0, 90), '500')
}
} else if (status === 400) {
showNotification('Request Error', (data.message + '').substr(0, 90), '400')
} else if (status === 401) {

View File

@ -8,10 +8,7 @@
:maxlength="64"
/>
</j-form-item>
<j-form-item
label="对象ID"
:name="['configuration', 'ObjectId']"
>
<j-form-item label="对象ID" :name="['configuration', 'ObjectId']">
<j-card>
<j-form-item label="对象类型">
<j-input
@ -40,10 +37,13 @@
></j-input>
</j-form-item>
<j-form-item label="值类型" :name="['configuration', 'valueType']">
<j-select
v-model:value="formData.configuration.valueType"
<j-select v-model:value="formData.configuration.valueType">
<j-select-option
v-for="item in bacnetValueType"
:key="item"
:value="item"
>{{ item }}</j-select-option
>
<j-select-option v-for="item in bacnetValueType" :key="item" :value="item">{{ item }}</j-select-option>
</j-select>
</j-form-item>
<j-form-item
@ -141,7 +141,11 @@
</j-modal>
</template>
<script setup lang="ts">
import { savePoint, updatePoint, getBacnetValueType } from '@/api/data-collect/collector';
import {
savePoint,
updatePoint,
getBacnetValueType,
} from '@/api/data-collect/collector';
import { randomString } from '@/utils/utils';
import DeathArea from './DeathArea.vue';
const props = defineProps({

View File

@ -1,11 +1,25 @@
<template>
<SaveChild v-if="childVisible" @close-child-save="closeChildSave" :childData="_current" />
<SaveChild
v-if="childVisible"
@close-child-save="closeChildSave"
:childData="_current"
/>
<div v-else>
<pro-search :columns="columns" target="child-device" @search="handleSearch" class="device-child-device-search" />
<pro-search
:columns="columns"
target="child-device"
@search="handleSearch"
class="device-child-device-search"
/>
<!-- <j-divider /> -->
<JProTable ref="childDeviceRef" :columns="columns" :request="query" :bodyStyle="{
padding: 0
}" :defaultParams="{
<JProTable
ref="childDeviceRef"
:columns="columns"
:request="query"
:bodyStyle="{
padding: 0,
}"
:defaultParams="{
terms: [
{
column: 'parentId',
@ -13,23 +27,44 @@
termType: 'eq',
},
],
}" :rowSelection="{
}"
:rowSelection="{
selectedRowKeys: _selectedRowKeys,
onChange: onSelectChange,
}" :params="params" :model="'TABLE'">
}"
:params="params"
:model="'TABLE'"
>
<template #rightExtraRender>
<j-space>
<PermissionButton type="primary" v-if="detail?.accessProvider === 'official-edge-gateway'
" hasPermission="device/Instance:update" @click="
<PermissionButton
type="primary"
v-if="
detail?.accessProvider === 'official-edge-gateway'
"
hasPermission="device/Instance:update"
@click="
_current = {};
childVisible = true;
">新增并绑定</PermissionButton>
<PermissionButton type="primary" @click="visible = true" hasPermission="device/Instance:update">
绑定</PermissionButton>
<PermissionButton type="primary" hasPermission="device/Instance:update" :popConfirm="{
"
>新增并绑定</PermissionButton
>
<PermissionButton
type="primary"
@click="visible = true"
hasPermission="device/Instance:update"
>
绑定</PermissionButton
>
<PermissionButton
type="primary"
hasPermission="device/Instance:update"
:popConfirm="{
title: '确定解绑吗?',
onConfirm: handleUnBind,
}">批量解除</PermissionButton>
}"
>批量解除</PermissionButton
>
</j-space>
</template>
<template #registryTime="slotProps">
@ -42,16 +77,33 @@
}}
</template>
<template #state="slotProps">
<j-badge :text="slotProps.state.text" :status="statusMap.get(slotProps.state.value)" />
<j-badge
:text="slotProps.state.text"
:status="statusMap.get(slotProps.state.value)"
/>
</template>
<template #action="slotProps">
<j-space :size="16">
<template v-for="i in getActions(slotProps, 'table')" :key="i.key">
<PermissionButton v-if="i.key !== 'update' || detail.accessProvider === 'official-edge-gateway'"
:disabled="i.disabled" :popConfirm="i.popConfirm" :tooltip="{
<template
v-for="i in getActions(slotProps, 'table')"
:key="i.key"
>
<PermissionButton
v-if="
i.key !== 'update' ||
detail.accessProvider ===
'official-edge-gateway'
"
:disabled="i.disabled"
:popConfirm="i.popConfirm"
:tooltip="{
...i.tooltip,
}" @click="i.onClick" type="link" style="padding: 0px"
:hasPermission="'device/Instance:' + i.key">
}"
@click="i.onClick"
type="link"
style="padding: 0px"
:hasPermission="'device/Instance:' + i.key"
>
<template #icon>
<AIcon :type="i.icon" />
</template>
@ -60,20 +112,31 @@
</j-space>
</template>
</JProTable>
<BindChildDevice v-if="visible" :parentIds="parentIds" @change="closeBindDevice" />
<BindChildDevice
v-if="visible"
:parentIds="parentIds"
@change="closeBindDevice"
/>
</div>
</template>
<script setup lang="ts">
import moment from 'moment';
import type { ActionsType } from '@/components/Table';
import { query, unbindDevice, unbindBatchDevice, queryByParent, deleteDeviceMapping } from '@/api/device/instance';
import {
query,
unbindDevice,
unbindBatchDevice,
queryByParent,
deleteDeviceMapping,
} from '@/api/device/instance';
import { useInstanceStore } from '@/store/instance';
import { storeToRefs } from 'pinia';
import BindChildDevice from './BindChildDevice/index.vue';
import { usePermissionStore } from '@/store/permission';
import SaveChild from './SaveChild/index.vue';
import { onlyMessage } from '@/utils/comm';
import { cloneDeep } from 'lodash-es';
const instanceStore = useInstanceStore();
const { detail } = storeToRefs(instanceStore);
@ -93,7 +156,7 @@ const params = ref<Record<string, any>>({});
const _selectedRowKeys = ref<string[]>([]);
const visible = ref<boolean>(false);
const _current = ref({});
const parentIds = ref<any[]>([instanceStore.detail.id])
const parentIds = ref<any[]>([instanceStore.detail.id]);
const columns = [
{
@ -195,13 +258,21 @@ const getActions = (data: Partial<Record<string, any>>): ActionsType[] => {
data.id,
{},
);
if (instanceStore.current.accessProvider === 'official-edge-gateway') {
const res = await deleteDeviceMapping(
detail.value.id,
{ ids: [data.id] }
)
if (
instanceStore.current.accessProvider ===
'official-edge-gateway'
) {
const res = await deleteDeviceMapping(detail.value.id, {
ids: [data.id],
});
}
if (resp.status === 200) {
_selectedRowKeys.value.find((i:any,index:number)=>{
if(i === data.id){
_selectedRowKeys.value.splice(index,1)
}
return i === data.id
})
childDeviceRef.value?.reload();
onlyMessage('操作成功!');
}
@ -242,10 +313,9 @@ const handleUnBind = async () => {
_selectedRowKeys.value,
);
if (instanceStore.current.accessProvider === 'official-edge-gateway') {
const res = await deleteDeviceMapping(
detail.value.id,
{ ids: [_selectedRowKeys.value] }
)
const res = await deleteDeviceMapping(detail.value.id, {
ids: [_selectedRowKeys.value],
});
}
if (resp.status === 200) {
onlyMessage('操作成功!');
@ -275,8 +345,8 @@ const closeChildSave = () => {
childVisible.value = false;
};
onMounted(() => {
console.log(detail.value.accessProvider)
})
console.log(detail.value.accessProvider);
});
</script>
<style lang="less">

View File

@ -44,7 +44,7 @@
</div>
</j-col>
<j-col :span="9">
<h6>执行结果</h6>
<h4>执行结果</h4>
<span class="execute-result">
{{ executeResult }}
</span>

View File

@ -91,7 +91,7 @@
</div>
</j-col>
<j-col :span="9">
<h6>执行结果</h6>
<h4>执行结果</h4>
<span
:ref="`result${func.id}Ref`"
class="execute-result"

View File

@ -151,7 +151,7 @@ const queryInkling = () => {
queryPluginAccessDetail(instanceStore.current?.accessId).then(async res => {
if (res.success) {
channelId.value = res.result.channelId
const pluginRes = await getPluginData('device',channelId.value, instanceStore.current?.id)
const pluginRes = await getPluginData('device',instanceStore.current?.accessId, instanceStore.current?.id)
if (pluginRes.success) {
inklingDeviceId.value = pluginRes.result?.externalId
}

View File

@ -1,7 +1,6 @@
<template>
<pro-search
class="device-running-search"
:columns="columns"
target="device-instance-running-events"
@search="handleSearch"
@ -14,6 +13,11 @@
:params="params"
:bodyStyle="{ padding: '0 0 0 24px' }"
>
<template v-for="i in objectKey" #[i.key]='slotProps'>
<Ellipsis >
<span @click="detail(slotProps[i.dataIndex])">{{ JSON.stringify(slotProps[i.dataIndex])}}</span>
</Ellipsis>
</template>
<template #timestamp="slotProps">
{{ dayjs(slotProps.timestamp).format('YYYY-MM-DD HH:mm:ss') }}
</template>
@ -23,8 +27,16 @@
</j-button>
</template>
</JProTable>
<j-modal :width="600" v-model:visible="visible" title="详情" class="device-running-event-modal">
<JsonViewer :value="info" style="max-height: calc(100vh - 400px);overflow: auto;"/>
<j-modal
:width="600"
v-model:visible="visible"
title="详情"
class="device-running-event-modal"
>
<JsonViewer
:value="info"
style="max-height: calc(100vh - 400px); overflow: auto"
/>
<template #footer>
<j-button type="primary" @click="visible = false">关闭</j-button>
</template>
@ -36,6 +48,7 @@ import dayjs from 'dayjs';
import { getEventList } from '@/api/device/instance';
import { useInstanceStore } from '@/store/instance';
import JsonViewer from 'vue-json-viewer';
import { cloneDeep } from 'lodash-es';
const events = defineProps({
data: {
@ -60,31 +73,51 @@ const defaultColumns = [
dataIndex: 'action',
key: 'action',
scopedSlots: true,
}
]
},
];
const columns = ref<Array<Record<string, any>>>([...defaultColumns]);
const params = ref<Record<string, any>>({});
const visible = ref<boolean>(false);
const info = ref<Record<string, any>>({});
const objectKey = ref<Array>([]);
const _getEventList = (_params: any) =>
getEventList(instanceStore.current.id || '', events.data.id || '', _params);
watchEffect(() => {
columns.value = [...defaultColumns]
columns.value = [...defaultColumns];
if (events.data?.valueType?.type === 'object') {
(events.data.valueType?.properties || []).reverse().map((i: any) => {
const eventProperties = cloneDeep(events.data.valueType?.properties || [])
eventProperties.reverse().map((i: any) => {
if (i.valueType?.type === 'object') {
objectKey.value.push({
key:i.id,
dataIndex: `${i.id}_format`
});
columns.value.splice(0, 0, {
key: i.id,
title: i.name,
dataIndex: `${i.id}_format`,
search: {
type: i?.valueType?.type || 'string',
rename: i.id
rename: i.id,
},
scopedSlots: true,
});
} else {
columns.value.splice(0, 0, {
key: i.id,
title: i.name,
dataIndex: `${i.id}_format`,
search: {
type: i?.valueType?.type || 'string',
rename: i.id,
},
ellipsis: true,
scopedSlots: true,
});
}
});
} else {
columns.value.splice(0, 0, {
@ -99,8 +132,8 @@ const handleSearch = (_params: any) => {
};
const detail = (_info: any) => {
info.value = _info
visible.value = true
info.value = _info;
visible.value = true;
// Modal.info({
// title: () => '',
// width: 850,

View File

@ -51,7 +51,8 @@
import { queryNoPagingPost } from '@/api/device/product';
import { downloadFileByUrl } from '@/utils/utils';
import { paramsEncodeQuery } from '@/utils/encodeQuery';
import { deviceExport } from '@/api/device/instance';
import { deviceExport , deviceExportPath} from '@/api/device/instance';
import { getToken } from '@/utils/comm';
const emit = defineEmits(['close']);
const props = defineProps({
@ -88,23 +89,26 @@ const productName = computed(() => {
})
const handleOk = async () => {
console.log(props.data)
const params = paramsEncodeQuery(props.data);
// downloadFile(
// deviceExport(modelRef.product || '', modelRef.fileType),
// params,
// );
const res: any = await deviceExport(
modelRef.product || '',
modelRef.fileType,
params
);
if (res) {
const blob = new Blob([res], { type: modelRef.fileType });
const url = URL.createObjectURL(blob);
downloadFileByUrl(url, `${productName.value ? (productName.value + '下设备') : '设备实例'}`, modelRef.fileType);
emit('close');
}
// const res: any = await deviceExport(
// modelRef.product || '',
// modelRef.fileType,
// params
// );
console.log(props.data,params)
window.open(`${deviceExportPath( modelRef.product || '',modelRef.fileType)}?X-Access-Token=${getToken()
}`)
// if (res) {
// const blob = new Blob([res], { type: modelRef.fileType });
// const url = URL.createObjectURL(blob);
// downloadFileByUrl(url, `${productName.value ? (productName.value + '') : ''}`, modelRef.fileType);
// emit('close');
// }
};
const handleCancel = () => {

View File

@ -72,6 +72,7 @@
</template>
<script setup lang='ts' name='DeviceImportFile'>
import {inject,Ref} from 'vue'
import { FILE_UPLOAD } from '@/api/comm';
import { TOKEN_KEY } from '@/utils/variable';
import { LocalStore, onlyMessage } from '@/utils/comm';
@ -96,10 +97,10 @@ const modelRef = reactive({
});
const importLoading = ref<boolean>(false);
const flag = ref<boolean>(false);
const flag = inject("flag") as Ref<boolean>;
const count = ref<number>(0);
const errCount = ref<number>(0);
const errCount = ref<number>(0);
const errMessage = ref<string>('');
const disabled = ref(false);
@ -140,6 +141,7 @@ const submitData = async (fileUrl: string) => {
errCount.value = 0;
const autoDeploy = !!modelRef?.file?.autoDeploy || false;
importLoading.value = true;
flag.value = true;
let dt = 0;
let et = 0;
const source = new EventSourcePolyfill(
@ -159,6 +161,7 @@ const submitData = async (fileUrl: string) => {
errCount.value = et;
}
}
flag.value=false;
disabled.value = false;
};
source.onerror = (e: { status: number }) => {
@ -182,6 +185,7 @@ const uploadChange = async (info: Record<string, any>) => {
disabled.value = false;
}
};
</script>
<style scoped lang='less'>

View File

@ -39,7 +39,7 @@
<j-button v-if='steps === 0' @click='cancel' >取消</j-button>
<j-button v-if='steps !== 0' @click='prev' >上一步</j-button>
<j-button v-if='steps !== 2' @click='next' type='primary'>下一步</j-button>
<j-button v-if='steps === 2' @click='save' type='primary'>确认</j-button>
<j-button v-if='steps === 2' @click='save' type='primary' :disabled="flag">确认</j-button>
</template>
</j-modal>
<j-modal
@ -55,27 +55,25 @@
</template>
<script lang='ts' setup name='DeviceImport'>
import {provide} from 'vue'
import Product from './product.vue'
import { getImage, onlyMessage } from '@/utils/comm'
import File from './file.vue'
import Plugin from './plugin.vue'
import { importDeviceByPlugin } from '@/api/device/instance'
const emit = defineEmits(['cancel', 'save']);
const steps = ref(0) //
const importData = reactive<{productId?: string, type?: string}>({
productId: undefined,
type: undefined,
})
const productDetail = ref()
const deviceList = ref<any[]>([])
const visible = ref(true)
const importVisible = ref(false)
const count = ref(0)
const flag = ref<boolean>(false)
provide("flag",flag)
const typeOptions = computed(() => {
const array = [
{

View File

@ -720,6 +720,7 @@ const getActions = (
const resp = await _delete(data.id);
if (resp.status === 200) {
onlyMessage('操作成功!');
_selectedRowKeys.value=[];
instanceRef.value?.reload();
} else {
onlyMessage('操作失败!', 'error');

View File

@ -327,7 +327,7 @@ const handleClick = (data: any) => {
const add = () => {
const url = menuStore.hasMenu('link/AccessConfig/Detail');
if (url) {
const tab: any = window.open(`${origin}/#${url}?view=false`);
const tab: any = window.open(`${origin}/#${url}?view=false&save=true`);
tab.onTabSaveSuccess = (value: any) => {
if (value.status === 200) {
tableRef.value.reload();

View File

@ -173,7 +173,7 @@ const queryInkingDevices = (data: string[]) => {
return;
}
const res = await getInkingDevices(data,props.pluginId);
const res = await getInkingDevices(data,props.accessId);
if (res) {
disabledKeys.value = res.result?.map((item) => item.externalId);
}

View File

@ -2,7 +2,7 @@ import { saveProductMetadata } from "@/api/device/product";
import { saveMetadata } from "@/api/device/instance";
import type { DeviceInstance } from "../../Instance/typings";
import type { DeviceMetadata, MetadataItem, MetadataType, ProductItem } from "../../Product/typings";
import { differenceBy } from "lodash-es";
import { differenceBy , cloneDeep } from "lodash-es";
const filterProductMetadata = (data: any[], productMetaData: any[]) => {
const ids = productMetaData.map((item: any) => item.id)
@ -69,7 +69,28 @@ export const asyncUpdateMetadata = (
case 'product':
return saveProductMetadata(data);
case 'device':
return saveMetadata(data.id, JSON.parse(data.metadata || '{}'));
const metadata = JSON.parse(data.metadata || '{}')
const dealMetadata = cloneDeep(metadata)
const productMetaData = JSON.parse(data?.productMetadata || '{}')
// 筛选出产品的物模型 剔除不传递给接口保存
const productMetaDataMap = new Map()
Object.keys(productMetaData).forEach((key:any)=>{
if(Array.isArray(productMetaData[key])){
const ids = productMetaData[key].map((item:any)=>{
return item.id
})
productMetaDataMap.set(key,ids)
}
})
Object.keys(metadata).forEach((key:any)=>{
if(Array.isArray(metadata[key])){
dealMetadata[key] = metadata[key].filter((item:any,index:number)=>{
//判断产品物模型是否有该id
return !(productMetaDataMap.get(key) && productMetaDataMap.get(key).includes(item.id))
})
}
})
return saveMetadata(data.id, dealMetadata);
}
};

View File

@ -300,6 +300,7 @@ const columns = [
});
}),
},
ellipsis:true
},
{
title: '注册时间',

View File

@ -10,9 +10,7 @@
:maxCount="1"
:showUploadList="false"
@change="uploadChange"
:accept="
props?.file ? `.${props?.file}` : '.xlsx'
"
:accept="props?.file ? `.${props?.file}` : '.xlsx'"
:before-upload="beforeUpload"
>
<j-button>
@ -28,20 +26,35 @@
</j-space>
</div>
</j-space>
<div style="margin-top: 20px" v-if="importLoading">
<!-- <div style="margin-top: 20px" v-if="importLoading">
<j-badge v-if="flag" status="processing" text="进行中" />
<j-badge v-else status="success" text="已完成" />
<span>总数量{{ count }}</span>
<p style="color: red">{{ errMessage }}</p>
</div> -->
<div class="importing-status" v-if="importStatus == 'importing'">
<AIcon type="LoadingOutlined" />
正在导入
</div>
<div class="column" v-if="importStatus != 'wait'">
<p>
<AIcon style="color: #00a4ff" type="CheckOutlined" />导入成功 总数量
{{ successNumber }}
</p>
<span v-if="failNumber">
<AIcon style="color: #e50012" type="CloseOutlined" />导入失败 总数量
{{ failNumber }}
</span>
</div>
</template>
<script lang="ts" setup>
import { FILE_UPLOAD } from '@/api/comm';
import { TOKEN_KEY } from '@/utils/variable';
import { LocalStore, onlyMessage } from '@/utils/comm';
import { downloadFileByUrl } from '@/utils/utils';
import { exportCard, _import } from '@/api/iot-card/cardManagement';
import { TOKEN_KEY, BASE_API_PATH } from '@/utils/variable';
import { getToken } from '@/utils/comm';
type Emits = {
(e: 'update:modelValue', data: string[]): void;
@ -63,11 +76,16 @@ const props = defineProps({
default: 'xlsx',
},
});
type ImportStatus = 'wait' | 'importing' | 'done';
const importStatus = ref<ImportStatus>('wait'); //
const importLoading = ref<boolean>(false);
const flag = ref<boolean>(false);
const count = ref<number>(0);
const errMessage = ref<string>('');
const detailFile = ref('');
const successNumber = ref<number>(0);
const failNumber = ref<number>(0);
const errorMessage = ref();
const downFile = async (type: string) => {
const res: any = await exportCard(type);
@ -96,20 +114,60 @@ const beforeUpload = (_file: any) => {
const uploadChange = async (info: Record<string, any>) => {
importLoading.value = true;
if (info.file.status === 'done') {
// const resp: any = info.file.response || { result: '' };
// flag.value = true;
// _import(props.product, { fileUrl: resp.result })
// .then((response: any) => {
// count.value = response.result?.total || 0
// onlyMessage('');
// errMessage.value = '';
// })
// .catch((err) => {
// errMessage.value = err?.response?.data?.message || ''
// })
// .finally(() => {
// flag.value = false;
// });
const resp: any = info.file.response || { result: '' };
flag.value = true;
_import(props.product, { fileUrl: resp.result })
.then((response: any) => {
count.value = response.result?.total || 0
onlyMessage('导入成功');
errMessage.value = '';
})
.catch((err) => {
errMessage.value = err?.response?.data?.message || '导入失败'
})
.finally(() => {
flag.value = false;
});
handleImport(resp);
}
};
const handleImport = async (file: any) => {
let message: any = [];
importStatus.value = 'importing';
let event: EventSource;
event = new EventSource(
`${BASE_API_PATH}/network/card/${
props.product
}/_import?:X_Access_Token=${getToken()}&fileUrl=${file.result}`,
{ withCredentials: true },
);
event.onopen = (e) => {
// pushMessage.value = []
console.log('open');
};
event.onmessage = (e) => {
const result = JSON.parse(e.data);
if (result.success) {
successNumber.value++;
} else {
if (result.rowNumber !== -1) {
failNumber.value++;
message.push({
rowNumber: `${result.rowNumber}`,
message: result.message,
name: result.name,
});
errorMessage.value = JSON.stringify(message);
} else {
detailFile.value = result.detailFile;
}
}
};
event.onerror = (err) => {
importStatus.value = 'done';
event.close();
};
};
</script>

View File

@ -142,8 +142,8 @@
:actions="getActions(slotProps, 'card')"
v-bind="slotProps"
:active="_selectedRowKeys.includes(slotProps.id)"
:status="slotProps.cardStateType.value"
:statusText="slotProps.cardStateType.text"
:status="slotProps.cardStateType?.value"
:statusText="slotProps.cardStateType?.text"
:statusNames="{
using: 'processing',
toBeActivated: 'default',
@ -183,14 +183,6 @@
</j-row>
<j-divider style="margin: 12px 0" />
<div class="content-bottom">
<!-- <div v-if="slotProps.usedFlow === 0">-->
<!-- <span class="flow-text">-->
<!-- {{ slotProps.totalFlow }}-->
<!-- </span>-->
<!-- <span class="card-item-content-text">-->
<!-- M 使用流量</span-->
<!-- >-->
<!-- </div>-->
<div>
<div class="progress-text">
<div>
@ -240,42 +232,6 @@
<span>{{ item?.text }}</span>
</template>
</PermissionButton>
<!-- <a-tooltip
v-bind="item.tooltip"
:title="item.disabled && item.tooltip.title"
>
<a-popconfirm
v-if="item.popConfirm"
v-bind="item.popConfirm"
:disabled="item.disabled"
>
<a-button :disabled="item.disabled">
<AIcon
type="DeleteOutlined"
v-if="item.key === 'delete'"
/>
<template v-else>
<AIcon :type="item.icon" />
<span>{{ item.text }}</span>
</template>
</a-button>
</a-popconfirm>
<template v-else>
<a-button
:disabled="item.disabled"
@click="item.onClick"
>
<AIcon
type="DeleteOutlined"
v-if="item.key === 'delete'"
/>
<template v-else>
<AIcon :type="item.icon" />
<span>{{ item.text }}</span>
</template>
</a-button>
</template>
</j-tooltip> -->
</template>
</CardBox>
</template>
@ -532,6 +488,7 @@ const columns = [
},
{
title: '总流量',
key: 'totalFlow',
dataIndex: 'totalFlow',
width: 120,
scopedSlots: true,
@ -723,6 +680,7 @@ const getActions = (
const resp: any = await del(data.id);
if (resp.status === 200) {
onlyMessage('操作成功');
_selectedRowKeys.value=[];
cardManageRef.value?.reload();
} else {
onlyMessage('操作失败!', 'error');
@ -777,6 +735,9 @@ const cancelSelect = () => {
};
const handleClick = (dt: any) => {
if(!dt?.cardStateType){
return
}
if (isCheck.value) {
if (_selectedRowKeys.value.includes(dt.id)) {
const _index = _selectedRowKeys.value.findIndex((i) => i === dt.id);

View File

@ -209,7 +209,13 @@ const columns = [
width: 150,
search: {
type: 'select',
options: options,
options: async() => {
const res: any = await supports();
return options.value = res.result.map((item: any) => ({
value: item.id,
label: item.name,
}));
},
},
scopedSlots: true,
},
@ -379,31 +385,41 @@ const getDetails = (slotProps: Partial<Record<string, any>>) => {
!!cluster[0].configuration.publicHos && (head = '公网:');
}
if (!shareCluster && cluster.length > 1) {
const contentItem2 = (cluster[0].configuration.publicHost ||
const contentItem2 =
(cluster[0].configuration.publicHost ||
cluster[0].configuration.remoteHost) +
':' +
(cluster[0].configuration.publicPort ||
cluster[0].configuration.remotePort)
let headItme2 ='远程'
cluster[0].configuration.remotePort);
let headItme2 = '远程';
!!cluster[0].configuration.publicHos && (headItme2 = '公网:');
if (cluster.length > 2) {
return head + headers + content + " " + headItme2 + headers + contentItem2 + '。。。'
return (
head +
headers +
content +
' ' +
headItme2 +
headers +
contentItem2 +
'。。。'
);
}
return head + headers + content + " " + headItme2 + headers + contentItem2
return (
head + headers + content + ' ' + headItme2 + headers + contentItem2
);
}
return head + headers + content;
};
const getSupports = async () => {
const res: any = await supports();
options.value = res.result.map((item: any) => ({
value: item.id,
label: item.name,
}));
};
getSupports();
// const getSupports = async () => {
// const res: any = await supports();
// options.value = res.result.map((item: any) => ({
// value: item.id,
// label: item.name,
// }));
// };
// getSupports();
/**
* 搜索

View File

@ -29,6 +29,7 @@
</template>
<template #card="slotProps">
<CardBox
@click="()=>jumpDetail(slotProps)"
:value="slotProps"
:actions="getActions(slotProps, 'card')"
v-bind="slotProps"
@ -450,4 +451,8 @@ getProductList();
const getProductName = (pid: string) => {
return productList.value.find((f: any) => f.value === pid)?.label;
};
const jumpDetail = (data:any) =>{
menuStory.jumpPage('device/Instance/Detail', { id: data.id });
}
</script>

View File

@ -50,7 +50,7 @@
:key="index"
:value="item.value"
>
<div
<Ellipsis
style="
text-align: center;
margin-top: 10px;
@ -65,7 +65,7 @@
style="height: 40px"
alt=""
/>{{ item.label }}
</div>
</Ellipsis>
</j-radio-button>
</j-radio-group>
</j-form-item>

View File

@ -78,9 +78,16 @@
<div class="content-des-title">
关联场景联动
</div>
<Ellipsis style='margin-bottom: 18px;'
<Ellipsis style="margin-bottom: 18px"
><div>
{{ (slotProps?.scene || []).map((item: any) => item?.name).join(',') || '' }}
{{
(slotProps?.scene || [])
.map(
(item: any) =>
item?.name,
)
.join(',') || ''
}}
</div></Ellipsis
>
</j-col>
@ -88,10 +95,15 @@
<div class="content-des-title">
告警级别
</div>
<div>
{{ (defaultLevel || []).find((item: any) => item?.level === slotProps.level)?.title ||
slotProps.level }}
</div>
<Ellipsis>
{{
(defaultLevel || []).find(
(item: any) =>
item?.level ===
slotProps.level,
)?.title || slotProps.level
}}
</Ellipsis>
</j-col>
</j-row>
</template>
@ -122,21 +134,20 @@
<span>{{ map[slotProps.targetType] }}</span>
</template>
<template #level="slotProps">
<j-tooltip
placement="topLeft"
:title="(defaultLevel || []).find((item) => item?.level === slotProps.level)?.title ||
slotProps.level"
>
<div class="ellipsis">
{{ (defaultLevel || []).find((item) => item?.level === slotProps.level)?.title ||
slotProps.level }}
</div>
</j-tooltip>
<Ellipsis>
{{
(defaultLevel || []).find(
(item) => item?.level === slotProps.level,
)?.title || slotProps.level
}}
</Ellipsis>
</template>
<template #scene="slotProps">
<span
>{{(slotProps?.scene || []).map((item) => item?.name).join(',') || ''}}</span
>
<span>{{
(slotProps?.scene || [])
.map((item) => item?.name)
.join(',') || ''
}}</span>
</template>
<template #state="slotProps">
<BadgeStatus
@ -184,7 +195,12 @@
</FullPage>
</div>
</page-container>
<HandTrigger @save="onSave" @close="visible = false" v-if="visible" :data="current" />
<HandTrigger
@save="onSave"
@close="visible = false"
v-if="visible"
:data="current"
/>
</template>
<script lang="ts" setup>
@ -267,7 +283,6 @@ const columns = [
},
},
width: 200,
ellipsis: true,
},
{
title: '关联场景联动',
@ -278,20 +293,23 @@ const columns = [
type: 'select',
// defaultTermType: 'rule-bind-alarm',
options: async () => {
const allData = await queryList({paging: false, sorts: [{ name: 'createTime', order: 'desc' }]})
const result = allData.result?.data as any[]
const allData = await queryList({
paging: false,
sorts: [{ name: 'createTime', order: 'desc' }],
});
const result = allData.result?.data as any[];
if (allData.success && result && result.length) {
const sceneDataMap = new Map() //
result.forEach(item => {
const sceneDataMap = new Map(); //
result.forEach((item) => {
item.scene.forEach((a: any) => {
sceneDataMap.set(a.id, {
label: a.name,
value: a.id
})
})
})
value: a.id,
});
});
});
return [...sceneDataMap.values()]
return [...sceneDataMap.values()];
}
// const res = await getScene(
@ -366,17 +384,17 @@ const handleSearch = (e: any) => {
return {
...i,
termType: 'rule-bind-alarm',
column: 'id'
column: 'id',
};
}
}
return i
})
return item
})
return i;
});
return item;
});
params.value = {
...e,
terms: _terms
}
terms: _terms,
};
};
const queryDefaultLevel = () => {
queryLevel().then((res) => {
@ -406,7 +424,7 @@ const getActions = (
},
onClick: () => {
visible.value = true;
current.value = data
current.value = data;
},
icon: 'LikeOutlined',
},
@ -467,7 +485,7 @@ const getActions = (
data?.state?.value !== 'disabled'
? '请先禁用该告警,再删除'
: '删除',
placement:"topLeft"
placement: 'topLeft',
},
popConfirm: {
title: '确认删除?',
@ -491,7 +509,7 @@ const getActions = (
const onSave = () => {
visible.value = false;
tableRef.value?.reload();
}
};
const add = () => {
menuStory.jumpPage('rule-engine/Alarm/Configuration/Save');
};

View File

@ -33,6 +33,7 @@
4: 'level4',
5: 'level5',
}"
:customBadge="true"
>
<template #img>
<img
@ -121,6 +122,13 @@
<template #alarmTime="slotProps">
{{ dayjs(slotProps.alarmTime).format('YYYY-MM-DD HH:mm:ss')}}
</template>
<template #level="slotProps">
<Ellipsis style="width: calc(100% - 20px)">
{{ data.defaultLevel.find((i)=>{
return i.level === slotProps.level
}).title}}
</Ellipsis>
</template>
<template #state="slotProps">
<BadgeStatus
:status="slotProps.state.value"
@ -240,6 +248,7 @@ const columns = [
title: '告警级别',
dataIndex: 'level',
key: 'level',
width:200,
search: {
type: 'select',
options: data.value.defaultLevel.map((item: any) => {
@ -249,6 +258,7 @@ const columns = [
};
}),
},
scopedSlots: true
},
{
title: '最近告警时间',

View File

@ -20,7 +20,14 @@
:title="item.alarmName"
placement="topLeft"
>
<a @click="()=>{return jumpDetail(item)}">{{ item.alarmName }}</a>
<a
@click="
() => {
return jumpDetail(item);
}
"
>{{ item.alarmName }}</a
>
</j-tooltip>
</div>
<div class="new-alarm-item-state">
@ -42,13 +49,16 @@
{{ item.state?.text }}
</span>
</div>
<div
:class="[
'new-alarm-item-level',
`level-${item.level}`,
]"
>
<Ellipsis style="width: calc(100%)">
{{ item.levelName }}
</Ellipsis>
</div>
</div>
</li>
@ -73,8 +83,11 @@ const props = defineProps({
});
const menuStore = useMenuStore();
const jumpDetail = (item: any) => {
menuStore.jumpPage(`rule-engine/Alarm/Log/Detail`,{id:item.id,detail:true});
}
menuStore.jumpPage(`rule-engine/Alarm/Log/Detail`, {
id: item.id,
detail: true,
});
};
</script>
<style scoped lang="less">
.new-alarm {

View File

@ -13,11 +13,11 @@
</TitleComponent>
<template v-if='open'>
<div>
<j-tabs type="editable-card" v-model:activeKey="activeKey" @edit="addGroup">
<j-tabs type="editable-card" v-model:activeKey="activeKey" @edit="addGroup" @tabClick="showEditCondition">
<j-tab-pane
v-for="(b, i) in group"
:key="b.id"
:tab="`条件${i + 1}`"
:tab="b.branchName || `条件${i+1}`"
:closable="false"
>
<template v-for='(item, index) in data.branches'>
@ -64,6 +64,13 @@
</j-form-item>
</div>
</div>
<j-modal v-if="editConditionVisible" title="编辑" visible @cancel="editConditionVisible = false" @ok="changeBranchName">
<j-form layout='vertical'>
<j-form-item label="条件名称:" :required="true">
<j-input v-model:value="conditionName"></j-input>
</j-form-item>
</j-form>
</j-modal>
</template>
<script setup lang='ts' name='Terms'>
@ -84,6 +91,8 @@ const open = ref<boolean>(false)
const columnOptions = ref<any>([])
const group = ref<Array<{ id: string, len: number}>>([])
const activeKey = ref('')
const editConditionVisible = ref(false);
const conditionName = ref<any>('')
provide(ContextKey, columnOptions)
@ -183,7 +192,8 @@ const addGroup = () => {
},
then: [],
executeAnyway: true,
branchId: Math.floor(Math.random() * 100000000)
branchId: Math.floor(Math.random() * 100000000),
branchName:'条件'+ data.value.branches?.length
}
data.value.branches?.push(branchesItem)
data.value.branches?.push(null as any)
@ -210,6 +220,24 @@ const groupDelete = (g: any, index: number) => {
activeKey.value = group.value[_index].id
}
const showEditCondition = (key:any) =>{
if(key === activeKey.value){
editConditionVisible.value = true;
conditionName.value = group.value.find((i:any)=>{
return i.id === key
})?.branchName
}
}
const changeBranchName = () =>{
console.log(data.value)
data.value.branches?.forEach((item:any)=>{
if(item?.key === activeKey.value.slice(6)){
item.branchName = conditionName.value
}
})
editConditionVisible.value =false
}
watchEffect(() => {
if (data.value.trigger?.device) {
queryColumn({ trigger: data.value.trigger })
@ -242,7 +270,8 @@ watchEffect(() => {
_group[lastIndex + 1] = {
id: `group_${item.key}`,
len: 1,
start: index
start: index,
branchName:item.branchName
}
} else {
_group[lastIndex].len += 1
@ -258,7 +287,7 @@ watchEffect(() => {
activeKey.value = _group[0].id
}
}
console.log(group.value,'group')
})
</script>

View File

@ -1438,6 +1438,17 @@ import { Rule } from 'ant-design-vue/lib/form';
import ApplyList from './ApplyList/index.vue';
const emit = defineEmits(['changeApplyType']);
const defaultImg = {
'internal-standalone': getImage('/apply/internal-standalone.png'),
'internal-integrated': getImage('/apply/internal-integrated.png'),
'wechat-webapp': getImage('/apply/wechat-webapp.png'),
'dingtalk-ent-app': getImage('/apply/dingtalk-ent-app.png'),
'third-party': getImage('/apply/third-party.png'),
'wechat-miniapp': getImage('/apply/wechat-miniapp.png'),
};
const routeQuery = useRoute().query;
const menuStory = useMenuStore();
@ -1601,6 +1612,8 @@ onMounted(async () => {
typeOptions.value = typeOptions.value.filter((i: any) => {
return i.value === routeQuery.provider;
});
console.log(typeOptions.value[0].value)
form.data.logoUrl = defaultImg[typeOptions.value[0].value]
}
});

View File

@ -53,11 +53,11 @@
</slot>
</template>
<template #content>
<h3 class="card-item-content-title">
<Ellipsis>
<h3 class="card-item-content-title">
{{ slotProps.name }}
</Ellipsis>
</h3>
</Ellipsis>
<j-row>
<j-col :span="12">
<div class="card-item-content-text">
@ -102,13 +102,21 @@
) in item.children"
:key="i"
>
<j-tooltip :title="o?.tooltip?.title">
<j-tooltip
:title="
o?.tooltip?.title
"
>
<j-button
type="link"
@click="o.onClick"
:disabled="o.disabled"
:disabled="
o.disabled
"
>
<AIcon :type="o.icon" />
<AIcon
:type="o.icon"
/>
<span>{{
o.text
}}</span>
@ -194,7 +202,12 @@
:data="current"
mode="edit"
@cancel="dialogVisible = false"
@ok="() => { dialogVisible = false; table.refresh}"
@ok="
() => {
dialogVisible = false;
table.refresh;
}
"
/>
</div>
<Add v-if="visible" @close="visible = false" />
@ -204,12 +217,12 @@
<script setup lang="ts" name="Apply">
import PermissionButton from '@/components/PermissionButton/index.vue';
import MenuDialog from './componenets/MenuDialog.vue';
import ThirdMenu from './componenets/ThirdMenu.vue'
import ThirdMenu from './componenets/ThirdMenu.vue';
import {
getApplyList_api,
changeApplyStatus_api,
delApply_api,
queryType
queryType,
} from '@/api/system/apply';
import { getImage, onlyMessage } from '@/utils/comm';
import { useMenuStore } from '@/store/menu';
@ -219,9 +232,9 @@ import Add from './Save/Add.vue';
const menuStory = useMenuStore();
const permission = 'system/Apply';
const typeOptions = ref<any[]>([])
const visible = ref<boolean>(false)
const addMenuVisible = ref<boolean>(false)
const typeOptions = ref<any[]>([]);
const visible = ref<boolean>(false);
const addMenuVisible = ref<boolean>(false);
onMounted(() => {
queryType().then((resp: any) => {
@ -229,11 +242,11 @@ onMounted(() => {
const arr = resp.result.map((item: any) => ({
label: item.name,
value: item.provider,
}))
typeOptions.value = arr
}));
typeOptions.value = arr;
}
});
})
});
const columns = [
{
title: '名称',
@ -309,14 +322,14 @@ const columns = [
const queryParams = ref({});
const tableRef = ref();
const current = ref<any>({})
const current = ref<any>({});
const table = {
refresh: () => {
// tableRef.value.reload(queryParams.value);
window.location.reload()
window.location.reload();
},
toAdd: () => {
visible.value = true
visible.value = true;
},
toSave: (id?: string, view = false) => {
if (id) menuStory.jumpPage('system/Apply/Save', {}, { id, view });
@ -408,7 +421,7 @@ const table = {
onClick: () => {
selectId.value = data.id;
selectProvider.value = data.provider;
current.value = data
current.value = data;
dialogVisible.value = true;
},
});

View File

@ -44,11 +44,13 @@
label="排序"
:rules="[{ required: true, message: '请输入排序' }]"
>
<j-input
<j-input-number
style="width: 100%;"
v-model:value="form.data.sortIndex"
placeholder="请输入排序"
:maxlength="64"
@blur="form.checkSort"
:controls="false"
:min="0"
:max="99999999"
/>
</j-form-item>
</j-form>
@ -140,7 +142,6 @@ const filterTree = (treeNode: treeType[]) => {
const formRef = ref<FormInstance>();
const form = reactive({
data: {} as formType,
beforeSortIndex: '' as string | number,
init: () => {
if (props.data.id) {
@ -160,19 +161,10 @@ const form = reactive({
sortIndex: props.data.sortIndex,
};
}
form.beforeSortIndex = form.data.sortIndex;
nextTick(() => {
formRef.value?.clearValidate();
});
},
checkSort: (e: any) => {
const value = e.target.value.match(/^[1-9]*/)[0];
if (value) {
form.data.sortIndex = value;
form.beforeSortIndex = value;
} else form.data.sortIndex = form.beforeSortIndex;
},
submit: () => {
const api = form.data.id ? updateDepartment_api : addDepartment_api;
form.data.parentId = form.data.parentId ? form.data.parentId : '';

View File

@ -215,15 +215,15 @@ const openDialog = (row: any = {}) => {
// +1
let sortIndex = row.sortIndex || 1;
if (!row.id) {
let childrens = [] as any[];
let children = [] as any[];
if (row.parentId) {
childrens = row.children;
} else childrens = treeData.value;
const indexs =
childrens?.length > 0
? childrens?.map((item) => item.sortIndex)
children = row.children;
} else children = treeData.value;
const index =
children?.length > 0
? children?.map((item) => item.sortIndex)
: [0];
sortIndex = Math.max(...indexs) + 1;
sortIndex = Math.max(...index) + 1;
}
dialog.selectItem = { ...row, sortIndex };

View File

@ -37,22 +37,16 @@
:model="form"
class="login-form"
@finish="onFinish"
:rules='rules'
>
<j-form-item
label="账号"
name="username"
:rules="rules"
>
<j-form-item label="账号" name="username">
<j-input
v-model:value="form.username"
placeholder="请输入账号"
:maxlength="64"
></j-input>
</j-form-item>
<j-form-item
label="密码"
name="password"
>
<j-form-item label="密码" name="password">
<j-input-password
v-model:value="form.password"
placeholder="请输入密码"
@ -117,25 +111,89 @@
</j-divider>
<div class="other-button">
<div
class='other-button-item'
v-for="(item, index) in bindings.slice(0,4)"
class="other-button-item"
v-for="(
item, index
) in bindings.slice(0, 4)"
:key="index"
@click="handleClickOther(item)"
>
<img
style="width: 32px; height: 32px"
style="
width: 32px;
height: 32px;
"
:alt="item.name"
:src="
item.logoUrl || iconMap.get(
item.logoUrl ||
iconMap.get(
item.provider,
) || defaultImg
) ||
defaultImg
"
/>
</div>
<j-popover
trigger="click"
v-model:visible="moreVisible"
placement="bottomRight"
>
<template #content>
<j-scrollbar :max-height="120">
<div class="more-button">
<div
class="more-button-item"
v-for="(
item, index
) in bindings"
:key="index"
@click="
handleClickOther(
item,
)
"
>
<img
style="
width: 32px;
height: 32px;
"
:alt="item.name"
:src="
item.logoUrl
"
/>
<Ellipsis
style="
margin-top: 5px;
width: calc(
100%
);
margin: 0
auto;
"
>
{{ item.name }}
</Ellipsis>
</div>
<div class="more" v-if="bindings.length > 4" @click="moreVisible = true">
</div>
</j-scrollbar>
</template>
<div
v-if="bindings.length > 4"
class="more"
>
<AIcon
class="moreIcon"
type="MoreOutlined"
style="font-size: 20px"
></AIcon>
</div>
</j-popover>
</div>
<!-- <div class="more" v-if="bindings.length > 4" @click="moreVisible = true">
查看更多
</div>
</div> -->
</div>
</div>
</div>
@ -161,7 +219,7 @@
</div>
</j-spin>
</div>
<j-modal
<!-- <j-modal
title="更多登录"
:visible="moreVisible"
@cancel="() => (moreVisible = false)"
@ -180,12 +238,18 @@
:alt="item.name"
:src="item.logoUrl"
/>
<Ellipsis style="margin-top: 5px; width:calc(100% - 40px); margin: 0 auto">
<Ellipsis
style="
margin-top: 5px;
width: calc(100% - 40px);
margin: 0 auto;
"
>
{{ item.name }}
</Ellipsis>
</div>
</div>
</j-modal>
</j-modal> -->
</template>
<script setup lang="ts">
@ -197,16 +261,17 @@ import {
getInitSet,
systemVersion,
bindInfo,
settingDetail, userDetail,
authLoginConfig
} from '@/api/login'
settingDetail,
userDetail,
authLoginConfig,
} from '@/api/login';
import { useUserInfo } from '@/store/userInfo';
import { useSystem } from '@/store/system'
import { useSystem } from '@/store/system';
import { LocalStore } from '@/utils/comm';
import { BASE_API_PATH, TOKEN_KEY, Version_Code } from '@/utils/variable';
import { SystemConst } from '@/utils/consts';
import {encrypt} from '@/utils/encrypt'
import { closeWs } from '@/utils/websocket'
import { encrypt } from '@/utils/encrypt';
import { closeWs } from '@/utils/websocket';
const store = useUserInfo();
const systemStore = useSystem();
@ -217,7 +282,7 @@ const viewLogo = getImage('/view-logo.png');
const LoginWarpStyle = reactive({
backgroundImage: `url(${bgImage})`,
});
const moreVisible = ref(false)
const moreVisible = ref(false);
const screenWidth = ref(document.body.clientWidth);
const screenHeight = ref(document.body.clientHeight);
@ -233,41 +298,41 @@ const form = reactive({
const RsaConfig = reactive<any>({
enabled: false, //
publicKey: '', //rsa,使
id:'' //ID
})
id: '', //ID
});
const rules = {
username: [
{
validator(_: any, value: string) {
if (!value) {
return Promise.reject('请输入账号!')
}
return Promise.resolve()
}
return Promise.reject('请输入账号!');
}
return Promise.resolve();
},
},
],
password: [
{
validator(_: any, value: string) {
if (!value) {
return Promise.reject('请输入密码!')
}
return Promise.resolve()
}
return Promise.reject('请输入密码!');
}
return Promise.resolve();
},
},
],
verifyCode: [
{
validator(_: any, value: string) {
if (!value) {
return Promise.reject('请输入验证码!')
}
return Promise.resolve()
}
}
]
return Promise.reject('请输入验证码!');
}
return Promise.resolve();
},
},
],
};
const codeUrl = ref('');
const codeConfig = ref(false);
@ -290,22 +355,24 @@ const onFinish = async () => {
const data = {
...form,
password:RsaConfig.enabled?encrypt(form.password,RsaConfig.publicKey):form.password,
encryptId:RsaConfig.enabled?RsaConfig.id:undefined
}
password: RsaConfig.enabled
? encrypt(form.password, RsaConfig.publicKey)
: form.password,
encryptId: RsaConfig.enabled ? RsaConfig.id : undefined,
};
const res: any = await authLogin(data);
loading.value = false;
if (res.success) {
LocalStore.set(TOKEN_KEY, res?.result.token);
const userResp = await userDetail()
const userResp = await userDetail();
if (userResp.success) {
store.$patch({
userInfos: {
...userResp.result,
token: res?.result.token,
},
isAdmin: userResp.username === "admin",
isAdmin: userResp.username === 'admin',
});
if (userResp.result?.username === 'admin') {
@ -318,7 +385,7 @@ const onFinish = async () => {
}
} else {
store.$patch({
...res.result
...res.result,
});
}
window.location.href = '/';
@ -328,7 +395,7 @@ const onFinish = async () => {
form.verifyCode = '';
getCode();
loading.value = false;
getRsa()
getRsa();
}
};
@ -345,7 +412,6 @@ const getCode = async () => {
}
};
const getOpen = () => {
LocalStore.removeAll();
systemVersion().then((res: any) => {
@ -360,24 +426,24 @@ const getOpen = () => {
}
}
});
systemStore.getFront()
systemStore.getFront();
};
//
const getRsa = async () => {
const res:any = await authLoginConfig()
const res: any = await authLoginConfig();
if (res.status === 200) {
if (res.result?.encrypt) {
RsaConfig.enabled = res.result?.encrypt.enabled
RsaConfig.publicKey = res.result?.encrypt.publicKey
RsaConfig.id = res.result?.encrypt.id
}
RsaConfig.enabled = res.result?.encrypt.enabled;
RsaConfig.publicKey = res.result?.encrypt.publicKey;
RsaConfig.id = res.result?.encrypt.id;
}
}
};
const basis = computed(() => {
return systemStore.configInfo['front'] || {}
})
return systemStore.configInfo['front'] || {};
});
const handleClickOther = (item: any) => {
LocalStore.set('onLogin', 'no');
window.open(`${BASE_API_PATH}/application/sso/${item.id}/login`);
@ -411,11 +477,10 @@ getOpen();
getCode();
screenRotation(screenWidth.value, screenHeight.value);
closeWs()
closeWs();
onMounted(() => {
getRsa()
})
getRsa();
});
</script>
<style scoped lang="less">
@ -541,7 +606,12 @@ onMounted(()=>{
cursor: pointer;
padding: 4px;
}
}
.more {
cursor: pointer;
.moreIcon {
transform: translateY(50%);
}
}
.more{
text-align: center;
@ -637,11 +707,13 @@ onMounted(()=>{
display: flex;
flex-wrap: wrap;
cursor: pointer;
overflow: auto;
width: 300px;
.more-button-item {
width: 18%;
margin-left: 2%;
width: 62px;
text-align: center;
margin-bottom: 20px
margin-bottom: 10px;
margin-left: 12px;
}
}
</style>

View File

@ -97,8 +97,8 @@ export default defineConfig(({ mode}) => {
// target: 'http://192.168.32.163:8844', //张本地
// target: 'http://120.77.179.54:8844', // 120测试
target: 'http://192.168.33.46:8844', // 本地开发环境
// target: 'http://192.168.33.1:8845', // 社区版开发环境
// target: 'http://192.168.32.200:8844', // 刘本地
// target: 'http://192.168.33.1:8848', // 社区版开发环境
// target: 'http://192.168.32.207:8844', // 刘本地
// target: 'http://192.168.32.187:8844', // 谭本地
ws: 'ws://192.168.33.46:8844',
changeOrigin: true,

1756
yarn.lock

File diff suppressed because it is too large Load Diff