update docs

This commit is contained in:
long2ice
2021-05-09 15:11:52 +08:00
parent 3e9c6f636e
commit 4aebeda3e8
9 changed files with 257 additions and 215 deletions

View File

@@ -54,3 +54,11 @@ You can enable site search by add `SearchProvider` to `admin_app.configure(...)`
```python
await admin_app.configure(providers=[SearchProvider()])
```
## Notification
You can use notification by adding `NotificationProvider` to `admin_app.configure(...) implement by websocket.
```python
await admin_app.configure(providers=[NotificationProvider()])
```

View File

@@ -0,0 +1,47 @@
# Notification (💗 Pro only)
`FastAPI-Admin` provide a notification center implement by websocket.
![](https://github.com/fastapi-admin/fastapi-admin/blob/dev/images/notification.png?raw=true)
## Usage
You should add it to providers to enable it.
```python
from fastapi import FastAPI
from fastapi_admin.app import app as admin_app
from fastapi_admin.providers.notification import NotificationProvider
app = FastAPI()
provider = NotificationProvider()
@app.on_event("startup")
async def startup():
await admin_app.configure(
providers=[provider]
)
```
There are two ways to send notifications.
One is call `await provider.broadcast()` directly.
```python
data = {
"title": "test",
"content": "//avatars.githubusercontent.com/u/13377178?v=4",
"image": "https://avatars.githubusercontent.com/u/13377178?v=4"
}
await provider.broadcast(data)
```
If you want to send notifications out of application, another way is use http api.
```python
import requests
requests.post('http://localhost:8000/admin/notification', json=data)
```

View File

@@ -52,6 +52,7 @@ nav:
- reference/admin_log.md
- reference/global_search.md
- reference/errors.md
- reference/notification.md
- Customization:
- custom/page.md
- custom/overwrite.md

View File

@@ -32,7 +32,7 @@ class UsernamePasswordProvider(Provider):
admin_model: Type[AbstractAdmin],
login_path="/login",
logout_path="/logout",
template="login.html",
template="providers/login/login.html",
login_title="Login to your account",
login_logo_url: str = None,
):
@@ -179,7 +179,7 @@ class UsernamePasswordProvider(Provider):
resources=Depends(get_resources),
):
return templates.TemplateResponse(
"password.html",
"providers/login/password.html",
context={
"request": request,
"resources": resources,

View File

@@ -0,0 +1,26 @@
<div class="nav-item me-3 dropdown d-none d-md-flex">
<a href="#" class="nav-link px-0" data-bs-toggle="dropdown" tabindex="-1"
aria-label="Show notifications">
<svg xmlns="http://www.w3.org/2000/svg"
class="icon icon-tabler icon-tabler-language"
width="24" height="24"
viewBox="0 0 24 24" stroke-width="2"
stroke="currentColor" fill="none"
stroke-linecap="round"
stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M5 7h7m-2 -2v2a5 8 0 0 1 -5 8m1 -4a7 4 0 0 0 6.7 4"></path>
<path d="M11 19l4 -9l4 9m-.9 -2h-6.2"></path>
</svg>
</a>
<div class="dropdown-menu dropdown-menu-arrow">
<a class="dropdown-item"
href="{{ {'language':'zh_CN'}|current_page_with_params }}">
<span class="me-2">🇨🇳</span>简体中文
</a>
<a class="dropdown-item"
href="{{ {'language':'en_US'}|current_page_with_params }}">
<span class="me-2">🇺🇸</span>English
</a>
</div>
</div>

View File

@@ -1,219 +1,151 @@
{% extends "base.html" %} {% block body %}
<div class="wrapper min-vh-100">
<aside class="navbar navbar-vertical navbar-expand-lg navbar-dark">
<div class="container-fluid">
<h1 class="navbar-brand navbar-brand-autodark">
<a href="{{ request.app.admin_path }}">
<img
src="{{ request.app.logo_url }}"
width="110"
height="32"
alt="Tabler"
class="navbar-brand-image"
/>
</a>
</h1>
<div class="collapse navbar-collapse" id="navbar-menu">
<ul class="navbar-nav pt-lg-3">
{% for resource in resources %} {% if resource.type == 'link' %} {%
include 'components/link.html' %} {% elif resource.type == 'model' %}
{% include 'components/model.html' %} {% elif resource.type ==
'dropdown' %} {% include 'components/dropdown.html' %} {% endif %} {%
endfor %}
</ul>
</div>
</div>
</aside>
<div class="page-wrapper min-vh-100">
<header
class="navbar navbar-expand-md navbar-light d-none d-lg-flex d-print-none"
>
<div class="container-fluid">
<button
class="navbar-toggler"
type="button"
data-bs-toggle="collapse"
data-bs-target="#navbar-menu"
>
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-nav flex-row order-md-last">
{% if request.app.language_switch %}
<div class="nav-item dropdown d-none d-md-flex me-3">
<a
href="#"
class="nav-link px-0"
data-bs-toggle="dropdown"
tabindex="-1"
aria-label="Show notifications"
>
<svg
xmlns="http://www.w3.org/2000/svg"
class="icon icon-tabler icon-tabler-language"
width="24"
height="24"
viewBox="0 0 24 24"
stroke-width="2"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path
d="M5 7h7m-2 -2v2a5 8 0 0 1 -5 8m1 -4a7 4 0 0 0 6.7 4"
></path>
<path d="M11 19l4 -9l4 9m-.9 -2h-6.2"></path>
</svg>
</a>
<div class="dropdown-menu dropdown-menu-arrow">
<a
class="dropdown-item"
href="{{ {'language':'zh_CN'}|current_page_with_params }}"
>
<span class="me-2">🇨🇳</span>简体中文
</a>
<a
class="dropdown-item"
href="{{ {'language':'en_US'}|current_page_with_params }}"
>
<span class="me-2">🇺🇸</span>English
</a>
<div class="wrapper min-vh-100">
<aside class="navbar navbar-vertical navbar-expand-lg navbar-dark">
<div class="container-fluid">
<h1 class="navbar-brand navbar-brand-autodark">
<a href="{{ request.app.admin_path }}">
<img
src="{{ request.app.logo_url }}"
width="110"
height="32"
alt="Tabler"
class="navbar-brand-image"
/>
</a>
</h1>
<div class="collapse navbar-collapse" id="navbar-menu">
<ul class="navbar-nav pt-lg-3">
{% for resource in resources %} {% if resource.type == 'link' %}
{% include 'components/link.html' %} {% elif resource.type == 'model' %}
{% include 'components/model.html' %} {% elif resource.type ==
'dropdown' %} {% include 'components/dropdown.html' %} {% endif %} {% endfor %}
</ul>
</div>
</div>
</div>
{% endif %}
<div class="nav-item dropdown">
<a
href="#"
class="nav-link d-flex lh-1 text-reset p-0"
data-bs-toggle="dropdown"
</aside>
<div class="page-wrapper min-vh-100">
<header
class="navbar navbar-expand-md navbar-light d-none d-lg-flex d-print-none"
>
<span class="avatar avatar-sm">
<img src="{{ request.state.admin.avatar }}" alt="" />
</span>
<div class="d-none d-xl-block ps-2">
<div>{{ request.state.admin.username }}</div>
<div class="mt-1 small text-muted">{{ _('welcome') }}</div>
</div>
</a>
<div class="dropdown-menu dropdown-menu-end dropdown-menu-arrow">
<a
href="{{ request.app.admin_path }}/password"
class="dropdown-item"
>{{ _('update_password') }}</a
>
<div class="dropdown-divider"></div>
<a
href="{{ request.app.admin_path }}{{ request.app.login_provider.logout_path }}"
class="dropdown-item"
>{{ _('logout') }}</a
>
<div class="container-fluid">
<button
class="navbar-toggler"
type="button"
data-bs-toggle="collapse"
data-bs-target="#navbar-menu"
>
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-nav flex-row order-md-last">
{% if request.app.language_switch %}
{% include "components/language.html" %}
{% endif %}
{% if request.app.login_provider %}
{% include "providers/login/avatar.html" %}
{% endif %}
</div>
<div></div>
</div>
</header>
<div class="container-fluid">
<div class="page-header d-print-none">
{% block page_header %}
<div class="row align-items-center">
<div class="col">
<div class="page-pretitle">{{ page_pre_title or '' }}</div>
<h2 class="page-title">{{ page_title or '' }}</h2>
</div>
</div>
{% block page_title_actions %} {% endblock %} {% endblock %}
</div>
</div>
</div>
<div class="page-body flex-grow-1">
<div class="container-fluid">
<div class="row row-deck row-cards">
{% block page_body %} {% endblock %}
</div>
</div>
</div>
{% block footer %}
<footer class="footer footer-transparent d-print-none">
<div class="container">
<div class="row text-center align-items-center flex-row-reverse">
<div class="col-lg-auto ms-lg-auto">
<ul class="list-inline list-inline-dots mb-0">
<li class="list-inline-item">
<a
href="https://fastapi-admin.github.io/fastapi-admin"
class="link-secondary"
>Documentation</a
>
</li>
<li class="list-inline-item">
<a
href="https://github.com/fastapi-admin/fastapi-admin/blob/dev/LICENSE"
class="link-secondary"
>License</a
>
</li>
<li class="list-inline-item">
<a
href="https://github.com/fastapi-admin/fastapi-admin"
target="_blank"
class="link-secondary"
rel="noopener"
>Source code</a
>
</li>
<li class="list-inline-item">
<a
href="https://sponsor.long2ice.cn"
target="_blank"
class="link-secondary"
rel="noopener"
>
<svg
xmlns="http://www.w3.org/2000/svg"
class="icon text-pink icon-filled icon-inline"
width="24"
height="24"
viewBox="0 0 24 24"
stroke-width="2"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path
d="M19.5 13.572l-7.5 7.428l-7.5 -7.428m0 0a5 5 0 1 1 7.5 -6.566a5 5 0 1 1 7.5 6.572"
></path>
</svg>
Sponsor
</a>
</li>
</ul>
</div>
<div class="col-12 col-lg-auto mt-3 mt-lg-0">
<ul class="list-inline list-inline-dots mb-0">
<li class="list-inline-item">
Copyright © {{ 2021 }} - {{ NOW_YEAR }}
<a href="http://github.com/long2ice" class="link-secondary"
>long2ice</a
>. All rights reserved.
</li>
<li class="list-inline-item">
<a
href="https://github.com/fastapi-admin/fastapi-admin/releases/tag/v{{ VERSION }}"
class="link-secondary"
rel="noopener"
>v{{ VERSION }}</a
>
</li>
</ul>
</div>
</div>
</div>
</footer>
{% endblock %}
</div>
<div></div>
</div>
</header>
<div class="container-fluid">
<div class="page-header d-print-none">
{% block page_header %}
<div class="row align-items-center">
<div class="col">
<div class="page-pretitle">{{ page_pre_title or '' }}</div>
<h2 class="page-title">{{ page_title or '' }}</h2>
</div>
</div>
{% block page_title_actions %} {% endblock %} {% endblock %}
</div>
</div>
<div class="page-body flex-grow-1">
<div class="container-fluid">
<div class="row row-deck row-cards">
{% block page_body %} {% endblock %}
</div>
</div>
</div>
{% block footer %}
<footer class="footer footer-transparent d-print-none">
<div class="container">
<div class="row text-center align-items-center flex-row-reverse">
<div class="col-lg-auto ms-lg-auto">
<ul class="list-inline list-inline-dots mb-0">
<li class="list-inline-item">
<a
href="https://fastapi-admin.github.io/fastapi-admin"
class="link-secondary"
>Documentation</a
>
</li>
<li class="list-inline-item">
<a
href="https://github.com/fastapi-admin/fastapi-admin/blob/dev/LICENSE"
class="link-secondary"
>License</a
>
</li>
<li class="list-inline-item">
<a
href="https://github.com/fastapi-admin/fastapi-admin"
target="_blank"
class="link-secondary"
rel="noopener"
>Source code</a
>
</li>
<li class="list-inline-item">
<a
href="https://sponsor.long2ice.cn"
target="_blank"
class="link-secondary"
rel="noopener"
>
<svg
xmlns="http://www.w3.org/2000/svg"
class="icon text-pink icon-filled icon-inline"
width="24"
height="24"
viewBox="0 0 24 24"
stroke-width="2"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path
d="M19.5 13.572l-7.5 7.428l-7.5 -7.428m0 0a5 5 0 1 1 7.5 -6.566a5 5 0 1 1 7.5 6.572"
></path>
</svg>
Sponsor
</a>
</li>
</ul>
</div>
<div class="col-12 col-lg-auto mt-3 mt-lg-0">
<ul class="list-inline list-inline-dots mb-0">
<li class="list-inline-item">
Copyright © {{ 2021 }} - {{ NOW_YEAR }}
<a href="http://github.com/long2ice" class="link-secondary"
>long2ice</a
>. All rights reserved.
</li>
<li class="list-inline-item">
<a
href="https://github.com/fastapi-admin/fastapi-admin/releases/tag/v{{ VERSION }}"
class="link-secondary"
rel="noopener"
>v{{ VERSION }}</a
>
</li>
</ul>
</div>
</div>
</div>
</footer>
{% endblock %}
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,28 @@
<div class="nav-item dropdown">
<a
href="#"
class="nav-link d-flex lh-1 text-reset p-0"
data-bs-toggle="dropdown"
>
<span class="avatar avatar-sm">
<img src="{{ request.state.admin.avatar }}" alt=""/>
</span>
<div class="d-none d-xl-block ps-2">
<div>{{ request.state.admin.username }}</div>
<div class="mt-1 small text-muted">{{ _('welcome') }}</div>
</div>
</a>
<div class="dropdown-menu dropdown-menu-end dropdown-menu-arrow">
<a
href="{{ request.app.admin_path }}/password"
class="dropdown-item"
>{{ _('update_password') }}</a
>
<div class="dropdown-divider"></div>
<a
href="{{ request.app.admin_path }}{{ request.app.login_provider.logout_path }}"
class="dropdown-item"
>{{ _('logout') }}</a
>
</div>
</div>

View File

@@ -3,7 +3,7 @@
<div class="page page-center">
<div class="container-tight py-4">
<div class="text-center mb-4">
<a href="."
<a href="../.."
><img
src="{{ login_logo_url }}"
height="36"