parent
5f3f2344c0
commit
cbc0e99036
23 changed files with 1499 additions and 48 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,78 @@ |
||||
import request from '@/router/axios'; |
||||
|
||||
export const getList = (current, size, params) => { |
||||
return request({ |
||||
url: '/api/blade-job/job-info/list', |
||||
method: 'get', |
||||
params: { |
||||
...params, |
||||
current, |
||||
size, |
||||
}, |
||||
}); |
||||
}; |
||||
|
||||
export const getDetail = id => { |
||||
return request({ |
||||
url: '/api/blade-job/job-info/detail', |
||||
method: 'get', |
||||
params: { |
||||
id, |
||||
}, |
||||
}); |
||||
}; |
||||
|
||||
export const remove = ids => { |
||||
return request({ |
||||
url: '/api/blade-job/job-info/remove', |
||||
method: 'post', |
||||
params: { |
||||
ids, |
||||
}, |
||||
}); |
||||
}; |
||||
|
||||
export const add = row => { |
||||
return request({ |
||||
url: '/api/blade-job/job-info/submit', |
||||
method: 'post', |
||||
data: row, |
||||
}); |
||||
}; |
||||
|
||||
export const update = row => { |
||||
return request({ |
||||
url: '/api/blade-job/job-info/submit', |
||||
method: 'post', |
||||
data: row, |
||||
}); |
||||
}; |
||||
|
||||
export const change = row => { |
||||
return request({ |
||||
url: '/api/blade-job/job-info/change', |
||||
method: 'post', |
||||
params: { |
||||
id: row.id, |
||||
enable: row.enable, |
||||
}, |
||||
}); |
||||
}; |
||||
|
||||
export const run = row => { |
||||
return request({ |
||||
url: '/api/blade-job/job-info/run', |
||||
method: 'post', |
||||
params: { |
||||
id: row.id, |
||||
}, |
||||
}); |
||||
}; |
||||
|
||||
export const sync = row => { |
||||
return request({ |
||||
url: '/api/blade-job/job-info/sync', |
||||
method: 'post', |
||||
data: row, |
||||
}); |
||||
}; |
||||
@ -0,0 +1,57 @@ |
||||
import request from '@/router/axios'; |
||||
|
||||
export const getList = (current, size, params) => { |
||||
return request({ |
||||
url: '/api/blade-job/job-server/list', |
||||
method: 'get', |
||||
params: { |
||||
...params, |
||||
current, |
||||
size, |
||||
}, |
||||
}); |
||||
}; |
||||
|
||||
export const getDetail = id => { |
||||
return request({ |
||||
url: '/api/blade-job/job-server/detail', |
||||
method: 'get', |
||||
params: { |
||||
id, |
||||
}, |
||||
}); |
||||
}; |
||||
|
||||
export const remove = ids => { |
||||
return request({ |
||||
url: '/api/blade-job/job-server/remove', |
||||
method: 'post', |
||||
params: { |
||||
ids, |
||||
}, |
||||
}); |
||||
}; |
||||
|
||||
export const add = row => { |
||||
return request({ |
||||
url: '/api/blade-job/job-server/submit', |
||||
method: 'post', |
||||
data: row, |
||||
}); |
||||
}; |
||||
|
||||
export const update = row => { |
||||
return request({ |
||||
url: '/api/blade-job/job-server/submit', |
||||
method: 'post', |
||||
data: row, |
||||
}); |
||||
}; |
||||
|
||||
export const sync = row => { |
||||
return request({ |
||||
url: '/api/blade-job/job-server/sync', |
||||
method: 'post', |
||||
data: row, |
||||
}); |
||||
}; |
||||
@ -0,0 +1,514 @@ |
||||
export const timeExpressionTypeDic = [ |
||||
{ |
||||
label: 'API', |
||||
value: 1, |
||||
}, |
||||
{ |
||||
label: 'CRON', |
||||
value: 2, |
||||
}, |
||||
{ |
||||
label: '固定频率(毫秒)', |
||||
value: 3, |
||||
}, |
||||
{ |
||||
label: '固定延迟(毫秒)', |
||||
value: 4, |
||||
}, |
||||
{ |
||||
label: '工作流', |
||||
value: 5, |
||||
}, |
||||
]; |
||||
|
||||
export const executeTypeDic = [ |
||||
{ |
||||
label: '单机执行', |
||||
value: 1, |
||||
}, |
||||
{ |
||||
label: '广播执行', |
||||
value: 2, |
||||
}, |
||||
{ |
||||
label: 'MapReduce', |
||||
value: 3, |
||||
}, |
||||
]; |
||||
|
||||
export const processorTypeDic = [ |
||||
{ |
||||
label: '内建处理器', |
||||
value: 1, |
||||
}, |
||||
{ |
||||
label: '外部处理器(动态加载)', |
||||
value: 4, |
||||
}, |
||||
]; |
||||
|
||||
export const dispatchStrategyDic = [ |
||||
{ |
||||
label: 'HEALTH_FIRST', |
||||
value: 1, |
||||
}, |
||||
{ |
||||
label: 'RANDOM', |
||||
value: 2, |
||||
}, |
||||
]; |
||||
|
||||
export const enableDic = [ |
||||
{ |
||||
label: '暂停', |
||||
value: 0, |
||||
}, |
||||
{ |
||||
label: '启用', |
||||
value: 1, |
||||
}, |
||||
]; |
||||
|
||||
export const logTypeDic = [ |
||||
{ |
||||
label: 'ONLINE', |
||||
value: 1, |
||||
}, |
||||
{ |
||||
label: 'LOCAL', |
||||
value: 2, |
||||
}, |
||||
{ |
||||
label: 'STDOUT', |
||||
value: 3, |
||||
}, |
||||
{ |
||||
label: 'LOCAL_AND_ONLINE', |
||||
value: 4, |
||||
}, |
||||
{ |
||||
label: 'NULL', |
||||
value: 999, |
||||
}, |
||||
]; |
||||
|
||||
export const logLevelDic = [ |
||||
{ |
||||
label: 'DEBUG', |
||||
value: 1, |
||||
}, |
||||
{ |
||||
label: 'INFO', |
||||
value: 2, |
||||
}, |
||||
{ |
||||
label: 'WARN', |
||||
value: 3, |
||||
}, |
||||
{ |
||||
label: 'ERROR', |
||||
value: 4, |
||||
}, |
||||
{ |
||||
label: 'OFF', |
||||
value: 99, |
||||
}, |
||||
]; |
||||
|
||||
export default { |
||||
height: 'auto', |
||||
calcHeight: 30, |
||||
tip: false, |
||||
searchShow: true, |
||||
searchMenuSpan: 6, |
||||
border: true, |
||||
index: true, |
||||
viewBtn: true, |
||||
selection: true, |
||||
labelWidth: 180, |
||||
menuWidth: 350, |
||||
dialogWidth: 1200, |
||||
dialogClickModal: false, |
||||
tabs: true, |
||||
column: [ |
||||
{ |
||||
label: '任务应用', |
||||
prop: 'jobServerId', |
||||
type: 'select', |
||||
dicUrl: '/api/blade-job/job-server/select', |
||||
props: { |
||||
label: 'jobAppName', |
||||
value: 'id', |
||||
}, |
||||
search: true, |
||||
display: false, |
||||
}, |
||||
{ |
||||
label: '任务ID', |
||||
prop: 'jobId', |
||||
type: 'input', |
||||
search: true, |
||||
width: 80, |
||||
display: false, |
||||
}, |
||||
{ |
||||
label: '任务名称', |
||||
prop: 'jobName', |
||||
type: 'input', |
||||
search: true, |
||||
width: 200, |
||||
display: false, |
||||
}, |
||||
{ |
||||
label: '定时信息', |
||||
labelTip: '时间表达式类型', |
||||
prop: 'timeExpressionType', |
||||
type: 'select', |
||||
dicData: timeExpressionTypeDic, |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请选择定时信息', |
||||
trigger: 'blur', |
||||
}, |
||||
], |
||||
width: 120, |
||||
display: false, |
||||
}, |
||||
{ |
||||
label: '执行类型', |
||||
labelTip: '枚举值', |
||||
prop: 'executeType', |
||||
type: 'select', |
||||
dicData: executeTypeDic, |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请选择执行器类型', |
||||
trigger: 'blur', |
||||
}, |
||||
], |
||||
width: 110, |
||||
display: false, |
||||
}, |
||||
{ |
||||
label: '处理器类型', |
||||
labelTip: '枚举值', |
||||
prop: 'processorType', |
||||
type: 'select', |
||||
dicData: processorTypeDic, |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请选择处理器类型', |
||||
trigger: 'blur', |
||||
}, |
||||
], |
||||
width: 180, |
||||
display: false, |
||||
}, |
||||
{ |
||||
label: '任务状态', |
||||
labelTip: '未启用的任务不会被调度', |
||||
prop: 'enable', |
||||
type: 'switch', |
||||
dicData: enableDic, |
||||
slot: true, |
||||
width: 100, |
||||
display: false, |
||||
}, |
||||
], |
||||
group: [ |
||||
{ |
||||
label: '基础配置', |
||||
prop: 'modelSetting', |
||||
icon: 'el-icon-tickets', |
||||
column: [ |
||||
{ |
||||
label: '任务应用', |
||||
prop: 'jobServerId', |
||||
type: 'select', |
||||
dicUrl: '/api/blade-job/job-server/select', |
||||
props: { |
||||
label: 'jobAppName', |
||||
value: 'id', |
||||
}, |
||||
editDisabled: true, |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请选择任务应用', |
||||
trigger: 'blur', |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '任务状态', |
||||
labelTip: '未启用的任务不会被调度', |
||||
prop: 'enable', |
||||
type: 'switch', |
||||
value: 1, |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请选择是否开启', |
||||
trigger: 'blur', |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '任务名称', |
||||
prop: 'jobName', |
||||
type: 'input', |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请输入任务名称', |
||||
trigger: 'blur', |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '生命周期', |
||||
labelTip: '预留,用于指定定时调度任务的生效时间范围)', |
||||
prop: 'lifecycle', |
||||
type: 'datetimerange', |
||||
format: 'YYYY-MM-DD HH:mm:ss', |
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss', |
||||
startPlaceholder: '任务开始时间', |
||||
endPlaceholder: '任务结束时间', |
||||
}, |
||||
{ |
||||
label: '定时类型', |
||||
labelTip: '时间表达式类型', |
||||
prop: 'timeExpressionType', |
||||
type: 'select', |
||||
dicData: timeExpressionTypeDic, |
||||
value: 2, |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请选择定时信息', |
||||
trigger: 'blur', |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '时间表达式', |
||||
labelTip: '填写类型由 定时类型 决定,比如 CRON 需要填写 CRON 表达式', |
||||
prop: 'timeExpression', |
||||
type: 'input', |
||||
}, |
||||
{ |
||||
label: '执行类型', |
||||
labelTip: '枚举值', |
||||
prop: 'executeType', |
||||
type: 'select', |
||||
dicData: executeTypeDic, |
||||
value: 1, |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请选择执行器类型', |
||||
trigger: 'blur', |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '运行时配置', |
||||
labelTip: '目前支持随机(RANDOM)和健康度优先(HEALTH_FIRST)', |
||||
prop: 'dispatchStrategy', |
||||
type: 'select', |
||||
dicData: dispatchStrategyDic, |
||||
value: 1, |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请选择运行时配置', |
||||
trigger: 'blur', |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '处理器类型', |
||||
labelTip: '枚举值', |
||||
prop: 'processorType', |
||||
type: 'select', |
||||
dicData: processorTypeDic, |
||||
value: 1, |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请选择处理器类型', |
||||
trigger: 'blur', |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '处理器参数', |
||||
labelTip: |
||||
'如Java处理器需要填写全限定类名,如:org.springblade.demo.MapReduceProcessorDemo', |
||||
prop: 'processorInfo', |
||||
type: 'input', |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请输入处理器参数', |
||||
trigger: 'blur', |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '任务参数', |
||||
labelTip: '方法入参 TaskContext 对象的 json 字段', |
||||
prop: 'jobParams', |
||||
type: 'input', |
||||
span: 24, |
||||
}, |
||||
{ |
||||
label: '任务描述', |
||||
prop: 'jobDescription', |
||||
type: 'textarea', |
||||
minRows: 3, |
||||
span: 24, |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '高级配置', |
||||
prop: 'templateSetting', |
||||
icon: 'el-icon-copy-document', |
||||
column: [ |
||||
{ |
||||
label: '最大实例数', |
||||
labelTip: |
||||
'该任务同时执行的数量(任务和实例就像是类和对象的关系,任务被调度执行后被称为实例)', |
||||
prop: 'maxInstanceNum', |
||||
type: 'number', |
||||
value: 0, |
||||
}, |
||||
{ |
||||
label: '单机线程并发数', |
||||
labelTip: '该实例执行过程中每个 Worker 使用的线程数量', |
||||
prop: 'concurrency', |
||||
type: 'number', |
||||
value: 5, |
||||
}, |
||||
{ |
||||
label: '任务实例运行时间限制', |
||||
labelTip: '0 代表无任何限制,超时会被打断并判定为执行失败', |
||||
prop: 'instanceTimeLimit', |
||||
type: 'number', |
||||
value: 0, |
||||
}, |
||||
{ |
||||
label: '任务实例重试次数', |
||||
labelTip: '任务实例重试次数,整个任务失败时重试,代价大,不推荐使用', |
||||
prop: 'instanceRetryNum', |
||||
type: 'number', |
||||
value: 0, |
||||
}, |
||||
{ |
||||
label: '任务作业重试次数', |
||||
labelTip: 'Task 重试次数,每个子 Task 失败后单独重试,代价小,推荐使用', |
||||
prop: 'taskRetryNum', |
||||
type: 'number', |
||||
value: 0, |
||||
}, |
||||
{ |
||||
label: '最低CPU核心', |
||||
labelTip: |
||||
'最小可用 CPU 核心数,CPU 可用核心数小于该值的 Worker 将不会执行该任务,0 代表无任何限制', |
||||
prop: 'minCpuCores', |
||||
type: 'number', |
||||
value: 0, |
||||
}, |
||||
{ |
||||
label: '最低内存(GB)', |
||||
labelTip: '可用内存小于该值的Worker 将不会执行该任务,0 代表无任何限制', |
||||
prop: 'minMemorySpace', |
||||
type: 'number', |
||||
value: 0, |
||||
}, |
||||
{ |
||||
label: '最低磁盘空间(GB)', |
||||
labelTip: '可用磁盘空间小于该值的Worker 将不会执行该任务,0 代表无任何限制', |
||||
prop: 'minDiskSpace', |
||||
type: 'number', |
||||
value: 0, |
||||
}, |
||||
{ |
||||
label: '执行机器地址', |
||||
labelTip: '设置该参数后只有列表中的机器允许执行该任务,空代表不指定机器', |
||||
prop: 'designatedWorkers', |
||||
type: 'input', |
||||
}, |
||||
{ |
||||
label: '最大执行机器数量', |
||||
labelTip: '限定调动执行的机器数量,0代表无限制', |
||||
prop: 'maxWorkerCount', |
||||
type: 'number', |
||||
value: 0, |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '其他配置', |
||||
prop: 'codingSetting', |
||||
icon: 'el-icon-printer', |
||||
column: [ |
||||
{ |
||||
label: '报警人员ID列表', |
||||
labelTip: '接收报警的用户ID列表', |
||||
prop: 'notifyUserIds', |
||||
type: 'input', |
||||
}, |
||||
{ |
||||
label: '错误阈值', |
||||
labelTip: '错误阈值,0代表不限制', |
||||
prop: 'alertThreshold', |
||||
type: 'number', |
||||
value: 0, |
||||
}, |
||||
{ |
||||
label: '统计窗口(s)', |
||||
labelTip: '统计的窗口长度(s),0代表不限制', |
||||
prop: 'statisticWindowLen', |
||||
type: 'number', |
||||
value: 0, |
||||
}, |
||||
{ |
||||
label: '沉默窗口(s)', |
||||
labelTip: '沉默时间窗口(s),0代表不限制', |
||||
prop: 'silenceWindowLen', |
||||
type: 'number', |
||||
value: 0, |
||||
}, |
||||
{ |
||||
label: '日志配置', |
||||
labelTip: '日志配置', |
||||
prop: 'logType', |
||||
type: 'select', |
||||
value: 1, |
||||
dicData: logTypeDic, |
||||
}, |
||||
{ |
||||
label: '日志级别', |
||||
labelTip: '日志级别', |
||||
prop: 'logLevel', |
||||
type: 'select', |
||||
value: 2, |
||||
dicData: logLevelDic, |
||||
}, |
||||
{ |
||||
label: '扩展字段', |
||||
labelTip: '供开发者使用,用于功能扩展,powerjob 自身不会使用该字段', |
||||
prop: 'extra', |
||||
type: 'textarea', |
||||
minRows: 3, |
||||
span: 24, |
||||
}, |
||||
], |
||||
}, |
||||
], |
||||
}; |
||||
@ -0,0 +1,77 @@ |
||||
export default { |
||||
height: 'auto', |
||||
calcHeight: 30, |
||||
tip: false, |
||||
searchShow: true, |
||||
searchMenuSpan: 6, |
||||
border: true, |
||||
index: true, |
||||
viewBtn: true, |
||||
selection: true, |
||||
labelWidth: 100, |
||||
menuWidth: 350, |
||||
dialogClickModal: false, |
||||
column: [ |
||||
{ |
||||
label: '服务名称', |
||||
prop: 'jobServerName', |
||||
type: 'input', |
||||
span: 24, |
||||
search: true, |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请输入服务名称', |
||||
trigger: 'blur', |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '服务器地址', |
||||
prop: 'jobServerUrl', |
||||
type: 'input', |
||||
span: 24, |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请输入服务器地址', |
||||
trigger: 'blur', |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '应用名称', |
||||
prop: 'jobAppName', |
||||
type: 'input', |
||||
span: 24, |
||||
search: true, |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请输入应用名称', |
||||
trigger: 'blur', |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '应用密码', |
||||
prop: 'jobAppPassword', |
||||
type: 'input', |
||||
span: 24, |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请输入应用密码', |
||||
trigger: 'blur', |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '任务备注', |
||||
prop: 'jobRemark', |
||||
type: 'textarea', |
||||
minRows: 3, |
||||
span: 24, |
||||
}, |
||||
], |
||||
}; |
||||
@ -0,0 +1,297 @@ |
||||
<template> |
||||
<basic-container> |
||||
<avue-crud :option="option" |
||||
:table-loading="loading" |
||||
:data="data" |
||||
:page.sync="page" |
||||
:search.sync="search" |
||||
ref="crud" |
||||
v-model="form" |
||||
:permission="permissionList" |
||||
@row-update="rowUpdate" |
||||
@row-save="rowSave" |
||||
@row-del="rowDel" |
||||
@search-change="searchChange" |
||||
@search-reset="searchReset" |
||||
@selection-change="selectionChange" |
||||
@current-change="currentChange" |
||||
@size-change="sizeChange" |
||||
@refresh-change="refreshChange" |
||||
@on-load="onLoad" |
||||
> |
||||
<template slot="menuLeft"> |
||||
<el-button |
||||
type="danger" |
||||
size="small" |
||||
icon="el-icon-delete" |
||||
plain |
||||
v-if="permission.jobinfo_delete" |
||||
@click="handleDelete" |
||||
>删 除 |
||||
</el-button> |
||||
<el-button |
||||
type="info" |
||||
size="small" |
||||
plain |
||||
icon="el-icon-sort" |
||||
@click="handleSync" |
||||
>数 据 同 步 |
||||
</el-button> |
||||
</template> |
||||
<template slot-scope="{row}" slot="menu"> |
||||
<el-button type="text" size="small" icon="el-icon-video-play" @click="handleRun(scope.row)" |
||||
>运 行 |
||||
</el-button> |
||||
</template> |
||||
<template slot-scope="{row}" slot="enable"> |
||||
<el-switch |
||||
v-model="row.enable" |
||||
inline-prompt |
||||
@change="slotChange(row)" |
||||
active-text="" |
||||
inactive-text="" |
||||
:active-value="1" |
||||
:inactive-value="0" |
||||
/> |
||||
</template> |
||||
</avue-crud> |
||||
</basic-container> |
||||
</template> |
||||
|
||||
<script> |
||||
import { getList, getDetail, add, update, remove, change, run, sync } from '@/api/job/jobinfo'; |
||||
import option from '@/option/job/jobinfo'; |
||||
import { mapGetters } from 'vuex'; |
||||
import 'nprogress/nprogress.css'; |
||||
import func from '@/util/func'; |
||||
|
||||
export default { |
||||
data() { |
||||
return { |
||||
form: {}, |
||||
query: {}, |
||||
search: {}, |
||||
loading: true, |
||||
page: { |
||||
pageSize: 10, |
||||
currentPage: 1, |
||||
total: 0, |
||||
}, |
||||
selectionList: [], |
||||
option: option, |
||||
data: [], |
||||
}; |
||||
}, |
||||
computed: { |
||||
...mapGetters(['permission']), |
||||
permissionList() { |
||||
return { |
||||
addBtn: this.vaildData(this.permission.jobinfo_add, false), |
||||
viewBtn: this.vaildData(this.permission.jobinfo_view, false), |
||||
delBtn: this.vaildData(this.permission.jobinfo_delete, false), |
||||
editBtn: this.vaildData(this.permission.jobinfo_edit, false), |
||||
}; |
||||
}, |
||||
ids() { |
||||
let ids = []; |
||||
this.selectionList.forEach(ele => { |
||||
ids.push(ele.id); |
||||
}); |
||||
return ids.join(','); |
||||
}, |
||||
}, |
||||
methods: { |
||||
rowSave(row, done, loading) { |
||||
if (func.isArrayAndNotEmpty(row.lifecycle)) { |
||||
const lifecycleStart = row.lifecycle[0]; |
||||
const lifecycleEnd = row.lifecycle[1]; |
||||
if (!func.isUndefined(lifecycleStart) && !func.isUndefined(lifecycleEnd)) { |
||||
row.lifecycle = lifecycleStart + ',' + lifecycleEnd; |
||||
} |
||||
} else { |
||||
row.lifecycle = ''; |
||||
} |
||||
add(row).then( |
||||
() => { |
||||
this.onLoad(this.page); |
||||
this.$message({ |
||||
type: 'success', |
||||
message: '操作成功!', |
||||
}); |
||||
done(); |
||||
}, |
||||
error => { |
||||
loading(); |
||||
window.console.log(error); |
||||
} |
||||
); |
||||
}, |
||||
rowUpdate(row, index, done, loading) { |
||||
if (func.isArrayAndNotEmpty(row.lifecycle)) { |
||||
const lifecycleStart = row.lifecycle[0]; |
||||
const lifecycleEnd = row.lifecycle[1]; |
||||
if (!func.isUndefined(lifecycleStart) && !func.isUndefined(lifecycleEnd)) { |
||||
row.lifecycle = lifecycleStart + ',' + lifecycleEnd; |
||||
} |
||||
} |
||||
update(row).then( |
||||
() => { |
||||
this.onLoad(this.page); |
||||
this.$message({ |
||||
type: 'success', |
||||
message: '操作成功!', |
||||
}); |
||||
done(); |
||||
}, |
||||
error => { |
||||
loading(); |
||||
console.log(error); |
||||
} |
||||
); |
||||
}, |
||||
rowDel(row) { |
||||
this.$confirm('确定将选择数据删除?', { |
||||
confirmButtonText: '确定', |
||||
cancelButtonText: '取消', |
||||
type: 'warning', |
||||
}) |
||||
.then(() => { |
||||
return remove(row.id); |
||||
}) |
||||
.then(() => { |
||||
this.onLoad(this.page); |
||||
this.$message({ |
||||
type: 'success', |
||||
message: '操作成功!', |
||||
}); |
||||
}); |
||||
}, |
||||
handleDelete() { |
||||
if (this.selectionList.length === 0) { |
||||
this.$message.warning('请选择至少一条数据'); |
||||
return; |
||||
} |
||||
this.$confirm('确定将选择数据删除?', { |
||||
confirmButtonText: '确定', |
||||
cancelButtonText: '取消', |
||||
type: 'warning', |
||||
}) |
||||
.then(() => { |
||||
return remove(this.ids); |
||||
}) |
||||
.then(() => { |
||||
this.onLoad(this.page); |
||||
this.$message({ |
||||
type: 'success', |
||||
message: '操作成功!', |
||||
}); |
||||
this.$refs.crud.toggleSelection(); |
||||
}); |
||||
}, |
||||
handleSync() { |
||||
this.$confirm('确定进行数据双向同步?', { |
||||
confirmButtonText: '确定', |
||||
cancelButtonText: '取消', |
||||
type: 'warning', |
||||
}) |
||||
.then(() => { |
||||
return sync(); |
||||
}) |
||||
.then(() => { |
||||
this.onLoad(this.page); |
||||
this.$message({ |
||||
type: 'success', |
||||
message: '操作成功!', |
||||
}); |
||||
}); |
||||
}, |
||||
handleRun(row) { |
||||
this.$confirm('运行后将创建一个实例执行,是否继续?', { |
||||
confirmButtonText: '确定', |
||||
cancelButtonText: '取消', |
||||
type: 'warning', |
||||
}) |
||||
.then(() => { |
||||
return run(row); |
||||
}) |
||||
.then(() => { |
||||
this.$message({ |
||||
type: 'success', |
||||
message: '运行成功!', |
||||
}); |
||||
}); |
||||
}, |
||||
slotChange(row) { |
||||
if (!row.id) { |
||||
return; |
||||
} |
||||
change(row).then( |
||||
() => { |
||||
this.onLoad(this.page); |
||||
this.$message({ |
||||
type: 'success', |
||||
message: '操作成功!', |
||||
}); |
||||
}, |
||||
error => { |
||||
window.console.log(error); |
||||
} |
||||
); |
||||
}, |
||||
beforeOpen(done, type) { |
||||
if (['edit', 'view'].includes(type)) { |
||||
getDetail(this.form.id).then(res => { |
||||
this.form = res.data.data; |
||||
}); |
||||
} |
||||
done(); |
||||
}, |
||||
searchReset() { |
||||
this.query = {}; |
||||
this.onLoad(this.page); |
||||
}, |
||||
searchChange(params, done) { |
||||
this.query = params; |
||||
this.page.currentPage = 1; |
||||
this.onLoad(this.page, params); |
||||
done(); |
||||
}, |
||||
selectionChange(list) { |
||||
this.selectionList = list; |
||||
}, |
||||
selectionClear() { |
||||
this.selectionList = []; |
||||
this.$refs.crud.toggleSelection(); |
||||
}, |
||||
currentChange(currentPage) { |
||||
this.page.currentPage = currentPage; |
||||
}, |
||||
sizeChange(pageSize) { |
||||
this.page.pageSize = pageSize; |
||||
}, |
||||
refreshChange() { |
||||
this.onLoad(this.page, this.query); |
||||
}, |
||||
onLoad(page) { |
||||
this.loading = true; |
||||
|
||||
const { jobServerId, jobName } = this.query; |
||||
|
||||
let values = { |
||||
jobServerId_like: jobServerId, |
||||
jobName_like: jobName, |
||||
}; |
||||
|
||||
getList(page.currentPage, page.pageSize, values).then(res => { |
||||
const data = res.data.data; |
||||
this.page.total = data.total; |
||||
this.data = data.records; |
||||
this.loading = false; |
||||
this.selectionClear(); |
||||
}); |
||||
}, |
||||
}, |
||||
}; |
||||
</script> |
||||
|
||||
<style></style> |
||||
@ -0,0 +1,241 @@ |
||||
<template> |
||||
<basic-container> |
||||
<avue-crud :option="option" |
||||
:table-loading="loading" |
||||
:data="data" |
||||
:page.sync="page" |
||||
:search.sync="search" |
||||
ref="crud" |
||||
v-model="form" |
||||
:permission="permissionList" |
||||
@row-update="rowUpdate" |
||||
@row-save="rowSave" |
||||
@row-del="rowDel" |
||||
:before-open="beforeOpen" |
||||
@search-change="searchChange" |
||||
@search-reset="searchReset" |
||||
@selection-change="selectionChange" |
||||
@current-change="currentChange" |
||||
@size-change="sizeChange" |
||||
@refresh-change="refreshChange" |
||||
@on-load="onLoad" |
||||
> |
||||
<template slot="menuLeft"> |
||||
<el-button |
||||
type="danger" |
||||
size="small" |
||||
icon="el-icon-delete" |
||||
plain |
||||
v-if="permission.jobserver_delete" |
||||
@click="handleDelete" |
||||
>删 除 |
||||
</el-button> |
||||
<el-button |
||||
type="info" |
||||
size="small" |
||||
plain |
||||
icon="el-icon-sort" |
||||
@click="handleSync" |
||||
>数 据 同 步 |
||||
</el-button> |
||||
</template> |
||||
<template slot-scope="{row}" slot="menu"> |
||||
<el-button type="text" size="small" icon="el-icon-video-play" @click="handleLink(row)" |
||||
>服务跳转 |
||||
</el-button> |
||||
</template> |
||||
</avue-crud> |
||||
</basic-container> |
||||
</template> |
||||
|
||||
<script> |
||||
import { getList, getDetail, add, update, remove, sync } from '@/api/job/jobserver'; |
||||
import option from '@/option/job/jobserver'; |
||||
import { mapGetters } from 'vuex'; |
||||
import 'nprogress/nprogress.css'; |
||||
import func from '@/util/func'; |
||||
|
||||
export default { |
||||
data() { |
||||
return { |
||||
form: {}, |
||||
query: {}, |
||||
search: {}, |
||||
loading: true, |
||||
page: { |
||||
pageSize: 10, |
||||
currentPage: 1, |
||||
total: 0, |
||||
}, |
||||
selectionList: [], |
||||
option: option, |
||||
data: [], |
||||
}; |
||||
}, |
||||
computed: { |
||||
...mapGetters(['permission']), |
||||
permissionList() { |
||||
return { |
||||
addBtn: this.vaildData(this.permission.jobserver_add, false), |
||||
viewBtn: this.vaildData(this.permission.jobserver_view, false), |
||||
delBtn: this.vaildData(this.permission.jobserver_delete, false), |
||||
editBtn: this.vaildData(this.permission.jobserver_edit, false), |
||||
}; |
||||
}, |
||||
ids() { |
||||
let ids = []; |
||||
this.selectionList.forEach(ele => { |
||||
ids.push(ele.id); |
||||
}); |
||||
return ids.join(','); |
||||
}, |
||||
}, |
||||
methods: { |
||||
rowSave(row, done, loading) { |
||||
add(row).then( |
||||
() => { |
||||
this.onLoad(this.page); |
||||
this.$message({ |
||||
type: 'success', |
||||
message: '操作成功!', |
||||
}); |
||||
done(); |
||||
}, |
||||
error => { |
||||
loading(); |
||||
window.console.log(error); |
||||
} |
||||
); |
||||
}, |
||||
rowUpdate(row, index, done, loading) { |
||||
update(row).then( |
||||
() => { |
||||
this.onLoad(this.page); |
||||
this.$message({ |
||||
type: 'success', |
||||
message: '操作成功!', |
||||
}); |
||||
done(); |
||||
}, |
||||
error => { |
||||
loading(); |
||||
console.log(error); |
||||
} |
||||
); |
||||
}, |
||||
rowDel(row) { |
||||
this.$confirm('确定将选择数据删除?', { |
||||
confirmButtonText: '确定', |
||||
cancelButtonText: '取消', |
||||
type: 'warning', |
||||
}) |
||||
.then(() => { |
||||
return remove(row.id); |
||||
}) |
||||
.then(() => { |
||||
this.onLoad(this.page); |
||||
this.$message({ |
||||
type: 'success', |
||||
message: '操作成功!', |
||||
}); |
||||
}); |
||||
}, |
||||
handleDelete() { |
||||
if (this.selectionList.length === 0) { |
||||
this.$message.warning('请选择至少一条数据'); |
||||
return; |
||||
} |
||||
this.$confirm('确定将选择数据删除?', { |
||||
confirmButtonText: '确定', |
||||
cancelButtonText: '取消', |
||||
type: 'warning', |
||||
}) |
||||
.then(() => { |
||||
return remove(this.ids); |
||||
}) |
||||
.then(() => { |
||||
this.onLoad(this.page); |
||||
this.$message({ |
||||
type: 'success', |
||||
message: '操作成功!', |
||||
}); |
||||
this.$refs.crud.toggleSelection(); |
||||
}); |
||||
}, |
||||
handleLink(row) { |
||||
window.open(func.formatUrl(row.jobServerUrl)); |
||||
}, |
||||
handleSync() { |
||||
this.$confirm('确定进行数据双向同步?', { |
||||
confirmButtonText: '确定', |
||||
cancelButtonText: '取消', |
||||
type: 'warning', |
||||
}) |
||||
.then(() => { |
||||
return sync(); |
||||
}) |
||||
.then(() => { |
||||
this.onLoad(this.page); |
||||
this.$message({ |
||||
type: 'success', |
||||
message: '操作成功!', |
||||
}); |
||||
}); |
||||
}, |
||||
beforeOpen(done, type) { |
||||
if (['edit', 'view'].includes(type)) { |
||||
getDetail(this.form.id).then(res => { |
||||
this.form = res.data.data; |
||||
}); |
||||
} |
||||
done(); |
||||
}, |
||||
searchReset() { |
||||
this.query = {}; |
||||
this.onLoad(this.page); |
||||
}, |
||||
searchChange(params, done) { |
||||
this.query = params; |
||||
this.page.currentPage = 1; |
||||
this.onLoad(this.page, params); |
||||
done(); |
||||
}, |
||||
selectionChange(list) { |
||||
this.selectionList = list; |
||||
}, |
||||
selectionClear() { |
||||
this.selectionList = []; |
||||
this.$refs.crud.toggleSelection(); |
||||
}, |
||||
currentChange(currentPage) { |
||||
this.page.currentPage = currentPage; |
||||
}, |
||||
sizeChange(pageSize) { |
||||
this.page.pageSize = pageSize; |
||||
}, |
||||
refreshChange() { |
||||
this.onLoad(this.page, this.query); |
||||
}, |
||||
onLoad(page) { |
||||
this.loading = true; |
||||
|
||||
const { jobServerName, jobAppName } = this.query; |
||||
|
||||
let values = { |
||||
jobServerName_like: jobServerName, |
||||
jobAppName_like: jobAppName, |
||||
}; |
||||
|
||||
getList(page.currentPage, page.pageSize, values).then(res => { |
||||
const data = res.data.data; |
||||
this.page.total = data.total; |
||||
this.data = data.records; |
||||
this.loading = false; |
||||
this.selectionClear(); |
||||
}); |
||||
}, |
||||
}, |
||||
}; |
||||
</script> |
||||
|
||||
<style></style> |
||||
Loading…
Reference in new issue