浏览代码

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	vue.config.js
martin 3 年之前
父节点
当前提交
9855f963e4
共有 35 个文件被更改,包括 543 次插入155 次删除
  1. 7 0
      .env
  2. 7 0
      .env.dev
  3. 1 1
      package.json
  4. 1 1
      src/api/common.js
  5. 12 6
      src/api/sceneLibrary.js
  6. 1 1
      src/assets/common/css/theme.less
  7. 二进制
      src/assets/common/image/menu/home.png
  8. 二进制
      src/assets/common/image/menu/icon.png
  9. 二进制
      src/assets/common/image/menu/icon1.png
  10. 二进制
      src/assets/common/image/menu/iconFold.png
  11. 二进制
      src/assets/common/image/menu/iconFold1.png
  12. 1 1
      src/axios/filter.js
  13. 14 2
      src/components/echarts/lineChart1.vue
  14. 16 4
      src/components/echarts/lineChart2.vue
  15. 16 4
      src/components/echarts/lineChart3.vue
  16. 1 3
      src/components/echarts/pieChart.vue
  17. 6 4
      src/components/echarts/pieChart1.vue
  18. 6 2
      src/components/grid/searchLayout.vue
  19. 2 2
      src/router/sceneLibrary.js
  20. 2 0
      src/store/index.js
  21. 1 1
      src/views/algorithmsLibrary/algorithmsLibraryList.vue
  22. 66 45
      src/views/mainPage.vue
  23. 8 8
      src/views/modelLibrary/components/handleConfigList.vue
  24. 33 4
      src/views/modelLibrary/vehicleConfigurationDetail.vue
  25. 1 1
      src/views/modelLibrary/vehicleConfigurationList.vue
  26. 13 12
      src/views/page/breadCrumb.vue
  27. 66 21
      src/views/page/pageMenu.vue
  28. 1 1
      src/views/sceneLibrary/gradingRule.vue
  29. 2 2
      src/views/sceneLibrary/gradingRulesList.vue
  30. 55 3
      src/views/sceneLibrary/naturalDrivingScenarioList.vue
  31. 1 1
      src/views/sceneLibrary/scenarioTestPackageManagementList.vue
  32. 82 2
      src/views/sceneLibrary/scenePacketList.vue
  33. 51 3
      src/views/sceneLibrary/standardRegulationSimulationScenarioList.vue
  34. 52 3
      src/views/sceneLibrary/trafficAccidentSimulationScenarioList.vue
  35. 18 17
      src/views/workManagement/manualRunProjectList.vue

+ 7 - 0
.env

@@ -0,0 +1,7 @@
+# 用于标记打包的环境
+NODE_ENV = production
+
+# 使用 process.env.VUE_APP_IS_DEV
+
+# 域名
+VUE_APP_IS_DEV = 'false'

+ 7 - 0
.env.dev

@@ -0,0 +1,7 @@
+# 用于标记打包的环境
+NODE_ENV = DEV
+
+# 使用 process.env.VUE_APP_IS_DEV
+
+# 域名
+VUE_APP_IS_DEV = 'true'

+ 1 - 1
package.json

