Skip to content

feat: B7&B8 Add scheduled tasks and a portion of notification services#34

Merged
MrJ200011 merged 4 commits intomainfrom
feature/timed_task
Nov 27, 2025
Merged

feat: B7&B8 Add scheduled tasks and a portion of notification services#34
MrJ200011 merged 4 commits intomainfrom
feature/timed_task

Conversation

@MrJ200011
Copy link
Collaborator

Add a scheduled task that runs once every hour. Each time it runs, it scans the database task table to find all tasks whose deadlines are within the next 24 hours and that are neither completed nor archived. The scanned tasks are then notified through the notification service. After the notification, these tasks are marked as archived. The scheduled task will no longer notify this service when it runs next time.

@github-actions
Copy link

好的,我现在需要仔细审查用户提供的代码,并按照他们的要求进行分析。首先,我得理解用户的需求,他们希望我作为一位资深的软件工程师和代码审查专家,全面审查代码,重点关注代码质量、可靠性、性能和安全性。

首先,我看看用户提供的代码变化。这些变化包括新增了一些文件,比如notification handler、scheduler service,还有对main.go、models/task.go等文件的修改。看起来主要是新增了一个定时任务通知的功能,用于在任务截止日期临近时发送通知。

接下来,我逐一审查各个部分:

  1. 总体分析

    • 这个新增的功能看起来是完整的,涵盖了定时任务的创建、通知的发送以及状态的更新。代码结构也比较清晰,使用了Gin框架和Cron库。
    • 主要优点是模块化,新增了服务层和处理器,符合分层设计。但也发现了一些问题,比如命名不一致、缺少注释、错误处理不完善等。
  2. 代码质量与可维护性

    • 命名方面,发现TaskStatusAlreadyRemind这个常量命名不太准确,应该改为TaskStatusArchived更合适。
    • 注释方面,新增代码缺少详细的注释,尤其是函数和结构体的用途,这会影响可维护性。
    • 代码结构上,notification_service.go中的函数直接绑定到Gin路由,但其实应该由处理器来处理,这样职责更明确。
  3. 可靠性与健壮性

    • 错误处理方面,scheduler_service.go中虽然有错误日志,但没有重试机制,如果通知发送失败,任务状态不会更新,可能导致重复发送。
    • 资源管理方面,HTTP客户端没有设置超时,可能会导致长时间挂起。
    • 边界条件方面,任务查询中没有处理时区问题,可能会影响任务的筛选。
  4. 性能优化

    • 定时任务每小时执行一次,但如果任务数量很大,可能会影响性能。可以考虑分批处理任务。
    • 数据库查询可以优化,比如使用预加载或索引,提高查询效率。
  5. 安全性

    • 通知接口直接暴露,没有权限验证,任何人都可以发送通知,存在安全风险。
    • 数据库查询使用字符串拼接,虽然这里没有用户输入,但最好使用ORM的方法来防止潜在的注入风险。

接下来,我需要针对这些问题提出具体的建议,并给出修改示例。例如,修改命名、添加注释、改进错误处理、增加超时设置、优化数据库查询等。

最后,综合评分,考虑到代码整体功能完善,但存在一些结构和安全问题,给予75分。

现在,我需要将这些思考整理成一个结构化的审查报告,按照用户的要求,每个部分都要具体,提供可操作的建议和代码示例。

代码审查报告

1. 总体分析

新增的定时任务通知功能模块整体设计合理,实现了任务截止提醒的核心功能。代码结构清晰,新增了服务层和处理器,符合分层设计原则。主要优点包括模块化设计和清晰的职责划分。但存在一些命名不一致、注释缺失和错误处理不完善的问题,需要改进以提高代码质量和可维护性。

2. 代码质量与可维护性

  • 命名规范
    • TaskStatusAlreadyRemind 命名不准确,建议改为 TaskStatusArchived
  • 注释
    • 新增代码缺少详细的注释,建议为每个结构体、函数添加功能描述。
  • 代码结构
    • notification_service.go 中的 HandleTaskNotification 函数应由处理器处理,建议移至 notification.go

修改示例

// models/task.go
const (
    TaskStatusTodo          TaskStatus = 1 // 待办
    TaskStatusInProgress    TaskStatus = 2 // 进行中
    TaskStatusCompleted     TaskStatus = 3 // 已完成
    TaskStatusCancelled     TaskStatus = 4 // 已取消
    TaskStatusArchived      TaskStatus = 5 // 已归档
)

3. 可靠性与健壮性

  • 错误处理
    • scheduler_service.go 中的 sendNotification 函数缺少重试机制,建议增加重试逻辑。
  • 资源管理
    • HTTP客户端未设置超时,建议添加超时设置。
  • 边界条件
    • 任务查询未处理时区问题,建议统一使用UTC时间。

修改示例

// services/scheduler_service.go
func (s *Scheduler) sendNotification(task models.Task) error {
    // 重试逻辑
    maxRetries := 3
    for i := 0; i < maxRetries; i++ {
        if err := sendAttempt(task); err != nil {
            if i == maxRetries-1 {
                return fmt.Errorf("通知发送失败,已重试%d次: %v", maxRetries, err)
            }
            time.Sleep(time.Duration(i+1) * time.Second)
            continue
        }
        break
    }
    return nil
}

4. 性能优化

  • 任务处理
    • 定时任务批量处理,减少数据库压力。
  • 数据库查询
    • 使用索引和优化查询条件,提高效率。

修改示例

// services/scheduler_service.go
func (s *Scheduler) queryPendingTasks() ([]models.Task, error) {
    var tasks []models.Task
    now := time.Now().UTC()
    deadlineEnd := now.Add(24 * time.Hour)

    err := s.db.Where(
        "status NOT IN (?) AND due_date > ? AND due_date < ? AND deadline_alert_sent = 0",
        []int{3, 5}, now, deadlineEnd,
    ).Find(&tasks).Error
    return tasks, err
}

5. 安全性

  • 权限验证
    • 通知接口缺少权限验证,建议添加JWT验证。
  • SQL注入
    • 使用ORM方法避免SQL注入风险。

修改示例

// handlers/notification/notification.go
func (h *NotificationHandler) ReceiveTaskNotification(c *gin.Context) {
    var req TaskNotificationReq
    if err := c.ShouldBindJSON(&req); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{
            "code":    400,
            "message": "无效的通知参数",
        })
        return
    }

    // 添加权限验证
    token, err := c.Request.Cookie("Authorization")
    if err != nil {
        c.JSON(http.StatusUnauthorized, gin.H{
            "code":    401,
            "message": "未授权",
        })
        return
    }

    // 解析JWT并验证
    // (此处省略具体实现)
    // if !isValidToken(token.Value) {
    //     c.JSON(http.StatusUnauthorized, gin.H{
    //         "code":    401,
    //         "message": "无效的令牌",
    //     })
    //     return
    // }

    h.printNotification(req)
    c.JSON(http.StatusOK, gin.H{
        "code":    0,
        "message": "通知接收成功",
    })
}

综合质量评分: 75/100

代码整体功能完善,但需在命名、注释、错误处理和安全性方面进一步改进,以提高代码质量和系统的健壮性。

@MrJ200011 MrJ200011 enabled auto-merge November 27, 2025 09:58
@MrJ200011 MrJ200011 merged commit fc8eb51 into main Nov 27, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants