uniapp vue3 微信小程序获取用户头像,昵称,手机号
·
1. 头像 @chooseavatar ="onChooseAvatar"
2. 昵称 @blur="handleNicknameBlur"
3. 手机号 @getphonenumber="onGetphonenumber"
ps: 手机号前端拿到 code,传递给后端获取手机号 (!!!!! 小程序需要备案才行)
<script setup lang="ts">
import { postLoginWxMinAPI, postLoginWxMinSimpleAPI } from '@/services/login'
import { useMemberStore } from '@/stores'
import type { LoginResult } from '@/types/member'
import { onLoad } from '@dcloudio/uni-app'
import { ref } from 'vue';
const formData = ref({
avatarUrl: ''
})
const nickname = ref('')
const isShow = ref(true)
// #ifdef MP-WEIXIN
// 获取 code 登录凭证
let code = ''
onLoad(async () => {
const res = await wx.login()
code = res.code
})
// 获取用户手机号码
const onGetphonenumber: UniHelper.ButtonOnGetphonenumber = async (ev) => {
const { encryptedData, iv } = ev.detail
console.log(ev, 'wwwll');
const res = await postLoginWxMinAPI({ code, encryptedData, iv })
loginSuccess(res.result)
}
// #endif
const onChooseAvatar = (ev: any) => {
formData.value.avatarUrl = ev.detail.avatarUrl
console.log(ev, 'wwwll');
}
const handleNicknameBlur = (e: any) => {
// 通过事件对象获取用户输入的昵称
nickname.value = e.detail.value;
console.log('用户昵称:', nickname);
// 可在此处将昵称上传至服务器
}
const loginSuccess = (profile: LoginResult) => {
// 保存会员信息
const memberStore = useMemberStore()
memberStore.setProfile(profile)
// 成功提示
uni.showToast({ icon: 'success', title: '登录成功' })
setTimeout(() => {
// 页面跳转
// uni.switchTab({ url: '/pages/my/my' })
uni.navigateBack()
}, 500)
}
</script>
<template>
<view class="viewport">
<view class="logo">
SMT 活动钢网
<!-- <image
src="https://pcapi-xiaotuxian-front-devtest.itheima.net/miniapp/images/logo_icon.png"
></image> -->
</view>
<view class="login">
<!-- 网页端表单登录 -->
<!-- #ifdef H5 -->
<input class="input" type="text" placeholder="请输入用户名/手机号码" />
<input class="input" type="text" password placeholder="请输入密码" />
<button class="button phone">登录</button>
<!-- #endif -->
<!-- 小程序端授权登录 -->
<!-- #ifdef MP-WEIXIN -->
<button class="avatar-wrapper" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
<image class="avatar" :src="formData.avatarUrl ? formData.avatarUrl : ''">
<text class="loginLogoText" v-if="isShow">授权头像</text>
</image>
</button>
<view class="nameContent">
<view class="title">昵称</view>
<input type="nickname" placeholder="请输入昵称" v-model="nickname" @blur="handleNicknameBlur" />
</view>
<button class="button phone" open-type="getPhoneNumber" @getphonenumber="onGetphonenumber">
<text class="icon icon-phone"></text>
手机号快捷登录
</button>
<!-- #endif -->
<!-- <view class="extra">
<view class="caption">
<text>其他登录方式</text>
</view>
<view class="options">
<button @tap="onGetphonenumberSimple">
<text class="icon icon-phone">模拟快捷登录</text>
</button>
</view>
</view> -->
<view class="tips">登录/注册即视为你同意《服务条款》</view>
</view>
</view>
</template>
<style lang="scss" scoped>
page {
height: 100%;
}
.nameContent {
display: flex;
margin: 70rpx 0;
border-top: 1px solid #eee;
border-bottom: 2rpx solid #eee;
padding: 20rpx 40rpx;
width: 100vw;
box-sizing: border-box;
font-size: 28rpx;
align-items: center;
.title {
margin-right: 40rpx;
}
}
.avatar-wrapper {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background: none;
color: inherit;
border: none;
padding: 0;
font: inherit;
cursor: pointer;
outline: inherit;
.avatar {
height: 120rpx;
width: 120rpx;
border-radius: 20rpx;
}
}
.avatar-wrapper::after {
border: none;
}
.viewport {
display: flex;
flex-direction: column;
height: 100%;
padding: 20rpx 40rpx;
}
.avatar {
width: 220rpx;
height: 220rpx;
border-radius: 50%;
margin: 0 auto;
margin-bottom: 100rpx;
border: 1rpx solid #ddd;
}
.logo {
flex: 1;
text-align: center;
image {
width: 220rpx;
height: 220rpx;
margin-top: 15vh;
}
}
.login {
display: flex;
flex-direction: column;
height: 60vh;
padding: 40rpx 20rpx 20rpx;
.input {
width: 100%;
height: 80rpx;
font-size: 28rpx;
border-radius: 72rpx;
border: 1px solid #ddd;
padding-left: 30rpx;
margin-bottom: 20rpx;
}
.button {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 80rpx;
font-size: 28rpx;
border-radius: 72rpx;
color: #fff;
.icon {
font-size: 40rpx;
margin-right: 6rpx;
}
}
.phone {
background-color: #28bb9c;
}
.wechat {
background-color: #06c05f;
}
.extra {
flex: 1;
padding: 70rpx 70rpx 0;
.caption {
width: 440rpx;
line-height: 1;
border-top: 1rpx solid #ddd;
font-size: 26rpx;
color: #999;
position: relative;
text {
transform: translate(-40%);
background-color: #fff;
position: absolute;
top: -12rpx;
left: 50%;
}
}
.options {
display: flex;
justify-content: center;
align-items: center;
margin-top: 70rpx;
button {
padding: 0;
background-color: transparent;
&::after {
border: none;
}
}
}
.icon {
font-size: 24rpx;
color: #444;
display: flex;
flex-direction: column;
align-items: center;
&::before {
display: flex;
align-items: center;
justify-content: center;
width: 80rpx;
height: 80rpx;
margin-bottom: 6rpx;
font-size: 40rpx;
border: 1rpx solid #444;
border-radius: 50%;
}
}
.icon-weixin::before {
border-color: #06c05f;
color: #06c05f;
}
}
}
.tips {
position: absolute;
bottom: 80rpx;
left: 20rpx;
right: 20rpx;
font-size: 22rpx;
color: #999;
text-align: center;
}
</style>
更多推荐
所有评论(0)