From d913d7c40f1719c3fce511ef836a8cccb5ffc66d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=AF=E9=98=B3?= <1656488874@qq.com> Date: Wed, 21 Aug 2019 14:37:55 +0800 Subject: [PATCH] =?UTF-8?q?fix=20TagsView.vue=20=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E6=8A=A5=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20update=20=E8=8A=82=E7=82=B9=E6=B3=A8=E5=86=8C=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E7=8B=AC=E7=AB=8B=E7=9A=84key=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=EF=BC=8C=E8=80=8C=E4=B8=8D=E6=98=AF=E4=BD=BF=E7=94=A8mac?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/model/node.go | 8 ++- backend/services/node.go | 70 ++++++++++++------- backend/services/register/register.go | 58 +++++++++------ .../src/views/layout/components/TagsView.vue | 24 ++++--- 4 files changed, 98 insertions(+), 62 deletions(-) diff --git a/backend/model/node.go b/backend/model/node.go index 01bbd3f7..61c20473 100644 --- a/backend/model/node.go +++ b/backend/model/node.go @@ -17,13 +17,15 @@ type Node struct { Port string `json:"port" bson:"port"` Mac string `json:"mac" bson:"mac"` Description string `json:"description" bson:"description"` + // 用于唯一标识节点,可能是mac地址,可能是ip地址 + Key string `json:"key" bson:"key"` // 前端展示 IsMaster bool `json:"is_master"` UpdateTs time.Time `json:"update_ts" bson:"update_ts"` CreateTs time.Time `json:"create_ts" bson:"create_ts"` - UpdateTsUnix int64 `json:"update_ts_unix" bson:"update_ts_unix"` + UpdateTsUnix int64 `json:"update_ts_unix" bson:"update_ts_unix"` } func (n *Node) Save() error { @@ -98,12 +100,12 @@ func GetNode(id bson.ObjectId) (Node, error) { return node, nil } -func GetNodeByMac(mac string) (Node, error) { +func GetNodeByKey(key string) (Node, error) { s, c := database.GetCol("nodes") defer s.Close() var node Node - if err := c.Find(bson.M{"mac": mac}).One(&node); err != nil { + if err := c.Find(bson.M{"key": key}).One(&node); err != nil { if err != mgo.ErrNotFound { log.Errorf(err.Error()) debug.PrintStack() diff --git a/backend/services/node.go b/backend/services/node.go index e5c8062a..1fa2370c 100644 --- a/backend/services/node.go +++ b/backend/services/node.go @@ -16,6 +16,7 @@ import ( ) type Data struct { + Key string `json:"key"` Mac string `json:"mac"` Ip string `json:"ip"` Master bool `json:"master"` @@ -51,10 +52,9 @@ const ( // 获取本机节点 func GetCurrentNode() (model.Node, error) { - // 获取本机MAC地址 - value, err := register.GetRegister().GetValue() + // 获得注册的key值 + key, err := register.GetRegister().GetKey() if err != nil { - debug.PrintStack() return model.Node{}, err } @@ -68,8 +68,7 @@ func GetCurrentNode() (model.Node, error) { } // 尝试获取节点 - node, err = model.GetNodeByMac(value) - + node, err = model.GetNodeByKey(key) // 如果获取失败 if err != nil { // 如果为主节点,表示为第一次注册,插入节点信息 @@ -80,12 +79,26 @@ func GetCurrentNode() (model.Node, error) { debug.PrintStack() return model.Node{}, err } + + mac, err := register.GetRegister().GetMac() + if err != nil { + debug.PrintStack() + return model.Node{}, err + } + + key, err := register.GetRegister().GetKey() + if err != nil { + debug.PrintStack() + return model.Node{}, err + } + // 生成节点 node = model.Node{ + Key: key, Id: bson.NewObjectId(), Ip: ip, - Name: value, - Mac: value, + Name: key, + Mac: mac, IsMaster: true, } if err := node.Add(); err != nil { @@ -100,11 +113,9 @@ func GetCurrentNode() (model.Node, error) { time.Sleep(5 * time.Second) continue } - // 跳出循环 break } - return node, nil } @@ -122,12 +133,12 @@ func IsMasterNode(id string) bool { // 获取节点数据 func GetNodeData() (Data, error) { - val, err := register.GetRegister().GetValue() - if err != nil { + key, err := register.GetRegister().GetKey() + if key == "" { return Data{}, err } - value, err := database.RedisClient.HGet("nodes", val) + value, err := database.RedisClient.HGet("nodes", key) data := Data{} if err := json.Unmarshal([]byte(value), &data); err != nil { return data, err @@ -145,9 +156,9 @@ func UpdateNodeStatus() { } // 遍历节点keys - for _, mac := range list { + for _, key := range list { // 获取节点数据 - value, err := database.RedisClient.HGet("nodes", mac) + value, err := database.RedisClient.HGet("nodes", key) if err != nil { log.Errorf(err.Error()) return @@ -163,7 +174,7 @@ func UpdateNodeStatus() { // 如果记录的更新时间超过60秒,该节点被认为离线 if time.Now().Unix()-data.UpdateTsUnix > 60 { // 在Redis中删除该节点 - if err := database.RedisClient.HDel("nodes", data.Mac); err != nil { + if err := database.RedisClient.HDel("nodes", data.Key); err != nil { log.Errorf(err.Error()) return } @@ -172,7 +183,7 @@ func UpdateNodeStatus() { s, c := database.GetCol("nodes") defer s.Close() var node model.Node - if err := c.Find(bson.M{"mac": mac}).One(&node); err != nil { + if err := c.Find(bson.M{"key": key}).One(&node); err != nil { log.Errorf(err.Error()) debug.PrintStack() return @@ -189,14 +200,16 @@ func UpdateNodeStatus() { s, c := database.GetCol("nodes") defer s.Close() var node model.Node - if err := c.Find(bson.M{"mac": mac}).One(&node); err != nil { + if err := c.Find(bson.M{"key": key}).One(&node); err != nil { // 数据库不存在该节点 node = model.Node{ - Name: data.Mac, - Ip: data.Ip, - Port: "8000", - Mac: data.Mac, - Status: constants.StatusOnline, + Key: key, + Name: key, + Ip: data.Ip, + Port: "8000", + Mac: data.Mac, + Status: constants.StatusOnline, + IsMaster: data.Master, } if err := node.Add(); err != nil { log.Errorf(err.Error()) @@ -216,8 +229,8 @@ func UpdateNodeStatus() { nodes, err := model.GetNodeList(nil) for _, node := range nodes { hasNode := false - for _, mac := range list { - if mac == node.Mac { + for _, key := range list { + if key == node.Key { hasNode = true break } @@ -236,7 +249,7 @@ func UpdateNodeStatus() { // 更新节点数据 func UpdateNodeData() { // 获取MAC地址 - val, err := register.GetRegister().GetValue() + mac, err := register.GetRegister().GetMac() if err != nil { log.Errorf(err.Error()) return @@ -248,10 +261,13 @@ func UpdateNodeData() { log.Errorf(err.Error()) return } + // 获取redis的key + key, err := register.GetRegister().GetKey() // 构造节点数据 data := Data{ - Mac: val, + Key: key, + Mac: mac, Ip: ip, Master: IsMaster(), UpdateTs: time.Now(), @@ -265,7 +281,7 @@ func UpdateNodeData() { debug.PrintStack() return } - if err := database.RedisClient.HSet("nodes", val, string(dataBytes)); err != nil { + if err := database.RedisClient.HSet("nodes", key, string(dataBytes)); err != nil { log.Errorf(err.Error()) return } diff --git a/backend/services/register/register.go b/backend/services/register/register.go index 8f0d169e..ccd8b67d 100644 --- a/backend/services/register/register.go +++ b/backend/services/register/register.go @@ -10,50 +10,44 @@ import ( type Register interface { // 注册的key类型 - GetKey() string + GetType() string // 注册的key的值,唯一标识节点 - GetValue() (string, error) + GetKey() (string, error) // 注册的节点IP GetIp() (string, error) + // 注册节点的mac地址 + GetMac() (string, error) } -// mac 地址注册 +// ===================== mac 地址注册 ===================== type MacRegister struct{} -func (mac *MacRegister) GetKey() string { +func (mac *MacRegister) GetType() string { return "mac" } -func (mac *MacRegister) GetValue() (string, error) { - interfaces, err := net.Interfaces() - if err != nil { - log.Errorf("get interfaces error:" + err.Error()) - debug.PrintStack() - return "", err - } - for _, inter := range interfaces { - if inter.HardwareAddr != nil { - mac := inter.HardwareAddr.String() - return mac, nil - } - } - return "", nil +func (mac *MacRegister) GetKey() (string, error) { + return mac.GetMac() +} + +func (mac *MacRegister) GetMac() (string, error) { + return getMac() } func (mac *MacRegister) GetIp() (string, error) { return getIp() } -// ip 注册 +// ===================== ip 地址注册 ===================== type IpRegister struct { Ip string } -func (ip *IpRegister) GetKey() string { +func (ip *IpRegister) GetType() string { return "ip" } -func (ip *IpRegister) GetValue() (string, error) { +func (ip *IpRegister) GetKey() (string, error) { return ip.Ip, nil } @@ -61,6 +55,11 @@ func (ip *IpRegister) GetIp() (string, error) { return ip.Ip, nil } +func (ip *IpRegister) GetMac() (string, error) { + return getMac() +} + +// ===================== 公共方法 ===================== // 获取本机的IP地址 // TODO: 考虑多个IP地址的情况 func getIp() (string, error) { @@ -78,6 +77,23 @@ func getIp() (string, error) { return "", nil } +func getMac() (string, error) { + interfaces, err := net.Interfaces() + if err != nil { + log.Errorf("get interfaces error:" + err.Error()) + debug.PrintStack() + return "", err + } + for _, inter := range interfaces { + if inter.HardwareAddr != nil { + mac := inter.HardwareAddr.String() + return mac, nil + } + } + return "", nil +} + +// ===================== 获得注册简单工厂 ===================== var register Register // 获得注册器 diff --git a/frontend/src/views/layout/components/TagsView.vue b/frontend/src/views/layout/components/TagsView.vue index e97c8dc8..231b44f0 100644 --- a/frontend/src/views/layout/components/TagsView.vue +++ b/frontend/src/views/layout/components/TagsView.vue @@ -110,20 +110,22 @@ export default { }, moveToCurrentTag () { const tags = this.$refs.tag - this.$nextTick(() => { - for (const tag of tags) { - if (tag.to.path === this.$route.path) { - this.$refs.scrollPane.moveToTarget(tag) + if (tags) { + this.$nextTick(() => { + for (const tag of tags) { + if (tag.to.path === this.$route.path) { + this.$refs.scrollPane.moveToTarget(tag) - // when query is different then update - if (tag.to.fullPath !== this.$route.fullPath) { - this.$store.dispatch('updateVisitedView', this.$route) + // when query is different then update + if (tag.to.fullPath !== this.$route.fullPath) { + this.$store.dispatch('updateVisitedView', this.$route) + } + + break } - - break } - } - }) + }) + } }, refreshSelectedTag (view) { this.$store.dispatch('delCachedView', view).then(() => {