Files
udmin/.trae/rules/project_rules.md
ayou 8c06849254 feat(调度任务): 实现调度任务管理功能
新增调度任务模块,支持任务的增删改查、启停及手动执行
- 后端添加 schedule_job 模型、服务、路由及调度器工具类
- 前端新增调度任务管理页面
- 修改 flow 相关接口将 id 类型从 String 改为 i64
- 添加 tokio-cron-scheduler 依赖实现定时任务调度
- 初始化时加载已启用任务并注册到调度器
2025-09-24 00:21:30 +08:00

3.8 KiB
Raw Blame History

Rust 代码风格规范(用于 AI 生成代码规则)

1. 基础风格

  • 使用 Rust 2021 edition

  • 缩进统一 4 空格,不使用 Tab。

  • 每行代码长度建议不超过 100 字符

  • 花括号风格

    fn example() {
        // good
    }
    
  • 表达式尽量简洁,必要时换行,参数链式调用时 缩进对齐


2. 模块与导入

  • 模块顶部导入,按以下顺序分组,组间空一行:

    1. 标准库 (std::..)
    2. 第三方库 (chrono, sea_orm, tokio 等)
    3. 本地 crate (crate::..)
  • 统一使用 显式导入,禁止 use super::*use crate::*

  • 相同模块导入合并:

    use sea_orm::{EntityTrait, QueryFilter, ColumnTrait};
    

3. 命名规则

  • 模块 / 文件名snake_case
  • 函数 / 变量名snake_case
  • 结构体 / 枚举名PascalCase
  • 常量UPPER_CASE
  • DTO/请求体/响应体后缀:Doc / Req / Resp

示例:

pub struct ScheduleJobDoc { .. }
pub struct CreateReq { .. }
pub struct PageResp<T> { .. }

4. 文档与注释

  • 每个 模块 顶部使用 //! 写模块职责说明。
  • 每个 公开函数 必须有 /// 注释,简述用途与主要逻辑。
  • 内部复杂逻辑使用 // 单行注释解释。
  • 中文注释优先,避免英文缩写晦涩难懂。

示例:

/// 创建任务:
/// - 校验 cron 表达式
/// - 校验唯一性
/// - 入库后注册调度器
pub async fn create(..) -> Result<..> { .. }

5. 错误处理

  • 错误类型统一用 自定义错误枚举(如 AppError)。
  • 不直接 unwrap() / expect(),统一返回 Result<T, AppError>
  • 错误信息应清晰且面向用户,内部日志保留技术细节。

6. 日志规范

  • 使用 tracing 库,必须带 target
  • 统一格式:模块.操作.状态
  • 日志字段使用 key = %valuekey = ?value,避免拼接字符串。

示例:

info!(target = "udmin", id = %job_id, enabled = %enabled, "schedule_jobs.update.persisted");
error!(target = "udmin", id = %job_id, error = %e, "schedule_jobs.run.failed");

7. 异步与数据库

  • 使用 async fn,返回 Result<T, AppError>
  • SeaORM 查询使用链式写法,按字段过滤时一行一个 filter。
  • 分页/排序明确写出,不隐式。

示例:

let jobs = schedule_job::Entity::find()
    .filter(schedule_job::Column::Enabled.eq(true))
    .order_by_desc(schedule_job::Column::UpdatedAt)
    .paginate(db, page_size);

8. 结构体组织

  • DTO / 请求体 / 响应体 放在模块前部。
  • Service 函数按生命周期顺序:list → create → update → remove → init
  • 工具函数(如 build_executor_for_jobnow_fixed_offset)放在模块最后。

9. 闭包与异步执行器

  • 使用 Arc::new(move || { Box::pin(async move { .. }) }) 形式。
  • 避免重复 clone大对象提前 clone 一次再 move 进闭包。
  • 返回 Pin<Box<dyn Future<Output = ()> + Send>>

10. 时间与 ID

  • 时间统一用 chrono::Utc::now().with_timezone(&FixedOffset::east_opt(0).unwrap()),可封装成 now_fixed_offset()
  • ID 统一使用 id: Set(crate::utils::generate_id())

11. 统一返回体

  • 分页接口统一返回 PageResp<T>
  • 单条数据返回 DTOScheduleJobDoc)。
  • 删除接口返回 Result<(), AppError>

12. 代码整洁性

  • 避免嵌套过深,必要时提前 return
  • 冗余 clone 使用 .clone() 仅在必须时。
  • 枚举 / match 分支完整,必要时加 _ => {} 显式忽略。

总结: 生成的代码必须 简洁、清晰、分组有序、日志一致、错误优雅,看起来像经验丰富的 Rust 高手写的生产级代码。