Files
ipms-sjy/yudao-vue-ui/pages/auth/login.vue

335 lines
7.5 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>
<view class="app">
<!-- 左下角的环 -->
<view class="left-bottom-sign"></view>
<!-- 右上角的折角 -->
<view class="right-top-sign"></view>
<!-- 左上角的 x 关闭 -->
<view class="back-btn mix-icon icon-guanbi" @click="navBack"></view>
<!-- 用户协议 -->
<view class="agreement center">
<text class="mix-icon icon-xuanzhong" :class="{active: agreement}" @click="checkAgreement"></text>
<text @click="checkAgreement">请认真阅读并同意</text>
<text class="title" @click="navToAgreementDetail(1)">用户服务协议</text>
<text class="title" @click="navToAgreementDetail(2)">隐私权政策</text>
</view>
<!-- 登录表单 -->
<view class="wrapper">
<view class="left-top-sign">LOGIN</view>
<view class="welcome">手机登录/注册</view>
<!-- 手机验证码登录 -->
<view class="input-content">
<view class="input-item">
<text class="title">手机号码</text>
<view class="row">
<input v-model="mobile" type="number" maxlength="11"
placeholder="请输入手机号码" placeholder-style="color: #909399"/>
</view>
</view>
<!-- 判断使用验证码还是密码 -->
<view class="input-item" v-if="loginType == 'code'">
<text class="title">验证码</text>
<view class="row">
<input v-model="code" type="number" maxlength="6"
placeholder="请输入手机验证码" placeholder-style="color: #909399">
<mix-code :mobile="mobile" templateCode="SMS_194050994"></mix-code>
</view>
</view>
<view class="input-item" v-else>
<text class="title">密码</text>
<view class="row">
<input v-model="password" type="password" maxlength="16"
placeholder="请输入密码" placeholder-style="color: #909399"/>
</view>
</view>
<mix-button ref="confirmBtn" text="立即登录" marginTop="60rpx" @onConfirm="login"></mix-button>
<!-- 切换登陆 -->
<view class="login-type" v-if="loginType == 'code'" @click="setLoginType('password')">账号密码登录</view>
<view class="login-type" v-else @click="setLoginType('code')">免密登录</view>
</view>
<!-- 快捷登录 -->
<!-- #ifdef APP-PLUS || MP-WEIXIN -->
<view class="other-wrapper">
<view class="line center">
<text class="title">快捷登录</text>
</view>
<view class="list row">
<!-- #ifdef MP-WEIXIN -->
<view class="item column center" @click="mpWxGetUserInfo">
<image class="icon" src="/static/icon/login-wx.png"></image>
</view>
<!-- #endif -->
<!-- #ifdef APP-PLUS -->
<view class="item column center" style="width: 180rpx;" @click="loginByWxApp">
<image class="icon" src="/static/icon/login-wx.png"></image>
<text>微信登录</text>
</view>
<!-- #endif -->
</view>
</view>
<!-- #endif -->
</view>
<!-- Loading -->
<mix-loading v-if="isLoading"></mix-loading>
</view>
</template>
<script>
import {checkStr} from '@/common/js/util'
import loginMpWx from './mixin/login-mp-wx.js'
import loginAppWx from './mixin/login-app-wx.js'
export default{
mixins: [loginMpWx, loginAppWx],
data(){
return {
loginType: 'code', // 登录方式code 验证码password 密码
mobile: '',
code: '',
password: '',
agreement: true,
}
},
onLoad() {
},
methods: {
loginSuccessCallBack(data){
this.$util.msg('登录成功');
this.$store.commit('setToken', data);
setTimeout(()=>{
uni.navigateBack();
}, 1000)
},
// 手机号登录
async login(){
// 参数校验
if (!this.agreement){
this.$util.msg('请阅读并同意用户服务及隐私协议');
this.$refs.confirmBtn.stop();
return;
}
const {mobile, code, password} = this;
if (!checkStr(mobile, 'mobile')){
this.$util.msg('请输入正确的手机号码');
this.$refs.confirmBtn.stop();
return;
}
if (!checkStr(code, 'mobileCode')) {
this.$util.msg('验证码错误');
this.$refs.confirmBtn.stop();
return;
}
// 执行登陆
const res = await this.$request('user', 'login', {mobile,code});
this.$refs.confirmBtn.stop();
if (res.status === 1){
this.loginSuccessCallBack(res.data);
} else{
this.$util.msg(res.msg);
}
},
navBack(){
uni.navigateBack();
},
setLoginType(loginType) {
this.loginType = loginType;
},
//同意协议
checkAgreement(){
this.agreement = !this.agreement;
},
//打开协议
navToAgreementDetail(type){
this.navTo('/pages/public/article?param=' + JSON.stringify({
module: 'article',
operation: 'getAgreement',
data: {
type
}
}))
},
}
}
</script>
<style>
page{
background: #fff;
}
</style>
<style scoped lang='scss'>
.app {
padding-top: 15vh;
position:relative;
width: 100vw;
height: 100vh;
overflow: hidden;
background: #fff;
}
.wrapper {
position:relative;
z-index: 90;
padding-bottom: 40rpx;
.welcome {
position:relative;
left: 50rpx;
top: -90rpx;
font-size: 46rpx;
color: #555;
text-shadow: 1px 0px 1px rgba(0,0,0,.3);
}
}
.back-btn {
position:absolute;
left: 20rpx;
top: calc(var(--status-bar-height) + 20rpx);
z-index: 90;
padding: 20rpx;
font-size: 32rpx;
color: #606266;
}
.left-top-sign {
font-size: 120rpx;
color: #f8f8f8;
position:relative;
left: -12rpx;
}
.left-bottom-sign {
position: absolute;
left: -270rpx;
bottom: -320rpx;
border: 100rpx solid #d0d1fd;
border-radius: 50%;
padding: 180rpx;
}
.right-top-sign {
position:absolute;
top: 80rpx;
right: -30rpx;
z-index: 95;
&:before, &:after{
display:block;
content:"";
width: 400rpx;
height: 80rpx;
background: #b4f3e2;
}
&:before{
transform: rotate(50deg);
border-top-right-radius: 50px;
}
&:after{
position: absolute;
right: -198rpx;
top: 0;
transform: rotate(-50deg);
border-top-left-radius: 50px;
}
}
/** 手机登录部分 */
.input-content {
padding: 0 60rpx;
.input-item {
display:flex;
flex-direction: column;
align-items:flex-start;
justify-content: center;
padding: 0 30rpx;
background: #f8f6fc;
height: 120rpx;
border-radius: 4px;
margin-bottom: 50rpx;
&:last-child{
margin-bottom: 0;
}
.row{
width: 100%;
}
.title{
height: 50rpx;
line-height: 56rpx;
font-size: 26rpx;
color: #606266;
}
input {
flex: 1;
height: 60rpx;
font-size: 30rpx;
color: #303133;
width: 100%;
}
}
.login-type {
display: flex;
justify-content: flex-end;
font-size: 13px;
color: #40a2ff;
margin-top: 20rpx;
}
}
/* 其他登录方式 */
.other-wrapper{
display: flex;
flex-direction: column;
align-items: center;
padding-top: 20rpx;
margin-top: 80rpx;
.line{
margin-bottom: 40rpx;
.title {
margin: 0 32rpx;
font-size: 24rpx;
color: #606266;
}
&:before, &:after{
content: '';
width: 160rpx;
height: 0;
border-top: 1px solid #e0e0e0;
}
}
.item{
font-size: 24rpx;
color: #606266;
background-color: #fff;
border: 0;
&:after{
border: 0;
}
}
.icon{
width: 90rpx;
height: 90rpx;
margin: 0 24rpx 16rpx;
}
}
.agreement{
position: absolute;
left: 0;
bottom: 6vh;
z-index: 1;
width: 750rpx;
height: 90rpx;
font-size: 24rpx;
color: #999;
.mix-icon{
font-size: 36rpx;
color: #ccc;
margin-right: 8rpx;
margin-top: 1px;
&.active{
color: $base-color;
}
}
.title {
color: #40a2ff;
}
}
</style>