diff --git a/api/device.go b/api/device.go index d0edbda..4d564bd 100644 --- a/api/device.go +++ b/api/device.go @@ -41,3 +41,31 @@ func DeviceShow(c *gin.Context) { "devices": response, }) } + +func DeviceDelete(c *gin.Context) { + var request struct { + DevID uint `json:"devid"` + } + + if err := c.BindJSON(&request); err != nil { + status.UpdateCode(c, status.InvalidRequest) + return + } + + deviceModel := model.GetDeviceByDevID(request.DevID) + if deviceModel.Online { + status.UpdateCode(c, status.CannotDeleteOnlineDevice) + return + } + + netModel := model.GetNetByNetID(deviceModel.NetID) + + user := c.MustGet("user").(*model.User) + if user.ID != netModel.UserID { + status.UpdateCode(c, status.DeviceNotExists) + return + } + + deviceModel.Delete() + status.UpdateSuccess(c, nil) +} diff --git a/candy/net.go b/candy/net.go index f38b3f8..7412c27 100644 --- a/candy/net.go +++ b/candy/net.go @@ -125,7 +125,7 @@ func (net *Net) updateHost() string { return uint32ToStrIp(net.net | net.host) } -func (net *Net) Close() { +func (net *Net) close() { net.ipWsMapMutex.Lock() defer net.ipWsMapMutex.Unlock() for ip, ws := range net.ipWsMap { @@ -179,7 +179,7 @@ func DeleteNet(netid uint) { defer idNetMapMutex.Unlock() if net, ok := idNetMap[netid]; ok { - net.Close() + net.close() } delete(idNetMap, netid) @@ -190,7 +190,7 @@ func ReloadNet(netid uint) { defer idNetMapMutex.Unlock() if net, ok := idNetMap[netid]; ok { - net.Close() + net.close() } } diff --git a/frontend/src/components/normal/DeviceView.vue b/frontend/src/components/normal/DeviceView.vue index ab73d98..aea0d61 100644 --- a/frontend/src/components/normal/DeviceView.vue +++ b/frontend/src/components/normal/DeviceView.vue @@ -4,7 +4,17 @@
- + + +
@@ -74,6 +84,11 @@ const deviceColumns = [ dataIndex: 'version', key: 'version', align: 'center' + }, + { + title: 'Action', + key: 'action', + align: 'center' } ] @@ -117,6 +132,19 @@ const updateNetMap = async () => { ) } } + +const deleteDevice = async (record) => { + console.log(record) + const response = await axios.post('/api/device/delete', { + devid: record.devid + }) + + const status = response.data.status + if (status == 0) { + updateDeviceSource() + } +} + onBeforeMount(() => { updateNetMap() }) diff --git a/main.go b/main.go index 644d4e7..ee8d73b 100644 --- a/main.go +++ b/main.go @@ -45,6 +45,7 @@ func main() { device := r.Group("/api/device") device.POST("/show", api.DeviceShow) + device.POST("/delete", api.DeviceDelete) route := r.Group("/api/route") route.POST("/show", api.RouteShow) diff --git a/model/device.go b/model/device.go index 2547411..2d6b549 100644 --- a/model/device.go +++ b/model/device.go @@ -36,32 +36,55 @@ func (d *Device) Save() { } } -func GetDevicesByNetID(netid uint) (devices []Device) { +func (d *Device) Delete() { db := storage.Get() - db.Where(&Device{NetID: netid}).Find(&devices) + db.Delete(d) +} + +func GetDeviceByDevID(devid uint) (device Device) { + if devid != 0 { + db := storage.Get() + db.Where(&Device{Model: gorm.Model{ID: devid}}).Find(&device) + } + return +} + +func GetDevicesByNetID(netid uint) (devices []Device) { + if netid != 0 { + db := storage.Get() + db.Where(&Device{NetID: netid}).Find(&devices) + } return } func GetDevicesByUserID(userid uint) (devices []Device) { - db := storage.Get() - db.Model(&Device{}).Joins("left join nets on devices.net_id = nets.id").Where("nets.user_id = ?", userid).Find(&devices) + if userid != 0 { + db := storage.Get() + db.Model(&Device{}).Joins("left join nets on devices.net_id = nets.id").Where("nets.user_id = ?", userid).Find(&devices) + } return } func GetRxSumByUserID(userid uint) (rx uint64) { - db := storage.Get() - db.Model(&Device{}).Select("sum(rx)").Joins("left join nets on devices.net_id = nets.id").Where("nets.user_id = ?", userid).Take(&rx) + if userid != 0 { + db := storage.Get() + db.Model(&Device{}).Select("sum(rx)").Joins("left join nets on devices.net_id = nets.id").Where("nets.user_id = ?", userid).Take(&rx) + } return } func GetTxSumByUserID(userid uint) (tx uint64) { - db := storage.Get() - db.Model(&Device{}).Select("sum(tx)").Joins("left join nets on devices.net_id = nets.id").Where("nets.user_id = ?", userid).Take(&tx) + if userid != 0 { + db := storage.Get() + db.Model(&Device{}).Select("sum(tx)").Joins("left join nets on devices.net_id = nets.id").Where("nets.user_id = ?", userid).Take(&tx) + } return } func DeleteDevicesByNetID(netid uint) (devices []Device) { - db := storage.Get() - db.Where(&Device{NetID: netid}).Delete(&Device{}) + if netid != 0 { + db := storage.Get() + db.Where(&Device{NetID: netid}).Delete(&Device{}) + } return } diff --git a/model/net.go b/model/net.go index b47ec33..aeae179 100644 --- a/model/net.go +++ b/model/net.go @@ -47,7 +47,7 @@ func GetNets() (nets []Net) { func GetNetByNetID(netid uint) (net Net) { if netid != 0 { db := storage.Get() - db.Where(&Net{Model: gorm.Model{ID: netid}}).Take(&net) + db.Where(&Net{Model: gorm.Model{ID: netid}}).Unscoped().Take(&net) } return } diff --git a/status/status.go b/status/status.go index 69b0dd0..00aee33 100644 --- a/status/status.go +++ b/status/status.go @@ -27,6 +27,8 @@ func init() { statusMessage[CannotDeleteAdmin] = "cannot delete admin" statusMessage[InvalidIPAddress] = "invalid ip address" statusMessage[RouteNotExists] = "route not exists" + statusMessage[DeviceNotExists] = "device not exists" + statusMessage[CannotDeleteOnlineDevice] = "cannot delete online device" } const ( @@ -49,6 +51,8 @@ const ( CannotDeleteAdmin InvalidIPAddress RouteNotExists + DeviceNotExists + CannotDeleteOnlineDevice ) var statusMessage map[int]string