微搭低代码MBA培训管理系统07——用户登录

微搭低代码MBA培训管理系统07——用户登录

目录

前情回顾与本节目标

在上一讲中,我们完成了页面管理与角色权限的分配。至此,系统的“骨架”和“规则”已经搭建完毕。

本节我们将正式打通用户登录与鉴权闭环。为了最大化提升开发效率,我们将直接启用云开发的“手机号验证码登录”功能。当用户通过身份验证进入门户页时,我们再根据其手机号拉取完整的组织架构和权限信息,实现千人千面的工作台入口控制。

本节核心目标:

  1. 拥抱云原生认证:基于云开发内置的 $w.auth.currentUser 获取已登录用户的手机号。
  2. 构造全局 User 对象:在门户页初始化时,聚合用户的部门、岗位、角色与权限信息。
  3. 门户权限路由:根据构建好的 User 对象中的角色信息,动态控制各业务门户的入口可用性及跳转。
在这里插入图片描述

第一步:数据与变量准备

为了不偏离核心,这里仅重点列出本节直接相关的核心数据模型。

1.1 数据源配置

确保系统中已存在以下核心表(部门、岗位、角色等表已在前几篇中创建完毕):

1. Users表(用户信息表)

核心字段标识类型说明
姓名 / 手机号name / phone单行文本手机号作为与云开发认证绑定的唯一标识
部门 / 岗位dept_id / post_id关联关系关联Departments和Posts表
最后登录last_login日期时间门户初始化时自动更新

2. UserRoles表(用户-角色关联表)
用于多对多映射:包含 user_id(关联Users表)和 role_id(关联Roles表)。

1.2 门户页变量设置

首页中创建以下全局变量,用于承载全局数据:

  • currentUser (对象, {}):存储当前用户基础信息及部门、岗位。
  • userRoles (数组, []):存储当前用户的角色编码集合,用于判断门户入口权限。
在这里插入图片描述


在这里插入图片描述

第二步:门户页初始化与 User 对象构造

因为云开发已经帮我们挡住了未登录用户,所以只要能进入门户页,就说明用户已经通过了手机号验证。

在全局中创建登录方法login

