Files
xiaozhi-esp32-server/main/manager-web/src/components/AddWisdomBodyDialog.vue
T
hrz 7a260ee143 弹框关掉后再点不开以及宽度高度统一收口 (#3388)
* 统一管理后台弹框更舒展

把 CustomDialog 默认宽度从 600 加到 720,正文给到至少 360 的高度,
默认弹框就不再显得局促。参数编辑弹框也跟着加宽。智能体历史版
本那条列表、对比和恢复预览都给到至少 420 的最小高度,避免内容
少时框太矮看起来小气。其他像添加智能体、绑定设备这些原本就合适
的弹框没动。

* 弹框外观统一收口

原本几个弹框长得参差不齐:标题字号、按钮文案、留白高度各管各的。这次把新建智能体、新建设备、改模型、改参数这几个弹框接到同一个底座上,按钮统一成「确定」「取消」,输入框字号高度对齐,遮罩背景加了模糊,弹框太高就内部滚动,四个弹框看起来一个模子

* 修复弹框关掉后再点不开

之前几个弹框改用新底座的时候,关闭那一路少了一段转发:父页面用双向绑定来收弹框关闭的信号,子页面应该再把关闭事件抛上去告诉父页面。这一段被删了,下次再点添加按钮时父页面那边状态没复位,弹框就拉不开来。现在把这段补回去。

* 弹框宽度和高度统一收口

同一批弹框的尺寸还是各管各的:模型配置里改参数那个是跟着窗口大小按比例伸缩,历史提示词的源编辑弹框是 900 像素,参数管理里又是 720 像素,智能体变更详情那个上下还留了一大块空白。这次收到同一个共用底子上:宽度都对齐到 720 像素,弹框默认上下贴齐屏幕边、内容多时中间滚动,变更详情那个高度撑到接近屏幕顶到底。

* 管理后台弹框按大小分类统一外观

管理后台里的弹框按大小分成两类来收口。占整页的大弹框(历史版本、变更详情、模型修改、模型参数修正等)撑满整个浏览器高度,下面不再留白;小弹框(添加智能体、添加设备、知识库、字典、角色模板等)改成对齐屏幕正中,不再顶在屏幕上沿。修改模型那条弹框也加宽到 960,左右留白加大到 40,跟历史版本对齐,看起来更舒展。

* 大弹框上下留白收口到十像素并按三档统一宽度

大弹框上下各留十像素让边框和圆角清晰可见。宽度按用途分三档:表单 960、含代码 1080、表格 80% 加宽度上限。供应器、上下文供应器、音色克隆都改 960;TTS 从 90% 改 80%;角色模板从 1200 改 1080;缓存查看从 70% 改 80%。新增模板的大文本框改成自适应高度。

* 弹框样式与文案收口处理

AddDeviceDialog 确认后关闭弹框;CustomDialog 去掉 :global 与紧邻选择器,合并 el-dialog__body 样式块;删除未使用的 --dialog-form/--dialog-code;AddWisdomBodyDialog 的 cancel/handleClose 委托到同一个实现;多语言文案同步去冒号与双点。

* 弹框遮罩样式移到全局作用域

scoped 块里的 ::v-deep .v-modal 打不到 body 层的遮罩,改在 global.scss 用全局选择器。

* 弹框 wrapper 居中样式移到全局作用域

scoped 块里的 ::v-deep .el-dialog__wrapper 同样打不到 element-ui 自渲染的 wrapper,跟 .v-modal 一起挪到 global.scss。

* 弹框提交状态异常收口

设备激活码错误路径不再卡 loading;Provider 与固件弹框补 loading 兜底。

* 弹框视觉异常收口

首页删除确认弹框 wrapper 居中;历史版本弹框去掉内层多余滚动条。

* 设备 API 链式返回修复

bindDevice 等方法补上 return,让 .fail() 兜底回调能正常注册到请求对象上。

* 设备 API 错误回调参数补全

device.js 六个方法加 failCallback 参数;user.js login 网络重试补 failCallback;AddDeviceDialog 改四参数签名。

* 设备状态 API 失败回调引用修复

getDeviceStatus 的 .fail() 块把函数体内 callback(res) 改成与签名一致的 if (failCallback) failCallback(err),避免业务错误时抛 ReferenceError。
2026-10-07 08:03:25 +08:00

102 lines
2.2 KiB
Vue

<template>
<CustomDialog
:title="$t('addAgentDialog.title')"
:visible.sync="visible"
width="420px"
@confirm="confirm"
@cancel="cancel"
@close="handleClose"
:confirmText="$t('addAgentDialog.confirm')"
:cancelText="$t('addAgentDialog.cancel')"
@open="handleOpen"
>
<div class="add-agent-body">
<div class="add-agent-label">
<span class="required">*</span>
{{ $t('addAgentDialog.agentName') }}
</div>
<el-input
maxLength="64"
ref="inputRef"
:placeholder="$t('addAgentDialog.placeholder')"
v-model="wisdomBodyName"
class="add-agent-input"
@keyup.enter.native="confirm"
/>
</div>
</CustomDialog>
</template>
<script>
import Api from '@/apis/api';
import CustomDialog from './CustomDialog.vue';
export default {
name: 'AddWisdomBodyDialog',
components: { CustomDialog },
props: {
visible: { type: Boolean, required: true }
},
data() {
return {
wisdomBodyName: ""
}
},
methods: {
handleOpen() {
this.$nextTick(() => {
if (this.$refs.inputRef && this.$refs.inputRef.focus) {
this.$refs.inputRef.focus();
}
});
},
confirm() {
if (!this.wisdomBodyName.trim()) {
this.$message.error(this.$t('addAgentDialog.nameRequired'));
return;
}
Api.agent.addAgent(this.wisdomBodyName, (res) => {
this.$message.success({
message: this.$t('addAgentDialog.addSuccess'),
showClose: true
});
this.$emit('confirm', res);
this.$emit('update:visible', false);
this.wisdomBodyName = "";
});
},
cancel() {
this.wisdomBodyName = "";
this.$emit('update:visible', false);
},
handleClose() {
this.cancel();
}
}
}
</script>
<style scoped>
.add-agent-body {
padding: 6px 4px 4px;
}
.add-agent-label {
font-size: 14px;
color: #475569;
text-align: left;
margin-bottom: 12px;
}
.add-agent-label .required {
color: #f56c6c;
margin-right: 2px;
}
.add-agent-input ::v-deep(.el-input__inner) {
height: 40px;
border-radius: 8px;
border-color: #e2e8f0;
font-size: 14px;
}
</style>