当前位置: 首页 > news >正文

微搭低代码MBA 培训管理系统实战 19——学员档案管理功能实现

目录

  • 前言
  • 1 搭建教务布局
  • 2 搭建学员管理界面
  • 3 配置门户跳转
  • 最终效果
  • 总结

前言

上一篇我们介绍了财务确认订单的功能,在确认订单后会自动创建学员学籍信息以及开通课时卡,本篇我们就介绍一下学员档案的管理功能。

1 搭建教务布局

目前我们已经有了销售及财务角色,需要继续增加教务角色,为教务搭建专属的工作台。

打开角色管理模块,增加教务角色

在门户管理模块,增加教务门户

点击布局设计,点击新建布局

选择左侧导航布局

重命名为教务布局

修改布局的标题,改为教务工作台

2 搭建学员管理界面

点击创建页面的图标,创建学员档案页面,选择布局为教务布局

配置学员档案菜单

在教务布局的内容插槽下添加布局组件

修改标题为学员档案

添加数据表格,数据模型选择学员档案表

配置筛选条件,增加学员姓名、电话、学籍状态作为查询条件

将课时卡的显示方法改为自定义内容

添加文本组件,绑定课时卡的剩余课时字段

3 配置门户跳转

学员档案配置好后,我们把学员档案页面作为教务门户的跳转页面。在页面管理找到学员档案页面,点击三个点选择复制页面ID

配置到教务门户的跳转页面ID上

在岗位管理里增加教务岗位

修改全局登录方法,增加教务岗位跳转逻辑

/* * 函数里面访问:通过 app.common.[name]访问这里定义的方法或值 * 函数外面访问:通过 import(如在页面的 handler 引用的例子:import sayHi from'../../common/[name]') */exportdefault asyncfunctionlogin({event, data}){try{$w.utils.showLoading({title:'加载工作台中...'});//1. 从云开发原生 auth 对象中获取当前已登录的手机号 const phone=$w.auth.currentUser?.phone||$w.input1.value;if(!phone){return$w.utils.showToast({title:'获取授权信息失败,请重新登录', icon:'error'});}//1. 先查询是否是渠道用户 const channelRes=await$w.cloud.callDataSource({dataSourceName:'MBA_ChannelPartners', methodName:'wedaGetRecordsV2', params:{filter:{where:{phone:{$eq:phone}}}, select:{$master:true,}}});console.log("channelRes", channelRes)if(channelRes.records&&channelRes.records.length>0){// 渠道用户登录成功 const channelInfo=channelRes.records[0];$w.app.dataset.state.currentChannel=channelInfo;// 渠道用户固定角色,用于门户跳转判断$w.app.dataset.state.userRoles=['ROLE_CHANNEL'];$w.utils.showToast({title:'渠道登录成功', icon:'success'});return;}//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,};//5. 根据岗位信息确定用户类型 const userType=getUserTypeByPosition(user.position_id);$w.app.dataset.state.currentUser=userInfo;$w.app.dataset.state.userRoles=roleCodes;$w.app.dataset.state.userType=userType;}catch(e){console.error('初始化门户失败', e);$w.utils.showToast({title:'系统加载失败,请刷新重试', icon:'error'});}finally{$w.utils.hideLoading();}}// 根据岗位信息确定用户类型exportfunctiongetUserTypeByPosition(position){if(!position){return'employee';}const positionName=position.name||'';const positionCode=position.code||'';// 岗位到用户类型的映射 const positionToTypeMap={// 销售相关岗位'销售':'sales','销售经理':'sales-manager','销售总监':'sales-manager', // 教师相关岗位'教师':'teacher','讲师':'teacher','教授':'teacher', // 其他岗位'客服':'employee','行政':'employee','财务':'finance'};// 优先根据岗位编码匹配if(positionCode){if(positionCode.includes('SALES'))return'sales';if(positionCode.includes('TEACHER'))return'teacher';if(positionCode.includes('MANAGER'))return'sales-manager';if(positionCode.includes('POST-FM'))return'finance';if(positionCode.includes('POST-EDU'))return'edu'}// 其次根据岗位名称匹配returnpositionToTypeMap[positionName]||'employee';}

在人员管理添加教务人员

将该用户添加到角色下

最终效果

输入教务人员手机号

点击进入员工门户

自动跳转到教务工作台

总结

本篇我们介绍了教务工作台的搭建过程,给教务人员搭建了第一个功能学员档案。可以查看学员的基本信息,也可以查看的课时卡信息,下篇我们就介绍教务的基础功能班级管理,给学员分配具体的班级。

http://www.jsqmd.com/news/536349/

相关文章:

  • 从踩坑到流畅:OpenClaw 本地 AI 智能体部署与高效使用指南
  • 一键体验:星图平台OpenClaw+百川2-13B-4bits量化模型沙盒环境
  • OpenClaw+GLM-4.7-Flash智能记账:消费分类与分析
  • 服装智能制造 IoT 方案:小单快反场景标签打印一体化终端技术解析
  • 伏特台风(Volt Typhoon):针对关键基础设施的无文件攻击与潜伏技术深度剖析
  • 核心数据怕泄露?内部流程跑不动?我的数字化“双保险”来了!
  • OpenClaw语音扩展:Qwen3-VL:30B对接飞书语音消息转文本
  • 3大方案4步流程:DeepSeek-R1-Distill-Llama-8B开源项目部署高效落地指南
  • 2026红外模组优质厂家推荐榜:红外模组、红外热成像仪、红外监控、红外相机、非制冷红外、人体测温仪、便携式红外热像仪选择指南 - 优质品牌商家
  • 深度学习03 -来源于李宏毅老师的课堂
  • OpenClaw智能客服原型:用nanobot镜像搭建QQ问答机器人
  • 【2025】加入 uniapp 的一年
  • 深入解析ChatTTS Wheel文件:原理、实现与生产环境最佳实践
  • OpenCode AI编程助手:从认知到实践的全方位技术指南
  • 突破ChatGPT地区限制:AI辅助开发实战指南
  • 自动化周报生成:OpenClaw+nanobot聚合多平台工作痕迹
  • 成本警报系统:监控OpenClaw+Qwen3.5-9B的Token消耗突破阈值
  • OpenClaw邮件智能处理:Qwen3-32B-Chat分类归档与自动回复
  • 2026内衬聚氨酯靠谱供应商推荐指南:耐磨防腐管道/聚氨酯板/钢衬聚氨酯复合管/钢衬聚氨酯弯头/钢衬聚氨酯管道/选择指南 - 优质品牌商家
  • 基于vue的班级信息管理系统[vue]-计算机毕业设计源码+LW文档
  • 保健用品企业消字号备案及代工全链条服务:祖传秘方申请批号/秘方委托生产、备案电话/秘方申报认证机构电话/选择指南 - 优质品牌商家
  • 2023B卷,最长和为目标值的子序列
  • 解锁AI创意:借助快马平台的多模型能力将你的AI应用idea快速实现
  • NumPy 函数手册:文件读写
  • ChatGPT提示取消阻止实战:AI辅助开发中的高效调试技巧
  • ESP32开发调试
  • A59F扩音防啸叫模组-本地会议与扩音专属
  • 基于用户行为的Chatbot反馈学习:提升对话效率的实战指南
  • 数控机床机械手控制系统:可靠配置与高效运行要点
  • OpenClaw模型微调:优化GLM-4.7-Flash任务执行效果