feat: require agent name confirmation before delete

This commit is contained in:
Tyke Chen
2026-07-09 15:03:12 +08:00
parent 8808b69303
commit 9301c1889f
17 changed files with 597 additions and 41 deletions
@@ -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>
+7 -2
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',
@@ -1554,4 +1559,4 @@ export default {
// Header navigation
'header.addressBook': 'Adressbuch',
}
}
+7 -2
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',
@@ -1554,4 +1559,4 @@ export default {
// Header navigation
'header.addressBook': 'Address Book',
}
}
+7 -2
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',
@@ -1554,4 +1559,4 @@ export default {
// Header navigation
'header.addressBook': 'Lista de Contatos',
}
}
+7 -2
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',
@@ -1554,4 +1559,4 @@ export default {
// Header navigation
'header.addressBook': 'Danh bạ',
}
}
+7 -2
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': '请先在“配置角色”界面开启记忆',
@@ -1551,4 +1556,4 @@ export default {
'addressBookManagement.monthsAgo': '{months}个月前',
'addressBookManagement.yearsAgo': '{years}年前',
}
}
+7 -2
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': '請先在「配置角色」介面開啟記憶',
@@ -1553,4 +1558,4 @@ export default {
'addressBookManagement.monthsAgo': '{months}個月前',
'addressBookManagement.yearsAgo': '{years}年前',
}
}
+283 -22
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;
}
</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>