Skip to content

Commit 62d9cd8

Browse files
committed
feat:新增快捷面板搜索菜单,新增未读消息通知提示(示例)
1 parent ca54237 commit 62d9cd8

File tree

3 files changed

+155
-20
lines changed

3 files changed

+155
-20
lines changed

dash-fastapi-frontend/app.py

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
from callbacks import app_c
1717
from api.login import get_current_user_info_api
18-
from utils.tree_tool import find_node_values, find_key_by_href, deal_user_menu_info
18+
from utils.tree_tool import find_node_values, find_key_by_href, deal_user_menu_info, get_search_panel_data
1919

2020
app.layout = html.Div(
2121
[
@@ -35,6 +35,17 @@
3535
# 注入全局配置容器
3636
fac.AntdConfigProvider(id='app-config-provider'),
3737

38+
# 注入快捷搜索面板
39+
fuc.FefferyShortcutPanel(
40+
id='search-panel',
41+
data=[],
42+
placeholder='输入你想要搜索的菜单...',
43+
panelStyles={
44+
'accentColor': '#1890ff',
45+
'zIndex': 99999
46+
}
47+
),
48+
3849
# 辅助处理多输入 -> 存储接口返回token校验信息
3950
render_store_container(),
4051

@@ -71,7 +82,8 @@
7182
Output('api-check-token', 'data', allow_duplicate=True),
7283
Output('current-key-container', 'data'),
7384
Output('menu-info-store-container', 'data'),
74-
Output('menu-list-store-container', 'data')],
85+
Output('menu-list-store-container', 'data'),
86+
Output('search-panel', 'data')],
7587
Input('url-container', 'pathname'),
7688
[State('url-container', 'trigger'),
7789
State('token-container', 'data')],
@@ -90,6 +102,7 @@ def router(pathname, trigger, session_token):
90102
user_menu_list = [item for item in menu_list if item.get('visible') == '0']
91103
menu_info = deal_user_menu_info(0, menu_list)
92104
user_menu_info = deal_user_menu_info(0, user_menu_list)
105+
search_panel_data = get_search_panel_data(user_menu_list)
93106
session['user_info'] = current_user['user']
94107
session['dept_info'] = current_user['dept']
95108
session['role_info'] = current_user['role']
@@ -117,7 +130,8 @@ def router(pathname, trigger, session_token):
117130
{'timestamp': time.time()},
118131
{'current_key': current_key},
119132
{'menu_info': menu_info},
120-
{'menu_list': menu_list}
133+
{'menu_list': menu_list},
134+
search_panel_data
121135
]
122136

123137
# 否则正常渲染主页面
@@ -128,7 +142,8 @@ def router(pathname, trigger, session_token):
128142
{'timestamp': time.time()},
129143
{'current_key': current_key},
130144
{'menu_info': menu_info},
131-
{'menu_list': menu_list}
145+
{'menu_list': menu_list},
146+
search_panel_data
132147
]
133148

134149
# elif trigger == 'pushstate':
@@ -140,7 +155,8 @@ def router(pathname, trigger, session_token):
140155
{'timestamp': time.time()},
141156
{'current_key': current_key},
142157
{'menu_info': menu_info},
143-
{'menu_list': menu_list}
158+
{'menu_list': menu_list},
159+
search_panel_data
144160
]
145161

146162
# else:
@@ -162,6 +178,7 @@ def router(pathname, trigger, session_token):
162178
{'timestamp': time.time()},
163179
dash.no_update,
164180
dash.no_update,
181+
dash.no_update,
165182
dash.no_update
166183
]
167184

@@ -173,6 +190,7 @@ def router(pathname, trigger, session_token):
173190
{'timestamp': time.time()},
174191
dash.no_update,
175192
dash.no_update,
193+
dash.no_update,
176194
dash.no_update
177195
]
178196

@@ -186,6 +204,7 @@ def router(pathname, trigger, session_token):
186204
{'timestamp': time.time()},
187205
dash.no_update,
188206
dash.no_update,
207+
dash.no_update,
189208
dash.no_update
190209
]
191210
else:
@@ -201,6 +220,7 @@ def router(pathname, trigger, session_token):
201220
{'timestamp': time.time()},
202221
dash.no_update,
203222
dash.no_update,
223+
dash.no_update,
204224
dash.no_update
205225
]
206226

@@ -212,6 +232,7 @@ def router(pathname, trigger, session_token):
212232
{'timestamp': time.time()},
213233
dash.no_update,
214234
dash.no_update,
235+
dash.no_update,
215236
dash.no_update
216237
]
217238

@@ -223,6 +244,7 @@ def router(pathname, trigger, session_token):
223244
{'timestamp': time.time()},
224245
dash.no_update,
225246
dash.no_update,
247+
dash.no_update,
226248
dash.no_update
227249
]
228250

@@ -237,6 +259,7 @@ def router(pathname, trigger, session_token):
237259
{'timestamp': time.time()},
238260
dash.no_update,
239261
dash.no_update,
262+
dash.no_update,
240263
dash.no_update
241264
]
242265

