fstarter 2.10.48 → 2.10.51
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/.babelrc +6 -6
- package/.editorconfig +9 -9
- package/index.html +22 -22
- package/index.js +222 -222
- package/package.json +1 -1
- package/src/App.vue +38 -38
- package/src/i18n/en-US.js +35 -35
- package/src/i18n/zh-CN.js +35 -35
- package/src/main.js +95 -87
- package/src/plugins/assets/ak.js +948 -948
- package/src/plugins/assets/callNative.js +490 -488
- package/src/plugins/assets/compressImg.js +75 -75
- package/src/plugins/assets/config.js +106 -106
- package/src/plugins/assets/fileServer.js +469 -469
- package/src/plugins/assets/http.js +343 -343
- package/src/plugins/assets/ua.js +27 -27
- package/src/plugins/components/BSButton.vue +61 -61
- package/src/plugins/components/BSCascader.vue +465 -465
- package/src/plugins/components/BSCell.vue +48 -48
- package/src/plugins/components/BSDatePicker.vue +167 -167
- package/src/plugins/components/BSImage.vue +42 -42
- package/src/plugins/components/BSInput.vue +140 -140
- package/src/plugins/components/BSList.vue +81 -81
- package/src/plugins/components/BSPicCode.vue +96 -96
- package/src/plugins/components/BSPopup.vue +43 -43
- package/src/plugins/components/BSRadio.vue +97 -97
- package/src/plugins/components/BSSearch.vue +109 -109
- package/src/plugins/components/BSSelect.vue +144 -144
- package/src/plugins/components/BSSign.vue +454 -454
- package/src/plugins/components/BSStepper.vue +115 -115
- package/src/plugins/components/BSUpload.vue +92 -92
- package/src/plugins/components/BSUpload2.vue +398 -398
- package/src/plugins/components/BSVerCode.vue +128 -129
- package/src/plugins/components/BSViewer.vue +92 -92
- package/src/plugins/components/base.js +496 -496
- package/src/plugins/components/base2.js +489 -489
- package/src/plugins/lib/weixin.js +20 -20
- package/src/plugins/platform/index.js +7 -7
- package/src/plugins/platform/isp_phone.js +310 -306
- package/src/plugins/route/index.js +140 -140
- package/src/plugins/selector/index.js +342 -342
- package/src/plugins/service/index.js +81 -81
- package/src/plugins/services/callCamera.js +53 -53
- package/src/plugins/services/exit.js +36 -36
- package/src/plugins/services/face.js +69 -69
- package/src/plugins/services/faceH5.js +49 -0
- package/src/plugins/services/faceInApp.js +31 -31
- package/src/plugins/services/faceTx.js +61 -61
- package/src/plugins/services/getFaceResult.js +104 -104
- package/src/plugins/services/getH5FaceResult.js +62 -0
- package/src/plugins/services/getMenus.js +40 -40
- package/src/plugins/services/getSystemData.js +128 -128
- package/src/plugins/services/getToken.js +79 -79
- package/src/plugins/services/getTxFaceResult.js +83 -83
- package/src/plugins/services/getUserInfo.js +47 -47
- package/src/plugins/services/goSetPage.js +40 -40
- package/src/plugins/services/hideFhoneTitle.js +36 -36
- package/src/plugins/services/index.js +45 -41
- package/src/plugins/services/init.js +35 -35
- package/src/plugins/services/jumpView.js +40 -40
- package/src/plugins/services/logout.js +43 -43
- package/src/plugins/services/share.js +113 -113
- package/src/plugins/services/statusBarHeight.js +39 -39
- package/src/plugins/session/index.js +32 -32
- package/src/services/getAuthInfo.js +22 -22
- package/src/services/index.js +9 -9
- package/src/services/sendVerCode.js +23 -23
- package/src/views/auth.vue +367 -367
- package/src/views/auth2.vue +90 -90
- package/src/views/auth3.vue +157 -157
- package/src/views/auth4.vue +8979 -8979
- package/src/views/auth5.vue +50 -50
- package/src/views/authh5.vue +369 -0
- package/src/views/components/BankSelect.vue +55 -55
- package/src/views/foot.vue +140 -140
- package/src/views/page.vue +222 -219
- package/src/views/shellFunc.vue +41 -41
- package/themes/basic.css +1 -1
- package/webpack.config.js +144 -144
- package/fstarter.iml +0 -9
|
@@ -1,454 +1,454 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="signWrapper">
|
|
3
|
-
<div class="controlPart">
|
|
4
|
-
<van-icon
|
|
5
|
-
class="btn transform90"
|
|
6
|
-
name="cross"
|
|
7
|
-
@click="back"
|
|
8
|
-
/>
|
|
9
|
-
<van-icon
|
|
10
|
-
class="btn transform90"
|
|
11
|
-
name="delete"
|
|
12
|
-
@click="clear"
|
|
13
|
-
/>
|
|
14
|
-
<van-icon
|
|
15
|
-
class="btn transform90"
|
|
16
|
-
name="success"
|
|
17
|
-
@click="confirm"
|
|
18
|
-
/>
|
|
19
|
-
<div class="checked transform90">
|
|
20
|
-
<van-checkbox v-model="checked"></van-checkbox>
|
|
21
|
-
</div>
|
|
22
|
-
<div
|
|
23
|
-
class="readCheck transform90"
|
|
24
|
-
@click="goRead"
|
|
25
|
-
>
|
|
26
|
-
已阅读《CFCA数字证明服务协议》
|
|
27
|
-
</div>
|
|
28
|
-
</div>
|
|
29
|
-
<canvas
|
|
30
|
-
class="canvasPart"
|
|
31
|
-
:width="width"
|
|
32
|
-
:height="height"
|
|
33
|
-
>
|
|
34
|
-
</canvas>
|
|
35
|
-
<canvas
|
|
36
|
-
class="canvas2"
|
|
37
|
-
:width="canvas2Width"
|
|
38
|
-
:height="height"
|
|
39
|
-
v-show="false"
|
|
40
|
-
>
|
|
41
|
-
</canvas>
|
|
42
|
-
<van-popup
|
|
43
|
-
v-model="showRead"
|
|
44
|
-
position="right"
|
|
45
|
-
:style="{
|
|
46
|
-
width: '100%',
|
|
47
|
-
height: '100%'
|
|
48
|
-
}"
|
|
49
|
-
>
|
|
50
|
-
<div class='serviceRule'>
|
|
51
|
-
<!-- <p @click="goRead"><van-icon name="arrow-left" /></p> -->
|
|
52
|
-
<h4 class='textCenter bigFont'>CFCA数字证书服务协议</h4>
|
|
53
|
-
<h5 class='textCenter centerFont'>(本协议包含CFCA的免责条款,请认真阅读,尤其是粗体字内容)</h5>
|
|
54
|
-
<div class="content">
|
|
55
|
-
尊敬的网上用户:<br>
|
|
56
|
-
中金金融认证中心有限公司(即中国金融认证中心,简称“CFCA”)是经国家有关管理机关审批设立的电子认证服务机构,作为权威的第三方安全认证机构,通过数字证书注册机构(以下简称“RA”)向网上用户(以下简称“订户”)发放数字证书,为订户网上交易提供信息安全保障。
|
|
57
|
-
订户在申请使用CFCA签发的数字证书之前,应先阅读并同意"CFCA数字证书服务协议"(以下简称"本协议")。本协议构成订户与中金金融认证中心有限公司之间的权利义务约定,若不同意本协议全部或部分条款,请勿申请使用CFCA数字证书。订户一旦完成CFCA数字证书的下载或初次使用,即表明同意接受并愿意遵守本协议的所有条款。
|
|
58
|
-
一、证书订户的权利和义务<br>
|
|
59
|
-
1、订户应遵循诚实、信用原则,在向RA申请数字证书时,应当提供真实、完整、准确的信息和资料,并在这些信息、资料发生改变时及时通知原RA。如因订户故意或过失提供的资料不真实、完整、准确或资料改变后未及时通知CFCA或原RA,造成的损失由订户自己承担。<br>
|
|
60
|
-
2、在通过RA的审核、信息注册后,订户即可获得数字证书的下载凭证,订户应妥善保管下载凭证,亲自用该凭证从相关网站将数字证书下载在安全的容器里;订户也可以委托或授权他人通过其他安全的方式获得数字证书。订户获得的下载凭证为一次性使用,有效期为14天。如果在14天内没有下载数字证书,订户需要到RA重新获得下载凭证。订户应对获得的数字证书信息进行确认,首次使用,视为确认生效。<br>
|
|
61
|
-
3、订户须使用经合法途径获得的相关软件。<br>
|
|
62
|
-
4、订户应合法使用CFCA发放的数字证书,并对使用数字证书的行为负责:<br>
|
|
63
|
-
① 使用证书的行为应符合全部适用的法律法规;<br>
|
|
64
|
-
② 使用证书的行为应符合订户真实意愿或者仅为了处理已获得授权的事务;<br>
|
|
65
|
-
③ 使用证书的行为应符合本协议约定的使用范围和条件。<br>
|
|
66
|
-
5、订户应采取必要手段来保障证书的私钥和相关密码的安全存储、使用备份等。EV代码签名证书必须被保存在满足FIPS-140-2或相应级别的安全介质中;如初次使用智能密码钥匙时,应修改初始的缺省密码。订户如因故意或过失导致他人盗用、冒用数字证书私钥和密码时,订户应自行承担由此产生的责任。<br>
|
|
67
|
-
6、如订户使用的数字证书私钥和密码泄漏、丢失,或者订户不希望继续使用数字证书,或者订户主体不存在,订户或法定权利人应当立即到原RA申请废止该数字证书,相关手续遵循RA的规定。CFCA收到RA的废止请求后,将在4小时之内废止该订户的数字证书。<br>
|
|
68
|
-
7、订户损害CFCA利益的,须向CFCA赔偿全部损失。这些情形包括但不限于:<br>
|
|
69
|
-
①订户在申请数字证书时没有提供真实、完整、准确信息,或在这些信息变更时未及时通知RA;<br>
|
|
70
|
-
②订户知道自己的私钥已经失密或者可能已经失密而未及时告知有关各方、并终止使用;<br>
|
|
71
|
-
③订户有其他过错或未履行本协议的相关约定。<br>
|
|
72
|
-
8、订户有按期缴纳数字证书服务费的义务,费用标准请咨询RA。<br>
|
|
73
|
-
9、CFCA有权因安全风险因素要求订户更换数字证书。订户在收到数字证书更换通知后,应在规定的期限内到原RA更换。<br>
|
|
74
|
-
10、订户申请代码签名证书后,一旦发现如下情况之一时,应当立即向CA申请吊销此证书:<br>
|
|
75
|
-
①有证据表明,此代码签名证书被用于签署可疑代码,包括但不限于病毒,木马,或者其他不恰当的程序。<br>
|
|
76
|
-
②证书中内容不再正确或不再准确。<br>
|
|
77
|
-
③此证书私钥信息已被泄露、丢失,或者其他相关部分已被错误使用。<br>
|
|
78
|
-
11、证书一旦被吊销,订户将不能再使用该证书。<br>
|
|
79
|
-
12、订户明确了解,如果CFCA发现了订户证书的不当使用,或者订户证书被用于违法甚至犯罪行为,CFCA有权直接吊销订户证书。<br>
|
|
80
|
-
13、订户在发现或怀疑由CFCA提供的认证服务造成订户的网上交易信息的泄漏和/或篡改时,应在3个月内向CFCA提出争议处理请求并通知有关各方。<br>
|
|
81
|
-
二、CFCA的服务、权利、义务、责任限制和免责<br>
|
|
82
|
-
1、CFCA依法制定电子认证业务规则(Certificate Policy Statement,以下简称“CPS”),并公布于CFCA网站(www.cfca.com.cn),明确CFCA数字证书的功能、使用证书各方的权利、义务以及CFCA的责任范围,本协议的相关条款源自CPS。<br>
|
|
83
|
-
2、CFCA为订户提供7X24小时热线支持服务(4008809888)。为保证我们的服务质量,CFCA设立了投诉电话(010-83519756),CFCA将在1个工作日内对订户的意见和建议做出响应。<br>
|
|
84
|
-
3、在订户通过安全工具使用数字证书对交易信息进行加密和签名的条件下,CFCA将保证交易信息的保密性、完整性、抗抵赖性。如果发生纠纷,CFCA将依据不同情形承担下述义务:<br>
|
|
85
|
-
①提供签发订户数字证书的CA证书。<br>
|
|
86
|
-
②提供订户数字证书在交易发生时,在或不在CFCA发布的数字证书废止列表内的证明。<br>
|
|
87
|
-
③对数字证书、数字签名、时间戳的真实性、有效性进行技术确认。<br>
|
|
88
|
-
4、有下列情形之一的,CFCA有权撤销所签发的数字证书:<br>
|
|
89
|
-
①订户申请数字证书时,提供的资料不真实;<br>
|
|
90
|
-
②订户未履行本协议约定的义务;<br>
|
|
91
|
-
③订户书面申请撤销数字证书;<br>
|
|
92
|
-
④证书的安全性不能得到保证;<br>
|
|
93
|
-
⑤法律、行政法规规定的其他情况。<br>
|
|
94
|
-
5、CFCA将对订户申请数字证书时提交的信息进行审核,提供证书生命周期內的相关服务,同时向相关方提供查询服务。CFCA及其注册机构均有义务保护订户隐私信息安全性。<br>
|
|
95
|
-
6、根据《电子签名法》的规定,订户依法使用CFCA提供的认证服务进行民事活动遭受损失的,CFCA将给予相应赔偿,除非CFCA能够证明其提供的服务是按照《电子签名法》等相关法律法规和CFCA向主管部门备案的CPS实施的。以下损失不在赔偿之列:<br>
|
|
96
|
-
①任何直接或间接的利润或收入损失、信誉或商誉损害、任何商机或契机损失、失去项目、以及失去或无法使用任何数据、无法使用任何设备、无法使用任何软件;<br>
|
|
97
|
-
②由上述损失相应生成或附带引起的损失或损害;<br>
|
|
98
|
-
7、以下损失CFCA将不承担责任:<br>
|
|
99
|
-
①非因CFCA的行为而导致的损失;<br>
|
|
100
|
-
②因不可抗力而导致的损失,如罢工、战争、灾害、恶意代码病毒等。<br>
|
|
101
|
-
8、CFCA对企业订户申请的数字证书的赔偿上限为人民币捌拾万元整,即¥800,000.00元;对个人订户申请的数字证书订户的赔偿上限为人民币贰万元整,即¥20,000.00元。<br>
|
|
102
|
-
三、其他<br>
|
|
103
|
-
1、本协议中涉及“原RA”的条款若因原RA合并或撤销,即原RA不存在,则业务的受理与开展应到另行指定的RA进行。<br>
|
|
104
|
-
2、建议订户经常浏览CFCA网站,以便及时了解CFCA有关证书管理、《CFCA电子认证业务规则》和本协议变更公示等方面的信息。<br>
|
|
105
|
-
3、CFCA有权对本协议进行修订,修订后的本协议将公布于CFCA网站(www.cfca.com.cn)。如订户在公布修订的1个月后继续使用CFCA提供的数字证书服务,即表明同意接受此等修订的约束。如果订户不予接受本协议中的约束,订户可以在上述期限内单方以书面形式向RA申请停止使用证书。<br>
|
|
106
|
-
4、因依据CFCA的电子认证服务而发生的争议,双方先协商解决(必要时CFCA将召集业内专家组成专家小组,详细流程参见CPS的相关条款),双方不能达成一致意见的,将提交北京仲裁委员会申请仲裁。<br>
|
|
107
|
-
本协议在订户完成CFCA数字证书的下载或初次使用时即为生效。
|
|
108
|
-
</div>
|
|
109
|
-
<div class="textRight content">
|
|
110
|
-
<div>中金金融认证中心有限公司</div>
|
|
111
|
-
<div>(中国金融认证中心)</div>
|
|
112
|
-
<div>2015年8月4日</div>
|
|
113
|
-
</div>
|
|
114
|
-
<div class="btnWrapper">
|
|
115
|
-
<van-button
|
|
116
|
-
type="primary"
|
|
117
|
-
@click="goRead"
|
|
118
|
-
>
|
|
119
|
-
我已阅读
|
|
120
|
-
</van-button>
|
|
121
|
-
</div>
|
|
122
|
-
</div>
|
|
123
|
-
</van-popup>
|
|
124
|
-
<div
|
|
125
|
-
class="tips transform90"
|
|
126
|
-
v-if="tips !== ''"
|
|
127
|
-
>
|
|
128
|
-
{{tips}}
|
|
129
|
-
<!-- <p
|
|
130
|
-
class="tipsConfirm"
|
|
131
|
-
@click="tipsConfirm"
|
|
132
|
-
>
|
|
133
|
-
确定
|
|
134
|
-
</p> -->
|
|
135
|
-
</div>
|
|
136
|
-
</div>
|
|
137
|
-
</template>
|
|
138
|
-
|
|
139
|
-
<script>
|
|
140
|
-
import Vue from 'vue';
|
|
141
|
-
import { Checkbox, Popup, Icon, Toast } from 'vant';
|
|
142
|
-
import config from '../assets/config.js'
|
|
143
|
-
import base2 from './base2.js'
|
|
144
|
-
import SignaturePad from 'signature_pad'
|
|
145
|
-
import { dataURLtoFile } from '../assets/compressImg'
|
|
146
|
-
Vue.use(Checkbox).use(Popup).use(Icon).use(Toast)
|
|
147
|
-
export default {
|
|
148
|
-
name: "bs-sign",
|
|
149
|
-
mixins: [base2],
|
|
150
|
-
props: {
|
|
151
|
-
|
|
152
|
-
},
|
|
153
|
-
data() {
|
|
154
|
-
return {
|
|
155
|
-
validateCtl:true,
|
|
156
|
-
width: 300,
|
|
157
|
-
canvas2Width: 300,
|
|
158
|
-
height: 500,
|
|
159
|
-
checked: false, // 复选框开关
|
|
160
|
-
signaturePad: null, // 签字版插件实例化的对象
|
|
161
|
-
showRead: false, // 展示阅读的开关
|
|
162
|
-
isRead: false, // 是否阅读提示信息
|
|
163
|
-
tips: '' // 提示信息
|
|
164
|
-
}
|
|
165
|
-
},
|
|
166
|
-
mounted() {
|
|
167
|
-
this.initCavans()
|
|
168
|
-
},
|
|
169
|
-
watch:{
|
|
170
|
-
isRead(newVal) {
|
|
171
|
-
if (newVal) {
|
|
172
|
-
this.checked = true
|
|
173
|
-
this.tips = ''
|
|
174
|
-
} else {
|
|
175
|
-
this.checked = false
|
|
176
|
-
}
|
|
177
|
-
},
|
|
178
|
-
checked(newVal) {
|
|
179
|
-
if (newVal) this.tips = ''
|
|
180
|
-
},
|
|
181
|
-
tips(newVal) {
|
|
182
|
-
debugger
|
|
183
|
-
if (newVal) {
|
|
184
|
-
setTimeout(() => {
|
|
185
|
-
this.tips = ''
|
|
186
|
-
}, 2000)
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
},
|
|
190
|
-
computed:{
|
|
191
|
-
},
|
|
192
|
-
methods: {
|
|
193
|
-
createDefaultModel() {
|
|
194
|
-
return {
|
|
195
|
-
expired : -1,
|
|
196
|
-
buzId: '1111',
|
|
197
|
-
buz: 'SelfReturnVisit',
|
|
198
|
-
domain: 'capp',
|
|
199
|
-
type: 'BSSign',
|
|
200
|
-
value: ''
|
|
201
|
-
}
|
|
202
|
-
},
|
|
203
|
-
tipsConfirm() {
|
|
204
|
-
this.tips = ''
|
|
205
|
-
},
|
|
206
|
-
back() {
|
|
207
|
-
this.$emit('back',function(){
|
|
208
|
-
|
|
209
|
-
},this.fullName)
|
|
210
|
-
},
|
|
211
|
-
clear() {
|
|
212
|
-
this.signaturePad.clear()
|
|
213
|
-
},
|
|
214
|
-
rotateImage(direction = 'l') {
|
|
215
|
-
const canvas = document.querySelector(".canvasPart")
|
|
216
|
-
const ctx1 = canvas.getContext("2d");
|
|
217
|
-
const imgData = ctx1.getImageData(0, 0, this.width, this.height)
|
|
218
|
-
const cvs = document.querySelector('.canvas2')
|
|
219
|
-
const ctx = cvs.getContext("2d");
|
|
220
|
-
ctx.putImageData(imgData, 0, 0)
|
|
221
|
-
const { width: W, height: H } = canvas
|
|
222
|
-
let imgDt0 = ctx.getImageData(0, 0, W, H)
|
|
223
|
-
let imgDt1 = new ImageData(H, W)
|
|
224
|
-
let imgDt2 = new ImageData(H, W)
|
|
225
|
-
let dt0 = imgDt0.data
|
|
226
|
-
let dt1 = imgDt1.data
|
|
227
|
-
let dt2 = imgDt2.data
|
|
228
|
-
|
|
229
|
-
let r1
|
|
230
|
-
let r = r1 = 0
|
|
231
|
-
for (let y = 0, lenH = H; y < lenH; y++) {
|
|
232
|
-
for (let x = 0, lenW = W; x < lenW; x++) {
|
|
233
|
-
r = (x + lenW * y) * 4
|
|
234
|
-
r1 = (y + lenH * x) * 4
|
|
235
|
-
dt1[r1 + 0] = dt0[r + 0]
|
|
236
|
-
dt1[r1 + 1] = dt0[r + 1]
|
|
237
|
-
dt1[r1 + 2] = dt0[r + 2]
|
|
238
|
-
dt1[r1 + 3] = dt0[r + 3]
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
for (let y = 0, lenH = W; y < lenH; y++) {
|
|
243
|
-
for (let x = 0, lenW = H; x < lenW; x++) {
|
|
244
|
-
r = (x + lenW * y) * 4
|
|
245
|
-
r1 = direction === 'l'
|
|
246
|
-
? (x + lenW * (lenH - 1 - y)) * 4
|
|
247
|
-
: ((lenW - 1 - x) + lenW * y) * 4
|
|
248
|
-
dt2[r1 + 0] = dt1[r + 0]
|
|
249
|
-
dt2[r1 + 1] = dt1[r + 1]
|
|
250
|
-
dt2[r1 + 2] = dt1[r + 2]
|
|
251
|
-
dt2[r1 + 3] = dt1[r + 3]
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
cvs.width = H
|
|
257
|
-
cvs.height = W
|
|
258
|
-
ctx.clearRect(0, 0, W, H)
|
|
259
|
-
ctx.putImageData(imgDt2, 0, 0, 0, 0, H, W)
|
|
260
|
-
return cvs.toDataURL('')
|
|
261
|
-
},
|
|
262
|
-
confirm() {
|
|
263
|
-
console.log(this.signaturePad.isEmpty())
|
|
264
|
-
if (this.signaturePad.isEmpty()) {
|
|
265
|
-
this.tips = '请先签字'
|
|
266
|
-
} else if (!this.checked) {
|
|
267
|
-
this.tips = '请先阅读《CFCA数字证书服务协议》,并且勾选'
|
|
268
|
-
} else {
|
|
269
|
-
const uploadFile = this.rotateImage()
|
|
270
|
-
this.fileName = (((1+Math.random())*0x10000)|0).toString(16).substring(1) + '.png'
|
|
271
|
-
const fileObj = dataURLtoFile(uploadFile, this.fileName)
|
|
272
|
-
// this.fileObj = dataURLtoFile(this.signImg, this.fileName)
|
|
273
|
-
this._upLoadFile(fileObj)
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
},
|
|
277
|
-
goRead() {
|
|
278
|
-
|
|
279
|
-
this.isRead = true
|
|
280
|
-
this.showRead = !this.showRead
|
|
281
|
-
},
|
|
282
|
-
initCavans() {
|
|
283
|
-
let vm = this
|
|
284
|
-
this.canvas2Width = window.screen.availWidth
|
|
285
|
-
this.width = this.canvas2Width * .86
|
|
286
|
-
this.height = window.screen.availHeight - 50
|
|
287
|
-
const canvas = document.querySelector(".canvasPart")
|
|
288
|
-
this.signaturePad = new SignaturePad(canvas, {
|
|
289
|
-
minWidth: 2,
|
|
290
|
-
maxWidth: 3,
|
|
291
|
-
onBegin: vm.onBegin
|
|
292
|
-
})
|
|
293
|
-
|
|
294
|
-
},
|
|
295
|
-
// onBegin() {
|
|
296
|
-
// if (!this.checked) {
|
|
297
|
-
// // Toast.fail('请先阅读《CFCA数字证书服务协议》,并且勾选');
|
|
298
|
-
// this.tips = '请先阅读《CFCA数字证书服务协议》,并且勾选'
|
|
299
|
-
// } else {
|
|
300
|
-
// this.tips = ''
|
|
301
|
-
// }
|
|
302
|
-
// },
|
|
303
|
-
_upLoadFile(fileObj){
|
|
304
|
-
let self = this
|
|
305
|
-
this.$http.uploadFile({
|
|
306
|
-
process: function(msg){
|
|
307
|
-
// if(self.model.preview){
|
|
308
|
-
// self.fileList[0].message = msg
|
|
309
|
-
// }
|
|
310
|
-
// self.session.sys.loadmsg = msg
|
|
311
|
-
},
|
|
312
|
-
file: fileObj,
|
|
313
|
-
name: this.fileName,
|
|
314
|
-
domain: this.model.domain,
|
|
315
|
-
buz: this.model.buz,
|
|
316
|
-
buzId: this.model.buzId,
|
|
317
|
-
expired: this.model.expired,
|
|
318
|
-
actions: ''
|
|
319
|
-
},
|
|
320
|
-
false, true, false).then((data) => {
|
|
321
|
-
|
|
322
|
-
self.model.data = data
|
|
323
|
-
self.model.value = data.fileId + '.' + data.ext
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
// self.$ak.msg.toast('上传成功')
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
self.$emit('done', function(){
|
|
330
|
-
|
|
331
|
-
},self.fullName)
|
|
332
|
-
|
|
333
|
-
}).catch(function(err) {
|
|
334
|
-
// console.log(err)
|
|
335
|
-
// self.fileList.splice(0,self.fileList.length)
|
|
336
|
-
self.$emit('fail',function(){
|
|
337
|
-
|
|
338
|
-
},self.fullName)
|
|
339
|
-
})
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
</script>
|
|
345
|
-
|
|
346
|
-
<style scoped lang="less">
|
|
347
|
-
.signWrapper{
|
|
348
|
-
position: relative;
|
|
349
|
-
z-index: 10;
|
|
350
|
-
display: flex;
|
|
351
|
-
width: 100vw;
|
|
352
|
-
// height: calc(100vh - 50px);
|
|
353
|
-
height: 100vh;
|
|
354
|
-
overflow-x: hidden;
|
|
355
|
-
.canvasPart {
|
|
356
|
-
// width: 300px;
|
|
357
|
-
// height: 360px;
|
|
358
|
-
}
|
|
359
|
-
.controlPart {
|
|
360
|
-
width: 14%;
|
|
361
|
-
height: 100%;
|
|
362
|
-
border-right: 1px solid #bcbcbc;
|
|
363
|
-
.back {
|
|
364
|
-
background: url('../assets/img/sign_close.png') no-repeat center center;
|
|
365
|
-
}
|
|
366
|
-
.clear {
|
|
367
|
-
background: url('../assets/img/sign_clear.png') no-repeat center center;
|
|
368
|
-
}
|
|
369
|
-
.confirm {
|
|
370
|
-
background: url('../assets/img/sign_sure.png') no-repeat center center;
|
|
371
|
-
|
|
372
|
-
}
|
|
373
|
-
.btn {
|
|
374
|
-
margin-bottom: 50px;
|
|
375
|
-
width: 14vw;
|
|
376
|
-
height: 14vw;
|
|
377
|
-
text-align: center;
|
|
378
|
-
line-height: 14vw;
|
|
379
|
-
font-size: 24px;
|
|
380
|
-
}
|
|
381
|
-
.readCheck {
|
|
382
|
-
font-size: 14px;
|
|
383
|
-
white-space:nowrap;
|
|
384
|
-
}
|
|
385
|
-
.checked {
|
|
386
|
-
margin-bottom: 10px;
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
}
|
|
390
|
-
.transform90 {
|
|
391
|
-
transform: rotate(90deg);
|
|
392
|
-
}
|
|
393
|
-
.serviceRule{
|
|
394
|
-
padding: 30px;
|
|
395
|
-
line-height: 28px;
|
|
396
|
-
.textCenter{
|
|
397
|
-
text-align: center;
|
|
398
|
-
}
|
|
399
|
-
.bigFont {
|
|
400
|
-
font-size: 18px;
|
|
401
|
-
}
|
|
402
|
-
.centerFont {
|
|
403
|
-
font-size: 14px;
|
|
404
|
-
}
|
|
405
|
-
.textRight{
|
|
406
|
-
text-align: right;
|
|
407
|
-
padding-left: 20%;
|
|
408
|
-
}
|
|
409
|
-
.content{
|
|
410
|
-
// line-height: 1.5;
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
.tips {
|
|
414
|
-
position: absolute;
|
|
415
|
-
top: 40%;
|
|
416
|
-
left: 33%;
|
|
417
|
-
width: 30vh;
|
|
418
|
-
// height: 20vw;
|
|
419
|
-
background-color: rgba(0,0,0,.7);
|
|
420
|
-
padding: 16px;
|
|
421
|
-
color: #fff;
|
|
422
|
-
font-size: 14px;
|
|
423
|
-
line-height: 20px;
|
|
424
|
-
border-radius: 8px;
|
|
425
|
-
.tipsConfirm {
|
|
426
|
-
width: 100%;
|
|
427
|
-
height: 2rem;
|
|
428
|
-
border: 1px solid #fff;
|
|
429
|
-
text-align: center;
|
|
430
|
-
line-height: 2rem;
|
|
431
|
-
border-radius: .5rem;
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
.canvas2 {
|
|
436
|
-
position: absolute;
|
|
437
|
-
// top: 100vh;
|
|
438
|
-
z-index: -100;
|
|
439
|
-
}
|
|
440
|
-
.btnWrapper {
|
|
441
|
-
width: 100%;
|
|
442
|
-
border-radius: 5px;
|
|
443
|
-
overflow: hidden;
|
|
444
|
-
margin-top: 10px;
|
|
445
|
-
button {
|
|
446
|
-
width: 100%;
|
|
447
|
-
background: linear-gradient(to right, #c5a86e, #decba6);
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
}
|
|
451
|
-
/deep/ .van-button--primary {
|
|
452
|
-
border: 0;
|
|
453
|
-
}
|
|
454
|
-
</style>
|
|
1
|
+
<template>
|
|
2
|
+
<div class="signWrapper">
|
|
3
|
+
<div class="controlPart">
|
|
4
|
+
<van-icon
|
|
5
|
+
class="btn transform90"
|
|
6
|
+
name="cross"
|
|
7
|
+
@click="back"
|
|
8
|
+
/>
|
|
9
|
+
<van-icon
|
|
10
|
+
class="btn transform90"
|
|
11
|
+
name="delete"
|
|
12
|
+
@click="clear"
|
|
13
|
+
/>
|
|
14
|
+
<van-icon
|
|
15
|
+
class="btn transform90"
|
|
16
|
+
name="success"
|
|
17
|
+
@click="confirm"
|
|
18
|
+
/>
|
|
19
|
+
<div class="checked transform90">
|
|
20
|
+
<van-checkbox v-model="checked"></van-checkbox>
|
|
21
|
+
</div>
|
|
22
|
+
<div
|
|
23
|
+
class="readCheck transform90"
|
|
24
|
+
@click="goRead"
|
|
25
|
+
>
|
|
26
|
+
已阅读《CFCA数字证明服务协议》
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
<canvas
|
|
30
|
+
class="canvasPart"
|
|
31
|
+
:width="width"
|
|
32
|
+
:height="height"
|
|
33
|
+
>
|
|
34
|
+
</canvas>
|
|
35
|
+
<canvas
|
|
36
|
+
class="canvas2"
|
|
37
|
+
:width="canvas2Width"
|
|
38
|
+
:height="height"
|
|
39
|
+
v-show="false"
|
|
40
|
+
>
|
|
41
|
+
</canvas>
|
|
42
|
+
<van-popup
|
|
43
|
+
v-model="showRead"
|
|
44
|
+
position="right"
|
|
45
|
+
:style="{
|
|
46
|
+
width: '100%',
|
|
47
|
+
height: '100%'
|
|
48
|
+
}"
|
|
49
|
+
>
|
|
50
|
+
<div class='serviceRule'>
|
|
51
|
+
<!-- <p @click="goRead"><van-icon name="arrow-left" /></p> -->
|
|
52
|
+
<h4 class='textCenter bigFont'>CFCA数字证书服务协议</h4>
|
|
53
|
+
<h5 class='textCenter centerFont'>(本协议包含CFCA的免责条款,请认真阅读,尤其是粗体字内容)</h5>
|
|
54
|
+
<div class="content">
|
|
55
|
+
尊敬的网上用户:<br>
|
|
56
|
+
中金金融认证中心有限公司(即中国金融认证中心,简称“CFCA”)是经国家有关管理机关审批设立的电子认证服务机构,作为权威的第三方安全认证机构,通过数字证书注册机构(以下简称“RA”)向网上用户(以下简称“订户”)发放数字证书,为订户网上交易提供信息安全保障。
|
|
57
|
+
订户在申请使用CFCA签发的数字证书之前,应先阅读并同意"CFCA数字证书服务协议"(以下简称"本协议")。本协议构成订户与中金金融认证中心有限公司之间的权利义务约定,若不同意本协议全部或部分条款,请勿申请使用CFCA数字证书。订户一旦完成CFCA数字证书的下载或初次使用,即表明同意接受并愿意遵守本协议的所有条款。
|
|
58
|
+
一、证书订户的权利和义务<br>
|
|
59
|
+
1、订户应遵循诚实、信用原则,在向RA申请数字证书时,应当提供真实、完整、准确的信息和资料,并在这些信息、资料发生改变时及时通知原RA。如因订户故意或过失提供的资料不真实、完整、准确或资料改变后未及时通知CFCA或原RA,造成的损失由订户自己承担。<br>
|
|
60
|
+
2、在通过RA的审核、信息注册后,订户即可获得数字证书的下载凭证,订户应妥善保管下载凭证,亲自用该凭证从相关网站将数字证书下载在安全的容器里;订户也可以委托或授权他人通过其他安全的方式获得数字证书。订户获得的下载凭证为一次性使用,有效期为14天。如果在14天内没有下载数字证书,订户需要到RA重新获得下载凭证。订户应对获得的数字证书信息进行确认,首次使用,视为确认生效。<br>
|
|
61
|
+
3、订户须使用经合法途径获得的相关软件。<br>
|
|
62
|
+
4、订户应合法使用CFCA发放的数字证书,并对使用数字证书的行为负责:<br>
|
|
63
|
+
① 使用证书的行为应符合全部适用的法律法规;<br>
|
|
64
|
+
② 使用证书的行为应符合订户真实意愿或者仅为了处理已获得授权的事务;<br>
|
|
65
|
+
③ 使用证书的行为应符合本协议约定的使用范围和条件。<br>
|
|
66
|
+
5、订户应采取必要手段来保障证书的私钥和相关密码的安全存储、使用备份等。EV代码签名证书必须被保存在满足FIPS-140-2或相应级别的安全介质中;如初次使用智能密码钥匙时,应修改初始的缺省密码。订户如因故意或过失导致他人盗用、冒用数字证书私钥和密码时,订户应自行承担由此产生的责任。<br>
|
|
67
|
+
6、如订户使用的数字证书私钥和密码泄漏、丢失,或者订户不希望继续使用数字证书,或者订户主体不存在,订户或法定权利人应当立即到原RA申请废止该数字证书,相关手续遵循RA的规定。CFCA收到RA的废止请求后,将在4小时之内废止该订户的数字证书。<br>
|
|
68
|
+
7、订户损害CFCA利益的,须向CFCA赔偿全部损失。这些情形包括但不限于:<br>
|
|
69
|
+
①订户在申请数字证书时没有提供真实、完整、准确信息,或在这些信息变更时未及时通知RA;<br>
|
|
70
|
+
②订户知道自己的私钥已经失密或者可能已经失密而未及时告知有关各方、并终止使用;<br>
|
|
71
|
+
③订户有其他过错或未履行本协议的相关约定。<br>
|
|
72
|
+
8、订户有按期缴纳数字证书服务费的义务,费用标准请咨询RA。<br>
|
|
73
|
+
9、CFCA有权因安全风险因素要求订户更换数字证书。订户在收到数字证书更换通知后,应在规定的期限内到原RA更换。<br>
|
|
74
|
+
10、订户申请代码签名证书后,一旦发现如下情况之一时,应当立即向CA申请吊销此证书:<br>
|
|
75
|
+
①有证据表明,此代码签名证书被用于签署可疑代码,包括但不限于病毒,木马,或者其他不恰当的程序。<br>
|
|
76
|
+
②证书中内容不再正确或不再准确。<br>
|
|
77
|
+
③此证书私钥信息已被泄露、丢失,或者其他相关部分已被错误使用。<br>
|
|
78
|
+
11、证书一旦被吊销,订户将不能再使用该证书。<br>
|
|
79
|
+
12、订户明确了解,如果CFCA发现了订户证书的不当使用,或者订户证书被用于违法甚至犯罪行为,CFCA有权直接吊销订户证书。<br>
|
|
80
|
+
13、订户在发现或怀疑由CFCA提供的认证服务造成订户的网上交易信息的泄漏和/或篡改时,应在3个月内向CFCA提出争议处理请求并通知有关各方。<br>
|
|
81
|
+
二、CFCA的服务、权利、义务、责任限制和免责<br>
|
|
82
|
+
1、CFCA依法制定电子认证业务规则(Certificate Policy Statement,以下简称“CPS”),并公布于CFCA网站(www.cfca.com.cn),明确CFCA数字证书的功能、使用证书各方的权利、义务以及CFCA的责任范围,本协议的相关条款源自CPS。<br>
|
|
83
|
+
2、CFCA为订户提供7X24小时热线支持服务(4008809888)。为保证我们的服务质量,CFCA设立了投诉电话(010-83519756),CFCA将在1个工作日内对订户的意见和建议做出响应。<br>
|
|
84
|
+
3、在订户通过安全工具使用数字证书对交易信息进行加密和签名的条件下,CFCA将保证交易信息的保密性、完整性、抗抵赖性。如果发生纠纷,CFCA将依据不同情形承担下述义务:<br>
|
|
85
|
+
①提供签发订户数字证书的CA证书。<br>
|
|
86
|
+
②提供订户数字证书在交易发生时,在或不在CFCA发布的数字证书废止列表内的证明。<br>
|
|
87
|
+
③对数字证书、数字签名、时间戳的真实性、有效性进行技术确认。<br>
|
|
88
|
+
4、有下列情形之一的,CFCA有权撤销所签发的数字证书:<br>
|
|
89
|
+
①订户申请数字证书时,提供的资料不真实;<br>
|
|
90
|
+
②订户未履行本协议约定的义务;<br>
|
|
91
|
+
③订户书面申请撤销数字证书;<br>
|
|
92
|
+
④证书的安全性不能得到保证;<br>
|
|
93
|
+
⑤法律、行政法规规定的其他情况。<br>
|
|
94
|
+
5、CFCA将对订户申请数字证书时提交的信息进行审核,提供证书生命周期內的相关服务,同时向相关方提供查询服务。CFCA及其注册机构均有义务保护订户隐私信息安全性。<br>
|
|
95
|
+
6、根据《电子签名法》的规定,订户依法使用CFCA提供的认证服务进行民事活动遭受损失的,CFCA将给予相应赔偿,除非CFCA能够证明其提供的服务是按照《电子签名法》等相关法律法规和CFCA向主管部门备案的CPS实施的。以下损失不在赔偿之列:<br>
|
|
96
|
+
①任何直接或间接的利润或收入损失、信誉或商誉损害、任何商机或契机损失、失去项目、以及失去或无法使用任何数据、无法使用任何设备、无法使用任何软件;<br>
|
|
97
|
+
②由上述损失相应生成或附带引起的损失或损害;<br>
|
|
98
|
+
7、以下损失CFCA将不承担责任:<br>
|
|
99
|
+
①非因CFCA的行为而导致的损失;<br>
|
|
100
|
+
②因不可抗力而导致的损失,如罢工、战争、灾害、恶意代码病毒等。<br>
|
|
101
|
+
8、CFCA对企业订户申请的数字证书的赔偿上限为人民币捌拾万元整,即¥800,000.00元;对个人订户申请的数字证书订户的赔偿上限为人民币贰万元整,即¥20,000.00元。<br>
|
|
102
|
+
三、其他<br>
|
|
103
|
+
1、本协议中涉及“原RA”的条款若因原RA合并或撤销,即原RA不存在,则业务的受理与开展应到另行指定的RA进行。<br>
|
|
104
|
+
2、建议订户经常浏览CFCA网站,以便及时了解CFCA有关证书管理、《CFCA电子认证业务规则》和本协议变更公示等方面的信息。<br>
|
|
105
|
+
3、CFCA有权对本协议进行修订,修订后的本协议将公布于CFCA网站(www.cfca.com.cn)。如订户在公布修订的1个月后继续使用CFCA提供的数字证书服务,即表明同意接受此等修订的约束。如果订户不予接受本协议中的约束,订户可以在上述期限内单方以书面形式向RA申请停止使用证书。<br>
|
|
106
|
+
4、因依据CFCA的电子认证服务而发生的争议,双方先协商解决(必要时CFCA将召集业内专家组成专家小组,详细流程参见CPS的相关条款),双方不能达成一致意见的,将提交北京仲裁委员会申请仲裁。<br>
|
|
107
|
+
本协议在订户完成CFCA数字证书的下载或初次使用时即为生效。
|
|
108
|
+
</div>
|
|
109
|
+
<div class="textRight content">
|
|
110
|
+
<div>中金金融认证中心有限公司</div>
|
|
111
|
+
<div>(中国金融认证中心)</div>
|
|
112
|
+
<div>2015年8月4日</div>
|
|
113
|
+
</div>
|
|
114
|
+
<div class="btnWrapper">
|
|
115
|
+
<van-button
|
|
116
|
+
type="primary"
|
|
117
|
+
@click="goRead"
|
|
118
|
+
>
|
|
119
|
+
我已阅读
|
|
120
|
+
</van-button>
|
|
121
|
+
</div>
|
|
122
|
+
</div>
|
|
123
|
+
</van-popup>
|
|
124
|
+
<div
|
|
125
|
+
class="tips transform90"
|
|
126
|
+
v-if="tips !== ''"
|
|
127
|
+
>
|
|
128
|
+
{{tips}}
|
|
129
|
+
<!-- <p
|
|
130
|
+
class="tipsConfirm"
|
|
131
|
+
@click="tipsConfirm"
|
|
132
|
+
>
|
|
133
|
+
确定
|
|
134
|
+
</p> -->
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
</template>
|
|
138
|
+
|
|
139
|
+
<script>
|
|
140
|
+
import Vue from 'vue';
|
|
141
|
+
import { Checkbox, Popup, Icon, Toast } from 'vant';
|
|
142
|
+
import config from '../assets/config.js'
|
|
143
|
+
import base2 from './base2.js'
|
|
144
|
+
import SignaturePad from 'signature_pad'
|
|
145
|
+
import { dataURLtoFile } from '../assets/compressImg'
|
|
146
|
+
Vue.use(Checkbox).use(Popup).use(Icon).use(Toast)
|
|
147
|
+
export default {
|
|
148
|
+
name: "bs-sign",
|
|
149
|
+
mixins: [base2],
|
|
150
|
+
props: {
|
|
151
|
+
|
|
152
|
+
},
|
|
153
|
+
data() {
|
|
154
|
+
return {
|
|
155
|
+
validateCtl:true,
|
|
156
|
+
width: 300,
|
|
157
|
+
canvas2Width: 300,
|
|
158
|
+
height: 500,
|
|
159
|
+
checked: false, // 复选框开关
|
|
160
|
+
signaturePad: null, // 签字版插件实例化的对象
|
|
161
|
+
showRead: false, // 展示阅读的开关
|
|
162
|
+
isRead: false, // 是否阅读提示信息
|
|
163
|
+
tips: '' // 提示信息
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
mounted() {
|
|
167
|
+
this.initCavans()
|
|
168
|
+
},
|
|
169
|
+
watch:{
|
|
170
|
+
isRead(newVal) {
|
|
171
|
+
if (newVal) {
|
|
172
|
+
this.checked = true
|
|
173
|
+
this.tips = ''
|
|
174
|
+
} else {
|
|
175
|
+
this.checked = false
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
checked(newVal) {
|
|
179
|
+
if (newVal) this.tips = ''
|
|
180
|
+
},
|
|
181
|
+
tips(newVal) {
|
|
182
|
+
debugger
|
|
183
|
+
if (newVal) {
|
|
184
|
+
setTimeout(() => {
|
|
185
|
+
this.tips = ''
|
|
186
|
+
}, 2000)
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
computed:{
|
|
191
|
+
},
|
|
192
|
+
methods: {
|
|
193
|
+
createDefaultModel() {
|
|
194
|
+
return {
|
|
195
|
+
expired : -1,
|
|
196
|
+
buzId: '1111',
|
|
197
|
+
buz: 'SelfReturnVisit',
|
|
198
|
+
domain: 'capp',
|
|
199
|
+
type: 'BSSign',
|
|
200
|
+
value: ''
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
tipsConfirm() {
|
|
204
|
+
this.tips = ''
|
|
205
|
+
},
|
|
206
|
+
back() {
|
|
207
|
+
this.$emit('back',function(){
|
|
208
|
+
|
|
209
|
+
},this.fullName)
|
|
210
|
+
},
|
|
211
|
+
clear() {
|
|
212
|
+
this.signaturePad.clear()
|
|
213
|
+
},
|
|
214
|
+
rotateImage(direction = 'l') {
|
|
215
|
+
const canvas = document.querySelector(".canvasPart")
|
|
216
|
+
const ctx1 = canvas.getContext("2d");
|
|
217
|
+
const imgData = ctx1.getImageData(0, 0, this.width, this.height)
|
|
218
|
+
const cvs = document.querySelector('.canvas2')
|
|
219
|
+
const ctx = cvs.getContext("2d");
|
|
220
|
+
ctx.putImageData(imgData, 0, 0)
|
|
221
|
+
const { width: W, height: H } = canvas
|
|
222
|
+
let imgDt0 = ctx.getImageData(0, 0, W, H)
|
|
223
|
+
let imgDt1 = new ImageData(H, W)
|
|
224
|
+
let imgDt2 = new ImageData(H, W)
|
|
225
|
+
let dt0 = imgDt0.data
|
|
226
|
+
let dt1 = imgDt1.data
|
|
227
|
+
let dt2 = imgDt2.data
|
|
228
|
+
|
|
229
|
+
let r1
|
|
230
|
+
let r = r1 = 0
|
|
231
|
+
for (let y = 0, lenH = H; y < lenH; y++) {
|
|
232
|
+
for (let x = 0, lenW = W; x < lenW; x++) {
|
|
233
|
+
r = (x + lenW * y) * 4
|
|
234
|
+
r1 = (y + lenH * x) * 4
|
|
235
|
+
dt1[r1 + 0] = dt0[r + 0]
|
|
236
|
+
dt1[r1 + 1] = dt0[r + 1]
|
|
237
|
+
dt1[r1 + 2] = dt0[r + 2]
|
|
238
|
+
dt1[r1 + 3] = dt0[r + 3]
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
for (let y = 0, lenH = W; y < lenH; y++) {
|
|
243
|
+
for (let x = 0, lenW = H; x < lenW; x++) {
|
|
244
|
+
r = (x + lenW * y) * 4
|
|
245
|
+
r1 = direction === 'l'
|
|
246
|
+
? (x + lenW * (lenH - 1 - y)) * 4
|
|
247
|
+
: ((lenW - 1 - x) + lenW * y) * 4
|
|
248
|
+
dt2[r1 + 0] = dt1[r + 0]
|
|
249
|
+
dt2[r1 + 1] = dt1[r + 1]
|
|
250
|
+
dt2[r1 + 2] = dt1[r + 2]
|
|
251
|
+
dt2[r1 + 3] = dt1[r + 3]
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
cvs.width = H
|
|
257
|
+
cvs.height = W
|
|
258
|
+
ctx.clearRect(0, 0, W, H)
|
|
259
|
+
ctx.putImageData(imgDt2, 0, 0, 0, 0, H, W)
|
|
260
|
+
return cvs.toDataURL('')
|
|
261
|
+
},
|
|
262
|
+
confirm() {
|
|
263
|
+
console.log(this.signaturePad.isEmpty())
|
|
264
|
+
if (this.signaturePad.isEmpty()) {
|
|
265
|
+
this.tips = '请先签字'
|
|
266
|
+
} else if (!this.checked) {
|
|
267
|
+
this.tips = '请先阅读《CFCA数字证书服务协议》,并且勾选'
|
|
268
|
+
} else {
|
|
269
|
+
const uploadFile = this.rotateImage()
|
|
270
|
+
this.fileName = (((1+Math.random())*0x10000)|0).toString(16).substring(1) + '.png'
|
|
271
|
+
const fileObj = dataURLtoFile(uploadFile, this.fileName)
|
|
272
|
+
// this.fileObj = dataURLtoFile(this.signImg, this.fileName)
|
|
273
|
+
this._upLoadFile(fileObj)
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
},
|
|
277
|
+
goRead() {
|
|
278
|
+
|
|
279
|
+
this.isRead = true
|
|
280
|
+
this.showRead = !this.showRead
|
|
281
|
+
},
|
|
282
|
+
initCavans() {
|
|
283
|
+
let vm = this
|
|
284
|
+
this.canvas2Width = window.screen.availWidth
|
|
285
|
+
this.width = this.canvas2Width * .86
|
|
286
|
+
this.height = window.screen.availHeight - 50
|
|
287
|
+
const canvas = document.querySelector(".canvasPart")
|
|
288
|
+
this.signaturePad = new SignaturePad(canvas, {
|
|
289
|
+
minWidth: 2,
|
|
290
|
+
maxWidth: 3,
|
|
291
|
+
onBegin: vm.onBegin
|
|
292
|
+
})
|
|
293
|
+
|
|
294
|
+
},
|
|
295
|
+
// onBegin() {
|
|
296
|
+
// if (!this.checked) {
|
|
297
|
+
// // Toast.fail('请先阅读《CFCA数字证书服务协议》,并且勾选');
|
|
298
|
+
// this.tips = '请先阅读《CFCA数字证书服务协议》,并且勾选'
|
|
299
|
+
// } else {
|
|
300
|
+
// this.tips = ''
|
|
301
|
+
// }
|
|
302
|
+
// },
|
|
303
|
+
_upLoadFile(fileObj){
|
|
304
|
+
let self = this
|
|
305
|
+
this.$http.uploadFile({
|
|
306
|
+
process: function(msg){
|
|
307
|
+
// if(self.model.preview){
|
|
308
|
+
// self.fileList[0].message = msg
|
|
309
|
+
// }
|
|
310
|
+
// self.session.sys.loadmsg = msg
|
|
311
|
+
},
|
|
312
|
+
file: fileObj,
|
|
313
|
+
name: this.fileName,
|
|
314
|
+
domain: this.model.domain,
|
|
315
|
+
buz: this.model.buz,
|
|
316
|
+
buzId: this.model.buzId,
|
|
317
|
+
expired: this.model.expired,
|
|
318
|
+
actions: ''
|
|
319
|
+
},
|
|
320
|
+
false, true, false).then((data) => {
|
|
321
|
+
|
|
322
|
+
self.model.data = data
|
|
323
|
+
self.model.value = data.fileId + '.' + data.ext
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
// self.$ak.msg.toast('上传成功')
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
self.$emit('done', function(){
|
|
330
|
+
|
|
331
|
+
},self.fullName)
|
|
332
|
+
|
|
333
|
+
}).catch(function(err) {
|
|
334
|
+
// console.log(err)
|
|
335
|
+
// self.fileList.splice(0,self.fileList.length)
|
|
336
|
+
self.$emit('fail',function(){
|
|
337
|
+
|
|
338
|
+
},self.fullName)
|
|
339
|
+
})
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
</script>
|
|
345
|
+
|
|
346
|
+
<style scoped lang="less">
|
|
347
|
+
.signWrapper{
|
|
348
|
+
position: relative;
|
|
349
|
+
z-index: 10;
|
|
350
|
+
display: flex;
|
|
351
|
+
width: 100vw;
|
|
352
|
+
// height: calc(100vh - 50px);
|
|
353
|
+
height: 100vh;
|
|
354
|
+
overflow-x: hidden;
|
|
355
|
+
.canvasPart {
|
|
356
|
+
// width: 300px;
|
|
357
|
+
// height: 360px;
|
|
358
|
+
}
|
|
359
|
+
.controlPart {
|
|
360
|
+
width: 14%;
|
|
361
|
+
height: 100%;
|
|
362
|
+
border-right: 1px solid #bcbcbc;
|
|
363
|
+
.back {
|
|
364
|
+
background: url('../assets/img/sign_close.png') no-repeat center center;
|
|
365
|
+
}
|
|
366
|
+
.clear {
|
|
367
|
+
background: url('../assets/img/sign_clear.png') no-repeat center center;
|
|
368
|
+
}
|
|
369
|
+
.confirm {
|
|
370
|
+
background: url('../assets/img/sign_sure.png') no-repeat center center;
|
|
371
|
+
|
|
372
|
+
}
|
|
373
|
+
.btn {
|
|
374
|
+
margin-bottom: 50px;
|
|
375
|
+
width: 14vw;
|
|
376
|
+
height: 14vw;
|
|
377
|
+
text-align: center;
|
|
378
|
+
line-height: 14vw;
|
|
379
|
+
font-size: 24px;
|
|
380
|
+
}
|
|
381
|
+
.readCheck {
|
|
382
|
+
font-size: 14px;
|
|
383
|
+
white-space:nowrap;
|
|
384
|
+
}
|
|
385
|
+
.checked {
|
|
386
|
+
margin-bottom: 10px;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
}
|
|
390
|
+
.transform90 {
|
|
391
|
+
transform: rotate(90deg);
|
|
392
|
+
}
|
|
393
|
+
.serviceRule{
|
|
394
|
+
padding: 30px;
|
|
395
|
+
line-height: 28px;
|
|
396
|
+
.textCenter{
|
|
397
|
+
text-align: center;
|
|
398
|
+
}
|
|
399
|
+
.bigFont {
|
|
400
|
+
font-size: 18px;
|
|
401
|
+
}
|
|
402
|
+
.centerFont {
|
|
403
|
+
font-size: 14px;
|
|
404
|
+
}
|
|
405
|
+
.textRight{
|
|
406
|
+
text-align: right;
|
|
407
|
+
padding-left: 20%;
|
|
408
|
+
}
|
|
409
|
+
.content{
|
|
410
|
+
// line-height: 1.5;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
.tips {
|
|
414
|
+
position: absolute;
|
|
415
|
+
top: 40%;
|
|
416
|
+
left: 33%;
|
|
417
|
+
width: 30vh;
|
|
418
|
+
// height: 20vw;
|
|
419
|
+
background-color: rgba(0,0,0,.7);
|
|
420
|
+
padding: 16px;
|
|
421
|
+
color: #fff;
|
|
422
|
+
font-size: 14px;
|
|
423
|
+
line-height: 20px;
|
|
424
|
+
border-radius: 8px;
|
|
425
|
+
.tipsConfirm {
|
|
426
|
+
width: 100%;
|
|
427
|
+
height: 2rem;
|
|
428
|
+
border: 1px solid #fff;
|
|
429
|
+
text-align: center;
|
|
430
|
+
line-height: 2rem;
|
|
431
|
+
border-radius: .5rem;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
.canvas2 {
|
|
436
|
+
position: absolute;
|
|
437
|
+
// top: 100vh;
|
|
438
|
+
z-index: -100;
|
|
439
|
+
}
|
|
440
|
+
.btnWrapper {
|
|
441
|
+
width: 100%;
|
|
442
|
+
border-radius: 5px;
|
|
443
|
+
overflow: hidden;
|
|
444
|
+
margin-top: 10px;
|
|
445
|
+
button {
|
|
446
|
+
width: 100%;
|
|
447
|
+
background: linear-gradient(to right, #c5a86e, #decba6);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
}
|
|
451
|
+
/deep/ .van-button--primary {
|
|
452
|
+
border: 0;
|
|
453
|
+
}
|
|
454
|
+
</style>
|