Skip to content

Commit 627e916

Browse files
committed
chore: wip
1 parent e76f3a3 commit 627e916

File tree

6 files changed

+197
-64
lines changed

6 files changed

+197
-64
lines changed

src/quark/app/actions/menu_create_drawer.py

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,18 @@
44
from quark.component.action.action import Action
55
from quark.component.form.form import Form
66
from quark.template.action import Drawer
7+
from quark.template.resolves_fields import ResolvesFields
78

89

910
class MenuCreateDrawer(Drawer):
1011

11-
def __init__(
12-
self,
13-
title: str,
14-
api: str,
15-
fields: List[Dict[str, Any]],
16-
initial_values: Dict[str, Any],
17-
):
12+
def __init__(self, resource: Any):
1813

19-
# 文字
20-
self.name = "创建" + title
14+
# 资源
15+
self.resource = resource
2116

22-
# api
23-
self.api = api
24-
25-
# 字段
26-
self.fields = fields
27-
28-
# 初始值
29-
self.initial_values = initial_values
17+
# 名称
18+
self.name = "创建" + resource.title
3019

3120
# 类型
3221
self.type = "primary"
@@ -46,18 +35,24 @@ def __init__(
4635
# 设置展示位置(只在列表页显示)
4736
self.set_only_on_index(True)
4837

49-
def get_body(self, request: Request) -> Dict[str, Any]:
38+
async def get_body(self, request: Request):
39+
api = await self.resource.creation_api(request)
40+
fields = ResolvesFields(
41+
request=request,
42+
fields=await self.resource.fields(request),
43+
).creation_fields_within_components()
44+
data = await self.resource.before_creating(request)
5045
return (
5146
Form()
52-
.set_api(self.api)
53-
.set_body(self.fields)
54-
.set_initial_values(self.initial_values)
47+
.set_api(api)
48+
.set_body(fields)
49+
.set_initial_values(data)
5550
.set_label_col({"span": 6})
5651
.set_wrapper_col({"span": 18})
57-
.set_key("createDrawerForm", destroy=False)
52+
.set_key("createDrawerForm", False)
5853
)
5954

60-
def get_actions(self, request: Request) -> List[Dict[str, Any]]:
55+
async def get_actions(self, request: Request):
6156
return [
6257
Action().set_label("取消").set_action_type("cancel"),
6358
Action()
@@ -66,5 +61,5 @@ def get_actions(self, request: Request) -> List[Dict[str, Any]]:
6661
.set_with_loading(True)
6762
.set_reload("table")
6863
.set_action_type("submit")
69-
.set_type("primary", ghost=False),
64+
.set_type("primary", False),
7065
]
Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,42 @@
1-
from typing import Any, Dict, List
1+
from typing import Any, List
22

33
from quark import Request
44
from quark.component.action.action import Action
55
from quark.component.form.form import Form
66
from quark.template.action import Drawer
7+
from quark.template.resolves_fields import ResolvesFields
78

89

910
class MenuEditDrawer(Drawer):
1011

11-
def __init__(self, name: str, api: str, init_api: str, fields: Any):
12-
self.name = name
13-
self.api = api
14-
self.init_api = init_api
15-
self.fields = fields
12+
def __init__(self, resource: Any):
13+
self.resource = resource
14+
self.name = "编辑"
1615
self.type = "link"
1716
self.size = "small"
1817
self.destroy_on_close = True
1918
self.reload = "table"
2019
self.width = 750
2120
self.set_only_on_index_table_row(True)
2221

23-
async def get_body(self, request: Request) -> Dict[str, Any]:
22+
async def get_body(self, request: Request) -> Any:
23+
api = await self.resource.update_api(request)
24+
init_api = await self.resource.edit_value_api(request)
25+
fields = ResolvesFields(
26+
request=request,
27+
fields=await self.resource.fields(request),
28+
).update_fields_within_components()
29+
2430
return (
2531
Form()
26-
.set_api(self.api)
27-
.set_init_api(self.init_api)
28-
.set_body(self.fields)
32+
.set_api(api)
33+
.set_init_api(init_api)
34+
.set_body(fields)
2935
.set_layout("vertical")
3036
.set_key("editDrawerForm", False)
3137
)
3238

33-
async def get_actions(self, request: Request) -> List[Dict[str, Any]]:
39+
async def get_actions(self, request: Request) -> List[Any]:
3440
return [
3541
Action().set_label("取消").set_action_type("cancel"),
3642
Action()
@@ -39,5 +45,5 @@ async def get_actions(self, request: Request) -> List[Dict[str, Any]]:
3945
.set_with_loading(True)
4046
.set_reload("table")
4147
.set_action_type("submit")
42-
.set_type("primary", ghost=False),
48+
.set_type("primary", False),
4349
]

src/quark/app/image.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
class Image(Resource):
1313
"""
1414
图片管理
15-
1615
"""
1716

1817
async def init(self, request: Request):

src/quark/app/menu.py

Lines changed: 139 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from quark import Request, Resource, models
44
from quark.app import actions, searches
55
from quark.component.form import field
6+
from quark.component.form.rule import Rule
7+
from quark.services import MenuService, PermissionService
68

79

810
class Menu(Resource):
@@ -11,41 +13,155 @@ class Menu(Resource):
1113
"""
1214

1315
async def init(self, request: Request):
14-
15-
# 页面标题
1616
self.title = "菜单"
17-
18-
# 模型
1917
self.model = models.Menu
18+
self.table_list_to_tree = True
19+
self.query_order = "sort asc"
20+
self.page_size = False # 不分页
2021

21-
return self
22-
22+
# 字段
2323
async def fields(self, request: Request) -> List[Any]:
24-
"""字段定义"""
24+
25+
# 权限列表
26+
permissions = await PermissionService().data_source()
27+
28+
# 菜单列表
29+
menus = await MenuService().get_list_with_root()
30+
2531
return [
26-
field.id("id", "ID"),
27-
field.text("nickname", "昵称"),
28-
field.text("username", "用户名"),
29-
field.password("password", "密码").only_on_forms(),
30-
field.text("email", "邮箱").set_editable(True),
31-
field.text("phone", "手机号"),
32+
field.hidden("id", "ID"),
33+
field.hidden("pid", "PID").only_on_index(),
34+
field.group(
35+
[
36+
field.text("name", "名称").set_rules(
37+
[Rule.required("名称必须填写")]
38+
),
39+
field.text("guard_name", "守卫")
40+
.set_rules([Rule.required("守卫必须填写")])
41+
.set_default_value("admin")
42+
.only_on_forms(),
43+
field.icon("icon", "图标").only_on_forms(),
44+
]
45+
),
46+
field.group(
47+
[
48+
field.number("sort", "排序")
49+
.set_editable(True)
50+
.set_default_value(0),
51+
field.tree_select("pid", "父节点")
52+
.set_tree_data(menus, -1, "pid", "name", "id")
53+
.set_default_value(0)
54+
.only_on_forms(),
55+
field.switch("status", "状态")
56+
.set_true_value("正常")
57+
.set_false_value("禁用")
58+
.set_editable(True)
59+
.set_default_value(True),
60+
]
61+
),
62+
field.group(
63+
[
64+
field.radio("type", "类型")
65+
.set_options(
66+
[
67+
field.radio_option("目录", 1),
68+
field.radio_option("菜单", 2),
69+
field.radio_option("按钮", 3),
70+
]
71+
)
72+
.set_rules([Rule.required("类型必须选择")])
73+
.set_default_value(1),
74+
field.switch("show", "显示")
75+
.set_true_value("显示")
76+
.set_false_value("隐藏")
77+
.set_editable(True)
78+
.set_default_value(True),
79+
]
80+
),
81+
field.dependency().set_when(
82+
"type",
83+
1,
84+
lambda: [
85+
field.text("path", "路由")
86+
.set_rules([Rule.required("路由必须填写")])
87+
.set_editable(True)
88+
.set_help("前端路由")
89+
.set_width(400),
90+
],
91+
),
92+
field.dependency().set_when(
93+
"type",
94+
2,
95+
lambda: [
96+
field.switch("is_engine", "引擎组件")
97+
.set_true_value("是")
98+
.set_false_value("否")
99+
.set_default_value(True),
100+
field.switch("is_link", "外部链接")
101+
.set_true_value("是")
102+
.set_false_value("否")
103+
.set_default_value(False),
104+
field.text("path", "路由")
105+
.set_rules([Rule.required("路由必须填写")])
106+
.set_editable(True)
107+
.set_help("前端路由或后端api")
108+
.set_width(400)
109+
.only_on_forms(),
110+
],
111+
),
112+
field.dependency().set_when(
113+
"type",
114+
3,
115+
lambda: [
116+
field.transfer("permission_ids", "绑定权限")
117+
.set_data_source(permissions)
118+
.set_list_style({"width": 320, "height": 300})
119+
.set_show_search(True)
120+
.only_on_forms(),
121+
],
122+
),
32123
]
33124

125+
# 搜索
34126
async def searches(self, request: Request) -> List[Any]:
35-
"""搜索项定义"""
36127
return [
37-
searches.Input("username", "用户名"),
128+
searches.Input("name", "名称"),
129+
searches.Input("path", "路由"),
130+
searches.Status(),
38131
]
39132

133+
# 行为
40134
async def actions(self, request: Request) -> List[Any]:
41-
"""行为定义"""
42135
return [
43-
actions.CreateLink(self.title),
136+
actions.MenuCreateDrawer(self),
44137
actions.BatchDelete(),
45-
actions.EditLink(),
46-
actions.DeleteSpecial(),
47-
actions.FormSubmit(),
48-
actions.FormReset(),
49-
actions.FormBack(),
50-
actions.FormExtraBack(),
138+
actions.BatchDisable(),
139+
actions.BatchEnable(),
140+
actions.ChangeStatus(),
141+
actions.MenuEditDrawer(self),
142+
actions.Delete(),
51143
]
144+
145+
# 编辑页面显示前回调
146+
async def before_editing(
147+
self, request: Request, data: Dict[str, Any]
148+
) -> Dict[str, Any]:
149+
id_val = request.query_params.get("id", "")
150+
try:
151+
id_int = int(id_val) if id_val else None
152+
except Exception:
153+
id_int = None
154+
155+
if id_int:
156+
permission_ids: List[int] = []
157+
permissions = await PermissionService().get_menu_permissions(id_int)
158+
for v in permissions:
159+
permission_ids.append(v.permission_id)
160+
data["permission_ids"] = permission_ids
161+
162+
return data
163+
164+
# 保存后回调
165+
async def after_saved(self, request, id, data, result):
166+
if data.get("permission_ids") is not None:
167+
await PermissionService().add_menu_permission(id, data["permission_ids"])

src/quark/services/menu.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import uuid
2+
from typing import List
3+
24
from ..models.menu import Menu
35

46

@@ -10,7 +12,7 @@ def set_guard_name(self, guard_name: str):
1012
self.guard_name = guard_name
1113
return self
1214

13-
async def get_list(self):
15+
async def get_list(self) -> List[Menu]:
1416
menus = (
1517
await Menu.filter(guard_name=self.guard_name, status=1)
1618
.order_by("sort", "id")
@@ -19,9 +21,7 @@ async def get_list(self):
1921
return menus
2022

2123
async def get_list_with_root(self):
22-
menus, err = await self.get_list()
23-
if err:
24-
return menus, err
24+
menus = await self.get_list()
2525
menus.append(Menu(id=0, pid=-1, name="根节点"))
2626
return menus
2727

src/quark/services/permission.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
from typing import List
2+
3+
from quark.models.menu_has_permission import MenuHasPermission
4+
15
from ..models.permission import Permission
26

37

@@ -32,3 +36,16 @@ async def get_list_by_ids(self, permission_ids):
3236
async def get_list_by_names(self, permission_names):
3337
permissions = await Permission.filter(name__in=permission_names).all()
3438
return permissions
39+
40+
async def get_menu_permissions(self, menu_id: int):
41+
permissions = await MenuHasPermission.filter(menu_id=menu_id).all()
42+
return permissions
43+
44+
async def add_menu_permission(self, menu_id: int, permission_ids: List[int]):
45+
await MenuHasPermission.filter(menu_id=menu_id).delete()
46+
await MenuHasPermission.bulk_create(
47+
[
48+
MenuHasPermission(menu_id=menu_id, permission_id=permission_id)
49+
for permission_id in permission_ids
50+
]
51+
)

0 commit comments

Comments
 (0)