腾讯云低代码实战:用户个人信息管理


在前面的章节,我们已经实现了用户的基础账户功能:注册、会员开通以及登录状态判断。用户现在可以进入平台并被系统识别了。但用户可能需要修改昵称、头像,以及最重要的——管理他们的收货/服务地址。本章,我们将实现这些个人信息和地址的管理功能。

1. 用户个人信息管理

用户需要一个地方来查看和修改自己的基本信息,并方便地管理他们的服务地址,以便在创建订单时快速选择。我们将实现一个个人资料编辑页面和一个地址管理页面。

1.1 需求分析

核心需求点包括:

  • 用户能够查看并修改其在平台上的昵称和头像。
  • 用户可以管理一个地址列表,包含添加、编辑、删除地址的功能。
  • 用户可以从地址列表中设置一个默认地址。
  • 这些操作需要安全地通过后端 API 进行,并更新到数据模型中。

1.2 数据模型:扩展与新增

为了实现个人信息和地址管理,我们需要对用户模型进行扩展,并新增一个独立的地址模型,就像我们在本篇开头计划的那样。

用户模型 (jz_users) 扩展: 在已有的 jz_users 模型中,添加以下字段来存储用户昵称和头像。

  • avatarUrl (文件类型 或 字符串类型):存储用户头像。
  • nickname (字符串类型):存储用户设置的昵称。
    在这里插入图片描述

地址模型 (jz_addresses) 新增: 创建一个新的数据模型来存储用户的地址信息,并与用户模型建立关联。

  • userId (关联关系类型):关联到 jz_users 模型 (多对一关系),表明这个地址属于哪个用户。
  • consigneeName (字符串类型):收货人姓名。
  • consigneePhone (电话类型 或 字符串类型):收货人手机号。
  • province (地区):省市区。
  • detailAddress (字符串类型):详细地址(街道、门牌号、小区、楼栋等)。
  • isDefault (布尔类型):标记是否为默认地址(truefalse)。
    在这里插入图片描述

权限设置:jz_addresses 模型设置权限,确保只有当前用户可以读写自己的地址,管理员可以读写所有地址。

在这里插入图片描述

1.3 后端逻辑:实现个人信息与地址管理 API

我们需要一系列云函数 API 来支持前端对用户信息的修改和地址的增删改查操作。

updateUserProfile 云函数:更新用户昵称与头像

  • 功能: 根据用户 ID 更新用户的昵称和头像 URL。
    在这里插入图片描述

  • 入参: openid, data (包含 nickname, avatarUrl 等需要更新的字段)。
    在这里插入图片描述

  • 逻辑: 接收参数 -> 找到对应用户记录 -> 使用平台数据模型更新方法 (wedaUpdateV2 ) 更新字段 -> 返回结果。

自定义代码:

const ErrorCode = {
    SUCCESS: 0,
    PARAM_ERROR: 1001,
    NOT_FOUND: 1002, // 用户未找到(未注册)
    SYSTEM_ERROR: 1003,
    // USER_EXISTS: 1004, // 注册时用
    // USER_NOT_EXISTS: 1005 // 可以用 NOT_FOUND 代替
};
// 更新用户个人信息
module.exports = async function (params, context) {
    const { openid, data } = params; // data = { nickname: '新昵称', avatarUrl: '新头像URL' }

    if (!openid || !data || Object.keys(data).length === 0) {
        return { code: ErrorCode.PARAM_ERROR, message: '参数错误或更新数据为空' };
    }

    try {
        // 更新 jz_users 模型记录
        const result = await context.callModel({
            name: "jz_users",
            methodName: "wedaUpdateV2",
            params: {
                "filter": {
                    "where": {
                        "$and": [
                            {
                                "openid": {
                                    "$eq": openid
                                }

                            }
                        ]
                    }
                },
                data: data // 要更新的数据对象
            }
        });

        if (result.count === 0) {
            return { code: ErrorCode.NOT_FOUND, message: '用户未找到或信息未改变' };
        }

        return { code: ErrorCode.SUCCESS, data: { count: result.count } };

    } catch (error) {
        console.error("updateUserProfile error:", error);
        return { code: ErrorCode.SYSTEM_ERROR, message: `系统错误: ${error.message}` };
    }
};

在这里插入图片描述

addAddress 云函数:新增地址

  • 功能: 为当前用户添加一个收货地址记录。
    在这里插入图片描述

  • 入参: userId, addressInfo (包含 consigneeName, consigneePhone, province, detailAddress 等字段)。
    在这里插入图片描述

  • 逻辑: 参数验证 -> 将地址信息及用户 ID 插入到 jz_addresses 模型 -> 返回新地址 ID。

自定义代码:

const ErrorCode = {
    SUCCESS: 0,
    PARAM_ERROR: 1001,
    NOT_FOUND: 1002, // 用户未找到(未注册)
    SYSTEM_ERROR: 1003,
    // USER_EXISTS: 1004, // 注册时用
    // USER_NOT_EXISTS: 1005 // 可以用 NOT_FOUND 代替
};
// 添加收货地址
module.exports = async function (params, context) {
    const { userId, addressInfo } = params;

     if (!userId || !addressInfo || !addressInfo.consigneeName || !addressInfo.detailAddress) {
         return { code: ErrorCode.PARAM_ERROR, message: '参数不完整' };
     }
    // 可以添加手机号格式等更详细的验证

    try {
         const result = await context.callModel({
             name: "jz_addresses",
             methodName: "wedaCreateV2",
             params: {
                 data: {
                     userId: { _id: userId }, // 关联用户ID
                     ...addressInfo, // 展开地址信息字段
                     isDefault: false // 新增地址默认为非默认
                 }
             }
         });

         return { code: ErrorCode.SUCCESS, data: { addressId: result.id } };

    } catch (error) {
        console.error("addAddress error:", error);
        return { code: ErrorCode.SYSTEM_ERROR, message: `添加地址失败: ${error.message}` };
    }
};

