qixiaoning
2025-10-29 9b17a8dcbc1f94eb117a37b3b24ca9dae0d2d588
摄像机相关接口跳转,推送配置修改,系统权限菜单修改
12个文件已修改
337 ■■■■ 已修改文件
camera-common/models/Record.go 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
camera-common/models/camera.go 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
camera-common/models/task.go 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
camera-service/controllers/camera.go 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
camera-service/models/db.go 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
push-service/controllers/pushSet.go 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sysinfo-service/service/proc.go 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
system-service/controllers/voice.go 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
system-service/service/SysService.go 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
system-service/service/appMenu.go 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
system-service/sys/sysinfo.go 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
version-control/main.go 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
camera-common/models/Record.go
@@ -503,15 +503,27 @@
    lists := convertResultToMap(result)
    layout := "2006-01-02 15:04:05.999999"
    var temp1 time.Time
    var temp2 time.Time
    // var temp1 time.Time
    // var temp2 time.Time
    //排序
    // //排序
    // sort.Slice(lists, func(i, j int) bool {
    //     //return lists[i].DetectTime > lists[j].:DetectTime
    //     temp1, _ = time.Parse(layout, lists[i].DetectTime)
    //     temp2, _ = time.Parse(layout, lists[j].DetectTime)
    //     return temp1.After(temp2)
    // })
    sort.Slice(lists, func(i, j int) bool {
        //return lists[i].DetectTime > lists[j].:DetectTime
        temp1, _ = time.Parse(layout, lists[i].DetectTime)
        temp2, _ = time.Parse(layout, lists[j].DetectTime)
        return temp1.After(temp2)
        t1, err1 := time.Parse(layout, lists[i].DetectTime)
        t2, err2 := time.Parse(layout, lists[j].DetectTime)
        // 错误处理:解析错误的时间排在后面
        if err1 != nil || err2 != nil {
            return err1 == nil && err2 != nil
        }
        return t1.After(t2)
    })
    items := Paginate(lists, int(pageNum), int(pageSize))
