Skip to content

Commit 325e906

Browse files
authored
Merge pull request #181 from kingmo888/master
更新文档适配所有示例到最新版
2 parents dfaf228 + 22f42fa commit 325e906

12 files changed

Lines changed: 414 additions & 60 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ everyone's sponsorship and support.
6262
- [SQLModel](https://sqlmodel.tiangolo.com/): Finish `ORM` model mapping. Perfectly
6363
combine [SQLAlchemy](https://www.sqlalchemy.org/) with [Pydantic](https://pydantic-docs.helpmanual.io/), and have all
6464
their features .
65-
- [Amis](https://baidu.gitee.io/amis): Finish admin page presentation.
65+
- [Amis](https://baidu.github.io/amis/): Finish admin page presentation.
6666

6767
## Composition
6868

README.zh.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
- [SQLModel](https://sqlmodel.tiangolo.com/) 负责ORM模型映射(
6565
完美结合[SQLAlchemy](https://www.sqlalchemy.org/)+[Pydantic](https://pydantic-docs.helpmanual.io/), 拥有`SQLAlchemy`
6666
`Pydantic`的所有功能)
67-
- [Amis](https://baidu.gitee.io/amis) 负责Admin后台页面展示
67+
- [Amis](https://aisuda.bce.baidu.com/amis/) 负责Admin后台页面展示
6868

6969
## 项目组成
7070

docs/zh/docs/index.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ pip install fastapi_amis_admin
8787

8888
```bash
8989
pip install fastapi_amis_admin[sqlmodel]
90-
```
90+
```
9191

9292
## 简单示例
9393

@@ -110,6 +110,11 @@ if __name__ == '__main__':
110110

111111
uvicorn.run(app)
112112
```
113+
### 运行程序
114+
```bash
115+
uvicorn main:app <--port 端口号> <--reload>
116+
```
117+
--port为指定启动端口(默认8000),--reload为开发过程中允许运行时重载。
113118

114119
## 模型管理示例
115120

docs/zh/docs/tutorials/basic/FormAdmin.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ from fastapi_amis_admin.crud import BaseApiOut
1010
from fastapi_amis_admin.models.fields import Field
1111
from pydantic import BaseModel
1212
from starlette.requests import Request
13-
13+
from fastapi_amis_admin.amis import Form
14+
from typing import Any
1415

1516
@site.register_admin
1617
class UserLoginFormAdmin(admin.FormAdmin):

docs/zh/docs/tutorials/basic/Inheritance.md

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,42 @@ class MyHomeAdmin(admin.HomeAdmin):
2222
# 获取默认页面
2323
page = await super().get_page(request)
2424
# 自定义修改
25-
page.body.title = 'MyHome'
25+
# page.body.title = 'MyHome' # page.body已改为list类型,该行废弃
26+
# 修改后台首页的内页标题
27+
page.title = 'MyHome'
28+
# 后台首页主体尾部追加内容
29+
page.body.append('welcome FastApi-AMIS')
2630
...
2731
return page
2832
```
2933

3034
## 示例-2(自定义模板管理基类)
3135

36+
根目录`templates`文件夹中新建`element.html`,html内容如下:
37+
```html
38+
<!DOCTYPE html>
39+
<html lang="en">
40+
<head>
41+
<meta charset="UTF-8">
42+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
43+
<title>{{ title }}</title>
44+
</head>
45+
<body>
46+
<h1>{{ title }}</h1>
47+
<p>The current time is: {{ current_time }}</p>
48+
</body>
49+
</html>
50+
```
51+
52+
main.py增加如下代码:
3253
```python linenums="1" hl_lines="6 7 11 20"
3354
import datetime
3455

3556
from fastapi_amis_admin import admin, amis
3657

3758

3859
class MyJinja2Admin(admin.TemplateAdmin):
39-
templates: Jinja2Templates = Jinja2Templates(directory='apps/demo/templates')
60+
templates: Jinja2Templates = Jinja2Templates(directory='templates')
4061

4162

4263
@site.register_admin
@@ -53,9 +74,44 @@ class ElementTemplateAdmin(MyJinja2Admin):
5374
page_schema = amis.PageSchema(label='ElementUI', icon='fa fa-link')
5475
template_name = 'element.html'
5576

56-
```
77+
async def get_page(self, request: Request) -> Dict[str, Any]:
78+
page = await super().get_page(request)
79+
# 有别于示例1中 admin.HomeAdmin 对page的修改,这里的page来自 admin.TemplateAdmin,是一个dict
80+
page['title'] = 'Element Title' # 该行不会生效
81+
return {'current_time': datetime.datetime.now(), 'title': 'Element Content'}
5782

83+
```
5884
## 示例-3(重用模型管理类)
85+
我们在*模型管理*-示例2的基础上进行改造,将`Article`类新增一行属性`is_active: bool = False # add`,如下:
86+
```python linenums="1" hl_lines="32"
87+
class Article(Base):
88+
__tablename__ = 'article'
89+
90+
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
91+
title: Mapped[str] = mapped_column(String(200), nullable=False)
92+
description: Mapped[str] = mapped_column(String(400), default='')
93+
status: Mapped[bool] = mapped_column(Boolean, default=False)
94+
content: Mapped[str] = mapped_column(String, nullable=False)
95+
category_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey('category.id'))
96+
is_active: bool = False # add
97+
98+
```
99+
然后我们继承原油`ArticleAdmin`重新实现一个新的page类别:
100+
```python
101+
@site.register_admin
102+
class ActiveArticle(ArticleAdmin):
103+
"""继承重用`ArticleAdmin`;此示例较为简单,实际应用可能比较复杂."""
104+
page_schema = PageSchema(label='文章管理(已激活)', icon='fa fa-file')
105+
# 自定义路由前缀
106+
router_prefix = '/article.active'
107+
108+
# 重写基础选择器
109+
async def get_select(self, request: Request) -> Select:
110+
stmt = await super().get_select(request)
111+
return stmt.where(Article.is_active == True)
112+
```
113+
此时,page中将分别有`文章管理`以及`文章管理(已激活)`,后者将只显示`is_active`为True的文章。
114+
## ~~~示例-3(重用模型管理类)~~~
59115

60116
```python linenums="1" hl_lines="32"
61117
from fastapi_amis_admin import admin

docs/zh/docs/tutorials/basic/ModelAction.md

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88
## 自定义工具条动作
99

1010
### 示例-1
11-
11+
1、增加引用
1212
```python
13-
@site.register_admin
14-
class ArticleAdmin(admin.ModelAdmin):
15-
page_schema = PageSchema(label='文章管理', icon='fa fa-file')
16-
model = Article
13+
from fastapi_amis_admin.admin.admin import AdminAction
14+
from fastapi_amis_admin.amis import ActionType
15+
```
16+
2、修改上一节中`ArticleAdmin`类,`page_schema`改为`page_schema = PageSchema(label='文章管理', icon='fa fa-file')`以增加图标,同时类中增加如下代码,来添加工具条
1717

18+
```python
1819
# 添加自定义工具条动作
1920
admin_action_maker = [
2021
lambda admin: AdminAction(
@@ -47,13 +48,19 @@ class ArticleAdmin(admin.ModelAdmin):
4748
!!! note annotate "关于`ActionType`"
4849

4950
ActionType事实上是[amis Action 行为按钮](https://baidu.gitee.io/amis/zh-CN/components/action?page=1)组件的一个python模型映射,它支持多种常见的行为类型.例如:ajax请求/下载请求/跳转链接/发送邮件/弹窗/抽屉/复制文本等等.
50-
51+
5152
fastapi_amis_admin的灵活性强体现之一,是因为它是基于amis的组件式开发,你可以在很多地方自由的替换或添加内置的amis组件.在此之前希望你能阅读[amis文档](https://baidu.gitee.io/amis/zh-CN/components/page),对amis核心组件有一定的了解.
5253

5354
## 自定义单项操作动作
5455

56+
我们将在上一步的基础上新增一个自定义普通处理动作
5557
### 示例-2
56-
58+
新增引入
59+
```python
60+
from typing import List
61+
from fastapi_amis_admin.amis import Dialog
62+
```
63+
增加一个普通动作定义:
5764
```python
5865
# 创建普通ajax动作
5966
class TestAction(admin.ModelAction):
@@ -68,15 +75,31 @@ class TestAction(admin.ModelAction):
6875
...
6976
# 返回动作处理结果
7077
return BaseApiOut(data=dict(item_id=item_id, data=data, items=list(items)))
78+
```
79+
修改`ArticleAdmin`,在`admin_action_maker`的list中追加一行`lambda admin: TestAction(admin, name='test_action', flags=['item', 'bulk'])`变为:
7180

72-
73-
@site.register_admin
74-
class ArticleAdmin(admin.ModelAdmin):
75-
page_schema = PageSchema(label='文章管理', icon='fa fa-file')
76-
model = Article
77-
# 添加自定义单项和批量操作动作
81+
```python
82+
# 添加自定义工具条动作
7883
admin_action_maker = [
79-
lambda admin: TestAction(admin, name='test_action',flags=['item','bulk'])
84+
lambda admin: AdminAction(
85+
admin=admin,
86+
name='test_ajax_action',
87+
action=ActionType.Ajax(
88+
label='工具条ajax动作',
89+
api='https://3xsw4ap8wah59.cfc-execute.bj.baidubce.com/api/amis-mock/mock2/form/saveForm'
90+
),
91+
flags=['toolbar']
92+
),
93+
lambda admin: AdminAction(
94+
admin=admin,
95+
name='test_link_action',
96+
action=ActionType.Link(
97+
label='工具条link动作',
98+
link='https://github.com/amisadmin/fastapi_amis_admin'
99+
),
100+
flags=['toolbar']
101+
),
102+
lambda admin: TestAction(admin, name='test_action', flags=['item', 'bulk'])
80103
]
81104
```
82105

@@ -90,6 +113,7 @@ class ArticleAdmin(admin.ModelAdmin):
90113

91114
## 自定义批量操作动作
92115

116+
本部分修改方式同上一步。
93117
### 示例-3
94118

95119
```python
@@ -116,19 +140,9 @@ class TestFormAction(admin.ModelAction):
116140
...
117141
# 返回动作处理结果
118142
return BaseApiOut(data=dict(item_id=item_id, data=data, items=list(items)))
119-
120-
121-
@site.register_admin
122-
class ArticleAdmin(admin.ModelAdmin):
123-
page_schema = PageSchema(label='文章管理', icon='fa fa-file')
124-
model = Article
125-
126-
# 添加自定义单项和批量操作动作
127-
admin_action_maker = [
128-
lambda admin: TestAction(admin, name='test_action',flags=['item','bulk'])
129-
]
130-
131143
```
144+
`admin_action_maker`的list中追加一行`lambda admin: TestFormAction(admin, name='test_form_action', flags=['item', 'bulk'])`
145+
132146

133147
示例-3与示例-2非常相似, 但是它允许用户添加一个自定义表单,这个在很多情况下,非常有用.
134148

docs/zh/docs/tutorials/basic/ModelAdmin.md

Lines changed: 75 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,48 @@
33
模型管理在后台管理中是最为常用的一个管理类,其使用功能也是最为丰富的. fastapi-amis-admin目前已经实现针对数据模型常用的各种基本操作,
44
并且你仍然可以在此基础上做出更多个性化的拓展.
55

6-
## 示例-1
6+
## 示例1(基于SQLAlchemy 2.0)
7+
```python
8+
from sqlalchemy import String
9+
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
10+
from typing import Optional
11+
12+
13+
class Base(DeclarativeBase):
14+
pass
15+
16+
17+
class CategorySchema(BaseModel):
18+
id: Optional[int] = Field(default=None, primary_key=True, nullable=False)
19+
name: str = Field(title="CategoryName")
20+
description: str = Field(default="", title="CategoryDescription")
21+
22+
class Config:
23+
# orm_mode = True
24+
from_attributes = True
25+
26+
27+
# 创建SQLAlchemy 2.0模型,详细请参考: https://docs.sqlalchemy.org/en/20/orm/quickstart.html
28+
class Category(Base):
29+
__tablename__ = "category"
30+
__pydantic_model__ = CategorySchema # 指定模型对应的Schema类.省略可自动生成,但是建议指定.
31+
32+
id: Mapped[int] = mapped_column(primary_key=True, nullable=False)
33+
name: Mapped[str] = mapped_column(String(100), unique=True, index=True, nullable=False)
34+
description: Mapped[str] = mapped_column(String(255), default="")
35+
```
36+
`app = FastAPI()`下方添加以下内容来创建数据表:
37+
```python
38+
@app.on_event("startup")
39+
async def startup():
40+
await site.db.async_run_sync(Category.metadata.create_all, is_session=False)
41+
pass
42+
```
43+
44+
## ~~示例-1(基于SQLModel)~~
745

846
```python
47+
948
# 先创建一个SQLModel模型,详细请参考: https://sqlmodel.tiangolo.com/
1049
class Category(SQLModel, table=True):
1150
id: Optional[int] = Field(default=None, primary_key=True, nullable=False)
@@ -30,10 +69,42 @@ class CategoryAdmin(admin.ModelAdmin):
3069
!!! note annotate "关于SQLModel模型"
3170

3271
事实上这部分代码并不属于`amis-admin`的代码,因为它可以用重用在任何需要ORM映射的地方, 在项目中你应该单独定义一个`models.py`文件编写这部分代码.
33-
72+
3473
SQLModel是一个非常优秀的Python ORM库,由FastAPI同一位作者编写,完美的结合了SQLAlchemy和Pydantic.请阅读它的官方文档: https://sqlmodel.tiangolo.com/
3574

36-
## 示例-2
75+
## 示例-2(基于SQLAlchemy 2.0)
76+
```python
77+
from sqlalchemy import String, Integer, Boolean, ForeignKey, Select
78+
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
79+
from typing import Optional
80+
81+
class Article(Base):
82+
__tablename__ = 'article'
83+
84+
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
85+
title: Mapped[str] = mapped_column(String(200), nullable=False)
86+
description: Mapped[str] = mapped_column(String(400), default='')
87+
status: Mapped[bool] = mapped_column(Boolean, default=False)
88+
content: Mapped[str] = mapped_column(String, nullable=False)
89+
category_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey('category.id'))
90+
91+
92+
@site.register_admin
93+
class ArticleAdmin(admin.ModelAdmin):
94+
page_schema = '文章管理'
95+
model = Article
96+
# 设置需要展示的字段
97+
list_display = [Article.id, Article.title, Article.description, Article.status, Category.name]
98+
# 设置模糊搜索字段
99+
search_fields = [Article.title, Category.name]
100+
101+
# 自定义基础选择器
102+
async def get_select(self, request: Request) -> Select:
103+
stmt = await super().get_select(request)
104+
return stmt.outerjoin(Category, Article.category_id == Category.id)
105+
```
106+
同时,将前文定义的`def startup()`函数追加一行`await site.db.async_run_sync(Article.metadata.create_all, is_session=False)`用于生成对应数据表。
107+
## ~~~示例-2(基于SQLModel)~~~
37108

38109
```python
39110
# 创建一个SQLModel模型,详细请参考: https://sqlmodel.tiangolo.com/
@@ -140,6 +211,6 @@ class ArticleAdmin(admin.ModelAdmin):
140211
!!! note annotate "关于fastapi_amis_admin与django-admin"
141212

142213
[django-admin](https://docs.djangoproject.com/zh-hans/4.0/ref/contrib/admin/)是一个非常成熟强大的web管理后台工具,使用django的用户应该经常使用到它,但他是并不适用于非django项目,这也是fastapi_amis_admin诞生的主要原因之一.
143-
214+
144215
fastapi_amis_admin相比django-admin拥有更多的拓展与功能,但是fastapi_amis_admin目前仍然处于成长阶段,很多功能并不成熟,需要漫长的不断完善与升级.非常期待你参与到[fastapi_amis_admin](https://github.com/amisadmin/fastapi_amis_admin)的项目开发之中,为项目贡献代码,或为项目[提供建议](https://github.com/amisadmin/fastapi_amis_admin/issues).
145216

docs/zh/docs/tutorials/basic/PageAdmin.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@
88
## 页面管理
99

1010
`PageAdmin`实现在菜单列表显示一个菜单.点击菜单后将展现一个`amis`页面.
11-
你可以通过阅读[`baidu-amis`官方文档](https://baidu.gitee.io/amis/zh-CN/components/page)
11+
你可以通过阅读[`baidu-amis`官方文档(国内)](https://aisuda.bce.baidu.com/amis/zh-CN/components/page)
1212
,实现各种复杂的页面展示.先看一个Hello World页面示例吧.
1313

14+
在main.py中的`site.mount_app(app)`上方添加:
1415
```python
16+
from fastapi_amis_admin.admin import admin
17+
from fastapi_amis_admin.amis.components import Page
18+
1519
@site.register_admin
1620
class HelloWorldPageAdmin(admin.PageAdmin):
1721
page_schema = 'Hello World Page'
@@ -21,7 +25,11 @@ class HelloWorldPageAdmin(admin.PageAdmin):
2125

2226
非常简单吧,接下来再实现一个获取当前时间的页面.
2327

28+
在main.py中的`site.mount_app(app)`上方添加:
2429
```python
30+
import time
31+
from fastapi import Request
32+
2533
@site.register_admin
2634
class CurrentTimePageAdmin(admin.PageAdmin):
2735
page_schema = 'Current Time Page'
@@ -43,7 +51,7 @@ class CurrentTimePageAdmin(admin.PageAdmin):
4351
@site.register_admin
4452
class AmisPageAdmin(admin.PageAdmin):
4553
page_schema = 'Amis Json Page'
46-
page = Page.parse_obj(
54+
page = Page.model_validate(
4755
{
4856
"type": "page",
4957
"title": "表单页面",
@@ -67,7 +75,7 @@ class AmisPageAdmin(admin.PageAdmin):
6775
}
6876
)
6977
```
70-
78+
!!! note annotate 注意,所有装饰器`@site.register_admin`涉及的类都应在`site.mount_app(app)`之前注册。
7179
## 链接管理
7280

7381
`LinkAdmin`实现在菜单列表显示一个链接跳转菜单.点击菜单后将通过打开一个新的浏览器标签,访问设置的链接:

0 commit comments

Comments
 (0)