feat(admin, admin-ui): 实现RuoYi风格后台菜单管理,优化媒体资源处理
新增服务端菜单校验与归一化逻辑,完善菜单相关Schema;前端实现条件渲染的菜单编辑器,支持搜索式图标选择器与父级树过滤。新增媒体URL统一处理工具修复管理端本地静态资源路径映射问题,更新全部相关文档、技术决策记录与测试用例。本次变更不影响WonderQ-MiniAPP端。
This commit is contained in:
1 parent
6245159e7c
commit
4c245f0d1f
28 files changed
+625
-36
No files matched your search
@@ -302,6 +302,8 @@ def test_dynamic_menu_tree_preserves_parent_order_and_button_permissions():
|
||||
assert DATA_SCOPE_VALUES == {"all", "dept", "dept_and_children", "custom_dept", "self"}
|
||||
assert [item["id"] for item in tree] == ["root"]
|
||||
assert tree[0]["children"][0]["permission"] == "home:edit"
|
||||
assert tree[0]["isVisible"] is True
|
||||
assert tree[0]["isActive"] is True
|
||||
|
||||
|
||||
def test_dynamic_menu_tree_keeps_granted_menu_when_parent_is_not_in_scope():
|
||||
|
||||
@@ -68,6 +68,7 @@ def test_resolve_media_fields_signs_common_image_fields(monkeypatch):
|
||||
"image": "oss-image",
|
||||
"avatar": "oss-avatar",
|
||||
"qrImage": "oss-qr",
|
||||
"url": "oss-url",
|
||||
"gallery": ["oss-gallery-1", "oss-gallery-2"],
|
||||
"label": "unchanged",
|
||||
}
|
||||
@@ -77,6 +78,7 @@ def test_resolve_media_fields_signs_common_image_fields(monkeypatch):
|
||||
"image": "signed:oss-image",
|
||||
"avatar": "signed:oss-avatar",
|
||||
"qrImage": "signed:oss-qr",
|
||||
"url": "signed:oss-url",
|
||||
"gallery": ["signed:oss-gallery-1", "signed:oss-gallery-2"],
|
||||
"label": "unchanged",
|
||||
}
|
||||
@@ -1,8 +1,12 @@
|
||||
import json
|
||||
from datetime import datetime
|
||||
|
||||
import pytest
|
||||
from pydantic import ValidationError
|
||||
|
||||
from app.models import AdminDepartment, AdminMenu, AdminRole
|
||||
from app.routers.system import _dept_dict, _menu_dict, _role_dict
|
||||
from app.schemas import AdminMenuCreate
|
||||
|
||||
|
||||
def test_role_audit_snapshot_serializes_datetime_fields():
|
||||
@@ -42,3 +46,21 @@ def test_menu_and_department_audit_snapshots_serialize_datetime_fields():
|
||||
|
||||
json.dumps(_menu_dict(menu))
|
||||
json.dumps(_dept_dict(dept))
|
||||
|
||||
|
||||
def test_menu_create_validates_fields_by_menu_type():
|
||||
with pytest.raises(ValidationError):
|
||||
AdminMenuCreate(name=" ", type="page", path="/users", componentKey="SystemUsers")
|
||||
|
||||
with pytest.raises(ValidationError):
|
||||
AdminMenuCreate(name="按钮", type="button")
|
||||
|
||||
with pytest.raises(ValidationError):
|
||||
AdminMenuCreate(name="页面", type="page", path="/users")
|
||||
|
||||
button = AdminMenuCreate(name="编辑用户", type="button", permissionCode="system:user:update")
|
||||
assert button.path is None
|
||||
assert button.componentKey is None
|
||||
|
||||
page = AdminMenuCreate(name="用户管理", type="page", path="/users", componentKey="SystemUsers")
|
||||
assert page.path == "/users"
|
||||
Reference in new issue
Block a user