From 72b025d6b43271ae88541ea23c92070b3b2acc96 Mon Sep 17 00:00:00 2001
From: sd <shidong@jhsoft.cc>
Date: 星期二, 05 八月 2025 16:15:44 +0800
Subject: [PATCH] 模型训练-批量批注、批量删除以及批量导入功能实现

---
 src/pages/modelTuning/components/leftSelect.vue |  173 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 157 insertions(+), 16 deletions(-)

diff --git a/src/pages/modelTuning/components/leftSelect.vue b/src/pages/modelTuning/components/leftSelect.vue
index cfa265a..68bc54c 100644
--- a/src/pages/modelTuning/components/leftSelect.vue
+++ b/src/pages/modelTuning/components/leftSelect.vue
@@ -1,24 +1,27 @@
 <template>
     <div class="tag-manager">
+
         <!-- 鎼滅储妗� -->
-        <el-input v-model="searchQuery" placeholder="鎼滅储" class="search-input" :prefix-icon="SearchIcon" clearable />
+        <el-input v-model="searchQuery" @change="handleSearch" placeholder="鎼滅储" class="search-input" :prefix-icon="SearchIcon" clearable />
 
         <!-- 鏍囩鍖哄煙 -->
         <div class="tags-section">
             <div class="header">
                 <div class="title">鍏ㄩ儴鏍囩</div>
-                <img src="@/assets/img/娣诲姞鏍囩.png" class="btn-icon" />
+                <img v-if="!addProm" src="@/assets/img/娣诲姞鏍囩.png" class="btn-icon" @click.stop="addTag()" />
+                <!-- <img v-else src="@/assets/img/缂栬緫鏍囩.png" class="btn-icon" @click.stop="addTag()" /> -->
             </div>
 
             <div class="tags-list">
+                <el-input v-if="addProm" v-model="input" placeholder=""></el-input>
                 <!-- 淇敼锛氫负姣忎釜鏍囩椤规坊鍔犳搷浣滄寜閽尯鍩� -->
                 <div v-for="tag in tags" :key="tag.id" class="tag-container">
                     <div :class="['tag-item', { active: tag.active }]" @click="selectTag(tag)">
-                        {{ tag.name }}
+                        {{ tag.tagName }}
                     </div>
                     <!-- 缂栬緫鍜屽垹闄ゆ寜閽紙楂樹寒鏃舵樉绀猴級 -->
                     <div v-show="tag.active" class="tag-actions">
-                        <i style="cursor: pointer" class="el-icon-edit edit-btn" @click.stop="editTag(tag)" ></i>
+                        <i style="cursor: pointer" class="el-icon-edit edit-btn" @click.stop="editTag(tag)"></i>
                         <i style="cursor: pointer" class="el-icon-delete delete-btn" @click.stop="deleteTag(tag)"></i>
                         <!-- <el-button icon="el-icon-edit" circle class="edit-btn" @click.stop="editTag(tag)" />
                         <el-button icon="el-icon-delete" circle type="danger" @click.stop="deleteTag(tag)" /> -->
@@ -30,34 +33,164 @@
 </template>
 
 <script>