dash-fastapi-frontend/utils/tree_tool.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,3 +231,17 @@ def list_to_tree(permission_list: list) -> list:
231231
parent.update({'children': children})
232232

233233
return container
234+
235+
236+
def get_search_panel_data(menu_list: list):
237+
search_data = []
238+
for item in menu_list:
239+
if item.get('menu_type') == 'C' or item.get('is_frame') == 0:
240+
item_dict = dict(
241+
id=str(item.get('menu_id')),
242+
title=item.get('menu_name'),
243+
handler='() => window.open("%s", "_self")' % item.get('path')
244+
)
245+
search_data.append(item_dict)
246+
247+
return search_data

dash-fastapi-frontend/views/layout/components/head.py

Lines changed: 113 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ def render_head_content():
2828
'display': 'flex',
2929
'alignItems': 'center'
3030
}
31-
)
31+
),
32+
flex='1'
3233
),
3334

3435
# 页首面包屑区域
@@ -46,29 +47,125 @@ def render_head_content():
4647
style={
4748
'height': '100%',
4849
'display': 'flex',
49-
'alignItems': 'center',
50-
'paddingLeft': '5px'
51-
}
50+
'alignItems': 'center'
51+
},
52+
flex='24'
53+
),
54+
55+
# 页首中部搜索区域
56+
fac.AntdCol(
57+
fac.AntdParagraph(
58+
[
59+
fac.AntdText(
60+
'Ctrl',
61+
keyboard=True,
62+
style={
63+
'color': '#8c8c8c'
64+
}
65+
),
66+
fac.AntdText(
67+
'K',
68+
keyboard=True,
69+
style={
70+
'color': '#8c8c8c'
71+
}
72+
),
73+
fac.AntdText(
74+
'唤出搜索面板',
75+
style={
76+
'color': '#8c8c8c'
77+
}
78+
)
79+
],
80+
style={
81+
'height': '100%',
82+
'display': 'flex',
83+
'alignItems': 'center'
84+
}
85+
),
86+
flex='6'
5287
),
5388

5489
# 页首右侧用户信息区域
5590
fac.AntdCol(
5691
fac.AntdSpace(
5792
[
58-
fac.AntdTooltip(
59-
fac.AntdAvatar(
60-
id='avatar-info',
61-
mode='image',
62-
src=session.get('user_info').get('avatar'),
63-
size=36
93+
fac.AntdPopover(
94+
fac.AntdBadge(
95+
fac.AntdAvatar(
96+
id='avatar-info',
97+
mode='image',
98+
src=session.get('user_info').get('avatar'),
99+
size=36
100+
),
101+
count=6,
102+
size='small'
103+
),
104+
content=fac.AntdTabs(
105+
items=[
106+
{
107+
'key': '未读消息',
108+
'label': '未读消息',
109+
'children': [
110+
fac.AntdSpace(
111+
[
112+
html.Div(
113+
fac.AntdText(
114+
f'消息示例{i}'
115+
),
116+
style={
117+
'padding': '5px 10px',
118+
'height': 40,
119+
'width': 300,
120+
'borderBottom': '1px solid #f1f3f5'
121+
}
122+
)
123+
for i in range(1, 8)
124+
],
125+
direction='vertical',
126+
style={
127+
'height': 280,
128+
'overflowY': 'auto'
129+
}
130+
)
131+
]
132+
},
133+
{
134+
'key': '已读消息',
135+
'label': '已读消息',
136+
'children': [
137+
fac.AntdSpace(
138+
[
139+
html.Div(
140+
fac.AntdText(
141+
f'消息示例{i}'
142+
),
143+
style={
144+
'padding': '5px 10px',
145+
'height': 40,
146+
'width': 300,
147+
'borderBottom': '1px solid #f1f3f5'
148+
}
149+
)
150+
for i in range(8, 15)
151+
],
152+
direction='vertical',
153+
style={
154+
'height': 280,
155+
'overflowY': 'auto'
156+
}
157+
)
158+
]
159+
},
160+
],
161+
centered=True
64162
),
65-
title='当前用户:' + session.get('user_info').get('user_name'),
66-
placement='bottom'
163+
placement='bottomRight'
67164
),
68165

69166
fac.AntdDropdown(
70167
id='index-header-dropdown',
71-
title='个人中心',
168+
title=session.get('user_info').get('user_name'),
72169
arrow=True,
73170
menuItems=[
74171
{
@@ -103,7 +200,7 @@ def render_head_content():
103200
'alignItems': 'center'
104201
}
105202
),
106-
flex=1
203+
flex='3'
107204
),
108205
fac.AntdCol(
109206
# 全局刷新按钮
@@ -131,6 +228,7 @@ def render_head_content():
131228
'paddingRight': '3px',
132229
'display': 'flex',
133230
'alignItems': 'center'
134-
}
231+
},
232+
flex='1'
135233
),
136234
]

0 commit comments

Comments
 (0)