This commit is contained in:
2025-04-18 12:14:26 +08:00
parent fc87152f69
commit 2a217c4b8c
18 changed files with 180 additions and 363 deletions

View File

@@ -8,8 +8,6 @@ from model import database
from model.response import DefaultResponse
from model.items import Item
Router = APIRouter(prefix='/api/admin', tags=['admin'])
async def is_admin(token: Annotated[str, Depends(JWT.oauth2_scheme)]):
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
@@ -27,17 +25,22 @@ async def is_admin(token: Annotated[str, Depends(JWT.oauth2_scheme)]):
raise credentials_exception
return True
Router = APIRouter(
prefix='/api/admin',
tags=['admin'],
dependencies=[Depends(is_admin)]
)
@Router.get('/')
async def is_admin(
async def verity_admin(
is_admin: Annotated[str, Depends(is_admin)]
):
return is_admin
@Router.get('/items')
async def get_items(
is_admin: Annotated[str, Depends(is_admin)],
id: int = None,
key: str = None):
id: Optional[int] = None,
key: Optional[str] = None):
results = await database.Database().get_object(id=id, key=key)
if results is not None:
@@ -65,7 +68,6 @@ async def get_items(
@Router.post('/items')
async def add_items(
is_admin: Annotated[str, Depends(is_admin)],
key: str,
name: str,
icon: str,
@@ -75,13 +77,12 @@ async def add_items(
@Router.patch('/items')
async def update_items(
is_admin: Annotated[str, Depends(is_admin)],
id: int,
key: str = None,
name: str = None,
icon: str = None,
status: str = None,
phone: int = None,
key: Optional[str] = None,
name: Optional[str] = None,
icon: Optional[str] = None,
status: Optional[str] = None,
phone: Optional[int] = None,
lost_description: Optional[str] = None,
find_ip: Optional[str] = None,
lost_time: Optional[str] = None):
@@ -99,7 +100,6 @@ async def update_items(
@Router.delete('/items')
async def delete_items(
is_admin: Annotated[str, Depends(is_admin)],
id: int):
try:
await database.Database().delete_object(id=id)

View File

@@ -10,49 +10,20 @@ Copyright (c) 2018-2024 by 于小丘Yuerchu, All Rights Reserved.
'''
from nicegui import ui
from fastapi import Request
from tool import *
from ..framework import frame
def create():
@ui.page('/admin/about')
async def admin_about():
dark_mode = ui.dark_mode(value=True)
ui.add_head_html(
code="""
<style>
a:link:not(.browser-window *),
a:visited:not(.browser-window *) {
color: inherit !important;
text-decoration: none;
}
a:hover:not(.browser-window *),
a:active:not(.browser-window *) {
opacity: 0.85;
}
.bold-links a:link {
font-weight: 500;
}
.arrow-links a:link:not(.auto-link)::after {
content: "north_east";
font-family: "Material Icons";
font-weight: 100;
vertical-align: -10%;
}
</style>
"""
)
async def admin_about(request: Request):
ui.add_head_html("""
<style type="text/css" src="/static/css/about.css"></style>
<script type="text/javascript" src="/static/js/main.js"></script>
""")
async with frame():
async with frame(request=request):
# 关于 Findreve
with ui.tab_panel('about'):

View File

@@ -11,17 +11,15 @@ Copyright (c) 2018-2024 by 于小丘Yuerchu, All Rights Reserved.
from nicegui import ui
from tool import *
from fastapi import Request
from ..framework import frame
def create():
@ui.page('/admin/auth')
async def admin_auth():
dark_mode = ui.dark_mode(value=True)
async def admin_auth(request: Request):
# Findreve 授权
async with frame():
async with frame(request=request):
ui.label('Findreve 授权').classes('text-2xl text-bold')

View File

@@ -9,22 +9,21 @@ Description: Findreve 后台管理 admin
Copyright (c) 2018-2024 by 于小丘Yuerchu, All Rights Reserved.
'''
from nicegui import ui
from nicegui import ui, app
from fastapi import Request
from fastapi.responses import RedirectResponse
from tool import *
from ..framework import frame
def create():
@ui.page('/admin')
@app.get('/admin')
async def jump():
ui.navigate.to('/admin/home')
return RedirectResponse(url='/admin/home')
@ui.page('/admin/home')
async def admin_home():
dark_mode = ui.dark_mode(value=True)
async with frame():
async def admin_home(request: Request):
async with frame(request=request):
with ui.tab_panel('main_page'):
ui.label('首页配置').classes('text-2xl text-bold')
ui.label('暂不支持请直接修改main_page.py').classes('text-md text-gray-600').classes('w-full')

View File

@@ -94,7 +94,7 @@ def create() -> None:
await ui.context.client.connected()
async with frame(page='found'):
async with frame(page='found', request=request):
if key == "" or key == None:
ui.navigate.to('/404')
return

View File

@@ -1,11 +1,14 @@
from contextlib import asynccontextmanager
from nicegui import ui
import asyncio
from fastapi import Request
from typing import Optional, Literal
@asynccontextmanager
async def frame(
page: Literal['admin', 'session', 'found'] = 'admin'
request: Request = None,
page: Literal['admin', 'session', 'found'] = 'admin',
redirect_to: str = None
):
ui.add_head_html("""
@@ -15,8 +18,15 @@ async def frame(
await ui.context.client.connected()
is_login = await ui.run_javascript('is_login()', timeout=3)
if str(is_login).lower() != 'true' and page != 'session':
ui.navigate.to('/login?redirect_to=/admin')
if str(is_login).lower() != 'true':
if page not in ['session', 'found']:
ui.navigate.to(f'/login?redirect_to={request.url.path}')
else:
if page == 'session':
ui.navigate.to(redirect_to)
if page != 'found':
ui.dark_mode(value=True)
with ui.header() \
.classes('items-center py-2 px-5 no-wrap').props('elevated'):
@@ -31,7 +41,7 @@ async def frame(
with ui.left_drawer() as left_drawer:
with ui.column(align_items='center').classes('w-full'):
ui.image('/static/Findreve.png').classes('w-1/2 mx-auto')
ui.image('/static/Findreve.png').classes('w-1/3 mx-auto')
ui.label('Findreve').classes('text-2xl text-bold')
ui.label("免费版,无需授权").classes('text-sm text-gray-500')

View File

@@ -12,7 +12,6 @@ Copyright (c) 2018-2024 by 于小丘Yuerchu, All Rights Reserved.
from nicegui import ui
from typing import Optional
from fastapi.responses import RedirectResponse
from fastapi import Request
from .framework import frame
def create() -> Optional[RedirectResponse]:
@@ -23,9 +22,11 @@ def create() -> Optional[RedirectResponse]:
""")
ui.page_title('登录 Findreve')
ui.dark_mode(True)
async with frame(page='session'):
async with frame(page='session', redirect_to=redirect_to):
await ui.context.client.connected()
async def login():
if username.value == "" or password.value == "":
ui.notify('账号或密码不能为空', color='negative')

View File

@@ -24,22 +24,7 @@ def create() -> None:
# 添加页面过渡动画
ui.add_head_html('''
<style>
.fade-in {
animation: fadeIn 0.8s ease-in-out;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
body > div {
opacity: 0;
animation: fadeIn 0.8s ease-in-out forwards;
}
.transform {
transition: all 0.3s ease;
}
</style>
<style type="text/css" src="/static/css/main_page.css"></style>
''')
with ui.row(align_items='center').classes('w-full items-center justify-center items-stretch mx-auto mx-8 max-w-7xl p-24'):