@@ -3,7 +3,7 @@
   "version": "0.1.0",
   "private": true,
   "scripts": {
-    "serve": "vue-cli-service serve",
+    "serve": "vue-cli-service serve --mode dev",
     "build": "vue-cli-service build",
     "test:unit": "vue-cli-service test:unit",
     "test:e2e": "vue-cli-service test:e2e",

+ 1 - 1
src/api/common.js

@@ -5,7 +5,7 @@ const getDictListsByTypes = '/simulation/resource/server/dict/getDictListsByType
 const getDictTreesByTypes = '/simulation/resource/server/dict/getDictTreesByTypes'; // 字典 多级下拉
 
 const uploadWj = basePart + '/simulation/resource/server/file/uploadWj'; // 上传
-const download = basePart + '/simulation/resource/server/file/download'; // 下载方法
+const download = basePart + '/simulation/resource/common/minio/download'; // 下载方法
 
 export default {
     single,

+ 12 - 6
src/api/sceneLibrary.js

@@ -1,20 +1,23 @@
 const basePart = '/simulation/resource/server';
 
 
-const queryScoringRulesList = basePart + '/ScoringRules/queryScoringRulesList'; // 分规则列表
-const queryScoringRules = basePart + '/ScoringRules/queryScoringRules'; // 查询分规则详情
-const saveScoringRules = basePart + '/ScoringRules/saveScoringRules'; // 保存分规则详情
-const fxScoringRules = basePart + '/ScoringRules/fxScoringRules'; // 分享分规则
-const deleteScoringRules = basePart + '/ScoringRules/deleteScoringRules'; // 删除分规则
+const queryScoringRulesList = basePart + '/ScoringRules/queryScoringRulesList'; // 分规则列表
+const queryScoringRules = basePart + '/ScoringRules/queryScoringRules'; // 查询分规则详情
+const saveScoringRules = basePart + '/ScoringRules/saveScoringRules'; // 保存分规则详情
+const fxScoringRules = basePart + '/ScoringRules/fxScoringRules'; // 分享分规则
+const deleteScoringRules = basePart + '/ScoringRules/deleteScoringRules'; // 删除分规则
 
 const queryStandardsRegulationsList = basePart + '/StandardsRegulations/queryStandardsRegulationsList'; // 标准法规仿真场景列表
 const saveStandardsRegulations = basePart + '/StandardsRegulations/saveStandardsRegulations'; // 新增标准法规仿场景
+const deleteStandardsRegulations = basePart + '/StandardsRegulations/deleteStandardsRegulations'; // 删除标准法规仿场景
 
 const querySceneAccidentList = basePart + '/SceneAccident/querySceneAccidentList'; // 交通事故仿真场景列表
 const saveSceneAccident = basePart + '/SceneAccident/saveSceneAccident'; // 新增交通事故仿真场景
+const deleteSceneAccident = basePart + '/SceneAccident/deleteSceneAccident'; // 删除交通事故仿真场景
 
 const querySceneNaturalList = basePart + '/SceneNatural/querySceneNaturalList'; // 自然驾驶场景列表
 const saveSceneNatural = basePart + '/SceneNatural/saveSceneNatural'; // 新增自然驾驶场景
+const deleteSceneNatural = basePart + '/SceneNatural/deleteSceneNatural'; // 删除自然驾驶场景
 
 const queryScenePackageList = basePart + '/ScenePackage/queryScenePackageList'; // 场景测试包管理列表
 const instShareList = basePart + '/ScenePackage/instShareList'; // 分享场景测试包
@@ -22,7 +25,7 @@ const deleteList = basePart + '/ScenePackage/deleteList'; // 删除场景测试
 
 const queryScenePackageSublistList = basePart + '/ScenePackage/queryScenePackageSublistList'; // 场景数据包列表
 const saveScenePackage = basePart + '/ScenePackage/saveScenePackage'; // 场景数据包列表保存
-const queryCsb = basePart + '/ScoringRules/queryCsb'; // 测试包添加分规则下拉
+const queryCsb = basePart + '/ScoringRules/queryCsb'; // 测试包添加分规则下拉
 
 
 
@@ -35,12 +38,15 @@ export default {
 
     queryStandardsRegulationsList,
     saveStandardsRegulations,
+    deleteStandardsRegulations,
 
     querySceneAccidentList,
     saveSceneAccident,
+    deleteSceneAccident,
 
     querySceneNaturalList,
     saveSceneNatural,
+    deleteSceneNatural,
 
     queryScenePackageList,
     instShareList,

+ 1 - 1
src/assets/common/css/theme.less

@@ -216,7 +216,7 @@
     border: none;
 }
 
-.addBtn {
+.addBtn.disabled {
     &.el-button {
         background: #F5F7FA;
         border: 1px solid #DEE6F3;

二进制
src/assets/common/image/menu/home.png


二进制
src/assets/common/image/menu/icon.png


二进制
src/assets/common/image/menu/icon1.png


二进制
src/assets/common/image/menu/iconFold.png


二进制
src/assets/common/image/menu/iconFold1.png


+ 1 - 1
src/axios/filter.js

@@ -40,7 +40,7 @@ Vue.use(VueAxios, axios);
 axios.defaults.baseURL = ''; //项目的的基础url
 axios.defaults.headers.common['Authorization'] = ""; //请求token信息配置
 axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; //请求type设置
-axios.defaults.timeout = 30000; //在超时前,所有请求都会等待24秒
+axios.defaults.timeout = 24000; //在超时前,所有请求都会等待24秒
 axios.defaults.withCredentials = true;
 
 // 添加请求拦截器

+ 14 - 2
src/components/echarts/lineChart1.vue

@@ -1,5 +1,9 @@
 <template>
-    <div class="linechart" :id="id" style="width: 100%; height: 100%"></div>
+    <div
+        class="linechart"
+        :id="id"
+        style="width: calc(100vw - 270px); height: calc(80vh - 260px)"
+    ></div>
 </template>
 
 <script>
@@ -57,7 +61,15 @@ export default {
 
         let option = {
             xAxis: {
-                data: ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"],
+                data: [
+                    "星期一",
+                    "星期二",
+                    "星期三",
+                    "星期四",
+                    "星期五",
+                    "星期六",
+                    "星期日",
+                ],
             },
             yAxis: {},
             series: [

+ 16 - 4
src/components/echarts/lineChart2.vue

@@ -1,5 +1,9 @@
 <template>
-    <div class="linechart" :id="id" style="width: calc(100vw - 270px); height: calc(45vh);"></div>
+    <div
+        class="linechart"
+        :id="id"
+        style="width: calc(100vw - 240px); height: calc(48vh - 165px)"
+    ></div>
 </template>
 
 <script>
@@ -57,9 +61,17 @@ export default {
 
         let option = {
             xAxis: {
-                type: 'category',
+                type: "category",
                 boundaryGap: false,
-                data: ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"],
+                data: [
+                    "星期一",
+                    "星期二",
+                    "星期三",
+                    "星期四",
+                    "星期五",
+                    "星期六",
+                    "星期日",
+                ],
             },
             yAxis: {},
             series: [
@@ -74,7 +86,7 @@ export default {
                     },
                     areaStyle: {
                         color: "rgba(51,151,255,0.2)",
-                    }
+                    },
                 },
             ],
         };

+ 16 - 4
src/components/echarts/lineChart3.vue

@@ -1,5 +1,9 @@
 <template>
-   <div class="linechart" :id="id" style="width: calc(100vw - 270px); height: calc(45vh);"></div>
+    <div
+        class="linechart"
+        :id="id"
+        style="width: calc(100vw - 240px); height: calc(48vh - 165px)"
+    ></div>
 </template>
 
 <script>
@@ -57,9 +61,17 @@ export default {
 
         let option = {
             xAxis: {
-                type: 'category',
+                type: "category",
                 boundaryGap: false,
-                data: ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"],
+                data: [
+                    "星期一",
+                    "星期二",
+                    "星期三",
+                    "星期四",
+                    "星期五",
+                    "星期六",
+                    "星期日",
+                ],
             },
             yAxis: {},
             series: [
@@ -74,7 +86,7 @@ export default {
                     },
                     areaStyle: {
                         color: "rgba(51,151,255,0.2)",
-                    }
+                    },
                 },
             ],
         };

+ 1 - 3
src/components/echarts/pieChart.vue

@@ -140,9 +140,7 @@ export default {
                 //图例
                 orient: "vertical", //图例的布局,竖直    horizontal为水平
                 x: "right", //图例显示在右边
-                data: [
-                    "图例一", "图例二", "图例三", "图例四"
-                ],
+                data: ["图例一", "图例二", "图例三", "图例四"],
                 textStyle: {
                     //图例文字的样式
                     color: "#333", //文字颜色

+ 6 - 4
src/components/echarts/pieChart1.vue

@@ -1,5 +1,9 @@
 <template>
-    <div class="linechart" :id="id" style="width: calc(33vw - 180px); height: calc(24vh);"></div>
+    <div
+        class="linechart"
+        :id="id"
+        style="width: calc(33vw - 180px); height: calc(42vh - 165px)"
+    ></div>
 </template>
 
 <script>
@@ -140,9 +144,7 @@ export default {
                 //图例
                 orient: "vertical", //图例的布局,竖直    horizontal为水平
                 x: "right", //图例显示在右边
-                data: [
-                    "图例一", "图例二", "图例三", "图例四"
-                ],
+                data: ["图例一", "图例二", "图例三", "图例四"],
                 textStyle: {
                     //图例文字的样式
                     color: "#333", //文字颜色

+ 6 - 2
src/components/grid/searchLayout.vue

@@ -25,8 +25,8 @@
             <div class="inputBox">
                 <slot name="searchItem8"></slot>
             </div>
-            <div class="inputBox">
-                <slot name="searchItem9"></slot>
+            <div class="inputBox searchItem27">
+                <slot name="searchItem27"></slot>
             </div>
             <!-- <div class="speBox">
                 <slot name="searchItemSpe1"></slot>
@@ -74,5 +74,9 @@ export default {
             align-items: center;
         }
     }
+
+    .searchItem27 {
+        flex-basis: 100%;
+    }
 }
 </style>

+ 2 - 2
src/router/sceneLibrary.js

@@ -42,7 +42,7 @@ export default [{
         path: "/gradingRulesList",
         name: "gradingRulesList",
         meta: {
-            tabname: "分规则列表"
+            tabname: "分规则列表"
         },
         component: () => import("@/views/sceneLibrary/gradingRulesList")
     },
@@ -50,7 +50,7 @@ export default [{
         path: "/gradingRule",
         name: "gradingRule",
         meta: {
-            tabname: "分规则"
+            tabname: "分规则"
         },
         component: () => import("@/views/sceneLibrary/gradingRule")
     },

+ 2 - 0
src/store/index.js

@@ -7,6 +7,8 @@ export default new Vuex.Store({
   state: {
     // configTitleList: ['摄像头', '完美传感器', '激光雷达', '毫米波雷达', 'GPS'],
     configTitleList: ['摄像头', '完美传感器', '激光雷达', 'GPS'],
+    fileHost: 'http://10.15.12.70:8001', // 开发环境需要连开发服务器地址,上线后会用相对地址拼接fileUrl
+    fileUrl: '/simulation/resource/common/minio/preview',
   },
   mutations: {},
   actions: {},

+ 1 - 1
src/views/algorithmsLibrary/algorithmsLibraryList.vue

@@ -60,7 +60,7 @@
                 <el-tab-pane label="私有仓库" name="3" disabled></el-tab-pane>
             </el-tabs>
             <el-button
-                class="addBtn"
+                v-bind:class="{ addBtn: true, disabled: activeName === '1' }"
                 icon="el-icon-circle-plus-outline"
                 @click="addOne"
                 type="primary"

+ 66 - 45
src/views/mainPage.vue

@@ -78,7 +78,7 @@
                 </div>
             </div>
 
-            <div class="boxContent">
+            <div class="boxContent padTop20">
                 <div class="titlePanel">
                     <div class="titlePanelBor">服务器监控</div>
                 </div>
@@ -95,11 +95,11 @@
         </div>
 
         <div v-show="activeName === '2'" class="tabBox">
-            <div class="boxContent">
+            <div class="boxContent padBot10">
                 <div class="titlePanel">
-                    <div class="titlePanelBor">数据橄榄</div>
+                    <div class="titlePanelBor">数据概览</div>
                 </div>
-                <ul class="listPanel listPanelB listPanelC">
+                <ul class="listPanel listPanelB">
                     <li class="shadowBox">
                         <b>场景数量</b>
                         <i>678</i>
@@ -148,7 +148,7 @@
                 </div>
             </div>
 
-            <div class="boxContent">
+            <div class="boxContent boxContentB">
                 <div class="titlePanel">
                     <div class="titlePanelBor">状态统计</div>
                 </div>
@@ -404,10 +404,10 @@ export default {
 
 <style lang='less' scoped>
 .mainPagePanel {
-    padding: 20px;
+    padding: 20px 20px 20px 0;
 
     .tabBox {
-        padding: 30px;
+        padding: 10px 30px 0;
     }
 
     .myTabsBox {
@@ -424,25 +424,24 @@ export default {
     }
 
     .boxContent {
-        padding-bottom: 40px;
+        padding-bottom: 20px;
 
         .titlePanel {
-            padding-bottom: 20px;
+            padding-bottom: 10px;
         }
 
         .listPanel {
             display: flex;
-            flex-wrap: wrap;
+            flex-wrap: nowrap;
             color: @themeColor;
 
             li {
-                width: 300px;
+                flex: 1;
                 display: flex;
-                height: 120px;
-                padding: 24px;
-                margin-right: 54px;
-                margin-bottom: 20px;
-                justify-content: space-between;
+                height: 10vh;
+                padding: 10px 1%;
+                margin-right: 3%;
+                justify-content: space-around;
                 align-items: center;
 
                 span,
@@ -454,11 +453,26 @@ export default {
                 }
 
                 b {
-                    font-size: 18px;
+                    font-size: 90%;
                 }
 
                 i {
-                    font-size: 36px;
+                    font-size: 150%;
+                }
+
+                &:last-child {
+                    margin-right: 0;
+                }
+            }
+
+            .colorA,
+            .colorB,
+            .colorC,
+            .colorD,
+            .colorE {
+                span {
+                    width: 15%;
+                    height: 45%;
                 }
             }
 
@@ -466,8 +480,8 @@ export default {
                 color: @themeColor;
 
                 span {
-                    width: 36px;
-                    height: 38px;
+                    // width: 36px;
+                    // height: 38px;
                     background: url("../assets/common/image/index/hw1.png")
                         center center no-repeat;
                     background-size: contain;
@@ -477,8 +491,6 @@ export default {
                 color: #8479ff;
 
                 span {
-                    width: 36px;
-                    height: 38px;
                     background: url("../assets/common/image/index/hw2.png")
                         center center no-repeat;
                     background-size: contain;
@@ -488,8 +500,6 @@ export default {
                 color: #ffc935;
 
                 span {
-                    width: 36px;
-                    height: 38px;
                     background: url("../assets/common/image/index/hw3.png")
                         center center no-repeat;
                     background-size: contain;
@@ -499,8 +509,6 @@ export default {
                 color: #bf5bff;
 
                 span {
-                    width: 36px;
-                    height: 38px;
                     background: url("../assets/common/image/index/hw4.png")
                         center center no-repeat;
                     background-size: contain;
@@ -510,8 +518,6 @@ export default {
                 color: #ff6161;
 
                 span {
-                    width: 36px;
-                    height: 38px;
                     background: url("../assets/common/image/index/hw5.png")
                         center center no-repeat;
                     background-size: contain;
@@ -521,24 +527,14 @@ export default {
 
         .listPanelB {
             li {
-                display: block;
+                display: flex;
+                flex-direction: column;
 
                 i,
                 b {
                     display: block;
-                    line-height: 1;
                     text-align: center;
                 }
-
-                b {
-                    padding-bottom: 15px;
-                }
-            }
-        }
-
-        .listPanelC {
-            li {
-                width: 260px;
             }
         }
 
@@ -551,29 +547,42 @@ export default {
             }
 
             .title {
-                padding-top: 24px;
-                padding-bottom: 24px;
+                padding: 10px 0;
                 text-align: center;
-                font-size: 18px;
+                font-size: 16px;
+                line-height: 1;
                 font-weight: bold;
             }
 
             .shadowBoxB {
                 margin: 0 50px;
             }
+
+            .shadowBox {
+                padding: 0;
+            }
         }
     }
 
+    .padTop20 {
+        padding-top: 20px;
+    }
+
+    .padBot10 {
+        padding-bottom: 10px;
+    }
+
     /deep/ .el-tabs__item.is-active {
         color: @themeColor;
     }
 
     .chartABox {
-        height: calc(45vh);
+        height: calc(80vh - 260px);
     }
 
     .chartBBox {
-        height: calc(45vh);
+        height: calc(48vh - 165px);
+        overflow: hidden;
     }
 
     .chartABox.shadowBox,
@@ -581,6 +590,18 @@ export default {
         padding: 0;
     }
 
+    .boxContentB {
+        padding-bottom: 0;
+    }
+
+    .pieBox {
+        height: calc(42vh - 165px);
+
+        .shadowBox {
+            padding: 0;
+        }
+    }
+
     .tabsA /deep/ .el-tabs__nav-wrap::after {
         background-color: @themeColor;
     }

+ 8 - 8
src/views/modelLibrary/components/handleConfigList.vue

@@ -19,7 +19,7 @@
                 <li
                     class="content"
                     v-for="(item, index) in configList.camera"
-                    :key="item.id"
+                    :key="item.id + index"
                 >
                     <div
                         class="nameBox"
@@ -61,7 +61,7 @@
                 <li
                     class="content"
                     v-for="(item, index) in configList.ogt"
-                    :key="item.id"
+                    :key="item.id + index"
                 >
                     <div
                         class="nameBox"
@@ -102,7 +102,7 @@
                 <li
                     class="content"
                     v-for="(item, index) in configList.lidar"
-                    :key="item.id"
+                    :key="item.id + index"
                 >
                     <div
                         class="nameBox"
@@ -144,7 +144,7 @@
                 <li
                     class="content"
                     v-for="(item, index) in configList.gps"
-                    :key="item.id"
+                    :key="item.id + index"
                 >
                     <div
                         class="nameBox"
@@ -304,7 +304,7 @@ export default {
                 default:
                     break;
             }
-            
+
             let apis = [
                 this.$api.modelLibrary.getMyCameraList,
                 this.$api.modelLibrary.getMyOgtList,
@@ -354,19 +354,19 @@ export default {
                     let type = this.currentType;
                     this.$emit("addOne", info, type);
                     this.dialogVisible = false;
-                    this.configHandle(type, 0);
+                    this.configHandle(type, 0, true);
                 }
             });
         },
         handleClose(done) {
             done();
         },
-        configHandle(type, index) {
+        configHandle(type, index, isAdd = false) {
             let curOne = {
                 name: type,
                 index,
             };
-            this.$emit("curItem", curOne);
+            this.$emit("curItem", curOne, isAdd);
         },
     },
 

+ 33 - 4
src/views/modelLibrary/vehicleConfigurationDetail.vue

@@ -147,7 +147,11 @@
                             >
                             </el-input>
                         </el-form-item>
-                        <el-form-item label="端口" prop="sensorPort">
+                        <el-form-item
+                            label="端口"
+                            prop="sensorPort"
+                            v-show="curOne.name === 'ogt'"
+                        >
                             <el-input
                                 placeholder="请输入"
                                 maxlength="10"
@@ -278,7 +282,7 @@ export default {
                     { required: true, message: "请输入", trigger: "blur" },
                 ],
                 sensorPort: [
-                    { required: true, message: "请输入", trigger: "blur" },
+                    { required: false, message: "请输入", trigger: "blur" },
                 ],
             },
             // 传感器对象集合
@@ -296,6 +300,16 @@ export default {
         };
     },
 
+    watch: {
+        curOne(val) {
+            if (val.name === "ogt") {
+                this.rulesA.sensorPort[0].required = true;
+            } else {
+                this.rulesA.sensorPort[0].required = false;
+            }
+        },
+    },
+
     computed: {},
 
     methods: {
@@ -379,10 +393,25 @@ export default {
         delOne(type, index) {
             this.configList[type].splice(index, 1);
         },
-        curItem(item) {
+        curItem(item, isAdd) {
             this.$refs.formA.resetFields();
             this.curOne = item;
-            Object.assign(this.formA, this.configList[item.name][item.index]);
+            if (isAdd) {
+                this.formA.sensorX = "0";
+                this.formA.sensorY = "0";
+                this.formA.sensorZ = "0";
+                this.formA.sensorH = "0";
+                this.formA.sensorP = "0";
+                this.formA.sensorR = "0";
+                if(this.curOne.name==="ogt") {
+                    this.formA.sensorPort = "62001";
+                }
+            } else {
+                Object.assign(
+                    this.formA,
+                    this.configList[item.name][item.index]
+                );
+            }
         },
         saveConfig() {
             if (this.curOne.index < 0) {

+ 1 - 1
src/views/modelLibrary/vehicleConfigurationList.vue

@@ -71,7 +71,7 @@
                 <el-tab-pane label="私有" name="2"></el-tab-pane>
             </el-tabs>
             <el-button
-                class="addBtn"
+                v-bind:class="{ addBtn: true, disabled: activeName === '1' }"
                 icon="el-icon-circle-plus-outline"
                 @click="addOne"
                 type="primary"

+ 13 - 12
src/views/page/breadCrumb.vue

@@ -34,8 +34,9 @@
             </el-breadcrumb>
         </div>
 
-        <div class="close">
-            <i class="el-icon-switch-button"></i>
+        <div class="avatarBox">
+            <!-- <i class="el-icon-switch-button"></i> -->
+            <img :src="imgSrc" width="100%" height="100%" />
         </div>
     </div>
 </template>
@@ -52,6 +53,7 @@ export default {
                 "systemManagement",
                 "workManagement",
             ], // 相关页面只为占位,页面是空白,无法展示
+            imgSrc: require("@/assets/common/image/photoF.png"),
         };
     },
     methods: {},
@@ -79,8 +81,8 @@ export default {
 <style lang="less" scoped>
 .topClass {
     position: relative;
-    height: 35px;
-    line-height: 33px;
+    height: 50px;
+    line-height: 48px;
     border-bottom: 2px solid #f5f7fa;
     overflow: hidden;
 
@@ -88,7 +90,7 @@ export default {
         // width: 1100px;
         // margin: 0 auto;
         // flex: 1;
-        padding-top: 6px;
+        padding-top: 15px;
         padding-left: 12px;
 
         // .breadcrumb {
@@ -125,17 +127,16 @@ export default {
         }
     }
 
-    .close {
+    .avatarBox {
         position: absolute;
-        top: 7px;
+        top: 4px;
         right: 20px;
         z-index: 3;
-        width: 18px;
-        height: 18px;
-        line-height: 1;
-        font-size: 18px;
-        color: @themeColor;
+        width: 40px;
+        height: 40px;
         cursor: pointer;
+        border-radius: 50%;
+        overflow: hidden;
     }
 }
 </style>

+ 66 - 21
src/views/page/pageMenu.vue

@@ -8,11 +8,17 @@
                 <b></b>
             </div>
             <ul class="menuFold" v-show="menuFold">
+                <li
+                    @click="menuFoldHandle(1)"
+                    v-bind:class="{ isOpened: opened === 'mainPage' }"
+                >
+                    <b class="my-icon-home is"></b>
+                </li>
                 <li
                     @click="menuFoldHandle(1)"
                     v-bind:class="{ isOpened: opened === 'modelLibrary' }"
                 >
-                    <b class="my-icon-menuA is"></b>
+                    <b class="my-icon-menuA"></b>
                 </li>
                 <li
                     @click="menuFoldHandle(1)"
@@ -28,11 +34,11 @@
                 </li>
                 <li
                     @click="menuFoldHandle(1)"
-                    v-bind:class="{ isOpened: opened === 'systemManagement' }"
+                    v-bind:class="{ isOpened: opened === 'workManagement' }"
                 >
                     <b class="my-icon-menuD"></b>
                 </li>
-                <li
+                <!-- <li
                     @click="menuFoldHandle(1)"
                     v-bind:class="{ isOpened: opened === 'systemManagement' }"
                 >
@@ -43,19 +49,25 @@
                     v-bind:class="{ isOpened: opened === 'systemManagement' }"
                 >
                     <b class="my-icon-menuF"></b>
-                </li>
+                </li> -->
             </ul>
 
             <div class="menuList" v-show="!menuFold">
                 <el-menu
-                    default-active="modelLibrary"
+                    ref="menu"
+                    default-active="mainPage"
                     class="el-menu-vertical-demo"
                     background-color="#3397FF"
+                    :unique-opened="true"
                     :router="true"
                     @select="menuSel"
                 >
                     <!-- active-text-color="#ffffff" -->
-                    <el-submenu index="modelLibrary">
+                    <el-menu-item :index="menus[0]" class="indexMenu">
+                        <i class="my-icon-home"></i>
+                        <span>首页</span>
+                    </el-menu-item>
+                    <el-submenu :index="menus[1]">
                         <template slot="title">
                             <i class="my-icon-menuA"></i>
                             <span>模型库</span>
@@ -70,7 +82,7 @@
                             >车辆配置</el-menu-item
                         >
                     </el-submenu>
-                    <el-submenu index="algorithmsLibrary">
+                    <el-submenu :index="menus[2]">
                         <template slot="title">
                             <i class="my-icon-menuB"></i>
                             <span>算法库</span>
@@ -79,7 +91,7 @@
                             >算法库列表</el-menu-item
                         >
                     </el-submenu>
-                    <el-submenu index="sceneLibrary">
+                    <el-submenu :index="menus[3]">
                         <template slot="title">
                             <i class="my-icon-menuC"></i>
                             <span>场景库</span>
@@ -99,10 +111,10 @@
                             >场景测试包管理</el-menu-item
                         >
                         <el-menu-item index="gradingRulesList"
-                            >分规则</el-menu-item
+                            >分规则</el-menu-item
                         >
                     </el-submenu>
-                    <el-submenu index="workManagement">
+                    <el-submenu :index="menus[4]">
                         <template slot="title">
                             <i class="my-icon-menuD"></i>
                             <span>工作管理</span>
@@ -123,12 +135,12 @@
                 </el-menu>
             </div>
         </div>
-        <div class="fold" v-show="menuFold">
+        <!-- <div class="fold" v-show="menuFold">
             <img :src="imgSrc" width="100%" height="100%" />
         </div>
         <div class="unfold" v-show="!menuFold">
             <img :src="imgSrc" width="100%" height="100%" />
-        </div>
+        </div> -->
     </div>
 </template>
 
@@ -140,6 +152,13 @@ export default {
             menuFold: false, // menu是否折叠
             opened: false,
             imgSrc: require("@/assets/common/image/photoF.png"),
+            menus: [
+                "mainPage",
+                "modelLibrary",
+                "algorithmsLibrary",
+                "sceneLibrary",
+                "workManagement",
+            ],
         };
     },
     methods: {
@@ -154,16 +173,26 @@ export default {
         menuSel(index, indexPath) {
             // console.log(index, indexPath);
             this.opened = indexPath[0];
+
+            // 如果是首页 手动关闭其他菜单
+            if (index === this.menus[0]) {
+                this.menus.forEach((i) => {
+                    this.$refs.menu.close(i);
+                });
+            }
         },
     },
     created() {
-        localStorage.setItem(
-            "Authorization",
-            "Bearer 9882c634-9af6-4647-89dc-8ad53c04a56b"
-        );
+        // localStorage.setItem(
+        //     "Authorization",
+        //     "Bearer 9882c634-9af6-4647-89dc-8ad53c04a56b"
+        // );
+
+
+
         // document.cookie = 'Authorization=Bearer 52de2c22-c2f9-4307-b49d-5b5593792352'
         // console.log(this.$route);
-        /* let { code, ticket } = this.$route.query;
+        let { code, ticket } = this.$route.query;
         if (code && ticket) {
             this.$axios({
                 method: "post",
@@ -181,7 +210,7 @@ export default {
             });
         } else {
             console.log(66);
-        } */
+        }
     },
 };
 </script>
@@ -231,7 +260,6 @@ export default {
 
     b {
         display: block;
-        background-size: contain;
     }
 }
 
@@ -242,6 +270,7 @@ export default {
         height: 38px;
         background: url("../../assets/common/image/menu/iconFold.png") center
             no-repeat;
+        background-size: contain;
     }
 }
 
@@ -252,15 +281,30 @@ export default {
         height: 27px;
         background: url("../../assets/common/image/menu/icon.png") center
             no-repeat;
+        background-size: contain;
     }
 }
 
-.el-submenu [class^="my-icon-"] {
+.el-submenu [class^="my-icon-"],
+.el-menu-item [class^="my-icon-"] {
     width: 24px;
     height: 18px;
     margin-right: 5px;
 }
 
+.indexMenu {
+    padding-left: 15px !important;
+    padding-right: 10px !important;
+
+    span {
+        color: #ffffff !important;
+    }
+}
+
+.my-icon-home {
+    background: url("../../assets/common/image/menu/home.png") center no-repeat;
+}
+
 .my-icon-menuA {
     background: url("../../assets/common/image/menu/menuA.png") center no-repeat;
 }
@@ -308,10 +352,11 @@ export default {
 
 .el-menu {
     // background: @themeColor;
+    border-right-color: @themeColor;
 
     /deep/ .el-submenu__title,
     .el-menu-item {
-        color: #D7E7FE;
+        color: #d7e7fe;
 
         &.is-active {
             color: #ffffff;

+ 1 - 1
src/views/sceneLibrary/gradingRule.vue

@@ -61,7 +61,7 @@
 //import  from '';
 
 export default {
-    name: "gradingRule", // 分规则
+    name: "gradingRule", // 分规则
     components: {},
     data() {
         return {

+ 2 - 2
src/views/sceneLibrary/gradingRulesList.vue

@@ -61,7 +61,7 @@
                 <el-tab-pane label="私有" name="2"></el-tab-pane>
             </el-tabs>
             <el-button
-                class="addBtn"
+                v-bind:class="{ addBtn: true, disabled: activeName === '1' }"
                 icon="el-icon-circle-plus-outline"
                 @click="addOne"
                 type="primary"
@@ -123,7 +123,7 @@ import tableList from "@/components/grid/TableList";
 import toolbarTab from "@/components/toolbar/toolbarTab";
 
 export default {
-    name: "gradingRulesList", // 分规则列表
+    name: "gradingRulesList", // 分规则列表
     components: { searchLayout, tableList, toolbarTab },
     data() {
         return {

+ 55 - 3
src/views/sceneLibrary/naturalDrivingScenarioList.vue

@@ -75,7 +75,7 @@
                     clearable=""
                 ></el-cascader>
             </template>
-            <template slot="searchItem9">
+            <template slot="searchItem27">
                 <el-checkbox-group v-model="searchParams.c">
                     <el-checkbox-button :label="1" :key="1" class="labelA"
                         >绿灯</el-checkbox-button
@@ -154,12 +154,18 @@
                         title="查看"
                     >
                     </i>
+                    <i
+                        @click="delRow(scope.row)"
+                        class="el-icon-delete elIcon"
+                        title="删除"
+                    >
+                    </i>
                 </template>
             </el-table-column>
         </tableList>
 
         <el-dialog
-            title="CAMERAO"
+            :title="videoDiaTitle"
             :visible.sync="dialogVisible"
             width="690px"
             :close-on-click-modal="false"
@@ -177,6 +183,7 @@
 import searchLayout from "@/components/grid/searchLayout";
 import tableList from "@/components/grid/TableList";
 import fileDialog from "./components/fileDialog";
+import { mapState } from "vuex";
 
 export default {
     name: "naturalDrivingScenarioList", // 自然驾驶场景
@@ -256,8 +263,17 @@ export default {
             autoplay: false,
             videoSrc: "",
             objectPath: "",
+            videoDiaTitle: "",
+            //abc: "http://10.15.12.72:8001/simulation/resource/common/minio/preview?objectName=
+            // 自然驾驶场景/20220314/0.2378730429515783/simulation.mp4&access_token
+            // =9882c634-9af6-4647-89dc-8ad53c04a56b",
         };
     },
+
+    computed: {
+        ...mapState(["fileHost", "fileUrl"]),
+    },
+
     methods: {
         doSearch() {
             this.refreshList(this.searchParams);
@@ -283,9 +299,41 @@ export default {
         },
         viewRow(row) {
             this.dialogVisible = true;
-            this.videoSrc = row.videoPreview;
+            this.videoDiaTitle = row.naturalName;
+
+            let url = "";
+            if (process.env.VUE_APP_IS_DEV == "true") {
+                url = this.fileHost + this.fileUrl;
+            } else {
+                url = this.fileUrl;
+            }
+
+            let token = localStorage.getItem("Authorization").split(" ")[1];
+            this.videoSrc += `${url}?objectName=${row.videoAddress}&access_token=${token}`;
             this.autoplay = true;
         },
+        delRow(row) {
+            this.$confirm("确认是否删除?", "提示", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning",
+            }).then(() => {
+                this.$axios({
+                    method: "post",
+                    url: this.$api.sceneLibrary.deleteSceneNatural,
+                    data: {
+                        naturalId: row.naturalId,
+                    },
+                }).then((res) => {
+                    if (res.code == 200) {
+                        this.$message.success("删除成功");
+                    } else {
+                        this.$message.error(res.message || "删除失败");
+                    }
+                    this.doSearch();
+                });
+            });
+        },
         diaClose(done) {
             this.autoplay = false;
             this.videoSrc = "";
@@ -322,4 +370,8 @@ export default {
         min-width: 75px;
     }
 }
+
+.btnsPanel {
+    text-align: right;
+}
 </style>

+ 1 - 1
src/views/sceneLibrary/scenarioTestPackageManagementList.vue

@@ -51,7 +51,7 @@
                 <el-tab-pane label="私有" name="2"></el-tab-pane>
             </el-tabs>
             <el-button
-                class="addBtn"
+                v-bind:class="{ addBtn: true, disabled: activeName === '1' }"
                 icon="el-icon-circle-plus-outline"
                 @click="addConfig"
                 type="primary"

+ 82 - 2
src/views/sceneLibrary/scenePacketList.vue

@@ -49,6 +49,14 @@
                     <span>{{ scope.row.sublistName }}</span>
                 </template>
             </el-table-column>
+            <el-table-column label="权重" slot="weight" align="center">
+                <template v-slot="scope">
+                    <span v-if="scope.row.weightErr" style="color: red">{{
+                        scope.row.weight
+                    }}</span>
+                    <span v-else>{{ scope.row.weight }}</span>
+                </template>
+            </el-table-column>
         </tableList>
 
         <div class="btns">
@@ -96,6 +104,7 @@
                         maxlength="6"
                         v-autoTrim="{ obj: form, key: 'weight' }"
                         v-model="form.weight"
+                        :disabled="editType === 'edit' && isRoot"
                     >
                     </el-input>
                 </el-form-item>
@@ -223,6 +232,7 @@ export default {
                 {
                     label: "权重",
                     prop: "weight",
+                    template: true,
                 },
                 {
                     label: "场景数量",
@@ -257,7 +267,7 @@ export default {
                         sceneStatueIds: null,
                         sceneTrafficIds: null,
                         seq: 0,
-                        sublistName: "根节点",
+                        sublistName: "一级指标",
                         weight: 100,
                     },
                 ],
@@ -306,6 +316,7 @@ export default {
             checkedIdsA: [], // 交通事故列表已选
             checkedIdsB: [], // 自然驾驶列表已选
             checkedIdsC: [], // 标准法规列表已选
+            isRoot: false, // 是否是根节点
         };
     },
 
@@ -341,6 +352,13 @@ export default {
             this.nameDiaTitle = "编辑指标";
             this.editType = "edit";
             this.indicatorsVisible = true;
+
+            if (row.parentId === "0") {
+                this.isRoot = true;
+            } else {
+                this.isRoot = false;
+            }
+
             this.form.sublistName = row.sublistName;
             this.form.weight = row.weight;
             this.form.remarks = row.remarks;
@@ -351,6 +369,7 @@ export default {
         addIndicators(row) {
             this.nameDiaTitle = "添加指标";
             this.editType = "add";
+            
             this.indicatorsVisible = true;
 
             this.curNode = row;
@@ -403,6 +422,8 @@ export default {
                         }
                         this.curNode.children.push(node);
                     }
+console.log(this.getDataWay.data[0]);
+                    this.checkWeightValidate();
 
                     this.indicatorsCancel();
                 }
@@ -473,6 +494,15 @@ export default {
                 this.checkedIdsB.length +
                 this.checkedIdsC.length;
 
+            // 选择场景总数为0 则去掉对应的规则名称和id
+            if (this.curNode.sceneNum === 0) {
+                this.curNode.packageAndRules = "";
+                this.curNode.ruleName = "";
+            } else {
+                this.curNode.packageAndRules = this.formA.rulesId;
+                this.curNode.ruleName = this.formA.ruleName;
+            }
+
             // 选中数据分别传入对应的ids组
             this.curNode.sceneTrafficIds = this.checkedIdsA.join(",");
             this.curNode.sceneNaturalIds = this.checkedIdsB.join(",");
@@ -508,6 +538,32 @@ export default {
 
             this.scenarioListsVisible = false;
         },
+        // 校验权重
+        checkWeightValidate() {
+            this.allRowWeightErrFalse(this.getDataWay.data[0]);
+
+            let ids = [];
+
+            for (let index = 0; index < this.nodeList.length; index++) {
+                const element = this.nodeList[index];
+                if (element.children && element.children.length > 0) {
+                    let total = 0;
+                    let arr = [];
+                    element.children.forEach((item) => {
+                        console.log(this.nodeList);
+                        total += +this.nodeList.find((i) => i.id === item.id)
+                            .weight;
+                        arr.push(item.id);
+                    });
+                    if (total != 100) {
+                        ids.push(...arr);
+                    }
+                }
+            }
+            this.rowWeightErrTrue(this.getDataWay.data[0], ids);
+            console.log(6);
+            console.log(this.getDataWay.data[0]);
+        },
         // 深度优先遍历
         /* deepFirstSearch(node, nodeList) {
             if (node) {
@@ -537,6 +593,30 @@ export default {
             }
             return nodeList;
         },
+        // 使全部节点 weightErr 为 false
+        allRowWeightErrFalse(node) {
+            if (node) {
+                node.weightErr = false;
+                var children = node.children;
+                if (children) {
+                    for (var i = 0; i < children.length; i++)
+                        this.allRowWeightErrFalse(children[i]);
+                }
+            }
+        },
+        // 使部分节点 weightErr 为 true
+        rowWeightErrTrue(node, arr) {
+            if (node) {
+                if (arr.includes(node.id)) {
+                    node.weightErr = true;
+                }
+                var children = node.children;
+                if (children) {
+                    for (var i = 0; i < children.length; i++)
+                        this.rowWeightErrTrue(children[i], arr);
+                }
+            }
+        },
         save(isAdd) {
             this.nodeList = [];
             this.deepFirstSearch(this.getDataWay.data[0], this.nodeList);
@@ -596,7 +676,7 @@ export default {
                 if (res.code == 200 && res.info) {
                     this.ruleList = res.info;
                 } else {
-                    this.$message.error(res.message || "获取分规则列表失败");
+                    this.$message.error(res.message || "获取分规则列表失败");
                 }
             });
         },

+ 51 - 3
src/views/sceneLibrary/standardRegulationSimulationScenarioList.vue

@@ -34,7 +34,7 @@
                 >
                 </el-input>
             </template>
-            <template slot="searchItem4">
+            <template slot="searchItem27">
                 <el-checkbox-group v-model="searchParams.c">
                     <el-checkbox-button :label="1" :key="1" class="labelA"
                         >绿灯</el-checkbox-button
@@ -113,12 +113,18 @@
                         title="查看"
                     >
                     </i>
+                    <i
+                        @click="delRow(scope.row)"
+                        class="el-icon-delete elIcon"
+                        title="删除"
+                    >
+                    </i>
                 </template>
             </el-table-column>
         </tableList>
 
         <el-dialog
-            title="CAMERAO"
+            :title="videoDiaTitle"
             :visible.sync="dialogVisible"
             width="690px"
             :close-on-click-modal="false"
@@ -136,6 +142,7 @@
 import searchLayout from "@/components/grid/searchLayout";
 import tableList from "@/components/grid/TableList";
 import fileDialog from "./components/fileDialog";
+import { mapState } from "vuex";
 
 export default {
     name: "standardRegulationSimulationScenarioList", // 标准法规仿真场景
@@ -196,8 +203,14 @@ export default {
             autoplay: false,
             videoSrc: "",
             objectPath: "",
+            videoDiaTitle: "",
         };
     },
+
+    computed: {
+        ...mapState(["fileHost", "fileUrl"]),
+    },
+
     methods: {
         doSearch() {
             this.refreshList(this.searchParams);
@@ -218,9 +231,41 @@ export default {
         },
         viewRow(row) {
             this.dialogVisible = true;
-            this.videoSrc = row.videoPreview;
+            this.videoDiaTitle = row.sceneName;
+
+            let url = "";
+            if (process.env.VUE_APP_IS_DEV == "true") {
+                url = this.fileHost + this.fileUrl;
+            } else {
+                url = this.fileUrl;
+            }
+
+            let token = localStorage.getItem("Authorization").split(" ")[1];
+            this.videoSrc += `${url}?objectName=${row.videoAddress}&access_token=${token}`;
             this.autoplay = true;
         },
+        delRow(row) {
+            this.$confirm("确认是否删除?", "提示", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning",
+            }).then(() => {
+                this.$axios({
+                    method: "post",
+                    url: this.$api.sceneLibrary.deleteStandardsRegulations,
+                    data: {
+                        regulationsId: row.regulationsId,
+                    },
+                }).then((res) => {
+                    if (res.code == 200) {
+                        this.$message.success("删除成功");
+                    } else {
+                        this.$message.error(res.message || "删除失败");
+                    }
+                    this.doSearch();
+                });
+            });
+        },
         diaClose(done) {
             this.autoplay = false;
             this.videoSrc = "";
@@ -246,4 +291,7 @@ export default {
 
 <style lang='less' scoped>
 @import "./common/util.less";
+.btnsPanel {
+    text-align: right;
+}
 </style>

+ 52 - 3
src/views/sceneLibrary/trafficAccidentSimulationScenarioList.vue

@@ -67,7 +67,7 @@
                     ></el-option>
                 </el-select>
             </template>
-            <template slot="searchItem7">
+            <template slot="searchItem27">
                 <el-checkbox-group v-model="searchParams.c">
                     <el-checkbox-button :label="1" :key="1" class="labelA"
                         >绿灯</el-checkbox-button
@@ -146,12 +146,18 @@
                         title="查看"
                     >
                     </i>
+                    <i
+                        @click="delRow(scope.row)"
+                        class="el-icon-delete elIcon"
+                        title="删除"
+                    >
+                    </i>
                 </template>
             </el-table-column>
         </tableList>
 
         <el-dialog
-            title="CAMERAO"
+            :title="videoDiaTitle"
             :visible.sync="dialogVisible"
             width="690px"
             :close-on-click-modal="false"
@@ -169,6 +175,7 @@
 import searchLayout from "@/components/grid/searchLayout";
 import tableList from "@/components/grid/TableList";
 import fileDialog from "./components/fileDialog";
+import { mapState } from "vuex";
 
 export default {
     name: "trafficAccidentSimulationScenarioList", // 交通事故仿真场景
@@ -247,8 +254,14 @@ export default {
             autoplay: false,
             videoSrc: "",
             objectPath: "",
+            videoDiaTitle: "",
         };
     },
+
+    computed: {
+        ...mapState(["fileHost", "fileUrl"]),
+    },
+
     methods: {
         doSearch() {
             this.refreshList(this.searchParams);
@@ -272,9 +285,41 @@ export default {
         },
         viewRow(row) {
             this.dialogVisible = true;
-            this.videoSrc = row.videoPreview;
+            this.videoDiaTitle = row.sceneName;
+
+            let url = "";
+            if (process.env.VUE_APP_IS_DEV == "true") {
+                url = this.fileHost + this.fileUrl;
+            } else {
+                url = this.fileUrl;
+            }
+
+            let token = localStorage.getItem("Authorization").split(" ")[1];
+            this.videoSrc += `${url}?objectName=${row.videoAddress}&access_token=${token}`;
             this.autoplay = true;
         },
+        delRow(row) {
+            this.$confirm("确认是否删除?", "提示", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning",
+            }).then(() => {
+                this.$axios({
+                    method: "post",
+                    url: this.$api.sceneLibrary.deleteSceneAccident,
+                    data: {
+                        accidentId: row.accidentId,
+                    },
+                }).then((res) => {
+                    if (res.code == 200) {
+                        this.$message.success("删除成功");
+                    } else {
+                        this.$message.error(res.message || "删除失败");
+                    }
+                    this.doSearch();
+                });
+            });
+        },
         diaClose(done) {
             this.autoplay = false;
             this.videoSrc = "";
@@ -313,4 +358,8 @@ export default {
         min-width: 90px;
     }
 }
+
+.btnsPanel {
+    text-align: right;
+}
 </style>

+ 18 - 17
src/views/workManagement/manualRunProjectList.vue

@@ -119,19 +119,22 @@
             <el-table-column label="操作" slot="cgInfos" align="center">
                 <template v-slot="scope">
                     <i
-                        v-if="scope.row.nowRunState === '20'"
-                        @click="stopRow(scope.row.id)"
-                        class="el-icon-video-pause elIcon"
-                        title="中止"
+                        v-if="
+                            scope.row.nowRunState === '10' ||
+                            scope.row.nowRunState === '40'
+                        "
+                        @click="runRow(scope.row.id)"
+                        class="el-icon-video-play elIcon"
+                        title="运行"
                     ></i>
                     <i
                         v-if="
                             scope.row.nowRunState === '10' ||
                             scope.row.nowRunState === '40'
                         "
-                        @click="delRow(scope.row.id)"
-                        class="el-icon-delete elIcon"
-                        title="删除"
+                        @click="editRow(scope.row)"
+                        class="el-icon-edit-outline elIcon"
+                        title="编辑"
                     ></i>
                     <i
                         @click="viewRow(scope.row.id)"
@@ -139,22 +142,19 @@
                         title="查看"
                     ></i>
                     <i
-                        v-if="
-                            scope.row.nowRunState === '10' ||
-                            scope.row.nowRunState === '40'
-                        "
-                        @click="runRow(scope.row.id)"
-                        class="el-icon-video-play elIcon"
-                        title="运行"
+                        v-if="scope.row.nowRunState === '20'"
+                        @click="stopRow(scope.row.id)"
+                        class="el-icon-video-pause elIcon"
+                        title="中止"
                     ></i>
                     <i
                         v-if="
                             scope.row.nowRunState === '10' ||
                             scope.row.nowRunState === '40'
                         "
-                        @click="editRow(scope.row)"
-                        class="el-icon-edit-outline elIcon"
-                        title="编辑"
+                        @click="delRow(scope.row.id)"
+                        class="el-icon-delete elIcon"
+                        title="删除"
                     ></i>
                     <!-- <i
                         v-if="scope.row.nowRunState != '10'"
@@ -442,6 +442,7 @@ export default {
 <style lang='less' scoped>
 .btnsPanel {
     margin: 45px 40px 15px;
+    text-align: right;
 }
 
 .checkboxPanel {