Skip to content

Commit 68274ba

Browse files
committed
format: user resource
1 parent 2a063a6 commit 68274ba

9 files changed

Lines changed: 37 additions & 51 deletions

File tree

api/controller/resource_controller.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,25 @@ func (rc *ResourceController) GetResources(c *gin.Context) {
4242
// 管理员直接返回所有菜单和权限
4343
if isAdmin {
4444
allPermissions := rc.collectAllPermissions(menuTree)
45+
46+
// Resolve role names for admin (same format as non-admin path)
47+
adminUser, err := rc.UserRepository.GetByID(c, userID)
48+
if err != nil {
49+
pkg.Log.WithField("userID", userID).WithError(err).Error("Failed to get admin user information")
50+
c.JSON(http.StatusInternalServerError, domain.RespError("Failed to get user: "+err.Error()))
51+
return
52+
}
53+
adminRoleObjects, _ := rc.getUserRoles(c, adminUser.Roles)
54+
adminRoleNames := make([]string, 0, len(adminRoleObjects))
55+
for _, r := range adminRoleObjects {
56+
adminRoleNames = append(adminRoleNames, r.Name)
57+
}
58+
4559
responseData := gin.H{
4660
"menus": menuTree,
4761
"permissions": allPermissions,
62+
"roles": adminRoleNames,
63+
"is_admin": true,
4864
}
4965
c.JSON(http.StatusOK, domain.RespSuccess(responseData))
5066
return
@@ -71,10 +87,18 @@ func (rc *ResourceController) GetResources(c *gin.Context) {
7187
// 过滤菜单树
7288
filteredMenuTree := rc.filterMenuTree(menuTree, userMenuIDs)
7389

90+
// 提取角色名称列表
91+
roleNames := make([]string, 0, len(roles))
92+
for _, r := range roles {
93+
roleNames = append(roleNames, r.Name)
94+
}
95+
7496
// 构建响应数据
7597
responseData := gin.H{
7698
"menus": filteredMenuTree,
7799
"permissions": userPermissions,
100+
"roles": roleNames,
101+
"is_admin": false,
78102
}
79103
c.JSON(http.StatusOK, domain.RespSuccess(responseData))
80104
}

domain/profile.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ type Profile struct {
1010
Username string `json:"username"`
1111
Email string `json:"email"`
1212
Phone string `json:"phone"`
13-
IsAdmin bool `json:"is_admin"`
1413
Status string `json:"status"`
1514
CreatedAt time.Time `json:"created_at"`
1615
UpdatedAt time.Time `json:"updated_at"`

repository/profile_repository.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ func (pr *entProfileRepository) GetByID(c context.Context, id string) (*domain.P
3333
Username: u.Username,
3434
Email: u.Email,
3535
Phone: u.Phone,
36-
IsAdmin: u.IsAdmin,
3736
Status: string(u.Status),
3837
CreatedAt: u.CreatedAt,
3938
UpdatedAt: u.UpdatedAt,

web/src/components/layout/data/dynamic-sidebar-data.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,6 @@ export async function getDynamicSidebarData(): Promise<SidebarData> {
2828
const sidebarData = await sidebarService.getSidebarData()
2929

3030
if (sidebarData.navGroups && sidebarData.navGroups.length > 0) {
31-
console.log(
32-
'Dynamic sidebar data: Loaded',
33-
sidebarData.navGroups.length,
34-
'dynamic nav groups'
35-
)
36-
3731
return {
3832
user: sidebarData.user,
3933
teams: sidebarData.teams,

web/src/hooks/use-sidebar-data.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,10 @@ export function useSidebarData() {
3030
setIsLoading(true)
3131
setError(null)
3232

33-
console.log('Loading sidebar data for user:', userKey)
3433
const dynamicData = await getDynamicSidebarData()
3534

3635
if (mounted) {
3736
setSidebarData(dynamicData)
38-
console.log(
39-
'Sidebar data updated, nav groups count:',
40-
dynamicData.navGroups?.length || 0
41-
)
4237
}
4338
} catch (err) {
4439
if (mounted) {

web/src/lib/backend-menu-adapter.ts

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { type MenuTreeNode } from '@/types/menu'
2-
import { type NavGroup, type NavItem } from '@/components/layout/types'
1+
import {type MenuTreeNode} from '@/types/menu'
2+
import {type NavGroup, type NavItem} from '@/components/layout/types'
33

44
/**
55
* Convert a single MenuTreeNode to NavItem
@@ -13,11 +13,6 @@ function convertMenuNodeToNavItem(menu: MenuTreeNode): NavItem | null {
1313

1414
// Filter out button types - buttons should not be rendered in navigation menu
1515
if (menu.type === 'button') {
16-
console.log(
17-
'Skipping button type:',
18-
menu.name,
19-
'buttons are handled via permissions on pages'
20-
)
2116
return null
2217
}
2318

@@ -30,10 +25,6 @@ function convertMenuNodeToNavItem(menu: MenuTreeNode): NavItem | null {
3025
// If this menu item has a path and no visible children (all children are buttons),
3126
// render it as a single menu item instead of a group
3227
if (visibleChildren.length === 0 && menu.path) {
33-
console.log(
34-
'Rendering menu item with no visible children as single item:',
35-
menu.name
36-
)
3728
return {
3829
title: menu.name,
3930
icon: menu.icon,
@@ -78,23 +69,9 @@ export class BackendMenuAdapter {
7869
console.log('BackendMenuAdapter: No menu nodes to transform')
7970
return []
8071
}
81-
82-
console.log(
83-
'BackendMenuAdapter: Transforming',
84-
menuNodes.length,
85-
'menu nodes'
86-
)
87-
88-
const result = menuNodes
89-
.map(this.convertToNavGroup)
90-
.filter((group): group is NavGroup => group !== null)
91-
console.log(
92-
'BackendMenuAdapter: Transformed to',
93-
result.length,
94-
'nav groups'
95-
)
96-
97-
return result
72+
return menuNodes
73+
.map(this.convertToNavGroup)
74+
.filter((group): group is NavGroup => group !== null)
9875
}
9976

10077
/**

web/src/services/menu-service.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,10 @@ export class MenuService {
5353
const { setPermissions } = useAuthStore.getState().auth
5454
setPermissions({
5555
permissions: resourcesData.permissions.map((p) => [p]), // Convert string[] to string[][]
56-
roles: [], // TODO: get roles from API if available
56+
roles: resourcesData.roles ?? [],
5757
menus: resourcesData.menus.map((m) => m.id), // Extract menu IDs
58-
is_admin: false, // TODO: determine admin status from API
58+
is_admin: resourcesData.is_admin ?? false,
5959
})
60-
console.log('Permissions set to auth store:', resourcesData.permissions)
6160
}
6261

6362
// Transform the backend data using the backend adapter

web/src/services/resourceApi.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { type MenuTreeNode, type ResourcesResponse } from '@/types/menu'
2-
import { apiClient } from './config'
1+
import {type MenuTreeNode, type ResourcesResponse} from '@/types/menu'
2+
import {apiClient} from './config'
33

44
/**
55
* Resource API service for fetching menu resources from backend
@@ -36,12 +36,9 @@ export const getResourcesWithPermissions =
3636
const response = await apiClient.get(`/api/v1/resources`)
3737

3838
if (response.data && response.data.data) {
39-
const resourcesData: ResourcesResponse = response.data.data
40-
console.log('API Response - Complete resources:', resourcesData)
41-
return resourcesData
39+
return response.data.data
4240
} else {
43-
console.warn('No resources data returned from API')
44-
return { menus: [], permissions: null }
41+
return { menus: [], permissions: null, roles: [], is_admin: false }
4542
}
4643
} catch (error) {
4744
console.error('Failed to fetch resources:', error)

web/src/types/menu.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ export interface MenuQueryParams {
9292
export interface ResourcesResponse {
9393
menus: MenuTreeNode[]
9494
permissions: string[] | null
95+
roles: string[]
96+
is_admin: boolean
9597
}
9698

9799
// Type definitions

0 commit comments

Comments
 (0)