- 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-*/
42 lines
1.4 KiB
TypeScript
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 }
|
|
})
|