diff --git a/backend/model/schedule.go b/backend/model/schedule.go
index 39e1244f..c1923885 100644
--- a/backend/model/schedule.go
+++ b/backend/model/schedule.go
@@ -12,15 +12,18 @@ import (
)
type Schedule struct {
- Id bson.ObjectId `json:"_id" bson:"_id"`
- Name string `json:"name" bson:"name"`
- Description string `json:"description" bson:"description"`
- SpiderId bson.ObjectId `json:"spider_id" bson:"spider_id"`
- NodeId bson.ObjectId `json:"node_id" bson:"node_id"`
- NodeKey string `json:"node_key" bson:"node_key"`
- Cron string `json:"cron" bson:"cron"`
- EntryId cron.EntryID `json:"entry_id" bson:"entry_id"`
- Param string `json:"param" bson:"param"`
+ Id bson.ObjectId `json:"_id" bson:"_id"`
+ Name string `json:"name" bson:"name"`
+ Description string `json:"description" bson:"description"`
+ SpiderId bson.ObjectId `json:"spider_id" bson:"spider_id"`
+ //NodeId bson.ObjectId `json:"node_id" bson:"node_id"`
+ //NodeKey string `json:"node_key" bson:"node_key"`
+ Cron string `json:"cron" bson:"cron"`
+ EntryId cron.EntryID `json:"entry_id" bson:"entry_id"`
+ Param string `json:"param" bson:"param"`
+ RunType string `json:"run_type" bson:"run_type"`
+ NodeIds []bson.ObjectId `json:"node_ids" bson:"node_ids"`
+
// 状态
Status string `json:"status" bson:"status"`
@@ -49,26 +52,26 @@ func (sch *Schedule) Delete() error {
return c.RemoveId(sch.Id)
}
-func (sch *Schedule) SyncNodeIdAndSpiderId(node Node, spider Spider) {
- sch.syncNodeId(node)
- sch.syncSpiderId(spider)
-}
+//func (sch *Schedule) SyncNodeIdAndSpiderId(node Node, spider Spider) {
+// sch.syncNodeId(node)
+// sch.syncSpiderId(spider)
+//}
-func (sch *Schedule) syncNodeId(node Node) {
- if node.Id.Hex() == sch.NodeId.Hex() {
- return
- }
- sch.NodeId = node.Id
- _ = sch.Save()
-}
+//func (sch *Schedule) syncNodeId(node Node) {
+// if node.Id.Hex() == sch.NodeId.Hex() {
+// return
+// }
+// sch.NodeId = node.Id
+// _ = sch.Save()
+//}
-func (sch *Schedule) syncSpiderId(spider Spider) {
- if spider.Id.Hex() == sch.SpiderId.Hex() {
- return
- }
- sch.SpiderId = spider.Id
- _ = sch.Save()
-}
+//func (sch *Schedule) syncSpiderId(spider Spider) {
+// if spider.Id.Hex() == sch.SpiderId.Hex() {
+// return
+// }
+// sch.SpiderId = spider.Id
+// _ = sch.Save()
+//}
func GetScheduleList(filter interface{}) ([]Schedule, error) {
s, c := database.GetCol("schedules")
@@ -81,20 +84,20 @@ func GetScheduleList(filter interface{}) ([]Schedule, error) {
var schs []Schedule
for _, schedule := range schedules {
- // 获取节点名称
- if schedule.NodeId == bson.ObjectIdHex(constants.ObjectIdNull) {
- // 选择所有节点
- schedule.NodeName = "All Nodes"
- } else {
- // 选择单一节点
- node, err := GetNode(schedule.NodeId)
- if err != nil {
- schedule.Status = constants.ScheduleStatusError
- schedule.Message = constants.ScheduleStatusErrorNotFoundNode
- } else {
- schedule.NodeName = node.Name
- }
- }
+ // TODO: 获取节点名称
+ //if schedule.NodeId == bson.ObjectIdHex(constants.ObjectIdNull) {
+ // // 选择所有节点
+ // schedule.NodeName = "All Nodes"
+ //} else {
+ // // 选择单一节点
+ // node, err := GetNode(schedule.NodeId)
+ // if err != nil {
+ // schedule.Status = constants.ScheduleStatusError
+ // schedule.Message = constants.ScheduleStatusErrorNotFoundNode
+ // } else {
+ // schedule.NodeName = node.Name
+ // }
+ //}
// 获取爬虫名称
spider, err := GetSpider(schedule.SpiderId)
@@ -130,12 +133,13 @@ func UpdateSchedule(id bson.ObjectId, item Schedule) error {
if err := c.FindId(id).One(&result); err != nil {
return err
}
- node, err := GetNode(item.NodeId)
- if err != nil {
- return err
- }
+ //node, err := GetNode(item.NodeId)
+ //if err != nil {
+ // return err
+ //}
- item.NodeKey = node.Key
+ item.UpdateTs = time.Now()
+ //item.NodeKey = node.Key
if err := item.Save(); err != nil {
return err
}
@@ -146,15 +150,15 @@ func AddSchedule(item Schedule) error {
s, c := database.GetCol("schedules")
defer s.Close()
- node, err := GetNode(item.NodeId)
- if err != nil {
- return err
- }
+ //node, err := GetNode(item.NodeId)
+ //if err != nil {
+ // return err
+ //}
item.Id = bson.NewObjectId()
item.CreateTs = time.Now()
item.UpdateTs = time.Now()
- item.NodeKey = node.Key
+ //item.NodeKey = node.Key
if err := c.Insert(&item); err != nil {
debug.PrintStack()
diff --git a/backend/routes/task.go b/backend/routes/task.go
index 6b91ed66..d5e3cacc 100644
--- a/backend/routes/task.go
+++ b/backend/routes/task.go
@@ -119,7 +119,6 @@ func PutTask(c *gin.Context) {
return
}
}
-
} else if reqBody.RunType == constants.RunTypeRandom {
// 随机
t := model.Task{
@@ -130,7 +129,6 @@ func PutTask(c *gin.Context) {
HandleError(http.StatusInternalServerError, c, err)
return
}
-
} else if reqBody.RunType == constants.RunTypeSelectedNodes {
// 指定节点
for _, nodeId := range reqBody.NodeIds {
@@ -145,7 +143,6 @@ func PutTask(c *gin.Context) {
return
}
}
-
} else {
HandleErrorF(http.StatusInternalServerError, c, "invalid run_type")
return
diff --git a/backend/services/schedule.go b/backend/services/schedule.go
index 7a8defde..53938aea 100644
--- a/backend/services/schedule.go
+++ b/backend/services/schedule.go
@@ -7,7 +7,7 @@ import (
"errors"
"github.com/apex/log"
"github.com/globalsign/mgo/bson"
- "github.com/satori/go.uuid"
+ uuid "github.com/satori/go.uuid"
"runtime/debug"
)
@@ -19,48 +19,87 @@ type Scheduler struct {
func AddScheduleTask(s model.Schedule) func() {
return func() {
- node, err := model.GetNodeByKey(s.NodeKey)
- if err != nil || node.Id.Hex() == "" {
- log.Errorf("get node by key error: %s", err.Error())
- debug.PrintStack()
- return
- }
-
- spider := model.GetSpiderByName(s.SpiderName)
- if spider == nil || spider.Id.Hex() == "" {
- log.Errorf("get spider by name error: %s", err.Error())
- debug.PrintStack()
- return
- }
-
- // 同步ID到定时任务
- s.SyncNodeIdAndSpiderId(node, *spider)
-
// 生成任务ID
id := uuid.NewV4()
- // 生成任务模型
- t := model.Task{
- Id: id.String(),
- SpiderId: spider.Id,
- NodeId: node.Id,
- Status: constants.StatusPending,
- Param: s.Param,
- }
+ if s.RunType == constants.RunTypeAllNodes {
+ // 所有节点
+ nodes, err := model.GetNodeList(nil)
+ if err != nil {
+ return
+ }
+ for _, node := range nodes {
+ t := model.Task{
+ Id: id.String(),
+ SpiderId: s.SpiderId,
+ NodeId: node.Id,
+ Param: s.Param,
+ }
- // 将任务存入数据库
- if err := model.AddTask(t); err != nil {
- log.Errorf(err.Error())
- debug.PrintStack()
+ if err := AddTask(t); err != nil {
+ return
+ }
+ if err := AssignTask(t); err != nil {
+ log.Errorf(err.Error())
+ debug.PrintStack()
+ return
+ }
+ }
+ } else if s.RunType == constants.RunTypeRandom {
+ // 随机
+ t := model.Task{
+ Id: id.String(),
+ SpiderId: s.SpiderId,
+ Param: s.Param,
+ }
+ if err := AddTask(t); err != nil {
+ return
+ }
+ if err := AssignTask(t); err != nil {
+ log.Errorf(err.Error())
+ debug.PrintStack()
+ return
+ }
+ } else if s.RunType == constants.RunTypeSelectedNodes {
+ // 指定节点
+ for _, nodeId := range s.NodeIds {
+ t := model.Task{
+ Id: id.String(),
+ SpiderId: s.SpiderId,
+ NodeId: nodeId,
+ Param: s.Param,
+ }
+
+ if err := AddTask(t); err != nil {
+ return
+ }
+
+ if err := AssignTask(t); err != nil {
+ log.Errorf(err.Error())
+ debug.PrintStack()
+ return
+ }
+ }
+ } else {
return
}
- // 加入任务队列
- if err := AssignTask(t); err != nil {
- log.Errorf(err.Error())
- debug.PrintStack()
- return
- }
+ //node, err := model.GetNodeByKey(s.NodeKey)
+ //if err != nil || node.Id.Hex() == "" {
+ // log.Errorf("get node by key error: %s", err.Error())
+ // debug.PrintStack()
+ // return
+ //}
+ //
+ //spider := model.GetSpiderByName(s.SpiderName)
+ //if spider == nil || spider.Id.Hex() == "" {
+ // log.Errorf("get spider by name error: %s", err.Error())
+ // debug.PrintStack()
+ // return
+ //}
+ //
+ //// 同步ID到定时任务
+ //s.SyncNodeIdAndSpiderId(node, *spider)
}
}
diff --git a/frontend/src/store/modules/schedule.js b/frontend/src/store/modules/schedule.js
index 7c705ac3..e71d5f03 100644
--- a/frontend/src/store/modules/schedule.js
+++ b/frontend/src/store/modules/schedule.js
@@ -1,7 +1,9 @@
import request from '../../api/request'
const state = {
scheduleList: [],
- scheduleForm: {}
+ scheduleForm: {
+ node_ids: []
+ }
}
const getters = {}
diff --git a/frontend/src/views/schedule/ScheduleList.vue b/frontend/src/views/schedule/ScheduleList.vue
index 7a49f808..c54b292b 100644
--- a/frontend/src/views/schedule/ScheduleList.vue
+++ b/frontend/src/views/schedule/ScheduleList.vue
@@ -14,15 +14,15 @@
-
-
+
+
-
-
+
+
-
+
-
@@ -116,6 +115,13 @@
+
+
+ {{$t('All Nodes')}}
+ {{$t('Selected Nodes')}}
+ {{$t('Random')}}
+
+
-
+
@@ -162,6 +168,7 @@ export default {
columns: [
{ name: 'name', label: 'Name', width: '180' },
{ name: 'cron', label: 'Cron', width: '120' },
+ { name: 'run_type', label: 'Run Type', width: '150' },
{ name: 'node_name', label: 'Node', width: '150' },
{ name: 'spider_name', label: 'Spider', width: '150' },
{ name: 'param', label: 'Parameters', width: '150' },
@@ -204,7 +211,7 @@ export default {
onAdd () {
this.isEdit = false
this.dialogVisible = true
- this.$store.commit('schedule/SET_SCHEDULE_FORM', {})
+ this.$store.commit('schedule/SET_SCHEDULE_FORM', { node_ids: [] })
this.$st.sendEv('定时任务', '添加')
},
onAddSubmit () {
@@ -308,6 +315,15 @@ export default {
} else {
return false
}
+ },
+ getStatusTooltip (row) {
+ if (row.status === 'stop') {
+ return 'Start'
+ } else if (row.status === 'running') {
+ return 'Stop'
+ } else if (row.status === 'error') {
+ return 'Start'
+ }
}
},
created () {