From 4e6b1b87be0459a0e625285da98f66a7a4ee6bb7 Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Sat, 25 Oct 2025 18:47:00 +0800 Subject: [PATCH] =?UTF-8?q?web-=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- schoolNewsWeb/src/apis/crontab/index.ts | 196 +++++ schoolNewsWeb/src/types/crontab/index.ts | 92 +++ schoolNewsWeb/src/types/index.ts | 3 + .../manage/crontab/LogManagementView.vue | 505 +++++++++++++ .../admin/manage/crontab/NewsCrawlerView.vue | 706 ++++++++++++++++++ .../manage/crontab/TaskManagementView.vue | 625 ++++++++++++++++ 6 files changed, 2127 insertions(+) create mode 100644 schoolNewsWeb/src/apis/crontab/index.ts create mode 100644 schoolNewsWeb/src/types/crontab/index.ts create mode 100644 schoolNewsWeb/src/views/admin/manage/crontab/LogManagementView.vue create mode 100644 schoolNewsWeb/src/views/admin/manage/crontab/NewsCrawlerView.vue create mode 100644 schoolNewsWeb/src/views/admin/manage/crontab/TaskManagementView.vue diff --git a/schoolNewsWeb/src/apis/crontab/index.ts b/schoolNewsWeb/src/apis/crontab/index.ts new file mode 100644 index 0000000..0739473 --- /dev/null +++ b/schoolNewsWeb/src/apis/crontab/index.ts @@ -0,0 +1,196 @@ +/** + * @description 定时任务相关API + * @author yslg + * @since 2025-10-25 + */ + +import { api } from '@/apis/index'; +import type { CrontabTask, CrontabLog, ResultDomain, PageParam } from '@/types'; + +/** + * 定时任务API服务 + */ +export const crontabApi = { + baseUrl: '/crontab', + + // ==================== 定时任务管理 ==================== + + /** + * 创建定时任务 + * @param task 任务对象 + * @returns Promise> + */ + async createTask(task: CrontabTask): Promise> { + const response = await api.post(`${this.baseUrl}/task`, task); + return response.data; + }, + + /** + * 更新定时任务 + * @param task 任务对象 + * @returns Promise> + */ + async updateTask(task: CrontabTask): Promise> { + const response = await api.put(`${this.baseUrl}/task`, task); + return response.data; + }, + + /** + * 删除定时任务 + * @param task 任务对象 + * @returns Promise> + */ + async deleteTask(task: CrontabTask): Promise> { + const response = await api.delete(`${this.baseUrl}/task`, task); + return response.data; + }, + + /** + * 根据ID查询任务 + * @param taskId 任务ID + * @returns Promise> + */ + async getTaskById(taskId: string): Promise> { + const response = await api.get(`${this.baseUrl}/task/${taskId}`); + return response.data; + }, + + /** + * 查询任务列表 + * @param filter 过滤条件 + * @returns Promise> + */ + async getTaskList(filter?: Partial): Promise> { + const response = await api.post(`${this.baseUrl}/task/list`, filter); + return response.data; + }, + + /** + * 分页查询任务列表 + * @param filter 过滤条件 + * @param pageParam 分页参数 + * @returns Promise> + */ + async getTaskPage(filter?: Partial, pageParam?: PageParam): Promise> { + const response = await api.post(`${this.baseUrl}/task/page`, { + filter, + pageParam: { + pageNumber: pageParam?.page || 1, + pageSize: pageParam?.size || 10 + } + }); + return response.data; + }, + + /** + * 启动定时任务 + * @param taskId 任务ID + * @returns Promise> + */ + async startTask(taskId: string): Promise> { + const response = await api.post(`${this.baseUrl}/task/start/${taskId}`); + return response.data; + }, + + /** + * 暂停定时任务 + * @param taskId 任务ID + * @returns Promise> + */ + async pauseTask(taskId: string): Promise> { + const response = await api.post(`${this.baseUrl}/task/pause/${taskId}`); + return response.data; + }, + + /** + * 立即执行一次任务 + * @param taskId 任务ID + * @returns Promise> + */ + async executeTaskOnce(taskId: string): Promise> { + const response = await api.post(`${this.baseUrl}/task/execute/${taskId}`); + return response.data; + }, + + /** + * 验证Cron表达式 + * @param cronExpression Cron表达式 + * @returns Promise> + */ + async validateCronExpression(cronExpression: string): Promise> { + const response = await api.get(`${this.baseUrl}/task/validate`, { + cronExpression + }); + return response.data; + }, + + // ==================== 定时任务日志 ==================== + + /** + * 根据任务ID查询日志 + * @param taskId 任务ID + * @returns Promise> + */ + async getLogsByTaskId(taskId: string): Promise> { + const response = await api.get(`${this.baseUrl}/log/task/${taskId}`); + return response.data; + }, + + /** + * 查询日志列表 + * @param filter 过滤条件 + * @returns Promise> + */ + async getLogList(filter?: Partial): Promise> { + const response = await api.post(`${this.baseUrl}/log/list`, filter); + return response.data; + }, + + /** + * 分页查询日志列表 + * @param filter 过滤条件 + * @param pageParam 分页参数 + * @returns Promise> + */ + async getLogPage(filter?: Partial, pageParam?: PageParam): Promise> { + const response = await api.post(`${this.baseUrl}/log/page`, { + filter, + pageParam: { + pageNumber: pageParam?.page || 1, + pageSize: pageParam?.size || 10 + } + }); + return response.data; + }, + + /** + * 根据ID查询日志详情 + * @param logId 日志ID + * @returns Promise> + */ + async getLogById(logId: string): Promise> { + const response = await api.get(`${this.baseUrl}/log/${logId}`); + return response.data; + }, + + /** + * 清理指定天数之前的日志 + * @param days 天数 + * @returns Promise> + */ + async cleanLogs(days: number): Promise> { + const response = await api.delete(`${this.baseUrl}/log/clean/${days}`); + return response.data; + }, + + /** + * 删除日志 + * @param log 日志对象 + * @returns Promise> + */ + async deleteLog(log: CrontabLog): Promise> { + const response = await api.delete(`${this.baseUrl}/log`, log); + return response.data; + } +}; + diff --git a/schoolNewsWeb/src/types/crontab/index.ts b/schoolNewsWeb/src/types/crontab/index.ts new file mode 100644 index 0000000..e7c371d --- /dev/null +++ b/schoolNewsWeb/src/types/crontab/index.ts @@ -0,0 +1,92 @@ +/** + * @description 定时任务相关类型定义 + * @author yslg + * @since 2025-10-25 + */ + +import { BaseDTO } from '../base'; + +/** + * 定时任务配置 + */ +export interface CrontabTask extends BaseDTO { + /** 任务ID */ + taskId?: string; + /** 任务名称 */ + taskName?: string; + /** 任务分组 */ + taskGroup?: string; + /** Bean名称 */ + beanName?: string; + /** 方法名称 */ + methodName?: string; + /** 方法参数 */ + methodParams?: string; + /** Cron表达式 */ + cronExpression?: string; + /** 任务状态(0:暂停 1:运行中) */ + status?: number; + /** 任务描述 */ + description?: string; + /** 是否允许并发执行(0:否 1:是) */ + concurrent?: number; + /** 错过执行策略(1:立即执行 2:执行一次 3:放弃执行) */ + misfirePolicy?: number; + /** 创建者 */ + creator?: string; + /** 更新者 */ + updater?: string; +} + +/** + * 定时任务执行日志 + */ +export interface CrontabLog extends BaseDTO { + /** 任务ID */ + taskId?: string; + /** 任务名称 */ + taskName?: string; + /** 任务分组 */ + taskGroup?: string; + /** Bean名称 */ + beanName?: string; + /** 方法名称 */ + methodName?: string; + /** 方法参数 */ + methodParams?: string; + /** 执行状态(0:失败 1:成功) */ + executeStatus?: number; + /** 执行结果信息 */ + executeMessage?: string; + /** 异常信息 */ + exceptionInfo?: string; + /** 开始时间 */ + startTime?: string; + /** 结束时间 */ + endTime?: string; + /** 执行时长(毫秒) */ + executeDuration?: number; +} + +/** + * 新闻爬虫配置 + */ +export interface NewsCrawlerConfig { + /** 配置ID */ + id?: string; + /** 爬虫名称 */ + name?: string; + /** 目标URL */ + targetUrl?: string; + /** 爬取规则 */ + crawlRule?: string; + /** 是否启用 */ + enabled?: boolean; + /** Cron表达式 */ + cronExpression?: string; + /** 最后执行时间 */ + lastExecuteTime?: string; + /** 状态 */ + status?: number; +} + diff --git a/schoolNewsWeb/src/types/index.ts b/schoolNewsWeb/src/types/index.ts index 8410af4..74aa202 100644 --- a/schoolNewsWeb/src/types/index.ts +++ b/schoolNewsWeb/src/types/index.ts @@ -45,6 +45,9 @@ export * from './ai'; // 用户中心相关 export * from './usercenter'; +// 定时任务相关 +export * from './crontab'; + // 枚举类型 export * from './enums'; export * from './enums/achievement-enums'; diff --git a/schoolNewsWeb/src/views/admin/manage/crontab/LogManagementView.vue b/schoolNewsWeb/src/views/admin/manage/crontab/LogManagementView.vue new file mode 100644 index 0000000..dde9f4b --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/crontab/LogManagementView.vue @@ -0,0 +1,505 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/crontab/NewsCrawlerView.vue b/schoolNewsWeb/src/views/admin/manage/crontab/NewsCrawlerView.vue new file mode 100644 index 0000000..a5e696a --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/crontab/NewsCrawlerView.vue @@ -0,0 +1,706 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/crontab/TaskManagementView.vue b/schoolNewsWeb/src/views/admin/manage/crontab/TaskManagementView.vue new file mode 100644 index 0000000..34c6386 --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/crontab/TaskManagementView.vue @@ -0,0 +1,625 @@ + + + + + +