diff --git a/backend/application/settings.py b/backend/application/settings.py index db5f5c5..08ad6eb 100644 --- a/backend/application/settings.py +++ b/backend/application/settings.py @@ -60,13 +60,7 @@ INSTALLED_APPS = [ "captcha", "channels", "dvadmin.system", - "apps.pisadmin.miscprocurement", - "apps.pisadmin.procurement", - "apps.pisadmin.basicinfo", - "apps.pisadmin.dashboard", - "apps.pissupplier", - "sync", - "dvadmin_ak_sk", + "dvadmin.test_app", ] MIDDLEWARE = [ diff --git a/backend/application/urls.py b/backend/application/urls.py index fec95e9..1046f59 100644 --- a/backend/application/urls.py +++ b/backend/application/urls.py @@ -141,6 +141,7 @@ urlpatterns = ( path("api/pisadmin/dashboard/", include("apps.pisadmin.dashboard.urls")), path("api/pissupplier/", include("apps.pissupplier.urls")), path("api/system/", include("dvadmin.system.urls")), + path("api/test_app/", include("dvadmin.test_app.urls")), path("api/login/", LoginView.as_view(), name="token_obtain_pair"), path("api/login/supplier/", SupplierLoginView.as_view(), name="supplier_login"), path("api/logout/", LogoutView.as_view(), name="token_obtain_pair"), diff --git a/backend/dvadmin/system/views/menu_button.py b/backend/dvadmin/system/views/menu_button.py index 0300c7d..cb2a2b6 100644 --- a/backend/dvadmin/system/views/menu_button.py +++ b/backend/dvadmin/system/views/menu_button.py @@ -189,9 +189,11 @@ class MenuButtonViewSet(CustomModelViewSet): # 获取 HTTP 方法 http_method = method.upper() # 如 "GET", "POST" - # 映射 HTTP 方法到 method 字段 - method_map = {'GET': 0, 'POST': 1, 'PUT': 2, 'PATCH': 2, 'DELETE': 3} - method_int = method_map.get(http_method, 0) + # 排除基类(名字含 Custom/Base/Generic) + viewset_name = cls.__name__ + if any(viewset_name.startswith(prefix) for prefix in ('Custom', 'Base', 'Generic', 'Abstract')): + continue + model_name = viewset_name.removesuffix('ViewSet') if viewset_name.endswith('ViewSet') else viewset_name # 获取 action 名称(驼峰转首字母大写) action_title = action_name.replace('_', ' ').title().replace(' ', '') diff --git a/backend/dvadmin/test_app/__init__.py b/backend/dvadmin/test_app/__init__.py new file mode 100644 index 0000000..c3be503 --- /dev/null +++ b/backend/dvadmin/test_app/__init__.py @@ -0,0 +1 @@ +# test_app diff --git a/backend/dvadmin/test_app/apps.py b/backend/dvadmin/test_app/apps.py new file mode 100644 index 0000000..2b000f1 --- /dev/null +++ b/backend/dvadmin/test_app/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class TestAppConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'dvadmin.test_app' diff --git a/backend/dvadmin/test_app/models.py b/backend/dvadmin/test_app/models.py new file mode 100644 index 0000000..f0f74a4 --- /dev/null +++ b/backend/dvadmin/test_app/models.py @@ -0,0 +1,26 @@ +from django.db import models + + +class Blog(models.Model): + title = models.CharField(max_length=200, verbose_name="标题") + content = models.TextField(verbose_name="内容") + author = models.CharField(max_length=100, verbose_name="作者") + created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") + + class Meta: + db_table = "test_blog" + verbose_name = "博客" + verbose_name_plural = verbose_name + + +class Product(models.Model): + name = models.CharField(max_length=200, verbose_name="产品名称") + price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="价格") + stock = models.IntegerField(verbose_name="库存") + category = models.CharField(max_length=100, verbose_name="分类") + created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") + + class Meta: + db_table = "test_product" + verbose_name = "产品" + verbose_name_plural = verbose_name diff --git a/backend/dvadmin/test_app/urls.py b/backend/dvadmin/test_app/urls.py new file mode 100644 index 0000000..c57595c --- /dev/null +++ b/backend/dvadmin/test_app/urls.py @@ -0,0 +1,9 @@ +from rest_framework import routers +from dvadmin.test_app.views.blog import BlogViewSet +from dvadmin.test_app.views.product import ProductViewSet + +test_app_url = routers.SimpleRouter() +test_app_url.register(r'blog', BlogViewSet, basename='blog') +test_app_url.register(r'product', ProductViewSet, basename='product') + +urlpatterns = test_app_url.urls diff --git a/backend/dvadmin/test_app/views/__init__.py b/backend/dvadmin/test_app/views/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/dvadmin/test_app/views/blog.py b/backend/dvadmin/test_app/views/blog.py new file mode 100644 index 0000000..c1cb65a --- /dev/null +++ b/backend/dvadmin/test_app/views/blog.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +""" +@Remark: 博客管理 +""" +from rest_framework import serializers +from rest_framework.decorators import action +from rest_framework.permissions import IsAuthenticated + +from dvadmin.test_app.models import Blog +from dvadmin.utils.json_response import DetailResponse, SuccessResponse +from dvadmin.utils.serializers import CustomModelSerializer +from dvadmin.utils.viewset import CustomModelViewSet + + +class BlogSerializer(CustomModelSerializer): + class Meta: + model = Blog + fields = '__all__' + + +class BlogViewSet(CustomModelViewSet): + """ + 博客管理 + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + queryset = Blog.objects.all() + serializer_class = BlogSerializer + + @action(methods=['get'], detail=False) + def published_list(self, request): + """获取已发布的博客列表""" + queryset = self.filter_queryset(self.get_queryset()) + serializer = self.get_serializer(queryset, many=True) + return SuccessResponse(data=serializer.data, msg="获取成功") + + @action(methods=['post'], detail=False) + def batch_publish(self, request): + """批量发布博客""" + ids = request.data.get('ids', []) + Blog.objects.filter(id__in=ids).update(status=1) + return SuccessResponse(msg="批量发布成功") diff --git a/backend/dvadmin/test_app/views/product.py b/backend/dvadmin/test_app/views/product.py new file mode 100644 index 0000000..e7bf7aa --- /dev/null +++ b/backend/dvadmin/test_app/views/product.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +""" +@Remark: 产品管理 +""" +from rest_framework import serializers +from rest_framework.decorators import action +from rest_framework.permissions import IsAuthenticated + +from dvadmin.test_app.models import Product +from dvadmin.utils.json_response import DetailResponse, SuccessResponse +from dvadmin.utils.serializers import CustomModelSerializer +from dvadmin.utils.viewset import CustomModelViewSet + + +class ProductSerializer(CustomModelSerializer): + class Meta: + model = Product + fields = '__all__' + + +class ProductViewSet(CustomModelViewSet): + """ + 产品管理 + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + queryset = Product.objects.all() + serializer_class = ProductSerializer + + @action(methods=['get'], detail=False) + def low_stock_alert(self, request): + """库存预警列表""" + threshold = int(request.query_params.get('threshold', 10)) + queryset = self.filter_queryset(self.get_queryset().filter(stock__lt=threshold)) + serializer = self.get_serializer(queryset, many=True) + return SuccessResponse(data=serializer.data, msg="获取成功") + + @action(methods=['post'], detail=False) + def batch_adjust_price(self, request): + """批量调整价格""" + ids = request.data.get('ids', []) + rate = request.data.get('rate', 1.0) + for product in Product.objects.filter(id__in=ids): + product.price = product.price * rate + product.save() + return SuccessResponse(msg="价格调整成功") diff --git a/web/src/i18n/pages/menu/en.ts b/web/src/i18n/pages/menu/en.ts index d562c5a..084863a 100644 --- a/web/src/i18n/pages/menu/en.ts +++ b/web/src/i18n/pages/menu/en.ts @@ -175,6 +175,7 @@ export default { existing: 'Existing', new: 'New', selectedCount: 'Selected: {count} items', + actions: 'actions', }, }, }, diff --git a/web/src/i18n/pages/menu/zh-cn.ts b/web/src/i18n/pages/menu/zh-cn.ts index fac6d55..70c61e4 100644 --- a/web/src/i18n/pages/menu/zh-cn.ts +++ b/web/src/i18n/pages/menu/zh-cn.ts @@ -175,6 +175,7 @@ export default { existing: '已存在', new: '新增', selectedCount: '已选择: {count} 项', + actions: '个操作', }, }, }, diff --git a/web/src/i18n/pages/menu/zh-tw.ts b/web/src/i18n/pages/menu/zh-tw.ts index 4bef173..da349bf 100644 --- a/web/src/i18n/pages/menu/zh-tw.ts +++ b/web/src/i18n/pages/menu/zh-tw.ts @@ -175,6 +175,7 @@ export default { existing: '已存在', new: '新增', selectedCount: '已選擇: {count} 項', + actions: '個操作', }, }, }, diff --git a/web/src/views/system/menu/components/ScanModal/index.vue b/web/src/views/system/menu/components/ScanModal/index.vue index aa36c30..6ec7a43 100644 --- a/web/src/views/system/menu/components/ScanModal/index.vue +++ b/web/src/views/system/menu/components/ScanModal/index.vue @@ -28,67 +28,96 @@ - +