Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
提交反馈
为 GitLab 提交贡献
登录
切换导航
P
pica-h5-agreement
项目
项目
详情
动态
版本
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
收起侧边栏
Close sidebar
动态
分支图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
com.pica.cloud.foundation.frontend
pica-h5-agreement
提交
0fbeb9e9
提交
0fbeb9e9
编写于
11月 14, 2019
作者:
huangwensu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
修改组件
上级
18969e08
变更
6
显示空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
16 行增加
和
964 行删除
+16
-964
agreement.less
src/agreement.less
+0
-0
agreement.vue
src/agreement.vue
+16
-0
field.vue
src/field.vue
+0
-234
index.js
src/index.js
+0
-7
login.vue
src/login.vue
+0
-538
prototype.js
src/prototype.js
+0
-185
未找到文件。
src/
login
.less
→
src/
agreement
.less
浏览文件 @
0fbeb9e9
文件已移动
src/agreement.vue
0 → 100644
浏览文件 @
0fbeb9e9
<
template
>
<div>
协议
</div>
</
template
>
<
script
>
export
default
{
data
()
{
},
created
()
{
},
methods
:
{
}
}
</
script
>
\ No newline at end of file
src/field.vue
已删除
100644 → 0
浏览文件 @
18969e08
<
template
>
<div
class=
"lux-cell lux-field"
>
<div
v-if=
"leftIcon"
class=
"lux-field__left-icon"
>
<i
class=
"lux-icon left-icon"
:class=
"leftIcon"
></i>
</div>
<div
v-if=
"label"
class=
"lux-field__label"
>
<span>
{{
label
}}
</span>
</div>
<div
class=
"lux-field__value"
>
<div
class=
"lux-field__body"
>
<input
class=
"lux-field__control"
ref=
"input"
:type=
"type"
:value=
"value"
:placeholder=
"$attrs.placeholder"
:maxlength=
"$attrs.maxlength || maxlength"
v-on=
"listeners"
>
<i
v-if=
"showClear"
class=
"lux-icon lux-icon-clear"
@
click=
"onClear"
></i>
<div
v-if=
"rightIcon"
class=
"lux-field__right-icon"
>
<i
class=
"lux-icon right-icon"
:class=
"rightIcon"
@
click=
"onClickRightIcon"
></i>
</div>
<slot
name=
"button"
/>
<slot
name=
"img"
/>
</div>
</div>
</div>
</
template
>
<
script
>
import
{
isDef
,
preventDefault
,
isIOS
,
getRootScrollTop
}
from
'./util'
;
export
default
{
name
:
'Field'
,
props
:
{
label
:
{
type
:
String
,
default
:
null
},
type
:
{
type
:
String
,
default
:
'text'
},
value
:
{
type
:
[
String
,
Number
],
default
:
''
},
clearable
:
{
type
:
Boolean
,
default
:
false
},
leftIcon
:
{
type
:
String
,
default
:
null
},
rightIcon
:
{
type
:
String
,
default
:
null
}
},
data
()
{
return
{
focused
:
false
,
maxlength
:
1000
}
},
computed
:
{
showClear
()
{
return
this
.
clearable
&&
this
.
focused
&&
this
.
value
!==
''
&&
isDef
(
this
.
value
);
},
listeners
()
{
return
{
...
this
.
$listeners
,
input
:
this
.
onInput
,
// keypress: this.onKeypress,
focus
:
this
.
onFocus
,
blur
:
this
.
onBlur
}
}
},
methods
:
{
slots
(
name
=
'default'
,
props
)
{
const
{
$slots
,
$scopedSlots
}
=
this
;
if
(
$scopedSlots
[
name
])
{
return
$scopedSlots
[
name
](
props
);
}
return
$slots
[
name
];
},
focus
()
{
this
.
$refs
.
input
&&
this
.
$refs
.
input
.
focus
();
},
blur
()
{
this
.
$refs
.
input
&&
this
.
$refs
.
input
.
blur
();
},
format
(
target
=
this
.
$refs
.
input
)
{
let
{
value
}
=
target
;
const
{
maxlength
}
=
this
.
$attrs
;
if
(
this
.
type
===
'number'
&&
isDef
(
maxlength
)
&&
value
.
length
>
maxlength
)
{
value
=
value
.
slice
(
0
,
maxlength
);
target
.
value
=
value
;
}
return
value
;
},
onInput
(
event
)
{
this
.
$emit
(
'input'
,
this
.
format
(
event
.
target
));
},
onFocus
(
event
)
{
this
.
focused
=
true
;
this
.
$emit
(
'focus'
,
event
);
},
onBlur
(
event
)
{
setTimeout
(()
=>
{
this
.
focused
=
false
;
this
.
$emit
(
'blur'
,
event
);
if
(
isIOS
())
{
window
.
scrollTo
(
0
,
getRootScrollTop
());
}
},
0
);
},
onClear
(
event
)
{
preventDefault
(
event
);
this
.
$emit
(
'input'
,
''
);
this
.
$emit
(
'clear'
);
},
onClickRightIcon
(
event
)
{
this
.
$emit
(
'click-right-icon'
);
}
}
}
</
script
>
<
style
lang=
"less"
>
.lux-field {
position: relative;
display: flex;
width: 100%;
overflow: hidden;
box-sizing: border-box;
color: #373839;
font-size: 16px;
line-height: 12px;
background-color: #F8F9FA;
border-radius: 50px;
padding: 12px 15px;
padding-right: 0;
.lux-icon {
display: block;
background-size: contain;
background-repeat: no-repeat;
margin-right: 15px;
}
.lux-field__left-icon,
.lux-field__right-icon {
.lux-icon {
width: 20px;
height: 20px;
}
}
.lux-field__left-icon {
margin-right: 12.5px;
.lux-icon-phone {
background-image: url(./images/lux-icon-phone.png);
}
.lux-icon-pwd {
background-image: url(./images/lux-icon-pwd.png);
}
.lux-icon-otp {
background-image: url(./images/lux-icon-otp.png);
}
.lux-icon-sms {
background-image: url(./images/lux-icon-sms.png);
}
}
.lux-field__right-icon {
.lux-icon-spwd {
background-image: url(./images/lux-icon-spwd.png);
}
.lux-icon-hpwd {
background-image: url(./images/lux-icon-hpwd.png);
}
}
.lux-field__value {
flex: 1;
color: #373839;
overflow: hidden;
text-align: right;
position: relative;
vertical-align: middle;
}
.lux-field__body {
display: flex;
align-items: center;
.lux-icon-clear {
flex-shrink: 0;
width: 16px;
height: 16px;
background-image: url(./images/lux-icon-clear.png);
}
}
.lux-field__control {
border: 0;
margin: 0;
padding: 0;
width: 100%;
resize: none;
display: block;
color: #373839;
box-sizing: border-box;
background-color: transparent;
font-size: 16px;
height: 19px;
line-height: 19px;
&::placeholder {
color: #C7C8C9;
}
}
input:-webkit-autofill {
background-color: #fff;
background-image: none;
}
input:-webkit-autofill {
-webkit-box-shadow: 0 0 0px 1000px #fff inset !important;
}
.lux-field__button {
flex-shrink: 0;
margin-right: 15px;
}
}
</
style
>
\ No newline at end of file
src/index.js
已删除
100644 → 0
浏览文件 @
18969e08
import
PicaH5Login
from
'./login.vue'
;
PicaH5Login
.
install
=
function
(
Vue
)
{
Vue
.
component
(
PicaH5Login
.
name
,
PicaH5Login
);
};
export
default
PicaH5Login
;
\ No newline at end of file
src/login.vue
已删除
100644 → 0
浏览文件 @
18969e08
<
template
>
<div
class=
"pica-h5-login-container"
>
<div
class=
"nav-tab"
>
<div
v-for=
"tab in tabs"
:key=
"tab.value"
:class=
"['tab', active == tab.value ? 'tab-active' : '']"
@
click=
"toggleTab(tab.value)"
>
{{
tab
.
label
}}
</div>
<i
v-if=
"close"
class=
"lux-close"
@
click=
"onClose"
></i>
</div>
<div
class=
"login-content"
>
<field
v-model=
"mobile"
left-icon=
"lux-icon-phone"
placeholder=
"手机号"
type=
"tel"
maxlength=
"11"
:clearable=
"true"
@
keyup=
"onKeyUp"
/>
<div
class=
"captcha-field"
v-show=
"active == 1"
>
<field
v-model=
"captchaAnswer"
left-icon=
"lux-icon-sms"
placeholder=
"图形验证码"
maxlength=
"5"
>
</field>
<div
class=
"captchaImg"
>
<img
:src=
"captchaImg"
@
click=
"getCaptcha"
slot=
"img"
>
</div>
</div>
<field
v-show=
"active == 1"
v-model=
"authCode"
left-icon=
"lux-icon-otp"
placeholder=
"验证码"
maxlength=
"6"
>
<div
slot=
"button"
class=
"lux-field__button send-otp"
:class=
"[otpDisabled ? 'disabled' : '']"
@
click=
"sendOtp"
>
{{
sendSMS
}}
</div>
</field>
<field
v-show=
"active == 2"
v-model=
"password"
left-icon=
"lux-icon-pwd"
placeholder=
"密码"
:type=
"pwdType"
:right-icon=
"rightIcon"
@
click-right-icon=
"togglePwd"
/>
<div
class=
"btn-confirm"
@
click=
"confirm"
>
登录
</div>
</div>
<loading
v-if=
"loading"
class=
"login-van-loading"
color=
"white"
/>
</div>
</
template
>
<
script
>
import
axios
from
'axios'
;
import
Field
from
'./field.vue'
;
import
{
Toast
,
Loading
}
from
'vant'
;
import
'./prototype'
;
import
{
sendEncryptRequest
}
from
'./utils/encrypt/encryptEnter'
;
import
{
getTerminalType
,
detectOS
}
from
'./utils/getDeviceInfo'
;
export
default
{
name
:
'PicaH5Login'
,
props
:
{
baseUrl
:
{
type
:
String
,
default
:
''
},
close
:
{
type
:
Boolean
,
default
:
false
},
closeCall
:
{
type
:
Function
,
default
:
function
()
{}
},
loginCall
:
{
type
:
Function
,
default
:
function
()
{}
}
},
components
:
{
Field
,
Loading
},
data
()
{
return
{
active
:
1
,
tabs
:
[
{
label
:
'验证码登录'
,
value
:
1
},
{
label
:
'密码登录'
,
value
:
2
}
],
loading
:
false
,
regMobile
:
/^1
[
3456789
]\d{9}
$/
,
pwdType
:
'password'
,
// text
rightIcon
:
'lux-icon-hpwd'
,
// lux-icon-spwd
sms
:
'获取验证码'
,
sendSMS
:
'获取验证码'
,
// sendImgSMS: '获取图形验证码',
otpDisabled
:
true
,
// 图形验证码 disabled
otpDisabledCaptcha
:
true
,
// 验证码 disabled
countdownFn
:
null
,
countTimer
:
60
,
tipEl
:
null
,
tipTimer
:
1500
,
mobile
:
''
,
authCode
:
''
,
password
:
''
,
captchaImg
:
''
,
captchaToken
:
''
,
captchaAnswer
:
''
,
config
:
{}
}
},
computed
:
{
mobileFlag
()
{
const
{
regMobile
,
mobile
}
=
this
;
return
!
regMobile
.
test
(
mobile
);
}
},
watch
:
{
mobile
(
val
)
{
const
{
active
,
mobileFlag
,
countdownFn
}
=
this
;
if
(
active
===
1
)
{
if
(
countdownFn
!==
null
)
{
this
.
otpDisabled
=
true
;
}
else
{
this
.
otpDisabled
=
mobileFlag
;
}
}
}
},
created
()
{
const
{
baseUrl
}
=
this
;
// this.config = {
// method: 'GET',
// baseURL: baseUrl,
// headers: {
// sysCode: 28,
// 'X-Requested-With': 'XMLHttpRequest',
// 'Content-Type': 'application/json;charset=UTF-8'
// },
// timeout: 10000,
// }
let
deviceInfo
=
this
.
getDeviceInfo
();
this
.
config
=
{
method
:
'GET'
,
baseURL
:
baseUrl
,
headers
:
{
'X-Requested-With'
:
'XMLHttpRequest'
,
'Content-Type'
:
'application/json;charset=UTF-8'
,
'productType'
:
1
,
// 1表示云鹊医产品系
'sourceType'
:
4
,
// 4表示H5登录
'deviceInfo'
:
deviceInfo
},
timeout
:
10000
,
}
this
.
getCaptcha
()
},
methods
:
{
toggleTab
(
val
)
{
this
.
active
=
val
;
if
(
val
===
1
)
{
const
{
mobileFlag
,
countdownFn
}
=
this
;
this
.
otpDisabled
=
countdownFn
!==
null
?
true
:
mobileFlag
;
}
},
getDeviceInfo
()
{
let
deviceInfo
=
{
"app_channel"
:
""
,
"app_mac"
:
""
,
"app_uuid"
:
""
,
"app_version"
:
""
,
"device_brand"
:
""
,
"device_ip"
:
""
,
"device_model"
:
""
,
"device_net"
:
""
,
"device_ops"
:
""
,
"resolution_wh"
:
""
,
"system_level"
:
""
,
"device_type"
:
""
};
try
{
let
terminalType
=
getTerminalType
();
let
OS
=
detectOS
();
deviceInfo
.
device_brand
=
terminalType
;
deviceInfo
.
system_level
=
OS
;
}
catch
(
err
){
console
.
log
(
'deviceInfo err>>>> '
,
err
)
}
deviceInfo
=
JSON
.
stringify
(
deviceInfo
);
return
deviceInfo
;
},
// 图形验证码
getCaptcha
(){
const
{
config
}
=
this
;
// 获取图形验证码 ajax
axios
({
...
config
,
url
:
'/account/account/captcha'
}).
then
(
res
=>
{
if
(
res
.
status
&&
res
.
status
===
200
)
{
res
=
res
.
data
;
}
if
(
res
.
code
===
'000000'
){
this
.
captchaImg
=
`data:image/png;base64,
${
res
.
data
.
content
}
`
this
.
captchaToken
=
res
.
data
.
token
}
else
{
Toast
({
message
:
res
.
message
,
duration
:
this
.
tipTimer
});
}
});
},
onClose
()
{
this
.
$emit
(
'close-call'
);
},
togglePwd
()
{
const
{
pwdType
}
=
this
;
if
(
pwdType
===
'password'
)
{
this
.
pwdType
=
'text'
;
this
.
rightIcon
=
'lux-icon-spwd'
;
}
else
{
this
.
pwdType
=
'password'
;
this
.
rightIcon
=
'lux-icon-hpwd'
;
}
},
onKeyUp
(
e
)
{
this
.
mobile
=
e
.
target
.
value
.
replace
(
/
\D
/g
,
''
);
},
// 短信验证码
sendOtp
()
{
const
_this
=
this
;
let
countdown
;
const
{
config
,
mobile
,
otpDisabled
,
mobileFlag
,
countTimer
,
captchaAnswer
}
=
this
;
if
(
otpDisabled
||
mobileFlag
)
return
;
if
(
captchaAnswer
==
''
){
Toast
({
message
:
'请输入图形验证码'
,
duration
:
this
.
tipTimer
});
return
;
}
// 发送短信验证码 ajax post
<<<<
let
data
=
{
mobile
:
mobile
,
flag
:
0
,
captchaToken
:
this
.
captchaToken
,
captchaAnswer
:
this
.
captchaAnswer
};
let
sendMsgCodeCb
=
data
=>
{
axios
({
...
config
,
method
:
'POST'
,
url
:
'/account/account/authCode'
,
data
}).
then
(
res
=>
{
if
(
res
.
status
&&
res
.
status
===
200
)
{
res
=
res
.
data
;
}
if
(
res
.
code
===
'000000'
){
countdown
=
this
.
countDown
(
countTimer
);
this
.
countdownFn
=
setInterval
(
countdown
,
1000
);
this
.
otpDisabled
=
true
;
countdown
();
}
else
{
this
.
getCaptcha
();
this
.
captchaAnswer
=
''
;
Toast
({
message
:
res
.
message
,
duration
:
this
.
tipTimer
});
}
});
}
sendEncryptRequest
(
data
,
sendMsgCodeCb
,
_this
.
config
);
},
countDown
(
counter
)
{
const
_this
=
this
;
return
function
()
{
if
(
0
>=
counter
--
)
{
const
{
countdownFn
,
mobileFlag
,
sms
}
=
_this
;
clearInterval
(
countdownFn
);
_this
.
countdownFn
=
null
;
_this
.
sendSMS
=
sms
;
_this
.
otpDisabled
=
mobileFlag
;
}
else
{
_this
.
sendSMS
=
`
${
counter
}
秒后重试`
;
}
}
},
confirm
()
{
const
{
active
,
mobileFlag
,
mobile
,
captchaAnswer
,
authCode
,
password
,
tipTimer
}
=
this
;
let
params
=
{
mobile
:
mobile
,
authCode
,
password
};
if
(
mobileFlag
)
{
Toast
({
message
:
'请输入正确手机号'
,
duration
:
tipTimer
});
return
;
}
if
(
active
==
1
&&
captchaAnswer
===
''
)
{
Toast
({
message
:
'请输入图形验证码'
,
duration
:
tipTimer
});
return
;
}
if
(
active
==
1
&&
authCode
===
''
)
{
Toast
({
message
:
'请输入验证码'
,
duration
:
tipTimer
});
return
;
}
if
(
active
==
2
&&
password
===
''
)
{
Toast
({
message
:
'请输入密码'
,
duration
:
tipTimer
});
return
;
}
active
==
1
?
delete
params
.
password
:
delete
params
.
authCode
;
if
(
active
!=
1
&&
params
.
password
)
{
params
.
password
=
`
${
params
.
password
}
`
.
MD5
(
32
).
toUpperCase
();
}
this
.
submit
(
params
);
},
submit
(
data
)
{
const
_this
=
this
;
const
{
config
,
tipTimer
,
active
}
=
_this
;
// const url = active == 1 ? '/account/account/login-register' : '/account/account/login'; // old
const
url
=
active
==
1
?
'/account/account/login-register/v1'
:
'/account/login'
;
// encrypt new
const
unionid
=
window
.
sessionStorage
.
getItem
(
'unionid'
);
if
(
unionid
!==
null
)
{
data
.
unionid
=
unionid
;
}
_this
.
loading
=
true
;
let
submitCb
=
data
=>
{
console
.
log
(
'data>>>>> '
,
data
)
axios
({
...
config
,
method
:
'POST'
,
url
,
data
})
.
then
(
res
=>
{
_this
.
loading
=
false
;
if
(
res
.
status
===
undefined
)
{
_this
.
doResponse
(
res
);
}
else
{
if
(
res
.
status
===
200
)
{
res
=
res
.
data
;
_this
.
doResponse
(
res
);
}
else
{
Toast
({
message
:
'系统异常'
,
duration
:
tipTimer
});
}
}
})
.
catch
(
err
=>
{
Toast
({
message
:
'系统异常'
,
duration
:
tipTimer
});
_this
.
loading
=
false
;
});
};
sendEncryptRequest
(
data
,
submitCb
,
_this
.
config
);
},
doResponse
(
res
)
{
const
_this
=
this
;
const
{
tipTimer
}
=
_this
;
if
(
res
&&
res
.
code
===
'000000'
)
{
if
(
res
.
data
&&
res
.
data
.
token
){
Toast
({
message
:
'登录成功'
,
duration
:
tipTimer
});
// _this.$emit('login-call', res.data);
_this
.
$emit
(
'login-call'
,
res
.
data
.
token
);
}
else
{
Toast
({
message
:
'系统异常'
,
duration
:
tipTimer
});
}
}
else
{
const
message
=
res
&&
res
.
message
?
res
.
message
:
'系统异常'
;
Toast
({
message
,
duration
:
tipTimer
});
}
}
}
}
</
script
>
<
style
lang=
"less"
>
// @import './login.less'
.captcha-field{
width: 100%;
display: flex;
justify-content: space-around;
align-items: center;
.lux-cell{
width: 170px;
display: flex;
align-items: center;
}
.captchaImg{
width: 114px;
height: 44px;
margin-left: 10px;
img{
width: 100%;
height: 100%;
display: block;
border-radius: 50px;
}
}
.lux-field__control {
height: 24px;
line-height: 24px;
}
.left-icon{
height: 24px;
}
}
.van-popup .pica-h5-login-container {
border-radius: 3px;
}
.pica-h5-login-container {
width: 345px;
background: #fff;
border-radius: 3px;
font-family: PingFangSC-Semibold;
box-shadow: 0 0 5px rgba(237, 237, 237, 1);
user-select: none;
.nav-tab {
position: relative;
display: flex;
justify-content: space-around;
align-items: center;
border-bottom: 1PX solid #F0F1F2;
padding: 0 25px;
.tab {
flex: 1;
font-size: 18px;
font-weight: 400;
color: #676869;
position: relative;
height: 54px;
line-height: 54px;
text-align: center;
&.tab-active {
font-weight: 600;
color: #373839;
&::after {
content: "";
position: absolute;
width: 10px;
height: 3px;
border-radius: 1.5px;
background: #449284;
bottom: 2px;
left: 50%;
margin-left: -5px;
}
}
}
.lux-close {
position: absolute;
width: 25px;
height: 25px;
top: 15.5px;
right: 10px;
background-image: url(./images/lux-icon-close.png);
background-repeat: no-repeat;
background-size: contain;
}
}
.login-content {
// margin-top: 22.5px;
padding: 22.5px 25px 10px;
> div {
margin-bottom: 20px;
}
.send-otp {
font-size: 16px;
color: #449284;
&.disabled {
color: #979899;
}
}
.btn-confirm {
background: linear-gradient(135deg, rgba(141,197,187,1) 0%, rgba(68, 146, 132, 1) 100%);
box-shadow: 0px 1px 6px 0px rgba(68, 146, 132, 0.4);
border-radius: 25px;
font-size: 17px;
color: #fff;
font-weight: 500;
padding: 13px 0;
text-align: center;
}
}
}
.lux-toast {
position: fixed;
top: 50%;
left: 50%;
padding: 8px 12px;
min-width: 48px;
max-width: 70%;
box-sizing: content-box;
width: fit-content;
color: #fff;
font-size: 14px;
line-height: 20px;
white-space: pre-wrap;
text-align: center;
word-break: break-all;
background-color: rgba(50, 50, 51, 0.88);
border-radius: 4px;
transform: translate3d(-50%, -50%, 0);
}
.van-loading.login-van-loading {
position: fixed;
top: 40%;
left: 50%;
margin-left: -30px;
width: 60px;
height: 60px;
padding: 10px;
border-radius: 3px;
background-color: rgba(0, 0, 0, 0.5);
z-index: 1000;
}
</
style
>
\ No newline at end of file
src/prototype.js
已删除
100644 → 0
浏览文件 @
18969e08
String
.
prototype
.
MD5
=
function
(
bit
)
{
var
sMessage
=
this
;
function
RotateLeft
(
lValue
,
iShiftBits
)
{
return
(
lValue
<<
iShiftBits
)
|
(
lValue
>>>
(
32
-
iShiftBits
));
}
function
AddUnsigned
(
lX
,
lY
)
{
var
lX4
,
lY4
,
lX8
,
lY8
,
lResult
;
lX8
=
(
lX
&
0x80000000
);
lY8
=
(
lY
&
0x80000000
);
lX4
=
(
lX
&
0x40000000
);
lY4
=
(
lY
&
0x40000000
);
lResult
=
(
lX
&
0x3FFFFFFF
)
+
(
lY
&
0x3FFFFFFF
);
if
(
lX4
&
lY4
)
return
(
lResult
^
0x80000000
^
lX8
^
lY8
);
if
(
lX4
|
lY4
)
{
if
(
lResult
&
0x40000000
)
return
(
lResult
^
0xC0000000
^
lX8
^
lY8
);
else
return
(
lResult
^
0x40000000
^
lX8
^
lY8
);
}
else
return
(
lResult
^
lX8
^
lY8
);
}
function
F
(
x
,
y
,
z
)
{
return
(
x
&
y
)
|
((
~
x
)
&
z
);
}
function
G
(
x
,
y
,
z
)
{
return
(
x
&
z
)
|
(
y
&
(
~
z
));
}
function
H
(
x
,
y
,
z
)
{
return
(
x
^
y
^
z
);
}
function
I
(
x
,
y
,
z
)
{
return
(
y
^
(
x
|
(
~
z
)));
}
function
FF
(
a
,
b
,
c
,
d
,
x
,
s
,
ac
)
{
a
=
AddUnsigned
(
a
,
AddUnsigned
(
AddUnsigned
(
F
(
b
,
c
,
d
),
x
),
ac
));
return
AddUnsigned
(
RotateLeft
(
a
,
s
),
b
);
}
function
GG
(
a
,
b
,
c
,
d
,
x
,
s
,
ac
)
{
a
=
AddUnsigned
(
a
,
AddUnsigned
(
AddUnsigned
(
G
(
b
,
c
,
d
),
x
),
ac
));
return
AddUnsigned
(
RotateLeft
(
a
,
s
),
b
);
}
function
HH
(
a
,
b
,
c
,
d
,
x
,
s
,
ac
)
{
a
=
AddUnsigned
(
a
,
AddUnsigned
(
AddUnsigned
(
H
(
b
,
c
,
d
),
x
),
ac
));
return
AddUnsigned
(
RotateLeft
(
a
,
s
),
b
);
}
function
II
(
a
,
b
,
c
,
d
,
x
,
s
,
ac
)
{
a
=
AddUnsigned
(
a
,
AddUnsigned
(
AddUnsigned
(
I
(
b
,
c
,
d
),
x
),
ac
));
return
AddUnsigned
(
RotateLeft
(
a
,
s
),
b
);
}
function
ConvertToWordArray
(
sMessage
)
{
var
lWordCount
;
var
lMessageLength
=
sMessage
.
length
;
var
lNumberOfWords_temp1
=
lMessageLength
+
8
;
var
lNumberOfWords_temp2
=
(
lNumberOfWords_temp1
-
(
lNumberOfWords_temp1
%
64
))
/
64
;
var
lNumberOfWords
=
(
lNumberOfWords_temp2
+
1
)
*
16
;
var
lWordArray
=
Array
(
lNumberOfWords
-
1
);
var
lBytePosition
=
0
;
var
lByteCount
=
0
;
while
(
lByteCount
<
lMessageLength
)
{
lWordCount
=
(
lByteCount
-
(
lByteCount
%
4
))
/
4
;
lBytePosition
=
(
lByteCount
%
4
)
*
8
;
lWordArray
[
lWordCount
]
=
(
lWordArray
[
lWordCount
]
|
(
sMessage
.
charCodeAt
(
lByteCount
)
<<
lBytePosition
));
lByteCount
++
;
}
lWordCount
=
(
lByteCount
-
(
lByteCount
%
4
))
/
4
;
lBytePosition
=
(
lByteCount
%
4
)
*
8
;
lWordArray
[
lWordCount
]
=
lWordArray
[
lWordCount
]
|
(
0x80
<<
lBytePosition
);
lWordArray
[
lNumberOfWords
-
2
]
=
lMessageLength
<<
3
;
lWordArray
[
lNumberOfWords
-
1
]
=
lMessageLength
>>>
29
;
return
lWordArray
;
}
function
WordToHex
(
lValue
)
{
var
WordToHexValue
=
""
,
WordToHexValue_temp
=
""
,
lByte
,
lCount
;
for
(
lCount
=
0
;
lCount
<=
3
;
lCount
++
)
{
lByte
=
(
lValue
>>>
(
lCount
*
8
))
&
255
;
WordToHexValue_temp
=
"0"
+
lByte
.
toString
(
16
);
WordToHexValue
=
WordToHexValue
+
WordToHexValue_temp
.
substr
(
WordToHexValue_temp
.
length
-
2
,
2
);
}
return
WordToHexValue
;
}
var
x
=
Array
();
var
k
,
AA
,
BB
,
CC
,
DD
,
a
,
b
,
c
,
d
var
S11
=
7
,
S12
=
12
,
S13
=
17
,
S14
=
22
;
var
S21
=
5
,
S22
=
9
,
S23
=
14
,
S24
=
20
;
var
S31
=
4
,
S32
=
11
,
S33
=
16
,
S34
=
23
;
var
S41
=
6
,
S42
=
10
,
S43
=
15
,
S44
=
21
;
// Steps 1 and 2. Append padding bits and length and convert to words
x
=
ConvertToWordArray
(
sMessage
);
// Step 3. Initialise
a
=
0x67452301
;
b
=
0xEFCDAB89
;
c
=
0x98BADCFE
;
d
=
0x10325476
;
// Step 4. Process the message in 16-word blocks
for
(
k
=
0
;
k
<
x
.
length
;
k
+=
16
)
{
AA
=
a
;
BB
=
b
;
CC
=
c
;
DD
=
d
;
a
=
FF
(
a
,
b
,
c
,
d
,
x
[
k
+
0
],
S11
,
0xD76AA478
);
d
=
FF
(
d
,
a
,
b
,
c
,
x
[
k
+
1
],
S12
,
0xE8C7B756
);
c
=
FF
(
c
,
d
,
a
,
b
,
x
[
k
+
2
],
S13
,
0x242070DB
);
b
=
FF
(
b
,
c
,
d
,
a
,
x
[
k
+
3
],
S14
,
0xC1BDCEEE
);
a
=
FF
(
a
,
b
,
c
,
d
,
x
[
k
+
4
],
S11
,
0xF57C0FAF
);
d
=
FF
(
d
,
a
,
b
,
c
,
x
[
k
+
5
],
S12
,
0x4787C62A
);
c
=
FF
(
c
,
d
,
a
,
b
,
x
[
k
+
6
],
S13
,
0xA8304613
);
b
=
FF
(
b
,
c
,
d
,
a
,
x
[
k
+
7
],
S14
,
0xFD469501
);
a
=
FF
(
a
,
b
,
c
,
d
,
x
[
k
+
8
],
S11
,
0x698098D8
);
d
=
FF
(
d
,
a
,
b
,
c
,
x
[
k
+
9
],
S12
,
0x8B44F7AF
);
c
=
FF
(
c
,
d
,
a
,
b
,
x
[
k
+
10
],
S13
,
0xFFFF5BB1
);
b
=
FF
(
b
,
c
,
d
,
a
,
x
[
k
+
11
],
S14
,
0x895CD7BE
);
a
=
FF
(
a
,
b
,
c
,
d
,
x
[
k
+
12
],
S11
,
0x6B901122
);
d
=
FF
(
d
,
a
,
b
,
c
,
x
[
k
+
13
],
S12
,
0xFD987193
);
c
=
FF
(
c
,
d
,
a
,
b
,
x
[
k
+
14
],
S13
,
0xA679438E
);
b
=
FF
(
b
,
c
,
d
,
a
,
x
[
k
+
15
],
S14
,
0x49B40821
);
a
=
GG
(
a
,
b
,
c
,
d
,
x
[
k
+
1
],
S21
,
0xF61E2562
);
d
=
GG
(
d
,
a
,
b
,
c
,
x
[
k
+
6
],
S22
,
0xC040B340
);
c
=
GG
(
c
,
d
,
a
,
b
,
x
[
k
+
11
],
S23
,
0x265E5A51
);
b
=
GG
(
b
,
c
,
d
,
a
,
x
[
k
+
0
],
S24
,
0xE9B6C7AA
);
a
=
GG
(
a
,
b
,
c
,
d
,
x
[
k
+
5
],
S21
,
0xD62F105D
);
d
=
GG
(
d
,
a
,
b
,
c
,
x
[
k
+
10
],
S22
,
0x2441453
);
c
=
GG
(
c
,
d
,
a
,
b
,
x
[
k
+
15
],
S23
,
0xD8A1E681
);
b
=
GG
(
b
,
c
,
d
,
a
,
x
[
k
+
4
],
S24
,
0xE7D3FBC8
);
a
=
GG
(
a
,
b
,
c
,
d
,
x
[
k
+
9
],
S21
,
0x21E1CDE6
);
d
=
GG
(
d
,
a
,
b
,
c
,
x
[
k
+
14
],
S22
,
0xC33707D6
);
c
=
GG
(
c
,
d
,
a
,
b
,
x
[
k
+
3
],
S23
,
0xF4D50D87
);
b
=
GG
(
b
,
c
,
d
,
a
,
x
[
k
+
8
],
S24
,
0x455A14ED
);
a
=
GG
(
a
,
b
,
c
,
d
,
x
[
k
+
13
],
S21
,
0xA9E3E905
);
d
=
GG
(
d
,
a
,
b
,
c
,
x
[
k
+
2
],
S22
,
0xFCEFA3F8
);
c
=
GG
(
c
,
d
,
a
,
b
,
x
[
k
+
7
],
S23
,
0x676F02D9
);
b
=
GG
(
b
,
c
,
d
,
a
,
x
[
k
+
12
],
S24
,
0x8D2A4C8A
);
a
=
HH
(
a
,
b
,
c
,
d
,
x
[
k
+
5
],
S31
,
0xFFFA3942
);
d
=
HH
(
d
,
a
,
b
,
c
,
x
[
k
+
8
],
S32
,
0x8771F681
);
c
=
HH
(
c
,
d
,
a
,
b
,
x
[
k
+
11
],
S33
,
0x6D9D6122
);
b
=
HH
(
b
,
c
,
d
,
a
,
x
[
k
+
14
],
S34
,
0xFDE5380C
);
a
=
HH
(
a
,
b
,
c
,
d
,
x
[
k
+
1
],
S31
,
0xA4BEEA44
);
d
=
HH
(
d
,
a
,
b
,
c
,
x
[
k
+
4
],
S32
,
0x4BDECFA9
);
c
=
HH
(
c
,
d
,
a
,
b
,
x
[
k
+
7
],
S33
,
0xF6BB4B60
);
b
=
HH
(
b
,
c
,
d
,
a
,
x
[
k
+
10
],
S34
,
0xBEBFBC70
);
a
=
HH
(
a
,
b
,
c
,
d
,
x
[
k
+
13
],
S31
,
0x289B7EC6
);
d
=
HH
(
d
,
a
,
b
,
c
,
x
[
k
+
0
],
S32
,
0xEAA127FA
);
c
=
HH
(
c
,
d
,
a
,
b
,
x
[
k
+
3
],
S33
,
0xD4EF3085
);
b
=
HH
(
b
,
c
,
d
,
a
,
x
[
k
+
6
],
S34
,
0x4881D05
);
a
=
HH
(
a
,
b
,
c
,
d
,
x
[
k
+
9
],
S31
,
0xD9D4D039
);
d
=
HH
(
d
,
a
,
b
,
c
,
x
[
k
+
12
],
S32
,
0xE6DB99E5
);
c
=
HH
(
c
,
d
,
a
,
b
,
x
[
k
+
15
],
S33
,
0x1FA27CF8
);
b
=
HH
(
b
,
c
,
d
,
a
,
x
[
k
+
2
],
S34
,
0xC4AC5665
);
a
=
II
(
a
,
b
,
c
,
d
,
x
[
k
+
0
],
S41
,
0xF4292244
);
d
=
II
(
d
,
a
,
b
,
c
,
x
[
k
+
7
],
S42
,
0x432AFF97
);
c
=
II
(
c
,
d
,
a
,
b
,
x
[
k
+
14
],
S43
,
0xAB9423A7
);
b
=
II
(
b
,
c
,
d
,
a
,
x
[
k
+
5
],
S44
,
0xFC93A039
);
a
=
II
(
a
,
b
,
c
,
d
,
x
[
k
+
12
],
S41
,
0x655B59C3
);
d
=
II
(
d
,
a
,
b
,
c
,
x
[
k
+
3
],
S42
,
0x8F0CCC92
);
c
=
II
(
c
,
d
,
a
,
b
,
x
[
k
+
10
],
S43
,
0xFFEFF47D
);
b
=
II
(
b
,
c
,
d
,
a
,
x
[
k
+
1
],
S44
,
0x85845DD1
);
a
=
II
(
a
,
b
,
c
,
d
,
x
[
k
+
8
],
S41
,
0x6FA87E4F
);
d
=
II
(
d
,
a
,
b
,
c
,
x
[
k
+
15
],
S42
,
0xFE2CE6E0
);
c
=
II
(
c
,
d
,
a
,
b
,
x
[
k
+
6
],
S43
,
0xA3014314
);
b
=
II
(
b
,
c
,
d
,
a
,
x
[
k
+
13
],
S44
,
0x4E0811A1
);
a
=
II
(
a
,
b
,
c
,
d
,
x
[
k
+
4
],
S41
,
0xF7537E82
);
d
=
II
(
d
,
a
,
b
,
c
,
x
[
k
+
11
],
S42
,
0xBD3AF235
);
c
=
II
(
c
,
d
,
a
,
b
,
x
[
k
+
2
],
S43
,
0x2AD7D2BB
);
b
=
II
(
b
,
c
,
d
,
a
,
x
[
k
+
9
],
S44
,
0xEB86D391
);
a
=
AddUnsigned
(
a
,
AA
);
b
=
AddUnsigned
(
b
,
BB
);
c
=
AddUnsigned
(
c
,
CC
);
d
=
AddUnsigned
(
d
,
DD
);
}
if
(
bit
==
32
)
{
return
WordToHex
(
a
)
+
WordToHex
(
b
)
+
WordToHex
(
c
)
+
WordToHex
(
d
);
}
else
{
return
WordToHex
(
b
)
+
WordToHex
(
c
);
}
}
\ No newline at end of file
写
预览
Markdown
格式
0%
请重试
or
附加一个文件
附加文件
取消
您添加了
0
人
到此讨论。请谨慎行事。
先完成此消息的编辑!
取消
想要评论请
注册
或
登录