Vue3时间选择器datetimerange在数据库存开始时间和结束时间

♥️作者:小宋1021
🤵‍♂️个人主页:小宋1021主页
♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!!
🎈🎈加油! 加油! 加油! 加油
🎈欢迎评论 💬点赞👍🏻 收藏 📂加关注+!


如图,想往数据库存一个时间段,在后端用两个字段接收

实体类:

    /*** 开始时间*/private LocalDateTime meetingStartTime;/*** 结束时间*/private LocalDateTime meetingEndTime;

ParentMeetingRespVO:

   @Schema(description = "开始时间")private LocalDateTime meetingStartTime;@Schema(description = "结束时间")private LocalDateTime meetingEndTime;

ParentMeetingSaveReqVO:

    @Schema(description = "开始时间")private LocalDateTime meetingStartTime;@Schema(description = "结束时间")private LocalDateTime meetingEndTime;

controller:

    @PostMapping("/create")@Operation(summary = "创建家长会")@PreAuthorize("@ss.hasPermission('study:parent-meeting:create')")public CommonResult<Long> createParentMeeting(@Valid @RequestBody ParentMeetingSaveReqVO createReqVO) {return success(parentMeetingService.createParentMeeting(createReqVO));}

service:

    /*** 创建家长会** @param createReqVO 创建信息* @return 编号*/Long createParentMeeting(@Valid ParentMeetingSaveReqVO createReqVO);

实现类:

    @Overridepublic Long createParentMeeting(ParentMeetingSaveReqVO createReqVO) {// 插入ParentMeetingDO parentMeeting = BeanUtils.toBean(createReqVO, ParentMeetingDO.class);parentMeetingMapper.insert(parentMeeting);// 返回return parentMeeting.getId();}

前端:

组件:

 <el-form-item label="时间" prop="time"><el-date-pickerv-model="formData.time"style="width: calc(100% - 20px); font-size: 1px;"type="datetimerange"start-placeholder="开始时间"end-placeholder="结束时间"placeholder="选择时间"@change="changes"/></el-form-item>

点击事件,并转换成时间戳:

const changes=(e)=>{const date = new Date(e[0])const date2 = new Date(e[1])// 获取时间戳(毫秒)  const timestamp = date.getTime()const timestamp2 = date2.getTime()formData.value.meetingStartTime = timestampformData.value.meetingEndTime = timestamp2formData.value.time = [dateFormat(timestamp),dateFormat(timestamp2)]}

dateform转换:

const dateFormat = (value)=>{let date = new Date(value);let y = date.getFullYear();let MM = date.getMonth() + 1<10? ('0' + (date.getMonth() + 1)) : date.getMonth() + 1;let d = date.getDate()< 10 ? ('0' + date.getDate()) :  date.getDate()let h = date.getHours() < 10 ? ('0' +date.getHours()) : date.getHours();const m = date.getMinutes()< 10 ? ('0' + date.getMinutes()) : date.getMinutes();return  y + '-' + MM + '-' + d 
}

完整代码:

<template><Dialog :title="dialogTitle" v-model="dialogVisible" width="1100px"><el-formref="formRef":model="formData":rules="formRules"label-width="100px"v-loading="formLoading"><div style="padding: 8px 0;background: #f8fbff"><div class="tip"><div class="bold"></div><span class="btitle"></span></div><el-row :gutter="24"><el-form-item label="主题" prop="subject" style="width: 46%;margin-left: 15px ;"><el-input v-model="formData.subject" placeholder="请输入主题" /></el-form-item></el-row><el-row><el-form-item label="班级名称" prop="className"><el-select v-model="formData.className" placeholder="请选择班级名称"><el-option label="班级名称" value="" /></el-select></el-form-item></el-row><el-row><el-form-item label="时间" prop="time"><el-date-pickerv-model="formData.time"style="width: calc(100% - 20px); font-size: 1px;"type="datetimerange"start-placeholder="开始时间"end-placeholder="结束时间"placeholder="选择时间"@change="changes"/></el-form-item></el-row><!-- <el-form-item label="老师名称" prop="teacherName"><el-select v-model="formData.teacherName" placeholder="请选择老师名称"><el-option label="老师名称" value="" /></el-select></el-form-item> --><el-row><el-form-item label="形式" prop="type"><el-select v-model="formData.type" placeholder="请选择形式"><el-option label="形式" value="" /></el-select></el-form-item><!-- <el-form-item label="实到" prop="arrivedNum"><el-input v-model="formData.arrivedNum" placeholder="请输入实到" /></el-form-item> --><!-- <el-form-item label="状态" prop="status"><el-select v-model="formData.status" placeholder="请选择状态"><el-option label="状态" value="" /></el-select></el-form-item> --></el-row></div></el-form><template #footer><el-button @click="submitForm" type="primary" :disabled="formLoading">发 布</el-button><el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button><el-button @click="dialogVisible = false">取 消</el-button></template></Dialog>
</template>
<script setup lang="ts">
import { ParentMeetingApi, ParentMeetingVO } from '@/api/study/parentmeeting'
import { fr } from 'element-plus/es/locale';/** 家长会 表单 */
defineOptions({ name: 'ParentMeetingForm' })
const time = ref([
])
const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const formType = ref('') // 表单的类型:create - 新增;update - 修改
const formData = ref({id: undefined,className: undefined,subject: undefined,time: undefined,teacherName: undefined,type: undefined,arrivedNum: undefined,status: undefined,meetingContent: undefined,meetingImage: undefined,parentName: undefined,parentPhone: undefined,absentReason: undefined,arrivingNum: undefined,meetingStartTime: undefined,meetingEndTime: undefined,
})
const formRules = reactive({
})
const formRef = ref() // 表单 Ref/** 打开弹窗 */
const open = async (type: string, id?: number) => {dialogVisible.value = truedialogTitle.value = t('action.' + type)formType.value = typeresetForm()// 修改时,设置数据if (id) {formLoading.value = truetry {formData.value = await ParentMeetingApi.getParentMeeting(id)} finally {formLoading.value = false}}
}
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
const changes=(e)=>{const date = new Date(e[0])const date2 = new Date(e[1])// 获取时间戳(毫秒)  const timestamp = date.getTime()const timestamp2 = date2.getTime()formData.value.meetingStartTime = timestampformData.value.meetingEndTime = timestamp2formData.value.time = [dateFormat(timestamp),dateFormat(timestamp2)]}
/** 提交表单 */
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
const submitForm = async () => {// 校验表单await formRef.value.validate()// 提交请求formLoading.value = truetry {const data = formData.value as unknown as ParentMeetingVOif (formType.value === 'create') {await ParentMeetingApi.createParentMeeting(data)message.success(t('common.createSuccess'))} else {await ParentMeetingApi.updateParentMeeting(data)message.success(t('common.updateSuccess'))}dialogVisible.value = false// 发送操作成功的事件emit('success')} finally {formLoading.value = false}
}
const dateFormat = (value)=>{let date = new Date(value);let y = date.getFullYear();let MM = date.getMonth() + 1<10? ('0' + (date.getMonth() + 1)) : date.getMonth() + 1;let d = date.getDate()< 10 ? ('0' + date.getDate()) :  date.getDate()let h = date.getHours() < 10 ? ('0' +date.getHours()) : date.getHours();const m = date.getMinutes()< 10 ? ('0' + date.getMinutes()) : date.getMinutes();return  y + '-' + MM + '-' + d 
}
/** 重置表单 */
const resetForm = () => {formData.value = {id: undefined,className: undefined,subject: undefined,time: undefined,teacherName: undefined,type: undefined,arrivedNum: undefined,status: undefined,meetingContent: undefined,meetingImage: undefined,parentName: undefined,parentPhone: undefined,absentReason: undefined,arrivingNum: undefined,meetingStartTime: undefined,meetingEndTime: undefined,}formRef.value?.resetFields()
}
</script>
<style scoped lang="scss">
.el-form-item{width: 47%;
}
:deep(.el-form-item__label){width: 130px !important;
}
// .bold{
//   width: 20px;
//   height:20px;
//   border-radius: 50%;
//   background:#85afd5;
//   text-align: center;
//   margin-top:5px;
//   margin-left:-10px;
//   color:#fff
// }
// .btitle{
//   line-height:30px;
//   margin-left:10px;
//   color:#84b0d5
// }
// .tip{
//   border:1px solid #84b0d5;
//   border-radius:0 20px 20px 0;
//   width:140px;
//   height:30px;
//   display:flex;
//   margin-left:30px;
//   margin-bottom:20px
// }
:deep(.el-form-item__content){display: block;
}
:deep(.el-date-editor.el-input, .el-date-editor.el-input__wrapper){width: -webkit-fill-available;
}
.textarea{width: 94%;
}
.el-scrollbar:nth-of-type(2) {display: none !important;}
.el-time-spinner {text-align: center;
}</style>

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

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

相关文章

【linux】Shell脚本三剑客之sed命令的详细用法攻略

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

Docker+consul容器服务的更新与发现

1、Consul概述 &#xff08;1&#xff09;什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点…

mac清理软件哪个好用免费 MacBook电脑清理软件推荐 怎么清理mac

随着使用时间的增长&#xff0c;mac电脑会积累一些不必要的垃圾文件&#xff0c;这些文件会占用宝贵的存储空间&#xff0c;影响电脑的运行速度和稳定性。因此&#xff0c;定期清理mac电脑的垃圾文件是非常有必要的。市场上有许多优秀的Mac清理软件&#xff0c;包括一些出色的国…

打造一篇完美的【数学建模竞赛论文】:从准备到撰写的全面指南

目录 一、赛前准备 1.1 报名与纪律要求 1.2 MD5码上传 1.3 竞赛准备 1.4 时间分配 二、论文格式规范 2.1 摘要 2.2 参考文献 2.3 排版要求 三、建模过程与方法 3.1 问题分析与模型假设 3.2 模型构建与求解 3.3 结果分析与检验 四、论文撰写技巧 4.1 论文结构 4…

mybatis中的缓存(一级缓存、二级缓存)

文章目录 前言一、MyBatis 缓存概述二、一级缓存1_初识一级缓存2_一级缓存命中原则1_StatementId相同2_查询参数相同3_分页参数相同4_sql 语句5_环境 3_一级缓存的生命周期1_缓存的产生2_缓存的销毁3_网传的一些谣言 4_一级缓存核心源码5_总结 三、二级缓存1_开启二级缓存2_二级…

Java面试八股之BeanFactory和ApplicationContext有什么区别

BeanFactory和ApplicationContext有什么区别 在Spring框架中&#xff0c;BeanFactory和ApplicationContext都是用于管理和控制Bean的容器&#xff0c;但是它们之间存在一些关键的区别。下面是这些区别的总结&#xff1a; 功能和特性: BeanFactory是最基础的容器&#xff0c;…

ecshop网站部署

目录 步骤1 ecshop网站的部署 一、安装环境 二、设置开机启动 ​三、 测试php ​四、上传安装包 五、安装ecshop 步骤1 ecshop网站的部署 一、安装环境 yum install -y httpd mariadb-server php php-devel php-mysql 浏览器访问&#xff1a;192.168.30.2 二、设置开机启…

docker 安装单机版redis

把这三个放上去 修改成自己的 按照自己需求来 照图片做 vim redis.conf vim startRedis.sh mv startRedis.sh deployRedis.sh sh deployRedis.sh docker run --privilegedtrue \ --name dev.redis --restartalways \ --network dev-net \ -v ./config/redis.conf:/etc/r…

Golang高效合并(拼接)多个gzip压缩文件

有时我们可能会遇到需要把多个 gzip 文件合并成单个 gzip 文件的场景&#xff0c;最简单最容易的方式是把每个gzip文件都先解压&#xff0c;然后合并成一个文件后再次进行压缩&#xff0c;最终得到我们想要的结果&#xff0c;但这种先解压后压缩的方式显然效率不高&#xff0c;…

QSqlRelationalTableModel 增删改查

QSqlRelationalTableModel 可以作为关系数据表的模型类&#xff0c;适用于三范式设计的表&#xff0c;主表中自动加载外键表中的名称。本文实现QSqlRelationalTableModel 为模型类&#xff0c;实现增删改查。 目录 0.表准备 1. 构建表格数据 声明变量 表格、数据模型、选择…

WPF多语言国际化,中英文切换

通过切换资源文件的形式实现中英文一键切换 在项目中新建Language文件夹&#xff0c;添加资源字典&#xff08;xaml文件&#xff09;&#xff0c;中文英文各一个。 在资源字典中写上想中英文切换的字符串&#xff0c;需要注意&#xff0c;必须指定key值&#xff0c;并且中英文…

26 Python序列结构

Python 中常用的序列结构有列表、元组、字典、字符串、集合等。 从是否有序这个角度看&#xff0c;Python 序列可以分为有序序列和无序序列&#xff1b;从是否可变来看&#xff0c;Python 序列可以分为可变序列和不可变序列两大类。 生成器对象和 range、map、enumerate、filte…

【计算机毕设论文】基于SpringBoot教材管理系统

&#x1f497;博主介绍&#xff1a;✌全平台粉丝5W,高级大厂开发程序员&#x1f603;&#xff0c;博客之星、掘金/知乎/华为云/阿里云等平台优质作者。 【源码获取】关注并且私信我 感兴趣的可以先收藏起来&#xff0c;同学门有不懂的毕设选题&#xff0c;项目以及论文编写等相…

Harmony Next -- 通用标题栏:高度自定义,可设置沉浸式状态,正常状态下为:左侧返回、居中标题,左中右均可自定义视图。

hm_common_title_bar OpenHarmony三方库中心仓&#xff1a;https://ohpm.openharmony.cn/#/cn/detail/common_title_bar 介绍 一款通用标题栏&#xff0c;支持高度自定义&#xff0c;可设置沉浸式状态&#xff0c;正常状态下为&#xff1a;左侧返回、居中标题&#xff0c;左…

前端练习<HtmlCSS>——照片墙(附完整代码及实现效果)

这个小练习也来源于b站up小K师兄&#xff0c;大家可以通过下面的链接学习哦~up讲的非常详细。 纯CSS写一个简单酷炫的照片墙效果&#xff5e; 先看一下这个照片墙的效果&#xff1a; 1.鼠标没有放到图片上时&#xff0c;照片同比例&#xff0c;每张照片都有倒影的效果。 2.然…

Spring 自定义集合实现策略

Spring 自定义集合实现策略 日常开发中&#xff0c;如果遇到复杂业务通常会用一个接口实现多个实现类。需要根据对应参数判断获取不同实现类。例如支付场景&#xff0c;根据选择支付方式&#xff0c;选择相应路由。如果实现类不多&#xff0c;通常会这样。如果实现类多了&…

华为网络模拟器eNSP安装部署教程

eNSP是图形化网络仿真平台&#xff0c;该平台通过对真实网络设备的仿真模拟&#xff0c;帮助广大ICT从业者和客户快速熟悉华为数通系列产品&#xff0c;了解并掌握相关产品的操作和配置、提升对企业ICT网络的规划、建设、运维能力&#xff0c;从而帮助企业构建更高效&#xff0…

Github个人网站搭建详细教程【Github+Jekyll模板】

文章目录 前言一、介绍1 Github Pages是什么2 静态网站生成工具3 Jekyll简介Jekyll 和 GitHub 的关系 4 Mac系统Jekyll的安装及使用安装Jekyll的简单使用 二、快速搭建第一个Github Pages网站三、静态网站模板——Chirpy1 个人定制 四、WordPress迁移到Github参考资料 前言 23…

AI绘画:艺术与科技融合的新篇章

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;AI绘画作为一种新兴的艺术形式&#xff0c;正逐步改变着传统艺术创作的格局。从早期的简单模仿到如今的个性化创作&#xff0c;AI绘画不仅提升了艺术创作的效率和质量&#xff0c;还开辟了全新的应用场景和商…

微服务安全——OAuth2.1详解、授权码模式、SpringAuthorizationServer实战、SSO单点登录、Gateway整合OAuth2

文章目录 Spring Authorization Server介绍OAuth2.0协议介绍角色OAuth2.0协议的运行流程应用场景授权模式详解客户端模式密码模式授权码模式简化模式token刷新模式 OAuth 2.1 协议介绍授权码模式PKCE扩展设备授权码模式拓展授权模式 OpenID Connect 1.0协议Spring Authorizatio…