eoss-ui 0.7.85 → 0.7.87

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 (160) hide show
  1. package/lib/button-group.js +155 -143
  2. package/lib/button.js +155 -143
  3. package/lib/calogin.js +155 -143
  4. package/lib/checkbox-group.js +157 -145
  5. package/lib/config/api.js +8 -0
  6. package/lib/data-table-form.js +157 -145
  7. package/lib/data-table.js +160 -148
  8. package/lib/date-picker.js +155 -143
  9. package/lib/dialog.js +155 -143
  10. package/lib/eoss-ui.common.js +1514 -786
  11. package/lib/flow-group.js +155 -143
  12. package/lib/flow-list.js +1060 -333
  13. package/lib/flow.js +565 -548
  14. package/lib/form.js +157 -145
  15. package/lib/handle-user.js +156 -144
  16. package/lib/handler.js +156 -144
  17. package/lib/icon.js +156 -144
  18. package/lib/index.js +1 -1
  19. package/lib/input-number.js +155 -143
  20. package/lib/input.js +155 -143
  21. package/lib/login.js +170 -158
  22. package/lib/main.js +502 -490
  23. package/lib/nav.js +155 -143
  24. package/lib/notify.js +158 -146
  25. package/lib/page.js +155 -143
  26. package/lib/pagination.js +155 -143
  27. package/lib/player.js +155 -143
  28. package/lib/qr-code.js +155 -143
  29. package/lib/radio-group.js +157 -145
  30. package/lib/retrial-auth.js +159 -147
  31. package/lib/select-ganged.js +157 -145
  32. package/lib/select.js +157 -145
  33. package/lib/selector-panel.js +173 -161
  34. package/lib/selector.js +157 -145
  35. package/lib/sizer.js +157 -145
  36. package/lib/steps.js +155 -143
  37. package/lib/switch.js +155 -143
  38. package/lib/table-form.js +155 -143
  39. package/lib/tabs.js +155 -143
  40. package/lib/theme-chalk/flow-list.css +1 -1
  41. package/lib/theme-chalk/index.css +1 -1
  42. package/lib/theme-chalk/login.css +1 -1
  43. package/lib/tips.js +156 -144
  44. package/lib/tree-group.js +155 -143
  45. package/lib/tree.js +156 -144
  46. package/lib/upload.js +168 -156
  47. package/lib/wujie.js +155 -143
  48. package/lib/wxlogin.js +155 -143
  49. package/package.json +161 -161
  50. package/packages/button-group/src/main.vue +346 -346
  51. package/packages/calogin/src/main.vue +412 -412
  52. package/packages/clients/src/main.vue +151 -151
  53. package/packages/data-table/src/column.vue +992 -992
  54. package/packages/data-table/src/main.vue +1840 -1840
  55. package/packages/flow/src/component/Circulate.vue +417 -417
  56. package/packages/flow/src/component/CommonOpinions.vue +376 -376
  57. package/packages/flow/src/component/CustomPreset.vue +324 -324
  58. package/packages/flow/src/component/FileList.vue +97 -97
  59. package/packages/flow/src/component/FreeCirculation.vue +244 -244
  60. package/packages/flow/src/component/Preset.vue +257 -257
  61. package/packages/flow/src/component/SendMsg.vue +242 -242
  62. package/packages/flow/src/component/SortFlow.vue +110 -110
  63. package/packages/flow/src/component/taskUnionExamine.vue +761 -761
  64. package/packages/flow/src/form.vue +123 -123
  65. package/packages/flow/src/freeStartFlow.vue +2855 -2855
  66. package/packages/flow/src/main.vue +4139 -4135
  67. package/packages/flow/src/processForm.vue +1680 -1671
  68. package/packages/flow/src/processReject.vue +309 -309
  69. package/packages/flow/src/reset.vue +946 -946
  70. package/packages/flow/src/selectUser.vue +1 -5
  71. package/packages/flow/src/startTaskRead.vue +695 -695
  72. package/packages/flow/src/supervise.vue +159 -159
  73. package/packages/flow/src/table.vue +58 -58
  74. package/packages/flow-group/src/main.vue +727 -727
  75. package/packages/flow-list/src/main.vue +2337 -1803
  76. package/packages/form/src/main.vue +3901 -3901
  77. package/packages/form/src/table.vue +1512 -1512
  78. package/packages/handle-user/src/main.vue +137 -137
  79. package/packages/handler/src/main.vue +496 -496
  80. package/packages/icon/src/main.vue +104 -104
  81. package/packages/login/src/main.vue +2087 -2087
  82. package/packages/login/src/resetPassword.vue +557 -557
  83. package/packages/main/src/default/userinfo.vue +503 -503
  84. package/packages/main/src/public/online.vue +89 -89
  85. package/packages/main/src/public/search.vue +464 -464
  86. package/packages/main/src/public/settings.vue +273 -273
  87. package/packages/main/src/simplicity/apps.vue +388 -388
  88. package/packages/main/src/simplicity/avatar.vue +82 -82
  89. package/packages/main/src/simplicity/handler.vue +158 -158
  90. package/packages/main/src/simplicity/index.vue +2328 -2328
  91. package/packages/main/src/simplicity/menu-list.vue +135 -135
  92. package/packages/main/src/simplicity/message.vue +293 -293
  93. package/packages/main/src/simplicity/notice.vue +222 -222
  94. package/packages/main/src/simplicity/sub-menu.vue +276 -276
  95. package/packages/main/src/simplicity/user.vue +259 -259
  96. package/packages/main/src/simplicity/userinfo.vue +401 -401
  97. package/packages/main/src/simplicityTop/apps.vue +388 -388
  98. package/packages/main/src/simplicityTop/avatar.vue +82 -82
  99. package/packages/main/src/simplicityTop/handler.vue +215 -215
  100. package/packages/main/src/simplicityTop/index.vue +2618 -2618
  101. package/packages/main/src/simplicityTop/lists.vue +84 -84
  102. package/packages/main/src/simplicityTop/menu-list.vue +135 -135
  103. package/packages/main/src/simplicityTop/message.vue +293 -293
  104. package/packages/main/src/simplicityTop/notice.vue +222 -222
  105. package/packages/main/src/simplicityTop/router-page.vue +45 -45
  106. package/packages/main/src/simplicityTop/sub-menu.vue +274 -274
  107. package/packages/main/src/simplicityTop/user.vue +259 -259
  108. package/packages/main/src/simplicityTop/userinfo.vue +401 -401
  109. package/packages/menu/src/main.vue +595 -595
  110. package/packages/nav/src/main.vue +351 -351
  111. package/packages/select/src/main.vue +782 -782
  112. package/packages/selector/src/main.vue +761 -761
  113. package/packages/selector-panel/src/main.vue +1036 -1036
  114. package/packages/selector-panel/src/selection.vue +174 -174
  115. package/packages/switch/src/main.vue +170 -170
  116. package/packages/theme-chalk/lib/flow-list.css +1 -1
  117. package/packages/theme-chalk/lib/index.css +1 -1
  118. package/packages/theme-chalk/lib/login.css +1 -1
  119. package/packages/theme-chalk/src/data-table.scss +297 -297
  120. package/packages/theme-chalk/src/flow-list.scss +55 -39
  121. package/packages/theme-chalk/src/flow.scss +373 -373
  122. package/packages/theme-chalk/src/form.scss +501 -501
  123. package/packages/theme-chalk/src/handler.scss +148 -148
  124. package/packages/theme-chalk/src/icon.scss +3452 -3452
  125. package/packages/theme-chalk/src/login.scss +1006 -1006
  126. package/packages/theme-chalk/src/main.scss +664 -664
  127. package/packages/theme-chalk/src/menu.scss +224 -224
  128. package/packages/theme-chalk/src/selector.scss +114 -114
  129. package/packages/theme-chalk/src/simplicity-top.scss +1845 -1845
  130. package/packages/theme-chalk/src/simplicity.scss +1403 -1403
  131. package/packages/theme-chalk/src/tree.scss +165 -165
  132. package/packages/theme-chalk/src/upload.scss +172 -172
  133. package/packages/tips/src/main.vue +141 -141
  134. package/packages/toolbar/src/main.vue +430 -430
  135. package/packages/upload/src/main.vue +1344 -1344
  136. package/packages/wujie/src/main.vue +146 -146
  137. package/src/config/api.js +348 -340
  138. package/src/index.js +163 -163
  139. package/src/utils/rules.js +18 -18
  140. package/packages/.DS_Store +0 -0
  141. package/packages/calogin/.DS_Store +0 -0
  142. package/packages/date-picker/.DS_Store +0 -0
  143. package/packages/date-picker/src/.DS_Store +0 -0
  144. package/packages/dialog/.DS_Store +0 -0
  145. package/packages/flow/.DS_Store +0 -0
  146. package/packages/flow/src/.DS_Store +0 -0
  147. package/packages/flow-list/.DS_Store +0 -0
  148. package/packages/form/.DS_Store +0 -0
  149. package/packages/icon/.DS_Store +0 -0
  150. package/packages/login/.DS_Store +0 -0
  151. package/packages/main/.DS_Store +0 -0
  152. package/packages/main/src/.DS_Store +0 -0
  153. package/packages/menu/.DS_Store +0 -0
  154. package/packages/select/.DS_Store +0 -0
  155. package/packages/selector/.DS_Store +0 -0
  156. package/packages/selector-panel/.DS_Store +0 -0
  157. package/packages/theme-chalk/src/.DS_Store +0 -0
  158. package/packages/upload/.DS_Store +0 -0
  159. package/src/.DS_Store +0 -0
  160. package/src/utils/.DS_Store +0 -0
