@@ -47,6 +47,9 @@ export const DashboardLayout: React.FC = () => {
4747
4848 const [ collapsed , setCollapsed ] = useState ( false ) ;
4949 const [ mobileVisible , setMobileVisible ] = useState ( false ) ;
50+ const visibleProjects = projects . filter (
51+ ( project ) => project . projectId !== "system" ,
52+ ) ;
5053
5154 const handleProjectSelect = ( value : string ) => {
5255 selectProject ( value ) ;
@@ -61,17 +64,20 @@ export const DashboardLayout: React.FC = () => {
6164
6265 if ( paths . includes ( "projects" ) ) {
6366 breadcrumbItems . push ( {
64- title : "项目列表 " ,
67+ title : "我的项目 " ,
6568 key : "projects" ,
6669 onClick : ( ) => navigate ( "/projects" ) ,
6770 } ) ;
6871 if ( activeProject ) {
72+ const isSystemProject = activeProject . projectId === "system" ;
6973 breadcrumbItems . push ( {
70- title : activeProject . name ,
74+ title : isSystemProject ? "系统客户端" : activeProject . name ,
7175 key : activeProject . projectId ,
7276 onClick : ( ) =>
7377 navigate (
74- `/projects/${ encodeURIComponent ( activeProject . projectId ) } /overview` ,
78+ isSystemProject
79+ ? "/projects/system/clients"
80+ : `/projects/${ encodeURIComponent ( activeProject . projectId ) } /overview` ,
7581 ) ,
7682 } ) ;
7783 }
@@ -93,56 +99,72 @@ export const DashboardLayout: React.FC = () => {
9399 {
94100 key : "projects-list" ,
95101 icon : < ProjectOutlined /> ,
96- label : "项目列表 " ,
102+ label : "我的项目 " ,
97103 onClick : ( ) => navigate ( "/projects" ) ,
98104 } ,
99105 ] ;
100106
101- if ( activeProject ) {
102- items . push ( {
103- key : "project-group" ,
104- label : `${ activeProject . name } (当前)` ,
105- type : "group" ,
106- children : [
107- {
108- key : "overview" ,
109- icon : < DesktopOutlined /> ,
110- label : "项目概览" ,
111- onClick : ( ) =>
112- navigate (
113- `/projects/${ encodeURIComponent ( activeProject . projectId ) } /overview` ,
114- ) ,
115- } ,
116- {
117- key : "clients" ,
118- icon : < DesktopOutlined /> ,
119- label : "OIDC 客户端" ,
120- onClick : ( ) =>
121- navigate (
122- `/projects/${ encodeURIComponent ( activeProject . projectId ) } /clients` ,
123- ) ,
124- } ,
125- {
126- key : "members" ,
127- icon : < TeamOutlined /> ,
128- label : "成员管理" ,
129- onClick : ( ) =>
130- navigate (
131- `/projects/${ encodeURIComponent ( activeProject . projectId ) } /members` ,
132- ) ,
133- } ,
134- {
135- key : "audit" ,
136- icon : < AuditOutlined /> ,
137- label : "审计日志" ,
138- onClick : ( ) =>
139- navigate (
140- `/projects/${ encodeURIComponent ( activeProject . projectId ) } /audit` ,
141- ) ,
142- } ,
143- ] ,
144- } ) ;
145- }
107+ const isSystemProject = activeProject ?. projectId === "system" ;
108+ items . push ( {
109+ key : "project-group" ,
110+ label : `当前项目【${ isSystemProject ? "系统客户端" : ( activeProject ?. name ?? "未选择" ) } 】` ,
111+ type : "group" ,
112+ children : isSystemProject
113+ ? [
114+ {
115+ key : "current-system-overview" ,
116+ icon : < DesktopOutlined /> ,
117+ label : "项目概览" ,
118+ onClick : ( ) => navigate ( "/projects/system/overview" ) ,
119+ } ,
120+ {
121+ key : "current-system-audit" ,
122+ icon : < AuditOutlined /> ,
123+ label : "审计日志" ,
124+ onClick : ( ) => navigate ( "/projects/system/audit" ) ,
125+ } ,
126+ ]
127+ : activeProject
128+ ? [
129+ {
130+ key : "overview" ,
131+ icon : < DesktopOutlined /> ,
132+ label : "项目概览" ,
133+ onClick : ( ) =>
134+ navigate (
135+ `/projects/${ encodeURIComponent ( activeProject . projectId ) } /overview` ,
136+ ) ,
137+ } ,
138+ {
139+ key : "clients" ,
140+ icon : < DesktopOutlined /> ,
141+ label : "OIDC 客户端" ,
142+ onClick : ( ) =>
143+ navigate (
144+ `/projects/${ encodeURIComponent ( activeProject . projectId ) } /clients` ,
145+ ) ,
146+ } ,
147+ {
148+ key : "members" ,
149+ icon : < TeamOutlined /> ,
150+ label : "成员管理" ,
151+ onClick : ( ) =>
152+ navigate (
153+ `/projects/${ encodeURIComponent ( activeProject . projectId ) } /members` ,
154+ ) ,
155+ } ,
156+ {
157+ key : "audit" ,
158+ icon : < AuditOutlined /> ,
159+ label : "审计日志" ,
160+ onClick : ( ) =>
161+ navigate (
162+ `/projects/${ encodeURIComponent ( activeProject . projectId ) } /audit` ,
163+ ) ,
164+ } ,
165+ ]
166+ : [ ] ,
167+ } ) ;
146168
147169 if ( identity ?. isAdmin ) {
148170 items . push ( {
@@ -153,9 +175,18 @@ export const DashboardLayout: React.FC = () => {
153175 {
154176 key : "reviews" ,
155177 icon : < SafetyCertificateOutlined /> ,
156- label : "全局待审核 " ,
178+ label : "待审核配置 " ,
157179 onClick : ( ) => navigate ( "/admin/reviews" ) ,
158180 } ,
181+ {
182+ key : "system-clients" ,
183+ icon : < DesktopOutlined /> ,
184+ label : "系统客户端" ,
185+ onClick : ( ) => {
186+ selectProject ( "system" ) ;
187+ navigate ( "/projects/system/overview" ) ;
188+ } ,
189+ } ,
159190 {
160191 key : "system-settings" ,
161192 icon : < SettingOutlined /> ,
@@ -220,6 +251,9 @@ export const DashboardLayout: React.FC = () => {
220251 alignItems : "center" ,
221252 justifyContent : "space-between" ,
222253 borderBottom : `1px solid ${ token . colorBorderSecondary } ` ,
254+ position : "sticky" ,
255+ top : 0 ,
256+ zIndex : 1 ,
223257 } }
224258 >
225259 < Space >
@@ -234,14 +268,18 @@ export const DashboardLayout: React.FC = () => {
234268 }
235269 } }
236270 />
237- { projects . length > 0 && (
271+ { visibleProjects . length > 0 && (
238272 < Select
239- value = { activeProject ?. projectId }
273+ value = {
274+ activeProject ?. projectId === "system"
275+ ? undefined
276+ : activeProject ?. projectId
277+ }
240278 onChange = { handleProjectSelect }
241279 style = { { width : 200 } }
242280 placeholder = "切换项目"
243281 >
244- { projects . map ( ( p ) => (
282+ { visibleProjects . map ( ( p ) => (
245283 < Select . Option key = { p . projectId } value = { p . projectId } >
246284 { p . name }
247285 </ Select . Option >
0 commit comments