feat: API层与认证流(client拦截/守卫/登录改密实装/域API骨架/vitest)
- 自建轻量 axios client(src/api/client.ts):Bearer 注入、401 清会话跳登录
(login 请求除外)、409 精确匹配"必须先修改初始密码"跳强制改密(区别于并发
冲突 409)、429/网络错误统一 ElMessage、ApiError 标准化、showErrorMessage
可opt-out——模板 utils/http 的 {code,msg,data} 信封与后端裸 HTTP 语义不符故弃用
- Pinia auth store(src/store/modules/auth.ts):token/role/tenant_slug/
must_change 落地并持久化(all-kefu-auth key),login/logout/changePassword/
会话过期/强制改密跳转(动态 import 断循环)
- 路由守卫:token 事实源判定、must_change 全站门(除改密页)、UserInfo 由登录
快照派生(后端无用户信息端点);user store 残留自愈
- 登录页实装(去除角色调试开关)、强制改密页实装;用户菜单/锁屏对接真实 logout
- 域 API 骨架:tenants/config/conversations/stats/settings(类型+端点常量)
- mask 哨兵助手:__SET__ ↔ 已设置 表单语义
- vitest 25 例(client 11/store 8/mask 6);登录页拖拽验证 reset 空引用修复
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -56,6 +56,7 @@
|
||||
import { useRouter } from 'vue-router'
|
||||
import { ElMessageBox } from 'element-plus'
|
||||
import { useUserStore } from '@/store/modules/user'
|
||||
import { useAuthStore } from '@/store/modules/auth'
|
||||
import { mittBus } from '@/utils/sys'
|
||||
|
||||
defineOptions({ name: 'ArtUserMenu' })
|
||||
@@ -63,6 +64,7 @@
|
||||
const router = useRouter()
|
||||
const { t } = useI18n()
|
||||
const userStore = useUserStore()
|
||||
const authStore = useAuthStore()
|
||||
|
||||
const { getUserInfo: userInfo } = storeToRefs(userStore)
|
||||
const userMenuPopover = ref()
|
||||
@@ -93,7 +95,8 @@
|
||||
cancelButtonText: t('common.cancel'),
|
||||
customClass: 'login-out-dialog'
|
||||
}).then(() => {
|
||||
userStore.logOut()
|
||||
// 先调后端撤销 token(best effort),再走模板全套本地清理 + 跳登录
|
||||
void authStore.logout()
|
||||
})
|
||||
}, 200)
|
||||
}
|
||||
|
||||
@@ -112,6 +112,7 @@
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import CryptoJS from 'crypto-js'
|
||||
import { useUserStore } from '@/store/modules/user'
|
||||
import { useAuthStore } from '@/store/modules/auth'
|
||||
import { mittBus } from '@/utils/sys'
|
||||
|
||||
// 国际化
|
||||
@@ -122,6 +123,7 @@
|
||||
|
||||
// Store
|
||||
const userStore = useUserStore()
|
||||
const authStore = useAuthStore()
|
||||
const { info: userInfo, lockPassword, isLock } = storeToRefs(userStore)
|
||||
|
||||
// 响应式数据
|
||||
@@ -400,7 +402,8 @@
|
||||
}
|
||||
|
||||
const toLogin = () => {
|
||||
userStore.logOut()
|
||||
// 锁屏页"返回登录":先撤销后端 token,再走本地清理 + 跳登录
|
||||
void authStore.logout()
|
||||
}
|
||||
|
||||
const openLockScreen = () => {
|
||||
|
||||
Reference in New Issue
Block a user