From eeae93ea4611a9bc1f19f6d396cf761254edd7ab Mon Sep 17 00:00:00 2001 From: luojiaaoo <675925864@qq.com> Date: Tue, 11 Mar 2025 21:55:53 +0800 Subject: [PATCH] =?UTF-8?q?feature:=20=E6=B7=BB=E5=8A=A0=20=E5=85=AC?= =?UTF-8?q?=E5=91=8A=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.py | 2 +- src/config/access_factory.py | 5 +- .../application/notification_/__init__.py | 4 ++ .../application/notification_/announcement.py | 22 +++++++ src/dash_view/framework/head.py | 66 ++++++++++--------- src/database/sql_db/dao/dao_announcement.py | 11 ++-- 6 files changed, 69 insertions(+), 41 deletions(-) create mode 100644 src/dash_view/application/notification_/__init__.py create mode 100644 src/dash_view/application/notification_/announcement.py diff --git a/src/app.py b/src/app.py index 6adbb22..760e210 100644 --- a/src/app.py +++ b/src/app.py @@ -42,4 +42,4 @@ def valid_token(): app.layout = valid_token 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) diff --git a/src/config/access_factory.py b/src/config/access_factory.py index a228576..ecde9e4 100644 --- a/src/config/access_factory.py +++ b/src/config/access_factory.py @@ -2,6 +2,7 @@ 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.person_ import personal_info +from dash_view.application.notification_ import announcement ################## 【开始】此处导入您的应用 ################### from dash_view.application.example_app import subapp1, subapp2 @@ -20,7 +21,7 @@ def trim_module_path2menu_item(module_path): class AccessFactory: 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中配置的所有权限 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 = ('团队授权-页面',) # 系统管理员默认权限 - admin_access_meta = ('用户管理-页面', '角色管理-页面', '团队管理-页面') + admin_access_meta = ('用户管理-页面', '角色管理-页面', '团队管理-页面', '公告管理-页面') # 检查数据库和应用权限 @classmethod diff --git a/src/dash_view/application/notification_/__init__.py b/src/dash_view/application/notification_/__init__.py new file mode 100644 index 0000000..7fe1fe1 --- /dev/null +++ b/src/dash_view/application/notification_/__init__.py @@ -0,0 +1,4 @@ +# 一级菜单的标题、图标和显示顺序 +title = '通知管理' +icon = 'antd-notification' +order = 9997 diff --git a/src/dash_view/application/notification_/announcement.py b/src/dash_view/application/notification_/announcement.py new file mode 100644 index 0000000..8c2ab26 --- /dev/null +++ b/src/dash_view/application/notification_/announcement.py @@ -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): + ... \ No newline at end of file diff --git a/src/dash_view/framework/head.py b/src/dash_view/framework/head.py index 31b9689..51c5164 100644 --- a/src/dash_view/framework/head.py +++ b/src/dash_view/framework/head.py @@ -46,11 +46,32 @@ def render_head_content(menu_access: MenuAccess): '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={ 'height': '100%', 'alignItems': 'center', }, + wrap=False, ), id='header-breadcrumb-col', flex='1', @@ -59,26 +80,6 @@ def render_head_content(menu_access: MenuAccess): fac.AntdCol( 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.Img(src='https://img.shields.io/github/stars/luojiaaoo/DashGo.svg?style=social&label=Stars'), href='https://github.com/luojiaaoo/DashGo', @@ -129,27 +130,28 @@ def render_head_content(menu_access: MenuAccess): ], 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={ 'height': '100%', 'display': 'flex', 'alignItems': 'center', - 'paddingRight': '20px', + 'paddingRight': '10px', }, + wrap=False, ), 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(), ] diff --git a/src/database/sql_db/dao/dao_announcement.py b/src/database/sql_db/dao/dao_announcement.py index 5c66163..38e2733 100644 --- a/src/database/sql_db/dao/dao_announcement.py +++ b/src/database/sql_db/dao/dao_announcement.py @@ -1,13 +1,12 @@ from peewee import JOIN +from ..entity.table_announcement import SysAnnouncement +from ..entity.table_user import SysUser def get_announcement() -> bool: - from ..entity.table_announcement import SysAnnouncement - from ..entity.table_user import SysUser - """获取公告内容""" 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)) .where(SysAnnouncement.status) .order_by(SysAnnouncement.datetime.desc()) @@ -16,6 +15,6 @@ def get_announcement() -> bool: announcements = [] for announcement in query.dicts(): 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