Browse Source

模型训练与使用

Acoder 4 năm trước cách đây
mục cha
commit
9148076c21
4 tập tin đã thay đổi với 400 bổ sung19 xóa
  1. 38 15
      package-lock.json
  2. 13 4
      src/components/Sidebar.vue
  3. 10 0
      src/router/index.js
  4. 339 0
      src/views/ModelDetail.vue

+ 38 - 15
package-lock.json

@@ -321,7 +321,8 @@
     "node_modules/colorette": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
-      "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w=="
+      "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
+      "dev": true
     },
     "node_modules/consolidate": {
       "version": "0.16.0",
@@ -422,6 +423,7 @@
       "version": "0.12.9",
       "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.9.tgz",
       "integrity": "sha512-MWRhAbMOJ9RJygCrt778rz/qNYgA4ZVj6aXnNPxFjs7PmIpb0fuB9Gmg5uWrr6n++XKwwm/RmSz6RR5JL2Ocsw==",
+      "dev": true,
       "bin": {
         "esbuild": "bin/esbuild"
       }
@@ -448,6 +450,7 @@
       "version": "2.3.2",
       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
       "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "dev": true,
       "optional": true,
       "os": [
         "darwin"
@@ -459,7 +462,8 @@
     "node_modules/function-bind": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
     },
     "node_modules/generic-names": {
       "version": "2.0.1",
@@ -474,6 +478,7 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
       "dependencies": {
         "function-bind": "^1.1.1"
       },
@@ -509,6 +514,7 @@
       "version": "2.4.0",
       "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
       "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
+      "dev": true,
       "dependencies": {
         "has": "^1.0.3"
       }
@@ -592,6 +598,7 @@
       "version": "3.1.23",
       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
       "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==",
+      "dev": true,
       "bin": {
         "nanoid": "bin/nanoid.cjs"
       },
@@ -607,12 +614,14 @@
     "node_modules/path-parse": {
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
     },
     "node_modules/postcss": {
       "version": "8.3.5",
       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz",
       "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==",
+      "dev": true,
       "dependencies": {
         "colorette": "^1.2.2",
         "nanoid": "^3.1.23",
@@ -733,6 +742,7 @@
       "version": "1.20.0",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
       "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+      "dev": true,
       "dependencies": {
         "is-core-module": "^2.2.0",
         "path-parse": "^1.0.6"
@@ -742,6 +752,7 @@
       "version": "2.52.3",
       "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.52.3.tgz",
       "integrity": "sha512-QF3Sju8Kl2z0osI4unyOLyUudyhOMK6G0AeqJWgfiyigqLAlnNrfBcDWDx+f1cqn+JU2iIYVkDrgQ6/KtwEfrg==",
+      "dev": true,
       "bin": {
         "rollup": "dist/bin/rollup"
       },
@@ -769,6 +780,7 @@
       "version": "0.6.2",
       "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz",
       "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==",
+      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -808,6 +820,7 @@
       "version": "2.3.7",
       "resolved": "https://registry.npmjs.org/vite/-/vite-2.3.7.tgz",
       "integrity": "sha512-Y0xRz11MPYu/EAvzN94+FsOZHbSvO6FUvHv127CyG7mV6oDoay2bw+g5y9wW3Blf8OY3chaz3nc/DcRe1IQ3Nw==",
+      "dev": true,
       "dependencies": {
         "esbuild": "^0.12.5",
         "postcss": "^8.3.0",
@@ -1034,8 +1047,7 @@
     "@vitejs/plugin-vue": {
       "version": "1.10.2",
       "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-1.10.2.tgz",
-      "integrity": "sha512-/QJ0Z9qfhAFtKRY+r57ziY4BSbGUTGsPRMpB/Ron3QPwBZM4OZAZHdTa4a8PafCwU5DTatXG8TMDoP8z+oDqJw==",
-      "requires": {}
+      "integrity": "sha512-/QJ0Z9qfhAFtKRY+r57ziY4BSbGUTGsPRMpB/Ron3QPwBZM4OZAZHdTa4a8PafCwU5DTatXG8TMDoP8z+oDqJw=="
     },
     "@vue/compiler-core": {
       "version": "3.1.2",
@@ -1163,7 +1175,8 @@
     "colorette": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
-      "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w=="
+      "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
+      "dev": true
     },
     "consolidate": {
       "version": "0.16.0",
@@ -1242,7 +1255,8 @@
     "esbuild": {
       "version": "0.12.9",
       "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.9.tgz",
-      "integrity": "sha512-MWRhAbMOJ9RJygCrt778rz/qNYgA4ZVj6aXnNPxFjs7PmIpb0fuB9Gmg5uWrr6n++XKwwm/RmSz6RR5JL2Ocsw=="
+      "integrity": "sha512-MWRhAbMOJ9RJygCrt778rz/qNYgA4ZVj6aXnNPxFjs7PmIpb0fuB9Gmg5uWrr6n++XKwwm/RmSz6RR5JL2Ocsw==",
+      "dev": true
     },
     "estree-walker": {
       "version": "2.0.2",
@@ -1258,12 +1272,14 @@
       "version": "2.3.2",
       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
       "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "dev": true,
       "optional": true
     },
     "function-bind": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
     },
     "generic-names": {
       "version": "2.0.1",
@@ -1278,6 +1294,7 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
       "requires": {
         "function-bind": "^1.1.1"
       }
@@ -1298,13 +1315,13 @@
       "version": "5.1.0",
       "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
       "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
-      "dev": true,
-      "requires": {}
+      "dev": true
     },
     "is-core-module": {
       "version": "2.4.0",
       "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
       "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
+      "dev": true,
       "requires": {
         "has": "^1.0.3"
       }
@@ -1381,7 +1398,8 @@
     "nanoid": {
       "version": "3.1.23",
       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
-      "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw=="
+      "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==",
+      "dev": true
     },
     "normalize-wheel": {
       "version": "1.0.1",
@@ -1391,12 +1409,14 @@
     "path-parse": {
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
     },
     "postcss": {
       "version": "8.3.5",
       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz",
       "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==",
+      "dev": true,
       "requires": {
         "colorette": "^1.2.2",
         "nanoid": "^3.1.23",
@@ -1423,8 +1443,7 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
       "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
-      "dev": true,
-      "requires": {}
+      "dev": true
     },
     "postcss-modules-local-by-default": {
       "version": "4.0.0",
@@ -1485,6 +1504,7 @@
       "version": "1.20.0",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
       "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+      "dev": true,
       "requires": {
         "is-core-module": "^2.2.0",
         "path-parse": "^1.0.6"
@@ -1494,6 +1514,7 @@
       "version": "2.52.3",
       "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.52.3.tgz",
       "integrity": "sha512-QF3Sju8Kl2z0osI4unyOLyUudyhOMK6G0AeqJWgfiyigqLAlnNrfBcDWDx+f1cqn+JU2iIYVkDrgQ6/KtwEfrg==",
+      "dev": true,
       "requires": {
         "fsevents": "~2.3.2"
       }
@@ -1511,7 +1532,8 @@
     "source-map-js": {
       "version": "0.6.2",
       "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz",
-      "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug=="
+      "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==",
+      "dev": true
     },
     "sourcemap-codec": {
       "version": "1.4.8",
@@ -1545,6 +1567,7 @@
       "version": "2.3.7",
       "resolved": "https://registry.npmjs.org/vite/-/vite-2.3.7.tgz",
       "integrity": "sha512-Y0xRz11MPYu/EAvzN94+FsOZHbSvO6FUvHv127CyG7mV6oDoay2bw+g5y9wW3Blf8OY3chaz3nc/DcRe1IQ3Nw==",
+      "dev": true,
       "requires": {
         "esbuild": "^0.12.5",
         "fsevents": "~2.3.1",

+ 13 - 4
src/components/Sidebar.vue

@@ -63,16 +63,25 @@ export default {
               index: "/config",
               title: "模型配置",
           },
-          {
-            icon: "el-icon-lx-redpacket_fill",
-            index: "/modelList",
-            title:"深度学习",
+
+        {
+            icon: "el-icon-star-off",
+            index: "/modelDetail",
+            title:"模型训练",
           },
+
           {
             icon: "el-icon-pie-chart",
             index: "/charts",
             title: "训练结果",
           },
+
+          {
+            icon: "el-icon-lx-redpacket_fill",
+            index: "/modelList",
+            title:"深度学习",
+          },
+
           {
               icon: "el-icon-lx-copy",
               index: "/message",

+ 10 - 0
src/router/index.js

@@ -28,6 +28,16 @@ const routes = [
                 },
                 component: () => import ( /* webpackChunkName: "dashboard" */ "../views/modelList.vue")
             },
+
+            {
+                path: "/modelDetail",
+                name: "modelDetail",
+                meta: {
+                    title: '模型训练'
+                },
+                component: () => import ( /* webpackChunkName: "dashboard" */ "../views/modelDetail.vue")
+            },
+
             {
                 path: "/fileDetail",
                 name: "fileDetail",

+ 339 - 0
src/views/ModelDetail.vue

@@ -0,0 +1,339 @@
+<template>
+    <div>
+        <div class="crumbs">
+            <el-breadcrumb separator="/">
+                <el-breadcrumb-item>
+                    <i class="el-icon-lx-cascades"></i> 模型训练使用
+                </el-breadcrumb-item>
+            </el-breadcrumb>
+        </div>
+
+        <div class="container">
+            <div class="handle-box">
+                <el-select v-model="query.file" placeholder="模型信息" class="handle-select mr10">
+                    <el-option key="0" label="所有" value="0"></el-option>
+                    <el-option key="1" label="逻辑回归" value="1"></el-option>
+                    <el-option key="2" label="决策树" value="2"></el-option>
+                    <el-option key="3" label="随机森林" value="3"></el-option>
+                    <el-option key="4" label="梯度提升决策树" value="4"></el-option>
+                  <el-option key="5" label="多层感知器分类器" value="5"></el-option>
+                  <el-option key="6" label="朴素贝叶斯" value="6"></el-option>
+                  <el-option key="7" label="随机森林回归" value="7"></el-option>
+                  <el-option key="8" label="K-均值" value="8"></el-option>
+                </el-select>
+                <!-- <el-input v-model="query.name" placeholder="模型Id" class="handle-input mr10"></el-input>
+                <el-button type="primary" icon="el-icon-search" @click="handleSearch">搜索</el-button> -->
+            </div>
+            <el-table
+                :data="tableData" border class="table" ref="multipleTable"
+                header-cell-class-name="table-header"
+                @selection-change="handleSelectionChange"
+                @row-dblclick="getConfigDetail"
+            >
+                <el-table-column width="50" type="selection"></el-table-column>
+                <el-table-column prop="confName" label="模型Id"></el-table-column>
+                <el-table-column label="模型信息">
+                    <template #default="scope">{{ scope.row.modelTypeName }}</template>
+                </el-table-column>
+              <el-table-column prop="fileName" label="待测试文件">
+                    <template #default="scope">
+                      <router-link :to="{path:'/ConfigDetail',query:{configId:scope.row.configId}}">
+                        <el-button type="text" icon="el-icon-upload" >选择文件
+                        </el-button>
+                      </router-link>
+                    </template>
+              </el-table-column>
+
+                <el-table-column label="模型训练" width="180" align="center">
+                    <template #default="scope">
+                        <el-button type="text" icon="el-icon-video-play" class="green"
+                            @click="handleDelete(scope.$index, scope.row)">模型训练</el-button> 
+                    </template>
+                </el-table-column>
+                <!-- 如果已经训练了,那么就告诉她您已经训练过该模型,但还是感觉应该放在模型配置里面,配置就可以让他进行训练! -->
+
+
+                <el-table-column label="操作" width="180" align="center">
+                    <template #default="scope">
+                        <el-button type="text" icon="el-icon-mouse" class="blue"
+                            @click="handleDelete(scope.$index, scope.row)">模型使用</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <div class="pagination">
+                <el-pagination background layout="total, prev, pager, next" :current-page="query.pageIndex"
+                    :page-size="query.pageSize" :total="pageTotal" @current-change="handlePageChange"></el-pagination>
+            </div>
+        </div>
+
+        <!-- 编辑弹出框 -->
+        <el-dialog title="编辑" v-model="editVisible" min-width="30%">
+            <el-form label-width="150px">
+                <el-form-item label="配置名称" required>
+                    <el-input v-model="form.name"></el-input>
+                </el-form-item>
+                <el-form-item label="训练文件" required>
+                    <el-input v-model="form.file"></el-input>
+                </el-form-item>
+                <el-form-item label="选择模型类别" required>
+                  <el-radio-group v-model="modelSty.resource">
+                  <el-radio label="分类"></el-radio>
+                  <el-radio label="聚类"></el-radio>
+                  <el-radio label="回归"></el-radio>
+                  <el-radio label="自动化分类器"></el-radio>
+                  </el-radio-group>
+                </el-form-item>
+
+                <el-form-item label="特征选择方式" required>
+<!--                    <el-checkbox v-for="f in featureList" :key="f" :label="f"></el-checkbox>-->
+                  <el-radio-group v-model="featureSty.resource">
+                    <el-radio label="手动选择"></el-radio>
+                    <el-radio label="自动选择"></el-radio>
+                  </el-radio-group>
+                </el-form-item>
+
+<!--              <el-form-item label="单选框" prop="resource">-->
+<!--                <el-radio-group v-model="form.resource">-->
+<!--                  <el-radio label="步步高"></el-radio>-->
+<!--                  <el-radio label="小天才"></el-radio>-->
+<!--                  <el-radio label="imoo"></el-radio>-->
+<!--                </el-radio-group>-->
+<!--              </el-form-item>-->
+
+                <el-form-item label="选择特征字段" required>
+                  <el-alert type="info" description="您下列选择的第一个字段为分类模型的目标字段"
+                            show-icon style="height: 40px;"></el-alert>
+                </el-form-item>
+            </el-form>
+            <template #footer>
+                <span class="dialog-footer">
+                    <el-button @click="editVisible = false">取 消</el-button>
+                    <el-button type="primary" @click="saveEdit">确 定</el-button>
+                </span>
+            </template>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import { ref, reactive } from "vue";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { fetchData } from "../api/index";
+import {addConfig, deleteModelByModelId, getAllConfig} from "../api/config";
+
+export default {
+    name: "config",
+    //训练特征
+  // data(){
+  //     return{
+  //       form:{
+  //         name:"",
+  //         file:"",
+  //       }
+  //     }
+  // },
+  setup() {
+    const featureSty = reactive({
+
+      resource: "小天才",
+
+    });
+    const modelSty = reactive({
+
+      resource: "小天才",
+
+    });
+        const query = reactive({
+            file: "",
+            name: "",
+            pageIndex: 1,
+            pageSize: 10,
+        });
+
+        //new TODO
+        const typeList=["所有","分类","聚类","回归","自动分类器"];
+        const featureList=["所有","手动选择","自动选择"];
+        const multipleSelection =ref([]);
+
+        // const tableData = ref([]);
+    const tableData = ref([
+      ]);
+
+        const pageTotal = ref(0);
+        // 获取表格数据
+
+    const getpage=()=> {
+      // console.log("getpage");
+      getAllConfig({
+        uid: 1
+      }).then(res => {
+        console.log("res",res);
+        tableData.value = res.data;
+
+      })
+    };
+     getpage();
+
+
+
+    // 查询操作
+        const handleSearch = () => {
+            query.pageIndex = 1;
+            getData();
+        };
+        // 分页导航
+        const handlePageChange = (val) => {
+            query.pageIndex = val;
+            getData();
+        };
+
+        // 删除操作(单个)
+        const handleDelete = (index) => {
+            // 二次确认删除
+            ElMessageBox.confirm("确定要删除吗?", "提示", {
+                type: "warning",
+            })
+                .then(() => {
+                    // ElMessage.success("删除成功");
+                    // tableData.value.splice(index, 1);
+                  console.log("删除");
+                  let idx=tableData._rawValue[index].id;
+                  console.log(idx);
+                  deleteModelByModelId({
+                    configId:idx
+                  }).then(res=>{
+                    console.log("deleteres",res);
+                  });
+
+                })
+                .catch(() => {});
+        };
+
+        //TODO
+        const handleSelectionChange = (val) => {
+          multipleSelection.value = val
+        };
+
+        //TODO 批量删除
+        const handleBatchDelete =()=>{
+          // 二次确认
+          if(multipleSelection.value.length<=0){
+            ElMessageBox.alert("请先勾选要删除的模型", '提示', {
+              confirmButtonText: '好的'
+            })
+          }
+          else{
+            ElMessageBox.confirm("确定要删除这些模型吗?", "提示", {
+              type: "warning",
+            })
+                .then(() => {
+                  let idList=[];
+                  for(let i=0;i<multipleSelection.value.length;i++){
+                    let id=multipleSelection.value[i]['id'];
+                    idList.push(id);
+                  }
+                  idList.sort();
+                  console.log(idList);
+                  for (let i = idList[idList.length-1]; i >=0 ; i--) {
+                    tableData.value.splice(i,1);
+                  }
+                  ElMessage.success("删除成功");
+                })
+                .catch(() => {});
+          }
+        };
+
+        const getConfigDetail=(row,column,event)=>{
+          var configId=row.configId;
+          //todo:双击跳转到config界面
+          console.log("跳转到config详情界面")
+        }
+        // 表格编辑时弹窗和保存
+        const editVisible = ref(false);
+        let form = reactive({
+            name: "",
+            file: "",
+          // classification:"",
+          // feature:"",
+        });
+        let idx = -1;
+        const handleEdit = (index, row) => {
+            idx = index;
+            Object.keys(form).forEach((item) => {
+                form[item] = row[item];
+            });
+            editVisible.value = true;
+        };
+
+        const saveEdit = () => {
+            editVisible.value = false;
+            // ElMessage.success(`修改第 ${idx + 1} 行成功`);
+            // Object.keys(form).forEach((item) => {
+            //     tableData.value[idx][item] = form[item];
+            // });
+          // console.log("here",featureSty.resource);
+          // const { , ,confName , fieldIds} = payload;
+
+          addConfig({
+            fileInfoId:form.file,
+            userId:0,
+            modelTypeId:modelSty.resource,
+            confName:form.name,
+            fieldIds:featureSty.resource
+            }).then(res=>{
+              console.log(res);
+            });
+        };
+
+        return {
+            query,
+            tableData,
+            pageTotal,
+            editVisible,
+            form,
+            handleSearch,
+            handlePageChange,
+            handleDelete,
+          handleSelectionChange,
+            handleBatchDelete,
+            handleEdit,
+            saveEdit,
+          getConfigDetail,
+            featureSty,
+          modelSty,
+          getpage,
+        };
+    },
+};
+</script>
+
+<style scoped>
+.handle-box {
+    margin-bottom: 20px;
+}
+
+.handle-select {
+    width: 120px;
+}
+
+.handle-input {
+    width: 300px;
+    display: inline-block;
+}
+.table {
+    width: 100%;
+    font-size: 14px;
+}
+.red {
+    color: #ff0000;
+}
+.mr10 {
+    margin-right: 10px;
+}
+.table-td-thumb {
+    display: block;
+    margin: auto;
+    width: 40px;
+    height: 40px;
+}
+</style>