Files
dvcp_v2_webapp/ui/packages/common/AiSign/AiSign.vue
2022-12-01 09:35:20 +08:00

232 lines
5.4 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<section class="ai-sign" v-if="visible">
<el-row type="flex">
<el-card :class="{'sign-in-hidden':!signInState}">
<ai-sign-in
v-if="!sassLogin"
ref="signIn"
@signIn="SignIn"
:showPhoneLogin="showPhoneLogin"
:showScanLogin="showScanLogin"
:instance="instance"
@qrlogin="onQRlogin"
@sendMessage="sendMsg"
@resetPwd="signInState=false"/>
<h2 class="scan-title sassLogin" v-else>手机扫码安全登录</h2>
<template v-if="tpLoginList.length>0">
<div class="divider" v-text="`第三方账号登录`"/>
<el-row class="tpLogin" type="flex" align="middle">
<el-tooltip v-for="(tp,i) in tpLoginList" :key="i" :content="tp.label" placement="top">
<ai-icon class="item" v-bind="tp" @click.native.stop="tp.click"/>
</el-tooltip>
</el-row>
</template>
</el-card>
<el-card class="change-password" :class="{'change-password-hidden':signInState}">
<ai-change-pwd @signUp="ChangePwd" :instance="instance" @toLogin="signInState=true"/>
</el-card>
</el-row>
</section>
</template>
<script>
import AiSignIn from "./signIn";
import AiChangePwd from "./changePwd";
export default {
name: "AiSign",
components: {AiChangePwd, AiSignIn},
props: {
/**
* 是否展示
*/
visible: Boolean,
/**
* 显示手机号登陆模块
*/
showPhoneLogin: {default: true},
/**
* 显示扫码登录
*/
showScanLogin: {default: true},
/**
* 接口工具类
*/
instance: {required: true, type: Function},
/**
* 请求接口类
* login :手机密码登录;mobile:手机验证码登录;
* qr:手机扫码登录 qrStatus:扫码状态
* changePwd:更换密码 verification:验证码验证
*/
action: Object,
/**
* 第三方登录列表: wxwork:企业微信
*/
tps: {default: () => []},
/**
* 是否是sass版本登录
*/
sassLogin: Boolean
},
provide() {
return {
actions: this.actions,
sassLogin: this.sassLogin
}
},
computed: {
actions() {
let action = {
login: "/auth/oauth/token",
mobile: "/auth/mobile/token",
qr: "/auth/qr-con/token",
qrStatus: "/admin/user/getQrStatus",
qrKey: "/admin/user/getQrKey",
code: "/auth/token/code",
failTimes: "/admin/user/getloginFailNum",
changePwd: "/admin/user/update-pwd",
verification: "/admin/user/checkPhone"
}
return {...action, ...this.action}
},
tpLoginList() {
let list = [
{
label: "企微登录", icon: "iconqiwei", key: 'wxwork', type: 'svg', click: () => {
location.href = `https://open.work.weixin.qq.com/wwopen/sso/3rd_qrConnect?appid=ww596787bb70f08288&redirect_uri=${encodeURIComponent(location.href)}&usertype=member`
}
}
]
return list.filter(e => this.tps.includes(e.key)) || []
}
},
data() {
return {
signInState: true
}
},
methods: {
ChangePwd(params) {
this.instance.post(this.actions.changePwd, null, {
params: {
phone: params.account,
code: params.verifictCode,
newPwd: params.password
}
}).then(res => {
if (res) {
this.$message.success("修改成功!")
this.signInState = true
}
})
},
SignIn(params, url) {
let password = this.$encryption(params)
this.instance.post(url, null, {
auth: {
username: 'villcloud',
password: "villcloud"
},
params: {
grant_type: 'password',
scope: 'server',
...params,
password
}
}).then(data => {
if (!data) {
this.$refs.signIn.handleInput()
} else {
this.$emit("login", data)
}
}).catch(() => {
this.$refs.signIn.handleInput()
})
},
getNowDate() {
const date = new Date()
return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate()
},
sendMsg(phone) {
this.instance.post(this.actions.verification, null, {
auth: {},
params: {phone}
}).then(() => this.$message.success("发送成功!"))
},
onQRlogin(data) {
this.$emit('login', data)
}
}
}
</script>
<style lang="scss" scoped>
.ai-sign {
width: 400px;
display: inline-block;
transition: 2s;
.el-row {
width: 200%;
}
.sign-in-hidden {
transform: translateX(-100%);
opacity: 0;
}
.change-password {
transform: translateX(-100%);
}
.change-password-hidden {
transform: translateX(100%);
opacity: 0;
}
.el-card {
width: 400px;
border-radius: 8px;
}
.divider {
font-size: 14px;
color: #999;
text-align: center;
margin: 12px 0;
&:before, &:after {
content: "——";
margin: 0 11px;
color: #ddd;
}
}
.tpLogin {
width: 100%;
justify-content: center;
flex-wrap: wrap;
.item {
cursor: pointer;
margin: 8px;
height: 48px;
width: 48px;
font-size: 28px;
border-radius: 50%;
line-height: 48px;
text-align: center;
}
}
:deep(.scan-title ){
color: #333333;
font-size: 16px;
&.sassLogin {
margin-bottom: 150px;
}
}
}
</style>