camera-common/models/camera.go
@@ -331,6 +331,41 @@
    return result.RowsAffected > 0
}
func (camera *Camera) DelLink(id int64) (err error) {
    //删除关联检测内容
    dbdel1 := db.Exec("delete from mal_task_check_link where task_id=?", id)
    err = dbdel1.Error
    if err != nil || dbdel1.RowsAffected == 0 {
        return err
    }
    //删除关联预警规则
    dbdel2 := db.Exec("delete from mal_task_rule_link where task_id=?", id)
    err = dbdel2.Error
    if err != nil || dbdel2.RowsAffected == 0 {
        return err
    }
    //删除关联摄像机任务
    dbdel3 := db.Exec("delete from mal_task_video_link where task_id=?", id)
    err = dbdel3.Error
    if err != nil || dbdel3.RowsAffected == 0 {
        return err
    }
    //删除关联工作时间
    dbdel4 := db.Exec("delete from mal_task_work_time_link where task_id=?", id)
    err = dbdel4.Error
    if err != nil || dbdel4.RowsAffected == 0 {
        return err
    }
    //删除关联知识库
    dbdel5 := db.Exec("delete from mal_knowledge_link where task_id=?", id)
    err = dbdel5.Error
    if err != nil || dbdel5.RowsAffected == 0 {
        return err
    }
    return
}
func (camera *Camera) Delete(cid string) (int64, error) {
    var err error
    tx := GetDB().Begin()
camera-common/models/task.go
@@ -18,11 +18,25 @@
    IsDelete int8   `json:"isDelete"`
}
type TaskIdM struct {
    ID int64 `gorm:"column:task_id" json:"id"`
}
type TaskM struct {
    TaskId          int64  `db:"task_id" json:"taskId"`
    TaskName        string `db:"task_name" json:"taskName"`
    TaskDescription string `db:"task_description" json:"taskDescription"`
    EventName       string `db:"event_name" json:"eventName"`
}
// 训练模型标签
type TrainTags struct {
    Id         int64  `gorm:"primaryKey;autoIncrement;column:id" json:"id"`
    Createtime string `gorm:"type:varchar(50);column:create_time;default:''" json:"create_time"`
}
func (TrainTags) TableName() string {
    return "mal_train_tags"
}
// 视频
@@ -67,11 +81,11 @@
}
// 根据cid查询视频
func GetTaskTotal(cid string) (total int, err error) {
    sql := "select count(1) as total from mal_task_video_link where video_id='" + cid + "'"
    err = db.Raw(sql).Count(&total).Error
    if err != nil {
        return 0, err
func GetTaskTotal(cid string) (items []TaskIdM, err error) {
    sqlStr := "select task_id from mal_task_video_link where video_id='" + cid + "'"
    if err := db.Raw(sqlStr).Scan(&items).Error; err != nil {
        fmt.Println(err.Error())
        return nil, err
    }
    return total, nil
    return
}
camera-service/controllers/camera.go
@@ -90,6 +90,7 @@
    if b, err := sv.CameraUpdate(camVo); b {
        //更新分辨率
        if ok {
            //
            logger.Debug("DoPostRequest:", camVo)
            if cam.IsRunning && (cam.ResolutionWidth != camVo.ResolutionWidth && cam.ResolutionHeight != camVo.ResolutionHeight) {
                header := map[string]string{}
@@ -99,6 +100,18 @@
                    "videoType": 0,
                }
                res, err := util.DoPostRequest("http://127.0.0.1:8088/v1/task/openAnalysis", util.CONTENT_TYPE_JSON, paramBody, nil, header, time.Second*10)
                if err != nil {
                    logger.Debug("DoPostRequest err:", err)
                }
                logger.Debug("DoPostRequest:", res)
            }
            //更新状态
            if cam.IsRunning {
                header := map[string]string{}
                paramBody := map[string]interface{}{
                    "state": 1,
                }
                res, err := util.DoPostRequest("http://127.0.0.1:8088/v1/task/updateAllStatus?state=1", util.CONTENT_TYPE_JSON, paramBody, nil, header, time.Second*10)
                if err != nil {
                    logger.Debug("DoPostRequest err:", err)
                }
@@ -131,15 +144,24 @@
    }
    //判断是否有配置任务
    total, _ := models.GetTaskTotal(cid)
    if total > 0 {
        return &bhomeclient.Reply{Success: false, Msg: "请先删除配置的任务"}
    }
    // total, _ := models.GetTaskTotal(cid)
    // if total > 0 {
    //     return &bhomeclient.Reply{Success: false, Msg: "请先删除配置的任务"}
    // }
    rows, _ := cam.Delete(cid)
    if rows == 0 {
        return &bhomeclient.Reply{Success: true, Msg: "记录不存在"}
    }
    //删除任务
    items, _ := models.GetTaskTotal(cid)
    if len(items) > 0 {
        for _, item := range items {
            cam.DelLink(item.ID)
        }
    }
    pMsg := protomsg.DbChangeMessage{ //需要重新计算算力占用情况
        Table:  protomsg.TableChanged_T_Camera,
        Action: protomsg.DbAction_Delete,
@@ -1125,9 +1147,9 @@
    if len(TaskName) > 0 {
        quotedNames := make([]string, len(TaskName))
        for i, name := range TaskName {
            quotedNames[i] = "'" + name + "'" // 每个元素加单引号
            quotedNames[i] = " task_name like '%%" + name + "%%' " // 每个元素加单引号
        }
        filter += fmt.Sprintf(" and %s in [%s]", "task_name", strings.Join(quotedNames, ","))
        filter += " and (" + strings.Join(quotedNames, "or") + ")"
    } else {
        if Warning > 0 {
            return &bhomeclient.Reply{Success: true, Msg: "获取成功", Data: nil}
camera-service/models/db.go
@@ -17,14 +17,18 @@
func Init() {
    db, err = gorm.Open(config.DBconf.Name, "../config/camera-service.db")
    if err != nil {
        logger.Debug("db open error ", err)
    }
    db.LogMode(true)
    //db.SetLogger(&DbLogger{})
    db.AutoMigrate(&commonModels.Area{}, &commonModels.Camera{}, &commonModels.CameraArea{},
        &commonModels.Sensor{}, &commonModels.CameraSensor{})
    // err1 := db.Debug().AutoMigrate(&commonModels.Area{}, &commonModels.Camera{}, &commonModels.CameraArea{},
    //     &commonModels.Sensor{}, &commonModels.CameraSensor{}, &commonModels.TrainTags{})
    err1 := db.Debug().AutoMigrate(&commonModels.TrainTags{})
    if err1 != nil {
        logger.Debug("自动迁移失败 ", err1)
    }
    commonModels.SetDB(db)
}
push-service/controllers/pushSet.go
@@ -35,6 +35,7 @@
            {Checked: true, Id: "camera_id", Name: "摄像机ID", Alias: "camera_id"},
            {Checked: true, Id: "camera_name", Name: "摄像机名称", Alias: "camera_name"},
            {Checked: true, Id: "camera_addr", Name: "摄像机地址", Alias: "camera_addr"},
            {Checked: true, Id: "camera_rtsp", Name: "RTSP地址", Alias: "camera_rtsp"},
        },
    }
    // sceneInfoSet := vo.PushSetMenu{
@@ -93,28 +94,40 @@
            {Checked: true, Id: "is_warning", Name: "是否预警", Alias: "is_warning"},
        },
    }
    // detectAreaSet := vo.PushSetMenu{
    //     Id:      "detectAreaInfo",
    //     Name:    "检测区域",
    //     Alias:   "detectAreaInfo",
    //     Checked: true,
    //     Children: []vo.PushSetMenu{
    //         {Checked: true, Id: "targetInfo.#.areaId", Name: "检测区域id", Alias: "areaId"},
    //         {Checked: true, Id: "targetInfo.#.areaName", Name: "检测区域名称", Alias: "areaName"},
    //     },
    // }
    // targetSet := vo.PushSetMenu{
    //     Id:      "targetInfo",
    //     Name:    "目标",
    //     Alias:   "targetInfo",
    //     Checked: true,
    //     Children: []vo.PushSetMenu{
    //         {Checked: true, Id: "targetInfo.#.attribute", Name: "算法属性", Alias: "attribute"},
    //         {Checked: true, Id: "targetInfo.#.targetLocation", Name: "目标坐标", Alias: "targetLocation"},
    //         {Checked: true, Id: "targetInfo.#.targetScore", Name: "目标置信度", Alias: "targetScore"},
    //         {Checked: true, Id: "targetInfo.#.targetType", Name: "目标类别", Alias: "targetType"},
    //     },
    // }
    detectAreaSet := vo.PushSetMenu{
        Id:      "areaInfo",
        Name:    "检测区域",
        Alias:   "areaInfo",
        Checked: true,
        Children: []vo.PushSetMenu{
            {Checked: true, Id: "area_id", Name: "检测区域id", Alias: "area_id"},
            {Checked: true, Id: "area_name", Name: "检测区域名称", Alias: "area_name"},
            {Checked: true, Id: "proportion", Name: "检测区域占比", Alias: "proportion"},
        },
    }
    KnowLedgeSet := vo.PushSetMenu{
        Id:      "knowLedgeInfo",
        Name:    "知识库",
        Alias:   "knowLedgeInfo",
        Checked: true,
        Children: []vo.PushSetMenu{
            {Checked: true, Id: "knowledge_id", Name: "ID", Alias: "knowledge_id"},
            {Checked: true, Id: "knowledge_name", Name: "知识库名称", Alias: "knowledge_name"},
            {Checked: true, Id: "knowledge_doc", Name: "知识库文档", Alias: "knowledge_doc"},
        },
    }
    targetSet := vo.PushSetMenu{
        Id:      "targetInfo",
        Name:    "目标",
        Alias:   "targetInfo",
        Checked: true,
        Children: []vo.PushSetMenu{
            {Checked: true, Id: "attribute", Name: "属性", Alias: "attribute"},
            {Checked: true, Id: "target_location", Name: "目标坐标", Alias: "target_location"},
            {Checked: true, Id: "target_score", Name: "目标置信度", Alias: "target_score"},
            {Checked: true, Id: "target_type", Name: "目标类别", Alias: "target_type"},
        },
    }
    // dtSet := vo.PushSetMenu{
    //     Id:      "tableInfo",
    //     Name:    "底库信息",
@@ -144,7 +157,7 @@
    //     },
    // }
    // set = append(set, camInfoSet, sceneInfoSet, serverSet, dataSet, detectAreaSet, targetSet, dtSet, dbpInfo)
    set = append(set, camInfoSet, taskInfoSet, serverSet, dataSet)
    set = append(set, camInfoSet, taskInfoSet, serverSet, dataSet, detectAreaSet, KnowLedgeSet, targetSet)
    return &bhomeclient.Reply{Success: true, Data: set}
}
sysinfo-service/service/proc.go
@@ -16,17 +16,17 @@
    // "analysis":      "算法处理单元",
    "apiserver":     "basic接口服务",
    "decoder":       "视频解码服务",
    "elasticsearch": "分布式数据搜索引擎",
    // "elasticsearch": "分布式数据搜索引擎",
    // "faceDetect":    "人脸识别服务",
    "file-service": "文件服务",
    "pollcontrol":  "轮询管理",
    // "pollcontrol":  "轮询管理",
    "pushServer":   "规则处理单元",
    // "dataProcess":   "规则处理单元",
    "schedule": "调度进程",
    // "sdkCompare":    "人脸比对服务",
    "sshd":         "ssh服务端",
    "videopublish": "实时视频推流服务",
    "videosvr.out": "国标上级服务",
    "zlmediaKit": "实时视频推流服务",
    "wvp":        "国标上级服务",
    "weed":         "分布式文件系统",
}
@@ -172,7 +172,7 @@
    apps := dbApi.FindAppMap()
    for k, v := range dbApi.FindAppMap() {
        if v.ProcName != "" {
            installedAppMap[v.ProcName] = apps[k]
            installedAppMap[v.Id] = apps[k]
        }
    }
