Просмотр исходного кода

feat: 数据分析配置部分

icenaked 3 лет назад
Родитель
Сommit
5614850168

+ 44 - 3
src/api/analysisConfig.js

@@ -1,15 +1,56 @@
-import {ANALYSIS_CONFIG_MODULE} from "./_prefix";
+import {ANALYSIS_CONFIG_MODULE, MOCK} from "./_prefix";
 import {axios} from '../utils/request'
 
+/**
+ *  添加配置信息 POST
+ * @param {*} payload
+ * @returns
+ */
+export const addAnalysisConfig = payload => {
+    const { fileId, userId, configName, chosenColumn} = payload;
+    // return axios.post(`${MOCK}/ml/configs`, {
+    return axios.post(`${MOCK}/analysis/configs`, {
+        fileId, userId, configName, chosenColumn
+    }).then(res => {
+        return res;
+    });
+}
 
 /**
- * 获取所有模型配置 GET  传入用户id
+ * 获取所有配置 GET  传入用户id
  * @param {userId} payload
  * @returns
  */
 export const getAnalysisConfig = payload => {
     const {uid} = payload;
-    return axios.get(`${ANALYSIS_CONFIG_MODULE}?userId=${uid}`).then(res => {
+    // return axios.get(`${ANALYSIS_CONFIG_MODULE}?userId=${uid}`).then(res => {
+        return axios.get(`${MOCK}/analysis/configs/all/:userId`).then(res => {
         return res;
     });
+}
+
+/**
+ * 删除配置
+ * @param {*} payload
+ * @returns
+ */
+export const deleteAnalysisConfig = payload => {
+    const {configId} = payload;
+    // return axios.get(`${CONFIG_MODULE}/delete?configId=${configId}`).then(res => {
+    return axios.delete(`${MOCK}/ml/configs/${configId}`).then(res => {
+        return res;
+    });
+}
+
+/**
+ * 获取单个个配置 GET
+ * @param {*} payload
+ * @returns
+ */
+export const getOneAnalysisConfig = payload => {
+    const { configId } = payload;
+    // return axios.get(`${CONFIG_MODULE}/get/one/config?configId=${configId}`).then(res => {
+    //   return res;});
+    return axios.get(`${MOCK}/analysis/configs/${configId}`).then(res => {
+        return res;});
 }

+ 33 - 9
src/views/analysis/Analysis.vue

@@ -3,7 +3,7 @@
   <div class="crumbs">
     <el-breadcrumb separator="/">
       <el-breadcrumb-item>
-        <i class="el-icon-lx-cascades"></i> 数据统计配置列表
+        <i class="el-icon-lx-cascades"></i> 数据统计分析列表
       </el-breadcrumb-item>
     </el-breadcrumb>
   </div>
@@ -12,15 +12,14 @@
     <el-table
         :data="tableData" border class="table" ref="multipleTable"
         header-cell-class-name="table-header"
-        @selection-change="handleSelectionChange"
-        @row-dblclick="getConfigDetail"
     >
       <el-table-column prop="configName" label="配置名"></el-table-column>
-      <el-table-column prop="fileName" label="文件名"></el-table-column>
+      <el-table-column prop="fileId" label="文件id"></el-table-column>
       <el-table-column label="查看历史分析">
           <el-button type="text" icon="el-icon-circle-check" class="yellow"
                      @click="handleTrainRes(scope.$index, scope.row)">查看分析结果</el-button>
       </el-table-column>
+
       <el-table-column label="操作" width="180" align="center">
         <template #default="scope">
 
@@ -29,7 +28,7 @@
           </el-button>
 
           <el-button type="text" icon="el-icon-delete" class="red"
-                     @click="handleDelete(scope.$index, scope.row)"
+                     @click="handleDelete(scope.row.id)"
           >删除</el-button>
 
         </template>
@@ -44,6 +43,8 @@
 
 <script>
 import {ref} from "vue";
+import {deleteAnalysisConfig, getAnalysisConfig} from "../../api/analysisConfig";
+import {ElMessage, ElMessageBox} from "element-plus";
 
 export default {
   name: "Analysis",
@@ -51,15 +52,38 @@ export default {
     const tableData = ref([]);
     const pageTotal = ref(0);
 
-    tableData.value = [
-      {configId: 1, configName: 'a', fileName: 'af', chosenColumn: ['melon','person']},
-      {configId: 2, configName: 'b', fileName: 'bf', chosenColumn: ['melon','person']}
-    ];
+    const getPage=()=> {
+      getAnalysisConfig({
+        uid: 1
+      }).then(res => {
+        console.log("res",res);
+        tableData.value = res.result.configVOList;
+      })
+    };
+    getPage();
 
+    const handleDelete = (id) => {
+      ElMessageBox.confirm("确定要删除吗?", "提示", {
+        type: "warning",
+      })
+          .then(() => {
+            deleteAnalysisConfig({id}
+            ).then(res=>{
+              if(res.msg === '成功'){
+                ElMessage.success("删除成功!")
+                //location.reload();
+                getPage();
+              }
+            });
+          })
+          .catch(() => {});
+    }
 
     return{
       tableData,
       pageTotal,
+      getPage,
+      handleDelete,
     };
   }
 }

+ 26 - 15
src/views/analysis/AnalysisConfig.vue

@@ -12,24 +12,19 @@
       <el-table
           :data="tableData" border class="table" ref="multipleTable"
           header-cell-class-name="table-header"
-          @selection-change="handleSelectionChange"
-          @row-dblclick="getConfigDetail"
       >
         <el-table-column prop="configName" label="配置名"></el-table-column>
-        <el-table-column prop="fileName" label="文件名"></el-table-column>
+        <el-table-column prop="fileId" label="文件id"></el-table-column>
         <el-table-column prop="chosenColumn" label="选中字段"></el-table-column>
         <el-table-column label="操作" width="180" align="center">
           <template #default="scope">
-
-            <router-link :to="{path:'/analysisConfigDetail',query:{configId:scope.row.configId}}">
+            <router-link :to="{path:'/analysisConfigDetail',query:{configId: scope.row.id}}">
               <el-button type="text" icon="el-icon-view" >查看详情
               </el-button>
             </router-link>
-
             <el-button type="text" icon="el-icon-delete" class="red"
-                       @click="handleDelete(scope.$index, scope.row)"
+                       @click="handleDelete(scope.row.id)"
             >删除</el-button>
-
           </template>
         </el-table-column>
       </el-table>
@@ -42,7 +37,8 @@
 
 <script>
 import {ref} from "vue";
-import {getAnalysisConfig} from "../../api/analysisConfig";
+import {deleteAnalysisConfig, getAnalysisConfig} from "../../api/analysisConfig";
+import {ElMessage, ElMessageBox} from "element-plus";
 
 export default {
   name: "AnalysisConfig",
@@ -55,19 +51,34 @@ export default {
         uid: 1
       }).then(res => {
         console.log("res",res);
-        tableData.value = res.data;
+        tableData.value = res.result.configVOList;
       })
     };
-    //getPage();
-    tableData.value = [
-      {configId: 1, configName: 'a', fileName: 'af', chosenColumn: ['melon','person']},
-      {configId: 2, configName: 'b', fileName: 'bf', chosenColumn: ['melon','person']}
-    ];
+    getPage();
+
+    const handleDelete = (id) => {
+      ElMessageBox.confirm("确定要删除吗?", "提示", {
+        type: "warning",
+      })
+          .then(() => {
+            deleteAnalysisConfig({id}
+            ).then(res=>{
+              if(res.msg === '成功'){
+                ElMessage.success("删除成功!")
+                //location.reload();
+                getPage();
+              }
+            });
+          })
+          .catch(() => {});
+    }
+
 
     return{
       tableData,
       pageTotal,
       getPage,
+      handleDelete,
     };
   }
 }

