115 lines
4.4 KiB
TypeScript
115 lines
4.4 KiB
TypeScript
import { defineStore } from 'pinia'
|
||
import { type AuthState } from '@/stores/interface'
|
||
import { getAuthButtonListApi, getAuthMenuListApi } from '@/api/user/login'
|
||
import { getAllBreadcrumbList, getFlatMenuList, getShowMenuList } from '@/utils'
|
||
import { AUTH_STORE_KEY } from '@/stores/constant'
|
||
import { useModeStore } from '@/stores/modules/mode'
|
||
import { getLicense } from '@/api/activate'
|
||
import type { Activate } from '@/api/activate/interface'
|
||
|
||
export const useAuthStore = defineStore(AUTH_STORE_KEY, {
|
||
state: (): AuthState => ({
|
||
// 按钮权限列表
|
||
authButtonList: {},
|
||
// 菜单权限列表
|
||
authMenuList: [],
|
||
// 当前页面的 router name,用来做按钮权限筛选
|
||
routeName: '',
|
||
//登录不显示菜单栏和导航栏,点击进入测试的时候显示
|
||
showMenuFlag: JSON.parse(localStorage.getItem('showMenuFlag') as string),
|
||
activateInfo: {} as Activate.ActivationCodePlaintext
|
||
}),
|
||
getters: {
|
||
// 按钮权限列表
|
||
authButtonListGet: state => state.authButtonList,
|
||
// 菜单权限列表 ==> 这里的菜单没有经过任何处理
|
||
authMenuListGet: state => state.authMenuList,
|
||
// 菜单权限列表 ==> 左侧菜单栏渲染,需要剔除 isHide == true
|
||
showMenuListGet: state => getShowMenuList(state.authMenuList),
|
||
// 菜单权限列表 ==> 扁平化之后的一维数组菜单,主要用来添加动态路由
|
||
flatMenuListGet: state => getFlatMenuList(state.authMenuList),
|
||
// 递归处理后的所有面包屑导航列表
|
||
breadcrumbListGet: state => getAllBreadcrumbList(state.authMenuList),
|
||
//是否显示菜单和导航栏
|
||
showMenuFlagGet: state => state.showMenuFlag,
|
||
// 获取激活信息
|
||
activateInfoGet: state => state.activateInfo
|
||
},
|
||
actions: {
|
||
// Get AuthButtonList
|
||
async getAuthButtonList() {
|
||
const { data } = await getAuthButtonListApi()
|
||
this.authButtonList = data
|
||
},
|
||
// Get AuthMenuList
|
||
async getAuthMenuList() {
|
||
const modeStore = useModeStore()
|
||
|
||
const { data: menuData } = await getAuthMenuListApi()
|
||
// 根据不同模式过滤菜单
|
||
const filteredMenu =
|
||
modeStore.currentMode === '比对式'
|
||
? filterMenuByExcludedNames(menuData, ['testSource', 'testScript', 'controlSource'])
|
||
: filterMenuByExcludedNames(menuData, ['standardDevice'])
|
||
|
||
this.authMenuList = filteredMenu
|
||
},
|
||
// Set RouteName
|
||
async setRouteName(name: string) {
|
||
this.routeName = name
|
||
},
|
||
//重置权限
|
||
async resetAuthStore() {
|
||
this.showMenuFlag = false
|
||
localStorage.removeItem('showMenuFlag')
|
||
},
|
||
//修改判断菜单栏/导航栏显示条件
|
||
async setShowMenu() {
|
||
this.showMenuFlag = true
|
||
localStorage.setItem('showMenuFlag', 'true')
|
||
},
|
||
//更改模式
|
||
changeModel() {
|
||
this.showMenuFlag = false
|
||
localStorage.removeItem('showMenuFlag')
|
||
},
|
||
async setActivateInfo() {
|
||
const license_result = await getLicense()
|
||
const licenseData = license_result.data as Activate.ActivationCodePlaintext
|
||
if (!licenseData.simulate) {
|
||
licenseData.simulate = {
|
||
permanently: 0
|
||
}
|
||
}
|
||
if (!licenseData.digital) {
|
||
licenseData.digital = {
|
||
permanently: 0
|
||
}
|
||
}
|
||
if (!licenseData.contrast) {
|
||
licenseData.contrast = {
|
||
permanently: 0
|
||
}
|
||
}
|
||
this.activateInfo = licenseData
|
||
}
|
||
}
|
||
})
|
||
|
||
/**
|
||
* 通用菜单过滤函数
|
||
* @param menuList 菜单列表
|
||
* @param excludedNames 需要排除的菜单名称数组
|
||
* @returns 过滤后的菜单列表
|
||
*/
|
||
function filterMenuByExcludedNames(menuList: any[], excludedNames: string[]): any[] {
|
||
return menuList.filter(menu => {
|
||
// 如果当前项有 children,递归处理子项
|
||
if (menu.children && menu.children.length > 0) {
|
||
menu.children = filterMenuByExcludedNames(menu.children, excludedNames)
|
||
}
|
||
// 过滤掉在排除列表中的菜单项
|
||
return !excludedNames.includes(menu.name)
|
||
})
|
||
}
|