UniApp 一键登录功能文档解析

773 阅读3分钟

本文档将介绍 UniApp 实现一键登录的功能,并解析相关代码的设计和实现逻辑。通过一键登录功能,用户可以使用手机号码快速登录应用,并且支持使用微信、苹果等第三方账号登录。

1. 一键登录功能概述

一键登录是一种方便快捷的登录方式,用户只需通过手机号验证,即可快速登录应用。该功能通常利用运营商提供的接口进行手机号认证,并通过服务端完成用户的身份验证。

2. 功能实现的核心代码

2.1 导入必要的依赖和模块
javascript
复制代码
import store from '@/store/store.js'; // 导入 Vuex store 用于管理全局状态
import {
	loginAPI,
	getUserInfoAPI
} from '@/api/login.js'; // 导入登录相关 API
import {
    initVueI18n
} from '@dcloudio/uni-i18n'; // 导入 i18n 国际化功能
import messages from '@/locale/index'; // 国际化消息配置

const { t } = initVueI18n(messages); // 初始化国际化功能,用于支持多语言登录提示

通过导入模块和API,我们可以管理用户登录的状态,并处理用户信息的获取和登录流程。

2.2 一键登录主函数 startOneKeyLogin
javascript
复制代码
function startOneKeyLogin() {
	const systemInfo = uni.getSystemInfoSync();
	let isAppleDevice = systemInfo.platform === 'ios'; // 检测设备是否为 iOS
	uni.preLogin({ // 预登录操作,准备获取授权信息
		provider: "univerify", // 指定登录服务提供者
		success: async (res) => {
			uni.login({
				provider: 'univerify',
				univerifyStyle: { // 设置一键登录授权界面
					"fullScreen": true,
					"backgroundColor": "#ffffff",
					"backgroundImage": "static/images/bj.png",
					"icon": {
						"path": "static/images/logo.png",
						"width": "68px",
						"height": "68px",
					},
					"phoneNum": {
						"color": "#20222B" // 手机号文字颜色
					},
					"authButton": {
						"normalColor": "#BEFC3E", // 授权按钮的颜色和样式
						"textColor": "#000000",
						"title": t('login.oneClickLogin'),
					},
					"otherLoginButton": {
						"visible": true, // 显示其他登录方式
						"textColor": "#999999",
						"title": t('login.loginPassword'),
					},
					"privacyTerms": {
						"defaultCheckBoxState": true,
						"termsColor": "#0CC499",
						"prefix": t('login.iAgreeToTheTerms'),
						"suffix": t('login.useMobileNumberToLogin'),
						"privacyItems": [
							{
								url: "https://doctor.planck.cool/common-file/h5/protocol.html",
								title: t('login.agreement')
							},
							{
								url: "https://doctor.planck.cool/common-file/h5/privacy.html",
								title: t('login.privacyPolicys')
							}
						]
					},
					"buttons": {
						"iconWidth": "45px",
						"list": [
							...(isAppleDevice ? [] : [{
								"provider": "weixin",
								"iconPath": "/static/images/wechat.png"
							}]),
							...(isAppleDevice ? [{
								"provider": "apple",
								"iconPath": "/static/images/apple.png"
							}] : [])
						]
					}
				},
				success(res) {
					// 调用云函数或后端接口,验证一键登录
					uniCloud.callFunction({
						name: 'login',
						data: {
							queryStringParameters: {
								access_token: res.authResult.access_token,
								openid: res.authResult.openid,
							},
						},
						success: async (callRes) => {
							// 处理成功登录后的逻辑
							const requestData = {
								loginType: 4,
								facilityMsg: store.state.uniqueIdentifier,
								quickLoginAccessToken: res.authResult.access_token,
								quickLoginOpenId: res.authResult.openid,
								phone: callRes.result.data.phoneNumber
							};
							const response = await loginAPI(requestData);
							if (response.code === 200) {
								uni.showToast({
									title: t('login.oneKeyLoginSuccess'),
									icon: 'none',
									duration: 2000,
									position: 'bottom'
								});
								uni.setStorageSync('access_token', response.data.access_token);
								store.commit('setLoginStatus');
								getUserInfo();
							} else {
								// 处理登录失败
								uni.showToast({
									title: response.msg,
									icon: 'none',
									duration: 2000,
									position: 'bottom'
								});
							}
						}
					});
				},
				fail(err) {
					// 处理授权失败情况
					uni.closeAuthView();
				}
			});
		},
		fail(err) {
			// 预登录失败,显示错误提示
			uni.showToast({
				title: t('login.unsupportedOneKeyLogin'),
				icon: 'none',
				duration: 2000,
				position: 'bottom'
			});
		},
	});
}

3. 关键功能点解析

  1. 设备检测:通过 uni.getSystemInfoSync() 检测用户设备的系统,判断是 iOS 还是安卓,针对不同平台展示不同的登录选项。
  2. UI自定义univerifyStyle 提供了丰富的自定义选项,用户可以根据品牌风格自定义登录界面的颜色、按钮样式、隐私条款等,提升用户体验。
  3. 云函数调用:一键登录成功后,调用 uniCloud.callFunction 进行后端验证,获取手机号等信息并登录应用。
  4. 登录成功处理:一旦登录成功,将 access_token 存入本地存储,并更新登录状态,最终跳转到应用的主页面或绑定手机号页面。

4. 微信登录与苹果登录

除了支持一键登录,该代码还提供了微信和苹果的登录方式。对于微信登录,调用 uni.login({provider: "weixin"}),对于苹果设备则调用 uni.login({provider: 'apple'})。这些方式为用户提供了更多登录选择。

5. 总结

本示例展示了如何在 UniApp 中集成一键登录功能,并且通过自定义登录界面、调用云函数或后端 API 来完成用户认证,提升了用户登录的便捷性和体验感。