From 0f6d3302f3f38485b7a4d04677a4785521d204d8 Mon Sep 17 00:00:00 2001 From: Odboy Date: Tue, 28 Jul 2026 21:19:56 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B7=BB=E5=8A=A0=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=97=A5=E5=BF=97=E7=AE=A1=E7=90=86=E5=90=8E?= =?UTF-8?q?=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增: dataobject/sys_job_log.go 定时任务日志数据对象 - 新增: dao/job_log_dao.go 定时任务日志DAO - 新增: service/job_log_service.go 定时任务日志Service - 新增: api/v1/job_log_api.go 定时任务日志API - 新增: request/job_log_request.go 定时任务日志查询参数 - 修复: cron_job_router.go 添加调度日志路由 - 修复: 前端jobLog API路径缺少/api/v1前缀 - 修复: 前端router添加定时任务管理页面路由 --- cutego-ui/src/api/monitor/jobLog.js | 8 +- cutego-ui/src/router/index.js | 6 ++ cutego/modules/core/api/v1/job_log_api.go | 57 +++++++++++++ .../core/api/v1/request/job_log_request.go | 9 ++ cutego/modules/core/dao/job_log_dao.go | 84 +++++++++++++++++++ cutego/modules/core/dataobject/sys_job_log.go | 18 ++++ cutego/modules/core/router/cron_job_router.go | 9 ++ .../modules/core/service/job_log_service.go | 26 ++++++ 8 files changed, 213 insertions(+), 4 deletions(-) create mode 100644 cutego/modules/core/api/v1/job_log_api.go create mode 100644 cutego/modules/core/api/v1/request/job_log_request.go create mode 100644 cutego/modules/core/dao/job_log_dao.go create mode 100644 cutego/modules/core/dataobject/sys_job_log.go create mode 100644 cutego/modules/core/service/job_log_service.go diff --git a/cutego-ui/src/api/monitor/jobLog.js b/cutego-ui/src/api/monitor/jobLog.js index be1fffd..f418b46 100644 --- a/cutego-ui/src/api/monitor/jobLog.js +++ b/cutego-ui/src/api/monitor/jobLog.js @@ -3,7 +3,7 @@ import request from '@/utils/request' // 查询调度日志列表 export function listJobLog(query) { return request({ - url: '/monitor/jobLog/list', + url: '/api/v1/monitor/jobLog/list', method: 'get', params: query }) @@ -12,7 +12,7 @@ export function listJobLog(query) { // 删除调度日志 export function delJobLog(jobLogId) { return request({ - url: '/monitor/jobLog/' + jobLogId, + url: '/api/v1/monitor/jobLog/' + jobLogId, method: 'delete' }) } @@ -20,7 +20,7 @@ export function delJobLog(jobLogId) { // 清空调度日志 export function cleanJobLog() { return request({ - url: '/monitor/jobLog/clean', + url: '/api/v1/monitor/jobLog/clean', method: 'delete' }) } @@ -28,7 +28,7 @@ export function cleanJobLog() { // 导出调度日志 export function exportJobLog(query) { return request({ - url: '/monitor/jobLog/export', + url: '/api/v1/monitor/jobLog/export', method: 'get', params: query }) diff --git a/cutego-ui/src/router/index.js b/cutego-ui/src/router/index.js index 77e626a..ac82821 100644 --- a/cutego-ui/src/router/index.js +++ b/cutego-ui/src/router/index.js @@ -125,6 +125,12 @@ export const constantRoutes = [ component: Layout, hidden: true, children: [ + { + path: 'index', + component: (resolve) => require(['@/views/monitor/job/index'], resolve), + name: 'Job', + meta: { title: '定时任务' } + }, { path: 'log', component: (resolve) => require(['@/views/monitor/job/log'], resolve), diff --git a/cutego/modules/core/api/v1/job_log_api.go b/cutego/modules/core/api/v1/job_log_api.go new file mode 100644 index 0000000..225f8e6 --- /dev/null +++ b/cutego/modules/core/api/v1/job_log_api.go @@ -0,0 +1,57 @@ +package v1 + +import ( + "cutego/modules/core/api/v1/request" + "cutego/modules/core/service" + "cutego/pkg/resp" + "github.com/gin-gonic/gin" + "strconv" + "strings" +) + +type JobLogApi struct { + jobLogService service.JobLogService +} + +// List 查询调度日志列表 +func (a JobLogApi) List(c *gin.Context) { + query := request.JobLogQuery{} + if c.Bind(&query) != nil { + resp.ParamError(c) + return + } + list, total := a.jobLogService.FindPage(query) + c.JSON(200, gin.H{ + "status": 200, + "msg": "查询成功", + "rows": list, + "total": total, + }) +} + +// Remove 删除调度日志 +func (a JobLogApi) Remove(c *gin.Context) { + param := c.Param("jobLogId") + ids := strings.Split(param, ",") + idList := make([]int64, 0, len(ids)) + for _, s := range ids { + id, err := strconv.ParseInt(strings.TrimSpace(s), 10, 64) + if err == nil { + idList = append(idList, id) + } + } + if len(idList) > 0 && a.jobLogService.Delete(idList) { + resp.OK(c) + } else { + resp.Error(c) + } +} + +// Clean 清空调度日志 +func (a JobLogApi) Clean(c *gin.Context) { + if a.jobLogService.Clean() { + resp.OK(c) + } else { + resp.Error(c) + } +} \ No newline at end of file diff --git a/cutego/modules/core/api/v1/request/job_log_request.go b/cutego/modules/core/api/v1/request/job_log_request.go new file mode 100644 index 0000000..ceab735 --- /dev/null +++ b/cutego/modules/core/api/v1/request/job_log_request.go @@ -0,0 +1,9 @@ +package request + +import "cutego/pkg/base" + +type JobLogQuery struct { + base.GlobalQuery + JobName string `form:"jobName"` + Status string `form:"status"` +} \ No newline at end of file diff --git a/cutego/modules/core/dao/job_log_dao.go b/cutego/modules/core/dao/job_log_dao.go new file mode 100644 index 0000000..769264c --- /dev/null +++ b/cutego/modules/core/dao/job_log_dao.go @@ -0,0 +1,84 @@ +package dao + +import ( + "cutego/modules/core/api/v1/request" + "cutego/modules/core/dataobject" + "cutego/pkg/logger" + "cutego/pkg/page" + "cutego/refs" + "github.com/druidcaesa/gotool" + "github.com/go-xorm/xorm" +) + +type JobLogDao struct { +} + +func (d JobLogDao) sql(session *xorm.Session) *xorm.Session { + return session.Table("sys_job_log") +} + +// SelectPage 分页查询 +func (d JobLogDao) SelectPage(query request.JobLogQuery) ([]dataobject.SysJobLog, int64) { + logs := make([]dataobject.SysJobLog, 0) + session := d.sql(refs.SqlDB.NewSession()) + if gotool.StrUtils.HasNotEmpty(query.JobName) { + session.And("job_name like concat('%', ?, '%')", query.JobName) + } + if gotool.StrUtils.HasNotEmpty(query.Status) { + session.And("status = ?", query.Status) + } + if gotool.StrUtils.HasNotEmpty(query.BeginTime) { + session.And("date_format(create_time,'%y%m%d') >= date_format(?,'%y%m%d')", query.BeginTime) + } + if gotool.StrUtils.HasNotEmpty(query.EndTime) { + session.And("date_format(create_time,'%y%m%d') <= date_format(?,'%y%m%d')", query.EndTime) + } + total, _ := page.GetTotal(session.Clone()) + err := session.OrderBy("create_time desc").Limit(query.PageSize, page.StartSize(query.PageNum, query.PageSize)).Find(&logs) + if err != nil { + logger.SugaredLogger.Errorln(err) + return nil, 0 + } + return logs, total +} + +// DeleteByIds 批量删除 +func (d JobLogDao) DeleteByIds(ids []int64) bool { + session := refs.SqlDB.NewSession() + session.Begin() + _, err := session.In("job_log_id", ids).Delete(&dataobject.SysJobLog{}) + if err != nil { + logger.SugaredLogger.Errorln(err) + session.Rollback() + return false + } + session.Commit() + return true +} + +// Clean 清空所有日志 +func (d JobLogDao) Clean() bool { + session := refs.SqlDB.NewSession() + session.Begin() + _, err := session.Exec("delete from sys_job_log") + if err != nil { + logger.SugaredLogger.Errorln(err) + session.Rollback() + return false + } + session.Commit() + return true +} + +// Insert 插入日志 +func (d JobLogDao) Insert(log dataobject.SysJobLog) { + session := refs.SqlDB.NewSession() + session.Begin() + _, err := session.Insert(&log) + if err != nil { + logger.SugaredLogger.Errorln(err) + session.Rollback() + return + } + session.Commit() +} \ No newline at end of file diff --git a/cutego/modules/core/dataobject/sys_job_log.go b/cutego/modules/core/dataobject/sys_job_log.go new file mode 100644 index 0000000..7a162ed --- /dev/null +++ b/cutego/modules/core/dataobject/sys_job_log.go @@ -0,0 +1,18 @@ +package dataobject + +import "time" + +type SysJobLog struct { + JobLogId int64 `xorm:"pk autoincr" json:"jobLogId"` // 日志主键 + JobId int64 `xorm:"int(20)" json:"jobId"` // 任务ID + JobName string `xorm:"varchar(100)" json:"jobName"` // 任务名称 + FuncAlias string `xorm:"varchar(100)" json:"funcAlias"` // 调用目标 + JobMessage string `xorm:"varchar(500)" json:"jobMessage"` // 日志信息 + Status string `xorm:"char(1)" json:"status"` // 执行状态(0正常 1失败) + ExceptionInfo string `xorm:"varchar(2000)" json:"exceptionInfo"` // 异常信息 + CreateTime time.Time `xorm:"created" json:"createTime"` // 创建时间 +} + +func (s SysJobLog) TableName() string { + return "sys_job_log" +} \ No newline at end of file diff --git a/cutego/modules/core/router/cron_job_router.go b/cutego/modules/core/router/cron_job_router.go index 7cd9ee0..0b65392 100644 --- a/cutego/modules/core/router/cron_job_router.go +++ b/cutego/modules/core/router/cron_job_router.go @@ -23,4 +23,13 @@ func initCronJobRouter(router *gin.RouterGroup) { // 改变定时任务状态 group.PUT("/changeStatus", v.ChangeStatus) } + + // 调度日志 + log := new(v1.JobLogApi) + logGroup := router.Group("/monitor/jobLog") + { + logGroup.GET("/list", log.List) + logGroup.DELETE("/:jobLogId", log.Remove) + logGroup.DELETE("/clean", log.Clean) + } } diff --git a/cutego/modules/core/service/job_log_service.go b/cutego/modules/core/service/job_log_service.go new file mode 100644 index 0000000..5544211 --- /dev/null +++ b/cutego/modules/core/service/job_log_service.go @@ -0,0 +1,26 @@ +package service + +import ( + "cutego/modules/core/api/v1/request" + "cutego/modules/core/dao" + "cutego/modules/core/dataobject" +) + +type JobLogService struct { + jobLogDao dao.JobLogDao +} + +// FindPage 分页查询 +func (s JobLogService) FindPage(query request.JobLogQuery) ([]dataobject.SysJobLog, int64) { + return s.jobLogDao.SelectPage(query) +} + +// Delete 批量删除 +func (s JobLogService) Delete(ids []int64) bool { + return s.jobLogDao.DeleteByIds(ids) +} + +// Clean 清空所有日志 +func (s JobLogService) Clean() bool { + return s.jobLogDao.Clean() +} \ No newline at end of file