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