123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- <template>
- <view class="login-custom">
- <view class="container">
- <!-- logo -->
- <image class="logo" :src="staticUrl + 'icon-logo@2x.png'" mode="widthFix"></image>
- <!-- 登录表单 -->
- <view class="login-form">
- <view class="form-control">
- <input class="input" type="number" placeholder="请输入手机号" v-model="mobile" maxlength="11" />
- </view>
- <tui-divider :height="dividerHeight"></tui-divider>
- <view class="form-control">
- <input
- class="input"
- type="number"
- v-model="verificationCode"
- placeholder="请输入短信验证码"
- maxlength="6"
- />
- <view class="validate-code" @click="sendVerificationCode">
- <text v-if="!countDownStatus">获取验证码</text>
- <text v-else v-text="countDownTip"></text>
- </view>
- </view>
- <tui-divider :height="dividerHeight"></tui-divider>
- <view class="tip" v-text="tipMessage"></view>
- </view>
- <tui-button
- type="base"
- width="600rpx"
- height="90rpx"
- shape="circle"
- @click="submit"
- :disabled="disabled || submitStatus"
- :loading="submitStatus"
- >
- 登录
- </tui-button>
- </view>
- </view>
- </template>
- <script>
- import { getUserProfile } from '@/common/auth.js'
- import { validMobile } from '@/common/validation.js'
- import { sendMobileVerification } from '@/services/api/common.js'
- import { mapGetters } from 'vuex'
- export default {
- data() {
- return {
- dividerHeight: 50,
- tipMsg: '',
- countDownStatus: 0,
- // 用户注册登录信息
- mobile: '', // 注册/绑定手机号
- headImgUrl: '', //微信头像
- nickName: '', //微信昵称
- verificationCode: '', //短信验证码
- invitationCode: '', // 推荐人邀请码
- // 数据校验
- valide: {
- mobile: false,
- verificationCode: false
- },
- submitStatus: false
- }
- },
- watch: {
- mobile(value) {
- const valide = validMobile(value)
- this.valide.mobile = valide
- this.tipMsg = valide ? '' : '请输入合法的手机号'
- },
- verificationCode(value) {
- const valide = value.toString().length === 6
- this.valide.verificationCode = valide
- this.tipMsg = valide ? '' : '请输入6位邀请码'
- }
- },
- computed: {
- ...mapGetters(['openId']),
- tipMessage() {
- return this.tipMsg || '未注册的手机号验证后自动创建颜选美学账户'
- },
- disabled() {
- return !this.valide.mobile || !this.valide.verificationCode
- },
- countDownTip() {
- return `重新获取(${this.countDownStatus}s)`
- }
- },
- beforeDestroy() {
- uni.removeStorageSync('LOGIN_REDIRECT_URL')
- },
- methods: {
- // 获取用户信息
- async getUserProfile() {
- this.submitStatus = true
- if (!this.headImgUrl || !this.nickName) {
- try {
- const result = await getUserProfile()
- this.headImgUrl = result.avatarUrl
- this.nickName = result.nickName
- // return result
- console.log(result)
- } catch (e) {
- console.log(e)
- }
- }
- },
- // 短信验证码登录
- async mobileLogin() {
- const params = {
- openId: this.openId, //微信openId
- mobile: this.mobile, // 注册/绑定手机号
- headImgUrl: this.headImgUrl, //微信头像
- nickName: this.nickName, //微信昵称
- verificationCode: this.verificationCode, //短信验证码
- invitationCode: this.invitationCode // 推荐人邀请码
- }
- try {
- await this.$store.dispatch('user/register', params)
- // 登录成功处理
- uni.redirectTo({ url: '/pages/authorize/login-auth' })
- } catch (e) {
- this.submitStatus = false
- }
- },
- // 发送验证码
- async sendVerificationCode() {
- if (this.countDownStatus > 0) return
- if (!this.valide.mobile) {
- return this.$toast.error('请输入合法手机号')
- }
- try {
- await sendMobileVerification({ mobile: this.mobile })
- this.startCountDown()
- this.$toast.success('验证码已发送')
- } catch (e) {
- console.log('发送验证码失败')
- }
- },
- // 验证码倒计时
- startCountDown() {
- this.countDownStatus = 30
- if (this.timer) clearInterval(this.timer)
- // 开启定时器
- this.timer = setInterval(() => {
- this.countDownStatus--
- if (this.countDownStatus === 0) {
- clearInterval(this.timer)
- }
- }, 1000)
- },
- // 提交登录
- async submit() {
- await this.getUserProfile()
- const { mobile, verificationCode } = this.valide
- if (mobile && verificationCode) {
- this.mobileLogin()
- }
- }
- }
- }
- </script>
- <style lang="scss" scoped>
- .login-custom {
- @extend .cm-flex-center;
- align-items: flex-start;
- height: 100vh;
- background-color: #fff;
- .container {
- @extend .cm-flex-center;
- flex-direction: column;
- width: 600rpx;
- margin-top: 180rpx;
- .logo {
- width: 200rpx;
- height: 200rpx;
- }
- .login-form {
- width: 100%;
- margin: 80rpx 0 25rpx;
- .form-control {
- width: 100%;
- @extend .cm-flex-between;
- font-size: 26rpx;
- .input {
- flex: 1;
- }
- .validate-code {
- flex: 1;
- text-align: right;
- color: #666;
- }
- }
- .tip {
- font-size: 24rpx;
- color: #fc464c;
- text-align: left;
- }
- }
- }
- }
- </style>
|