+ 12 - 142
src/views/analysis/AnalysisConfigDetail.vue

@@ -16,90 +16,13 @@
             {{config.configName}}
           </el-form-item>
           <el-form-item label="选中字段:" >
-            <el-table :data="tableData" border class="table"  ref="fieldTable" header-cell-class-name="table-header" @selection-change="handleSelectChange">
-              <el-table-column label="字段名" width="120%">
-                <template #default="scope"><span>{{ scope.row }}</span></template>
-              </el-table-column>
-              <el-table-column label="取值类型">
-                <template #default="scope">{{ scope.row.fieldType }}</template>
-              </el-table-column>
-            </el-table>
+              {{config.chosenColumn}}
           </el-form-item>
-
-<!--          <el-form-item label="分析记录:" >-->
-<!--            <el-table :data="modelData" border class="table" ref="fieldTable" header-cell-class-name="table-header" @selection-change="handleSelectChange">-->
-<!--              <el-table-column label="分析id" width="150%">-->
-<!--                <template #default="scope"><span>{{ scope.row.modelName }}</span></template>-->
-<!--              </el-table-column>-->
-<!--              <el-table-column label="分析算法" width="150%">-->
-<!--                <template #default="scope">{{ scope.row.modelDetailName }}</template>-->
-<!--              </el-table-column>-->
-<!--              <el-table-column label="分析状态">-->
-<!--                <template #default="scope" >-->
-<!--                  <div v-if="scope.row.trainedStatus===-1">未训练</div>-->
-<!--                  <div v-else="">已训练</div></template>-->
-<!--              </el-table-column>-->
-<!--              <el-table-column label="操作" width="180" align="center">-->
-<!--                <template #default="scope">-->
-
-<!--                  <router-link :to="{path:'/modelList',query:{modelId:scope.row.id}}">-->
-<!--                    <el-button type="text" icon="el-icon-view" >查看分析结果-->
-<!--                    </el-button>-->
-<!--                  </router-link>-->
-
-<!--                </template>-->
-<!--              </el-table-column>-->
-
-
-
-<!--            </el-table>-->
-<!--          </el-form-item>-->
-
           <el-form-item>
