提交 18969e08 编写于 作者: huangwensu's avatar huangwensu

导入代码

上级
###### 使用说明
> 由于H5 登录成功后调用后台接口判断是否签署协议,如果签署了就不再弹出协议签署框,如果没有则弹出协议弹窗,同意协议则跳转相应页面,不同意则返回上个页面
###### 1. 使用
```javascript
import PicaH5Agreement from 'pica-h5-agreement';
// if for global use
Vue.use(PicaH5Agreement);
```
```html
// template
<pica-h5-login
:close="true"
:base-url="baseUrl"
@login-call="loginCall"
@close-call="closeCall"
/>
// template need popup
<van-popup v-model="show">
<pica-h5-login
:close="true"
:base-url="baseUrl"
@login-call="loginCall"
@close-call="closeCall"
/>
</van-popup>
```
```javascript
// 代码
export default {
data() {
return {
show: false
}
},
methods: {
loginCall(token) {
// 登录成功回调返回值就是token
this.closeCall();
},
closeCall() {
this.show = false;
}
}
}
```
```javascript
vue.config.js 新增配置
transpileDependencies: ['pica-h5-login']
```
###### 2. options
| 参数 | 说明 | 类型 | 默认值 |
| --------- | ---------------------- | -------- | -------- |
| baseUrl | 登录域名 | string | 空 |
| close | 是否显示 close 符号 | boolean | false |
| loginCall | 登录成功回调函数 | function | (token) => {} |
| closeCall | 关闭登录窗口的回调函数 | function | () => {} |
> baseUrl:
> dev : http://dev-sc.yunqueyi.com
> test1: http://test1-sc.yunqueyi.com
> uat: http://uat-sc.yunqueyi.com
{
"_args": [
[
"pica-h5-agreement@2.0.1",
"D:\\wsp\\积木-ssr\\pica-toy-brick"
]
],
"_from": "pica-h5-agreement@2.0.1",
"_id": "pica-h5-agreement@2.0.1",
"_inBundle": false,
"_integrity": "sha512-IlXHRdJZ3bfQ41Ofw8rQiaZIdDJ+9czOs59mqmHSdZwLf41sxcAUnGrKSgNxUQCyZl3OAoPCnGlZlN5+l5SgJQ==",
"_location": "/pica-h5-agreement",
"_phantomChildren": {
"@babel/runtime": "7.5.5",
"@vant/icons": "1.1.7",
"@vue/babel-helper-vue-jsx-merge-props": "1.0.0"
},
"_requested": {
"type": "version",
"registry": true,
"raw": "pica-h5-agreement@2.0.1",
"name": "pica-h5-agreement",
"escapedName": "pica-h5-agreement",
"rawSpec": "2.0.1",
"saveSpec": null,
"fetchSpec": "2.0.1"
},
"_requiredBy": [
"/",
"/pica-topic-comment",
"/pica-topic-stencil"
],
"_resolved": "http://192.168.110.93:4873/pica-h5-login/-/pica-h5-login-2.0.1.tgz",
"_spec": "2.0.1",
"_where": "D:\\wsp\\积木-ssr\\pica-toy-brick",
"author": {
"name": "souse"
},
"dependencies": {
"axios": "^0.18.0",
"jsencrypt": "^3.0.0-rc.1",
"vant": "^1.4.2"
},
"description": "h5 login component",
"devDependencies": {
"@babel/core": "^7.4.4",
"@babel/preset-env": "^7.4.4",
"autoprefixer": "^9.5.1",
"less": "^3.9.0",
"postcss-pxtorem": "^4.0.1",
"postcss-url": "^8.0.0",
"rollup": "^1.0.2",
"rollup-plugin-babel": "^4.3.2",
"rollup-plugin-commonjs": "^10.0.0",
"rollup-plugin-node-resolve": "^5.0.0",
"rollup-plugin-postcss": "^2.0.3",
"rollup-plugin-terser": "^4.0.1",
"rollup-plugin-vue": "^5.0.0",
"vue": "^2.5.17",
"vue-template-compiler": "^2.6.10"
},
"engines": {
"node": ">= 8.0.0",
"npm": ">= 4.0.0"
},
"files": [
"lib",
"src"
],
"keywords": [
"rollup",
"components"
],
"license": "MIT",
"main": "lib/index.js",
"name": "pica-h5-agreement",
"peerDependencies": {
"vue": "^2.5.17"
},
"private": false,
"repository": {
"type": "git",
"url": ""
},
"scripts": {
"prod": "rollup -c"
},
"version": "2.0.1"
}
<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
import PicaH5Login from './login.vue';
PicaH5Login.install = function(Vue) {
Vue.component(PicaH5Login.name, PicaH5Login);
};
export default PicaH5Login;
\ No newline at end of file
.pica-h5-login-container {
display: fixed;
top: 167px;
left: 15px;
right: 15px;
}
\ No newline at end of file
<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
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
import { isObj } from './util';
const defaultOptions = {
message: '',
duration: 1500
};
const parseOptions = message => (isObj(message) ? message : { message });
/**
* [Toast description]
* @param {Object} options [description]
*/
export function Toast(options = {}) {
const opts = Object.assign(defaultOptions, parseOptions(options));
const toast = ToastFn.createInstance(opts);
}
function ToastFn(options) {}
ToastFn.prototype.createInstance = function(options) {}
ToastFn.prototype.clear = function() {}
/* eslint-disable */
/**
* [isDef description]
* @param {[type]} value [description]
* @return {Boolean} [description]
*/
export function isDef(value) {
return value !== undefined && value !== null;
}
/**
* [preventDefault description]
* @param {[type]} event [description]
* @return {[type]} [description]
*/
export function preventDefault(event) {
if (typeof event.cancelable !== 'boolean' || event.cancelable) {
event.preventDefault();
}
// event.stopPropagation();
}
/**
* [isObj description]
* @param {[type]} x [description]
* @return {Boolean} [description]
*/
export function isObj(x) {
const type = typeof x;
return x !== null && (type === 'object' || type === 'function');
}
/**
* [isAndroid description]
* @return {Boolean} [description]
*/
export function isAndroid() {
return /android/.test(navigator.userAgent.toLowerCase());
}
/**
* [isIOS description]
* @return {Boolean} [description]
*/
export function isIOS() {
return /ios|iphone|ipad|ipod/.test(navigator.userAgent.toLowerCase());
}
/**
* [getRootScrollTop description]
* @return {[type]} [description]
*/
export function getRootScrollTop() {
return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
}
\ No newline at end of file
/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
var CryptoJS=CryptoJS||function(u,p){var d={},l=d.lib={},s=function(){},t=l.Base={extend:function(a){s.prototype=this;var c=new s;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
r=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=p?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var k=0;k<a;k++)c[j+k>>>2]|=(e[k>>>2]>>>24-8*(k%4)&255)<<24-8*((j+k)%4);else if(65535<e.length)for(k=0;k<a;k+=4)c[j+k>>>2]=e[k>>>2];else c.push.apply(c,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],e=0;e<a;e+=4)c.push(4294967296*u.random()|0);return new r.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var k=c[j>>>2]>>>24-8*(j%4)&255;e.push((k>>>4).toString(16));e.push((k&15).toString(16))}return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j+=2)e[j>>>3]|=parseInt(a.substr(j,
2),16)<<24-4*(j%8);return new r.init(e,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(c[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new r.init(e,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},
q=l.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,e=c.words,j=c.sigBytes,k=this.blockSize,b=j/(4*k),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*k;j=u.min(4*a,j);if(a){for(var q=0;q<a;q+=k)this._doProcessBlock(e,q);q=e.splice(0,a);c.sigBytes-=j}return new r.init(q,j)},clone:function(){var a=t.clone.call(this);
a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new n.HMAC.init(a,
e)).finalize(b)}}});var n=d.algo={};return d}(Math);
(function(){var u=CryptoJS,p=u.lib.WordArray;u.enc.Base64={stringify:function(d){var l=d.words,p=d.sigBytes,t=this._map;d.clamp();d=[];for(var r=0;r<p;r+=3)for(var w=(l[r>>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v<p;v++)d.push(t.charAt(w>>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join("")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<
l;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<<j|b>>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<<j|b>>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<<j|b>>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<<j|b>>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},
_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),
f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,
m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,
E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/
4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);
(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length<q;){n&&s.update(n);var n=s.update(d).finalize(r);s.reset();for(var a=1;a<p;a++)n=s.finalize(n),s.reset();b.concat(n)}b.sigBytes=4*q;return b}});u.EvpKDF=function(d,l,p){return s.create(p).compute(d,
l)}})();
CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this._ENC_XFORM_MODE,e,a)},createDecryptor:function(e,a){return this.create(this._DEC_XFORM_MODE,e,a)},init:function(e,a,b){this.cfg=this.cfg.extend(b);this._xformMode=e;this._key=a;this.reset()},reset:function(){t.reset.call(this);this._doReset()},process:function(e){this._append(e);return this._process()},
finalize:function(e){e&&this._append(e);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(b,k,d){return("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=p.mode={},x=function(e,a,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var d=0;d<b;d++)e[a+d]^=
c[d]},q=(d.BlockCipherMode=l.extend({createEncryptor:function(e,a){return this.Encryptor.create(e,a)},createDecryptor:function(e,a){return this.Decryptor.create(e,a)},init:function(e,a){this._cipher=e;this._iv=a}})).extend();q.Encryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize;x.call(this,e,a,c);b.encryptBlock(e,a);this._prevBlock=e.slice(a,a+c)}});q.Decryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize,d=e.slice(a,a+c);b.decryptBlock(e,a);x.call(this,
e,a,c);this._prevBlock=d}});b=b.CBC=q;q=(p.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,l=[],n=0;n<c;n+=4)l.push(d);c=s.create(l,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,
1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},
decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,
b.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();
(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,
16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j<a;j++)if(j<d)e[j]=c[j];else{var k=e[j-1];j%d?6<d&&4==j%d&&(k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;d<a;d++)j=a-d,k=d%4?e[j]:e[j-4],c[d]=4>d||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>
8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r<m;r++)var q=d[g>>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=
d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();
/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
CryptoJS.mode.ECB=function(){var a=CryptoJS.lib.BlockCipherMode.extend();a.Encryptor=a.extend({processBlock:function(a,b){this._cipher.encryptBlock(a,b)}});a.Decryptor=a.extend({processBlock:function(a,b){this._cipher.decryptBlock(a,b)}});return a}();
export {
CryptoJS
};
import axios from 'axios';
import { Toast } from 'vant';
import { CryptoJS } from './aes'
import 'jsencrypt'
let pubKey = "";
// generate key
function getAesKey(len) {
len = len || 16;
var aesKey = "";
var strList = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
var strLen = strList.length;
for(var i=0; i<len; i++){
aesKey += strList.charAt( Math.floor( Math.random()*strLen ) );
};
return aesKey;
}
// 加密传参,发送请求
function sendEncryptRequest(content, cb, config){
content = JSON.stringify(content); // 后端要求转 string
// debugger;
if(pubKey){ // pubKey获取过就不用再获取了
let params = formatContent(content, pubKey);
cb && cb(params);
}else{
handleGetPubKey(content, cb, config);
}
}
// 获取 RSA public key
function getPubKey(config) {
return axios({ ...config, url: '/account/cipher/key' });
};
// get public key
function handleGetPubKey(content, cb, config){
// debugger;
getPubKey(config).then(res => {
// console.log('>>>>>>>>>>>>>>>>>>>> publicKey: ', res);
if(res.status && res.status === 200) {
res = res.data;
}
// debugger;
if(res.code == '000000'){
pubKey = res.data;
if(cb){
let params = formatContent(content, pubKey);
cb && cb(params);
}
}else{
Toast({
message: (res && res.message) || '接口出错',
duration: 1500
});
}
})
}
// format account params
function formatContent(content, pubKey) { // obj为具体的json传参
let aesKey = getAesKey(16);
let params = {
key: '',
content: ''
};
// 开发阶段后端接口还没处理加密,先传 原始json数据 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 后端加密OK后 再用下面的注释代码
// params.content = content;
params.content = AesEncrypt(content, aesKey);
params.key = RsaEncrypt(aesKey, pubKey);
return params;
}
// AES encrypt
function AesEncrypt(content, aesKey) {
let sKey = CryptoJS.enc.Utf8.parse(aesKey);
let sContent = CryptoJS.enc.Utf8.parse(content);
let encrypted = CryptoJS.AES.encrypt(sContent, sKey, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
return encrypted.toString();
}
// RSA encrypt
function RsaEncrypt(aesKey, pubKey){
let _encrypt = new JSEncrypt();
let boss_public_key = pubKey;
_encrypt.setPublicKey(boss_public_key);
let encrypted = _encrypt.encrypt(aesKey);
return encrypted;
}
export {
getAesKey,
sendEncryptRequest,
handleGetPubKey,
formatContent,
AesEncrypt,
RsaEncrypt,
}
\ No newline at end of file
// 获取用户终端信息
function getTerminalType() {
let brow = "unknown";
// alert(navigator.userAgent);
if (navigator.userAgent.indexOf('iPad') > -1) {
// alert("iPad");
return brow = "iPad";
}
if (navigator.userAgent.indexOf('Android') > -1
|| navigator.userAgent.indexOf('Linux') > -1) {
// alert("Android");
return brow = "android";
}
if (navigator.userAgent.indexOf('iPhone') > -1
// || navigator.userAgent.indexOf('Mac') > -1
) {
// alert("iPhone");
return brow = "iPhone";
}
if (navigator.userAgent.indexOf('Trident') > -1) {
// alert("Trident");
return brow = "PC";
}
if (navigator.userAgent.indexOf('Presto') > -1) {
// alert("Presto");
return brow = "PC";
}
if (navigator.userAgent.indexOf('Chrome') > -1) {
// alert("Chrome");
return brow = "PC";
}
if (navigator.userAgent.indexOf('AppleWebKit') > -1) {
// alert("AppleWebKit");
return brow = "iPad";
}
if (navigator.userAgent.indexOf('Gecko') > -1
&& navigator.userAgent.indexOf('KHTML') == -1) {
// alert("Gecko");
return brow = "PC";
}
if (navigator.userAgent.indexOf("Mac OS X") > -1) {
// alert("ios");
return brow = "ios";
}
if (navigator.userAgent.indexOf('Safari') == -1) {
// alert("Safari");
return brow = "PC";
}
return brow;
};
// 获取用户系统信息start
function detectOS() {
let sUserAgent = navigator.userAgent;
let isWin = (navigator.platform == "Win32")
|| (navigator.platform == "Windows");
let isMac = (navigator.platform == "Mac68K")
|| (navigator.platform == "MacPPC")
|| (navigator.platform == "Macintosh")
|| (navigator.platform == "MacIntel");
if (isMac)
return "Mac";
let isUnix = (navigator.platform == "X11") && !isWin && !isMac;
if (isUnix)
return "Unix";
let isLinux = (String(navigator.platform).indexOf("Linux") > -1);
if (isLinux)
return "Linux";
let isIos = (sUserAgent.indexOf("Mac OS X") > -1);
if (isIos)
return "Mac";
if (isWin) {
let isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1
|| sUserAgent.indexOf("Windows XP") > -1;
if (isWinXP)
return "WinXP";
let isWinVista = sUserAgent.indexOf("Windows NT 6.0") > -1
|| sUserAgent.indexOf("Windows Vista") > -1;
if (isWinVista)
return "WinVista";
let isWin7 = sUserAgent.indexOf("Windows NT 6.1") > -1
|| sUserAgent.indexOf("Windows 7") > -1;
if (isWin7)
return "Win7";
let isWin8_1 = sUserAgent.indexOf("Windows NT 6.2") > -1
|| sUserAgent.indexOf("Windows 8") > -1;
let isWin8_2 = sUserAgent.indexOf("Windows NT 6.3") > -1
|| sUserAgent.indexOf("Windows 8.1") > -1;
if (isWin8_1 || isWin8_2)
return "Win8";
let isWin10_1 = sUserAgent.indexOf("Windows NT 6.4") > -1
|| sUserAgent.indexOf("Windows 10") > -1;
let isWin10_2 = sUserAgent.indexOf("Windows NT 10.0") > -1
|| sUserAgent.indexOf("Windows 10") > -1;
if (isWin10_1 || isWin10_2)
return "Win10";
}
return "other";
};
export {
getTerminalType,
detectOS,
}
\ No newline at end of file
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册