少儿舞蹈小程序(17)用户登录与注册
本文介绍了基于低代码平台开发商城结算系统的核心流程,重点阐述了用户身份验证在结算环节的重要性。系统采用云开发用户体系,区分内部管理员和外部小程序用户,并选择OpenID作为基础注册方式以平衡便捷性和安全性。文章详细讲解了用户数据模型搭建、登录API开发、登录鉴权流程设计,以及未注册用户的引导注册机制,最终实现了一个包含用户身份验证的完整结算流程。
目录
前言
在上一篇中,我们完成了商城商品列表和购物车的开发。现在,我们来到了商城系统的核心环节——结算。结算不仅仅是计算价格,它还涉及到一个至关重要的概念:用户身份。
为什么用户必须登录才能结算?这不仅是为了记录订单信息,更是为了保障数据安全和用户体验。如果用户未登录就下单,我们无法将订单与其身份关联,导致用户无法查询自己的历史订单。此外,没有身份验证,数据的安全性也无法得到保障。
本篇将详细介绍如何在低代码平台中,利用云开发的用户体系和数据权限,构建一个安全、完整的结算流程。
1 理论基础:理解云开发的用户体系
在开始开发前,我们需要理解云开发中的两种用户类型:
- 内部用户(管理员):通常通过 PC 端登录后台,用于管理商品、订单等数据。他们拥有较高的权限。
- 外部用户(小程序使用者):指通过小程序进行注册和登录的普通用户。他们的数据操作(如创建订单、查询个人信息)受到严格的数据权限控制。
我们本篇重点关注的是外部用户体系。
关于注册方式的取舍:
云开发支持多种注册方式,每种都有其优缺点:
- OpenID 注册:这是最基础、最便捷的方式。每个用户在小程序中都有一个唯一的 OpenID,我们可以直接用它作为用户身份标识进行注册。优点是免费,且用户无感。
- 手机号注册(手机号验证码):需要用户输入手机号和验证码。**优点是用户身份真实可靠,**便于后续的客户服务和营销。但需要消耗短信资源,且可能产生费用。
- 微信授权手机号注册:用户授权即可获取手机号。**优点是体验流畅,无需用户手动输入。但需要向微信支付相关费用。
为了简化开发并保证用户体验,我们选择OpenID 注册作为基础,它既能满足数据权限的需求,又不会给用户增加操作负担。
2 准备工作:配置登录与数据模型
2.1 启用登录功能
在低代码平台中启用登录功能非常简单,无需编写复杂代码。点击系统配置的图标
选择使用托管登录页
选择openid登录
2.2 搭建用户数据模型
为了记录用户信息,我们需要创建一个用户表(User)。
- 进入数据模型面板,点击新建数据表。
- 将数据表命名为
User
。 - 添加必要的字段:
openid
(字符串):此字段是唯一的,用于标识每个用户。nickname
(字符串):用户的微信昵称。avatar
(字符串):用户的微信头像 URL。phone
(字符串):用户的手机号码。
3 核心逻辑:登录与全局变量
登录的核心逻辑在于鉴权,即验证用户身份,并将其信息存储到全局变量中供后续使用。
3.1 编写登录 API
我们创建一个名为 login
的自定义 API,它的作用是判断用户是否已注册。
API 代码逻辑:
/**
* 用户登录API
* 根据openid查询用户表,如果存在返回用户信息,并标识是否为注册用户
*/
module.exports = async function (params, context) {
try {
// 获取openid参数
const openid = params.openid;
// 参数校验
if (!openid) {
return {
code: 400,
message: 'openid不能为空',
data: null,
timestamp: Date.now()
};
}
// 查询用户当前信息(使用查询单条记录的语法)
const userResult = await context.callModel({
dataSourceName: 'dance_users',
methodName: 'wedaGetItemV2',
params: {
filter: {
where: {
openid: { $eq: openid }
}
},
select: { $master: true }
}
});
// 检查用户是否存在
if (!userResult || Object.keys(userResult).length === 0) {
return {
code: 404,
message: '用户不存在',
data: null,
timestamp: Date.now()
};
}
// 判断是否为注册用户(通过是否有手机号来判断)
const isRegistered = !!userResult.phone;
// 返回用户信息
return {
code: 200,
message: '登录成功',
data: {
userInfo: userResult,
isRegistered: isRegistered
},
timestamp: Date.now()
};
} catch (error) {
console.error('用户登录错误:', error);
return {
code: 500,
message: '服务器内部错误',
data: null,
timestamp: Date.now()
};
}
};
3.2 绑定登录事件
在结算页面,我们不再是简单地点击按钮,而是需要一个登录鉴权流程。
- 在结算按钮的点击事件中,首先调用我们刚刚创建的
login
API。 - 根据 API 的返回结果,我们决定下一步操作:
- 如果
isRegistered
为true
:说明用户已登录,我们就可以继续执行结算流程。 - 如果
isRegistered
为false
:说明用户未注册,我们弹出一个表单容器,引导用户进行注册。
- 如果
为了实现页面跳转,我们需要先创建一个订单结算页面
然后再创建一个用户注册的页面
3.3 用户注册
未注册用户会看到一个注册表单,通常包含昵称、头像和手机号等信息。
在注册页面添加表单容器,数据模型选择用户表
选中openid,绑定输入值,从登录对象里绑定openId字段
选中昵称字段,打开微信端获取昵称配置
选中头像字段,打开微信端获取头像配置
表单提交成功后配置返回上一页的事件
3.4 用户鉴权
现在我们已经有了API用来获取用户是否登录,前端需要创建一个全局变量保存用户的的登录信息。创建一个全局变量,类型是对象
我们要创建一个检查登录的自定义方法,逻辑是根据当前用户的openid,来调用API,看用户是否登录了,如果登录就跳转到结算页面,如果未登录就跳转到注册页面
export default async function ({ event, data }) {
const openid = await $w.auth.currentUser.openId||"123"
const result = await $w.cloud.callDataSource({
dataSourceName: 'yhgl_rc2573h',
methodName: 'login',
params: {
openid: openid
}, // 方法入参
});
console.log("result", result)
if (result?.data?.isRegistered) {
$w.app.dataset.state.user = result.data.userInfo
$w.utils.navigateTo({
pageId: 'u_ding_dan_jie_suan', // 页面 Id
params: { key: 'value' }
});
} else {
$w.utils.showModal({
title: '用户注册提醒',
content: '您还未注册,是否注册',
success(res) {
if (res.confirm) {
$w.utils.navigateTo({
pageId: 'u_yong_hu_zhu_ce', // 页面 Id
params: { key: 'value' }
});
} else if (res.cancel) {
console.log('用户点击取消');
}
}
});
}
}
给结算按钮配置点击事件,调用我们的方法
整体效果
用户打开小程序的时候,先点击加入购物车购买商品
点击购物车的图标打开购物车弹窗
点击结算时候提醒用户进行注册
点击确定,跳转到注册页面
注册完了之后,再次点击结算的时候就可以跳转到订单结算页面
总结
本篇我们介绍了用户登录注册的整体流程。既要熟知低代码的用户体系,又要借助他已经存在的功能完成我们自己业务体系的建立。
有时候产品规划的其实是和我们真正想要的是有不小差距的,那只能在满足产品要求的条件下我们做一定的改造,记住不管啥工具都是为了满足我们的业务需要的。下一篇介绍一下订单结算的搭建,敬请期待。
更多推荐
所有评论(0)