-            <el-button type="primary"  @click="createModel()">进行分析</el-button>
+            <el-button type="primary"  @click="analysis()">进行分析</el-button>
           </el-form-item>
         </el-form>
 
-
-
-<!--        <el-dialog title="新建模型" v-model="modelVisiable" width="30%">-->
-<!--          <el-form label-width="120px">-->
-<!--            <el-form-item label="文件Id" required>-->
-<!--              <el-input v-model="form.fileInfoId" ></el-input>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item label="模型名称" required>-->
-<!--              <el-input v-model="form.modelName"></el-input>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item label="MaxIter" v-model="showMaxIter" v-if="showMaxIter===true">-->
-<!--              <el-input v-model="form.MaxIter"></el-input>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item label="RegParam" v-model="showRegParam" v-if="showRegParam===true">-->
-<!--              <el-input v-model="form.RegParam"></el-input>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item label="ElasticNetParam" v-model="showElasticNetParam" v-if="showElasticNetParam===true">-->
-<!--              <el-input v-model="form.ElasticNetParam"></el-input>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item label="Category" v-model="showCategory" v-if="showCategory===true">-->
-<!--              <el-input v-model="form.Category"></el-input>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item label="DataSetOccupy" v-model="showTrainingDataSetOccupy" v-if="showTrainingDataSetOccupy===true">-->
-<!--              <el-input v-model="form.TrainingDataSetOccupy"></el-input>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item label="NumOfCluster" v-model="showNumOfCluster" v-if="showNumOfCluster===true">-->
-<!--              <el-input v-model="form.NumOfCluster"></el-input>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item label="Seed" v-model="showSeed" v-if="showSeed===true">-->
-<!--              <el-input v-model="form.Seed"></el-input>-->
-<!--            </el-form-item>-->
-
-<!--          </el-form>-->
-<!--          <template #footer>-->
-<!--                <span class="dialog-footer">-->
-<!--                    <el-button @click="modelVisiable = false">取 消</el-button>-->
-<!--                    <el-button type="primary" @click="saveModel">确 定</el-button>-->
-<!--                </span>-->
-<!--          </template>-->
-<!--        </el-dialog>-->
       </div>
     </div>
 
@@ -108,8 +31,8 @@
 
 <script>
 import {reactive, ref} from "vue";
-import {getOneConfig} from "../../api/config";
 import {useRoute} from "vue-router";
