From 7bd18fdb64be56b102f8a29e3076ac35d31e45a8 Mon Sep 17 00:00:00 2001 From: linxiaozhi Date: Sat, 16 Feb 2019 20:43:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/notify_tpl.go | 166 ++++++++++++++++++++++++++++++++++++++ controllers/task.go | 45 +++++++++++ controllers/task_log.go | 9 +++ jobs/job.go | 99 +++++++++-------------- models/init.go | 5 +- models/notify_tpl.go | 102 +++++++++++++++++++++++ models/task.go | 5 +- ppgo_job2.sql | 40 +++++++++ routers/router.go | 1 + views/notifytpl/add.html | 103 +++++++++++++++++++++++ views/notifytpl/edit.html | 103 +++++++++++++++++++++++ views/notifytpl/list.html | 107 ++++++++++++++++++++++++ views/public/main.html | 2 +- views/task/add.html | 111 ++++++++++++++++--------- views/task/edit.html | 36 ++++++++- views/tasklog/detail.html | 8 +- 16 files changed, 830 insertions(+), 112 deletions(-) create mode 100644 controllers/notify_tpl.go create mode 100644 models/notify_tpl.go create mode 100644 views/notifytpl/add.html create mode 100644 views/notifytpl/edit.html create mode 100644 views/notifytpl/list.html diff --git a/controllers/notify_tpl.go b/controllers/notify_tpl.go new file mode 100644 index 0000000..1159936 --- /dev/null +++ b/controllers/notify_tpl.go @@ -0,0 +1,166 @@ +/************************************************************ +** @Description: controllers +** @Author: Bee +** @Date: 2019-02-15 20:21 +** @Last Modified by: Bee +** @Last Modified time: 2019-02-15 20:21 +*************************************************************/ +package controllers + +import ( + "github.com/george518/PPGo_Job/models" + "strings" + "time" + "github.com/astaxie/beego" + "encoding/json" +) + +type NotifyTplController struct { + BaseController +} + +func (self *NotifyTplController) List() { + self.Data["pageTitle"] = "通知模板" + self.display() +} + +func (self *NotifyTplController) Add() { + self.Data["pageTitle"] = "新增通知模板" + self.Data["serverGroup"] = serverGroupLists(self.serverGroups, self.userId) + self.display() +} + +func (self *NotifyTplController) Edit() { + self.Data["pageTitle"] = "编辑通知模板" + + id, _ := self.GetInt("id", 0) + notifyTpl, _ := models.NotifyTplGetById(id) + row := make(map[string]interface{}) + row["id"] = notifyTpl.Id + row["tpl_name"] = notifyTpl.TplName + row["tpl_type"] = notifyTpl.TplType + row["title"] = notifyTpl.Title + row["content"] = notifyTpl.Content + row["status"] = notifyTpl.Status + self.Data["notifyTpl"] = row + self.display() +} + +func (self *NotifyTplController) AjaxSave() { + tpl_id, _ := self.GetInt("id") + if tpl_id == 0 { + notifyTpl := new(models.NotifyTpl) + notifyTpl.TplName = strings.TrimSpace(self.GetString("tpl_name")) + notifyTpl.TplType, _ = self.GetInt("tpl_type") + notifyTpl.Title = strings.TrimSpace(self.GetString("title")) + notifyTpl.Content = strings.TrimSpace(self.GetString("content")) + notifyTpl.CreateId = self.userId + notifyTpl.CreateTime = time.Now().Unix() + notifyTpl.Type = "default" + notifyTpl.Status, _ = self.GetInt("status") + + if notifyTpl.TplType == 1 { + m := make(map[string]string) + err := json.Unmarshal([]byte(notifyTpl.Content), &m) + if err != nil { + self.ajaxMsg("模板内容格式错误,"+err.Error(), MSG_ERR) + } + } + + if _, err := models.NotifyTplAdd(notifyTpl); err != nil { + self.ajaxMsg(err.Error(), MSG_ERR) + } + self.ajaxMsg("", MSG_OK) + } + + notifyTpl, _ := models.NotifyTplGetById(tpl_id) + //修改 + notifyTpl.Id = tpl_id + notifyTpl.UpdateId = self.userId + notifyTpl.UpdateTime = time.Now().Unix() + + notifyTpl.TplName = strings.TrimSpace(self.GetString("tpl_name")) + notifyTpl.TplType, _ = self.GetInt("tpl_type") + notifyTpl.Title = strings.TrimSpace(self.GetString("title")) + notifyTpl.Content = strings.TrimSpace(self.GetString("content")) + notifyTpl.Status, _ = self.GetInt("status") + + if notifyTpl.TplType == 1 { + m := make(map[string]string) + err := json.Unmarshal([]byte(notifyTpl.Content), &m) + if err != nil { + self.ajaxMsg("模板内容格式错误,"+err.Error(), MSG_ERR) + } + } + + if notifyTpl.Type == "system" { + self.ajaxMsg("系统模板禁止更新", MSG_ERR) + } + + if err := notifyTpl.Update(); err != nil { + self.ajaxMsg("更新失败,"+err.Error(), MSG_ERR) + } + self.ajaxMsg("", MSG_OK) +} + +func (self *NotifyTplController) AjaxDel() { + id, _ := self.GetInt("id") + notifyTpl, _ := models.NotifyTplGetById(id) + + if notifyTpl.Type == "system" { + self.ajaxMsg("系统模板禁止删除", MSG_ERR) + } + + if err := models.NotifyTplDelById(id); err != nil { + self.ajaxMsg("删除失败,"+err.Error(), MSG_ERR) + } + self.ajaxMsg("操作成功", MSG_OK) +} + +func (self *NotifyTplController) Table() { + //列表 + page, err := self.GetInt("page") + if err != nil { + page = 1 + } + limit, err := self.GetInt("limit") + if err != nil { + limit = 30 + } + tplName := strings.TrimSpace(self.GetString("tplName")) + StatusText := []string{ + "禁用", + "正常", + } + + TplTypeText := []string{ + "邮件", + "信息", + "钉钉", + } + + self.pageSize = limit + //查询条件 + filters := make([]interface{}, 0) + + if tplName != "" { + filters = append(filters, "tpl_name__icontains", tplName) + } + result, count := models.NotifyTplGetList(page, self.pageSize, filters...) + list := make([]map[string]interface{}, len(result)) + for k, v := range result { + row := make(map[string]interface{}) + row["id"] = v.Id + row["type"] = v.Type + row["tpl_name"] = v.TplName + row["tpl_type"] = v.TplType + row["tpl_type_text"] = TplTypeText[v.TplType] + row["status"] = v.Status + row["status_text"] = StatusText[v.Status] + row["create_time"] = beego.Date(time.Unix(v.CreateTime, 0), "Y-m-d H:i:s") + row["update_time"] = beego.Date(time.Unix(v.UpdateTime, 0), "Y-m-d H:i:s") + list[k] = row + } + + self.ajaxList("成功", MSG_OK, count, list) +} diff --git a/controllers/task.go b/controllers/task.go index 777eca9..1469e60 100644 --- a/controllers/task.go +++ b/controllers/task.go @@ -81,6 +81,22 @@ func (self *TaskController) Edit() { } self.Data["notify_user_ids"] = notifyUserIds + + notifyTplList, _, err := models.NotifyTplGetByTplTypeList(task.NotifyType) + tplList := make([]map[string]interface{}, len(notifyTplList)) + + if err == nil { + for k, v := range notifyTplList { + row := make(map[string]interface{}) + row["id"] = v.Id + row["tpl_name"] = v.TplName + row["tpl_type"] = v.TplType + tplList[k] = row + } + } + + self.Data["notifyTpl"] = tplList + self.display() } @@ -197,8 +213,13 @@ func (self *TaskController) AjaxSave() { 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) @@ -213,6 +234,7 @@ func (self *TaskController) AjaxSave() { if task.TaskName == "" || task.CronSpec == "" || task.Command == "" { self.ajaxMsg("请填写完整信息", MSG_ERR) } + if _, err := cron.Parse(task.CronSpec); err != nil { self.ajaxMsg("cron表达式无效", MSG_ERR) } @@ -237,9 +259,15 @@ func (self *TaskController) AjaxSave() { 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.userId task.Status = 2 //审核中,超级管理员不需要 + + if task.IsNotify == 1 && task.NotifyTplId <= 0 { + self.ajaxMsg("请选择通知模板", MSG_ERR) + } + if self.userId == 1 { task.Status = 0 } @@ -487,6 +515,23 @@ func (self *TaskController) AjaxDel() { self.ajaxMsg("操作成功", MSG_OK) } +func (self *TaskController) AjaxNotifyType() { + notifyType, _ := self.GetInt("notify_type") + result, count, _ := models.NotifyTplGetByTplTypeList(notifyType) + + list := make([]map[string]interface{}, len(result)) + + for k, v := range result { + row := make(map[string]interface{}) + row["id"] = v.Id + row["tpl_name"] = v.TplName + row["tpl_type"] = v.TplType + list[k] = row + } + + self.ajaxList("成功", MSG_OK, count, list) +} + func (self *TaskController) Table() { //列表 page, err := self.GetInt("page") diff --git a/controllers/task_log.go b/controllers/task_log.go index d9bd18e..3fbe064 100644 --- a/controllers/task_log.go +++ b/controllers/task_log.go @@ -146,6 +146,15 @@ func (self *TaskLogController) Detail() { self.Data["CreateTime"] = beego.Date(time.Unix(task.CreateTime, 0), "Y-m-d H:i:s") self.Data["UpdateTime"] = beego.Date(time.Unix(task.UpdateTime, 0), "Y-m-d H:i:s") self.Data["task"] = task + + self.Data["NotifyTplName"] = "未知" + if task.IsNotify == 1 { + notifyTpl, err := models.NotifyTplGetById(task.NotifyTplId) + if err == nil { + self.Data["NotifyTplName"] = notifyTpl.TplName + } + } + // 分组列表 self.Data["taskGroup"] = taskGroupLists(self.taskGroups, self.userId) diff --git a/jobs/job.go b/jobs/job.go index c4201f8..adb8f54 100644 --- a/jobs/job.go +++ b/jobs/job.go @@ -24,6 +24,7 @@ import ( "github.com/george518/PPGo_Job/models" "github.com/george518/PPGo_Job/notify" "golang.org/x/crypto/ssh" + "encoding/json" ) type Job struct { @@ -294,85 +295,59 @@ func (j *Job) Run() { toEmail = strings.TrimRight(toEmail, ";") TextStatus := []string{ - "超时", - "错误", - "正常", + "超时", + "错误", + "正常", } status := log.Status + 2 + var title = "" + var content = "" + notifyTpl, err := models.NotifyTplGetById(j.task.NotifyTplId) + if err == nil { + title = notifyTpl.Title + content = notifyTpl.Content + } + + if title != "" { + title = strings.Replace(title, "{TaskId}", strconv.Itoa(j.task.Id), -1) + title = strings.Replace(title, "{TaskName}", j.task.TaskName, -1) + title = strings.Replace(title, "{CreateTime}", beego.Date(time.Unix(log.CreateTime, 0), "Y-m-d H:i:s"), -1) + title = strings.Replace(title, "{ProcessTime}", strconv.FormatFloat(float64(log.ProcessTime)/1000, 'f', 6, 64), -1) + title = strings.Replace(title, "{Status}", TextStatus[status], -1) + title = strings.Replace(title, "{TaskOut}", log.Error, -1) + } + + if content != "" { + content = strings.Replace(content, "{TaskId}", strconv.Itoa(j.task.Id), -1) + content = strings.Replace(content, "{TaskName}", j.task.TaskName, -1) + content = strings.Replace(content, "{CreateTime}", beego.Date(time.Unix(log.CreateTime, 0), "Y-m-d H:i:s"), -1) + content = strings.Replace(content, "{ProcessTime}", strconv.FormatFloat(float64(log.ProcessTime)/1000, 'f', 6, 64), -1) + content = strings.Replace(content, "{Status}", TextStatus[status], -1) + content = strings.Replace(content, "{TaskOut}", log.Error, -1) + } + if j.task.NotifyType == 0 && toEmail != "" { //邮件 - //SendToChan(to, subject, body, mailtype string) bool - subject := fmt.Sprintf("PPGo_Job定时任务异常:%s", j.task.TaskName) - body := fmt.Sprintf( - `Hello,定时任务出问题了: -

任务执行详情:

-

-任务 ID:%d
-任务名称:%s
-执行时间:%s
-执行耗时:%f秒
-执行状态:%s -

-

任务执行输出

-

-%s -

-
-
-

-----------------------------------------------------------------
-本邮件由PPGo_Job定时系统自动发出,请勿回复
-如果要取消邮件通知,请登录到系统进行设置
-

-`, j.task.Id, - j.task.TaskName, - beego.Date(time.Unix(log.CreateTime, 0), "Y-m-d H:i:s"), - float64(log.ProcessTime)/1000, - TextStatus[status], - log.Error) mailtype := "html" - ok := notify.SendToChan(toEmail, subject, body, mailtype) + ok := notify.SendToChan(toEmail, title, content, mailtype) if !ok { fmt.Println("发送邮件错误", toEmail) } } else if j.task.NotifyType == 1 && len(phone) > 0 { //信息 - TextStatus := []string{ - " 超时", - " 错误", - " 正常", - } param := make(map[string]string) - param["task_id"] = " " + strconv.Itoa(j.task.Id) - param["task_name"] = " " + j.task.TaskName - param["status"] = " " + TextStatus[status] + err := json.Unmarshal([]byte(content), ¶m) + if err != nil { + fmt.Println("发送信息错误", err) + } + notify.SendSmsToChan(phone, param) } else if j.task.NotifyType == 2 && len(dingtalk) > 0 { - - TextStatus := []string{ - "超时", - "错误", - "正常", - } - content := fmt.Sprintf( - `任务执行异常详情: -任务 ID:%d -任务名称:%s -执行时间:%s -执行耗时:%f秒 -执行状态:%s -任务执行输出: -%s`, - j.task.Id, - j.task.TaskName, - beego.Date(time.Unix(log.CreateTime, 0), "Y-m-d H:i:s"), - float64(log.ProcessTime)/1000, - TextStatus[status], - log.Error) - + //钉钉 notify.SendDingtalkToChan(dingtalk, content) } diff --git a/models/init.go b/models/init.go index abd9bbc..c4db957 100644 --- a/models/init.go +++ b/models/init.go @@ -1,8 +1,8 @@ /* * @Author: haodaquan * @Date: 2017-06-20 09:44:44 -* @Last Modified by: haodaquan -* @Last Modified time: 2017-06-21 12:21:37 +* @Last Modified by: Bee +* @Last Modified time: 2019-02-15 22:12 */ package models @@ -47,6 +47,7 @@ func Init(startTime int64) { new(Group), new(Task), new(TaskLog), + new(NotifyTpl), ) if beego.AppConfig.String("runmode") == "dev" { diff --git a/models/notify_tpl.go b/models/notify_tpl.go new file mode 100644 index 0000000..adde96f --- /dev/null +++ b/models/notify_tpl.go @@ -0,0 +1,102 @@ +/************************************************************ +** @Description: models +** @Author: Bee +** @Date: 2019-02-15 20:21 +** @Last Modified by: Bee +** @Last Modified time: 2019-02-15 20:21 +*************************************************************/ +package models + +import ( + "fmt" + "github.com/astaxie/beego/orm" + "time" +) + +type NotifyTpl struct { + Id int + Type string + TplName string + TplType int + Title string + Content string + Status int + CreateId int + UpdateId int + CreateTime int64 + UpdateTime int64 +} + +func (t *NotifyTpl) TableName() string { + return TableName("notify_tpl") +} + +func (t *NotifyTpl) Update(fields ...string) error { + if t.TplName == "" { + return fmt.Errorf("模板名称不能为空") + } + + if t.Content == "" { + return fmt.Errorf("模板内容不能为空") + } + + if t.CreateTime == 0 { + t.CreateTime = time.Now().Unix() + } + + if _, err := orm.NewOrm().Update(t, fields...); err != nil { + return err + } + return nil +} + +func NotifyTplAdd(obj *NotifyTpl) (int64, error) { + if obj.TplName == "" { + return 0, fmt.Errorf("模板名称不能为空") + } + if obj.Content == "" { + return 0, fmt.Errorf("模板内容不能为空") + } + if obj.CreateTime == 0 { + obj.CreateTime = time.Now().Unix() + } + return orm.NewOrm().Insert(obj) +} + +func NotifyTplGetById(id int) (*NotifyTpl, error) { + obj := &NotifyTpl{ + Id: id, + } + err := orm.NewOrm().Read(obj) + if err != nil { + return nil, err + } + return obj, nil +} + +func NotifyTplGetByTplTypeList(tpl_type int) ([]*NotifyTpl, int64, error) { + list := make([]*NotifyTpl, 0) + total, err := orm.NewOrm().QueryTable(TableName("notify_tpl")).Filter("tpl_type", tpl_type).Filter("status", 1).All(&list) + return list, total, err +} + +func NotifyTplDelById(id int) error { + _, err := orm.NewOrm().QueryTable(TableName("notify_tpl")).Filter("id", id).Delete() + return err +} + +func NotifyTplGetList(page, pageSize int, filters ...interface{}) ([]*NotifyTpl, int64) { + + offset := (page - 1) * pageSize + list := make([]*NotifyTpl, 0) + query := orm.NewOrm().QueryTable(TableName("notify_tpl")) + if len(filters) > 0 { + l := len(filters) + for k := 0; k < l; k += 2 { + query = query.Filter(filters[k].(string), filters[k+1]) + } + } + total, _ := query.Count() + query.OrderBy("-id").Limit(pageSize, offset).All(&list) + return list, total +} diff --git a/models/task.go b/models/task.go index f338857..de69dda 100644 --- a/models/task.go +++ b/models/task.go @@ -2,8 +2,8 @@ ** @Description: models ** @Author: haodaquan ** @Date: 2018-06-11 21:26 -** @Last Modified by: haodaquan -** @Last Modified time: 2018-06-11 21:26 +** @Last Modified by: Bee +** @Last Modified time: 2019-02-15 21:32 *************************************************************/ package models @@ -35,6 +35,7 @@ type Task struct { Status int IsNotify int NotifyType int + NotifyTplId int NotifyUserIds string CreateId int UpdateId int diff --git a/ppgo_job2.sql b/ppgo_job2.sql index 485a12b..d43de1d 100644 --- a/ppgo_job2.sql +++ b/ppgo_job2.sql @@ -329,4 +329,44 @@ BEGIN; ALTER TABLE `pp_uc_admin` ADD `dingtalk` VARCHAR(64) NULL COMMENT '钉钉' AFTER `email`; COMMIT; +BEGIN; +ALTER TABLE `pp_task` ADD `notify_tpl_id` INT NOT NULL DEFAULT '0' COMMENT '通知模板id' AFTER `notify_type`; +COMMIT; + +BEGIN; +INSERT INTO `pp_uc_auth` VALUES(61, 17, '通知模板', '/notifytpl/list', 5, 'fa-file-o', 1, 1, 0, 1, 1, 0, 1550237874); +INSERT INTO `pp_uc_auth` VALUES(62, 61, '新增', '/notifytpl/add', 1, '', 0, 1, 0, 1, 1, 0, 1550237919); +INSERT INTO `pp_uc_auth` VALUES(63, 61, '编辑', '/notifytpl/edit', 2, '', 0, 1, 1, 1, 1, 1550237957, 1550237957); +INSERT INTO `pp_uc_auth` VALUES(64, 61, '删除', '/notifytpl/ajaxdel', 3, '', 0, 1, 1, 1, 1, 1550237987, 1550237987); +INSERT INTO `pp_uc_auth` VALUES(65, 31, '通知类型', '/task/ajaxnotifytype', 10, '', 0, 1, 1, 1, 1, 1550258380, 1550258380); +COMMIT; + +-- +-- 表的结构 `pp_notify_tpl` +-- +DROP TABLE IF EXISTS `pp_uc_role_auth`; +CREATE TABLE `pp_notify_tpl` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '模板id', + `type` enum('system','default') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'default', + `tpl_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '模板名称', + `tpl_type` tinyint(1) NOT NULL COMMENT '模板类型 0:邮件;1:信息;2:钉钉;', + `title` varchar(64) DEFAULT NULL COMMENT '标题', + `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '模板内容', + `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 0:禁用;1:启用;', + `create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间', + `create_id` int(11) NOT NULL DEFAULT '0' COMMENT '创建者ID', + `update_time` int(11) NOT NULL DEFAULT '0' COMMENT '最后一次编辑时间', + `update_id` int(11) NOT NULL DEFAULT '0' COMMENT '最后一次编辑者ID', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='通知模板'; + +-- +-- 转存表中的数据 `pp_notify_tpl` +-- +BEGIN; +INSERT INTO `pp_notify_tpl` VALUES(1, 'system', '系统邮箱通知模板', 0, '定时任务异常:{TaskName}', 'Hello,定时任务出问题了:\r\n

任务执行详情:

\r\n

\r\n任务 ID:{TaskId}
\r\n任务名称:{TaskName}
\r\n执行时间:{CreateTime}
\r\n执行耗时:{ProcessTime}秒
\r\n执行状态:{Status}\r\n

\r\n

任务执行输出

\r\n

\r\n{TaskOut}\r\n

\r\n
\r\n
\r\n

-----------------------------------------------------------------
\r\n本邮件由定时系统自动发出,请勿回复
\r\n如果要取消邮件通知,请登录到系统进行设置
\r\n

', 1, 1550255030, 1, 1550256410, 1); +INSERT INTO `pp_notify_tpl` VALUES(2, 'system', '系统短信通知模板', 1, '', '{\r\n \"task_id\": \"{TaskId}\",\r\n \"task_name\": \"{TaskName}\",\r\n \"status\": \"{Status}\"\r\n}', 1, 1550255030, 1, 1550269363, 1); +INSERT INTO `pp_notify_tpl` VALUES(3, 'system', '系统钉钉通知模板', 2, '', '任务执行异常详情:\r\n任务 ID:{TaskId}\r\n任务名称:{TaskName}\r\n执行时间:{CreateTime}\r\n执行耗时:{ProcessTime}秒\r\n执行状态:{Status}\r\n任务执行输出:\r\n{TaskOut}', 1, 1550255030, 1, 1550269952, 1); +COMMIT; + SET FOREIGN_KEY_CHECKS = 1; diff --git a/routers/router.go b/routers/router.go index dd583fa..c091ef1 100644 --- a/routers/router.go +++ b/routers/router.go @@ -28,4 +28,5 @@ func init() { beego.AutoRouter(&controllers.AdminController{}) beego.AutoRouter(&controllers.UserController{}) + beego.AutoRouter(&controllers.NotifyTplController{}) } diff --git a/views/notifytpl/add.html b/views/notifytpl/add.html new file mode 100644 index 0000000..8a27164 --- /dev/null +++ b/views/notifytpl/add.html @@ -0,0 +1,103 @@ +
+ +
+ +
+ +
+ +
+
+
+ +
+ +
+ + + +
+
+
+ +
+ +
+ +
+
+
+ +
+ +
+ +
+
+
+
+  任务 ID {TaskId}
+  任务名称 {TaskName}
+  执行时间 {CreateTime}
+  执行耗时 {ProcessTime}
+  执行状态 {Status}
+  任务输出 {TaskOut}
+
+                
+
+
+ +
+ +
+ + +
+
+
+ + +
+ +
+ +
+
+
+
+ \ No newline at end of file diff --git a/views/notifytpl/edit.html b/views/notifytpl/edit.html new file mode 100644 index 0000000..9fd6719 --- /dev/null +++ b/views/notifytpl/edit.html @@ -0,0 +1,103 @@ +
+ +
+ +
+ +
+ +
+
+
+ +
+ +
+ + + +
+
+
+ +
+ +
+ +
+
+
+ +
+ +
+ +
+
+
+
+  任务 ID {TaskId}
+  任务名称 {TaskName}
+  执行时间 {CreateTime}
+  执行耗时 {ProcessTime}
+  执行状态 {Status}
+  任务输出 {TaskOut}
+
+                
+
+
+ +
+ +
+ + +
+
+
+ + +
+ +
+ +
+
+
+
+ \ No newline at end of file diff --git a/views/notifytpl/list.html b/views/notifytpl/list.html new file mode 100644 index 0000000..82cd29a --- /dev/null +++ b/views/notifytpl/list.html @@ -0,0 +1,107 @@ +
+
+
+ +
+
+
+
+
+ +
+ +
+
+ +
+
+ + +
+ + +
+ \ No newline at end of file diff --git a/views/public/main.html b/views/public/main.html index 3e26bbc..a1ffc36 100644 --- a/views/public/main.html +++ b/views/public/main.html @@ -38,7 +38,7 @@