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

实现类:

    @Override
    public 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-picker
          v-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 = timestamp
  formData.value.meetingEndTime = timestamp2
  formData.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-form
      ref="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-picker
          v-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 = true
  dialogTitle.value = t('action.' + type)
  formType.value = type
  resetForm()
  // 修改时,设置数据
  if (id) {
    formLoading.value = true
    try {
      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 = timestamp
  formData.value.meetingEndTime = timestamp2
  formData.value.time = [dateFormat(timestamp),dateFormat(timestamp2)]

}
/** 提交表单 */
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
const submitForm = async () => {
  // 校验表单
  await formRef.value.validate()
  // 提交请求
  formLoading.value = true
  try {
    const data = formData.value as unknown as ParentMeetingVO
    if (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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【AIGC】构建自己的谷歌搜索引擎服务并使用

一、谷歌 谷歌的搜索引擎需要自己创建服务才能启用检索api。&#xff08;需自行翻墙和创建自己的谷歌账号&#xff09; 1.1 API服务创建 1&#xff09;登陆https://console.cloud.google.com/: 2&#xff09; 选择新建项目&#xff0c;取号项目名即可&#xff08;比如:Olin…

基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网(1)-项目搭建(前期准备工作)

这是项目的初始页面 接下来我先写下我的初始项目搭建 技术支持&#xff1a;JAVA、JSP 服务器&#xff1a;TOMCAT 7.0.86 编程软件&#xff1a;IntelliJ IDEA 2021.1.3 x64 首先我们打开页面&#xff0c;准备搭建项目的初始准备 1.New Project 2.随后点击Next&#xff0c;勾…

Vue3 + Vite 打包引入图片错误

1. 具体报错 报错信息 报错代码 2. 解决方法 改为import引入&#xff0c;注意src最好引用为符引入&#xff0c;不然docker部署的时候可能也会显示不了 <template><img :src"loginBg" alt""> </template><script langts setup> …

深入理解SQL中的INNER JOIN操作

本文介绍了INNER JOIN的定义、使用场景、计算方法及与其他JOIN的比较。INNER JOIN是关系数据库中常用的操作&#xff0c;用于返回两个表中匹配的行&#xff0c;只有在连接条件满足时才返回数据。本文详细解释了INNER JOIN的语法及其在一对多、多对多关系中的应用&#xff0c;通…

stm32平台为例的软件模拟时间,代替RTC调试

stm32平台为例的软件模拟时间&#xff0c;代替RTC调试 我们在开发项目的时候&#xff0c;如果用到RTC&#xff0c;如果真正等待RTC到达指定的时间&#xff0c;那调试时间就太长了。 比如每隔半个小时&#xff0c;存储一次数据&#xff0c;如果要观察10次存储的效果&#xff0…

学习笔记之Java篇(0725)

p this 普通方法中&#xff0c;this总是指向调用该方法的对象。 构造方法中&#xff0c;this总是指向正要初始化的对象。 this&#xff08;&#xff09;调用必须重载的构造方法&#xff0c;避免相同地址初始化代码&#xff0c;但只能在构造方法中用&#xff0c;比企鹅必须位…

WordPress 后台开发技巧:向文章发布页右侧添加自定义菜单项

案例图片 这个案例向你介绍了如何在文章发布页的右侧边栏增加一个新的自定义菜单项。具体用它实现什么功能&#xff0c;就看你的需要了。 代码 function add_custom_menu_item() { add_meta_box(custom_menu_item, 这里是菜单项名称, display_custom_menu_item, post, side, …

梅卡曼德高精度 DLP 结构光焊接专用 3D 相机

精度高&#xff0c;抗环境光、抗反光&#xff0c;成像效果好 自研蓝光 DLP 投影技术及双目结构光 3D 成像算法&#xff0c;相 机精度高&#xff0c;抗环境光、抗反光性能优异。在实际场景中&#xff0c; 可对各类复杂焊接件、焊缝高质量成像。 超小体积&#xff0c;超强适…

在spyder中使用arcgis pro的包

历时2天终于搞定了 目标&#xff1a;在anconda中新建一个arcpyPro环境&#xff0c;配置arcgispro3.0中的arcpy 一、安装arcgispro3.0 如果安装完之后打开arcgispro3.0闪退&#xff0c;就去修改注册表&#xff08;在另一台电脑安装arcgispro遇到过&#xff09; 安装成功后可…

基于 HTML+ECharts 实现智慧安防数据可视化大屏(含源码)

构建智慧安防数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 随着科技的不断进步&#xff0c;智慧安防系统已经成为保障公共安全的重要工具。通过数据可视化&#xff0c;安防管理人员可以实时监控关键区域的安全状况、人员流动以及设备状态&#xff0c;从而提高应急响…

如何实现可视化、智能化、自动化的文件采集?一文了解

内部数据文件采集需求在多个行业中都非常重要&#xff0c;以下是一些涉及此场景需求的行业&#xff1a; 1.大数据行业&#xff1a;随着大数据的行业应用不断深入&#xff0c;物联网、智能家居、数字政务等领域的大数据技术应用逐渐成熟&#xff0c;数据采集的需求也将被逐步激…

GPU虚拟化和池化技术解读

GPU虚拟化到池化技术深度分析 在大型模型的推动下&#xff0c;GPU算力的需求日益增长。然而&#xff0c;企业常常受限于有限的GPU卡资源&#xff0c;即使采用虚拟化技术&#xff0c;也难以充分利用或持续使用这些资源。为解决GPU算力资源的不均衡问题&#xff0c;同时推动国产…

日本的便利店真的“无所不能”?!简直不要太方便了

众所周知&#xff0c;日本便利店可谓是日本人离不来的存在了&#xff01;真真是“要啥有啥”&#xff0c;可以说日本的便利店才是真正意义上的“便利”~ 那日本的便利店到底有什么与众不同呢&#xff1f;&#xff1f;今天小编来带大家盘点一下日本便利店的那些服务。 一、购票…

开源XDR-SIEM一体化平台 Wazuh (1)基础架构

简介 Wazuh平台提供了XDR和SIEM功能&#xff0c;保护云、容器和服务器工作负载。这些功能包括日志数据分析、入侵和恶意软件检测、文件完整性监控、配置评估、漏洞检测以及对法规遵从性的支持。详细信息可以参考Wazuh - Open Source XDR. Open Source SIEM.官方网站 Wazuh解决…

IEC104转MQTT网关轻松将IEC104设备数据传输到Zabbix、阿里云、华为云、亚马逊AWS、ThingsBoard、Ignition云平台

随着工业4.0的深入发展和物联网技术的广泛应用&#xff0c;IEC 104&#xff08;IEC 60870-5-104&#xff09;作为电力系统中的重要通信协议&#xff0c;正逐步与各种现代监控、管理和云平台实现深度融合。IEC104转MQTT网关BE113作为这一融合过程中的关键设备&#xff0c;其能够…

信息安全工程师题

防火墙安全策略有两种类型&#xff1a;白名单策略、黑名单策略白名单策略&#xff1a;只允许符合安全规则的包通过防火墙&#xff0c;其他通信包禁止黑名单策略&#xff1a;禁止与安全规则相冲突的包通过防火墙&#xff0c;其他通信包允许实现网络地址转换的方式主要有静态NAT、…

华清数据结构day5 24-7-22

1>使用栈&#xff0c;完成进制转换输入&#xff1a;一个整数&#xff0c;进制数输出&#xff1a;该数的对应的进制数 seqstack.h #ifndef SEQSTACK_H #define SEQSTACK_H #define MAX 10 #include"myhead.h" typedef int datatype;typedef struct {datatype *d…

巴黎奥运启幕 PLM系统助力中国制造闪耀全球

2024巴黎奥运会将于法国当地时间7月26日在塞纳河畔正式开幕。即将亮相巴黎奥运会赛场的除了中国运动员之外&#xff0c;还有一批批中国制造企业为奥运会设计并制造的体育设备也将惊艳亮相&#xff0c;成为赛场上另一道亮丽的风景线。 在新时代的浪潮中&#xff0c;中国制造业坚…

算法 —— 暴力枚举

目录 循环枚举 P2241 统计方形&#xff08;数据加强版&#xff09; P2089 烤鸡 P1618 三连击&#xff08;升级版&#xff09; 子集枚举 P1036 [NOIP2002 普及组] 选数 P1157 组合的输出 排列枚举 P1706 全排列问题 P1088 [NOIP2004 普及组] 火星人 循环枚举 顾名思…

uniapp中@click或者@tap多层嵌套的问题解决方法

我们在开发页面的过程中。例如要设计一个九宫格的相册&#xff0c;并且加上删除上传图片和点击图片后预览图片大图的功能例如下图的演示功能。 点击图片后显示大图预览图片&#xff0c;点击x号后要删除掉当前的图片&#xff0c;那么我们设计的时候如果我们代码写成如下的格式 …