eoss-ui 0.7.83 → 0.7.85

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 (196) hide show
  1. package/lib/button-group.js +144 -120
  2. package/lib/button.js +143 -120
  3. package/lib/calendar.js +2 -2
  4. package/lib/calogin.js +144 -120
  5. package/lib/card.js +2 -2
  6. package/lib/cascader.js +2 -2
  7. package/lib/checkbox-group.js +144 -120
  8. package/lib/clients.js +2 -2
  9. package/lib/config/api.js +7 -1
  10. package/lib/data-table-form.js +144 -120
  11. package/lib/data-table.js +144 -120
  12. package/lib/date-picker.js +143 -120
  13. package/lib/dialog.js +219 -214
  14. package/lib/enable-drag.js +2 -2
  15. package/lib/enterprise.js +2 -2
  16. package/lib/eoss-ui.common.js +2118 -1493
  17. package/lib/error-page.js +2 -2
  18. package/lib/flow-group.js +147 -124
  19. package/lib/flow-list.js +243 -218
  20. package/lib/flow.js +1561 -937
  21. package/lib/form.js +243 -239
  22. package/lib/handle-user.js +144 -121
  23. package/lib/handler.js +148 -125
  24. package/lib/icon.js +144 -121
  25. package/lib/icons.js +5 -5
  26. package/lib/index.js +1 -1
  27. package/lib/input-number.js +143 -120
  28. package/lib/input.js +143 -120
  29. package/lib/label.js +2 -2
  30. package/lib/layout.js +2 -2
  31. package/lib/login.js +154 -130
  32. package/lib/main.js +505 -481
  33. package/lib/menu.js +2 -2
  34. package/lib/nav.js +150 -127
  35. package/lib/notify.js +86 -77
  36. package/lib/page.js +143 -120
  37. package/lib/pagination.js +143 -120
  38. package/lib/player.js +147 -124
  39. package/lib/qr-code.js +145 -122
  40. package/lib/radio-group.js +143 -120
  41. package/lib/retrial-auth.js +144 -121
  42. package/lib/select-ganged.js +143 -120
  43. package/lib/select.js +143 -120
  44. package/lib/selector-panel.js +147 -123
  45. package/lib/selector.js +145 -122
  46. package/lib/sizer.js +143 -120
  47. package/lib/steps.js +150 -127
  48. package/lib/switch.js +143 -120
  49. package/lib/table-form.js +143 -120
  50. package/lib/tabs-panel.js +2 -2
  51. package/lib/tabs.js +143 -120
  52. package/lib/theme-chalk/base.css +1 -1
  53. package/lib/theme-chalk/flow.css +1 -1
  54. package/lib/theme-chalk/fonts/iconfont.ttf +0 -0
  55. package/lib/theme-chalk/fonts/iconfont.woff +0 -0
  56. package/lib/theme-chalk/icon.css +1 -1
  57. package/lib/theme-chalk/index.css +1 -1
  58. package/lib/theme-chalk/login.css +1 -1
  59. package/lib/theme-chalk/main.css +1 -1
  60. package/lib/theme-chalk/menu.css +1 -1
  61. package/lib/theme-chalk/simplicity-top.css +1 -1
  62. package/lib/theme-chalk/simplicity.css +1 -1
  63. package/lib/theme-chalk/sizer.css +1 -1
  64. package/lib/theme-chalk/upload.css +1 -1
  65. package/lib/tips.js +143 -120
  66. package/lib/toolbar.js +2 -2
  67. package/lib/tree-group.js +143 -120
  68. package/lib/tree.js +143 -120
  69. package/lib/upload.js +154 -130
  70. package/lib/utils/util.js +60 -46
  71. package/lib/wujie.js +156 -122
  72. package/lib/wxlogin.js +143 -120
  73. package/package.json +161 -160
  74. package/packages/.DS_Store +0 -0
  75. package/packages/button-group/src/main.vue +346 -346
  76. package/packages/calogin/.DS_Store +0 -0
  77. package/packages/calogin/src/main.vue +412 -412
  78. package/packages/clients/src/main.vue +151 -151
  79. package/packages/data-table/src/column.vue +992 -992
  80. package/packages/data-table/src/main.vue +1840 -1840
  81. package/packages/date-picker/.DS_Store +0 -0
  82. package/packages/date-picker/src/.DS_Store +0 -0
  83. package/packages/dialog/.DS_Store +0 -0
  84. package/packages/flow/.DS_Store +0 -0
  85. package/packages/flow/src/.DS_Store +0 -0
  86. package/packages/flow/src/component/Circulate.vue +417 -417
  87. package/packages/flow/src/component/CommonOpinions.vue +376 -376
  88. package/packages/flow/src/component/CustomPreset.vue +324 -324
  89. package/packages/flow/src/component/FileList.vue +97 -97
  90. package/packages/flow/src/component/FreeCirculation.vue +244 -244
  91. package/packages/flow/src/component/Preset.vue +257 -257
  92. package/packages/flow/src/component/SendMsg.vue +242 -242
  93. package/packages/flow/src/component/SortFlow.vue +110 -0
  94. package/packages/flow/src/component/taskUnionExamine.vue +761 -761
  95. package/packages/flow/src/form.vue +123 -123
  96. package/packages/flow/src/freeStartFlow.vue +2855 -2855
  97. package/packages/flow/src/main.vue +4135 -3948
  98. package/packages/flow/src/processForm.vue +1671 -1523
  99. package/packages/flow/src/processReject.vue +309 -309
  100. package/packages/flow/src/reset.vue +946 -946
  101. package/packages/flow/src/startTaskRead.vue +695 -695
  102. package/packages/flow/src/supervise.vue +159 -159
  103. package/packages/flow/src/table.vue +58 -58
  104. package/packages/flow-group/src/main.vue +727 -727
  105. package/packages/flow-list/.DS_Store +0 -0
  106. package/packages/flow-list/src/main.vue +1803 -1801
  107. package/packages/form/.DS_Store +0 -0
  108. package/packages/form/src/main.vue +3901 -3901
  109. package/packages/form/src/table.vue +1512 -1512
  110. package/packages/handle-user/src/main.vue +137 -137
  111. package/packages/handler/src/main.vue +496 -496
  112. package/packages/icon/.DS_Store +0 -0
  113. package/packages/icon/src/main.vue +104 -104
  114. package/packages/icons/src/icon.json +1 -1
  115. package/packages/login/.DS_Store +0 -0
  116. package/packages/login/src/main.vue +2087 -2087
  117. package/packages/login/src/resetPassword.vue +557 -557
  118. package/packages/main/.DS_Store +0 -0
  119. package/packages/main/src/.DS_Store +0 -0
  120. package/packages/main/src/default/userinfo.vue +503 -503
  121. package/packages/main/src/public/online.vue +89 -89
  122. package/packages/main/src/public/search.vue +464 -464
  123. package/packages/main/src/public/settings.vue +273 -273
  124. package/packages/main/src/simplicity/apps.vue +388 -388
  125. package/packages/main/src/simplicity/avatar.vue +82 -82
  126. package/packages/main/src/simplicity/handler.vue +158 -158
  127. package/packages/main/src/simplicity/index.vue +2328 -2328
  128. package/packages/main/src/simplicity/menu-list.vue +135 -135
  129. package/packages/main/src/simplicity/message.vue +293 -293
  130. package/packages/main/src/simplicity/notice.vue +222 -222
  131. package/packages/main/src/simplicity/sub-menu.vue +276 -276
  132. package/packages/main/src/simplicity/user.vue +259 -259
  133. package/packages/main/src/simplicity/userinfo.vue +401 -401
  134. package/packages/main/src/simplicityTop/apps.vue +388 -388
  135. package/packages/main/src/simplicityTop/avatar.vue +82 -82
  136. package/packages/main/src/simplicityTop/handler.vue +215 -215
  137. package/packages/main/src/simplicityTop/index.vue +2618 -2618
  138. package/packages/main/src/simplicityTop/lists.vue +84 -84
  139. package/packages/main/src/simplicityTop/menu-list.vue +135 -135
  140. package/packages/main/src/simplicityTop/message.vue +293 -293
  141. package/packages/main/src/simplicityTop/notice.vue +222 -222
  142. package/packages/main/src/simplicityTop/router-page.vue +45 -45
  143. package/packages/main/src/simplicityTop/sub-menu.vue +274 -274
  144. package/packages/main/src/simplicityTop/user.vue +259 -259
  145. package/packages/main/src/simplicityTop/userinfo.vue +401 -401
  146. package/packages/menu/.DS_Store +0 -0
  147. package/packages/menu/src/main.vue +595 -595
  148. package/packages/nav/src/main.vue +351 -351
  149. package/packages/select/.DS_Store +0 -0
  150. package/packages/select/src/main.vue +782 -782
  151. package/packages/selector/.DS_Store +0 -0
  152. package/packages/selector/src/main.vue +761 -761
  153. package/packages/selector-panel/.DS_Store +0 -0
  154. package/packages/selector-panel/src/main.vue +1036 -1036
  155. package/packages/selector-panel/src/selection.vue +174 -174
  156. package/packages/switch/src/main.vue +170 -170
  157. package/packages/theme-chalk/lib/base.css +1 -1
  158. package/packages/theme-chalk/lib/flow.css +1 -1
  159. package/packages/theme-chalk/lib/fonts/iconfont.ttf +0 -0
  160. package/packages/theme-chalk/lib/fonts/iconfont.woff +0 -0
  161. package/packages/theme-chalk/lib/icon.css +1 -1
  162. package/packages/theme-chalk/lib/index.css +1 -1
  163. package/packages/theme-chalk/lib/login.css +1 -1
  164. package/packages/theme-chalk/lib/main.css +1 -1
  165. package/packages/theme-chalk/lib/menu.css +1 -1
  166. package/packages/theme-chalk/lib/simplicity-top.css +1 -1
  167. package/packages/theme-chalk/lib/simplicity.css +1 -1
  168. package/packages/theme-chalk/lib/sizer.css +1 -1
  169. package/packages/theme-chalk/lib/upload.css +1 -1
  170. package/packages/theme-chalk/src/.DS_Store +0 -0
  171. package/packages/theme-chalk/src/data-table.scss +297 -297
  172. package/packages/theme-chalk/src/flow.scss +373 -359
  173. package/packages/theme-chalk/src/fonts/iconfont.ttf +0 -0
  174. package/packages/theme-chalk/src/fonts/iconfont.woff +0 -0
  175. package/packages/theme-chalk/src/form.scss +501 -501
  176. package/packages/theme-chalk/src/handler.scss +148 -148
  177. package/packages/theme-chalk/src/icon.scss +3452 -1612
  178. package/packages/theme-chalk/src/login.scss +1006 -1006
  179. package/packages/theme-chalk/src/main.scss +664 -664
  180. package/packages/theme-chalk/src/menu.scss +224 -224
  181. package/packages/theme-chalk/src/selector.scss +114 -114
  182. package/packages/theme-chalk/src/simplicity-top.scss +1845 -1845
  183. package/packages/theme-chalk/src/simplicity.scss +1403 -1403
  184. package/packages/theme-chalk/src/tree.scss +165 -165
  185. package/packages/theme-chalk/src/upload.scss +172 -172
  186. package/packages/tips/src/main.vue +141 -141
  187. package/packages/toolbar/src/main.vue +430 -430
  188. package/packages/upload/.DS_Store +0 -0
  189. package/packages/upload/src/main.vue +1344 -1344
  190. package/packages/wujie/src/main.vue +1 -0
  191. package/src/.DS_Store +0 -0
  192. package/src/config/api.js +340 -334
  193. package/src/index.js +163 -163
  194. package/src/utils/.DS_Store +0 -0
  195. package/src/utils/rules.js +18 -18
  196. package/src/utils/util.js +42 -26
@@ -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>