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;}
在周末的情况下我们也不应该把周末的时间计算到工作日中,代码优化如下:
const weekends = [0, 6];
if (weekends.includes(currentDay)) {currentDate.setDate(currentDate.getDate() + 1); // 跳到下一天currentDate.setHours(8); // 设置小时为早上8点currentDate.setMinutes(0); // 设置分钟为0分continue; // 跳过后面的代码,继续下一轮循环}
设置了一个数组只要是周末周六就直接跳到下一天
这样便都解决了
相关文章:
Vue前端对请假模块——请假开始时间和请假结束时间的校验处理
开发背景:Vueelement组件开发 业务需求:用户提交请假申请单,请假申请的业务逻辑处理 实现:用户选择开始时间需要大于本地时间,不得大于请假结束时间,请假时长根据每日工作时间实现累加计算 页面布局 在前…...
搭建freqtrade量化交易机器人
本文采用python量化机器人框架 freqtrade 开始操作! freqtrade官方文档 官方文档内容过多,请先跟随本文入门阅读,后续深入学习可参考官方文档~ 1. 准备云服务器 docker 环境 这里以云服务器选择 ubuntu 系统开始,先…...
php伪协议 [SWPUCTF 2022 新生赛]ez_ez_php(revenge)
打开题目 题目源代码如下 <?php error_reporting(0); if (isset($_GET[file])) {if ( substr($_GET["file"], 0, 3) "php" ) {echo "Nice!!!";include($_GET["file"]);} else {echo "Hacker!!";} }else {highlight_fi…...
1.1_1 计算机网络的概念、功能、组成和分类
文章目录 1.1_1 计算机网络的概念、功能、组成和分类(一)计算机网络的概念(二)计算机网络的功能(三)计算机网络的组成1.组成部分2.工作方式3.功能组成 (四)计算机网络的分类 总结 1.…...
pytorch中的各种计算
对tensor矩阵的维度变换,加减乘除等是深度学习中的常用操作,本文对一些常用方法进行总结 矩阵乘法 混合矩阵相乘,官网 torch.matmul(input, other, *, outNone) → Tensor这个方法执行矩阵相乘操作,需要第一个矩阵的最后一个维度…...
大数据技术之 Kafka
大数据技术之 Kafka 文章目录 大数据技术之 Kafka第 1 章 Kafka 概述1.1 定义1.2 消息队列1.2.1 传统消息队列的应用场景1.2.2 消息队列的两种模式 1.3 Kafka 基础架构 第 2 章 Kafka 快速入门2.1 安装部署2.1.1 集群规划2.1.2 集群部署2.1.3 集群启停脚本 2.2 Kafka 命令行操作…...
【GB28181】wvp-GB28181-pro部署安装教程(Ubuntu平台)
目录 前言1 安装依赖2 安装MySQL3 安装redis4 编译ZLMediaKit代码及依赖下载编译运行(如果要运行wvp整个项目,这步可以先不执行) 5 编译wvp-pro下载源码(建议从github上下载,gitee上维护有时候不是很同步)编…...
CentOS删除除了最近5个JAR程序外的所有指定Java程序
帮我写一个shell脚本,ps -eo pid,lstart,cmd --sort-start_time | grep "pgz-admin"查到的结果,返回的所有进程PID,第六个之上的,全部kill 当然,你可以创建一个简单的Shell脚本来完成这个任务。以下是一个例…...
面试redis篇-13Redis为什么那么快
Redis是纯内存操作,执行速度非常快采用单线程,避免不必要的上下文切换可竞争条件,多线程还要考虑线程安全问题使用I/O多路复用模型,非阻塞IOI/O多路复用模型 Redis是纯内存操作,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度, I/O多路复用模型主要就是实现了高效…...
python Matplotlib Tkinter--pack 框架案例
环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pillow 10.1.0 版本一 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox…...
连接未来:嵌入式系统在物联网时代的应用
连接未来:嵌入式系统在物联网时代的应用 随着物联网技术的不断发展,嵌入式系统在物联网时代扮演着至关重要的角色。嵌入式系统作为连接物理世界和数字世界的桥梁,为物联网的实现提供了技术支持和基础设施。以下将从几个方面探讨嵌入式系统在…...
自动驾驶中的障碍物时间对齐法
描述 自动驾驶算法使用的系统往往不是实时系统,因此每个节点间拿到的数据可能不是同一时间的数据,从而造成系统误差,针对这一现象,工程上往往采用时间对齐内插外推法。这里我们用感知障碍物来举例。 自动驾驶系统有许多重要模块…...
介绍 PIL+IPython.display+mtcnn for 音视频读取、标注
1. nn.NLLLoss是如何计算误差的? nn.NLLLoss是负对数似然损失函数,用于多分类问题中。它的计算方式如下:首先,对于每个样本,我们需要将其预测结果通过softmax函数转换为概率分布。softmax函数可以将一个向量映射为一个概率分布&…...
C语言中strstr函数的使用!
strstr函数的作用是什么? 查找子字符串 具体直接看下面的这段代码我相信你必明白 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { char *p1 "abcdefghijklmnopqrstuvwxyz"; char* p2 "abc"; char* r…...
Vue项目中,src目录下的vue.app文件介绍
在 Vue 项目中,src 文件夹通常包含了项目的核心代码。在这个文件夹下,App.vue 是一个特殊的文件,它代表了整个 Vue 应用的根组件。 App.vue 是一个单文件组件(Single File Component, 简称 SFC),它允许你将…...
【Android】坐标系
Android 系统中有两种坐标系,分别为 Android 坐标系和 View 坐标系。了解这两种坐标系能够帮助我们实现 View 的各种操作,比如我们要实现 View 的滑动,你连这个 View 的位置都不知道,那如何去操作呢? 一、Android 坐标…...
OSCP靶场--Slort
OSCP靶场–Slort 考点(1.php 远程文件包含 2.定时任务提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.178.53 -sV -sC -p- --min-rate 5000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-02-24 04:37 EST Nmap scan report for 192.168.178.53 …...
大数据职业技术培训包含哪些
技能提升认证考试,旨在通过优化整合涵盖学历教育、职业资格、技术水平和高新技术培训等各种教育培训资源,通过大数据行业政府引导,推进教育培训的社会化,开辟教育培训新途径,围绕大数据技术人才创新能力建设࿰…...
【Java程序设计】【C00313】基于Springboot的物业管理系统(有论文)
基于Springboot的物业管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的物业管理系统,本系统有管理员、物业、业主以及维修员四种角色权限; 管理员进入主页面,主要功能包…...
TensorFlow训练大模型做AI绘图,需要多少的GPU算力支撑
TensorFlow训练大模型做AI绘图,需要多少的GPU算力支撑!这个问题就涉及到了资金投资的额度了。众所周知,现在京东里面一个英伟达的显卡,按照RTX3090(24G显存-涡轮风扇)版本报价是7000-7500之间。如果你买一张这样的单卡…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...
