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

<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>