diff --git a/apps/system/urls.py b/apps/system/urls.py index 8087e0b..1642330 100644 --- a/apps/system/urls.py +++ b/apps/system/urls.py @@ -1,10 +1,13 @@ """ 系统模块URL配置 +- App端接口:/api/v1/feedback/*, /api/v1/version/* +- 管理端接口:/api/admin/feedbacks/* """ from django.urls import path, include from rest_framework.routers import DefaultRouter -from .views import FeedbackViewSet, VersionViewSet +from .views import FeedbackViewSet, VersionViewSet, AdminFeedbackViewSet +# App端路由 router = DefaultRouter() router.register('feedback', FeedbackViewSet, basename='feedback') router.register('version', VersionViewSet, basename='version') @@ -12,3 +15,11 @@ router.register('version', VersionViewSet, basename='version') urlpatterns = [ path('', include(router.urls)), ] + +# 管理端路由 +admin_router = DefaultRouter() +admin_router.register('feedbacks', AdminFeedbackViewSet, basename='admin-feedbacks') + +admin_urlpatterns = [ + path('', include(admin_router.urls)), +] diff --git a/apps/system/views.py b/apps/system/views.py index d751518..af06680 100644 --- a/apps/system/views.py +++ b/apps/system/views.py @@ -1,5 +1,5 @@ """ -系统模块视图 - App端 +系统模块视图 """ from rest_framework import viewsets from rest_framework.decorators import action @@ -7,7 +7,8 @@ from rest_framework.permissions import IsAuthenticated, AllowAny from drf_spectacular.utils import extend_schema from utils.response import success, error -from apps.admins.authentication import AppJWTAuthentication +from apps.admins.authentication import AppJWTAuthentication, AdminJWTAuthentication +from apps.admins.permissions import IsAdminUser from .models import Feedback, AppVersion from .serializers import FeedbackSerializer, AppVersionSerializer @@ -60,3 +61,65 @@ class VersionViewSet(viewsets.ViewSet): 'has_update': has_update, 'latest_version': AppVersionSerializer(latest).data if has_update else None, }) + + +@extend_schema(tags=['管理员-意见反馈']) +class AdminFeedbackViewSet(viewsets.ViewSet): + """意见反馈管理视图集(管理端)""" + + authentication_classes = [AdminJWTAuthentication] + permission_classes = [IsAdminUser] + + def list(self, request): + """ + 反馈列表 + GET /api/admin/feedbacks/ + """ + queryset = Feedback.objects.select_related('user').all() + + # 搜索条件 + phone = request.query_params.get('phone') + if phone: + queryset = queryset.filter(user__phone__contains=phone) + + # 分页 + page = int(request.query_params.get('page', 1)) + page_size = int(request.query_params.get('page_size', 10)) + start = (page - 1) * page_size + end = start + page_size + + total = queryset.count() + feedbacks = queryset[start:end] + + items = [ + { + 'id': fb.id, + 'user_phone': fb.user.phone, + 'user_nickname': fb.user.nickname, + 'content': fb.content, + 'contact': fb.contact, + 'created_at': fb.created_at, + } + for fb in feedbacks + ] + + return success(data={'total': total, 'items': items}) + + def retrieve(self, request, pk=None): + """ + 反馈详情 + GET /api/admin/feedbacks/{id}/ + """ + try: + fb = Feedback.objects.select_related('user').get(pk=pk) + except Feedback.DoesNotExist: + return error(message='反馈不存在') + + return success(data={ + 'id': fb.id, + 'user_phone': fb.user.phone, + 'user_nickname': fb.user.nickname, + 'content': fb.content, + 'contact': fb.contact, + 'created_at': fb.created_at, + }) diff --git a/config/urls.py b/config/urls.py index c41187b..eb93305 100644 --- a/config/urls.py +++ b/config/urls.py @@ -23,6 +23,7 @@ app_api_patterns = [ # ============ Web管理端路由 (管理员,用户名密码登录) ============ from apps.inventory.urls import admin_urlpatterns as inventory_admin_urls from apps.users.urls import admin_urlpatterns as users_admin_urls +from apps.system.urls import admin_urlpatterns as system_admin_urls admin_api_patterns = [ # 管理员认证和个人信息 @@ -31,6 +32,8 @@ admin_api_patterns = [ path('', include(inventory_admin_urls)), # App用户管理 path('', include(users_admin_urls)), + # 意见反馈管理 + path('', include(system_admin_urls)), ] urlpatterns = [