Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
079438c
后端:添加rpyc+apscheduler服务
4linuxfun Feb 24, 2023
30c6b8e
后端:rpyc+apscheduler服务 fix #100
4linuxfun Feb 24, 2023
46d69e6
后端: 添加任务管理对应接口 fix #100
4linuxfun Feb 24, 2023
9532018
前端:任务中心-任务管理:功能实现 fix #100
4linuxfun Feb 24, 2023
d4e6530
前端:组件封装
4linuxfun Feb 24, 2023
6057efe
后端:通过rpyc实现apscheduler的远程调用,进行任务的管理
4linuxfun Jun 19, 2023
065e8f0
后端:添加Job相关model和crud
4linuxfun Jun 19, 2023
d86d098
后端:添加get_uid依赖
4linuxfun Jun 20, 2023
b9c9caf
后端:修改使用get_uid获取uid
4linuxfun Jun 20, 2023
ce6ee7c
后端:增加get_redis函数,用户获取redis连接
4linuxfun Jun 20, 2023
39ca9f2
后端:实现ws获取redis中的日志信息
4linuxfun Jun 20, 2023
b0b99bf
后端:修改job项目目录
4linuxfun Jun 20, 2023
c297407
后端:添加任务管理相关借口
4linuxfun Jun 20, 2023
9980ee6
前端:实现任务管理相关功能页面
4linuxfun Jun 20, 2023
95d60e5
后端:scheduler后端task进行执行主机任务分离,方便后期扩展执行远程ssh
4linuxfun Jun 28, 2023
80a277f
后端:job增加targets参数,用于指定任务执行主机
4linuxfun Jun 28, 2023
0a438e2
前端:修复升级element plus后中文乱码问题
4linuxfun Jun 28, 2023
cb45acf
前端:任务管理增加targets参数
4linuxfun Jun 28, 2023
f0e7cc5
后端:scheduer增加get_user_jobs,通过uid和job_name快速获取用户的job列表
4linuxfun Jun 30, 2023
2486db8
后端:scheduler task增加时间值
4linuxfun Jun 30, 2023
7e9e4bf
后端:优化任务获取逻辑
4linuxfun Jun 30, 2023
6cee979
后端:重新定义Job相关模型
4linuxfun Jun 30, 2023
0bb4ba9
前端:优化任务管理页面相关代码
4linuxfun Jun 30, 2023
1ce9cc8
前端:任务日志页面展示
4linuxfun Jun 30, 2023
7fd5c91
更新前后端项目依赖版本
4linuxfun Dec 21, 2023
3dc9ea1
update:更新依赖库版本
4linuxfun Jan 3, 2024
58d095b
后端:修复更新pydantic后属性变更
4linuxfun Jan 3, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
前端:实现任务管理相关功能页面
  • Loading branch information
4linuxfun committed Jun 20, 2023
commit 9980ee6686f81feed5717fea4321a8842174bb10
4 changes: 2 additions & 2 deletions www/src/api/jobs.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ export const PostNewCronJob = (dict) => POST('/api/jobs/', dict)
export const GetJobList = () => GET('/api/jobs/')
export const DelJob = (jobId) => DELETE('/api/jobs/' + jobId)
export const PutCronJob = (job) => PUT('/api/jobs/', job)
export const PauseJob = (jobId) => GET('/api/jobs/pause/' + jobId)
export const ResumeJob = (jobId) => GET('/api/jobs/resume/' + jobId)
export const SwitchJob = (jobId) => GET('/api/jobs/switch/' + jobId)
export const GetLogs = (jobId) => GET('/api/jobs/logs')
152 changes: 103 additions & 49 deletions www/src/views/jobs/JobManage/AddJob.vue
Original file line number Diff line number Diff line change
@@ -1,42 +1,76 @@
<template>
<el-form v-model="addForm" label-position="top">
<el-form-item label="任务名称">
<el-input v-model="addForm.job_id"/>
</el-form-item>
<el-form-item label="执行策略">
<el-tabs v-model="addForm.trigger" type="border-card" style="width: 100%">
<el-tab-pane label="普通任务" name="date">
<el-input/>
<el-date-picker placeholder="执行时间"/>
</el-tab-pane>
<el-tab-pane label="定时任务" name="cron">
<el-input v-model="addForm.cron_args.cron" placeholder="格式:分 时 日 月 周"/>
<el-row>
<el-col :span="12">
<el-date-picker v-model="addForm.cron_args.start_date" style="width: 100%;" type="datetime"
value-format="YYYY-MM-DD HH:mm:ss" placeholder="开始时间"/>
</el-col>
<el-col :span="12">
<el-date-picker v-model="addForm.cron_args.end_date" style="width: 100%;" type="datetime"
value-format="YYYY-MM-DD HH:mm:ss" placeholder="结束时间"/>
</el-col>
</el-row>
</el-tab-pane>
</el-tabs>
</el-form-item>
<el-form-item label="执行方式">
<el-tabs type="border-card" style="width: 100%">
<el-tab-pane label="单行命令">
<el-input v-model="addForm.command" style="padding: 5px" placeholder="请输入执行命令"/>
</el-tab-pane>
<el-tab-pane label="脚本">在脚本页面创建脚本,然后这里选择对应脚本</el-tab-pane>
</el-tabs>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleAdd">提交</el-button>
<el-button>取消</el-button>
</el-form-item>
</el-form>
<div style="margin: 10px 10%;">
<el-steps :space="200" :active="active" finish-status="success" simple>
<el-step title="创建任务"/>
<el-step title="选择执行对象"/>
<el-step title="设置触发器"/>
</el-steps>

