少儿舞蹈小程序(21)我的页面搭建

目录

  • [1 登录注册逻辑](#1 登录注册逻辑)
  • [2 搭建页面布局](#2 搭建页面布局)
    • [2.1 未登录视图](#2.1 未登录视图)
    • [2.2 搭建登录视图](#2.2 搭建登录视图)
    • [2.3 修改家长信息](#2.3 修改家长信息)
    • [2.4 按照角色跳转](#2.4 按照角色跳转)
  • 总结

通常小程序中,在用户浏览完首页的主要业务后,如果希望后续进行报名的,机构需要家长先进行注册,通常在我的页面提供相关的用户登录和注册功能。本篇我们就介绍一下我的页面的搭建思路。

1 登录注册逻辑

我们在前述章节中已经详细讲解了登录的逻辑,对应的API已经编写完毕。在搭建页面的时候,在什么时机调用登录的方法呢?答案是使用页面的生命周期函数

先创建一个我的页面

选中页面组件,在页面显示的时候调用我们全局的登录方法

这种在页面加载完毕后就知道了用户是否已经是登录的状态。

除了前端展示我们还需要完善一下后端的API,在用户登录的时候将用户的扩展信息如家长信息和教师信息一并查询出来

bash 复制代码
/**
 * 用户登录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;
    // 3. 查询用户收货地址列表
    const userAddresses = await context.callModel({
      dataSourceName: 'user_addresses',
      methodName: 'wedaGetRecordsV2',
      params: {
        filter: {
          where: {
            // 通过用户ID关联查询
            user_id: { $eq: userResult._id }
          }
        },
        // 按照是否默认进行排序,将默认地址排在最前面
        select : {
        "$master" : true
      },
      getCount : true,
      pageSize : 10,
      pageNumber : 1,
      orderBy:[{"is_default":"desc"}]
      }
    });
    // 4. 查询家长信息
    const parentInfo = await context.callModel({
      dataSourceName: 'dance_parent',
      methodName: 'wedaGetRecordsV2',
      params: {
        filter: {
          where: {
            // 通过用户ID关联查询
            user_id: { $eq: userResult._id }
          }
        },
        // 按照是否默认进行排序,将默认地址排在最前面
        select : {
        "$master" : true
      },
      getCount : true,
      pageSize : 1,
      pageNumber : 1,
      }
    });
    // 5. 查询老师信息
    const teacherInfo = await context.callModel({
      dataSourceName: 'dance_teacher',
      methodName: 'wedaGetRecordsV2',
      params: {
        filter: {
          where: {
            // 通过用户ID关联查询
            user_id: { $eq: userResult._id }
          }
        },
        // 按照是否默认进行排序,将默认地址排在最前面
        select : {
        "$master" : true
      },
      getCount : true,
      pageSize : 1,
      pageNumber : 1,
      }
    });
    // 返回用户信息
    return {
      code: 200,
      message: '登录成功',
      data: {
        userInfo: userResult,
        isRegistered: isRegistered,
        userAddresses: userAddresses.records,
        parentInfo:parentInfo.records[0],
        teacherInfo:teacherInfo.records[0]
      },
      timestamp: Date.now()
    };

  } catch (error) {
    console.error('用户登录错误:', error);
    return {
      code: 500,
      message: '服务器内部错误',
      data: null,
      timestamp: Date.now()
    };
  }
};

2 搭建页面布局

2.1 未登录视图

首先是搭建未登录的视图

在网格布局的第一列里添加普通容器,里边添加一个普通容器和一个按钮组件,设置外层容器的样式为横向排列,两端对齐

内层的普通容器添加一个图片组件,添加两个文本,设置布局为横向排列,垂直居中

设置图片的宽高各为60,圆角半径为999

绑定图片的地址,从全局变量绑定头像字段

文本组件绑定为全局变量的昵称字段

设置相关组件的背景色,配置好之后如下图

给登录按钮设置点击事件,打开角色选择页面

给按钮设置条件展示,当用户未注册的时候显示登录按钮

2.2 搭建登录视图

登录之后用户的头像和昵称无需再额外设置,只需要再添加一个按钮,显示修改即可

修改的条件展示配置为用户已经登录显示

2.3 修改家长信息

我们在上一篇用表单容器搭建了注册页面,通常注册和修改是可以共用一个页面的。只是在打开的时候需要知道是新增的场景还是修改的场景,如果是修改的场景需要知道数据标识。

为此我们创建两个URL参数用来接收从我的页面传入的数据

在表单场景使用表达式进行绑定

bash 复制代码
$w.page.dataset.params.formType || 'create'

数据标识也绑定成URL参数

按照此方法,将老师的注册表单也进行完善

2.4 按照角色跳转

在登录的时候无需判断角色,让用户选择身份跳转即可。在修改的时候我们需要知道用户是什么身份,在用户表我们已经增加了角色字段,因此在点击的时候增加一个自定义方法进行跳转即可

bash 复制代码
export default function ({ event, data }) {

  const role = $w.app.dataset.state.user.userInfo.role
  if (role == "1") {
    $w.utils.navigateTo({
      pageId: 'u_jia_chang_zhu_ce', // 页面 Id
      params: { formType: 'edit',parentId:$w.app.dataset.state.user.parentInfo._id }
    });
  }else if(role=="2"){
    $w.utils.navigateTo({
      pageId: 'u_lao_shi_zhu_ce', // 页面 Id
      params: { formType: 'edit',teacherId:$w.app.dataset.state.user.teacherInfo._id }
    });
  }

}

总结

本篇我们讲解了我的页面用户登录部分的搭建过程,在一个多角色的系统中,如何控制家长、老师这些角色的信息是需要仔细思考的。搭建好,才可以通过角色来灵活的控制菜单的显示,具体数据的权限。

相关推荐
社会底层无业大学生1 小时前
uniapp微信小程序简单表格展示
微信小程序·小程序·uni-app·vue·1024程序员节
從南走到北1 小时前
JAVA无人自助共享系统台球室源码自助开台约球交友系统源码小程序
java·微信·微信小程序·小程序·1024程序员节
2501_915918414 小时前
iOS 26 查看电池容量与健康状态 多工具组合的工程实践
android·ios·小程序·https·uni-app·iphone·webview
2501_915909066 小时前
iOS 架构设计全解析 从MVC到MVVM与使用 开心上架 跨平台发布 免Mac
android·ios·小程序·https·uni-app·iphone·webview
2501_9160088916 小时前
Web 前端开发常用工具推荐与团队实践分享
android·前端·ios·小程序·uni-app·iphone·webview
2501_9159214316 小时前
“HTTPS 个人化”实战,个人站点与设备调试的部署、验证与抓包排查方法
网络协议·http·ios·小程序·https·uni-app·iphone
菜鸟una16 小时前
【微信小程序 + 消息订阅 + 授权】 微信小程序实现消息订阅流程介绍,代码示例(仅前端)
前端·vue.js·微信小程序·小程序·typescript·taro·1024程序员节
韩立学长17 小时前
【开题答辩实录分享】以《租房小程序的设计和实现》为例进行答辩实录分享
java·spring boot·小程序
從南走到北18 小时前
JAVA国际版一对一视频交友视频聊天系统源码支持H5 + APP
java·微信·微信小程序·小程序·音视频·交友
future_studio18 小时前
聊聊 Unity(小白专享、C# 小程序 之 联机对战)
unity·小程序·c#