From 98a14830328c95f7ad83baf7bb243c4f41da8de4 Mon Sep 17 00:00:00 2001 From: rainv123 <2148537152@qq.com> Date: Thu, 11 Sep 2025 17:10:50 +0800 Subject: [PATCH 1/4] =?UTF-8?q?updata:=E6=99=BA=E6=8E=A7=E5=8F=B0=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=B7=BB=E5=8A=A0=E8=AF=AD=E8=A8=80=E5=88=87=E6=8D=A2?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E4=B8=AD=E8=8B=B1=E7=B9=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/manager-web/package.json | 1 + main/manager-web/src/App.vue | 63 +- .../src/components/AddDeviceDialog.vue | 16 +- .../src/components/AddModelDialog.vue | 38 +- .../src/components/AddWisdomBodyDialog.vue | 14 +- .../src/components/CacheViewer.vue | 62 +- .../src/components/ChangePasswordDialog.vue | 31 +- .../src/components/ChatHistoryDialog.vue | 12 +- .../manager-web/src/components/DeviceItem.vue | 48 +- .../src/components/DictDataDialog.vue | 22 +- .../src/components/DictTypeDialog.vue | 20 +- .../src/components/EditVoiceDialog.vue | 34 +- .../src/components/FirmwareDialog.vue | 60 +- .../src/components/FunctionDialog.vue | 57 +- main/manager-web/src/components/HeaderBar.vue | 131 ++- .../src/components/ManualAddDeviceDialog.vue | 38 +- .../src/components/ModelEditDialog.vue | 40 +- .../src/components/ParamDialog.vue | 40 +- .../src/components/ProviderDialog.vue | 134 +-- main/manager-web/src/components/TtsModel.vue | 88 +- .../src/components/VoicePrintDialog.vue | 24 +- main/manager-web/src/i18n/en.js | 801 +++++++++++++++++ main/manager-web/src/i18n/index.js | 43 + main/manager-web/src/i18n/zh_CN.js | 801 +++++++++++++++++ main/manager-web/src/i18n/zh_TW.js | 802 ++++++++++++++++++ main/manager-web/src/main.js | 5 + .../src/views/DeviceManagement.vue | 120 +-- main/manager-web/src/views/DictManagement.vue | 157 ++-- main/manager-web/src/views/ModelConfig.vue | 170 ++-- main/manager-web/src/views/OtaManagement.vue | 91 +- .../src/views/ParamsManagement.vue | 251 +++--- .../src/views/ProviderManagement.vue | 156 ++-- .../src/views/ServerSideManager.vue | 79 +- main/manager-web/src/views/UserManagement.vue | 76 +- main/manager-web/src/views/VoicePrint.vue | 46 +- main/manager-web/src/views/auth.scss | 2 +- main/manager-web/src/views/home.vue | 21 +- main/manager-web/src/views/login.vue | 108 ++- main/manager-web/src/views/register.vue | 35 +- .../src/views/retrievePassword.vue | 33 +- main/manager-web/src/views/roleConfig.vue | 91 +- 41 files changed, 3800 insertions(+), 1061 deletions(-) create mode 100644 main/manager-web/src/i18n/en.js create mode 100644 main/manager-web/src/i18n/index.js create mode 100644 main/manager-web/src/i18n/zh_CN.js create mode 100644 main/manager-web/src/i18n/zh_TW.js diff --git a/main/manager-web/package.json b/main/manager-web/package.json index 55e275d9..75471a5e 100644 --- a/main/manager-web/package.json +++ b/main/manager-web/package.json @@ -18,6 +18,7 @@ "opus-recorder": "^8.0.5", "vue": "^2.6.14", "vue-axios": "^3.5.2", + "vue-i18n": "^8.28.2", "vue-router": "^3.6.5", "vuex": "^3.6.2", "xiaozhi": "file:" diff --git a/main/manager-web/src/App.vue b/main/manager-web/src/App.vue index 74ad2af8..180f8f0d 100644 --- a/main/manager-web/src/App.vue +++ b/main/manager-web/src/App.vue @@ -50,6 +50,7 @@ import CacheViewer from '@/components/CacheViewer.vue'; import { logCacheStatus } from '@/utils/cacheViewer'; export default { + name: 'App', components: { CacheViewer }, @@ -78,7 +79,7 @@ export default { // 在控制台输出提示信息 console.info( - '%c[小智服务] CDN缓存检查工具已加载', + '%c[' + this.$t('system.name') + '] ' + this.$t('cache.cdnEnabled'), 'color: #409EFF; font-weight: bold;' ); console.info( @@ -89,7 +90,7 @@ export default { this.checkServiceWorkerStatus(); } else { console.info( - '%c[小智服务] CDN模式已禁用,使用本地打包资源', + '%c[' + this.$t('system.name') + '] ' + this.$t('cache.cdnDisabled'), 'color: #67C23A; font-weight: bold;' ); } @@ -119,7 +120,7 @@ export default { const registrations = await navigator.serviceWorker.getRegistrations(); if (registrations.length > 0) { console.info( - '%c[小智服务] Service Worker已注册', + '%c[' + this.$t('system.name') + '] ' + this.$t('cache.serviceWorkerRegistered'), 'color: #67C23A; font-weight: bold;' ); @@ -128,46 +129,46 @@ export default { const hasCaches = await logCacheStatus(); if (!hasCaches) { console.info( - '%c[小智服务] 还未检测到缓存,请刷新页面或等待缓存建立', + '%c[' + this.$t('system.name') + '] ' + this.$t('cache.noCacheDetected'), + 'color: #E6A23C; font-weight: bold;' + ); + + // 开发环境下提供额外提示 + if (process.env.NODE_ENV === 'development') { + console.info( + '%c[' + this.$t('system.name') + '] ' + this.$t('cache.swDevEnvWarning'), 'color: #E6A23C; font-weight: bold;' ); - - // 开发环境下提供额外提示 - if (process.env.NODE_ENV === 'development') { - console.info( - '%c[小智服务] 在开发环境中,Service Worker可能无法正常初始化缓存', - 'color: #E6A23C; font-weight: bold;' - ); - console.info('请尝试以下方法检查Service Worker是否生效:'); - console.info('1. 在开发者工具的Application/Application标签页中查看Service Worker状态'); - console.info('2. 在开发者工具的Application/Cache/Cache Storage中查看缓存内容'); - console.info('3. 使用生产构建(npm run build)并通过HTTP服务器访问以测试完整功能'); - } + console.info(this.$t('cache.swCheckMethods')); + console.info('1. ' + this.$t('cache.swCheckMethod1')); + console.info('2. ' + this.$t('cache.swCheckMethod2')); + console.info('3. ' + this.$t('cache.swCheckMethod3')); + } } }, 2000); } else { console.info( - '%c[小智服务] Service Worker未注册,CDN资源可能无法缓存', - 'color: #F56C6C; font-weight: bold;' - ); + '%c[' + this.$t('system.name') + '] ' + this.$t('cache.serviceWorkerNotRegistered'), + 'color: #F56C6C; font-weight: bold;' + ); - if (process.env.NODE_ENV === 'development') { - console.info( - '%c[小智服务] 在开发环境中,这是正常现象', - 'color: #E6A23C; font-weight: bold;' - ); - console.info('Service Worker通常只在生产环境中生效'); - console.info('要测试Service Worker功能:'); - console.info('1. 运行npm run build构建生产版本'); - console.info('2. 通过HTTP服务器访问构建后的页面'); - } + if (process.env.NODE_ENV === 'development') { + console.info( + '%c[' + this.$t('system.name') + '] ' + this.$t('cache.swDevEnvNormal'), + 'color: #E6A23C; font-weight: bold;' + ); + console.info(this.$t('cache.swProdOnly')); + console.info(this.$t('cache.swTestingTitle')); + console.info('1. ' + this.$t('cache.swTestingStep1')); + console.info('2. ' + this.$t('cache.swTestingStep2')); + } } } catch (error) { console.error('检查Service Worker状态失败:', error); } } else { - console.warn('当前浏览器不支持Service Worker,CDN资源缓存功能不可用'); - } + console.warn(this.$t('cache.swNotSupported')); + } } } }; diff --git a/main/manager-web/src/components/AddDeviceDialog.vue b/main/manager-web/src/components/AddDeviceDialog.vue index b273a8dc..29b9cf30 100644 --- a/main/manager-web/src/components/AddDeviceDialog.vue +++ b/main/manager-web/src/components/AddDeviceDialog.vue @@ -6,24 +6,24 @@ style="width: 40px;height: 40px;border-radius: 50%;background: #5778ff;display: flex;align-items: center;justify-content: center;"> - 添加设备 + {{ $t('device.dialogTitle') }}
*
- 验证码: + {{ $t('device.verificationCode') }}
- +
- 确定 + {{ $t('device.confirmButton') }}
- 取消 + {{ $t('device.cancelButton') }}
@@ -47,7 +47,7 @@ export default { methods: { confirm() { if (!/^\d{6}$/.test(this.deviceCode)) { - this.$message.error('请输入6位数字验证码'); + this.$message.error(this.$t('device.input6DigitCode')); return; } this.loading = true; @@ -58,13 +58,13 @@ export default { if (data.code === 0) { this.$emit('refresh'); this.$message.success({ - message: '设备绑定成功', + message: this.$t('device.bindSuccess'), showClose: true }); this.closeDialog(); } else { this.$message.error({ - message: data.msg || '绑定失败', + message: data.msg || this.$t('device.bindFailed'), showClose: true }); } diff --git a/main/manager-web/src/components/AddModelDialog.vue b/main/manager-web/src/components/AddModelDialog.vue index dbd1ad73..3dda7a9a 100644 --- a/main/manager-web/src/components/AddModelDialog.vue +++ b/main/manager-web/src/components/AddModelDialog.vue @@ -3,8 +3,8 @@ custom-class="custom-dialog" :show-close="false" class="center-dialog">
- 添加模型 -
+ {{ $t('modelConfigDialog.addModel') }} +
- 添加智能体 + {{ $t('addAgentDialog.title') }}
-
*
智能体名称: +
*
{{ $t('addAgentDialog.agentName') }}:
- +
- 确定 + {{ $t('addAgentDialog.confirm') }}
- 取消 + {{ $t('addAgentDialog.cancel') }}
@@ -50,12 +50,12 @@ export default { }, confirm() { if (!this.wisdomBodyName.trim()) { - this.$message.error('请输入智能体名称'); + this.$message.error(this.$t('addAgentDialog.nameRequired')); return; } Api.agent.addAgent(this.wisdomBodyName, (res) => { this.$message.success({ - message: '添加成功', + message: this.$t('addAgentDialog.addSuccess'), showClose: true }); this.$emit('confirm', res); diff --git a/main/manager-web/src/components/CacheViewer.vue b/main/manager-web/src/components/CacheViewer.vue index 66d4da7d..5bd234e0 100644 --- a/main/manager-web/src/components/CacheViewer.vue +++ b/main/manager-web/src/components/CacheViewer.vue @@ -1,54 +1,54 @@ @@ -138,29 +138,29 @@ export default { async refreshCache() { this.loadCacheData(); - this.$message.success('正在刷新缓存状态'); + this.$message.success(this.$t('cache.refreshingStatus')); }, async clearCache() { - this.$confirm('确定要清除所有缓存吗?', '警告', { - confirmButtonText: '确定', - cancelButtonText: '取消', + this.$confirm(this.$t('cache.confirmClear'), this.$t('message.warning'), { + confirmButtonText: this.$t('button.ok'), + cancelButtonText: this.$t('button.cancel'), type: 'warning' }).then(async () => { try { const success = await clearAllCaches(); if (success) { - this.$message.success('缓存已清除'); + this.$message.success(this.$t('cache.clearedSuccess')); await this.loadCacheData(); } else { - this.$message.error('清除缓存失败'); + this.$message.error(this.$t('cache.clearFailed')); } } catch (error) { console.error('清除缓存失败:', error); - this.$message.error('清除缓存失败'); + this.$message.error(this.$t('cache.clearFailed')); } }).catch(() => { - this.$message.info('已取消清除'); + this.$message.info(this.$t('cache.clearCanceled')); }); }, @@ -204,4 +204,4 @@ h3 { margin-bottom: 10px; font-weight: 500; } - \ No newline at end of file + \ No newline at end of file diff --git a/main/manager-web/src/components/ChangePasswordDialog.vue b/main/manager-web/src/components/ChangePasswordDialog.vue index a2a118e6..c2e0e659 100644 --- a/main/manager-web/src/components/ChangePasswordDialog.vue +++ b/main/manager-web/src/components/ChangePasswordDialog.vue @@ -8,38 +8,38 @@
- 修改密码 + {{ $t('changePassword.title') }}
*
- 旧密码: + {{ $t('changePassword.oldPasswordLabel') }}
- +
*
- 新密码: + {{ $t('changePassword.newPasswordLabel') }}
- +
*
- 确认新密码: + {{ $t('changePassword.confirmPasswordLabel') }}
- +
- 确定 + {{ $t('changePassword.confirmButton') }}
- 取消 + {{ $t('changePassword.cancelButton') }}
@@ -49,6 +49,7 @@ diff --git a/main/manager-web/src/views/ProviderManagement.vue b/main/manager-web/src/views/ProviderManagement.vue index 394e7ce4..a467f0a2 100644 --- a/main/manager-web/src/views/ProviderManagement.vue +++ b/main/manager-web/src/views/ProviderManagement.vue @@ -3,23 +3,23 @@
-

字段管理

+

{{ $t('header.providerManagement') }}

- 类别筛选 {{ selectedModelTypeLabel }} - 全部 - + {{ $t('common.all') }} + {{ item.label }} - - 搜索 + {{ $t('common.search') }}
@@ -30,23 +30,23 @@ - + - + - - - + + + - - + + @@ -84,31 +84,31 @@
- {{ isAllSelected ? '取消全选' : '全选' }} + {{ isAllSelected ? $t('common.deselectAll') : $t('common.selectAll') }} - 新增 - 删除 + {{ $t('common.add') }} + {{ $t('common.delete') }}
- + - 共{{ total }}条记录 + {{ $t('common.totalRecords', { number: total }) }}
@@ -140,14 +140,14 @@ export default { searchModelType: "", providersList: [], modelTypes: [ - { value: "ASR", label: "语音识别" }, - { value: "TTS", label: "语音合成" }, - { value: "LLM", label: "大语言模型" }, - { value: "VLLM", label: "视觉大语言模型" }, - { value: "Intent", label: "意图识别" }, - { value: "Memory", label: "记忆模块" }, - { value: "VAD", label: "语音活动检测" }, - { value: "Plugin", label: "插件工具" } + { value: "ASR", labelKey: 'providerManagement.modelType.ASR' }, + { value: "TTS", labelKey: 'providerManagement.modelType.TTS' }, + { value: "LLM", labelKey: 'providerManagement.modelType.LLM' }, + { value: "VLLM", labelKey: 'providerManagement.modelType.VLLM' }, + { value: "Intent", labelKey: 'providerManagement.modelType.Intent' }, + { value: "Memory", labelKey: 'providerManagement.modelType.Memory' }, + { value: "VAD", labelKey: 'providerManagement.modelType.VAD' }, + { value: "Plugin", labelKey: 'providerManagement.modelType.Plugin' } ], currentPage: 1, loading: false, @@ -174,10 +174,16 @@ export default { this.fetchProviders(); }, computed: { + translatedModelTypes() { + return this.modelTypes.map(type => ({ + value: type.value, + label: this.$t(type.labelKey) + })); + }, selectedModelTypeLabel() { - if (!this.searchModelType) return "(全部)"; + if (!this.searchModelType) return `(${this.$t('providerManagement.all')})`; const selectedType = this.modelTypes.find(item => item.value === this.searchModelType); - return selectedType ? `(${selectedType.label})` : ""; + return selectedType ? `(${this.$t(selectedType.labelKey)})` : ""; }, pageCount() { return Math.ceil(this.total / this.pageSize); @@ -259,7 +265,7 @@ export default { }); }, showAddDialog() { - this.dialogTitle = "新增供应器"; + this.dialogTitle = this.$t('common.addProvider'); this.providerForm = { id: null, modelType: "", @@ -271,7 +277,7 @@ export default { this.dialogVisible = true; }, editProvider(row) { - this.dialogTitle = "编辑供应器"; + this.dialogTitle = this.$t('common.editProvider'); this.providerForm = { ...row, fields: JSON.parse(JSON.stringify(row.fields)) @@ -287,9 +293,9 @@ export default { if (data.code === 0) { this.fetchProviders(); // 刷新表格 this.$message.success({ - message: "修改成功", - showClose: true - }); + message: this.$t('common.updateSuccess'), + showClose: true + }); } }); } else { @@ -298,9 +304,9 @@ export default { if (data.code === 0) { this.fetchProviders(); // 刷新表格 this.$message.success({ - message: "新增成功", - showClose: true - }); + message: this.$t('common.addSuccess'), + showClose: true + }); this.total += 1; } }); @@ -313,7 +319,7 @@ export default { const selectedRows = this.providersList.filter(row => row.selected); if (selectedRows.length === 0) { this.$message.warning({ - message: "请先选择需要删除的供应器", + message: this.$t('providerManagement.selectToDelete'), showClose: true }); return; @@ -324,9 +330,9 @@ export default { const providers = Array.isArray(row) ? row : [row]; const providerCount = providers.length; - this.$confirm(`确定要删除选中的${providerCount}个供应器吗?`, '警告', { - confirmButtonText: '确定', - cancelButtonText: '取消', + this.$confirm(this.$t('providerManagement.confirmDelete', { count: providerCount }), this.$t('common.warning'), { + confirmButtonText: this.$t('common.confirm'), + cancelButtonText: this.$t('common.cancel'), type: 'warning', }).then(() => { const ids = providers.map(provider => provider.id); @@ -337,12 +343,12 @@ export default { this.fetchProviders(); // 刷新表格 this.$message.success({ - message: `成功删除${providerCount}个参数`, + message: this.$t('common.deleteSuccess'), showClose: true }); } else { this.$message.error({ - message: data.msg || '删除失败,请重试', + message: data.msg || this.$t('common.deleteFailure'), showClose: true }); } @@ -350,7 +356,7 @@ export default { }).catch(() => { this.$message({ type: 'info', - message: '已取消删除', + message: this.$t('common.deleteCancelled'), showClose: true, duration: 1000 }); @@ -369,7 +375,7 @@ export default { }, getModelTypeLabel(type) { const typeItem = this.modelTypes.find(item => item.value === type); - return typeItem ? typeItem.label : type; + return typeItem ? this.$t(typeItem.labelKey) : type; }, isSensitiveField(fieldKey) { if (typeof fieldKey !== 'string') return false; @@ -388,6 +394,26 @@ export default { } return ""; }, + selectionCellClassName() { + return "custom-selection-cell"; + }, + updateSelectionHeaderText() { + // 确保表格已渲染 + this.$nextTick(() => { + if (this.$refs.providersTable && this.$refs.providersTable.$el) { + const headerCheckbox = this.$refs.providersTable.$el.querySelector('.custom-selection-header .el-checkbox .el-checkbox__label'); + if (headerCheckbox) { + headerCheckbox.textContent = this.$t('modelConfig.select'); + } + } + }); + }, + mounted() { + this.updateSelectionHeaderText(); + }, + updated() { + this.updateSelectionHeaderText(); + }, goFirst() { this.currentPage = 1; this.fetchProviders(); @@ -875,4 +901,26 @@ export default { .dropdown-trigger.active { color: #409EFF; } + +/* 确保选择列标题样式正确 */ +.custom-selection-header { + position: relative; +} + +:deep(.custom-selection-header .el-checkbox) { + display: flex !important; + align-items: center; + justify-content: center; +} + +:deep(.custom-selection-header .el-checkbox__label) { + position: relative; + white-space: nowrap; +} + +:deep(.custom-selection-cell) { + display: flex; + align-items: center; + justify-content: center; +} \ No newline at end of file diff --git a/main/manager-web/src/views/ServerSideManager.vue b/main/manager-web/src/views/ServerSideManager.vue index 973fcd6f..ae62bea1 100644 --- a/main/manager-web/src/views/ServerSideManager.vue +++ b/main/manager-web/src/views/ServerSideManager.vue @@ -3,7 +3,7 @@
-

服务端管理

+

{{ $t('serverSideManager.pageTitle') }}

@@ -11,19 +11,19 @@
- + - - + + @@ -44,33 +44,20 @@ import Api from "@/apis/api"; import HeaderBar from "@/components/HeaderBar.vue"; import ParamDialog from "@/components/ParamDialog.vue"; import VersionFooter from "@/components/VersionFooter.vue"; +import i18n from '@/i18n'; export default { components: { HeaderBar, ParamDialog, VersionFooter }, data() { return { paramsList: [], - actionMap: { - restart: { - value: 'restart', - title: "重启服务端", - message: "确定要重启服务端吗?", - confirmText: "重启", - }, - update_config: { - value: 'update_config', - title: "更新配置", - message: "确定要更新配置吗?", - confirmText: "更新", - } - }, currentPage: 1, loading: false, pageSize: 10, pageSizeOptions: [10, 20, 50, 100], total: 0, dialogVisible: false, - dialogTitle: "新增参数", + dialogTitle: '', isAllSelected: false, sensitive_keys: ["api_key", "personal_access_token", "access_token", "token", "secret", "access_key_secret", "secret_key"], paramForm: { @@ -84,6 +71,10 @@ export default { created() { this.fetchParams(); }, + mounted() { + this.getServerList(); + this.dialogTitle = this.$t('paramManagement.addParam'); + }, computed: { pageCount() { @@ -104,6 +95,22 @@ export default { } return pages; }, + actionMap() { + return { + restart: { + value: 'restart', + title: this.$t('serverSideManager.restartServer'), + message: this.$t('serverSideManager.confirmRestart'), + confirmText: this.$t('serverSideManager.restart'), + }, + update_config: { + value: 'update_config', + title: this.$t('serverSideManager.updateConfigTitle'), + message: this.$t('serverSideManager.confirmUpdateConfig'), + confirmText: this.$t('serverSideManager.updateConfig'), + } + }; + } }, methods: { handlePageSizeChange(val) { @@ -122,7 +129,7 @@ export default { this.total = data.data.length; } else { this.$message.error({ - message: data.msg || '获取参数列表失败', + message: data.msg || this.$t('serverSideManager.getServerListFailed'), showClose: true }); } @@ -136,6 +143,7 @@ export default { // 弹开询问框 this.$confirm(actionItem.message, actionItem.title, { confirmButtonText: actionItem.confirmText, // 确认按钮文本 + cancelButtonText: this.$t('common.cancel') // 取消按钮文本 }).then(() => { // 用户点击了确认按钮 Api.admin.sendWsServerAction({ @@ -144,13 +152,13 @@ export default { }, ({ data }) => { if (data.code !== 0) { this.$message.error({ - message: data.msg || '操作失败', + message: data.msg || this.$t('serverSideManager.operationFailed'), showClose: true }); return; } this.$message.success({ - message: `${actionItem.title}成功`, + message: actionItem.value === 'restart' ? this.$t('serverSideManager.restartSuccess') : this.$t('serverSideManager.updateConfigSuccess'), showClose: true }) }) @@ -450,26 +458,7 @@ export default { .el-table__body-wrapper { max-height: calc(var(--table-max-height) - 40px); + overflow-y: auto; } } - -:deep(.el-loading-mask) { - background-color: rgba(255, 255, 255, 0.6) !important; - backdrop-filter: blur(2px); -} - -:deep(.el-loading-spinner .circular) { - width: 28px; - height: 28px; -} - -:deep(.el-loading-spinner .path) { - stroke: #6b8cff; -} - -:deep(.el-loading-text) { - color: #6b8cff !important; - font-size: 14px; - margin-top: 8px; -} diff --git a/main/manager-web/src/views/UserManagement.vue b/main/manager-web/src/views/UserManagement.vue index 34d60e74..eb7ba147 100644 --- a/main/manager-web/src/views/UserManagement.vue +++ b/main/manager-web/src/views/UserManagement.vue @@ -3,11 +3,11 @@
-

用户管理

+

{{ $t('header.userManagement') }}

- - 搜索 + {{ $t('user.search') }}
@@ -18,29 +18,29 @@ - + - - - - - + + + + + - + @@ -48,32 +48,32 @@
- {{ isAllSelected ? '取消全选' : '全选' }} + {{ isAllSelected ? $t('user.deselectAll') : $t('user.selectAll') }} - 启用 + {{ $t('user.enable') }} 禁用 - 删除 + class="el-icon-remove-outline rotated-icon">{{ $t('user.disable') }} + {{ $t('user.delete') }}
- - + + - 共{{ total }}条记录 + {{ $t('modelConfig.totalRecords', { count: total }) }}
@@ -93,6 +93,7 @@ import Api from "@/apis/api"; import HeaderBar from "@/components/HeaderBar.vue"; import VersionFooter from "@/components/VersionFooter.vue"; import ViewPasswordDialog from "@/components/ViewPasswordDialog.vue"; +import i18n from '@/i18n'; export default { components: { HeaderBar, ViewPasswordDialog, VersionFooter }, data() { @@ -116,6 +117,9 @@ export default { pageCount() { return Math.ceil(this.total / this.pageSize); }, + isEnglish() { + return i18n.locale === 'en'; + }, visiblePages() { const pages = []; const maxVisible = 3; @@ -172,19 +176,19 @@ export default { batchDelete() { const selectedUsers = this.userList.filter(user => user.selected); if (selectedUsers.length === 0) { - this.$message.warning("请先选择需要删除的用户"); + this.$message.warning(this.$t('user.selectUsersFirst')); return; } - this.$confirm(`确定要删除选中的${selectedUsers.length}个用户吗?`, "警告", { - confirmButtonText: "确定", - cancelButtonText: "取消", + this.$confirm(this.$t('user.confirmDeleteSelected', { count: selectedUsers.length }), "警告", { + confirmButtonText: this.$t('common.confirm'), + cancelButtonText: this.$t('common.cancel'), type: "warning", }) .then(async () => { const loading = this.$loading({ lock: true, - text: "正在删除中...", + text: this.$t('user.deleting'), spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", }); @@ -656,6 +660,16 @@ export default { color: #606266; font-size: 14px; } + + &.page-size-select-en { + width: 130px; + + :deep(.el-input__inner) { + height: 36px; + line-height: 36px; + font-size: 15px; + } + } :deep(.el-input__suffix) { right: 6px; diff --git a/main/manager-web/src/views/VoicePrint.vue b/main/manager-web/src/views/VoicePrint.vue index be55a907..43f818a9 100644 --- a/main/manager-web/src/views/VoicePrint.vue +++ b/main/manager-web/src/views/VoicePrint.vue @@ -3,7 +3,7 @@
-

声纹识别

+

{{ $t('voicePrint.pageTitle') }}

@@ -11,23 +11,23 @@
- - - - + :element-loading-text="$t('voicePrint.loading')" element-loading-spinner="el-icon-loading" + element-loading-background="rgba(255, 255, 255, 0.7)"> + + + +
- 新增 + {{ $t('voicePrint.add') }}
@@ -56,7 +56,7 @@ export default { voicePrintList: [], loading: false, dialogVisible: false, - dialogTitle: "添加说话人", + dialogTitle: this.$t('voicePrint.addSpeaker'), isAllSelected: false, paramForm: { id: null, @@ -87,7 +87,7 @@ export default { })); } else { this.$message.error({ - message: data.msg || '获取声纹列表失败', + message: data.msg || this.$t('voicePrint.fetchFailed'), showClose: true }); } @@ -95,7 +95,7 @@ export default { ); }, showAddDialog() { - this.dialogTitle = "添加说话人"; + this.dialogTitle = this.$t('voicePrint.addSpeaker'); this.paramForm = { id: null, audioId: '', @@ -105,7 +105,7 @@ export default { this.dialogVisible = true; }, editVoicePrint(row) { - this.dialogTitle = "编辑说话人"; + this.dialogTitle = this.$t('voicePrint.editSpeaker'); this.paramForm = { ...row }; this.dialogVisible = true; }, @@ -116,7 +116,7 @@ export default { Api.agent.updateAgentVoicePrint(form, ({ data }) => { if (data.code === 0) { this.$message.success({ - message: "修改成功", + message: this.$t('voicePrint.updateSuccess'), showClose: true }); this.dialogVisible = false; @@ -134,7 +134,7 @@ export default { }, ({ data }) => { if (data.code === 0) { this.$message.success({ - message: "新增成功", + message: this.$t('voicePrint.addSuccess'), showClose: true }); this.dialogVisible = false; @@ -146,22 +146,22 @@ export default { }, // 删除按钮 deleteVoicePrint(id) { - this.$confirm(`确定要删除选中的此声纹吗?`, '警告', { - confirmButtonText: '确定', - cancelButtonText: '取消', + this.$confirm(this.$t('voicePrint.confirmDelete'), this.$t('voicePrint.warning'), { + confirmButtonText: this.$t('voicePrint.confirm'), + cancelButtonText: this.$t('voicePrint.cancel'), type: 'warning', distinguishCancelAndClose: true }).then(() => { Api.agent.deleteAgentVoicePrint(id, ({ data }) => { if (data.code === 0) { this.$message.success({ - message: `成功删除此声纹`, + message: this.$t('voicePrint.deleteSuccess'), showClose: true }); this.fetchVoicePrints(); } else { this.$message.error({ - message: data.msg || '删除失败,请重试', + message: data.msg || this.$t('voicePrint.deleteFailed'), showClose: true }); } @@ -170,13 +170,13 @@ export default { if (action === 'cancel') { this.$message({ type: 'info', - message: '已取消删除操作', + message: this.$t('voicePrint.cancelDelete'), duration: 1000 }); } else { this.$message({ type: 'info', - message: '操作已关闭', + message: this.$t('voicePrint.closeOperation'), duration: 1000 }); } diff --git a/main/manager-web/src/views/auth.scss b/main/manager-web/src/views/auth.scss index b18fe2d7..5e915063 100644 --- a/main/manager-web/src/views/auth.scss +++ b/main/manager-web/src/views/auth.scss @@ -18,7 +18,7 @@ .login-text { font-weight: 700; - font-size: 32px; + font-size: 25px; text-align: left; color: #3d4566; } diff --git a/main/manager-web/src/views/home.vue b/main/manager-web/src/views/home.vue index 005d763c..becefaea 100644 --- a/main/manager-web/src/views/home.vue +++ b/main/manager-web/src/views/home.vue @@ -8,20 +8,17 @@
- 你好,小智 + 你好小智
- 让我们度过 -
- 美好的一天! -
+ 让我们度过美好的一天!
- Hello, Let's have a wonderful day! + let's have a wonderful day!
- 添加智能体 + {{ $t('home.addAgent') }}
@@ -152,21 +149,21 @@ export default { }, // 删除智能体 handleDeleteAgent(agentId) { - this.$confirm('确定要删除该智能体吗?', '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', + 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: '删除成功', + message: this.$t('home.deleteSuccess'), showClose: true }); this.fetchAgentList(); // 刷新列表 } else { this.$message.error({ - message: res.data.msg || '删除失败', + message: res.data.msg || this.$t('home.deleteFailed'), showClose: true }); } diff --git a/main/manager-web/src/views/login.vue b/main/manager-web/src/views/login.vue index 24c601d9..647fd2dc 100644 --- a/main/manager-web/src/views/login.vue +++ b/main/manager-web/src/views/login.vue @@ -14,17 +14,37 @@ @@ -93,6 +114,7 @@ import Api from '@/apis/api'; import VersionFooter from '@/components/VersionFooter.vue'; import { getUUID, goToPage, showDanger, showSuccess, validateMobile } from '@/utils'; import { mapState } from 'vuex'; +import { changeLanguage } from '@/i18n'; export default { name: 'login', @@ -119,7 +141,8 @@ export default { }, captchaUuid: '', captchaUrl: '', - isMobileLogin: false + isMobileLogin: false, + languageDropdownVisible: false } }, mounted() { @@ -149,6 +172,21 @@ export default { } }, + // 切换语言下拉菜单的可见状态变化 + handleLanguageDropdownVisibleChange(visible) { + this.languageDropdownVisible = visible; + }, + + // 切换语言 + changeLanguage(lang) { + changeLanguage(lang); + this.languageDropdownVisible = false; + this.$message.success({ + message: this.$t('message.success'), + showClose: true + }); + }, + // 切换登录方式 switchLoginType(type) { this.isMobileLogin = type === 'mobile'; @@ -226,6 +264,26 @@ export default { .login-type-container { margin: 10px 20px; + display: flex; + justify-content: space-between; + align-items: center; +} + +.title-language-dropdown { + margin-left: 20px; +} + +.language-dropdown { + margin-left: auto; +} + +.rotate-down { + transform: rotate(180deg); + transition: transform 0.3s ease; +} + +.el-icon-arrow-down { + transition: transform 0.3s ease; } :deep(.el-button--primary) { diff --git a/main/manager-web/src/views/register.vue b/main/manager-web/src/views/register.vue index e9f7dbcb..043cead7 100644 --- a/main/manager-web/src/views/register.vue +++ b/main/manager-web/src/views/register.vue @@ -16,9 +16,9 @@
- +
@@ -27,7 +27,7 @@
- +
@@ -38,14 +38,14 @@ - +
- +
验证码 @@ -56,12 +56,12 @@
- +
- {{ countdown > 0 ? `${countdown}秒后重试` : '发送验证码' }} + {{ countdown > 0 ? `${countdown}秒后重试` : $t('register.sendCaptcha') }}
@@ -70,13 +70,13 @@
- +
- +
@@ -84,7 +84,7 @@ style="display: flex; align-items: center; margin-top: 20px; width: 100%; gap: 10px;">
- +
验证码 @@ -92,20 +92,20 @@
-
已有账号?立即登录
+
{{ $t('register.goToLogin') }}
- +
- 注册即同意 -
《用户协议》
- 和 -
《隐私政策》
+ {{ $t('register.agreeTo') }} +
{{ $t('register.userAgreement') }}
+ {{ $t('register.and') }} +
{{ $t('register.privacyPolicy') }}
@@ -124,6 +124,9 @@ import VersionFooter from '@/components/VersionFooter.vue'; import { getUUID, goToPage, showDanger, showSuccess, validateMobile } from '@/utils'; import { mapState } from 'vuex'; +// 导入语言切换功能 +import { changeLanguage } from '@/i18n'; + export default { name: 'register', components: { diff --git a/main/manager-web/src/views/retrievePassword.vue b/main/manager-web/src/views/retrievePassword.vue index dbf3ffcf..195ba06b 100644 --- a/main/manager-web/src/views/retrievePassword.vue +++ b/main/manager-web/src/views/retrievePassword.vue @@ -17,9 +17,9 @@
- +
@@ -31,14 +31,14 @@ - +
- +
验证码 @@ -48,12 +48,12 @@
- +
- {{ countdown > 0 ? `${countdown}秒后重试` : '发送验证码' }} + {{ countdown > 0 ? `${countdown}秒后重试` : $t('retrievePassword.sendCaptcha') }}
@@ -61,30 +61,30 @@
- +
- +
-
返回登录
+
{{ $t('retrievePassword.goToLogin') }}
- +
- 同意 -
《用户协议》
- 和 -
《隐私政策》
+ {{ $t('retrievePassword.agreeTo') }} +
{{ $t('register.userAgreement') }}
+ {{ $t('register.and') }} +
{{ $t('register.privacyPolicy') }}
@@ -104,6 +104,9 @@ import VersionFooter from '@/components/VersionFooter.vue'; import { getUUID, goToPage, showDanger, showSuccess, validateMobile } from '@/utils'; import { mapState } from 'vuex'; +// 导入语言切换功能 +import { changeLanguage } from '@/i18n'; + export default { name: 'retrieve', components: { @@ -125,7 +128,7 @@ export default { mobile: '', captcha: '', captchaId: '', - smsCode: '', + mobileCaptcha: '', newPassword: '', confirmPassword: '' }, diff --git a/main/manager-web/src/views/roleConfig.vue b/main/manager-web/src/views/roleConfig.vue index bbba01bd..80e85027 100644 --- a/main/manager-web/src/views/roleConfig.vue +++ b/main/manager-web/src/views/roleConfig.vue @@ -3,7 +3,7 @@
-

角色配置

+

{{ $t('roleConfig.title') }}

@@ -18,10 +18,10 @@
- 保存配置后,需要重启设备,新的配置才会生效。 + {{ $t('roleConfig.restartNotice') }}
- 保存配置 - 重置 + {{ $t('roleConfig.saveConfig') }} + {{ $t('roleConfig.reset') }} @@ -33,10 +33,10 @@
- + - +
@@ -44,39 +44,39 @@
- - + - + - - + - - +
- +
-
- +
- @@ -84,11 +84,11 @@
-
- + @@ -104,20 +104,20 @@ - 编辑功能 + {{ $t('roleConfig.editFunctions') }}
- 上报文字 - 上报文字+语音 - + {{ $t('roleConfig.reportText') }} + {{ $t('roleConfig.reportTextVoice') }} +
- - + + @@ -139,6 +139,7 @@ import Api from '@/apis/api'; import FunctionDialog from "@/components/FunctionDialog.vue"; import HeaderBar from "@/components/HeaderBar.vue"; +import i18n from '@/i18n'; export default { name: 'RoleConfigPage', @@ -166,13 +167,13 @@ export default { } }, models: [ - { label: '语音活动检测(VAD)', key: 'vadModelId', type: 'VAD' }, - { label: '语音识别(ASR)', key: 'asrModelId', type: 'ASR' }, - { label: '大语言模型(LLM)', key: 'llmModelId', type: 'LLM' }, - { label: '视觉大模型(VLLM)', key: 'vllmModelId', type: 'VLLM' }, - { label: '意图识别(Intent)', key: 'intentModelId', type: 'Intent' }, - { label: '记忆(Memory)', key: 'memModelId', type: 'Memory' }, - { label: '语音合成(TTS)', key: 'ttsModelId', type: 'TTS' } + { label: this.$t('roleConfig.vad'), key: 'vadModelId', type: 'VAD' }, + { label: this.$t('roleConfig.asr'), key: 'asrModelId', type: 'ASR' }, + { label: this.$t('roleConfig.llm'), key: 'llmModelId', type: 'LLM' }, + { label: this.$t('roleConfig.vllm'), key: 'vllmModelId', type: 'VLLM' }, + { label: this.$t('roleConfig.intent'), key: 'intentModelId', type: 'Intent' }, + { label: this.$t('roleConfig.memory'), key: 'memModelId', type: 'Memory' }, + { label: this.$t('roleConfig.tts'), key: 'ttsModelId', type: 'TTS' } ], llmModeTypeMap: new Map(), modelOptions: {}, @@ -221,21 +222,21 @@ export default { Api.agent.updateAgentConfig(this.$route.query.agentId, configData, ({ data }) => { if (data.code === 0) { this.$message.success({ - message: '配置保存成功', + message: i18n.t('roleConfig.saveSuccess'), showClose: true }); } else { this.$message.error({ - message: data.msg || '配置保存失败', + message: data.msg || i18n.t('roleConfig.saveFailed'), showClose: true }); } }); }, resetConfig() { - this.$confirm('确定要重置配置吗?', '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', + this.$confirm(i18n.t('roleConfig.confirmReset'), i18n.t('message.info'), { + confirmButtonText: i18n.t('button.ok'), + cancelButtonText: i18n.t('button.cancel'), type: 'warning' }).then(() => { this.form = { @@ -260,7 +261,7 @@ export default { } this.currentFunctions = []; this.$message.success({ - message: '配置已重置', + message: i18n.t('roleConfig.resetSuccess'), showClose: true }) }).catch(() => { @@ -271,7 +272,7 @@ export default { if (data.code === 0) { this.templates = data.data; } else { - this.$message.error(data.msg || '获取模板列表失败'); + this.$message.error(data.msg || i18n.t('roleConfig.fetchTemplatesFailed')); } }); }, @@ -281,12 +282,12 @@ export default { try { this.applyTemplateData(template); this.$message.success({ - message: `「${template.agentName}」模板已应用`, + message: `${template.agentName}${i18n.t('roleConfig.templateApplied')}`, showClose: true }); } catch (error) { this.$message.error({ - message: '应用模板失败', + message: i18n.t('roleConfig.applyTemplateFailed'), showClose: true }); console.error('应用模板失败:', error); @@ -361,7 +362,7 @@ export default { this.updateIntentOptionsVisibility(); }); } else { - this.$message.error(data.msg || '获取配置失败'); + this.$message.error(data.msg || i18n.t('roleConfig.fetchConfigFailed')); } }); }, @@ -381,7 +382,7 @@ export default { this.updateIntentOptionsVisibility(); } } else { - this.$message.error(data.msg || '获取模型列表失败'); + this.$message.error(data.msg || i18n.t('roleConfig.fetchModelsFailed')); } }); } else { @@ -457,7 +458,7 @@ export default { }); resolve(); } else { - this.$message.error(data.msg || '获取插件列表失败'); + this.$message.error(data.msg || i18n.t('roleConfig.fetchPluginsFailed')); reject(); } }); From 5b4381c25749a5bcf0064fd04f4ffe04a194f956 Mon Sep 17 00:00:00 2001 From: rainv123 <2148537152@qq.com> Date: Fri, 12 Sep 2025 11:41:31 +0800 Subject: [PATCH 2/4] =?UTF-8?q?updata:=E6=99=BA=E6=8E=A7=E5=8F=B0=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=B7=BB=E5=8A=A0=E8=AF=AD=E8=A8=80=E5=88=87=E6=8D=A2?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E4=B8=AD=E8=8B=B1=E7=B9=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/DictDataDialog.vue | 2 +- .../src/components/ParamDialog.vue | 11 ++------ main/manager-web/src/i18n/en.js | 15 ++++++++++ main/manager-web/src/i18n/zh_CN.js | 15 ++++++++++ main/manager-web/src/i18n/zh_TW.js | 15 ++++++++++ .../src/views/DeviceManagement.vue | 2 +- .../src/views/ParamsManagement.vue | 28 +++++++++++-------- main/manager-web/src/views/register.vue | 20 ++++++------- 8 files changed, 75 insertions(+), 33 deletions(-) diff --git a/main/manager-web/src/components/DictDataDialog.vue b/main/manager-web/src/components/DictDataDialog.vue index 3731eeff..e98c2a39 100644 --- a/main/manager-web/src/components/DictDataDialog.vue +++ b/main/manager-web/src/components/DictDataDialog.vue @@ -13,7 +13,7 @@ diff --git a/main/manager-web/src/components/ParamDialog.vue b/main/manager-web/src/components/ParamDialog.vue index d72b3768..8980ec1a 100644 --- a/main/manager-web/src/components/ParamDialog.vue +++ b/main/manager-web/src/components/ParamDialog.vue @@ -107,16 +107,9 @@ export default { this.$refs.form.validate((valid) => { if (valid) { this.saving = true; // 开始加载 - this.$emit('submit', { - form: this.form, - done: () => { - this.saving = false; // 加载完成 - } - }); + this.$emit('submit', this.form); - setTimeout(() => { - this.saving = false; - }, 3000); + // 在父组件处理完成后,通过watch visible的变化来重置saving状态 } }); }, diff --git a/main/manager-web/src/i18n/en.js b/main/manager-web/src/i18n/en.js index 2c35bdf3..8b5e7ac0 100644 --- a/main/manager-web/src/i18n/en.js +++ b/main/manager-web/src/i18n/en.js @@ -198,6 +198,21 @@ export default { 'register.mobileRequired': 'Mobile number cannot be empty', 'register.passwordRequired': 'Password cannot be empty', 'register.confirmPasswordRequired': 'Confirm password cannot be empty', + 'register.goToLogin': 'Already have an account, go to login', + 'register.agreeTo': 'Registering means you agree to the', + 'register.userAgreement': 'User Agreement', + 'register.and': 'and', + 'register.privacyPolicy': 'Privacy Policy', + 'register.sendCaptcha': 'Get Verification Code', + 'register.notAllowRegister': 'User registration is not allowed currently', + 'register.captchaLoadFailed': 'Verification code loading failed, click to refresh', + 'register.inputCorrectMobile': 'Please enter correct mobile number', + 'register.inputCaptcha': 'Please enter captcha', + 'register.captchaSendSuccess': 'Verification code sent successfully', + 'register.captchaSendFailed': 'Failed to send verification code', + 'register.registerSuccess': 'Registration successful!', + 'register.registerFailed': 'Registration failed', + 'register.passwordsNotMatch': 'The two passwords do not match', // Retrieve password page text 'retrievePassword.title': 'Reset Password', diff --git a/main/manager-web/src/i18n/zh_CN.js b/main/manager-web/src/i18n/zh_CN.js index 1f5e7b31..15382204 100644 --- a/main/manager-web/src/i18n/zh_CN.js +++ b/main/manager-web/src/i18n/zh_CN.js @@ -198,6 +198,21 @@ export default { 'register.mobileRequired': '手机号不能为空', 'register.passwordRequired': '密码不能为空', 'register.confirmPasswordRequired': '确认密码不能为空', + 'register.goToLogin': '已有账号,去登录', + 'register.agreeTo': '注册即同意', + 'register.userAgreement': '《用户协议》', + 'register.and': '和', + 'register.privacyPolicy': '《隐私政策》', + 'register.sendCaptcha': '获取验证码', + 'register.notAllowRegister': '当前不允许普通用户注册', + 'register.captchaLoadFailed': '验证码加载失败,点击刷新', + 'register.inputCorrectMobile': '请输入正确的手机号码', + 'register.inputCaptcha': '请输入图形验证码', + 'register.captchaSendSuccess': '验证码发送成功', + 'register.captchaSendFailed': '验证码发送失败', + 'register.registerSuccess': '注册成功!', + 'register.registerFailed': '注册失败', + 'register.passwordsNotMatch': '两次输入的密码不一致', // 忘记密码页面文本 'retrievePassword.title': '重置密码', diff --git a/main/manager-web/src/i18n/zh_TW.js b/main/manager-web/src/i18n/zh_TW.js index 6f1e345c..7e17d35c 100644 --- a/main/manager-web/src/i18n/zh_TW.js +++ b/main/manager-web/src/i18n/zh_TW.js @@ -198,6 +198,21 @@ export default { 'register.mobileRequired': '手機號不能為空', 'register.passwordRequired': '密碼不能為空', 'register.confirmPasswordRequired': '確認密碼不能為空', + 'register.goToLogin': '已有賬號,去登錄', + 'register.agreeTo': '註冊即同意', + 'register.userAgreement': '《用戶協議》', + 'register.and': '和', + 'register.privacyPolicy': '《隱私政策》', + 'register.sendCaptcha': '獲取驗證碼', + 'register.notAllowRegister': '當前不允許普通用戶註冊', + 'register.captchaLoadFailed': '驗證碼加載失敗,點擊刷新', + 'register.inputCorrectMobile': '請輸入正確的手機號碼', + 'register.inputCaptcha': '請輸入圖形驗證碼', + 'register.captchaSendSuccess': '驗證碼發送成功', + 'register.captchaSendFailed': '驗證碼發送失敗', + 'register.registerSuccess': '註冊成功!', + 'register.registerFailed': '註冊失敗', + 'register.passwordsNotMatch': '兩次輸入的密碼不一致', // 忘记密码页面文本 'retrievePassword.title': '重置密碼', diff --git a/main/manager-web/src/views/DeviceManagement.vue b/main/manager-web/src/views/DeviceManagement.vue index 670bca8d..5247c87b 100644 --- a/main/manager-web/src/views/DeviceManagement.vue +++ b/main/manager-web/src/views/DeviceManagement.vue @@ -74,7 +74,7 @@
- {{ isCurrentPageAllSelected ? $t('device.deselectAll') : $t('device.selectAll') }} + {{ isCurrentPageAllSelected ? $t('common.deselectAll') : $t('common.selectAll') }} {{ $t('device.bindWithCode') }} diff --git a/main/manager-web/src/views/ParamsManagement.vue b/main/manager-web/src/views/ParamsManagement.vue index fa55e110..f501fdc7 100644 --- a/main/manager-web/src/views/ParamsManagement.vue +++ b/main/manager-web/src/views/ParamsManagement.vue @@ -116,8 +116,9 @@ export default { paramForm: { id: null, paramCode: "", - paramValue: "", - remark: "" + paramValue: "", + valueType: "string", + remark: "" }, }; }, @@ -165,6 +166,7 @@ export default { if (data.code === 0) { this.paramsList = data.data.list.map(item => ({ ...item, + valueType: item.valueType || "string", selected: false, showValue: false })); @@ -191,21 +193,23 @@ export default { showAddDialog() { this.dialogTitle = this.$t('paramManagement.addParam'); this.paramForm = { - id: null, - paramCode: "", - paramValue: "", - remark: "" - }; + id: null, + paramCode: "", + paramValue: "", + valueType: "string", // 默认值 + remark: "" + }; this.dialogVisible = true; }, editParam(row) { this.dialogTitle = this.$t('paramManagement.editParam'); this.paramForm = { - id: row.id, - paramCode: row.paramCode, - paramValue: row.paramValue, - remark: row.remark - }; + id: row.id, + paramCode: row.paramCode, + paramValue: row.paramValue, + valueType: row.valueType || "string", // 确保有值 + remark: row.remark + }; this.dialogVisible = true; }, handleSubmit(form) { diff --git a/main/manager-web/src/views/register.vue b/main/manager-web/src/views/register.vue index 043cead7..873cc9a6 100644 --- a/main/manager-web/src/views/register.vue +++ b/main/manager-web/src/views/register.vue @@ -162,7 +162,7 @@ export default { mounted() { this.$store.dispatch('fetchPubConfig').then(() => { if (!this.allowUserRegister) { - showDanger('当前不允许普通用户注册'); + showDanger(this.$t('register.notAllowRegister')); setTimeout(() => { goToPage('/login'); }, 1500); @@ -181,7 +181,7 @@ export default { } else { console.error('验证码加载异常:', error); - showDanger('验证码加载失败,点击刷新'); + showDanger(this.$t('register.captchaLoadFailed')); } }); }, @@ -198,12 +198,12 @@ export default { // 发送手机验证码 sendMobileCaptcha() { if (!validateMobile(this.form.mobile, this.form.areaCode)) { - showDanger('请输入正确的手机号码'); + showDanger(this.$t('register.inputCorrectMobile')); return; } // 验证图形验证码 - if (!this.validateInput(this.form.captcha, '请输入图形验证码')) { + if (!this.validateInput(this.form.captcha, this.$t('register.inputCaptcha'))) { this.fetchCaptcha(); return; } @@ -231,9 +231,9 @@ export default { captcha: this.form.captcha, captchaId: this.form.captchaId }, (res) => { - showSuccess('验证码发送成功'); + showSuccess(this.$t('register.captchaSendSuccess')); }, (err) => { - showDanger(err.data.msg || '验证码发送失败'); + showDanger(err.data.msg || this.$t('register.captchaSendFailed')); this.countdown = 0; this.fetchCaptcha(); }); @@ -244,7 +244,7 @@ export default { if (this.enableMobileRegister) { // 手机号注册验证 if (!validateMobile(this.form.mobile, this.form.areaCode)) { - showDanger('请输入正确的手机号码'); + showDanger(this.$t('register.inputCorrectMobile')); return; } if (!this.form.mobileCaptcha) { @@ -263,7 +263,7 @@ export default { return; } if (this.form.password !== this.form.confirmPassword) { - showDanger('两次输入的密码不一致') + showDanger(this.$t('register.passwordsNotMatch')) return } // 验证验证码 @@ -276,10 +276,10 @@ export default { } Api.user.register(this.form, ({ data }) => { - showSuccess('注册成功!') + showSuccess(this.$t('register.registerSuccess')) goToPage('/login') }, (err) => { - showDanger(err.data.msg || '注册失败') + showDanger(err.data.msg || this.$t('register.registerFailed')) if (err.data != null && err.data.msg != null && err.data.msg.indexOf('图形验证码') > -1) { this.fetchCaptcha() } From f788e45bc12b04c8f1d31d002baa3526e207d73f Mon Sep 17 00:00:00 2001 From: rainv123 <2148537152@qq.com> Date: Fri, 12 Sep 2025 15:11:56 +0800 Subject: [PATCH 3/4] =?UTF-8?q?updata:=E6=99=BA=E6=8E=A7=E5=8F=B0=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=B7=BB=E5=8A=A0=E8=AF=AD=E8=A8=80=E5=88=87=E6=8D=A2?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E4=B8=AD=E8=8B=B1=E7=B9=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/manager-web/src/components/DictTypeDialog.vue | 2 +- main/manager-web/src/components/FirmwareDialog.vue | 2 +- main/manager-web/src/i18n/en.js | 3 ++- main/manager-web/src/views/ParamsManagement.vue | 8 ++++---- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/main/manager-web/src/components/DictTypeDialog.vue b/main/manager-web/src/components/DictTypeDialog.vue index c5b4ae62..d04304d3 100644 --- a/main/manager-web/src/components/DictTypeDialog.vue +++ b/main/manager-web/src/components/DictTypeDialog.vue @@ -10,7 +10,7 @@ diff --git a/main/manager-web/src/components/FirmwareDialog.vue b/main/manager-web/src/components/FirmwareDialog.vue index b0fcf521..1e173101 100644 --- a/main/manager-web/src/components/FirmwareDialog.vue +++ b/main/manager-web/src/components/FirmwareDialog.vue @@ -31,7 +31,7 @@ diff --git a/main/manager-web/src/i18n/en.js b/main/manager-web/src/i18n/en.js index 8b5e7ac0..c6803e63 100644 --- a/main/manager-web/src/i18n/en.js +++ b/main/manager-web/src/i18n/en.js @@ -532,9 +532,10 @@ export default { 'paramManagement.addSuccess': 'Add successful', 'paramManagement.updateFailed': 'Update failed', 'paramManagement.addFailed': 'Add failed', + 'home.noConversation': 'No conversation', 'home.justNow': 'Just now', 'home.minutesAgo': '{minutes} minutes ago', - 'home.hoursAgo': '{hours} hours{minutes, plural, one { minute } other { minutes }} ago', + 'home.hoursAgo': '{hours} hours {minutes} minutes ago', 'home.confirmDeleteAgent': 'Are you sure you want to delete this agent?', 'home.deleteSuccess': 'Delete successful', 'home.deleteFailed': 'Delete failed', diff --git a/main/manager-web/src/views/ParamsManagement.vue b/main/manager-web/src/views/ParamsManagement.vue index f501fdc7..088ac430 100644 --- a/main/manager-web/src/views/ParamsManagement.vue +++ b/main/manager-web/src/views/ParamsManagement.vue @@ -280,12 +280,12 @@ export default { }); return; } - this.$confirm(this.$t('paramManagement.confirmBatchDelete', { paramCount }), 'Warning', { - confirmButtonText: 'OK', - cancelButtonText: 'Cancel', + this.$confirm(this.$t('paramManagement.confirmBatchDelete', { paramCount }), this.$t('message.warning'), { + confirmButtonText: this.$t('button.ok'), + cancelButtonText: this.$t('button.cancel'), type: 'warning' }).then(() => { - Api.admin.deleteParams(paramIds, ({ data }) => { + Api.admin.deleteParam(paramIds, ({ data }) => { if (data.code === 0) { this.fetchParams(); this.$message.success({ From 4e0bf5542c9427a5e1d7e1d1ff2220e5aff83303 Mon Sep 17 00:00:00 2001 From: rainv123 <2148537152@qq.com> Date: Fri, 12 Sep 2025 16:14:44 +0800 Subject: [PATCH 4/4] =?UTF-8?q?updata:=E6=99=BA=E6=8E=A7=E5=8F=B0=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=B7=BB=E5=8A=A0=E8=AF=AD=E8=A8=80=E5=88=87=E6=8D=A2?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E4=B8=AD=E8=8B=B1=E7=B9=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/manager-web/src/views/ModelConfig.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main/manager-web/src/views/ModelConfig.vue b/main/manager-web/src/views/ModelConfig.vue index 0008aa54..633b12fb 100644 --- a/main/manager-web/src/views/ModelConfig.vue +++ b/main/manager-web/src/views/ModelConfig.vue @@ -264,7 +264,7 @@ export default { return } - this.$confirm(this.$t('modelConfig.confirmBatchDelete'), this.$t('common.prompt'), { + this.$confirm(this.$t('modelConfig.confirmBatchDelete'), this.$t('message.info'), { confirmButtonText: this.$t('common.confirm'), cancelButtonText: this.$t('common.cancel'), type: 'warning' @@ -310,7 +310,7 @@ export default { }, // 删除单个模型 deleteModel(model) { - this.$confirm(this.$t('modelConfig.confirmDelete'), this.$t('common.prompt'), { + this.$confirm(this.$t('modelConfig.confirmDelete'), this.$t('message.info'), { confirmButtonText: this.$t('common.confirm'), cancelButtonText: this.$t('common.cancel'), type: 'warning'