在这里插入图片描述
/* * 函数里面访问:通过 app.common.[name] 访问这里定义的方法或值 * 函数外面访问:通过 import(如在页面的 handler 引用的例子:import sayHi from '../../common/[name]') */exportdefaultasyncfunctionlogin({ event, data }){try{ $w.utils.showLoading({title:'加载工作台中...'});// 1. 从云开发原生 auth 对象中获取当前已登录的手机号const phone = $w.auth.currentUser?.phone||"15155667788";if(!phone){return $w.utils.showToast({title:'获取授权信息失败,请重新登录',icon:'error'});}// 2. 根据手机号查询业务库中的用户信息(关联查询部门和岗位)const userRes =await $w.cloud.callDataSource({dataSourceName:'MBA_Users',methodName:'wedaGetRecordsV2',params:{filter:{where:{phone:{$eq: phone }}},select:{$master:true,department_id:true,position_id:true}}});if(!userRes.records.length){return $w.utils.showToast({title:'该手机号未在系统中注册,请联系管理员',icon:'error'});}const user = userRes.records[0]; console.log("user",user)// 3. 异步更新用户的最后登录时间 (不阻塞后续逻辑) $w.cloud.callDataSource({dataSourceName:'MBA_Users',methodName:'wedaUpdateV2',params:{data:{last_login: Date.now()},filter:{where:{_id:{$eq: user._id }}}}}).catch(e=> console.error('更新登录时间失败', e));// 4. 获取用户关联的角色信息const roleRes =await $w.cloud.callDataSource({dataSourceName:'MBA_RoleUsers',methodName:'wedaGetRecordsV2',params:{filter:{where:{user_id:{$eq: user._id }}},select:{$master:true,role_id:true}}}); console.log("roleRes",roleRes)// 提取角色编码 (例如: ['ROLE_ADMIN', 'ROLE_TEACHER'])const roleCodes = roleRes.records.map(item=> item.role_id?.code).filter(Boolean); console.log("roleCodes",roleCodes)// 5. 构造全局 User 对象并写入页面状态const userInfo ={...user,deptInfo: user.department_id,postInfo: user.position_id,}; $w.app.dataset.state.currentUser = userInfo; $w.app.dataset.state.userRoles = roleCodes;}catch(e){ console.error('初始化门户失败', e); $w.utils.showToast({title:'系统加载失败,请刷新重试',icon:'error'});}finally{ $w.utils.hideLoading();}}

选中页面组件,设置onShow方法,调用我们的login

在这里插入图片描述

第三步:门户卡片跳转与拦截

在门户页面设计好各类工作台的入口卡片(或按钮)后,我们将它们的点击事件绑定到下面这个统一的路由分发函数上。

逻辑非常直观:根据点击传入的 data.target(如 ‘admin’, ‘teacher’),检查刚才构造的 userRoles 数组中是否包含对应的角色权限。如果有,放行跳转;如果没有,提示拦截。

exportdefaultfunction({ event, data }){// 从页面状态中获取当前用户的角色集合const userRoles = $w.app.dataset.state.userRoles ||[];const targetPortal = data.target;// 从事件入参获取点击的目标工作台// 定义门户跳转配置:映射目标门户、需要校验的角色编码、跳转页面IDconst portalConfig ={admin:{requiredRoles:['ROLE_SUPER_ADMIN','ROLE_ADMIN'],pageId:'u_bu_men_guan_li'},employee:{requiredRoles:['ROLE_USER','ROLE_DEPT_MANAGER'],pageId:'employee-dashboard'},teacher:{requiredRoles:['ROLE_TEACHER'],pageId:'teacher-dashboard'},student:{requiredRoles:['ROLE_STUDENT'],pageId:'student-app'}};const config = portalConfig[targetPortal]; console.log("config",config)if(!config){return $w.utils.showToast({title:'无效的工作台入口',icon:'error'});}// 核心鉴权逻辑:判断用户拥有的角色中,是否包含该门户所需的任意一个角色const hasPermission = config.requiredRoles.some(role=> userRoles.includes(role));if(!hasPermission){return $w.utils.showToast({title:'您没有该工作台的访问权限',icon:'error'});}// 鉴权通过,放行跳转 $w.utils.reLaunch({pageId: config.pageId });}

然后给管理员门户的进入按钮绑定点击事件,调用我们的方法,传入admin入参

在这里插入图片描述

总结

通过拥抱原生云开发的能力,我们用极少的代码实现了强大且安全的用户入口控制:

  1. 认证分离:将基础的身份验证(手机号/验证码)交由云开发底层处理,极大减轻了前端页面的开发负担。
  2. 数据聚合:在门户初始化时,一次性拼装好包含部门、岗位、角色的完整 User 对象,做到“一次查询,全局复用”。
  3. 基于角色的路由控制(RBAC):通过提取用户的角色编码,在点击跳转时进行极简的数组包含校验,轻松实现越权拦截。

系统的“大门”现已完全敞开且安全可控。下一步,我们将进入具体的工作台内部,实现核心的业务数据流转。

Read more

FPGA通信——实现串口通信(Uart)

FPGA通信——实现串口通信(Uart)

一、串口通信介绍 1.1、核心概念 并行通信 (Parallel):像高速公路,8车道同时跑8辆车。速度快,但占用引脚多,且在长距离传输时容易出现“时钟偏差(Skew)”导致数据错位。 串行通信 (Serial):像单行道,车必须一辆接一辆地排队走。引脚少,成本低,且现代高速串行技术(如PCIE, SATA)通过差分信号解决了速度问题。 我们常说的“串口”通常特指 UART (Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)。 1.2、逻辑层面 UART 是一种异步通信协议。 * 异步 (Asynchronous):发送方和接收方之间没有公共的时钟线(不像 SPI 或 I2C 有 CLK 线)。 * 约定:

OpenClaw(Clawdbot)插件更新,新增支持在面板一键QQ和飞书机器人

OpenClaw(Clawdbot)插件更新,新增支持在面板一键QQ和飞书机器人

这次,OpenClaw 插件迎来了一次重要更新。 现在,你可以直接在插件中配置 飞书机器人或 QQ 机器人,让 OpenClaw 真正走出 Web 界面,进入你日常使用的消息工具中。 无需额外部署服务,配置完成后即可开始对话。 重要提示:由于官方更改包名,不支持直接升级,如需更新请卸载旧版插件,安装新版OpenClaw插件,已有数据会丢失,请您评估是否需要更新,新安装不受影响。 配置QQ机器人1. 打开QQ开放平台,注册账号,如已注册可直接登陆 点击编辑 IP 白名单,填写服务器 IP 并保存 点击开发管理,获取APPID、AppSecret 创建完成后点击刚刚创建的机器人 填写机器人基础信息 登录后点击机器人,创建机器人 按提示完成登录 8.将获取到的信息填写到插件,并保存启用 添加后即可在群聊中进行对话 在此处添加完成后回到QQ-群管理-添加机器人,在其他页面找到机器人 选择需要使用的群聊 回到QQ机器人平台,

【无人机追踪】基于 0-1 整数规划实现「能耗最小」的无人机联盟选取,完成目标攻击任务的同时,让所有无人机的总能耗达到最优附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室  👇 关注我领取海量matlab电子书和数学建模资料  🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。 🔥 内容介绍  一、背景 在现代军事作战或特定的工业应用场景中,常常需要多架无人机协同完成目标攻击任务。然而,无人机的能源储备有限,能耗问题成为制约其任务执行效率和持续时间的关键因素。如何在众多无人机中选取合适的无人机组成联盟,使其在成功完成目标攻击任务的同时,将所有参与无人机的总能耗控制在最优水平,是一个亟待解决的重要问题。 传统的无人机任务分配方式可能没有充分考虑能耗因素,或者只是简单地基于距离、速度等单一指标进行分配,这往往无法实现总能耗的最优控制。基于 0 - 1 整数规划的方法为解决这一问题提供了一种有效的途径,它能够综合考虑多种约束条件,精确地对无人机进行筛选和组合,以达到能耗最小化的目标。 二、原理 (一)0 - 1 整数规划基础

使用 LangChain + Ollama + Neo4j 构建中文知识图谱完整教程(含 Docker 部署)

使用 LangChain + Ollama + Neo4j 构建中文知识图谱完整教程(含 Docker 部署)

在本教程中,我们将从零开始,使用 Ollama 本地大模型(Qwen2.5:7B) + LangChain + Neo4j 图数据库,构建一个完整的中文知识图谱系统。整个流程包括: * 本地部署 Ollama 和 Neo4j(通过 Docker) * 编写自定义 Prompt 提取结构化三元组 * 将结果写入 Neo4j 并可视化 所有组件均运行在本地,无需联网调用 API,适合隐私敏感或离线场景。 🔧 一、环境准备 1. 安装 Docker(如未安装) # Ubuntu / Debiansudoapt update &&sudoaptinstall docker.io -y sudo systemctl start dockersudousermod -aG docker$