feature: 添加 公告管理
This commit is contained in:
parent
4f688396e7
commit
eeae93ea46
|
@ -42,4 +42,4 @@ def valid_token():
|
||||||
app.layout = valid_token
|
app.layout = valid_token
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
app.run(host='127.0.0.1', port=80, debug=True)
|
app.run(host='127.0.0.1', port=8000, debug=False)
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
from dash_view.application.access_ import role_mgmt, user_mgmt, group_auth, group_mgmt
|
from dash_view.application.access_ import role_mgmt, user_mgmt, group_auth, group_mgmt
|
||||||
from dash_view.application.dashboard_ import workbench, monitor
|
from dash_view.application.dashboard_ import workbench, monitor
|
||||||
from dash_view.application.person_ import personal_info
|
from dash_view.application.person_ import personal_info
|
||||||
|
from dash_view.application.notification_ import announcement
|
||||||
|
|
||||||
################## 【开始】此处导入您的应用 ###################
|
################## 【开始】此处导入您的应用 ###################
|
||||||
from dash_view.application.example_app import subapp1, subapp2
|
from dash_view.application.example_app import subapp1, subapp2
|
||||||
|
@ -20,7 +21,7 @@ def trim_module_path2menu_item(module_path):
|
||||||
class AccessFactory:
|
class AccessFactory:
|
||||||
from common.utilities.util_menu_access import MenuAccess
|
from common.utilities.util_menu_access import MenuAccess
|
||||||
|
|
||||||
views = [role_mgmt, user_mgmt, group_auth, group_mgmt, workbench, monitor, personal_info, *apps]
|
views = [role_mgmt, user_mgmt, group_auth, group_mgmt, workbench, monitor, personal_info, announcement, *apps]
|
||||||
|
|
||||||
# 读取每个VIEW中配置的所有权限
|
# 读取每个VIEW中配置的所有权限
|
||||||
dict_access_meta2module_path = {access_meta: view.__name__ for view in views for access_meta in view.access_metas}
|
dict_access_meta2module_path = {access_meta: view.__name__ for view in views for access_meta in view.access_metas}
|
||||||
|
@ -37,7 +38,7 @@ class AccessFactory:
|
||||||
group_access_meta = ('团队授权-页面',)
|
group_access_meta = ('团队授权-页面',)
|
||||||
|
|
||||||
# 系统管理员默认权限
|
# 系统管理员默认权限
|
||||||
admin_access_meta = ('用户管理-页面', '角色管理-页面', '团队管理-页面')
|
admin_access_meta = ('用户管理-页面', '角色管理-页面', '团队管理-页面', '公告管理-页面')
|
||||||
|
|
||||||
# 检查数据库和应用权限
|
# 检查数据库和应用权限
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
# 一级菜单的标题、图标和显示顺序
|
||||||
|
title = '通知管理'
|
||||||
|
icon = 'antd-notification'
|
||||||
|
order = 9997
|
|
@ -0,0 +1,22 @@
|
||||||
|
from common.utilities.util_menu_access import MenuAccess
|
||||||
|
from typing import List
|
||||||
|
import feffery_antd_components as fac
|
||||||
|
import feffery_utils_components as fuc
|
||||||
|
from common.utilities.util_logger import Log
|
||||||
|
from dash import html
|
||||||
|
from dash_components import Card
|
||||||
|
from dash import dcc
|
||||||
|
from database.sql_db.dao import dao_user
|
||||||
|
from i18n import t__person, t__default, t__access
|
||||||
|
|
||||||
|
|
||||||
|
# 二级菜单的标题、图标和显示顺序
|
||||||
|
title = '公告管理'
|
||||||
|
icon = None
|
||||||
|
logger = Log.get_logger(__name__)
|
||||||
|
order = 1
|
||||||
|
access_metas = ('公告管理-页面',)
|
||||||
|
|
||||||
|
|
||||||
|
def render_content(menu_access: MenuAccess, **kwargs):
|
||||||
|
...
|
|
@ -46,11 +46,32 @@ def render_head_content(menu_access: MenuAccess):
|
||||||
'alignItems': 'center',
|
'alignItems': 'center',
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
*(
|
||||||
|
[
|
||||||
|
fac.AntdAlert(
|
||||||
|
message=dao_announcement.get_announcement(),
|
||||||
|
type='info',
|
||||||
|
banner=True,
|
||||||
|
showIcon=True,
|
||||||
|
icon='📢',
|
||||||
|
messageRenderMode='loop-text',
|
||||||
|
className={
|
||||||
|
'backgroundColor': 'rgba(0,0,0,0)',
|
||||||
|
'maxWidth': '20em',
|
||||||
|
'marginLeft': '50px',
|
||||||
|
'border': '1px',
|
||||||
|
},
|
||||||
|
)
|
||||||
|
]
|
||||||
|
if dao_announcement.get_announcement()
|
||||||
|
else []
|
||||||
|
),
|
||||||
],
|
],
|
||||||
style={
|
style={
|
||||||
'height': '100%',
|
'height': '100%',
|
||||||
'alignItems': 'center',
|
'alignItems': 'center',
|
||||||
},
|
},
|
||||||
|
wrap=False,
|
||||||
),
|
),
|
||||||
id='header-breadcrumb-col',
|
id='header-breadcrumb-col',
|
||||||
flex='1',
|
flex='1',
|
||||||
|
@ -59,26 +80,6 @@ def render_head_content(menu_access: MenuAccess):
|
||||||
fac.AntdCol(
|
fac.AntdCol(
|
||||||
fac.AntdSpace(
|
fac.AntdSpace(
|
||||||
[
|
[
|
||||||
*(
|
|
||||||
[
|
|
||||||
fac.AntdAlert(
|
|
||||||
message=dao_announcement.get_announcement(),
|
|
||||||
type='info',
|
|
||||||
banner=True,
|
|
||||||
showIcon=True,
|
|
||||||
messageRenderMode='marquee',
|
|
||||||
className={
|
|
||||||
'backgroundColor': 'rgba(0,0,0,0)',
|
|
||||||
'minWidth': '30em',
|
|
||||||
'maxWidth': '50em',
|
|
||||||
'marginRight': '40px',
|
|
||||||
'& div ': {'textDecoration': 'underline'},
|
|
||||||
},
|
|
||||||
)
|
|
||||||
]
|
|
||||||
if dao_announcement.get_announcement()
|
|
||||||
else []
|
|
||||||
),
|
|
||||||
html.A(
|
html.A(
|
||||||
html.Img(src='https://img.shields.io/github/stars/luojiaaoo/DashGo.svg?style=social&label=Stars'),
|
html.Img(src='https://img.shields.io/github/stars/luojiaaoo/DashGo.svg?style=social&label=Stars'),
|
||||||
href='https://github.com/luojiaaoo/DashGo',
|
href='https://github.com/luojiaaoo/DashGo',
|
||||||
|
@ -129,27 +130,28 @@ def render_head_content(menu_access: MenuAccess):
|
||||||
],
|
],
|
||||||
placement='bottomRight',
|
placement='bottomRight',
|
||||||
),
|
),
|
||||||
|
fac.AntdTooltip(
|
||||||
|
fac.AntdIcon(
|
||||||
|
id='global-full-screen',
|
||||||
|
icon='antd-full-screen',
|
||||||
|
debounceWait=300,
|
||||||
|
style={'cursor': 'pointer', 'marginLeft': '12px', 'fontSize': '1.2em'},
|
||||||
|
),
|
||||||
|
title=t__default('全屏'),
|
||||||
|
placement='left',
|
||||||
|
),
|
||||||
|
render_lang_content(),
|
||||||
],
|
],
|
||||||
style={
|
style={
|
||||||
'height': '100%',
|
'height': '100%',
|
||||||
'display': 'flex',
|
'display': 'flex',
|
||||||
'alignItems': 'center',
|
'alignItems': 'center',
|
||||||
'paddingRight': '20px',
|
'paddingRight': '10px',
|
||||||
},
|
},
|
||||||
|
wrap=False,
|
||||||
),
|
),
|
||||||
flex='None',
|
flex='None',
|
||||||
),
|
),
|
||||||
fac.AntdTooltip(
|
|
||||||
fac.AntdIcon(
|
|
||||||
id='global-full-screen',
|
|
||||||
icon='antd-full-screen',
|
|
||||||
debounceWait=300,
|
|
||||||
style={'cursor': 'pointer', 'marginRight': '12px', 'fontSize': '1.2em'},
|
|
||||||
),
|
|
||||||
title=t__default('全屏'),
|
|
||||||
placement='left',
|
|
||||||
),
|
|
||||||
render_lang_content(),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
from peewee import JOIN
|
from peewee import JOIN
|
||||||
|
from ..entity.table_announcement import SysAnnouncement
|
||||||
|
from ..entity.table_user import SysUser
|
||||||
|
|
||||||
|
|
||||||
def get_announcement() -> bool:
|
def get_announcement() -> bool:
|
||||||
from ..entity.table_announcement import SysAnnouncement
|
|
||||||
from ..entity.table_user import SysUser
|
|
||||||
|
|
||||||
"""获取公告内容"""
|
"""获取公告内容"""
|
||||||
query = (
|
query = (
|
||||||
SysAnnouncement.select(SysAnnouncement.datetime, SysAnnouncement.announcement, SysUser.user_full_name)
|
SysAnnouncement.select(SysAnnouncement.datetime, SysAnnouncement.announcement, SysAnnouncement.user_name, SysUser.user_full_name)
|
||||||
.join(SysUser, JOIN.LEFT_OUTER, on=(SysAnnouncement.user_name == SysUser.user_name))
|
.join(SysUser, JOIN.LEFT_OUTER, on=(SysAnnouncement.user_name == SysUser.user_name))
|
||||||
.where(SysAnnouncement.status)
|
.where(SysAnnouncement.status)
|
||||||
.order_by(SysAnnouncement.datetime.desc())
|
.order_by(SysAnnouncement.datetime.desc())
|
||||||
|
@ -16,6 +15,6 @@ def get_announcement() -> bool:
|
||||||
announcements = []
|
announcements = []
|
||||||
for announcement in query.dicts():
|
for announcement in query.dicts():
|
||||||
announcements.append(
|
announcements.append(
|
||||||
f'『{announcement["datetime"]:%Y%m%d} {announcement["user_full_name"] if announcement["user_full_name"] else "Unknown"}』{announcement["announcement"]}'
|
f'『{announcement["datetime"]:%Y/%m/%d} {announcement["user_name"]}({announcement["user_full_name"] if announcement["user_full_name"] else "Unknown"})』{announcement["announcement"]}'
|
||||||
)
|
)
|
||||||
return '⠀⠀⠀⠀➤' + '⠀⠀⠀⠀➤'.join(announcements)
|
return announcements
|
||||||
|
|
Loading…
Reference in New Issue