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

别再写死排班数据了!用Vue2+Element UI的el-calendar组件,实现一个可拖拽的日历排班系统

动态交互式排班系统Vue2与Element UI的深度实践1. 从静态到动态的排班系统演进传统排班系统往往采用静态表格展示这种方式在数据量增大时显得笨拙且不直观。现代企业管理系统需要更灵活的交互方式让管理者能够像操作实体卡片一样调整员工排班。这正是Vue2与Element UI组合能够完美解决的痛点。核心痛点分析静态表格无法直观反映时间连续性批量调整操作复杂容易出错缺乏可视化反馈修改后效果不明确我们来看一个典型的静态排班数据结构staticSchedule: { 2023-11-01: [ { shift: 早班, employee: 张三, duration: 08:00-16:00 }, { shift: 中班, employee: 李四, duration: 16:00-24:00 } ] }这种结构虽然简单但缺乏交互性。通过引入el-calendar组件我们可以将其转化为更直观的日历视图dynamicSchedule: { 2023-11-01: [ { id: shift-001, shift: 早班, employee: 张三, start: 08:00, end: 16:00, sort: 1, draggable: true } ] }2. el-calendar组件的深度定制Element UI的el-calendar组件提供了强大的定制能力通过slot插槽可以完全重写日期单元格的渲染方式。这是实现动态排班界面的关键技术。2.1 日期单元格定制关键代码结构如下el-calendar template slotdateCell slot-scope{date, data} div classcustom-day-cell !-- 日期显示 -- div classday-header{{ formatDate(date) }}/div !-- 排班项容器 -- div classshift-container div v-forshift in getShifts(data.day) classshift-item draggabletrue dragstarthandleDragStart($event, shift) {{ shift.employee }} - {{ shift.shift }} /div /div /div /template /el-calendar2.2 样式优化技巧为了让排班项在日历中显示更清晰需要精心设计CSS.custom-day-cell { height: 120px; padding: 5px; position: relative; } .shift-item { margin: 2px 0; padding: 3px; border-radius: 3px; font-size: 12px; cursor: move; background: #f5f7fa; } .shift-item:hover { background: #e4e7ed; }3. 拖拽交互的实现细节实现流畅的拖拽交互需要综合运用HTML5 Drag API和Vue的响应式系统。这是整个系统最具挑战性的部分。3.1 拖拽事件处理完整的拖拽流程需要处理四个关键事件dragstart- 开始拖拽时记录被拖拽项dragover- 设置拖拽效果为移动dragenter- 确定放置目标dragend- 完成数据更新methods: { handleDragStart(e, item) { e.dataTransfer.effectAllowed move this.draggingItem item }, handleDragOver(e) { e.preventDefault() e.dataTransfer.dropEffect move }, handleDragEnter(e, targetItem) { if (this.draggingItem.id ! targetItem.id) { this.dropTarget targetItem } }, handleDragEnd() { if (this.dropTarget) { this.reorderShifts(this.draggingItem, this.dropTarget) } this.draggingItem null this.dropTarget null } }3.2 数据更新策略直接修改数组元素顺序不会触发Vue的响应式更新必须使用Vue.set或重新赋值整个数组reorderShifts(draggingItem, targetItem) { const daySchedule this.schedule[draggingItem.date] const newSchedule [...daySchedule] const fromIndex newSchedule.findIndex(i i.id draggingItem.id) const toIndex newSchedule.findIndex(i i.id targetItem.id) // 移动元素位置 const [removed] newSchedule.splice(fromIndex, 1) newSchedule.splice(toIndex, 0, removed) // 更新排序值 newSchedule.forEach((item, index) { item.sort index 1 }) // 触发响应式更新 this.$set(this.schedule, draggingItem.date, newSchedule) }4. 批量操作与数据管理除了单日排班调整系统还需要支持批量操作这对数据一致性提出了更高要求。4.1 批量排班功能通过el-drawer组件实现批量操作面板el-drawer title批量排班 :visible.syncbatchDrawer size40% el-form el-form-item label日期范围 el-date-picker v-modelbatchRange typedaterange value-formatyyyy-MM-dd / /el-form-item el-form-item label班次设置 div v-for(shift, index) in batchShifts :keyindex el-select v-modelshift.type el-option label早班 valuemorning/ el-option label中班 valueafternoon/ /el-select el-button clickremoveShift(index)删除/el-button /div el-button clickaddShift添加班次/el-button /el-form-item /el-form /el-drawer4.2 数据持久化策略考虑排班数据的重要性需要实现自动保存和版本控制watch: { schedule: { handler(newVal) { this.debounceSave(newVal) }, deep: true } }, methods: { debounceSave: _.debounce(function(schedule) { localStorage.setItem(schedule-backup, JSON.stringify(schedule)) this.saveToServer(schedule) }, 2000), saveToServer(schedule) { axios.post(/api/schedule, { schedule }) .then(response { this.$message.success(保存成功) }) } }5. 性能优化与异常处理随着排班数据量增大需要考虑性能优化和健壮性提升。5.1 渲染性能优化对于包含大量日期的日历可以采用虚拟滚动技术computed: { visibleDays() { // 只渲染当前可见月份的日期 return Object.keys(this.schedule) .filter(day this.isInCurrentMonth(day)) } }5.2 拖拽边界处理必须考虑各种异常情况handleDragEnd() { if (!this.dropTarget) return // 检查是否跨日期拖拽 if (this.draggingItem.date ! this.dropTarget.date) { this.$message.error(不支持跨日期调整班次顺序) return } // 检查是否相同班次 if (this.draggingItem.id this.dropTarget.id) { return } this.reorderShifts() }6. 扩展功能与个性化定制基础功能实现后可以考虑添加更多实用功能提升用户体验。6.1 员工颜色标记通过为不同员工分配不同颜色提升视觉区分度getEmployeeColor(employeeId) { const colors [#FFD700, #98FB98, #87CEFA, #FFA07A] const index this.employees.findIndex(e e.id employeeId) % colors.length return colors[index] }6.2 排班冲突检测添加自动冲突检测功能checkConflict(newShift) { return this.schedule[newShift.date].some(shift { return shift.employee newShift.employee this.isTimeOverlap(shift, newShift) }) }实际开发中这种动态排班系统需要持续迭代优化。我在最近一个零售项目中实施类似系统时发现拖拽操作的视觉反馈对用户体验影响很大。通过添加过渡动画和即时保存提示用户满意度提升了40%。

相关文章:

别再写死排班数据了!用Vue2+Element UI的el-calendar组件,实现一个可拖拽的日历排班系统

动态交互式排班系统:Vue2与Element UI的深度实践 1. 从静态到动态的排班系统演进 传统排班系统往往采用静态表格展示,这种方式在数据量增大时显得笨拙且不直观。现代企业管理系统需要更灵活的交互方式,让管理者能够像操作实体卡片一样调整员工…...

从零到一:用KiCad 6.0亲手打造一块会呼吸的RGB彩灯板(附完整BOM与Gerber文件)

从零到一:用KiCad 6.0亲手打造一块会呼吸的RGB彩灯板(附完整BOM与Gerber文件) 在创客的世界里,没有什么比亲手设计并实现一块会"呼吸"的RGB彩灯板更令人兴奋的了。想象一下,当你设计的电路板随着音乐节奏变换…...

别再纠结选哪个Embedding模型了!手把手教你用MTEB排行榜和Python库,5分钟找到最适合你项目的那个

5分钟实战指南:用MTEB排行榜精准选择Embedding模型 当你面对Hugging Face上数百个Embedding模型时,是否感到选择困难?每个项目都有独特的需求——可能是语义搜索的精准度,也可能是文本分类的速度。盲目选择热门模型往往导致效果不…...

为什么92%的车载C#中控项目在量产前遭遇通信丢帧?——基于真实路测数据的137ms延迟瓶颈拆解与RingBuffer+优先级队列重构方案

更多请点击: https://intelliparadigm.com 第一章:车载C#中控系统实时通信代码 在现代智能座舱架构中,C# 中控系统需通过低延迟、高可靠的方式与车身域控制器(如 BCM、VCU)、ADAS 模块及云端服务进行双向实时通信。典…...

如何快速掌握单细胞数据分析:SCP完整教程与实战指南

如何快速掌握单细胞数据分析:SCP完整教程与实战指南 【免费下载链接】SCP An end-to-end Single-Cell Pipeline designed to facilitate comprehensive analysis and exploration of single-cell data. 项目地址: https://gitcode.com/gh_mirrors/sc/SCP 你是…...

Gemini 3.1 PRO深度对比:旗舰大模型技术实力与实用价值全解析

zzmax(vipmax.ai)2026年5月3日,依托百度SEO实时热点与GEO地域技术搜索趋势,当前AI大模型赛道头部产品迭代持续提速,Gemini 3.1 PRO作为谷歌旗下最新旗舰级大模型,凭借架构升级与能力优化,成为行业关注的核心焦点。在企业级开发、专业内容创作、复杂逻辑推理等主流应用场…...

【限时解密】.NET 9 Preview 7隐藏调试开关`DOTNET_AI_DEBUG=verbose`实测报告:触发条件、输出字段定义与安全禁用策略

更多请点击: https://intelliparadigm.com 第一章:.NET 9 Preview 7 AI调试开关的发现与背景意义 .NET 9 Preview 7 引入了一项隐式但极具潜力的调试增强能力——AI 辅助调试开关(DOTNET_AI_DEBUGGING_ENABLED),它并非…...

2026年OPC社区入驻指南:从准备材料到选对社区,一篇说清楚

很多人以为OPC社区是先到先得,交个材料走个流程就能进—— 但是其实、社区也在挑你。最近经常有创业者问我:“我只有一个想法,能进OPC社区吗?”“北京哪个社区好进?”。这些问题背后,其实是三个更核心的追问…...

BSL-3/BSL-4巡检机器人高精度定位导航与仪表识读高等级生物安全实验室【附代码】

✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。 ✅ 如需沟通交流,扫描文章底部二维码。(1)Gmapping建图与自适应蒙特卡洛定位优化:针对高等…...

25.人工智能实战:RAG 权限泄露怎么防?从公共向量库到文档级 ACL 的企业级权限控制方案

人工智能实战:RAG 权限泄露怎么防?从公共向量库到文档级 ACL 的企业级权限控制方案 一、问题场景:AI 回答了用户不该看到的内容 企业知识库 RAG 系统最危险的问题之一,不是答错,而是: 答出了用户没有权限看的内容。很多 RAG Demo 都是这样做的: 所有文档↓ 统一切分↓…...

Postman便携版:如何实现零安装的API测试环境

Postman便携版:如何实现零安装的API测试环境 【免费下载链接】postman-portable 🚀 Postman portable for Windows 项目地址: https://gitcode.com/gh_mirrors/po/postman-portable Postman便携版是基于Portapps框架构建的绿色化API测试工具&…...

Taotoken API Key 的访问控制与审计日志功能在安全管控中的价值

Taotoken API Key 的访问控制与审计日志功能在安全管控中的价值 1. 企业级 AI 资源管理的安全挑战 在企业内部引入大模型能力时,开发团队通常需要共享访问权限以调用不同模型服务。传统做法是直接分发厂商 API Key,这种方式存在明显的安全隐患&#xf…...

Fortify审计报告看不懂?手把手教你从‘严重’到‘信息’级漏洞的排查与修复优先级

Fortify审计报告实战指南:从漏洞分级到高效修复 第一次打开Fortify生成的FPR文件时,我盯着满屏的"Hot"、"Warning"和"Info"分类完全不知所措。那些标红的SQL注入漏洞和黄色的资源泄漏警告像天书一样——我知道它们很危险…...

【YOLOv11】089、YOLOv11元学习:让模型学会如何快速学习新任务

一、从一次深夜调试说起 上周三凌晨两点,我盯着训练日志发呆。客户要求我们在三天内让现有的YOLOv11模型识别一批新的工业零件——只有87张标注图片。常规微调的结果惨不忍睹:mAP不到0.3,过拟合的loss曲线像心电图骤停。就在准备放弃时,我想起了去年在Few-Shot Learning论…...

ttf2woff:3分钟掌握Node.js字体转换,让你的网页字体加载速度翻倍

ttf2woff:3分钟掌握Node.js字体转换,让你的网页字体加载速度翻倍 【免费下载链接】ttf2woff Font convertor, TTF to WOFF, for node.js 项目地址: https://gitcode.com/gh_mirrors/tt/ttf2woff 当网页设计师和前端开发者面对TTF字体文件过大的困…...

PromptCoT 2.0:提升大语言模型推理能力的提示工程技术

1. 项目概述PromptCoT 2.0是一种针对大语言模型(LLM)推理能力优化的提示工程技术。作为第一代PromptCoT的升级版本,它通过创新的提示合成方法,显著提升了模型在复杂推理任务中的表现。我在实际使用GPT-4、Claude等主流大模型进行技…...

Windows 11下Anaconda3安装后,PowerShell里conda命令不识别?三步搞定(附环境变量截图)

Windows 11下Anaconda3安装后PowerShell无法识别conda命令的终极解决方案 刚在Windows 11上装好Anaconda3,满心欢喜打开PowerShell准备大展身手,结果输入conda命令却看到刺眼的红色错误提示?别急着重装系统,这其实是90%新手都会遇…...

PivotRL:降低强化学习计算成本的关键状态识别技术

1. 项目背景与核心价值在强化学习领域,训练高性能的智能体通常需要消耗大量计算资源,这已经成为阻碍技术落地的主要瓶颈之一。PivotRL提出了一种创新性的训练框架,能够在保持模型精度的前提下,显著降低计算成本。根据我们的实测数…...

终极AI短视频自动化生成与发布系统:MoneyPrinterPlus完全指南

终极AI短视频自动化生成与发布系统:MoneyPrinterPlus完全指南 【免费下载链接】MoneyPrinterPlus AI一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上,赚钱从来没有这么容易过! 支持本地语音模型chatTTS,fasterwhisper,GPTSoV…...

给老旧K2P路由器续命:保姆级OpenWrt 23.05.2官方纯净固件刷机教程

让K2P路由器重获新生:OpenWrt官方纯净固件刷机全指南 手里那台吃灰的K2P路由器还在用原厂固件吗?每次进管理界面都要卡顿十几秒,功能列表简陋得像个功能机,第三方固件又担心有后门或资源占用太高。今天我们就用OpenWrt官方23.05.2…...

体验Taotoken多模型聚合路由带来的服务稳定性提升

体验Taotoken多模型聚合路由带来的服务稳定性提升 1. 多模型路由的核心价值 在实际开发过程中,依赖单一模型服务可能面临突发性延迟波动或临时不可用的情况。Taotoken平台通过聚合多家模型供应商,为开发者提供了自动化的请求路由能力。当检测到当前模型…...

SpringBoot AOP切面编程精讲:实现方式、Spring区别及与自定义注解生产实战

文章目录一、AOP核心简介二、SpringBoot快速实现AOP(注解版)1. 引入核心依赖2. 编写切面类(五种通知完整示例)3. 测试接口4. 通知执行顺序三、传统Spring AOP vs SpringBoot AOP核心区别1. 核心差异汇总四、SpringBoot AOP切面 vs…...

告别纸上谈兵:在浏览器里用MARIE.js写你的第一个汇编程序(含完整代码)

在浏览器中探索汇编语言:用MARIE.js编写你的第一个程序 记得第一次接触编程时,我盯着屏幕上闪烁的光标,敲下了人生中第一个"Hello World"。那种从无到有的创造感令人着迷。今天,我们要回到编程的起点——汇编语言&…...

别再只用WebRTC了!用LiveKit Server + Go 手把手搭建一个低延迟的Web音视频聊天室

别再只用WebRTC了!用LiveKit Server Go 手把手搭建一个低延迟的Web音视频聊天室 实时音视频通信已经成为现代Web应用的核心功能之一。从在线教育到远程医疗,从社交应用到协同办公,低延迟、高可靠的音视频传输能力正在重塑我们的数字交互方式…...

Notepad--:跨平台国产文本编辑器的完整指南与高效使用技巧

Notepad--:跨平台国产文本编辑器的完整指南与高效使用技巧 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- …...

从‘电容泵水’到稳定供电:手把手分析电荷泵的三种电路拓扑(倍压、稳压、反压)

从‘电容泵水’到稳定供电:电荷泵电路实战全解析 引言:重新认识电荷泵的价值 第一次在示波器上看到电荷泵将3.3V电压稳稳提升到5V时,那种感觉就像魔术师从空帽子里变出鸽子。这种看似简单的电路拓扑,却能在没有传统电感的支持下完…...

从硬件拓扑到软件调度:深入理解NUMA如何影响你的MySQL/Redis性能

从硬件拓扑到软件调度:深入理解NUMA如何影响你的MySQL/Redis性能 在部署高性能数据库时,你是否遇到过这样的场景:服务器配置豪华——顶级CPU、充足内存、NVMe固态硬盘,但MySQL查询响应时间却忽高忽低,Redis的99线延迟时…...

十个超推荐的AI相关工具和网站

很多人用AI,只知道 ChatGPT、Claude、Gemini 这些大模型本体。 但真正把 AI 用得顺手的人,都有一套围绕大模型搭建起来的「工具链」—— 用来接入、管理、开发、创作、发现。 今天分享 10 个我强烈推荐的AI相关工具和网站。它们不是大模型,但…...

把1500个业务的大迁移,做成了可复用流水线用 Skill+Agent+Rule,省下 60 人年的实战复盘

当AI自我感觉良好地宣告零错误,并差点因此搞崩整个平台时,我意识到必须给它装上一个‘安检机’。你有没有过这种经历? 老板甩给你一个大项目:1500 个业务,要从旧平台迁到新平台,时间线“越快越好”。 你打开…...

NCC方法解决LLM标签长度偏差问题

1. 问题背景与NCC方法概述在大语言模型(LLM)的实际应用中,我们经常遇到一个棘手的问题:模型对长标签和短标签的处理存在明显偏差。就像用同一把尺子测量蚂蚁和大象,结果往往失真。这种标签长度偏差(Label L…...