<el-form v-model="addForm" style="margin: 10px;">

<!--任务信息-->
<div v-show="active===0" style="margin-top: 20px;">
<el-form-item label="任务名称">
<el-input v-model="addForm.name"/>
</el-form-item>
<el-form-item label="执行方式">
<el-tabs type="border-card" style="width: 100%">
<el-tab-pane label="单行命令">
<el-input v-model="addForm.command" style="padding: 5px" placeholder="请输入执行命令"/>
</el-tab-pane>
<el-tab-pane label="脚本">在脚本页面创建脚本,然后这里选择对应脚本</el-tab-pane>
</el-tabs>
</el-form-item>
</div>

<!--执行对象-->
<div v-show="active === 1" style="margin-top: 20px;">
<el-form-item label="执行对象">

</el-form-item>
</div>

<!--执行策略页面-->
<div v-show="active === 2" style="margin-top: 20px;">
<el-row>
<el-col :span="18" :offset="4">
<el-tabs tab-position="left" v-model="addForm.trigger">
<el-tab-pane label="定时任务" name="date">
<el-form-item>
<span>执行时间</span>
<el-date-picker v-model="dateArgs" style="width: 100%;" type="datetime"
value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择执行时间"/>
<span style="color:#99a9bf">不指定时间表示立即执行。</span>
</el-form-item>

</el-tab-pane>
<el-tab-pane label="周期任务" name="cron">
<el-form-item>
<span>执行规则</span>
<el-input v-model="cronArgs.cron" placeholder="格式:分 时 日 月 周"/>
<span>开始时间</span>
<el-date-picker v-model="cronArgs.start_date" style="width: 100%;" type="datetime"
value-format="YYYY-MM-DD HH:mm:ss" placeholder="开始时间"/>
<span>结束时间</span>
<el-date-picker v-model="cronArgs.end_date" style="width: 100%;" type="datetime"
value-format="YYYY-MM-DD HH:mm:ss" placeholder="结束时间"/>

</el-form-item>
</el-tab-pane>
</el-tabs>
</el-col>
</el-row>
</div>


<el-form-item>
<el-button v-if="active===2" type="primary" @click="handleAdd">提交</el-button>
<el-button v-if="active !==2" type="primary" @click="active++">下一步</el-button>
<el-button v-if="active !== 0" @click="active--">上一步</el-button>
</el-form-item>
</el-form>
</div>

</template>

<script>
Expand All @@ -46,33 +80,50 @@
</script>

<script setup>
import {ref, reactive, onMounted} from 'vue'
import {ref, reactive, onMounted, watch} from 'vue'
import {PostNewCronJob, PutCronJob} from '@/api/jobs'
import {ElNotification} from 'element-plus'

const props = defineProps(['job', 'visible'])
const emit = defineEmits(['update:visible'])

const active = ref(0)
const addForm = reactive({
job_id: null,
trigger: 'cron',
date_args: {
run_date: null
},
cron_args: {
cron: null,
start_date: null,
end_date: null,
},
id: null,
name: null,
trigger: 'date',
trigger_args: null,
command: null,
type: '0'
})

const intervalArgs = ref(null)
const dateArgs = ref(null)
const cronArgs = reactive({
cron: null,
start_date: null,
end_date: null
})

if (props.job !== null) {
Object.assign(addForm, props.job)
if (props.job.trigger === 'cron') {
Object.assign(cronArgs, props.job.trigger_args)
} else {
dateArgs.value = props.job.trigger_args
}

}


