feat: support merchant team roles and permissions

This commit is contained in:
yml2213
2026-08-13 11:41:34 +08:00
parent 6c98fa557e
commit a4791decb0
21 changed files with 969 additions and 201 deletions
+41 -12
View File
@@ -1,5 +1,5 @@
import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom'
import { ConfigProvider, App as AntdApp } from 'antd'
import { BrowserRouter, Navigate, Route, Routes, useLocation } from 'react-router-dom'
import { ConfigProvider, App as AntdApp, Spin } from 'antd'
import zhCN from 'antd/locale/zh_CN'
import { AuthProvider, useAuth } from './store/auth'
import MainLayout from './layouts/MainLayout'
@@ -25,6 +25,35 @@ function AdminRoute({ children }: { children: ReactNode }) {
return <>{children}</>
}
const tabPermissions: Record<string, string> = {
products: 'products:manage',
orders: 'orders:manage',
wallet: 'wallet:ledger',
api: 'api:manage',
callbacks: 'callbacks:manage',
members: 'members:manage',
}
function MerchantPermissionRoute({ permission, children }: { permission?: string; children: ReactNode }) {
const { isAdmin, merchantLoading, merchantPermissions } = useAuth()
if (isAdmin || !permission) return <>{children}</>
if (merchantLoading) {
return <div style={{ textAlign: 'center', padding: '100px 0' }}><Spin size="large" /></div>
}
return merchantPermissions.includes(permission) ? <>{children}</> : <Navigate to="/" replace />
}
function MerchantCenterRoute() {
const location = useLocation()
const requestedTab = new URLSearchParams(location.search).get('tab') || 'products'
const tab = requestedTab in tabPermissions ? requestedTab : 'products'
return (
<MerchantPermissionRoute permission={tabPermissions[tab]}>
<MerchantCenter />
</MerchantPermissionRoute>
)
}
function AppRoutes() {
return (
<Routes>
@@ -39,15 +68,15 @@ function AppRoutes() {
}
>
<Route index element={<Dashboard />} />
<Route path="merchant-center" element={<MerchantCenter />} />
<Route path="merchant-products" element={<MerchantCenter fixedTab="products" title="商品列表" />} />
<Route path="merchant-orders" element={<MerchantCenter fixedTab="orders" title="发货订单" />} />
<Route path="merchant-wallet" element={<MerchantCenter fixedTab="wallet" title="积分明细" />} />
<Route path="merchant-recharge" element={<MerchantRecharge />} />
<Route path="merchant-alert-settings" element={<AlertSettings />} />
<Route path="merchant-members" element={<MerchantCenter fixedTab="members" title="成员" />} />
<Route path="merchant-callbacks" element={<MerchantCenter fixedTab="callbacks" title="回调" />} />
<Route path="merchant-api-keys" element={<MerchantCenter fixedTab="api" title="API 密钥" />} />
<Route path="merchant-center" element={<MerchantCenterRoute />} />
<Route path="merchant-products" element={<MerchantPermissionRoute permission="products:manage"><MerchantCenter fixedTab="products" title="商品列表" /></MerchantPermissionRoute>} />
<Route path="merchant-orders" element={<MerchantPermissionRoute permission="orders:manage"><MerchantCenter fixedTab="orders" title="发货订单" /></MerchantPermissionRoute>} />
<Route path="merchant-wallet" element={<MerchantPermissionRoute permission="wallet:ledger"><MerchantCenter fixedTab="wallet" title="积分明细" /></MerchantPermissionRoute>} />
<Route path="merchant-recharge" element={<MerchantPermissionRoute permission="wallet:view"><MerchantRecharge /></MerchantPermissionRoute>} />
<Route path="merchant-alert-settings" element={<MerchantPermissionRoute permission="recharge:manage"><AlertSettings /></MerchantPermissionRoute>} />
<Route path="merchant-members" element={<MerchantPermissionRoute permission="members:manage"><MerchantCenter fixedTab="members" title="成员" /></MerchantPermissionRoute>} />
<Route path="merchant-callbacks" element={<MerchantPermissionRoute permission="callbacks:manage"><MerchantCenter fixedTab="callbacks" title="回调" /></MerchantPermissionRoute>} />
<Route path="merchant-api-keys" element={<MerchantPermissionRoute permission="api:manage"><MerchantCenter fixedTab="api" title="API 密钥" /></MerchantPermissionRoute>} />
<Route
path="platform-merchants"
element={
@@ -56,7 +85,7 @@ function AppRoutes() {
</AdminRoute>
}
/>
<Route path="open-api" element={<OpenApiDocs />} />
<Route path="open-api" element={<MerchantPermissionRoute permission="api:manage"><OpenApiDocs /></MerchantPermissionRoute>} />
<Route
path="api-debug"
element={