1
0
forked from erp-dev/erp

feat: added frontend_pages models(basic_info) and api(v2), support employees query pages that they can visit by themself token

This commit is contained in:
2026-01-07 14:28:17 +08:00
parent 941f797e35
commit 4566c2a2c8
14 changed files with 1079 additions and 61 deletions

View File

@@ -4,6 +4,7 @@ from rest_framework.response import Response
from rest_framework.views import APIView
from basic_info import models as basic_models
from basic_info.models import FrontendPage, FrontendPageTypeEnum
class CustomerEmployeeBindingSerializer(serializers.Serializer):
@@ -84,3 +85,97 @@ class CustomerEmployeeBindingView(APIView):
},
status=status.HTTP_201_CREATED
)
class FrontendPageSerializer(serializers.ModelSerializer):
"""前端页面序列化器"""
parent_key = serializers.CharField(source='parent.key', read_only=True, allow_null=True)
class Meta:
model = FrontendPage
fields = ['key', 'label', 'page_type', 'parent_key', 'sort_order']
class MyVisiblePagesView(APIView):
"""
获取当前登录用户的可见页面 API
根据当前登录用户关联的员工岗位,返回其可见的前端页面列表。
授予主菜单会自动包含其所有子菜单。
GET /api/v2/me/visible-pages/
响应示例:
{
"employee_id": 1,
"employee_name": "张三",
"position_id": 2,
"position_title": "生产主管",
"visible_pages": [
{"key": "production", "label": "生产管理", "page_type": "main", "parent_key": null, "sort_order": 100},
{"key": "production-kanban", "label": "生产看板", "page_type": "sub", "parent_key": "production", "sort_order": 101}
],
"visible_keys": ["production", "production-kanban", "printing-order-list"]
}
"""
permission_classes = [IsAuthenticated]
def get(self, request):
# 从 request.user 获取关联的员工
user = request.user
# 检查用户是否关联员工
if not hasattr(user, 'employee'):
return Response({
'employee_id': None,
'employee_name': None,
'position_id': None,
'position_title': None,
'visible_pages': [],
'visible_keys': [],
})
employee = user.employee
# 检查员工是否有岗位
if not employee.position:
return Response({
'employee_id': employee.id,
'employee_name': employee.name,
'position_id': None,
'position_title': None,
'visible_pages': [],
'visible_keys': [],
})
# 获取岗位直接授予的页面
granted_pages = employee.position.visible_pages.filter(is_active=True).select_related('parent')
# 计算所有可见页面(含子菜单继承)
visible_pages = []
visible_keys = set()
for page in granted_pages:
visible_pages.append(page)
visible_keys.add(page.key)
# 如果是主菜单,自动包含所有子菜单
if page.page_type == FrontendPageTypeEnum.MAIN:
children = page.children.filter(is_active=True).select_related('parent')
for child in children:
if child.key not in visible_keys:
visible_pages.append(child)
visible_keys.add(child.key)
# 按 sort_order 排序
visible_pages.sort(key=lambda p: (p.sort_order, p.id))
return Response({
'employee_id': employee.id,
'employee_name': employee.name,
'position_id': employee.position.id,
'position_title': employee.position.title,
'visible_pages': FrontendPageSerializer(visible_pages, many=True).data,
'visible_keys': sorted(visible_keys),
})