wyj0522 4 ngày trước cách đây
mục cha
commit
970eb576d6
31 tập tin đã thay đổi với 2463 bổ sung740 xóa
  1. 15 7
      fdapfe-admin/src/main/java/com/cn/fdapfe/biz/domain/ModelDataGen.java
  2. 4 0
      fdapfe-admin/src/main/java/com/cn/fdapfe/biz/domain/ParamsConfig.java
  3. 2 0
      fdapfe-admin/src/main/java/com/cn/fdapfe/biz/service/impl/ModelDataGenServiceImpl.java
  4. 13 4
      fdapfe-admin/src/main/resources/mapper/dataGen/ModelDataGenMapper.xml
  5. 1 1
      fdapfe-ui/package.json
  6. 1 0
      fdapfe-ui/public/index.html
  7. 0 0
      fdapfe-ui/public/styles/theme-chalk/index.css
  8. 3 0
      fdapfe-ui/src/App.vue
  9. BIN
      fdapfe-ui/src/assets/images/bg.png
  10. 10 10
      fdapfe-ui/src/assets/styles/element-ui.scss
  11. 2 2
      fdapfe-ui/src/assets/styles/index.scss
  12. 5 5
      fdapfe-ui/src/assets/styles/ruoyi.scss
  13. 3 3
      fdapfe-ui/src/assets/styles/variables.scss
  14. 1 1
      fdapfe-ui/src/components/Pagination/index.vue
  15. 1 1
      fdapfe-ui/src/layout/components/AppMain.vue
  16. 1 1
      fdapfe-ui/src/layout/components/Navbar.vue
  17. 2 2
      fdapfe-ui/src/layout/components/TagsView/index.vue
  18. 21 0
      fdapfe-ui/src/layout/index.scss
  19. 1 1
      fdapfe-ui/src/router/index.js
  20. 8 52
      fdapfe-ui/src/views/dataGen/DynamicParameterForm.vue
  21. 1 1
      fdapfe-ui/src/views/dataGen/index.vue
  22. 2070 517
      fdapfe-ui/src/views/form.vue
  23. 36 38
      fdapfe-ui/src/views/index.scss
  24. 227 59
      fdapfe-ui/src/views/index.vue
  25. 12 13
      fdapfe-ui/src/views/model/faultPhysical/form.vue
  26. 2 2
      fdapfe-ui/src/views/system/user/index.vue
  27. 1 1
      fdapfe-ui/src/views/test/ddAlgorithm/form.vue
  28. 1 1
      fdapfe-ui/src/views/test/perf/PrecisionSnrChart.vue
  29. 17 16
      fdapfe-ui/src/views/test/perf/perfDetail.vue
  30. 1 1
      fdapfe-ui/src/views/tool/build/index.vue
  31. 1 1
      fdapfe-ui/src/views/workflow/workflow/form.vue

+ 15 - 7
fdapfe-admin/src/main/java/com/cn/fdapfe/biz/domain/ModelDataGen.java

@@ -63,18 +63,26 @@ public class ModelDataGen extends BasePO
     private String status;
 
     /** 开始时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
-    @TableField(value = "start_time")
-    private Date startTime;
+    @TableField(value ="start_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private String startTime;
 
     /** 结束时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @TableField(value ="end_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
-    @TableField(value = "end_time")
-    private Date endTime;
+    private String endTime;
 
     @TableField(exist = false)
     private String postApiData;
+    @TableField(exist = false)
+    private String modelName;
+    @TableField(exist = false)
+    private String diagModelName;
+    @TableField(exist = false)
+    private String modelType;
+    @TableField(exist = false)
+    private String modelTypet;
 
 }

+ 4 - 0
fdapfe-admin/src/main/java/com/cn/fdapfe/biz/domain/ParamsConfig.java

@@ -50,4 +50,8 @@ public class ParamsConfig extends BasePO{
     @Excel(name = "是否必填")
     @TableField(value ="is_required")
     private Boolean isRequired;
+    /** 是否显示 */
+    @Excel(name = "是否显示")
+    @TableField(value ="is_show")
+    private Boolean isShow;
 }

+ 2 - 0
fdapfe-admin/src/main/java/com/cn/fdapfe/biz/service/impl/ModelDataGenServiceImpl.java

@@ -118,6 +118,7 @@ public class ModelDataGenServiceImpl implements IModelDataGenService {
      */
     @Override
     public int add(ModelDataGen po) throws Exception {
+        po.setStartTime(DateUtils.getTime());
         FaultPhysicalModel model = faultPhysicalModelMapper.selectById(po.getModelId());
         ObjectMapper mapper = new ObjectMapper();
         LinkedHashMap[] array = mapper.readValue(po.getPostApiData(), LinkedHashMap[].class);
@@ -130,6 +131,7 @@ public class ModelDataGenServiceImpl implements IModelDataGenService {
                 processNoiseModelData(item, data, po, model);
             }
         }
+        po.setEndTime(DateUtils.getTime());
         return modelDataGenMapper.insert(po);
     }
 

+ 13 - 4
fdapfe-admin/src/main/resources/mapper/dataGen/ModelDataGenMapper.xml

@@ -14,6 +14,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="startTime"    column="start_time"    />
         <result property="originalDataIds"    column="original_data_ids"    />
         <result property="generatedDataId"    column="generated_data_id"    />
+        <result property="modelName"    column="model_name"    />
+        <result property="diagModelName"    column="diag_model_name"    />
+        <result property="modelType"    column="model_type"    />
+        <result property="modelTypet"    column="model_type_t"    />
         <result property="endTime"    column="end_time"    />
         <result property="remark"    column="remark"    />
         <result property="createBy"    column="create_by"    />
@@ -21,9 +25,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="updateBy"    column="update_by"    />
         <result property="updateTime"    column="update_time"    />
     </resultMap>
-
-<!--    <select id="selectList" resultMap="PhyModelDataGenResult">-->
-<!--        SELECT * FROM biz_data_gen_model LIFT JOIN -->
-<!--    </select>-->
+    <select id="selectList" resultMap="PhyModelDataGenResult">
+        SELECT
+            w.*,
+            a.model_name
+        FROM
+            biz_data_gen_model w
+        LEFT JOIN biz_fault_model_t a ON w.model_id = a.model_id
+            ${ew.customSqlSegment}
+    </select>
 
 </mapper>

+ 1 - 1
fdapfe-ui/package.json

@@ -39,7 +39,7 @@
     "@jiaminghi/data-view": "^2.10.0",
     "@riophae/vue-treeselect": "0.4.0",
     "ant-design-vue": "^1.7.8",
-    "axios": "0.28.1",
+    "axios": "1.8.2",
     "clipboard": "2.0.8",
     "core-js": "3.37.1",
     "dayjs": "^1.11.13",

+ 1 - 0
fdapfe-ui/public/index.html

@@ -12,6 +12,7 @@
     html,
     body,
     #app {
+      background: url("src/assets/images/bg.png") !important;
       height: 100%;
       margin: 0px;
       padding: 0px;

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
fdapfe-ui/public/styles/theme-chalk/index.css


+ 3 - 0
fdapfe-ui/src/App.vue

@@ -25,4 +25,7 @@ export default {
 #app .theme-picker {
   display: none;
 }
+#app  {
+  background: url("assets/images/bg.png")!important;
+}
 </style>

BIN
fdapfe-ui/src/assets/images/bg.png


+ 10 - 10
fdapfe-ui/src/assets/styles/element-ui.scss

@@ -55,13 +55,13 @@
   .el-dialog__header,
   .el-dialog__footer,
   .el-dialog__body{
-    background-color: #0b333f;
+    background-color: #0a0e27;
   }
   .el-dialog__header .el-dialog__title{
     color: white;
   }
   .el-upload .el-upload-dragger {
-    background-color: #0b333f !important;
+    background-color: #0a0e27 !important;
     .el-upload__text{
       color: #fff;
     }
@@ -72,13 +72,13 @@
 
 }
 .vue-treeselect__control{
-  background-color: #0b333f !important;
+  background-color: #0a0e27 !important;
   .vue-treeselect__single-value{
     color: #fff !important;
   }
 }
 .el-textarea__inner{
-  background-color: #0b333f !important;
+  background-color: #0a0e27 !important;
 }
 // refine element ui upload
 .upload-container {
@@ -88,7 +88,7 @@
     .el-upload-dragger {
       width: 100%;
       height: 200px;
-      background-color: #0b333f !important;
+      background-color: #0a0e27 !important;
     }
   }
 }
@@ -105,7 +105,7 @@
   display: inline-flex !important;
 }
 .el-range-input{
-  background-color: #0b333f;
+  background-color: #0a0e27;
 }
 
 // to fix el-date-picker css style
@@ -124,14 +124,14 @@
 // el-form
 .el-form .el-form-item__label{
   color: #e4eaef;
-  
+
 }
 .el-input__inner{
-  background: #0b333f !important;
+  background: #0a0e27 !important;
   color: white;
 }
 .el-tree{
-  background: #0b333f !important;
+  background: #0a0e27 !important;
   color: #fefeff;
 }
 .el-radio__label{
@@ -139,4 +139,4 @@
 }
 .el-loading-mask{
   background-color: rgb(11, 51, 63,0.1) !important;
-}
+}

+ 2 - 2
fdapfe-ui/src/assets/styles/index.scss

