leadal-auth 0.0.1

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 (91) hide show
  1. package/README.md +83 -0
  2. package/babel.config.js +5 -0
  3. package/jsconfig.json +19 -0
  4. package/ld-auth/demo.html +1 -0
  5. package/ld-auth/ld-auth.common.js +44730 -0
  6. package/ld-auth/ld-auth.css +1 -0
  7. package/ld-auth/ld-auth.umd.js +44730 -0
  8. package/ld-auth/ld-auth.umd.min.js +55 -0
  9. package/package.json +58 -0
  10. package/public/favicon.ico +0 -0
  11. package/public/index.html +17 -0
  12. package/public/models/age_gender_model-shard1 +0 -0
  13. package/public/models/age_gender_model-weights_manifest.json +1 -0
  14. package/public/models/face_expression_model-shard1 +0 -0
  15. package/public/models/face_expression_model-weights_manifest.json +1 -0
  16. package/public/models/face_landmark_68_model-shard1 +0 -0
  17. package/public/models/face_landmark_68_model-weights_manifest.json +1 -0
  18. package/public/models/face_landmark_68_tiny_model-shard1 +0 -0
  19. package/public/models/face_landmark_68_tiny_model-weights_manifest.json +1 -0
  20. package/public/models/face_recognition_model-shard1 +0 -0
  21. package/public/models/face_recognition_model-shard2 +6 -0
  22. package/public/models/face_recognition_model-weights_manifest.json +1 -0
  23. package/public/models/mtcnn_model-shard1 +0 -0
  24. package/public/models/mtcnn_model-weights_manifest.json +1 -0
  25. package/public/models/ssd_mobilenetv1_model-shard1 +0 -0
  26. package/public/models/ssd_mobilenetv1_model-shard2 +145 -0
  27. package/public/models/ssd_mobilenetv1_model-weights_manifest.json +1 -0
  28. package/public/models/tiny_face_detector_model-shard1 +0 -0
  29. package/public/models/tiny_face_detector_model-weights_manifest.json +1 -0
  30. package/src/App.vue +19 -0
  31. package/src/api/card.js +58 -0
  32. package/src/api/face.js +37 -0
  33. package/src/api/finger.js +64 -0
  34. package/src/api/index.js +100 -0
  35. package/src/assets/BIN.png +0 -0
  36. package/src/assets/CLOSE.svg +11 -0
  37. package/src/assets/blue-left.png +0 -0
  38. package/src/assets/blue-right.png +0 -0
  39. package/src/assets/finger-ready.png +0 -0
  40. package/src/assets/finger-select.png +0 -0
  41. package/src/assets/finger-status-1-last.png +0 -0
  42. package/src/assets/finger-status-1.gif +0 -0
  43. package/src/assets/finger-status-2-last.png +0 -0
  44. package/src/assets/finger-status-2.gif +0 -0
  45. package/src/assets/finger-status-3-last.png +0 -0
  46. package/src/assets/finger-status-3.gif +0 -0
  47. package/src/assets/finger-status-compeleted.png +0 -0
  48. package/src/assets/finger-status-start.png +0 -0
  49. package/src/assets/icon-camera.png +0 -0
  50. package/src/assets/icon-picture.png +0 -0
  51. package/src/assets/icon-success.png +0 -0
  52. package/src/assets/img-camera.png +0 -0
  53. package/src/assets/img-card.png +0 -0
  54. package/src/assets/img-loading.png +0 -0
  55. package/src/assets/left.png +0 -0
  56. package/src/assets/logo.png +0 -0
  57. package/src/assets/right.png +0 -0
  58. package/src/assets/ukey1.png +0 -0
  59. package/src/assets/ukey2.png +0 -0
  60. package/src/assets//346/214/207/347/272/271/350/257/206/345/210/2531.png +0 -0
  61. package/src/assets//346/214/207/347/272/271/350/257/206/345/210/2532.png +0 -0
  62. package/src/components/auth-com.vue +100 -0
  63. package/src/components/card-register/components/CardTable.vue +94 -0
  64. package/src/components/card-register/components/RegisterDialog.vue +137 -0
  65. package/src/components/card-register/index.vue +110 -0
  66. package/src/components/edit-user-dialog.vue +141 -0
  67. package/src/components/empty.vue +13 -0
  68. package/src/components/face-register/components/ChooseCameraOrPicture.vue +59 -0
  69. package/src/components/face-register/components/FaceDetected.vue +543 -0
  70. package/src/components/face-register/components/FaceInfo.vue +171 -0
  71. package/src/components/face-register/components/FacePicture.vue +85 -0
  72. package/src/components/face-register/components/UploadPicture.vue +336 -0
  73. package/src/components/face-register/index.vue +242 -0
  74. package/src/components/finger-register/index.vue +685 -0
  75. package/src/components/organ-tree.vue +211 -0
  76. package/src/components/tree-select.vue +131 -0
  77. package/src/components/user-drawer.vue +147 -0
  78. package/src/components/user-info.vue +272 -0
  79. package/src/components/user-table.vue +405 -0
  80. package/src/main.js +26 -0
  81. package/src/package/auth-manage/index.vue +461 -0
  82. package/src/package/index.js +22 -0
  83. package/src/store/index.js +39 -0
  84. package/src/styles/common.scss +183 -0
  85. package/src/styles/index.scss +38 -0
  86. package/src/utils/dict.js +47 -0
  87. package/src/utils/event-bus.js +6 -0
  88. package/src/utils/request-auth.js +64 -0
  89. package/src/utils/request.js +64 -0
  90. package/src/utils/websocket.js +282 -0
  91. package/vue.config.js +43 -0
@@ -0,0 +1,211 @@
1
+ <template>
2
+ <div class="organ-tree">
3
+ <div class="organ-tree-header f_between">
4
+ <h3>机构列表</h3>
5
+ <i
6
+ class="el-icon-circle-plus-outline"
7
+ style="font-size: 20px; cursor: pointer"
8
+ @click="h_showOrgConfig(null)"
9
+ ></i>
10
+ </div>
11
+ <div class="organ-tree-content">
12
+ <el-scrollbar style="height: 100%; padding: 14px; box-sizing: border-box">
13
+ <el-tree
14
+ ref="tree"
15
+ node-key="id"
16
+ :highlight-current="true"
17
+ :expand-on-click-node="false"
18
+ :props="props"
19
+ :load="f_loadNode"
20
+ lazy
21
+ @node-click="h_nodeClick"
22
+ >
23
+ <span class="custom-tree-node" slot-scope="{ data }">
24
+ <span class="node-text" :title="data.caption">{{
25
+ data.caption
26
+ }}</span>
27
+ <span class="action-buttons" style="width: 40px">
28
+ <i
29
+ class="el-icon-edit"
30
+ style="font-size: 16px"
31
+ @click="h_showOrgConfig(data)"
32
+ ></i>
33
+ <i
34
+ class="el-icon-delete"
35
+ @click="h_delOrg(data)"
36
+ style="margin-left: 10px; font-size: 16px"
37
+ ></i>
38
+ </span>
39
+ </span>
40
+ </el-tree>
41
+ </el-scrollbar>
42
+ </div>
43
+ <edit-user-dialog
44
+ v-if="visible"
45
+ @closed="visible = false"
46
+ :edit="edit"
47
+ @refresh="refreshTree"
48
+ />
49
+ </div>
50
+ </template>
51
+
52
+ <script>
53
+ import { apiOrganTree, apiDelOrg } from "@/api";
54
+ import EditUserDialog from "@/components/edit-user-dialog.vue";
55
+
56
+ export default {
57
+ name: "organ-tree",
58
+ components: {
59
+ EditUserDialog,
60
+ },
61
+ data() {
62
+ return {
63
+ props: {
64
+ label: "caption",
65
+ // isLeaf: (data) => {
66
+ // return data.hasChild === false
67
+ // }
68
+ },
69
+ form: {
70
+ sequence: 1,
71
+ },
72
+ rules: {
73
+ name: [
74
+ {
75
+ required: true,
76
+ message: "机构名称不能为空",
77
+ },
78
+ ],
79
+ },
80
+ edit: null,
81
+ visible: false,
82
+ };
83
+ },
84
+ methods: {
85
+ async refreshTree(type, parentId, data) {
86
+ if (type === "current") {
87
+ this.$refs.tree.updateKeyChildren(parentId, data);
88
+ } else {
89
+ this.$refs.tree.store.setData(data || []);
90
+ }
91
+ },
92
+ async f_loadNode(node, resolve) {
93
+ if (node.level === 0) {
94
+ const res = await apiOrganTree();
95
+ resolve(res.data || []);
96
+ } else {
97
+ const res = await apiOrganTree({ parentId: node.data.id });
98
+ res.data.forEach((item) => {
99
+ item.parentId = node.data.id;
100
+ item.parentName = node.data.caption;
101
+ });
102
+ resolve(res.data || []);
103
+ }
104
+ },
105
+ h_showOrgConfig(val) {
106
+ this.edit = val;
107
+ this.visible = true;
108
+ },
109
+ h_delOrg(val) {
110
+ this.$confirm("确认删除该项?", "提示", "warning")
111
+ .then(async (res) => {
112
+ if (res) {
113
+ await apiDelOrg({ ids: val.id });
114
+ this.$refs.tree.remove(val);
115
+ this.$message.success(`删除成功!`);
116
+ }
117
+ })
118
+ .catch((err) => {
119
+ console.error("用户状态 err", err);
120
+ });
121
+ },
122
+ h_nodeClick(val) {
123
+ this.$emit("load-user-data", val);
124
+ },
125
+ },
126
+ };
127
+ </script>
128
+
129
+ <style scoped lang="scss">
130
+ .organ-tree {
131
+ width: 100%;
132
+ height: 100%;
133
+ border: 1px solid #cedded;
134
+
135
+ .organ-tree-header {
136
+ width: 100%;
137
+ height: 50px;
138
+ padding: 0 10px;
139
+ background: #f9fbfd;
140
+ box-sizing: border-box;
141
+
142
+ h3 {
143
+ font-size: 16px;
144
+ color: #525252;
145
+ margin: 0;
146
+ padding: 0;
147
+ }
148
+
149
+ span {
150
+ color: #4e91ea;
151
+ cursor: pointer;
152
+ }
153
+ }
154
+
155
+ ::v-deep .custom-tree-node {
156
+ width: calc(100% - 34px);
157
+ display: flex;
158
+ align-items: center;
159
+ justify-content: space-between;
160
+
161
+ .node-text {
162
+ max-width: calc(100% - 60px);
163
+ display: inline-block;
164
+ overflow: hidden;
165
+ white-space: nowrap;
166
+ text-overflow: ellipsis;
167
+ }
168
+
169
+ .action-buttons {
170
+ opacity: 0;
171
+ visibility: hidden;
172
+ transition: opacity 0.2s ease, visibility 0.2s ease;
173
+
174
+ i {
175
+ margin-left: 4px;
176
+ cursor: pointer;
177
+ color: #606266;
178
+
179
+ &:hover {
180
+ color: #409eff;
181
+ }
182
+ }
183
+ }
184
+
185
+ &:hover .action-buttons {
186
+ opacity: 1;
187
+ visibility: visible;
188
+ }
189
+ }
190
+
191
+ ::v-deep .el-dialog__header {
192
+ padding: 10px;
193
+
194
+ .el-dialog__headerbtn {
195
+ top: 14px;
196
+ }
197
+ }
198
+
199
+ .organ-tree-content {
200
+ width: 100%;
201
+ height: calc(100% - 50px);
202
+ }
203
+ }
204
+
205
+ ::v-deep .el-tree-node__content {
206
+ display: flex;
207
+ align-items: center;
208
+ cursor: pointer;
209
+ padding: 5px 8px;
210
+ }
211
+ </style>
@@ -0,0 +1,131 @@
1
+ <template>
2
+ <div class="tree-select" @click.stop>
3
+ <!-- 输入框部分 -->
4
+ <el-input
5
+ v-model="selectedLabel"
6
+ :placeholder="placeholder"
7
+ @click.native="toggleTree"
8
+ >
9
+ </el-input>
10
+ <!-- 树形下拉区域 -->
11
+ <div v-show="showTree" class="tree-container">
12
+ <el-scrollbar style="max-height: 300px;">
13
+ <el-tree
14
+ ref="tree"
15
+ :lazy="true"
16
+ :load="load"
17
+ :props="defaultProps"
18
+ @node-click="handleNodeClick"
19
+ node-key="id"
20
+ ></el-tree>
21
+ </el-scrollbar>
22
+ </div>
23
+ </div>
24
+ </template>
25
+
26
+ <script>
27
+ export default {
28
+ name: "tree-select",
29
+ props: {
30
+ value: [String, Number, Array], // 选中的值(单选)
31
+ placeholder: { type: String, default: '请选择' },
32
+ defaultLabel: {
33
+ type: String,
34
+ default: ''
35
+ },
36
+ load: {
37
+ type: Function,
38
+ default: () => { }
39
+ },
40
+ defaultProps: {
41
+ type: Object,
42
+ default: () => ({ })
43
+ }
44
+ },
45
+ data() {
46
+ return {
47
+ showTree: false,
48
+ selectedLabel: ''
49
+ };
50
+ },
51
+ watch: {
52
+ value: {
53
+ handler(val) {
54
+ // 根据 value 回显 label
55
+ if (val) {
56
+ this.updateLabel(val)
57
+ } else {
58
+ this.selectedLabel = '根目录'
59
+ }
60
+ },
61
+ immediate: true
62
+ }
63
+ },
64
+ mounted() {
65
+ // 监听点击其他空白区域事件
66
+ document.addEventListener('click', this.handleOutsideClick);
67
+ },
68
+ beforeDestroy() {
69
+ // 移除点击其他空白区域事件监听
70
+ document.removeEventListener('click', this.handleOutsideClick);
71
+ },
72
+ methods: {
73
+ toggleTree() {
74
+ this.showTree = !this.showTree;
75
+ console.log('this.showTree', this.showTree)
76
+ },
77
+ handleNodeClick(node) {
78
+ // 手动勾选当前节点
79
+ this.$nextTick(() => {
80
+ this.$refs.tree.setChecked(node, true, false);
81
+ this.handleSingleSelect(node);
82
+ this.showTree = false
83
+ });
84
+ },
85
+ handleSingleSelect(node) {
86
+ // 取消所有其他节点的勾选状态
87
+ const allNodes = this.$refs.tree.getCheckedNodes(false, true);
88
+ allNodes.forEach(n => {
89
+ if (n.id!== node.id) {
90
+ this.$refs.tree.setChecked(n, false, false);
91
+ }
92
+ });
93
+ this.$emit('input', node.id);
94
+ this.$emit('setNode', node)
95
+ this.selectedLabel = node[this.defaultProps.label];
96
+ },
97
+ updateLabel() {
98
+ this.selectedLabel = this.defaultLabel || '根目录'
99
+ },
100
+ handleOutsideClick() {
101
+ // 点击其他空白区域隐藏树形菜单
102
+ this.showTree = false;
103
+ }
104
+ }
105
+ };
106
+ </script>
107
+
108
+ <style scoped lang="scss">
109
+ .tree-select {
110
+ position: relative;
111
+ }
112
+
113
+ .tree-container {
114
+ position: absolute;
115
+ width: 100%;
116
+ border: 1px solid #e4e7ed;
117
+ z-index: 999;
118
+ background: white;
119
+ top: 34px;
120
+ max-height: 300px;
121
+ }
122
+
123
+ .el-icon-arrow-down.is-reverse {
124
+ transform: rotate(180deg);
125
+ }
126
+
127
+ ::v-deep .el-scrollbar__wrap {
128
+ max-height: 300px;
129
+ }
130
+
131
+ </style>
@@ -0,0 +1,147 @@
1
+ <template>
2
+ <el-drawer
3
+ size="100%"
4
+ :visible="visible"
5
+ :with-header="false"
6
+ @closed="closed"
7
+ >
8
+ <div class="user-drawer">
9
+ <div class="user-drawer-header f_between">
10
+ <div class="icon-back" @click="h_back">
11
+ <i class="el-icon-arrow-left" style="font-weight: 600"></i>
12
+ <span>返回</span>
13
+ </div>
14
+ <el-button type="primary" @click="f_save" :loading="loading"
15
+ >保存</el-button
16
+ >
17
+ </div>
18
+ <div class="user-drawer-content f_center">
19
+ <div class="user-auth">
20
+ <auth-com v-if="drawerInfo.userId" ref="auth-com" :auth-collect="authCollect" :drawerInfo="drawerInfo">
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
+ </auth-com>
31
+ <empty-view v-else />
32
+ </div>
33
+ <div class="user-info">
34
+ <user-info ref="user-info" :drawer-info="drawerInfo" />
35
+ </div>
36
+ </div>
37
+ </div>
38
+ </el-drawer>
39
+ </template>
40
+
41
+ <script>
42
+ import { apiUserSave } from "@/api";
43
+
44
+ import UserInfo from "@/components/user-info.vue";
45
+ import AuthCom from "@/components/auth-com.vue";
46
+ import EmptyView from "@/components/empty.vue";
47
+
48
+ export default {
49
+ name: "user-drawer",
50
+ components: {
51
+ UserInfo,
52
+ AuthCom,
53
+ EmptyView,
54
+ },
55
+ props: {
56
+ authCollect: {
57
+ required: false,
58
+ type: Array,
59
+ default: () => ["face", "finger", "idCard"],
60
+ },
61
+ drawerInfo: {
62
+ type: Object,
63
+ },
64
+ },
65
+ data() {
66
+
67
+ return {
68
+ visible: false,
69
+ loading: false,
70
+ };
71
+ },
72
+ mounted() {
73
+ this.visible = true;
74
+ },
75
+ methods: {
76
+ closed() {
77
+ this.$emit("closed");
78
+ },
79
+ h_back() {
80
+ this.visible = false;
81
+ },
82
+ async f_save() {
83
+ try {
84
+ this.loading = true;
85
+ const data = this.$refs["user-info"].h_getFormData();
86
+ await apiUserSave({ ...data, organId: this.drawerInfo.organ.id });
87
+ this.$emit("refresh");
88
+ this.visible = false;
89
+ } finally {
90
+ this.loading = false;
91
+ }
92
+ },
93
+ },
94
+ };
95
+ </script>
96
+
97
+ <style lang="scss" scoped>
98
+ .user-drawer {
99
+ width: calc(100% - 4px);
100
+ height: calc(100% - 4px);
101
+ padding: 0 2px;
102
+
103
+ .user-drawer-header {
104
+ height: 50px;
105
+ padding: 0 0 0 12px;
106
+ border-bottom: 1px solid #ecebeb;
107
+
108
+ // span {
109
+ // cursor: pointer;
110
+ // color: #3391ff;
111
+ // }
112
+ }
113
+ .user-drawer-content {
114
+ width: 100%;
115
+ height: calc(100% - 50px);
116
+
117
+ .user-auth {
118
+ width: calc(100% - 460px);
119
+ height: 100%;
120
+ }
121
+
122
+ .user-info {
123
+ width: 460px;
124
+ height: 100%;
125
+ border-left: 1px solid #ecebeb;
126
+ }
127
+ }
128
+ }
129
+
130
+ .icon-back {
131
+ cursor: pointer;
132
+ display: flex;
133
+ color: #5a5a5a;
134
+ font-weight: 500;
135
+ font-size: 16px;
136
+ width: 53px;
137
+ height: 44px;
138
+ align-items: center;
139
+ justify-content: space-between;
140
+
141
+ span {
142
+ color: #5a5a5a;
143
+ font-weight: 500;
144
+ font-size: 16px;
145
+ }
146
+ }
147
+ </style>