+import { getTrainTags, saveTrainTags, updateTrainTags, deleteTrainTags } from "@/api/modelTuning";
 export default {
     name: 'TagManager',
     data() {
         return {
+            addProm: false,
             searchQuery: '',
             tags: [
-                { id: 1, name: '鎵撶數璇�', active: true },
-                { id: 2, name: '鍚哥儫', active: false },
-                { id: 3, name: '浣╂埓瀹夊叏甯�', active: false },
-                { id: 4, name: '鏈僵鎴村畨鍏ㄥ附', active: false }
+                { id: 1, tagName: '鎵撶數璇�', active: true },
+                { id: 2, tagName: '鍚哥儫', active: false },
+                { id: 3, tagName: '浣╂埓瀹夊叏甯�', active: false },
+                { id: 4, tagName: '鏈僵鎴村畨鍏ㄥ附', active: false }
             ],
             SearchIcon: 'el-icon-search'
         }
     },
+    mounted() {
+        this.fetchSelectData()
+    },
     methods: {
+        // 澶勭悊鎼滅储
+        handleSearch() {
+            console.log('鎵ц鎼滅储:', this.searchQuery);
+            this.fetchSelectData({
+                searchName:this.searchQuery
+            })
+        },
+        async fetchSelectData(res) {
+            this.tags = []
+            let rspc = await getTrainTags(res);
+            if (rspc && rspc.status === 200) {
+                let list = rspc.data.list;
+                for (let i = 0; i < list.length; i++) {
+                    let item = {}
+                    if (i == 0) {
+                        item = {
+                            active: true,
+                            id: list[i].id,
+                            tagName: list[i].tagName
+                        }
+                    } else {
+                        item = {
+                            active: false,
+                            id: list[i].id,
+                            tagName: list[i].tagName
+
+                        }
+                    }
+                    this.tags.push(item)
+                    this.$emit('change-trainId', this.tags[0].id);
+                }
+            }
+        },
         selectTag(selectedTag) {
             this.tags.forEach(tag => {
                 tag.active = tag.id === selectedTag.id;
+            });
+            this.$emit('change-trainId', selectedTag.id);
+        },
+        addTag() {
+            console.log('娣诲姞鏍囩:');
+            // this.addProm = true
+            // 杩欓噷娣诲姞缂栬緫鏍囩鐨勫疄闄呴�昏緫
+            this.$prompt('璇疯緭鍏ユ爣绛惧悕绉�', '', {
+                confirmButtonText: '纭畾',
+                cancelButtonText: '鍙栨秷',
+                inputValidator: (value) => {
+                    // 楠岃瘉杈撳叆鍊硷細鍘婚櫎棣栧熬绌烘牸鍚庝笉鑳戒负绌�
+                    if (!value || value.trim() === '') {
+                        return '杈撳叆鍐呭涓嶈兘涓虹┖';  // 杩斿洖閿欒鎻愮ず
+                    }
+                    return true;  // 楠岃瘉閫氳繃
+                }
+            }).then(async ({ value }) => {
+                let rspc = await saveTrainTags({
+                    tagName: value
+                });
+                if (rspc && rspc.status === 200) {
+                    this.$message({
+                        type: 'success',
+                        message: '鎴愬姛'
+                    });
+                    this.fetchSelectData()
+                } else {
+                    this.$message({
+                        type: 'error',
+                        message: rspc.msg
+                    });
+
+                }
+            }).catch(() => {
+                console.info("鍙栨秷")
             });
         },
         editTag(tag) {
             console.log('缂栬緫鏍囩:', tag);
             // 杩欓噷娣诲姞缂栬緫鏍囩鐨勫疄闄呴�昏緫
+            this.$prompt('璇疯緭鍏ユ爣绛惧悕绉�', '', {
+                confirmButtonText: '纭畾',
+                cancelButtonText: '鍙栨秷',
+                inputValue: tag.tagName, // 璁剧疆榛樿鍊�
+                inputValidator: (value) => {
+                    // 楠岃瘉杈撳叆鍊硷細鍘婚櫎棣栧熬绌烘牸鍚庝笉鑳戒负绌�
+                    if (!value || value.trim() === '') {
+                        return '杈撳叆鍐呭涓嶈兘涓虹┖';  // 杩斿洖閿欒鎻愮ず
+                    }
+                    return true;  // 楠岃瘉閫氳繃
+                }
+            }).then(async ({ value }) => {
+                let rspc = await updateTrainTags({
+                    id: tag.id,
+                    tagName: value
+                });
+                if (rspc && rspc.status === 200) {
+                    this.$message({
+                        type: 'success',
+                        message: '鎴愬姛'
+                    });
+                    this.fetchSelectData()
+                } else {
+                    this.$message({
+                        type: 'error',
+                        message: rspc.msg
+                    });
+
+                }
+            }).catch(() => {
+                console.info("鍙栨秷")
+            });
         },
         deleteTag(tag) {
-            console.log('鍒犻櫎鏍囩:', tag);
+            // console.log('鍒犻櫎鏍囩:', tag);
             // 杩欓噷娣诲姞鍒犻櫎鏍囩鐨勫疄闄呴�昏緫
-            this.tags = this.tags.filter(t => t.id !== tag.id);
+            this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ爣绛�, 鏄惁缁х画?', '鎻愮ず', {
+                confirmButtonText: '纭畾',
+                cancelButtonText: '鍙栨秷',
+                type: 'warning'
+            }).then(async () => {
+                let rspc = await deleteTrainTags({
+                    id: tag.id,
+                });
+                if (rspc && rspc.status === 200) {
+                    this.$message({
+                        type: 'success',
+                        message: '鎴愬姛'
+                    });
+                    this.fetchSelectData()
+                } else {
+                    this.$message({
+                        type: 'error',
+                        message: rspc.msg
+                    });
+
+                }
+            }).catch(() => {
+                console.info("鍙栨秷")
+                
+            });
         }
     }
 }
@@ -124,12 +257,14 @@
     color: #606266;
     border: none;
 }
+
 /* 鏂板锛氭爣绛惧鍣� */
 .tag-container {
     display: flex;
     align-items: center;
     justify-content: space-between;
-    margin-right: 10px; /* 涓庡浘鐗囧彸渚ч棿璺濅竴鑷� */
+    margin-right: 10px;
+    /* 涓庡浘鐗囧彸渚ч棿璺濅竴鑷� */
 }
 
 /* 淇敼锛氭爣绛鹃」瀹藉害鑷�傚簲 */
@@ -138,7 +273,8 @@
     font-size: 16px;
     color: #909399;
     cursor: pointer;
-    padding: 8px 12px; /* 澧炲姞鐐瑰嚮鍖哄煙 */
+    padding: 8px 12px;
+    /* 澧炲姞鐐瑰嚮鍖哄煙 */
 }
 
 /* 鏂板锛氭搷浣滄寜閽尯鍩熸牱寮� */
@@ -146,7 +282,8 @@
     /* margin-left: 10px; */
     display: flex;
     gap: 5px;
-    background-color: #ecf5ff; /* 娣诲姞娴呰摑鑹茶儗鏅珮浜� */
+    background-color: #ecf5ff;
+    /* 娣诲姞娴呰摑鑹茶儗鏅珮浜� */
     height: 39.31px;
     align-items: center;
 }
@@ -154,10 +291,12 @@
 /* 鏂板锛氱紪杈戞寜閽牱寮� */
 .edit-btn {
     margin-right: 10px;
-    color: #409EFF; /* 钃濊壊缂栬緫鍥炬爣 */
+    color: #409EFF;
+    /* 钃濊壊缂栬緫鍥炬爣 */
     border-color: #409EFF;
     font-size: 20px;
 }
+
 .delete-btn {
     color: #F17777;
     border-color: #F17777;
@@ -168,10 +307,12 @@
 .tag-item.active {
     font-weight: bold;
     color: #303133;
-    background-color: #ecf5ff; /* 娣诲姞娴呰摑鑹茶儗鏅珮浜� */
+    background-color: #ecf5ff;
+    /* 娣诲姞娴呰摑鑹茶儗鏅珮浜� */
     /* border-radius: 4px; */
 }
-.btn-icon{
+
+.btn-icon {
     width: 20px;
 }
 </style>
\ No newline at end of file

--
Gitblit v1.8.0