Merge branch 'master' of https://github.com/george518/PPGo_Job into george518-master

# Conflicts:
#	README.md
This commit is contained in:
linxiaozhi
2019-03-23 00:43:37 +08:00
3 changed files with 230 additions and 13 deletions

View File

@@ -1,10 +1,11 @@
PPGo_Job定时任务管理系统 V2.0
PPGo_Job定时任务管理系统 V2.x
====
![](http://www.haodaquan.com/Uploads/article/2018-07-26/153262059813931.png)
PPGo_Job是一款定时任务可视化的、多人多权限的管理系统采用golang开发安装方便资源消耗少支持大并发可同时管理多台服务器上的定时任务。
前言PPGo_Job V1.x版本开源年多,好几个朋友的公司都在用反响还不错当然也有好多朋友提了不少合理的意见和建议所以这次干脆重构了一下连UI也重新编码。目前V2.0版本
前言PPGo_Job V1.x版本开源年多了,不少朋友的公司都在用反响还不错当然也有好多朋友提了不少合理的意见和建议所以这次干脆重构了一下连UI也重新编码。目前V2.x版本
已经用于生产环境。
码云地址https://gitee.com/georgehao/PPGo_Job
@@ -22,8 +23,14 @@ V1.x版本是一个简单的定时任务管理系统进入V1.0 https://git
- 3、新增服务器复制功能让服务器资源添加更加方便。
- 4、新增定时任务详情页面将任务相关操作更加集中起来操作。
- 5、新增任务审核功能提高任务的管控能力。
- 6、新增禁止命令管理功能配合任务审核功能提高任务运行安全性。
- 7、优化日志详情页面查看日志更方便。
- 6、新增禁止命令管理功能配合任务审核功能提高任务运行安全性,总有人会犯错
- 7、优化日志详情页面查看日志更方便,你想看到的现场内容都在,亲
- 8、支持docker化部署这年头系统不支持docker化部署好像不能出门似的。
- 9、支持windows系统运行定时系统不歧视windows也要支持。
- 10、提醒信息新增钉钉和微信通知功能并支持编辑通知模版功能。让提醒内容个性化不再死板。
- 11、新增创建、启动、关闭任务的API通过接口的方式控制定时任务猜你喜欢。
总之管理定时任务使用PPGo_Job吧节省出来的时间或皮或浪随你哈哈。
感觉不错的话,给个星星吧
@@ -69,21 +76,21 @@ windows
linux
- 进入 https://github.com/george518/PPGo_Job/releases
- 下载 ppgo_job-linux-2.3.0.zip 并解压
- 下载 ppgo_job-linux-2.x.0.zip 并解压
- 进入文件夹,设置好数据库(创建数据库导入ppgo_job2.sql)和配置文件(conf/app.conf)
- 运行 ./run.sh start|stop
mac
- 进入https://github.com/george518/PPGo_Job/releases
- 下载 ppgo_job-mac-2.3.0.zip 并解压
- 下载 ppgo_job-mac-2.x.0.zip 并解压
- 进入文件夹,设置好数据库(创建数据库导入ppgo_job2.sql)和配置文件(conf/app.conf)
- 运行 ./run.sh start|stop
windows
- 进入 https://github.com/george518/PPGo_Job/releases
- 下载 ppgo_job-windows-2.3.0.zip 并解压
- 下载 ppgo_job-linux-2.x.0.zip 并解压
- 进入文件夹,设置好数据库(创建数据库导入ppgo_job2.sql)和配置文件(conf/app.conf)
- 运行 run.bat
@@ -183,10 +190,79 @@ docker-compose logs -f web
控制面板->管理工具->计算机管理->系统工具->本地用户和组->组->TelnetClients->添加用户
任务接口说明
----
三个简陋的接口,满足日常所需。
1、新增和修改任务接口
- url/task/apitask
- methodpost
- params
```
id:0
create_id:4
group_id:3
task_name:测试API创建任务
description:测试
concurrent:0
server_id:2
cron_spec:*/2 * * * *
command:free -G
timeout:0
is_notify:0
notify_type:0
notify_tpl_id:0
notify_user_ids:0
```
参数含义详见数据库字段。
需要注意的是id为0为新增大于0为修改。
2、任务启动接口
- url/task/apistart
- methodpost
- params
```
id:11
```
3、任务暂停接口
- urltask/apipause
- methodpost
- params
```
id:11
```
注意使用 form-data的方式传参
4、返回jsonstatus=0表示成功其他为失败msg是错误理由或id
```
{
"message": 11,
"status": 0
}
```
具体可以使用postman测试
联系我
----
qq群号:547564773
欢迎交流,欢迎提交代码。
感谢
----
@bannerchi
@linxiaozhi
@gongwalker

View File

@@ -78,7 +78,7 @@ func (self *BaseController) Auth() {
}
isHasAuth := strings.Contains(self.allowUrl, self.controllerName+"/"+self.actionName)
noAuth := "ajaxsave/table/loginin/loginout/getnodes/start"
noAuth := "ajaxsave/table/loginin/loginout/getnodes/startapitask/apistart/apipause"
isNoAuth := strings.Contains(noAuth, self.actionName)
if isHasAuth == false && isNoAuth == false {
@@ -95,7 +95,12 @@ func (self *BaseController) Auth() {
}
}
if self.userId == 0 && (self.controllerName != "login" && self.actionName != "loginin") {
if self.userId == 0 &&
(self.controllerName != "login" &&
self.actionName != "loginin" &&
self.actionName != "apistart" &&
self.actionName != "apitask" &&
self.actionName != "apipause") {
self.redirect(beego.URLFor("LoginController.Login"))
}
}

View File

@@ -12,8 +12,6 @@ import (
"strings"
"time"
"fmt"
"github.com/astaxie/beego"
"github.com/george518/PPGo_Job/crons"
"github.com/george518/PPGo_Job/jobs"
@@ -46,8 +44,6 @@ func (self *TaskController) Add() {
self.Data["serverGroup"] = serverLists(self.serverGroups, self.userId)
self.Data["isAdmin"] = self.userId
self.Data["adminInfo"] = AllAdminInfo("")
fmt.Println(self.Data["adminInfo"])
self.display()
}
@@ -295,6 +291,8 @@ func (self *TaskController) AjaxSave() {
self.ajaxMsg("", MSG_OK)
}
//检查是否含有禁用命令
func checkCommand(command string) (string, bool) {
@@ -334,6 +332,8 @@ func (self *TaskController) AjaxNopass() {
self.ajaxMsg("", MSG_OK)
}
func (self *TaskController) AjaxStart() {
taskId, _ := self.GetInt("id")
if taskId == 0 {
@@ -656,3 +656,139 @@ func (self *TaskController) Table() {
self.ajaxList("成功", MSG_OK, count, list)
}
func (self *TaskController) ApiTask() {
task_id, _ := self.GetInt("id")
if task_id == 0 {
task := new(models.Task)
task.CreateId,_ = self.GetInt("create_id")
task.GroupId, _ = self.GetInt("group_id")
task.TaskName = strings.TrimSpace(self.GetString("task_name"))
task.Description = strings.TrimSpace(self.GetString("description"))
task.Concurrent, _ = self.GetInt("concurrent")
task.ServerId, _ = self.GetInt("server_id")
task.CronSpec = strings.TrimSpace(self.GetString("cron_spec"))
task.Command = strings.TrimSpace(self.GetString("command"))
task.Timeout, _ = self.GetInt("timeout")
task.IsNotify, _ = self.GetInt("is_notify")
task.NotifyType, _ = self.GetInt("notify_type")
task.NotifyTplId, _ = self.GetInt("notify_tpl_id")
task.NotifyUserIds = strings.TrimSpace(self.GetString("notify_user_ids"))
if task.IsNotify == 1 && task.NotifyTplId <= 0 {
self.ajaxMsg("请选择通知模板", MSG_ERR)
}
msg, isBan := checkCommand(task.Command)
if !isBan {
self.ajaxMsg("含有禁止命令:"+msg, MSG_ERR)
}
task.CreateTime = time.Now().Unix()
task.UpdateTime = time.Now().Unix()
task.Status = 0 //接口不需要审核
if task.TaskName == "" || task.CronSpec == "" || task.Command == "" {
self.ajaxMsg("请填写完整信息", MSG_ERR)
}
var id int64
var err error
if _, err = cron.Parse(task.CronSpec); err != nil {
self.ajaxMsg("cron表达式无效", MSG_ERR)
}
if id, err = models.TaskAdd(task); err != nil {
self.ajaxMsg(err.Error(), MSG_ERR)
}
task_id = int(id)
self.ajaxMsg(task_id, MSG_OK)
}
task, _ := models.TaskGetById(task_id)
if task.Status == 1 {
self.ajaxMsg("运行状态无法编辑任务,请先暂停任务", MSG_ERR)
}
//修改
task.Id = task_id
task.UpdateTime = time.Now().Unix()
task.TaskName = strings.TrimSpace(self.GetString("task_name"))
task.Description = strings.TrimSpace(self.GetString("description"))
task.GroupId, _ = self.GetInt("group_id")
task.Concurrent, _ = self.GetInt("concurrent")
task.ServerId, _ = self.GetInt("server_id")
task.CronSpec = strings.TrimSpace(self.GetString("cron_spec"))
task.Command = strings.TrimSpace(self.GetString("command"))
task.Timeout, _ = self.GetInt("timeout")
task.IsNotify, _ = self.GetInt("is_notify")
task.NotifyType, _ = self.GetInt("notify_type")
task.NotifyTplId, _ = self.GetInt("notify_tpl_id")
task.NotifyUserIds = strings.TrimSpace(self.GetString("notify_user_ids"))
task.UpdateId , _ = self.GetInt("update_id")
task.Status = 0 //接口不需要
if task.IsNotify == 1 && task.NotifyTplId <= 0 {
self.ajaxMsg("请选择通知模板", MSG_ERR)
}
msg, isBan := checkCommand(task.Command)
if !isBan {
self.ajaxMsg("含有禁止命令:"+msg, MSG_ERR)
}
if _, err := cron.Parse(task.CronSpec); err != nil {
self.ajaxMsg("cron表达式无效", MSG_ERR)
}
if err := task.Update(); err != nil {
self.ajaxMsg(err.Error(), MSG_ERR)
}
self.ajaxMsg(task_id, MSG_OK)
}
func (self *TaskController) ApiStart() {
taskId, _ := self.GetInt("id")
if taskId == 0 {
self.ajaxMsg("任务不存在", MSG_ERR)
}
task, err := models.TaskGetById(taskId)
if err != nil {
self.ajaxMsg("查不到该任务", MSG_ERR)
}
if task.Status != 0 {
self.ajaxMsg("任务状态有误", MSG_ERR)
}
job, err := jobs.NewJobFromTask(task)
if err != nil {
self.ajaxMsg("创建任务失败", MSG_ERR)
}
if jobs.AddJob(task.CronSpec, job) {
task.Status = 1
task.Update()
}
self.ajaxMsg("", MSG_OK)
}
func (self *TaskController) ApiPause() {
taskId, _ := self.GetInt("id")
if taskId == 0 {
self.ajaxMsg("任务不存在", MSG_ERR)
}
task, err := models.TaskGetById(taskId)
if err != nil {
self.ajaxMsg("查不到该任务", MSG_ERR)
}
jobs.RemoveJob(taskId)
task.Status = 0
task.Update()
self.ajaxMsg("", MSG_OK)
}