leadal-auth 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{leadal-auth → lib}/leadal-auth.common.js +1 -1
- package/{leadal-auth → lib}/leadal-auth.umd.js +1 -1
- package/{leadal-auth → lib}/leadal-auth.umd.min.js +1 -1
- package/package.json +9 -6
- package/src/App.vue +19 -0
- package/src/api/card.js +58 -0
- package/src/api/face.js +37 -0
- package/src/api/finger.js +64 -0
- package/src/api/index.js +100 -0
- package/src/assets/BIN.png +0 -0
- package/src/assets/CLOSE.svg +11 -0
- package/src/assets/blue-left.png +0 -0
- package/src/assets/blue-right.png +0 -0
- package/src/assets/finger-ready.png +0 -0
- package/src/assets/finger-select.png +0 -0
- package/src/assets/finger-status-1-last.png +0 -0
- package/src/assets/finger-status-1.gif +0 -0
- package/src/assets/finger-status-2-last.png +0 -0
- package/src/assets/finger-status-2.gif +0 -0
- package/src/assets/finger-status-3-last.png +0 -0
- package/src/assets/finger-status-3.gif +0 -0
- package/src/assets/finger-status-compeleted.png +0 -0
- package/src/assets/finger-status-start.png +0 -0
- package/src/assets/icon-camera.png +0 -0
- package/src/assets/icon-picture.png +0 -0
- package/src/assets/icon-success.png +0 -0
- package/src/assets/img-camera.png +0 -0
- package/src/assets/img-card.png +0 -0
- package/src/assets/img-loading.png +0 -0
- package/src/assets/left.png +0 -0
- package/src/assets/logo.png +0 -0
- package/src/assets/right.png +0 -0
- package/src/assets/ukey1.png +0 -0
- package/src/assets/ukey2.png +0 -0
- package/src/assets//346/214/207/347/272/271/350/257/206/345/210/2531.png +0 -0
- package/src/assets//346/214/207/347/272/271/350/257/206/345/210/2532.png +0 -0
- package/src/components/auth-com.vue +100 -0
- package/src/components/card-register/components/CardTable.vue +94 -0
- package/src/components/card-register/components/RegisterDialog.vue +137 -0
- package/src/components/card-register/index.vue +110 -0
- package/src/components/edit-user-dialog.vue +141 -0
- package/src/components/empty.vue +13 -0
- package/src/components/face-register/components/ChooseCameraOrPicture.vue +59 -0
- package/src/components/face-register/components/FaceDetected.vue +543 -0
- package/src/components/face-register/components/FaceInfo.vue +171 -0
- package/src/components/face-register/components/FacePicture.vue +85 -0
- package/src/components/face-register/components/UploadPicture.vue +336 -0
- package/src/components/face-register/index.vue +242 -0
- package/src/components/finger-register/index.vue +707 -0
- package/src/components/organ-tree.vue +211 -0
- package/src/components/tree-select.vue +131 -0
- package/src/components/user-drawer.vue +147 -0
- package/src/components/user-info.vue +272 -0
- package/src/components/user-table.vue +405 -0
- package/src/leadal-auth.css +1 -0
- package/src/main.js +25 -0
- package/src/package/auth-manage/index.vue +468 -0
- package/src/package/index.js +22 -0
- package/src/store/index.js +39 -0
- package/src/styles/common.scss +183 -0
- package/src/styles/index.scss +38 -0
- package/src/utils/dict.js +47 -0
- package/src/utils/event-bus.js +6 -0
- package/src/utils/request-auth.js +64 -0
- package/src/utils/request.js +64 -0
- package/src/utils/websocket.js +282 -0
- /package/{leadal-auth → lib}/demo.html +0 -0
- /package/{leadal-auth → lib}/img/finger-status-1-last.ad7c6895.png +0 -0
- /package/{leadal-auth → lib}/img/finger-status-1.220235cf.gif +0 -0
- /package/{leadal-auth → lib}/img/finger-status-2-last.52c6c2f8.png +0 -0
- /package/{leadal-auth → lib}/img/finger-status-2.482c9fce.gif +0 -0
- /package/{leadal-auth → lib}/img/finger-status-3-last.fc001fed.png +0 -0
- /package/{leadal-auth → lib}/img/finger-status-3.3e090300.gif +0 -0
- /package/{leadal-auth → lib}/img/finger-status-compeleted.fc001fed.png +0 -0
- /package/{leadal-auth → lib}/img/finger-status-start.a6cdd794.png +0 -0
- /package/{leadal-auth → lib}/img/img-camera.f5578f07.png +0 -0
- /package/{leadal-auth → lib}/leadal-auth.css +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.tree-select[data-v-1e13a420]{position:relative}.tree-container[data-v-1e13a420]{position:absolute;width:100%;border:1px solid #e4e7ed;z-index:999;background:#fff;top:34px;max-height:300px}.el-icon-arrow-down.is-reverse[data-v-1e13a420]{transform:rotate(180deg)}[data-v-1e13a420] .el-scrollbar__wrap{max-height:300px}.organ-tree[data-v-14d11cf8]{width:100%;height:100%;border:1px solid #cedded}.organ-tree .organ-tree-header[data-v-14d11cf8]{width:100%;height:50px;padding:0 10px;background:#f9fbfd;box-sizing:border-box}.organ-tree .organ-tree-header h3[data-v-14d11cf8]{font-size:16px;color:#525252;margin:0;padding:0}.organ-tree .organ-tree-header span[data-v-14d11cf8]{color:#4e91ea;cursor:pointer}.organ-tree[data-v-14d11cf8] .custom-tree-node{width:calc(100% - 34px);display:flex;align-items:center;justify-content:space-between}.organ-tree[data-v-14d11cf8] .custom-tree-node .node-text{max-width:calc(100% - 60px);display:inline-block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.organ-tree[data-v-14d11cf8] .custom-tree-node .action-buttons{opacity:0;visibility:hidden;transition:opacity .2s ease,visibility .2s ease}.organ-tree[data-v-14d11cf8] .custom-tree-node .action-buttons i{margin-left:4px;cursor:pointer;color:#606266}.organ-tree[data-v-14d11cf8] .custom-tree-node .action-buttons i:hover{color:#409eff}.organ-tree[data-v-14d11cf8] .custom-tree-node:hover .action-buttons{opacity:1;visibility:visible}.organ-tree[data-v-14d11cf8] .el-dialog__header{padding:10px}.organ-tree[data-v-14d11cf8] .el-dialog__header .el-dialog__headerbtn{top:14px}.organ-tree .organ-tree-content[data-v-14d11cf8]{width:100%;height:calc(100% - 50px)}[data-v-14d11cf8] .el-tree-node__content{display:flex;align-items:center;cursor:pointer;padding:5px 8px}.user-table[data-v-0b46f100]{width:100%;height:100%;padding:14px;border:1px solid #cedded;box-sizing:border-box}.user-table .user-opt[data-v-0b46f100]{width:100%;height:50px;padding-bottom:10px}.user-table .user-opt[data-v-0b46f100] .el-button{padding:7px 20px}.user-table .user-table-main[data-v-0b46f100]{width:100%;height:calc(100% - 50px)}.user-table .user-table-content[data-v-0b46f100]{width:100%;height:calc(100% - 40px)}.user-table .user-table-content .row-opt[data-v-0b46f100]{cursor:pointer;color:#3391ff}.user-table .user-table-pagination[data-v-0b46f100]{width:100%;height:40px}[data-v-0b46f100] .el-button{border-radius:8px}.user-info-main[data-v-7e1c92e8]{width:100%;height:100%}.user-info-main .collapse-title[data-v-7e1c92e8]{display:flex;color:#101010;font-size:16px;text-align:left;font-family:SourceHanSansSC-regular;align-items:center}.user-info-main .collapse-title .title-bar[data-v-7e1c92e8]{display:inline-block;margin-right:10px;width:4px;height:16px;font-size:16px;background:#3391ff}.user-info-main .form-item[data-v-7e1c92e8]{display:flex;flex-direction:column;align-items:center;width:calc(100% - 28px);padding:0 14px}.user-info-main .form-item .form-status[data-v-7e1c92e8]{padding:4px 6px;background:#f7f9fe}.user-info-main[data-v-7e1c92e8] .el-collapse{border:0}.user-info-main[data-v-7e1c92e8] .el-collapse-item__header,.user-info-main[data-v-7e1c92e8] .el-collapse-item__wrap{border-bottom:0}.user-info-main[data-v-7e1c92e8] .el-form-item{display:flex;flex-direction:column;align-items:center;width:calc(100% - 28px);padding:10px 14px 0 14px;margin-bottom:4px}.user-info-main[data-v-7e1c92e8] .el-form-item__content{width:100%;margin-left:0!important}.choose-camera-or-picture[data-v-361766db]{width:240px;height:240px;background:#fff;border:1px dashed #bfbfbf;border-radius:10px}.choose-camera-or-picture-title[data-v-361766db]{color:#333;font-size:16px}.choose-camera-or-picture-title[data-v-361766db]:hover{color:#008cd2}.upload-picture[data-v-8e8a413c]{width:100%;max-width:600px;min-height:240px}.upload-picture .uploaded-images[data-v-8e8a413c]{display:flex;flex-wrap:wrap;gap:16px;margin-bottom:16px}.upload-picture .uploaded-images .image-item[data-v-8e8a413c]{position:relative;width:180px;height:180px;border-radius:10px;overflow:hidden;border:1px solid #e6e6e6}.upload-picture .uploaded-images .image-item img[data-v-8e8a413c]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.upload-picture .uploaded-images .image-item .image-actions[data-v-8e8a413c]{position:absolute;top:8px;right:8px;background:rgba(0,0,0,.6);border-radius:50%;width:28px;height:28px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background-color .3s}.upload-picture .uploaded-images .image-item .image-actions[data-v-8e8a413c]:hover{background:hsla(0,87%,69%,.8)}.upload-picture .uploaded-images .image-item .image-actions i[data-v-8e8a413c]{color:#fff;font-size:14px}.upload-picture .avatar-uploader .upload-area[data-v-8e8a413c]{width:240px;height:240px;background:#fff;border:1px dashed #bfbfbf;border-radius:10px;cursor:pointer;transition:all .3s}.upload-picture .avatar-uploader .upload-area[data-v-8e8a413c]:hover:not(.uploading){border-color:#409eff}.upload-picture .avatar-uploader .upload-area.uploading[data-v-8e8a413c]{border-color:#409eff;background:#f0f9ff;cursor:not-allowed}.upload-picture .avatar-uploader .upload-area .upload-content[data-v-8e8a413c]{text-align:center}.upload-picture .avatar-uploader .upload-area .upload-content .upload-text[data-v-8e8a413c]{margin-top:12px;font-size:14px;color:#409eff;font-weight:500}.upload-picture .max-limit-tip[data-v-8e8a413c]{width:240px;height:240px;background:#f5f5f5;border:1px dashed #e6e6e6;border-radius:10px}.upload-picture .max-limit-tip .tip-content[data-v-8e8a413c]{text-align:center}.upload-picture .max-limit-tip .tip-content .tip-text[data-v-8e8a413c]{margin-top:12px;font-size:14px;color:#f56c6c}[data-v-8e8a413c] .el-upload{display:block}[data-v-8e8a413c] .el-upload-dragger{width:100%;height:100%;border:none;border-radius:10px;background:transparent}.face-detection[data-v-7c2b7702]{width:500px;height:480px;border-radius:8px;border:1px solid #e5e5e7}.face-detection-container[data-v-7c2b7702]{margin:0 auto;width:360px;height:360px;background:#fff;border-radius:12px;background:url(/img/img-camera.f5578f07.png) no-repeat 50%;background-size:100% 100%}.camera-container[data-v-7c2b7702]{position:relative;display:inline-block;border:2px solid #ddd;border-radius:50%;overflow:hidden;background:#000;width:240px;height:240px}.camera-container.detecting[data-v-7c2b7702]{border-color:#0f0;box-shadow:0 0 20px rgba(0,255,0,.3)}.overlay-canvas[data-v-7c2b7702]{position:absolute;top:0;left:0;pointer-events:none;border-radius:50%}.status-overlay[data-v-7c2b7702]{position:absolute;bottom:10px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,.8);color:#fff;padding:8px 16px;border-radius:20px;font-size:14px}.status-item[data-v-7c2b7702]{display:flex;align-items:center;gap:8px}.spinner[data-v-7c2b7702]{width:16px;height:16px;border:2px solid #333;border-top:2px solid #fff;border-radius:50%;animation:spin-7c2b7702 1s linear infinite}.pulse[data-v-7c2b7702]{width:12px;height:12px;background:#0f0;border-radius:50%;animation:pulse-7c2b7702 1s ease-in-out infinite}@keyframes spin-7c2b7702{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes pulse-7c2b7702{0%,to{opacity:1}50%{opacity:.5}}.results[data-v-7c2b7702]{position:absolute;top:0;left:0}.captured-image-container[data-v-7c2b7702],.results[data-v-7c2b7702]{display:flex;justify-content:center;align-items:center}.captured-face-image[data-v-7c2b7702]{border-radius:50%;-o-object-fit:cover;object-fit:cover}@media (max-width:768px){.face-detection-container[data-v-7c2b7702]{padding:10px}}.face-picture[data-v-0b73bca5]{position:relative;width:240px;height:240px;background:#fff;border:1px dashed #bfbfbf;border-radius:10px}.delete-batn[data-v-0b73bca5]{position:absolute;top:0;right:0;width:24px;background:#e5e5e7;height:24px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:0 0 0 4px}.delete-batn[data-v-0b73bca5] :hover{background:#e5e5e7}.dialog-header[data-v-6026fac0]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #eee}.title[data-v-6026fac0]{font-size:18px;font-weight:500;color:#333}.close-icon[data-v-6026fac0]{width:16px;height:16px;cursor:pointer}.dialog-content[data-v-6026fac0]{padding:20px}.uploading-container[data-v-6026fac0]{display:flex;justify-content:center;align-items:center;width:360px;height:360px;background:#f0f9ff;border-radius:12px;border:2px dashed #409eff}.uploading-content[data-v-6026fac0]{text-align:center}.uploading-content .uploading-text[data-v-6026fac0]{margin-top:16px;font-size:16px;color:#409eff;font-weight:500}.uploading-content i[data-v-6026fac0]{animation:rotate-6026fac0 2s linear infinite}@keyframes rotate-6026fac0{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.error-container[data-v-6026fac0]{display:flex;justify-content:center;align-items:center;width:360px;height:360px;background:#fef0f0;border-radius:12px;border:2px dashed #f56c6c}.error-content[data-v-6026fac0]{text-align:center}.error-content .error-text[data-v-6026fac0]{margin-top:16px;font-size:18px;color:#f56c6c;font-weight:600}.error-content .error-desc[data-v-6026fac0]{margin-top:8px;font-size:14px;color:#999}.select-section[data-v-2a8d4408]{margin-bottom:52px;text-align:left;margin-left:100px}.select-button[data-v-2a8d4408]{font-size:14px;color:#8a97bb;padding:0}[data-v-56d9f150] .el-button{border-radius:8px}.finger-dialog[data-v-de87379c]{width:100%;height:100%;border-radius:12px;overflow:hidden;background:#f8f8fb}.dialog-header[data-v-de87379c]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #eee}.title[data-v-de87379c]{font-size:18px;font-weight:500;color:#333}.close-icon[data-v-de87379c]{width:16px;height:16px;cursor:pointer}.finger-register-content[data-v-de87379c]{height:calc(100% - 182px);margin-left:24px;margin-right:24px;border-radius:12px}.hand-area[data-v-de87379c]{width:210px;display:flex;flex-direction:column;margin-left:20px}.hand-image-wrapper[data-v-de87379c]{display:flex;justify-content:center;align-items:center;position:relative;margin-bottom:20px}.hand-image[data-v-de87379c]{width:200px;height:260px;-o-object-fit:contain;object-fit:contain}.finger-buttons-overlay[data-v-de87379c]{position:absolute;top:0;left:0;width:100%;height:100%}.finger-circle[data-v-de87379c]{position:absolute;width:26px;height:26px;border-radius:50%;border:3px solid silver;background-color:#f8f8fb;cursor:pointer;transition:all .3s}.finger-circle[data-v-de87379c]:hover{transform:scale(1.1);box-shadow:0 0 5px rgba(59,128,239,.5)}.finger-circle.active[data-v-de87379c]{border:3px solid #3b80ef;background:#3b80ef3f}.finger-circle.ready[data-v-de87379c]{width:25px;height:25px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAGjklEQVRIiY2WC1CU1xXHf8uyvGUReYYVeQUEIxCIxoAQQUlQ26g1vqaxhkozm5rqpDqpCcZqEpMZGvOO0YapJTVOsJqMdZJYXzHREl9ViUBEBQQRQXksjwW+XWA75+I6jBNszsw3e++357v/e879n/+5upA38vkZFgI8DEQDnkA/cA0oM2umip+zgOs9/nMDlgG/AyaN5LTVvaEB+AfwrlkzNY/kN1JEM4CPgBiZeLgaSAqJIHpMiBr32DSaui2cbaylU+txfmMFNgKbzZpp8O4F9T4zUu5+92egCBgT7R/M2sx5pNwXSWtvF5daGqltv0ljVzs6dGRFTSAvJYtBh4PqtmbJQA6Qfsa1c+9DA77avSJ6DShw0elY++g8mrs72FN+gsmmGGbGPkjE6ED0Ohe1cFtvN4drLvBV1TkmhUUzJ34S6w+X0NrTJeucBKabNZPVufDwM1oMvCQgH815htVfFSuAo/kbaenpZE/FSUoulNJrt+FpcCPcL4BZsUPZ+PT8MQ5cKWNj9kL+euYQ1zvbhDifAPPvjmgsUAn4vJz1JJuP72PD9AUsfCCN3+8r4kj1BWbHpZIZEY+3mwfagJ3q1mY+u/AfGjvbSA6NoGjes6RtK8A8OYeiM0fosavMLTVrph3Dgf4G5AX5GMEBL2TO4ZHwOB7b/oqKYH3WAmIDQtl/+TxNXRZ83D3IjnqAnJgkzjXWkPf5FmSDj8ckkbrlT6ye+ku1WeA6EGXWTDYXIAh4SnIf7G1kQvBYfhGXSvq2AtZMfYLiJ59jw5Fd6sPRHt5MjYgnwMuX147uIen91Xi4ulH6zCZeOrCTOksLf8ldyo7z3xEfaBKgMGCRDAToV4AhIyKeiy2NvDs7j99+vkWlaUniVNZ8/Qkli//IZ4ufJ8o/mBtd7Qgbv8t/hfXZC5j7aSEXW67z8VwzS3a9w/wJU9DpdOp8h529IkOWDEzGMUyLTMBq1yitr+LsikKW7n6ft2Y9zSh3DyZtWYttoJ/ZcSk0dLRSeGwv+5cV0J7RzZKSdyj7w5uE+Pixq7yUxRPT+abmjmBkbHVvcJGIEmTW3mtl0cR0vrz4X8YHhuGmdyXGP4SEQBOzil/Hw2CgfOVbLH8om7WZc9k+fwU5218lP3W68t1ZdpxfJ2dQ8kMpj9+fzOXWGwR6+8rSo4RsAhQos5vdFlLvi1LRyEFX3GwgNzZZnYXY5pnLFL1z/76JR4vW43A4WJSYxtkbtSpNZxtrlHpIagWgr99GkLfRGVWQAOllZBsYULvutvVxpbWJLypPEuxjVGOxhCAThxXNU3B3NXC87kcSg8fx8elD1He00Ndvx+jhqX4lQilqqcnbplLXOgTUr14Z9K6q+Pb+eBo3vQGH8F3MIT52CqbN58HQSFqsXYz29ObM9WrGGgPos9tw1xuwD/Zj0Ku909rb7QRqE6AqGYmOCcW7tF5Wpc3mzdzfYLX13QFycdE5IZVJ0UpkM2ISeXbyY3TZ+ob240DpoFhTV7tyBWoF6JjMpkVNwGrT+KGpjuSQcUp2jB5e3LJ2qo9GuXkqwshm+gcH+b7+EttOHVQ11an1KlWXtEk0zuxI+oATZs3UL0By2o5vayt5eOuLzIhOJOf+JIrPfUuA1yilBEJb0bfqtia83dwVcUTFJcVhvqNp6GzFz8NbCaqXwV2piTMqYLezYGuBL/sHB5gePZEPn8hn7o5CpQ7H6y4qT6FrWdNVtUNfd09q2m8OpVOnI9wvkLIbVwkz+nOtQwC9+Kam3JlyC7DDCSS2TtqzaNmUrS+SGhbFqrRZitoSiWjfy4dKSA+Po/JWAwYXvVIQAY4dE0pp/SVSQqM43XCFSP9gVcy37Q2zZrIMByoDNklt2AcGyBgXT8qHL6i0/fvpdRytqVCLrJiSq84lbdx4pdhCY3k6+qxqfqLhMhXN11SvAr4H3r7D72FEehX4l9TRU/98j3BjAFXPv4el18qKfUXKQUC+qDzFykdm8sGJ/SqlUth6F71qC9Iy6iy3xFXuEQvNmsl+dz9ymrTjYqcQRvgFctVyi+Wp2WRGJrBs9wdE+4dwIG8d499exZHlGyg4uJNum0Z5c72TbVIuuWbNdHX4wj91ORG6PAe8Lo3QqQpSU9IGpO+ITFW1NCqpOdcoXHKWtOqqK82aaagm/g+Q00KBNcCS2+ORTK5BXwOFZs10aiSne14gpTYsfVY5R7nXSTuJAPxvX62ke54GDpo10507108a8D8M6LIxxQTm1AAAAABJRU5ErkJggg==) no-repeat;background-size:100% 100%}.fingerprint-status[data-v-de87379c]{width:300px;height:300px;margin-left:32px;display:flex;flex-direction:column;border:1px dashed #d6d9e1;background:#fff;border-radius:12px}.status-header[data-v-de87379c]{padding:12px;background-color:#f5f5f5;border-bottom:1px solid #eee}.status-title[data-v-de87379c]{font-size:14px;color:#666}.fingerprint-image-container[data-v-de87379c]{flex:1;display:flex;flex-direction:column;justify-content:center;align-items:center;padding:0 20px 20px 20px}.fingerprint-image[data-v-de87379c]{width:120px;height:120px;margin-bottom:20px}.status-text[data-v-de87379c]{font-size:14px;color:#999;text-align:center}.collect-progress[data-v-de87379c]{margin:0 20px 20px}.progress-text[data-v-de87379c]{font-size:14px;color:#666;margin-bottom:5px}.progress-bar[data-v-de87379c]{height:8px;background-color:#eee;border-radius:4px;overflow:hidden}.progress-inner[data-v-de87379c]{height:100%;background-color:#3b80ef;transition:width .3s}.dialog-footer .el-button[data-v-de87379c]{margin:20px 10px}.delete-button[data-v-de87379c]{width:100%;height:40px;display:flex;justify-content:flex-end;align-items:center}.auth-com[data-v-112e7717]{width:calc(100% - 48px);height:calc(100% - 48px);padding:16px}.auth-com .tab-main[data-v-112e7717]{width:100%;height:calc(100% - 56px)}.auth-com .tab-main .tab-content[data-v-112e7717]{width:100%;height:100%}[data-v-112e7717] .el-tabs__nav-wrap:after{background-color:transparent}[data-v-112e7717] .el-tabs__item{font-size:18px;color:#989898}.user-drawer[data-v-ee7490ee]{width:calc(100% - 4px);height:calc(100% - 4px);padding:0 2px}.user-drawer .user-drawer-header[data-v-ee7490ee]{height:50px;padding:0 0 0 12px;border-bottom:1px solid #ecebeb}.user-drawer .user-drawer-content[data-v-ee7490ee]{width:100%;height:calc(100% - 50px)}.user-drawer .user-drawer-content .user-auth[data-v-ee7490ee]{width:calc(100% - 460px);height:100%}.user-drawer .user-drawer-content .user-info[data-v-ee7490ee]{width:460px;height:100%;border-left:1px solid #ecebeb}.icon-back[data-v-ee7490ee]{cursor:pointer;display:flex;width:53px;height:44px;align-items:center;justify-content:space-between}.icon-back span[data-v-ee7490ee],.icon-back[data-v-ee7490ee]{color:#5a5a5a;font-weight:500;font-size:16px}.organ-manage[data-v-37d6a0fe]{width:100%;height:100%;position:relative}.organ-manage .organ-manage-tree[data-v-37d6a0fe]{width:300px;height:100%}.organ-manage .organ-manage-main[data-v-37d6a0fe]{width:calc(100% - 320px);height:100%}.mt-2{margin-top:2px}.pt-2{padding-top:2px}.mr-2{margin-right:2px}.pr-2{padding-right:2px}.mb-2{margin-bottom:2px}.pb-2{padding-bottom:2px}.ml-2{margin-left:2px}.pl-2{padding-left:2px}.p-2{padding:2px}.m-2{margin:2px}.fs-2{font-size:2px}.w-2{width:2px}.h-2{height:2px}.mt-4{margin-top:4px}.pt-4{padding-top:4px}.mr-4{margin-right:4px}.pr-4{padding-right:4px}.mb-4{margin-bottom:4px}.pb-4{padding-bottom:4px}.ml-4{margin-left:4px}.pl-4{padding-left:4px}.p-4{padding:4px}.m-4{margin:4px}.fs-4{font-size:4px}.w-4{width:4px}.h-4{height:4px}.mt-6{margin-top:6px}.pt-6{padding-top:6px}.mr-6{margin-right:6px}.pr-6{padding-right:6px}.mb-6{margin-bottom:6px}.pb-6{padding-bottom:6px}.ml-6{margin-left:6px}.pl-6{padding-left:6px}.p-6{padding:6px}.m-6{margin:6px}.fs-6{font-size:6px}.w-6{width:6px}.h-6{height:6px}.mt-8{margin-top:8px}.pt-8{padding-top:8px}.mr-8{margin-right:8px}.pr-8{padding-right:8px}.mb-8{margin-bottom:8px}.pb-8{padding-bottom:8px}.ml-8{margin-left:8px}.pl-8{padding-left:8px}.p-8{padding:8px}.m-8{margin:8px}.fs-8{font-size:8px}.w-8{width:8px}.h-8{height:8px}.mt-10{margin-top:10px}.pt-10{padding-top:10px}.mr-10{margin-right:10px}.pr-10{padding-right:10px}.mb-10{margin-bottom:10px}.pb-10{padding-bottom:10px}.ml-10{margin-left:10px}.pl-10{padding-left:10px}.p-10{padding:10px}.m-10{margin:10px}.fs-10{font-size:10px}.w-10{width:10px}.h-10{height:10px}.mt-12{margin-top:12px}.pt-12{padding-top:12px}.mr-12{margin-right:12px}.pr-12{padding-right:12px}.mb-12{margin-bottom:12px}.pb-12{padding-bottom:12px}.ml-12{margin-left:12px}.pl-12{padding-left:12px}.p-12{padding:12px}.m-12{margin:12px}.fs-12{font-size:12px}.w-12{width:12px}.h-12{height:12px}.mt-14{margin-top:14px}.pt-14{padding-top:14px}.mr-14{margin-right:14px}.pr-14{padding-right:14px}.mb-14{margin-bottom:14px}.pb-14{padding-bottom:14px}.ml-14{margin-left:14px}.pl-14{padding-left:14px}.p-14{padding:14px}.m-14{margin:14px}.fs-14{font-size:14px}.w-14{width:14px}.h-14{height:14px}.mt-16{margin-top:16px}.pt-16{padding-top:16px}.mr-16{margin-right:16px}.pr-16{padding-right:16px}.mb-16{margin-bottom:16px}.pb-16{padding-bottom:16px}.ml-16{margin-left:16px}.pl-16{padding-left:16px}.p-16{padding:16px}.m-16{margin:16px}.fs-16{font-size:16px}.w-16{width:16px}.h-16{height:16px}.mt-18{margin-top:18px}.pt-18{padding-top:18px}.mr-18{margin-right:18px}.pr-18{padding-right:18px}.mb-18{margin-bottom:18px}.pb-18{padding-bottom:18px}.ml-18{margin-left:18px}.pl-18{padding-left:18px}.p-18{padding:18px}.m-18{margin:18px}.fs-18{font-size:18px}.w-18{width:18px}.h-18{height:18px}.mt-20{margin-top:20px}.pt-20{padding-top:20px}.mr-20{margin-right:20px}.pr-20{padding-right:20px}.mb-20{margin-bottom:20px}.pb-20{padding-bottom:20px}.ml-20{margin-left:20px}.pl-20{padding-left:20px}.p-20{padding:20px}.m-20{margin:20px}.fs-20{font-size:20px}.w-20{width:20px}.h-20{height:20px}.mt-22{margin-top:22px}.pt-22{padding-top:22px}.mr-22{margin-right:22px}.pr-22{padding-right:22px}.mb-22{margin-bottom:22px}.pb-22{padding-bottom:22px}.ml-22{margin-left:22px}.pl-22{padding-left:22px}.p-22{padding:22px}.m-22{margin:22px}.fs-22{font-size:22px}.w-22{width:22px}.h-22{height:22px}.mt-24{margin-top:24px}.pt-24{padding-top:24px}.mr-24{margin-right:24px}.pr-24{padding-right:24px}.mb-24{margin-bottom:24px}.pb-24{padding-bottom:24px}.ml-24{margin-left:24px}.pl-24{padding-left:24px}.p-24{padding:24px}.m-24{margin:24px}.fs-24{font-size:24px}.w-24{width:24px}.h-24{height:24px}.mt-28{margin-top:28px}.pt-28{padding-top:28px}.mr-28{margin-right:28px}.pr-28{padding-right:28px}.mb-28{margin-bottom:28px}.pb-28{padding-bottom:28px}.ml-28{margin-left:28px}.pl-28{padding-left:28px}.p-28{padding:28px}.m-28{margin:28px}.fs-28{font-size:28px}.w-28{width:28px}.h-28{height:28px}.mt-30{margin-top:30px}.pt-30{padding-top:30px}.mr-30{margin-right:30px}.pr-30{padding-right:30px}.mb-30{margin-bottom:30px}.pb-30{padding-bottom:30px}.ml-30{margin-left:30px}.pl-30{padding-left:30px}.p-30{padding:30px}.m-30{margin:30px}.fs-30{font-size:30px}.w-30{width:30px}.h-30{height:30px}.mt-32{margin-top:32px}.pt-32{padding-top:32px}.mr-32{margin-right:32px}.pr-32{padding-right:32px}.mb-32{margin-bottom:32px}.pb-32{padding-bottom:32px}.ml-32{margin-left:32px}.pl-32{padding-left:32px}.p-32{padding:32px}.m-32{margin:32px}.fs-32{font-size:32px}.w-32{width:32px}.h-32{height:32px}.mt-36{margin-top:36px}.pt-36{padding-top:36px}.mr-36{margin-right:36px}.pr-36{padding-right:36px}.mb-36{margin-bottom:36px}.pb-36{padding-bottom:36px}.ml-36{margin-left:36px}.pl-36{padding-left:36px}.p-36{padding:36px}.m-36{margin:36px}.fs-36{font-size:36px}.w-36{width:36px}.h-36{height:36px}.mt-42{margin-top:42px}.pt-42{padding-top:42px}.mr-42{margin-right:42px}.pr-42{padding-right:42px}.mb-42{margin-bottom:42px}.pb-42{padding-bottom:42px}.ml-42{margin-left:42px}.pl-42{padding-left:42px}.p-42{padding:42px}.m-42{margin:42px}.fs-42{font-size:42px}.w-42{width:42px}.h-42{height:42px}.mt-48{margin-top:48px}.pt-48{padding-top:48px}.mr-48{margin-right:48px}.pr-48{padding-right:48px}.mb-48{margin-bottom:48px}.pb-48{padding-bottom:48px}.ml-48{margin-left:48px}.pl-48{padding-left:48px}.p-48{padding:48px}.m-48{margin:48px}.fs-48{font-size:48px}.w-48{width:48px}.h-48{height:48px}.flex-center{display:flex;justify-content:center}.flex-start{display:flex;justify-content:flex-start}.flex-end{display:flex;justify-content:flex-end}.flex-between{display:flex;justify-content:space-between}.flex-around{display:flex;justify-content:space-around}.cur-p{cursor:pointer}.flex-wrap,.no-wrap{flex-wrap:nowrap}.flex-1{flex:1}.fw-500{font-weight:500}.fw-bold{font-weight:700}.ui-button{border:0!important}.align-center{align-items:center}.loading-text{color:#fff;font-size:18px}.ld-c__empty{padding:10px 0;margin:0;text-align:center;color:#999;font-size:14px}.w100{width:100%}.h100{height:100%}.b-wt{background:#fff}.c-wt{color:#fff}.viewer-container{z-index:9999!important}.el-form-item__label,.el-input__inner{color:#333!important}.el-input.is-disabled .el-input__inner{color:#9a9a9a!important;border-color:#e0e0e0!important}.el-textarea__inner{color:#333!important}.el-textarea.is-disabled .el-textarea__inner{color:#9a9a9a!important;border-color:#e0e0e0!important}.dright-form{width:410px;border-left:1px solid #e0e0e0;padding:12px;height:100%}.delete-btn{font-size:14px;padding:0;color:#fff;border-radius:50%;height:22px;width:22px;line-height:-2px;text-align:center;cursor:pointer}.delete-btn,.delete-btn:hover{background:#ff5656}.send-footer{height:auto!important}.x-hidden{overflow-x:hidden!important}.op-05{opacity:.5}body{margin:0}span{font-size:14px}.f_center{justify-content:center}.f_around,.f_center{display:flex;align-items:center}.f_around{justify-content:space-around}.f_between{justify-content:space-between}.f_between,.f_end{display:flex;align-items:center}.f_end{justify-content:flex-end}.el-message{z-index:9999!important}
|
package/src/main.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import Vue from "vue";
|
|
2
|
+
import App from "./App.vue";
|
|
3
|
+
import LeadalAuth from "@/package/index.js";
|
|
4
|
+
import store from "./store";
|
|
5
|
+
|
|
6
|
+
import ElementUI from "element-ui";
|
|
7
|
+
import "element-ui/lib/theme-chalk/index.css";
|
|
8
|
+
|
|
9
|
+
import "./styles/index.scss";
|
|
10
|
+
|
|
11
|
+
Vue.use(LeadalAuth, {
|
|
12
|
+
baseUrl: "http://dftdm.netiler.com",
|
|
13
|
+
authUrl: "http://dftdm.netiler.com",
|
|
14
|
+
websocketUrl: "ws://10.1.22.32:38280",
|
|
15
|
+
});
|
|
16
|
+
Vue.use(ElementUI, {
|
|
17
|
+
size: "medium",
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
Vue.config.productionTip = false;
|
|
21
|
+
|
|
22
|
+
new Vue({
|
|
23
|
+
store,
|
|
24
|
+
render: (h) => h(App),
|
|
25
|
+
}).$mount("#app");
|
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="organ-manage f_between">
|
|
3
|
+
<div class="organ-manage-tree">
|
|
4
|
+
<organ-tree @load-user-data="f_userData" :key="organTreeKey" />
|
|
5
|
+
</div>
|
|
6
|
+
<div class="organ-manage-main">
|
|
7
|
+
<user-table
|
|
8
|
+
ref="user-table"
|
|
9
|
+
:organ="drawerInfo.organ"
|
|
10
|
+
@drawer="h_setUserId"
|
|
11
|
+
@refreshTree="f_refreshTree"
|
|
12
|
+
/>
|
|
13
|
+
</div>
|
|
14
|
+
<user-drawer
|
|
15
|
+
v-if="visible"
|
|
16
|
+
:auth-collect="authCollect"
|
|
17
|
+
:drawer-info="drawerInfo"
|
|
18
|
+
@closed="h_setVisible"
|
|
19
|
+
@refresh="f_userData"
|
|
20
|
+
>
|
|
21
|
+
<template #face>
|
|
22
|
+
<slot name="face"> </slot>
|
|
23
|
+
</template>
|
|
24
|
+
<template #finger>
|
|
25
|
+
<slot name="finger"> </slot>
|
|
26
|
+
</template>
|
|
27
|
+
<template #idCard>
|
|
28
|
+
<slot name="idCard"> </slot>
|
|
29
|
+
</template>
|
|
30
|
+
</user-drawer>
|
|
31
|
+
</div>
|
|
32
|
+
</template>
|
|
33
|
+
|
|
34
|
+
<script>
|
|
35
|
+
import OrganTree from "@/components/organ-tree.vue";
|
|
36
|
+
import UserTable from "@/components/user-table.vue";
|
|
37
|
+
import UserDrawer from "@/components/user-drawer.vue";
|
|
38
|
+
import dayjs from "dayjs";
|
|
39
|
+
import WebSocketClient from "@/utils/websocket";
|
|
40
|
+
|
|
41
|
+
export default {
|
|
42
|
+
name: "auth-manage",
|
|
43
|
+
props: {
|
|
44
|
+
authCollect: {
|
|
45
|
+
required: false,
|
|
46
|
+
type: Array,
|
|
47
|
+
default: () => ["face", "finger", "idCard"],
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
components: {
|
|
51
|
+
OrganTree,
|
|
52
|
+
UserTable,
|
|
53
|
+
UserDrawer,
|
|
54
|
+
},
|
|
55
|
+
// components: {
|
|
56
|
+
// OrganTree: () => import('@/components/organ-tree.vue'),
|
|
57
|
+
// UserTable: () => import('@/components/user-table.vue'),
|
|
58
|
+
// UserDrawer: () => import('@/components/user-drawer.vue')
|
|
59
|
+
// },
|
|
60
|
+
data() {
|
|
61
|
+
return {
|
|
62
|
+
visible: false,
|
|
63
|
+
drawerInfo: {},
|
|
64
|
+
organTreeKey: "1",
|
|
65
|
+
websocket: null,
|
|
66
|
+
cardReader: null, // 当前读卡器设备名称
|
|
67
|
+
fingerprintDeviceCount: 0, // 指纹设备数量
|
|
68
|
+
};
|
|
69
|
+
},
|
|
70
|
+
mounted() {
|
|
71
|
+
// console.log("process.env.VERSION", process.env.VERSION);
|
|
72
|
+
console.log(
|
|
73
|
+
"LD-AUTH打包时间为",
|
|
74
|
+
dayjs(process.env.VERSION).format("YYYY-MM-DD HH:mm:ss")
|
|
75
|
+
);
|
|
76
|
+
this.$authEventBus.$on("startCollection", this.handleStartCollection);
|
|
77
|
+
this.$authEventBus.$on("cancelCollection", this.handleCancelCollection);
|
|
78
|
+
// 初始化WebSocket连接
|
|
79
|
+
this.initWebSocket();
|
|
80
|
+
},
|
|
81
|
+
// 组件销毁时清理WebSocket连接
|
|
82
|
+
beforeDestroy() {
|
|
83
|
+
if (this.websocket) {
|
|
84
|
+
console.log("🔌 组件销毁,关闭WebSocket连接");
|
|
85
|
+
this.websocket.close();
|
|
86
|
+
this.websocket = null;
|
|
87
|
+
}
|
|
88
|
+
this.$authEventBus.$off("startCollection", this.handleStartCollection);
|
|
89
|
+
this.$authEventBus.$off("cancelCollection", this.handleCancelCollection);
|
|
90
|
+
},
|
|
91
|
+
methods: {
|
|
92
|
+
handleCancelCollection() {
|
|
93
|
+
if (this.websocket) {
|
|
94
|
+
this.websocket.send({ action: 1010 });
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
handleStartCollection() {
|
|
98
|
+
if (this.$store.getters.getFingerprintDeviceSN) {
|
|
99
|
+
const message = {
|
|
100
|
+
action: 1001,
|
|
101
|
+
};
|
|
102
|
+
this.websocket.send(message);
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
// 初始化WebSocket连接
|
|
107
|
+
initWebSocket() {
|
|
108
|
+
try {
|
|
109
|
+
// 创建WebSocket实例
|
|
110
|
+
this.websocket = new WebSocketClient(`${this.$store.state.websocketUrl}`, {
|
|
111
|
+
reconnectInterval: 5000, // 重连间隔5秒
|
|
112
|
+
maxReconnectAttempts: 10, // 最大重连10次
|
|
113
|
+
heartbeatInterval: 120000, // 心跳间隔2分钟
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// 监听连接成功事件
|
|
117
|
+
this.websocket.on("open", () => {
|
|
118
|
+
// 连接成功后先检查读卡器连接状态
|
|
119
|
+
this.checkCardReaderConnection();
|
|
120
|
+
// 获取指纹设备SN码
|
|
121
|
+
this.getFingerprintDeviceSN();
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// 监听消息接收事件
|
|
125
|
+
this.websocket.on("message", (data) => {
|
|
126
|
+
console.log("📨 收到WebSocket消息:", data);
|
|
127
|
+
this.handleWebSocketMessage(data);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// 监听连接错误事件
|
|
131
|
+
this.websocket.on("error", (error) => {
|
|
132
|
+
console.error("❌ WebSocket连接错误:", error);
|
|
133
|
+
this.$message?.error?.("WebSocket连接错误");
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
// 监听连接关闭事件
|
|
137
|
+
this.websocket.on("close", (event) => {
|
|
138
|
+
console.log("🔌 WebSocket连接已关闭:", event.code, event.reason);
|
|
139
|
+
if (event.code !== 1000) {
|
|
140
|
+
// this.$message?.warning?.("WebSocket连接已断开,正在尝试重连...");
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
// 监听重连失败事件
|
|
145
|
+
this.websocket.on("reconnectFailed", () => {
|
|
146
|
+
console.error("💥 WebSocket重连失败,已达最大重连次数");
|
|
147
|
+
this.$message?.error?.("WebSocket连接失败,请检查网络或联系管理员");
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
// 开始连接
|
|
151
|
+
this.websocket.connect();
|
|
152
|
+
} catch (error) {
|
|
153
|
+
console.error("WebSocket初始化失败:", error);
|
|
154
|
+
this.$message?.error?.("WebSocket初始化失败");
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
|
|
158
|
+
// 处理WebSocket消息
|
|
159
|
+
handleWebSocketMessage(data) {
|
|
160
|
+
// 根据action处理读卡器相关消息
|
|
161
|
+
if (data.action) {
|
|
162
|
+
switch (data.action) {
|
|
163
|
+
case 1009:
|
|
164
|
+
// 获取指纹设备SN响应
|
|
165
|
+
this.handleFingerprintDeviceSNResponse(data);
|
|
166
|
+
break;
|
|
167
|
+
case 2001:
|
|
168
|
+
// 检查读卡器连接状态响应
|
|
169
|
+
this.handleCheckCardReaderResponse(data);
|
|
170
|
+
break;
|
|
171
|
+
case 2002:
|
|
172
|
+
// 获取读卡器列表响应
|
|
173
|
+
this.handleCardReaderListResponse(data);
|
|
174
|
+
break;
|
|
175
|
+
case 2003:
|
|
176
|
+
// 打开读卡器响应
|
|
177
|
+
this.handleOpenCardReaderResponse(data);
|
|
178
|
+
break;
|
|
179
|
+
case 2004:
|
|
180
|
+
// 读卡器状态更新
|
|
181
|
+
this.$authEventBus.$emit("card", data);
|
|
182
|
+
break;
|
|
183
|
+
case 1001:
|
|
184
|
+
// 开始采集指纹
|
|
185
|
+
this.$authEventBus.$emit("startCollectionMessage", data);
|
|
186
|
+
break;
|
|
187
|
+
default:
|
|
188
|
+
console.log("未知action类型:", data);
|
|
189
|
+
}
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// 根据消息类型处理不同的业务逻辑
|
|
194
|
+
switch (data.type) {
|
|
195
|
+
case "user_update":
|
|
196
|
+
// 用户信息更新
|
|
197
|
+
console.log("用户信息更新:", data.payload);
|
|
198
|
+
this.f_userData(); // 刷新用户数据
|
|
199
|
+
break;
|
|
200
|
+
case "organ_update":
|
|
201
|
+
// 组织架构更新
|
|
202
|
+
console.log("组织架构更新:", data.payload);
|
|
203
|
+
this.f_refreshTree(); // 刷新组织树
|
|
204
|
+
break;
|
|
205
|
+
case "auth_status":
|
|
206
|
+
// 认证状态更新
|
|
207
|
+
console.log("认证状态更新:", data.payload);
|
|
208
|
+
this.$message?.info?.(data.payload.message || "认证状态已更新");
|
|
209
|
+
break;
|
|
210
|
+
case "notification":
|
|
211
|
+
// 系统通知
|
|
212
|
+
console.log("系统通知:", data.payload);
|
|
213
|
+
this.$message?.info?.(data.payload.message || "收到系统通知");
|
|
214
|
+
break;
|
|
215
|
+
default:
|
|
216
|
+
console.log("未知消息类型:", data);
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
|
|
220
|
+
// 发送WebSocket消息
|
|
221
|
+
sendWebSocketMessage(type, payload = {}) {
|
|
222
|
+
if (this.websocket && this.websocket.isOpen()) {
|
|
223
|
+
const message = {
|
|
224
|
+
type,
|
|
225
|
+
payload,
|
|
226
|
+
timestamp: Date.now(),
|
|
227
|
+
};
|
|
228
|
+
this.websocket.send(message);
|
|
229
|
+
console.log("📤 发送WebSocket消息:", message);
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
|
|
233
|
+
// ===================指纹设备相关方法===================
|
|
234
|
+
|
|
235
|
+
// 获取指纹设备SN码
|
|
236
|
+
getFingerprintDeviceSN() {
|
|
237
|
+
console.log("🔢 获取指纹设备SN码...");
|
|
238
|
+
const message = {
|
|
239
|
+
action: 1009,
|
|
240
|
+
};
|
|
241
|
+
this.websocket.send(message);
|
|
242
|
+
console.log("📤 发送获取指纹设备SN码消息:", message);
|
|
243
|
+
},
|
|
244
|
+
|
|
245
|
+
// 处理指纹设备SN响应
|
|
246
|
+
handleFingerprintDeviceSNResponse(data) {
|
|
247
|
+
console.log("📊 收到指纹设备SN响应:", data);
|
|
248
|
+
|
|
249
|
+
if (data.status === 200 || data.result === 0) {
|
|
250
|
+
// 获取成功
|
|
251
|
+
const deviceSN = data.data?.sn || "";
|
|
252
|
+
|
|
253
|
+
if (deviceSN) {
|
|
254
|
+
console.log("✅ 获取到指纹设备SN:", deviceSN);
|
|
255
|
+
// 存储到Vuex
|
|
256
|
+
this.$store.dispatch("updateFingerprintDeviceSN", deviceSN);
|
|
257
|
+
} else {
|
|
258
|
+
console.warn("⚠️ 指纹设备SN为空");
|
|
259
|
+
this.$store.dispatch("updateFingerprintDeviceSN", "");
|
|
260
|
+
}
|
|
261
|
+
} else {
|
|
262
|
+
// 获取失败
|
|
263
|
+
console.error("❌ 获取指纹设备SN失败:", data.msg || "未知错误");
|
|
264
|
+
// this.$store.dispatch("updateFingerprintDeviceSN", "");
|
|
265
|
+
this.$message?.error?.("获取指纹设备SN失败,请检查指纹设备连接");
|
|
266
|
+
}
|
|
267
|
+
},
|
|
268
|
+
|
|
269
|
+
// 获取指纹设备状态
|
|
270
|
+
getFingerprintDeviceStatus() {
|
|
271
|
+
return {
|
|
272
|
+
deviceCount: this.fingerprintDeviceCount,
|
|
273
|
+
hasDevice: this.fingerprintDeviceCount > 0,
|
|
274
|
+
deviceSN: this.$store.getters.getFingerprintDeviceSN,
|
|
275
|
+
};
|
|
276
|
+
},
|
|
277
|
+
|
|
278
|
+
// 刷新指纹设备数量
|
|
279
|
+
refreshFingerprintDeviceCount() {
|
|
280
|
+
if (this.websocket && this.websocket.isOpen()) {
|
|
281
|
+
this.getFingerprintDeviceCount();
|
|
282
|
+
} else {
|
|
283
|
+
console.warn("WebSocket未连接,无法获取指纹设备数量");
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
|
|
287
|
+
// 刷新指纹设备SN
|
|
288
|
+
refreshFingerprintDeviceSN() {
|
|
289
|
+
if (this.websocket && this.websocket.isOpen()) {
|
|
290
|
+
this.getFingerprintDeviceSN();
|
|
291
|
+
} else {
|
|
292
|
+
console.warn("WebSocket未连接,无法获取指纹设备SN");
|
|
293
|
+
}
|
|
294
|
+
},
|
|
295
|
+
|
|
296
|
+
// 刷新所有指纹设备信息
|
|
297
|
+
refreshAllFingerprintInfo() {
|
|
298
|
+
if (this.websocket && this.websocket.isOpen()) {
|
|
299
|
+
this.getFingerprintDeviceCount();
|
|
300
|
+
this.getFingerprintDeviceSN();
|
|
301
|
+
} else {
|
|
302
|
+
console.warn("WebSocket未连接,无法获取指纹设备信息");
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
|
|
306
|
+
// ===================读卡器相关方法===================
|
|
307
|
+
|
|
308
|
+
// 检查读卡器连接状态
|
|
309
|
+
checkCardReaderConnection() {
|
|
310
|
+
console.log("🔍 检查读卡器连接状态...");
|
|
311
|
+
const message = {
|
|
312
|
+
action: 2001,
|
|
313
|
+
};
|
|
314
|
+
this.websocket.send(message);
|
|
315
|
+
console.log("📤 发送检查读卡器连接状态消息:", message);
|
|
316
|
+
},
|
|
317
|
+
|
|
318
|
+
// 处理检查读卡器连接状态响应
|
|
319
|
+
handleCheckCardReaderResponse(data) {
|
|
320
|
+
console.log("📊 收到读卡器连接状态响应:", data);
|
|
321
|
+
|
|
322
|
+
if (data.status === 200 || data.result === 0) {
|
|
323
|
+
// 检查成功
|
|
324
|
+
if (data.data && data.data.isOpen) {
|
|
325
|
+
// 读卡器已经打开
|
|
326
|
+
this.cardReader = data.data.devName || "读卡器";
|
|
327
|
+
console.log("✅ 读卡器已连接:", this.cardReader);
|
|
328
|
+
} else {
|
|
329
|
+
// 读卡器未打开,需要获取并打开读卡器
|
|
330
|
+
console.log("⚠️ 读卡器未连接,开始获取读卡器列表...");
|
|
331
|
+
this.getCardReaderList();
|
|
332
|
+
}
|
|
333
|
+
} else {
|
|
334
|
+
// 检查失败
|
|
335
|
+
console.error("❌ 检查读卡器状态失败:", data.msg || "未知错误");
|
|
336
|
+
this.$message?.error?.(`检查读卡器状态失败: ${data.msg || "未知错误"}`);
|
|
337
|
+
// 即使检查失败,也尝试获取读卡器列表
|
|
338
|
+
this.getCardReaderList();
|
|
339
|
+
}
|
|
340
|
+
},
|
|
341
|
+
|
|
342
|
+
// 获取读卡器列表
|
|
343
|
+
getCardReaderList() {
|
|
344
|
+
console.log("📡 请求获取读卡器列表...");
|
|
345
|
+
const message = {
|
|
346
|
+
action: 2002,
|
|
347
|
+
};
|
|
348
|
+
this.websocket.send(message);
|
|
349
|
+
console.log("📤 发送获取读卡器列表消息:", message);
|
|
350
|
+
},
|
|
351
|
+
|
|
352
|
+
// 处理读卡器列表响应
|
|
353
|
+
handleCardReaderListResponse(data) {
|
|
354
|
+
console.log("📋 收到读卡器列表响应:", data);
|
|
355
|
+
|
|
356
|
+
if (data.data && Array.isArray(data.data) && data.data.length > 0) {
|
|
357
|
+
// 有读卡器数据,取第一个作为默认读卡器
|
|
358
|
+
const cardReaderName = data.data[0];
|
|
359
|
+
console.log("🎯 找到读卡器:", cardReaderName);
|
|
360
|
+
this.$message?.success?.(`发现读卡器: ${cardReaderName}`);
|
|
361
|
+
|
|
362
|
+
// 自动打开第一个读卡器
|
|
363
|
+
this.openCardReader(cardReaderName);
|
|
364
|
+
} else {
|
|
365
|
+
console.warn("⚠️ 未找到可用的读卡器");
|
|
366
|
+
this.$message?.warning?.("未找到可用的读卡器");
|
|
367
|
+
}
|
|
368
|
+
},
|
|
369
|
+
|
|
370
|
+
// 打开读卡器
|
|
371
|
+
openCardReader(devName) {
|
|
372
|
+
const message = {
|
|
373
|
+
action: 2003,
|
|
374
|
+
devName: devName,
|
|
375
|
+
};
|
|
376
|
+
this.websocket.send(message);
|
|
377
|
+
},
|
|
378
|
+
|
|
379
|
+
// 处理打开读卡器响应
|
|
380
|
+
handleOpenCardReaderResponse(data) {
|
|
381
|
+
if (data.result === 0 || data.status === 200) {
|
|
382
|
+
// 打开成功
|
|
383
|
+
this.cardReader = data.devName || "读卡器";
|
|
384
|
+
} else {
|
|
385
|
+
// 打开失败
|
|
386
|
+
this.$message?.error?.(
|
|
387
|
+
`读卡器打开失败: ${data.message || data.error || "未知错误"}`
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
},
|
|
391
|
+
|
|
392
|
+
// 获取当前读卡器状态
|
|
393
|
+
getCardReaderStatus() {
|
|
394
|
+
return {
|
|
395
|
+
isConnected: !!this.cardReader,
|
|
396
|
+
deviceName: this.cardReader,
|
|
397
|
+
};
|
|
398
|
+
},
|
|
399
|
+
|
|
400
|
+
// 重新初始化读卡器
|
|
401
|
+
reinitCardReader() {
|
|
402
|
+
this.cardReader = null;
|
|
403
|
+
if (this.websocket && this.websocket.isOpen()) {
|
|
404
|
+
// 重新初始化时先检查连接状态
|
|
405
|
+
this.checkCardReaderConnection();
|
|
406
|
+
} else {
|
|
407
|
+
this.$message?.warning?.("WebSocket未连接,无法初始化读卡器");
|
|
408
|
+
}
|
|
409
|
+
},
|
|
410
|
+
|
|
411
|
+
// ===================设备管理通用方法===================
|
|
412
|
+
|
|
413
|
+
// 获取所有设备状态
|
|
414
|
+
getAllDeviceStatus() {
|
|
415
|
+
return {
|
|
416
|
+
fingerprint: this.getFingerprintDeviceStatus(),
|
|
417
|
+
cardReader: this.getCardReaderStatus(),
|
|
418
|
+
};
|
|
419
|
+
},
|
|
420
|
+
|
|
421
|
+
// 刷新所有设备状态
|
|
422
|
+
refreshAllDevices() {
|
|
423
|
+
if (this.websocket && this.websocket.isOpen()) {
|
|
424
|
+
this.refreshAllFingerprintInfo();
|
|
425
|
+
this.checkCardReaderConnection();
|
|
426
|
+
} else {
|
|
427
|
+
this.$message?.warning?.("WebSocket未连接,无法刷新设备状态");
|
|
428
|
+
}
|
|
429
|
+
},
|
|
430
|
+
|
|
431
|
+
f_refreshTree() {
|
|
432
|
+
this.organTreeKey = this.organTreeKey + 1;
|
|
433
|
+
},
|
|
434
|
+
f_userData(val) {
|
|
435
|
+
if (val) {
|
|
436
|
+
this.$set(this.drawerInfo, "organ", val);
|
|
437
|
+
}
|
|
438
|
+
this.$refs["user-table"].f_init(this.drawerInfo.organ);
|
|
439
|
+
},
|
|
440
|
+
h_setVisible() {
|
|
441
|
+
this.visible = false;
|
|
442
|
+
},
|
|
443
|
+
h_setUserId(val, row) {
|
|
444
|
+
this.$set(this.drawerInfo, "userId", val);
|
|
445
|
+
this.$set(this.drawerInfo, "row", row);
|
|
446
|
+
this.visible = true;
|
|
447
|
+
},
|
|
448
|
+
},
|
|
449
|
+
};
|
|
450
|
+
</script>
|
|
451
|
+
|
|
452
|
+
<style lang="scss" scoped>
|
|
453
|
+
.organ-manage {
|
|
454
|
+
width: 100%;
|
|
455
|
+
height: 100%;
|
|
456
|
+
position: relative;
|
|
457
|
+
|
|
458
|
+
.organ-manage-tree {
|
|
459
|
+
width: 300px;
|
|
460
|
+
height: 100%;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
.organ-manage-main {
|
|
464
|
+
width: calc(100% - 320px);
|
|
465
|
+
height: 100%;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
</style>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import authManage from "./auth-manage/index.vue"; // 引入封装好的组件
|
|
2
|
+
import store from "../store/index";
|
|
3
|
+
import "../styles/index.scss"; // 引入样式文件
|
|
4
|
+
import eventBus from "../utils/event-bus";
|
|
5
|
+
|
|
6
|
+
const install = function (Vue, opt = {}) {
|
|
7
|
+
if (install.installed) return;
|
|
8
|
+
Vue.component(authManage.name, authManage);
|
|
9
|
+
// 挂载 eventBus 到 Vue 原型上,确保组件内部可以使用
|
|
10
|
+
Vue.prototype.$authEventBus = eventBus;
|
|
11
|
+
if (opt.baseUrl) {
|
|
12
|
+
store.commit("SET_BASE_URL", opt.baseUrl);
|
|
13
|
+
}
|
|
14
|
+
if (opt.authUrl) {
|
|
15
|
+
store.commit("SET_AUTH_URL", opt.authUrl);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export default {
|
|
20
|
+
install,
|
|
21
|
+
authManage,
|
|
22
|
+
}; // 这个方法以后再使用的时候就可以被use调用
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import Vue from "vue";
|
|
2
|
+
import Vuex from "vuex";
|
|
3
|
+
|
|
4
|
+
Vue.use(Vuex);
|
|
5
|
+
|
|
6
|
+
export default new Vuex.Store({
|
|
7
|
+
state: {
|
|
8
|
+
baseUrl: "http://dftdm.netiler.com",
|
|
9
|
+
authUrl: "http://10.1.24.63:8080",
|
|
10
|
+
websocketUrl: "ws://127.0.0.1:38280",
|
|
11
|
+
fingerprintDeviceSN: "", // 指纹设备SN码
|
|
12
|
+
},
|
|
13
|
+
getters: {
|
|
14
|
+
// 获取指纹设备SN码
|
|
15
|
+
getFingerprintDeviceSN: (state) => state.fingerprintDeviceSN,
|
|
16
|
+
},
|
|
17
|
+
mutations: {
|
|
18
|
+
SET_BASE_URL(state, data) {
|
|
19
|
+
state.baseUrl = data;
|
|
20
|
+
},
|
|
21
|
+
SET_AUTH_URL(state, data) {
|
|
22
|
+
state.authUrl = data;
|
|
23
|
+
},
|
|
24
|
+
// 设置指纹设备SN码
|
|
25
|
+
SET_FINGERPRINT_DEVICE_SN(state, sn) {
|
|
26
|
+
state.fingerprintDeviceSN = sn;
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
actions: {
|
|
30
|
+
// 更新指纹设备SN码
|
|
31
|
+
updateFingerprintDeviceSN({ commit }, sn) {
|
|
32
|
+
commit("SET_FINGERPRINT_DEVICE_SN", sn);
|
|
33
|
+
},
|
|
34
|
+
updateAuthUrl({ commit }, url) {
|
|
35
|
+
commit("SET_AUTH_URL", url);
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
modules: {},
|
|
39
|
+
});
|