mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-22 23:23:55 +08:00
Merge branch 'main' into mqtt-call
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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': '工具调用',
|
||||
|
||||
@@ -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': '工具調用',
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user