@@ -1,412 +1,412 @@
1
- <template>
2
- <span>
3
- <span @click="getCertificate">
4
- <slot></slot>
5
- </span>
6
- </span>
7
- </template>
8
-
9
- <script>
10
- import util from 'eoss-ui/src/utils/util';
11
- import caPlugin from './plugin.js';
12
-
13
- export default {
14
- name: 'EsCaLogin',
15
- props: {
16
- installPath: String,
17
- caModel: {
18
- type: String,
19
- required: true
20
- }, // CA登录方式,JIDA-吉大正元,SHU_GUANG-曙光,SICHUAN-四川
21
- identifyingId: {
22
- type: String,
23
- default() {
24
- return util.uuid(12);
25
- }
26
- },
27
- dllnames: {
28
- type: Array,
29
- default: () => [
30
- 'L3Vzci9saWI2NC9saWJTS0ZBUEkuc28=',
31
- 'bGliU0tGQVBJLWFybTY0LnNv',
32
- 'L3Vzci9saWIvYWFyY2g2NC1saW51eC1nbnUvbGliU0tGQVBJLWFybTY0LnNv',
33
- 'L3Vzci9saWIvbGliU0tGQVBJLnNv',
34
- 'U0tGQVBJMzAwOTIuZGxs',
35
- 'bGliU0tGQVBJLnNv',
36
- 'L29wdC9oYWl0YWkvbGliL2xpYlNLRkFQSS5zbw==',
37
- 'U0tGQVBJNDAwOTcuZGxs'
38
- ]
39
- },
40
- dllname: {
41
- type: Array,
42
- default: () => []
43
- },
44
- success: Function,
45
- // 是否显示证书选择框,默认为true
46
- showSelect: Boolean
47
- },
48
- data() {
49
- return {
50
- userList: [],
51
- signedData: '', //证书原文
52
- b64originData: '', //签名原文
53
- b64SignData: '', //签名结果
54
- idCard: '',
55
- certId: ''
56
- };
57
- },
58
- computed: {
59
- param() {
60
- // 生成不重复的 DLL 名称列表
61
- const dllnames = Array.from(new Set(this.dllnames.concat(this.dllname)));
62
-
63
- return `<?xml version="1.0" encoding="utf-8"?>
64
- <authinfo>
65
- <liblist>
66
- ${dllnames
67
- .map(
68
- (dllname) =>
69
- `<lib type="SKF" version="1.0" dllname="${dllname}"><algid val="SHA1" sm2_hashalg="SM3" /></lib>`
70
- )
71
- .join('')}
72
- </liblist>
73
- </authinfo>`;
74
- }
75
- },
76
- created() {
77
- this.init();
78
- },
79
- mounted() {},
80
- methods: {
81
- init() {
82
- if (!window.PNXClient) {
83
- // 创建 object 元素
84
- const pnxClientElement = document.createElement('object');
85
- pnxClientElement.classid = 'clsid:9DD991F7-6FB0-4004-95A4-0A55006A8C42';
86
- pnxClientElement.width = '0';
87
- pnxClientElement.height = '0';
88
- pnxClientElement.id = 'PNXClient';
89
- pnxClientElement.style.position = 'absolute';
90
- document.body.appendChild(pnxClientElement);
91
- }
92
- },
93
- getCertificate() {
94
- this.$emit('click');
95
- // 检查 PNXClient 是否存在
96
- if (!window.PNXClient) {
97
- this.$message.error('控件加载失败,请刷新页面重试!');
98
- this.$emit('error', { code: 0, msg: '控件加载失败,请刷新页面重试!' });
99
- return;
100
- }
101
- switch (this.caModel) {
102
- //吉大正元:
103
- case 'JIDA':
104
- try {
105
- caPlugin.getVersion();
106
- } catch (e) {
107
- if (this.installPath) {
108
- this.$confirm('未安装控件,请进行安装控件!', '控件下载', {
109
- confirmButtonText: '下载',
110
- cancelButtonText: '取消',
111
- type: 'warning'
112
- })
113
- .then(() => {
114
- util.downloadFile(this.installPath);
115
- })
116
- .catch(() => {});
117
- } else {
118
- this.$message.error('未安装控件,请进行安装控件!');
119
- }
120
- this.$emit('error', {
121
- type: 1,
122
- msg: '未安装控件,请进行安装控件!'
123
- });
124
- return;
125
- }
126
- try {
127
- // 清除之前的过滤器
128
- caPlugin.clearFilter();
129
- // 初始化vctk控件
130
- caPlugin.initialize('', this.param);
131
- // 控制证书为一个时,并且不显示选择框时,不弹出证书选择框
132
- !this.showSelect && caPlugin.setChooseSingleCert(1);
133
-
134
- // 生成签名信息
135
- this.signedData = caPlugin.p7SignString(
136
- this.identifyingId,
137
- true,
138
- true
139
- );
140
-
141
- //获取错误码
142
- const errorCode = Number(caPlugin.getLastError());
143
- if (errorCode !== 0) {
144
- if (errorCode === 3758096386 || errorCode === 2148532334) {
145
- this.$message.error('用户取消操作!');
146
- this.$emit('error', { code: 52, msg: '用户取消操作!' });
147
- return;
148
- } else if (errorCode === -536870815 || errorCode === 3758096481) {
149
- this.$message.error(
150
- '没有找到有效的证书,如果使用的是KEY,请确认已经插入key!'
151
- );
152
- this.$emit('error', {
153
- type: 2,
154
- msg: '没有找到有效的证书,如果使用的是KEY,请确认已经插入key!'
155
- });
156
- return;
157
- } else {
158
- const msg = caPlugin.getLastErrorMessage();
159
- this.$message.error(msg);
160
- this.$emit('error', { code: 3, msg });
161
- return;
162
- }
163
- }
164
- this.success && this.success(this.signedData);
165
- return this.signedData;
166
- } catch (error) {
167
- // 捕获其他可能的异常
168
- this.$message.error(`操作失败: ${error.message}`);
169
- this.$emit('error', { code: 4, msg: error.message });
170
- }
171
- break;
172
- //曙光:
173
- case 'SHU_GUANG':
174
- caPlugin
175
- .getMessage({ action: 'SOF_GetUserList' })
176
- .then((res) => {
177
- const { retCode, retMsg, retValue } = res;
178
- if (!retValue || retCode !== 0) {
179
- this.$message.error(
180
- retCode !== 0 ? retMsg : '未找到证书,请插入证书UKEY!'
181
- );
182
- this.$emit('error', {
183
- type: 2,
184
- msg: retCode !== 0 ? retMsg : '未找到证书,请插入证书UKEY!'
185
- });
186
- return;
187
- }
188
- const userList = retValue.split('&&&');
189
- if (userList.length === 1 && !this.showSelect) {
190
- //如果只有一个证书,并且不显示选择框时,直接获取证书信息
191
- this.certId = userList[0].split('||')[1];
192
- this.getCertInfo(this.certId);
193
- } else {
194
- // 如果有多个证书,弹出选择框
195
- this.userList = userList.map((item) => {
196
- const [name, certId] = item.split('||');
197
- return { label: name, value: certId };
198
- });
199
- this.$prompt('', '证书选择', {
200
- confirmButtonText: '确定',
201
- cancelButtonText: '取消',
202
- inputPattern: /^.+$/,
203
- inputErrorMessage: '请选择证书!',
204
- selectData: this.userList
205
- })
206
- .then((res) => {
207
- this.certId = res.value;
208
- this.getCertInfo(this.certId);
209
- })
210
- .catch(() => {
211
- this.$emit('error', { code: 52, msg: '用户取消操作!' });
212
- });
213
- }
214
- })
215
- .catch((err) => {
216
- if (this.installPath) {
217
- this.$confirm(
218
- '请检查是否安装并启用证书助手控件!',
219
- '控件下载',
220
- {
221
- confirmButtonText: '下载',
222
- cancelButtonText: '取消',
223
- type: 'warning'
224
- }
225
- )
226
- .then(() => {
227
- util.downloadFile(this.installPath);
228
- })
229
- .catch(() => {});
230
- } else {
231
- this.$message.error('请检查是否安装并启用证书助手控件!');
232
- }
233
- this.$emit('error', {
234
- type: 1,
235
- msg: '请检查是否安装并启用证书助手控件!'
236
- });
237
- });
238
- break;
239
- //四川:
240
- case 'SICHUAN':
241
- this.$message.warning('四川CA登录方式对接中!');
242
- this.$emit('error');
243
- break;
244
- }
245
- },
246
- getCertInfo(name) {
247
- caPlugin
248
- .getMessage({ action: 'SOF_ExportUserCert', params: [name] })
249
- .then((res) => {
250
- const { retCode, retMsg, retValue } = res;
251
- if (retCode !== 0) {
252
- this.$message.error(retMsg);
253
- this.$emit('error', { code: retCode, msg: retMsg });
254
- return;
255
- }
256
- //设置证书原文
257
- this.signedData = retValue
258
- .replace('-----BEGIN CERTIFICATE-----', '')
259
- .replace('-----END CERTIFICATE-----', '');
260
- caPlugin
261
- .getMessage({
262
- action: 'SOF_GetCertInfo',
263
- params: [retValue, 'SGD_CERT_SUBJECT_SN']
264
- })
265
- .then((res) => {
266
- const { retCode, retMsg, retValue } = res;
267
- if (retCode !== 0) {
268
- this.$message.error(retMsg);
269
- this.$emit('error', { code: retCode, msg: retMsg });
270
- return;
271
- }
272
- this.idCard = caPlugin.base64Decode(retValue);
273
- caPlugin
274
- .getMessage({
275
- action: 'SOF_GenRandom',
276
- params: [16]
277
- })
278
- .then((res) => {
279
- const { retCode, retMsg, retValue } = res;
280
- if (retCode !== 0) {
281
- this.$message.error(retMsg);
282
- this.$emit('error', { code: retCode, msg: retMsg });
283
- return;
284
- }
285
- this.b64originData = retValue + this.identifyingId;
286
- caPlugin
287
- .getMessage({
288
- action: 'SOF_SignData',
289
- params: [
290
- this.certId,
291
- caPlugin.base64Encode(this.b64originData)
292
- ]
293
- })
294
- .then((res) => {
295
- const { retCode, retMsg, retValue } = res;
296
- if (retCode !== 0) {
297
- if (retCode === 184550659) {
298
- this.cerLogin();
299
- } else {
300
- this.$message.error(retMsg);
301
- this.$emit('error', { code: retCode, msg: retMsg });
302
- }
303
- return;
304
- }
305
- this.b64SignData = retValue;
306
- this.success &&
307
- this.success({
308
- identifyingId: this.identifyingId,
309
- signedData: this.signedData, //证书原文
310
- b64originData: this.b64originData, //签名原文
311
- b64SignData: this.b64SignData, //签名结果
312
- idCard: this.idCard,
313
- certId: this.certId
314
- });
315
- })
316
- .catch((err) => {
317
- this.$emit('error', { code: 5, msg: err });
318
- });
319
- })
320
- .catch((err) => {
321
- this.$emit('error', { code: 6, msg: err });
322
- });
323
- })
324
- .catch((err) => {
325
- this.$emit('error', { code: 7, msg: err });
326
- });
327
- })
328
- .catch((err) => {
329
- this.$emit('error', { code: 8, msg: err });
330
- });
331
- },
332
- cerLogin(title = '提示') {
333
- this.$prompt('输入密码', title, {
334
- confirmButtonText: '确定',
335
- cancelButtonText: '取消',
336
- inputPattern: /^[[\x21-\x7E]{6,16}$/,
337
- inputErrorMessage: '请输入密码'
338
- })
339
- .then(({ value }) => {
340
- caPlugin
341
- .getMessage({
342
- action: 'SOF_Login',
343
- params: [this.certId, value]
344
- })
345
- .then((res) => {
346
- const { retCode, retMsg, retValue } = res;
347
- if (retCode !== 0 || retValue === false) {
348
- if (retValue === false) {
349
- caPlugin
350
- .getMessage({
351
- action: 'SOF_GetPinRetryCount',
352
- params: [this.certId]
353
- })
354
- .then((res) => {
355
- const { retValue } = res;
356
- this.cerLogin(
357
- `登录失败!剩余口令重试次数:${retValue}次`
358
- );
359
- });
360
- return;
361
- }
362
- this.$message.error(retMsg);
363
- this.$emit('error', { code: retCode, msg: retMsg });
364
- return;
365
- }
366
- caPlugin
367
- .getMessage({
368
- action: 'SOF_SignData',
369
- params: [
370
- this.certId,
371
- caPlugin.base64Encode(this.b64originData)
372
- ]
373
- })
374
- .then((res) => {
375
- const { retCode, retMsg, retValue } = res;
376
- if (retCode !== 0) {
377
- if (retCode === 184550659) {
378
- this.cerLogin();
379
- } else {
380
- this.$message.error(retMsg);
381
- this.$emit('error', { code: retCode, msg: retMsg });
382
- }
383
- return;
384
- }
385
- this.b64SignData = retValue;
386
- this.success &&
387
- this.success({
388
- identifyingId: this.identifyingId,
389
- signedData: this.signedData, //证书原文
390
- b64originData: this.b64originData, //签名原文
391
- b64SignData: this.b64SignData, //签名结果
392
- idCard: this.idCard,
393
- certId: this.certId
394
- });
395
- })
396
- .catch((err) => {
397
- this.$emit('error', { code: 9, msg: err });
398
- });
399
- })
400
- .catch(() => {
401
- this.$emit('error', { code: 10, msg: err });
402
- });
403
- })
404
- .catch(() => {
405
- this.$emit('error', { code: 11, msg: err });
406
- });
407
- }
408
- }
409
- };
410
- </script>
411
-
412
- <style scoped></style>
1
+ <template>
2
+ <span>
3
+ <span @click="getCertificate">
4
+ <slot></slot>
5
+ </span>
6
+ </span>
7
+ </template>
8
+
9
+ <script>
10
+ import util from 'eoss-ui/src/utils/util';
11
+ import caPlugin from './plugin.js';
12
+
13
+ export default {
14
+ name: 'EsCaLogin',
15
+ props: {
16
+ installPath: String,
17
+ caModel: {
18
+ type: String,
19
+ required: true
20
+ }, // CA登录方式,JIDA-吉大正元,SHU_GUANG-曙光,SICHUAN-四川
21
+ identifyingId: {
22
+ type: String,
23
+ default() {
24
+ return util.uuid(12);
25
+ }
26
+ },
27
+ dllnames: {
28
+ type: Array,
29
+ default: () => [
30
+ 'L3Vzci9saWI2NC9saWJTS0ZBUEkuc28=',
31
+ 'bGliU0tGQVBJLWFybTY0LnNv',
32
+ 'L3Vzci9saWIvYWFyY2g2NC1saW51eC1nbnUvbGliU0tGQVBJLWFybTY0LnNv',
33
+ 'L3Vzci9saWIvbGliU0tGQVBJLnNv',
34
+ 'U0tGQVBJMzAwOTIuZGxs',
35
+ 'bGliU0tGQVBJLnNv',
36
+ 'L29wdC9oYWl0YWkvbGliL2xpYlNLRkFQSS5zbw==',
37
+ 'U0tGQVBJNDAwOTcuZGxs'
38
+ ]
39
+ },
40
+ dllname: {
41
+ type: Array,
42
+ default: () => []
43
+ },
44
+ success: Function,
45
+ // 是否显示证书选择框,默认为true
46
+ showSelect: Boolean
47
+ },
48
+ data() {
49
+ return {
50
+ userList: [],
51
+ signedData: '', //证书原文
52
+ b64originData: '', //签名原文
53
+ b64SignData: '', //签名结果
54
+ idCard: '',
55
+ certId: ''
56
+ };
57
+ },
58
+ computed: {
59
+ param() {
60
+ // 生成不重复的 DLL 名称列表
61
+ const dllnames = Array.from(new Set(this.dllnames.concat(this.dllname)));
62
+
63
+ return `<?xml version="1.0" encoding="utf-8"?>
64
+ <authinfo>
65
+ <liblist>
66
+ ${dllnames
67
+ .map(
68
+ (dllname) =>
69
+ `<lib type="SKF" version="1.0" dllname="${dllname}"><algid val="SHA1" sm2_hashalg="SM3" /></lib>`
70
+ )
71
+ .join('')}
72
+ </liblist>
73
+ </authinfo>`;
74
+ }
75
+ },
76
+ created() {
77
+ this.init();
78
+ },
79
+ mounted() {},
80
+ methods: {
81
+ init() {
82
+ if (!window.PNXClient) {
83
+ // 创建 object 元素
84
+ const pnxClientElement = document.createElement('object');
85
+ pnxClientElement.classid = 'clsid:9DD991F7-6FB0-4004-95A4-0A55006A8C42';
86
+ pnxClientElement.width = '0';
87
+ pnxClientElement.height = '0';
88
+ pnxClientElement.id = 'PNXClient';
89
+ pnxClientElement.style.position = 'absolute';
90
+ document.body.appendChild(pnxClientElement);
91
+ }
92
+ },
93
+ getCertificate() {
94
+ this.$emit('click');
95
+ // 检查 PNXClient 是否存在
96
+ if (!window.PNXClient) {
97
+ this.$message.error('控件加载失败,请刷新页面重试!');
98
+ this.$emit('error', { code: 0, msg: '控件加载失败,请刷新页面重试!' });
99
+ return;
100
+ }
101
+ switch (this.caModel) {
102
+ //吉大正元:
103
+ case 'JIDA':
104
+ try {
105
+ caPlugin.getVersion();
106
+ } catch (e) {
107
+ if (this.installPath) {
108
+ this.$confirm('未安装控件,请进行安装控件!', '控件下载', {
109
+ confirmButtonText: '下载',
110
+ cancelButtonText: '取消',
111
+ type: 'warning'
112
+ })
113
+ .then(() => {
114
+ util.downloadFile(this.installPath);
115
+ })
116
+ .catch(() => {});
117
+ } else {
118
+ this.$message.error('未安装控件,请进行安装控件!');
119
+ }
120
+ this.$emit('error', {
121
+ type: 1,
122
+ msg: '未安装控件,请进行安装控件!'
123
+ });
124
+ return;
125
+ }
126
+ try {
127
+ // 清除之前的过滤器
128
+ caPlugin.clearFilter();
129
+ // 初始化vctk控件
130
+ caPlugin.initialize('', this.param);
131
+ // 控制证书为一个时,并且不显示选择框时,不弹出证书选择框
132
+ !this.showSelect && caPlugin.setChooseSingleCert(1);
133
+
134
+ // 生成签名信息
135
+ this.signedData = caPlugin.p7SignString(
136
+ this.identifyingId,
137
+ true,
138
+ true
139
+ );
140
+
141
+ //获取错误码
142
+ const errorCode = Number(caPlugin.getLastError());
143
+ if (errorCode !== 0) {
144
+ if (errorCode === 3758096386 || errorCode === 2148532334) {
145
+ this.$message.error('用户取消操作!');
146
+ this.$emit('error', { code: 52, msg: '用户取消操作!' });
147
+ return;
148
+ } else if (errorCode === -536870815 || errorCode === 3758096481) {
149
+ this.$message.error(
150
+ '没有找到有效的证书,如果使用的是KEY,请确认已经插入key!'
151
+ );
152
+ this.$emit('error', {
153
+ type: 2,
154
+ msg: '没有找到有效的证书,如果使用的是KEY,请确认已经插入key!'
155
+ });
156
+ return;
157
+ } else {
158
+ const msg = caPlugin.getLastErrorMessage();
159
+ this.$message.error(msg);
160
+ this.$emit('error', { code: 3, msg });
161
+ return;
162
+ }
163
+ }
164
+ this.success && this.success(this.signedData);
165
+ return this.signedData;
166
+ } catch (error) {
167
+ // 捕获其他可能的异常
168
+ this.$message.error(`操作失败: ${error.message}`);
169
+ this.$emit('error', { code: 4, msg: error.message });
170
+ }
171
+ break;
172
+ //曙光:
173
+ case 'SHU_GUANG':
174
+ caPlugin
175
+ .getMessage({ action: 'SOF_GetUserList' })
176
+ .then((res) => {
177
+ const { retCode, retMsg, retValue } = res;
178
+ if (!retValue || retCode !== 0) {
179
+ this.$message.error(
180
+ retCode !== 0 ? retMsg : '未找到证书,请插入证书UKEY!'
181
+ );
182
+ this.$emit('error', {
183
+ type: 2,
184
+ msg: retCode !== 0 ? retMsg : '未找到证书,请插入证书UKEY!'
185
+ });
186
+ return;
187
+ }
188
+ const userList = retValue.split('&&&');
189
+ if (userList.length === 1 && !this.showSelect) {
190
+ //如果只有一个证书,并且不显示选择框时,直接获取证书信息
191
+ this.certId = userList[0].split('||')[1];
192
+ this.getCertInfo(this.certId);
193
+ } else {
194
+ // 如果有多个证书,弹出选择框
195
+ this.userList = userList.map((item) => {
196
+ const [name, certId] = item.split('||');
197
+ return { label: name, value: certId };
198
+ });
199
+ this.$prompt('', '证书选择', {
200
+ confirmButtonText: '确定',
201
+ cancelButtonText: '取消',
202
+ inputPattern: /^.+$/,
203
+ inputErrorMessage: '请选择证书!',
204
+ selectData: this.userList
205
+ })
206
+ .then((res) => {
207
+ this.certId = res.value;
208
+ this.getCertInfo(this.certId);
209
+ })
210
+ .catch(() => {
211
+ this.$emit('error', { code: 52, msg: '用户取消操作!' });
212
+ });
213
+ }
214
+ })
215
+ .catch((err) => {
216
+ if (this.installPath) {
217
+ this.$confirm(
218
+ '请检查是否安装并启用证书助手控件!',
219
+ '控件下载',
220
+ {
221
+ confirmButtonText: '下载',
222
+ cancelButtonText: '取消',
223
+ type: 'warning'
224
+ }
225
+ )
226
+ .then(() => {
227
+ util.downloadFile(this.installPath);
228
+ })
229
+ .catch(() => {});
230
+ } else {
231
+ this.$message.error('请检查是否安装并启用证书助手控件!');
232
+ }
233
+ this.$emit('error', {
234
+ type: 1,
235
+ msg: '请检查是否安装并启用证书助手控件!'
236
+ });
237
+ });
238
+ break;
239
+ //四川:
240
+ case 'SICHUAN':
241
+ this.$message.warning('四川CA登录方式对接中!');
242
+ this.$emit('error');
243
+ break;
244
+ }
245
+ },
246
+ getCertInfo(name) {
247
+ caPlugin
248
+ .getMessage({ action: 'SOF_ExportUserCert', params: [name] })
249
+ .then((res) => {
250
+ const { retCode, retMsg, retValue } = res;
251
+ if (retCode !== 0) {
252
+ this.$message.error(retMsg);
253
+ this.$emit('error', { code: retCode, msg: retMsg });
254
+ return;
255
+ }
256
+ //设置证书原文
257
+ this.signedData = retValue
258
+ .replace('-----BEGIN CERTIFICATE-----', '')
259
+ .replace('-----END CERTIFICATE-----', '');
260
+ caPlugin
261
+ .getMessage({
262
+ action: 'SOF_GetCertInfo',
263
+ params: [retValue, 'SGD_CERT_SUBJECT_SN']
264
+ })
265
+ .then((res) => {
266
+ const { retCode, retMsg, retValue } = res;
267
+ if (retCode !== 0) {
268
+ this.$message.error(retMsg);
269
+ this.$emit('error', { code: retCode, msg: retMsg });
270
+ return;
271
+ }
272
+ this.idCard = caPlugin.base64Decode(retValue);
273
+ caPlugin
274
+ .getMessage({
275
+ action: 'SOF_GenRandom',
276
+ params: [16]
277
+ })
278
+ .then((res) => {
279
+ const { retCode, retMsg, retValue } = res;
280
+ if (retCode !== 0) {
281
+ this.$message.error(retMsg);
282
+ this.$emit('error', { code: retCode, msg: retMsg });
283
+ return;
284
+ }
285
+ this.b64originData = retValue + this.identifyingId;
286
+ caPlugin
287
+ .getMessage({
288
+ action: 'SOF_SignData',
289
+ params: [
290
+ this.certId,
291
+ caPlugin.base64Encode(this.b64originData)
292
+ ]
293
+ })
294
+ .then((res) => {
295
+ const { retCode, retMsg, retValue } = res;
296
+ if (retCode !== 0) {
297
+ if (retCode === 184550659) {
298
+ this.cerLogin();
299
+ } else {
300
+ this.$message.error(retMsg);
301
+ this.$emit('error', { code: retCode, msg: retMsg });
302
+ }
303
+ return;
304
+ }
305
+ this.b64SignData = retValue;
306
+ this.success &&
307
+ this.success({
308
+ identifyingId: this.identifyingId,
309
+ signedData: this.signedData, //证书原文
310
+ b64originData: this.b64originData, //签名原文
311
+ b64SignData: this.b64SignData, //签名结果
312
+ idCard: this.idCard,
313
+ certId: this.certId
314
+ });
315
+ })
316
+ .catch((err) => {
317
+ this.$emit('error', { code: 5, msg: err });
318
+ });
319
+ })
320
+ .catch((err) => {
321
+ this.$emit('error', { code: 6, msg: err });
322
+ });
323
+ })
324
+ .catch((err) => {
325
+ this.$emit('error', { code: 7, msg: err });
326
+ });
327
+ })
328
+ .catch((err) => {
329
+ this.$emit('error', { code: 8, msg: err });
330
+ });
331
+ },
332
+ cerLogin(title = '提示') {
333
+ this.$prompt('输入密码', title, {
334
+ confirmButtonText: '确定',
335
+ cancelButtonText: '取消',
336
+ inputPattern: /^[[\x21-\x7E]{6,16}$/,
337
+ inputErrorMessage: '请输入密码'
338
+ })
339
+ .then(({ value }) => {
340
+ caPlugin
341
+ .getMessage({
342
+ action: 'SOF_Login',
343
+ params: [this.certId, value]
344
+ })
345
+ .then((res) => {
346
+ const { retCode, retMsg, retValue } = res;
347
+ if (retCode !== 0 || retValue === false) {
348
+ if (retValue === false) {
349
+ caPlugin
350
+ .getMessage({
351
+ action: 'SOF_GetPinRetryCount',
352
+ params: [this.certId]
353
+ })
354
+ .then((res) => {
355
+ const { retValue } = res;
356
+ this.cerLogin(
357
+ `登录失败!剩余口令重试次数:${retValue}次`
358
+ );
359
+ });
360
+ return;
361
+ }
362
+ this.$message.error(retMsg);
363
+ this.$emit('error', { code: retCode, msg: retMsg });
364
+ return;
365
+ }
366
+ caPlugin
367
+ .getMessage({
368
+ action: 'SOF_SignData',
369
+ params: [
370
+ this.certId,
371
+ caPlugin.base64Encode(this.b64originData)
372
+ ]
373
+ })
374
+ .then((res) => {
375
+ const { retCode, retMsg, retValue } = res;
376
+ if (retCode !== 0) {
377
+ if (retCode === 184550659) {
378
+ this.cerLogin();
379
+ } else {
380
+ this.$message.error(retMsg);
381
+ this.$emit('error', { code: retCode, msg: retMsg });
382
+ }
383
+ return;
384
+ }
385
+ this.b64SignData = retValue;
386
+ this.success &&
387
+ this.success({
388
+ identifyingId: this.identifyingId,
389
+ signedData: this.signedData, //证书原文
390
+ b64originData: this.b64originData, //签名原文
391
+ b64SignData: this.b64SignData, //签名结果
392
+ idCard: this.idCard,
393
+ certId: this.certId
394
+ });
395
+ })
396
+ .catch((err) => {
397
+ this.$emit('error', { code: 9, msg: err });
398
+ });
399
+ })
400
+ .catch(() => {
401
+ this.$emit('error', { code: 10, msg: err });
402
+ });
403
+ })
404
+ .catch(() => {
405
+ this.$emit('error', { code: 11, msg: err });
406
+ });
407
+ }
408
+ }
409
+ };
410
+ </script>
411
+
412
+ <style scoped></style>