提交 ecfcf86a 编写于 作者: 张敬贤's avatar 张敬贤

Feature/zjx

上级 648873e1
...@@ -15,7 +15,8 @@ module.exports = { ...@@ -15,7 +15,8 @@ module.exports = {
'gdp': true, 'gdp': true,
'uni': true, 'uni': true,
'wx': true, 'wx': true,
'qq':true 'qq': true,
'$':true
}, },
// add your custom rules here // add your custom rules here
//it is base on https://github.com/vuejs/eslint-config-vue //it is base on https://github.com/vuejs/eslint-config-vue
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
"vue-fragment": "^1.5.1", "vue-fragment": "^1.5.1",
"vue-router": "^3.3.1", "vue-router": "^3.3.1",
"vuescroll": "^4.15.1", "vuescroll": "^4.15.1",
"jsencrypt": "^3.2.0",
"vuex": "^3.1.1" "vuex": "^3.1.1"
}, },
"devDependencies": { "devDependencies": {
...@@ -55,6 +56,7 @@ ...@@ -55,6 +56,7 @@
"babel-eslint": "^10.1.0", "babel-eslint": "^10.1.0",
"babel-plugin-import": "^1.13.0", "babel-plugin-import": "^1.13.0",
"colors-console": "^1.0.3", "colors-console": "^1.0.3",
"crypto-js": "^4.1.1",
"dotenv": "^8.2.0", "dotenv": "^8.2.0",
"draw-page-structure": "^1.0.8", "draw-page-structure": "^1.0.8",
"eslint": "^6.7.2", "eslint": "^6.7.2",
...@@ -76,7 +78,7 @@ ...@@ -76,7 +78,7 @@
"webpack-bundle-analyzer": "^4.4.2", "webpack-bundle-analyzer": "^4.4.2",
"pdfjs-dist": "2.4.456", "pdfjs-dist": "2.4.456",
"storejs": "2.0.1", "storejs": "2.0.1",
"js-cookie":"3.0.1" "js-cookie": "3.0.1"
}, },
"eslintConfig": { "eslintConfig": {
"root": true, "root": true,
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
</noscript> </noscript>
<div id="app"></div> <div id="app"></div>
<!-- built files will be auto injected --> <!-- built files will be auto injected -->
<script src="<%= VUE_APP_OSS_URL %>static/js/jquery-2.1.1.min.js"></script>
<script src="<%= VUE_APP_OSS_URL %>static/js/vue-2.6.11.js"></script> <script src="<%= VUE_APP_OSS_URL %>static/js/vue-2.6.11.js"></script>
<script src="<%= VUE_APP_OSS_URL %>static/js/vuex-3.4.0.js"></script> <script src="<%= VUE_APP_OSS_URL %>static/js/vuex-3.4.0.js"></script>
<script src="<%= VUE_APP_OSS_URL %>static/js/vue-router-3.3.2.js"></script> <script src="<%= VUE_APP_OSS_URL %>static/js/vue-router-3.3.2.js"></script>
......
import request from 'mn-template/plugins/http';
// 判断是否需要触发拼图风控
export const checkNeedImgCode = (data) => {
return request({
url: '/account/jigsawCode',
method: 'post',
data: data,
headers: {
sourcetype: 4,
},
});
};
// 获取短信验证码
export const getMessageCode = (data) => {
return request({
url: '/account/H5/authCode',
method: 'post',
data: data,
headers: {
sourcetype: 4,
},
});
};
// 获取RSA public key
export const getPubKey = (param) => {
return request({
url: '/account/cipher/key',
method: 'get',
params: param,
headers: {
sourcetype: 4,
},
});
};
// /tis/insurance / login
export const insuranceLogin = (data) => {
return request({
method: 'post',
url: '/tis/insurance/login',
data: data,
withCredentials: true,
});
};
// / 获取type=的协议名称
export const getProtocolContentByType = (type) => {
return request({
method: 'get',
url: `/smartcontract/protocol/content?type=${type}`,
withCredentials: true,
});
};
// 获取type=的协议内容
export const getProtocolNameByType = (type) => {
return request({
method: 'get',
url: `/smartcontract/protocol/name?type=${type}`,
withCredentials: true,
});
};
//
export const getPrototypes = (projectEquityNo) => {
return request({
method: 'get',
url: `tis/insurance/prototypes?projectEquityNo=${projectEquityNo}`,
withCredentials: true,
});
};
<template>
<div class="slide-check-wrap">
<!-- <p class="slide-text">向右滑动完成验证</p>
<SlideToCheck @slideCallback="slideCallback"/>-->
<div id="imgScode" />
</div>
</template>
<script>
import { checkNeedImgCode, getMessageCode } from '@/api/login';
import { mapState, mapActions } from 'vuex';
import { sendEncryptRequest } from '@/utils/encrypt';
export default {
name: 'SlideCheck',
props: {
mobile: {
type: String,
default: ''
},
},
computed: {
...mapState('home', {
imgCodeData: state => state.imgCodeData
})
},
mounted() {
console.log(this.imgCodeData);
// const {slidingImage, backImage, yHeight} = this.imgCodeData;
this.initImgCode(this.imgCodeData);
},
methods: {
...mapActions('home', ['setNeedTimer']),
getImg(type) {
const data = {
mobile: this.mobile,
jigsawVersion: 'v1'
};
sendEncryptRequest(data, params => {
checkNeedImgCode(params).then(res => {
this.initImgCode(res.data, type);
});
});
},
initImgCode(data, type) {
const _this = this;
$('#imgScode').imgcode({
frontimg: 'data:image/png;base64,' + data.slidingImage,
backimg: 'data:image/png;base64,' + data.backImage,
yHeight:data.yHeight,
refreshcallback: function () {
// 刷新验证码
_this.getImg(type);
},
closecallback: function () {
// 关闭弹框
_this.$emit('closeSlideCheckpageDialog');
},
callback: function (msg) {
_this.getMsgCode(_this, msg, data, type);
}
});
},
refreshImg(type) {
// const _this = this;
const data = {
mobile: this.mobile,
jigsawVersion: 'v1'
};
sendEncryptRequest(data, params => {
checkNeedImgCode(params).then(res => {
// eslint-disable-next-line
this.initImgCode(res.data, type);
// $('#imgScode').imgcode({
// frontimg: 'data:image/png;base64,' + res.data.slidingImage,
// backimg: 'data:image/png;base64,' + res.data.backImage,
// yHeight: res.data.yHeight,
// refreshcallback: function () {
// // 刷新验证码
// _this.getImg(type);
// },
// closecallback: function () {
// // 关闭弹框
// _this.$emit('closeSlideCheckpageDialog');
// },
// callback: function (msg) {
// const $this = this;
// _this.getMsgCode($this, msg, res.data, type);
// }
// });
});
});
},
// eslint-disable-next-line
getMsgCode($this, msg, data, type) {
const data1 = {
mobile: this.mobile,
flag: this.fromType, // 0登录(默认)1注册 2微信登录绑定手机 3修改手机 4重置密码
capCode: data.capCode,
xpos: msg.xpos,
imageW: msg.imageW
};
sendEncryptRequest(data1, params => {
getMessageCode(params).then(res => {
if (res.code == '000000') {
this.$emit('closeSlideCheckpageDialog');
// 如果是从验证码页面进来,直接关闭页面,开始倒计时
this.$emit('refreshGetMsg');
this.setNeedTimer();
} else {
$this.getfail(res.message);
}
});
});
this.$sendBuriedData({
component_tag: '905#905001'
});
}
}
};
</script>
<style lang="scss">
.slide-check-wrap {
width: auto;
height: auto;
margin: 0 auto;
.slide-text {
width: 100%;
color: #373839;
font-size: 20px;
font-weight: 700;
padding: 30px 0 20px;
}
}
.code-k-div {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(55, 56, 57, 0.6);
z-index: 999;
display: flex;
display: -webkit-flex;
justify-content: center;
-webkit-justify-content: center;
align-items: center;
}
.icon-login-bg {
background-image: url('~@/assets/images/loginicon.png');
background-repeat: no-repeat;
}
.code-con {
width: 330px;
background-color: #fff;
z-index: 1000;
-moz-user-select: none;
/* -webkit-user-select: none;
align-self: flex-start;
-webkit-align-self: flex-start; */
/* margin-top: 30px; */
border-radius: 6px;
}
.close-dialog {
text-align: right;
}
.close-dialog-img {
width: 25px;
height: 25px;
margin-right: 15px;
}
.code-img {
margin: 5px auto;
padding: 5px 0;
width: 300px;
background-color: #f5f6f7;
}
.code-back-img {
width: 100%;
}
.code-img img {
display: block;
}
.icon-w-25 {
display: inline-block;
width: 25px;
height: 25px;
text-indent: -9999px;
}
.icon-push {
background-position: 81% 75%;
}
.code-push {
height: 25px;
display: flex;
display: -webkit-flex;
align-items: center;
-webkit-align-items: center;
}
.code-btn {
position: relative;
height: 30px;
text-align: center;
color: #999;
margin: 16px 10px 24px 10px;
box-sizing: border-box;
background-color: #f5f6f7;
border-radius: 15px;
border: 1px solid #e1e1e1;
}
.code-btn-m {
position: absolute;
width: 35px;
height: 35px;
border-radius: 50%;
background-color: #f5f6f7;
border: 1px solid #e1e1e1;
z-index: 5;
top: -4px;
left: 5px;
box-shadow: 0 0 3px #ccc;
cursor: pointer;
background-position: 39.5% 50%;
}
.code-btn-img {
background-image: url('~@/assets/images/arrow.png');
background-repeat: no-repeat;
}
.code-btn-img.active {
background-position: 82% 50%;
}
.code-span {
display: block;
height: 100%;
font-size: 14px;
line-height: 30px;
}
.code-btn-img.error {
background-position: 6px 50%;
}
.code-img-con {
position: relative;
}
.code-mask {
width: 60px;
position: absolute;
top: 0;
left: 0;
z-index: 10;
}
.code-front-img {
width: 100%;
}
.code-tip {
padding-left: 10px;
font-size: 12px;
color: #999;
margin-top: 4px;
}
.code-tip-red {
color: red;
}
.code-tip-green {
color: green;
}
</style>
<template>
<div
ref="dragDiv"
class="slide-to-check-wrap"
:class="{ 'slide-ok': confirmSuccess }"
>
<div class="drag_bg" />
<div
ref="moveDiv"
class="handler handler_bg"
:class="{ handler_ok_bg: confirmSuccess }"
@touchstart="mousedownFn($event)"
>
>
</div>
</div>
</template>
<script>
export default {
name: 'SlideToCheck',
data() {
return {
beginClientX: 0, // 距离屏幕左端距离
mouseMoveStata: false, // 触发拖动状态 判断
maxwidth: '', // 拖动最大宽度,依据滑块宽度算出来的
confirmSuccess: false // 验证成功判断
};
},
mounted() {
const htmlEle = document.getElementsByTagName('html')[0];
this.maxwidth =
this.$refs.dragDiv.clientWidth - this.$refs.moveDiv.clientWidth - 4;
htmlEle.addEventListener('touchmove', this.mouseMoveFn);
htmlEle.addEventListener('touchend', this.moseUpFn);
},
methods: {
mousedownFn: function (evt) {
if (!this.confirmSuccess) {
evt.preventDefault && evt.preventDefault(); // 阻止文字选中等默认事件
this.mouseMoveStata = true;
this.beginClientX = evt.changedTouches[0].clientX;
}
},
mouseMoveFn(evt) {
if (this.mouseMoveStata) {
const width = evt.changedTouches[0].clientX - this.beginClientX;
if (width > 0 && width <= this.maxwidth) {
document.getElementsByClassName('handler')[0].style.left =
width + 'px';
document.getElementsByClassName('drag_bg')[0].style.width =
width + 'px';
} else if (width > this.maxwidth) {
this.successHandle();
}
}
},
successHandle() {
this.confirmSuccess = true;
const htmlEle = document.getElementsByTagName('html')[0];
if (window.addEventListener) {
htmlEle.removeEventListener('touchmove', this.mouseMoveFn);
htmlEle.removeEventListener('touchend', this.moseUpFn);
} else {
htmlEle.removeEventListener('touchend', () => {});
}
document.getElementsByClassName('handler')[0].style.left =
this.maxwidth + 'px';
document.getElementsByClassName('drag_bg')[0].style.width =
this.maxwidth + 'px';
this.$emit('slideCallback');
},
moseUpFn(evt) {
this.mouseMoveStata = false;
const width = evt.changedTouches[0].clientX - this.beginClientX;
if (width < this.maxwidth) {
document.getElementsByClassName('handler')[0].style.left = 0 + 'px';
document.getElementsByClassName('drag_bg')[0].style.width = 0 + 'px';
}
}
}
};
</script>
<style lang="scss">
.slide-to-check-wrap {
position: relative;
background-color: #e7e8e9;
margin: 0 auto;
width: 325px;
height: 40px;
border-radius: 4px;
line-height: 40px;
text-align: center;
&.slide-ok {
background: #449284;
}
.handler {
width: 36px;
height: 36px;
position: absolute;
top: 0px;
left: 0px;
cursor: move;
margin: 2px;
}
.handler_bg {
background: url('~@/assets/images/slide-icon.png') no-repeat center;
background-size: 100% 100%;
}
.handler_ok_bg {
background: url('~@/assets/images/slide-ok.png') no-repeat center;
background-size: 100% 100%;
}
.drag_bg {
background-color: #449284;
border-radius: 4px 0 0 4px;
height: 40px;
width: 0px;
}
}
</style>
...@@ -5,8 +5,12 @@ console.log('router, store, vueApp: ', router, store, vueApp); ...@@ -5,8 +5,12 @@ console.log('router, store, vueApp: ', router, store, vueApp);
import '@/assets/js/flexible'; import '@/assets/js/flexible';
import {isWeixin } from './utils/index'; import {isWeixin } from './utils/index';
import Loading from '@/components/loading/loading.js'; import Loading from '@/components/loading/loading.js';
import CryptoJS from 'crypto-js/crypto-js';
import JsEncrypt from 'jsencrypt/bin/jsencrypt';
// 禁用双指放大 // 禁用双指放大
window.JSEncrypt = JsEncrypt;
window.CryptoJS = CryptoJS;
var lastTouchEnd = 0; var lastTouchEnd = 0;
document.addEventListener('touchstart', function (event) { document.addEventListener('touchstart', function (event) {
if (event.touches.length > 1) { if (event.touches.length > 1) {
......
/**
* 图片验证码
*/
(function ($) {
$.fn.imgcode = function (options) {
// 初始化参数
var defaults = {
frontimg: '',
backimg: '',
refreshImg: '',
getsuccess: '',
getfail: '',
maskclose: true,
callback: '',
// 回调函数
refreshcallback: '',
yHeight: 1,
closecallback: ''
};
var opts = $.extend(defaults, options);
return this.each(function () {
var $this = $(this); // 获取当前对象
var html =
'<div class="code-k-div">' +
'<div class="code-con">' +
'<div class="close-dialog"><img class="close-dialog-img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABx0lEQVRoQ+2YMU7EMBBFZ4iAIqEGiY5my0hxBVwAagrgAHAoOABQUMMFgMqRUqahQ4KapAAUjII2UhQt8Ti747CWt7U9nve/Z7wxgiM/dIQDPMh/c9I74h1hUsAfLSZhB4f1jgyWjmmhd4Qo7IoQ4kgptY6IN1LKL+K63mlCiFWl1DEifkgpbwHgm9URIcQFAJxNs3ooiuIwz/P3eWAmk8lGFEV3ALA/jXMppTznBnkFgM0mcaXUY1mWB0NhaogwDO8Rca8lxpuUcosVJEmSK0Q8aTswFOYPCFBKXadpesoK0rO5kTOUOKwgtROUJPpqhrqeHWQeGCpEvYcVkCEwJhBWQUxgTCGsg1Bg6jkzWmzdnXobhLWj1S7oHsWfftVF3DVt2aOA9DnT7WA6J5r5o4FQYKgQo9RIV/E4jreDIHhGxLXOcfqsqmony7IXyn8z7whFpSE39lLViBNdS3fZLcU9ooNovlOo89rH0FqxmyZnOt8KiGlSjdIm69hBTJKZ1eWo61lBqEnoWjklDiuIM9/sQgg3XlGcedcCADdeGnVFvMhx1mJfZKK6WB5Ep5Dtce+IbcV1+3lHdArZHveO2FZct58zjvwAy/P8Qikq2y8AAAAASUVORK5CYII="></div>' +
'<div class="code-img">' +
'<div class="code-img-con">' +
'<div class="code-mask"><img class="code-front-img" src="' +
opts.frontimg +
'"></div>' +
'<img id="BigImg" class="code-back-img" src="' +
opts.backimg +
'"></div>' +
'<div class="code-push"><i class="icon-login-bg icon-w-25 icon-push">刷新</i><span class="code-tip"></span></div>' +
'</div>' +
'<div class="code-btn">' +
'<div class="code-btn-img code-btn-m"></div>' +
'<span class="code-span">按住滑块,拖动完成上方拼图</span>' +
'</div></div></div>';
$this.html(html);
// $('.code-mask').css('margin-top', `${(opts.yHeight * 2) / 75}rem`);
$('.code-mask').css('margin-top', `${opts.yHeight}px`);
// 定义拖动参数
var $divMove = $(this).find('.code-btn-img'); // 拖动按钮
var $divWrap = $(this).find('.code-btn'); // 鼠标可拖拽区域
var mX = 0;
mY = 0; // 定义鼠标X轴Y轴
var dX = 0,
dY = 0; // 定义滑动区域左、上位置
var isDown = false; // touchmove标记
if (document.attachEvent) {
// ie的事件监听,拖拽div时禁止选中内容,firefox与chrome已在css中设置过-moz-user-select:
// none; -webkit-user-select:
// none;
$divMove[0].attachEvent('onselectstart', function () {
return false;
});
}
// 按钮拖动事件
$divMove.on('touchstart', function (e) {
// 清除提示信息
$this.find('.code-tip').html('');
var event = e || window.event;
mX = event.originalEvent.touches[0].pageX;
dX = $divWrap.offset().left;
dY = $divWrap.offset().top;
console.log('event', mX, dX, dY);
isDown = true; // 鼠标拖拽启
$(this).addClass('active');
// 修改按钮阴影
$divMove.css({
'box-shadow': '0 0 8px #666'
});
});
/* // 点击背景关闭
if (opts.maskclose) {
$this.find(".code-k-div").unbind('click').click(function() {
$this.html("");
})
}*/
// 关闭按钮事件
$this
.find('.close-dialog')
.unbind('click')
.click(function () {
opts.closecallback();
});
// 刷新code码
$this
.find('.icon-push')
.unbind('click')
.click(function () {
opts.refreshcallback();
});
// 鼠标点击松手事件
$divMove.on('touchend', function (e) {
var lastX = $this.find('.code-mask').offset().left - dX - 1;
isDown = false; // 鼠标拖拽启
$divMove.removeClass('active');
// 还原按钮阴影
$divMove.css({
'box-shadow': '0 0 3px #ccc'
});
var imgW = $('#BigImg').width();
returncode(lastX, imgW);
});
// 滑动事件
$divWrap.on('touchmove', function (event) {
var event = event || window.event;
var x = event.originalEvent.touches[0].pageX; // 鼠标滑动时的X轴
if (isDown) {
if (x > dX + 30 && x < dX + $(this).width() - 20) {
$divMove.css({
left: x - dX - 20 + 'px'
}); // div动态位置赋值
$this.find('.code-mask').css({
left: x - dX - 30 + 'px'
});
}
}
event.preventDefault();
});
// 返回坐标系
function returncode(xpos, imageW) {
opts.callback({
xpos: xpos,
imageW: imageW
});
}
// 验证数据
function checkcode(code) {
var iscur = true;
// 模拟ajax
setTimeout(function () {
if (iscur) {
checkcoderesult(1, '验证通过');
$this.find('.code-k-div').remove();
opts.callback({
code: 1000,
msg: '验证通过',
msgcode: '23dfdf123'
});
} else {
$divMove.addClass('error');
checkcoderesult(0, '验证不通过');
opts.callback({
code: 1001,
msg: '验证不通过'
});
setTimeout(function () {
$divMove.removeClass('error');
$this.find('.code-mask').animate(
{
left: '0px'
},
200
);
$divMove.animate(
{
left: '10px'
},
200
);
}, 300);
}
}, 500);
}
// 刷新图标
opts.refreshImg = function (data) {
console.log(data);
// $this.find(".code-img-con .code-front-img").attr("src", data.frontImg);
// $this.find(".code-img-con .code-back-img").attr("src", data.backGoundImg);
};
// 验证成功
opts.getsuccess = function () {
checkcoderesult(1, '验证通过');
setTimeout(function () {
$this.find('.code-k-div').remove();
}, 800);
};
// 验证失败
opts.getfail = function (txt) {
$divMove.addClass('error');
checkcoderesult(0, txt);
setTimeout(function () {
$divMove.removeClass('error');
$this.find('.code-mask').animate(
{
left: '0px'
},
200
);
$divMove.animate(
{
left: '10px'
},
200
);
}, 400);
};
// 验证结果
function checkcoderesult(i, txt) {
if (i == 0) {
$this.find('.code-tip').addClass('code-tip-red');
} else {
$this.find('.code-tip').addClass('code-tip-green');
}
$this.find('.code-tip').html(txt);
}
});
};
})(jQuery);
...@@ -121,17 +121,20 @@ const routerConfig = [ ...@@ -121,17 +121,20 @@ const routerConfig = [
name: 'sz-home', name: 'sz-home',
component: () => import('@/views/sz-home/index.vue'), component: () => import('@/views/sz-home/index.vue'),
}, },
{
path: '/login',
name: 'login',
component: () => import('@/views/login/index.vue'),
meta: {
keepAlive: true,
},
},
{
path: '/protocol',
name: 'protocol',
component: () => import('@/views/login/protocol.vue'),
},
]; ];
// // 无问卷-0001 有问卷未填写-0101 已填写问卷未出结果-0102 已出结果无需领用-0401 已出结果未预约-0201 已预约未采样-0301 已预约已采样-0302
// const routerMap = {
// '0001': null,
// '0101': null,
// '0102': null,
// '0401': null,
// '0201': '/appoint',
// '0301': null,
// '0302': null,
// };
router.beforeEach(async (to, from, next) => { router.beforeEach(async (to, from, next) => {
headerConfigByMeta(to); headerConfigByMeta(to);
next(); next();
......
...@@ -4,7 +4,9 @@ export default { ...@@ -4,7 +4,9 @@ export default {
namespaced: true, namespaced: true,
state: { state: {
insuranceInfo: {}, insuranceInfo: {},
orderInfo:{} orderInfo: {},
imgCodeData: '',
needTimer:null
}, },
mutations: { mutations: {
// 存值 // 存值
...@@ -13,7 +15,13 @@ export default { ...@@ -13,7 +15,13 @@ export default {
}, },
SET_ORDER_INFO(state, val = {}) { SET_ORDER_INFO(state, val = {}) {
state.orderInfo = val; state.orderInfo = val;
} },
SET_IMGDATA: (state, imgCodeData) => {
state.imgCodeData = imgCodeData;
},
SET_NEEDTIMER: (state, needTimer) => {
state.needTimer = needTimer;
},
}, },
actions: { actions: {
// 暂存保险订单信息 // 暂存保险订单信息
...@@ -26,6 +34,13 @@ export default { ...@@ -26,6 +34,13 @@ export default {
console.log('SET_ORDER_INFO', data); console.log('SET_ORDER_INFO', data);
store.set('orderInfo', data); store.set('orderInfo', data);
}, },
setNeedTimer({ commit }) {
commit('SET_NEEDTIMER', true);
},
setImgCodeData({ commit }, imgCodeData) {
console.log(22334);
commit('SET_IMGDATA', imgCodeData);
},
}, },
getters: { getters: {
// 获取 insuranceInfo 的值 // 获取 insuranceInfo 的值
......
/*
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 { Toast } from 'vant';
// import { CryptoJS } from './aes';
// import { JSEncrypt } from 'jsencrypt';
// if (process.client) {
// require('jsencrypt');
// }
import { getPubKey } from '@/api/login';
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;
}
// 加密传参,发送请求
async function sendEncryptRequest(content, cb) {
console.log('content', content);
content = JSON.stringify(content); // 后端要求转 string
const params = null;
if (pubKey) {
// pubKey获取过就不用再获取了
const params = formatContent(content, pubKey);
cb && cb(params);
} else {
handleGetPubKey(content, cb);
}
return params;
}
// get public key
function handleGetPubKey(content, cb) {
// debugger;
getPubKey().then((res) => {
// console.log('>>>>>>>>>>>>>>>>>>>> publicKey: ', res);
/* if(res.status && res.status === 200) {
res = res.data;
}*/
console.log('res------', res);
// debugger;
if (res.code == '000000') {
pubKey = res.data;
if (cb) {
const params = formatContent(content, pubKey);
cb && cb(params);
}
} else {
Toast({
message: (res && res.message) || '接口出错',
duration: 1500,
});
}
});
}
// format account params
function formatContent(content, pubKey) {
// obj为具体的json传参
const aesKey = getAesKey(16);
const params = {
key: '',
content: '',
};
params.content = AesEncrypt(content, aesKey);
params.key = RsaEncrypt(aesKey, pubKey);
return params;
}
// AES encrypt
function AesEncrypt(content, aesKey) {
const sKey = CryptoJS.enc.Utf8.parse(aesKey);
const sContent = CryptoJS.enc.Utf8.parse(content);
const encrypted = CryptoJS.AES.encrypt(sContent, sKey, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
});
return encrypted.toString();
}
// RSA encrypt
function RsaEncrypt(aesKey, pubKey) {
const _encrypt = new JSEncrypt();
const boss_public_key = pubKey;
_encrypt.setPublicKey(boss_public_key);
const encrypted = _encrypt.encrypt(aesKey);
return encrypted;
}
export {
getAesKey,
sendEncryptRequest,
handleGetPubKey,
formatContent,
AesEncrypt,
RsaEncrypt,
};
<template>
<div class="insurance-login">
<van-form
ref="loginForm"
class="insurance-login-form"
>
<!-- 控制补全信息显示隐藏 -->
<template v-if="!need">
<div>
<div class="login-form-label">
<span>*</span>领取人手机号
</div>
<div class="login-form-tips">
<van-icon name="warning-o" />为保证筛查准确性,请本人填写相关信息和联系方式
</div>
<van-field
v-model="formData.mobilePhone"
name="手机号"
clearable
placeholder="手机号"
:rules="[{ required: true, message: '请输入手机号' },{ validator:validatorPhoneNum, message: '手机号格式填写有误' }]"
/>
<div
class="login-form-message"
>
<van-field
v-model="formData.checkCode"
center
clearable
placeholder="请输入验证码"
:rules="[{ required: true, message: '请输入验证码' }]"
/>
<van-button
size="small"
type="primary"
class="message-btn"
:class="{'send-btn' : isSend}"
native-type="button"
@click="getCode"
>
{{ isSend ? `${second}S后重发` : "获取验证码" }}
</van-button>
</div>
</div>
</template>
<template v-else>
<div>
<div class="login-form-label">
<span>*</span>领取人姓
</div>
<van-field
v-if="need"
v-model="formData.patientName"
clearable
name="领取人姓名"
placeholder="请输入领取人姓名"
:rules="[{ required: true, message: '请输入领取人姓名' },
{ validator:validatorName, message: '请输入正确姓名,不少于两个字' }]"
/>
<div class="login-form-label">
<span>*</span>领取人身份
</div>
<van-field
v-if="need"
v-model="formData.idCard"
clearable
name="领取人身份证"
placeholder="请输入领取人身份证"
:rules="[{ required: true, message: '请输入领取人身份证' },{ validator:validatorIdCard, message: '身份证号码格式填写有误' }]"
/>
</div>
</template>
<div
class="login-form-submit"
@click="submit"
>
{{ need ? '领取权益':'领取/查看权益' }}
</div>
</van-form>
<!-- 滑块验证 -->
<slideToCheck
v-if="showCheckDialog"
:mobile="formData.mobilePhone"
@closeSlideCheckpageDialog="closeSlideCheckpageDialog"
@refreshGetMsg="refreshGetMsg"
/>
<!-- 用户协议 -->
<div
v-if="need"
class="insurance-login-agreement"
>
<van-checkbox
v-model="checked"
>
我已阅读并同意 <span @click="goProtocol(prototypes.yqjkyhxy)">《云鹊健康用户协议》</span> 和 <span @click="goProtocol(prototypes.yhzqtys)">《云鹊隐私声明》</span>
</van-checkbox>
</div>
</div>
</template>
<script>
import { mapActions } from 'vuex';
import { sendEncryptRequest } from '@/utils/encrypt';
import { checkNeedImgCode, getMessageCode, insuranceLogin, getPrototypes } from '@/api/login';
import { signDetection} from '@/api/detection.js';
import slideToCheck from '@/components/slide-check/index';
export default {
components: {
slideToCheck
},
data() {
return {
formData: {
patientName: '',
mobilePhone: '',
idCard: '',
checkCode:''
},
need:false,
checked:false,
timer:null,
isSend: false,
second: 60,
sixThen: 60,
showCheckDialog: false,
prototypeId:'',
prototypeLogId: '',
prototypes: {},
token: '',
patientId:''
};
},
computed: {
},
mounted() {
const {projectEquityNo} = this.$route.query;
this.projectEquityNo = projectEquityNo;
this.getPrototypes(projectEquityNo);
},
methods: {
...mapActions('home', ['setImgCodeData', 'setNeedTimer']),
// 验证姓名
validatorName(val) {
console.log(val);
if (val === '') {
return true;
}
return /^[\u4E00-\u9FA5A-Za-z\s]+(·[\u4E00-\u9FA5A-Za-z]+)*$/.test(val);
},
// 验证手机号码
validatorPhoneNum(val) {
console.log(val);
if (val === '') {
return true;
}
return /^([1][3,4,5,6,7,8,9])\d{9}$/.test(val);
},
// 验证身份证
validatorIdCard(val) {
console.log(val);
if (val === '') {
return true;
}
return /^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/.test(val);
},
// 关闭 滑块
closeSlideCheckpageDialog() {
this.showCheckDialog = false;
},
// 获取协议id
getPrototypes(projectEquityNo) {
getPrototypes(projectEquityNo).then(res => {
console.log(res);
this.prototypes = res.data;
});
},
// 获取验证码
getCode() {
this.checkControlStatus();
},
// 发送验证码
refreshGetMsg() {
this.$toast({
message: '验证码已发送',
icon: 'passed',
});
this.isSend = true;
this.second--;
this.timer = setInterval(() => {
this.second--;
if (this.second <= 0) {
clearInterval(this.timer);
this.second = this.sixThen;
this.isSend = false;
}
}, 1000);
},
signDetection(protocolType, patientId) {
const obj = {
protocolType,
patientId
};
signDetection(obj).then(res => {
if (res.code !== '000000') {
return this.$toast(res.message);
}
});
},
checkControlStatus() {
const data = {
mobile: this.formData.mobilePhone,
jigsawVersion: 'v1',
};
sendEncryptRequest(data, (params) => {
checkNeedImgCode(params).then((res) => {
if (res.code == '000000') {
if (res.data.capCode) {
// 跳转至风控页面
this.setImgCodeData(res.data);
this.showCheckDialog = true;
} else {
// 不需要风控直接获取验证码
getMessageCode();
}
} else {
this.$toast(res.message);
}
});
});
},
// 提交事件
submit() {
this.$refs.loginForm.validate().then(res => {
console.log(res);
if (this.formData.checkCode == '') {
this.$toast('请输入验证码');
return;
}
if (this.need && !this.checked) {
this.$toast('请勾选同意底部协议后进行登录');
return;
}
const data = {
checkCode: this.formData.checkCode,
idCard: this.formData.idCard,
mobilePhone: this.formData.mobilePhone,
patientName: this.formData.patientName,
projectEquityNo:this.projectEquityNo,
};
if (this.need) {
data.checkCode = '';
data.token = this.token;
}
insuranceLogin(data).then(res => {
console.log(res.code);
if (res.code == '000000') {
this.patientId = res.data.patientId;
if (res.data.status == '0') {
this.need = true;
if (res.data.token) {
this.token = res.data.token;
}
this.$dialog.alert({
title: '温馨提示',
message: '您尚未领取过本权益,需要完善相关信息',
theme: 'round-button',
confirmButtonColor:'#00bda5'
});
} else {
this.signDetection(this.prototypes.yqjkyhxy, this.patientId);
this.signDetection(this.prototypes.yhzqtys, this.patientId);
if (res.data.statusCode == '0101') {
window.location.href = res.data.questionnaireUrl;
} else {
const { externalOrderNo, projectEquityNo } = res.data;
this.$router.push({
path: '/home',
query: {
projectEquityNo,
externalOrderNo
}
});
}
}
}else {
this.$toast(res.message);
}
});
});
},
// 页面跳转
goProtocol(type) {
this.$router.push({
path: '/protocol',
query: {
type
}
});
}
}
};
</script>
<style lang="scss" scoped>
.insurance-login{
height: 100vh;
overflow: hidden;
background-image: url('~@/assets/images/bg-login.png');
background-repeat: no-repeat;
background-size: 100% 208px;
.insurance-login-form{
margin:168px auto 100px auto;
padding: 24px 19px;
background: #fff;
width: 317px;
background: linear-gradient(180deg, #FFFFFF 0%, #FFFFFF 100%);
box-shadow: 0px 18px 12px 0px #EBF9F8;
border-radius: 40px;
border: 1px solid rgba(0,189,165,0.33);
.login-form-label{
display: flex;
align-items: center;
height: 16px;
font-size: 15px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 600;
color: #02120F;
line-height: 16px;
margin-bottom: 10px;
span{
margin-right: 3px;
color: #FB602D;
}
}
.login-form-tips{
height: 16px;
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #999999;
line-height: 16px;
margin-bottom: 18px;
.van-icon{
margin-right: 4px;
}
}
.login-form-bottom{
height: 10px;
}
.login-form-message{
display: flex;
justify-content: space-between;
.van-field{
width: 170px;
}
.message-btn{
width: 130px;
height: 44px;
border-radius: 6px;
background: #00BDA5 ;
border: 1px solid #00BDA5;
font-size: 16px;
line-height: 44px;
}
}
.login-form-submit{
width: 240px;
height: 64px;
margin: 0 auto;
background: linear-gradient(271deg, #15CBB6 0%, #19C6B2 44%, #32ECCD 100%);
box-shadow: 0px 7px 7px 0px rgba(43,225,197,0.26), inset 0px 3px 7px 0px rgba(243,255,255,0.48), inset 0px -3px 8px 0px rgba(97,184,169,0.5);
border-radius: 66px;
border-image: linear-gradient(274deg, rgba(157, 254, 239, 1), rgba(226, 255, 250, 1)) 2 2;
font-size: 21px;
font-family: PingFangSC-Semibold, PingFang SC;
text-align: center ;
font-weight: 600;
color: #FFFFFF;
line-height: 64px;
margin-bottom: 15px;
}
.van-field {
overflow: visible;
padding: 0;
margin-bottom: 15px;
/deep/.van-field__value{
}
/deep/ .van-field__body{
height: 44px;
background: #F7F8F9;
align-items: center;
padding: 0 12px;
border-radius: 6px;
}
/deep/ .van-field__error-message{
padding-left: 12px;
}
&::after{
display: none;
}
}
}
.insurance-login-agreement{
display: flex;
justify-content: center;
align-items: center;
height: 21px;
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #999999;
line-height:21px;
span{
color: #00BDA5;
}
/deep/ .van-checkbox__icon{
height: 12px;
width: 12px;
}
/deep/ .van-checkbox__icon .van-icon{
height: 12px;
width: 12px;
font-size: 12px;
line-height: 12px;
}
/deep/ .van-checkbox__icon--checked .van-icon{
background: #00BDA5;
border-color: #00BDA5
}
/deep/ .van-checkbox__label{
margin-left: 4px;
}
}
}
</style>
<template>
<div class="protocol">
<div class="protocol-name">
{{ name }}
</div>
<div
class="protocol-content"
v-html="content"
/>
</div>
</template>
<script>
import { getProtocolContentByType, getProtocolNameByType} from '@/api/login';
export default {
data() {
return {
name: '',
content: '',
title:''
};
},
mounted() {
const { type } = this.$route.query;
this.title = type == 5 ? '云鹊隐私声明' : '云鹊健康用户协议';
document.querySelector('title').innerHTML = this.title;
this.getProtocolNameByType(type);
this.getProtocolContentByType(type);
},
methods: {
getProtocolContentByType(type) {
getProtocolContentByType(type).then(res => {
console.log(res);
this.content = res.data;
console.log('1 ', this.content);
});
},
getProtocolNameByType(type) {
getProtocolNameByType(type).then(res => {
console.log(res);
this.name = res.data;
});
},
}
};
</script>
<style lang="scss" scoped>
.protocol{
height: 100vh;
overflow-y: auto;
overflow-x: hidden;
background: #fff;
}
.protocol-name{
height: 20px;
font-size: 20px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 600;
color: #02120F;
line-height: 20px;
text-align: center;
margin: 15px 0;
}
.protocol-content{
font-size: 15px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #02120F;
line-height: 23px;
width: 345px;
margin: 0 auto 50px auto;
}
</style>
...@@ -23,6 +23,7 @@ module.exports = { ...@@ -23,6 +23,7 @@ module.exports = {
vuex: 'Vuex', vuex: 'Vuex',
'vue-router': 'VueRouter', 'vue-router': 'VueRouter',
'vconsole': 'VConsole', 'vconsole': 'VConsole',
jqery: 'jQuery',
axios: 'axios', axios: 'axios',
vant: 'vant', vant: 'vant',
'crypto-js/crypto-js': 'CryptoJS', 'crypto-js/crypto-js': 'CryptoJS',
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册