添加Quartz定时任务的Cron表达式前端Vue+ElementUI的表单输入方式

背景:Cron表达式难懂,前端可能一不小心就写错,基于这个背景

先看效果

 点ok

可以看到把下拉框选择的时间转化为了Cron表达式

怎么做的呢?注意:需要有一点Vue的基础

第一步、创建Vue组件名字为:timeCron.vue

<template>
  <div style="display:inline-block;">
    <el-popover v-model="visible" placement="bottom" width="400" trigger="click">
      <div class="form">
        <el-row>
          <el-col :span="8">
            <el-select v-model="type" placeholder="请选择类型" style="width:112px;" @change="typeChange">
              <el-option label="每天" value="每天"/>
              <el-option label="每周" value="每周"/>
              <el-option label="每月" value="每月"/>
            </el-select>
          </el-col>
          <el-col :span="8">
            <el-select
              v-show="type == '每周'"
              v-model="week"
              value-key="cron"
              placeholder="请选择星期"
              style="width:112px;"
            >
              <el-option
                v-for="item in weekOption"
                :key="item.cron"
                :label="item.title"
                :value="item"
              />
            </el-select>
          </el-col>
          <el-col :span="8">
            <el-select
              v-show="type == '每月'"
              v-model="month"
              value-key="cron"
              placeholder="请选择日期"
              style="width:112px;"
            >
              <el-option
                v-for="item in monthOption"
                :key="item.cron"
                :label="item.title"
                :value="item"
              />
            </el-select>
          </el-col>
          <el-col :span="8">
            <el-time-picker
              v-model="time"
              placeholder="选择时间"
              value-format="H:m:s"
              style="width: 100%;"
            />
          </el-col>
        </el-row>
        <div class="footer">
          <el-button size="mini" type="text" @click="visible = false">取消</el-button>
          <el-button type="primary" size="mini" @click="handleSummit">确定</el-button>
        </div>
      </div>

      <el-input slot="reference" v-model="value"/>
    </el-popover>
  </div>
</template>
<script>
export default {
  props: {
    timeCronStr: {
      type: String,
      default: ''
    }
  },
  data() {
    return {
      visible: false,
      value: '',
      type: '每天', // 天\周\月
      week: null, // 星期几
      month: null, // 几号
      time: '', // 时间
      weekOption: [
        {
          title: '星期一',
          value: '星期一',
          cron: 2
        },
        {
          title: '星期二',
          value: '星期二',
          cron: 3
        },
        {
          title: '星期三',
          value: '星期三',
          cron: 4
        },
        {
          title: '星期四',
          value: '星期四',
          cron: 5
        },
        {
          title: '星期五',
          value: '星期五',
          cron: 6
        },
        {
          title: '星期六',
          value: '星期六',
          cron: 7
        },
        {
          title: '星期日',
          value: '星期日',
          cron: 1
        }
      ],
      monthOption: []
    }
  },
  created() {
    this.initData()
  },
  mounted() {
  },
  methods: {
    initData() {
      const arr = []
      for (let i = 1; i < 32; i++) {
        arr.push({
          title: i + '号',
          value: i + '号',
          cron: i
        })
      }
      this.monthOption = arr
      if (this.timeCronStr) {
        this.value = this.timeCronStr
        const valueArr = this.timeCronStr.split(',')
        const valueArrLen = valueArr.length
        this.type = valueArr[0]
        this.time = valueArr[valueArrLen - 1]
        if (valueArrLen > 2) {
          // 说明是每月 或 每周
          if (valueArr[1].indexOf('星期') > -1) {
            // 每周
            this.weekOption.map((v) => {
              if (v.title == valueArr[1]) {
                this.week = v
              }
            })
          } else {
            this.monthOption.map((v) => {
              if (v.title == valueArr[1]) {
                this.month = v
              }
            })
          }
        }
      }
    },
    typeChange(t) {
      if (t == '每周' && !this.week) {
        this.week = this.weekOption[0]
      }
      if (t == '每月' && !this.month) {
        this.month = this.monthOption[0]
      }
    },
    handleSummit() {
      if (!this.time) {
        this.$message({
          message: '请选择时间!',
          type: 'warning'
        })
        return
      }
      const dataArr = []
      let timeCron
      const clockCornArr = this.time.split(':').reverse()
      if (this.type == '每天') {
        dataArr.push(this.type, this.time)
        timeCron = clockCornArr.join(' ') + ' * * ?'
      } else {
        if (this.type == '每月') {
          dataArr.push(this.type, this.month.title, this.time)
          timeCron = clockCornArr.join(' ') + ' ' + this.month.cron + ' * ?'
        } else {
          // 每周
          dataArr.push(this.type, this.week.title, this.time)
          timeCron = clockCornArr.join(' ') + ' ? * ' + this.week.cron
        }
      }
      this.value = dataArr.join(',')
      // console.log('timeCron', timeCron)
      this.visible = false
      this.$emit('change', this.value, timeCron) // 每月,1号,14:52:36 和 36 52 14 1 * ?
    }
  }
}
</script>
<style lang="scss" scoped>
.form {
  padding: 12px;
}

.footer {
  text-align: right;
  margin-top: 10px;
}
</style>

第二步、在需要用到的组件中导入并注册

import timeCron from '@/components/Tool/timeCron'

注意:这里导入自己timeCron组件的位置

// 注册组件
components: {
  timeCron
},

 第三步:使用timeCron组件

<el-form-item label="Cron表达式">
            <div style="text-align:left; padding-bottom:40px;">
              <time-cron @change="handelCronChange" style="margin-right:40px;"></time-cron>
              <el-input
                :label="Form.cronExpression"
                :value="Form.cronExpression"
                style="inline-size: auto"
                disabled
              ></el-input>
            </div>
          </el-form-item>
handelCronChange函数
handelCronChange(StrCron, TimeCron) {
      this.Form.cronExpression = TimeCron
    }
this.Form.cronExpression为自己定义的data数据

handelCronChange函数有两个参数:分别为

每月,1号,14:52:36 和 36 52 14 1 * ?
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
cron表达式是用于定义定时任务调度的一种时间表达式。在Vue中,可以使用vue-quartz插件来实现定时任务的调度。 首先,需要在项目中安装vue-quartz插件。可以通过npm或yarn进行安装: ``` npm install vue-quartz ``` 或 ``` yarn add vue-quartz ``` 安装完成后,在Vue的入口文件main.js中引入并注册vue-quartz插件: ```javascript import Vue from 'vue'; import VueQuartz from 'vue-quartz'; Vue.use(VueQuartz); ``` 接下来,在需要定义定时任务的组件中,使用`<cron>`标签来设置cron表达式: ```vue <template> <div> <h1>定时任务</h1> <cron v-model="cronExpression" @change="handleCronChange"></cron> </div> </template> <script> export default { data() { return { cronExpression: '' }; }, methods: { handleCronChange(cronExpression) { // 在这里可以处理cron表达式的变化,并执行相应的操作 console.log('cron表达式变化:', cronExpression); } } }; </script> ``` 在上面的示例中,通过`v-model`指令将cron表达式绑定到组件的data属性`cronExpression`上,并通过`@change`事件监听cron表达式的变化。 当用户在页面上选择或输入cron表达式时,`handleCronChange`方法会被调用,并传入新的cron表达式。在该方法中可以根据cron表达式执行相应的定时任务逻辑。 请注意,以上只是一个简的示例,具体的定时任务逻辑需要根据实际需求进行实现。同时,需要了解cron表达式的语法规则和含义,以确保正确设置定时任务的执行时间。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值