You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
373 lines
9.7 KiB
373 lines
9.7 KiB
<template>
|
|
<view class="content">
|
|
<view class="login-t">
|
|
<image class="login-logo" :src="logoImage" mode="aspectFill"></image>
|
|
</view>
|
|
<view class="login-m">
|
|
<view class="login-item">
|
|
<input type="number" v-model="mobile" :maxlength="maxMobile" placeholder="请输入手机号码" focus placeholder-class="login-item-i-p" />
|
|
</view>
|
|
<view class="login-item flc">
|
|
<input class="login-item-input" placeholder-class="login-item-i-p" type="text" v-model="code" placeholder="请输入验证码" />
|
|
<view :class="sendCodeBtn" @click="sendCode" v-if="verification">发送验证码</view>
|
|
<view class="btn btn-g" v-if="!verification">{{ timer }} 秒后重新获取</view>
|
|
</view>
|
|
|
|
</view>
|
|
<view class="login-b">
|
|
<!-- #ifdef H5|APP-PLUS|APP-PLUS-NVUE -->
|
|
<view v-if="user_wx_id">
|
|
<button :class="regButtonClass" @click="toBind()" hover-class="btn-hover">登录</button>
|
|
</view>
|
|
<view v-else>
|
|
<button :class="regButtonClass" @click="login()" hover-class="btn-hover">登录</button>
|
|
<view class="login-other flc">
|
|
<view class="fz12 item" @click="selectLoginType">
|
|
密码登录
|
|
</view>
|
|
<view class="fz12 item" @click="toReg">
|
|
注册
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<!-- #endif -->
|
|
<!-- #ifdef MP -->
|
|
<button :class="regButtonClass" @click="showTopTips()" hover-class="btn-hover">登录</button>
|
|
<!-- #endif -->
|
|
|
|
</view>
|
|
<!-- <mallplusCopyright></mallplusCopyright> -->
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import { mapMutations, mapState } from 'vuex';
|
|
import mallplusCopyright from '@/components/mall-copyright/mallplusCopyright.vue';
|
|
import Api from '@/common/api';
|
|
import store from '@/store/index';
|
|
import { goBack, jumpBackPage } from '@/config/mixins.js'
|
|
export default {
|
|
components: {
|
|
mallplusCopyright
|
|
},
|
|
mixins: [goBack,jumpBackPage],
|
|
data() {
|
|
return {
|
|
maxMobile: 11,
|
|
mobile: '', // 用户手机号
|
|
code: '', // 短信验证码
|
|
user_wx_id: '', //授权id
|
|
verification: true, // 通过v-show控制显示获取还是倒计时
|
|
timer: 60, // 定义初始时间为60s
|
|
btnb: 'btn btn-square btn-c btn-all', //按钮背景
|
|
type: '', // 有值是第三方登录账号绑定
|
|
isWeixinBrowser: this.$common.isWeiXinBrowser()
|
|
}
|
|
},
|
|
onLoad(option) {
|
|
if (option.user_wx_id) {
|
|
this.user_wx_id = option.user_wx_id
|
|
uni.setNavigationBarTitle({
|
|
title: '绑定手机号'
|
|
})
|
|
}
|
|
|
|
|
|
// H5第三方授权登录绑定
|
|
// if (option.type && option.type === 'bind') {
|
|
// this.type = option.type
|
|
// uni.setNavigationBarTitle({
|
|
// title: '绑定手机号'
|
|
// })
|
|
// }
|
|
},
|
|
computed: {
|
|
// 验证手机号
|
|
rightMobile() {
|
|
let res = {}
|
|
if (!this.mobile) {
|
|
res.status = false
|
|
res.msg = '请输入手机号'
|
|
} else if (!/^1[3456789]{1}\d{9}$/gi.test(this.mobile)) {
|
|
res.status = false
|
|
res.msg = '手机号格式不正确'
|
|
} else {
|
|
res.status = true
|
|
}
|
|
return res
|
|
},
|
|
// 动态计算发送验证码按钮样式
|
|
sendCodeBtn() {
|
|
let btn = 'btn btn-g'
|
|
if (this.mobile.length === this.maxMobile && this.rightMobile.status) {
|
|
return btn + ' btn-b'
|
|
} else {
|
|
return btn
|
|
}
|
|
},
|
|
// 动态更改登录按钮bg
|
|
regButtonClass() {
|
|
return this.mobile && this.mobile.length === this.maxMobile && this.code
|
|
? this.btnb + ' btn-b'
|
|
: this.btnb
|
|
},
|
|
logoImage() {
|
|
return '/static/missing-face.png'
|
|
}
|
|
},
|
|
onShow() {
|
|
let _this = this
|
|
let userToken = _this.$db.get('userToken')
|
|
if (userToken) {
|
|
uni.switchTab({
|
|
url: '/pages/member/index/index'
|
|
})
|
|
return true
|
|
}
|
|
_this.timer = parseInt(_this.$db.get('timer'))
|
|
if (_this.timer != null && _this.timer > 0) {
|
|
_this.countDown()
|
|
_this.verification = false
|
|
}
|
|
},
|
|
methods: {
|
|
// 发送短信验证码
|
|
sendCode() {
|
|
if (!this.rightMobile.status) {
|
|
this.$common.errorToShow(this.rightMobile.msg)
|
|
} else {
|
|
this.$common.loadToShow('发送中...')
|
|
setTimeout(() => {
|
|
this.$common.loadToHide()
|
|
this.$api.sms({ mobile: this.mobile, code: 'login' }, res => {
|
|
if (res.status) {
|
|
this.timer = 60
|
|
this.verification = false
|
|
this.$common.successToShow(res.msg)
|
|
this.countDown() // 执行验证码计时
|
|
// this.btnb = 'btn btn-square btn-all btn-b';
|
|
} else {
|
|
this.$common.errorToShow(res.msg)
|
|
}
|
|
})
|
|
}, 1000)
|
|
}
|
|
},
|
|
// 去注册
|
|
toReg() {
|
|
this.$common.navigateTo('/pages/login/register/index')
|
|
},
|
|
// 验证码倒计时
|
|
countDown() {
|
|
let auth_timer = setInterval(() => {
|
|
// 定时器设置每秒递减
|
|
this.timer-- // 递减时间
|
|
uni.setStorage({
|
|
key: 'timer',
|
|
data: this.timer,
|
|
success: function() {}
|
|
})
|
|
if (this.timer <= 0) {
|
|
this.verification = true // 60s时间结束还原v-show状态并清除定时器
|
|
clearInterval(auth_timer)
|
|
}
|
|
}, 1000)
|
|
},
|
|
// 登录
|
|
login() {
|
|
var _this = this
|
|
if (!_this.rightMobile.status) {
|
|
_this.$common.errorToShow(_this.rightMobile.msg)
|
|
} else {
|
|
// 短信验证码登录
|
|
if (!_this.code) {
|
|
_this.$common.errorToShow('请输入短信验证码!')
|
|
} else {
|
|
let data = {
|
|
mobile: _this.mobile,
|
|
code: _this.code
|
|
}
|
|
|
|
let invicode = _this.$db.get('invitecode')
|
|
if (invicode) {
|
|
data.invitecode = invicode
|
|
}
|
|
|
|
_this.$api.smsLogin(data, res => {
|
|
if (res.status) {
|
|
this.$db.set('userToken', res.data)
|
|
_this.redirectHandler()
|
|
} else {
|
|
_this.$common.errorToShow(res.msg)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
},
|
|
// 重定向跳转 或者返回上一个页面
|
|
redirectHandler() {
|
|
this.$common.successToShow('登录成功!', () => {
|
|
this.$db.set('timer', 0)
|
|
this.$db.del('invitecode')
|
|
this.handleBack()
|
|
})
|
|
},
|
|
// 跳转到普通登录
|
|
toLogin() {
|
|
uni.navigateTo({
|
|
url: '../../login/login/index'
|
|
})
|
|
},
|
|
//提交按钮
|
|
showTopTips: function() {
|
|
let _this = this
|
|
if (_this.mobile == '') {
|
|
_this.$common.errorToShow('请输入手机号码')
|
|
return false
|
|
}
|
|
if (this.code == '') {
|
|
_this.$common.errorToShow('请输入验证码')
|
|
return false
|
|
}
|
|
if (_this.user_wx_id == 0) {
|
|
_this.$common.errorToShow('登录失败,请稍后再试', function() {
|
|
uni.navigateBack({
|
|
delta: 1
|
|
})
|
|
})
|
|
return false
|
|
}
|
|
var platform = 2
|
|
//1就是h5登陆(h5端和微信公众号端),2就是微信小程序登陆,3是支付宝小程序,4是app,5是pc
|
|
// #ifdef MP-ALIPAY
|
|
platform = 3
|
|
// #endif
|
|
// #ifdef APP-PLUS||APP-PLUS-NVUE
|
|
platform = 4
|
|
// #endif
|
|
var data = {
|
|
mobile: _this.mobile,
|
|
code: _this.code,
|
|
platform: platform, //平台id,标识是小程序登陆的
|
|
user_wx_id: _this.user_wx_id //微信小程序接口存不了session,所以要绑定的id只能传到前台
|
|
}
|
|
//有推荐码的话,带上
|
|
var invitecode = _this.$db.get('invitecode')
|
|
if (invitecode) {
|
|
data.invitecode = invitecode
|
|
}
|
|
_this.$api.smsLogin(data, function(res) {
|
|
if (res.status) {
|
|
_this.$db.set('userToken', res.data)
|
|
_this.redirectHandler()
|
|
} else {
|
|
//报错了
|
|
_this.$common.errorToShow(res.msg)
|
|
}
|
|
})
|
|
},
|
|
// 公众号第三方登录账号绑定
|
|
toBind() {
|
|
if (this.mobile == '') {
|
|
this.$common.errorToShow('请输入手机号码')
|
|
return false
|
|
}
|
|
if (this.code == '') {
|
|
this.$common.errorToShow('请输入验证码')
|
|
return false
|
|
}
|
|
|
|
let data = {
|
|
mobile: this.mobile,
|
|
code: this.code,
|
|
user_wx_id:this.user_wx_id
|
|
}
|
|
|
|
// 获取邀请码
|
|
let invicode = this.$db.get('invitecode')
|
|
if (invicode) {
|
|
data.invitecode = invicode
|
|
}
|
|
|
|
this.$api.smsLogin(data, res => {
|
|
if (res.status) {
|
|
this.$db.set('userToken', res.data)
|
|
this.redirectHandler()
|
|
} else {
|
|
this.$common.errorToShow(res.msg)
|
|
}
|
|
})
|
|
},
|
|
// 切换登录方式
|
|
selectLoginType() {
|
|
this.$common.redirectTo('./index1')
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
.content {
|
|
/* #ifdef H5 */
|
|
height: calc(100vh - 90upx);
|
|
/* #endif */
|
|
/* #ifndef H5 */
|
|
height: 100vh;
|
|
/* #endif */
|
|
background-color: #fff;
|
|
|
|
padding: 0upx 100upx;
|
|
}
|
|
.login-t {
|
|
text-align: center;
|
|
padding: 50upx 0;
|
|
}
|
|
.login-logo {
|
|
width: 180upx;
|
|
height: 180upx;
|
|
border-radius: 20upx;
|
|
background-color: #f8f8f8;
|
|
/* margin: 0 auto; */
|
|
}
|
|
.login-m {
|
|
margin-bottom: 100upx;
|
|
}
|
|
.login-item {
|
|
border-bottom: 2upx solid #d0d0d0;
|
|
overflow: hidden;
|
|
padding: 10upx;
|
|
color: #333;
|
|
margin-bottom: 30upx;
|
|
}
|
|
.login-item-input {
|
|
display: inline-block;
|
|
flex: 1;
|
|
box-sizing: border-box;
|
|
}
|
|
.login-item .btn {
|
|
border: none;
|
|
width: 40%;
|
|
text-align: right;
|
|
padding: 0;
|
|
&.btn-b {
|
|
background: none;
|
|
color: #333 !important;
|
|
}
|
|
}
|
|
.login-b .btn {
|
|
color: #999;
|
|
}
|
|
.btn-b {
|
|
color: #fff !important;
|
|
}
|
|
.login-other {
|
|
margin-bottom: 40upx;
|
|
.item {
|
|
padding: 20upx 0;
|
|
}
|
|
}
|
|
.btn-square {
|
|
height: 80upx;
|
|
line-height: 80upx;
|
|
}
|
|
</style>
|
|
|