mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-22 23:23:55 +08:00
feat: require agent name confirmation before delete
This commit is contained in:
@@ -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',
|
||||
@@ -1554,4 +1559,4 @@ export default {
|
||||
// Header navigation
|
||||
'header.addressBook': 'Adressbuch',
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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',
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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',
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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ạ',
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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}年前',
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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}年前',
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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