@zykjcommon/questions 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.
- package/.browserslistrc +3 -0
- package/.env +7 -0
- package/.env.buildTest +9 -0
- package/.env.development +9 -0
- package/.env.production +13 -0
- package/.env.test +12 -0
- package/@types/global.d.ts +33 -0
- package/@types/shims-vue.d.ts +6 -0
- package/@types/shims-vuex.d.ts +15 -0
- package/auto-imports.d.ts +6 -0
- package/babel.config.js +5 -0
- package/components.d.ts +23 -0
- package/design/App.vue +60 -0
- package/design/main.js +23 -0
- package/design/views/dialog/contentDialog.vue +18 -0
- package/design/views/dialog/contentDialog2.vue +18 -0
- package/design/views/dialog/contentDialog3.vue +19 -0
- package/design/views/exam/analysis.vue +208 -0
- package/design/views/exam/exam.vue +355 -0
- package/design/views/home/illustrate.vue +45 -0
- package/design/views/home/login.vue +43 -0
- package/design/vueMapper.js +8 -0
- package/design/vueMapperTree.js +2 -0
- package/dist/demo.html +1 -0
- package/dist/zykjcommon-questions.common.js +12817 -0
- package/dist/zykjcommon-questions.css +1 -0
- package/dist/zykjcommon-questions.umd.js +12836 -0
- package/dist/zykjcommon-questions.umd.min.js +18 -0
- package/index.js +10 -0
- package/package.json +61 -0
- package/public/favicon.ico +0 -0
- package/public/index.html +19 -0
- package/public/static/js/jquery.html2json.js +169 -0
- package/public/static/js/jquery.json2html.js +137 -0
- package/public/static/js/jquery.min.js +2 -0
- package/public/static/js/json2html.js +447 -0
- package/readme +8 -0
- package/src/App.vue +37 -0
- package/src/assets/img/afei.jpg +0 -0
- package/src/assets/img/audio-ico.gif +0 -0
- package/src/assets/img/audio-ico.png +0 -0
- package/src/assets/img/bc-type-bg.png +0 -0
- package/src/assets/img/big-close.png +0 -0
- package/src/assets/img/big-next.png +0 -0
- package/src/assets/img/big-pre.png +0 -0
- package/src/assets/img/book-bg.png +0 -0
- package/src/assets/img/checkbox-cur.png +0 -0
- package/src/assets/img/checkbox.png +0 -0
- package/src/assets/img/cpp-bg.png +0 -0
- package/src/assets/img/deer-logo.png +0 -0
- package/src/assets/img/header-bg-2.png +0 -0
- package/src/assets/img/header-bg.png +0 -0
- package/src/assets/img/illustrate-bg.png +0 -0
- package/src/assets/img/loading.gif +0 -0
- package/src/assets/img/login-bg.png +0 -0
- package/src/assets/img/login-box-bg.png +0 -0
- package/src/assets/img/login-box-logo.png +0 -0
- package/src/assets/img/logo.png +0 -0
- package/src/assets/img/logoByText.png +0 -0
- package/src/assets/img/py-bg.png +0 -0
- package/src/assets/img/pygame-bg.png +0 -0
- package/src/assets/img/radio-cur.png +0 -0
- package/src/assets/img/radio.png +0 -0
- package/src/assets/img/return-top-hover.png +0 -0
- package/src/assets/img/return-top.png +0 -0
- package/src/assets/img/sb3-bg.png +0 -0
- package/src/assets/img/star-ico.png +0 -0
- package/src/assets/img/tab-mark.png +0 -0
- package/src/assets/img/video-play-btn.png +0 -0
- package/src/assets/js/arms.js +16 -0
- package/src/assets/js/bus.js +14 -0
- package/src/assets/js/fun.js +883 -0
- package/src/assets/js/helper.js +575 -0
- package/src/assets/js/http.js +219 -0
- package/src/assets/js/md5.js +260 -0
- package/src/assets/js/rem.js +33 -0
- package/src/assets/js/validation.js +216 -0
- package/src/assets/js/zykjcommon-questions.umd.min.js +18 -0
- package/src/assets/logo.png +0 -0
- package/src/assets/scss/dialog/dialog.scss +144 -0
- package/src/assets/scss/exam/exam.scss +256 -0
- package/src/assets/scss/home/home.scss +222 -0
- package/src/assets/scss/index.scss +80 -0
- package/src/assets/scss/questions/index.scss +345 -0
- package/src/common/const.ts +15 -0
- package/src/components/common/ContentDialog.vue +172 -0
- package/src/components/common/IframeComponent.vue +101 -0
- package/src/components/common/Loading.vue +45 -0
- package/src/components/common/MediaLooker.vue +171 -0
- package/src/components/common/TextAreaEditor.vue +121 -0
- package/src/components/exam/QuestionCard.vue +494 -0
- package/src/components/exam/QuestionHeader.vue +87 -0
- package/src/components/exam/TimeCounter.vue +107 -0
- package/src/components/questions/QuestionReader.js +20 -0
- package/src/components/questions/Question_SingleChoice.vue +208 -0
- package/src/components/questions/buildEntry.js +12 -0
- package/src/components/questions/developmentEntry.js +11 -0
- package/src/components/questions/mixin.js +64 -0
- package/src/main.ts +176 -0
- package/src/router/exam.ts +50 -0
- package/src/router/index.ts +33 -0
- package/src/store/exam.ts +199 -0
- package/src/store/index.ts +22 -0
- package/src/types/common/index.ts +4 -0
- package/src/types/exam/exam.ts +10 -0
- package/src/views/exam/Analysis.vue +516 -0
- package/src/views/exam/Default.vue +28 -0
- package/src/views/exam/Exam.vue +594 -0
- package/src/views/exam/ReviewPaper.vue +178 -0
- package/src/views/exam/ReviewQuestion.vue +167 -0
- package/tasks/vueMapper.js +37 -0
- package/tasks/vueMapperTree.js +42 -0
- package/tsconfig.json +46 -0
- package/tslint.json +19 -0
- package/vue.config.js +107 -0
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
/*****************************************************
|
|
2
|
+
* JS辅助工具类
|
|
3
|
+
****************************************************/
|
|
4
|
+
import {postWeb} from './http';
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
var mediadevice = function () {
|
|
8
|
+
|
|
9
|
+
var getDevices,
|
|
10
|
+
getUserMedia,
|
|
11
|
+
setVolume,
|
|
12
|
+
getHeadphones,
|
|
13
|
+
dispose;
|
|
14
|
+
window.AudioContext = window.AudioContext || window.webkitAudioContext;
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
getDevices = function () {
|
|
18
|
+
|
|
19
|
+
return new Promise(function (callback, reject) {
|
|
20
|
+
if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
|
|
21
|
+
navigator.mediaDevices.enumerateDevices().then(function (MediaDeviceInfo) {
|
|
22
|
+
var _devices = {
|
|
23
|
+
audio: [],
|
|
24
|
+
video: [],
|
|
25
|
+
headphones: []
|
|
26
|
+
};
|
|
27
|
+
var p1 = 1, p2 = 1, p3 = 1;
|
|
28
|
+
for (var mediaDeviceInfo in MediaDeviceInfo) {
|
|
29
|
+
var thisdevice = MediaDeviceInfo[mediaDeviceInfo],
|
|
30
|
+
temp = {};
|
|
31
|
+
|
|
32
|
+
temp.deviceId = thisdevice.deviceId;
|
|
33
|
+
temp.groupId = thisdevice.groupId;
|
|
34
|
+
temp.label = thisdevice.label;
|
|
35
|
+
|
|
36
|
+
// if(temp.label=='默认'||temp.label=='通讯')
|
|
37
|
+
// continue;
|
|
38
|
+
if (thisdevice.kind === 'videoinput') {
|
|
39
|
+
if (temp.label === '') {
|
|
40
|
+
temp.label = '摄像头' + p2;
|
|
41
|
+
p2++;
|
|
42
|
+
}
|
|
43
|
+
if (temp.label.indexOf('前') >= 0 || temp.label.indexOf('正') >= 0)
|
|
44
|
+
_devices.video.splice(0, 0, temp);
|
|
45
|
+
else
|
|
46
|
+
_devices.video.push(temp);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
/*麦克风*/
|
|
51
|
+
if (thisdevice.kind === 'audioinput'
|
|
52
|
+
&& thisdevice.deviceId !== 'communications' && thisdevice.deviceId !== 'default') {
|
|
53
|
+
if (temp.label === '') {
|
|
54
|
+
temp.label = '麦克风' + p1;
|
|
55
|
+
p1++;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
_devices.audio.push(temp)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/*耳机*/
|
|
62
|
+
if (thisdevice.kind === 'audiooutput'
|
|
63
|
+
&& thisdevice.deviceId !== 'communications' && thisdevice.deviceId !== 'default') {
|
|
64
|
+
if (temp.label === '') {
|
|
65
|
+
temp.label = '扬声器' + p3;
|
|
66
|
+
p3++;
|
|
67
|
+
}
|
|
68
|
+
_devices.headphones.push(temp);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (callback && typeof callback === 'function') callback(_devices);
|
|
72
|
+
});
|
|
73
|
+
} else {
|
|
74
|
+
reject()
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
getUserMedia = function (option) {
|
|
80
|
+
var _constraints = option || {
|
|
81
|
+
audio: true,
|
|
82
|
+
video: true
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
return new Promise(function (callback, reject) {
|
|
86
|
+
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
|
|
87
|
+
navigator.mediaDevices.getUserMedia(_constraints).then(function (mediaStream) {
|
|
88
|
+
// window.console.debug(1, mediaStream);
|
|
89
|
+
|
|
90
|
+
//1占用2没权限3没设备4未知
|
|
91
|
+
if (_constraints.video) {
|
|
92
|
+
var videoTracks = mediaStream.getVideoTracks();
|
|
93
|
+
if (!videoTracks.length) {
|
|
94
|
+
//无摄像头
|
|
95
|
+
|
|
96
|
+
callback(3)
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// window.console.debug('videoTracks[0].readyState : ' + videoTracks[0].readyState);
|
|
100
|
+
var createTime = Date.now();
|
|
101
|
+
videoTracks[0].onended = function () {
|
|
102
|
+
var diff = Date.now() - createTime;
|
|
103
|
+
window.console.debug('videoTracks[0].readyState : ' + diff);
|
|
104
|
+
if (diff > 2000) {
|
|
105
|
+
callback(mediaStream);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
callback(1);
|
|
110
|
+
return;
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
if (callback && typeof callback === 'function') callback(mediaStream);
|
|
114
|
+
// window.console.debug(2, mediaStream);
|
|
115
|
+
}).catch(function (error) {
|
|
116
|
+
if (error) {
|
|
117
|
+
// window.console.error('getUserMedia error : ' + error.name);
|
|
118
|
+
var v;
|
|
119
|
+
switch (error.name) {
|
|
120
|
+
case 'NotAllowedError':
|
|
121
|
+
case 'PermissionDeniedError':
|
|
122
|
+
v = 2
|
|
123
|
+
break;
|
|
124
|
+
case 'TrackStartError':
|
|
125
|
+
v = 1
|
|
126
|
+
|
|
127
|
+
break;
|
|
128
|
+
case 'DevicesNotFoundError':
|
|
129
|
+
v = 3;
|
|
130
|
+
break;
|
|
131
|
+
case 'MediaStreamError':
|
|
132
|
+
//codova
|
|
133
|
+
if (error.message == 'getUserMedia() failed: video denied') {
|
|
134
|
+
v = 2;
|
|
135
|
+
}
|
|
136
|
+
if (error.message == 'getUserMedia() failed: audio denied') {
|
|
137
|
+
v = 2;
|
|
138
|
+
}
|
|
139
|
+
break;
|
|
140
|
+
default:
|
|
141
|
+
v = 4;
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
callback(v);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
callback(4);
|
|
149
|
+
return;
|
|
150
|
+
});
|
|
151
|
+
} else {
|
|
152
|
+
reject()
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* 初始化 AudioContext 返回 mediaStreamSource && scriptProcessor
|
|
160
|
+
* @param stream
|
|
161
|
+
* @returns {Promise}
|
|
162
|
+
*/
|
|
163
|
+
function initAudioContext(stream) {
|
|
164
|
+
return new Promise(function (callback) {
|
|
165
|
+
var mediaStreamSource, scriptProcessor, audioContext;
|
|
166
|
+
try {
|
|
167
|
+
audioContext = new (window.AudioContext || window.webkitAudioContext)();
|
|
168
|
+
} catch (e) {
|
|
169
|
+
return window.console.warn('Web Audio API not supported.');
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
mediaStreamSource = audioContext.createMediaStreamSource(stream);
|
|
173
|
+
scriptProcessor = audioContext.createScriptProcessor(0, 1, 1);
|
|
174
|
+
mediaStreamSource.connect(scriptProcessor);
|
|
175
|
+
scriptProcessor.connect(audioContext.destination);
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
if (callback && typeof callback === 'function' && !!mediaStreamSource && !!scriptProcessor) callback({
|
|
179
|
+
mediaStreamSource: mediaStreamSource,
|
|
180
|
+
scriptProcessor: scriptProcessor,
|
|
181
|
+
audioContext: audioContext
|
|
182
|
+
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* 监听声音scriptProcessor
|
|
189
|
+
* @param scriptProcessor
|
|
190
|
+
* @param onprocess
|
|
191
|
+
*/
|
|
192
|
+
function onAudioProcess(scriptProcessor, onprocess) {
|
|
193
|
+
|
|
194
|
+
if (scriptProcessor)
|
|
195
|
+
scriptProcessor.onaudioprocess = function (audioProcessingEvent) {
|
|
196
|
+
|
|
197
|
+
var inputBuffer = audioProcessingEvent.inputBuffer;
|
|
198
|
+
var outputBuffer = audioProcessingEvent.outputBuffer;
|
|
199
|
+
|
|
200
|
+
for (var channel = 0; channel < outputBuffer.numberOfChannels; channel++) {
|
|
201
|
+
var inputData = inputBuffer.getChannelData(channel);
|
|
202
|
+
var outputData = outputBuffer.getChannelData(channel);
|
|
203
|
+
|
|
204
|
+
for (var sample = 0; sample < inputBuffer.length; sample++) {
|
|
205
|
+
outputData[sample] = inputData[sample];
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (onprocess) {
|
|
209
|
+
var input = audioProcessingEvent.inputBuffer.getChannelData(0);
|
|
210
|
+
var len = input.length;
|
|
211
|
+
var sum = 0.0;
|
|
212
|
+
for (var i = 0; i < len; ++i) {
|
|
213
|
+
sum += input[i] * input[i];
|
|
214
|
+
}
|
|
215
|
+
var volumeValue = Math.sqrt(sum / len);
|
|
216
|
+
volumeValue = (Math.sin(volumeValue * 3.1415 / 2)) * 100 >> 0;
|
|
217
|
+
|
|
218
|
+
onprocess(volumeValue);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* 声音显示
|
|
227
|
+
* @param stream
|
|
228
|
+
* @param dom
|
|
229
|
+
* @returns {Promise}
|
|
230
|
+
*/
|
|
231
|
+
setVolume = function (stream, onprocess) {
|
|
232
|
+
return new Promise(function (callback) {
|
|
233
|
+
initAudioContext(stream).then(function () {
|
|
234
|
+
|
|
235
|
+
var mediaStreamSource = arguments[0].mediaStreamSource,
|
|
236
|
+
scriptProcessor = arguments[0].scriptProcessor,
|
|
237
|
+
audiocontext = arguments[0].audioContext;
|
|
238
|
+
|
|
239
|
+
onAudioProcess(scriptProcessor, onprocess);
|
|
240
|
+
var Acontext = {
|
|
241
|
+
mediaStreamSource: mediaStreamSource,
|
|
242
|
+
scriptProcessor: scriptProcessor,
|
|
243
|
+
audiocontext: audiocontext
|
|
244
|
+
|
|
245
|
+
}
|
|
246
|
+
callback(Acontext);
|
|
247
|
+
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
function initHeadphonesContext(stream) {
|
|
253
|
+
return new Promise(function (callback) {
|
|
254
|
+
var mediaStreamSource, scriptProcessor, audioContext;
|
|
255
|
+
try {
|
|
256
|
+
audioContext = new (window.AudioContext || window.webkitAudioContext)();
|
|
257
|
+
} catch (e) {
|
|
258
|
+
return window.console.warn('Web Audio API not supported.');
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
mediaStreamSource = audioContext.createMediaStreamSource(stream);
|
|
262
|
+
// scriptProcessor = audioContext.createScriptProcessor(0, 1, 1);
|
|
263
|
+
// mediaStreamSource.connect(scriptProcessor);
|
|
264
|
+
// scriptProcessor.connect(audioContext.destination);
|
|
265
|
+
|
|
266
|
+
var biquadFilter = audioContext.createBiquadFilter();
|
|
267
|
+
biquadFilter.type = "lowshelf";
|
|
268
|
+
biquadFilter.frequency.value = 1000;
|
|
269
|
+
biquadFilter.gain.value = 25;
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
mediaStreamSource.connect(biquadFilter);
|
|
273
|
+
biquadFilter.connect(audioContext.destination);
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
if (callback && typeof callback === 'function' && !!mediaStreamSource && !!scriptProcessor) callback({
|
|
277
|
+
mediaStreamSource: mediaStreamSource,
|
|
278
|
+
scriptProcessor: scriptProcessor,
|
|
279
|
+
audioContext: audioContext
|
|
280
|
+
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
function onHeadProcess(scriptProcessor, onprocess) {
|
|
286
|
+
|
|
287
|
+
if (scriptProcessor)
|
|
288
|
+
scriptProcessor.onaudioprocess = function (audioProcessingEvent) {
|
|
289
|
+
|
|
290
|
+
if (onprocess) {
|
|
291
|
+
var input = audioProcessingEvent.inputBuffer.getChannelData(0);
|
|
292
|
+
var len = input.length;
|
|
293
|
+
var sum = 0.0;
|
|
294
|
+
for (var i = 0; i < len; ++i) {
|
|
295
|
+
sum += input[i] * input[i];
|
|
296
|
+
}
|
|
297
|
+
var volumeValue = Math.sqrt(sum / len);
|
|
298
|
+
volumeValue = (Math.sin(volumeValue * 3.1415 / 2)) * 100 >> 0;
|
|
299
|
+
|
|
300
|
+
onprocess(volumeValue);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
getHeadphones = function (stream, onprocess) {
|
|
307
|
+
|
|
308
|
+
return new Promise(function (callback) {
|
|
309
|
+
initAudioContext(stream).then(function () {
|
|
310
|
+
|
|
311
|
+
var mediaStreamSource = arguments[0].mediaStreamSource,
|
|
312
|
+
scriptProcessor = arguments[0].scriptProcessor,
|
|
313
|
+
audiocontext = arguments[0].audioContext;
|
|
314
|
+
|
|
315
|
+
onHeadProcess(scriptProcessor, onprocess);
|
|
316
|
+
let Acontext = {
|
|
317
|
+
mediaStreamSource: mediaStreamSource,
|
|
318
|
+
scriptProcessor: scriptProcessor,
|
|
319
|
+
audiocontext: audiocontext
|
|
320
|
+
|
|
321
|
+
}
|
|
322
|
+
callback(Acontext);
|
|
323
|
+
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
dispose = function (stream, audiocontext) {
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
return new Promise(function (callback) {
|
|
332
|
+
if (stream) {
|
|
333
|
+
var trackList = stream.getTracks();
|
|
334
|
+
for (var index in trackList) {
|
|
335
|
+
trackList[index].stop();
|
|
336
|
+
}
|
|
337
|
+
stream = null;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
if (audiocontext) {
|
|
341
|
+
if (audiocontext.mediaStreamSource) audiocontext.mediaStreamSource.disconnect();
|
|
342
|
+
if (audiocontext.scriptProcessor) {
|
|
343
|
+
audiocontext.scriptProcessor.disconnect();
|
|
344
|
+
audiocontext.scriptProcessor.onaudioprocess = null;
|
|
345
|
+
}
|
|
346
|
+
if (audiocontext.audiocontext) {
|
|
347
|
+
audiocontext.audiocontext.close();
|
|
348
|
+
audiocontext.audiocontext = null;
|
|
349
|
+
}
|
|
350
|
+
audiocontext = null;
|
|
351
|
+
}
|
|
352
|
+
callback();
|
|
353
|
+
});
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
return {
|
|
358
|
+
getDevices: getDevices,
|
|
359
|
+
getUserMedia: getUserMedia,
|
|
360
|
+
setVolume: setVolume,
|
|
361
|
+
getHeadphones: getHeadphones,
|
|
362
|
+
dispose: dispose
|
|
363
|
+
|
|
364
|
+
};
|
|
365
|
+
}();
|
|
366
|
+
|
|
367
|
+
var pdfHelper = function () {
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
function getBrowserName() {
|
|
371
|
+
|
|
372
|
+
var userAgent = navigator ? navigator.userAgent.toLowerCase() : "other";
|
|
373
|
+
if (userAgent.indexOf("chrome") > -1) return "chrome";
|
|
374
|
+
|
|
375
|
+
else if (userAgent.indexOf("safari") > -1) return "safari";
|
|
376
|
+
|
|
377
|
+
else if (userAgent.indexOf("msie") > -1 || userAgent.indexOf("trident") > -1)
|
|
378
|
+
|
|
379
|
+
return "ie";
|
|
380
|
+
|
|
381
|
+
else if (userAgent.indexOf("firefox") > -1) return "firefox";
|
|
382
|
+
|
|
383
|
+
return userAgent;
|
|
384
|
+
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
function getActiveXObject(name) {
|
|
389
|
+
|
|
390
|
+
try {
|
|
391
|
+
return new ActiveXObject(name);
|
|
392
|
+
} catch (e) {
|
|
393
|
+
window.console.log(e)
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
function getNavigatorPlugin(name) {
|
|
400
|
+
|
|
401
|
+
for (let key in navigator.plugins) {
|
|
402
|
+
|
|
403
|
+
var plugin = navigator.plugins[key];
|
|
404
|
+
|
|
405
|
+
if (plugin.name == name)
|
|
406
|
+
|
|
407
|
+
return plugin;
|
|
408
|
+
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
function getPDFPlugin() {
|
|
415
|
+
|
|
416
|
+
if (getBrowserName() == 'ie') {
|
|
417
|
+
return getActiveXObject('AcroPDF.PDF')
|
|
418
|
+
|| getActiveXObject('PDF.PdfCtrl');
|
|
419
|
+
} else {
|
|
420
|
+
return getNavigatorPlugin('Adobe Acrobat') || getNavigatorPlugin('Chrome PDF Viewer') || getNavigatorPlugin('WebKit built-in PDF');
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
function isAcrobatInstalled() {
|
|
427
|
+
return getPDFPlugin();
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
function getAcrobatVersion() {
|
|
432
|
+
|
|
433
|
+
try {
|
|
434
|
+
|
|
435
|
+
var plugin = getPDFPlugin();
|
|
436
|
+
|
|
437
|
+
if (getBrowserName() == 'ie') {
|
|
438
|
+
|
|
439
|
+
var versions = plugin.GetVersions().split(',');
|
|
440
|
+
|
|
441
|
+
var latest = versions[0].split('=');
|
|
442
|
+
|
|
443
|
+
return parseFloat(latest[1]);
|
|
444
|
+
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
if (plugin.version)
|
|
448
|
+
|
|
449
|
+
return parseInt(plugin.version);
|
|
450
|
+
|
|
451
|
+
return plugin.name;
|
|
452
|
+
|
|
453
|
+
} catch (e) {
|
|
454
|
+
|
|
455
|
+
return null;
|
|
456
|
+
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
return {
|
|
463
|
+
goPdf(path) {
|
|
464
|
+
if (isAcrobatInstalled) {
|
|
465
|
+
let popup = window.open('about:blank', '_blank')
|
|
466
|
+
popup.document.write('<h2>加载中</h2>')
|
|
467
|
+
popup.location = path
|
|
468
|
+
} else {
|
|
469
|
+
alert("你可能还没有安装pdf阅读器,为了方便你查看pdf文档,请下载!");
|
|
470
|
+
window.location.href = "http://ardownload.adobe.com/pub/adobe/reader/win/9.x/9.3/chs/AdbeRdr930_zh_CN.exe";
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}()
|
|
475
|
+
|
|
476
|
+
var browserTester = {
|
|
477
|
+
chrome() {
|
|
478
|
+
return navigator.userAgent.indexOf("Chrome") > -1
|
|
479
|
+
},
|
|
480
|
+
safari() {
|
|
481
|
+
return navigator.userAgent.indexOf("Safari") > -1
|
|
482
|
+
},
|
|
483
|
+
edge() {
|
|
484
|
+
return navigator.userAgent.indexOf("Edge") > -1
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
var cookieUtils = {
|
|
489
|
+
setItem(key, value, expires) {
|
|
490
|
+
let result = {key: key}
|
|
491
|
+
let method = expires ? 'localStorage' : 'sessionStorage'
|
|
492
|
+
result.value = value
|
|
493
|
+
setExpires()
|
|
494
|
+
window[method].setItem(key, JSON.stringify(result))
|
|
495
|
+
|
|
496
|
+
function setExpires() {
|
|
497
|
+
if (method === 'localStorage') {
|
|
498
|
+
result.expires = expires
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
},
|
|
502
|
+
getItem(key,hasExpires){
|
|
503
|
+
let res = null
|
|
504
|
+
let method = hasExpires ? 'localStorage' : 'sessionStorage'
|
|
505
|
+
let result = window[method].getItem(key)
|
|
506
|
+
if(result){
|
|
507
|
+
result = JSON.parse(result)
|
|
508
|
+
if(Object.prototype.toString.call(result)==='[object Object]'){
|
|
509
|
+
let value = result.value
|
|
510
|
+
if(method==='localStorage'){
|
|
511
|
+
let expireTime = result.expires
|
|
512
|
+
if(expireTime - new Date().getTime() <= 0){
|
|
513
|
+
this.removeItem(key)
|
|
514
|
+
}else{
|
|
515
|
+
res = value
|
|
516
|
+
}
|
|
517
|
+
}else{
|
|
518
|
+
res = value
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
return res
|
|
523
|
+
},
|
|
524
|
+
removeItem(key){
|
|
525
|
+
window.localStorage.removeItem(key)
|
|
526
|
+
window.sessionStorage.removeItem(key)
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
function deepCopy(target){
|
|
532
|
+
var result
|
|
533
|
+
var objType = isObj(target)?'object':(Array.isArray(target)?'array':'')
|
|
534
|
+
if(typeof target!=='object'&&target!==null){
|
|
535
|
+
result = target
|
|
536
|
+
}else if(objType==='object'){
|
|
537
|
+
result = {}
|
|
538
|
+
for(let key in target){
|
|
539
|
+
if(typeof target[key]==='object'){
|
|
540
|
+
result[key] = deepCopy(target[key])
|
|
541
|
+
}else{
|
|
542
|
+
result[key] = target[key]
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
}else if(objType==='array'){
|
|
546
|
+
result = []
|
|
547
|
+
for(let i = 0;i<target.length;i++){
|
|
548
|
+
if(typeof target[i]==='object'){
|
|
549
|
+
result[i] = deepCopy(target[i])
|
|
550
|
+
}else{
|
|
551
|
+
result[i] = target[i]
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
}else{
|
|
555
|
+
result = target
|
|
556
|
+
}
|
|
557
|
+
return result
|
|
558
|
+
}
|
|
559
|
+
function isObj(obj){
|
|
560
|
+
var type = Object.prototype.toString.call(obj)
|
|
561
|
+
if(type==='[object Object]'){
|
|
562
|
+
return true
|
|
563
|
+
}else{
|
|
564
|
+
return false
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
export default {
|
|
569
|
+
mediadevice,
|
|
570
|
+
pdfHelper,
|
|
571
|
+
browserTester,
|
|
572
|
+
cookieUtils,
|
|
573
|
+
isObj,
|
|
574
|
+
deepCopy
|
|
575
|
+
}
|