本文档将介绍 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. 关键功能点解析
- 设备检测:通过
uni.getSystemInfoSync()检测用户设备的系统,判断是 iOS 还是安卓,针对不同平台展示不同的登录选项。 - UI自定义:
univerifyStyle提供了丰富的自定义选项,用户可以根据品牌风格自定义登录界面的颜色、按钮样式、隐私条款等,提升用户体验。 - 云函数调用:一键登录成功后,调用
uniCloud.callFunction进行后端验证,获取手机号等信息并登录应用。 - 登录成功处理:一旦登录成功,将
access_token存入本地存储,并更新登录状态,最终跳转到应用的主页面或绑定手机号页面。
4. 微信登录与苹果登录
除了支持一键登录,该代码还提供了微信和苹果的登录方式。对于微信登录,调用 uni.login({provider: "weixin"}),对于苹果设备则调用 uni.login({provider: 'apple'})。这些方式为用户提供了更多登录选择。
5. 总结
本示例展示了如何在 UniApp 中集成一键登录功能,并且通过自定义登录界面、调用云函数或后端 API 来完成用户认证,提升了用户登录的便捷性和体验感。