更多登录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", "name": "jetlinks-vue",
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"@ant-design/icons-vue": "^7.0.1",
"@liveqing/liveplayer-v3": "^3.7.10", "@liveqing/liveplayer-v3": "^3.7.10",
"@types/marked": "^4.0.8", "@types/marked": "^4.0.8",
"@vitejs/plugin-vue-jsx": "^3.0.0", "@vitejs/plugin-vue-jsx": "^3.0.0",
@ -31,6 +32,7 @@
"nrm": "^1.2.5", "nrm": "^1.2.5",
"pinia": "^2.0.28", "pinia": "^2.0.28",
"rollup-plugin-copy": "^3.4.0", "rollup-plugin-copy": "^3.4.0",
"rxjs": "^7.8.1",
"unplugin-auto-import": "^0.12.1", "unplugin-auto-import": "^0.12.1",
"unplugin-vue-components": "^0.22.12", "unplugin-vue-components": "^0.22.12",
"v-clipboard3": "^0.1.4", "v-clipboard3": "^0.1.4",
@ -130,9 +132,9 @@
"integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw=="
}, },
"node_modules/@ant-design/icons-vue": { "node_modules/@ant-design/icons-vue": {
"version": "6.1.0", "version": "7.0.1",
"resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz", "resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-7.0.1.tgz",
"integrity": "sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==", "integrity": "sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==",
"dependencies": { "dependencies": {
"@ant-design/colors": "^6.0.0", "@ant-design/colors": "^6.0.0",
"@ant-design/icons-svg": "^4.2.1" "@ant-design/icons-svg": "^4.2.1"
@ -1944,6 +1946,32 @@
"resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.12.0.tgz", "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.12.0.tgz",
"integrity": "sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ==" "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": { "node_modules/@vueuse/shared": {
"version": "9.12.0", "version": "9.12.0",
"resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.12.0.tgz", "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.12.0.tgz",
@ -2273,6 +2301,18 @@
"vue": ">=3.2.0" "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": { "node_modules/anymatch": {
"version": "3.1.3", "version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@ -3015,6 +3055,62 @@
"integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
"dev": true "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": { "node_modules/combined-stream": {
"version": "1.0.8", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@ -7825,11 +7921,15 @@
}, },
"node_modules/npm/node_modules/ansicolors": { "node_modules/npm/node_modules/ansicolors": {
"version": "0.3.2", "version": "0.3.2",
"resolved": "http://registry.jetlinks.cn/ansicolors/-/ansicolors-0.3.2.tgz",
"integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==",
"inBundle": true, "inBundle": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/npm/node_modules/ansistyles": { "node_modules/npm/node_modules/ansistyles": {
"version": "0.1.3", "version": "0.1.3",
"resolved": "http://registry.jetlinks.cn/ansistyles/-/ansistyles-0.1.3.tgz",
"integrity": "sha512-6QWEyvMgIXX0eO972y7YPBLSBsq7UWKFAoNNTLGaOJ9bstcEL9sCbcjf96dVfNDdUsRoGOK82vWFJlKApXds7g==",
"inBundle": true, "inBundle": true,
"license": "MIT" "license": "MIT"
}, },
@ -7842,6 +7942,8 @@
}, },
"node_modules/npm/node_modules/archy": { "node_modules/npm/node_modules/archy": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "http://registry.jetlinks.cn/archy/-/archy-1.0.0.tgz",
"integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==",
"inBundle": true, "inBundle": true,
"license": "MIT" "license": "MIT"
}, },
@ -8054,6 +8156,8 @@
}, },
"node_modules/npm/node_modules/cli-columns": { "node_modules/npm/node_modules/cli-columns": {
"version": "3.1.2", "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, "inBundle": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -8195,6 +8299,8 @@
}, },
"node_modules/npm/node_modules/columnify": { "node_modules/npm/node_modules/columnify": {
"version": "1.5.4", "version": "1.5.4",
"resolved": "http://registry.jetlinks.cn/columnify/-/columnify-1.5.4.tgz",
"integrity": "sha512-rFl+iXVT1nhLQPfGDw+3WcS8rmm7XsLKUmhsGE3ihzzpIikeGrTaZPIRKYWeLsLBypsHzjXIvYEltVUZS84XxQ==",
"inBundle": true, "inBundle": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -8715,6 +8821,10 @@
}, },
"node_modules/npm/node_modules/init-package-json": { "node_modules/npm/node_modules/init-package-json": {
"version": "2.0.5", "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, "inBundle": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@ -8747,6 +8857,8 @@
}, },
"node_modules/npm/node_modules/is-cidr": { "node_modules/npm/node_modules/is-cidr": {
"version": "4.0.2", "version": "4.0.2",
"resolved": "http://registry.jetlinks.cn/is-cidr/-/is-cidr-4.0.2.tgz",
"integrity": "sha512-z4a1ENUajDbEl/Q6/pVBpTR1nBjjEE1X7qb7bmWYanNnPoKAvUCPFKeXV6Fe4mgTkWKBqiHIcwsI3SndiO5FeA==",
"inBundle": true, "inBundle": true,
"license": "BSD-2-Clause", "license": "BSD-2-Clause",
"dependencies": { "dependencies": {
@ -8885,6 +8997,8 @@
}, },
"node_modules/npm/node_modules/libnpmaccess": { "node_modules/npm/node_modules/libnpmaccess": {
"version": "4.0.3", "version": "4.0.3",
"resolved": "http://registry.jetlinks.cn/libnpmaccess/-/libnpmaccess-4.0.3.tgz",
"integrity": "sha512-sPeTSNImksm8O2b6/pf3ikv4N567ERYEpeKRPSmqlNt1dTZbvgpJIzg5vAhXHpw2ISBsELFRelk0jEahj1c6nQ==",
"inBundle": true, "inBundle": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@ -8899,6 +9013,8 @@
}, },
"node_modules/npm/node_modules/libnpmdiff": { "node_modules/npm/node_modules/libnpmdiff": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "http://registry.jetlinks.cn/libnpmdiff/-/libnpmdiff-2.0.4.tgz",
"integrity": "sha512-q3zWePOJLHwsLEUjZw3Kyu/MJMYfl4tWCg78Vl6QGSfm4aXBUSVzMzjJ6jGiyarsT4d+1NH4B1gxfs62/+y9iQ==",
"inBundle": true, "inBundle": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@ -8917,6 +9033,8 @@
}, },
"node_modules/npm/node_modules/libnpmexec": { "node_modules/npm/node_modules/libnpmexec": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "http://registry.jetlinks.cn/libnpmexec/-/libnpmexec-2.0.1.tgz",
"integrity": "sha512-4SqBB7eJvJWmUKNF42Q5qTOn20DRjEE4TgvEh2yneKlAiRlwlhuS9MNR45juWwmoURJlf2K43bozlVt7OZiIOw==",
"inBundle": true, "inBundle": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@ -8938,6 +9056,8 @@
}, },
"node_modules/npm/node_modules/libnpmfund": { "node_modules/npm/node_modules/libnpmfund": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "http://registry.jetlinks.cn/libnpmfund/-/libnpmfund-1.1.0.tgz",
"integrity": "sha512-Kfmh3pLS5/RGKG5WXEig8mjahPVOxkik6lsbH4iX0si1xxNi6eeUh/+nF1MD+2cgalsQif3O5qyr6mNz2ryJrQ==",
"inBundle": true, "inBundle": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@ -8946,6 +9066,8 @@
}, },
"node_modules/npm/node_modules/libnpmhook": { "node_modules/npm/node_modules/libnpmhook": {
"version": "6.0.3", "version": "6.0.3",
"resolved": "http://registry.jetlinks.cn/libnpmhook/-/libnpmhook-6.0.3.tgz",
"integrity": "sha512-3fmkZJibIybzmAvxJ65PeV3NzRc0m4xmYt6scui5msocThbEp4sKFT80FhgrCERYDjlUuFahU6zFNbJDHbQ++g==",
"inBundle": true, "inBundle": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@ -8958,6 +9080,8 @@
}, },
"node_modules/npm/node_modules/libnpmorg": { "node_modules/npm/node_modules/libnpmorg": {
"version": "2.0.3", "version": "2.0.3",
"resolved": "http://registry.jetlinks.cn/libnpmorg/-/libnpmorg-2.0.3.tgz",
"integrity": "sha512-JSGl3HFeiRFUZOUlGdiNcUZOsUqkSYrg6KMzvPZ1WVZ478i47OnKSS0vkPmX45Pai5mTKuwIqBMcGWG7O8HfdA==",
"inBundle": true, "inBundle": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@ -8970,6 +9094,8 @@
}, },
"node_modules/npm/node_modules/libnpmpack": { "node_modules/npm/node_modules/libnpmpack": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "http://registry.jetlinks.cn/libnpmpack/-/libnpmpack-2.0.1.tgz",
"integrity": "sha512-He4/jxOwlaQ7YG7sIC1+yNeXeUDQt8RLBvpI68R3RzPMZPa4/VpxhlDo8GtBOBDYoU8eq6v1wKL38sq58u4ibQ==",
"inBundle": true, "inBundle": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@ -8983,6 +9109,8 @@
}, },
"node_modules/npm/node_modules/libnpmpublish": { "node_modules/npm/node_modules/libnpmpublish": {
"version": "4.0.2", "version": "4.0.2",
"resolved": "http://registry.jetlinks.cn/libnpmpublish/-/libnpmpublish-4.0.2.tgz",
"integrity": "sha512-+AD7A2zbVeGRCFI2aO//oUmapCwy7GHqPXFJh3qpToSRNU+tXKJ2YFUgjt04LPPAf2dlEH95s6EhIHM1J7bmOw==",
"inBundle": true, "inBundle": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@ -8998,6 +9126,8 @@
}, },
"node_modules/npm/node_modules/libnpmsearch": { "node_modules/npm/node_modules/libnpmsearch": {
"version": "3.1.2", "version": "3.1.2",
"resolved": "http://registry.jetlinks.cn/libnpmsearch/-/libnpmsearch-3.1.2.tgz",
"integrity": "sha512-BaQHBjMNnsPYk3Bl6AiOeVuFgp72jviShNBw5aHaHNKWqZxNi38iVNoXbo6bG/Ccc/m1To8s0GtMdtn6xZ1HAw==",
"inBundle": true, "inBundle": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@ -9009,6 +9139,8 @@
}, },
"node_modules/npm/node_modules/libnpmteam": { "node_modules/npm/node_modules/libnpmteam": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "http://registry.jetlinks.cn/libnpmteam/-/libnpmteam-2.0.4.tgz",
"integrity": "sha512-FPrVJWv820FZFXaflAEVTLRWZrerCvfe7ZHSMzJ/62EBlho2KFlYKjyNEsPW3JiV7TLSXi3vo8u0gMwIkXSMTw==",
"inBundle": true, "inBundle": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@ -9021,6 +9153,8 @@
}, },
"node_modules/npm/node_modules/libnpmversion": { "node_modules/npm/node_modules/libnpmversion": {
"version": "1.2.1", "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, "inBundle": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@ -9322,6 +9456,8 @@
}, },
"node_modules/npm/node_modules/node-gyp/node_modules/npmlog": { "node_modules/npm/node_modules/node-gyp/node_modules/npmlog": {
"version": "4.1.2", "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, "inBundle": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@ -9380,6 +9516,8 @@
}, },
"node_modules/npm/node_modules/npm-audit-report": { "node_modules/npm/node_modules/npm-audit-report": {
"version": "2.1.5", "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, "inBundle": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@ -9468,6 +9606,8 @@
}, },
"node_modules/npm/node_modules/npm-profile": { "node_modules/npm/node_modules/npm-profile": {
"version": "5.0.4", "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, "inBundle": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@ -9497,11 +9637,15 @@
}, },
"node_modules/npm/node_modules/npm-user-validate": { "node_modules/npm/node_modules/npm-user-validate": {
"version": "1.0.1", "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, "inBundle": true,
"license": "BSD-2-Clause" "license": "BSD-2-Clause"
}, },
"node_modules/npm/node_modules/npmlog": { "node_modules/npm/node_modules/npmlog": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "http://registry.jetlinks.cn/npmlog/-/npmlog-5.0.1.tgz",
"integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
"inBundle": true, "inBundle": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@ -9513,6 +9657,8 @@
}, },
"node_modules/npm/node_modules/npmlog/node_modules/are-we-there-yet": { "node_modules/npm/node_modules/npmlog/node_modules/are-we-there-yet": {
"version": "2.0.0", "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, "inBundle": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@ -9565,6 +9711,8 @@
}, },
"node_modules/npm/node_modules/opener": { "node_modules/npm/node_modules/opener": {
"version": "1.5.2", "version": "1.5.2",
"resolved": "http://registry.jetlinks.cn/opener/-/opener-1.5.2.tgz",
"integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
"inBundle": true, "inBundle": true,
"license": "(WTFPL OR MIT)", "license": "(WTFPL OR MIT)",
"bin": { "bin": {
@ -9723,6 +9871,8 @@
}, },
"node_modules/npm/node_modules/qrcode-terminal": { "node_modules/npm/node_modules/qrcode-terminal": {
"version": "0.12.0", "version": "0.12.0",
"resolved": "http://registry.jetlinks.cn/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz",
"integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==",
"inBundle": true, "inBundle": true,
"bin": { "bin": {
"qrcode-terminal": "bin/qrcode-terminal.js" "qrcode-terminal": "bin/qrcode-terminal.js"
@ -10155,11 +10305,15 @@
}, },
"node_modules/npm/node_modules/text-table": { "node_modules/npm/node_modules/text-table": {
"version": "0.2.0", "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, "inBundle": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/npm/node_modules/tiny-relative-date": { "node_modules/npm/node_modules/tiny-relative-date": {
"version": "1.3.0", "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, "inBundle": true,
"license": "MIT" "license": "MIT"
}, },
@ -10427,6 +10581,14 @@
"node": ">=6" "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": { "node_modules/only": {
"version": "0.0.2", "version": "0.0.2",
"resolved": "https://registry.jetlinks.cn/only/-/only-0.0.2.tgz", "resolved": "https://registry.jetlinks.cn/only/-/only-0.0.2.tgz",
@ -11447,10 +11609,9 @@
} }
}, },
"node_modules/rxjs": { "node_modules/rxjs": {
"version": "7.8.0", "version": "7.8.1",
"resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.0.tgz", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
"integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
"dev": true,
"dependencies": { "dependencies": {
"tslib": "^2.1.0" "tslib": "^2.1.0"
} }
@ -11700,6 +11861,11 @@
"tslib": "^2.0.3" "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": { "node_modules/source-map": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@ -12929,6 +13095,22 @@
"vue": "^3.2.37" "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": { "node_modules/warning": {
"version": "4.0.3", "version": "4.0.3",
"resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
@ -13349,9 +13531,9 @@
"integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw=="
}, },
"@ant-design/icons-vue": { "@ant-design/icons-vue": {
"version": "6.1.0", "version": "7.0.1",
"resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz", "resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-7.0.1.tgz",
"integrity": "sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==", "integrity": "sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==",
"requires": { "requires": {
"@ant-design/colors": "^6.0.0", "@ant-design/colors": "^6.0.0",
"@ant-design/icons-svg": "^4.2.1" "@ant-design/icons-svg": "^4.2.1"
@ -14683,6 +14865,25 @@
"resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.12.0.tgz", "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.12.0.tgz",
"integrity": "sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ==" "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": { "@vueuse/shared": {
"version": "9.12.0", "version": "9.12.0",
"resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.12.0.tgz", "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.12.0.tgz",
@ -14975,6 +15176,17 @@
"shallow-equal": "^1.0.0", "shallow-equal": "^1.0.0",
"vue-types": "^3.0.0", "vue-types": "^3.0.0",
"warning": "^4.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": { "anymatch": {
@ -15578,6 +15790,36 @@
"integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
"dev": true "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": { "combined-stream": {
"version": "1.0.8", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@ -19297,10 +19539,14 @@
}, },
"ansicolors": { "ansicolors": {
"version": "0.3.2", "version": "0.3.2",
"resolved": "http://registry.jetlinks.cn/ansicolors/-/ansicolors-0.3.2.tgz",
"integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==",
"bundled": true "bundled": true
}, },
"ansistyles": { "ansistyles": {
"version": "0.1.3", "version": "0.1.3",
"resolved": "http://registry.jetlinks.cn/ansistyles/-/ansistyles-0.1.3.tgz",
"integrity": "sha512-6QWEyvMgIXX0eO972y7YPBLSBsq7UWKFAoNNTLGaOJ9bstcEL9sCbcjf96dVfNDdUsRoGOK82vWFJlKApXds7g==",
"bundled": true "bundled": true
}, },
"aproba": { "aproba": {
@ -19311,6 +19557,8 @@
}, },
"archy": { "archy": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "http://registry.jetlinks.cn/archy/-/archy-1.0.0.tgz",
"integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==",
"bundled": true "bundled": true
}, },
"are-we-there-yet": { "are-we-there-yet": {
@ -19470,6 +19718,8 @@
}, },
"cli-columns": { "cli-columns": {
"version": "3.1.2", "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, "bundled": true,
"requires": { "requires": {
"string-width": "^2.0.0", "string-width": "^2.0.0",
@ -19562,6 +19812,8 @@
}, },
"columnify": { "columnify": {
"version": "1.5.4", "version": "1.5.4",
"resolved": "http://registry.jetlinks.cn/columnify/-/columnify-1.5.4.tgz",
"integrity": "sha512-rFl+iXVT1nhLQPfGDw+3WcS8rmm7XsLKUmhsGE3ihzzpIikeGrTaZPIRKYWeLsLBypsHzjXIvYEltVUZS84XxQ==",
"bundled": true, "bundled": true,
"requires": { "requires": {
"strip-ansi": "^3.0.0", "strip-ansi": "^3.0.0",
@ -19947,6 +20199,8 @@
}, },
"init-package-json": { "init-package-json": {
"version": "2.0.5", "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, "bundled": true,
"requires": { "requires": {
"npm-package-arg": "^8.1.5", "npm-package-arg": "^8.1.5",
@ -19970,6 +20224,8 @@
}, },
"is-cidr": { "is-cidr": {
"version": "4.0.2", "version": "4.0.2",
"resolved": "http://registry.jetlinks.cn/is-cidr/-/is-cidr-4.0.2.tgz",
"integrity": "sha512-z4a1ENUajDbEl/Q6/pVBpTR1nBjjEE1X7qb7bmWYanNnPoKAvUCPFKeXV6Fe4mgTkWKBqiHIcwsI3SndiO5FeA==",
"bundled": true, "bundled": true,
"requires": { "requires": {
"cidr-regex": "^3.1.1" "cidr-regex": "^3.1.1"
@ -20074,6 +20330,8 @@
}, },
"libnpmaccess": { "libnpmaccess": {
"version": "4.0.3", "version": "4.0.3",
"resolved": "http://registry.jetlinks.cn/libnpmaccess/-/libnpmaccess-4.0.3.tgz",
"integrity": "sha512-sPeTSNImksm8O2b6/pf3ikv4N567ERYEpeKRPSmqlNt1dTZbvgpJIzg5vAhXHpw2ISBsELFRelk0jEahj1c6nQ==",
"bundled": true, "bundled": true,
"requires": { "requires": {
"aproba": "^2.0.0", "aproba": "^2.0.0",
@ -20084,6 +20342,8 @@
}, },
"libnpmdiff": { "libnpmdiff": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "http://registry.jetlinks.cn/libnpmdiff/-/libnpmdiff-2.0.4.tgz",
"integrity": "sha512-q3zWePOJLHwsLEUjZw3Kyu/MJMYfl4tWCg78Vl6QGSfm4aXBUSVzMzjJ6jGiyarsT4d+1NH4B1gxfs62/+y9iQ==",
"bundled": true, "bundled": true,
"requires": { "requires": {
"@npmcli/disparity-colors": "^1.0.1", "@npmcli/disparity-colors": "^1.0.1",
@ -20098,6 +20358,8 @@
}, },
"libnpmexec": { "libnpmexec": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "http://registry.jetlinks.cn/libnpmexec/-/libnpmexec-2.0.1.tgz",
"integrity": "sha512-4SqBB7eJvJWmUKNF42Q5qTOn20DRjEE4TgvEh2yneKlAiRlwlhuS9MNR45juWwmoURJlf2K43bozlVt7OZiIOw==",
"bundled": true, "bundled": true,
"requires": { "requires": {
"@npmcli/arborist": "^2.3.0", "@npmcli/arborist": "^2.3.0",
@ -20115,6 +20377,8 @@
}, },
"libnpmfund": { "libnpmfund": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "http://registry.jetlinks.cn/libnpmfund/-/libnpmfund-1.1.0.tgz",
"integrity": "sha512-Kfmh3pLS5/RGKG5WXEig8mjahPVOxkik6lsbH4iX0si1xxNi6eeUh/+nF1MD+2cgalsQif3O5qyr6mNz2ryJrQ==",
"bundled": true, "bundled": true,
"requires": { "requires": {
"@npmcli/arborist": "^2.5.0" "@npmcli/arborist": "^2.5.0"
@ -20122,6 +20386,8 @@
}, },
"libnpmhook": { "libnpmhook": {
"version": "6.0.3", "version": "6.0.3",
"resolved": "http://registry.jetlinks.cn/libnpmhook/-/libnpmhook-6.0.3.tgz",
"integrity": "sha512-3fmkZJibIybzmAvxJ65PeV3NzRc0m4xmYt6scui5msocThbEp4sKFT80FhgrCERYDjlUuFahU6zFNbJDHbQ++g==",
"bundled": true, "bundled": true,
"requires": { "requires": {
"aproba": "^2.0.0", "aproba": "^2.0.0",
@ -20130,6 +20396,8 @@
}, },
"libnpmorg": { "libnpmorg": {
"version": "2.0.3", "version": "2.0.3",
"resolved": "http://registry.jetlinks.cn/libnpmorg/-/libnpmorg-2.0.3.tgz",
"integrity": "sha512-JSGl3HFeiRFUZOUlGdiNcUZOsUqkSYrg6KMzvPZ1WVZ478i47OnKSS0vkPmX45Pai5mTKuwIqBMcGWG7O8HfdA==",
"bundled": true, "bundled": true,
"requires": { "requires": {
"aproba": "^2.0.0", "aproba": "^2.0.0",
@ -20138,6 +20406,8 @@
}, },
"libnpmpack": { "libnpmpack": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "http://registry.jetlinks.cn/libnpmpack/-/libnpmpack-2.0.1.tgz",
"integrity": "sha512-He4/jxOwlaQ7YG7sIC1+yNeXeUDQt8RLBvpI68R3RzPMZPa4/VpxhlDo8GtBOBDYoU8eq6v1wKL38sq58u4ibQ==",
"bundled": true, "bundled": true,
"requires": { "requires": {
"@npmcli/run-script": "^1.8.3", "@npmcli/run-script": "^1.8.3",
@ -20147,6 +20417,8 @@
}, },
"libnpmpublish": { "libnpmpublish": {
"version": "4.0.2", "version": "4.0.2",
"resolved": "http://registry.jetlinks.cn/libnpmpublish/-/libnpmpublish-4.0.2.tgz",
"integrity": "sha512-+AD7A2zbVeGRCFI2aO//oUmapCwy7GHqPXFJh3qpToSRNU+tXKJ2YFUgjt04LPPAf2dlEH95s6EhIHM1J7bmOw==",
"bundled": true, "bundled": true,
"requires": { "requires": {
"normalize-package-data": "^3.0.2", "normalize-package-data": "^3.0.2",
@ -20158,6 +20430,8 @@
}, },
"libnpmsearch": { "libnpmsearch": {
"version": "3.1.2", "version": "3.1.2",
"resolved": "http://registry.jetlinks.cn/libnpmsearch/-/libnpmsearch-3.1.2.tgz",
"integrity": "sha512-BaQHBjMNnsPYk3Bl6AiOeVuFgp72jviShNBw5aHaHNKWqZxNi38iVNoXbo6bG/Ccc/m1To8s0GtMdtn6xZ1HAw==",
"bundled": true, "bundled": true,
"requires": { "requires": {
"npm-registry-fetch": "^11.0.0" "npm-registry-fetch": "^11.0.0"
@ -20165,6 +20439,8 @@
}, },
"libnpmteam": { "libnpmteam": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "http://registry.jetlinks.cn/libnpmteam/-/libnpmteam-2.0.4.tgz",
"integrity": "sha512-FPrVJWv820FZFXaflAEVTLRWZrerCvfe7ZHSMzJ/62EBlho2KFlYKjyNEsPW3JiV7TLSXi3vo8u0gMwIkXSMTw==",
"bundled": true, "bundled": true,
"requires": { "requires": {
"aproba": "^2.0.0", "aproba": "^2.0.0",
@ -20173,6 +20449,8 @@
}, },
"libnpmversion": { "libnpmversion": {
"version": "1.2.1", "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, "bundled": true,
"requires": { "requires": {
"@npmcli/git": "^2.0.7", "@npmcli/git": "^2.0.7",
@ -20392,6 +20670,8 @@
}, },
"npmlog": { "npmlog": {
"version": "4.1.2", "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, "bundled": true,
"requires": { "requires": {
"are-we-there-yet": "~1.1.2", "are-we-there-yet": "~1.1.2",
@ -20436,6 +20716,8 @@
}, },
"npm-audit-report": { "npm-audit-report": {
"version": "2.1.5", "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, "bundled": true,
"requires": { "requires": {
"chalk": "^4.0.0" "chalk": "^4.0.0"
@ -20502,6 +20784,8 @@
}, },
"npm-profile": { "npm-profile": {
"version": "5.0.4", "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, "bundled": true,
"requires": { "requires": {
"npm-registry-fetch": "^11.0.0" "npm-registry-fetch": "^11.0.0"
@ -20523,10 +20807,14 @@
}, },
"npm-user-validate": { "npm-user-validate": {
"version": "1.0.1", "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 "bundled": true
}, },
"npmlog": { "npmlog": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "http://registry.jetlinks.cn/npmlog/-/npmlog-5.0.1.tgz",
"integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
"bundled": true, "bundled": true,
"requires": { "requires": {
"are-we-there-yet": "^2.0.0", "are-we-there-yet": "^2.0.0",
@ -20537,6 +20825,8 @@
"dependencies": { "dependencies": {
"are-we-there-yet": { "are-we-there-yet": {
"version": "2.0.0", "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, "bundled": true,
"requires": { "requires": {
"delegates": "^1.0.0", "delegates": "^1.0.0",
@ -20574,6 +20864,8 @@
}, },
"opener": { "opener": {
"version": "1.5.2", "version": "1.5.2",
"resolved": "http://registry.jetlinks.cn/opener/-/opener-1.5.2.tgz",
"integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
"bundled": true "bundled": true
}, },
"p-map": { "p-map": {
@ -20688,6 +20980,8 @@
}, },
"qrcode-terminal": { "qrcode-terminal": {
"version": "0.12.0", "version": "0.12.0",
"resolved": "http://registry.jetlinks.cn/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz",
"integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==",
"bundled": true "bundled": true
}, },
"qs": { "qs": {
@ -20994,10 +21288,14 @@
}, },
"text-table": { "text-table": {
"version": "0.2.0", "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 "bundled": true
}, },
"tiny-relative-date": { "tiny-relative-date": {
"version": "1.3.0", "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 "bundled": true
}, },
"treeverse": { "treeverse": {
@ -21250,6 +21548,14 @@
"mimic-fn": "^2.1.0" "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": { "only": {
"version": "0.0.2", "version": "0.0.2",
"resolved": "https://registry.jetlinks.cn/only/-/only-0.0.2.tgz", "resolved": "https://registry.jetlinks.cn/only/-/only-0.0.2.tgz",
@ -22037,10 +22343,9 @@
} }
}, },
"rxjs": { "rxjs": {
"version": "7.8.0", "version": "7.8.1",
"resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.0.tgz", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
"integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
"dev": true,
"requires": { "requires": {
"tslib": "^2.1.0" "tslib": "^2.1.0"
} }
@ -22254,6 +22559,11 @@
"tslib": "^2.0.3" "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": { "source-map": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@ -23156,6 +23466,21 @@
"vue": "^3.2.37" "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": { "warning": {
"version": "4.0.3", "version": "4.0.3",
"resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",

View File

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

View File

@ -115,7 +115,7 @@ export const deviceImport = (productId: string, fileUrl: string, autoDeploy: boo
* @returns * @returns
*/ */
export const deviceExport = (productId: string, type: string, params?: any) => server.get(`/device-instance${!!productId ? `/${productId}` : ''}/export.${type}`, params, {responseType: 'blob'}) 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是否重复 * ID是否重复
* @param id 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 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`) 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"> <div class="card-state-content">
<BadgeStatus <BadgeStatus
v-if="!customBadge"
:status="status" :status="status"
:text="statusText" :text="statusText"
:statusNames="statusNames" :statusNames="statusNames"
></BadgeStatus> ></BadgeStatus>
<CustomBadgeStatus
v-else
:status="status"
:text="statusText"
:statusNames="statusNames">
</CustomBadgeStatus>
</div> </div>
</div> </div>
</div> </div>
@ -89,6 +96,7 @@
<script setup lang="ts" name='CardBox'> <script setup lang="ts" name='CardBox'>
import BadgeStatus from '@/components/BadgeStatus/index.vue'; import BadgeStatus from '@/components/BadgeStatus/index.vue';
import CustomBadgeStatus from '@/components/BadgeStatus/CustomBadgeStatus.vue'
import color, { getHexColor } from '../BadgeStatus/color'; import color, { getHexColor } from '../BadgeStatus/color';
import type { ActionsType } from '@/components/Table'; import type { ActionsType } from '@/components/Table';
import { PropType } from 'vue'; import { PropType } from 'vue';
@ -143,6 +151,10 @@ const props = defineProps({
disabled: { disabled: {
type: Boolean, type: Boolean,
default: false, default: false,
},
customBadge:{
type: Boolean,
default: false
} }
}); });

View File

@ -55,7 +55,8 @@ export const defaultBranches = [
}, },
then: [], then: [],
executeAnyway: true, 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>} * @returns {Promise<never>}
*/ */
const errorHandler = (error: any) => { const errorHandler = (error: any) => {
if (error.response) { if (error.response) {
const data = error.response.data const data = error.response.data
const status = error.response.status const status = error.response.status
@ -182,7 +181,13 @@ const errorHandler = (error: any) => {
} else if (status === 403) { } else if (status === 403) {
showNotification('Forbidden', (data.message + '').substr(0, 90), '403') showNotification('Forbidden', (data.message + '').substr(0, 90), '403')
} else if (status === 500) { } else if (status === 500) {
showNotification('Server Side Error', (data.message + '').substr(0, 90), '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) { } else if (status === 400) {
showNotification('Request Error', (data.message + '').substr(0, 90), '400') showNotification('Request Error', (data.message + '').substr(0, 90), '400')
} else if (status === 401) { } else if (status === 401) {

View File

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

View File

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

View File

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

View File

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

View File

@ -151,7 +151,7 @@ const queryInkling = () => {
queryPluginAccessDetail(instanceStore.current?.accessId).then(async res => { queryPluginAccessDetail(instanceStore.current?.accessId).then(async res => {
if (res.success) { if (res.success) {
channelId.value = res.result.channelId 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) { if (pluginRes.success) {
inklingDeviceId.value = pluginRes.result?.externalId inklingDeviceId.value = pluginRes.result?.externalId
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -327,7 +327,7 @@ const handleClick = (data: any) => {
const add = () => { const add = () => {
const url = menuStore.hasMenu('link/AccessConfig/Detail'); const url = menuStore.hasMenu('link/AccessConfig/Detail');
if (url) { 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) => { tab.onTabSaveSuccess = (value: any) => {
if (value.status === 200) { if (value.status === 200) {
tableRef.value.reload(); tableRef.value.reload();

View File

@ -173,7 +173,7 @@ const queryInkingDevices = (data: string[]) => {
return; return;
} }
const res = await getInkingDevices(data,props.pluginId); const res = await getInkingDevices(data,props.accessId);
if (res) { if (res) {
disabledKeys.value = res.result?.map((item) => item.externalId); 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 { saveMetadata } from "@/api/device/instance";
import type { DeviceInstance } from "../../Instance/typings"; import type { DeviceInstance } from "../../Instance/typings";
import type { DeviceMetadata, MetadataItem, MetadataType, ProductItem } from "../../Product/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 filterProductMetadata = (data: any[], productMetaData: any[]) => {
const ids = productMetaData.map((item: any) => item.id) const ids = productMetaData.map((item: any) => item.id)
@ -69,7 +69,28 @@ export const asyncUpdateMetadata = (
case 'product': case 'product':
return saveProductMetadata(data); return saveProductMetadata(data);
case 'device': 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: '注册时间', title: '注册时间',

View File

@ -10,9 +10,7 @@
:maxCount="1" :maxCount="1"
:showUploadList="false" :showUploadList="false"
@change="uploadChange" @change="uploadChange"
:accept=" :accept="props?.file ? `.${props?.file}` : '.xlsx'"
props?.file ? `.${props?.file}` : '.xlsx'
"
:before-upload="beforeUpload" :before-upload="beforeUpload"
> >
<j-button> <j-button>
@ -28,20 +26,35 @@
</j-space> </j-space>
</div> </div>
</j-space> </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-if="flag" status="processing" text="进行中" />
<j-badge v-else status="success" text="已完成" /> <j-badge v-else status="success" text="已完成" />
<span>总数量{{ count }}</span> <span>总数量{{ count }}</span>
<p style="color: red">{{ errMessage }}</p> <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> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { FILE_UPLOAD } from '@/api/comm'; import { FILE_UPLOAD } from '@/api/comm';
import { TOKEN_KEY } from '@/utils/variable';
import { LocalStore, onlyMessage } from '@/utils/comm'; import { LocalStore, onlyMessage } from '@/utils/comm';
import { downloadFileByUrl } from '@/utils/utils'; import { downloadFileByUrl } from '@/utils/utils';
import { exportCard, _import } from '@/api/iot-card/cardManagement'; import { exportCard, _import } from '@/api/iot-card/cardManagement';
import { TOKEN_KEY, BASE_API_PATH } from '@/utils/variable';
import { getToken } from '@/utils/comm';
type Emits = { type Emits = {
(e: 'update:modelValue', data: string[]): void; (e: 'update:modelValue', data: string[]): void;
@ -63,11 +76,16 @@ const props = defineProps({
default: 'xlsx', default: 'xlsx',
}, },
}); });
type ImportStatus = 'wait' | 'importing' | 'done';
const importStatus = ref<ImportStatus>('wait'); //
const importLoading = ref<boolean>(false); const importLoading = ref<boolean>(false);
const flag = ref<boolean>(false); const flag = ref<boolean>(false);
const count = ref<number>(0); const count = ref<number>(0);
const errMessage = ref<string>(''); 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 downFile = async (type: string) => {
const res: any = await exportCard(type); const res: any = await exportCard(type);
@ -96,20 +114,60 @@ const beforeUpload = (_file: any) => {
const uploadChange = async (info: Record<string, any>) => { const uploadChange = async (info: Record<string, any>) => {
importLoading.value = true; importLoading.value = true;
if (info.file.status === 'done') { 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: '' }; const resp: any = info.file.response || { result: '' };
flag.value = true; handleImport(resp);
_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;
});
} }
}; };
</script>
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')" :actions="getActions(slotProps, 'card')"
v-bind="slotProps" v-bind="slotProps"
:active="_selectedRowKeys.includes(slotProps.id)" :active="_selectedRowKeys.includes(slotProps.id)"
:status="slotProps.cardStateType.value" :status="slotProps.cardStateType?.value"
:statusText="slotProps.cardStateType.text" :statusText="slotProps.cardStateType?.text"
:statusNames="{ :statusNames="{
using: 'processing', using: 'processing',
toBeActivated: 'default', toBeActivated: 'default',
@ -183,14 +183,6 @@
</j-row> </j-row>
<j-divider style="margin: 12px 0" /> <j-divider style="margin: 12px 0" />
<div class="content-bottom"> <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>
<div class="progress-text"> <div class="progress-text">
<div> <div>
@ -240,42 +232,6 @@
<span>{{ item?.text }}</span> <span>{{ item?.text }}</span>
</template> </template>
</PermissionButton> </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> </template>
</CardBox> </CardBox>
</template> </template>
@ -532,6 +488,7 @@ const columns = [
}, },
{ {
title: '总流量', title: '总流量',
key: 'totalFlow',
dataIndex: 'totalFlow', dataIndex: 'totalFlow',
width: 120, width: 120,
scopedSlots: true, scopedSlots: true,
@ -723,6 +680,7 @@ const getActions = (
const resp: any = await del(data.id); const resp: any = await del(data.id);
if (resp.status === 200) { if (resp.status === 200) {
onlyMessage('操作成功'); onlyMessage('操作成功');
_selectedRowKeys.value=[];
cardManageRef.value?.reload(); cardManageRef.value?.reload();
} else { } else {
onlyMessage('操作失败!', 'error'); onlyMessage('操作失败!', 'error');
@ -777,6 +735,9 @@ const cancelSelect = () => {
}; };
const handleClick = (dt: any) => { const handleClick = (dt: any) => {
if(!dt?.cardStateType){
return
}
if (isCheck.value) { if (isCheck.value) {
if (_selectedRowKeys.value.includes(dt.id)) { if (_selectedRowKeys.value.includes(dt.id)) {
const _index = _selectedRowKeys.value.findIndex((i) => i === dt.id); const _index = _selectedRowKeys.value.findIndex((i) => i === dt.id);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -20,7 +20,14 @@
:title="item.alarmName" :title="item.alarmName"
placement="topLeft" placement="topLeft"
> >
<a @click="()=>{return jumpDetail(item)}">{{ item.alarmName }}</a> <a
@click="
() => {
return jumpDetail(item);
}
"
>{{ item.alarmName }}</a
>
</j-tooltip> </j-tooltip>
</div> </div>
<div class="new-alarm-item-state"> <div class="new-alarm-item-state">
@ -42,13 +49,16 @@
{{ item.state?.text }} {{ item.state?.text }}
</span> </span>
</div> </div>
<div <div
:class="[ :class="[
'new-alarm-item-level', 'new-alarm-item-level',
`level-${item.level}`, `level-${item.level}`,
]" ]"
> >
{{ item.levelName }} <Ellipsis style="width: calc(100%)">
{{ item.levelName }}
</Ellipsis>
</div> </div>
</div> </div>
</li> </li>
@ -72,9 +82,12 @@ const props = defineProps({
}, },
}); });
const menuStore = useMenuStore(); const menuStore = useMenuStore();
const jumpDetail = (item:any) =>{ 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> </script>
<style scoped lang="less"> <style scoped lang="less">
.new-alarm { .new-alarm {
@ -155,4 +168,4 @@ const jumpDetail = (item:any) =>{
justify-content: center; justify-content: center;
width: 100%; width: 100%;
} }
</style> </style>

View File

@ -13,11 +13,11 @@
</TitleComponent> </TitleComponent>
<template v-if='open'> <template v-if='open'>
<div> <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 <j-tab-pane
v-for="(b, i) in group" v-for="(b, i) in group"
:key="b.id" :key="b.id"
:tab="`条件${i + 1}`" :tab="b.branchName || `条件${i+1}`"
:closable="false" :closable="false"
> >
<template v-for='(item, index) in data.branches'> <template v-for='(item, index) in data.branches'>
@ -64,6 +64,13 @@
</j-form-item> </j-form-item>
</div> </div>
</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> </template>
<script setup lang='ts' name='Terms'> <script setup lang='ts' name='Terms'>
@ -84,6 +91,8 @@ const open = ref<boolean>(false)
const columnOptions = ref<any>([]) const columnOptions = ref<any>([])
const group = ref<Array<{ id: string, len: number}>>([]) const group = ref<Array<{ id: string, len: number}>>([])
const activeKey = ref('') const activeKey = ref('')
const editConditionVisible = ref(false);
const conditionName = ref<any>('')
provide(ContextKey, columnOptions) provide(ContextKey, columnOptions)
@ -183,7 +192,8 @@ const addGroup = () => {
}, },
then: [], then: [],
executeAnyway: true, 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(branchesItem)
data.value.branches?.push(null as any) data.value.branches?.push(null as any)
@ -210,6 +220,24 @@ const groupDelete = (g: any, index: number) => {
activeKey.value = group.value[_index].id 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(() => { watchEffect(() => {
if (data.value.trigger?.device) { if (data.value.trigger?.device) {
queryColumn({ trigger: data.value.trigger }) queryColumn({ trigger: data.value.trigger })
@ -242,7 +270,8 @@ watchEffect(() => {
_group[lastIndex + 1] = { _group[lastIndex + 1] = {
id: `group_${item.key}`, id: `group_${item.key}`,
len: 1, len: 1,
start: index start: index,
branchName:item.branchName
} }
} else { } else {
_group[lastIndex].len += 1 _group[lastIndex].len += 1
@ -258,7 +287,7 @@ watchEffect(() => {
activeKey.value = _group[0].id activeKey.value = _group[0].id
} }
} }
console.log(group.value,'group')
}) })
</script> </script>

View File

@ -1438,6 +1438,17 @@ import { Rule } from 'ant-design-vue/lib/form';
import ApplyList from './ApplyList/index.vue'; import ApplyList from './ApplyList/index.vue';
const emit = defineEmits(['changeApplyType']); 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 routeQuery = useRoute().query;
const menuStory = useMenuStore(); const menuStory = useMenuStore();
@ -1601,6 +1612,8 @@ onMounted(async () => {
typeOptions.value = typeOptions.value.filter((i: any) => { typeOptions.value = typeOptions.value.filter((i: any) => {
return i.value === routeQuery.provider; 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> </slot>
</template> </template>
<template #content> <template #content>
<h3 class="card-item-content-title"> <Ellipsis>
<Ellipsis> <h3 class="card-item-content-title">
{{ slotProps.name }} {{ slotProps.name }}
</Ellipsis> </h3>
</h3> </Ellipsis>
<j-row> <j-row>
<j-col :span="12"> <j-col :span="12">
<div class="card-item-content-text"> <div class="card-item-content-text">
@ -102,13 +102,21 @@
) in item.children" ) in item.children"
:key="i" :key="i"
> >
<j-tooltip :title="o?.tooltip?.title"> <j-tooltip
:title="
o?.tooltip?.title
"
>
<j-button <j-button
type="link" type="link"
@click="o.onClick" @click="o.onClick"
:disabled="o.disabled" :disabled="
o.disabled
"
> >
<AIcon :type="o.icon" /> <AIcon
:type="o.icon"
/>
<span>{{ <span>{{
o.text o.text
}}</span> }}</span>
@ -189,13 +197,18 @@
:data="current" :data="current"
@refresh="table.refresh" @refresh="table.refresh"
/> />
<ThirdMenu <ThirdMenu
v-if="dialogVisible && current.provider === 'third-party'" v-if="dialogVisible && current.provider === 'third-party'"
:data="current" :data="current"
mode="edit" mode="edit"
@cancel="dialogVisible = false" @cancel="dialogVisible = false"
@ok="() => { dialogVisible = false; table.refresh}" @ok="
/> () => {
dialogVisible = false;
table.refresh;
}
"
/>
</div> </div>
<Add v-if="visible" @close="visible = false" /> <Add v-if="visible" @close="visible = false" />
</page-container> </page-container>
@ -204,12 +217,12 @@
<script setup lang="ts" name="Apply"> <script setup lang="ts" name="Apply">
import PermissionButton from '@/components/PermissionButton/index.vue'; import PermissionButton from '@/components/PermissionButton/index.vue';
import MenuDialog from './componenets/MenuDialog.vue'; import MenuDialog from './componenets/MenuDialog.vue';
import ThirdMenu from './componenets/ThirdMenu.vue' import ThirdMenu from './componenets/ThirdMenu.vue';
import { import {
getApplyList_api, getApplyList_api,
changeApplyStatus_api, changeApplyStatus_api,
delApply_api, delApply_api,
queryType queryType,
} from '@/api/system/apply'; } from '@/api/system/apply';
import { getImage, onlyMessage } from '@/utils/comm'; import { getImage, onlyMessage } from '@/utils/comm';
import { useMenuStore } from '@/store/menu'; import { useMenuStore } from '@/store/menu';
@ -219,21 +232,21 @@ import Add from './Save/Add.vue';
const menuStory = useMenuStore(); const menuStory = useMenuStore();
const permission = 'system/Apply'; const permission = 'system/Apply';
const typeOptions = ref<any[]>([]) const typeOptions = ref<any[]>([]);
const visible = ref<boolean>(false) const visible = ref<boolean>(false);
const addMenuVisible = ref<boolean>(false) const addMenuVisible = ref<boolean>(false);
onMounted(() => { onMounted(() => {
queryType().then((resp: any) => { queryType().then((resp: any) => {
if(resp.status === 200){ if (resp.status === 200) {
const arr = resp.result.map((item: any) => ({ const arr = resp.result.map((item: any) => ({
label: item.name, label: item.name,
value: item.provider, value: item.provider,
})) }));
typeOptions.value = arr typeOptions.value = arr;
} }
}); });
}) });
const columns = [ const columns = [
{ {
title: '名称', title: '名称',
@ -309,14 +322,14 @@ const columns = [
const queryParams = ref({}); const queryParams = ref({});
const tableRef = ref(); const tableRef = ref();
const current = ref<any>({}) const current = ref<any>({});
const table = { const table = {
refresh: () => { refresh: () => {
// tableRef.value.reload(queryParams.value); // tableRef.value.reload(queryParams.value);
window.location.reload() window.location.reload();
}, },
toAdd: () => { toAdd: () => {
visible.value = true visible.value = true;
}, },
toSave: (id?: string, view = false) => { toSave: (id?: string, view = false) => {
if (id) menuStory.jumpPage('system/Apply/Save', {}, { id, view }); if (id) menuStory.jumpPage('system/Apply/Save', {}, { id, view });
@ -408,7 +421,7 @@ const table = {
onClick: () => { onClick: () => {
selectId.value = data.id; selectId.value = data.id;
selectProvider.value = data.provider; selectProvider.value = data.provider;
current.value = data current.value = data;
dialogVisible.value = true; dialogVisible.value = true;
}, },
}); });

View File

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

View File

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

View File

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

View File

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

1756
yarn.lock

File diff suppressed because it is too large Load Diff