@@ -121,7 +121,7 @@ aside {
 
 //main-container全局样式
 .app-container {
-  background-color: #0b333f;
+  background-color: #0a0e27;
   padding: 20px;
 }
 
@@ -131,7 +131,7 @@ aside {
 }
 
 .pagination-container {
-  background: #0b333f;
+  background: #0a0e27;
   margin-top: 30px;
 }
 

+ 5 - 5
fdapfe-ui/src/assets/styles/ruoyi.scss

@@ -83,7 +83,7 @@
 			color: #fff;
 			height: 40px;
 			font-size: 13px;
-			
+
 		}
 	}
 	.el-table__body-wrapper {
@@ -93,7 +93,7 @@
 	}
 	.el-table__body{
 		tr {
-			background: #0b333f !important;
+			background: #0a0e27 !important;
 			color: white;
 		}
 		tr:hover>td{
@@ -136,7 +136,7 @@
 	position: absolute;
 	.btn-prev,
 	.btn-next{
-		background-color: #0b333f;
+		background-color: #0a0e27;
 		color: white;
 	}
 	.el-pagination__total{
@@ -216,11 +216,11 @@
 }
 
 .el-card__header{
-	background-color: #0b333f;
+	background-color: #0a0e27;
 	color: #fff;
 }
 .el-card__body {
-	background-color: #0b333f;
+	background-color: #0a0e27;
 	color: #fff;
 	padding: 15px 20px 20px 20px;
 }

+ 3 - 3
fdapfe-ui/src/assets/styles/variables.scss

@@ -7,18 +7,18 @@ $green: #30B08F;
 $tiffany: #4AB7BD;
 $yellow:#FEC171;
 $panGreen: #30B08F;
-$deep-blue:#0b333f;
+$deep-blue:#0a0e27;
 
 // 默认菜单主题风格
 $base-menu-color:#e4eaef;
 $base-menu-color-active:#f4f4f5;
 // $base-menu-background:#304156;
-$base-menu-background:#0b333f;
+$base-menu-background:#0a0e27;
 $base-logo-title-color: #ffffff;
 
 $base-menu-light-color:rgba(0,0,0,.70);
 $base-menu-light-background:#ffffff;
-$base-logo-light-title-color: #001529;
+$base-logo-light-title-color: #0a0e27;
 
 // $base-sub-menu-background:#1f2d3d;
 $base-sub-menu-background:#1e262f;

+ 1 - 1
fdapfe-ui/src/components/Pagination/index.vue

@@ -105,7 +105,7 @@ export default {
 
 <style scoped>
 .pagination-container {
-  background: #0b333f;
+  background: #0a0e27;
   color: #fff;
   padding: 32px 16px;
 }

+ 1 - 1
fdapfe-ui/src/layout/components/AppMain.vue

@@ -32,7 +32,7 @@ export default {
   min-height: calc(100vh - 60px);
   width: 100%;
   // background-color: #08202b;
-  background-color: #0b333f;
+  background-color: #0a0e27;
   position: relative;
   overflow: hidden;
 }

+ 1 - 1
fdapfe-ui/src/layout/components/Navbar.vue

@@ -117,7 +117,7 @@ export default {
   height: 50px;
   overflow: hidden;
   position: relative;
-  background: #0b333f;
+  background: #0a0e27;
   color: #FFFFFF;
   box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
 

+ 2 - 2
fdapfe-ui/src/layout/components/TagsView/index.vue

@@ -237,7 +237,7 @@ export default {
 .tags-view-container {
   height: 34px;
   width: 100%;
-  background: #0b333f;
+  background: #0a0e27;
   border-bottom: 1px solid #d8dce5;
   box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 0 3px 0 rgba(0, 0, 0, .04);
   .tags-view-wrapper {
@@ -249,7 +249,7 @@ export default {
       line-height: 26px;
       border: 1px solid #d8dce5;
       color: #fff;
-      background: #0b333f;
+      background: #0a0e27;
       padding: 0 8px;
       font-size: 12px;
       margin-left: 5px;

+ 21 - 0
fdapfe-ui/src/layout/index.scss

@@ -0,0 +1,21 @@
+.el-header {
+  padding-left: 0 !important;
+  padding-right: 0 !important;
+  height: 120px !important;
+}
+.el-pagination__jump {
+  margin-top: -5px;
+}
+
+.el-main::-webkit-scrollbar-track-piece {
+  background: rgba(33, 33, 33, 0.331) !important ;
+}
+
+.el-main::-webkit-scrollbar {
+  width: 12px;
+  height: 6px;
+}
+.el-main::-webkit-scrollbar-thumb {
+  background: rgb(13, 128, 164) !important;
+  border-radius: 20px;
+}

+ 1 - 1
fdapfe-ui/src/router/index.js

@@ -68,7 +68,7 @@ export const constantRoutes = [
     children: [
       {
         path: 'index',
-        component: () => import('@/views/index'),
+        component: () => import('@/views/form.vue'),
         name: 'Index',
         meta: { title: '首页', icon: 'dashboard', affix: true }
       }

+ 8 - 52
fdapfe-ui/src/views/dataGen/DynamicParameterForm.vue

@@ -7,6 +7,7 @@
         icon="el-icon-plus"
         @click="addParamGroup"
         class="add-btn"
+        v-if="paramGroups.length<limit"
         :disabled="this.modelTypedisbale"
       />
     </div>
@@ -31,11 +32,12 @@
             :key="param.paramId"
             :label="param.paramChineseName || param.paramName"
             :prop="param.paramName"
+            v-show="param.isShow"
           >
             <!-- 文件类型处理 -->
             <!-- 文件类型处理 -->
             <template v-if="param.paramType === 'file'">
-              <file-upload  v-model="group.formData[param.paramName]" :limit="1"></file-upload>
+              <file-upload  :file-type="['mat','csv']" v-model="group.formData[param.paramName]" :limit="1"></file-upload>
             </template>
 
             <!-- 字符串类型 -->
@@ -89,25 +91,6 @@
                 inactive-text="关闭"
               />
             </template>
-<!--            &lt;!&ndash; 路径类型 &ndash;&gt;-->
-<!--            <template v-else-if="param.paramType === 'Path'">-->
-<!--              <div class="path-selector">-->
-<!--                <el-input-->
-<!--                  v-model="group.formData[param.paramName]"-->
-<!--                  placeholder="请选择路径"-->
-<!--                  readonly-->
-<!--                  clearable-->
-<!--                />-->
-<!--                <el-button-->
-<!--                  slot="append"-->
-<!--                  icon="el-icon-folder-opened"-->
-<!--                  @click="selectDirectory(param.paramName)"-->
-<!--                >-->
-<!--                  选择目录-->
-<!--                </el-button>-->
-<!--              </div>-->
-<!--            </template>-->
-            <!-- 下拉选择类型 -->
             <template v-else-if="param.paramType === 'select'&&param.paramName==='noiseType'">
               <el-select
                 size="small"
@@ -224,33 +207,6 @@ export default {
     console.log('type', this.modelTypedisbale);
   },
   methods: {
-    // 选择目录方法
-    // selectDirectory(paramName) {
-    //   // 创建隐藏的文件输入元素
-    //   const input = document.createElement('input');
-    //   input.type = 'file';
-    //   input.webkitdirectory = true; // 允许选择目录
-    //   input.style.display = 'none';
-    //   // 添加到文档中
-    //   document.body.appendChild(input);
-    //   // 监听文件选择事件
-    //   input.addEventListener('change', (e) => {
-    //     const files = e.target.files;
-    //     if (files.length > 0) {
-    //       // 获取所选目录的路径
-    //       const directoryPath = files[0].path;
-    //       console.log('directoryPath', directoryPath);
-    //       // 更新表单数据
-    //       this.group.formData[paramName] = directoryPath;
-    //     }
-    //   });
-    //   // 触发点击事件
-    //   input.click();
-    //   // 完成后移除元素
-    //   setTimeout(() => {
-    //     document.body.removeChild(input);
-    //   }, 0);
-    // },
     // 初始化参数组
     initParamGroups() {
       this.paramGroups = this.initialGroups.map(initialGroup => ({
@@ -384,12 +340,12 @@ export default {
 .el-collapse,
 .el-collapse /deep/ .el-collapse-item__header,
 .el-collapse /deep/ .el-collapse-item__content {
-  background-color: #0b333f;
+  background-color: #0a0e27;
   color: white;
 }
 .parameter-form {
   padding: 20px;
-  background-color: #0b333f;
+  background-color: #0a0e27;
   color: white;
 }
 
@@ -400,7 +356,7 @@ export default {
 }
 
 .add-btn {
-  background-color: #0b333f;
+  background-color: #0a0e27;
   color: white;
   width: 40px;
   height: 40px;
@@ -409,7 +365,7 @@ export default {
 
 .el-collapse-item {
   margin-bottom: 15px;
-  background-color: #0b333f;
+  background-color: #0a0e27;
   color: white;
   border-radius: 8px;
   box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);
@@ -431,7 +387,7 @@ export default {
   margin-top: 5px;
   padding: 4px 8px;
   border-radius: 4px;
-  background-color: #0b333f;
+  background-color: #0a0e27;
   color: white;
 }
 

+ 1 - 1
fdapfe-ui/src/views/dataGen/index.vue

@@ -106,7 +106,7 @@
     >
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="数据生成名称" align="center" prop="dataGenName" />
-      <el-table-column label="数据生成模型" align="center" prop="modelId" />
+      <el-table-column label="数据生成模型" align="center" prop="modelName" />
       <el-table-column label="参数" align="center" prop="bizParams" >
         <template slot-scope="scope">
           <el-input type="textarea" disabled v-model="scope.row.bizParams"/>

+ 2070 - 517
fdapfe-ui/src/views/form.vue

@@ -1,579 +1,2132 @@
 <template>
-  <el-dialog
-    :title="title"
-    :visible.sync="dialogOpen"
-    width="900px"
-    :close-on-click-modal="false"
-    append-to-body
-    @opened="initData"
-    @close="handleCancel"
-  >
-    <div>
-      <!-- 步骤导航 -->
-      <el-steps align-center :active="activeStep">
-        <el-step title="步骤 1"></el-step>
-        <el-step title="步骤 2"></el-step>
-        <el-step title="步骤 3" description="这是一段很长很长很长的描述性文字" class="step-description"></el-step>
-      </el-steps>
-
-      <!-- 表单区域 -->
-      <el-form ref="form" :model="formData" :rules="rules" label-width="100px" >
-        <!-- 步骤1内容 -->
-        <div v-if="activeStep === 1">
-          <el-form-item label="任务名称">
-            <el-input
-              type="text"
-              v-model="formData.name"
-              placeholder="请输入任务名称"
-            ></el-input>
-          </el-form-item>
-
-          <el-form-item label="物理模型">
-            <el-select
-              v-model="formData.modelId"
-              placeholder="请选择数据生成模型"
-              @change="onModelChange"
-            >
-              <el-option
-                v-for="item in faultPhysicalOptions"
-                :key="item.modelId"
-                :label="item.modelName"
-                :value="item.modelId"
-              />
-            </el-select>
-          </el-form-item>
-
-          <!-- 模型参数区域(类型1) -->
-          <el-form-item
-            v-if="formData.modelType === '3'"
-            label="模型参数"
-          >
-            <el-input
-              v-model="formData.modelDataParams"
-              type="textarea"
-              placeholder="请输入模型参数(JSON格式)"
-            />
-          </el-form-item>
-
-          <!-- 参数组管理(类型1) -->
-          <el-form-item
-            v-if="formData.modelType === '1'"
-            label="模型参数"
-          >
-            <el-row :gutter="10">
-              <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="1" :offset="22">
-                <el-button
-                  icon="el-icon-plus"
-                  @click="addModelDataParams"
-                  size="mini"
-                  circle
-                  title="添加参数组"
-                />
-              </el-col>
-            </el-row>
-
-            <el-collapse
-              class="collapse"
-              :gutter="20"
-              v-for="(paramGroup, groupIndex) in modelDataParams"
-              :key="groupIndex"
-            >
-              <el-collapse-item
-                :title="'参数组' + (groupIndex + 1)"
-                :name="groupIndex"
-              >
-                <el-row
-                  :xl="4"
-                  v-for="(value, key) in paramGroup"
-                  :key="key"
-                  :gutter="20"
-                >
-                  <el-col>
-                    <el-form-item
-                      :label="key"
-                      :prop="`modelDataParams.${groupIndex}.${key}`"
-                    >
-                      <el-input
-                        v-model="paramGroup[key]"
-                        :placeholder="'请输入' + key + '的值'"
-                        style="width: 200px;"
-                      />
-                    </el-form-item>
-                  </el-col>
-                </el-row>
-              </el-collapse-item>
-            </el-collapse>
-          </el-form-item>
-
-          <!-- 文件来源选择(类型2) -->
-          <el-form-item
-            v-if="formData.modelType === '2'"
-            label="文件来源"
-            prop="dataGenName"
-          >
-            <el-select
-              v-model="formData.dataSource"
-              placeholder="请选择文件来源"
-              @change="onDataSourceChange"
-            >
-              <el-option key="1" label="文件上传" value="1"></el-option>
-              <el-option key="2" label="文件管理" value="2"></el-option>
-            </el-select>
-          </el-form-item>
-
-          <!-- 文件显示(类型2) -->
-          <el-form-item
-            v-if="formData.modelType === '2'"
-            label="选择文件"
-            prop="dataGenName"
-          >
-            <span>{{ rowData.fileName }}</span>
-          </el-form-item>
-
-          <!-- 文件上传组件(数据源1) -->
-          <el-form-item
-            v-if="formData.dataSource === '1'"
-            label="文件上传"
-            prop="filePath"
-          >
-            <file-upload
-              :fileType="uploadFileType"
-              @child-event="handleChildData"
-            />
-          </el-form-item>
-
-          <div class="text-right">
-            <el-button type="primary" @click="nextStep">下一步</el-button>
+  <div class="dashboard-container">
+    <!-- 标题栏 -->
+
+    <div class="header">
+      <dv-border-box-11 title="机器学习模型评估综合看板">
+        <!--      <div class="time-display">-->
+        <!--        <span>当前时间:</span>-->
+        <!--        <span>{{ currentTime }}</span>-->
+        <!--      </div>-->
+        <!-- 筛选控制区 -->
+        <div class="control-panel">
+          <div class="filter-group">
+            <label>选择文件:</label>
+            <select v-model="selectedFilename" @change="filterData">
+              <option v-for="item in uniqueFilenames" :key="item" :value="item">{{ item }}</option>
+            </select>
+          </div>
+          <div class="filter-group">
+            <label>选择模型:</label>
+            <select v-model="selectedModel" @change="filterData">
+              <option value="">全部模型</option>
+              <option v-for="item in uniqueModels" :key="item" :value="item">{{ item }}</option>
+            </select>
           </div>
         </div>
+      </dv-border-box-11>
+    </div>
+
+
 
-        <!-- 步骤2内容 -->
-        <div v-if="activeStep === 2">
-          <el-switch
-            style="display: block"
-            v-model="formData.ifs"
-            active-color="#13ce66"
-            inactive-color="#ff4949"
-            active-text="加噪"
-            inactive-text="不加加噪"
-          >
-          </el-switch>
-          <el-form-item v-if="formData.ifs" label="物理模型">
-
-            <el-select
-              v-model="formData.modelId"
-              placeholder="请选择数据生成模型"
-              @change="onModelChange"
-            >
-              <el-option
-                v-for="item in faultPhysicalOptions"
-                :key="item.modelId"
-                :label="item.modelName"
-                :value="item.modelId"
-              />
-            </el-select>
-          </el-form-item>
-
-          <!-- 模型参数区域(类型1) -->
-          <el-form-item
-            v-if="formData.modelType === '3'"
-            label="模型参数"
-          >
-            <el-input
-              v-model="formData.modelDataParams"
-              type="textarea"
-              placeholder="请输入模型参数(JSON格式)"
-            />
-          </el-form-item>
-          <!-- 参数组管理(类型1) -->
-          <el-form-item
-            v-if="formData.ifs"
-            label="模型参数"
-          >
-            <el-row :gutter="10">
-              <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="1" :offset="22">
-                <el-button
-                  icon="el-icon-plus"
-                  @click="addModelDataParams"
-                  size="mini"
-                  circle
-                  title="添加参数组"
-                />
-              </el-col>
-            </el-row>
-
-            <el-collapse class="collapse"
-              :gutter="20"
-              v-for="(paramGroup, groupIndex) in modelDataParams"
-              :key="groupIndex"
-            >
-              <el-collapse-item
-                :title="'参数组' + (groupIndex + 1)"
-                :name="groupIndex"
-              >
-                <el-row
-                  :xl="4"
-                  v-for="(value, key) in paramGroup"
-                  :key="key"
-                  :gutter="20"
-                >
-                  <el-col>
-                    <el-form-item
-                      :label="key"
-                      :prop="`modelDataParams.${groupIndex}.${key}`"
-                    >
-                      <el-input
-                        v-model="paramGroup[key]"
-                        :placeholder="'请输入' + key + '的值'"
-                        style="width: 200px;"
-                      />
-                    </el-form-item>
-                  </el-col>
-                </el-row>
-              </el-collapse-item>
-            </el-collapse>
-          </el-form-item>
-          <div class="text-right">
-            <el-button @click="prevStep">上一步</el-button>
-            <el-button type="primary" @click="nextStep">下一步</el-button>
+    <!-- 关键指标卡片 -->
+    <div class="metric-cards">
+      <dv-border-box-8 class="card" v-for="(metric, index) in keyMetrics" :key="index">
+        <div class="card-header">
+          <h3 style="color: #3375F6">{{ metric.name }}</h3>
+          <div class="metric-icon">{{ metric.icon }}</div>
+        </div>
+        <div class="card-body">
+          <div class="metric-value" :class="metric.class">{{ metric.value }}</div>
+          <div class="metric-trend" :class="metric.trendClass">
+            <span>{{ metric.trendText }}</span>
+            <i :class="'trend-icon ' + metric.trendIcon"></i>
           </div>
         </div>
+      </dv-border-box-8>
+    </div>
 
-        <!-- 步骤3内容 -->
-        <div v-if="activeStep === 3">
-          <el-form-item label="诊断模型">
-            <el-select
-              v-model="formData.diagModelId"
-              placeholder="请选择诊断模型"
-              @change="onModeldiagChange"
-            >
-              <el-option
-                v-for="item in faultOptions"
-                :key="item.modelId"
-                :label="item.modelName"
-                :value="item.modelId"
-              />
-            </el-select>
-          </el-form-item>
-
-          <div class="text-right">
-            <el-button @click="prevStep">上一步</el-button>
+    <!-- 图表展示区 -->
+    <div class="chart-container">
+      <div class="chart-row">
+        <dv-border-box-13 class="chart-col">
+          <div class="chart-card">
+            <h3 class="chart-title" style="color: #3375F6">模型准确率对比(排序折线图)</h3>
+            <div class="chart-wrapper" ref="accuracyChart"></div>
           </div>
-        </div>
-      </el-form>
+        </dv-border-box-13>
+        <dv-border-box-13 class="chart-col">
+          <div class="chart-card">
+            <h3 class="chart-title" style="color: #3375F6">精确率与召回率分析</h3>
+            <div class="chart-wrapper" ref="precisionRecallChart"></div>
+          </div>
+        </dv-border-box-13>
+      </div>
+      <div class="chart-row">
+        <dv-border-box-13 class="chart-col">
+          <div class="chart-card">
+            <h3 class="chart-title" style="color: #3375F6">模型性能雷达图</h3>
+            <div class="chart-wrapper" ref="radarChart"></div>
+          </div>
+        </dv-border-box-13>
+        <dv-border-box-13 class="chart-col">
+          <div class="chart-card">
+            <h3 class="chart-title" style="color: #3375F6">测试时间对比</h3>
+            <div class="chart-wrapper" ref="timeChart"></div>
+          </div>
+        </dv-border-box-13>
+      </div>
     </div>
 
-    <!-- 对话框底部操作 -->
-    <div slot="footer" class="dialog-footer">
-      <el-button
-        type="primary"
-        @click="handleSubmit"
-        :disabled="activeStep!== 3"
-      >确 定
-      </el-button>
-      <el-button @click="handleCancel">取 消</el-button>
+    <!-- 数据表格 -->
+    <div class="data-table-container">
+      <h3 class="table-title" style="color: #3375F6">模型评估详细数据</h3>
+      <div class="table-wrapper">
+        <dv-scroll-board class="data-table" :config="config" style="width:100%;height:100%" />
+      </div>
     </div>
 
-    <!-- 文件管理子组件 -->
-    <file-table
-      v-model="fileManagementDialogVisible"
-      @callback="handleRowData"
-    />
-  </el-dialog>
+    <!-- 指标说明区 -->
+    <div class="metric-explanation">
+      <h3>精度评估指标说明</h3>
+      <div class="explanation-table">
+        <table>
+          <thead>
+          <tr>
+            <th>指标名称</th>
+            <th>公式</th>
+            <th>说明</th>
+          </tr>
+          </thead>
+          <tbody>
+          <tr>
+            <td>准确率 (Accuracy)</td>
+            <td>(TP+TN)/(TP+TN+FP+FN)</td>
+            <td>正确预测的样本占总样本的比例</td>
+          </tr>
+          <tr>
+            <td>精确率 (Precision)</td>
+            <td>TP/(TP+FP)</td>
+            <td>正类预测中实际为正类的比例</td>
+          </tr>
+          <tr>
+            <td>召回率 (Recall)</td>
+            <td>TP/(TP+FN)</td>
+            <td>实际正类中被正确预测的比例</td>
+          </tr>
+          <tr>
+            <td>特异度 (Specificity)</td>
+            <td>TN/(TN+FP)</td>
+            <td>实际负类中被正确预测的比例</td>
+          </tr>
+          <tr>
+            <td>F1分数 (F-measure)</td>
+            <td>2*(Precision*Recall)/(Precision+Recall)</td>
+            <td>精确率和召回率的加权平均</td>
+          </tr>
+          <tr>
+            <td>ROC曲线</td>
+            <td>横坐标: FPR, 纵坐标: TPR</td>
+            <td>45度线为参照线,曲线偏离越远结果越准确</td>
+          </tr>
+          <tr>
+            <td>AUC</td>
+            <td>ROC曲线下面积</td>
+            <td>参考线面积为0.5,AUC越大分类效果越好</td>
+          </tr>
+          <tr>
+            <td>基尼系数</td>
+            <td>2*AUC-1</td>
+            <td>评估模型区分不同类别的能力</td>
+          </tr>
+          <tr>
+            <td>K-S值</td>
+            <td>max(TPR-FPR)</td>
+            <td>评判模型区分正负样本的能力,一般0.3以上效果较好</td>
+          </tr>
+          </tbody>
+        </table>
+      </div>
+    </div>
+  </div>
 </template>
 
 <script>
-import {
-  addWorkflow,
-  updateWorkflow
-} from '@/api/workflow/workflow'
-import FileTable from './fileTable.vue'
-import { getDataOptions } from '@/api/data/data'
-import { getFaultPhysicalOptions, listFaultPhysical } from '@/api/model/faultPhysical' // 修正组件命名
+import * as echarts from 'echarts'
+import 'echarts/lib/chart/bar'
+import 'echarts/lib/chart/line'
+import 'echarts/lib/chart/radar'
+import 'echarts/lib/component/tooltip'
+import 'echarts/lib/component/legend'
 
 export default {
-  components: { FileTable }, // 注册组件列表
-  props: {
-    value: {
-      type: Boolean,
-      default: false,
-      description: '控制对话框显示的双向绑定属性'
-    },
-    dataInfo: {
-      type: Object,
-      default: null,
-      description: '编辑时传入的原始数据信息'
-    },
-    options: {
-      type: String,
-      default: 'add',
-      description: '操作类型(add/edit)'
-    }
-  },
-
-  dicts: ['sys_job_status', 'data_type'], // 字典数据标识
+  name: 'ModelEvaluationDashboard',
   data() {
     return {
-
-      uploadFileType: ['csv', 'xls', 'xlsx'], // 允许的上传文件类型
-      modelDataParams: [], // 参数组数据(类型1)
-      dataOptions: [], // 数据选项(预留扩展)
-      faultPhysicalOptions: [], // 物理模型选项
-      faultOptions: [], // 诊断模型选项
-      topOneForm:{},
-      topTwoForm:{},
-      formData: {
-        ifs: Boolean,
-        // 基础信息
-        outputPath: null,
-        newFileName: null,
-        name: null,
-        modelId: null,
-        modelType: null,
-        dataId: null,
-        startTime: null,
-        endTime: null,
-        remark: null,
-        diagModelId: null,
-        // 扩展信息
-        modelDataParams: [],
-        modelPath: null,
-        modelName: null,
-        step2Field: null,
-        step3Field: null,
-        dataSource: null // 文件来源(类型2)
+      config: {
+        headerBGC:'#6275BF',
+        oddRowBGC:'#182D40',
+        header: ['模型', '准确率(%)', '精确率', '召回率', 'F1分数', '测试时间(ms)'],
+        data: [],
+        index: true,
+        columnWidth: [100, 100, 100, 100, 100, 120],
+        align: ['center', 'center', 'center', 'center', 'center', 'center']
       },
-      rules: {
-        name: [{ required: true, message: '请输入任务名称', trigger: 'blur' }],
-        modelId: [{ required: true, message: '请选择数据生成模型', trigger: 'blur' }]
-      },
-      dialogOpen: false, // 对话框显示状态
-      workflowNodeList: [], // 工作流节点列表
-      checkedWorkflowNode: [], // 选中的工作流节点
-      activeStep: 1, // 当前步骤
-      fileManagementDialogVisible: false, // 文件管理对话框状态
-      rowData: {} // 选中的文件行数据
-    }
-  },
-  model: {
-    prop: 'value', // 双向绑定属性名
-    event: 'callback' // 触发更新的事件名
-  },
-  watch: {
-    // 监听父组件值变化同步对话框状态
-    value(newVal) {
-      this.dialogOpen = newVal
+      dataSource: [
+        {
+          "filename":"fea_all_20250627141916A001_1.00.mat",
+          "model":"BP",
+          "snr":0.011016396401455804,
+          "accuracy":80,
+          "precision":0.8,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":2486.2886999999996,
+          "uncertainty":0.41201367035372666
+        },
+        {
+          "filename":"fea_all_20250627141916A001_1.00.mat",
+          "model":"SVM",
+          "snr":0.011016396401455804,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":1073.6752000000001,
+          "uncertainty":0.41201367035372666
+        },
+        {
+          "filename":"fea_all_20250627141916A001_1.00.mat",
+          "model":"KNN",
+          "snr":0.011016396401455804,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0.91619047619047622,
+          "f1_score":0.89074074074074072,
+          "test_time_ms":267.8794,
+          "uncertainty":0.41201367035372666
+        },
+        {
+          "filename":"fea_all_20250627141916A001_1.00.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396401455804,
+          "accuracy":63.333333333333329,
+          "precision":0.6333333333333333,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":142.8386,
+          "uncertainty":0.41201367035372666
+        },
+        {
+          "filename":"fea_all_20250627141916A001_1.00.mat",
+          "model":"RandomForest",
+          "snr":0.011016396401455804,
+          "accuracy":90,
+          "precision":0.9,
+          "recall":0.93587301587301586,
+          "f1_score":0.91758602801314193,
+          "test_time_ms":782.4678,
+          "uncertainty":0.41201367035372666
+        },
+        {
+          "filename":"fea_all_20250627141916A001_100.00.mat",
+          "model":"BP",
+          "snr":0.011016396406634592,
+          "accuracy":83.333333333333343,
+          "precision":0.83333333333333337,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":41.7871,
+          "uncertainty":0.42742873237078854
+        },
+        {
+          "filename":"fea_all_20250627141916A001_100.00.mat",
+          "model":"SVM",
+          "snr":0.011016396406634592,
+          "accuracy":73.333333333333329,
+          "precision":0.73333333333333328,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":75.6011,
+          "uncertainty":0.42742873237078854
+        },
+        {
+          "filename":"fea_all_20250627141916A001_100.00.mat",
+          "model":"KNN",
+          "snr":0.011016396406634592,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0.90333333333333321,
+          "f1_score":0.88462021343377273,
+          "test_time_ms":9.353,
+          "uncertainty":0.42742873237078854
+        },
+        {
+          "filename":"fea_all_20250627141916A001_100.00.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406634592,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":8.4045,
+          "uncertainty":0.42742873237078854
+        },
+        {
+          "filename":"fea_all_20250627141916A001_100.00.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406634592,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":399.35929999999996,
+          "uncertainty":0.42742873237078854
+        },
+        {
+          "filename":"fea_all_20250627141916A001_11.42.mat",
+          "model":"BP",
+          "snr":0.011016396407271358,
+          "accuracy":85,
+          "precision":0.85,
+          "recall":0.90476190476190466,
+          "f1_score":0.87652645861601075,
+          "test_time_ms":36.99,
+          "uncertainty":0.41202020276730172
+        },
+        {
+          "filename":"fea_all_20250627141916A001_11.42.mat",
+          "model":"SVM",
+          "snr":0.011016396407271358,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":68.9644,
+          "uncertainty":0.41202020276730172
+        },
+        {
+          "filename":"fea_all_20250627141916A001_11.42.mat",
+          "model":"KNN",
+          "snr":0.011016396407271358,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0.9136507936507936,
+          "f1_score":0.8895387541607227,
+          "test_time_ms":5.7428,
+          "uncertainty":0.41202020276730172
+        },
+        {
+          "filename":"fea_all_20250627141916A001_11.42.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396407271358,
+          "accuracy":66.666666666666657,
+          "precision":0.66666666666666663,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":6.0893,
+          "uncertainty":0.41202020276730172
+        },
+        {
+          "filename":"fea_all_20250627141916A001_11.42.mat",
+          "model":"RandomForest",
+          "snr":0.011016396407271358,
+          "accuracy":88.333333333333329,
+          "precision":0.8833333333333333,
+          "recall":0.92952380952380953,
+          "f1_score":0.90584011907888984,
+          "test_time_ms":419.28159999999997,
+          "uncertainty":0.41202020276730172
+        },
+        {
+          "filename":"fea_all_20250627141916A001_16.63.mat",
+          "model":"BP",
+          "snr":0.011016396406077661,
+          "accuracy":83.333333333333343,
+          "precision":0.83333333333333337,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":19.777099999999997,
+          "uncertainty":0.42144761969693911
+        },
+        {
+          "filename":"fea_all_20250627141916A001_16.63.mat",
+          "model":"SVM",
+          "snr":0.011016396406077661,
+          "accuracy":71.666666666666671,
+          "precision":0.71666666666666667,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":63.4744,
+          "uncertainty":0.42144761969693911
+        },
+        {
+          "filename":"fea_all_20250627141916A001_16.63.mat",
+          "model":"KNN",
+          "snr":0.011016396406077661,
+          "accuracy":90,
+          "precision":0.9,
+          "recall":0.9280952380952382,
+          "f1_score":0.9138317270122428,
+          "test_time_ms":5.1798,
+          "uncertainty":0.42144761969693911
+        },
+        {
+          "filename":"fea_all_20250627141916A001_16.63.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406077661,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":5.0863000000000005,
+          "uncertainty":0.42144761969693911
+        },
+        {
+          "filename":"fea_all_20250627141916A001_16.63.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406077661,
+          "accuracy":91.666666666666657,
+          "precision":0.91666666666666663,
+          "recall":0.94476190476190469,
+          "f1_score":0.93050225974247458,
+          "test_time_ms":462.91929999999996,
+          "uncertainty":0.42144761969693911
+        },
+        {
+          "filename":"fea_all_20250627141916A001_21.84.mat",
+          "model":"BP",
+          "snr":0.011016396406624971,
+          "accuracy":81.666666666666671,
+          "precision":0.81666666666666665,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":88.6958,
+          "uncertainty":0.42350796072708741
+        },
+        {
+          "filename":"fea_all_20250627141916A001_21.84.mat",
+          "model":"SVM",
+          "snr":0.011016396406624971,
+          "accuracy":73.333333333333329,
+          "precision":0.73333333333333328,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":72.697,
+          "uncertainty":0.42350796072708741
+        },
+        {
+          "filename":"fea_all_20250627141916A001_21.84.mat",
+          "model":"KNN",
+          "snr":0.011016396406624971,
+          "accuracy":90,
+          "precision":0.9,
+          "recall":0.92888888888888876,
+          "f1_score":0.91421628189550419,
+          "test_time_ms":18.23,
+          "uncertainty":0.42350796072708741
+        },
+        {
+          "filename":"fea_all_20250627141916A001_21.84.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406624971,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":3.4444,
+          "uncertainty":0.42350796072708741
+        },
+        {
+          "filename":"fea_all_20250627141916A001_21.84.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406624971,
+          "accuracy":90,
+          "precision":0.9,
+          "recall":0.93587301587301586,
+          "f1_score":0.91758602801314193,
+          "test_time_ms":377.88460000000003,
+          "uncertainty":0.42350796072708741
+        },
+        {
+          "filename":"fea_all_20250627141916A001_27.05.mat",
+          "model":"BP",
+          "snr":0.011016396406088237,
+          "accuracy":83.333333333333343,
+          "precision":0.83333333333333337,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":10.032499999999999,
+          "uncertainty":0.42876071639002106
+        },
+        {
+          "filename":"fea_all_20250627141916A001_27.05.mat",
+          "model":"SVM",
+          "snr":0.011016396406088237,
+          "accuracy":73.333333333333329,
+          "precision":0.73333333333333328,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":62.590499999999992,
+          "uncertainty":0.42876071639002106
+        },
+        {
+          "filename":"fea_all_20250627141916A001_27.05.mat",
+          "model":"KNN",
+          "snr":0.011016396406088237,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0.90333333333333321,
+          "f1_score":0.88462021343377273,
+          "test_time_ms":3.7783,
+          "uncertainty":0.42876071639002106
+        },
+        {
+          "filename":"fea_all_20250627141916A001_27.05.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406088237,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":2.5383,
+          "uncertainty":0.42876071639002106
+        },
+        {
+          "filename":"fea_all_20250627141916A001_27.05.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406088237,
+          "accuracy":88.333333333333329,
+          "precision":0.8833333333333333,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":368.7852,
+          "uncertainty":0.42876071639002106
+        },
+        {
+          "filename":"fea_all_20250627141916A001_32.26.mat",
+          "model":"BP",
+          "snr":0.011016396406740396,
+          "accuracy":83.333333333333343,
+          "precision":0.83333333333333337,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":7.241,
+          "uncertainty":0.42813351916682568
+        },
+        {
+          "filename":"fea_all_20250627141916A001_32.26.mat",
+          "model":"SVM",
+          "snr":0.011016396406740396,
+          "accuracy":73.333333333333329,
+          "precision":0.73333333333333328,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":60.1406,
+          "uncertainty":0.42813351916682568
+        },
+        {
+          "filename":"fea_all_20250627141916A001_32.26.mat",
+          "model":"KNN",
+          "snr":0.011016396406740396,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0.90587301587301583,
+          "f1_score":0.885836243694218,
+          "test_time_ms":2.8131,
+          "uncertainty":0.42813351916682568
+        },
+        {
+          "filename":"fea_all_20250627141916A001_32.26.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406740396,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":2.4332999999999996,
+          "uncertainty":0.42813351916682568
+        },
+        {
+          "filename":"fea_all_20250627141916A001_32.26.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406740396,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":377.7456,
+          "uncertainty":0.42813351916682568
+        },
+        {
+          "filename":"fea_all_20250627141916A001_37.47.mat",
+          "model":"BP",
+          "snr":0.011016396406676914,
+          "accuracy":83.333333333333343,
+          "precision":0.83333333333333337,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":7.0408,
+          "uncertainty":0.42753124160742728
+        },
+        {
+          "filename":"fea_all_20250627141916A001_37.47.mat",
+          "model":"SVM",
+          "snr":0.011016396406676914,
+          "accuracy":73.333333333333329,
+          "precision":0.73333333333333328,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":58.839099999999995,
+          "uncertainty":0.42753124160742728
+        },
+        {
+          "filename":"fea_all_20250627141916A001_37.47.mat",
+          "model":"KNN",
+          "snr":0.011016396406676914,
+          "accuracy":88.333333333333329,
+          "precision":0.8833333333333333,
+          "recall":0.91222222222222216,
+          "f1_score":0.89754537953795377,
+          "test_time_ms":2.7571000000000003,
+          "uncertainty":0.42753124160742728
+        },
+        {
+          "filename":"fea_all_20250627141916A001_37.47.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406676914,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":2.4524999999999997,
+          "uncertainty":0.42753124160742728
+        },
+        {
+          "filename":"fea_all_20250627141916A001_37.47.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406676914,
+          "accuracy":88.333333333333329,
+          "precision":0.8833333333333333,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":399.38259999999997,
+          "uncertainty":0.42753124160742728
+        },
+        {
+          "filename":"fea_all_20250627141916A001_42.68.mat",
+          "model":"BP",
+          "snr":0.011016396406726931,
+          "accuracy":83.333333333333343,
+          "precision":0.83333333333333337,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":7.1888999999999994,
+          "uncertainty":0.42773693617842218
+        },
+        {
+          "filename":"fea_all_20250627141916A001_42.68.mat",
+          "model":"SVM",
+          "snr":0.011016396406726931,
+          "accuracy":73.333333333333329,
+          "precision":0.73333333333333328,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":56.644600000000004,
+          "uncertainty":0.42773693617842218
+        },
+        {
+          "filename":"fea_all_20250627141916A001_42.68.mat",
+          "model":"KNN",
+          "snr":0.011016396406726931,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0.90587301587301583,
+          "f1_score":0.885836243694218,
+          "test_time_ms":2.9903,
+          "uncertainty":0.42773693617842218
+        },
+        {
+          "filename":"fea_all_20250627141916A001_42.68.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406726931,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":2.4774,
+          "uncertainty":0.42773693617842218
+        },
+        {
+          "filename":"fea_all_20250627141916A001_42.68.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406726931,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":356.4385,
+          "uncertainty":0.42773693617842218
+        },
+        {
+          "filename":"fea_all_20250627141916A001_47.89.mat",
+          "model":"BP",
+          "snr":0.011016396406652865,
+          "accuracy":83.333333333333343,
+          "precision":0.83333333333333337,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":6.4369,
+          "uncertainty":0.42731479939032957
+        },
+        {
+          "filename":"fea_all_20250627141916A001_47.89.mat",
+          "model":"SVM",
+          "snr":0.011016396406652865,
+          "accuracy":73.333333333333329,
+          "precision":0.73333333333333328,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":61.4023,
+          "uncertainty":0.42731479939032957
+        },
+        {
+          "filename":"fea_all_20250627141916A001_47.89.mat",
+          "model":"KNN",
+          "snr":0.011016396406652865,
+          "accuracy":85,
+          "precision":0.85,
+          "recall":0.89698412698412688,
+          "f1_score":0.87286025804106848,
+          "test_time_ms":2.8238,
+          "uncertainty":0.42731479939032957
+        },
+        {
+          "filename":"fea_all_20250627141916A001_47.89.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406652865,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":2.5237,
+          "uncertainty":0.42731479939032957
+        },
+        {
+          "filename":"fea_all_20250627141916A001_47.89.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406652865,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":351.17150000000004,
+          "uncertainty":0.42731479939032957
+        },
+        {
+          "filename":"fea_all_20250627141916A001_53.11.mat",
+          "model":"BP",
+          "snr":0.011016396406666332,
+          "accuracy":83.333333333333343,
+          "precision":0.83333333333333337,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":6.4612,
+          "uncertainty":0.42744314963619751
+        },
+        {
+          "filename":"fea_all_20250627141916A001_53.11.mat",
+          "model":"SVM",
+          "snr":0.011016396406666332,
+          "accuracy":73.333333333333329,
+          "precision":0.73333333333333328,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":54.4327,
+          "uncertainty":0.42744314963619751
+        },
+        {
+          "filename":"fea_all_20250627141916A001_53.11.mat",
+          "model":"KNN",
+          "snr":0.011016396406666332,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0.90333333333333321,
+          "f1_score":0.88462021343377273,
+          "test_time_ms":4.7555999999999994,
+          "uncertainty":0.42744314963619751
+        },
+        {
+          "filename":"fea_all_20250627141916A001_53.11.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406666332,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":2.4724,
+          "uncertainty":0.42744314963619751
+        },
+        {
+          "filename":"fea_all_20250627141916A001_53.11.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406666332,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":356.8287,
+          "uncertainty":0.42744314963619751
+        },
+        {
+          "filename":"fea_all_20250627141916A001_58.32.mat",
+          "model":"BP",
+          "snr":0.011016396406635551,
+          "accuracy":83.333333333333343,
+          "precision":0.83333333333333337,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":7.2105,
+          "uncertainty":0.42743673471779642
+        },
+        {
+          "filename":"fea_all_20250627141916A001_58.32.mat",
+          "model":"SVM",
+          "snr":0.011016396406635551,
+          "accuracy":73.333333333333329,
+          "precision":0.73333333333333328,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":55.406499999999994,
+          "uncertainty":0.42743673471779642
+        },
+        {
+          "filename":"fea_all_20250627141916A001_58.32.mat",
+          "model":"KNN",
+          "snr":0.011016396406635551,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0.90333333333333321,
+          "f1_score":0.88462021343377273,
+          "test_time_ms":2.8093,
+          "uncertainty":0.42743673471779642
+        },
+        {
+          "filename":"fea_all_20250627141916A001_58.32.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406635551,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":2.8398,
+          "uncertainty":0.42743673471779642
+        },
+        {
+          "filename":"fea_all_20250627141916A001_58.32.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406635551,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":379.2527,
+          "uncertainty":0.42743673471779642
+        },
+        {
+          "filename":"fea_all_20250627141916A001_6.21.mat",
+          "model":"BP",
+          "snr":0.011016396406706729,
+          "accuracy":81.666666666666671,
+          "precision":0.81666666666666665,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":7.1225999999999994,
+          "uncertainty":0.42213351544796035
+        },
+        {
+          "filename":"fea_all_20250627141916A001_6.21.mat",
+          "model":"SVM",
+          "snr":0.011016396406706729,
+          "accuracy":73.333333333333329,
+          "precision":0.73333333333333328,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":51.9919,
+          "uncertainty":0.42213351544796035
+        },
+        {
+          "filename":"fea_all_20250627141916A001_6.21.mat",
+          "model":"KNN",
+          "snr":0.011016396406706729,
+          "accuracy":93.333333333333329,
+          "precision":0.93333333333333335,
+          "recall":0.951111111111111,
+          "f1_score":0.94213836477987423,
+          "test_time_ms":2.9112,
+          "uncertainty":0.42213351544796035
+        },
+        {
+          "filename":"fea_all_20250627141916A001_6.21.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406706729,
+          "accuracy":70,
+          "precision":0.7,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":2.4137999999999997,
+          "uncertainty":0.42213351544796035
+        },
+        {
+          "filename":"fea_all_20250627141916A001_6.21.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406706729,
+          "accuracy":90,
+          "precision":0.9,
+          "recall":0.93587301587301586,
+          "f1_score":0.91758602801314193,
+          "test_time_ms":394.5106,
+          "uncertainty":0.42213351544796035
+        },
+        {
+          "filename":"fea_all_20250627141916A001_63.53.mat",
+          "model":"BP",
+          "snr":0.011016396406647094,
+          "accuracy":83.333333333333343,
+          "precision":0.83333333333333337,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":6.5912999999999995,
+          "uncertainty":0.42741867307330794
+        },
+        {
+          "filename":"fea_all_20250627141916A001_63.53.mat",
+          "model":"SVM",
+          "snr":0.011016396406647094,
+          "accuracy":73.333333333333329,
+          "precision":0.73333333333333328,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":57.782199999999996,
+          "uncertainty":0.42741867307330794
+        },
+        {
+          "filename":"fea_all_20250627141916A001_63.53.mat",
+          "model":"KNN",
+          "snr":0.011016396406647094,
+          "accuracy":85,
+          "precision":0.85,
+          "recall":0.89698412698412688,
+          "f1_score":0.87286025804106848,
+          "test_time_ms":3.077,
+          "uncertainty":0.42741867307330794
+        },
+        {
+          "filename":"fea_all_20250627141916A001_63.53.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406647094,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":2.411,
+          "uncertainty":0.42741867307330794
+        },
+        {
+          "filename":"fea_all_20250627141916A001_63.53.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406647094,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":373.80150000000003,
+          "uncertainty":0.42741867307330794
+        },
+        {
+          "filename":"fea_all_20250627141916A001_68.74.mat",
+          "model":"BP",
+          "snr":0.011016396406637475,
+          "accuracy":83.333333333333343,
+          "precision":0.83333333333333337,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":7.2715000000000005,
+          "uncertainty":0.42743457320823247
+        },
+        {
+          "filename":"fea_all_20250627141916A001_68.74.mat",
+          "model":"SVM",
+          "snr":0.011016396406637475,
+          "accuracy":73.333333333333329,
+          "precision":0.73333333333333328,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":51.863800000000005,
+          "uncertainty":0.42743457320823247
+        },
+        {
+          "filename":"fea_all_20250627141916A001_68.74.mat",
+          "model":"KNN",
+          "snr":0.011016396406637475,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0.90333333333333321,
+          "f1_score":0.88462021343377273,
+          "test_time_ms":2.7483999999999997,
+          "uncertainty":0.42743457320823247
+        },
+        {
+          "filename":"fea_all_20250627141916A001_68.74.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406637475,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":2.4041,
+          "uncertainty":0.42743457320823247
+        },
+        {
+          "filename":"fea_all_20250627141916A001_68.74.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406637475,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":384.2894,
+          "uncertainty":0.42743457320823247
+        },
+        {
+          "filename":"fea_all_20250627141916A001_73.95.mat",
+          "model":"BP",
+          "snr":0.011016396406635551,
+          "accuracy":83.333333333333343,
+          "precision":0.83333333333333337,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":6.7259,
+          "uncertainty":0.42742806717607207
+        },
+        {
+          "filename":"fea_all_20250627141916A001_73.95.mat",
+          "model":"SVM",
+          "snr":0.011016396406635551,
+          "accuracy":73.333333333333329,
+          "precision":0.73333333333333328,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":61.925399999999996,
+          "uncertainty":0.42742806717607207
+        },
+        {
+          "filename":"fea_all_20250627141916A001_73.95.mat",
+          "model":"KNN",
+          "snr":0.011016396406635551,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0.90333333333333321,
+          "f1_score":0.88462021343377273,
+          "test_time_ms":3.0171,
+          "uncertainty":0.42742806717607207
+        },
+        {
+          "filename":"fea_all_20250627141916A001_73.95.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406635551,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":3.1433,
+          "uncertainty":0.42742806717607207
+        },
+        {
+          "filename":"fea_all_20250627141916A001_73.95.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406635551,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":376.5345,
+          "uncertainty":0.42742806717607207
+        },
+        {
+          "filename":"fea_all_20250627141916A001_79.16.mat",
+          "model":"BP",
+          "snr":0.011016396406635551,
+          "accuracy":83.333333333333343,
+          "precision":0.83333333333333337,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":6.4754000000000005,
+          "uncertainty":0.42743104271278681
+        },
+        {
+          "filename":"fea_all_20250627141916A001_79.16.mat",
+          "model":"SVM",
+          "snr":0.011016396406635551,
+          "accuracy":73.333333333333329,
+          "precision":0.73333333333333328,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":56.619299999999996,
+          "uncertainty":0.42743104271278681
+        },
+        {
+          "filename":"fea_all_20250627141916A001_79.16.mat",
+          "model":"KNN",
+          "snr":0.011016396406635551,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0.90333333333333321,
+          "f1_score":0.88462021343377273,
+          "test_time_ms":4.2401,
+          "uncertainty":0.42743104271278681
+        },
+        {
+          "filename":"fea_all_20250627141916A001_79.16.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406635551,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":2.4480999999999997,
+          "uncertainty":0.42743104271278681
+        },
+        {
+          "filename":"fea_all_20250627141916A001_79.16.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406635551,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":366.267,
+          "uncertainty":0.42743104271278681
+        },
+        {
+          "filename":"fea_all_20250627141916A001_84.37.mat",
+          "model":"BP",
+          "snr":0.011016396406637475,
+          "accuracy":83.333333333333343,
+          "precision":0.83333333333333337,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":6.4242,
+          "uncertainty":0.42743080780864723
+        },
+        {
+          "filename":"fea_all_20250627141916A001_84.37.mat",
+          "model":"SVM",
+          "snr":0.011016396406637475,
+          "accuracy":73.333333333333329,
+          "precision":0.73333333333333328,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":54.6466,
+          "uncertainty":0.42743080780864723
+        },
+        {
+          "filename":"fea_all_20250627141916A001_84.37.mat",
+          "model":"KNN",
+          "snr":0.011016396406637475,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0.90333333333333321,
+          "f1_score":0.88462021343377273,
+          "test_time_ms":3.1586000000000003,
+          "uncertainty":0.42743080780864723
+        },
+        {
+          "filename":"fea_all_20250627141916A001_84.37.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406637475,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":2.6017,
+          "uncertainty":0.42743080780864723
+        },
+        {
+          "filename":"fea_all_20250627141916A001_84.37.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406637475,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":355.7289,
+          "uncertainty":0.42743080780864723
+        },
+        {
+          "filename":"fea_all_20250627141916A001_89.58.mat",
+          "model":"BP",
+          "snr":0.011016396406635551,
+          "accuracy":83.333333333333343,
+          "precision":0.83333333333333337,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":6.9338999999999995,
+          "uncertainty":0.42742858038128234
+        },
+        {
+          "filename":"fea_all_20250627141916A001_89.58.mat",
+          "model":"SVM",
+          "snr":0.011016396406635551,
+          "accuracy":73.333333333333329,
+          "precision":0.73333333333333328,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":50.595,
+          "uncertainty":0.42742858038128234
+        },
+        {
+          "filename":"fea_all_20250627141916A001_89.58.mat",
+          "model":"KNN",
+          "snr":0.011016396406635551,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0.90333333333333321,
+          "f1_score":0.88462021343377273,
+          "test_time_ms":2.766,
+          "uncertainty":0.42742858038128234
+        },
+        {
+          "filename":"fea_all_20250627141916A001_89.58.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406635551,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":2.6202,
+          "uncertainty":0.42742858038128234
+        },
+        {
+          "filename":"fea_all_20250627141916A001_89.58.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406635551,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":432.9171,
+          "uncertainty":0.42742858038128234
+        },
+        {
+          "filename":"fea_all_20250627141916A001_94.79.mat",
+          "model":"BP",
+          "snr":0.011016396406637475,
+          "accuracy":83.333333333333343,
+          "precision":0.83333333333333337,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":7.4331,
+          "uncertainty":0.42742799889015454
+        },
+        {
+          "filename":"fea_all_20250627141916A001_94.79.mat",
+          "model":"SVM",
+          "snr":0.011016396406637475,
+          "accuracy":73.333333333333329,
+          "precision":0.73333333333333328,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":54.8536,
+          "uncertainty":0.42742799889015454
+        },
+        {
+          "filename":"fea_all_20250627141916A001_94.79.mat",
+          "model":"KNN",
+          "snr":0.011016396406637475,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0.90333333333333321,
+          "f1_score":0.88462021343377273,
+          "test_time_ms":2.7032,
+          "uncertainty":0.42742799889015454
+        },
+        {
+          "filename":"fea_all_20250627141916A001_94.79.mat",
+          "model":"DecisionTree",
+          "snr":0.011016396406637475,
+          "accuracy":68.333333333333329,
+          "precision":0.68333333333333335,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":2.6024,
+          "uncertainty":0.42742799889015454
+        },
+        {
+          "filename":"fea_all_20250627141916A001_94.79.mat",
+          "model":"RandomForest",
+          "snr":0.011016396406637475,
+          "accuracy":86.666666666666671,
+          "precision":0.8666666666666667,
+          "recall":0,
+          "f1_score":0,
+          "test_time_ms":398.2675,
+          "uncertainty":0.42742799889015454
+        }
+      ],
+      selectedFilename: '',
+      selectedModel: '',
+      currentTime: '',
+      keyMetrics: [
+        {
+          name: '平均准确率',
+          icon: '🔢',
+          value: '80.5%',
+          trendText: '较上周 +2.3%',
+          trendClass: 'trend-up',
+          trendIcon: 'fa-arrow-up'
+        },
+        {
+          name: '最高精确率',
+          icon: '🎯',
+          value: '0.88',
+          trendText: '较上周 +0.03',
+          trendClass: 'trend-up',
+          trendIcon: 'fa-arrow-up'
+        },
+        {
+          name: '平均召回率',
+          icon: '🔄',
+          value: '0.65',
+          trendText: '较上周 -0.01',
+          trendClass: 'trend-down',
+          trendIcon: 'fa-arrow-down'
+        },
+        {
+          name: '平均F1分数',
+          icon: '📊',
+          value: '0.62',
+          trendText: '较上周 +0.04',
+          trendClass: 'trend-up',
+          trendIcon: 'fa-arrow-up'
+        }
+      ]
     }
   },
   computed: {
-    // 根据操作类型生成标题
-    title() {
-      return this.options === 'add' ? '添加流程任务' : '修改流程任务'
+    uniqueFilenames() {
+      return [...new Set(this.dataSource.map(item => item.filename))]
+    },
+    uniqueModels() {
+      return [...new Set(this.dataSource.map(item => item.model))]
+    },
+    filteredData() {
+      let filtered = this.dataSource
+      if (this.selectedFilename) {
+        filtered = filtered.filter(item => item.filename === this.selectedFilename)
+      }
+      if (this.selectedModel && this.selectedModel !== '') {
+        filtered = filtered.filter(item => item.model === this.selectedModel)
+      }
+      return filtered
     }
   },
-  methods: {
-    // 文件管理组件回调 - 接收选中的文件数据
-    handleRowData(row) {
-
-      this.$emit('callback', row)
-      this.rowData = row
-      this.fileManagementDialogVisible = false
-    },
+  mounted() {
+    this.updateTime()
+    setInterval(() => {
+      this.updateTime()
+    }, 1000)
 
-    // 文件上传组件回调 - 接收上传文件信息
-    handleChildData(datas) {
-      console.log('文件上传的内容', datas)
-      this.formData.filePath = datas.filelocalPath
-      this.formData.fileName = datas.fileName
-      this.formData.fileSize = datas.fileSize
-      this.formData.fileSizeBytes = datas.fileSizeBytes
-      this.formData.fileSuffix = datas.fileSuffix
-      this.formData.url = datas.url
+    this.initCharts()
+  },
+  methods: {
+    updateTime() {
+      const now = new Date()
+      this.currentTime = now.toLocaleString()
     },
-
-    // 诊断模型选择变化处理(预留扩展)
-    onModeldiagChange() {
-      const selectedModel = this.faultPhysicalOptions.find(
-        item => item.modelId === this.formData.diagModelId
-      )
-      console.log('诊断模型数据', selectedModel)
+    filterData() {
+      this.initCharts()
     },
+    initCharts() {
+      // 准确率与不确定性对比图表
+      const accuracyChart = echarts.init(this.$refs.accuracyChart)
+      const accuracyData = this.filteredData
 
-    // 物理模型选择变化处理
-    onModelChange() {
-      const selectedModel = this.faultPhysicalOptions.find(
-        item => item.modelId === this.formData.modelId
-      )
-      console.log('物理模型数据', selectedModel)
-      if (!selectedModel) return
-
-      // 同步模型基础信息
-      this.formData.modelType = selectedModel.modelType
-      this.formData.modelPath = selectedModel.modelPath
-
-      // 根据模型类型初始化参数数据
-      if (selectedModel.modelType === '2') {
-        this.formData.bizParams = selectedModel.modelDataParams || ''
-        this.modelDataParams = [] // 类型2不使用参数组
-      } else if (selectedModel.modelType === '1') {
-        // 解析并初始化参数组(类型1)
-        const exampleParams = this.parseParams(selectedModel.modelDataParams || '[]')
-        this.modelDataParams = exampleParams.length ? exampleParams : [{}]
-      } else {
-        this.formData.modelDataParams = selectedModel.modelDataParams
-      }
-    },
+      // 处理数据:按模型分组并计算每个文件下的准确率和不确定性
+      const modelDataMap = {}
+      const filenames = [...new Set(accuracyData.map(item => item.filename))]
 
-    // 加载基础数据选项
-    loadOptions() {
-      // 数据选项(示例)
-      getDataOptions().then(resp => {
-        this.dataOptions = resp.data || []
+      filenames.forEach(filename => {
+        const fileData = accuracyData.filter(item => item.filename === filename)
+        fileData.forEach(item => {
+          if (!modelDataMap[item.model]) {
+            modelDataMap[item.model] = {
+              accuracy: {},
+              uncertainty: {}
+            }
+          }
+          modelDataMap[item.model].accuracy[filename] = item.accuracy
+          modelDataMap[item.model].uncertainty[filename] = item.uncertainty
+        })
       })
-      // 物理模型选项(类型0)
-      listFaultPhysical().then(resp => {
-        const data = resp.rows || []
-        this.faultPhysicalOptions = data.filter(item => item.modelAttribution === '0')
-        this.faultOptions = data.filter(item => item.modelAttribution === '1')
+
+      // 提取模型并按平均准确率排序
+      const models = Object.keys(modelDataMap)
+      models.sort((a, b) => {
+        const avgAccuracyA = filenames.length > 0 ?
+          filenames.reduce((sum, filename) => sum + (modelDataMap[a].accuracy[filename] || 0), 0) / filenames.length : 0
+        const avgAccuracyB = filenames.length > 0 ?
+          filenames.reduce((sum, filename) => sum + (modelDataMap[b].accuracy[filename] || 0), 0) / filenames.length : 0
+        return avgAccuracyA - avgAccuracyB
       })
-    },
 
-    // 对话框打开时初始化数据
-    initData() {
-      this.loadOptions() // 加载基础数据
+      const accuracyOptions = {
+        backgroundColor: 'rgba(10, 20, 30, 0.7)',
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'shadow'
+          },
+          formatter: function(params) {
+            let result = `<div style="font-size:14px;font-weight:bold">${params[0].name}</div>`
+            params.forEach(param => {
+              result += `<div>${param.seriesName}: ${param.value}</div>`
+            })
+            return result
+          }
+        },
+        legend: {
+          data: [...filenames, '不确定性'],
+          textStyle: {
+            color: '#00f5ff'
+          }
+        },
+        grid: {
+          left: '3%',
+          right: '10%', // 为第二个y轴留出空间
+          bottom: '3%',
+          containLabel: true
+        },
+        xAxis: {
+          type: 'category',
+          data: models,
+          axisTick: {
+            alignWithLabel: true
+          },
+          axisLine: {
+            lineStyle: {
+              color: '#00f5ff'
+            }
+          },
+          axisLabel: {
+            textStyle: {
+              color: '#00f5ff',
+              rotate: 45 // 旋转标签避免重叠
+            }
+          }
+        },
+        yAxis: [
+          {
+            type: 'value',
+            name: '准确率(%)',
+            min: 0,
+            max: 100,
+            axisLine: {
+              lineStyle: {
+                color: '#00f5ff'
+              }
+            },
+            axisLabel: {
+              textStyle: {
+                color: '#00f5ff'
+              },
+              formatter: '{value}%'
+            },
+            splitLine: {
+              lineStyle: {
+                color: 'rgba(0, 245, 255, 0.2)'
+              }
+            }
+          },
+          {
+            type: 'value',
+            name: '不确定性',
+            min: 0,
+            max: 1,
+            axisLine: {
+              lineStyle: {
+                color: '#ff9800' // 橙色表示不确定性
+              }
+            },
+            axisLabel: {
+              textStyle: {
+                color: '#ff9800'
+              }
+            },
+            splitLine: {
+              show: false
+            },
+            position: 'right'
+          }
+        ],
+        series: [
+          // 各文件的准确率系列
+          ...filenames.map(filename => {
+            return {
+              name: filename,
+              type: 'line',
+              smooth: true,
+              symbolSize: 8,
+              data: models.map(model => {
+                return modelDataMap[model].accuracy[filename] || 0
+              }),
+              itemStyle: {
+                normal: {
+                  color: getLineColor(filename),
+                  borderWidth: 2,
+                  borderColor: '#0B0E25'
+                }
+              },
+              lineStyle: {
+                width: 3,
+                color: getLineColor(filename)
+              },
+              areaStyle: {
+                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                  { offset: 0, color: getLineColor(filename, 0.3) },
+                  { offset: 1, color: getLineColor(filename, 0.05) }
+                ])
+              },
+              yAxisIndex: 0
+            }
+          }),
+          // 不确定性系列
+          {
+            name: '不确定性',
+            type: 'line',
+            smooth: true,
+            symbol: 'diamond',
+            symbolSize: 8,
+            data: models.map(model => {
+              // 计算平均不确定性
+              const uncertainties = filenames.map(filename => modelDataMap[model].uncertainty[filename] || 0)
+              return uncertainties.length > 0 ? uncertainties.reduce((sum, val) => sum + val, 0) / uncertainties.length : 0
+            }),
+            itemStyle: {
+              normal: {
+                color: '#ff9800',
+                borderWidth: 2,
+                borderColor: '#0B0E25'
+              }
+            },
+            lineStyle: {
+              width: 3,
+              color: '#ff9800'
+            },
+            areaStyle: {
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                { offset: 0, color: 'rgba(255, 152, 0, 0.3)' },
+                { offset: 1, color: 'rgba(255, 152, 0, 0.05)' }
+              ])
+            },
+            yAxisIndex: 1
+          }
+        ]
+      }
 
-      // 编辑模式初始化
-      if (this.options !== 'add' && this.dataInfo) {
-        this.formData = { ...this.dataInfo } // 浅拷贝原始数据
-        this.workflowNodeList = this.dataInfo.workflowNodeList // 初始化节点列表
+      // 生成颜色的辅助函数
+      function getLineColor(filename, alpha = 1) {
+        const colors = ['#0074ff', '#00f5ff', '#3375F6', '#4CAF50', '#E91E63', '#673AB7']
+        const index = filenames.indexOf(filename) % colors.length
+        return `rgba(${colors[index].substring(1).split(',').join(',')}, ${alpha})`
       }
 
-      this.activeStep = 1 // 重置步骤
-    },
+      accuracyChart.setOption(accuracyOptions)
+      window.addEventListener('resize', () => {
+        accuracyChart.resize()
+      })
 
-    // 表单提交处理
-    handleSubmit() {
-      this.$refs['form'].validate(valid => {
-        if (valid) {
-          // 处理参数组数据(类型1)
-          if (this.formData.modelType !== '2') {
-            this.formData.modelDataParams = JSON.stringify(this.modelDataParams)
-            this.formData.bizParams = this.formData.modelDataParams // 同步参数
-          }
+      // 其他图表保持不变...
+      // 精确率与召回率图表
+      const precisionRecallChart = echarts.init(this.$refs.precisionRecallChart)
+      const prData = this.filteredData.filter(item => item.recall > 0)
 
-          this.formData.workflowNodeList = this.workflowNodeList // 绑定节点数据
+      const prOptions = {
+        backgroundColor: 'rgba(10, 20, 30, 0.7)',
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'cross'
+          }
+        },
+        legend: {
+          data: ['精确率', '召回率'],
+          textStyle: {
+            color: '#00f5ff'
+          }
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        xAxis: {
+          type: 'category',
+          data: prData.map(item => item.model),
+          axisLine: {
+            lineStyle: {
+              color: '#00f5ff'
+            }
+          },
+          axisLabel: {
+            textStyle: {
+              color: '#00f5ff'
+            }
+          }
+        },
+        yAxis: [
+          {
+            type: 'value',
+            name: '精确率',
+            min: 0,
+            max: 1,
+            axisLine: {
+              lineStyle: {
+                color: '#00f5ff'
+              }
+            },
+            axisLabel: {
+              textStyle: {
+                color: '#00f5ff'
+              }
+            },
+            splitLine: {
+              lineStyle: {
+                color: 'rgba(0, 245, 255, 0.2)'
+              }
+            }
+          },
+          {
+            type: 'value',
+            name: '召回率',
+            min: 0,
+            max: 1,
+            axisLine: {
+              lineStyle: {
+                color: '#00ff9d'
+              }
+            },
+            axisLabel: {
+              textStyle: {
+                color: '#00ff9d'
+              }
+            },
+            splitLine: {
+              show: false
+            }
+          }
+        ],
+        series: [
+          {
+            name: '精确率',
+            type: 'line',
+            data: prData.map(item => item.precision),
+            smooth: true,
+            itemStyle: {
+              color: '#00f5ff'
+            },
+            lineStyle: {
+              color: '#00f5ff',
+              width: 2
+            },
+            areaStyle: {
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                { offset: 0, color: 'rgba(0, 245, 255, 0.3)' },
+                { offset: 1, color: 'rgba(0, 245, 255, 0.05)' }
+              ])
+            },
+            yAxisIndex: 0
+          },
+          {
+            name: '召回率',
+            type: 'line',
+            data: prData.map(item => item.recall),
+            smooth: true,
+            itemStyle: {
+              color: '#00ff9d'
+            },
+            lineStyle: {
+              color: '#00ff9d',
+              width: 2
+            },
+            areaStyle: {
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                { offset: 0, color: 'rgba(0, 255, 157, 0.3)' },
+                { offset: 1, color: 'rgba(0, 255, 157, 0.05)' }
+              ])
+            },
+            yAxisIndex: 1
+          }
+        ]
+      }
 
-          // 调用接口
-          const api = this.options === 'add' ? addWorkflow : updateWorkflow
-          api(this.formData).then(response => {
-            this.$message.success(`${this.options === 'add' ? '新增' : '修改'}成功`)
-            this.dialogOpen = false
-            this.$emit('callback', false) // 通知父组件更新
-          })
-        }
+      precisionRecallChart.setOption(prOptions)
+      window.addEventListener('resize', () => {
+        precisionRecallChart.resize()
       })
-    },
 
-    // 取消操作处理
-    handleCancel() {
-      this.dialogOpen = false
-      this.$emit('callback', false) // 关闭对话框
-      this.reset() // 重置表单数据
-    },
+      // 雷达图 - 模型性能综合评估
+      const radarChart = echarts.init(this.$refs.radarChart)
+      const radarData = this.filteredData.filter(item => item.recall > 0)
 
-    // 表单数据重置
-    reset() {
-      this.formData = {
-        // 重置基础字段
-        outputPath: null,
-        newFileName: null,
-        name: null,
-        modelId: null,
-        modelType: null,
-        dataId: null,
-        startTime: null,
-        endTime: null,
-        remark: null,
-        // 重置扩展字段
-        modelDataParams: [],
-        modelPath: null,
-        modelName: null,
-        step2Field: null,
-        step3Field: null,
-        dataSource: null
+      const radarOptions = {
+        backgroundColor: 'rgba(10, 20, 30, 0.7)',
+        tooltip: {
+          trigger: 'item'
+        },
+        legend: {
+          data: radarData.map(item => item.model),
+          textStyle: {
+            color: '#00f5ff'
+          }
+        },
+        radar: {
+          center: ['50%', '50%'],
+          radius: '80%',
+          indicator: [
+            { name: '准确率(%)', max: 100 },
+            { name: '精确率', max: 1 },
+            { name: '召回率', max: 1 },
+            { name: 'F1分数', max: 1 },
+            { name: '测试时间(ms)', max: 1000, inverse: true }
+          ],
+          axisLine: {
+            lineStyle: {
+              color: '#00f5ff'
+            }
+          },
+          splitLine: {
+            lineStyle: {
+              color: 'rgba(0, 245, 255, 0.2)'
+            }
+          },
+          textStyle: {
+            color: '#00f5ff'
+          }
+        },
+        series: radarData.map(item => {
+          return {
+            name: item.model,
+            type: 'radar',
+            data: [
+              {
+                value: [
+                  item.accuracy,
+                  item.precision,
+                  item.recall,
+                  item.f1_score,
+                  item.test_time_ms
+                ],
+                name: item.model
+              }
+            ],
+            lineStyle: {
+              width: 2
+            }
+          }
+        })
       }
 
-      // 重置关联数据
-      this.modelDataParams = []
-      this.workflowNodeList = []
-      this.checkedWorkflowNode = []
-      this.resetForm('form') // 重置表单验证状态
-      this.activeStep = 1 // 回到第一步
-    },
+      radarChart.setOption(radarOptions)
+      window.addEventListener('resize', () => {
+        radarChart.resize()
+      })
 
-    // 步骤导航 - 下一步
-    nextStep() {
-      if (this.activeStep < 3) {
-        this.activeStep++
-      }
-    },
+      // 测试时间对比图表
+      const timeChart = echarts.init(this.$refs.timeChart)
+      const timeData = this.filteredData
 
-    // 步骤导航 - 上一步
-    prevStep() {
-      if (this.activeStep > 1) {
-        this.activeStep--
+      const timeOptions = {
+        backgroundColor: 'rgba(10, 20, 30, 0.7)',
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'shadow'
+          }
+        },
+        legend: {
+          data: ['测试时间(ms)'],
+          textStyle: {
+            color: '#00f5ff'
+          }
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        xAxis: {
+          type: 'category',
+          data: timeData.map(item => item.model),
+          axisTick: {
+            alignWithLabel: true
+          },
+          axisLine: {
+            lineStyle: {
+              color: '#00f5ff'
+            }
+          },
+          axisLabel: {
+            textStyle: {
+              color: '#00f5ff'
+            },
+            rotate: 45
+          }
+        },
+        yAxis: {
+          type: 'value',
+          name: '测试时间(ms)',
+          axisLine: {
+            lineStyle: {
+              color: '#00f5ff'
+            }
+          },
+          axisLabel: {
+            textStyle: {
+              color: '#00f5ff'
+            }
+          },
+          splitLine: {
+            lineStyle: {
+              color: 'rgba(0, 245, 255, 0.2)'
+            }
+          }
+        },
+        series: [
+          {
+            name: '测试时间(ms)',
+            type: 'bar',
+            data: timeData.map(item => item.test_time_ms),
+            itemStyle: {
+              normal: {
+                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                  { offset: 0, color: '#0074ff' },
+                  { offset: 1, color: '#00f5ff' }
+                ]),
+                barBorderRadius: 5
+              }
+            }
+          }
+        ]
       }
-    },
 
-    // 添加参数组(类型1)
-    addModelDataParams() {
-      // 基于最后一组参数创建新组(保留字段结构)
-      const lastGroup = this.modelDataParams[this.modelDataParams.length - 1] || {}
-      const newGroup = Object.fromEntries(
-        Object.keys(lastGroup).map(key => [key, ''])
-      )
-      this.modelDataParams.push(newGroup)
-    },
-
-    // 参数解析工具方法
-    parseParams(params) {
-      try {
-        const parsed = JSON.parse(params)
-        return Array.isArray(parsed) ? parsed : [parsed] // 确保返回数组
-      } catch (e) {
-        console.error('参数解析错误', e)
-        return [] // 解析失败返回空数组
-      }
+      timeChart.setOption(timeOptions)
+      window.addEventListener('resize', () => {
+        timeChart.resize()
+      })
+      this.generateTableData()
     },
-
-    // 文件来源变化处理
-    onDataSourceChange(value) {
-      if (value === '2') {
-        this.fileManagementDialogVisible = true // 打开文件管理对话框
-      }
+    generateTableData() {
+      const data = this.filteredData
+      this.config.data = data.map(item => [
+        item.model,
+        item.accuracy.toFixed(2) + '%',
+        item.precision.toFixed(2) + '%',
+        item.recall.toFixed(2) + '%',
+        item.f1_score.toFixed(2) + '%',
+        item.test_time_ms.toFixed(2) + 'ms'
+      ])
     }
-  }
+  },
+
 }
 </script>
 
 <style scoped>
-.el-step__title .is-process {
-  color: #FFFFFF;
+.dashboard-container {
+  width: 100%;
+  height: 100vh;
+  background-color: #0B0E25;
+  color: #0B0E25;
+  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+  padding: 20px;
+  box-sizing: border-box;
+  overflow-x: hidden;
 }
 
-.text-right {
-  text-align: right;
-  margin-top: 10px;
+.header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20px;
+  padding-bottom: 10px;
+  border-bottom: 2px solid #0B0E25;
 }
 
-/* 步骤描述文字样式优化 */
-.step-description {
-  white-space: pre-line; /* 保留换行符 */
+.title {
+  font-size: 28px;
+  font-weight: bold;
+  color: #0B0E25;
+  text-shadow: 0 0 10px #0B0E25, 0 0 20px #0B0E25;
+  letter-spacing: 2px;
+}
+
+.time-display {
+  font-size: 18px;
+  color: #00ff9d;
+}
+
+.control-panel {
+  margin-top: 20px;
+  margin-left: 30px;
+  display: flex;
+  gap: 20px;
+  margin-bottom: 20px;
+  padding: 15px;
+  border: 1px solid #0B0E25;
+  border-radius: 8px;
+}
+
+.filter-group {
+  display: flex;
+  flex-direction: column;
+  gap: 5px;
+}
+
+.filter-group label {
+  font-size: 16px;
+  color: #3375F6;
+}
+
+.filter-group select {
+  background-color: #0B0E25;
+  color: #3375F6;
+  border: 1px solid #0B0E25;
+  border-radius: 4px;
+  padding: 5px 10px;
+  font-size: 14px;
+  outline: none;
+}
+
+.metric-cards {
+  display: grid;
+  grid-template-columns: repeat(4, 1fr);
+  gap: 20px;
+  margin-bottom: 20px;
+}
+
+.dv-border-box-8 {
+  height: 110%;
+}
+
+.card {
+  //background-color: rgba(10, 30, 50, 0.5);
+  //border: 1px solid #0B0E25;
+  //border-radius: 8px;
+  padding: 15px;
+  //box-shadow: 0 0 10px rgb(58, 132, 247);
+  //transition: all 0.3s ease;
+  //position: relative;
+  overflow: hidden;
+}
+
+.card:hover {
+  transform: translateY(-5px);
+  box-shadow: 0 0 20px rgb(58, 132, 247);
+}
+
+.card::before {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 3px;
+  background: linear-gradient(90deg, #0074ff, #00f5ff);
+}
+
+.card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 10px;
+}
+
+.card-header h3 {
+  font-size: 16px;
+  margin: 0;
+  font-weight: bold;
+}
+
+.metric-icon {
+  font-size: 20px;
+  background-color: rgb(58, 132, 247);
+  width: 30px;
+  height: 30px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  border-radius: 50%;
+}
+
+.card-body {
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+}
+
+.metric-value {
+  font-size: 28px;
+  font-weight: bold;
+  color: #3375F6;
+  text-shadow: 0 0 5px #0B0E25;
+}
+
+.metric-trend {
+  display: flex;
+  align-items: center;
+  font-size: 14px;
+}
+
+.trend-up {
+  color: #3375F6;
+}
+
+.trend-down {
+  color: #ff6b6b;
+}
+
+.trend-icon {
+  margin-left: 5px;
+}
+
+.chart-container {
+  margin-bottom: 20px;
+}
+
+.chart-row {
+  display: flex;
+  gap: 20px;
+  margin-bottom: 20px;
+}
+
+.chart-col {
+  flex: 1;
+}
+
+.chart-card {
+  border-radius: 8px;
+  padding: 15px;
+}
+
+.chart-title {
+  font-size: 18px;
+  font-weight: bold;
+  margin-bottom: 15px;
+  position: relative;
+  padding-bottom: 10px;
+}
+
+.chart-title::after {
+  content: '';
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  width: 50px;
+  height: 2px;
+  background-color: #0B0E25;
+}
+
+.chart-wrapper {
+  width: 100%;
+  height: 300px;
+}
+
+.data-table-container {
+  margin-bottom: 20px;
+}
+
+.table-title {
+  font-size: 18px;
+  font-weight: bold;
+  margin-bottom: 15px;
+  position: relative;
+  padding-bottom: 10px;
+}
+
+.table-title::after {
+  content: '';
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  width: 80px;
+  height: 2px;
+  background-color: #0B0E25;
+}
+
+.table-wrapper {
+  overflow-x: auto;
+}
+
+.data-table {
+  width: 100%;
+  border-collapse: collapse;
+  border: 1px solid #0B0E25;
+  border-radius: 8px;
+  overflow: hidden;
+}
+
+.data-table th,
+.data-table td {
+  padding: 12px 15px;
   text-align: center;
-  padding-top: 8px;
+  border: 1px solid rgb(58, 132, 247);
+}
+
+.data-table th {
+  background-color: rgb(58, 132, 247);
+  font-weight: bold;
+  color: #0B0E25;
+}
+
+.data-table tr:nth-child(even) {
+  background-color: rgb(58, 132, 247);
+}
+
+.data-table tr:hover {
+  background-color: rgb(58, 132, 247);
 }
-.el-collapse{
-  background-color: #0b333f !important;
-  color: #FFFFFF;
+
+.metric-explanation {
+  background-color: rgba(10, 30, 50, 0.5);
+  border: 1px solid #0B0E25;
+  border-radius: 8px;
+  padding: 15px;
+  box-shadow: 0 0 10px rgb(58, 132, 247);
+}
+
+.explanation-table {
+  width: 100%;
+  border-collapse: collapse;
+  margin-top: 15px;
+}
+
+.explanation-table th,
+.explanation-table td {
+  padding: 10px 15px;
+  text-align: left;
+  border: 1px solid rgba(0, 245, 255, 0.3);
+}
+
+.explanation-table th {
+  background-color: rgba(0, 245, 255, 0.1);
+  font-weight: bold;
+  color: #0B0E25;
+}
+
+.explanation-table tr:nth-child(even) {
+  background-color: rgba(0, 245, 255, 0.05);
 }
 </style>

+ 36 - 38
fdapfe-ui/src/views/index.scss

@@ -21,19 +21,18 @@
 
 .second {
   width: 97%;
-  height: 100%;
+  height: 440px;
   margin: 50px 20px;
   // overflow: hidden;
   display: flex;
   flex-direction: column;
-  background-color: #0b333f;
+
   .step {
     width: 100%;
-    height: 300px;
+    height: 120px;
     display: flex;
     justify-content: center;
     align-items: center;
-
     .yuan,
     .one,
     .two,
@@ -59,24 +58,20 @@
       position: relative;
     }
 
-    //.img::after {
-    //  content: "";
-    //  position: absolute;
-    //  top: 50%;
-    //  transform: translateX(26%);
-    //  width: 200%;
-    //  height: 1px;
-    //  // background-color: #546882;
-    //  background-color: #00aaff;
-    //  box-shadow: 0 5px 15px rgba(0, 170, 255, 0.5);
-    //}
-
     .noAfter::after {
       content: none;
     }
-
-
-
+    .even::before {
+      content: "";
+      position: absolute;
+      bottom: 0;
+      transform: translateY(50%);
+      width: 1px;
+      height: 50%;
+      // background-color: #546882;00aaff
+      background-color: #00aaff;
+      box-shadow: 0 5px 15px rgba(0, 170, 255, 0.5);
+    }
 
     .yuanBg {
       background: url("../assets/images/yuan.png") no-repeat center / contain;
@@ -87,15 +82,15 @@
     }
 
     .twoBg {
-      background: url("../assets/images/two.png") no-repeat center / contain;
+      background: url("../assets/images/three.png") no-repeat center / contain;
     }
 
     .threeBg {
-      background: url("../assets/images/three.png") no-repeat center / contain;
+      background: url("../assets/images/four.png") no-repeat center / contain;
     }
 
     .fourBg {
-      background: url("../assets/images/four.png") no-repeat center / contain;
+      background: url("../assets/images/five.png") no-repeat center / contain;
     }
 
     .fiveBg {
@@ -109,11 +104,11 @@
     .tag {
       color: #fff;
       background: linear-gradient(
-        to right,
-        rgba(8, 200, 236, 0),
-        rgba(8, 200, 236, 0.8),
-        rgba(8, 200, 236, 0.8),
-        rgba(8, 200, 236, 0)
+          to right,
+          rgba(8, 200, 236, 0),
+          rgba(8, 200, 236, 0.8),
+          rgba(8, 200, 236, 0.8),
+          rgba(8, 200, 236, 0)
       );
       position: absolute;
       top: -15px;
@@ -122,11 +117,11 @@
     .tag2 {
       color: #fff;
       background: linear-gradient(
-        to right,
-        rgba(8, 200, 236, 0),
-        rgba(8, 200, 236, 0.8),
-        rgba(8, 200, 236, 0.8),
-        rgba(8, 200, 236, 0)
+          to right,
+          rgba(8, 200, 236, 0),
+          rgba(8, 200, 236, 0.8),
+          rgba(8, 200, 236, 0.8),
+          rgba(8, 200, 236, 0)
       );
       position: absolute;
       top: -15px;
@@ -144,18 +139,16 @@
 
   .bottomPanel {
     width: 100%;
-    height: 300px;
+    height: 37%;
     display: flex;
-    //justify-content: space-around;
-    margin-left: 6%;
+    justify-content: space-around;
+    margin-left: 5%;
     margin-top: 1%;
-    justify-content: flex-start
   }
 
   .tPanel,
   .bPanel {
-    // position: relative;
-    width: 18%;
+    width: 16%;
     height: 95%;
     overflow: auto;
     border: 2px solid transparent;
@@ -164,6 +157,11 @@
     border-radius: 5%;
   }
 }
+.vanel {
+  width: 16%;
+  height: 95%;
+  overflow: auto;
+}
 
 .file,
 .beforeFile {

+ 227 - 59
fdapfe-ui/src/views/index.vue

@@ -1,60 +1,222 @@
 <template>
   <div class="home" v-loading="loading">
-    <dv-decoration-5 style="width:100%;height:40px;" />
     <div class="second">
-      <div class="topPanel"></div>
+      <div class="topPanel">
+
+      </div>
       <div class="step">
+        <div class="yuan">
+          <div class="img yuanBg odd" @click="switchHandle('0')">
+            <div class="tag">故障注入</div>
+          </div>
+        </div>
+        <dv-decoration-6 style="width:150px;height:30px;"/>
         <div class="one">
-          <div class="img oneBg even"  @click="handleDialogOpen">
-            <div class="tag2">数据生成</div>
-            <div class="tag">物理模型</div>
+          <div class="img oneBg even">
+            <div class="tag">加噪</div>
           </div>
         </div>
-        <dv-decoration-6 style="width:200px;height:20px;" />
+        <dv-decoration-6 style="width:150px;height:30px;"/>
         <div class="two">
-          <div class="img twoBg odd">
-            <div class="tag">加噪</div>
+          <div class="img twoBg even">
+            <div class="tag">算法验证</div>
           </div>
         </div>
-        <dv-decoration-6 style="width:200px;height:20px;" />
-        <div class="three">
-          <div class="img fourBg odd">
-
-            <div class="tag">故障诊断</div>
+        <dv-decoration-6 style="width:150px;height:30px;" />
+        <div class="three"  @click="switchHandle('1')">
+          <div class="img threeBg even">
+            <div class="tag">算法评估</div>
           </div>
         </div>
-        <dv-decoration-6 style="width:220px;height:20px;" />
+        <dv-decoration-6 style="width:150px;height:30px;"/>
         <div class="four">
-          <div class="img fiveBg noAfter"
-               style="content: none">
-            <div class="tag">功能验证</div>
-            <div class="tag2">性能评估</div>
+          <div class="img fourBg">
+            <div class="tag">结果分析</div>
           </div>
         </div>
+      </div>
 
+      <div class="bottomPanel">
+        <div class="vanel"></div>
+        <dv-border-box-13 class="bPanel">
+          <el-table size="mini">
+            <el-table-column
+              prop="processedDataName"
+              label="处理前数据"
+              align="center"
+            >
+              <template slot-scope="scope">
+                <el-tooltip
+                  class="item"
+                  effect="dark"
+                  :content="scope.row"
+                  placement="top"
+                >
+                  <span class="beforeFile">{{
+                      scope.row
+                    }}</span>
+                </el-tooltip>
+              </template>
+            </el-table-column>
+            <el-table-column
+              prop="resultDataName"
+              label="处理后数据"
+              align="center"
+            >
+              <template slot-scope="scope">
+                <el-tooltip
+                  class="item"
+                  effect="dark"
+                  :content="scope.row"
+                  placement="top"
+                >
+                  <span class="file">{{
+                      scope.row
+                    }}</span>
+                </el-tooltip>
+              </template>
+            </el-table-column>
+            <el-table-column
+              prop="processStatus"
+              label="状态"
+              align="center"
+              width="60"
+            >
+              <template slot-scope="scope">
+                <dict-tag
+                  :options="dict.type.biz_process_status"
+                  :value="scope.row.processStatus"
+                />
+              </template>
+            </el-table-column>
+          </el-table>
+        </dv-border-box-13>
+        <dv-border-box-13 class="bPanel">
+          <el-table size="mini">
+            <el-table-column
+              prop="processedDataName"
+              label="处理前数据"
+              align="center"
+            >
+              <template slot-scope="scope">
+                <el-tooltip
+                  class="item"
+                  effect="dark"
+                  :content="scope.row"
+                  placement="top"
+                >
+                  <span class="beforeFile">{{
+                      scope.row
+                    }}</span>
+                </el-tooltip>
+              </template>
+            </el-table-column>
+            <el-table-column
+              prop="resultDataName"
+              label="处理后数据"
+              align="center"
+            >
+              <template slot-scope="scope">
+                <el-tooltip
+                  class="item"
+                  effect="dark"
+                  :content="scope.row"
+                  placement="top"
+                >
+                  <span class="file">{{
+                      scope.row
+                    }}</span>
+                </el-tooltip>
+              </template>
+            </el-table-column>
+            <el-table-column
+              prop="processStatus"
+              label="状态"
+              align="center"
+              width="60"
+            >
+              <template slot-scope="scope">
+                <dict-tag
+                  :options="dict.type.biz_process_status"
+                  :value="scope.row.processStatus"
+                />
+              </template>
+            </el-table-column>
+          </el-table>
+        </dv-border-box-13>
+        <dv-border-box-13 class="bPanel">
+          <el-table size="mini">
+            <el-table-column
+              prop="processedDataName"
+              label="处理前数据"
+              align="center"
+            >
+              <template slot-scope="scope">
+                <el-tooltip
+                  class="item"
+                  effect="dark"
+                  :content="scope.row"
+                  placement="top"
+                >
+                  <span class="beforeFile">{{
+                      scope.row
+                    }}</span>
+                </el-tooltip>
+              </template>
+            </el-table-column>
+            <el-table-column
+              prop="resultDataName"
+              label="处理后数据"
+              align="center"
+            >
+              <template slot-scope="scope">
+                <el-tooltip
+                  class="item"
+                  effect="dark"
+                  :content="scope.row"
+                  placement="top"
+                >
+                  <span class="file">{{
+                      scope.row
+                    }}</span>
+                </el-tooltip>
+              </template>
+            </el-table-column>
+            <el-table-column
+              prop="processStatus"
+              label="状态"
+              align="center"
+              width="60"
+            >
+              <template slot-scope="scope">
+                <dict-tag
+                  :options="dict.type.biz_process_status"
+                  :value="scope.row.processStatus"
+                />
+              </template>
+            </el-table-column>
+          </el-table>
+        </dv-border-box-13>
+        <div class="vanel"></div>
       </div>
-<!--      <div class="bottomPanel">-->
-<!--            <dv-active-ring-chart :config="imagedata" style="width:200px;height:200px" />-->
-<!--            <dv-capsule-chart :config="imagedata" style="width:300px;height:200px" />-->
-<!--        <dv-conical-column-chart :config="imagedata" style="width:400px;height:200px;margin-left: 100px" />-->
-<!--      </div>-->
     </div>
-    <form-model-view v-model="dialogVisible"  @callback="handleRowData"/>
+    <form-model-view v-model="dialogVisible" @callback="handleRowData"/>
   </div>
 </template>
 
 <script>
-import CountTo from "vue-count-to";
-import RingChart from "@/views/homePage/ringChart";
-import PreCharts from "@/views/homePage/preCharts";
-import CurveCharts from "@/views/homePage/curveCharts";
-import BarChart from "@/views/dashboard/BarChart";
-import FormModelView from '../views/workflow/workflow/form.vue'
+import CountTo from 'vue-count-to'
+import RingChart from '@/views/homePage/ringChart'
+import PreCharts from '@/views/homePage/preCharts'
+import CurveCharts from '@/views/homePage/curveCharts'
+import BarChart from '@/views/dashboard/BarChart'
+import { getDataOptions } from '@/api/data/data'
+import FormModelView from './test/perf/perfDetail.vue'
 import FileTable from '@/views/fileTable.vue'
 
 export default {
-  name: "Index",
-  dicts: ["biz_alg_type", "biz_process_status"],
+  name: 'Index',
+  dicts: ['biz_alg_type', 'biz_process_status'],
   components: {
     FileTable,
     CountTo,
@@ -66,46 +228,52 @@ export default {
   },
   data() {
     return {
-      imagedata:{
-        data:[{
-          name: 'Precision',
-          value: 0.91
-        },
-          {
-            name: 'Recall',
-            value: 0.91
-          },
-          {
-            name: 'F1 ',
-            value: 91
-          },
-          {
-            name: '准确率',
-            value: 91
-          },]
-      },
       dialogVisible: false,
       loading: false, // 补充可能存在的loading状态
-      initFileData:{}
+      initFileData: {}
       // 保留原有数据属性...
-    };
+    }
+  },
+  mounted() {
   },
-  mounted() {},
   created() {
+    // 保留原有生命周期钩子...
   },
   watch: {
+    // 保留原有watchers...
   },
   methods: {
+    // 新增对话框打开方法
     handleDialogOpen(rowData) {
-      this.dialogVisible = true;
+      this.dialogVisible = true
+      // 可根据需求传递rowData到子组件,例如通过props或Vuex
+      // 假设FormModelView需要接收数据,可添加props: { dialogData: Object },并传递rowData
     },
-    handleRowData(row){
-      console.log('接收到文件管理的行数据:', row);
-      this.initFileData= row;
+    handleRowData(row) {
+      this.dialogVisible= false
+      console.log('接收到文件管理的行数据:', row)
+      this.initFileData = row
     },
-
+    switchHandle(dataType) {
+      switch (dataType) {
+        case '0':
+          this.dialogVisible = true
+          // this.loading = false;
+          break
+        case '1':
+          this.fileShowVisible = true
+          // this.loading = false;
+          break
+        case '2':
+          this.fileShowVisible = true
+          this.$nextTick(() => {
+            // this.loading = false;
+          })
+          break
+      }
+    }
   }
-};
+}
 </script>
 
 <style scoped lang="scss">

+ 12 - 13
fdapfe-ui/src/views/model/faultPhysical/form.vue

@@ -59,26 +59,16 @@
         <el-table :data="formData.configData">
           <el-table-column prop="paramName" label="字段名称" min-width="60" header-align="center" align="center">
             <template slot-scope="scope">
-<!--              <el-input :disabled="disable" v-model="scope.row.paramName" placeholder="字段名称"></el-input>-->
-              <el-input  v-model="scope.row.paramName" placeholder="字段名称"></el-input>
+              <el-input :disabled="disable"  v-model="scope.row.paramName" placeholder="字段名称"></el-input>
             </template>
           </el-table-column>
           <el-table-column prop="paramChineseName" label="中文名称" min-width="60" align="center">
             <template slot-scope="scope">
-<!--              <el-input :disabled="disable" v-model="scope.row.paramChineseName" placeholder="中文名称"></el-input>-->
-              <el-input  v-model="scope.row.paramChineseName" placeholder="中文名称"></el-input>
+              <el-input :disabled="disable" v-model="scope.row.paramChineseName" placeholder="中文名称"></el-input>
             </template>
           </el-table-column>
           <el-table-column prop="paramType" label="参数类型" header-align="center" align="center">
             <template slot-scope="scope">
-<!--              <el-select :disabled="disable" v-model="scope.row.paramType" placeholder="参数类型" >-->
-<!--                <el-option-->
-<!--                  v-for="dict in dict.type.param_type"-->
-<!--                  :key="dict.value"-->
-<!--                  :label="dict.label"-->
-<!--                  :value="dict.value"-->
-<!--                />-->
-<!--              </el-select>-->
               <el-select  v-model="scope.row.paramType" placeholder="参数类型" >
                 <el-option
                   v-for="dict in dict.type.param_type"
@@ -105,13 +95,21 @@
           <el-table-column prop="isRequired" label="是否必填" min-width="50" header-align="center" align="center">
             <template slot-scope="scope">
               <el-switch
-                :disabled="disable"
                 v-model="scope.row.isRequired"
                 active-color="#13ce66"
                 inactive-color="#ff4949">
               </el-switch>
             </template>
           </el-table-column>
+          <el-table-column prop="isShow" label="是否显示" header-align="center" align="center">
+            <template slot-scope="scope">
+              <el-switch
+                v-model="scope.row.isShow"
+                active-color="#13ce66"
+                inactive-color="#ff4949">
+              </el-switch>
+            </template>
+          </el-table-column>
           <el-table-column prop="paramSort" label="排序号" header-align="center" align="center">
             <template slot-scope="scope">
               <el-input-number size="mini" v-model="scope.row.paramSort" :min="1" :max="10" label="排序号"></el-input-number>
@@ -122,6 +120,7 @@
               <el-input type="textarea"  autosize v-model="scope.row.paramDescription" placeholder="字段说明"></el-input>
             </template>
           </el-table-column>
+
         </el-table>
       </el-form-item>
     </el-form>

+ 2 - 2
fdapfe-ui/src/views/system/user/index.vue

@@ -553,9 +553,9 @@ export default {
 </script>
 <style scoped>
  .app-container /deep/ .el-col{
-  background-color: #0b333f;
+  background-color: #0a0e27;
 }
 .plitpanes--vertical /deep/ .splitpanes__splitter{
-   background-color: #0b333f;
+   background-color: #0a0e27;
  }
 </style>

+ 1 - 1
fdapfe-ui/src/views/test/ddAlgorithm/form.vue

@@ -52,7 +52,7 @@
         </el-select>
       </el-form-item>
       <el-form-item v-if="formData.modelId && modelType" label="模型参数">
-        <dynamic-parameter-form :model-typedisbale="modelType==='0'" :config-data="initialData" @submit="handleSubmitDataList" />
+        <dynamic-parameter-form :limit="1" :model-typedisbale="modelType==='0'" :config-data="initialData" @submit="handleSubmitDataList" />
       </el-form-item>
       <el-form-item label="说明" prop="remark">
         <el-input

+ 1 - 1
fdapfe-ui/src/views/test/perf/PrecisionSnrChart.vue

@@ -137,7 +137,7 @@ export default {
               show: true,
               position: 'top',
               formatter: function(params) {
-                return params.value.toFixed(4);
+                return (params.value.toFixed(3))*100 + '%';
               }
             }
           }

+ 17 - 16
fdapfe-ui/src/views/test/perf/perfDetail.vue

@@ -13,7 +13,21 @@
         <el-form-item label="任务名称" prop="name">
           <el-input v-model="formData.name" placeholder="请输入任务名称" />
         </el-form-item>
-        <el-form-item label="类型" prop="type">
+        <el-form-item label="诊断模型">
+          <el-select
+            v-model="formData.fdAlgorithmId"
+            placeholder="请选择诊断模型"
+            :disabled="isProcessing"
+          >
+            <el-option
+              v-for="item in faultOptions"
+              :key="item.modelId"
+              :label="item.modelName"
+              :value="item.modelId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="噪声模型" prop="type">
           <el-select
             v-model="formData.noseModelId"
             placeholder="请选择噪声模型"
@@ -28,7 +42,7 @@
             />
           </el-select>
         </el-form-item>
-        <el-form-item label="物理模型">
+        <el-form-item label="参数普">
           <dynamic-parameter-form
             :limit="1"
             :config-data="initialData"
@@ -36,20 +50,7 @@
             :disabled="isProcessing"
           />
         </el-form-item>
-        <el-form-item label="诊断模型">
-          <el-select
-            v-model="formData.fdAlgorithmId"
-            placeholder="请选择诊断模型"
-            :disabled="isProcessing"
-          >
-            <el-option
-              v-for="item in faultOptions"
-              :key="item.modelId"
-              :label="item.modelName"
-              :value="item.modelId"
-            />
-          </el-select>
-        </el-form-item>
+
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button

+ 1 - 1
fdapfe-ui/src/views/tool/build/index.vue

@@ -405,7 +405,7 @@ export default {
 // home
 .right-scrollbar {
   .el-scrollbar__view {
-    background: #0b333f;
+    background: #0a0e27;
     padding: 12px 18px 15px 15px;
   }
 }

+ 1 - 1
fdapfe-ui/src/views/workflow/workflow/form.vue

@@ -68,7 +68,7 @@
             </el-select>
           </el-form-item>
           <el-form-item v-if="formData.modelId && modelType" label="模型参数">
-            <dynamic-parameter-form :model-typedisbale="modelType==='0'" :config-data="initialData" @submit="handleSubmitDataList" />
+            <dynamic-parameter-form :config-data="initialData" @submit="handleSubmitDataList" />
           </el-form-item>
           <el-form-item label="诊断模型">
             <el-select

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác