Vue前端对请假模块——请假开始时间和请假结束时间的校验处理

本文主要是介绍Vue前端对请假模块——请假开始时间和请假结束时间的校验处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开发背景:Vue+element组件开发

业务需求:用户提交请假申请单,请假申请的业务逻辑处理

实现:用户选择开始时间需要大于本地时间,不得大于请假结束时间,请假时长根据每日工作时间实现累加计算

页面布局

在前端页面选择的是el-date-picker组件

 <!-- 请假开始时间表单项 -->
<el-form-itemprop="start_time" <!-- 绑定表单验证规则的属性名 -->label="请假开始时间" <!-- 表单项标签文本 -->style="height: 55px" <!-- 设置表单项高度 -->label-width="120px" <!-- 设置标签宽度 -->:required="true" <!-- 标记为必填项 -->
><el-col :span="11"> <!-- 使用 Element UI 的 Col 布局,设置列宽 --><el-date-picker <!-- 日期时间选择器组件 -->type="datetime" <!-- 设置类型为日期和时间选择 -->placeholder="选择日期" <!-- 提示信息 -->v-model="form.start_time" <!-- 绑定到表单对象的 start_time 属性 -->style="width: 100%" <!-- 设置组件宽度为100% -->value-format="yyyy-MM-dd HH:mm:ss" <!-- 设置选中值的时间格式 -->:picker-options="pickerOptionsStart" <!-- 传入开始时间的选择器选项 -->@change="calculateLeaveHours" <!-- 当选择日期发生改变时触发的方法 -->></el-date-picker></el-col>
</el-form-item><!-- 请假结束时间表单项 -->
<el-form-itemlabel="请假结束时间"style="height: 55px"prop="end_time"label-width="120px":required="true"
><el-col :span="11"><el-date-pickertype="datetime"placeholder="选择日期"v-model="form.end_time" <!-- 绑定到表单对象的 end_time 属性 -->style="width: 100%"value-format="yyyy-MM-dd HH:mm:ss":picker-options="pickerOptionsEnd" <!-- 传入结束时间的选择器选项 -->@change="calculateLeaveHours" <!-- 同样在结束时间改变时触发计算方法 -->></el-date-picker></el-col>
</el-form-item><!-- 请假时长(小时)展示表单项 -->
<el-form-item label="请假时长(小时)" prop="hours" label-width="120px"><el-input <!-- 输入框组件 -->v-model="form.hours" <!-- 绑定到表单对象的 hours 属性 -->disabled <!-- 设置输入框为禁用状态,仅用于显示计算出的请假时长 -->></el-input>
</el-form-item>

用户选择开始时间的范围校验

 :picker-options="pickerOptionsStart"@change="calculateLeaveHours"

通过picker-options  vue动态绑定属性设定了选择器的自定义配置,例如开始时间需大于本地时间且需要小于结束时间

开始时间选择代码如下:

// pickerOptionsStart 定义开始时间选择器的自定义选项
pickerOptionsStart: {// disabledDate 是一个函数,用于决定日期选择器中哪些日期应被禁用(即不可选)disabledDate: (time) => {// 获取表单中结束时间的值let endDateVal = this.form.end_time;// 创建一个新的 Date 对象表示当前本地时间,并将其时间部分设置为0,确保包含今天整天的时间范围let now = new Date();now.setHours(0, 0, 0, 0);// 如果结束时间未设置,则只允许用户选择从当前时间(包含今天)到未来的所有时间if (!endDateVal) {return time.getTime() < now.getTime(); }// 同时满足以下条件时,该日期将被禁用:// 1. 开始时间需大于等于当前本地时间// 2. 开始时间需小于结束时间return (// 时间戳比较:如果开始时间早于当前时间 或者 开始时间晚于已设置的结束时间,则禁用该日期time.getTime() < now.getTime() ||time.getTime() > new Date(endDateVal).getTime());},
},

获取结束时间的值,如果有则从本地时间到结束时间,如果没有就从本地时间到未来的时间,创建Date对象来获取当前本地的时间,至于为什么需要包含今天整体的时间是因为如果只判断开始时间大于本地时间的话,在时间选择器里今天的日期也是被禁止掉了的,这对于用户的体验是不好的,同理,结束时间与开始时间类似,但是这个方法的缺陷便是用户可以在下午选择今天早上的时间,这对于业务是不满足的,后面会有解决方案

