如何完成微信小程序的登录功能

在这里插入图片描述

前言

微信小程序是一个轻量级的,不用安装包,就可以打开的一个小工具,那我们就看一下,微信小程序是如何登录的

开始

第一步,搭建基础页面。

<template>
  <view class="login-container">
    <!-- 提示登录的图标 -->
    <uni-icons type="contact-filled" size="100" color="#AFAFAF"></uni-icons>
    <!-- 登录按钮 -->
    <!-- open-type="getUserInfo" @getuserinfo="getUserInfo"使用不了 -->
    <button type="primary" class="btn-login" @click="getUserInfo" >一键登录</button>
    <!-- 登录提示 -->
    <view class="tips-text">登录后尽享更多权益</view>
  </view>
</template>

<style lang="scss">
.login-container {
  // 登录盒子的样式
  height: 750rpx;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  background-color: #f8f8f8;
  position: relative;
  overflow: hidden;

  // 绘制登录盒子底部的半椭圆造型
  &::after {
    content: ' ';
    display: block;
    position: absolute;
    width: 100%;
    height: 40px;
    left: 0;
    bottom: 0;
    background-color: white;
    border-radius: 100%;
    transform: translateY(50%);
  }

  // 登录按钮的样式
  .btn-login {
    width: 90%;
    border-radius: 100px;
    margin: 15px 0;
    background-color: #c00000;
  }

  // 按钮下方提示消息的样式
  .tips-text {
    font-size: 12px;
    color: gray;
  }
}
</style>

视图如下:
在这里插入图片描述
第二步,在store/user,js模块的state节点中,声明token字符串:

export default {
  // 开启命名空间
  namespaced: true,

  // state 数据
  state: () => ({
    // 收货地址
    address: JSON.parse(uni.getStorageSync('address') || '{}'),
    // 登录成功之后的 token 字符串
    token: '',
  }),

  // 省略其它代码
}

my.vue页面中,通过mapState辅助函数,导入需要的token字符串:

import badgeMix from '@/mixins/tabbar-badge.js'
// 1. 从 vuex 中按需导入 mapState 辅助函数
import { mapState } from 'vuex'

export default {
  mixins: [badgeMix],
  computed: {
    // 2. 从 m_user 模块中导入需要的 token 字符串
    ...mapState('m_user', ['token']),
  },
  data() {
    return {}
  },
}

my.vue中实现登录组件和用户信息页面组件的按需展示

<template>
  <view>

    <!-- 用户未登录时,显示登录组件 -->
    <my-login v-if="!token"></my-login>

    <!-- 用户登录后,显示用户信息组件 -->
    <my-userinfo v-else></my-userinfo>

  </view>
</template>

my-login组件中定义如下UI结构

<template>
  <view class="login-container">
    <!-- 提示登录的图标 -->
    <uni-icons type="contact-filled" size="100" color="#AFAFAF"></uni-icons>
    <!-- 登录按钮 -->
    <button type="primary" class="btn-login">一键登录</button>
    <!-- 登录提示 -->
    <view class="tips-text">登录后尽享更多权益</view>
  </view>
</template>

css样式

.login-container {
  // 登录盒子的样式
  height: 750rpx;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  background-color: #f8f8f8;
  position: relative;
  overflow: hidden;

  // 绘制登录盒子底部的半椭圆造型
  &::after {
    content: ' ';
    display: block;
    position: absolute;
    width: 100%;
    height: 40px;
    left: 0;
    bottom: 0;
    background-color: white;
    border-radius: 100%;
    transform: translateY(50%);
  }

  // 登录按钮的样式
  .btn-login {
    width: 90%;
    border-radius: 100px;
    margin: 15px 0;
    background-color: #c00000;
  }

  // 按钮下方提示消息的样式
  .tips-text {
    font-size: 12px;
    color: gray;
  }
}

点击登录按钮获取微信用户的基本信息
注意:

  • 今年4月13号 getUsinfo 只能获取到匿名用户信息,
  • uni.getUserProfile() 可以获取到用户的信息
 <button type="primary" class="btn-login" @click="getUserInfo" >一键登录</button>

在methods节点中声明 getUserInfo 事件函数如下

methods: {
  // 获取微信用户的基本信息
    async getUserInfo(e) {
				  
	 	// 今年4月13号getUsinfo只能获取到匿名用户信息,
		// uni.getUserProfile()可以获取到用户的信息
		// 获取用户信息
		const [err,succ]= await uni.getUserProfile({
			desc:'登录'
		})
		if(err) return uni.$showMsg('您取消了授权')
		// 保存用户的信息
		this.updateUserInfo(succ)
		// 3.调用uni.login接口登录code参数
		const [ere,loginSucc]=await uni.login()
		// console.log(res)
		if(ere) return uni.$showMsg('登录失败')
		// 真正的发送请求获取token
		// 4.准备登录必备的参数
		const params={
			code:loginSucc.code,
			encryptedData:succ.encryptedData,
			iv:succ.iv,
			rawData:succ.rawData,
			signature:succ.signature
		}
		// 发送请求获取token
		const {data:{message,meta}} =await uni.$http.post('/api/public/v1/users/wxlogin',params)
		console.log(meta)
		// 判断获取token是否成功
		if(meta.status!==200) return uni.$showMsg('登录失败')
			// 保存token
			this.updateToken(message.token)
		}
}

将登录的信息存储到vuex里,在store/user.js模块的state节点中,声明userinfo的信息对象如下:

// state 数据
state: () => ({
  // 收货地址
  // address: {}
  address: JSON.parse(uni.getStorageSync('address') || '{}'),
  // 登录成功之后的 token 字符串
  token: '',
  // 用户的基本信息
  userinfo: JSON.parse(uni.getStorageSync('userinfo') || '{}')
}),

store/user.js 模块

export default {
  // 开启命名空间
  namespaced: true,

  // state 数据
  state: () => ({
    // 收货地址
    address: JSON.parse(uni.getStorageSync('address')||'{}'),
    // 登录成功之后的 token 字符串
      token: uni.getStorageSync('token') || '',
      // 用户的基本信息
      userinfo: JSON.parse(uni.getStorageSync('userinfo') || '{}')
  }),

  // 方法
  mutations: {
	  // 更新token
	  updateToken(state,token){
		  state.token=token

		  uni.setStorageSync('token',token)
	  },
	  // 设置用户的·基本信息
	  updateUserInfo(state,userInfo){
		  state.userinfo=userInfo
		  // 通过this.commit方法调用m_user的方法
		    this.commit('m_user/saveUserInfoToStorage')
	  },
    // 更新收货地址
    updateAddress(state, address) {
      state.address = address
      this.commit('m_user/saveAddressToStorage')
    },
    saveAddressToStorage(state){
	    uni.setStorageSync('address',JSON.stringify(state.address))
    },
    // 将 userinfo 持久化存储到本地
      saveUserInfoToStorage(state) {
        uni.setStorageSync('userinfo', JSON.stringify(state.userinfo))
      }
  },

  // 数据包装器
  getters: {
	  addstr(state){
		  if(!state.address.provinceName) return''
		   // 拼接 省,市,区,详细地址 的字符串并返回给用户
		      return state.address.provinceName + state.address.cityName + state.address.countyName + state.address.detailInfo
	  }
  },
}
```
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白在线学前端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值