Kaynağa Gözat

熄屏亮屏、在线状态监测

chengqian 6 ay önce
ebeveyn
işleme
f3fe87e660

+ 19 - 0
server/api/v1/devices/dev_screens.go

@@ -82,6 +82,7 @@ func (s *ScreensApi) AddScreens(c *gin.Context) {
 		ScreensName:   sc.ScreensName,
 		ScreensCode:   sc.ScreensCode,
 		Sn:            sc.Sn,
+		Network:       sc.Network,
 		ScreensBrand:  sc.ScreensBrand,
 		ScreensModel:  sc.ScreensModel,
 		IPAddress:     sc.IpAddress,
@@ -119,6 +120,7 @@ func (s *ScreensApi) UpdateScreens(c *gin.Context) {
 		ScreensName:   sc.ScreensName,
 		ScreensCode:   sc.ScreensCode,
 		Sn:            sc.Sn,
+		Network:       sc.Network,
 		ScreensBrand:  sc.ScreensBrand,
 		ScreensModel:  sc.ScreensModel,
 		IPAddress:     sc.IpAddress,
@@ -137,3 +139,20 @@ func (s *ScreensApi) UpdateScreens(c *gin.Context) {
 	}
 	response.OkWithMessage("设置成功", c)
 }
+
+// 熄屏-亮屏幕
+func (s *ScreensApi) SwitchScreens(c *gin.Context) {
+	var swch model.SwitchScreens
+	err := c.ShouldBindJSON(&swch)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	err = ScreensService.SwitchScreens(swch)
+	if err != nil {
+		global.GVA_LOG.Error("操作失败!", zap.Error(err))
+		response.FailWithMessage("操作失败", c)
+		return
+	}
+	response.OkWithMessage("操作成功", c)
+}

+ 11 - 5
server/dao/devices/dev_screens.go

@@ -12,6 +12,7 @@ type Screens struct {
 	ScreensName   string         `gorm:"type:varchar(64)" json:"screensName"`     //设备名称
 	ScreensCode   string         `gorm:"type:varchar(64)" json:"screensCode"`     //设备编码
 	Sn            string         `gorm:"type:varchar(64)" json:"sn"`              //设备sn
+	Network       int            `gorm:"type:int" json:"network"`                 //组网方式 0代表网关 1代表4G模块
 	GatewayId     int            `gorm:"type:int" json:"gatewayId"`               //所属网关
 	ScreensBrand  string         `gorm:"type:varchar(60)" json:"screensBrand"`    //屏幕品牌
 	ScreensModel  string         `gorm:"type:varchar(60)" json:"screensModel"`    //屏幕型号
@@ -51,12 +52,13 @@ func (s Screens) AddScreens() error {
 
 func (s Screens) UpdateScreens() error {
 	err := global.GVA_DB.Model(&s).
-		Select("screens_name", "screens_code", "sn", "gateway_id", "screens_brand", "screens_model", "ip_address", "install_time", "shunt", "shunt_describe", "resolution_id", "screens_size_id").
+		Select("screens_name", "screens_code", "sn", "network", "gateway_id", "screens_brand", "screens_model", "ip_address", "install_time", "shunt", "shunt_describe", "resolution_id", "screens_size_id").
 		Where("id=?", s.ID).
 		Updates(map[string]interface{}{
 			"screens_name":    s.ScreensName,
 			"screens_code":    s.ScreensCode,
 			"sn":              s.Sn,
+			"network":         s.Network,
 			"gateway_id":      s.GatewayId,
 			"screens_brand":   s.ScreensBrand,
 			"screens_model":   s.ScreensModel,
@@ -115,7 +117,7 @@ func UpdateScreensStatus(code string, sta request.DeviceStatus) error {
 	//		"status": status,
 	//	}).Error
 	//return err
-	return global.GVA_DB.Model(&screens).Where("screens_code = ?", code).Updates(Screens{
+	return global.GVA_DB.Model(&screens).Debug().Where("screens_code = ?", code).Updates(Screens{
 		Status:        sta.Status,
 		PlayStatus:    sta.PlayStatus,
 		DisplayStatus: sta.DisplayStatus,
@@ -123,7 +125,11 @@ func UpdateScreensStatus(code string, sta request.DeviceStatus) error {
 	}).Error
 }
 
-func QueryAllScreens() (screensList []Screens) {
-	_ = global.GVA_DB.Model(&Screens{}).Find(&screensList)
-	return screensList
+// 根据sn查询设备是否存在
+func QueryScreenBySn(sn string) (screens Screens, err error) {
+	err = global.GVA_DB.Model(&screens).Where("sn = ?", sn).First(&screens).Error
+	if err != nil {
+		return Screens{}, err
+	}
+	return screens, nil
 }

+ 1 - 1
server/main.go

@@ -6,7 +6,7 @@ import (
 	"server/core"
 	"server/global"
 	"server/initialize"
-	"server/tcp"
+	"server/service/tcp"
 	"server/utils"
 	"server/utils/logger"
 	"server/utils/mqtt"

+ 7 - 0
server/model/devices/dev_screens.go

@@ -16,6 +16,7 @@ type ReqScreens struct {
 	ScreensName   string    `json:"screensName"`   //名称
 	ScreensCode   string    `json:"screensCode"`   //设备编号
 	Sn            string    `json:"sn"`            //sn
+	Network       int       `json:"network"`       //组网方式
 	ScreensBrand  string    `json:"screensBrand"`  //品牌
 	ScreensModel  string    `json:"screensModel"`  //型号
 	IpAddress     string    `json:"ipAddress"`     //IP地址
@@ -26,3 +27,9 @@ type ReqScreens struct {
 	ShuntDescribe string    `json:"shuntDescribe"` //分路描述
 	InstallTime   time.Time `json:"installTime"`   //安装时间
 }
+
+type SwitchScreens struct {
+	Sn      string `json:"sn"`
+	Network int    `json:"network"`
+	Flag    int    `json:"flag"`
+}

+ 16 - 10
server/protocol/radar_test.go

@@ -1,8 +1,6 @@
 package protocol
 
 import (
-	"encoding/hex"
-	"fmt"
 	"testing"
 )
 
@@ -16,13 +14,21 @@ import (
 //fmt.Println("reply", reply)
 
 func Test_verify(t *testing.T) {
-	login := AuthDataPack{}.AuthLogin()
-	//fe5c4b89 2a000000 62 00000000 17000000 31 23 32303234 30393237 3035 3137 3230 3031 23 303630 23ffff
-	//fe5c4b89 2a000000 62 00000000 17000000 31 23 32303234 30393239 3037 3137 3237 3535 23 303630 23ffff
+	//login := AuthDataPack{}.AuthLogin()
+	////fe5c4b89 2a000000 62 00000000 17000000 31 23 32303234 30393237 3035 3137 3230 3031 23 303630 23ffff
+	////fe5c4b89 2a000000 62 00000000 17000000 31 23 32303234 30393239 3037 3137 3237 3535 23 303630 23ffff
+	//
+	//fmt.Println("loginBuf", login.Bytes())
+	//toString := hex.EncodeToString(login.Bytes())
+	//fmt.Println("toString", toString)
+	//reply, _ := hex.DecodeString(toString)
+	//fmt.Println("reply", reply)
 
-	fmt.Println("loginBuf", login.Bytes())
-	toString := hex.EncodeToString(login.Bytes())
-	fmt.Println("toString", toString)
-	reply, _ := hex.DecodeString(toString)
-	fmt.Println("reply", reply)
+	//reply, _ := hex.DecodeString("fe5c4b8913000000520000000000000000ffff")
+	//conn := tcp.DeviceConn["0800075608016688"]
+	//if conn == nil {
+	//	fmt.Println("Connection is nil")
+	//	return
+	//}
+	//conn.Write(reply)
 }

+ 9 - 0
server/protocol/screens_model.go

@@ -38,3 +38,12 @@ type AuthDataPack struct {
 	EndSeparator byte   //结束分隔符
 	End          []byte //包尾
 }
+
+type SwitchDataPack struct {
+	Head    []byte //包头 固定值0xFE 0x5C 0x4B 0x89
+	Len     []byte //报文总长度
+	Type    byte   //消息类型
+	Id      []byte //发送ID 固定值00 00 00 00
+	Reserve []byte //保留值  固定值00 00 00 00
+	End     []byte //包尾固定值 0xFF 0xFF
+}

+ 17 - 0
server/protocol/screens_service.go

@@ -45,6 +45,23 @@ func (x AuthDataPack) AuthLogin() *bytebufferpool.ByteBuffer {
 	return buf
 }
 
+// 开关屏幕
+func (x SwitchDataPack) SwitchScreens() *bytebufferpool.ByteBuffer {
+	buf := bytebufferpool.Get()
+	x.Head = []byte{0xFE, 0x5C, 0x4B, 0x89}
+	x.Len = []byte{0x13, 0x00, 0x00, 0x00}
+	x.Id = []byte{0x00, 0x00, 0x00, 0x00}
+	x.Reserve = []byte{0x00, 0x00, 0x00, 0x00}
+	x.End = []byte{0xFF, 0xFF}
+	buf.Write(x.Head)
+	buf.Write(x.Len)
+	buf.WriteByte(x.Type)
+	buf.Write(x.Id)
+	buf.Write(x.Reserve)
+	buf.Write(x.End)
+	return buf
+}
+
 func GetNowDate() (dateSlice [16]int) {
 	now := time.Now()
 	year, month, day := now.Date()

+ 4 - 3
server/router/devices/dev_screens.go

@@ -15,9 +15,10 @@ func (l *ScreensRouter) InitScreensRouter(Router *gin.RouterGroup, RouterPub *gi
 	apiPublicRouterWithoutRecord := RouterPub.Group("screens")
 	baseApi := v1.ApiGroupApp.DevicesApiGroup.ScreensApi
 	{
-		screensRouter.PUT("updateScreens", baseApi.UpdateScreens) //编辑显示屏
-		screensRouter.POST("addScreens", baseApi.AddScreens)      //添加显示屏
-		screensRouter.DELETE("delScreens", baseApi.DelScreens)    // 删除显示屏
+		screensRouter.PUT("updateScreens", baseApi.UpdateScreens)  //编辑显示屏
+		screensRouter.POST("addScreens", baseApi.AddScreens)       //添加显示屏
+		screensRouter.DELETE("delScreens", baseApi.DelScreens)     // 删除显示屏
+		screensRouter.POST("switchScreens", baseApi.SwitchScreens) // 熄屏-亮屏
 	}
 	{
 		screensRouterWithoutRecord.POST("getScreensList", baseApi.ScreensList) // 分页获取网关列表

+ 16 - 0
server/service/devices/dev_screens.go

@@ -6,6 +6,7 @@ import (
 	"server/dao/devices"
 	"server/model/common/request"
 	model "server/model/devices"
+	"server/service/tcp"
 	"server/utils/logger"
 )
 
@@ -57,3 +58,18 @@ func (screensService *ScreensService) UpdateScreens(screens devices.Screens) err
 	err := screens.UpdateScreens()
 	return err
 }
+
+func (screensService *ScreensService) SwitchScreens(swatch model.SwitchScreens) error {
+	//判断组网方式 0代表网关 1代表4G模块
+	if swatch.Network == 1 {
+		err := tcp.SwitchScreen(swatch.Sn, swatch.Flag)
+		if err != nil {
+			logger.Logger.Errorf("SwitchScreens faild \n")
+			return errors.New("开关屏幕失败!")
+		}
+	} else {
+		//	TODO 通过mqtt发送指令开关屏
+		return nil
+	}
+	return nil
+}

+ 50 - 16
server/tcp/deviceMgr.go

@@ -2,10 +2,13 @@ package tcp
 
 import (
 	"encoding/hex"
+	"errors"
+	"fmt"
 	"go.uber.org/zap"
+	"gorm.io/gorm"
 	"net"
-	"server/dao/devices"
 	Dev "server/dao/devices"
+	deviceDao "server/dao/devices"
 	"server/model/common/request"
 	"server/protocol"
 	"server/utils/logger"
@@ -13,10 +16,12 @@ import (
 	"time"
 )
 
-var ScreenList []devices.Screens
+var (
+	devices = make(map[string]Device) // 存储连接的全局 map
+)
 
 type Device struct {
-	info     devices.Screens
+	info     deviceDao.Screens
 	conn     net.Conn
 	lastTime time.Time
 }
@@ -43,21 +48,19 @@ func (s *Device) Process() {
 		if !strings.Contains(strings.ToLower(data), "fe5c4b89") {
 			continue
 		}
-		if len(data) > 51 {
-			logger.Logger.Debugf("led sn = %v", data[34:50])
-			ScreenList = devices.QueryAllScreens()
-			for _, v := range ScreenList {
-				if v.Sn == data[34:50] {
-					s.info = v
-					break
-				}
-			}
-		}
 		switch data[16:18] {
 		case "61":
 			logger.Logger.Debug("登录")
 			// fe5c4b89 2a000000 62 00000000 17000000 31 23 32303233(年) 3035(月) 3135(日) 3031(星期) 3038(时) 3334(分) 3135(秒) 23 303630(心跳包时间) 23 ffff
 			buffer := protocol.AuthDataPack{}.AuthLogin()
+			// 通过sn 查设备是否存在 不存在return 存在就保存con 和 info
+			screens, err := deviceDao.QueryScreenBySn(data[34:50])
+			if errors.Is(err, gorm.ErrRecordNotFound) {
+				logger.Logger.Errorf("Process SN not found \n")
+				break
+			}
+			s.info = screens
+			devices[s.info.Sn] = *s
 			s.conn.Write(buffer.Bytes())
 		case "91":
 			logger.Logger.Debug("心跳")
@@ -76,18 +79,25 @@ func (s *Device) Handle() {
 		case <-t2.C:
 			state := request.DeviceStatus{
 				Status:        1,
-				PlayStatus:    s.info.PlayStatus,
-				DisplayStatus: s.info.DisplayStatus,
-				SourceStatus:  s.info.SourceStatus,
+				PlayStatus:    1,
+				DisplayStatus: 1,
+				SourceStatus:  1,
 			}
 			if time.Now().Add(-2 * time.Minute).After(s.lastTime) {
 				//离线
 				state.Status = 0
+				state.PlayStatus = 0
+				state.DisplayStatus = 0
+				state.SourceStatus = 0
+				fmt.Println("离线了...")
+				fmt.Println("在线状态:", state)
 			} else {
 				logger.Logger.Debugf("%s在线", s.info.ScreensCode)
 			}
+			fmt.Println("编号:" + s.info.ScreensCode)
 			//修改数据库状态
 			err := Dev.UpdateScreensStatus(s.info.ScreensCode, state)
+			fmt.Println("改数据库了。。。。。")
 			if err != nil {
 				logger.Logger.Error("UpdateScreensStatus err", zap.Error(err))
 				continue
@@ -115,4 +125,28 @@ func (s *Device) UpdateInfo(playStatus, displayStatus, sourceStatus string) {
 	s.info.DisplayStatus = display
 	s.info.SourceStatus = source
 	s.lastTime = time.Now()
+	fmt.Println("上次在线时间,", s.lastTime.String())
+}
+
+func (s *Device) SwitchScreen(onOff int) error {
+	pack := protocol.SwitchDataPack{Type: 0x52} //熄屏
+	if onOff == 1 {
+		pack = protocol.SwitchDataPack{Type: 0x51} //亮屏
+	}
+	buf := pack.SwitchScreens() //获取开关屏指令
+	_, err := s.conn.Write(buf.Bytes())
+	if err != nil {
+		logger.Logger.Errorf("SwitchScreen write failed, err:%v", err)
+		return err
+	}
+	return nil
+}
+
+func SwitchScreen(sn string, onOff int) error {
+	device := devices[sn]
+	err := device.SwitchScreen(onOff)
+	if err != nil {
+		return err
+	}
+	return nil
 }

server/tcp/tcp.go → server/service/tcp/tcp.go


+ 9 - 1
web/src/api/screens.js

@@ -37,4 +37,12 @@ export const deleteBaseScreens = (data) => {
         method: 'delete',
         data: data
     })
-}
+}
+
+export const switchScreens = (data) => {
+    return service({
+        url: '/screens/switchScreens',
+        method: 'post',
+        data: data
+    })
+}

+ 73 - 25
web/src/view/devicesAdmin/screens/screens.vue

@@ -95,6 +95,16 @@
                 icon="delete"
                 @click="deleteScreens(scope.row)"
             >删除</el-button>
+            <el-button
+                type="primary"
+                link
+                @click="switchOpenCloseScreens(scope.row,1)"
+            >亮屏</el-button>
+            <el-button
+                type="primary"
+                link
+                @click="switchOpenCloseScreens(scope.row,0)"
+            >熄屏</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -137,24 +147,32 @@
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="ip地址:" :inline="false" prop="ipAddress">
-                <el-input v-model="screensInfo.ipAddress"></el-input>
+              <el-form-item label="组网方式:" :inline="false" prop="network">
+                <el-select v-model="screensInfo.network" placeholder="请选择组网方式">
+                  <el-option label="网关" :value=0></el-option>
+                  <el-option label="4G模块" :value=1></el-option>
+                </el-select>
               </el-form-item>
             </el-col>
           </el-row>
           <el-row>
+            <el-col :span="12">
+              <el-form-item label="ip地址:" :inline="false" prop="ipAddress">
+                <el-input v-model="screensInfo.ipAddress"></el-input>
+              </el-form-item>
+            </el-col>
             <el-col :span="12">
               <el-form-item label="品牌:" :inline="false" prop="screensBrand">
                 <el-input v-model="screensInfo.screensBrand"></el-input>
               </el-form-item>
             </el-col>
+          </el-row>
+          <el-row>
             <el-col :span="12">
               <el-form-item label="型号:" :inline="false" prop="screensModel">
                 <el-input v-model="screensInfo.screensModel"></el-input>
               </el-form-item>
             </el-col>
-          </el-row>
-          <el-row>
             <el-col :span="12">
               <el-form-item label="所属网关:" :inline="false" prop="gatewayId">
                 <el-select v-model="screensInfo.gatewayId" placeholder="所属网关">
@@ -162,6 +180,8 @@
                 </el-select>
               </el-form-item>
             </el-col>
+          </el-row>
+          <el-row>
             <el-col :span="12">
               <el-form-item label="分辨率:" :inline="false">
                 <el-select v-model="screensInfo.resolutionId" placeholder="请选择分辨率">
@@ -169,8 +189,6 @@
                 </el-select>
               </el-form-item>
             </el-col>
-          </el-row>
-          <el-row>
             <el-col :span="12">
               <el-form-item label="屏幕尺寸:" :inline="false">
                 <el-select v-model="screensInfo.screensSizeId" placeholder="请选择屏幕尺寸">
@@ -178,6 +196,8 @@
                 </el-select>
               </el-form-item>
             </el-col>
+          </el-row>
+          <el-row>
             <el-col :span="12">
               <el-form-item label="所属分路:" :inline="false">
                 <el-select v-model="screensInfo.shunt" placeholder="请选择所属分路">
@@ -186,13 +206,13 @@
                 </el-select>
               </el-form-item>
             </el-col>
-          </el-row>
-          <el-row>
             <el-col :span="12">
               <el-form-item label="分路描述:" :inline="false">
                 <el-input v-model="screensInfo.shuntDescribe"></el-input>
               </el-form-item>
             </el-col>
+          </el-row>
+          <el-row>
             <el-col :span="12">
               <el-form-item label="安装时间:" :inline="false">
                 <el-date-picker
@@ -252,46 +272,46 @@
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="ip地址:" :inline="false">
-                {{screensInfo.ipAddress }}
+              <el-form-item label="组网方式:" :inline="false">
+                {{screensInfo.network === 0 ? '网关':'4G模块' }}
               </el-form-item>
             </el-col>
           </el-row>
           <el-row>
+            <el-col :span="12">
+              <el-form-item label="ip地址:" :inline="false">
+                {{screensInfo.ipAddress }}
+              </el-form-item>
+            </el-col>
             <el-col :span="12">
               <el-form-item label="所属网关:" :inline="false">
                 {{screensInfo.GateWay.gatewayName }}
               </el-form-item>
             </el-col>
+          </el-row>
+          <el-row>
             <el-col :span="12">
               <el-form-item label="分辨率:" :inline="false">
                 {{screensInfo.Resolution.price }}
               </el-form-item>
             </el-col>
-          </el-row>
-          <el-row>
             <el-col :span="12">
               <el-form-item label="屏幕尺寸:" :inline="false">
                 {{screensInfo.ScreensSize.size }}
               </el-form-item>
             </el-col>
+          </el-row>
+          <el-row>
             <el-col :span="12">
               <el-form-item label="所属分路:" :inline="false">
                 <el-tag effect="dark">{{screensInfo.shunt===1?"主路":screensInfo.shunt===2?"支路":"未知"}}</el-tag>
               </el-form-item>
             </el-col>
-          </el-row>
-          <el-row>
             <el-col :span="12">
               <el-form-item label="分路描述:" :inline="false">
                 {{screensInfo.shuntDescribe }}
               </el-form-item>
             </el-col>
-            <el-col :span="12">
-              <el-form-item label="安装时间:" :inline="false">
-                {{screensInfo.installTime }}
-              </el-form-item>
-            </el-col>
           </el-row>
           <el-row>
             <el-col :span="12">
@@ -300,24 +320,31 @@
                 <span :style="{ color: screensInfo.status === 0 ? 'red' : 'green' }">{{ screensInfo.status === 0 ? '离线' : '在线' }}</span>
               </el-form-item>
             </el-col>
+            <el-col :span="12">
+              <el-form-item label="素材状态:" :inline="false">
+                <div class="onlinebox" :style="{'background': screensInfo.sourceStatus===0 ? 'red':'green' }"></div>
+                <span :style="{ color: screensInfo.sourceStatus === 0 ? 'red' : 'green' }">{{ screensInfo.sourceStatus === 0 ? '异常' : '正常' }}</span>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
             <el-col :span="12">
               <el-form-item label="播放状态:" :inline="false">
                 <div class="onlinebox" :style="{'background': screensInfo.playStatus===0 ? 'red':'green' }"></div>
                 <span :style="{ color: screensInfo.playStatus === 0 ? 'red' : 'green' }">{{ screensInfo.playStatus === 0 ? '异常' : '正常' }}</span>
               </el-form-item>
             </el-col>
-          </el-row>
-          <el-row>
             <el-col :span="12">
               <el-form-item label="模板状态:" :inline="false">
                 <div class="onlinebox" :style="{'background': screensInfo.displayStatus===0 ? 'red':'green' }"></div>
                 <span :style="{ color: screensInfo.displayStatus === 0 ? 'red' : 'green' }">{{ screensInfo.displayStatus === 0 ? '异常' : '正常' }}</span>
               </el-form-item>
             </el-col>
+          </el-row>
+          <el-row>
             <el-col :span="12">
-              <el-form-item label="素材状态:" :inline="false">
-                <div class="onlinebox" :style="{'background': screensInfo.sourceStatus===0 ? 'red':'green' }"></div>
-                <span :style="{ color: screensInfo.sourceStatus === 0 ? 'red' : 'green' }">{{ screensInfo.sourceStatus === 0 ? '异常' : '正常' }}</span>
+              <el-form-item label="安装时间:" :inline="false">
+                {{screensInfo.installTime }}
               </el-form-item>
             </el-col>
           </el-row>
@@ -327,7 +354,7 @@
   </div>
 </template>
 <script setup>
-import {deleteBaseScreens, getScreensList, queryscreensParms,setScreensInfo,addScreens} from "@/api/screens";
+import {deleteBaseScreens, getScreensList, queryscreensParms,setScreensInfo,addScreens,switchScreens} from "@/api/screens";
 import { ref,reactive} from 'vue'
 import {ElMessage, ElMessageBox} from "element-plus";
 const page = ref(1)
@@ -365,6 +392,9 @@ const rules = ref({
   sn: [
     { required: true,  message:'请输入设备SN',trigger: 'blur'},
   ],
+  network: [
+    { required: true,  message:'请选择组网方式',trigger: 'blur'},
+  ],
   gatewayId: [
     { required: true,  message:'请选择网关',trigger: 'blur'},
   ]
@@ -510,6 +540,24 @@ const deleteScreens = (obj) => {
       })
 }
 
+const switchOpenCloseScreens = async (obj,opt) => {
+  if (obj.status ===0 ){
+    ElMessage({
+      type: 'info',
+      message: '操作失败,设备离线',
+    })
+    return
+  }
+  var res = await switchScreens({sn:obj.sn,network:obj.network,flag:opt});
+  if (res.code === 0) {
+    ElMessage({
+      type: 'success',
+      message: '操作成功!',
+    })
+  }
+}
+
+
 </script>
 <style>
 .el-table .success-row {