Merge pull request #3273 from xinnan-tech/agent-delete-name-confirm

feat: 删除智能体前需要用户进行确认
This commit is contained in:
hrz
2026-07-10 10:39:47 +08:00
committed by GitHub
17 changed files with 598 additions and 36 deletions
+15
View File
@@ -91,6 +91,9 @@ importers:
pinia-plugin-persistedstate:
specifier: 3.2.1
version: 3.2.1(pinia@2.0.36(typescript@5.7.2)(vue@3.5.15(typescript@5.7.2)))
sm-crypto:
specifier: ^0.3.13
version: 0.3.14
vue:
specifier: ^3.4.21
version: 3.5.15(typescript@5.7.2)
@@ -4719,6 +4722,9 @@ packages:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
jsbn@1.1.0:
resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==}
jsdoc-type-pratt-parser@4.1.0:
resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==}
engines: {node: '>=12.0.0'}
@@ -6020,6 +6026,9 @@ packages:
resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==}
engines: {node: '>=18'}
sm-crypto@0.3.14:
resolution: {integrity: sha512-sR7NuGAJH93Om8keAF2/rj1EqFzEiUey4aKGyDo3nQ2BiVqhgq8UkiIoIp5qhV9w4pG7qArhfqyewcG8AbhXbg==}
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
@@ -12652,6 +12661,8 @@ snapshots:
dependencies:
argparse: 2.0.1
jsbn@1.1.0: {}
jsdoc-type-pratt-parser@4.1.0: {}
jsdom@16.7.0:
@@ -14145,6 +14156,10 @@ snapshots:
ansi-styles: 6.2.1
is-fullwidth-code-point: 5.0.0
sm-crypto@0.3.14:
dependencies:
jsbn: 1.1.0
source-map-js@1.2.1: {}
source-map-support@0.5.21:
+7
View File
@@ -71,6 +71,13 @@ export default {
'home.inputPlaceholder': 'z.B. Kundenservice-Assistent, Sprachassistent, Wissens-F&A',
'home.createError': 'Der Name muss zwischen 1 und 64 Zeichen lang sein.',
'home.createNow': 'Jetzt erstellen',
'home.deleteConfirmTitle': 'Agent löschen',
'home.confirmDeleteAgent': 'Das Löschen kann nicht rückgängig gemacht werden. Geben Sie den Agentennamen "{agentName}" ein, um zu bestätigen.',
'home.deleteAgentNamePlaceholder': 'Agentennamen eingeben',
'home.deleteAgentNameMismatch': 'Der Agentenname stimmt nicht überein',
'home.deleteAgentPasteForbidden': 'Bitte geben Sie den Agentennamen manuell ein. Einfügen ist nicht erlaubt.',
'home.deleteAgentMissingInfo': 'Agenteninformationen konnten nicht bestätigt werden. Bitte aktualisieren und erneut versuchen.',
'home.deleteAgentSuccess': 'Agent erfolgreich gelöscht',
'home.justNow': 'Gerade eben',
'home.minutesAgo': 'Minuten her',
'home.hoursAgo': 'Stunden her',
+7
View File
@@ -71,6 +71,13 @@ export default {
'home.inputPlaceholder': 'e.g. Customer Service Assistant, Voice Assistant, Knowledge Q&A',
'home.createError': 'The name length must be between 1 and 64 characters',
'home.createNow': 'Create Now',
'home.deleteConfirmTitle': 'Delete Agent',
'home.confirmDeleteAgent': 'Deletion cannot be undone. Type the agent name "{agentName}" to confirm.',
'home.deleteAgentNamePlaceholder': 'Enter agent name',
'home.deleteAgentNameMismatch': 'The agent name does not match',
'home.deleteAgentPasteForbidden': 'Please type the agent name manually. Pasting is not allowed.',
'home.deleteAgentMissingInfo': 'Unable to confirm agent information. Please refresh and try again.',
'home.deleteAgentSuccess': 'Agent deleted successfully',
'home.justNow': 'Just now',
'home.minutesAgo': 'minutes ago',
'home.hoursAgo': 'hours ago',
+7
View File
@@ -71,6 +71,13 @@ export default {
'home.inputPlaceholder': 'ex: Assistente de Atendimento, Assistente de Voz, Perguntas e Respostas',
'home.createError': 'O comprimento do nome deve estar entre 1 e 64 caracteres',
'home.createNow': 'Criar Agora',
'home.deleteConfirmTitle': 'Excluir Agente',
'home.confirmDeleteAgent': 'A exclusão não pode ser desfeita. Digite o nome do agente "{agentName}" para confirmar.',
'home.deleteAgentNamePlaceholder': 'Digite o nome do agente',
'home.deleteAgentNameMismatch': 'O nome do agente não corresponde',
'home.deleteAgentPasteForbidden': 'Digite o nome do agente manualmente. Colar não é permitido.',
'home.deleteAgentMissingInfo': 'Não foi possível confirmar as informações do agente. Atualize a página e tente novamente.',
'home.deleteAgentSuccess': 'Agente excluído com sucesso',
'home.justNow': 'Agora mesmo',
'home.minutesAgo': 'minutos atrás',
'home.hoursAgo': 'horas atrás',
+7
View File
@@ -71,6 +71,13 @@ export default {
'home.inputPlaceholder': 'ví dụ: Trợ lý chăm sóc khách hàng, Trợ lý giọng nói, Hỏi đáp kiến thức',
'home.createError': 'Độ dài tên phải từ 1 đến 64 ký tự',
'home.createNow': 'Tạo ngay',
'home.deleteConfirmTitle': 'Xóa đại lý',
'home.confirmDeleteAgent': 'Không thể hoàn tác sau khi xóa. Nhập tên đại lý "{agentName}" để xác nhận.',
'home.deleteAgentNamePlaceholder': 'Nhập tên đại lý',
'home.deleteAgentNameMismatch': 'Tên đại lý không khớp',
'home.deleteAgentPasteForbidden': 'Vui lòng nhập thủ công tên đại lý. Không được dán.',
'home.deleteAgentMissingInfo': 'Không thể xác nhận thông tin đại lý. Vui lòng tải lại rồi thử lại.',
'home.deleteAgentSuccess': 'Đã xóa đại lý thành công',
'home.justNow': 'Vừa xong',
'home.minutesAgo': 'phút trước',
'home.hoursAgo': 'giờ trước',
+7
View File
@@ -71,6 +71,13 @@ export default {
'home.inputPlaceholder': '例如:客服助手、语音助理、知识问答',
'home.createError': '名称长度必须在 1 到 64 个字符之间',
'home.createNow': '立即创建',
'home.deleteConfirmTitle': '删除智能体',
'home.confirmDeleteAgent': '删除后无法恢复。请输入智能体名称“{agentName}”确认删除。',
'home.deleteAgentNamePlaceholder': '请输入智能体名称',
'home.deleteAgentNameMismatch': '输入的智能体名称不匹配',
'home.deleteAgentPasteForbidden': '请手动输入智能体名称,不允许粘贴',
'home.deleteAgentMissingInfo': '无法确认智能体信息,请刷新后重试',
'home.deleteAgentSuccess': '智能体删除成功',
'home.justNow': '刚刚',
'home.minutesAgo': '分钟前',
'home.hoursAgo': '小时前',
+7
View File
@@ -92,6 +92,13 @@ export default {
'home.inputPlaceholder': '例如:客服助手、語音助理、知識問答',
'home.createError': '暱稱長度必須在 1 到 64 個字元之間。',
'home.createNow': '立即創建',
'home.deleteConfirmTitle': '刪除智能體',
'home.confirmDeleteAgent': '刪除後無法復原。請輸入智能體名稱「{agentName}」確認刪除。',
'home.deleteAgentNamePlaceholder': '請輸入智能體名稱',
'home.deleteAgentNameMismatch': '輸入的智能體名稱不匹配',
'home.deleteAgentPasteForbidden': '請手動輸入智能體名稱,不允許貼上',
'home.deleteAgentMissingInfo': '無法確認智能體資訊,請重新整理後再試',
'home.deleteAgentSuccess': '智能體刪除成功',
'home.justNow': '剛剛',
'home.minutesAgo': '分鐘前',
'home.hoursAgo': '小時前',
+219 -5
View File
@@ -12,7 +12,7 @@
<script lang="ts" setup>
import type { Agent } from '@/api/agent/types'
import { onMounted, ref } from 'vue'
import { computed, onMounted, ref } from 'vue'
// 在组件挂载后设置导航栏标题
import { useMessage } from 'wot-design-uni'
import useZPaging from 'z-paging/components/z-paging/js/hooks/useZPaging.js'
@@ -53,6 +53,14 @@ const pagingRef = ref()
useZPaging(pagingRef)
// 消息组件
const message = useMessage()
const deleteDialogVisible = ref(false)
const deleteTargetAgent = ref<Agent | null>(null)
const deleteConfirmText = ref('')
const deleteAgentLoading = ref(false)
const isDeleteAgentNameMatched = computed(() => {
return !!deleteTargetAgent.value?.agentName && deleteConfirmText.value === deleteTargetAgent.value.agentName
})
// z-paging查询列表数据
async function queryList(pageNo: number, pageSize: number) {
@@ -89,19 +97,53 @@ async function handleCreateAgent(agentName: string) {
}
}
function openDeleteAgentDialog(agent: Agent) {
if (!agent.id || !agent.agentName) {
toast.error(t('home.deleteAgentMissingInfo'))
return
}
deleteTargetAgent.value = agent
deleteConfirmText.value = ''
deleteDialogVisible.value = true
}
function closeDeleteAgentDialog() {
if (deleteAgentLoading.value)
return
deleteDialogVisible.value = false
deleteTargetAgent.value = null
deleteConfirmText.value = ''
}
function handleDeleteAgentPaste() {
toast.warning(t('home.deleteAgentPasteForbidden'))
}
// 删除智能体
async function handleDeleteAgent(agent: Agent) {
async function handleDeleteAgent() {
if (!deleteTargetAgent.value || !isDeleteAgentNameMatched.value || deleteAgentLoading.value)
return
try {
await deleteAgent(agent.id)
deleteAgentLoading.value = true
await deleteAgent(deleteTargetAgent.value.id)
// 删除成功后刷新列表
pagingRef.value.reload()
toast.success(`${t('home.agentName')}${t('message.deleteSuccess')}`)
toast.success(t('home.deleteAgentSuccess'))
deleteDialogVisible.value = false
deleteTargetAgent.value = null
deleteConfirmText.value = ''
}
catch (error: any) {
console.error('删除智能体失败:', error)
const errorMessage = error?.message || t('message.deleteFail')
toast.error(errorMessage)
}
finally {
deleteAgentLoading.value = false
}
}
// 进入编辑页面
@@ -254,7 +296,7 @@ onMounted(() => {
<template #right>
<view class="swipe-actions">
<view class="action-btn delete-btn" @click.stop="handleDeleteAgent(agent)">
<view class="action-btn delete-btn" @click.stop="openDeleteAgentDialog(agent)">
<wd-icon name="delete" />
<text>{{ t('home.delete') }}</text>
</view>
@@ -283,6 +325,79 @@ onMounted(() => {
<!-- MessageBox 组件 -->
<wd-message-box />
</z-paging>
<wd-popup
v-model="deleteDialogVisible"
position="center"
custom-style="width: 88%; max-width: 420px; border-radius: 16px;"
:close-on-click-modal="!deleteAgentLoading"
safe-area-inset-bottom
@close="closeDeleteAgentDialog"
>
<view class="delete-agent-dialog">
<view class="delete-agent-header">
<text class="delete-agent-title">
{{ t('home.deleteConfirmTitle') }}
</text>
</view>
<view class="delete-agent-body">
<view class="delete-agent-content">
<wd-icon name="warning" custom-class="delete-agent-warning" />
<view class="delete-agent-message">
<text
class="delete-agent-copy-guard delete-agent-tip"
@copy.stop.prevent
@cut.stop.prevent
@contextmenu.stop.prevent
@longpress.stop.prevent
>
{{ t('home.confirmDeleteAgent', { agentName: deleteTargetAgent?.agentName || '' }) }}
</text>
<view
class="delete-agent-copy-guard delete-agent-target"
@copy.stop.prevent
@cut.stop.prevent
@contextmenu.stop.prevent
@longpress.stop.prevent
>
<text>{{ deleteTargetAgent?.agentName || '' }}</text>
</view>
<input
v-model="deleteConfirmText"
class="delete-agent-input"
type="text"
:maxlength="deleteTargetAgent?.agentName?.length || 64"
:placeholder="t('home.deleteAgentNamePlaceholder')"
:disabled="deleteAgentLoading"
@paste.stop.prevent="handleDeleteAgentPaste"
@drop.stop.prevent="handleDeleteAgentPaste"
@contextmenu.stop.prevent
>
<text v-if="deleteConfirmText && !isDeleteAgentNameMatched" class="delete-agent-helper">
{{ t('home.deleteAgentNameMismatch') }}
</text>
</view>
</view>
</view>
<view class="delete-agent-footer">
<wd-button type="info" custom-class="delete-agent-button" :disabled="deleteAgentLoading" @click="closeDeleteAgentDialog">
{{ t('common.cancel') }}
</wd-button>
<wd-button
type="primary"
custom-class="delete-agent-button"
:loading="deleteAgentLoading"
:disabled="!isDeleteAgentNameMatched"
@click="handleDeleteAgent"
>
{{ t('common.confirm') }}
</wd-button>
</view>
</view>
</wd-popup>
</template>
<style lang="scss" scoped>
@@ -587,4 +702,103 @@ onMounted(() => {
text-align: center;
border-top: 1rpx solid #eeeeee;
}
.delete-agent-dialog {
overflow: hidden;
background: #ffffff;
}
.delete-agent-header {
padding: 32rpx 32rpx 20rpx;
border-bottom: 1rpx solid #f0f0f0;
text-align: center;
}
.delete-agent-title {
font-size: 32rpx;
font-weight: 600;
color: #232338;
}
.delete-agent-body {
padding: 32rpx;
}
.delete-agent-content {
display: flex;
align-items: flex-start;
gap: 16rpx;
}
:deep(.delete-agent-warning) {
margin-top: 4rpx;
color: #e6a23c;
font-size: 40rpx;
}
.delete-agent-message {
flex: 1;
min-width: 0;
}
.delete-agent-tip {
display: block;
color: #606266;
font-size: 28rpx;
line-height: 1.6;
}
.delete-agent-target {
box-sizing: border-box;
width: 100%;
margin-top: 20rpx;
padding: 18rpx 20rpx;
border: 1rpx solid #ebeef5;
border-radius: 12rpx;
background: #f5f7fa;
color: #303133;
font-size: 30rpx;
font-weight: 600;
line-height: 1.5;
word-break: break-all;
}
.delete-agent-copy-guard {
user-select: none;
-webkit-user-select: none;
}
.delete-agent-input {
box-sizing: border-box;
width: 100%;
height: 80rpx;
margin-top: 28rpx;
padding: 0 20rpx;
border: 1rpx solid #eeeeee;
border-radius: 12rpx;
background: #f5f7fb;
color: #232338;
font-size: 28rpx;
outline: none;
}
.delete-agent-helper {
display: block;
min-height: 32rpx;
margin-top: 10rpx;
color: #f56c6c;
font-size: 24rpx;
line-height: 1.4;
}
.delete-agent-footer {
display: flex;
gap: 16rpx;
padding: 24rpx 32rpx 32rpx;
border-top: 1rpx solid #eeeeee;
}
:deep(.delete-agent-button) {
flex: 1;
}
</style>
+1 -1
View File
@@ -116,7 +116,7 @@ export default async ({ command, mode }) => {
&& mode === 'production'
&& visualizer({
filename: './node_modules/.cache/visualizer/stats.html',
open: true,
open: false,
gzipSize: true,
brotliSize: true,
}),
@@ -96,7 +96,7 @@ export default {
},
methods: {
handleDelete() {
this.$emit('delete', this.device.agentId)
this.$emit('delete', this.device)
},
handleConfigure() {
this.$router.push({ path: '/role-config', query: { agentId: this.device.agentId } });
+6 -1
View File
@@ -736,7 +736,12 @@ export default {
'home.justNow': 'Gerade eben',
'home.minutesAgo': 'Vor {minutes} Minuten',
'home.hoursAgo': 'Vor {hours} Stunden {minutes} Minuten',
'home.confirmDeleteAgent': 'Sind Sie sicher, dass Sie diesen Agenten löschen möchten?',
'home.deleteConfirmTitle': 'Agent löschen',
'home.confirmDeleteAgent': 'Das Löschen kann nicht rückgängig gemacht werden. Geben Sie den Agentennamen "{agentName}" ein, um zu bestätigen.',
'home.deleteAgentNamePlaceholder': 'Agentennamen eingeben',
'home.deleteAgentNameMismatch': 'Der Agentenname stimmt nicht überein',
'home.deleteAgentPasteForbidden': 'Bitte geben Sie den Agentennamen manuell ein. Einfügen ist nicht erlaubt.',
'home.deleteAgentMissingInfo': 'Agenteninformationen konnten nicht bestätigt werden. Bitte aktualisieren und erneut versuchen.',
'home.deleteSuccess': 'Löschen erfolgreich',
'home.deleteFailed': 'Löschen fehlgeschlagen',
'home.enableMemory': 'Bitte aktivieren Sie zuerst den Speicher auf der \"Rolle konfigurieren\" Seite',
+6 -1
View File
@@ -736,7 +736,12 @@ export default {
'home.justNow': 'Just now',
'home.minutesAgo': '{minutes} minutes ago',
'home.hoursAgo': '{hours} hours {minutes} minutes ago',
'home.confirmDeleteAgent': 'Are you sure you want to delete this agent?',
'home.deleteConfirmTitle': 'Delete Agent',
'home.confirmDeleteAgent': 'Deletion cannot be undone. Type the agent name "{agentName}" to confirm.',
'home.deleteAgentNamePlaceholder': 'Enter agent name',
'home.deleteAgentNameMismatch': 'The agent name does not match',
'home.deleteAgentPasteForbidden': 'Please type the agent name manually. Pasting is not allowed.',
'home.deleteAgentMissingInfo': 'Unable to confirm agent information. Please refresh and try again.',
'home.deleteSuccess': 'Delete successful',
'home.deleteFailed': 'Delete failed',
'home.enableMemory': 'Please enable memory in the "Config Role" page first',
+6 -1
View File
@@ -736,7 +736,12 @@ export default {
'home.justNow': 'Agora mesmo',
'home.minutesAgo': 'Há {minutes} minutos',
'home.hoursAgo': 'Há {hours} horas e {minutes} minutos',
'home.confirmDeleteAgent': 'Tem certeza de que deseja excluir este agente?',
'home.deleteConfirmTitle': 'Excluir Agente',
'home.confirmDeleteAgent': 'A exclusão não pode ser desfeita. Digite o nome do agente "{agentName}" para confirmar.',
'home.deleteAgentNamePlaceholder': 'Digite o nome do agente',
'home.deleteAgentNameMismatch': 'O nome do agente não corresponde',
'home.deleteAgentPasteForbidden': 'Digite o nome do agente manualmente. Colar não é permitido.',
'home.deleteAgentMissingInfo': 'Não foi possível confirmar as informações do agente. Atualize a página e tente novamente.',
'home.deleteSuccess': 'Excluído com sucesso',
'home.deleteFailed': 'Falha ao excluir',
'home.enableMemory': 'Por favor, ative a memória na página "Configurar Papel" primeiro',
+6 -1
View File
@@ -736,7 +736,12 @@ export default {
'home.justNow': 'Vừa xong',
'home.minutesAgo': '{minutes} phút trước',
'home.hoursAgo': '{hours} giờ {minutes} phút trước',
'home.confirmDeleteAgent': 'Bạn có chắc chắn muốn xóa tác nhân này?',
'home.deleteConfirmTitle': 'Xóa đại lý',
'home.confirmDeleteAgent': 'Không thể hoàn tác sau khi xóa. Nhập tên tác nhân "{agentName}" để xác nhận.',
'home.deleteAgentNamePlaceholder': 'Nhập tên tác nhân',
'home.deleteAgentNameMismatch': 'Tên tác nhân không khớp',
'home.deleteAgentPasteForbidden': 'Vui lòng nhập thủ công tên tác nhân. Không được dán.',
'home.deleteAgentMissingInfo': 'Không thể xác nhận thông tin tác nhân. Vui lòng tải lại rồi thử lại.',
'home.deleteSuccess': 'Xóa thành công',
'home.deleteFailed': 'Xóa thất bại',
'home.enableMemory': 'Vui lòng bật bộ nhớ trong trang \"Cấu hình vai trò\" trước',
+6 -1
View File
@@ -736,7 +736,12 @@ export default {
'home.justNow': '刚刚',
'home.minutesAgo': '{minutes}分钟前',
'home.hoursAgo': '{hours}小时{minutes}分钟前',
'home.confirmDeleteAgent': '确定要删除智能体吗?',
'home.deleteConfirmTitle': '删除智能体',
'home.confirmDeleteAgent': '删除后无法恢复。请输入智能体名称“{agentName}”确认删除。',
'home.deleteAgentNamePlaceholder': '请输入智能体名称',
'home.deleteAgentNameMismatch': '输入的智能体名称不匹配',
'home.deleteAgentPasteForbidden': '请手动输入智能体名称,不允许粘贴',
'home.deleteAgentMissingInfo': '无法确认智能体信息,请刷新后重试',
'home.deleteSuccess': '删除成功',
'home.deleteFailed': '删除失败',
'home.enableMemory': '请先在“配置角色”界面开启记忆',
+6 -1
View File
@@ -736,7 +736,12 @@ export default {
'home.justNow': '剛剛',
'home.minutesAgo': '{minutes}分鐘前',
'home.hoursAgo': '{hours}小時{minutes}分鐘前',
'home.confirmDeleteAgent': '確定要刪除智能體嗎?',
'home.deleteConfirmTitle': '刪除智能體',
'home.confirmDeleteAgent': '刪除後無法復原。請輸入智能體名稱「{agentName}」確認刪除。',
'home.deleteAgentNamePlaceholder': '請輸入智能體名稱',
'home.deleteAgentNameMismatch': '輸入的智能體名稱不匹配',
'home.deleteAgentPasteForbidden': '請手動輸入智能體名稱,不允許貼上',
'home.deleteAgentMissingInfo': '無法確認智能體資訊,請重新整理後再試',
'home.deleteSuccess': '刪除成功',
'home.deleteFailed': '刪除失敗',
'home.enableMemory': '請先在「配置角色」介面開啟記憶',
+282 -21
View File
@@ -73,6 +73,60 @@
</div>
</div>
<AddWisdomBodyDialog :visible.sync="addDeviceDialogVisible" @confirm="handleWisdomBodyAdded" />
<el-dialog
:visible.sync="deleteAgentDialogVisible"
:close-on-click-modal="!isDeletingAgent"
:close-on-press-escape="!isDeletingAgent"
:show-close="!isDeletingAgent"
width="520px"
append-to-body
class="delete-agent-dialog"
@closed="resetDeleteAgentDialog"
>
<template slot="title">
<div class="delete-agent-title">
<img src="@/assets/knowledge-base/level.png" class="delete-agent-title-icon" />
<span>{{ $t('home.deleteConfirmTitle') }}</span>
</div>
</template>
<div class="delete-agent-content">
<i class="el-icon-warning-outline delete-agent-warning"></i>
<div class="delete-agent-message">
<div class="delete-agent-copy-guard" @copy.prevent @cut.prevent @contextmenu.prevent>
{{ $t('home.confirmDeleteAgent', { agentName: deleteTargetAgentName }) }}
</div>
<div class="delete-agent-target delete-agent-copy-guard" @copy.prevent @cut.prevent @contextmenu.prevent>
{{ deleteTargetAgentName }}
</div>
<el-input
ref="deleteAgentConfirmInput"
v-model="deleteAgentConfirmText"
class="delete-agent-input"
:placeholder="$t('home.deleteAgentNamePlaceholder')"
clearable
@paste.native.prevent="handleDeleteAgentPaste"
@drop.native.prevent="handleDeleteAgentPaste"
@contextmenu.native.prevent
@keyup.enter.native="confirmDeleteAgent"
/>
<div v-if="deleteAgentConfirmText && !isDeleteAgentNameMatched" class="delete-agent-helper">
{{ $t('home.deleteAgentNameMismatch') }}
</div>
</div>
</div>
<span slot="footer" class="delete-agent-footer">
<el-button class="delete-agent-cancel" :disabled="isDeletingAgent" @click="closeDeleteAgentDialog">{{ $t('button.cancel') }}</el-button>
<el-button
class="delete-agent-confirm"
type="primary"
:loading="isDeletingAgent"
:disabled="!isDeleteAgentNameMatched"
@click="confirmDeleteAgent"
>
{{ $t('button.ok') }}
</el-button>
</span>
</el-dialog>
</el-main>
<el-footer>
<version-footer />
@@ -116,6 +170,11 @@ export default {
search: "",
showHistory: false,
searchHistory: [],
deleteAgentDialogVisible: false,
deleteTargetAgentId: '',
deleteTargetAgentName: '',
deleteAgentConfirmText: '',
isDeletingAgent: false,
}
},
@@ -123,6 +182,9 @@ export default {
...mapState({
userInfo: (state) => state.userInfo,
}),
isDeleteAgentNameMatched() {
return !!this.deleteTargetAgentName && this.deleteAgentConfirmText === this.deleteTargetAgentName;
},
},
async mounted() {
@@ -193,27 +255,61 @@ export default {
});
},
// 删除智能体
handleDeleteAgent(agentId) {
this.$confirm(this.$t('home.confirmDeleteAgent'), '提示', {
confirmButtonText: this.$t('button.ok'),
cancelButtonText: this.$t('button.cancel'),
type: 'warning'
}).then(() => {
Api.agent.deleteAgent(agentId, (res) => {
if (res.data.code === 0) {
this.$message.success({
message: this.$t('home.deleteSuccess'),
showClose: true
});
this.fetchAgentList(); // 刷新列表
} else {
this.$message.error({
message: res.data.msg || this.$t('home.deleteFailed'),
showClose: true
});
}
});
}).catch(() => { });
handleDeleteAgent(device) {
const targetAgent = typeof device === 'object'
? device
: this.devices.find((item) => item.agentId === device || item.id === device);
const agentId = targetAgent?.agentId || targetAgent?.id;
const agentName = targetAgent?.agentName || '';
if (!agentId || !agentName) {
this.$message.error(this.$t('home.deleteAgentMissingInfo'));
return;
}
this.deleteTargetAgentId = agentId;
this.deleteTargetAgentName = agentName;
this.deleteAgentConfirmText = '';
this.deleteAgentDialogVisible = true;
this.$nextTick(() => {
if (this.$refs.deleteAgentConfirmInput) {
this.$refs.deleteAgentConfirmInput.focus();
}
});
},
handleDeleteAgentPaste() {
this.$message.warning(this.$t('home.deleteAgentPasteForbidden'));
},
closeDeleteAgentDialog() {
if (this.isDeletingAgent) return;
this.deleteAgentDialogVisible = false;
},
resetDeleteAgentDialog() {
this.deleteTargetAgentId = '';
this.deleteTargetAgentName = '';
this.deleteAgentConfirmText = '';
this.isDeletingAgent = false;
},
confirmDeleteAgent() {
if (!this.isDeleteAgentNameMatched || this.isDeletingAgent) return;
this.isDeletingAgent = true;
Api.agent.deleteAgent(this.deleteTargetAgentId, (res) => {
this.isDeletingAgent = false;
if (res.data.code === 0) {
this.$message.success({
message: this.$t('home.deleteSuccess'),
showClose: true
});
this.deleteAgentDialogVisible = false;
this.fetchAgentList(); // 刷新列表
} else {
this.$message.error({
message: res.data.msg || this.$t('home.deleteFailed'),
showClose: true
});
}
});
},
handleShowChatHistory({ agentId, agentName }) {
this.currentAgentId = agentId;
@@ -641,4 +737,169 @@ export default {
rgba(255, 255, 255, 0));
animation: shimmer 1.5s infinite;
}
.delete-agent-content {
display: flex;
gap: 12px;
align-items: flex-start;
}
.delete-agent-title {
display: inline-flex;
align-items: center;
font-size: 18px;
font-weight: 500;
color: #2f3a5f;
}
.delete-agent-title-icon {
width: 24px;
height: 24px;
margin-right: 8px;
}
.delete-agent-warning {
color: #e6a23c;
font-size: 24px;
margin-top: 4px;
}
.delete-agent-message {
flex: 1;
color: #606266;
font-size: 14px;
line-height: 1.6;
}
.delete-agent-target {
margin-top: 14px;
padding: 10px 12px;
border: 1px solid #ebeef5;
border-radius: 4px;
background: #f5f7fa;
color: #303133;
font-weight: 600;
word-break: break-all;
}
.delete-agent-copy-guard {
user-select: none;
-webkit-user-select: none;
}
.delete-agent-input {
margin-top: 16px;
}
.delete-agent-input::v-deep .el-input__inner {
height: 42px;
border-color: #d8dce8;
border-radius: 4px;
background: #fff;
color: #303133;
font-size: 14px;
}
.delete-agent-helper {
min-height: 18px;
margin-top: 6px;
color: #f56c6c;
font-size: 12px;
}
.delete-agent-footer {
display: inline-flex;
gap: 10px;
}
.delete-agent-dialog::v-deep .el-dialog {
border-radius: 10px;
overflow: hidden;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.delete-agent-dialog::v-deep .el-dialog__header {
padding: 16px 20px 12px;
background: linear-gradient(135deg, #e2eeff, #edeafe);
text-align: left;
}
.delete-agent-dialog::v-deep .el-dialog__headerbtn {
top: 12px;
right: 16px;
width: 32px;
height: 32px;
border: none;
border-radius: 50%;
background: #fff;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);
display: flex;
align-items: center;
justify-content: center;
}
.delete-agent-dialog::v-deep .el-dialog__headerbtn .el-dialog__close {
font-size: 18px;
color: #666;
position: static;
transform: none;
}
.delete-agent-dialog::v-deep .el-dialog__headerbtn:hover {
background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.18);
}
.delete-agent-dialog::v-deep .el-dialog__headerbtn:hover .el-dialog__close {
color: #333;
}
.delete-agent-dialog::v-deep .el-dialog__body {
padding: 28px 32px 20px;
}
.delete-agent-dialog::v-deep .el-dialog__footer {
padding: 12px 32px 24px;
}
.delete-agent-cancel,
.delete-agent-confirm {
min-width: 92px;
height: 40px;
padding: 0 20px;
border-radius: 6px;
font-size: 15px;
}
.delete-agent-cancel {
color: #fff;
background: #4d94f7;
border: none;
}
.delete-agent-cancel:hover,
.delete-agent-cancel:focus {
color: #fff;
background: #4d94f7;
opacity: 0.88;
}
.delete-agent-confirm {
background: linear-gradient(to right, #4a7cfd, #8154fc);
border: none;
}
.delete-agent-confirm:hover,
.delete-agent-confirm:focus {
background: linear-gradient(to right, #4a7cfd, #8154fc);
opacity: 0.88;
}
.delete-agent-confirm.is-disabled,
.delete-agent-confirm.is-disabled:hover,
.delete-agent-confirm.is-disabled:focus {
background: linear-gradient(to right, #4a7cfd, #8154fc);
border: none;
opacity: 0.45;
}
</style>