定时任务
This commit is contained in:
parent
40e8bcb05d
commit
47589c5d11
|
|
@ -118,5 +118,16 @@ export default {
|
||||||
option: async function (data = {}) {
|
option: async function (data = {}) {
|
||||||
return await http.get("crontab/option", data);
|
return await http.get("crontab/option", data);
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
crontab_log: {
|
||||||
|
list: async function (data = {}) {
|
||||||
|
return await http.get("crontab_log/list", data);
|
||||||
|
},
|
||||||
|
del: async function (data = {}) {
|
||||||
|
return await http.delete("crontab_log/del", data);
|
||||||
|
},
|
||||||
|
empty: async function (data = {}) {
|
||||||
|
return await http.delete("crontab_log/remove_all", data);
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,35 +1,15 @@
|
||||||
<template>
|
<template>
|
||||||
<el-select ref="selectRef" v-model="defaultValue" :size="size" :clearable="clearable" :multiple="multiple"
|
<el-select ref="selectRef" v-model="defaultValue" :size="size" :clearable="clearable" :multiple="multiple"
|
||||||
:collapse-tags="collapseTags" :collapse-tags-tooltip="collapseTagsTooltip" :filterable="filterable"
|
:collapse-tags="collapseTags" :collapse-tags-tooltip="collapseTagsTooltip" :filterable="filterable"
|
||||||
:placeholder="placeholder" :disabled="disabled" :filter-method="filterMethod" @remove-tag="removeTag"
|
:placeholder="placeholder" :disabled="disabled">
|
||||||
@visible-change="visibleChange" @clear="clear">
|
<el-option v-for="(item, index) in tableData" :key="index" :label="item[defaultProps.label]"
|
||||||
<template #empty>
|
:value="item[defaultProps.value]"></el-option>
|
||||||
<div class="pi-table-select__table" :style="{width: tableWidth+'px'}" v-loading="loading">
|
|
||||||
<div class="pi-table-select__header">
|
|
||||||
<slot name="header" :form="formData" :submit="formSubmit"></slot>
|
|
||||||
</div>
|
|
||||||
<el-table ref="tableRef" :data="tableData" :height="245" :highlight-current-row="!multiple"
|
|
||||||
@row-click="click" @select="select" @select-all="selectAll">
|
|
||||||
<el-table-column v-if="multiple" type="selection" width="45"></el-table-column>
|
|
||||||
<el-table-column v-else type="index" width="45">
|
|
||||||
<template #default="scope"><span>{{ scope.$index + (currentPage - 1) * pageSize + 1 }}</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<slot></slot>
|
|
||||||
</el-table>
|
|
||||||
<div class="pi-table-select__page">
|
|
||||||
<el-pagination size="small" background layout="prev, pager, next" :total="total" :page-size="pageSize"
|
|
||||||
v-model:currentPage="currentPage" @current-change="reload"></el-pagination>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-select>
|
</el-select>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import config from '@/config/select'
|
import config from '@/config/select'
|
||||||
import {ref, watch, onMounted, nextTick} from 'vue'
|
import {ref, watch, onMounted} from 'vue'
|
||||||
|
|
||||||
|
|
||||||
const emit = defineEmits(['update:modelValue', 'change'])
|
const emit = defineEmits(['update:modelValue', 'change'])
|
||||||
|
|
||||||
|
|
@ -51,204 +31,40 @@ const props = defineProps({
|
||||||
collapseTags: {type: Boolean, default: false},
|
collapseTags: {type: Boolean, default: false},
|
||||||
collapseTagsTooltip: {type: Boolean, default: false},
|
collapseTagsTooltip: {type: Boolean, default: false},
|
||||||
disabled: {type: Boolean, default: false},
|
disabled: {type: Boolean, default: false},
|
||||||
tableWidth: {type: Number, default: 400},
|
|
||||||
mode: {type: String, default: "popover"},
|
|
||||||
props: {
|
props: {
|
||||||
type: Object, default: () => {
|
type: Object, default: () => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const tableRef = ref(null)
|
|
||||||
const selectRef = ref(null)
|
const selectRef = ref(null)
|
||||||
let loading = ref(false)
|
let loading = ref(false)
|
||||||
let keyword = ref(null)
|
|
||||||
let defaultValue = ref([])
|
let defaultValue = ref([])
|
||||||
let tableData = ref([])
|
|
||||||
let pageSize = ref(config.pageSize)
|
|
||||||
let total = ref(0)
|
|
||||||
let currentPage = ref(1)
|
|
||||||
let defaultProps = ref({
|
let defaultProps = ref({
|
||||||
label: config.props.label,
|
label: config.props.label,
|
||||||
value: config.props.value,
|
value: config.props.value
|
||||||
page: config.request.page,
|
|
||||||
pageSize: config.request.pageSize,
|
|
||||||
keyword: config.request.keyword,
|
|
||||||
fields: []
|
|
||||||
})
|
})
|
||||||
let formData = ref({})
|
let tableData = ref([])
|
||||||
|
|
||||||
watch(() => props.modelValue, () => {
|
watch(defaultValue, () => {
|
||||||
defaultValue.value = props.modelValue
|
emit('update:modelValue', defaultValue.value)
|
||||||
autoCurrentLabel()
|
emit('change', defaultValue.value)
|
||||||
}, {deep: true})
|
})
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
getData()
|
||||||
defaultProps.value = Object.assign(defaultProps.value, props.props);
|
defaultProps.value = Object.assign(defaultProps.value, props.props);
|
||||||
defaultValue.value = props.modelValue
|
defaultValue.value = props.modelValue
|
||||||
autoCurrentLabel()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
//表格显示隐藏回调
|
|
||||||
function visibleChange(visible) {
|
|
||||||
if (visible) {
|
|
||||||
currentPage.value = 1
|
|
||||||
keyword.value = null
|
|
||||||
formData.value = {}
|
|
||||||
getData()
|
|
||||||
} else {
|
|
||||||
autoCurrentLabel()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getData() {
|
async function getData() {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
var reqData = {
|
const res = await props.apiObj(props.params);
|
||||||
[defaultProps.value.page]: currentPage.value,
|
tableData.value = res.data;
|
||||||
[defaultProps.value.pageSize]: pageSize.value,
|
|
||||||
[defaultProps.value.keyword]: keyword.value
|
|
||||||
}
|
|
||||||
Object.assign(reqData, props.params, formData.value)
|
|
||||||
var res = await props.apiObj(reqData);
|
|
||||||
var parseData = config.parseData(res)
|
|
||||||
tableData.value = parseData.rows;
|
|
||||||
total.value = parseData.total;
|
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
//表格默认赋值
|
|
||||||
nextTick(() => {
|
|
||||||
if (props.multiple) {
|
|
||||||
defaultValue.value.forEach(row => {
|
|
||||||
var setrow = tableData.value.filter(item => item[defaultProps.value.value] === row[defaultProps.value.value])
|
|
||||||
if (setrow.length > 0) {
|
|
||||||
tableRef.value.toggleRowSelection(setrow[0], true);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
var setrow = tableData.value.filter(item => item[defaultProps.value.value] === defaultValue.value[defaultProps.value.value])
|
|
||||||
tableRef.value.setCurrentRow(setrow[0]);
|
|
||||||
}
|
|
||||||
tableRef.value.setScrollTop(0)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//插糟表单提交
|
|
||||||
function formSubmit() {
|
|
||||||
currentPage.value = 1
|
|
||||||
keyword.value = null
|
|
||||||
getData()
|
|
||||||
}
|
|
||||||
|
|
||||||
//分页刷新表格
|
|
||||||
function reload() {
|
|
||||||
getData()
|
|
||||||
}
|
|
||||||
|
|
||||||
//自动模拟options赋值
|
|
||||||
function autoCurrentLabel() {
|
|
||||||
// nextTick(() => {
|
|
||||||
// if (props.multiple) {
|
|
||||||
// selectRef.value.selected.forEach(item => {
|
|
||||||
// item.currentLabel = item.value[defaultProps.value.label]
|
|
||||||
// })
|
|
||||||
// } else {
|
|
||||||
// selectRef.value.selectedLabel = defaultValue.value[defaultProps.value.label]
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
}
|
|
||||||
|
|
||||||
//表格勾选事件
|
|
||||||
function select(rows, row) {
|
|
||||||
var isSelect = rows.length && rows.indexOf(row) !== -1
|
|
||||||
if (isSelect) {
|
|
||||||
defaultValue.value.push(row)
|
|
||||||
} else {
|
|
||||||
defaultValue.value.splice(defaultValue.value.findIndex(item => item[defaultProps.value.value] == row[defaultProps.value.value]), 1)
|
|
||||||
}
|
|
||||||
autoCurrentLabel()
|
|
||||||
// 解析数据
|
|
||||||
emit('update:modelValue', config.filter(defaultValue.value, defaultProps.value.fields, props.multiple));
|
|
||||||
emit('change', config.filter(defaultValue.value, defaultProps.value.fields, props.multiple));
|
|
||||||
}
|
|
||||||
|
|
||||||
//表格全选事件
|
|
||||||
function selectAll(rows) {
|
|
||||||
var isAllSelect = rows.length > 0
|
|
||||||
if (isAllSelect) {
|
|
||||||
rows.forEach(row => {
|
|
||||||
var isHas = defaultValue.value.find(item => item[defaultProps.value.value] == row[defaultProps.value.value])
|
|
||||||
if (!isHas) {
|
|
||||||
defaultValue.value.push(row)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
this.tableData.forEach(row => {
|
|
||||||
var isHas = defaultValue.value.find(item => item[defaultProps.value.value] == row[defaultProps.value.value])
|
|
||||||
if (isHas) {
|
|
||||||
defaultValue.value.splice(defaultValue.value.findIndex(item => item[defaultProps.value.value] == row[defaultProps.value.value]), 1)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
autoCurrentLabel()
|
|
||||||
emit('update:modelValue', config.filter(defaultValue.value, defaultProps.value.fields, props.multiple));
|
|
||||||
emit('change', config.filter(defaultValue.value, defaultProps.value.fields, props.multiple));
|
|
||||||
}
|
|
||||||
|
|
||||||
function click(row) {
|
|
||||||
if (props.multiple) {
|
|
||||||
//处理多选点击行
|
|
||||||
} else {
|
|
||||||
defaultValue.value = row
|
|
||||||
selectRef.value.blur()
|
|
||||||
autoCurrentLabel()
|
|
||||||
emit('update:modelValue', config.filter(defaultValue.value, defaultProps.value.fields, props.multiple));
|
|
||||||
emit('change', config.filter(defaultValue.value, defaultProps.value.fields, props.multiple));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//tags删除后回调
|
|
||||||
function removeTag(tag) {
|
|
||||||
var row = findRowByKey(tag[defaultProps.value.value])
|
|
||||||
tableRef.value.toggleRowSelection(row, false);
|
|
||||||
emit('update:modelValue', config.filter(defaultValue.value, defaultProps.value.fields, props.multiple));
|
|
||||||
}
|
|
||||||
|
|
||||||
//清空后的回调
|
|
||||||
function clear() {
|
|
||||||
emit('update:modelValue', config.filter(defaultValue.value, defaultProps.value.fields, props.multiple));
|
|
||||||
}
|
|
||||||
|
|
||||||
// 关键值查询表格数据行
|
|
||||||
function findRowByKey(value) {
|
|
||||||
return tableData.value.find(item => item[defaultProps.value.value] === value)
|
|
||||||
}
|
|
||||||
|
|
||||||
function filterMethod(k) {
|
|
||||||
if (!k) {
|
|
||||||
keyword.value = null;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
keyword.value = k;
|
|
||||||
getData()
|
|
||||||
}
|
|
||||||
|
|
||||||
// 触发select隐藏
|
|
||||||
function blur() {
|
|
||||||
selectRef.value.blur();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 触发select显示
|
|
||||||
function focus() {
|
|
||||||
selectRef.value.focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.pi-table-select__table {
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pi-table-select__page {
|
|
||||||
padding-top: 12px;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,254 @@
|
||||||
|
<template>
|
||||||
|
<el-select ref="selectRef" v-model="defaultValue" :size="size" :clearable="clearable" :multiple="multiple"
|
||||||
|
:collapse-tags="collapseTags" :collapse-tags-tooltip="collapseTagsTooltip" :filterable="filterable"
|
||||||
|
:placeholder="placeholder" :disabled="disabled" :filter-method="filterMethod" @remove-tag="removeTag"
|
||||||
|
@visible-change="visibleChange" @clear="clear">
|
||||||
|
<template #empty>
|
||||||
|
<div class="pi-table-select__table" :style="{width: tableWidth+'px'}" v-loading="loading">
|
||||||
|
<div class="pi-table-select__header">
|
||||||
|
<slot name="header" :form="formData" :submit="formSubmit"></slot>
|
||||||
|
</div>
|
||||||
|
<el-table ref="tableRef" :data="tableData" :height="245" :highlight-current-row="!multiple"
|
||||||
|
@row-click="click" @select="select" @select-all="selectAll">
|
||||||
|
<el-table-column v-if="multiple" type="selection" width="45"></el-table-column>
|
||||||
|
<el-table-column v-else type="index" width="45">
|
||||||
|
<template #default="scope"><span>{{ scope.$index + (currentPage - 1) * pageSize + 1 }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<slot></slot>
|
||||||
|
</el-table>
|
||||||
|
<div class="pi-table-select__page">
|
||||||
|
<el-pagination size="small" background layout="prev, pager, next" :total="total" :page-size="pageSize"
|
||||||
|
v-model:currentPage="currentPage" @current-change="reload"></el-pagination>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-select>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import config from '@/config/select'
|
||||||
|
import {ref, watch, onMounted, nextTick} from 'vue'
|
||||||
|
|
||||||
|
|
||||||
|
const emit = defineEmits(['update:modelValue', 'change'])
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
modelValue: null,
|
||||||
|
apiObj: {
|
||||||
|
type: Function, default: () => {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
params: {
|
||||||
|
type: Object, default: () => {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
placeholder: {type: String, default: "请选择"},
|
||||||
|
size: {type: String, default: "default"},
|
||||||
|
clearable: {type: Boolean, default: false},
|
||||||
|
multiple: {type: Boolean, default: false},
|
||||||
|
filterable: {type: Boolean, default: false},
|
||||||
|
collapseTags: {type: Boolean, default: false},
|
||||||
|
collapseTagsTooltip: {type: Boolean, default: false},
|
||||||
|
disabled: {type: Boolean, default: false},
|
||||||
|
tableWidth: {type: Number, default: 400},
|
||||||
|
mode: {type: String, default: "popover"},
|
||||||
|
props: {
|
||||||
|
type: Object, default: () => {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const tableRef = ref(null)
|
||||||
|
const selectRef = ref(null)
|
||||||
|
let loading = ref(false)
|
||||||
|
let keyword = ref(null)
|
||||||
|
let defaultValue = ref([])
|
||||||
|
let tableData = ref([])
|
||||||
|
let pageSize = ref(config.pageSize)
|
||||||
|
let total = ref(0)
|
||||||
|
let currentPage = ref(1)
|
||||||
|
let defaultProps = ref({
|
||||||
|
label: config.props.label,
|
||||||
|
value: config.props.value,
|
||||||
|
page: config.request.page,
|
||||||
|
pageSize: config.request.pageSize,
|
||||||
|
keyword: config.request.keyword,
|
||||||
|
fields: []
|
||||||
|
})
|
||||||
|
let formData = ref({})
|
||||||
|
|
||||||
|
watch(() => props.modelValue, () => {
|
||||||
|
defaultValue.value = props.modelValue
|
||||||
|
autoCurrentLabel()
|
||||||
|
}, {deep: true})
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
defaultProps.value = Object.assign(defaultProps.value, props.props);
|
||||||
|
defaultValue.value = props.modelValue
|
||||||
|
autoCurrentLabel()
|
||||||
|
})
|
||||||
|
|
||||||
|
//表格显示隐藏回调
|
||||||
|
function visibleChange(visible) {
|
||||||
|
if (visible) {
|
||||||
|
currentPage.value = 1
|
||||||
|
keyword.value = null
|
||||||
|
formData.value = {}
|
||||||
|
getData()
|
||||||
|
} else {
|
||||||
|
autoCurrentLabel()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getData() {
|
||||||
|
loading.value = true;
|
||||||
|
var reqData = {
|
||||||
|
[defaultProps.value.page]: currentPage.value,
|
||||||
|
[defaultProps.value.pageSize]: pageSize.value,
|
||||||
|
[defaultProps.value.keyword]: keyword.value
|
||||||
|
}
|
||||||
|
Object.assign(reqData, props.params, formData.value)
|
||||||
|
var res = await props.apiObj(reqData);
|
||||||
|
var parseData = config.parseData(res)
|
||||||
|
tableData.value = parseData.rows;
|
||||||
|
total.value = parseData.total;
|
||||||
|
loading.value = false;
|
||||||
|
//表格默认赋值
|
||||||
|
nextTick(() => {
|
||||||
|
if (props.multiple) {
|
||||||
|
defaultValue.value.forEach(row => {
|
||||||
|
var setrow = tableData.value.filter(item => item[defaultProps.value.value] === row[defaultProps.value.value])
|
||||||
|
if (setrow.length > 0) {
|
||||||
|
tableRef.value.toggleRowSelection(setrow[0], true);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
var setrow = tableData.value.filter(item => item[defaultProps.value.value] === defaultValue.value[defaultProps.value.value])
|
||||||
|
tableRef.value.setCurrentRow(setrow[0]);
|
||||||
|
}
|
||||||
|
tableRef.value.setScrollTop(0)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//插糟表单提交
|
||||||
|
function formSubmit() {
|
||||||
|
currentPage.value = 1
|
||||||
|
keyword.value = null
|
||||||
|
getData()
|
||||||
|
}
|
||||||
|
|
||||||
|
//分页刷新表格
|
||||||
|
function reload() {
|
||||||
|
getData()
|
||||||
|
}
|
||||||
|
|
||||||
|
//自动模拟options赋值
|
||||||
|
function autoCurrentLabel() {
|
||||||
|
// nextTick(() => {
|
||||||
|
// if (props.multiple) {
|
||||||
|
// selectRef.value.selected.forEach(item => {
|
||||||
|
// item.currentLabel = item.value[defaultProps.value.label]
|
||||||
|
// })
|
||||||
|
// } else {
|
||||||
|
// selectRef.value.selectedLabel = defaultValue.value[defaultProps.value.label]
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
}
|
||||||
|
|
||||||
|
//表格勾选事件
|
||||||
|
function select(rows, row) {
|
||||||
|
var isSelect = rows.length && rows.indexOf(row) !== -1
|
||||||
|
if (isSelect) {
|
||||||
|
defaultValue.value.push(row)
|
||||||
|
} else {
|
||||||
|
defaultValue.value.splice(defaultValue.value.findIndex(item => item[defaultProps.value.value] == row[defaultProps.value.value]), 1)
|
||||||
|
}
|
||||||
|
autoCurrentLabel()
|
||||||
|
// 解析数据
|
||||||
|
emit('update:modelValue', config.filter(defaultValue.value, defaultProps.value.fields, props.multiple));
|
||||||
|
emit('change', config.filter(defaultValue.value, defaultProps.value.fields, props.multiple));
|
||||||
|
}
|
||||||
|
|
||||||
|
//表格全选事件
|
||||||
|
function selectAll(rows) {
|
||||||
|
var isAllSelect = rows.length > 0
|
||||||
|
if (isAllSelect) {
|
||||||
|
rows.forEach(row => {
|
||||||
|
var isHas = defaultValue.value.find(item => item[defaultProps.value.value] == row[defaultProps.value.value])
|
||||||
|
if (!isHas) {
|
||||||
|
defaultValue.value.push(row)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.tableData.forEach(row => {
|
||||||
|
var isHas = defaultValue.value.find(item => item[defaultProps.value.value] == row[defaultProps.value.value])
|
||||||
|
if (isHas) {
|
||||||
|
defaultValue.value.splice(defaultValue.value.findIndex(item => item[defaultProps.value.value] == row[defaultProps.value.value]), 1)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
autoCurrentLabel()
|
||||||
|
emit('update:modelValue', config.filter(defaultValue.value, defaultProps.value.fields, props.multiple));
|
||||||
|
emit('change', config.filter(defaultValue.value, defaultProps.value.fields, props.multiple));
|
||||||
|
}
|
||||||
|
|
||||||
|
function click(row) {
|
||||||
|
if (props.multiple) {
|
||||||
|
//处理多选点击行
|
||||||
|
} else {
|
||||||
|
defaultValue.value = row
|
||||||
|
selectRef.value.blur()
|
||||||
|
autoCurrentLabel()
|
||||||
|
emit('update:modelValue', config.filter(defaultValue.value, defaultProps.value.fields, props.multiple));
|
||||||
|
emit('change', config.filter(defaultValue.value, defaultProps.value.fields, props.multiple));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//tags删除后回调
|
||||||
|
function removeTag(tag) {
|
||||||
|
var row = findRowByKey(tag[defaultProps.value.value])
|
||||||
|
tableRef.value.toggleRowSelection(row, false);
|
||||||
|
emit('update:modelValue', config.filter(defaultValue.value, defaultProps.value.fields, props.multiple));
|
||||||
|
}
|
||||||
|
|
||||||
|
//清空后的回调
|
||||||
|
function clear() {
|
||||||
|
emit('update:modelValue', config.filter(defaultValue.value, defaultProps.value.fields, props.multiple));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 关键值查询表格数据行
|
||||||
|
function findRowByKey(value) {
|
||||||
|
return tableData.value.find(item => item[defaultProps.value.value] === value)
|
||||||
|
}
|
||||||
|
|
||||||
|
function filterMethod(k) {
|
||||||
|
if (!k) {
|
||||||
|
keyword.value = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
keyword.value = k;
|
||||||
|
getData()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 触发select隐藏
|
||||||
|
function blur() {
|
||||||
|
selectRef.value.blur();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 触发select显示
|
||||||
|
function focus() {
|
||||||
|
selectRef.value.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.pi-table-select__table {
|
||||||
|
padding: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pi-table-select__page {
|
||||||
|
padding-top: 12px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -2,10 +2,12 @@
|
||||||
<pi-table ref="tableRef" :apiObj="api.system.crontab.list" @selection-change="selectionChange">
|
<pi-table ref="tableRef" :apiObj="api.system.crontab.list" @selection-change="selectionChange">
|
||||||
<template #do>
|
<template #do>
|
||||||
<el-button v-auth="'crontab:add'" type="primary" icon="el-icon-plus" @click="add"></el-button>
|
<el-button v-auth="'crontab:add'" type="primary" icon="el-icon-plus" @click="add"></el-button>
|
||||||
<el-button v-auth="'crontab:edit'" type="primary" icon="el-icon-edit" @click="edit()"
|
<el-button v-auth="'crontab:edit'" type="success" icon="el-icon-edit" @click="edit()"
|
||||||
:disabled="selection.length!==1"></el-button>
|
:disabled="selection.length!==1"></el-button>
|
||||||
<el-button v-auth="'crontab:del'" type="danger" plain icon="el-icon-delete" :disabled="selection.length===0"
|
<el-button v-auth="'crontab:del'" type="danger" plain icon="el-icon-delete" :disabled="selection.length===0"
|
||||||
@click="batch_del"></el-button>
|
@click="batch_del"></el-button>
|
||||||
|
<el-button v-auth="'crontab:log:del'" type="info" plain icon="el-icon-operation"
|
||||||
|
@click="show_log()"></el-button>
|
||||||
</template>
|
</template>
|
||||||
<template #search>
|
<template #search>
|
||||||
<el-input v-model="search.crontab_name" placeholder="任务名称" clearable style="width: 200px;"
|
<el-input v-model="search.crontab_name" placeholder="任务名称" clearable style="width: 200px;"
|
||||||
|
|
@ -28,19 +30,21 @@
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="备注" prop="memo"></el-table-column>
|
<el-table-column label="备注" prop="memo"></el-table-column>
|
||||||
<el-table-column label="操作" fixed="right" align="right" width="170">
|
<el-table-column label="操作" fixed="right" align="right" width="120">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button-group>
|
<el-button-group>
|
||||||
<el-button text type="primary" size="small" @click="show(scope.row, scope.$index)">查看
|
<el-button text type="primary" size="small" @click="show(scope.row, scope.$index)">查看</el-button>
|
||||||
</el-button>
|
<el-button v-auth="'crontab:edit'" text type="success" size="small"
|
||||||
<el-button v-auth="'post:edit'" text type="primary" size="small"
|
|
||||||
@click="edit(scope.row, scope.$index)">编辑
|
@click="edit(scope.row, scope.$index)">编辑
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-popconfirm title="确定删除吗?" @confirm="del(scope.row, scope.$index)">
|
<el-popconfirm title="确定删除吗?" @confirm="del(scope.row, scope.$index)">
|
||||||
<template #reference>
|
<template #reference>
|
||||||
<el-button v-auth="'post:del'" text type="primary" size="small">删除</el-button>
|
<el-button v-auth="'crontab:del'" text type="danger" size="small">删除</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-popconfirm>
|
</el-popconfirm>
|
||||||
|
<el-button v-auth="'crontab:log:del'" text type="info" size="small"
|
||||||
|
@click="show_log(scope.row, scope.$index)">日志
|
||||||
|
</el-button>
|
||||||
</el-button-group>
|
</el-button-group>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
@ -53,6 +57,7 @@
|
||||||
import saveDialog from './save'
|
import saveDialog from './save'
|
||||||
import api from "@/api/index";
|
import api from "@/api/index";
|
||||||
import {getCurrentInstance, nextTick, ref} from "vue";
|
import {getCurrentInstance, nextTick, ref} from "vue";
|
||||||
|
import router from "@/router/index"
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: "monitorCrontab"
|
name: "monitorCrontab"
|
||||||
|
|
@ -93,6 +98,15 @@ async function show(row) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function show_log(row) {
|
||||||
|
router.push({
|
||||||
|
path: "/monitor/crontab_log",
|
||||||
|
query: {
|
||||||
|
crontab_id: row?.crontab_id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
//删除
|
//删除
|
||||||
async function del(row) {
|
async function del(row) {
|
||||||
const loading = proxy.$loading();
|
const loading = proxy.$loading();
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,6 @@
|
||||||
<el-form-item label="调用方法" prop="callback">
|
<el-form-item label="调用方法" prop="callback">
|
||||||
<el-input type="text" v-model="form.callback" placeholder="请输入调用方法" clearable></el-input>
|
<el-input type="text" v-model="form.callback" placeholder="请输入调用方法" clearable></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="调用参数" prop="params">
|
|
||||||
<el-input type="textarea" v-model="form.params" placeholder="请输入调用参数" clearable></el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="cron表达式" prop="rule">
|
<el-form-item label="cron表达式" prop="rule">
|
||||||
<pi-cron v-model="form.rule"></pi-cron>
|
<pi-cron v-model="form.rule"></pi-cron>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
@ -58,7 +55,6 @@ let form = ref({
|
||||||
enable: 0,
|
enable: 0,
|
||||||
skip_log: 1,
|
skip_log: 1,
|
||||||
rule: '',
|
rule: '',
|
||||||
params: '',
|
|
||||||
callback: ''
|
callback: ''
|
||||||
})
|
})
|
||||||
const rules = ref({
|
const rules = ref({
|
||||||
|
|
@ -68,9 +64,6 @@ const rules = ref({
|
||||||
rule:[
|
rule:[
|
||||||
{required: true, message: '请填写cron表达式'}
|
{required: true, message: '请填写cron表达式'}
|
||||||
],
|
],
|
||||||
params:[
|
|
||||||
{required: true, message: '请填写调用参数'}
|
|
||||||
],
|
|
||||||
callback:[
|
callback:[
|
||||||
{required: true, message: '请填写调用方法'}
|
{required: true, message: '请填写调用方法'}
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -1,24 +1,30 @@
|
||||||
<template>
|
<template>
|
||||||
<pi-table ref="tableRef" :apiObj="api.system.online.list">
|
<pi-table ref="tableRef" :apiObj="api.system.crontab_log.list" @selection-change="selectionChange">
|
||||||
<template #do>
|
<template #do>
|
||||||
<el-input v-model="search.username" placeholder="用户名" clearable style="width: 200px;" @keyup.enter="upsearch"></el-input>
|
<el-button v-auth="'crontab:log:del'" type="danger" plain icon="el-icon-delete"
|
||||||
|
:disabled="selection.length===0" @click="batch_del">删除</el-button>
|
||||||
|
<el-button v-auth="'crontab:log:empty'" type="danger" plain icon="el-icon-refresh-right"
|
||||||
|
@click="batch_empty">清空</el-button>
|
||||||
|
</template>
|
||||||
|
<template #search>
|
||||||
|
<pi-select v-model="search.crontab_id" :api-obj="api.system.crontab.option" placeholder="任务名称" clearable
|
||||||
|
:props="{label: 'crontab_name', value:'crontab_id'}" style="width: 200px;"></pi-select>
|
||||||
<el-button type="primary" icon="el-icon-search" @click="upsearch"></el-button>
|
<el-button type="primary" icon="el-icon-search" @click="upsearch"></el-button>
|
||||||
</template>
|
</template>
|
||||||
<el-table-column label="#" type="index" width="50"></el-table-column>
|
<el-table-column type="selection" width="50"></el-table-column>
|
||||||
<el-table-column label="会话编号" prop="session_id"></el-table-column>
|
<el-table-column label="日志编号" prop="log_id"></el-table-column>
|
||||||
<el-table-column label="用户名" prop="username"></el-table-column>
|
<el-table-column label="任务名称" prop="crontab_name"></el-table-column>
|
||||||
<el-table-column label="部门名称" prop="account.dept.dept_name"></el-table-column>
|
<el-table-column label="调用目标" prop="callback"></el-table-column>
|
||||||
<el-table-column label="主机" prop="ip"></el-table-column>
|
<el-table-column label="执行结果" prop="result"></el-table-column>
|
||||||
<el-table-column label="登录地点" prop="location"></el-table-column>
|
<el-table-column label="执行状态" prop="status"></el-table-column>
|
||||||
<el-table-column label="浏览器" prop="os.browser"></el-table-column>
|
<el-table-column label="执行耗时" prop="duration"></el-table-column>
|
||||||
<el-table-column label="操作系统" prop="os.os"></el-table-column>
|
<el-table-column label="执行时间" prop="create_time"></el-table-column>
|
||||||
<el-table-column label="登录时间" prop="online_time"></el-table-column>
|
|
||||||
<el-table-column label="操作" fixed="right" align="right" width="100">
|
<el-table-column label="操作" fixed="right" align="right" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button-group>
|
<el-button-group>
|
||||||
<el-popconfirm title="确定强制退出吗?" @confirm="quit(scope.row, scope.$index)">
|
<el-popconfirm title="确定删除吗?" @confirm="del(scope.row, scope.$index)">
|
||||||
<template #reference>
|
<template #reference>
|
||||||
<el-button v-auth="'online:quit'" text type="primary" size="small">强退</el-button>
|
<el-button v-auth="'crontab:log:del'" text type="danger" size="small">删除</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-popconfirm>
|
</el-popconfirm>
|
||||||
</el-button-group>
|
</el-button-group>
|
||||||
|
|
@ -30,29 +36,60 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import api from "@/api/index";
|
import api from "@/api/index";
|
||||||
import {getCurrentInstance, ref} from "vue";
|
import {getCurrentInstance, ref} from "vue";
|
||||||
|
import piSelect from "@/components/piSelect"
|
||||||
|
import {useRoute} from 'vue-router'
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: "monitorOnline"
|
name: "monitorCrontabLog"
|
||||||
})
|
})
|
||||||
|
|
||||||
const {proxy} = getCurrentInstance()
|
const {proxy} = getCurrentInstance()
|
||||||
const tableRef = ref(null)
|
const tableRef = ref(null)
|
||||||
|
const route = useRoute()
|
||||||
|
|
||||||
let search = ref({
|
let search = ref({
|
||||||
username: null
|
crontab_id: route.query.crontab_id ? parseInt(route.query.crontab_id) : null
|
||||||
})
|
})
|
||||||
|
let selection = ref([])
|
||||||
//删除
|
|
||||||
async function quit(row) {
|
|
||||||
const loading = proxy.$loading();
|
|
||||||
const res = await api.system.online.quit({session_id: row.session_id});
|
|
||||||
tableRef.value.refresh()
|
|
||||||
loading.close();
|
|
||||||
proxy.$message.success(res.msg)
|
|
||||||
}
|
|
||||||
|
|
||||||
//搜索
|
//搜索
|
||||||
function upsearch() {
|
function upsearch() {
|
||||||
tableRef.value.upData(search.value)
|
tableRef.value.upData(search.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function selectionChange(e){
|
||||||
|
selection.value = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function batch_empty() {
|
||||||
|
proxy.$confirm(`确定清空所有日志吗?`, '提示', {
|
||||||
|
type: 'warning'
|
||||||
|
}).then(async () => {
|
||||||
|
const loading = proxy.$loading();
|
||||||
|
const res = await api.system.crontab_log.empty(search.value);
|
||||||
|
tableRef.value.refresh()
|
||||||
|
loading.close();
|
||||||
|
proxy.$message.success(res.msg)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async function batch_del() {
|
||||||
|
proxy.$confirm(`确定删除选中的 ${selection.value.length} 项吗?如果删除项中含有子集将会被一并删除`, '提示', {
|
||||||
|
type: 'warning'
|
||||||
|
}).then(async () => {
|
||||||
|
const loading = proxy.$loading();
|
||||||
|
const res = await api.system.crontab_log.del({ids: selection.value.map(item => item.log_id).toString()});
|
||||||
|
tableRef.value.refresh()
|
||||||
|
loading.close();
|
||||||
|
proxy.$message.success(res.msg)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async function del(row) {
|
||||||
|
const loading = proxy.$loading();
|
||||||
|
const res = await api.system.crontab_log.del({ids: row.log_id});
|
||||||
|
tableRef.value.refresh()
|
||||||
|
loading.close();
|
||||||
|
proxy.$message.success(res.msg)
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue