在前面的章节,我们已经实现了用户的基础账户功能:注册、会员开通以及登录状态判断。用户现在可以进入平台并被系统识别了。但用户可能需要修改昵称、头像,以及最重要的——管理他们的收货/服务地址。本章,我们将实现这些个人信息和地址的管理功能。
1. 用户个人信息管理
用户需要一个地方来查看和修改自己的基本信息,并方便地管理他们的服务地址,以便在创建订单时快速选择。我们将实现一个个人资料编辑页面和一个地址管理页面。
1.1 需求分析
核心需求点包括:
- 用户能够查看并修改其在平台上的昵称和头像。
- 用户可以管理一个地址列表,包含添加、编辑、删除地址的功能。
- 用户可以从地址列表中设置一个默认地址。
- 这些操作需要安全地通过后端 API 进行,并更新到数据模型中。
1.2 数据模型:扩展与新增
为了实现个人信息和地址管理,我们需要对用户模型进行扩展,并新增一个独立的地址模型,就像我们在本篇开头计划的那样。
用户模型 (jz_users
) 扩展: 在已有的 jz_users
模型中,添加以下字段来存储用户昵称和头像。
avatarUrl
(文件类型 或 字符串类型):存储用户头像。nickname
(字符串类型):存储用户设置的昵称。
地址模型 (jz_addresses
) 新增: 创建一个新的数据模型来存储用户的地址信息,并与用户模型建立关联。
userId
(关联关系类型):关联到jz_users
模型 (多对一关系),表明这个地址属于哪个用户。consigneeName
(字符串类型):收货人姓名。consigneePhone
(电话类型 或 字符串类型):收货人手机号。province
(地区):省市区。detailAddress
(字符串类型):详细地址(街道、门牌号、小区、楼栋等)。isDefault
(布尔类型):标记是否为默认地址(true
或false
)。
权限设置: 为 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
。
逻辑:
- 参数验证。
- 确保目标地址属于当前用户。
- 关键步骤: 使用
wedaUpdateV2
批量更新该用户下所有地址,将isDefault
设为false
。 - 使用
wedaUpdateV2
更新目标地址,将isDefault
设为true
。 - (可选)使用事务确保两步操作要么都成功要么都失败,但低代码平台的数据 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,并在前端使用组件库和事件绑定,实现了个人资料的查看/编辑、地址的列表展示、新增、编辑、删除和设为默认功能。用户现在可以在平台中更好地管理自己的信息,为后续便捷下单打下了坚实的基础。
至此,用户模块的核心功能(注册、登录、信息管理)就基本完成了。下一章,我们将转向平台的另一大核心——服务,学习如何让管理员在后台发布和管理服务项目。