视图修改、接口修改

This commit is contained in:
2025-10-28 19:04:35 +08:00
parent 98c73632bd
commit c5c134fbb3
96 changed files with 7122 additions and 4194 deletions

View File

@@ -1,245 +1,247 @@
<template>
<div class="task-management">
<div class="header">
<h2>定时任务管理</h2>
<el-button type="primary" @click="handleAdd">
<el-icon><Plus /></el-icon>
新增任务
</el-button>
</div>
<!-- 搜索筛选区域 -->
<div class="search-bar">
<div class="search-item">
<span class="search-label">任务名称</span>
<el-input
v-model="searchForm.taskName"
placeholder="请输入任务名称"
clearable
@keyup.enter="handleSearch"
style="width: 200px"
/>
</div>
<div class="search-item">
<span class="search-label">任务分组</span>
<el-input
v-model="searchForm.taskGroup"
placeholder="请输入任务分组"
clearable
@keyup.enter="handleSearch"
style="width: 200px"
/>
</div>
<div class="search-item">
<span class="search-label">状态</span>
<el-select
v-model="searchForm.status"
placeholder="请选择状态"
clearable
style="width: 150px"
>
<el-option label="运行中" :value="1" />
<el-option label="已暂停" :value="0" />
</el-select>
</div>
<div class="search-actions">
<el-button type="primary" @click="handleSearch">
<el-icon><Search /></el-icon>
搜索
</el-button>
<el-button @click="handleReset">
<el-icon><Refresh /></el-icon>
重置
<AdminLayout title="定时任务" subtitle="定时任务管理">
<div class="task-management">
<div class="header">
<h2>定时任务管理</h2>
<el-button type="primary" @click="handleAdd">
<el-icon><Plus /></el-icon>
新增任务
</el-button>
</div>
</div>
<!-- 任务列表 -->
<el-table
:data="taskList"
style="width: 100%"
v-loading="loading"
border
stripe
>
<el-table-column prop="taskName" label="任务名称" min-width="150" />
<el-table-column prop="taskGroup" label="任务分组" width="120" />
<el-table-column prop="beanName" label="Bean名称" min-width="150" />
<el-table-column prop="methodName" label="方法名称" width="120" />
<el-table-column prop="cronExpression" label="Cron表达式" min-width="150" />
<el-table-column label="状态" width="100">
<template #default="{ row }">
<el-tag :type="row.status === 1 ? 'success' : 'info'" size="small">
{{ row.status === 1 ? '运行中' : '已暂停' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="并发" width="80">
<template #default="{ row }">
<el-tag :type="row.concurrent === 1 ? 'success' : 'warning'" size="small">
{{ row.concurrent === 1 ? '允许' : '禁止' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" width="180" />
<el-table-column label="操作" width="300" fixed="right">
<template #default="{ row }">
<el-button
v-if="row.status === 0"
type="success"
size="small"
@click="handleStart(row)"
>
启动
</el-button>
<el-button
v-else
type="warning"
size="small"
@click="handlePause(row)"
>
暂停
</el-button>
<el-button
type="primary"
size="small"
@click="handleExecute(row)"
>
执行一次
</el-button>
<el-button
type="primary"
size="small"
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
type="danger"
size="small"
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<div class="pagination-wrapper" v-if="total > 0">
<el-pagination
v-model:current-page="pageParam.pageNumber"
v-model:page-size="pageParam.pageSize"
:page-sizes="[10, 20, 50, 100]"
:total="total"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handlePageChange"
/>
</div>
<!-- 新增/编辑对话框 -->
<el-dialog
v-model="dialogVisible"
:title="isEdit ? '编辑任务' : '新增任务'"
width="700px"
@close="resetForm"
>
<div class="form-content">
<div class="form-item">
<span class="form-label required">任务名称</span>
<!-- 搜索筛选区域 -->
<div class="search-bar">
<div class="search-item">
<span class="search-label">任务名称</span>
<el-input
v-model="formData.taskName"
placeholder="请输入任务名称"
v-model="searchForm.taskName"
placeholder="请输入任务名称"
clearable
@keyup.enter="handleSearch"
style="width: 200px"
/>
</div>
<div class="form-item">
<span class="form-label required">任务分组</span>
<div class="search-item">
<span class="search-label">任务分组</span>
<el-input
v-model="formData.taskGroup"
placeholder="请输入任务分组SYSTEM、BUSINESS"
v-model="searchForm.taskGroup"
placeholder="请输入任务分组"
clearable
@keyup.enter="handleSearch"
style="width: 200px"
/>
</div>
<div class="form-item">
<span class="form-label required">Bean名称</span>
<el-input
v-model="formData.beanName"
placeholder="请输入Spring Bean名称"
clearable
/>
</div>
<div class="form-item">
<span class="form-label required">方法名称</span>
<el-input
v-model="formData.methodName"
placeholder="请输入要执行的方法名"
clearable
/>
</div>
<div class="form-item">
<span class="form-label">方法参数</span>
<el-input
v-model="formData.methodParams"
placeholder="请输入方法参数JSON格式可选"
clearable
/>
</div>
<div class="form-item">
<span class="form-label required">Cron表达式</span>
<el-input
v-model="formData.cronExpression"
placeholder="请输入Cron表达式0 0 2 * * ?"
<div class="search-item">
<span class="search-label">状态</span>
<el-select
v-model="searchForm.status"
placeholder="请选择状态"
clearable
style="width: 150px"
>
<template #append>
<el-button @click="validateCron">验证</el-button>
</template>
</el-input>
<span class="form-tip">
格式 年可选
示例0 0 2 * * ? 表示每天凌晨2点执行
</span>
</div>
<div class="form-item">
<span class="form-label">是否允许并发</span>
<el-radio-group v-model="formData.concurrent">
<el-radio :label="1">允许</el-radio>
<el-radio :label="0">禁止</el-radio>
</el-radio-group>
</div>
<div class="form-item">
<span class="form-label">错过执行策略</span>
<el-select v-model="formData.misfirePolicy" placeholder="请选择策略">
<el-option label="立即执行" :value="1" />
<el-option label="执行一次" :value="2" />
<el-option label="放弃执行" :value="3" />
<el-option label="运行中" :value="1" />
<el-option label="已暂停" :value="0" />
</el-select>
</div>
<div class="form-item">
<span class="form-label">任务描述</span>
<el-input
v-model="formData.description"
type="textarea"
:rows="3"
placeholder="请输入任务描述"
/>
<div class="search-actions">
<el-button type="primary" @click="handleSearch">
<el-icon><Search /></el-icon>
搜索
</el-button>
<el-button @click="handleReset">
<el-icon><Refresh /></el-icon>
重置
</el-button>
</div>
</div>
<template #footer>
<el-button @click="dialogVisible = false">取消</el-button>
<el-button
type="primary"
@click="handleSubmit"
:loading="submitting"
>
确定
</el-button>
</template>
</el-dialog>
</div>
<!-- 任务列表 -->
<el-table
:data="taskList"
style="width: 100%"
v-loading="loading"
border
stripe
>
<el-table-column prop="taskName" label="任务名称" min-width="150" />
<el-table-column prop="taskGroup" label="任务分组" width="120" />
<el-table-column prop="beanName" label="Bean名称" min-width="150" />
<el-table-column prop="methodName" label="方法名称" width="120" />
<el-table-column prop="cronExpression" label="Cron表达式" min-width="150" />
<el-table-column label="状态" width="100">
<template #default="{ row }">
<el-tag :type="row.status === 1 ? 'success' : 'info'" size="small">
{{ row.status === 1 ? '运行中' : '已暂停' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="并发" width="80">
<template #default="{ row }">
<el-tag :type="row.concurrent === 1 ? 'success' : 'warning'" size="small">
{{ row.concurrent === 1 ? '允许' : '禁止' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" width="180" />
<el-table-column label="操作" width="300" fixed="right">
<template #default="{ row }">
<el-button
v-if="row.status === 0"
type="success"
size="small"
@click="handleStart(row)"
>
启动
</el-button>
<el-button
v-else
type="warning"
size="small"
@click="handlePause(row)"
>
暂停
</el-button>
<el-button
type="primary"
size="small"
@click="handleExecute(row)"
>
执行一次
</el-button>
<el-button
type="primary"
size="small"
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
type="danger"
size="small"
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<div class="pagination-wrapper" v-if="total > 0">
<el-pagination
v-model:current-page="pageParam.pageNumber"
v-model:page-size="pageParam.pageSize"
:page-sizes="[10, 20, 50, 100]"
:total="total"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handlePageChange"
/>
</div>
<!-- 新增/编辑对话框 -->
<el-dialog
v-model="dialogVisible"
:title="isEdit ? '编辑任务' : '新增任务'"
width="700px"
@close="resetForm"
>
<div class="form-content">
<div class="form-item">
<span class="form-label required">任务名称</span>
<el-input
v-model="formData.taskName"
placeholder="请输入任务名称"
clearable
/>
</div>
<div class="form-item">
<span class="form-label required">任务分组</span>
<el-input
v-model="formData.taskGroup"
placeholder="请输入任务分组SYSTEM、BUSINESS"
clearable
/>
</div>
<div class="form-item">
<span class="form-label required">Bean名称</span>
<el-input
v-model="formData.beanName"
placeholder="请输入Spring Bean名称"
clearable
/>
</div>
<div class="form-item">
<span class="form-label required">方法名称</span>
<el-input
v-model="formData.methodName"
placeholder="请输入要执行的方法名"
clearable
/>
</div>
<div class="form-item">
<span class="form-label">方法参数</span>
<el-input
v-model="formData.methodParams"
placeholder="请输入方法参数JSON格式可选"
clearable
/>
</div>
<div class="form-item">
<span class="form-label required">Cron表达式</span>
<el-input
v-model="formData.cronExpression"
placeholder="请输入Cron表达式0 0 2 * * ?"
clearable
>
<template #append>
<el-button @click="validateCron">验证</el-button>
</template>
</el-input>
<span class="form-tip">
格式 年可选
示例0 0 2 * * ? 表示每天凌晨2点执行
</span>
</div>
<div class="form-item">
<span class="form-label">是否允许并发</span>
<el-radio-group v-model="formData.concurrent">
<el-radio :label="1">允许</el-radio>
<el-radio :label="0">禁止</el-radio>
</el-radio-group>
</div>
<div class="form-item">
<span class="form-label">错过执行策略</span>
<el-select v-model="formData.misfirePolicy" placeholder="请选择策略">
<el-option label="立即执行" :value="1" />
<el-option label="执行一次" :value="2" />
<el-option label="放弃执行" :value="3" />
</el-select>
</div>
<div class="form-item">
<span class="form-label">任务描述</span>
<el-input
v-model="formData.description"
type="textarea"
:rows="3"
placeholder="请输入任务描述"
/>
</div>
</div>
<template #footer>
<el-button @click="dialogVisible = false">取消</el-button>
<el-button
type="primary"
@click="handleSubmit"
:loading="submitting"
>
确定
</el-button>
</template>
</el-dialog>
</div>
</AdminLayout>
</template>
<script setup lang="ts">
@@ -248,7 +250,10 @@ import { ElMessage, ElMessageBox } from 'element-plus';
import { Plus, Search, Refresh } from '@element-plus/icons-vue';
import { crontabApi } from '@/apis/crontab';
import type { CrontabTask, PageParam } from '@/types';
import { AdminLayout } from '@/views/admin';
defineOptions({
name: 'TaskManagementView'
});
// 数据状态
const loading = ref(false);
const submitting = ref(false);