WebUI API 文档
概述
Amrita 的 WebUI 模块提供了一个基于 FastAPI 的 Web 管理界面,允许用户通过浏览器管理机器人。该模块包含了一套完整的 API 和页面装饰器,方便开发者快速创建新的管理页面。
核心组件
PageContext 类
PageContext 是传递给每个页面处理函数的上下文对象,包含了处理请求所需的所有信息。
属性
request: FastAPI 的 Request 对象,包含 HTTP 请求信息sidebar: 侧边栏菜单项列表auth: AuthManager 实例,用于处理认证相关操作token_manager: TokenManager 实例,用于管理访问令牌
方法
get_sidebar(): 返回侧边栏数据的字典列表表示
on_page 装饰器
on_page 是一个装饰器函数,用于注册新的 Web UI 页面。它会自动处理侧边栏管理、页面激活状态设置等通用功能。
函数签名
python
def on_page(
path: str,
page_name: str,
category: str = "其他功能",
icon: str | None = None
)参数说明
path(str): 页面的 URL 路径page_name(str): 页面名称,将显示在侧边栏中category(str, optional): 页面所属的分类,默认为"其他功能"icon(str | None, optional): 页面图标,用于在侧边栏中显示
TIP
注意:如果分类(category)不存在,则页面不会显示在侧边栏中
返回值
返回一个装饰器函数,用于装饰页面处理函数。
使用示例
python
@on_page(path="/path/to/your/page", page_name="我的Amrita 页面", category="其他功能")
async def _(ctx: PageContext):
return PageResponse(
name="my_page.html.jinja2", context={"title": "我的Amrita 页面"}
)在页面处理函数中,可以通过 ctx 参数访问请求信息、侧边栏数据和认证管理器。
侧边栏管理
侧边栏是 WebUI 的重要组成部分,用于导航不同的功能页面。
数据结构
SideBarItem
表示侧边栏中的单个菜单项。
name: 菜单项名称icon: 图标类名(可选)url: 菜单项链接(可选)active: 是否处于激活状态
SideBarCategory
表示侧边栏中的分类。
name: 分类名称icon: 分类图标(可选)url: 分类链接(可选)active: 是否处于激活状态children: 该分类下的子菜单项列表
SideBarManager
SideBarManager 是一个单例类,用于管理整个应用的侧边栏。
主要方法
get_sidebar(): 获取侧边栏对象get_sidebar_dump(): 获取侧边栏的字典表示列表add_sidebar_category(item: SideBarCategory): 添加新的侧边栏分类add_sidebar_item(category: str, item: SideBarItem): 向指定分类添加菜单项
认证系统
WebUI 包含一个基于 JWT 的认证系统。
AuthManager
AuthManager 提供用户认证相关功能。
主要方法
authenticate_user(username: str, password: str): 验证用户凭据create_token(username: str, expires_delta: timedelta): 创建访问令牌check_current_user(request: Request): 检查当前用户是否已认证
TokenManager
TokenManager 负责管理访问令牌。
页面开发 API
TemplatesManager
TemplatesManager 是一个单例类,用于管理页面模板。 主要方法
add_templates_dir(dir_path: Path): 添加模板目录get_templates_dir() -> list[Path]: 获取模板目录列表get_templates() -> Jinja2Templates: 获取模板对象get_base_html_path() -> Path: 基本 HTML 模板路径
页面开发示例
以下是一个完整的页面开发示例:
python
from pathlib import Path
from amrita.plugins.webui.API import (
PageContext,
PageResponse,
TemplatesManager,
on_page,
)
# 添加模板目录
TemplatesManager().add_templates_dir(
Path(__file__).resolve().parent / "templates_example"
)
# 创建页面
@on_page(path="/path/to/your/page", page_name="我的Amrita 页面", category="其他功能")
async def _(ctx: PageContext):
return PageResponse(
name="my_page.html.jinja2", context={"title": "我的Amrita 页面"}
)以下是一个示例页面模板:
html
{%extends base_html%} {% block title %}我的Amrita页面{% endblock %} {% block
topbar_title %}我的页面{% endblock %} {% block content %}
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">我的页面</h3>
</div>
</div>
</div>
</div>
</div>
{% endblock %}最佳实践
- 页面组织: 将相关功能的页面放在同一分类下,提高用户体验
- 错误处理: 为页面添加适当的错误处理机制
- 性能优化: 对于数据量大的页面,考虑添加分页或懒加载功能
前端 API
请参考前端 API
