diff --git a/controllers/common.go b/controllers/common.go index 451b4e7..389c239 100644 --- a/controllers/common.go +++ b/controllers/common.go @@ -9,11 +9,11 @@ package controllers import ( "github.com/astaxie/beego" + "github.com/axgle/mahonia" "github.com/george518/PPGo_Job/libs" "github.com/george518/PPGo_Job/models" "strconv" "strings" - "github.com/axgle/mahonia" ) const ( @@ -361,4 +361,9 @@ func gbkAsUtf8(str string) string { resStr := srcDecoder.ConvertString(str) _, resBytes, _ := desDecoder.Translate([]byte(resStr), true) return string(resBytes) -} \ No newline at end of file +} + +//任务识别码 +func jobKey(taskId, serverId int) int { + return taskId*10000 + serverId +} diff --git a/controllers/task.go b/controllers/task.go index eca4798..c0ea96e 100644 --- a/controllers/task.go +++ b/controllers/task.go @@ -8,6 +8,7 @@ package controllers import ( + "fmt" "strconv" "strings" "time" @@ -78,6 +79,15 @@ func (self *TaskController) Edit() { self.Data["notify_user_ids"] = notifyUserIds + server_ids := strings.Split(task.ServerIds, ",") + var server_ids_arr []int + for _, sv := range server_ids { + i, _ := strconv.Atoi(sv) + server_ids_arr = append(server_ids_arr, i) + } + + self.Data["service_ids"] = server_ids_arr + notifyTplList, _, err := models.NotifyTplGetByTplTypeList(task.NotifyType) tplList := make([]map[string]interface{}, len(notifyTplList)) @@ -145,13 +155,28 @@ func (self *TaskController) Detail() { // 分组列表 self.Data["taskGroup"] = taskGroupLists(self.taskGroups, self.userId) - serverName := "本地服务器" - if task.ServerId == 0 { + serverName := "" + if task.ServerIds == "0" { serverName = "本地服务器" } else { - server, err := models.TaskServerGetById(task.ServerId) - if err == nil { - serverName = server.ServerName + serverIdSli := strings.Split(task.ServerIds, ",") + for _, v := range serverIdSli { + if v == "0" { + serverName = "本地服务器 " + } + } + servers, n := models.TaskServerGetByIds(task.ServerIds) + if n > 0 { + for _, server := range servers { + fmt.Println(server.Status) + if server.Status != 0 { + serverName += server.ServerName + "【无效】 " + } else { + serverName += server.ServerName + " " + } + } + } else { + serverName += "服务器异常!!" } } @@ -212,7 +237,7 @@ func (self *TaskController) AjaxSave() { 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.ServerIds = strings.TrimSpace(self.GetString("server_ids")) task.CronSpec = strings.TrimSpace(self.GetString("cron_spec")) task.Command = strings.TrimSpace(self.GetString("command")) task.Timeout, _ = self.GetInt("timeout") @@ -258,7 +283,7 @@ func (self *TaskController) AjaxSave() { 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.ServerIds = strings.TrimSpace(self.GetString("server_ids")) task.CronSpec = strings.TrimSpace(self.GetString("cron_spec")) task.Command = strings.TrimSpace(self.GetString("command")) task.Timeout, _ = self.GetInt("timeout") @@ -291,8 +316,6 @@ func (self *TaskController) AjaxSave() { self.ajaxMsg("", MSG_OK) } - - //检查是否含有禁用命令 func checkCommand(command string) (string, bool) { @@ -332,8 +355,6 @@ func (self *TaskController) AjaxNopass() { self.ajaxMsg("", MSG_OK) } - - func (self *TaskController) AjaxStart() { taskId, _ := self.GetInt("id") if taskId == 0 { @@ -349,15 +370,19 @@ func (self *TaskController) AjaxStart() { self.ajaxMsg("任务状态有误", MSG_ERR) } - job, err := jobs.NewJobFromTask(task) + jobArr, err := jobs.NewJobFromTask(task) + if err != nil { self.ajaxMsg("创建任务失败", MSG_ERR) } - if jobs.AddJob(task.CronSpec, job) { - task.Status = 1 - task.Update() + for _, job := range jobArr { + if jobs.AddJob(task.CronSpec, job) { + task.Status = 1 + task.Update() + } } + self.ajaxMsg("", MSG_OK) } @@ -372,9 +397,18 @@ func (self *TaskController) AjaxPause() { self.ajaxMsg("查不到该任务", MSG_ERR) } - jobs.RemoveJob(taskId) + //移出任务 + TaskServerIdsArr := strings.Split(task.ServerIds, ",") + + for _, server_id := range TaskServerIdsArr { + server_id_int, _ := strconv.Atoi(server_id) + jobKey := jobKey(task.Id, server_id_int) + jobs.RemoveJob(jobKey) + } + task.Status = 0 task.Update() + self.ajaxMsg("", MSG_OK) } @@ -387,11 +421,14 @@ func (self *TaskController) AjaxRun() { self.ajaxMsg(err.Error(), MSG_ERR) } - job, err := jobs.NewJobFromTask(task) + jobArr, err := jobs.NewJobFromTask(task) if err != nil { self.ajaxMsg(err.Error(), MSG_ERR) } - job.Run() + for _, job := range jobArr { + job.Run() + } + self.ajaxMsg("", MSG_OK) } @@ -408,9 +445,12 @@ func (self *TaskController) AjaxBatchStart() { } if task, err := models.TaskGetById(id); err == nil { - job, err := jobs.NewJobFromTask(task) + jobArr, err := jobs.NewJobFromTask(task) if err == nil { - jobs.AddJob(task.CronSpec, job) + for _, job := range jobArr { + jobs.AddJob(task.CronSpec, job) + } + task.Status = 1 task.Update() } @@ -430,9 +470,17 @@ func (self *TaskController) AjaxBatchPause() { if id < 1 { continue } - jobs.RemoveJob(id) - if task, err := models.TaskGetById(id); err == nil { + task, err := models.TaskGetById(id) + //移出任务 + TaskServerIdsArr := strings.Split(task.ServerIds, ",") + + for _, server_id := range TaskServerIdsArr { + server_id_int, _ := strconv.Atoi(server_id) + jobKey := jobKey(task.Id, server_id_int) + jobs.RemoveJob(jobKey) + } + if err == nil { task.Status = 0 task.Update() } @@ -451,9 +499,19 @@ func (self *TaskController) AjaxBatchDel() { if id < 1 { continue } + + task, _ := models.TaskGetById(id) + + //移出任务 + TaskServerIdsArr := strings.Split(task.ServerIds, ",") + + for _, server_id := range TaskServerIdsArr { + server_id_int, _ := strconv.Atoi(server_id) + jobKey := jobKey(task.Id, server_id_int) + jobs.RemoveJob(jobKey) + } models.TaskDel(id) models.TaskLogDelByTaskId(id) - jobs.RemoveJob(id) } self.ajaxMsg("", MSG_OK) } @@ -661,12 +719,12 @@ func (self *TaskController) ApiTask() { task_id, _ := self.GetInt("id") if task_id == 0 { task := new(models.Task) - task.CreateId,_ = self.GetInt("create_id") + 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.ServerIds = strings.TrimSpace(self.GetString("server_ids")) task.CronSpec = strings.TrimSpace(self.GetString("cron_spec")) task.Command = strings.TrimSpace(self.GetString("command")) task.Timeout, _ = self.GetInt("timeout") @@ -716,7 +774,7 @@ func (self *TaskController) ApiTask() { 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.ServerIds = strings.TrimSpace(self.GetString("server_ids")) task.CronSpec = strings.TrimSpace(self.GetString("cron_spec")) task.Command = strings.TrimSpace(self.GetString("command")) task.Timeout, _ = self.GetInt("timeout") @@ -724,7 +782,7 @@ func (self *TaskController) ApiTask() { 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.UpdateId, _ = self.GetInt("update_id") task.Status = 0 //接口不需要 if task.IsNotify == 1 && task.NotifyTplId <= 0 { @@ -761,15 +819,18 @@ func (self *TaskController) ApiStart() { self.ajaxMsg("任务状态有误", MSG_ERR) } - job, err := jobs.NewJobFromTask(task) + jobArr, err := jobs.NewJobFromTask(task) if err != nil { self.ajaxMsg("创建任务失败", MSG_ERR) } - if jobs.AddJob(task.CronSpec, job) { - task.Status = 1 - task.Update() + for _, job := range jobArr { + if jobs.AddJob(task.CronSpec, job) { + task.Status = 1 + task.Update() + } } + self.ajaxMsg("", MSG_OK) } @@ -784,11 +845,17 @@ func (self *TaskController) ApiPause() { self.ajaxMsg("查不到该任务", MSG_ERR) } - jobs.RemoveJob(taskId) + //移出任务 + TaskServerIdsArr := strings.Split(task.ServerIds, ",") + + for _, server_id := range TaskServerIdsArr { + server_id_int, _ := strconv.Atoi(server_id) + jobKey := jobKey(task.Id, server_id_int) + jobs.RemoveJob(jobKey) + } + task.Status = 0 task.Update() self.ajaxMsg("", MSG_OK) } - - diff --git a/controllers/task_log.go b/controllers/task_log.go index 52460af..f77cd1a 100644 --- a/controllers/task_log.go +++ b/controllers/task_log.go @@ -8,6 +8,7 @@ package controllers import ( + "fmt" "github.com/astaxie/beego" "github.com/george518/PPGo_Job/libs" "github.com/george518/PPGo_Job/models" @@ -74,9 +75,12 @@ func (self *TaskLogController) Table() { for k, v := range result { row := make(map[string]interface{}) row["id"] = v.Id - row["task_id"] = v.TaskId + row["task_id"] = jobKey(v.TaskId, v.ServerId) row["start_time"] = beego.Date(time.Unix(v.CreateTime, 0), "Y-m-d H:i:s") row["process_time"] = float64(v.ProcessTime) / 1000 + + row["server_id"] = v.ServerId + row["server_name"] = v.ServerName + "#" + strconv.Itoa(v.ServerId) if v.Status == 0 { row["output_size"] = libs.SizeFormat(float64(len(v.Output))) } else { @@ -99,6 +103,8 @@ func (self *TaskLogController) Detail() { //日志内容 id, _ := self.GetInt("id") tasklog, err := models.TaskLogGetById(id) + + fmt.Println(tasklog) if err != nil { self.Ctx.WriteString("日志不存在") return @@ -119,6 +125,8 @@ func (self *TaskLogController) Detail() { row["output_size"] = libs.SizeFormat(float64(len(tasklog.Error))) } + row["server_name"] = tasklog.ServerName + row["output"] = tasklog.Output row["error"] = tasklog.Error @@ -149,15 +157,31 @@ func (self *TaskLogController) Detail() { // 分组列表 self.Data["taskGroup"] = taskGroupLists(self.taskGroups, self.userId) - serverName := "本地服务器" - if task.ServerId == 0 { + serverName := "" + if task.ServerIds == "0" { serverName = "本地服务器" } else { - server, err := models.TaskServerGetById(task.ServerId) - if err == nil { - serverName = server.ServerName + + serverIdSli := strings.Split(task.ServerIds, ",") + for _, v := range serverIdSli { + if v == "0" { + serverName = "本地服务器 " + } + } + servers, n := models.TaskServerGetByIds(task.ServerIds) + if n > 0 { + for _, server := range servers { + if server.Status != 0 { + serverName += server.ServerName + "【无效】 " + } else { + serverName += server.ServerName + " " + } + } + } else { + serverName = "服务器异常!! " } } + self.Data["serverName"] = serverName //任务分组 diff --git a/jobs/cron.go b/jobs/cron.go index 39b7934..79a96f7 100644 --- a/jobs/cron.go +++ b/jobs/cron.go @@ -32,7 +32,7 @@ func AddJob(spec string, job *Job) bool { lock.Lock() defer lock.Unlock() - if GetEntryById(job.id) != nil { + if GetEntryById(job.jobKey) != nil { return false } err := mainCron.AddJob(spec, job) @@ -40,13 +40,14 @@ func AddJob(spec string, job *Job) bool { beego.Error("AddJob: ", err.Error()) return false } + //fmt.Println(job) return true } -func RemoveJob(id int) { +func RemoveJob(jobKey int) { mainCron.RemoveJob(func(e *cron.Entry) bool { if v, ok := e.Job.(*Job); ok { - if v.id == id { + if v.jobKey == jobKey { return true } } @@ -54,11 +55,11 @@ func RemoveJob(id int) { }) } -func GetEntryById(id int) *cron.Entry { +func GetEntryById(jobKey int) *cron.Entry { entries := mainCron.Entries() for _, e := range entries { if v, ok := e.Job.(*Job); ok { - if v.id == id { + if v.jobKey == jobKey { return e } } diff --git a/jobs/init.go b/jobs/init.go index 54850cb..be40bed 100644 --- a/jobs/init.go +++ b/jobs/init.go @@ -18,12 +18,16 @@ import ( func InitJobs() { list, _ := models.TaskGetList(1, 1000000, "status", 1) for _, task := range list { - job, err := NewJobFromTask(task) + jobs, err := NewJobFromTask(task) if err != nil { beego.Error("InitJobs:", err.Error()) continue } - AddJob(task.CronSpec, job) + + for _, job := range jobs { + AddJob(task.CronSpec, job) + } + } } diff --git a/jobs/job.go b/jobs/job.go index 7ab9c99..cfacc53 100644 --- a/jobs/job.go +++ b/jobs/job.go @@ -20,19 +20,22 @@ import ( "strconv" "strings" + "encoding/json" "github.com/astaxie/beego" + "github.com/axgle/mahonia" "github.com/george518/PPGo_Job/models" "github.com/george518/PPGo_Job/notify" - "golang.org/x/crypto/ssh" - "encoding/json" - "github.com/axgle/mahonia" - "github.com/pkg/errors" "github.com/linxiaozhi/go-telnet" + "github.com/pkg/errors" + "golang.org/x/crypto/ssh" ) type Job struct { - id int // 任务ID + jobKey int // jobId = id*10000+serverId + id int // taskID logId int64 // 日志记录ID + serverId int //服务器信息 + serverName string //服务器名称 name string // 任务名称 task *models.Task // 任务对象 runFunc func(time.Duration) (string, string, error, bool) // 执行函数 @@ -40,51 +43,79 @@ type Job struct { Concurrent bool // 同一个任务是否允许并行执行 } -func NewJobFromTask(task *models.Task) (*Job, error) { +func NewJobFromTask(task *models.Task) ([]*Job, error) { if task.Id < 1 { return nil, fmt.Errorf("ToJob: 缺少id") } - //本地程序执行 - if task.ServerId == 0 { - job := NewCommandJob(task.Id, task.TaskName, task.Command) - job.task = task - job.Concurrent = task.Concurrent == 1 - return job, nil + if task.ServerIds == "" { + return nil, fmt.Errorf("任务执行失败,找不到执行的服务器") } - server, _ := models.TaskServerGetById(task.ServerId) - if server.ConnectionType == 0 { - if server.Type == 0 { - //密码验证登录服务器 - job := RemoteCommandJobByPassword(task.Id, task.TaskName, task.Command, server) - job.task = task - job.Concurrent = task.Concurrent == 1 - return job, nil - } + TaskServerIdsArr := strings.Split(task.ServerIds, ",") - job := RemoteCommandJob(task.Id, task.TaskName, task.Command, server) - job.task = task - job.Concurrent = task.Concurrent == 1 - return job, nil - } else if server.ConnectionType == 1 { - if server.Type == 0 { - //密码验证登录服务器 - job := RemoteCommandJobByTelnetPassword(task.Id, task.TaskName, task.Command, server) + jobArr := make([]*Job, 0) + + for _, server_id := range TaskServerIdsArr { + if server_id == "0" { + //本地执行 + job := NewCommandJob(task.Id, 0, task.TaskName, task.Command) job.task = task job.Concurrent = task.Concurrent == 1 - return job, nil + job.serverId = 0 + job.serverName = "本地服务器" + jobArr = append(jobArr, job) + } else { + server_id_int, _ := strconv.Atoi(server_id) + //远程执行 + server, _ := models.TaskServerGetById(server_id_int) + + if server.Status == 1 { + fmt.Println("服务器已禁用") + continue + } + + if server.ConnectionType == 0 { + if server.Type == 0 { + //密码验证登录服务器 + job := RemoteCommandJobByPassword(task.Id, server_id_int, task.TaskName, task.Command, server) + job.task = task + job.Concurrent = task.Concurrent == 1 + job.serverId = server_id_int + job.serverName = server.ServerName + jobArr = append(jobArr, job) + } else { + job := RemoteCommandJob(task.Id, server_id_int, task.TaskName, task.Command, server) + job.task = task + job.Concurrent = task.Concurrent == 1 + job.serverId = server_id_int + job.serverName = server.ServerName + jobArr = append(jobArr, job) + } + } else if server.ConnectionType == 1 { + if server.Type == 0 { + //密码验证登录服务器 + job := RemoteCommandJobByTelnetPassword(task.Id, server_id_int, task.TaskName, task.Command, server) + job.task = task + job.Concurrent = task.Concurrent == 1 + job.serverId = server_id_int + job.serverName = server.ServerName + jobArr = append(jobArr, job) + } + } } } - return nil, fmt.Errorf("未知ConnectionType") + return jobArr, nil } -func NewCommandJob(id int, name string, command string) *Job { +func NewCommandJob(id int, serverId int, name string, command string) *Job { job := &Job{ id: id, name: name, } + + job.jobKey = jobKey(id, serverId) job.runFunc = func(timeout time.Duration) (string, string, error, bool) { bufOut := new(bytes.Buffer) bufErr := new(bytes.Buffer) @@ -106,11 +137,15 @@ func NewCommandJob(id int, name string, command string) *Job { } //远程执行任务 密钥验证 -func RemoteCommandJob(id int, name string, command string, servers *models.TaskServer) *Job { +func RemoteCommandJob(id int, serverId int, name string, command string, servers *models.TaskServer) *Job { job := &Job{ - id: id, - name: name, + id: id, + name: name, + serverId: serverId, } + + job.jobKey = jobKey(id, serverId) + job.runFunc = func(timeout time.Duration) (string, string, error, bool) { key, err := ioutil.ReadFile(servers.PrivateKeySrc) @@ -166,7 +201,7 @@ func RemoteCommandJob(id int, name string, command string, servers *models.TaskS return job } -func RemoteCommandJobByPassword(id int, name string, command string, servers *models.TaskServer) *Job { +func RemoteCommandJobByPassword(id int, serverId int, name string, command string, servers *models.TaskServer) *Job { var ( auth []ssh.AuthMethod addr string @@ -177,9 +212,11 @@ func RemoteCommandJobByPassword(id int, name string, command string, servers *mo ) job := &Job{ - id: id, - name: name, + id: id, + name: name, + serverId: serverId, } + job.jobKey = jobKey(id, serverId) job.runFunc = func(timeout time.Duration) (string, string, error, bool) { // get auth method auth = make([]ssh.AuthMethod, 0) @@ -223,12 +260,15 @@ func RemoteCommandJobByPassword(id int, name string, command string, servers *mo return job } -func RemoteCommandJobByTelnetPassword(id int, name string, command string, servers *models.TaskServer) *Job { +func RemoteCommandJobByTelnetPassword(id int, serverId int, name string, command string, servers *models.TaskServer) *Job { job := &Job{ - id: id, - name: name, + id: id, + name: name, + serverId: serverId, } + + job.jobKey = jobKey(id, serverId) job.runFunc = func(timeout time.Duration) (string, string, error, bool) { addr := fmt.Sprintf("%s:%d", servers.ServerIp, servers.Port) @@ -309,7 +349,7 @@ func (j *Job) GetLogId() int64 { func (j *Job) Run() { if !j.Concurrent && j.status > 0 { - beego.Warn(fmt.Sprintf("任务[%d]上一次执行尚未结束,本次被忽略。", j.id)) + beego.Warn(fmt.Sprintf("任务[%d]上一次执行尚未结束,本次被忽略。", j.jobKey)) return } @@ -326,7 +366,7 @@ func (j *Job) Run() { }() } - beego.Debug(fmt.Sprintf("开始执行任务: %d", j.id)) + beego.Debug(fmt.Sprintf("开始执行任务: %d", j.jobKey)) j.status++ defer func() { @@ -344,6 +384,8 @@ func (j *Job) Run() { // 插入日志 log := new(models.TaskLog) log.TaskId = j.id + log.ServerId = j.serverId + log.ServerName = j.serverName log.Output = cmdOut log.Error = cmdErr log.ProcessTime = int(ut) @@ -536,3 +578,8 @@ func gbkAsUtf8(str string) string { _, resBytes, _ := desDecoder.Translate([]byte(resStr), true) return string(resBytes) } + +//任务识别码 +func jobKey(taskId, serverId int) int { + return taskId*10000 + serverId +} diff --git a/models/server.go b/models/server.go index 3e9ea47..f22760b 100644 --- a/models/server.go +++ b/models/server.go @@ -9,6 +9,8 @@ package models import ( "fmt" + "strconv" + "strings" "github.com/astaxie/beego/orm" ) @@ -95,6 +97,22 @@ func TaskServerGetById(id int) (*TaskServer, error) { return obj, nil } +// +func TaskServerGetByIds(ids string) ([]*TaskServer, int64) { + + serverFilters := make([]interface{}, 0) + //serverFilters = append(serverFilters, "status", 1) + + TaskServerIdsArr := strings.Split(ids, ",") + TaskServerIds := make([]int, 0) + for _, v := range TaskServerIdsArr { + id, _ := strconv.Atoi(v) + TaskServerIds = append(TaskServerIds, id) + } + serverFilters = append(serverFilters, "id__in", TaskServerIds) + return TaskServerGetList(1, 1000, serverFilters...) +} + func TaskServerDelById(id int) error { _, err := orm.NewOrm().QueryTable(TableName("task_server")).Filter("id", id).Delete() return err diff --git a/models/task.go b/models/task.go index de69dda..34c2895 100644 --- a/models/task.go +++ b/models/task.go @@ -23,7 +23,7 @@ const ( type Task struct { Id int GroupId int - ServerId int + ServerIds string TaskName string Description string CronSpec string diff --git a/models/task_log.go b/models/task_log.go index f971529..134b9cc 100644 --- a/models/task_log.go +++ b/models/task_log.go @@ -14,6 +14,8 @@ import ( type TaskLog struct { Id int TaskId int + ServerId int + ServerName string Output string Error string Status int diff --git a/ppgo_job2.sql b/ppgo_job2.sql index 0104b78..03c4d20 100644 --- a/ppgo_job2.sql +++ b/ppgo_job2.sql @@ -330,4 +330,13 @@ BEGIN; ALTER TABLE `pp_task_server` ADD `connection_type` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '连接类型 0:SSH;1:Telnet;' AFTER `group_id`; COMMIT; +BEGIN; +ALTER TABLE `ppgo_job2`.`pp_task` CHANGE COLUMN `server_id` `server_ids` varchar(200) NOT NULL DEFAULT '0' COMMENT '服务器id字符串,英文都好隔开'; +BEGIN; + +BEGIN; +ALTER TABLE `ppgo_job2`.`pp_task_log` ADD COLUMN `server_id` int(11) NOT NULL DEFAULT '-1' COMMENT '服务器ID,-1,异常' AFTER `task_id`, CHANGE COLUMN `output` `output` mediumtext NOT NULL COMMENT '任务输出' AFTER `server_id`, CHANGE COLUMN `error` `error` text NOT NULL COMMENT '错误信息' AFTER `output`, CHANGE COLUMN `status` `status` tinyint(4) NOT NULL COMMENT '状态' AFTER `error`, CHANGE COLUMN `process_time` `process_time` int(11) NOT NULL DEFAULT '0' COMMENT '消耗时间/毫秒' AFTER `status`, CHANGE COLUMN `create_time` `create_time` int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '创建时间' AFTER `process_time`; +ALTER TABLE `ppgo_job2`.`pp_task_log` ADD COLUMN `server_name` varchar(60) NOT NULL DEFAULT '\"\"' COMMENT '服务器名称' AFTER `server_id`, CHANGE COLUMN `output` `output` mediumtext NOT NULL COMMENT '任务输出' AFTER `server_name`, CHANGE COLUMN `error` `error` text NOT NULL COMMENT '错误信息' AFTER `output`, CHANGE COLUMN `status` `status` tinyint(4) NOT NULL COMMENT '状态' AFTER `error`, CHANGE COLUMN `process_time` `process_time` int(11) NOT NULL DEFAULT '0' COMMENT '消耗时间/毫秒' AFTER `status`, CHANGE COLUMN `create_time` `create_time` int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '创建时间' AFTER `process_time`; +BEGIN; + SET FOREIGN_KEY_CHECKS = 1; diff --git a/views/admin/add.html b/views/admin/add.html index c28d40e..bbbc997 100644 --- a/views/admin/add.html +++ b/views/admin/add.html @@ -106,7 +106,7 @@ var $; $.post('{{urlfor "AdminController.AjaxSave"}}', form_data, function (out) { if (out.status == 0) { layer.msg("操作成功",{icon: 1,shade:0.3,time:1000},function () { - window.location.reload() + window.parent.deleteCurrentTab(); }) } else { layer.msg(out.message) diff --git a/views/admin/edit.html b/views/admin/edit.html index 0de4d1f..4d59b10 100644 --- a/views/admin/edit.html +++ b/views/admin/edit.html @@ -113,7 +113,7 @@ var $; $.post('{{urlfor "AdminController.AjaxSave"}}', form_data, function (out) { if (out.status == 0) { layer.msg("操作成功",{icon: 1,shade:0.3,time:1000},function () { - window.location.reload() + window.parent.deleteCurrentTab(); }) } else { layer.msg(out.message) diff --git a/views/notifytpl/add.html b/views/notifytpl/add.html index a259f6c..c70ef52 100644 --- a/views/notifytpl/add.html +++ b/views/notifytpl/add.html @@ -89,8 +89,7 @@ $.post('{{urlfor "NotifyTplController.AjaxSave"}}', form_data, function (out) { if (out.status == 0) { layer.msg("操作成功", {icon: 1, shade: 0.3, time: 1000}, function () { - // window.history.go(-1)// - window.location.reload() + window.parent.deleteCurrentTab(); }) } else { layer.msg(out.message) diff --git a/views/notifytpl/edit.html b/views/notifytpl/edit.html index 5997ea8..5978a11 100644 --- a/views/notifytpl/edit.html +++ b/views/notifytpl/edit.html @@ -89,8 +89,7 @@ $.post('{{urlfor "NotifyTplController.AjaxSave"}}', form_data, function (out) { if (out.status == 0) { layer.msg("操作成功", {icon: 1, shade: 0.3, time: 1000}, function () { - // window.history.go(-1) - window.location.reload() + window.parent.deleteCurrentTab(); }) } else { layer.msg(out.message) diff --git a/views/public/layout.html b/views/public/layout.html index 3455315..2bd61c7 100644 --- a/views/public/layout.html +++ b/views/public/layout.html @@ -26,7 +26,7 @@ {{.pageTitle}}