Merge branch 'main' into mqtt-call

This commit is contained in:
hrz
2025-09-18 15:02:32 +08:00
committed by GitHub
42 changed files with 1523 additions and 261 deletions
+15 -1
View File
@@ -2,6 +2,7 @@ import Fly from 'flyio/dist/npm/fly';
import store from '../store/index';
import Constant from '../utils/constant';
import { goToPage, isNotNull, showDanger, showWarning } from '../utils/index';
import i18n from '../i18n/index';
const fly = new Fly()
// 设置超时
@@ -27,6 +28,16 @@ function sendRequest() {
_url: '',
_responseType: undefined, // 新增响应类型字段
'send'() {
// 设置语言请求头
const currentLang = i18n.locale;
// 转换语言代码格式,将zh_CN转换为zh-CN
let acceptLanguage = currentLang.replace('_', '-');
// 为英语添加默认地区代码
if (acceptLanguage === 'en') {
acceptLanguage = 'en-US';
}
this._header['Accept-Language'] = acceptLanguage;
if (isNotNull(store.getters.getToken)) {
this._header.Authorization = 'Bearer ' + (JSON.parse(store.getters.getToken)).token
}
@@ -116,10 +127,13 @@ function httpHandlerError(info, failCallback, networkFailCallback) {
goToPage(Constant.PAGE.LOGIN, true);
return true
} else {
// 直接使用后端返回的国际化消息
let errorMessage = info.data.msg;
if (failCallback) {
failCallback(info)
} else {
showDanger(info.data.msg)
showDanger(errorMessage)
}
return true
}
@@ -195,7 +195,7 @@ export default {
this.saving = true;
if (!this.formData.supplier) {
this.$message.error('请选择供应器');
this.$message.error(this.$t('addModelDialog.requiredSupplier'));
this.saving = false;
return;
}
+40 -1
View File
@@ -1,4 +1,11 @@
export default {
// Login page related prompt text
'login.requiredUsername': 'Username cannot be empty',
'login.requiredPassword': 'Password cannot be empty',
'login.requiredCaptcha': 'Captcha cannot be empty',
'login.requiredMobile': 'Please enter a valid mobile phone number',
'login.loginSuccess': 'Login successful!',
// HeaderBar组件文本
'header.smartManagement': 'Agents',
'header.modelConfig': 'Models',
@@ -220,6 +227,38 @@ export default {
// Manual add device dialog related
'manualAddDeviceDialog.title': 'Manual Add Device',
// AddModelDialog component related
'addModelDialog.requiredSupplier': 'Please select a supplier',
// Register page related
'register.title': 'Create Account',
'register.welcome': 'Welcome to XiaoZhi AI',
'register.usernamePlaceholder': 'Please enter username',
'register.mobilePlaceholder': 'Please enter mobile phone number',
'register.captchaPlaceholder': 'Please enter captcha',
'register.mobileCaptchaPlaceholder': 'Please enter SMS verification code',
'register.passwordPlaceholder': 'Please set password',
'register.confirmPasswordPlaceholder': 'Please confirm password',
'register.goToLogin': 'Already have an account? Login',
'register.registerButton': 'Register',
'register.agreeTo': 'By registering, you agree to our',
'register.userAgreement': 'User Agreement',
'register.privacyPolicy': 'Privacy Policy',
'register.notAllowRegister': 'User registration is not allowed',
'register.captchaLoadFailed': 'Failed to load captcha',
'register.inputCaptcha': 'Please enter captcha',
'register.inputCorrectMobile': 'Please enter correct mobile phone number',
'register.captchaSendSuccess': 'Verification code sent successfully',
'register.captchaSendFailed': 'Failed to send verification code',
'register.passwordsNotMatch': 'Passwords do not match',
'register.registerSuccess': 'Registration successful!',
'register.registerFailed': 'Registration failed',
'register.requiredUsername': 'Username cannot be empty',
'register.requiredPassword': 'Password cannot be empty',
'register.requiredCaptcha': 'Captcha cannot be empty',
'register.requiredMobileCaptcha': 'Please enter SMS verification code',
'manualAddDeviceDialog.deviceType': 'Device Type',
'manualAddDeviceDialog.deviceTypePlaceholder': 'Please select device type',
'manualAddDeviceDialog.firmwareVersion': 'Firmware Version',
@@ -416,7 +455,7 @@ export default {
'device.search': 'Search',
'device.selectAll': 'Select All/Deselect All',
'deviceManagement.loading': 'Loading...',
'device.bindWithCode': 'Bind with Verification Code',
'device.bindWithCode': '6-digit Verification Code Binding',
'device.manualAdd': 'Manual Add',
'device.unbind': 'Unbind',
'device.toolCall': 'Tool Call',
+40 -1
View File
@@ -1,4 +1,11 @@
export default {
// 登录页面相关提示文本
'login.requiredUsername': '用户名不能为空',
'login.requiredPassword': '密码不能为空',
'login.requiredCaptcha': '验证码不能为空',
'login.requiredMobile': '请输入正确的手机号码',
'login.loginSuccess': '登录成功!',
// HeaderBar组件文本
'header.smartManagement': '智能体管理',
'header.modelConfig': '模型配置',
@@ -220,6 +227,38 @@ export default {
// 手動添加設備對話框相關
'manualAddDeviceDialog.title': '手动添加设备',
// AddModelDialog组件相关
'addModelDialog.requiredSupplier': '请选择供应器',
// 注册页面相关
'register.title': '创建账号',
'register.welcome': '欢迎使用小智AI',
'register.usernamePlaceholder': '请输入用户名',
'register.mobilePlaceholder': '请输入手机号码',
'register.captchaPlaceholder': '请输入验证码',
'register.mobileCaptchaPlaceholder': '请输入短信验证码',
'register.passwordPlaceholder': '请设置密码',
'register.confirmPasswordPlaceholder': '请确认密码',
'register.goToLogin': '已有账号?登录',
'register.registerButton': '注册',
'register.agreeTo': '注册即表示您同意我们的',
'register.userAgreement': '用户协议',
'register.privacyPolicy': '隐私政策',
'register.notAllowRegister': '当前不允许用户注册',
'register.captchaLoadFailed': '验证码加载失败',
'register.inputCaptcha': '请输入验证码',
'register.inputCorrectMobile': '请输入正确的手机号码',
'register.captchaSendSuccess': '验证码发送成功',
'register.captchaSendFailed': '验证码发送失败',
'register.passwordsNotMatch': '两次输入的密码不一致',
'register.registerSuccess': '注册成功!',
'register.registerFailed': '注册失败',
'register.requiredUsername': '用户名不能为空',
'register.requiredPassword': '密码不能为空',
'register.requiredCaptcha': '验证码不能为空',
'register.requiredMobileCaptcha': '请输入短信验证码',
'manualAddDeviceDialog.deviceType': '设备型号',
'manualAddDeviceDialog.deviceTypePlaceholder': '请选择设备型号',
'manualAddDeviceDialog.firmwareVersion': '固件版本',
@@ -417,7 +456,7 @@ export default {
'device.search': '搜索',
'device.selectAll': '全选/取消全选',
'deviceManagement.loading': '拼命加载中',
'device.bindWithCode': '码绑定',
'device.bindWithCode': '6位验证码绑定',
'device.manualAdd': '手动添加',
'device.unbind': '解绑',
'device.toolCall': '工具调用',
+40 -1
View File
@@ -1,4 +1,11 @@
export default {
// 登錄頁面相關提示文本
'login.requiredUsername': '用戶名不能為空',
'login.requiredPassword': '密碼不能為空',
'login.requiredCaptcha': '驗證碼不能為空',
'login.requiredMobile': '請輸入正確的手機號碼',
'login.loginSuccess': '登錄成功!',
// HeaderBar组件文本
'header.smartManagement': '智能體管理',
'header.modelConfig': '模型配置',
@@ -220,6 +227,38 @@ export default {
// 手動添加設備對話框相關
'manualAddDeviceDialog.title': '手動添加設備',
// AddModelDialog組件相關
'addModelDialog.requiredSupplier': '請選擇供應器',
// 註冊頁面相關
'register.title': '建立帳號',
'register.welcome': '歡迎使用小智慧AI',
'register.usernamePlaceholder': '請輸入用戶名',
'register.mobilePlaceholder': '請輸入手機號碼',
'register.captchaPlaceholder': '請輸入驗證碼',
'register.mobileCaptchaPlaceholder': '請輸入簡訊驗證碼',
'register.passwordPlaceholder': '請設定密碼',
'register.confirmPasswordPlaceholder': '請確認密碼',
'register.goToLogin': '已有帳號?登錄',
'register.registerButton': '註冊',
'register.agreeTo': '註冊即表示您同意我們的',
'register.userAgreement': '用戶協議',
'register.privacyPolicy': '隱私政策',
'register.notAllowRegister': '當前不允許用戶註冊',
'register.captchaLoadFailed': '驗證碼加載失敗',
'register.inputCaptcha': '請輸入驗證碼',
'register.inputCorrectMobile': '請輸入正確的手機號碼',
'register.captchaSendSuccess': '驗證碼發送成功',
'register.captchaSendFailed': '驗證碼發送失敗',
'register.passwordsNotMatch': '兩次輸入的密碼不一致',
'register.registerSuccess': '註冊成功!',
'register.registerFailed': '註冊失敗',
'register.requiredUsername': '用戶名不能為空',
'register.requiredPassword': '密碼不能為空',
'register.requiredCaptcha': '驗證碼不能為空',
'register.requiredMobileCaptcha': '請輸入簡訊驗證碼',
'manualAddDeviceDialog.deviceType': '設備型號',
'manualAddDeviceDialog.deviceTypePlaceholder': '請選擇設備型號',
'manualAddDeviceDialog.firmwareVersion': '固件版本',
@@ -416,7 +455,7 @@ export default {
'device.search': '搜索',
'device.selectAll': '全選/取消全選',
'deviceManagement.loading': '拼命加載中',
'device.bindWithCode': '驗證碼綁定',
'device.bindWithCode': '6位驗證碼綁定',
'device.manualAdd': '手動添加',
'device.unbind': '解綁',
'device.toolCall': '工具調用',
+12 -9
View File
@@ -252,9 +252,9 @@ export default {
},
// 封装输入验证逻辑
validateInput(input, message) {
validateInput(input, messageKey) {
if (!input.trim()) {
showDanger(message);
showDanger(this.$t(messageKey));
return false;
}
return true;
@@ -264,24 +264,24 @@ export default {
if (this.isMobileLogin) {
// 手机号登录验证
if (!validateMobile(this.form.mobile, this.form.areaCode)) {
showDanger("请输入正确的手机号码");
showDanger(this.$t('login.requiredMobile'));
return;
}
// 拼接手机号作为用户名
this.form.username = this.form.areaCode + this.form.mobile;
} else {
// 用户名登录验证
if (!this.validateInput(this.form.username, "用户名不能为空")) {
if (!this.validateInput(this.form.username, 'login.requiredUsername')) {
return;
}
}
// 验证密码
if (!this.validateInput(this.form.password, "密码不能为空")) {
if (!this.validateInput(this.form.password, 'login.requiredPassword')) {
return;
}
// 验证验证码
if (!this.validateInput(this.form.captcha, "验证码不能为空")) {
if (!this.validateInput(this.form.captcha, 'login.requiredCaptcha')) {
return;
}
@@ -289,16 +289,19 @@ export default {
Api.user.login(
this.form,
({ data }) => {
showSuccess("登录成功!");
showSuccess(this.$t('login.loginSuccess'));
this.$store.commit("setToken", JSON.stringify(data.data));
goToPage("/home");
},
(err) => {
showDanger(err.data.msg || "登录失败");
// 直接使用后端返回的国际化消息
let errorMessage = err.data.msg || "登录失败";
showDanger(errorMessage);
if (
err.data != null &&
err.data.msg != null &&
err.data.msg.indexOf("图形验证码") > -1
err.data.msg.indexOf("图形验证码") > -1 || err.data.msg.indexOf("Captcha") > -1
) {
this.fetchCaptcha();
}
+6 -6
View File
@@ -47,7 +47,7 @@
<img loading="lazy" alt="" class="input-icon" src="@/assets/login/shield.png" />
<el-input v-model="form.captcha" :placeholder="$t('register.captchaPlaceholder')" style="flex: 1;" />
</div>
<img loading="lazy" v-if="captchaUrl" :src="captchaUrl" alt="验证码"
<img loading="lazy" v-if="captchaUrl" :src="captchaUrl" alt="验证码"
style="width: 150px; height: 40px; cursor: pointer;" @click="fetchCaptcha" />
</div>
@@ -61,7 +61,7 @@
<el-button type="primary" class="send-captcha-btn" :disabled="!canSendMobileCaptcha"
@click="sendMobileCaptcha">
<span>
{{ countdown > 0 ? `${countdown}秒后重试` : $t('register.sendCaptcha') }}
{{ countdown > 0 ? `${countdown}${$t('register.secondsLater')}` : $t('register.sendCaptcha') }}
</span>
</el-button>
</div>
@@ -248,18 +248,18 @@ export default {
return;
}
if (!this.form.mobileCaptcha) {
showDanger('请输入手机验证码');
showDanger(this.$t('register.requiredMobileCaptcha'));
return;
}
} else {
// 用户名注册验证
if (!this.validateInput(this.form.username, '用户名不能为空')) {
if (!this.validateInput(this.form.username, this.$t('register.requiredUsername'))) {
return;
}
}
// 验证密码
if (!this.validateInput(this.form.password, '密码不能为空')) {
if (!this.validateInput(this.form.password, this.$t('register.requiredPassword'))) {
return;
}
if (this.form.password !== this.form.confirmPassword) {
@@ -267,7 +267,7 @@ export default {
return
}
// 验证验证码
if (!this.validateInput(this.form.captcha, '验证码不能为空')) {
if (!this.validateInput(this.form.captcha, this.$t('register.requiredCaptcha'))) {
return;
}