feat: 第一阶段基础框架搭建
后端 (Laravel 10 + Sanctum): - RBAC 四层权限系统 (users→roles→permissions→menus) - 门店隔离中间件 (BelongsToStore Trait + StoreIsolation Middleware) - 操作日志中间件 (自动记录写操作) - 权限检查中间件 (CheckPermission) - 16张数据库表迁移 (系统基础+RBAC+字典+配置) - 11个 Eloquent Model - Auth API (登录/登出/用户信息) - 系统设置模块 CRUD (门店/部门/职务/用户/角色/菜单/权限/字典/日志) - 45条 RESTful API 路由 - InitSeeder 初始数据 (超管/角色/76权限/31菜单) 前端 (Vue 3 + Element Plus + Vite): - Axios 请求封装 + Token 注入 - Pinia 状态管理 (user + permission store) - 动态路由 (服务端菜单→前端路由自动生成) - 后台布局 (侧边栏+顶栏+主内容区) - 登录页 + 仪表盘首页 - 系统设置 7 个 CRUD 页面 技术方案文档 (7卷): - 技术总览/数据库设计/API规范/RBAC设计/模块详设/小程序设计/部署方案
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref, computed } from 'vue'
|
||||
import { login as loginApi, logout as logoutApi, getMe } from '@/api/auth.js'
|
||||
|
||||
export const useUserStore = defineStore('user', () => {
|
||||
const token = ref(localStorage.getItem('token') || '')
|
||||
const userInfo = ref(null)
|
||||
const permissions = ref([])
|
||||
const menus = ref([])
|
||||
|
||||
// Getters
|
||||
const isLoggedIn = computed(() => !!token.value)
|
||||
const isSuper = computed(() => userInfo.value?.is_super === true || userInfo.value?.is_super === 1)
|
||||
|
||||
// Actions
|
||||
async function login(credentials) {
|
||||
const res = await loginApi(credentials)
|
||||
const { token: newToken, user } = res.data
|
||||
token.value = newToken
|
||||
userInfo.value = user
|
||||
localStorage.setItem('token', newToken)
|
||||
return res
|
||||
}
|
||||
|
||||
async function getInfo() {
|
||||
const res = await getMe()
|
||||
const { user, permissions: perms, menus: menuList } = res.data
|
||||
userInfo.value = user
|
||||
permissions.value = perms || []
|
||||
menus.value = menuList || []
|
||||
return res
|
||||
}
|
||||
|
||||
async function logout() {
|
||||
try {
|
||||
await logoutApi()
|
||||
} catch {
|
||||
// Ignore logout API errors — clear local state regardless
|
||||
} finally {
|
||||
token.value = ''
|
||||
userInfo.value = null
|
||||
permissions.value = []
|
||||
menus.value = []
|
||||
localStorage.removeItem('token')
|
||||
localStorage.removeItem('userInfo')
|
||||
}
|
||||
}
|
||||
|
||||
function hasPermission(permCode) {
|
||||
if (isSuper.value) return true
|
||||
return permissions.value.includes(permCode)
|
||||
}
|
||||
|
||||
return {
|
||||
token,
|
||||
userInfo,
|
||||
permissions,
|
||||
menus,
|
||||
isLoggedIn,
|
||||
isSuper,
|
||||
login,
|
||||
getInfo,
|
||||
logout,
|
||||
hasPermission
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user