@@ -193,40 +193,27 @@
            }
        }
    }
    // 统计正在运行的应用信息
    ps, _ := process.Processes()
    for _, p := range ps {
        if name, err := p.Name(); err == nil {
            if app, isExist := installedAppMap[name]; isExist {
                proc := Proc{
                    Name: app.Name,
                    Pid:  p.Pid,
                    Desc: app.Title,
                }
                proc.Cpu, _ = p.CPUPercent()
                proc.Mem, _ = p.MemoryPercent()
                proc.Gpu = gpuPer.Get(int(p.Pid))
                procs = append(procs, proc)
                delete(installedAppMap, name)
            }
        }
    }
    // 追加未启动的应用
    for _, v := range installedAppMap {
        proc := Proc{
            Name: v.Name,
            Pid:  0,
            Desc: v.Title,
        }
        proc.Cpu = 0
        proc.Mem = 0
        proc.Gpu = 0
        for _, p := range ps {
            if name, err := p.Name(); err == nil {
                if name == v.ProcName {
                    proc.Pid = p.Pid
                    proc.Cpu, _ = p.CPUPercent()
                    proc.Mem, _ = p.MemoryPercent()
                    proc.Gpu = gpuPer.Get(int(p.Pid))
                }
            }
        }
        procs = append(procs, proc)
    }
