232 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <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>
 |