update permission

This commit is contained in:
LittleBoy 2024-07-27 00:16:31 +08:00
parent 30f210ecd5
commit b13f61b81a
4 changed files with 67 additions and 29 deletions

View File

@ -1,8 +1,8 @@
import Loader from "@/components/loader"; import Loader from "@/components/loader";
import React, {createContext, useEffect, useReducer} from "react"; import React, { createContext, useEffect, useReducer } from "react";
import {auth, getUserInfo} from "@/service/api/user.ts"; import { auth, getUserInfo } from "@/service/api/user.ts";
import {getAuthToken, setAuthToken} from "@/hooks/useAuth.ts"; import { getAuthToken, setAuthToken } from "@/hooks/useAuth.ts";
import {getRoleByDepartName} from "@/contexts/auth/role.ts"; import { getRoleByUsername } from "@/contexts/auth/role.ts";
const AuthContext = createContext<AuthContextType | null>(null) const AuthContext = createContext<AuthContextType | null>(null)
@ -42,28 +42,24 @@ const authReducer = (state: AuthProps, action: { action?: string, payload: Parti
} }
const UserRoleStorageKey = 'user-current-role'; const UserRoleStorageKey = 'user-current-role';
function getCurrentRole(department?:string){ function getCurrentRole(username: string) {
const role = localStorage.getItem(UserRoleStorageKey); return (localStorage.getItem(UserRoleStorageKey) || getRoleByUsername(username)) as UserRole
if(role){
return role as UserRole
}
return getRoleByDepartName(department)
} }
export function setCurrentRole(role: UserRole){ export function setCurrentRole(role: UserRole) {
localStorage.setItem(UserRoleStorageKey,role) localStorage.setItem(UserRoleStorageKey, role)
} }
function removeRoleStorage(){ function removeRoleStorage() {
localStorage.removeItem(UserRoleStorageKey) localStorage.removeItem(UserRoleStorageKey)
} }
export const AuthProvider = ({children}: { children: React.ReactNode }) => { export const AuthProvider = ({ children }: { children: React.ReactNode }) => {
const [state, dispatch] = useReducer(authReducer, initialState); const [state, dispatch] = useReducer(authReducer, initialState);
// MOCK INIT DATA // MOCK INIT DATA
const init = async () => { const init = async () => {
const token = getAuthToken(); const token = getAuthToken();
if(!token){ if (!token) {
dispatch({ dispatch({
payload: { payload: {
isInitialized: true, isInitialized: true,
@ -77,9 +73,10 @@ export const AuthProvider = ({children}: { children: React.ReactNode }) => {
payload: { payload: {
isInitialized: true, isInitialized: true,
isLoggedIn: !!user, isLoggedIn: !!user,
user:{ user: {
...user, ...user,
role: getCurrentRole(user.department) origin_role: getRoleByUsername(user.username),
role: getCurrentRole(user.username)
} }
} }
}) })
@ -96,16 +93,17 @@ export const AuthProvider = ({children}: { children: React.ReactNode }) => {
const login = async (code: string, state: string) => { const login = async (code: string, state: string) => {
const user = await auth(code, state) const user = await auth(code, state)
// 保存token // 保存token
setAuthToken(user.token, user.expiration_time?(new Date(user.expiration_time)).getTime():-1); setAuthToken(user.token, user.expiration_time ? (new Date(user.expiration_time)).getTime() : -1);
// //
dispatch({ dispatch({
action: 'login', action: 'login',
payload: { payload: {
isLoggedIn: true, isLoggedIn: true,
user:{ user: {
...user, ...user,
role: getCurrentRole(user.department) origin_role: getRoleByUsername(user.username),
role: getCurrentRole(user.username)
} }
} }
}) })
@ -150,7 +148,7 @@ export const AuthProvider = ({children}: { children: React.ReactNode }) => {
dispatch({ dispatch({
action: 'updateUser', action: 'updateUser',
payload: { payload: {
user:{ user: {
...state.user, ...state.user,
...user ...user
} as never, } as never,
@ -165,12 +163,12 @@ export const AuthProvider = ({children}: { children: React.ReactNode }) => {
// 判断是否已经初始化 // 判断是否已经初始化
if (state.isInitialized !== undefined && !state.isInitialized) { if (state.isInitialized !== undefined && !state.isInitialized) {
return <Loader/>; return <Loader />;
} }
return (<AuthContext.Provider value={{ return (<AuthContext.Provider value={{
...state, ...state,
login, logout, login, logout,
mockLogin,updateUser mockLogin, updateUser
}}>{children}</AuthContext.Provider>) }}>{children}</AuthContext.Provider>)
} }
export default AuthContext export default AuthContext

View File

@ -4,6 +4,38 @@ const RoleConfig: { [key: string]: UserRole } = {
'FO': 'fo', 'FO': 'fo',
} }
/*
11. :
- RO: Kitty
- FO 1: Cecilia, Zoe, Jacko
- FO 2: 现场支付和查询账单Ancus
-
ETSO: 超级管理员michaeldingkennytan
RO kittyho
FO2ancuscheng
FO ceciliachan sylam jackoyeung
STAFF: 现场支付
*/
const UserRoles: { [key: string]: string[] } = {
'root': ['michaelding', 'kennytan','itsotest010'],
'ro': ['kittyho', 'ancuscheng'],
'fo': ['ceciliachan', 'sylam', 'jackoyeung'],
}
export function getRoleByDepartName(departName?: string, defaultRole: UserRole = 'staff') { export function getRoleByDepartName(departName?: string, defaultRole: UserRole = 'staff') {
return (departName ? (RoleConfig[departName] || defaultRole) : defaultRole); return (departName ? (RoleConfig[departName] || defaultRole) : defaultRole);
}
export function getRoleByUsername(username: string, defaultRole: UserRole = 'staff') {
const roles = ['root', 'ro', 'fo'];
for (const r of roles) {
if (UserRoles[r].includes(username.toLowerCase())) {
return r as UserRole;
}
}
return defaultRole;
} }

View File

@ -38,12 +38,19 @@ export const HeaderUserAvatar = () => {
<> <>
<HeaderUserProfile> <HeaderUserProfile>
<Space> <Space>
<Avatar color="orange" size="small"><IconUser /></Avatar> <Avatar color="orange" size="default"><IconUser /></Avatar>
<div> <div>
<Typography.Title heading={6}>{user?.username}</Typography.Title> <Typography.Title heading={6}>{user?.username}</Typography.Title>
<Typography.Text <div style={{maxWidth:250,overflow:'hidden',whiteSpace:'nowrap',textOverflow:'ellipsis'}}>
type="quaternary" <Typography.Text
size={'small'}>Department:{user?.department?.toUpperCase()}</Typography.Text> type="quaternary"
size={'small'}>Department:{user?.department?.toUpperCase()}</Typography.Text>
</div>
<div>
<Typography.Text
type="quaternary"
size={'small'}>Role:{user?.role?.toUpperCase()}</Typography.Text>
</div>
</div> </div>
</Space> </Space>
</HeaderUserProfile> </HeaderUserProfile>
@ -68,7 +75,7 @@ const RoleSwitcher = ()=>{
}) })
} }
return (<> return (<>
{AppMode !== 'production' && (<Dropdown {user?.origin_role == 'root' && (<Dropdown
clickToHide clickToHide
render={ render={
<Dropdown.Menu> <Dropdown.Menu>
@ -84,7 +91,7 @@ const RoleSwitcher = ()=>{
<Button theme="borderless"> <Button theme="borderless">
<Space style={{transform:'translateY(3px)'}}> <Space style={{transform:'translateY(3px)'}}>
<IconRoles size={20} color={'white'} /> <IconRoles size={20} color={'white'} />
<span style={{color:'white'}}>{user?.department?.toUpperCase()}</span> <span style={{color:'white'}}>{user?.role?.toUpperCase()}</span>
</Space> </Space>
</Button> </Button>
</Dropdown>) } </Dropdown>) }

1
src/types/auth.d.ts vendored
View File

@ -13,6 +13,7 @@ declare type UserProfile = {
nbf: number; nbf: number;
type: string; type: string;
role: UserRole; role: UserRole;
origin_role?: UserRole;
} }
declare interface AuthProps { declare interface AuthProps {