@@ -252,7 +239,15 @@
                }
            }
            if k == "elasticsearch" {
            if k == "zlmediaKit" {
                cmdLine, _ := p.Cmdline()
                if strings.Contains(cmdLine, "MediaServer") {
                    proc.Pid = p.Pid
                    break
                }
            }
            if k == "wvp" {
                cmdLine, _ := p.Cmdline()
                if strings.Contains(cmdLine, k) {
                    proc.Pid = p.Pid
system-service/controllers/voice.go
@@ -149,7 +149,7 @@
        audioPath, err := sv.UploadVoice(file.Bytes, filename)
        if err != nil {
            if err.Error() == "audio format error" {
                return &bhomeclient.Reply{Msg: "声音只允许mp3,wav,wma的格式"}
                return &bhomeclient.Reply{Msg: "声音只允许mp3,wav的格式"}
            } else {
                return &bhomeclient.Reply{Msg: "声音上传失败:" + err.Error()}
            }
system-service/service/SysService.go
@@ -353,7 +353,7 @@
func (sv SysService) UploadVoice(fileBytes []byte, filename string) (string, error) {
    fileExt := path.Ext(filename)
    fileExt = strings.ToLower(fileExt)
    if fileExt != ".mp3" && fileExt != ".wma" && fileExt != ".wav" {
    if fileExt != ".mp3" && fileExt != ".wav" {
        return "", errors.New("audio format error")
    }
    var sApi bhomedbapi.SysSetApi
system-service/service/appMenu.go
@@ -1,11 +1,12 @@
package service
import (
    "basic.com/valib/bhomedbapi.git"
    "basic.com/valib/logger.git"
    "github.com/satori/go.uuid"
    "strings"
    "vamicro/system-service/models"
    "basic.com/valib/bhomedbapi.git"
    "basic.com/valib/logger.git"
    uuid "github.com/satori/go.uuid"
)
//初始化应用权限
@@ -40,13 +41,13 @@
                }
                if a.Package == "search" { //统计查询
                    sort = 2
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '摄像机', 'SEARCH', 'search:camera', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='search:camera');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '数据栈', 'SEARCH', 'search:stack', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='search:stack');")
                    // sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '摄像机', 'SEARCH', 'search:camera', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='search:camera');")
                    // sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '数据栈', 'SEARCH', 'search:stack', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='search:stack');")
                } else if a.Package == "cameraAccess" { //摄像机配置
                    sort = 3
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '摄像机信息', 'CAMERAACCESS', 'cameraAccess:cameraInfo', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='cameraAccess:cameraInfo');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '独立场景', 'CAMERAACCESS', 'cameraAccess:selfRule', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='cameraAccess:selfRule');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '联动场景', 'CAMERAACCESS', 'cameraAccess:linkRule', 3, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='cameraAccess:linkRule');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, 'AI任务', 'CAMERAACCESS', 'cameraAccess:aiTask', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='cameraAccess:aiTask');")
                    // sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '联动场景', 'CAMERAACCESS', 'cameraAccess:linkRule', 3, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='cameraAccess:linkRule');")
                } else if a.Package == "analysisPower" { //算力管理
                    sort = 5
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '设置', 'ANALYSISPOWER', 'analysisPower:set', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='analysisPower:set');")
@@ -57,9 +58,11 @@
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '查看', 'LIBRARY', 'library:show', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='library:show');")
                } else if a.Package == "algorithmManage" { // 应用中心
                    sort = 7
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '已安装', 'ALGORITHMMANAGE', 'algorithmManage:installed', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='algorithmManage:installed');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '离线升级/安装', 'ALGORITHMMANAGE', 'algorithmManage:insOffLine', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='algorithmManage:insOffLine');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '应用中心购买', 'ALGORITHMMANAGE', 'algorithmManage:buy', 3, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='algorithmManage:buy');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '应用中心', 'ALGORITHMMANAGE', 'algorithmManage:main', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='algorithmManage:main');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '已激活', 'ALGORITHMMANAGE', 'algorithmManage:installed', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='algorithmManage:installed');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '离线升级/安装', 'ALGORITHMMANAGE', 'algorithmManage:insOffLine', 3, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='algorithmManage:insOffLine');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '更新', 'ALGORITHMMANAGE', 'algorithmManage:buy', 4, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='algorithmManage:buy');")
                } else if a.Package == "datapush" { //数据推送
                    sort = 8
                } else if a.Package == "settings" { //系统设置
@@ -72,14 +75,34 @@
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '键盘和语言', 'SETTINGS', 'settings:keyboard', 5, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:keyboard');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '通用设置', 'SETTINGS', 'settings:common', 6, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:common');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '设备信息', 'SETTINGS', 'settings:sysInfo', 7, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:sysInfo');")
                    /*sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '权限管理', 'SETTINGS', 'settings:permission', 4, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:permission');")*/
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '权限管理', 'SETTINGS', 'settings:permission', 8, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:permission');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '设备管理', 'SETTINGS', 'settings:device', 9, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:device');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '检测内容', 'SETTINGS', 'settings:content', 10, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:content');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '预警规则', 'SETTINGS', 'settings:rule', 11, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:rule');")
                    /*sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '广播设置', 'SETTINGS', 'settings:broadcast', 5, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='settings:broadcast');")*/
                } else if a.Package == "vindicate" { //系统维护
                    sort = 10
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '设备维护', 'VINDICATE', 'vindicate:device', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:device');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '数据库维护', 'VINDICATE', 'vindicate:db', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:db');")
                    // sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '设备维护', 'VINDICATE', 'vindicate:device', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:device');")
                    // sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '数据库维护', 'VINDICATE', 'vindicate:db', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:db');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '更新设置', 'VINDICATE', 'vindicate:update', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:update');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '系统清理', 'VINDICATE', 'vindicate:clear', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:clear');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '重启设置', 'VINDICATE', 'vindicate:restart', 3, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:restart');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '备份还原', 'VINDICATE', 'vindicate:backup', 4, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:backup');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '系统信息', 'VINDICATE', 'vindicate:sysinfo', 5, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='vindicate:sysinfo');")
                } else if a.Package == "syslog" {
                    sort = 11
                } else if a.Package == "knowledge" {
                    sort = 12
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '设置', 'KNOWLEDGE', 'knowledge:set', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='knowledge:set');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '查看', 'KNOWLEDGE', 'knowledge:show', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='knowledge:show');")
                } else if a.Package == "dataStack" {
                    sort = 13
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '数据栈配置', 'DATASTACK', 'dataStack:cameraInfo', 1, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='dataStack:cameraInfo');")
                    sqls = append(sqls, "INSERT INTO sys_menu(`id`,`parent_id`,`parent_ids`,`type`,`name`,`module`,`permission`,`sort`,`icon`,`url`,`enable`,`del_flag`) select '"+uuid.NewV4().String()+"', '"+a.Id+"', ',0,"+a.Id+",', 1, '数据栈信息', 'DATASTACK', 'dataStack:selfRule', 2, NULL, NULL, 1, 0 where not exists (select 1 from sys_menu where permission='dataStack:selfRule');")
                }
                menu := models.SysMenu{}
