系统用户增加设备绑定,支持一对多

This commit is contained in:
zjf committed 2026-01-26 19:59:33 +08:00
1 parent c553dbd5f8
commit a984ca9574
5 files changed
+229 -124

No files matched your search

+3 -3
View File
@@ -2,8 +2,8 @@
NODE_ENV=development
VITE_DEV=true
# 请求路径
# VITE_BASE_URL= http://116.148.200.224:48089
VITE_BASE_URL= http://localhost:8089
# VITE_BASE_URL=http://116.148.200.224:48089
VITE_BASE_URL=http://localhost:48089
# VITE_BASE_URL='https://xrhomeapi.asset-cloud.com.cn'
# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持 S3 服务
VITE_UPLOAD_TYPE=server
@@ -30,4 +30,4 @@ VITE_MALL_H5_DOMAIN='http://localhost:3000'
VITE_APP_CAPTCHA_ENABLE='true'
# GoView域名
VITE_GOVIEW_URL='http://127.0.0.1:3000'
VITE_GOVIEW_URL='http://127.0.0.1:3000'
+163 -120
View File
@@ -2424,9 +2424,9 @@
}
},
"node_modules/@element-plus/icons-vue": {
"version": "2.3.1",
"resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
"integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz",
"integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==",
"peerDependencies": {
"vue": "^3.2.0"
}
@@ -2850,9 +2850,9 @@
}
},
"node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0",
@@ -2918,65 +2918,65 @@
"integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="
},
"node_modules/@form-create/component-elm-checkbox": {
"version": "3.2.23",
"resolved": "https://registry.npmmirror.com/@form-create/component-elm-checkbox/-/component-elm-checkbox-3.2.23.tgz",
"integrity": "sha512-MgSOl/YtTVtpByW+dEARlgfo2mtR1NsboDT6cDVJVnXRpWvGEBCXFb7/R02cvnl2ETq5LXUpZUYRYnapUY2nJQ==",
"version": "3.2.31",
"resolved": "https://registry.npmjs.org/@form-create/component-elm-checkbox/-/component-elm-checkbox-3.2.31.tgz",
"integrity": "sha512-XQT66E+nRXA2KGZwU1TujSGtICevDUUwks8K+79xs214lofva+rMaRFtrpZYXFgt0+molMUSOl/wc9dOrNr+1Q==",
"dependencies": {
"@form-create/utils": "^3.2.23"
"@form-create/utils": "^3.2.31"
}
},
"node_modules/@form-create/component-elm-frame": {
"version": "3.2.23",
"resolved": "https://registry.npmmirror.com/@form-create/component-elm-frame/-/component-elm-frame-3.2.23.tgz",
"integrity": "sha512-8GSlI+9Jq4WhozxHz6Zd7WHjaoedSktzH9GVVkP8E+GELjf/VGsJP8jXfsU/Fvpju7cSxRoLNb51KmfdOZc8fA==",
"version": "3.2.31",
"resolved": "https://registry.npmjs.org/@form-create/component-elm-frame/-/component-elm-frame-3.2.31.tgz",
"integrity": "sha512-8ub7SnIRVV6YVIBXHps1A7hi7ivrjm8v1qNIcUOndUliXjP90PZ02YUZkVNh12aX8LNhGtuq8kLZqtdSdh78uA==",
"dependencies": {
"@form-create/utils": "^3.2.23"
"@form-create/utils": "^3.2.31"
}
},
"node_modules/@form-create/component-elm-group": {
"version": "3.2.23",
"resolved": "https://registry.npmmirror.com/@form-create/component-elm-group/-/component-elm-group-3.2.23.tgz",
"integrity": "sha512-mNlg3ox4jVsCrAk57WbzgU4OZQdBeRv3kgkk2QjtFGjt7FXqDGbWYdiy+0JpdNwsEEkkIEP3Ou4kZ6WburTOcQ==",
"version": "3.2.34",
"resolved": "https://registry.npmjs.org/@form-create/component-elm-group/-/component-elm-group-3.2.34.tgz",
"integrity": "sha512-/067dB7Ss9UNLCKfTKpazYwVlpIeuAPGfhO4kcVx+bqr38fMuh2zuQNAqqRk5hsNC/Y8wOnPshT/bU1L8AQOGA==",
"dependencies": {
"@form-create/utils": "^3.2.23"
"@form-create/utils": "^3.2.31"
}
},
"node_modules/@form-create/component-elm-radio": {
"version": "3.2.23",
"resolved": "https://registry.npmmirror.com/@form-create/component-elm-radio/-/component-elm-radio-3.2.23.tgz",
"integrity": "sha512-cpqTdaljtEhbJwj8tvbUxoYmJO3VcOzYc514zPml9TB8FtwGS0sVJIu3KoNMC34Kna3EV5+uNdy+PkowtqT4bQ==",
"version": "3.2.31",
"resolved": "https://registry.npmjs.org/@form-create/component-elm-radio/-/component-elm-radio-3.2.31.tgz",
"integrity": "sha512-hm/+tuBPf6bH1iw1xP80JXGe9rhUTovMcQpDfLMNkrdXrLZJ618sKXzID1nId03QKYcocnOHvkbX0NuNPila+A==",
"dependencies": {
"@form-create/utils": "^3.2.23"
"@form-create/utils": "^3.2.31"
}
},
"node_modules/@form-create/component-elm-select": {
"version": "3.2.23",
"resolved": "https://registry.npmmirror.com/@form-create/component-elm-select/-/component-elm-select-3.2.23.tgz",
"integrity": "sha512-RPFKH1f3mMqtL0dOS8fUuuUS6EnpLP/rkyQLHjB3OUX+cHz/JKkSjVtKQlqa5jDe+h9iz/9aPsM2xzUoc/WlRQ==",
"version": "3.2.37",
"resolved": "https://registry.npmjs.org/@form-create/component-elm-select/-/component-elm-select-3.2.37.tgz",
"integrity": "sha512-kbxYHdA5KOVmvD9HIBJZWntjpRXFf8uO2+uSjolamCmKh+St0RDttdUMRNjXDxroHHrdtJMIP9K778/BCHYk4g==",
"dependencies": {
"@form-create/utils": "^3.2.23"
"@form-create/utils": "^3.2.31"
}
},
"node_modules/@form-create/component-elm-tree": {
"version": "3.2.23",
"resolved": "https://registry.npmmirror.com/@form-create/component-elm-tree/-/component-elm-tree-3.2.23.tgz",
"integrity": "sha512-BFadEW/Khfr7APd/UgzgIkVfAgHqGYwOqnMzyS86VCEivXzSDUQm5SEEyuEA6DkJcysG3cWReSW4nXu0HxdhPA==",
"version": "3.2.31",
"resolved": "https://registry.npmjs.org/@form-create/component-elm-tree/-/component-elm-tree-3.2.31.tgz",
"integrity": "sha512-cLWwqT+3ES5FSRywQ7HIh05jvEeMPhoQnIxcSbLnzB24tS2eM2x5DhbhjJ02wsZGPvfcO4m3BBp0fgv1RKww1g==",
"dependencies": {
"@form-create/utils": "^3.2.23"
"@form-create/utils": "^3.2.31"
}
},
"node_modules/@form-create/component-elm-upload": {
"version": "3.2.23",
"resolved": "https://registry.npmmirror.com/@form-create/component-elm-upload/-/component-elm-upload-3.2.23.tgz",
"integrity": "sha512-eIcgvoLv9AviT5ehoNmi/PatfZ7m8lb5S5sUW3j5nZLhkYQwXox04kjd6n9I/2KD4YBxHw7YHbR+oebC81npcw==",
"version": "3.2.31",
"resolved": "https://registry.npmjs.org/@form-create/component-elm-upload/-/component-elm-upload-3.2.31.tgz",
"integrity": "sha512-2XJr7x8gPf+U0FnPYLyPt0+qLG9+lZSO7tlInT0fw7TJF9pWzrtxicnX6sWvd4EoWCNzYU13HXL33Aq1zP2IeA==",
"dependencies": {
"@form-create/utils": "^3.2.23"
"@form-create/utils": "^3.2.31"
}
},
"node_modules/@form-create/component-subform": {
"version": "3.1.34",
"resolved": "https://registry.npmmirror.com/@form-create/component-subform/-/component-subform-3.1.34.tgz",
"integrity": "sha512-OJcFH/7MTHx7JLEjDK/weS27qfuFWAI+OK+gXTJ2jIt9aZkGWF/EWkjetiJLt5a0KMw4Z15wOS2XCY9pVK9vlA=="
"version": "3.2.34",
"resolved": "https://registry.npmjs.org/@form-create/component-subform/-/component-subform-3.2.34.tgz",
"integrity": "sha512-h1AiMdpHfMr3s1AuX3L5BChc6Na5Megp/UU/FOCbAqt6+XEEEAKWt+2p6X1MMOJRLT+EI8ZRBcUfVbcw4/dHSQ=="
},
"node_modules/@form-create/component-wangeditor": {
"version": "3.2.14",
@@ -2987,57 +2987,88 @@
}
},
"node_modules/@form-create/core": {
"version": "3.2.24",
"resolved": "https://registry.npmmirror.com/@form-create/core/-/core-3.2.24.tgz",
"integrity": "sha512-iz1j4wqmfs6V4L6gC7hsFFchsjtaknD4gjCwW8ebh33mojyrYEfVYev1bzgTeRGGcwhtT9Q27IAStgdlowbavQ==",
"version": "3.2.37",
"resolved": "https://registry.npmjs.org/@form-create/core/-/core-3.2.37.tgz",
"integrity": "sha512-1Wwr+6xMrL/6XfeeZJtlhMIKOWjwdUxuTiOJEApk+Q+Stsaz15LtKqsffyZTs7mN5DajUGnDxW8MP/myYgABXw==",
"dependencies": {
"@form-create/utils": "^3.2.23"
"@form-create/utils": "^3.2.31"
},
"peerDependencies": {
"vue": "^3.1.0"
}
},
"node_modules/@form-create/designer": {
"version": "3.2.11",
"resolved": "https://registry.npmmirror.com/@form-create/designer/-/designer-3.2.11.tgz",
"integrity": "sha512-5mPyeHFOj8n01LOVhibjX8OujD6RYBH8TF2Ol7n8QxaSqIcAFTz9PADIiX982REPxiZ6I8BqZa2t0OtYQtETpA==",
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/@form-create/designer/-/designer-3.4.0.tgz",
"integrity": "sha512-g1vUqX977lIHuWtAIhgLKZGZw87YClA1sJnLOFkweGA5CBJDhqNhvC4N0M1idkuKmCJtS+aweCYmrL2FapjDsw==",
"dependencies": {
"@form-create/component-wangeditor": "^3.1",
"@form-create/element-ui": "^3.2.19",
"@form-create/utils": "^3.2.0",
"@form-create/component-wangeditor": "^3.2.14",
"@form-create/element-ui": "^3.2.33",
"@form-create/utils": "^3.2.31",
"codemirror": "^6.65.7",
"element-plus": "^2.8.4",
"element-plus": "^2.11.1",
"js-beautify": "^1.15.1",
"marked": "^17.0.0",
"signature_pad": "^5.0.10",
"vuedraggable": "4.1.0"
},
"peerDependencies": {
"vue": "^3.1.5"
"vue": "^3.5"
}
},
"node_modules/@form-create/element-ui": {
"version": "3.2.24",
"resolved": "https://registry.npmmirror.com/@form-create/element-ui/-/element-ui-3.2.24.tgz",
"integrity": "sha512-SdLqe/adm8TwNuY9yQW7ddrvyQk47aBtv2bBZEEn759btv38xakG2jqa6l4bIJ05QbnChyhhYFy3zNakwhykdQ==",
"node_modules/@form-create/designer/node_modules/element-plus": {
"version": "2.13.1",
"resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.13.1.tgz",
"integrity": "sha512-eG4BDBGdAsUGN6URH1PixzZb0ngdapLivIk1meghS1uEueLvQ3aljSKrCt5x6sYb6mUk8eGtzTQFgsPmLavQcA==",
"dependencies": {
"@form-create/component-elm-checkbox": "^3.2.23",
"@form-create/component-elm-frame": "^3.2.23",
"@form-create/component-elm-group": "^3.2.23",
"@form-create/component-elm-radio": "^3.2.23",
"@form-create/component-elm-select": "^3.2.23",
"@form-create/component-elm-tree": "^3.2.23",
"@form-create/component-elm-upload": "^3.2.23",
"@form-create/component-subform": "^3.1.34",
"@form-create/core": "^3.2.24",
"@form-create/utils": "^3.2.23"
"@ctrl/tinycolor": "^3.4.1",
"@element-plus/icons-vue": "^2.3.2",
"@floating-ui/dom": "^1.0.1",
"@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
"@types/lodash": "^4.17.20",
"@types/lodash-es": "^4.17.12",
"@vueuse/core": "^10.11.0",
"async-validator": "^4.2.5",
"dayjs": "^1.11.19",
"lodash": "^4.17.21",
"lodash-es": "^4.17.21",
"lodash-unified": "^1.0.3",
"memoize-one": "^6.0.0",
"normalize-wheel-es": "^1.2.0"
},
"peerDependencies": {
"vue": "^3.3.0"
}
},
"node_modules/@form-create/designer/node_modules/signature_pad": {
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/signature_pad/-/signature_pad-5.1.3.tgz",
"integrity": "sha512-zyxW5vuJVnQdGcU+kAj9FYl7WaAunY3kA5S7mPg0xJiujL9+sPAWfSQHS5tXaJXDUa4FuZeKhfdCDQ6K3wfkpQ=="
},
"node_modules/@form-create/element-ui": {
"version": "3.2.37",
"resolved": "https://registry.npmjs.org/@form-create/element-ui/-/element-ui-3.2.37.tgz",
"integrity": "sha512-KfC+a1zE1SfEpiZR3i+C95GPsoXajrT/b76bvToI6Nxk4SKSG+cqNyrS4FnRU0WbJlxjF9lzPJ+oejOLmqPjmQ==",
"dependencies": {
"@form-create/component-elm-checkbox": "^3.2.31",
"@form-create/component-elm-frame": "^3.2.31",
"@form-create/component-elm-group": "^3.2.34",
"@form-create/component-elm-radio": "^3.2.31",
"@form-create/component-elm-select": "^3.2.37",
"@form-create/component-elm-tree": "^3.2.31",
"@form-create/component-elm-upload": "^3.2.31",
"@form-create/component-subform": "^3.2.34",
"@form-create/core": "^3.2.37",
"@form-create/utils": "^3.2.31"
},
"peerDependencies": {
"vue": "^3.1.0"
}
},
"node_modules/@form-create/utils": {
"version": "3.2.23",
"resolved": "https://registry.npmmirror.com/@form-create/utils/-/utils-3.2.23.tgz",
"integrity": "sha512-bw6Oj6BbEw8MsZQd0GRtVlWIrkXiDbHRLJ1ytZ8GwH+YqeCR413eCcve2MQMQFTpLtSOa3QvfrBPwTbIZh7R4w=="
"version": "3.2.31",
"resolved": "https://registry.npmjs.org/@form-create/utils/-/utils-3.2.31.tgz",
"integrity": "sha512-YcisHXuQEF0r9y2VKS2CB2nMQ2q8EkKvQXp4nPR9sjbsCabPZOXq2n2MrkWDMhwQNwep08/0NCf7z0wslHzyWQ=="
},
"node_modules/@gera2ld/jsx-dom": {
"version": "2.2.2",
@@ -3063,9 +3094,9 @@
}
},
"node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0",
@@ -4650,9 +4681,9 @@
"dev": true
},
"node_modules/@types/lodash": {
"version": "4.17.17",
"resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.17.tgz",
"integrity": "sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ=="
"version": "4.17.23",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz",
"integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA=="
},
"node_modules/@types/lodash-es": {
"version": "4.17.12",
@@ -7083,7 +7114,7 @@
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/atob": {
@@ -7159,12 +7190,12 @@
}
},
"node_modules/axios": {
"version": "1.9.0",
"resolved": "https://registry.npmmirror.com/axios/-/axios-1.9.0.tgz",
"integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==",
"version": "1.13.3",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.13.3.tgz",
"integrity": "sha512-ERT8kdX7DZjtUm7IitEyV7InTHAF42iJuMArIiDIV5YtPanJkgw4hw5Dyg9fh0mihdWNn1GKaeIWErfe56UQ1g==",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"form-data": "^4.0.4",
"proxy-from-env": "^1.1.0"
}
},
@@ -7424,9 +7455,9 @@
}
},
"node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dependencies": {
"balanced-match": "^1.0.0"
}
@@ -7977,7 +8008,7 @@
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dependencies": {
"delayed-stream": "~1.0.0"
@@ -8827,9 +8858,9 @@
}
},
"node_modules/dayjs": {
"version": "1.11.13",
"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
"version": "1.11.19",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz",
"integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw=="
},
"node_modules/de-indent": {
"version": "1.0.2",
@@ -8957,7 +8988,7 @@
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"engines": {
"node": ">=0.4.0"
@@ -9837,9 +9868,9 @@
}
},
"node_modules/eslint/node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0",
@@ -10445,9 +10476,9 @@
}
},
"node_modules/flat-cache/node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0",
@@ -10578,13 +10609,14 @@
}
},
"node_modules/form-data": {
"version": "4.0.2",
"resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.2.tgz",
"integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
"integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
@@ -10807,9 +10839,9 @@
}
},
"node_modules/glob": {
"version": "10.4.5",
"resolved": "https://registry.npmmirror.com/glob/-/glob-10.4.5.tgz",
"integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
"integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
"dependencies": {
"foreground-child": "^3.1.0",
"jackspeak": "^3.1.2",
@@ -12058,9 +12090,9 @@
}
},
"node_modules/jake/node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0",
@@ -12158,9 +12190,9 @@
"dev": true
},
"node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
"integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"dependencies": {
"argparse": "^2.0.1"
},
@@ -12603,14 +12635,14 @@
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
"version": "4.17.23",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
"integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="
},
"node_modules/lodash-es": {
"version": "4.17.21",
"resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
"version": "4.17.23",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz",
"integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg=="
},
"node_modules/lodash-unified": {
"version": "1.0.3",
@@ -12959,6 +12991,17 @@
"markdown-it": "bin/markdown-it.mjs"
}
},
"node_modules/marked": {
"version": "17.0.1",
"resolved": "https://registry.npmjs.org/marked/-/marked-17.0.1.tgz",
"integrity": "sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==",
"bin": {
"marked": "bin/marked.js"
},
"engines": {
"node": ">= 20"
}
},
"node_modules/markmap-common": {
"version": "0.16.0",
"resolved": "https://registry.npmmirror.com/markmap-common/-/markmap-common-0.16.0.tgz",
@@ -13127,7 +13170,7 @@
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"engines": {
"node": ">= 0.6"
@@ -13143,7 +13186,7 @@
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dependencies": {
"mime-db": "1.52.0"
@@ -13182,9 +13225,9 @@
"integrity": "sha512-VLMYQI5+FcD9Ad24VcB08uA83B07OhueAlZ88jBK6PyupTvEJwllTMUqMy0wPGYs7pZUEtEEMWdHB63m3LtEcg=="
},
"node_modules/min-document": {
"version": "2.19.0",
"resolved": "https://registry.npmmirror.com/min-document/-/min-document-2.19.0.tgz",
"integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==",
"version": "2.19.2",
"resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.2.tgz",
"integrity": "sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==",
"dependencies": {
"dom-walk": "^0.1.0"
}
@@ -14389,9 +14432,9 @@
}
},
"node_modules/preact": {
"version": "10.26.8",
"resolved": "https://registry.npmmirror.com/preact/-/preact-10.26.8.tgz",
"integrity": "sha512-1nMfdFjucm5hKvq0IClqZwK4FJkGXhRrQstOQ3P4vp8HxKrJEMFcY6RdBRVTdfQS/UlnX6gfbPuTvaqx/bDoeQ==",
"version": "10.28.2",
"resolved": "https://registry.npmjs.org/preact/-/preact-10.28.2.tgz",
"integrity": "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/preact"
@@ -14680,9 +14723,9 @@
}
},
"node_modules/qs": {
"version": "6.14.0",
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.14.0.tgz",
"integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
"version": "6.14.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
"integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
"dependencies": {
"side-channel": "^1.1.0"
},
+5
View File
@@ -49,4 +49,9 @@ export const DeviceApi = {
exportDevice: async (params) => {
return await request.download({ url: `/product/device/export-excel`, params })
},
// 获取设备下拉列表(精简,自动根据当前登录用户过滤)
getDeviceListAllSimple: async () => {
return await request.get({ url: `/product/device/list-all-simple` })
},
}
+16
View File
@@ -14,6 +14,7 @@ export interface UserVO {
status: number
remark: string
deviceId: string
deviceNames?: string // 绑定的设备名称列表,逗号分隔
loginDate: Date
createTime: Date
}
@@ -80,3 +81,18 @@ export const updateUserStatus = (id: number, status: number) => {
export const getSimpleUserList = (): Promise<UserVO[]> => {
return request.get({ url: '/system/user/simple-list' })
}
// 绑定用户设备
export const bindUserDevices = (data: { userId: number; deviceIds: number[] }) => {
return request.post({ url: '/system/user/bind-devices', data })
}
// 解绑用户设备
export const unbindUserDevices = (data: { userId: number; deviceIds: number[] }) => {
return request.delete({ url: '/system/user/unbind-devices', data })
}
// 获取用户绑定的设备ID列表
export const getUserDeviceIds = (userId: number) => {
return request.get({ url: '/system/user/get-device-ids?userId=' + userId })
}
+42 -1
View File
@@ -127,6 +127,21 @@
/>
<el-table-column label="手机号码" align="center" prop="mobile" width="120" />
<el-table-column label="设备IMEI" align="center" prop="deviceId" width="150" />
<el-table-column label="绑定设备" align="center" width="300">
<template #default="scope">
<div v-if="scope.row.deviceNames" class="flex flex-wrap gap-1 justify-center">
<el-tag
v-for="(name, index) in scope.row.deviceNames.split(',')"
:key="index"
size="small"
:type="getTagType(index)"
>
{{ name.trim() }}
</el-tag>
</div>
<span v-else class="text-gray-400">-</span>
</template>
</el-table-column>
<el-table-column label="状态" key="status">
<template #default="scope">
<el-switch
@@ -145,7 +160,7 @@
:formatter="dateFormatter"
width="180"
/>
<el-table-column label="操作" align="center" width="160">
<el-table-column label="操作" align="center" width="240">
<template #default="scope">
<div class="flex items-center justify-center">
<el-button
@@ -156,6 +171,14 @@
>
<Icon icon="ep:edit" />修改
</el-button>
<el-button
type="primary"
link
@click="handleDevice(scope.row)"
v-hasPermi="['system:user:update']"
>
<Icon icon="ep:connection" />绑定设备
</el-button>
<el-dropdown
@command="(command) => handleCommand(command, scope.row)"
v-hasPermi="[
@@ -208,6 +231,8 @@
<UserImportForm ref="importFormRef" @success="getList" />
<!-- 分配角色 -->
<UserAssignRoleForm ref="assignRoleFormRef" @success="getList" />
<!-- 绑定设备 -->
<UserDeviceBindingForm ref="deviceBindingFormRef" @success="getList" />
</template>
<script lang="ts" setup>
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
@@ -219,6 +244,7 @@ import * as UserApi from '@/api/system/user'
import UserForm from './UserForm.vue'
import UserImportForm from './UserImportForm.vue'
import UserAssignRoleForm from './UserAssignRoleForm.vue'
import UserDeviceBindingForm from './UserDeviceBindingForm.vue'
import DeptTree from './DeptTree.vue'
defineOptions({ name: 'SystemUser' })
@@ -328,6 +354,9 @@ const handleCommand = (command: string, row: UserApi.UserVO) => {
case 'handleRole':
handleRole(row)
break
case 'handleDevice':
handleDevice(row)
break
default:
break
}
@@ -367,6 +396,18 @@ const handleRole = (row: UserApi.UserVO) => {
assignRoleFormRef.value.open(row)
}
/** 绑定设备 */
const deviceBindingFormRef = ref()
const handleDevice = (row: UserApi.UserVO) => {
deviceBindingFormRef.value.open(row)
}
/** 获取标签类型(循环使用不同颜色) */
const getTagType = (index: number) => {
const types = ['primary', 'success', 'warning', 'danger', 'info']
return types[index % types.length]
}
/** 初始化 */
onMounted(() => {
getList()