diff --git a/dvadmin-backend/application/settings.py b/dvadmin-backend/application/settings.py index a5ab2d6..bbdfcfd 100644 --- a/dvadmin-backend/application/settings.py +++ b/dvadmin-backend/application/settings.py @@ -285,7 +285,7 @@ REST_FRAMEWORK = { ), 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema', - 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', + 'DEFAULT_PAGINATION_CLASS': 'vadmin.op_drf.pagination.Pagination', 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',), 'EXCEPTION_HANDLER': 'apps.vadmin.utils.exceptions.op_exception_handler', } diff --git a/dvadmin-backend/apps/vadmin/logurus/test.py b/dvadmin-backend/apps/vadmin/logurus/test.py deleted file mode 100644 index d48c393..0000000 --- a/dvadmin-backend/apps/vadmin/logurus/test.py +++ /dev/null @@ -1,31 +0,0 @@ -from logging import StreamHandler, getLevelName -from logging.handlers import RotatingFileHandler -from typing import Optional, IO - - -class MyStreamHandler(StreamHandler): - - def __init__(self, stream: Optional[IO[str]] = ...) -> None: - print(222) - super().__init__(stream) - - def __repr__(self): - level = getLevelName(self.level) - name = getattr(self.stream, 'name', '') - # bpo-36015: name can be an int - name = str(name) - if name: - name += ' ' - print(111) - return '<%s %s(%s)>' % (self.__class__.__name__, name, level) -class MyRotatingFileHandler(RotatingFileHandler): - - def __init__(self, filename: str, mode: str = ..., maxBytes: int = ..., backupCount: int = ..., - encoding: Optional[str] = ..., delay: bool = ...) -> None: - print(4444) - super().__init__(filename, mode, maxBytes, backupCount, encoding, delay) - - def __repr__(self): - level = getLevelName(self.level) - print(22) - return '<%s %s (%s)>' % (self.__class__.__name__, self.baseFilename, level) diff --git a/dvadmin-backend/apps/vadmin/op_drf/generics.py b/dvadmin-backend/apps/vadmin/op_drf/generics.py index f508c38..802c111 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/generics.py +++ b/dvadmin-backend/apps/vadmin/op_drf/generics.py @@ -45,7 +45,7 @@ class GenericAPIView(CustomAPIView): filter_backends = api_settings.DEFAULT_FILTER_BACKENDS # The style to use for queryset pagination. - pagination_class = Pagination + pagination_class = api_settings.DEFAULT_PAGINATION_CLASS def get_queryset(self): """ diff --git a/dvadmin-backend/apps/vadmin/op_drf/management/__init__.py b/dvadmin-backend/apps/vadmin/op_drf/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dvadmin-backend/apps/vadmin/op_drf/management/commands/__init__.py b/dvadmin-backend/apps/vadmin/op_drf/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dvadmin-backend/apps/vadmin/op_drf/management/commands/createapp.py b/dvadmin-backend/apps/vadmin/op_drf/management/commands/createapp.py new file mode 100644 index 0000000..644b59f --- /dev/null +++ b/dvadmin-backend/apps/vadmin/op_drf/management/commands/createapp.py @@ -0,0 +1,75 @@ +import logging +import os +import shutil + +from django.core.management.base import BaseCommand + +logger = logging.getLogger(__name__) +from application.settings import BASE_DIR + + +class Command(BaseCommand): + """ + 创建App命令: + python manage.py createapp app名 + python manage.py createapp app01 app02 ... + """ + + def add_arguments(self, parser): + parser.add_argument('app_name', nargs='*', type=str, ) + + def handle(self, *args, **options): + app_name = options.get('app_name') + for name in app_name: + app_path = os.path.join(BASE_DIR, "apps", name) + # 判断app是否存在 + if os.path.exists(app_path): + print(f"创建失败,App {name} 已存在!") + break + source_path = os.path.join(BASE_DIR, "apps", "vadmin", "template") + target_path = app_path + if not os.path.exists(target_path): + # 如果目标路径不存在原文件夹的话就创建 + os.makedirs(target_path) + if os.path.exists(source_path): + # 如果目标路径存在原文件夹的话就先删除 + shutil.rmtree(target_path) + shutil.copytree(source_path, target_path) + # 修改app中的apps 内容 + content = f"""from django.apps import AppConfig + + +class {name.capitalize()}Config(AppConfig): + name = '{name}' + verbose_name = "{name}App" +""" + with open(os.path.join(app_path, "apps.py"), 'w', encoding='UTF-8') as f: + f.write(content) + f.close() + # 注册app到 settings.py 中 + injection(os.path.join(BASE_DIR, "application", "settings.py"), f" 'apps.{name}',\n", "INSTALLED_APPS", + "]") + + # 注册app到 urls.py 中 + injection(os.path.join(BASE_DIR, "application", "urls.py"), + f" re_path(r'^{name}/', include('apps.{name}.urls')),\n", "urlpatterns = [", + "]") + + print(f"创建 {name} App成功") + + +def injection(file_path, insert_content, startswith, endswith): + with open(file_path, "r+", encoding="utf-8") as f: + data = f.readlines() + with open(file_path, 'w', encoding='UTF-8') as f1: + is_INSTALLED_APPS = False + is_insert = False + for content in data: + # 判断文件是否 INSTALLED_APPS 开头 + if not is_insert and content.startswith(startswith): + is_INSTALLED_APPS = True + if not is_insert and content.startswith(endswith) and is_INSTALLED_APPS: + # 给前一行插入数据 + content = insert_content + content + is_insert = True + f1.writelines(content) diff --git a/dvadmin-backend/apps/vadmin/op_drf/middleware.py b/dvadmin-backend/apps/vadmin/op_drf/middleware.py index 0990a07..8215c24 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/middleware.py +++ b/dvadmin-backend/apps/vadmin/op_drf/middleware.py @@ -140,7 +140,7 @@ class PermissionModeMiddleware(MiddlewareMixin): def process_view(self, request, view_func, view_args, view_kwargs): # 判断环境变量中,是否为演示模式(正常可忽略此判断) - white_list = ['/admin/logout/', '/admin/login/'] + white_list = ['/admin/logout/', '/admin/login/', '/admin/api-auth/login/'] if os.getenv('DEMO_ENV') and not request.method in ['GET', 'OPTIONS'] and request.path not in white_list: return ErrorJsonResponse(data={}, msg=f'演示模式,不允许操作!') diff --git a/dvadmin-backend/apps/vadmin/op_drf/mixins.py b/dvadmin-backend/apps/vadmin/op_drf/mixins.py index 5305865..92f52bb 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/mixins.py +++ b/dvadmin-backend/apps/vadmin/op_drf/mixins.py @@ -327,7 +327,7 @@ class ImportSerializerMixin: for ele in data: # 获取 unique 字段 filter_dic = {i: ele.get(i) for i in list(set(self.import_field_data.keys()) & set(unique_list))} - instance = queryset.filter(**filter_dic).first() + instance = filter_dic and queryset.filter(**filter_dic).first() if instance and not updateSupport: continue if not filter_dic: diff --git a/dvadmin-backend/apps/vadmin/op_drf/viewsets.py b/dvadmin-backend/apps/vadmin/op_drf/viewsets.py index d707526..5119aa0 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/viewsets.py +++ b/dvadmin-backend/apps/vadmin/op_drf/viewsets.py @@ -29,7 +29,7 @@ def get_object_or_404(queryset, *filter_args, **filter_kwargs): class GenericViewSet(ViewSetMixin, GenericAPIView): extra_filter_backends = [] - pagination_class = Pagination + pagination_class = api_settings.DEFAULT_PAGINATION_CLASS filter_backends = [DjangoFilterBackend, OrderingFilter, SearchFilter, AdvancedSearchFilter] view_logger_classes = (CustomerModelViewLogger,) diff --git a/dvadmin-backend/apps/vadmin/permission/management/commands/init.py b/dvadmin-backend/apps/vadmin/permission/management/commands/init.py index 3db4d21..ec4a3dc 100644 --- a/dvadmin-backend/apps/vadmin/permission/management/commands/init.py +++ b/dvadmin-backend/apps/vadmin/permission/management/commands/init.py @@ -12,7 +12,7 @@ logger = logging.getLogger(__name__) class Command(BaseCommand): """ - 项目初始化命令: python manage.py initialization + 项目初始化命令: python manage.py init """ def customSql(self, sql_list, model_name, table_name, is_yes): diff --git a/dvadmin-backend/apps/vadmin/permission/serializers.py b/dvadmin-backend/apps/vadmin/permission/serializers.py index 6d1fd7a..f93212c 100644 --- a/dvadmin-backend/apps/vadmin/permission/serializers.py +++ b/dvadmin-backend/apps/vadmin/permission/serializers.py @@ -235,7 +235,7 @@ class UserProfileSerializer(CustomModelSerializer): class Meta: model = UserProfile depth = 1 - exclude = ('password', 'secret', 'user_permissions', 'groups', 'is_superuser', 'date_joined') + exclude = ('password', 'secret', 'user_permissions', 'groups', 'is_superuser', 'date_joined', 'creator') class ExportUserProfileSerializer(CustomModelSerializer): diff --git a/dvadmin-backend/apps/vadmin/system/apps.py b/dvadmin-backend/apps/vadmin/system/apps.py index b5f214a..db16c07 100644 --- a/dvadmin-backend/apps/vadmin/system/apps.py +++ b/dvadmin-backend/apps/vadmin/system/apps.py @@ -1,6 +1,6 @@ from django.apps import AppConfig -class PermissionConfig(AppConfig): +class SystemConfig(AppConfig): name = 'vadmin.system' - verbose_name = "权限管理" + verbose_name = "系统管理" diff --git a/dvadmin-backend/apps/vadmin/template/__init__.py b/dvadmin-backend/apps/vadmin/template/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dvadmin-backend/apps/vadmin/template/admin.py b/dvadmin-backend/apps/vadmin/template/admin.py new file mode 100644 index 0000000..e69de29 diff --git a/dvadmin-backend/apps/vadmin/template/apps.py b/dvadmin-backend/apps/vadmin/template/apps.py new file mode 100644 index 0000000..de74370 --- /dev/null +++ b/dvadmin-backend/apps/vadmin/template/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class TemplateConfig(AppConfig): + name = 'vadmin.template' + verbose_name = "模板App" diff --git a/dvadmin-backend/apps/vadmin/template/filters.py b/dvadmin-backend/apps/vadmin/template/filters.py new file mode 100644 index 0000000..e69de29 diff --git a/dvadmin-backend/apps/vadmin/template/migrations/__init__.py b/dvadmin-backend/apps/vadmin/template/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dvadmin-backend/apps/vadmin/template/models/__init__.py b/dvadmin-backend/apps/vadmin/template/models/__init__.py new file mode 100644 index 0000000..22e8e28 --- /dev/null +++ b/dvadmin-backend/apps/vadmin/template/models/__init__.py @@ -0,0 +1,2 @@ +# from ..models.xxx import Xxx + diff --git a/dvadmin-backend/apps/vadmin/template/serializers.py b/dvadmin-backend/apps/vadmin/template/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/dvadmin-backend/apps/vadmin/template/tasks.py b/dvadmin-backend/apps/vadmin/template/tasks.py new file mode 100644 index 0000000..e69de29 diff --git a/dvadmin-backend/apps/vadmin/template/tests.py b/dvadmin-backend/apps/vadmin/template/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/dvadmin-backend/apps/vadmin/template/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/dvadmin-backend/apps/vadmin/template/urls.py b/dvadmin-backend/apps/vadmin/template/urls.py new file mode 100644 index 0000000..637600f --- /dev/null +++ b/dvadmin-backend/apps/vadmin/template/urls.py @@ -0,0 +1 @@ +urlpatterns = [] diff --git a/dvadmin-backend/apps/vadmin/template/views.py b/dvadmin-backend/apps/vadmin/template/views.py new file mode 100644 index 0000000..e69de29 diff --git a/dvadmin-ui/src/components/DeptTree/index.vue b/dvadmin-ui/src/components/DeptTree/index.vue new file mode 100644 index 0000000..3c9a8c1 --- /dev/null +++ b/dvadmin-ui/src/components/DeptTree/index.vue @@ -0,0 +1,63 @@ + + + + + + + + + + diff --git a/dvadmin-ui/src/components/ModelDisplay/index.vue b/dvadmin-ui/src/components/ModelDisplay/index.vue new file mode 100644 index 0000000..2258e59 --- /dev/null +++ b/dvadmin-ui/src/components/ModelDisplay/index.vue @@ -0,0 +1,956 @@ + + + + + + + + + + + + + + + + + + + + + 搜索 + 重置 + + + + + + + + {{func.label}} + + {{func.label}} + + {{func.label}} + + {{func.label}} + + {{func.label}} + + + + + + + + + + + {{ field.label }} + + + + + + + + + + + + + + + + + + + + + + + + + + {{func.label}} + + {{func.label}} + + {{func.label}} + + + + + + + + + 已选择:{{ multipleSelection.length }}条 + 清空 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 将文件拖到此处,或 + 点击上传 + + + + 是否更新已经存在的数据 + 下载模板 + + 提示:仅允许导入“xls”或“xlsx”格式文件! + + + + + + + + diff --git a/dvadmin-ui/src/components/UsersTree/index.vue b/dvadmin-ui/src/components/UsersTree/index.vue new file mode 100644 index 0000000..72fc4ae --- /dev/null +++ b/dvadmin-ui/src/components/UsersTree/index.vue @@ -0,0 +1,62 @@ + + + + + + + + + + diff --git a/dvadmin-ui/src/main.js b/dvadmin-ui/src/main.js index e589237..f65efac 100755 --- a/dvadmin-ui/src/main.js +++ b/dvadmin-ui/src/main.js @@ -30,6 +30,9 @@ import Pagination from "@/components/Pagination"; // 自定义表格工具扩展 import RightToolbar from "@/components/RightToolbar" import SmallDialog from '@/components/SmallDialog'; +import DeptTree from '@/components/DeptTree'; +import UsersTree from '@/components/UsersTree'; +import ModelDisplay from '@/components/ModelDisplay'; import CommonIcon from '@/components/CommonIcon'; import CommonStaticTable from '@/components/CommonStaticTable'; import {getCrontabData, getIntervalData} from "./utils/validate"; // 通用图标组件 @@ -67,6 +70,9 @@ Vue.prototype.msgInfo = function (msg) { } // 自定义组件 Vue.component('small-dialog', SmallDialog); +Vue.component('dept-tree', DeptTree); +Vue.component('users-tree', UsersTree); +Vue.component('model-display', ModelDisplay); // 全局组件挂载 Vue.component('Pagination', Pagination) Vue.component('RightToolbar', RightToolbar)