- 替换 Beego 框架为 GoFrame v2 - 重构项目结构: controller/service/dao/middleware 分层 - 替换自定义 crons 包为 gcron - 模板从 views/ 迁移到 resource/template/ - 配置从 conf/app.conf 迁移到 config.yml - 数据库从 MySQL 切换为 SQLite (modernc.org/sqlite) - 移除 agent/ 远程执行器(待后续迁移) - 移除 crons/ 自定义定时器包 - 静态资源整理到 resource/static/
PPGo_Job 定时任务管理系统
一款轻量级定时任务管理系统,基于 GoFrame v2 重构。部署简单,资源消耗少,运行稳定。
技术栈
- 框架: GoFrame v2(原 Beego v1)
- 数据库: SQLite(纯 Go 驱动
modernc.org/sqlite,无需 CGO) - 定时任务: GoFrame
gcron - 前端: LayUI(服务端模板渲染)
快速开始
# 编译(纯 Go,不需要 gcc/MinGW)
CGO_ENABLED=0 go build -o ppgo_job.exe .
# 运行
./ppgo_job.exe
首次启动自动在
./data/ppgo_job.db创建 SQLite 数据库、表和默认管理员。
访问地址: http://localhost:8082 默认账号: admin / 密码: 123456
运行测试
# 运行所有测试
CGO_ENABLED=0 go test -count=1 ./...
# 运行单元测试(libs、consts、dao,无需启动服务器)
CGO_ENABLED=0 go test -count=1 ./libs/ ./consts/ ./dao/
# 运行集成测试(自动启动测试服务器,端口 18082)
CGO_ENABLED=0 go test -count=1 -timeout=120s -run "TestLogin|TestAuth|TestHome|TestTask|TestServer|TestGroup|TestBan|TestTemplate|TestStatic|TestDatabase|TestCORS" .
# 运行特定包测试
CGO_ENABLED=0 go test -v -count=1 ./libs/
集成测试覆盖登录、认证拦截、CRUD 操作、模板渲染、静态文件、CORS 头、数据库种子数据等功能。 测试使用独立的端口
:18082,不会干扰正在运行的开发实例。
📖 使用指南
1. 登录
打开浏览器访问 http://localhost:8082,输入默认账号 admin / 123456 登录。
💡 如果访问时遇到"重定向次数过多",清除浏览器 Cookie 后刷新即可。
2. 首页仪表盘
登录后进入系统首页,展示:
- 任务概览 — 总任务数、运行中、待审核
- 近期执行统计 — 过去 7 天的成功/失败/超时柱状图
- 即将执行的任务 — 最近将要触发的定时任务
- 系统信息 — 运行时间、内存使用、goroutine 数量
3. 任务管理
3.1 新增任务
左侧菜单「任务管理 → 任务列表」→ 点击「新增」按钮。
必填字段:
| 字段 | 说明 | 示例 |
|---|---|---|
| 任务名称 | 有意义的名称 | 数据库备份 |
| Cron 表达式 | 6 段格式(含秒) | 0 0 3 * * *(每天凌晨 3 点) |
| 执行命令 | 要执行的 shell 命令 | mysqldump -u root db1 > /backup.sql |
| 超时时间 | 超时后自动终止(秒) | 300(5 分钟) |
⚠️ Cron 表达式注意事项: 本项目使用 GoFrame
gcron,Cron 表达式为 6 段格式(比标准多一位秒):秒 分 时 日 月 周常用示例:
0 */5 * * * *— 每 5 分钟0 0 3 * * *— 每天凌晨 3 点0 30 9 * * 1-5— 工作日 9:300 0 0 1 * *— 每月 1 号零点如果误填了标准 5 段表达式,系统会提示
invalid pattern错误。
可选字段:
- 任务分组 — 归类管理
- 执行服务器 — 选择远程服务器(留空 = 本机执行)
- 执行方式 — 同时执行(所有服务器一起跑) / 轮询执行(逐台跑)
- 允许并发 — 默认不允许(上一个未执行完,下一个不会触发)
- 失败通知 — 勾选后可选择通知模板和接收人
3.2 任务列表
列表展示了所有任务,支持:
- 按分组筛选 — 右上角下拉框
- 按名称搜索 — 输入关键字后点查询
- 表格操作按钮:
| 按钮 | 功能 |
|---|---|
| 🔍 详细 | 查看任务完整信息 |
| ✏️ 编辑 | 修改任务参数 |
| ▶️ 启动 | 将暂停的任务加入调度 |
| ⏸️ 暂停 | 从调度中移除(暂不执行) |
| ▶️ 测试 | 立即执行一次(不依赖 Cron 触发) |
| 📋 日志 | 查看该任务的执行记录 |
| 📝 复制 | 基于现有任务创建新任务 |
| 🗑️ 删除 | 软删除(可在数据库恢复) |
3.3 任务审核
超级管理员 admin 创建的任务自动进入暂停状态;普通账号创建的任务进入「待审核」状态,需要管理员在「任务管理 → 任务审核」中通过后才能启动。
4. 服务器管理
4.1 新增服务器
「服务器管理 → 服务器列表」→ 点击「新增」。
| 字段 | 说明 | 示例 |
|---|---|---|
| 服务器名称 | 标识名称 | Web 服务器 01 |
| 连接方式 | SSH / Telnet / Agent | SSH |
| IP 地址 | 连接 IP | 192.168.1.100 |
| 端口 | SSH 默认 22 | 22 |
| 账号 | 登录用户名 | root |
| 密码/密钥 | 密码或私钥内容 | — |
⚠️ 注意: 远程执行功能目前为占位状态,实际 SSH/Telnet/Agent 连接尚未实现。当前只支持本机执行(服务器 ID = 0)。
4.2 资源分组
将服务器归类管理。多个服务器可以属于同一个资源组,方便在创建任务时批量选择。
5. 系统设置
5.1 任务分组
对任务进行分类,例如:数据备份、日志清理、监控脚本。
5.2 禁用命令
设置禁止执行的关键词。创建/编辑任务时,如果命令包含禁用词(如 rm -rf),系统会拒绝保存。
5.3 通知模板
配置任务执行失败时的通知内容。支持变量占位符:{{task_name}}、{{status}}。
⚠️ 注意: 通知发送功能目前为占位状态,实际邮件/钉钉/微信推送尚未实现。模板可以先配置好。
6. 执行日志
「日志管理 → 执行日志」查看所有任务的执行记录。
| 字段 | 说明 |
|---|---|
| 状态 | ✅ 成功 / ❌ 失败 / ⏰ 超时 |
| 耗时 | 执行耗时(毫秒) |
| 执行时间 | 触发时间 |
| 输出 | 命令的标准输出 |
| 错误 | 错误信息(如果有) |
支持按任务 ID 筛选、分页浏览、查看详情和删除。
7. 权限管理
7.1 权限因子
系统内置的菜单和功能权限,支持新增/编辑/删除。每个权限对应一个侧边栏菜单项。
权限结构为两级:
- 一级菜单 — 如「任务管理」「服务器管理」
- 二级菜单 — 如「任务列表」「任务审核」
7.2 角色管理
创建角色并绑定权限,支持数据权限控制(限制可查看的服务器组和任务组)。
例如创建一个「运维人员」角色,只赋予任务管理和日志查看权限。
7.3 管理员管理
创建系统用户,可关联角色。新增的管理员默认密码 123456。
admin是超级管理员,不能被禁用,拥有全部权限。
8. 个人资料
右上角用户头像 → 可修改个人资料(姓名、电话、邮箱、钉钉/微信等)及修改密码。
注意事项
⚡ Cron 表达式格式
本项目使用 6 段格式(含秒),不要使用标准 5 段格式:
✅ 正确: 0 0 3 * * * (每天凌晨 3 点)
❌ 错误: 0 3 * * * (缺少秒字段 → 报错)
✅ 正确: 0 */5 * * * * (每 5 分钟)
🔒 端口冲突
如果启动提示 bind: Only one usage of each socket address,说明端口 8082 已被占用:
# 查看谁占了端口
netstat -ano | findstr 8082
# 杀掉进程(PID 替换为实际值)
taskkill //PID 进程号 //F
# 或者修改 config.yml 换个端口
💾 数据库
SQLite 数据库文件在 ./data/ppgo_job.db,直接复制即可备份。如需重置,删除该文件后重启服务即可自动重建。
项目结构
├── main.go # 入口
├── config.yml # 配置文件
├── boot/ # 启动初始化
│ ├── db.go # 数据库目录初始化
│ ├── router.go # 路由注册 + 路由表
│ ├── tplfunc.go # 模板函数(urlfor/date/substr)
│ └── init.go # 自动建表 + 种子数据 + 加载调度任务
├── controller/ # HTTP 控制器
│ ├── base.go # display/ajaxMsg/ajaxList 辅助函数
│ ├── login.go # 登录/登出
│ ├── home.go # 首页仪表盘
│ ├── task.go # 任务/服务器/分组/日志/CRUD
│ ├── admin.go # 服务器/分组/禁用命令/通知模板 CRUD
│ └── system.go # 权限因子/角色/管理员/个人资料 CRUD
├── service/
│ └── scheduler/ # 任务调度 + 执行引擎
│ ├── scheduler.go # gcron 调度管理
│ └── task_runner.go # 命令执行器(本地/远程)
├── dao/ # 数据访问层
├── model/entity/ # 数据库实体(含字段常量)
├── middleware/ # 认证中间件(Cookie + 权限加载)
├── libs/ # 工具函数(密码哈希/SHA256)
├── consts/ # 常量定义
└── resource/
├── template/ # LayUI 模板
└── static/ # JS/CSS/字体
配置文件(config.yml)
server:
address: ":8082" # 监听端口
name: "ppgo_job"
logStdout: true # 日志输出到控制台
database:
default:
type: sqlite # 数据库类型(仅支持 sqlite)
name: "./data/ppgo_job.db"
jobs:
pool: 1000 # 任务并发池大小
site:
name: "定时任务管理器" # 站点标题
API 接口
| 接口 | 方法 | 说明 |
|---|---|---|
/ |
GET | 登录页面 |
/login_in |
POST | 登录(参数:username, password) |
/login_out |
GET | 登出 |
/home |
GET | 首页(需认证) |
/home/start |
GET | 仪表盘数据(需认证) |
/task/table |
GET | 任务列表 JSON(LayUI 表格格式) |
/task/ajax_save |
POST | 新增/编辑任务 |
/task/ajax_start |
POST | 启动任务 |
/task/ajax_pause |
POST | 暂停任务 |
/task/ajax_del |
POST | 删除任务 |
/task/ajax_run |
POST | 立即执行 |
/task/ajax_audit |
POST | 审核通过 |
/task/ajax_nopass |
POST | 审核不通过 |
/task/ajax_batch_start |
POST | 批量启动 |
/task/ajax_batch_pause |
POST | 批量暂停 |
/task/ajax_batch_del |
POST | 批量删除 |
/task/ajax_batch_audit |
POST | 批量审核通过 |
/server/table |
GET | 服务器列表 JSON |
/server/ajax_save |
POST | 新增/编辑服务器 |
/server/ajax_del |
POST | 删除服务器 |
/group/table |
GET | 任务分组列表 JSON |
/group/ajax_save |
POST | 新增/编辑任务分组 |
/server_group/ajax_save |
POST | 新增/编辑资源分组 |
/ban/ajax_save |
POST | 新增/编辑禁用命令 |
/notify_tpl/ajax_save |
POST | 新增/编辑通知模板 |
/auth/get_nodes |
GET | 权限树 JSON(zTree 格式) |
/role/ajax_save |
POST | 新增/编辑角色 |
/admin/table |
GET | 管理员列表 JSON |
/admin/ajax_save |
POST | 新增/编辑管理员 |
/user/ajax_save |
POST | 修改个人资料 |
/task_log/table |
GET | 执行日志列表 JSON |
完整路由见 boot/router.go。
编译部署
# 本地运行
CGO_ENABLED=0 go build -o ppgo_job.exe . && ./ppgo_job.exe
# Linux
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ppgo_job .
# Windows
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o ppgo_job.exe .
# Mac
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o ppgo_job .
已知限制
- 远程执行尚未实现 — SSH/Telnet/Agent 连接方式为占位状态,任务只支持本机执行
- 通知功能尚未实现 — 邮件/钉钉/微信推送为占位状态
- Agent API — 远程 Agent 注册和管理暂未实现
License
MIT