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

news2024/9/17 8:45:15

♥️作者:小宋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>

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

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

相关文章

C++知识点:类和对象(自用)

类和对象 1. 类和对象的关系2. 对象指针3. 在堆上创建对象4. 成员访问限定符5. 名字编码&#xff08;Name Mangling&#xff09;6.构造函数7.构造函数的重载8.初始化列表8. 成员变量初始化的顺序&#xff08;通过初始化列表&#xff09;9. 初始化 const 成员变量10. 析构函数11…

【Web爬虫逆向】“企业预警通”模糊查询公司信息,逆向案例实战

“企业预警通”模糊查询公司信息&#xff0c;逆向案例实战 功能介绍效果演示思路分析1、先找到模糊查询的接口2、分析headers与params中参数并进行构造3、JS逆向&#xff0c;跟栈&#xff0c;找到js中key和dataCategory的生成方法&#xff0c;并完成js补码构造4、成功还原key后…

嵌入式中什么是三次握手

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c;点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 在网络数据传输中&#xf…

Mysql的主从复制(重要)和读写分离(理论重要实验不重要)

一、主从复制&#xff1a;架构一般是一主两从。 1.主从复制的模式&#xff1a; mysql默认模式为异步模式&#xff1a;主库在更新完事务之后会立即把结果返回给从服务器&#xff0c;并不关心从库是否接收到以及从库是否处理成功。缺点&#xff1a;网络问题没有同步、防火墙的等…

论文阅读:Deep_Generic_Dynamic_Object_Detection_Based_on_Dynamic_Grid_Maps

目录 概要 Motivation 整体框架流程 技术细节 小结 不足 论文地址&#xff1a;Deep Generic Dynamic Object Detection Based on Dynamic Grid Maps | IEEE Conference Publication | IEEE Xplore 概要 该文章提出了一种基于动态网格图&#xff08;Dynamic Grid Maps&a…

DevExpress WPF中文教程:如何完成GridControl的列和编辑器配置?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

基于微信小程序的校园警务系统/校园安全管理系统/校园出入管理系统

摘要 伴随着社会以及科学技术的发展&#xff0c;小程序已经渗透在人们的身边&#xff0c;小程序慢慢的变成了人们的生活必不可少的一部分&#xff0c;紧接着网络飞速的发展&#xff0c;小程序这一名词已不陌生&#xff0c;越来越多的学校机构等都会定制一款属于自己个性化的小程…

Exponential Moving Average (EMA) in Stable Diffusion

1.Moving Average in Stable Diffusion (SMA&EMA) 1.Moving average 2.移动平均值 3.How We Trained Stable Diffusion for Less than $50k (Part 3) Moving Average 在统计学中&#xff0c;移动平均是通过创建整个数据集中不同选择的一系列平均值来分析数据点的计算。 …

树莓集团——缔造国际领先的数字媒体产业孵化基地

在数字化浪潮席卷全球的背景下&#xff0c;树莓集团以其卓越的创新能力&#xff0c;正在全力打造一个全球领先的数字媒体产业基地。成都国际数字影像产业园不仅是技术和创意的汇聚地&#xff0c;更是数字内容创新与应用的典范&#xff0c;推动数字媒体产业迈向新的高度。 树莓集…

vue.js入门

目录 一. 框架概述 二. vue常用命令 2.1 插值表达式 2.2 v-text 2.3 v-html 2.4 v-on 2.5 v-model 2.6 v-show 2.7 v-if 2.8 v-else 2.9 v-bind 2.10 v-for 三. vue生命周期函数 一. 框架概述 我们之前写的javaScript代码都是原生的,而框架是在基础语言之上,对其进…

pytorch-梯度下降

梯度下降 y x 2 ∗ s i n ( x ) y ′ 2 x s i n x x 2 c o s x x 1 x − Δ y ′ ( x ) 其中 Δ 表示学习率&#xff0c; y ′ ( x ) 代表 y 在 x 点处关于 x 的梯度。 y x^2 * sin(x) \\ y 2xsinxx^2cosx \\ x_1 x - \Delta y(x) \\ 其中 \Delta 表示学习率&#xff0c…

qt表格模型视图

Qt 提供了一套强大的模型/视图框架&#xff0c;允许你以一种非常灵活和高效的方式显示和处理数据。在 Qt 中&#xff0c;表格视图&#xff08;TableView&#xff09;和模型&#xff08;TableModel&#xff09;是这种框架的一部分&#xff0c;常用于显示和编辑表格数据。 以下是…

便携式气象仪:科技赋能,让气象观测更智能

随着科技的快速发展&#xff0c;越来越多的领域受益于技术的进步。其中&#xff0c;气象观测领域也不例外。传统的气象观测设备虽然精确可靠&#xff0c;但往往体积庞大、携带不便&#xff0c;且需要专业人员进行操作和维护。而便携式气象仪的出现&#xff0c;则打破了这一局限…

BGP路由反射器

原理概述 缺省情况下&#xff0c;路由器从它的一个 IBGP对等体那里接收到的路由条目不会被该路由器再传递给其他IBGP对等体&#xff0c;这个原则称为BGP水平分割原则&#xff0c;该原则的根本作用是防止 AS内部的BGP路由环路。因此&#xff0c;在AS内部&#xff0c;一般需要每台…

深度解读大语言模型中的Transformer架构

一、Transformer的诞生背景 传统的循环神经网络&#xff08;RNN&#xff09;和长短期记忆网络&#xff08;LSTM&#xff09;在处理自然语言时存在诸多局限性。RNN 由于其递归的结构&#xff0c;在处理长序列时容易出现梯度消失和梯度爆炸的问题。这导致模型难以捕捉长距离的依…

《知识点扫盲 · Redis 序列化器》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

【2024最新版】Stable diffusion汉化版安装教程(附SD安装包),一键激活,永久免费!

目前广泛使用的Stable Diffusion Web UI简称(SDWebUI)是发布在开源平台Github上的一个Python项目,与通常的软件安装方法不同,这个项目并不是下载并安装即可使用的应用程序,而是需要准备执行环境,编译源码. 如果你是一个新手不会安装,现在可以直接使用一键启动包. 例如:国内的…

【Linux】信号量与生产消费模型

我们已经实现过锁条件变量的PC模型&#xff0c; 但是BlockingQueue并不能进行生产与消费的并发&#xff0c;原因在于我们使用的是STL提供的队列&#xff0c;进行了一个适配&#xff0c;底层的实现可能会修改到成员变量造成未知的错误。 而这次我们选择使用环形队列&#xff08…

python实现盲反卷积算法

python实现盲反卷积算法 盲反卷积算法算法原理算法实现Python实现详细解释优缺点应用领域盲反卷积算法 盲反卷积算法是一种图像复原技术,用于在没有先验知识或仅有有限信息的情况下,估计模糊图像的原始清晰图像和点扩散函数(PSF)。盲反卷积在摄影、医学成像、天文学等领域…

监控Windows文件夹下面的文件(C#和C++实现)

最近在做虚拟打印机时&#xff0c;需要实时监控打印文件的到达&#xff0c;并移动文件到另外的位置。一开始我使用了线程&#xff0c;在线程里去检测新文件的到达。实际上Windows提供了一个文件监控接口函数ReadDIrectoryChangesW。这个函数可以对所有文件操作进行监控。 ReadD…