+import {getOneAnalysisConfig} from "../../api/analysisConfig";
 
 export default {
   name: "AnalysisConfigDetail",
@@ -121,95 +44,42 @@ export default {
       pageSize: 10,
     });
     const fileId=ref(1);
-    const tableData = ref([]);
     const selectData = ref([]);
     const pageTotal = ref(0);
-    const modelData=ref([]);
     const config=ref({});
     const route=useRoute()
-    const showMaxIter=ref(false);
-    const showRegParam=ref(false);
-    const showElasticNetParam=ref(false);
-    const showCategory=ref(false);
-    const showTrainingDataSetOccupy=ref(false);
-    const showNumOfCluster=ref(false);
-    const showSeed=ref(false);
+
 
     let form = reactive({
       modelTypeId:"",
       configId:route.query.configId,
       fileInfoId:"",
       modelName:"",
-      MaxIter:"",
-      RegParam:"",
-      ElasticNetParam:"",
-      Category:"",
-      TrainingDataSetOccupy:"",
-      NumOfCluster:"",
-      Seed:"",
     });
 
     const getData = () => {
-      // console.log("queryId",route.query.configId);
       if(route.query.configId!=null) {
-        getOneConfig({configId:route.query.configId}).then(res => {
-          // console.log("configdetail",route.query.configId);
-          config.value=res.data;
-          form.modelTypeId=config.value.modelTypeId;
-          if (form.modelTypeId==='1') {
-            showMaxIter.value = true;
-            showRegParam.value = true;
-            showElasticNetParam.value = true;
-          }else if (form.modelTypeId==='5') {
-            showNumOfCluster.value=true;
-            showSeed.value=true;
-          }else {
-            showCategory.value=true;
-            showTrainingDataSetOccupy.value=true;
-          }
-          console.log("form",form);
-          //console.log("config",config.value.modelTypeId);
-          tableData.value = res.data.featureList;
-          for (var i = 0; i < tableData.value.length; i++) {
-            if (tableData.value[i].conOrDis === 1) {
-              tableData.value[i].conOrDis = "连续值"
-            } else {
-              tableData.value[i].conOrDis = "离散值"
-            }
-          }
-          //console.log(tableData)
-
-          modelData.value=res.data.modelInfos;
-          console.log("tableData",tableData);
-          fileId.value=tableData.value[0].fileInfoId;
+        getOneAnalysisConfig({configId:route.query.configId}).then(res => {
+          config.value=res.result;
+          fileId.value=res.result.fileId;
           form.fileInfoId=(String)(fileId.value)
         })
-
       }
-
     };
-    //getData();
-    config.value= {id: 1, userId: 822, fileId: 1, configName: 'zyq', createdTime: 23.08, chosenColumn: ['好瓜','色泽']} ;
-    tableData.value=config.value.chosenColumn;
+    getData();
 
+    const analysis= () => {
+      console.log("analysis!")
+    }
 
     return{
       config,
       query,
-      tableData,
       pageTotal,
-      modelData,
       form,
       fileId,
-      showMaxIter,
-
-      showRegParam,
-      showElasticNetParam,
-      showCategory,
-      showNumOfCluster,
-      showSeed,
-      showTrainingDataSetOccupy,
       selectData,
+      analysis,
     };
   }
 }

+ 46 - 15
src/views/file/FileDetail.vue

@@ -8,12 +8,12 @@
       </el-breadcrumb>
     </div>
     <div class="container">
-      <div class="handle-box" style="width:60%;">
+      <div class="handle-box">
         <el-button plain icon="el-icon-lx-file" @click="handleFileSelect" >选择文件</el-button>
 
-        <el-button type="success" icon="el-icon-search" @click="handleAnalysis">数理分析</el-button>
+        <el-button type="success" icon="el-icon-search" @click="handleAnalysis">统计分析配置</el-button>
 
-        <el-button type="primary" icon="el-icon-plus" @click="createConfig">生成配置文件</el-button>
+        <el-button type="primary" icon="el-icon-plus" @click="createConfig">AI模型配置</el-button>
 
         <el-button type="success" icon="el-icon-thumb" @click="getFeature">自动特征选择</el-button>
 
@@ -45,17 +45,20 @@
       </div>
     </div>
 