function handleAdd() {
if (addForm.trigger === 'interval') {
addForm.trigger_args = intervalArgs.value
} else if (addForm.trigger == 'date') {
addForm.trigger_args = dateArgs.value
} else {
addForm.trigger_args = cronArgs
}
if (props.job === null) {
PostNewCronJob(addForm).then(response => {
ElNotification({
Expand All @@ -98,6 +149,9 @@
emit('update:visible', false)
}

watch(() => addForm.trigger, (trigger) => {
console.log(trigger)
})

</script>

Expand Down
75 changes: 38 additions & 37 deletions www/src/views/jobs/JobManage/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<el-row>
<el-form v-model="search" inline>
<el-form-item label="任务名">
<el-input v-model="search.job_id"/>
<el-input v-model="search.job_name"/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSearch">查询</el-button>
Expand All @@ -12,45 +12,43 @@
</el-row>
<el-table :data="tableData" border>
<el-table-column type="index" label="#"/>
<el-table-column label="任务ID" prop="job_id"/>
<el-table-column label="执行命令" prop="command"/>
<el-table-column label="定时器(分 时 日 月 周)">
<template #default="scope">
<span>{{ scope.row.cron_args.cron }}</span>
</template>
</el-table-column>
<el-table-column label="开始时间">
<template #default="scope">
<span>{{ scope.row.cron_args.start_date }}</span>
</template>
</el-table-column>
<el-table-column label="结束时间">
<el-table-column label="任务ID" prop="id"/>
<el-table-column label="任务名" prop="name"/>
<el-table-column label="类型">
<template #default="scope">
<span>{{ scope.row.cron_args.end_date }}</span>
<el-tag v-if="scope.row.trigger === 'cron'" type="success">Cron</el-tag>
<el-tag v-else-if="scope.row.trigger === 'date'" type="info">Date</el-tag>
<el-tag v-else type="warning">Interval</el-tag>
</template>
</el-table-column>
<el-table-column label="状态" prop="status">
<el-table-column label="执行命令" prop="command"/>
<el-table-column label="状态">
<template #default="scope">
<el-switch v-model="scope.row.status" active-value="running" inactive-value="stop"
@change="handleStatus(scope.row)"/>
@change="handleStatus(scope.row.id)"/>
</template>
</el-table-column>
<el-table-column label="操作">
<template #default="scope">
<el-button type="primary" size="small" @click="handleEdit(scope.row)">编辑</el-button>
<el-button type="danger" size="small" @click="handleDel(scope.row.job_id)">删除</el-button>
<el-button type="primary" size="small" @click="handleLogs(scope.row.id)">日志</el-button>
<el-button type="danger" size="small" @click="handleDel(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>

<el-pagination v-model:current-page="currentPage" v-model:page-size="pageSize" :total="total" background
layout="total,prev,pager,next,sizes,jumper"
style="margin-top: 10px;"
/>
<el-pagination v-model:current-page="currentPage" v-model:page-size="pageSize" :total="total" background
layout="total,prev,pager,next,sizes,jumper"
style="margin-top: 10px;"
/>

<el-drawer v-model="addDrawer" title="任务编辑" destroy-on-close>
<el-dialog v-model="addDrawer" title="任务编辑" destroy-on-close>
<add-job v-model:visible="addDrawer" :job="jobInfo"/>
</el-drawer>
</el-dialog>

<el-dialog v-model="logDrawer" title="任务记录" destroy-on-close>
<add-job v-model:visible="logDrawer" :job="jobId"/>
</el-dialog>
</template>

<script>
Expand All @@ -63,19 +61,19 @@

import {ref, onMounted, watch} from 'vue'
import AddJob from '@/views/jobs/JobManage/AddJob.vue'
import {DelJob, GetJobList, PauseJob, ResumeJob} from '@/api/jobs'
import {ElMessage, ElMessageBox} from 'element-plus'
import {DelJob, GetJobList, SwitchJob} from '@/api/jobs'
import {ConfirmDel} from '@/utils/request'
import usePagination from '@/composables/usePagination'

const addDrawer = ref(false)
const logDrawer = ref(false)
let jobInfo = null

const searchForm = {
job_id: null,
job_name: null,
}

const {
const {
search,
tableData,
currentPage,
Expand All @@ -91,17 +89,20 @@
addDrawer.value = true
}

function handleStatus(job) {
if (job.status === 'stop') {
PauseJob(job.job_id)
} else {
ResumeJob(job.job_id)
}
searchJobs()
function handleStatus(jobId) {
SwitchJob(jobId).then(() => {
freshCurrentPage()
}).catch(error=>{
freshCurrentPage()
})
}

function handleDel(job) {
ConfirmDel('是否确定要删除任务:' + job.name, DelJob, job.id)
}

function handleDel(jobId) {
ConfirmDel('是否确定要删除任务:' + jobId, DelJob, jobId)
function handleLogs(jobId) {
logDrawer.value = true
}

watch(addDrawer, (newValue) => {
Expand Down