
目录前言一、 核心数据模型门店与用户表二、 深度解析微搭的三种用户机制三、 注册与登录闭环业务流阶段一云原生拦截与 身份初始化阶段二业务系统的身份绑定欢迎页路由分发四、创建应用五、创建页面六、 核心逻辑代码实现前言本次实战课程我们以健身房私教课程为业务场景以腾讯云开发作为开发工具系统讲解系统搭建过程。在正式开始搭建健身房私教管理系统之前我们必须先跨过一道门槛用户权限与注册机制。对于一套包含管理端和小程序端的完整业务系统而言我们需要同时服务于老板、教练和学员。如何优雅地处理这些角色的登录、注册和权限分配本文将从数据库设计出发带你彻底理清腾讯云微搭的用户体系底层逻辑并实现一个完整的外部用户注册闭环。一、 核心数据模型门店与用户表在我们的系统设计中一切业务流转都建立在统一的身份管理之上。我们主要围绕两张核心表展开门店表 (fit_store_branches)支持未来多门店的扩展记录门店的编码、地址、经纬度等基础信息。字段名称字段标识数据类型描述门店IDid文本主键门店名称name文本-门店编码code文本唯一地址address文本-手机号phone电话号码-经纬度location对象{“lat”: , “lng”: }营业时间business_hours文本-状态statusenum启用/禁用排序sort_order数字-用户主表 (fit_users)这是系统的统一鉴权与身份管理表包含学员、教练、管理员所有用户。字段名称字段标识数据类型描述用户IDid文本主键手机号phone电话号码唯一索引姓名real_name文本-昵称nickname文本-头像avatar图片-角色role枚举学员/ 教练 / 管理员 / 员工微信OpenIDwx_openid文本小程序登录状态status枚举启用/禁用/待激活最后登录时间last_login_at日期时间-所属门店store_id关联关系多门店支持关联门店表多对一数据库的创建方式参考视频门店管理、用户管理相关操作二、 深度解析微搭的三种用户机制要做好注册闭环必须先理解微搭底层的用户分类机制。在微搭体系中用户被严格划分为三种类型内部用户通过用户名和密码登录拥有较高的系统权限通常只能在 PC 端管理后台使用。匿名用户免登录即可访问小程序端的用户通常只能浏览公开信息。外部用户通过手机号、微信授权等方式登录小程序端的用户。架构决策在我们的健身房系统中无论是需要在小程序端约课的学员还是需要查看排班的教练甚至是偶尔用手机看报表的管理员只要在小程序端进行交互我们统一采用外部用户机制进行注册和鉴权。三、 注册与登录闭环业务流传统的业务开发往往需要手写冗长的 Token 校验和拦截逻辑但在微搭中我们可以利用云开发的特性将注册闭环简化为以下两个阶段阶段一云原生拦截与 身份初始化当用户首次打开我们的小程序时云开发底层会检测到当前用户是未认证状态。系统自动将其拦截至官方提供的登录页要求用户提供手机号和验证码。用户完成验证后首次登录会在微搭的身份库中自动注册一个基础账号。此时用户在云开发底层有了合法的身份。阶段二业务系统的身份绑定欢迎页路由分发虽然用户在云开发身份认证层注册了但我们的业务主表fit_users里还没有他的详细信息。因此我们将小程序的“首页”设计为一个动态欢迎页利用按钮状态来控制路由获取凭证用户登录进入欢迎页后我们通过微搭的全局对象$w.auth获取当前用户的手机号。数据库查验根据该手机号去fit_users表中进行精确匹配。状态分发已存在老用户说明该用户已完成业务注册。我们将查询到的用户信息如角色、姓名、门店赋值给全局变量欢迎页按钮显示为“进入系统”点击直达业务工作台。不存在新用户说明是首次访问的新客。欢迎页按钮显示为“用户注册”点击后跳转至完善信息页面填写姓名、选择角色等提交后再写入fit_users表完成真正的业务注册。四、创建应用在搭建小程序的时候首先需要创建应用。打开控制台在左侧导航菜单选择微搭低代码在右侧内容区域选择小程序从空白创建添加应用的名称启用登录创建应用后我们需要调整一下登录方式选择调整规则链接选择前往身份认证勾选短信验证码登录勾选短信验证码主要是在登录的时候得到用户的手机号openid主要是用在支付时候提供五、创建页面创建应用的时候默认会提供一个空白页需要把他重命名为欢迎页六、 核心逻辑代码实现在欢迎页的生命周期方法如页面加载完成时我们可以通过$w.cloud.callDataSource来实现上述的查验逻辑。创建一个全局的登录方法创建一个全局对象用来保存用户的信息创建一个全局变量用来标识用户是否注册全局的登录方法代码如下exportdefaultasyncfunctionlogin(){// 1. 显示加载状态优化用户体验$w.utils.showLoading({title:身份核验中,mask:true});//try{// 2. 从微搭 Auth 对象获取当前外部用户的手机号constuserPhoneawait$w.auth.currentUser.phone||15122334455;if(!userPhone){$w.utils.showToast({title:获取手机号失败,icon:error});//return;}// 3. 调用数据源查询业务用户表constresawait$w.cloud.callDataSource({dataSourceName:fit_users,methodName:wedaGetRecordsV2,//params:{filter:{where:{$and:[{phone:{$eq:userPhone}},// 精确匹配手机号]}}}});// 4. 路由与状态分发if(res.recordsres.records.length0){// 查到用户存入全局变量假定已定义全局变量 userInfo 和 isRegistered$w.app.dataset.state.userInfores.records[0];$w.app.dataset.state.isRegisteredtrue;}else{// 未查到用户标记为未注册$w.app.dataset.state.isRegisteredfalse;}}catch(error){console.error(用户核验失败,error);}finally{$w.utils.hideLoading();//}}选中页面组件给页面显示的时候绑定方法绑定我们的全局登录通过这套机制我们完美地将底层的云开发 Auth 体系与我们的业务强耦合既保证了数据安全又利用了低代码平台的便利性实现了多角色在小程序的无缝接入。