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;}

这样便都解决了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/704752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二进制部署k8s之网络部分

1 CNI 网络组件 1.1 K8S的三种接口 CRI 容器运行时接口 docker containerd podman cri-o CNI 容器网络接口 flannel calico cilium CSI 容器存储接口 nfs ceph gfs oss s3 minio 1.2 K8S的三种网络 节点网络 nodeIP 物理网卡的IP实现节点间的通信 Pod网络 podIP Pod与Po…

视频和音频使用ffmpeg进行合并和分离(MP4)

1.下载ffmpeg 官网地址&#xff1a;https://ffmpeg.org/download.html 2.配置环境变量 此电脑右键点击 属性 - 高级系统配置 -高级 -环境变量 - 系统变量 path 新增 文件的bin路径 3.验证配置成功 ffmpeg -version 返回版本信息说明配置成功4.执行合并 ffmpeg -i 武家坡20…

GOOGLE Colab Pro会员订阅开通购买付费充值教程

一、简介 colab由谷歌团队开发&#xff0c;用于机器学习、数据分析&#xff0c;教育等目的&#xff0c;他的会员也非常的昂贵&#xff0c;最基本的套餐要10美金&#xff0c;最高要50美金一个月&#xff0c;如何省钱&#xff0c;往下看。 一般来说土区的价格比较便宜&#xff0…

Day02:Web架构前后端分离站Docker容器站集成软件站建站分配

目录 常规化站点部署 站库分离 前后端分离 集成软件搭建Web应用 Docker容器搭建Web应用 建立分配站 静态 与 伪静态 总结 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗…

怎么把pdf转换成word?

怎么把pdf转换成word&#xff1f;Pdf和word在电脑上的使用非常广泛&#xff0c;pdf和word分别是由 Adobe和Microsoft 分别开发的电脑文件格式。PDF 文件可以在不同操作系统和设备上保持一致的显示效果&#xff0c;无论是在 Windows、Mac 还是移动设备上查看&#xff0c;都能保持…

配置多个后端 API 代理

在开发 React 应用时&#xff0c;通常会涉及到与后端 API 的交互。而在开发过程中&#xff0c;我们经常需要在开发环境中使用代理来解决跨域请求的问题。Create React App 提供了一种简单的方式来配置代理&#xff0c;即通过创建一个名为 setupProxy.js 的文件来配置代理规则。…

《数据治理简易速速上手小册》第4章 数据安全与合规性(2024 最新版)

文章目录 4.1 数据安全的基本原则4.1.1 基础知识4.1.2 重点案例&#xff1a;在线零售商的数据加密4.1.3 拓展案例 1&#xff1a;医疗机构的访问控制4.1.4 拓展案例 2&#xff1a;金融服务提供商的数据备份和恢复 4.2 遵循数据合规性的策略4.2.1 基础知识4.2.2 重点案例&#xf…

PHPStudy无法解析php(7.3.4)文件

#告诉服务器&#xff0c;对于以.fcgi、.php或.phtml为后缀的请求&#xff0c;应该使用FPM进行处理。 AddHandler fcgid-script .fcgi .php .phtml #设置了全局默认使用的PHP版本路径 FcgidInitialEnv PHPRC "D:/phpstudy_pro/Extensions/php/php7.3.4nts" #告诉服务器…

Django学习笔记-ModelForm使用(完全依赖)

1.创建模型 ,code,name,sex,entrydate 2.模型映射 python manage.py makemigrations myapp01,python manage.py migrate 3.创建模型表单,继承forms.ModelForm,Meta:元数据,models需引入,fields填写引用的模型变量 4.创建testModelForm.html,添加urls 5.views编写testmodelfo…

simple-pytest 框架使用指南

simple-pytest 框架使用指南 一、框架介绍简介框架理念&#xff1a;框架地址 二、实现功能三、目录结构四、依赖库五、启动方式六、使用教程1、快速开始1.1、创建用例&#xff1a;1.2、生成py文件1.3、运行脚本1.3.1 单个脚本运行1.3.2 全部运行 1.4 报告查看 2、功能介绍2.1、…

设计模式(八)外观模式

相关文章设计模式系列 1.外观模式简介 外观模式介绍 当我们开发Android的时候&#xff0c;无论是做SDK还是封装API&#xff0c;我们大多都会用到外观模式&#xff0c;它通过一个外观类使得整个系统的结构只有一个统一的高层接口&#xff0c;这样能降低用户的使用成本。 外观…

面试redis篇-10Redis集群方案-主从复制

在Redis中提供的集群方案总共有三种: 主从复制哨兵模式分片集群主从复制 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 主从数据同步原理 Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每…

Java SpringBoot 创建项目工程输出 Hello World

Java SpringBoot 创建项目工程输出 Hello World 1、新建项目 2、创建 controller 3、编写 Hello World 代码 package com.zhong.demo01.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.Res…

本地项目如何上传到gitee

文章目录 一、在gitee上新建远程仓库二、初始化本地仓库三、执行git命令上传代码 一、在gitee上新建远程仓库 仓库名称必填&#xff0c;路径自动跟仓库名称保持一致 解释说明&#xff1a; 仓库名称&#xff1a;必填&#xff0c;每个仓库都需要有一个名称&#xff0c;同一个码…

kubectl 命令行管理K8S

目录 陈述式资源管理方式 介绍 命令 项目的生命周期 创建 kubectl create命令 发布 kubectl expose命令 更新 kubectl set 回滚 kubectl rollout 删除 kubectl delete 陈述式资源管理方式 介绍 1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法…

量子前沿:美国计算社区联盟CCC发布量子计算进展最新研报!

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨沛贤 深度好文&#xff1a;1800字丨12分钟阅读 近日&#xff0c;美国计算社区联盟 (CCC) 发布了过去五年量子计算进展的最新报告。CCC还分享了美国东北大学库里计算机科…

从零开始学Spring Boot系列-Hello World

欢迎来到从零开始学Spring Boot的旅程&#xff01;我们将从一个非常基础但重要的示例开始&#xff1a;创建一个简单的Spring Boot应用程序&#xff0c;并输出“Hello World”。 1. 环境准备 首先&#xff0c;确保你的开发环境已经安装了以下工具&#xff1a; Java Development …

word、wps插入参考文献

word 首先为参考文献自定义一个编号列表&#xff0c;开始->有序编号->定义新的编号格式&#xff0c;如下图所示&#xff1a; 在输入编号的格式中输入编号列表的形式&#xff0c;然后输入1&#xff1b;将编号样式改为1&#xff0c;2&#xff0c;3形式&#xff0c;不然就会…

PostgreSQL 与MySQL 对比使用

一、前言 博主的系统既有 用到MySQL 也有用到PostgreSQL &#xff0c;之所以用到这两种数据库&#xff0c;主要是现在都是国产替代&#xff0c;虽然说这两款数据库也不是国产的&#xff0c;但是相对开源&#xff0c;oracle是不让用了。所以现在使用比较多的就是这两个关系型数据…

cmake 构建Qt存在多个子项目的应用

概述&#xff1a;一般在开发UI应用时候我们都会存在多个子项目&#xff0c;比如一个是主UI界面的项目&#xff0c;有些动态库的项目&#xff0c;主UI中用到子项目中的动态库&#xff0c;我们来看看如何利用cmake来构建这样的一个工程&#xff0c;方便我们在跨平台中开发(macos、…