feature: 添加 公告管理

This commit is contained in:
luojiaaoo 2025-03-11 21:55:53 +08:00
parent 4f688396e7
commit eeae93ea46
6 changed files with 69 additions and 41 deletions

View File

@ -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)

View File

@ -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

View File

@ -0,0 +1,4 @@
# 一级菜单的标题、图标和显示顺序
title = '通知管理'
icon = 'antd-notification'
order = 9997

View File

@ -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):
...

View File

@ -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(),
]

View File

@ -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