feat: 同步加载权限,避免刷新后路由没有权限数据

perf/export-docx
Jimmy Liow 1 year ago
parent e68e0ddd7d
commit c6e9857814

@ -31,8 +31,8 @@ import Airticket from '@/views/airticket/Index'
import AirticketPlan from '@/views/airticket/Plan' import AirticketPlan from '@/views/airticket/Plan'
import { ThemeContext } from '@/stores/ThemeContext' import { ThemeContext } from '@/stores/ThemeContext'
import { usingStorage } from '@/hooks/usingStorage' import { usingStorage } from '@/hooks/usingStorage'
import useAuthStore from './stores/Auth'
import { isNotEmpty } from '@/utils/commons' import { isNotEmpty } from '@/utils/commons'
import { notifyAuth } from './utils/lifecycle'
import { PERM_ACCOUNT_MANAGEMENT, PERM_ROLE_NEW, PERM_OVERSEA, PERM_AIR_TICKET } from '@/config' import { PERM_ACCOUNT_MANAGEMENT, PERM_ROLE_NEW, PERM_OVERSEA, PERM_AIR_TICKET } from '@/config'
@ -81,7 +81,7 @@ const initAppliction = async () => {
const { loginToken, userId } = usingStorage() const { loginToken, userId } = usingStorage()
if (isNotEmpty(userId) && isNotEmpty(loginToken)) { if (isNotEmpty(userId) && isNotEmpty(loginToken)) {
await notifyAuth() await useAuthStore.getState().initAuth()
} }
const router = await initRouter() const router = await initRouter()

@ -58,22 +58,24 @@ const initialState = {
permissionList: [] permissionList: []
} }
const useAuthStore = create(lifecycleware((set, get) => ({ const useAuthStore = create((set, get) => ({
...initialState, ...initialState,
onAuth: async () => { initAuth: async () => {
const { startTokenInterval, loadUserPermission } = get() const { startTokenInterval, loadUserPermission } = get()
const { setStorage, loginToken } = usingStorage() const { setStorage, loginToken } = usingStorage()
appendRequestParams('token', loginToken)
const userJson = await fetchUserDetail(loginToken) const userJson = await fetchUserDetail(loginToken)
appendRequestParams('token', loginToken)
appendRequestParams('lmi_sn', userJson.LMI_SN) appendRequestParams('lmi_sn', userJson.LMI_SN)
setStorage(KEY_USER_ID, userJson.LMI_SN) setStorage(KEY_USER_ID, userJson.LMI_SN)
setStorage(KEY_TRAVEL_AGENCY_ID, userJson.LMI_VEI_SN) setStorage(KEY_TRAVEL_AGENCY_ID, userJson.LMI_VEI_SN)
await loadUserPermission(userJson.LMI_SN)
set(() => ({ set(() => ({
currentUser: { currentUser: {
username: userJson.LoginName, username: userJson.LoginName,
@ -84,20 +86,19 @@ const useAuthStore = create(lifecycleware((set, get) => ({
} }
})) }))
await loadUserPermission(userJson.LMI_SN)
startTokenInterval() startTokenInterval()
loadPageSpy(userJson.real_name) loadPageSpy(userJson.real_name)
}, },
authenticate: async (usr, pwd) => { authenticate: async (usr, pwd) => {
const { onAuth } = get() const { onRefresh } = get()
const { setStorage } = usingStorage() const { setStorage } = usingStorage()
const { token: loginToken } = await fetchLoginToken(usr, pwd) const { token: loginToken } = await fetchLoginToken(usr, pwd)
setStorage(KEY_LOGIN_TOKEN, loginToken) setStorage(KEY_LOGIN_TOKEN, loginToken)
await onAuth() await initAuth()
set(() => ({ set(() => ({
tokenTimeout: false, tokenTimeout: false,
@ -190,6 +191,6 @@ const useAuthStore = create(lifecycleware((set, get) => ({
}) })
}, },
}))) }))
export default useAuthStore export default useAuthStore

@ -10,16 +10,19 @@ export const addAuthLinstener = (fn) => {
} }
export const notifyInit = async () => { export const notifyInit = async () => {
initListener.forEach(async (fn) => { for (const listener of initListener) {
await fn() await listener()
}) }
} }
export const notifyAuth = async (obj) => { export const notifyAuth = async (obj) => {
authListener.forEach(async (fn) => await fn(obj)) for (const listener of authListener) {
await listener(obj)
}
} }
// Zustand 中间件,用于订阅前端应用的生命周期,实验阶段 // Zustand 中间件,用于订阅前端应用的生命周期,实验阶段。
// 失败,无法同步调用异步方法!
export const lifecycleware = (fn) => (set, get, store) => { export const lifecycleware = (fn) => (set, get, store) => {
addInitLinstener(() => { addInitLinstener(() => {

Loading…
Cancel
Save