import { defineStore } from 'pinia' import { ref, computed } from 'vue' /** * 用户 Store * 架构:token 存 localStorage(同源 cookie 受限),Pinia 只存 user info * 后期可加 token 自动刷新逻辑 */ const STORAGE_KEY = 'access_token' export const useUserStore = defineStore('user', () => { const token = ref(localStorage.getItem(STORAGE_KEY)) const username = ref(localStorage.getItem('username') || '') const permissions = ref(JSON.parse(localStorage.getItem('permissions') || '[]')) const isLoggedIn = computed(() => !!token.value) function setAuth(payload: { token: string; username: string; permissions?: string[] }) { token.value = payload.token username.value = payload.username permissions.value = payload.permissions || [] localStorage.setItem(STORAGE_KEY, payload.token) localStorage.setItem('username', payload.username) localStorage.setItem('permissions', JSON.stringify(payload.permissions || [])) } function logout() { token.value = null username.value = '' permissions.value = [] localStorage.removeItem(STORAGE_KEY) localStorage.removeItem('username') localStorage.removeItem('permissions') } function hasPermission(code: string): boolean { return permissions.value.includes('*:*:*') || permissions.value.includes(code) } return { token, username, permissions, isLoggedIn, setAuth, logout, hasPermission } })