setDefaultAddress 云函数:设置默认地址

  • 功能: 将指定地址设为默认,并将该用户其他地址设为非默认。
  • 入参: addressId, userId

逻辑:

  1. 参数验证。
  2. 确保目标地址属于当前用户。
  3. 关键步骤: 使用 wedaUpdateV2 批量更新该用户下所有地址,将 isDefault 设为 false
  4. 使用 wedaUpdateV2 更新目标地址,将 isDefault 设为 true
  5. (可选)使用事务确保两步操作要么都成功要么都失败,但低代码平台的数据 API 不支持事务,需要根据平台能力来处理,例如分步调用并处理可能的失败情况。

自定义代码:

const ErrorCode = {
    SUCCESS: 0,
    PARAM_ERROR: 1001,
    NOT_FOUND: 1002, // 用户未找到(未注册)
    SYSTEM_ERROR: 1003,
    // USER_EXISTS: 1004, // 注册时用
    // USER_NOT_EXISTS: 1005 // 可以用 NOT_FOUND 代替
};
// 设置默认地址
module.exports = async function (params, context) {
    const { addressId, userId } = params;

    if (!addressId || !userId) {
        return { code: ErrorCode.PARAM_ERROR, message: '参数缺失' };
    }

    try {
        // 1. 将该用户下所有地址设为非默认
        await context.callModel({
            name: "jz_addresses",
            methodName: "wedaBatchUpdateV2",
            params: {
                "filter": {
                    "where": {
                        "$and": [
                            {
                                "userId": {
                                    "$eq": userId
                                }
                            }
                        ]
                    }
                },
                data: { isDefault: false }, // 更新字段
            }
        });

        // 2. 将目标地址设为默认
        const result = await context.callModel({
            name: "jz_addresses",
            methodName: "wedaUpdateV2",
            params: {
                "filter": {
                    "where": {
                        "$and": [
                            {
                                "_id": {
                                    "$eq": addressId
                                }

                            }
                        ]
                    }
                },
                data: { isDefault: true } // 更新字段
            }
        });

        if (result.count === 0) {
            return { code: ErrorCode.NOT_FOUND, message: '目标地址未找到或不属于当前用户' };
        }

        return { code: ErrorCode.SUCCESS, data: { updatedCount: result.count } };

    } catch (error) {
        console.error("setDefaultAddress error:", error);
        return { code: ErrorCode.SYSTEM_ERROR, message: `系统错误: ${error.message}` };
    }
};

1.4 前端实现:搭建页面与绑定数据

我们需要在用户小程序中搭建“个人资料编辑”页面和“收货地址管理”(列表及编辑)页面。

个人资料编辑页面:

我们上一篇是用的模板搭建,模板效果也一般,我们还是按照原型来搭建,原型的效果
在这里插入图片描述
先新建一个空白页,命名为我的
在这里插入图片描述
页面中添加一个普通容器作,设置样式如下
在这里插入图片描述

:root {
  width: 100%;
  height: 100vh;
  background-color: rgb(245,245,245);
}

下边继续添加一个普通容器,设置背景色
在这里插入图片描述
设置布局为纵向排列,垂直水平居中
在这里插入图片描述
普通容器里添加一个图片组件,设置宽度和高度各位50,圆角为25
在这里插入图片描述
图片的地址,从我们的全局变量里绑定,绑定为具体的头像的地址
在这里插入图片描述

图片下边添加文本组件,文本内容绑定为昵称
在这里插入图片描述
文本下边添加一个按钮,设置按钮的名称为编辑资料
在这里插入图片描述
后续的界面,我们下一篇搭建一下,让前端和后端联动起来

1.5 测试与调试

  • 测试个人资料修改:上传不同图片作为头像,修改昵称,检查数据库是否更新,在其他页面查看是否同步显示。
  • 测试地址列表:添加多个地址,检查列表显示是否正确。
  • 测试新增地址:填写信息并保存,检查列表中是否出现新地址。
  • 测试编辑地址:点击编辑,修改信息并保存,检查列表中对应地址是否更新。
  • 测试删除地址:点击删除,确认删除后,检查列表中地址是否移除。
  • 测试设置默认地址:将某个地址设为默认,检查列表中默认标识是否切换到该地址,其他地址是否变为非默认。再次设置另一个地址为默认,检查逻辑是否正确。
  • 检查必填项、手机号格式等前端/后端验证。
  • 使用平台的调试工具,查看 API 调用是否成功,参数和返回数据是否正确,数据库操作是否符合预期。

总结

在本章中,我们为用户构建了完善的个人信息和收货地址管理功能。我们通过扩展数据模型、创建一系列精细化的后端云函数 API,并在前端使用组件库和事件绑定,实现了个人资料的查看/编辑、地址的列表展示、新增、编辑、删除和设为默认功能。用户现在可以在平台中更好地管理自己的信息,为后续便捷下单打下了坚实的基础。

至此,用户模块的核心功能(注册、登录、信息管理)就基本完成了。下一章,我们将转向平台的另一大核心——服务,学习如何让管理员在后台发布和管理服务项目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

低代码布道师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值