结束时间范围选择

如果用户先选择结束时间时,如:2-29,开始时间就只能从26-29进行选择

代码如下:

// pickerOptionsEnd 定义结束时间选择器的自定义选项pickerOptionsEnd: {// disabledDate 是一个函数,用于决定日期选择器中哪些日期应被禁用(即不可选)disabledDate: (time) => {// 获取表单中开始时间的值let beginDateVal = this.form.start_time;// 创建一个新的 Date 对象表示当前本地时间const currentDate = new Date();// 确保结束时间大于开始时间(如果开始时间已设置)if (beginDateVal) {return time.getTime() <= new Date(beginDateVal).getTime();}// 同时允许用户选择今天的日期作为结束时间,因此仅当结束时间早于当前时间才禁用return time.getTime() < currentDate.setHours(0, 0, 0, 0);},},

对于开始时间的校验

为了解决用户在当天可以选择任意的时间段以及计算请假时长,在开始时间和结束时间发生变化时便执行方法

methods: {//计算请假时长calculateLeaveHours() {}}

当用户选择的开始时间小于本地时间的5分钟之前时(因为涉及到秒数,选择的开始时间会一直小于本地时间,为用户操作保留缓冲区间),提示用户并重置开始时间为本地时间,当结束时间小于本地时间时,则重置结束时间为选择的开始时间后一个小时

 const startTime = new Date(this.form.start_time);const endTime = new Date(this.form.end_time);let now = new Date();const fiveMinutesAgo = new Date();fiveMinutesAgo.setMinutes(now.getMinutes() - 5);fiveMinutesAgo.setSeconds(0);fiveMinutesAgo.setMilliseconds(0);if (startTime < fiveMinutesAgo) {this.$message({message: "开始时间需在当前时间附近,已为您选择当前时间!",type: "warning",});this.form.start_time = new Date();}if (endTime < startTime) {this.$message({message:"结束时间小于开始时间,已为您选择结束时间为开始时间后一个小时!",type: "warning",});this.form.end_time = new Date(startTime.getTime() + 60 * 60 * 1000);}

请假时长的计算

// 初始化请假时长let leaveHours = 0;// 计算每天的工作时间let currentDate = new Date(startTime);while (currentDate < endTime) {const currentHour = currentDate.getHours(); // 获取当前小时数const currentMinute = currentDate.getMinutes(); // 获取当前分钟数// 判断当前时间是否在工作时间段内,若在则加入工作时间if (// 上午工作时间段:8:30 - 11:20(((currentHour === 8 && currentMinute >= 30) || currentHour > 8) &&((currentHour === 11 && currentMinute < 20) || currentHour < 11)) ||// 下午工作时间段:14:00 - 18:00((currentHour === 14 || currentHour === 18) && currentMinute >= 0) ||(currentHour > 14 && currentHour < 18) ||// 晚上工作时间段:19:00 - 20:30(((currentHour === 19 && currentMinute >= 0) || currentHour > 19) &&((currentHour === 20 && currentMinute <= 30) || currentHour < 20))) {// 在工作时间段内,加入工作时间leaveHours += 0.1;}// 将日期增加一小时currentDate.setMinutes(currentMinute + 6); // 以6分钟为间隔加入工作时间}// 更新请假时长this.form.hours = leaveHours.toFixed(1);

这样的基本模块便完善得七七八八了,但在其中依然还是有些小问题,例如如果用户先选择时间结束后,再重置便会导致请假时长会一直计算的问题

最初想的解决方案是如果开始时间为空的话,就重置时间跳出方法,

// 首先检查开始时间和结束时间是否为空,如果任一为空则跳出此方法if (!this.form.start_time || !this.form.end_time) {return this.form.hours=0;}

但是如果用户选择的开始时间小于本地时间的话就不能再进行判断了,所以进行了优化

if (this.form.hours !=0 &&(!this.form.start_time || !this.form.end_time)) {return this.form.hours=0;}

这样便都解决了

这篇关于Vue前端对请假模块——请假开始时间和请假结束时间的校验处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/751562

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能