fix(pda): revoke expired sessions before completing logout

This commit is contained in:
2026-10-05 13:41:34 +08:00
parent 7aebbd2a70
commit e699e9d9ba
8 changed files with 192 additions and 18 deletions
+16 -7
View File
@@ -2,10 +2,10 @@
<view v-if="user" class="page-shell portal-page"><PortalHeader title="个人中心" :user="user" :show-profile="false" /><view class="portal-content profile-content"><view class="profile-card"><view class="profile-avatar">{{ user.name.slice(0, 1) }}</view><view><text class="profile-name">{{ user.name }}</text><text class="profile-role">国内仓作业员</text></view></view><view class="profile-list"><view class="profile-row"><text>作业仓库</text><text class="profile-value">{{ user.warehouse }}</text></view><view class="profile-row"><text>当前班次</text><text class="profile-value">08:00–17:00</text></view><view class="profile-row"><text>应用版本</text><text class="profile-value">{{ appVersion }}</text></view><button class="profile-row profile-row-action" @tap="checkUpdate"><text>检查更新</text><text class="profile-row-arrow">›</text></button><button class="profile-row profile-row-action" @tap="showSettings"><text>系统设置</text><text class="profile-row-arrow">›</text></button></view><button class="logout-action" @tap="openLogout">退出登录</button></view><uni-popup ref="logoutPopup" type="center" :is-mask-click="true" @change="handleLogoutChange"><view class="logout-dialog-card" role="dialog" aria-modal="true" aria-label="确认退出登录"><PopupHeader title="确认退出登录?" tone="danger" @close="closeLogout" /><text class="logout-dialog-content">退出后会清空本次会话中的箱号草稿、扫码记录与作业进度。</text><view class="logout-dialog-actions"><button class="logout-dialog-cancel" @tap="closeLogout">取消</button><button class="logout-dialog-confirm" @tap="logout">确认退出</button></view></view></uni-popup><view v-if="toast" class="app-toast warning" role="status">设置功能将在后续版本开放</view></view>
</template>
<script>
import { logout as logoutRequest } from '@/api/auth.js'
import { logoutCurrentSession } from '@/api/logout-session.js'
import PortalHeader from '@/components/PortalHeader.vue'
import PopupHeader from '@/components/PopupHeader.vue'
import { session, requireSession, signOut } from '@/stores/session.js'
import { session, requireSession, getSessionRevision } from '@/stores/session.js'
import { checkForAppUpdate } from '@/utils/app-update.js'
export default {
@@ -34,11 +34,20 @@
handleLogoutChange(event) { this.logoutOpen = Boolean(event.show) },
showSettings() { clearTimeout(this._toastTimer); this.toast = true; this._toastTimer = setTimeout(() => { this.toast = false }, 2200) },
logout() {
const refreshToken = session.refreshToken
const accessToken = session.token
signOut()
uni.reLaunch({ url: '/pages/login/login' })
if (refreshToken) logoutRequest(refreshToken, accessToken).catch(() => {})
if (this._logoutPromise) return this._logoutPromise
this.closeLogout()
const operation = logoutCurrentSession()
this.user = null
this._logoutPromise = operation.then(result => {
if (getSessionRevision() === result.clearedRevision) uni.reLaunch({ url: '/pages/login/login' })
return result
}, error => {
if (getSessionRevision() === error.logoutRevision) {
uni.reLaunch({ url: '/pages/login/login', complete() { uni.showToast({ title: '已清除本地登录,服务端退出未确认', icon: 'none', duration: 3000 }) } })
}
return { revoked: false, error }
})
return this._logoutPromise
}
}
}