|
|
|
@ -1,389 +1,151 @@
|
|
|
|
|
<template>
|
|
|
|
|
<div>
|
|
|
|
|
<el-tabs type="border-card">
|
|
|
|
|
<el-tab-pane label="秒" v-if="shouldHide('second')">
|
|
|
|
|
<CrontabSecond
|
|
|
|
|
@update="updateCrontabValue"
|
|
|
|
|
:check="checkNumber"
|
|
|
|
|
:cron="crontabValueObj"
|
|
|
|
|
ref="cronsecond"
|
|
|
|
|
/>
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
<div>
|
|
|
|
|
<el-tabs type="border-card">
|
|
|
|
|
<el-tab-pane label="秒" v-if="shouldHide('second')">
|
|
|
|
|
<CrontabSecond
|
|
|
|
|
@update="updateCrontabValue"
|
|
|
|
|
:check="checkNumber"
|
|
|
|
|
:cron="crontabValueObj"
|
|
|
|
|
ref="cronsecond"
|
|
|
|
|
/>
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
|
|
|
|
|
<el-tab-pane label="分钟" v-if="shouldHide('min')">
|
|
|
|
|
<CrontabMin
|
|
|
|
|
@update="updateCrontabValue"
|
|
|
|
|
:check="checkNumber"
|
|
|
|
|
:cron="crontabValueObj"
|
|
|
|
|
ref="cronmin"
|
|
|
|
|
/>
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
<el-tab-pane label="分钟" v-if="shouldHide('min')">
|
|
|
|
|
<CrontabMin
|
|
|
|
|
@update="updateCrontabValue"
|
|
|
|
|
:check="checkNumber"
|
|
|
|
|
:cron="crontabValueObj"
|
|
|
|
|
ref="cronmin"
|
|
|
|
|
/>
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
|
|
|
|
|
<el-tab-pane label="小时" v-if="shouldHide('hour')">
|
|
|
|
|
<CrontabHour
|
|
|
|
|
@update="updateCrontabValue"
|
|
|
|
|
:check="checkNumber"
|
|
|
|
|
:cron="crontabValueObj"
|
|
|
|
|
ref="cronhour"
|
|
|
|
|
/>
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
<el-tab-pane label="小时" v-if="shouldHide('hour')">
|
|
|
|
|
<CrontabHour
|
|
|
|
|
@update="updateCrontabValue"
|
|
|
|
|
:check="checkNumber"
|
|
|
|
|
:cron="crontabValueObj"
|
|
|
|
|
ref="cronhour"
|
|
|
|
|
/>
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
|
|
|
|
|
<el-tab-pane label="日" v-if="shouldHide('day')">
|
|
|
|
|
<CrontabDay
|
|
|
|
|
@update="updateCrontabValue"
|
|
|
|
|
:check="checkNumber"
|
|
|
|
|
:cron="crontabValueObj"
|
|
|
|
|
ref="cronday"
|
|
|
|
|
/>
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
<el-tab-pane label="日" v-if="shouldHide('day')">
|
|
|
|
|
<CrontabDay
|
|
|
|
|
@update="updateCrontabValue"
|
|
|
|
|
:check="checkNumber"
|
|
|
|
|
:cron="crontabValueObj"
|
|
|
|
|
ref="cronday"
|
|
|
|
|
/>
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
|
|
|
|
|
<el-tab-pane label="月" v-if="shouldHide('month')">
|
|
|
|
|
<CrontabMonth
|
|
|
|
|
@update="updateCrontabValue"
|
|
|
|
|
:check="checkNumber"
|
|
|
|
|
:cron="crontabValueObj"
|
|
|
|
|
ref="cronmonth"
|
|
|
|
|
/>
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
<el-tab-pane label="月" v-if="shouldHide('month')">
|
|
|
|
|
<CrontabMonth
|
|
|
|
|
@update="updateCrontabValue"
|
|
|
|
|
:check="checkNumber"
|
|
|
|
|
:cron="crontabValueObj"
|
|
|
|
|
ref="cronmonth"
|
|
|
|
|
/>
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
|
|
|
|
|
<el-tab-pane label="周" v-if="shouldHide('week')">
|
|
|
|
|
<CrontabWeek
|
|
|
|
|
@update="updateCrontabValue"
|
|
|
|
|
:check="checkNumber"
|
|
|
|
|
:cron="crontabValueObj"
|
|
|
|
|
ref="cronweek"
|
|
|
|
|
/>
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
<el-tab-pane label="周" v-if="shouldHide('week')">
|
|
|
|
|
<CrontabWeek
|
|
|
|
|
@update="updateCrontabValue"
|
|
|
|
|
:check="checkNumber"
|
|
|
|
|
:cron="crontabValueObj"
|
|
|
|
|
ref="cronweek"
|
|
|
|
|
/>
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
|
|
|
|
|
<el-tab-pane label="年" v-if="shouldHide('year')">
|
|
|
|
|
<CrontabYear
|
|
|
|
|
@update="updateCrontabValue"
|
|
|
|
|
:check="checkNumber"
|
|
|
|
|
:cron="crontabValueObj"
|
|
|
|
|
ref="cronyear"
|
|
|
|
|
/>
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
</el-tabs>
|
|
|
|
|
<el-tab-pane label="年" v-if="shouldHide('year')">
|
|
|
|
|
<CrontabYear
|
|
|
|
|
@update="updateCrontabValue"
|
|
|
|
|
:check="checkNumber"
|
|
|
|
|
:cron="crontabValueObj"
|
|
|
|
|
ref="cronyear"
|
|
|
|
|
/>
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
</el-tabs>
|
|
|
|
|
|
|
|
|
|
<div class="popup-main">
|
|
|
|
|
<div class="popup-result">
|
|
|
|
|
<p class="title">时间表达式</p>
|
|
|
|
|
<table>
|
|
|
|
|
<thead>
|
|
|
|
|
<th v-for="item of tabTitles" width="40" :key="item">{{item}}</th>
|
|
|
|
|
<th>Cron 表达式</th>
|
|
|
|
|
</thead>
|
|
|
|
|
<tbody>
|
|
|
|
|
<td>
|
|
|
|
|
<span>{{crontabValueObj.second}}</span>
|
|
|
|
|
</td>
|
|
|
|
|
<td>
|
|
|
|
|
<span>{{crontabValueObj.min}}</span>
|
|
|
|
|
</td>
|
|
|
|
|
<td>
|
|
|
|
|
<span>{{crontabValueObj.hour}}</span>
|
|
|
|
|
</td>
|
|
|
|
|
<td>
|
|
|
|
|
<span>{{crontabValueObj.day}}</span>
|
|
|
|
|
</td>
|
|
|
|
|
<td>
|
|
|
|
|
<span>{{crontabValueObj.month}}</span>
|
|
|
|
|
</td>
|
|
|
|
|
<td>
|
|
|
|
|
<span>{{crontabValueObj.week}}</span>
|
|
|
|
|
</td>
|
|
|
|
|
<td>
|
|
|
|
|
<span>{{crontabValueObj.year}}</span>
|
|
|
|
|
</td>
|
|
|
|
|
<td>
|
|
|
|
|
<span>{{crontabValueString}}</span>
|
|
|
|
|
</td>
|
|
|
|
|
</tbody>
|
|
|
|
|
</table>
|
|
|
|
|
</div>
|
|
|
|
|
<CrontabResult :ex="crontabValueString"></CrontabResult>
|
|
|
|
|
<div class="popup-main">
|
|
|
|
|
<div class="popup-result">
|
|
|
|
|
<p class="title">时间表达式</p>
|
|
|
|
|
<table>
|
|
|
|
|
<thead>
|
|
|
|
|
<th v-for="item of tabTitles" :key="item">{{item}}</th>
|
|
|
|
|
<th>Cron 表达式</th>
|
|
|
|
|
</thead>
|
|
|
|
|
<tbody>
|
|
|
|
|
<td>
|
|
|
|
|
<span v-if="crontabValueObj.second.length < 10">{{crontabValueObj.second}}</span>
|
|
|
|
|
<el-tooltip v-else :content="crontabValueObj.second" placement="top"><span>{{crontabValueObj.second}}</span></el-tooltip>
|
|
|
|
|
</td>
|
|
|
|
|
<td>
|
|
|
|
|
<span v-if="crontabValueObj.min.length < 10">{{crontabValueObj.min}}</span>
|
|
|
|
|
<el-tooltip v-else :content="crontabValueObj.min" placement="top"><span>{{crontabValueObj.min}}</span></el-tooltip>
|
|
|
|
|
</td>
|
|
|
|
|
<td>
|
|
|
|
|
<span v-if="crontabValueObj.hour.length < 10">{{crontabValueObj.hour}}</span>
|
|
|
|
|
<el-tooltip v-else :content="crontabValueObj.hour" placement="top"><span>{{crontabValueObj.hour}}</span></el-tooltip>
|
|
|
|
|
</td>
|
|
|
|
|
<td>
|
|
|
|
|
<span v-if="crontabValueObj.day.length < 10">{{crontabValueObj.day}}</span>
|
|
|
|
|
<el-tooltip v-else :content="crontabValueObj.day" placement="top"><span>{{crontabValueObj.day}}</span></el-tooltip>
|
|
|
|
|
</td>
|
|
|
|
|
<td>
|
|
|
|
|
<span v-if="crontabValueObj.month.length < 10">{{crontabValueObj.month}}</span>
|
|
|
|
|
<el-tooltip v-else :content="crontabValueObj.month" placement="top"><span>{{crontabValueObj.month}}</span></el-tooltip>
|
|
|
|
|
</td>
|
|
|
|
|
<td>
|
|
|
|
|
<span v-if="crontabValueObj.week.length < 10">{{crontabValueObj.week}}</span>
|
|
|
|
|
<el-tooltip v-else :content="crontabValueObj.week" placement="top"><span>{{crontabValueObj.week}}</span></el-tooltip>
|
|
|
|
|
</td>
|
|
|
|
|
<td>
|
|
|
|
|
<span v-if="crontabValueObj.year.length < 10">{{crontabValueObj.year}}</span>
|
|
|
|
|
<el-tooltip v-else :content="crontabValueObj.year" placement="top"><span>{{crontabValueObj.year}}</span></el-tooltip>
|
|
|
|
|
</td>
|
|
|
|
|
<td class="result">
|
|
|
|
|
<span v-if="crontabValueString.length < 90">{{crontabValueString}}</span>
|
|
|
|
|
<el-tooltip v-else :content="crontabValueString" placement="top"><span>{{crontabValueString}}</span></el-tooltip>
|
|
|
|
|
</td>
|
|
|
|
|
</tbody>
|
|
|
|
|
</table>
|
|
|
|
|
</div>
|
|
|
|
|
<CrontabResult :ex="crontabValueString"></CrontabResult>
|
|
|
|
|
|
|
|
|
|
<div class="pop_btn">
|
|
|
|
|
<el-button size="small" type="primary" @click="submitFill">确定</el-button>
|
|
|
|
|
<el-button size="small" type="warning" @click="clearCron">重置</el-button>
|
|
|
|
|
<el-button size="small" @click="hidePopup">取消</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="pop_btn">
|
|
|
|
|
<el-button type="primary" @click="submitFill">确定</el-button>
|
|
|
|
|
<el-button type="warning" @click="clearCron">重置</el-button>
|
|
|
|
|
<el-button @click="hidePopup">取消</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts" name="Crontab">
|
|
|
|
|
import { ref, reactive, computed, watch, onMounted } from 'vue';
|
|
|
|
|
import CrontabSecond from "./second.vue";
|
|
|
|
|
import CrontabMin from "./min.vue";
|
|
|
|
|
import CrontabHour from "./hour.vue";
|
|
|
|
|
import CrontabDay from "./day.vue";
|
|
|
|
|
import CrontabMonth from "./month.vue";
|
|
|
|
|
import CrontabWeek from "./week.vue";
|
|
|
|
|
import CrontabYear from "./year.vue";
|
|
|
|
|
import CrontabResult from "./result.vue";
|
|
|
|
|
|
|
|
|
|
<script setup>
|
|
|
|
|
import CrontabSecond from "./second.vue"
|
|
|
|
|
import CrontabMin from "./min.vue"
|
|
|
|
|
import CrontabHour from "./hour.vue"
|
|
|
|
|
import CrontabDay from "./day.vue"
|
|
|
|
|
import CrontabMonth from "./month.vue"
|
|
|
|
|
import CrontabWeek from "./week.vue"
|
|
|
|
|
import CrontabYear from "./year.vue"
|
|
|
|
|
import CrontabResult from "./result.vue"
|
|
|
|
|
const { proxy } = getCurrentInstance()
|
|
|
|
|
const emit = defineEmits(['hide', 'fill'])
|
|
|
|
|
const props = defineProps({
|
|
|
|
|
expression: {
|
|
|
|
|
type: String,
|
|
|
|
|
default: ''
|
|
|
|
|
},
|
|
|
|
|
hideComponent: {
|
|
|
|
|
type: Array as () => string[],
|
|
|
|
|
default: () => []
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const emit = defineEmits(['hide', 'fill']);
|
|
|
|
|
|
|
|
|
|
const tabTitles = ref(["秒", "分钟", "小时", "日", "月", "周", "年"]);
|
|
|
|
|
const tabActive = ref(0);
|
|
|
|
|
const myindex = ref(0);
|
|
|
|
|
|
|
|
|
|
const crontabValueObj = reactive({
|
|
|
|
|
second: "*",
|
|
|
|
|
min: "*",
|
|
|
|
|
hour: "*",
|
|
|
|
|
day: "*",
|
|
|
|
|
month: "*",
|
|
|
|
|
week: "?",
|
|
|
|
|
year: "",
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const cronsecond = ref(null);
|
|
|
|
|
const cronmin = ref(null);
|
|
|
|
|
const cronhour = ref(null);
|
|
|
|
|
const cronday = ref(null);
|
|
|
|
|
const cronmonth = ref(null);
|
|
|
|
|
const cronweek = ref(null);
|
|
|
|
|
const cronyear = ref(null);
|
|
|
|
|
|
|
|
|
|
// 判断某个组件是否应该显示
|
|
|
|
|
const shouldHide = (key: string) => {
|
|
|
|
|
if (props.hideComponent && props.hideComponent.includes(key)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 解析表达式
|
|
|
|
|
const resolveExp = () => {
|
|
|
|
|
// 反解析表达式
|
|
|
|
|
if (props.expression) {
|
|
|
|
|
const arr = props.expression.split(" ");
|
|
|
|
|
if (arr.length >= 6) {
|
|
|
|
|
// 6位以上是合法表达式
|
|
|
|
|
const obj = {
|
|
|
|
|
second: arr[0],
|
|
|
|
|
min: arr[1],
|
|
|
|
|
hour: arr[2],
|
|
|
|
|
day: arr[3],
|
|
|
|
|
month: arr[4],
|
|
|
|
|
week: arr[5],
|
|
|
|
|
year: arr[6] ? arr[6] : "",
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Object.assign(crontabValueObj, obj);
|
|
|
|
|
|
|
|
|
|
for (let i in obj) {
|
|
|
|
|
if (obj[i]) {
|
|
|
|
|
changeRadio(i, obj[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 没有传入的表达式则还原
|
|
|
|
|
clearCron();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// tab切换值
|
|
|
|
|
const tabCheck = (index: number) => {
|
|
|
|
|
tabActive.value = index;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 由子组件触发,更改表达式组成的字段值
|
|
|
|
|
const updateCrontabValue = (name: string, value: string, from?: string) => {
|
|
|
|
|
console.log("updateCrontabValue", name, value, from);
|
|
|
|
|
crontabValueObj[name] = value;
|
|
|
|
|
if (from && from !== name) {
|
|
|
|
|
console.log(`来自组件 ${from} 改变了 ${name} ${value}`);
|
|
|
|
|
changeRadio(name, value);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 获取对应的ref组件
|
|
|
|
|
const getRefComponent = (refName: string) => {
|
|
|
|
|
switch(refName) {
|
|
|
|
|
case 'cronsecond': return cronsecond.value;
|
|
|
|
|
case 'cronmin': return cronmin.value;
|
|
|
|
|
case 'cronhour': return cronhour.value;
|
|
|
|
|
case 'cronday': return cronday.value;
|
|
|
|
|
case 'cronmonth': return cronmonth.value;
|
|
|
|
|
case 'cronweek': return cronweek.value;
|
|
|
|
|
case 'cronyear': return cronyear.value;
|
|
|
|
|
default: return null;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 赋值到组件
|
|
|
|
|
const changeRadio = (name: string, value: string) => {
|
|
|
|
|
const arr = ["second", "min", "hour", "month"];
|
|
|
|
|
const refName = "cron" + name;
|
|
|
|
|
let insValue;
|
|
|
|
|
|
|
|
|
|
const refComponent = getRefComponent(refName);
|
|
|
|
|
if (!refComponent) return;
|
|
|
|
|
|
|
|
|
|
if (arr.includes(name)) {
|
|
|
|
|
if (value === "*") {
|
|
|
|
|
insValue = 1;
|
|
|
|
|
} else if (value.indexOf("-") > -1) {
|
|
|
|
|
const indexArr = value.split("-");
|
|
|
|
|
if (refComponent.cycle01 !== undefined) {
|
|
|
|
|
refComponent.cycle01 = isNaN(parseInt(indexArr[0])) ? 0 : parseInt(indexArr[0]);
|
|
|
|
|
}
|
|
|
|
|
if (refComponent.cycle02 !== undefined) {
|
|
|
|
|
refComponent.cycle02 = parseInt(indexArr[1]);
|
|
|
|
|
}
|
|
|
|
|
insValue = 2;
|
|
|
|
|
} else if (value.indexOf("/") > -1) {
|
|
|
|
|
const indexArr = value.split("/");
|
|
|
|
|
if (refComponent.average01 !== undefined) {
|
|
|
|
|
refComponent.average01 = isNaN(parseInt(indexArr[0])) ? 0 : parseInt(indexArr[0]);
|
|
|
|
|
}
|
|
|
|
|
if (refComponent.average02 !== undefined) {
|
|
|
|
|
refComponent.average02 = parseInt(indexArr[1]);
|
|
|
|
|
}
|
|
|
|
|
insValue = 3;
|
|
|
|
|
} else {
|
|
|
|
|
insValue = 4;
|
|
|
|
|
if (refComponent.checkboxList !== undefined) {
|
|
|
|
|
refComponent.checkboxList = value.split(",");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else if (name == "day") {
|
|
|
|
|
if (value === "*") {
|
|
|
|
|
insValue = 1;
|
|
|
|
|
} else if (value == "?") {
|
|
|
|
|
insValue = 2;
|
|
|
|
|
} else if (value.indexOf("-") > -1) {
|
|
|
|
|
const indexArr = value.split("-");
|
|
|
|
|
if (refComponent.cycle01 !== undefined) {
|
|
|
|
|
refComponent.cycle01 = isNaN(parseInt(indexArr[0])) ? 0 : parseInt(indexArr[0]);
|
|
|
|
|
}
|
|
|
|
|
if (refComponent.cycle02 !== undefined) {
|
|
|
|
|
refComponent.cycle02 = parseInt(indexArr[1]);
|
|
|
|
|
}
|
|
|
|
|
insValue = 3;
|
|
|
|
|
} else if (value.indexOf("/") > -1) {
|
|
|
|
|
const indexArr = value.split("/");
|
|
|
|
|
if (refComponent.average01 !== undefined) {
|
|
|
|
|
refComponent.average01 = isNaN(parseInt(indexArr[0])) ? 0 : parseInt(indexArr[0]);
|
|
|
|
|
}
|
|
|
|
|
if (refComponent.average02 !== undefined) {
|
|
|
|
|
refComponent.average02 = parseInt(indexArr[1]);
|
|
|
|
|
}
|
|
|
|
|
insValue = 4;
|
|
|
|
|
} else if (value.indexOf("W") > -1) {
|
|
|
|
|
const indexArr = value.split("W");
|
|
|
|
|
if (refComponent.workday !== undefined) {
|
|
|
|
|
refComponent.workday = isNaN(parseInt(indexArr[0])) ? 0 : parseInt(indexArr[0]);
|
|
|
|
|
}
|
|
|
|
|
insValue = 5;
|
|
|
|
|
} else if (value === "L") {
|
|
|
|
|
insValue = 6;
|
|
|
|
|
} else {
|
|
|
|
|
if (refComponent.checkboxList !== undefined) {
|
|
|
|
|
refComponent.checkboxList = value.split(",");
|
|
|
|
|
}
|
|
|
|
|
insValue = 7;
|
|
|
|
|
hideComponent: {
|
|
|
|
|
type: Array,
|
|
|
|
|
default: () => [],
|
|
|
|
|
},
|
|
|
|
|
expression: {
|
|
|
|
|
type: String,
|
|
|
|
|
default: ""
|
|
|
|
|
}
|
|
|
|
|
} else if (name == "week") {
|
|
|
|
|
if (value === "*") {
|
|
|
|
|
insValue = 1;
|
|
|
|
|
} else if (value == "?") {
|
|
|
|
|
insValue = 2;
|
|
|
|
|
} else if (value.indexOf("-") > -1) {
|
|
|
|
|
const indexArr = value.split("-");
|
|
|
|
|
if (refComponent.cycle01 !== undefined) {
|
|
|
|
|
refComponent.cycle01 = isNaN(parseInt(indexArr[0])) ? 0 : parseInt(indexArr[0]);
|
|
|
|
|
}
|
|
|
|
|
if (refComponent.cycle02 !== undefined) {
|
|
|
|
|
refComponent.cycle02 = parseInt(indexArr[1]);
|
|
|
|
|
}
|
|
|
|
|
insValue = 3;
|
|
|
|
|
} else if (value.indexOf("#") > -1) {
|
|
|
|
|
const indexArr = value.split("#");
|
|
|
|
|
if (refComponent.average01 !== undefined) {
|
|
|
|
|
refComponent.average01 = isNaN(parseInt(indexArr[1])) ? 1 : parseInt(indexArr[1]);
|
|
|
|
|
}
|
|
|
|
|
if (refComponent.average02 !== undefined) {
|
|
|
|
|
refComponent.average02 = parseInt(indexArr[0]);
|
|
|
|
|
}
|
|
|
|
|
insValue = 4;
|
|
|
|
|
} else if (value.indexOf("L") > -1) {
|
|
|
|
|
const indexArr = value.split("L");
|
|
|
|
|
if (refComponent.weekday !== undefined) {
|
|
|
|
|
refComponent.weekday = isNaN(parseInt(indexArr[0])) ? 1 : parseInt(indexArr[0]);
|
|
|
|
|
}
|
|
|
|
|
insValue = 5;
|
|
|
|
|
} else {
|
|
|
|
|
if (refComponent.checkboxList !== undefined) {
|
|
|
|
|
refComponent.checkboxList = value.split(",");
|
|
|
|
|
}
|
|
|
|
|
insValue = 6;
|
|
|
|
|
}
|
|
|
|
|
} else if (name == "year") {
|
|
|
|
|
if (value == "") {
|
|
|
|
|
insValue = 1;
|
|
|
|
|
} else if (value == "*") {
|
|
|
|
|
insValue = 2;
|
|
|
|
|
} else if (value.indexOf("-") > -1) {
|
|
|
|
|
insValue = 3;
|
|
|
|
|
} else if (value.indexOf("/") > -1) {
|
|
|
|
|
insValue = 4;
|
|
|
|
|
} else {
|
|
|
|
|
if (refComponent.checkboxList !== undefined) {
|
|
|
|
|
refComponent.checkboxList = value.split(",");
|
|
|
|
|
}
|
|
|
|
|
insValue = 5;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (refComponent.radioValue !== undefined) {
|
|
|
|
|
refComponent.radioValue = insValue;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 表单选项的子组件校验数字格式
|
|
|
|
|
const checkNumber = (value: number, minLimit: number, maxLimit: number): number => {
|
|
|
|
|
// 检查必须为整数
|
|
|
|
|
value = Math.floor(value);
|
|
|
|
|
if (value < minLimit) {
|
|
|
|
|
value = minLimit;
|
|
|
|
|
} else if (value > maxLimit) {
|
|
|
|
|
value = maxLimit;
|
|
|
|
|
}
|
|
|
|
|
return value;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 隐藏弹窗
|
|
|
|
|
const hidePopup = () => {
|
|
|
|
|
emit("hide");
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 填充表达式
|
|
|
|
|
const submitFill = () => {
|
|
|
|
|
emit("fill", crontabValueString.value);
|
|
|
|
|
hidePopup();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 清空表达式
|
|
|
|
|
const clearCron = () => {
|
|
|
|
|
// 还原选择项
|
|
|
|
|
console.log("准备还原");
|
|
|
|
|
Object.assign(crontabValueObj, {
|
|
|
|
|
})
|
|
|
|
|
const tabTitles = ref(["秒", "分钟", "小时", "日", "月", "周", "年"])
|
|
|
|
|
const tabActive = ref(0)
|
|
|
|
|
const hideComponent = ref([])
|
|
|
|
|
const expression = ref('')
|
|
|
|
|
const crontabValueObj = ref({
|
|
|
|
|
second: "*",
|
|
|
|
|
min: "*",
|
|
|
|
|
hour: "*",
|
|
|
|
@ -391,100 +153,157 @@ const clearCron = () => {
|
|
|
|
|
month: "*",
|
|
|
|
|
week: "?",
|
|
|
|
|
year: "",
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
for (let j in crontabValueObj) {
|
|
|
|
|
changeRadio(j, crontabValueObj[j]);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 计算cron表达式字符串
|
|
|
|
|
})
|
|
|
|
|
const crontabValueString = computed(() => {
|
|
|
|
|
const obj = crontabValueObj;
|
|
|
|
|
const str =
|
|
|
|
|
obj.second +
|
|
|
|
|
" " +
|
|
|
|
|
obj.min +
|
|
|
|
|
" " +
|
|
|
|
|
obj.hour +
|
|
|
|
|
" " +
|
|
|
|
|
obj.day +
|
|
|
|
|
" " +
|
|
|
|
|
obj.month +
|
|
|
|
|
" " +
|
|
|
|
|
obj.week +
|
|
|
|
|
(obj.year == "" ? "" : " " + obj.year);
|
|
|
|
|
return str;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 监听props变化
|
|
|
|
|
watch(() => props.expression, resolveExp);
|
|
|
|
|
watch(() => props.hideComponent, (value) => {
|
|
|
|
|
// 隐藏部分组件
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 组件挂载后初始化
|
|
|
|
|
const obj = crontabValueObj.value
|
|
|
|
|
return obj.second
|
|
|
|
|
+ " "
|
|
|
|
|
+ obj.min
|
|
|
|
|
+ " "
|
|
|
|
|
+ obj.hour
|
|
|
|
|
+ " "
|
|
|
|
|
+ obj.day
|
|
|
|
|
+ " "
|
|
|
|
|
+ obj.month
|
|
|
|
|
+ " "
|
|
|
|
|
+ obj.week
|
|
|
|
|
+ (obj.year === "" ? "" : " " + obj.year)
|
|
|
|
|
})
|
|
|
|
|
watch(expression, () => resolveExp())
|
|
|
|
|
function shouldHide(key) {
|
|
|
|
|
return !(hideComponent.value && hideComponent.value.includes(key))
|
|
|
|
|
}
|
|
|
|
|
function resolveExp() {
|
|
|
|
|
// 反解析 表达式
|
|
|
|
|
if (expression.value) {
|
|
|
|
|
const arr = expression.value.split(/\s+/)
|
|
|
|
|
if (arr.length >= 6) {
|
|
|
|
|
//6 位以上是合法表达式
|
|
|
|
|
let obj = {
|
|
|
|
|
second: arr[0],
|
|
|
|
|
min: arr[1],
|
|
|
|
|
hour: arr[2],
|
|
|
|
|
day: arr[3],
|
|
|
|
|
month: arr[4],
|
|
|
|
|
week: arr[5],
|
|
|
|
|
year: arr[6] ? arr[6] : ""
|
|
|
|
|
}
|
|
|
|
|
crontabValueObj.value = {
|
|
|
|
|
...obj,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 没有传入的表达式 则还原
|
|
|
|
|
clearCron()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// tab切换值
|
|
|
|
|
function tabCheck(index) {
|
|
|
|
|
tabActive.value = index
|
|
|
|
|
}
|
|
|
|
|
// 由子组件触发,更改表达式组成的字段值
|
|
|
|
|
function updateCrontabValue(name, value, from) {
|
|
|
|
|
crontabValueObj.value[name] = value
|
|
|
|
|
}
|
|
|
|
|
// 表单选项的子组件校验数字格式(通过-props传递)
|
|
|
|
|
function checkNumber(value, minLimit, maxLimit) {
|
|
|
|
|
// 检查必须为整数
|
|
|
|
|
value = Math.floor(value)
|
|
|
|
|
if (value < minLimit) {
|
|
|
|
|
value = minLimit
|
|
|
|
|
} else if (value > maxLimit) {
|
|
|
|
|
value = maxLimit
|
|
|
|
|
}
|
|
|
|
|
return value
|
|
|
|
|
}
|
|
|
|
|
// 隐藏弹窗
|
|
|
|
|
function hidePopup() {
|
|
|
|
|
emit("hide")
|
|
|
|
|
}
|
|
|
|
|
// 填充表达式
|
|
|
|
|
function submitFill() {
|
|
|
|
|
emit("fill", crontabValueString.value)
|
|
|
|
|
hidePopup()
|
|
|
|
|
}
|
|
|
|
|
function clearCron() {
|
|
|
|
|
// 还原选择项
|
|
|
|
|
crontabValueObj.value = {
|
|
|
|
|
second: "*",
|
|
|
|
|
min: "*",
|
|
|
|
|
hour: "*",
|
|
|
|
|
day: "*",
|
|
|
|
|
month: "*",
|
|
|
|
|
week: "?",
|
|
|
|
|
year: "",
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
resolveExp();
|
|
|
|
|
});
|
|
|
|
|
expression.value = props.expression
|
|
|
|
|
hideComponent.value = props.hideComponent
|
|
|
|
|
})
|
|
|
|
|
</script>
|
|
|
|
|
<style scoped>
|
|
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
|
|
.pop_btn {
|
|
|
|
|
text-align: center;
|
|
|
|
|
margin-top: 20px;
|
|
|
|
|
text-align: center;
|
|
|
|
|
margin-top: 20px;
|
|
|
|
|
}
|
|
|
|
|
.popup-main {
|
|
|
|
|
position: relative;
|
|
|
|
|
margin: 10px auto;
|
|
|
|
|
background: #fff;
|
|
|
|
|
border-radius: 5px;
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
position: relative;
|
|
|
|
|
margin: 10px auto;
|
|
|
|
|
border-radius: 5px;
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
}
|
|
|
|
|
.popup-title {
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
line-height: 34px;
|
|
|
|
|
padding-top: 6px;
|
|
|
|
|
background: #f2f2f2;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
line-height: 34px;
|
|
|
|
|
padding-top: 6px;
|
|
|
|
|
background: #f2f2f2;
|
|
|
|
|
}
|
|
|
|
|
.popup-result {
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
line-height: 24px;
|
|
|
|
|
margin: 25px auto;
|
|
|
|
|
padding: 15px 10px 10px;
|
|
|
|
|
border: 1px solid #ccc;
|
|
|
|
|
position: relative;
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
line-height: 24px;
|
|
|
|
|
margin: 25px auto;
|
|
|
|
|
padding: 15px 10px 10px;
|
|
|
|
|
border: 1px solid #ccc;
|
|
|
|
|
position: relative;
|
|
|
|
|
}
|
|
|
|
|
.popup-result .title {
|
|
|
|
|
position: absolute;
|
|
|
|
|
top: -28px;
|
|
|
|
|
left: 50%;
|
|
|
|
|
width: 140px;
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
margin-left: -70px;
|
|
|
|
|
text-align: center;
|
|
|
|
|
line-height: 30px;
|
|
|
|
|
background: #fff;
|
|
|
|
|
position: absolute;
|
|
|
|
|
top: -28px;
|
|
|
|
|
left: 50%;
|
|
|
|
|
width: 140px;
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
margin-left: -70px;
|
|
|
|
|
text-align: center;
|
|
|
|
|
line-height: 30px;
|
|
|
|
|
background: #fff;
|
|
|
|
|
}
|
|
|
|
|
.popup-result table {
|
|
|
|
|
text-align: center;
|
|
|
|
|
width: 100%;
|
|
|
|
|
margin: 0 auto;
|
|
|
|
|
text-align: center;
|
|
|
|
|
width: 100%;
|
|
|
|
|
margin: 0 auto;
|
|
|
|
|
}
|
|
|
|
|
.popup-result table td:not(.result) {
|
|
|
|
|
width: 3.5rem;
|
|
|
|
|
min-width: 3.5rem;
|
|
|
|
|
max-width: 3.5rem;
|
|
|
|
|
}
|
|
|
|
|
.popup-result table span {
|
|
|
|
|
display: block;
|
|
|
|
|
width: 100%;
|
|
|
|
|
font-family: arial;
|
|
|
|
|
line-height: 30px;
|
|
|
|
|
height: 30px;
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
border: 1px solid #e8e8e8;
|
|
|
|
|
display: block;
|
|
|
|
|
width: 100%;
|
|
|
|
|
font-family: arial;
|
|
|
|
|
line-height: 30px;
|
|
|
|
|
height: 30px;
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
border: 1px solid #e8e8e8;
|
|
|
|
|
}
|
|
|
|
|
.popup-result-scroll {
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
line-height: 24px;
|
|
|
|
|
height: 10em;
|
|
|
|
|
overflow-y: auto;
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
line-height: 24px;
|
|
|
|
|
height: 10em;
|
|
|
|
|
overflow-y: auto;
|
|
|
|
|
}
|
|
|
|
|
</style>
|
|
|
|
|
</style>
|