main
parent
ff46de0d22
commit
4d500e767f
@ -0,0 +1,354 @@ |
|||||||
|
<template> |
||||||
|
<view class="container"> |
||||||
|
|
||||||
|
<!-- 页面头部 --> |
||||||
|
<view class="header"> |
||||||
|
<view class="title"> |
||||||
|
<text>手机号登录</text> |
||||||
|
</view> |
||||||
|
<view class="sub-title"> |
||||||
|
<text>未注册的手机号登录后将自动注册</text> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<!-- 表单 --> |
||||||
|
<view class="login-form"> |
||||||
|
<!-- 手机号 --> |
||||||
|
<view class="form-item"> |
||||||
|
<input class="form-item--input" type="number" v-model="mobile" maxlength="11" placeholder="请输入手机号码" /> |
||||||
|
</view> |
||||||
|
<!-- 图形验证码 --> |
||||||
|
<view class="form-item"> |
||||||
|
<input class="form-item--input" type="text" v-model="captchaCode" maxlength="5" placeholder="请输入图形验证码" /> |
||||||
|
<view class="form-item--parts"> |
||||||
|
<view class="captcha" @click="getCaptcha()"> |
||||||
|
<image class="image" :src="captcha.base64"></image> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<!-- 短信验证码 --> |
||||||
|
<view class="form-item"> |
||||||
|
<input class="form-item--input" type="number" v-model="smsCode" maxlength="6" placeholder="请输入短信验证码" /> |
||||||
|
<view class="form-item--parts"> |
||||||
|
<view class="captcha-sms" @click="handelSmsCaptcha()"> |
||||||
|
<text v-if="!smsState" class="activate">获取验证码</text> |
||||||
|
<text v-else class="un-activate">重新发送({{ times }})秒</text> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<!-- 登录按钮 --> |
||||||
|
<view class="login-button" @click="handleLogin"> |
||||||
|
<text>登录</text> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
|
||||||
|
<!-- 微信授权手机号一键登录 --> |
||||||
|
<!-- #ifdef MP-WEIXIN --> |
||||||
|
<MpWeixinMobile v-if="isMpWeixinMobile" :isParty="isParty" :partyData="partyData" /> |
||||||
|
<!-- #endif --> |
||||||
|
|
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import store from '@/store' |
||||||
|
import * as CaptchaApi from '@/api/captcha' |
||||||
|
import * as Verify from '@/utils/verify' |
||||||
|
import MpWeixinMobile from './mp-weixin-mobile' |
||||||
|
|
||||||
|
// 倒计时时长(秒) |
||||||
|
const times = 60 |
||||||
|
|
||||||
|
// 表单验证场景 |
||||||
|
const GET_CAPTCHA = 10 |
||||||
|
const SUBMIT_LOGIN = 20 |
||||||
|
|
||||||
|
export default { |
||||||
|
components: { |
||||||
|
MpWeixinMobile |
||||||
|
}, |
||||||
|
|
||||||
|
props: { |
||||||
|
// 是否存在第三方用户信息 |
||||||
|
isParty: { |
||||||
|
type: Boolean, |
||||||
|
default: () => false |
||||||
|
}, |
||||||
|
// 第三方用户信息数据 |
||||||
|
partyData: { |
||||||
|
type: Object |
||||||
|
}, |
||||||
|
// 是否显示微信小程序端 一键授权手机号 |
||||||
|
isMpWeixinMobile: { |
||||||
|
type: Boolean, |
||||||
|
default: () => false |
||||||
|
}, |
||||||
|
}, |
||||||
|
|
||||||
|
data() { |
||||||
|
return { |
||||||
|
// 正在加载 |
||||||
|
isLoading: false, |
||||||
|
// 图形验证码信息 |
||||||
|
captcha: {}, |
||||||
|
// 短信验证码发送状态 |
||||||
|
smsState: false, |
||||||
|
// 倒计时 |
||||||
|
times, |
||||||
|
// 手机号 |
||||||
|
mobile: '', |
||||||
|
// 图形验证码 |
||||||
|
captchaCode: '', |
||||||
|
// 短信验证码 |
||||||
|
smsCode: '' |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* 生命周期函数--监听页面加载 |
||||||
|
*/ |
||||||
|
created() { |
||||||
|
// 获取图形验证码 |
||||||
|
this.getCaptcha() |
||||||
|
}, |
||||||
|
|
||||||
|
methods: { |
||||||
|
|
||||||
|
// 获取图形验证码 |
||||||
|
getCaptcha() { |
||||||
|
const app = this |
||||||
|
CaptchaApi.image() |
||||||
|
.then(result => app.captcha = result.data) |
||||||
|
}, |
||||||
|
|
||||||
|
// 点击发送短信验证码 |
||||||
|
handelSmsCaptcha() { |
||||||
|
const app = this |
||||||
|
if (!app.isLoading && !app.smsState && app.formValidation(GET_CAPTCHA)) { |
||||||
|
app.sendSmsCaptcha() |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
// 表单验证 |
||||||
|
formValidation(scene = GET_CAPTCHA) { |
||||||
|
const app = this |
||||||
|
// 验证获取短信验证码 |
||||||
|
if (scene === GET_CAPTCHA) { |
||||||
|
if (!app.validteMobile(app.mobile) || !app.validteCaptchaCode(app.captchaCode)) { |
||||||
|
return false |
||||||
|
} |
||||||
|
} |
||||||
|
// 验证提交登录 |
||||||
|
if (scene === SUBMIT_LOGIN) { |
||||||
|
if (!app.validteMobile(app.mobile) || !app.validteSmsCode(app.smsCode)) { |
||||||
|
return false |
||||||
|
} |
||||||
|
} |
||||||
|
return true |
||||||
|
}, |
||||||
|
|
||||||
|
// 验证手机号 |
||||||
|
validteMobile(str) { |
||||||
|
if (Verify.isEmpty(str)) { |
||||||
|
this.$toast('请先输入手机号') |
||||||
|
return false |
||||||
|
} |
||||||
|
if (!Verify.isMobile(str)) { |
||||||
|
this.$toast('请输入正确格式的手机号') |
||||||
|
return false |
||||||
|
} |
||||||
|
return true |
||||||
|
}, |
||||||
|
|
||||||
|
// 验证图形验证码 |
||||||
|
validteCaptchaCode(str) { |
||||||
|
if (Verify.isEmpty(str)) { |
||||||
|
this.$toast('请先输入图形验证码') |
||||||
|
return false |
||||||
|
} |
||||||
|
return true |
||||||
|
}, |
||||||
|
|
||||||
|
// 验证短信验证码 |
||||||
|
validteSmsCode(str) { |
||||||
|
if (Verify.isEmpty(str)) { |
||||||
|
this.$toast('请先输入短信验证码') |
||||||
|
return false |
||||||
|
} |
||||||
|
return true |
||||||
|
}, |
||||||
|
|
||||||
|
// 请求发送短信验证码接口 |
||||||
|
sendSmsCaptcha() { |
||||||
|
const app = this |
||||||
|
app.isLoading = true |
||||||
|
CaptchaApi.sendSmsCaptcha({ |
||||||
|
form: { |
||||||
|
captchaKey: app.captcha.key, |
||||||
|
captchaCode: app.captchaCode, |
||||||
|
mobile: app.mobile |
||||||
|
} |
||||||
|
}) |
||||||
|
.then(result => { |
||||||
|
// 显示发送成功 |
||||||
|
app.$toast(result.message) |
||||||
|
// 执行定时器 |
||||||
|
app.timer() |
||||||
|
}) |
||||||
|
.catch(() => app.getCaptcha()) |
||||||
|
.finally(() => app.isLoading = false) |
||||||
|
}, |
||||||
|
|
||||||
|
// 执行定时器 |
||||||
|
timer() { |
||||||
|
const app = this |
||||||
|
app.smsState = true |
||||||
|
const inter = setInterval(() => { |
||||||
|
app.times = app.times - 1 |
||||||
|
if (app.times <= 0) { |
||||||
|
app.smsState = false |
||||||
|
app.times = times |
||||||
|
clearInterval(inter) |
||||||
|
} |
||||||
|
}, 1000) |
||||||
|
}, |
||||||
|
|
||||||
|
// 点击登录 |
||||||
|
handleLogin() { |
||||||
|
const app = this |
||||||
|
if (!app.isLoading && app.formValidation(SUBMIT_LOGIN)) { |
||||||
|
app.submitLogin() |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
// 确认登录 |
||||||
|
submitLogin() { |
||||||
|
const app = this |
||||||
|
app.isLoading = true |
||||||
|
store.dispatch('Login', { |
||||||
|
smsCode: app.smsCode, |
||||||
|
mobile: app.mobile, |
||||||
|
isParty: app.isParty, |
||||||
|
partyData: app.partyData, |
||||||
|
refereeId: store.getters.refereeId |
||||||
|
}) |
||||||
|
.then(result => { |
||||||
|
// 显示登录成功 |
||||||
|
app.$toast(result.message) |
||||||
|
// 相应全局事件订阅: 刷新上级页面数据 |
||||||
|
uni.$emit('syncRefresh', true) |
||||||
|
// 跳转回原页面 |
||||||
|
setTimeout(() => app.onNavigateBack(1), 2000) |
||||||
|
}) |
||||||
|
.catch(err => { |
||||||
|
// 跳转回原页面 |
||||||
|
if (err.result.data.isBack) { |
||||||
|
setTimeout(() => app.onNavigateBack(1), 2000) |
||||||
|
} |
||||||
|
}) |
||||||
|
.finally(() => app.isLoading = false) |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* 登录成功-跳转回原页面 |
||||||
|
*/ |
||||||
|
onNavigateBack(delta = 1) { |
||||||
|
const pages = getCurrentPages() |
||||||
|
if (pages.length > 1) { |
||||||
|
uni.navigateBack({ |
||||||
|
delta: Number(delta || 1) |
||||||
|
}) |
||||||
|
} else { |
||||||
|
this.$navTo('pages/index/index') |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
.container { |
||||||
|
padding: 100rpx 60rpx; |
||||||
|
min-height: 100vh; |
||||||
|
background-color: #fff; |
||||||
|
} |
||||||
|
|
||||||
|
// 页面头部 |
||||||
|
.header { |
||||||
|
margin-bottom: 60rpx; |
||||||
|
|
||||||
|
.title { |
||||||
|
color: #191919; |
||||||
|
font-size: 54rpx; |
||||||
|
} |
||||||
|
|
||||||
|
.sub-title { |
||||||
|
margin-top: 20rpx; |
||||||
|
color: #b3b3b3; |
||||||
|
font-size: 28rpx; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// 输入框元素 |
||||||
|
.form-item { |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
padding: 18rpx; |
||||||
|
border-bottom: 1rpx solid #f3f1f2; |
||||||
|
margin-bottom: 30rpx; |
||||||
|
height: 96rpx; |
||||||
|
|
||||||
|
&--input { |
||||||
|
font-size: 28rpx; |
||||||
|
letter-spacing: 1rpx; |
||||||
|
flex: 1; |
||||||
|
height: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
&--parts { |
||||||
|
min-width: 100rpx; |
||||||
|
} |
||||||
|
|
||||||
|
// 图形验证码 |
||||||
|
.captcha { |
||||||
|
height: 60rpx; |
||||||
|
|
||||||
|
.image { |
||||||
|
display: block; |
||||||
|
width: 192rpx; |
||||||
|
height: 100%; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// 短信验证码 |
||||||
|
.captcha-sms { |
||||||
|
font-size: 28rpx; |
||||||
|
line-height: 50rpx; |
||||||
|
padding-right: 20rpx; |
||||||
|
|
||||||
|
.activate { |
||||||
|
color: $main-bg; |
||||||
|
} |
||||||
|
|
||||||
|
.un-activate { |
||||||
|
color: #9e9e9e; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// 登录按钮 |
||||||
|
.login-button { |
||||||
|
width: 100%; |
||||||
|
height: 86rpx; |
||||||
|
margin-top: 80rpx; |
||||||
|
background: linear-gradient(to right, $main-bg, $main-bg2); |
||||||
|
color: $main-text; |
||||||
|
border-radius: 80rpx; |
||||||
|
box-shadow: 0px 10px 20px 0px rgba(0, 0, 0, 0.1); |
||||||
|
letter-spacing: 5rpx; |
||||||
|
display: flex; |
||||||
|
justify-content: center; |
||||||
|
align-items: center; |
||||||
|
} |
||||||
|
</style> |
After Width: | Height: | Size: 455 B |
After Width: | Height: | Size: 713 B |
Loading…
Reference in new issue