shop-applet/pages/users/login/index.vue

435 lines
13 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="login_box">
<image class="image" src="https://lihai001.oss-cn-chengdu.aliyuncs.com/public/kk/login-bg.png" mode="">
</image>
<view class="cont_box">
<view class="headline">
<view class="title">里海数字平台</view>
<view class="text">输入手机号获取验证码登录</view>
</view>
<view class="form_box">
<view class="from_input">
<view class="phone_iput">
<input type="text" placeholder="输入手机号码" class="text_input" v-model="account">
</view>
<view class="codeIput_box">
<input type="text" placeholder="填写验证码" class="codeIput" v-model="captcha">
<button v-debounce class="code" :disabled="disabled" :class="disabled === true ? 'on' : ''"
@click="handleVerify">
{{ text }}
</button>
</view>
</view>
<view class="protocol">
<checkbox-group class="checkgroup" @change='isAgree=!isAgree'>
<checkbox class="checkbox" :checked="isAgree ? true : false" />
<text class="protocol_text">登录及代表同意<text @click="userAgree" class="font_pro">用户协议</text><text
@click="userPrivacyAgree" class="font_pro">隐私政策</text></text>
</checkbox-group>
</view>
<view class="logon" @click="loginMobile">登录</view>
<!-- #ifdef APP-PLUS -->
<view class="iconfont icon-weixin weixin" @click="wxLogin"></view>
<!-- #endif -->
</view>
</view>
<Verify @success="success" :captchaType="'blockPuzzle'" :imgSize="{ width: '330px', height: '155px' }" ref="verify">
</Verify>
</view>
</template>
<script>
import { commonAuth, bindMp } from '@/api/public';
import { loginMobile, registerVerify, getSiteAPI } from '@/api/user'
import { LOGO_URL, USER_INFO, EXPIRES_TIME } from '@/config/cache';
import Cache from '@/utils/cache';
import sendVerifyCode from "@/mixins/SendVerifyCode";
import Verify from '@/components/verify/verify.vue';
const BACK_URL = "login_back_url";
export default {
mixins: [sendVerifyCode],
components: {
Verify
},
data() {
return {
isAgree: true,
account: "",
captcha: '',
appUserInfo: null, // 微信登录保存的用户信息
}
},
onLoad(e) {
// console.log('options', e)
},
methods: {
// App微信登录
wxLogin() {
if (!this.isAgree) return this.$util.Tips({
title: '请勾选用户协议与隐私政策'
});
let self = this
this.account = ''
this.captcha = ''
uni.showLoading({
title: '登录中'
})
uni.login({
provider: 'weixin',
// onlyAuthorize: true,
success: function(loginRes) {
self.appUserInfo = loginRes
self.wxLoginApi()
},
fail(error) {
uni.showToast({
title: '登录失败',
icon: 'none',
duration: 2000
})
}
});
},
wxLoginApi() {
const that = this
// console.log('appUserInfo', that.appUserInfo);
commonAuth({
auth: {
type: 'app_wechat',
auth: {
code: that.appUserInfo.authResult.access_token,
openid: that.appUserInfo.authResult.openid,
phone: this.account,
// code: '68_CTElk8-PqBEmCksAPUQ8CYBEPbArY6MsSSjn8DjT_ZUhbkpGSwJECWjzYBEmvvkZloz2-E20smA8l7uNhGyGbuzqVxV9wVx-bAazxnSL_Us',
// openid: "oRrdQt-mZ3UOPossISgiDt-aEWNg",
// phone: this.account,
}
}
}).then(res => {
const data = res.data;
// console.log('res', data);
if (res.data.status == 200) {
that.$Cache.clear(BACK_URL);
that.$store.commit("LOGIN", {
'token': data.result.token,
'time': data.result.exp
});
that.$store.commit("SETUID", data.result.user.uid);
that.$store.commit('UPDATE_USERINFO', data.result.user);
let time = data.expires_time - Cache.time();
// #ifdef MP
Cache.set(EXPIRES_TIME, data.expires_time, time);
Cache.set(USER_INFO, data.user, time);
// #endif
if (data.user.no_update === 1) {
uni.navigateTo({
url: `/pages/users/completeMsg/completeMsg?phone=${data.user.phone}`
})
return
}
getSiteAPI().then(res => that.$store.commit('setMyInfo', res))
uni.reLaunch({
url: '/pages/user/index'
});
} else {
that.auth_token = res.data.result.key;
that.bindStatus = true;
}
uni.hideLoading();
}).catch(res => {
uni.hideLoading();
uni.showToast({
title: res.message || res,
icon: 'none',
duration: 2000
});
});
},
handleVerify() {
let that = this;
if (!that.account) return that.$util.Tips({
title: '请输入手机号码'
});
if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
title: '请输入正确的手机号码'
});
if (!that.isAgree) return that.$util.Tips({
title: '请勾选用户协议与隐私政策'
});
that.$refs.verify.show();
},
success(data) {
this.$refs.verify.hide();
this.code(data);
},
async loginMobile() {
// 验证码登录
let that = this;
if (!that.account) return that.$util.Tips({
title: '请输入手机号码'
});
if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
title: '请输入正确的手机号码'
});
if (!that.captcha) return that.$util.Tips({
title: '请输入验证码'
});
if (!/^[\w\d]+$/i.test(that.captcha)) return that.$util.Tips({
title: '请输入正确的验证码'
});
if (!that.isAgree) return that.$util.Tips({
title: '请勾选用户协议与隐私政策'
});
loginMobile({
auth_token: uni.getStorageSync('auth_token'),
phone: that.account,
sms_code: that.captcha,
spread: that.$Cache.get("spread"),
// #ifdef APP-PLUS
user_type: 'app',
// #endif
// #ifdef H5
user_type: 'h5',
// #endif
})
.then(({
data
}) => {
// #ifdef MP
//用户没有绑定openid授权并绑定
if (data.user.wechat_user_id === 0) {
let that = this
wx.getUserInfo({
success: function(res) {
const encryptedData = res.encryptedData
const iv = res.iv
wx.login({
success(res) {
if (res.code) {
bindMp({ code: res.code, iv: iv, encryptedData: encryptedData, phone: that
.account }).then(res => {
// console.log(res);
})
} else {
// console.log('登录失败!' + res.errMsg)
}
}
})
},
fail(e) {
// console.log('登录失败!' + res.errMsg)
}
})
}
// #endif
// console.log('验证码登录', data);
let time = data.expires_time - Cache.time();
const backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
that.$Cache.clear(BACK_URL);
that.$store.commit("LOGIN", {
'token': data.token,
'time': data.exp
});
that.$store.commit("SETUID", data.user.uid);
that.$store.commit('UPDATE_USERINFO', data.user);
// Cache.set(EXPIRES_TIME, data.result.expires_time, time);
// #ifdef MP
Cache.set(EXPIRES_TIME, data.expires_time, time);
Cache.set(USER_INFO, data.user, time);
// #endif
let method
let indexPat = ['/pages/index/index', '/pages/order_addcart/order_addcart',
'/pages/goods_cate/goods_cate',
'/pages/user/index'
]
if (indexPat.includes(this.getPath(backUrl))) {
method = 'switchTab'
} else {
method = 'navigateTo'
}
if (this.getPath(backUrl) === '/pages/users/login/index') {
uni.switchTab({
url: '/pages/index/index'
});
return
}
uni[method]({
url: backUrl
});
})
.catch(res => {
that.$util.Tips({
title: res
});
});
},
async code(data) {
let that = this;
if (!that.account) return that.$util.Tips({
title: '请输入手机号码'
});
if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
title: '请输入正确的手机号码'
});
// if (that.formItem == 2) that.type = "register";
await registerVerify({
phone: that.account,
type: 'login',
key: that.keyCode,
// code: that.codeVal,
toke: data.token,
captchaType: 'blockPuzzle',
captchaVerification: data.captchaVerification
})
.then(res => {
that.$util.Tips({
title: res.message
});
that.sendCode();
})
.catch(res => {
that.$util.Tips({
title: res
});
});
},
getPath(url) {
if (url.indexOf("?") != -1) {
url = url.split("?")[0];
// console.log(url);
}
return url
},
userAgree() {
uni.navigateTo({
url: '/pages/users/user_about/index?from=sys_user_agree'
})
},
userPrivacyAgree() {
uni.navigateTo({
url: '/pages/users/user_about/index?from=sys_userr_privacy'
})
},
}
}
</script>
<style lang="scss">
page {
background-color: #fff;
}
.login_box {
.image {
width: 750rpx;
height: 812.28rpx;
position: fixed;
top: 0;
left: 0;
z-index: -1;
}
.logon {
width: 526.32rpx;
height: 84.21rpx;
background-color: #009E56;
border-radius: 100px;
color: #fff;
text-align: center;
line-height: 84.21rpx;
font-size: 29.82rpx;
margin-top: 78.95rpx;
margin-left: 50%;
transform: translate(-50%);
}
.cont_box {
position: absolute;
top: 208.77rpx;
left: 50%;
transform: translate(-50%);
width: 682.46rpx;
.headline {
margin-left: 43.86rpx;
color: #fff;
.title {
font-size: 45.61rpx;
font-weight: 700;
}
.text {
font-size: 29.82rpx;
margin-top: 14.04rpx;
}
}
.form_box {
margin-top: 196.49rpx;
width: 682.46rpx;
height: 701.75rpx;
padding: 61.4rpx;
background: #FFFFFF;
box-shadow: 0px 3px 6px 1px rgba(0, 106, 53, 0.2);
border-radius: 16px 16px 16px 16px;
.protocol {
margin-top: 70.18rpx;
font-size: 26.32rpx;
.checkgroup {
display: flex;
align-items: center;
.font_pro,
.font_pro {
color: #68A2FF;
}
}
}
.from_input {
.phone_iput,
.codeIput_box {
display: flex;
align-items: center;
height: 87.72rpx;
border-bottom: 1px solid #b7b7b7;
}
.codeIput_box {
display: flex;
justify-content: space-between;
margin-top: 47.37rpx;
.code {
font-size: 29.82rpx;
color: #68A2FF;
}
.on {
color: #AEAEAE;
}
}
}
.weixin {
color: #009E56;
font-size: 45.61rpx;
margin: 35.09rpx auto;
width: 87.72rpx;
height: 87.72rpx;
text-align: center;
line-height: 87.72rpx;
border-radius: 50%;
background-color: rgba(0, 0, 0, 0.1);
}
}
}
}
</style>