system-service/sys/sysinfo.go
@@ -1,6 +1,7 @@
package sys
import (
    "errors"
    "fmt"
    "io/ioutil"
    "os"
@@ -12,7 +13,6 @@
    "vamicro/extend/util"
    "basic.com/valib/gogpu.git"
    "basic.com/valib/logger.git"
    "github.com/shirou/gopsutil/cpu"
    "github.com/shirou/gopsutil/disk"
    "github.com/shirou/gopsutil/host"
@@ -81,26 +81,45 @@
    return util.Struct2Map(Stat)
}
func GetGpu(key string) (vGpu []string, err error) {
    resultMsg, e := util.ExeCmd("dlsmi --query-gpu=" + key)
    if e != nil {
        return vGpu, errors.New("无可用GPU!请检查是否正常安显卡及显卡驱动,通过dlsmi查询状态")
    }
    vGpu = strings.Split(string(resultMsg), "\n")
    if len(vGpu) == 0 {
        return vGpu, errors.New("无可用GPU!请检查是否正常安显卡及显卡驱动,通过dlsmi查询状态")
    }
    return vGpu, nil
}
func GetDeviceInfo() map[string]interface{} {
    cmd := exec.Command("/bin/sh", "-c", "lsblk -d | grep -v part | grep -v SWAP | grep -v M | grep disk | awk '{printf $4\" \"}'")
    disks, _ := cmd.Output()
    cpu, _ := cpu.Info()
    gpuInfo, err := gogpu.Info()
    var gpuMemTotal int64
    if err == nil {
        for _, gpu := range gpuInfo.Info {
            gpuMemTotal = gpuMemTotal + gpu.GpuMemoryTotal
    var gpuStr string
    //获取型号
    gpuName, _ := GetGpu("name")
    if len(gpuName) > 0 {
        var gpuArr []string = []string{}
        gpuTotal, _ := GetGpu("memory.total")
        for i, name := range gpuName {
            //i>0跳过header
            if i > 0 && len(name) > 0 {
                gpuArr = append(gpuArr, fmt.Sprintf("%s %s", name, gpuTotal[i]))
        }
    } else {
        logger.Debug("gpu error " + err.Error())
    }
    gpu := gpuMemTotal
        gpuStr = strings.Join(gpuArr, ",")
    }
    mem, _ := mem.VirtualMemory()
    host, _ := host.Info()
    return util.Struct2Map(map[string]interface{}{
        "cpu":  cpu,
        "gpu":  gpu,
        "gpu":  gpuStr,
        "mem":  mem,
        "host": host,
        "disk": string(disks),
version-control/main.go
@@ -88,7 +88,7 @@
    go ms.StartServer(fm)
    go service.SelfUpdateStart(ctx, ms) //自动更新
    // go service.SelfUpdateStart(ctx, ms) //自动更新
    go service.NoticeTick(ctx) //更新提醒