mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-21 22:53:56 +08:00
Merge pull request #3273 from xinnan-tech/agent-delete-name-confirm
feat: 删除智能体前需要用户进行确认
This commit is contained in:
Generated
+15
@@ -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:
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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': '小时前',
|
||||
|
||||
@@ -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': '小時前',
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 } });
|
||||
@@ -212,4 +212,4 @@ export default {
|
||||
.device-item-tooltip[x-placement^="bottom"] .popper__arrow {
|
||||
border-bottom-color: transparent !important;
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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': '请先在“配置角色”界面开启记忆',
|
||||
|
||||
@@ -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': '請先在「配置角色」介面開啟記憶',
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
</style>
|
||||
|
||||
.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>
|
||||
|
||||
Reference in New Issue
Block a user