-    <el-dialog title="选择字段" v-model="analysisVisible" width="50%">
+    <el-dialog title="新建统计分析配置" v-model="analysisVisible" width="50%">
       <el-form label-width="120px">
-        <el-form-item label="分析方法" required>
-          <el-select v-model="form.type" placeholder="分析方法" class="handle-select mr10" @change="changeMethodMsg">
-            <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-select>
+        <el-form-item label="配置名" required>
+          <el-input v-model="analysisConfName"></el-input>
         </el-form-item>
+<!--        <el-form-item label="分析方法" required>-->
+<!--          <el-select v-model="form.type" placeholder="分析方法" class="handle-select mr10" @change="changeMethodMsg">-->
+<!--            <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-select>-->
+<!--        </el-form-item>-->
         <el-alert type="info"
                   show-icon style="height: 40px;">{{methodMsg.valueOf()}}</el-alert>
         <el-form-item label="方法和字段要求" required>
@@ -72,13 +75,13 @@
       <template #footer>
                 <span class="dialog-footer">
                     <el-button @click="analysisVisible = false">取 消</el-button>
-                    <el-button type="primary" @click="startAnalysis">确 定</el-button>
+                    <el-button type="primary" @click="createAnalysisConfig()">确 定</el-button>
                 </span>
       </template>
     </el-dialog>
 
     <!--数理函数分析结果-->
-    <el-dialog title="分析结果" v-model="resultVisible" width="50%">
+    <el-dialog title="数理函数分析结果" v-model="resultVisible" width="50%">
       <el-form label-width="120px">
         <el-form-item label="分析方法" required>
             {{ AnalysisMethodName[parseInt(form.type)-1] }}
@@ -108,7 +111,7 @@
       </template>
     </el-dialog>
 
-    <el-dialog title="新建配置" v-model="configCreate" width="50%">
+    <el-dialog title="新建AI模型配置" v-model="configCreate" width="50%">
       <el-form label-width="120px">
         <el-form-item label="配置名" required>
           <el-input v-model="form.name"></el-input>
@@ -171,6 +174,7 @@ import {useRoute}from "vue-router";
 import {useRouter}from "vue-router";
 import { toRaw } from '@vue/reactivity'
 import {addConfig,getFeatureSelection} from "../../api/config";
+import {addAnalysisConfig} from "../../api/analysisConfig";
 
 export default {
   name: "config",
@@ -272,11 +276,36 @@ export default {
       // classification:"",
       // feature:"",
     });
+    let analysisConfName = ref();
 
     let idx = -1;
     const handleAnalysis = () => {
+      if (selectData.value.length<1){
+        ElMessage.warning("至少选择一个字段!");
+        return ;
+      }
       analysisVisible.value = true;
     };
+    const createAnalysisConfig = () => {
+      const payload={
+        fileId:selectData.value[0].fileInfoId,
+        userId:1,
+        configName:analysisConfName,
+        chosenColumn:[],
+      }
+        for(let i=0;i<selectData.value.length;i++){
+          payload.chosenColumn.push(selectData.value[i].fieldName);
+        }
+        console.log(payload)
+      addAnalysisConfig(payload).then(res=>{
+        if(res.msg === '成功') {
+          ElMessage.success(`已成功生成配置`);
+          analysisVisible.value = false;
+        }
+        else ElMessage.error(`生成配置失败`);
+      })
+    };
+
     const changeMethodMsg=(value)=>{
       console.log(value)
       if(value===1){
@@ -421,6 +450,7 @@ export default {
       analysisVisible,
       resultVisible,
       form,
+      analysisConfName,
       configCreate,
       createConfig,
       saveConfig,
@@ -432,6 +462,7 @@ export default {
       methodMsg,
       selectModelTypeChange,
       //selectLabelChange,
+      createAnalysisConfig,
       handleSelectChange,
       handleSearch,
       handlePageChange,

+ 1 - 1
src/views/file/FileList.vue

@@ -34,7 +34,7 @@
 
 
         <router-link to="/upload">
-          <el-button type="primary" size="large">文件上传</el-button>
+          <el-button type="primary" size="large" style="margin-top: 20px">文件上传</el-button>
         </router-link>
 
     </div>