fix: 修复web、h5同时打开token失效问题

This commit is contained in:
zhuoqinglian
2026-03-10 16:15:09 +08:00
parent ff1076deac
commit d86387971a
2 changed files with 41 additions and 37 deletions
+39 -36
View File
@@ -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)
} }
} }
@@ -287,19 +288,21 @@ onMounted(async () => {
</text> </text>
</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">
<wd-icon name="setting" custom-class="server-icon" /> <!-- 服务端设置按钮 -->
</view> <view class="server-btn" @click="goToServerSetting">
</view> <wd-icon name="setting" custom-class="server-icon" />
</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 {
+2 -1
View File
@@ -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)