前言

在上一篇中,我们完成了商城商品列表和购物车的开发。现在,我们来到了商城系统的核心环节——结算。结算不仅仅是计算价格,它还涉及到一个至关重要的概念:用户身份

为什么用户必须登录才能结算?这不仅是为了记录订单信息,更是为了保障数据安全用户体验。如果用户未登录就下单,我们无法将订单与其身份关联,导致用户无法查询自己的历史订单。此外,没有身份验证,数据的安全性也无法得到保障。

本篇将详细介绍如何在低代码平台中,利用云开发的用户体系数据权限,构建一个安全、完整的结算流程。

1 理论基础:理解云开发的用户体系

在开始开发前,我们需要理解云开发中的两种用户类型:

  • 内部用户(管理员):通常通过 PC 端登录后台,用于管理商品、订单等数据。他们拥有较高的权限。
  • 外部用户(小程序使用者):指通过小程序进行注册和登录的普通用户。他们的数据操作(如创建订单、查询个人信息)受到严格的数据权限控制。

我们本篇重点关注的是外部用户体系。

关于注册方式的取舍:

云开发支持多种注册方式,每种都有其优缺点:

  1. OpenID 注册:这是最基础、最便捷的方式。每个用户在小程序中都有一个唯一的 OpenID,我们可以直接用它作为用户身份标识进行注册。优点是免费,且用户无感。
  2. 手机号注册(手机号验证码):需要用户输入手机号和验证码。**优点是用户身份真实可靠,**便于后续的客户服务和营销。但需要消耗短信资源,且可能产生费用。
  3. 微信授权手机号注册:用户授权即可获取手机号。**优点是体验流畅,无需用户手动输入。但需要向微信支付相关费用。

为了简化开发并保证用户体验,我们选择OpenID 注册作为基础,它既能满足数据权限的需求,又不会给用户增加操作负担。

2 准备工作:配置登录与数据模型

2.1 启用登录功能

在低代码平台中启用登录功能非常简单,无需编写复杂代码。点击系统配置的图标
在这里插入图片描述
选择使用托管登录页
在这里插入图片描述
选择openid登录
在这里插入图片描述

2.2 搭建用户数据模型

为了记录用户信息,我们需要创建一个用户表(User)

  1. 进入数据模型面板,点击新建数据表。
  2. 将数据表命名为 User
  3. 添加必要的字段:
    • 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 绑定登录事件

在结算页面,我们不再是简单地点击按钮,而是需要一个登录鉴权流程

  1. 在结算按钮的点击事件中,首先调用我们刚刚创建的 login API。
  2. 根据 API 的返回结果,我们决定下一步操作:
    • 如果 isRegisteredtrue:说明用户已登录,我们就可以继续执行结算流程。
    • 如果 isRegisteredfalse:说明用户未注册,我们弹出一个表单容器,引导用户进行注册。

为了实现页面跳转,我们需要先创建一个订单结算页面
在这里插入图片描述
然后再创建一个用户注册的页面
在这里插入图片描述

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('用户点击取消');
        }
      }
    });

  }

}

给结算按钮配置点击事件,调用我们的方法
在这里插入图片描述

整体效果

用户打开小程序的时候,先点击加入购物车购买商品
在这里插入图片描述

点击购物车的图标打开购物车弹窗
在这里插入图片描述
点击结算时候提醒用户进行注册
在这里插入图片描述
点击确定,跳转到注册页面
在这里插入图片描述
注册完了之后,再次点击结算的时候就可以跳转到订单结算页面

总结

本篇我们介绍了用户登录注册的整体流程。既要熟知低代码的用户体系,又要借助他已经存在的功能完成我们自己业务体系的建立。

有时候产品规划的其实是和我们真正想要的是有不小差距的,那只能在满足产品要求的条件下我们做一定的改造,记住不管啥工具都是为了满足我们的业务需要的。下一篇介绍一下订单结算的搭建,敬请期待。

Logo

低代码爱好者的网上家园

更多推荐