mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-29 05:43:56 +08:00
fix: 修复web、h5同时打开token失效问题
This commit is contained in:
@@ -9,17 +9,16 @@
|
|||||||
</route>
|
</route>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import type { LoginData } from '@/api/auth';
|
import type { LoginData } from '@/api/auth'
|
||||||
import { computed, onMounted, ref } from 'vue';
|
import type { Language } from '@/store/lang'
|
||||||
import { login } from '@/api/auth';
|
import { computed, onMounted, ref } from 'vue'
|
||||||
import { useConfigStore } from '@/store';
|
import { login } from '@/api/auth'
|
||||||
import { getEnvBaseUrl } from '@/utils';
|
|
||||||
import { toast } from '@/utils/toast';
|
|
||||||
// 导入国际化相关功能
|
// 导入国际化相关功能
|
||||||
import { t, changeLanguage, getSupportedLanguages, initI18n } from '@/i18n';
|
import { changeLanguage, getSupportedLanguages, initI18n, t } from '@/i18n'
|
||||||
import type { Language } from '@/store/lang';
|
import { useConfigStore } from '@/store'
|
||||||
// 导入SM2加密工具
|
// 导入SM2加密工具
|
||||||
import { sm2Encrypt } from '@/utils'
|
import { getEnvBaseUrl, sm2Encrypt } from '@/utils'
|
||||||
|
import { toast } from '@/utils/toast'
|
||||||
|
|
||||||
// 获取屏幕边界到安全区域距离
|
// 获取屏幕边界到安全区域距离
|
||||||
let safeAreaInsets
|
let safeAreaInsets
|
||||||
@@ -134,7 +133,7 @@ function generateUUID() {
|
|||||||
|
|
||||||
let skipReLaunch = false // 全局或组件作用域
|
let skipReLaunch = false // 全局或组件作用域
|
||||||
|
|
||||||
//跳转至服务端设置页面
|
// 跳转至服务端设置页面
|
||||||
function goToServerSetting() {
|
function goToServerSetting() {
|
||||||
uni.switchTab({
|
uni.switchTab({
|
||||||
url: '/pages/settings/index',
|
url: '/pages/settings/index',
|
||||||
@@ -143,9 +142,9 @@ function goToServerSetting() {
|
|||||||
|
|
||||||
// 获取验证码
|
// 获取验证码
|
||||||
async function refreshCaptcha() {
|
async function refreshCaptcha() {
|
||||||
const uuid = generateUUID();
|
const uuid = generateUUID()
|
||||||
formData.value.captchaId = uuid;
|
formData.value.captchaId = uuid
|
||||||
captchaImage.value = `${getEnvBaseUrl()}/user/captcha?uuid=${uuid}&t=${Date.now()}`;
|
captchaImage.value = `${getEnvBaseUrl()}/user/captcha?uuid=${uuid}&t=${Date.now()}`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 登录
|
// 登录
|
||||||
@@ -193,7 +192,8 @@ async function handleLogin() {
|
|||||||
// 拼接验证码和密码
|
// 拼接验证码和密码
|
||||||
const captchaAndPassword = formData.value.captcha + formData.value.password
|
const captchaAndPassword = formData.value.captcha + formData.value.password
|
||||||
encryptedPassword = sm2Encrypt(sm2PublicKey.value, captchaAndPassword)
|
encryptedPassword = sm2Encrypt(sm2PublicKey.value, captchaAndPassword)
|
||||||
} catch (error) {
|
}
|
||||||
|
catch (error) {
|
||||||
console.error('密码加密失败:', error)
|
console.error('密码加密失败:', error)
|
||||||
toast.warning(t('sm2.encryptionFailed'))
|
toast.warning(t('sm2.encryptionFailed'))
|
||||||
return
|
return
|
||||||
@@ -203,20 +203,20 @@ async function handleLogin() {
|
|||||||
const loginData: LoginData = {
|
const loginData: LoginData = {
|
||||||
username: '',
|
username: '',
|
||||||
password: encryptedPassword,
|
password: encryptedPassword,
|
||||||
captchaId: formData.value.captchaId
|
captchaId: formData.value.captchaId,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果是手机号登录,将区号+手机号拼接到username字段
|
// 如果是手机号登录,将区号+手机号拼接到username字段
|
||||||
if (loginType.value === 'mobile') {
|
if (loginType.value === 'mobile') {
|
||||||
loginData.username = `${selectedAreaCode.value}${formData.value.mobile}`
|
loginData.username = `${selectedAreaCode.value}${formData.value.mobile}`
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
loginData.username = formData.value.username
|
loginData.username = formData.value.username
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = await login(loginData)
|
const response = await login(loginData)
|
||||||
// 存储token
|
// 存储token
|
||||||
uni.setStorageSync('token', response.token)
|
uni.setStorageSync('token', JSON.stringify(response))
|
||||||
uni.setStorageSync('expire', response.expire)
|
|
||||||
|
|
||||||
toast.success(t('message.loginSuccess'))
|
toast.success(t('message.loginSuccess'))
|
||||||
|
|
||||||
@@ -267,7 +267,8 @@ onMounted(async () => {
|
|||||||
if (!configStore.config.name) {
|
if (!configStore.config.name) {
|
||||||
try {
|
try {
|
||||||
await configStore.fetchPublicConfig()
|
await configStore.fetchPublicConfig()
|
||||||
} catch (error) {
|
}
|
||||||
|
catch (error) {
|
||||||
console.error(t('login.fetchConfigError'), error)
|
console.error(t('login.fetchConfigError'), error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -288,18 +289,20 @@ onMounted(async () => {
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 右上角按钮组 -->
|
<!-- 右上角按钮组 -->
|
||||||
<view class="top-right-buttons" :style="{ top: `${safeAreaInsets?.top + 10}px` }">
|
<view class="top-right-buttons" :style="{ top: `${safeAreaInsets?.top + 10}px` }">
|
||||||
<!-- 语言切换按钮 -->
|
<!-- 语言切换按钮 -->
|
||||||
<view class="lang-btn" @click="showLanguageSheet = true">
|
<view class="lang-btn" @click="showLanguageSheet = true">
|
||||||
<text class="lang-text-icon">{{ t('login.selectLanguageTip') }}</text>
|
<text class="lang-text-icon">
|
||||||
</view>
|
{{ t('login.selectLanguageTip') }}
|
||||||
|
</text>
|
||||||
|
</view>
|
||||||
|
|
||||||
<!-- 服务端设置按钮 -->
|
<!-- 服务端设置按钮 -->
|
||||||
<view class="server-btn" @click="goToServerSetting">
|
<view class="server-btn" @click="goToServerSetting">
|
||||||
<wd-icon name="setting" custom-class="server-icon" />
|
<wd-icon name="setting" custom-class="server-icon" />
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<view class="form-container">
|
<view class="form-container">
|
||||||
<view class="form">
|
<view class="form">
|
||||||
@@ -893,7 +896,7 @@ onMounted(async () => {
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
background: rgba(255, 255, 255, 0.15);
|
background: rgba(255, 255, 255, 0.15);
|
||||||
border-radius: 24rpx;
|
border-radius: 24rpx;
|
||||||
box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.2);
|
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.2);
|
||||||
|
|
||||||
&:active {
|
&:active {
|
||||||
transform: scale(0.95);
|
transform: scale(0.95);
|
||||||
@@ -901,7 +904,7 @@ onMounted(async () => {
|
|||||||
|
|
||||||
.lang-text-icon {
|
.lang-text-icon {
|
||||||
font-size: 18rpx;
|
font-size: 18rpx;
|
||||||
color: #FFFFFF;
|
color: #ffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
@@ -919,7 +922,7 @@ onMounted(async () => {
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
background: rgba(255, 255, 255, 0.15);
|
background: rgba(255, 255, 255, 0.15);
|
||||||
border-radius: 24rpx;
|
border-radius: 24rpx;
|
||||||
box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.2);
|
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.2);
|
||||||
|
|
||||||
&:active {
|
&:active {
|
||||||
transform: scale(0.95);
|
transform: scale(0.95);
|
||||||
@@ -927,7 +930,7 @@ onMounted(async () => {
|
|||||||
|
|
||||||
.server-icon {
|
.server-icon {
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
color: #FFFFFF;
|
color: #ffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
|
|||||||
@@ -51,10 +51,11 @@ export const useUserStore = defineStore(
|
|||||||
*/
|
*/
|
||||||
const getUserInfo = async () => {
|
const getUserInfo = async () => {
|
||||||
const userData = await _getUserInfo()
|
const userData = await _getUserInfo()
|
||||||
|
const authInfo = JSON.parse(uni.getStorageSync('token') || '{}')
|
||||||
const userInfoWithExtras = {
|
const userInfoWithExtras = {
|
||||||
...userData,
|
...userData,
|
||||||
avatar: userInfoState.avatar,
|
avatar: userInfoState.avatar,
|
||||||
token: uni.getStorageSync('token') || '',
|
token: authInfo.token || '',
|
||||||
}
|
}
|
||||||
setUserInfo(userInfoWithExtras)
|
setUserInfo(userInfoWithExtras)
|
||||||
uni.setStorageSync('userInfo', userInfoWithExtras)
|
uni.setStorageSync('userInfo', userInfoWithExtras)
|
||||||
|
|||||||
Reference in New Issue
Block a user