admin_new/src/stores/user.ts
Sisyphus 6d02a4b5d2 feat(F006): W2 + W4 + W31 admin_new 全部改动首次 commit
- W2: 4 主题 (科技蓝/中国红/Notion 紫/暗夜黑) + LoginView + DashboardView + 询价管理 (InquiryList + InquiryDetail)
- W4.1: 集成管理 - 应用列表 (OpenAppListView)
- W4.2: 集成管理 - 审计日志 (AuditLogListView) + 菜单 label 补全
- W4.2: 菜单从后端拉 + 看板接真 API
- W31: safeParseArray 防御 localStorage permissions 损坏 (运营后台白屏修复)

关联: Mac F002-W31-交接文档.md / F006-W4-交接文档.md / GIT-AUDIT-REPORT-2026-06-24.md
本地备份: ~/projects/_meta/f002-fix/admin-new-w4-*/
2026-06-24 11:05:18 +08:00

42 lines
1.4 KiB
TypeScript

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<string | null>(localStorage.getItem(STORAGE_KEY))
const username = ref<string>(localStorage.getItem('username') || '')
const permissions = ref<string[]>(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 }
})