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.
Files changed (77) hide show
  1. package/{leadal-auth → lib}/leadal-auth.common.js +1 -1
  2. package/{leadal-auth → lib}/leadal-auth.umd.js +1 -1
  3. package/{leadal-auth → lib}/leadal-auth.umd.min.js +1 -1
  4. package/package.json +9 -6
  5. package/src/App.vue +19 -0
  6. package/src/api/card.js +58 -0
  7. package/src/api/face.js +37 -0
  8. package/src/api/finger.js +64 -0
  9. package/src/api/index.js +100 -0
  10. package/src/assets/BIN.png +0 -0
  11. package/src/assets/CLOSE.svg +11 -0
  12. package/src/assets/blue-left.png +0 -0
  13. package/src/assets/blue-right.png +0 -0
  14. package/src/assets/finger-ready.png +0 -0
  15. package/src/assets/finger-select.png +0 -0
  16. package/src/assets/finger-status-1-last.png +0 -0
  17. package/src/assets/finger-status-1.gif +0 -0
  18. package/src/assets/finger-status-2-last.png +0 -0
  19. package/src/assets/finger-status-2.gif +0 -0
  20. package/src/assets/finger-status-3-last.png +0 -0
  21. package/src/assets/finger-status-3.gif +0 -0
  22. package/src/assets/finger-status-compeleted.png +0 -0
  23. package/src/assets/finger-status-start.png +0 -0
  24. package/src/assets/icon-camera.png +0 -0
  25. package/src/assets/icon-picture.png +0 -0
  26. package/src/assets/icon-success.png +0 -0
  27. package/src/assets/img-camera.png +0 -0
  28. package/src/assets/img-card.png +0 -0
  29. package/src/assets/img-loading.png +0 -0
  30. package/src/assets/left.png +0 -0
  31. package/src/assets/logo.png +0 -0
  32. package/src/assets/right.png +0 -0
  33. package/src/assets/ukey1.png +0 -0
  34. package/src/assets/ukey2.png +0 -0
  35. package/src/assets//346/214/207/347/272/271/350/257/206/345/210/2531.png +0 -0
  36. package/src/assets//346/214/207/347/272/271/350/257/206/345/210/2532.png +0 -0
  37. package/src/components/auth-com.vue +100 -0
  38. package/src/components/card-register/components/CardTable.vue +94 -0
  39. package/src/components/card-register/components/RegisterDialog.vue +137 -0
  40. package/src/components/card-register/index.vue +110 -0
  41. package/src/components/edit-user-dialog.vue +141 -0
  42. package/src/components/empty.vue +13 -0
  43. package/src/components/face-register/components/ChooseCameraOrPicture.vue +59 -0
  44. package/src/components/face-register/components/FaceDetected.vue +543 -0
  45. package/src/components/face-register/components/FaceInfo.vue +171 -0
  46. package/src/components/face-register/components/FacePicture.vue +85 -0
  47. package/src/components/face-register/components/UploadPicture.vue +336 -0
  48. package/src/components/face-register/index.vue +242 -0
  49. package/src/components/finger-register/index.vue +707 -0
  50. package/src/components/organ-tree.vue +211 -0
  51. package/src/components/tree-select.vue +131 -0
  52. package/src/components/user-drawer.vue +147 -0
  53. package/src/components/user-info.vue +272 -0
  54. package/src/components/user-table.vue +405 -0
  55. package/src/leadal-auth.css +1 -0
  56. package/src/main.js +25 -0
  57. package/src/package/auth-manage/index.vue +468 -0
  58. package/src/package/index.js +22 -0
  59. package/src/store/index.js +39 -0
  60. package/src/styles/common.scss +183 -0
  61. package/src/styles/index.scss +38 -0
  62. package/src/utils/dict.js +47 -0
  63. package/src/utils/event-bus.js +6 -0
  64. package/src/utils/request-auth.js +64 -0
  65. package/src/utils/request.js +64 -0
  66. package/src/utils/websocket.js +282 -0
  67. /package/{leadal-auth → lib}/demo.html +0 -0
  68. /package/{leadal-auth → lib}/img/finger-status-1-last.ad7c6895.png +0 -0
  69. /package/{leadal-auth → lib}/img/finger-status-1.220235cf.gif +0 -0
  70. /package/{leadal-auth → lib}/img/finger-status-2-last.52c6c2f8.png +0 -0
  71. /package/{leadal-auth → lib}/img/finger-status-2.482c9fce.gif +0 -0
  72. /package/{leadal-auth → lib}/img/finger-status-3-last.fc001fed.png +0 -0
  73. /package/{leadal-auth → lib}/img/finger-status-3.3e090300.gif +0 -0
  74. /package/{leadal-auth → lib}/img/finger-status-compeleted.fc001fed.png +0 -0
  75. /package/{leadal-auth → lib}/img/finger-status-start.a6cdd794.png +0 -0
  76. /package/{leadal-auth → lib}/img/img-camera.f5578f07.png +0 -0
  77. /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,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) 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
+ });