33from quark import Request , Resource , models
44from quark .app import actions , searches
55from quark .component .form import field
6+ from quark .component .form .rule import Rule
7+ from quark .services import MenuService , PermissionService
68
79
810class 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" ])
0 commit comments