92 lines
2.1 KiB
TypeScript
92 lines
2.1 KiB
TypeScript
/**
|
|
* 角色 Store
|
|
*/
|
|
|
|
import { defineStore } from 'pinia'
|
|
import type { UserType } from '@/types'
|
|
import { useUserStore } from './user'
|
|
import { mockUsers } from '@/mock'
|
|
|
|
interface RoleState {
|
|
currentRole: UserType
|
|
availableRoles: UserType[]
|
|
}
|
|
|
|
export const useRoleStore = defineStore('role', {
|
|
state: (): RoleState => ({
|
|
currentRole: (uni.getStorageSync('mock_user_type') || 'customer') as UserType,
|
|
availableRoles: ['customer', 'merchant', 'player']
|
|
}),
|
|
|
|
getters: {
|
|
// 是否是用户
|
|
isCustomer: (state) => state.currentRole === 'customer',
|
|
|
|
// 是否是商家
|
|
isMerchant: (state) => state.currentRole === 'merchant',
|
|
|
|
// 是否是代练
|
|
isPlayer: (state) => state.currentRole === 'player',
|
|
|
|
// 角色名称
|
|
roleName: (state) => {
|
|
const roleMap: Record<UserType, string> = {
|
|
customer: '用户',
|
|
merchant: '商家',
|
|
player: '代练'
|
|
}
|
|
return roleMap[state.currentRole]
|
|
},
|
|
|
|
// 首页路径
|
|
homePagePath: (state) => {
|
|
const pathMap: Record<UserType, string> = {
|
|
customer: '/pages-user/home/index',
|
|
merchant: '/pages-merchant/home/index',
|
|
player: '/pages-player/home/index'
|
|
}
|
|
return pathMap[state.currentRole]
|
|
}
|
|
},
|
|
|
|
actions: {
|
|
/**
|
|
* 切换角色
|
|
*/
|
|
async switchRole(role: UserType): Promise<void> {
|
|
this.currentRole = role
|
|
|
|
// 保存到本地存储
|
|
uni.setStorageSync('mock_user_type', role)
|
|
|
|
// 更新用户信息
|
|
const userStore = useUserStore()
|
|
const user = mockUsers.find(u => u.userType === role)
|
|
|
|
if (user) {
|
|
userStore.userInfo = user
|
|
uni.setStorageSync('userInfo', user)
|
|
}
|
|
|
|
// 跳转到对应首页
|
|
uni.reLaunch({
|
|
url: this.homePagePath
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 检查角色权限
|
|
*/
|
|
hasRole(role: UserType): boolean {
|
|
return this.currentRole === role
|
|
},
|
|
|
|
/**
|
|
* 检查是否有任一角色权限
|
|
*/
|
|
hasAnyRole(roles: UserType[]): boolean {
|
|
return roles.includes(this.currentRole)
|
|
}
|
|
}
|
|
})
|