From e900deb2b40edf8616644233e325bdf29efd80b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Sat, 27 Mar 2021 10:49:29 +0800 Subject: [PATCH 01/42] =?UTF-8?q?-=E6=96=87=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E2=80=94=E2=80=94=E6=B8=85=E7=90=86=E5=BA=9F=E5=BC=83=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=8A=9F=E8=83=BD=20-=E6=96=87=E4=BB=B6=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E2=80=94=E2=80=94=E6=96=87=E4=BB=B6=E6=9D=A5=E6=BA=90?= =?UTF-8?q?(=E5=AF=BC=E5=87=BA=E3=80=81=E7=94=A8=E6=88=B7=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apps/vadmin/op_drf/serializers.py | 1 + dvadmin-backend/apps/vadmin/system/filters.py | 1 + .../apps/vadmin/system/models/save_file.py | 1 + .../apps/vadmin/system/serializers.py | 9 ++-- dvadmin-backend/apps/vadmin/system/urls.py | 2 + dvadmin-backend/apps/vadmin/system/views.py | 24 ++++++++++ .../apps/vadmin/utils/export_excel.py | 2 + .../apps/vadmin/utils/file_util.py | 48 +++++++++++++++++++ dvadmin-backend/requirements.txt | 1 + dvadmin-ui/package.json | 4 +- .../views/vadmin/system/savefile/index.vue | 46 ++++++++++++++++-- 11 files changed, 126 insertions(+), 13 deletions(-) create mode 100644 dvadmin-backend/apps/vadmin/utils/file_util.py diff --git a/dvadmin-backend/apps/vadmin/op_drf/serializers.py b/dvadmin-backend/apps/vadmin/op_drf/serializers.py index 5e47537..b642d9e 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/serializers.py +++ b/dvadmin-backend/apps/vadmin/op_drf/serializers.py @@ -20,6 +20,7 @@ class CustomModelSerializer(ModelSerializer): # 添加默认时间返回格式 create_datetime = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) update_datetime = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) + creator_name = serializers.SlugRelatedField(slug_field="username", source="creator", read_only=True) def __init__(self, instance=None, data=empty, request=None, **kwargs): super().__init__(instance, data, **kwargs) diff --git a/dvadmin-backend/apps/vadmin/system/filters.py b/dvadmin-backend/apps/vadmin/system/filters.py index 5db8619..e91edaa 100644 --- a/dvadmin-backend/apps/vadmin/system/filters.py +++ b/dvadmin-backend/apps/vadmin/system/filters.py @@ -43,6 +43,7 @@ class SaveFileFilter(django_filters.rest_framework.FilterSet): 文件管理 简单过滤器 """ name = django_filters.CharFilter(lookup_expr='icontains') + type = django_filters.CharFilter(lookup_expr='icontains') class Meta: model = SaveFile diff --git a/dvadmin-backend/apps/vadmin/system/models/save_file.py b/dvadmin-backend/apps/vadmin/system/models/save_file.py index 62b077f..b43757d 100644 --- a/dvadmin-backend/apps/vadmin/system/models/save_file.py +++ b/dvadmin-backend/apps/vadmin/system/models/save_file.py @@ -16,6 +16,7 @@ class SaveFile(CoreModel): type = CharField(max_length=32, verbose_name="文件类型", null=True, blank=True) size = CharField(max_length=64, verbose_name="文件大小", null=True, blank=True) address = CharField(max_length=16, verbose_name="存储位置", null=True, blank=True) # 本地、阿里云、腾讯云.. + source = CharField(max_length=16, verbose_name="文件来源", null=True, blank=True) # 导出、用户上传. oss_url = CharField(max_length=200, verbose_name="OSS地址", null=True, blank=True) status = BooleanField(default=True, verbose_name="文件是否存在") file = FileField(verbose_name="文件URL", upload_to=files_path, ) diff --git a/dvadmin-backend/apps/vadmin/system/serializers.py b/dvadmin-backend/apps/vadmin/system/serializers.py index 31d01a9..e1f2e13 100644 --- a/dvadmin-backend/apps/vadmin/system/serializers.py +++ b/dvadmin-backend/apps/vadmin/system/serializers.py @@ -120,7 +120,7 @@ class ConfigSettingsCreateUpdateSerializer(CustomModelSerializer): # ================================================= # -# ************** 参数设置 序列化器 ************** # +# ************** 文件管理 序列化器 ************** # # ================================================= # class SaveFileSerializer(CustomModelSerializer): @@ -136,7 +136,7 @@ class SaveFileSerializer(CustomModelSerializer): class SaveFileCreateUpdateSerializer(CustomModelSerializer): """ - 字典详情 创建/更新时的列化器 + 文件管理 创建/更新时的列化器 """ file_url = serializers.CharField(source='file.url', read_only=True) @@ -146,6 +146,7 @@ class SaveFileCreateUpdateSerializer(CustomModelSerializer): self.validated_data['size'] = files.size self.validated_data['type'] = files.content_type self.validated_data['address'] = '本地存储' + self.validated_data['source'] = '用户上传' instance = super().save(**kwargs) # 进行判断是否需要OSS上传 return instance @@ -228,7 +229,6 @@ class LoginInforSerializer(CustomModelSerializer): """ 登录日志 简单序列化器 """ - creator_name = serializers.SlugRelatedField(slug_field="username", source="creator", read_only=True) class Meta: model = LoginInfor @@ -239,7 +239,6 @@ class ExportLoginInforSerializer(CustomModelSerializer): """ 导出 登录日志 简单序列化器 """ - creator_name = serializers.SlugRelatedField(slug_field="username", source="creator", read_only=True) class Meta: model = LoginInfor @@ -255,7 +254,6 @@ class OperationLogSerializer(CustomModelSerializer): """ 操作日志 简单序列化器 """ - creator_name = serializers.SlugRelatedField(slug_field="username", source="creator", read_only=True) class Meta: model = OperationLog @@ -266,7 +264,6 @@ class ExportOperationLogSerializer(CustomModelSerializer): """ 导出 操作日志 简单序列化器 """ - creator_name = serializers.SlugRelatedField(slug_field="username", source="creator", read_only=True) class Meta: model = OperationLog diff --git a/dvadmin-backend/apps/vadmin/system/urls.py b/dvadmin-backend/apps/vadmin/system/urls.py index d275369..43394f3 100644 --- a/dvadmin-backend/apps/vadmin/system/urls.py +++ b/dvadmin-backend/apps/vadmin/system/urls.py @@ -42,5 +42,7 @@ urlpatterns = [ re_path('celery_log/clean/', CeleryLogModelViewSet.as_view({'delete': 'clean_all', })), # 导出定时日志 re_path('celery_log/export/', CeleryLogModelViewSet.as_view({'get': 'export', })), + # 清除废弃文件 + re_path('clearsavefile/', SaveFileModelViewSet.as_view({'post': 'clearsavefile', })), ] urlpatterns += router.urls diff --git a/dvadmin-backend/apps/vadmin/system/views.py b/dvadmin-backend/apps/vadmin/system/views.py index ba4ce25..2253b22 100644 --- a/dvadmin-backend/apps/vadmin/system/views.py +++ b/dvadmin-backend/apps/vadmin/system/views.py @@ -1,3 +1,6 @@ +import os + +from django.conf import settings from django.db.models import Q from rest_framework.request import Request @@ -16,6 +19,7 @@ from ..system.serializers import DictDataSerializer, DictDataCreateUpdateSeriali OperationLogSerializer, ExportOperationLogSerializer, ExportLoginInforSerializer, CeleryLogSerializer, \ ExportCeleryLogSerializer from ..utils.export_excel import export_excel_save_model +from ..utils.file_util import get_all_files, remove_empty_dir, delete_files from ..utils.response import SuccessResponse @@ -149,6 +153,26 @@ class SaveFileModelViewSet(CustomModelViewSet): search_fields = ('configName',) ordering = '-create_datetime' # 默认排序 + def clearsavefile(self, request: Request, *args, **kwargs): + """ + 清理废弃文件 + :param request: + :param args: + :param kwargs: + :return: + """ + # 获取废弃文件列表 + file_list = get_all_files(os.path.join(settings.MEDIA_ROOT, 'system')) + queryset_files = [os.path.join(os.path.join(settings.MEDIA_ROOT) + os.sep, ele) for ele in + list(self.get_queryset().values_list('file', flat=True))] + + delete_list = list(set(file_list) - set(queryset_files)) + # 进行文件删除操作 + delete_files(delete_list) + # 递归删除空文件 + remove_empty_dir(os.path.join(settings.MEDIA_ROOT, 'system')) + return SuccessResponse(msg=f"成功清理废弃文件{len(delete_list)}个") + class MessagePushModelViewSet(CustomModelViewSet): """ diff --git a/dvadmin-backend/apps/vadmin/utils/export_excel.py b/dvadmin-backend/apps/vadmin/utils/export_excel.py index c6484bd..eda0567 100644 --- a/dvadmin-backend/apps/vadmin/utils/export_excel.py +++ b/dvadmin-backend/apps/vadmin/utils/export_excel.py @@ -134,7 +134,9 @@ def export_excel_save_model(request, field_data, data, FilName): savefile.type = 'application/vnd.ms-excel' savefile.size = os.path.getsize(os.path.join(settings.MEDIA_ROOT, file_rul)) savefile.address = '本地存储' + savefile.source = '导出' savefile.creator = request.user + savefile.dept_belong_id = getattr(request.user, 'dept_id', None) savefile.modifier = request.user.username savefile.save() return SaveFileSerializer(savefile).data diff --git a/dvadmin-backend/apps/vadmin/utils/file_util.py b/dvadmin-backend/apps/vadmin/utils/file_util.py new file mode 100644 index 0000000..1a3cdca --- /dev/null +++ b/dvadmin-backend/apps/vadmin/utils/file_util.py @@ -0,0 +1,48 @@ +""" +封装文件操作: + ● 递归读取所有文件目录形成列表 + ● 递归删除空目录 + ● 批量删除文件 +""" +import os + + +def get_all_files(targetDir): + """ + 递归读取所有文件目录形成列表 + :param targetDir: + :return: + """ + files = [] + listFiles = os.listdir(targetDir) + for i in range(0, len(listFiles)): + path = os.path.join(targetDir, listFiles[i]) + if os.path.isdir(path): + files.extend(get_all_files(path)) + elif os.path.isfile(path): + files.append(path) + return files + + +def remove_empty_dir(path): + """ + 递归删除空目录 + :param path: + :return: + """ + for root, dirs, files in os.walk(path, topdown=False): + if not files and not dirs: + os.rmdir(root) + + +def delete_files(delete_list: list): + """ + 批量删除文件 + :param delete_list: + :return: + """ + for file_path in delete_list: + try: + os.remove(file_path) + except(FileNotFoundError): + pass diff --git a/dvadmin-backend/requirements.txt b/dvadmin-backend/requirements.txt index e6f6139..5e06ebc 100644 --- a/dvadmin-backend/requirements.txt +++ b/dvadmin-backend/requirements.txt @@ -1,4 +1,5 @@ asgiref==3.3.1 +celery==5.0.5 Django==2.2.16 django-cors-headers==3.7.0 django_celery_beat==2.2.0 diff --git a/dvadmin-ui/package.json b/dvadmin-ui/package.json index 2637669..beaf7ec 100755 --- a/dvadmin-ui/package.json +++ b/dvadmin-ui/package.json @@ -79,8 +79,8 @@ "vue-template-compiler": "2.6.12" }, "engines": { - "node": ">=8.9", - "npm": ">= 3.0.0" + "node": ">=12.0", + "npm": ">= 6.0.0" }, "browserslist": [ "> 1%", diff --git a/dvadmin-ui/src/views/vadmin/system/savefile/index.vue b/dvadmin-ui/src/views/vadmin/system/savefile/index.vue index ba35fe4..cbd4839 100755 --- a/dvadmin-ui/src/views/vadmin/system/savefile/index.vue +++ b/dvadmin-ui/src/views/vadmin/system/savefile/index.vue @@ -14,7 +14,7 @@ - - + + + + + + + - - diff --git a/dvadmin-ui/src/components/FileUpload/index.vue b/dvadmin-ui/src/components/FileUpload/index.vue index 8447bca..32bce09 100755 --- a/dvadmin-ui/src/components/FileUpload/index.vue +++ b/dvadmin-ui/src/components/FileUpload/index.vue @@ -39,9 +39,9 @@ + + From 00d220ef6cc9cf35105e4f548d086a796693394a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Mon, 29 Mar 2021 02:06:31 +0800 Subject: [PATCH 11/42] =?UTF-8?q?docker-compose.yml=20=E7=BC=BA=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 2df19eb..8a5bd0d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -115,3 +115,7 @@ services: restart: always networks: - dvadmin_net + +networks: + dvadmin_net: + driver: bridge From 3283de3736e7068bd1e133cfff8732cca7eeb216 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Mon, 29 Mar 2021 02:12:44 +0800 Subject: [PATCH 12/42] =?UTF-8?q?request=5Futil.py:get=5Frequest=5Fuser?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E4=BF=AE=E5=A4=8D;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dvadmin-backend/apps/vadmin/utils/request_util.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dvadmin-backend/apps/vadmin/utils/request_util.py b/dvadmin-backend/apps/vadmin/utils/request_util.py index d5642a2..24965ed 100644 --- a/dvadmin-backend/apps/vadmin/utils/request_util.py +++ b/dvadmin-backend/apps/vadmin/utils/request_util.py @@ -26,7 +26,10 @@ def get_request_user(request, authenticate=True): user: AbstractBaseUser = getattr(request, 'user', None) if user and user.is_authenticated: return user - user, tokrn = OpAuthJwtAuthentication().authenticate(request) + try: + user, tokrn = OpAuthJwtAuthentication().authenticate(request) + except Exception as e: + pass return user or AnonymousUser() From 330878026ccdbcd712e0e8ef5a68f90f8abcef8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Mon, 29 Mar 2021 02:21:00 +0800 Subject: [PATCH 13/42] =?UTF-8?q?=E9=85=8D=E7=BD=AEdocker-compose.yml?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 8a5bd0d..fb3d0fd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -85,6 +85,8 @@ services: volumes: - ./dvadmin-backend:/dvadmin-backend - ./logs/log:/var/log + env_file: + - ./.env ports: - "8000:8000" expose: From 93ac2c057798e8be1b5419c6353b6ccd647b6554 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Mon, 29 Mar 2021 02:32:35 +0800 Subject: [PATCH 14/42] =?UTF-8?q?!7=20=E9=85=8D=E7=BD=AEdocker-compose.yml?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F=20*=20=E9=85=8D=E7=BD=AEdo?= =?UTF-8?q?cker-compose.yml=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F=20*=20Merg?= =?UTF-8?q?e=20branch=20'master'=20into=20dvadmin-liqianglog=20*=20request?= =?UTF-8?q?=5Futil.py:get=5Frequest=5Fuser=E6=8A=A5=E9=94=99=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D;=20*=20docker-compose.yml=20=E7=BC=BA=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=20*=20Merge=20branch=20'dvadmin-dev'=20*=20=E5=8E=BB?= =?UTF-8?q?=E6=8E=89=E6=89=93=E5=8D=B0=E5=80=BC=20*=20system=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E9=80=9A=E7=9F=A5:=E4=BF=AE=E5=A4=8D=E5=B7=B2?= =?UTF-8?q?=E8=AF=BB=E6=B6=88=E6=81=AFbug;permission:=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=9D=83=E9=99=90=E5=AE=8C=E6=88=90=E3=80=82=20*=20system?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E9=80=9A=E7=9F=A5:=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=B7=B2=E8=AF=BB=E6=B6=88=E6=81=AFbug=20*=20docker=5Fenv:?= =?UTF-8?q?=E5=88=A0=E9=99=A4docker=E4=B8=AD=E7=9A=84nginx=E3=80=81dvadmin?= =?UTF-8?q?-doc;=E6=9D=83=E9=99=90=E7=AE=A1=E7=90=86:=E5=AF=B9=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=9A=84=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5=E7=9A=84?= =?UTF-8?q?=E6=9D=83=E9=99=90=E6=8E=A7=E5=88=B6=20*=20=E5=88=A0=E9=99=A4mo?= =?UTF-8?q?ngodb=E9=85=8D=E7=BD=AE=20*=20Merge=20branch=20'dvadmin-dev'=20?= =?UTF-8?q?of=20https://gitee.com/liqianglog/django-vue-admin=20*=20-?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=AE=A1=E7=90=86=E2=80=94=E2=80=94=E6=B8=85?= =?UTF-8?q?=E7=90=86=E5=BA=9F=E5=BC=83=E6=96=87=E4=BB=B6=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20*=20-=E6=96=87=E4=BB=B6=E7=AE=A1=E7=90=86=E2=80=94=E2=80=94?= =?UTF-8?q?=E6=B8=85=E7=90=86=E5=BA=9F=E5=BC=83=E6=96=87=E4=BB=B6=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 6 + .../apps/vadmin/utils/request_util.py | 6 +- .../components/CommonStaticTable/index.vue | 465 ------------------ 3 files changed, 10 insertions(+), 467 deletions(-) delete mode 100644 dvadmin-ui/src/components/CommonStaticTable/index.vue diff --git a/docker-compose.yml b/docker-compose.yml index 2df19eb..fb3d0fd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -85,6 +85,8 @@ services: volumes: - ./dvadmin-backend:/dvadmin-backend - ./logs/log:/var/log + env_file: + - ./.env ports: - "8000:8000" expose: @@ -115,3 +117,7 @@ services: restart: always networks: - dvadmin_net + +networks: + dvadmin_net: + driver: bridge diff --git a/dvadmin-backend/apps/vadmin/utils/request_util.py b/dvadmin-backend/apps/vadmin/utils/request_util.py index 6952cf0..24965ed 100644 --- a/dvadmin-backend/apps/vadmin/utils/request_util.py +++ b/dvadmin-backend/apps/vadmin/utils/request_util.py @@ -26,8 +26,10 @@ def get_request_user(request, authenticate=True): user: AbstractBaseUser = getattr(request, 'user', None) if user and user.is_authenticated: return user - user, tokrn = OpAuthJwtAuthentication().authenticate(request) - print(22, user) + try: + user, tokrn = OpAuthJwtAuthentication().authenticate(request) + except Exception as e: + pass return user or AnonymousUser() diff --git a/dvadmin-ui/src/components/CommonStaticTable/index.vue b/dvadmin-ui/src/components/CommonStaticTable/index.vue deleted file mode 100644 index fe92660..0000000 --- a/dvadmin-ui/src/components/CommonStaticTable/index.vue +++ /dev/null @@ -1,465 +0,0 @@ - - - - - From f729114cf90819fe2bb312aa6677318c92f5789c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Mon, 29 Mar 2021 02:33:02 +0800 Subject: [PATCH 15/42] =?UTF-8?q?!8=20=E9=85=8D=E7=BD=AEdocker-compose.yml?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F=20*=20!7=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AEdocker-compose.yml=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 6 + .../apps/vadmin/utils/request_util.py | 6 +- .../components/CommonStaticTable/index.vue | 465 ------------------ 3 files changed, 10 insertions(+), 467 deletions(-) delete mode 100644 dvadmin-ui/src/components/CommonStaticTable/index.vue diff --git a/docker-compose.yml b/docker-compose.yml index 2df19eb..fb3d0fd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -85,6 +85,8 @@ services: volumes: - ./dvadmin-backend:/dvadmin-backend - ./logs/log:/var/log + env_file: + - ./.env ports: - "8000:8000" expose: @@ -115,3 +117,7 @@ services: restart: always networks: - dvadmin_net + +networks: + dvadmin_net: + driver: bridge diff --git a/dvadmin-backend/apps/vadmin/utils/request_util.py b/dvadmin-backend/apps/vadmin/utils/request_util.py index 6952cf0..24965ed 100644 --- a/dvadmin-backend/apps/vadmin/utils/request_util.py +++ b/dvadmin-backend/apps/vadmin/utils/request_util.py @@ -26,8 +26,10 @@ def get_request_user(request, authenticate=True): user: AbstractBaseUser = getattr(request, 'user', None) if user and user.is_authenticated: return user - user, tokrn = OpAuthJwtAuthentication().authenticate(request) - print(22, user) + try: + user, tokrn = OpAuthJwtAuthentication().authenticate(request) + except Exception as e: + pass return user or AnonymousUser() diff --git a/dvadmin-ui/src/components/CommonStaticTable/index.vue b/dvadmin-ui/src/components/CommonStaticTable/index.vue deleted file mode 100644 index fe92660..0000000 --- a/dvadmin-ui/src/components/CommonStaticTable/index.vue +++ /dev/null @@ -1,465 +0,0 @@ - - - - - From 3708ce73e6257b4554411653374ba0dc722befd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Mon, 29 Mar 2021 02:34:54 +0800 Subject: [PATCH 16/42] CommonStaticTable --- .../components/CommonStaticTable/index.vue | 465 ++++++++++++++++++ 1 file changed, 465 insertions(+) create mode 100644 dvadmin-ui/src/components/CommonStaticTable/index.vue diff --git a/dvadmin-ui/src/components/CommonStaticTable/index.vue b/dvadmin-ui/src/components/CommonStaticTable/index.vue new file mode 100644 index 0000000..fe92660 --- /dev/null +++ b/dvadmin-ui/src/components/CommonStaticTable/index.vue @@ -0,0 +1,465 @@ + + + + + From 987c147fd86d32e933a43064184eb541461322a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Mon, 29 Mar 2021 02:38:39 +0800 Subject: [PATCH 17/42] CommonStaticTable --- .../components/CommonStaticTable/index.vue | 465 ++++++++++++++++++ 1 file changed, 465 insertions(+) create mode 100644 dvadmin-ui/src/components/CommonStaticTable/index.vue diff --git a/dvadmin-ui/src/components/CommonStaticTable/index.vue b/dvadmin-ui/src/components/CommonStaticTable/index.vue new file mode 100644 index 0000000..fe92660 --- /dev/null +++ b/dvadmin-ui/src/components/CommonStaticTable/index.vue @@ -0,0 +1,465 @@ + + + + + From d41eb5cc2c094d2c3202418d8004ca010118de7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Mon, 29 Mar 2021 23:36:59 +0800 Subject: [PATCH 18/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG(=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=83=A8=E9=97=A8):=20=E9=83=A8=E9=97=A8=E9=87=8C=E9=9D=A2?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E7=94=A8=E6=88=B7=EF=BC=8C=E4=BE=9D=E7=84=B6?= =?UTF-8?q?=E8=83=BD=E5=A4=9F=E5=88=A0=E9=99=A4=E9=83=A8=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes https://gitee.com/liqianglog/django-vue-admin/issues/I3E2BQ --- .../apps/vadmin/permission/permissions.py | 20 +++++++++++++++++++ .../apps/vadmin/permission/views.py | 4 ++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/dvadmin-backend/apps/vadmin/permission/permissions.py b/dvadmin-backend/apps/vadmin/permission/permissions.py index 0186adb..3c09387 100644 --- a/dvadmin-backend/apps/vadmin/permission/permissions.py +++ b/dvadmin-backend/apps/vadmin/permission/permissions.py @@ -93,3 +93,23 @@ class CommonPermission(CustomPermission): self.message = f"没有此数据操作权限!" res = self.check_queryset(request, instance) return res + + +class DeptDestroyPermission(CustomPermission): + """ + 部门删除权限校验:判断部门下是否有用户存在,存在不可删除 + """ + message = '没有有操作权限' + + def has_permission(self, request: Request, view: APIView): + return True + + def check_queryset(self, request, instance): + if instance.values_list('userprofile', flat=True): + self.message = "该部门下有关联用户,无法删除!" + return False + return True + + def has_object_permission(self, request: Request, view: APIView, instance): + res = self.check_queryset(request, instance) + return res diff --git a/dvadmin-backend/apps/vadmin/permission/views.py b/dvadmin-backend/apps/vadmin/permission/views.py index bec3b8e..72855b4 100644 --- a/dvadmin-backend/apps/vadmin/permission/views.py +++ b/dvadmin-backend/apps/vadmin/permission/views.py @@ -2,7 +2,7 @@ from django.contrib.auth import authenticate from rest_framework.request import Request from rest_framework.views import APIView -from .permissions import CommonPermission +from .permissions import CommonPermission, DeptDestroyPermission from ..op_drf.filters import DataLevelPermissionsFilter from ..op_drf.viewsets import CustomModelViewSet from ..permission.filters import MenuFilter, DeptFilter, PostFilter, RoleFilter, UserProfileFilter @@ -129,7 +129,7 @@ class DeptModelViewSet(CustomModelViewSet): filter_class = DeptFilter extra_filter_backends = [DataLevelPermissionsFilter] update_extra_permission_classes = (CommonPermission,) - destroy_extra_permission_classes = (CommonPermission,) + destroy_extra_permission_classes = (CommonPermission, DeptDestroyPermission) create_extra_permission_classes = (CommonPermission,) search_fields = ('deptName',) ordering = 'create_datetime' # 默认排序 From 438dc5ed57889f107455bf408e74c627a29fae9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Mon, 29 Mar 2021 23:37:31 +0800 Subject: [PATCH 19/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG(=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0):=20doc=EF=BC=8Cdocx=EF=BC=8Cxlsx=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E9=83=BD=E6=97=A0=E6=B3=95=E4=B8=8A=E4=BC=A0=E6=88=90?= =?UTF-8?q?=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes https://gitee.com/liqianglog/django-vue-admin/issues/I3E2BQ --- dvadmin-backend/apps/vadmin/system/models/save_file.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dvadmin-backend/apps/vadmin/system/models/save_file.py b/dvadmin-backend/apps/vadmin/system/models/save_file.py index b43757d..30407cf 100644 --- a/dvadmin-backend/apps/vadmin/system/models/save_file.py +++ b/dvadmin-backend/apps/vadmin/system/models/save_file.py @@ -13,7 +13,7 @@ def files_path(instance, filename): class SaveFile(CoreModel): name = CharField(max_length=128, verbose_name="文件名称", null=True, blank=True) - type = CharField(max_length=32, verbose_name="文件类型", null=True, blank=True) + type = CharField(max_length=200, verbose_name="文件类型", null=True, blank=True) size = CharField(max_length=64, verbose_name="文件大小", null=True, blank=True) address = CharField(max_length=16, verbose_name="存储位置", null=True, blank=True) # 本地、阿里云、腾讯云.. source = CharField(max_length=16, verbose_name="文件来源", null=True, blank=True) # 导出、用户上传. From 4587b7551c9833250393ef61f66c175cb46d5671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Mon, 29 Mar 2021 23:37:57 +0800 Subject: [PATCH 20/42] =?UTF-8?q?=E6=B5=8B=E8=AF=95(=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E6=B5=8B=E8=AF=95):?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dvadmin-backend/apps/vadmin/op_drf/middleware.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dvadmin-backend/apps/vadmin/op_drf/middleware.py b/dvadmin-backend/apps/vadmin/op_drf/middleware.py index bf28947..fb60065 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/middleware.py +++ b/dvadmin-backend/apps/vadmin/op_drf/middleware.py @@ -91,7 +91,7 @@ class PermissionModeMiddleware(MiddlewareMixin): :return: """ white_list = ['/admin/logout/', '/admin/login/'] - if os.getenv('DEMO_ENV') and not request.method == 'GET' and request.path not in white_list: + if os.getenv('DEMO_ENV') and not request.method in ['GET','OPTIONS'] and request.path not in white_list: return ErrorJsonResponse(data={}, msg=f'演示模式,不允许操作!') def has_interface_permission(self, request, method, view_path, user=None): From ab6c4731d47f159d1580fff209ad737a05478299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=81=AB=E9=B8=A1=E4=B8=8D=E8=82=A5?= Date: Tue, 30 Mar 2021 00:01:36 +0800 Subject: [PATCH 21/42] =?UTF-8?q?!10=20=E5=90=8E=E7=AB=AF=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=9D=83=E9=99=90=E9=AA=8C=E8=AF=81bug=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20Merge=20pull=20request=20!10=20from=20=E7=81=AB?= =?UTF-8?q?=E9=B8=A1=E4=B8=8D=E8=82=A5/dvadmin-dev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dvadmin-backend/apps/vadmin/op_drf/middleware.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dvadmin-backend/apps/vadmin/op_drf/middleware.py b/dvadmin-backend/apps/vadmin/op_drf/middleware.py index bf28947..5e2f1d1 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/middleware.py +++ b/dvadmin-backend/apps/vadmin/op_drf/middleware.py @@ -130,7 +130,7 @@ class PermissionModeMiddleware(MiddlewareMixin): if user.is_superuser or (hasattr(user, 'role') and user.role.filter(status='1', admin=True).count()): return 20 # (3)user的角色有该接口权限, 是:通过, 否:不通过 - if view_path in user.get_user_interface_dict: + if view_path in user.get_user_interface_dict.get(method, []): return 30 return -10 From b68d40900fcc2fc50b7b372b57bedb0e9892e566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Tue, 30 Mar 2021 01:19:39 +0800 Subject: [PATCH 22/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG(=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E4=BB=B6bug):=20=E6=97=A5=E5=BF=97=E4=B8=AD=E9=97=B4=E4=BB=B6?= =?UTF-8?q?=E5=AD=98=E5=85=A5=E6=A8=A1=E5=9D=97=E4=BF=A1=E6=81=AF=E4=B8=8D?= =?UTF-8?q?=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dvadmin-backend/application/settings.py | 2 +- .../apps/vadmin/op_drf/logging/view_logger.py | 7 ---- .../apps/vadmin/op_drf/middleware.py | 35 ++++++++++++------- .../apps/vadmin/utils/exceptions.py | 2 -- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/dvadmin-backend/application/settings.py b/dvadmin-backend/application/settings.py index ee3fc5b..4b385f0 100644 --- a/dvadmin-backend/application/settings.py +++ b/dvadmin-backend/application/settings.py @@ -54,7 +54,6 @@ INSTALLED_APPS = [ ] MIDDLEWARE = [ - 'vadmin.op_drf.middleware.PermissionModeMiddleware', # 权限中间件 'corsheaders.middleware.CorsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', @@ -64,6 +63,7 @@ MIDDLEWARE = [ 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'vadmin.op_drf.middleware.ApiLoggingMiddleware', # 用于记录API访问日志 + 'vadmin.op_drf.middleware.PermissionModeMiddleware', # 权限中间件 ] # 允许跨域源 CORS_ORIGIN_ALLOW_ALL = CORS_ORIGIN_ALLOW_ALL diff --git a/dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py b/dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py index 3e03558..eb110d8 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py +++ b/dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py @@ -18,13 +18,6 @@ class ViewLogger(object): self.request = request self.model = None self.log_prefix: str = '' - if self.view and hasattr(self.view.get_queryset(), 'model'): - self.model: Model = self.view.get_queryset().model - elif self.view and hasattr(self.view.get_serializer(), 'Meta') and hasattr(self.view.get_serializer().Meta, - 'model'): - self.model: Model = self.view.get_serializer().Meta.model - if self.model: - request.session['model_name'] = str(getattr(self.model, '_meta').verbose_name) def handle(self, request: Request, *args, **kwargs): pass diff --git a/dvadmin-backend/apps/vadmin/op_drf/middleware.py b/dvadmin-backend/apps/vadmin/op_drf/middleware.py index fb60065..86292e3 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/middleware.py +++ b/dvadmin-backend/apps/vadmin/op_drf/middleware.py @@ -1,6 +1,7 @@ """ django中间件 """ +import json import logging import os @@ -11,7 +12,7 @@ from django.utils.deprecation import MiddlewareMixin from apps.vadmin.permission.models import Menu from apps.vadmin.system.models import OperationLog from ..utils.request_util import get_request_ip, get_request_data, get_request_path, get_browser, get_os, \ - get_login_location, get_request_canonical_path, get_request_user + get_login_location, get_request_canonical_path, get_request_user, get_verbose_name from ..utils.response import ErrorJsonResponse logger = logging.getLogger(__name__) @@ -42,9 +43,16 @@ class ApiLoggingMiddleware(MiddlewareMixin): body['password'] = '*' * len(body['password']) if not hasattr(response, 'data') or not isinstance(response.data, dict): response.data = {} + if not response.data and response.content: + try: + content = json.loads(response.content.decode()) + response.data = content if isinstance(content, dict) else {} + except: + pass + user = get_request_user(request) info = { 'request_ip': getattr(request, 'request_ip', 'unknown'), - 'creator': request.user, + 'creator': user if not isinstance(user, AnonymousUser) else '', 'dept_belong_id': getattr(request.user, 'dept_id', None), 'request_method': request.method, 'request_path': request.request_path, @@ -58,11 +66,14 @@ class ApiLoggingMiddleware(MiddlewareMixin): 'json_result': {"code": response.data.get('code'), "msg": response.data.get('msg')}, 'request_modular': request.session.get('model_name'), } - if isinstance(request.user, AnonymousUser): - info['creator'] = None log = OperationLog(**info) log.save() + def process_view(self, request, view_func, view_args, view_kwargs): + if view_func.cls and hasattr(view_func.cls, 'queryset'): + request.session['model_name'] = get_verbose_name(view_func.cls.queryset) + return + def process_request(self, request): self.__handle_request(request) @@ -85,14 +96,7 @@ class PermissionModeMiddleware(MiddlewareMixin): """ def process_request(self, request): - """ - 判断环境变量中,是否为演示模式(正常可忽略此判断) - :param request: - :return: - """ - white_list = ['/admin/logout/', '/admin/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'演示模式,不允许操作!') + return def has_interface_permission(self, request, method, view_path, user=None): """ @@ -135,13 +139,18 @@ class PermissionModeMiddleware(MiddlewareMixin): return -10 def process_view(self, request, view_func, view_args, view_kwargs): + # 判断环境变量中,是否为演示模式(正常可忽略此判断) + white_list = ['/admin/logout/', '/admin/login/'] + if not os.getenv('DEMO_ENV') and not request.method in ['GET', 'OPTIONS'] and request.path not in white_list: + return ErrorJsonResponse(data={}, msg=f'演示模式,不允许操作!') + if not settings.INTERFACE_PERMISSION: return user = get_request_user(request) if user and not isinstance(user, AnonymousUser): method = request.method.upper() - if method == 'GET': # GET 不设置接口权限 + if method == 'GET': # GET 不设置接口权限 return view_path = get_request_canonical_path(request, *view_args, **view_kwargs) auth_code = self.has_interface_permission(request, method, view_path, user) diff --git a/dvadmin-backend/apps/vadmin/utils/exceptions.py b/dvadmin-backend/apps/vadmin/utils/exceptions.py index cbd065e..f018592 100644 --- a/dvadmin-backend/apps/vadmin/utils/exceptions.py +++ b/dvadmin-backend/apps/vadmin/utils/exceptions.py @@ -65,8 +65,6 @@ def op_exception_handler(ex, context): """ msg = '' code = '201' - request = context.get('request') - request.session['model_name'] = str(get_verbose_name(view=context.get('view'))) if isinstance(ex, AuthenticationFailed): code = 401 From ef8a365ec0405aa4c14b092fd12f5c0b15e99ae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Tue, 30 Mar 2021 01:23:09 +0800 Subject: [PATCH 23/42] =?UTF-8?q?!11=20=E4=BF=AE=E5=A4=8D=E5=A4=9A?= =?UTF-8?q?=E4=B8=AAbug=20*=20=E4=BF=AE=E5=A4=8DBUG(=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E4=BB=B6bug):=20=E6=97=A5=E5=BF=97=E4=B8=AD=E9=97=B4=E4=BB=B6?= =?UTF-8?q?=E5=AD=98=E5=85=A5=E6=A8=A1=E5=9D=97=E4=BF=A1=E6=81=AF=E4=B8=8D?= =?UTF-8?q?=E5=85=A8=20*=20=E6=B5=8B=E8=AF=95(=E9=83=A8=E7=BD=B2=E6=B5=8B?= =?UTF-8?q?=E8=AF=95):=20*=20=E4=BF=AE=E5=A4=8DBUG(=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0):=20doc=EF=BC=8Cdocx=EF=BC=8Cxlsx=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E9=83=BD=E6=97=A0=E6=B3=95=E4=B8=8A=E4=BC=A0=E6=88=90?= =?UTF-8?q?=E5=8A=9F=20*=20=E4=BF=AE=E5=A4=8DBUG(=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=83=A8=E9=97=A8):=20=E9=83=A8=E9=97=A8=E9=87=8C=E9=9D=A2?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E7=94=A8=E6=88=B7=EF=BC=8C=E4=BE=9D=E7=84=B6?= =?UTF-8?q?=E8=83=BD=E5=A4=9F=E5=88=A0=E9=99=A4=E9=83=A8=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dvadmin-backend/application/settings.py | 2 +- .../apps/vadmin/op_drf/logging/view_logger.py | 7 ---- .../apps/vadmin/op_drf/middleware.py | 35 ++++++++++++------- .../apps/vadmin/permission/permissions.py | 20 +++++++++++ .../apps/vadmin/permission/views.py | 4 +-- .../apps/vadmin/system/models/save_file.py | 2 +- .../apps/vadmin/utils/exceptions.py | 2 -- 7 files changed, 46 insertions(+), 26 deletions(-) diff --git a/dvadmin-backend/application/settings.py b/dvadmin-backend/application/settings.py index ee3fc5b..4b385f0 100644 --- a/dvadmin-backend/application/settings.py +++ b/dvadmin-backend/application/settings.py @@ -54,7 +54,6 @@ INSTALLED_APPS = [ ] MIDDLEWARE = [ - 'vadmin.op_drf.middleware.PermissionModeMiddleware', # 权限中间件 'corsheaders.middleware.CorsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', @@ -64,6 +63,7 @@ MIDDLEWARE = [ 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'vadmin.op_drf.middleware.ApiLoggingMiddleware', # 用于记录API访问日志 + 'vadmin.op_drf.middleware.PermissionModeMiddleware', # 权限中间件 ] # 允许跨域源 CORS_ORIGIN_ALLOW_ALL = CORS_ORIGIN_ALLOW_ALL diff --git a/dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py b/dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py index 3e03558..eb110d8 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py +++ b/dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py @@ -18,13 +18,6 @@ class ViewLogger(object): self.request = request self.model = None self.log_prefix: str = '' - if self.view and hasattr(self.view.get_queryset(), 'model'): - self.model: Model = self.view.get_queryset().model - elif self.view and hasattr(self.view.get_serializer(), 'Meta') and hasattr(self.view.get_serializer().Meta, - 'model'): - self.model: Model = self.view.get_serializer().Meta.model - if self.model: - request.session['model_name'] = str(getattr(self.model, '_meta').verbose_name) def handle(self, request: Request, *args, **kwargs): pass diff --git a/dvadmin-backend/apps/vadmin/op_drf/middleware.py b/dvadmin-backend/apps/vadmin/op_drf/middleware.py index 5e2f1d1..bb19c28 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/middleware.py +++ b/dvadmin-backend/apps/vadmin/op_drf/middleware.py @@ -1,6 +1,7 @@ """ django中间件 """ +import json import logging import os @@ -11,7 +12,7 @@ from django.utils.deprecation import MiddlewareMixin from apps.vadmin.permission.models import Menu from apps.vadmin.system.models import OperationLog from ..utils.request_util import get_request_ip, get_request_data, get_request_path, get_browser, get_os, \ - get_login_location, get_request_canonical_path, get_request_user + get_login_location, get_request_canonical_path, get_request_user, get_verbose_name from ..utils.response import ErrorJsonResponse logger = logging.getLogger(__name__) @@ -42,9 +43,16 @@ class ApiLoggingMiddleware(MiddlewareMixin): body['password'] = '*' * len(body['password']) if not hasattr(response, 'data') or not isinstance(response.data, dict): response.data = {} + if not response.data and response.content: + try: + content = json.loads(response.content.decode()) + response.data = content if isinstance(content, dict) else {} + except: + pass + user = get_request_user(request) info = { 'request_ip': getattr(request, 'request_ip', 'unknown'), - 'creator': request.user, + 'creator': user if not isinstance(user, AnonymousUser) else '', 'dept_belong_id': getattr(request.user, 'dept_id', None), 'request_method': request.method, 'request_path': request.request_path, @@ -58,11 +66,14 @@ class ApiLoggingMiddleware(MiddlewareMixin): 'json_result': {"code": response.data.get('code'), "msg": response.data.get('msg')}, 'request_modular': request.session.get('model_name'), } - if isinstance(request.user, AnonymousUser): - info['creator'] = None log = OperationLog(**info) log.save() + def process_view(self, request, view_func, view_args, view_kwargs): + if view_func.cls and hasattr(view_func.cls, 'queryset'): + request.session['model_name'] = get_verbose_name(view_func.cls.queryset) + return + def process_request(self, request): self.__handle_request(request) @@ -85,14 +96,7 @@ class PermissionModeMiddleware(MiddlewareMixin): """ def process_request(self, request): - """ - 判断环境变量中,是否为演示模式(正常可忽略此判断) - :param request: - :return: - """ - white_list = ['/admin/logout/', '/admin/login/'] - if os.getenv('DEMO_ENV') and not request.method == 'GET' and request.path not in white_list: - return ErrorJsonResponse(data={}, msg=f'演示模式,不允许操作!') + return def has_interface_permission(self, request, method, view_path, user=None): """ @@ -135,13 +139,18 @@ class PermissionModeMiddleware(MiddlewareMixin): return -10 def process_view(self, request, view_func, view_args, view_kwargs): + # 判断环境变量中,是否为演示模式(正常可忽略此判断) + white_list = ['/admin/logout/', '/admin/login/'] + if not os.getenv('DEMO_ENV') and not request.method in ['GET', 'OPTIONS'] and request.path not in white_list: + return ErrorJsonResponse(data={}, msg=f'演示模式,不允许操作!') + if not settings.INTERFACE_PERMISSION: return user = get_request_user(request) if user and not isinstance(user, AnonymousUser): method = request.method.upper() - if method == 'GET': # GET 不设置接口权限 + if method == 'GET': # GET 不设置接口权限 return view_path = get_request_canonical_path(request, *view_args, **view_kwargs) auth_code = self.has_interface_permission(request, method, view_path, user) diff --git a/dvadmin-backend/apps/vadmin/permission/permissions.py b/dvadmin-backend/apps/vadmin/permission/permissions.py index 0186adb..3c09387 100644 --- a/dvadmin-backend/apps/vadmin/permission/permissions.py +++ b/dvadmin-backend/apps/vadmin/permission/permissions.py @@ -93,3 +93,23 @@ class CommonPermission(CustomPermission): self.message = f"没有此数据操作权限!" res = self.check_queryset(request, instance) return res + + +class DeptDestroyPermission(CustomPermission): + """ + 部门删除权限校验:判断部门下是否有用户存在,存在不可删除 + """ + message = '没有有操作权限' + + def has_permission(self, request: Request, view: APIView): + return True + + def check_queryset(self, request, instance): + if instance.values_list('userprofile', flat=True): + self.message = "该部门下有关联用户,无法删除!" + return False + return True + + def has_object_permission(self, request: Request, view: APIView, instance): + res = self.check_queryset(request, instance) + return res diff --git a/dvadmin-backend/apps/vadmin/permission/views.py b/dvadmin-backend/apps/vadmin/permission/views.py index bec3b8e..72855b4 100644 --- a/dvadmin-backend/apps/vadmin/permission/views.py +++ b/dvadmin-backend/apps/vadmin/permission/views.py @@ -2,7 +2,7 @@ from django.contrib.auth import authenticate from rest_framework.request import Request from rest_framework.views import APIView -from .permissions import CommonPermission +from .permissions import CommonPermission, DeptDestroyPermission from ..op_drf.filters import DataLevelPermissionsFilter from ..op_drf.viewsets import CustomModelViewSet from ..permission.filters import MenuFilter, DeptFilter, PostFilter, RoleFilter, UserProfileFilter @@ -129,7 +129,7 @@ class DeptModelViewSet(CustomModelViewSet): filter_class = DeptFilter extra_filter_backends = [DataLevelPermissionsFilter] update_extra_permission_classes = (CommonPermission,) - destroy_extra_permission_classes = (CommonPermission,) + destroy_extra_permission_classes = (CommonPermission, DeptDestroyPermission) create_extra_permission_classes = (CommonPermission,) search_fields = ('deptName',) ordering = 'create_datetime' # 默认排序 diff --git a/dvadmin-backend/apps/vadmin/system/models/save_file.py b/dvadmin-backend/apps/vadmin/system/models/save_file.py index b43757d..30407cf 100644 --- a/dvadmin-backend/apps/vadmin/system/models/save_file.py +++ b/dvadmin-backend/apps/vadmin/system/models/save_file.py @@ -13,7 +13,7 @@ def files_path(instance, filename): class SaveFile(CoreModel): name = CharField(max_length=128, verbose_name="文件名称", null=True, blank=True) - type = CharField(max_length=32, verbose_name="文件类型", null=True, blank=True) + type = CharField(max_length=200, verbose_name="文件类型", null=True, blank=True) size = CharField(max_length=64, verbose_name="文件大小", null=True, blank=True) address = CharField(max_length=16, verbose_name="存储位置", null=True, blank=True) # 本地、阿里云、腾讯云.. source = CharField(max_length=16, verbose_name="文件来源", null=True, blank=True) # 导出、用户上传. diff --git a/dvadmin-backend/apps/vadmin/utils/exceptions.py b/dvadmin-backend/apps/vadmin/utils/exceptions.py index cbd065e..f018592 100644 --- a/dvadmin-backend/apps/vadmin/utils/exceptions.py +++ b/dvadmin-backend/apps/vadmin/utils/exceptions.py @@ -65,8 +65,6 @@ def op_exception_handler(ex, context): """ msg = '' code = '201' - request = context.get('request') - request.session['model_name'] = str(get_verbose_name(view=context.get('view'))) if isinstance(ex, AuthenticationFailed): code = 401 From ed04626aa47b07455156c522c95c2b73aaa4507d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Tue, 30 Mar 2021 01:24:43 +0800 Subject: [PATCH 24/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG(=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E4=BB=B6bug):=20=E6=97=A5=E5=BF=97=E4=B8=AD=E9=97=B4=E4=BB=B6?= =?UTF-8?q?=E5=AD=98=E5=85=A5=E6=A8=A1=E5=9D=97=E4=BF=A1=E6=81=AF=E4=B8=8D?= =?UTF-8?q?=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py b/dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py index eb110d8..3e03558 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py +++ b/dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py @@ -18,6 +18,13 @@ class ViewLogger(object): self.request = request self.model = None self.log_prefix: str = '' + if self.view and hasattr(self.view.get_queryset(), 'model'): + self.model: Model = self.view.get_queryset().model + elif self.view and hasattr(self.view.get_serializer(), 'Meta') and hasattr(self.view.get_serializer().Meta, + 'model'): + self.model: Model = self.view.get_serializer().Meta.model + if self.model: + request.session['model_name'] = str(getattr(self.model, '_meta').verbose_name) def handle(self, request: Request, *args, **kwargs): pass From a37550176ce29ceb219e637f1c4e2d09cc6e25f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Tue, 30 Mar 2021 01:28:09 +0800 Subject: [PATCH 25/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG(=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E9=94=99=E8=AF=AF):=20DEMO=5FENV?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dvadmin-backend/apps/vadmin/op_drf/middleware.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dvadmin-backend/apps/vadmin/op_drf/middleware.py b/dvadmin-backend/apps/vadmin/op_drf/middleware.py index bb19c28..8e8169c 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/middleware.py +++ b/dvadmin-backend/apps/vadmin/op_drf/middleware.py @@ -141,7 +141,7 @@ class PermissionModeMiddleware(MiddlewareMixin): def process_view(self, request, view_func, view_args, view_kwargs): # 判断环境变量中,是否为演示模式(正常可忽略此判断) white_list = ['/admin/logout/', '/admin/login/'] - if not os.getenv('DEMO_ENV') and not request.method in ['GET', 'OPTIONS'] and request.path not in white_list: + if os.getenv('DEMO_ENV') and not request.method in ['GET', 'OPTIONS'] and request.path not in white_list: return ErrorJsonResponse(data={}, msg=f'演示模式,不允许操作!') if not settings.INTERFACE_PERMISSION: From fbc9203ef85925302ed9821ca224207a923b155b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Tue, 30 Mar 2021 01:35:54 +0800 Subject: [PATCH 26/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG(=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E4=BB=B6bug):=20=E6=97=A5=E5=BF=97=E4=B8=AD=E9=97=B4=E4=BB=B6?= =?UTF-8?q?=E5=AD=98=E5=85=A5=E6=A8=A1=E5=9D=97=E4=BF=A1=E6=81=AF=E4=B8=8D?= =?UTF-8?q?=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py b/dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py index eb110d8..3e03558 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py +++ b/dvadmin-backend/apps/vadmin/op_drf/logging/view_logger.py @@ -18,6 +18,13 @@ class ViewLogger(object): self.request = request self.model = None self.log_prefix: str = '' + if self.view and hasattr(self.view.get_queryset(), 'model'): + self.model: Model = self.view.get_queryset().model + elif self.view and hasattr(self.view.get_serializer(), 'Meta') and hasattr(self.view.get_serializer().Meta, + 'model'): + self.model: Model = self.view.get_serializer().Meta.model + if self.model: + request.session['model_name'] = str(getattr(self.model, '_meta').verbose_name) def handle(self, request: Request, *args, **kwargs): pass From 85b1f748950a47ce9c25c0c4e0e85f93c95f0bd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Tue, 30 Mar 2021 01:45:57 +0800 Subject: [PATCH 27/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG(=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF&=E9=80=9A=E7=9F=A5=E5=85=AC=E5=91=8A):=20?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E6=9C=AA=E8=AF=BB=E9=80=9A=E7=9F=A5=E5=85=AC?= =?UTF-8?q?=E5=91=8A=E6=95=B0=E9=87=8F=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dvadmin-backend/apps/vadmin/permission/serializers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dvadmin-backend/apps/vadmin/permission/serializers.py b/dvadmin-backend/apps/vadmin/permission/serializers.py index f9bfaf3..8fc641e 100644 --- a/dvadmin-backend/apps/vadmin/permission/serializers.py +++ b/dvadmin-backend/apps/vadmin/permission/serializers.py @@ -226,8 +226,8 @@ class UserProfileSerializer(CustomModelSerializer): return False def get_unread_msg_count(self, obj: UserProfile): - return MessagePush.objects.filter(status='2').exclude(user=obj, - messagepushuser_message_push__is_read=True).count() + return MessagePush.objects.filter(status='2').exclude(messagepushuser_message_push__is_read=True, + messagepushuser_message_push__user=obj).count() class Meta: model = UserProfile From 11b7222bee7cbdfb87889d62fbedae42919864ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Tue, 30 Mar 2021 13:30:25 +0800 Subject: [PATCH 28/42] update dvadmin-backend/apps/vadmin/op_drf/middleware.py. --- dvadmin-backend/apps/vadmin/op_drf/middleware.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dvadmin-backend/apps/vadmin/op_drf/middleware.py b/dvadmin-backend/apps/vadmin/op_drf/middleware.py index 8e8169c..c3b6c54 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/middleware.py +++ b/dvadmin-backend/apps/vadmin/op_drf/middleware.py @@ -70,7 +70,7 @@ class ApiLoggingMiddleware(MiddlewareMixin): log.save() def process_view(self, request, view_func, view_args, view_kwargs): - if view_func.cls and hasattr(view_func.cls, 'queryset'): + if hasattr(view_func, 'cls') and hasattr(view_func.cls, 'queryset'): request.session['model_name'] = get_verbose_name(view_func.cls.queryset) return From bd2fdc289acd75651d618f3a71676fcd873d1cfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Tue, 30 Mar 2021 13:37:51 +0800 Subject: [PATCH 29/42] update dvadmin-backend/apps/vadmin/op_drf/middleware.py. --- dvadmin-backend/apps/vadmin/op_drf/middleware.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dvadmin-backend/apps/vadmin/op_drf/middleware.py b/dvadmin-backend/apps/vadmin/op_drf/middleware.py index c3b6c54..0990a07 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/middleware.py +++ b/dvadmin-backend/apps/vadmin/op_drf/middleware.py @@ -52,7 +52,7 @@ class ApiLoggingMiddleware(MiddlewareMixin): user = get_request_user(request) info = { 'request_ip': getattr(request, 'request_ip', 'unknown'), - 'creator': user if not isinstance(user, AnonymousUser) else '', + 'creator': user if not isinstance(user, AnonymousUser) else None, 'dept_belong_id': getattr(request.user, 'dept_id', None), 'request_method': request.method, 'request_path': request.request_path, From a64225e20f4bacdf6638ceb2ec4f8aca2225addf Mon Sep 17 00:00:00 2001 From: qianzhengkai <18352261659@163.com> Date: Tue, 30 Mar 2021 20:30:06 +0800 Subject: [PATCH 30/42] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8cpu=E3=80=81=E5=86=85=E5=AD=98?= =?UTF-8?q?=E3=80=81=E7=A1=AC=E7=9B=98=E7=9A=84=E4=BD=BF=E7=94=A8=E7=8E=87?= =?UTF-8?q?=E8=A7=86=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dvadmin-backend/application/__init__.py | 2 ++ dvadmin-backend/apps/vadmin/system/urls.py | 5 ++-- dvadmin-backend/apps/vadmin/system/views.py | 20 +++++++++++++++ .../vadmin}/utils/system_info_utils.py | 25 ++++++++++++++++--- 4 files changed, 47 insertions(+), 5 deletions(-) rename dvadmin-backend/{ => apps/vadmin}/utils/system_info_utils.py (69%) diff --git a/dvadmin-backend/application/__init__.py b/dvadmin-backend/application/__init__.py index 8b13789..2ea4edd 100644 --- a/dvadmin-backend/application/__init__.py +++ b/dvadmin-backend/application/__init__.py @@ -1 +1,3 @@ +import pymysql +pymysql.install_as_MySQLdb() diff --git a/dvadmin-backend/apps/vadmin/system/urls.py b/dvadmin-backend/apps/vadmin/system/urls.py index 7084014..654bac5 100644 --- a/dvadmin-backend/apps/vadmin/system/urls.py +++ b/dvadmin-backend/apps/vadmin/system/urls.py @@ -3,7 +3,7 @@ from rest_framework.routers import DefaultRouter from ..system.views import DictDataModelViewSet, DictDetailsModelViewSet, \ ConfigSettingsModelViewSet, SaveFileModelViewSet, MessagePushModelViewSet, LoginInforModelViewSet, \ - OperationLogModelViewSet, CeleryLogModelViewSet + OperationLogModelViewSet, CeleryLogModelViewSet, SystemInfoApiView router = DefaultRouter() router.register(r'dict/type', DictDataModelViewSet) @@ -48,6 +48,7 @@ urlpatterns = [ re_path('celery_log/export/', CeleryLogModelViewSet.as_view({'get': 'export', })), # 清除废弃文件 re_path('clearsavefile/', SaveFileModelViewSet.as_view({'post': 'clearsavefile', })), - + # 获取系统信息cpu、内存、硬盘 + re_path('sys/info/', SystemInfoApiView.as_view()) ] urlpatterns += router.urls diff --git a/dvadmin-backend/apps/vadmin/system/views.py b/dvadmin-backend/apps/vadmin/system/views.py index a35338f..05257cc 100644 --- a/dvadmin-backend/apps/vadmin/system/views.py +++ b/dvadmin-backend/apps/vadmin/system/views.py @@ -4,6 +4,7 @@ from django.conf import settings from django.core.cache import cache from django.db.models import Q from rest_framework.request import Request +from rest_framework.views import APIView from .models import LoginInfor, OperationLog, CeleryLog from ..op_drf.filters import DataLevelPermissionsFilter @@ -23,6 +24,7 @@ from ..system.serializers import DictDataSerializer, DictDataCreateUpdateSeriali from ..utils.export_excel import export_excel_save_model from ..utils.file_util import get_all_files, remove_empty_dir, delete_files from ..utils.response import SuccessResponse +from ..utils.system_info_utils import get_memory_used_percent, get_cpu_used_percent, get_disk_used_percent class DictDataModelViewSet(CustomModelViewSet): @@ -328,3 +330,21 @@ class CeleryLogModelViewSet(CustomModelViewSet): """ self.get_queryset().delete() return SuccessResponse(msg="清空成功") + + +class SystemInfoApiView(APIView): + """ + 系统服务监控视图 + """ + + def get(self, request, *args, **kwargs): + # 获取内存使用率 + memory_used_percent = get_memory_used_percent() + # 获取cpu使用率 + cpu_used_percent = get_cpu_used_percent() + # 获取硬盘使用率 + disk_used_percent = get_disk_used_percent() + return SuccessResponse(data={"memory_used_percent": memory_used_percent, + "cpu_used_percent": cpu_used_percent, + "disk_used_percent": disk_used_percent + }) diff --git a/dvadmin-backend/utils/system_info_utils.py b/dvadmin-backend/apps/vadmin/utils/system_info_utils.py similarity index 69% rename from dvadmin-backend/utils/system_info_utils.py rename to dvadmin-backend/apps/vadmin/utils/system_info_utils.py index 69f34c9..88d9895 100644 --- a/dvadmin-backend/utils/system_info_utils.py +++ b/dvadmin-backend/apps/vadmin/utils/system_info_utils.py @@ -4,6 +4,27 @@ import psutil as psutil +def get_cpu_info(): + """ + 获取cpu所有信息 + """ + pass + + +def get_memory_info(): + """ + 获取内存所有信息 + """ + pass + + +def get_disk_info(): + """ + 获取硬盘所有信息 + """ + pass + + def get_cpu_used_percent(): """ 获取CPU运行情况 @@ -31,7 +52,5 @@ def get_disk_used_percent(): pass - - if __name__ == '__main__': - get_cpu_used_percent() + get_disk_used_percent() From f54d20d1e630318d514ed04baed2dd8ac9189552 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Wed, 31 Mar 2021 10:35:35 +0800 Subject: [PATCH 31/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG(=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=AE=A1=E7=90=86):=20=E4=B8=AA=E4=BA=BA=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=AF=86=E7=A0=81bug=EF=BC=8CUserProfile=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE=E5=88=9B=E5=BB=BA=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dvadmin-backend/apps/vadmin/op_drf/middleware.py | 4 ++-- dvadmin-backend/apps/vadmin/permission/models/users.py | 8 +++----- dvadmin-backend/apps/vadmin/permission/views.py | 2 +- .../vadmin/scripts/permission/permission_userprofile.sql | 4 ++-- dvadmin-backend/apps/vadmin/utils/authentication.py | 4 +++- dvadmin-ui/src/views/vadmin/permission/user/index.vue | 3 ++- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/dvadmin-backend/apps/vadmin/op_drf/middleware.py b/dvadmin-backend/apps/vadmin/op_drf/middleware.py index 8e8169c..c03c039 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/middleware.py +++ b/dvadmin-backend/apps/vadmin/op_drf/middleware.py @@ -52,7 +52,7 @@ class ApiLoggingMiddleware(MiddlewareMixin): user = get_request_user(request) info = { 'request_ip': getattr(request, 'request_ip', 'unknown'), - 'creator': user if not isinstance(user, AnonymousUser) else '', + 'creator': user if not isinstance(user, AnonymousUser) else None, 'dept_belong_id': getattr(request.user, 'dept_id', None), 'request_method': request.method, 'request_path': request.request_path, @@ -70,7 +70,7 @@ class ApiLoggingMiddleware(MiddlewareMixin): log.save() def process_view(self, request, view_func, view_args, view_kwargs): - if view_func.cls and hasattr(view_func.cls, 'queryset'): + if hasattr(view_func,'cls') and hasattr(view_func.cls, 'queryset'): request.session['model_name'] = get_verbose_name(view_func.cls.queryset) return diff --git a/dvadmin-backend/apps/vadmin/permission/models/users.py b/dvadmin-backend/apps/vadmin/permission/models/users.py index 2fead2f..e609a2a 100644 --- a/dvadmin-backend/apps/vadmin/permission/models/users.py +++ b/dvadmin-backend/apps/vadmin/permission/models/users.py @@ -4,10 +4,10 @@ from django.contrib.auth.models import UserManager, AbstractUser from django.core.cache import cache from django.db.models import IntegerField, ForeignKey, CharField, TextField, ManyToManyField, CASCADE -from ...op_drf.fields import CreateDateTimeField, UpdateDateTimeField +from ...op_drf.models import CoreModel -class UserProfile(AbstractUser): +class UserProfile(AbstractUser, CoreModel): USER_TYPE_CHOICES = ( (0, "后台用户"), (1, "前台用户"), @@ -25,9 +25,6 @@ class UserProfile(AbstractUser): post = ManyToManyField(to='Post', verbose_name='关联岗位', db_constraint=False) role = ManyToManyField(to='Role', verbose_name='关联角色', db_constraint=False) dept = ForeignKey(to='Dept', verbose_name='归属部门', on_delete=CASCADE, db_constraint=False, null=True, blank=True) - dept_belong_id = CharField(max_length=64, verbose_name="数据归属部门", null=True, blank=True) - create_datetime = CreateDateTimeField() - update_datetime = UpdateDateTimeField() @property def get_user_interface_dict(self): @@ -52,6 +49,7 @@ class UserProfile(AbstractUser): :return: """ return cache.delete(f'permission_interface_dict_{self.username}') + class Meta: verbose_name = '用户管理' verbose_name_plural = verbose_name diff --git a/dvadmin-backend/apps/vadmin/permission/views.py b/dvadmin-backend/apps/vadmin/permission/views.py index 72855b4..86110de 100644 --- a/dvadmin-backend/apps/vadmin/permission/views.py +++ b/dvadmin-backend/apps/vadmin/permission/views.py @@ -359,7 +359,7 @@ class UserProfileModelViewSet(CustomModelViewSet): :return: """ instance = self.queryset.get(id=request.user.id) - instance.mobile = request.data.get('newPassword', None) + instance.password = request.data.get('newPassword', None) if not authenticate(username=request.user.username, password=request.data.get('oldPassword', None)): return ErrorResponse(msg='旧密码不正确!') instance.set_password(request.data.get('newPassword')) diff --git a/dvadmin-backend/apps/vadmin/scripts/permission/permission_userprofile.sql b/dvadmin-backend/apps/vadmin/scripts/permission/permission_userprofile.sql index e59fc9e..56e3630 100644 --- a/dvadmin-backend/apps/vadmin/scripts/permission/permission_userprofile.sql +++ b/dvadmin-backend/apps/vadmin/scripts/permission/permission_userprofile.sql @@ -33,8 +33,8 @@ -- ---------------------------- -- Records of permission_userprofile -- ---------------------------- -INSERT INTO `permission_userprofile` (id, password, last_login, is_superuser, first_name, last_name, is_staff, is_active, date_joined, username, secret, email, mobile, avatar, name, gender, remark, user_type, create_datetime, update_datetime, dept_id, dept_belong_id) VALUES (1, 'pbkdf2_sha256$150000$OjTMSXJgkzrE$jEQCjWbIbXwpN4k2z0o8Yvou1UQGuoJALyL/kGDZFd4=', '2021-02-27 06:20:28.214775', 1, '', '', 1, 1, '2021-02-27 06:20:09.188689', 'admin', '3704adf3-380f-4c27-a8da-60420e8cb4ab', 'admin@qq.com', NULL, NULL, '管理员', '2', '1', 2, '2021-02-27 06:20:09.263192', '2021-02-27 09:14:30.009998', 8, 1); -INSERT INTO `permission_userprofile` (id, password, last_login, is_superuser, first_name, last_name, is_staff, is_active, date_joined, username, secret, email, mobile, avatar, name, gender, remark, user_type, create_datetime, update_datetime, dept_id, dept_belong_id) VALUES (2, 'pbkdf2_sha256$150000$5Z9LSi7LpNms$xVguE/dOEpI4D95LjSaKm0xzG7vNSopUolANr8f/6/E=', NULL, 0, '', '', 0, 1, '2021-03-03 15:38:27.009893', 'dvadmin', 'b4c5d79a-f01c-4244-92f8-b5288eca1d50', NULL, NULL, NULL, '普通用户', '2', NULL, 0, '2021-03-03 15:38:27.010771', '2021-03-03 15:38:27.086069', 8, 1); +INSERT INTO `permission_userprofile` (id, password, last_login, is_superuser, first_name, last_name, is_staff, is_active, date_joined, username, secret, email, mobile, avatar, name, gender, remark, user_type, create_datetime, update_datetime, dept_id, dept_belong_id, creator_id) VALUES (1, 'pbkdf2_sha256$150000$OjTMSXJgkzrE$jEQCjWbIbXwpN4k2z0o8Yvou1UQGuoJALyL/kGDZFd4=', '2021-02-27 06:20:28.214775', 1, '', '', 1, 1, '2021-02-27 06:20:09.188689', 'admin', '3704adf3-380f-4c27-a8da-60420e8cb4ab', 'admin@qq.com', NULL, NULL, '管理员', '2', '1', 2, '2021-02-27 06:20:09.263192', '2021-02-27 09:14:30.009998', 1, 1, 1); +INSERT INTO `permission_userprofile` (id, password, last_login, is_superuser, first_name, last_name, is_staff, is_active, date_joined, username, secret, email, mobile, avatar, name, gender, remark, user_type, create_datetime, update_datetime, dept_id, dept_belong_id, creator_id) VALUES (2, 'pbkdf2_sha256$150000$5Z9LSi7LpNms$xVguE/dOEpI4D95LjSaKm0xzG7vNSopUolANr8f/6/E=', NULL, 0, '', '', 0, 1, '2021-03-03 15:38:27.009893', 'dvadmin', 'b4c5d79a-f01c-4244-92f8-b5288eca1d50', NULL, NULL, NULL, '普通用户', '2', NULL, 0, '2021-03-03 15:38:27.010771', '2021-03-03 15:38:27.086069', 1, 1, 1); -- ---------------------------- -- Table structure for permission_userprofile_post -- ---------------------------- diff --git a/dvadmin-backend/apps/vadmin/utils/authentication.py b/dvadmin-backend/apps/vadmin/utils/authentication.py index cc3b781..4a51ca5 100644 --- a/dvadmin-backend/apps/vadmin/utils/authentication.py +++ b/dvadmin-backend/apps/vadmin/utils/authentication.py @@ -12,8 +12,8 @@ from django.utils.translation import ugettext as _ from rest_framework import exceptions from rest_framework_jwt.utils import jwt_decode_handler -from .decorators import exceptionHandler from .jwt_util import jwt_get_session_id +from ..permission.models.users import UserProfile logger = logging.getLogger(__name__) User = get_user_model() @@ -38,6 +38,8 @@ class OpAuthJwtAuthentication(object): raise exceptions.AuthenticationFailed(msg) except jwt.InvalidTokenError: raise exceptions.AuthenticationFailed() + except UserProfile.DoesNotExist: + raise exceptions.AuthenticationFailed() username = payload.get('username', None) if not username: diff --git a/dvadmin-ui/src/views/vadmin/permission/user/index.vue b/dvadmin-ui/src/views/vadmin/permission/user/index.vue index f11d209..35caf58 100755 --- a/dvadmin-ui/src/views/vadmin/permission/user/index.vue +++ b/dvadmin-ui/src/views/vadmin/permission/user/index.vue @@ -161,7 +161,7 @@ - {{role.roleName}} + {{role.roleName}} @@ -648,6 +648,7 @@ this.$refs['form'].validate(valid => { if (valid) { if (this.form.id != undefined) { + this.form.creator = undefined updateUser(this.form).then(response => { this.msgSuccess('修改成功') this.open = false From f26a9502fe08fec750db1e57002bafcbe38e6323 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Wed, 31 Mar 2021 11:08:09 +0800 Subject: [PATCH 32/42] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=8F=98=E5=8C=96(?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=B7=AF=E7=94=B1=E6=8E=A5=E5=8F=A3):=20admi?= =?UTF-8?q?n=E7=94=A8=E6=88=B7=E8=8F=9C=E5=8D=95=E5=8F=AF=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=E5=85=A8=E9=83=A8=EF=BC=8C=E4=BE=BF=E4=BA=8E=E5=BC=80?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dvadmin-backend/apps/vadmin/permission/views.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dvadmin-backend/apps/vadmin/permission/views.py b/dvadmin-backend/apps/vadmin/permission/views.py index 86110de..8ece4fa 100644 --- a/dvadmin-backend/apps/vadmin/permission/views.py +++ b/dvadmin-backend/apps/vadmin/permission/views.py @@ -48,7 +48,10 @@ class GetRouters(APIView): return dict def get(self, request, format=None): - menus = Menu.objects.filter(role__userprofile=request.user) \ + kwargs = {} + if not request.user.is_superuser: + kwargs['role__userprofile'] = request.user + menus = Menu.objects.filter(**kwargs) \ .exclude(menuType='2').values('id', 'name', 'web_path', 'visible', 'status', 'isFrame', 'component_path', 'icon', 'parentId', 'orderNum', 'isCache').distinct() data = [] From a5709f8cf2eede8194859abc0886916db8a49463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Wed, 31 Mar 2021 12:23:30 +0800 Subject: [PATCH 33/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG(=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF):=20=E4=B8=AA=E4=BA=BA=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=B8=AD=E6=9C=AA=E8=AF=BB=E6=B6=88=E6=81=AF=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dvadmin-backend/apps/vadmin/system/views.py | 2 +- dvadmin-ui/src/layout/components/Navbar.vue | 6 +++--- dvadmin-ui/src/store/modules/user.js | 3 ++- dvadmin-ui/src/views/vadmin/system/message/Mymessage.vue | 8 +++++--- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/dvadmin-backend/apps/vadmin/system/views.py b/dvadmin-backend/apps/vadmin/system/views.py index a35338f..e2beb55 100644 --- a/dvadmin-backend/apps/vadmin/system/views.py +++ b/dvadmin-backend/apps/vadmin/system/views.py @@ -200,7 +200,7 @@ class MessagePushModelViewSet(CustomModelViewSet): serializer_class = MessagePushSerializer create_serializer_class = MessagePushCreateUpdateSerializer update_serializer_class = MessagePushCreateUpdateSerializer - extra_filter_backends = [DataLevelPermissionsFilter] + # extra_filter_backends = [DataLevelPermissionsFilter] update_extra_permission_classes = (CommonPermission,) destroy_extra_permission_classes = (CommonPermission,) create_extra_permission_classes = (CommonPermission,) diff --git a/dvadmin-ui/src/layout/components/Navbar.vue b/dvadmin-ui/src/layout/components/Navbar.vue index c300c63..76e7800 100755 --- a/dvadmin-ui/src/layout/components/Navbar.vue +++ b/dvadmin-ui/src/layout/components/Navbar.vue @@ -14,7 +14,7 @@
- +
@@ -81,11 +81,11 @@ export default { }, data() { return { - count: store.getters.unread_msg_count, + count: store.unread_msg_count, }; }, computed: { - ...mapGetters(["sidebar", "avatar", "device"]), + ...mapGetters(["sidebar", "avatar", "device", "unread_msg_count"]), setting: { get() { return this.$store.state.settings.showSettings; diff --git a/dvadmin-ui/src/store/modules/user.js b/dvadmin-ui/src/store/modules/user.js index 895a689..9e4b5a5 100755 --- a/dvadmin-ui/src/store/modules/user.js +++ b/dvadmin-ui/src/store/modules/user.js @@ -7,7 +7,8 @@ const user = { name: '', avatar: '', roles: [], - permissions: [] + permissions: [], + unread_msg_count: 0 }, mutations: { diff --git a/dvadmin-ui/src/views/vadmin/system/message/Mymessage.vue b/dvadmin-ui/src/views/vadmin/system/message/Mymessage.vue index 1bbcd87..43a2581 100644 --- a/dvadmin-ui/src/views/vadmin/system/message/Mymessage.vue +++ b/dvadmin-ui/src/views/vadmin/system/message/Mymessage.vue @@ -103,9 +103,11 @@ // 修改通知查询状态 if (this.badgeType === "danger") { updateIsRead(this.showingMsgItem).then(response => { - store.getters.unread_msg_count - this.open = false; - this.getList(); + if(response.code === 200){ + store.commit('SET_UNREAD_MSG_COUNT', store.getters.unread_msg_count - 1); + this.open = false; + this.getList(); + } }); } } From a3e463decccdc3b91b24cf26a0683586133e0393 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Wed, 31 Mar 2021 12:37:06 +0800 Subject: [PATCH 34/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG(=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E6=B6=88=E6=81=AF):=20=E6=B7=BB=E5=8A=A0=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=9C=AA=E5=8F=91=E5=B8=83=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dvadmin-backend/apps/vadmin/system/views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dvadmin-backend/apps/vadmin/system/views.py b/dvadmin-backend/apps/vadmin/system/views.py index e2beb55..ec4a38a 100644 --- a/dvadmin-backend/apps/vadmin/system/views.py +++ b/dvadmin-backend/apps/vadmin/system/views.py @@ -215,6 +215,7 @@ class MessagePushModelViewSet(CustomModelViewSet): 获取用户自己消息列表 """ queryset = self.filter_queryset(self.get_queryset()) + queryset = queryset.filter(status=2) is_read = request.query_params.get('is_read', None) if is_read: if is_read == 'False': From b715eff90ddc7602250b62e79c43d11cd0a2cb2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Wed, 31 Mar 2021 13:38:09 +0800 Subject: [PATCH 35/42] update dvadmin-backend/application/__init__.py. --- dvadmin-backend/application/__init__.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/dvadmin-backend/application/__init__.py b/dvadmin-backend/application/__init__.py index 2ea4edd..e69de29 100644 --- a/dvadmin-backend/application/__init__.py +++ b/dvadmin-backend/application/__init__.py @@ -1,3 +0,0 @@ -import pymysql -pymysql.install_as_MySQLdb() - From 9741d3a073f42e833a325ade1c1a45be12a116a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Wed, 31 Mar 2021 23:46:30 +0800 Subject: [PATCH 36/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG(=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BE=9D=E8=B5=96):=20=E6=B7=BB=E5=8A=A0=E4=BE=9D=E8=B5=96=20p?= =?UTF-8?q?sutil=3D=3D5.8.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dvadmin-backend/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/dvadmin-backend/requirements.txt b/dvadmin-backend/requirements.txt index 5e06ebc..2ea4f69 100644 --- a/dvadmin-backend/requirements.txt +++ b/dvadmin-backend/requirements.txt @@ -26,3 +26,4 @@ xlrd==2.0.1 coreapi==2.3.3 user-agents==2.2.0 eventlet==0.30.2 +psutil==5.8.0 From 1dd96c80bc86549153d55d413dcd6c568b7c7830 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Wed, 31 Mar 2021 23:59:55 +0800 Subject: [PATCH 37/42] =?UTF-8?q?=E6=96=87=E6=A1=A3(=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E4=BF=AE=E6=94=B9):=20README.md=20=E6=96=87=E6=A1=A3=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 ++++----- dvadmin-ui/README.md | 12 ++++++------ 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index ea9949d..a54d0af 100644 --- a/README.md +++ b/README.md @@ -12,26 +12,25 @@ Django-Vue-Admin 是一套全部开源的快速开发平台,毫无保留给个 * 后端采用Python语言Django框架。 * 权限认证使用Jwt,支持多终端认证系统。 * 支持加载动态权限菜单,多方式轻松权限控制。 -* ~~高效率开发,使用代码生成器可以一键生成前后端代码。~~ -* 特别鸣谢:[RuoYi](https://gitee.com/y_project/RuoYi-Vue) ,[Vue-Element-Admin](https://github.com/PanJiaChen/vue-element-admin),[eladmin-web](https://gitee.com/elunez/eladmin-web?_from=gitee_search),[Gin-Vue-Admin](https://www.gin-vue-admin.com/)。 +* 特别鸣谢:[Gin-Vue-Admin](https://www.gin-vue-admin.com/),[RuoYi](https://gitee.com/y_project/RuoYi-Vue) ,[Vue-Element-Admin](https://github.com/PanJiaChen/vue-element-admin),[eladmin-web](https://gitee.com/elunez/eladmin-web?_from=gitee_search)。 ## QQ群 - QQ群号:812482043 -- 由于项目正在启步阶段,第一版预计3月底发,后序会慢慢维护其他版本,有什么不到位的请大家担待~ +- 二维码 ## 源码地址 -gitee地址:[https://gitee.com/liqianglog/django-vue-admin](https://gitee.com/liqianglog/django-vue-admin) +gitee地址(主推):[https://gitee.com/liqianglog/django-vue-admin](https://gitee.com/liqianglog/django-vue-admin) github地址:[https://github.com/liqianglog/django-vue-admin](https://github.com/liqianglog/django-vue-admin) ## 内置功能 -##### 预计3月底发布v1.0正式版本,个别功能开发中 [版本功能说明](https://gitee.com/liqianglog/django-vue-admin/wikis/releaseNote?sort_id=3615540) +##### 后期版本 [版本功能说明](https://gitee.com/liqianglog/django-vue-admin/wikis/releaseNote?sort_id=3615540) 1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 diff --git a/dvadmin-ui/README.md b/dvadmin-ui/README.md index a857617..b0823d8 100755 --- a/dvadmin-ui/README.md +++ b/dvadmin-ui/README.md @@ -2,22 +2,22 @@ ```bash # 克隆项目 -git clone https://gitee.com/y_project/RuoYi-Vue +git clone https://gitee.com/liqianglog/django-vue-admin.git # 进入项目目录 -cd ruoyi-ui +cd dvadmin-ui # 安装依赖 -npm install - -# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 npm install --registry=https://registry.npm.taobao.org # 启动服务 npm run dev + +# 浏览器访问 http://localhost:8080 +# .env.development 文件中可配置启动端口等参数 ``` -浏览器访问 http://localhost:80 +浏览器访问 http://localhost:8080 ## 发布 From b32183fc28aaddba5404bd8b970599a6b36c9862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Thu, 1 Apr 2021 00:08:21 +0800 Subject: [PATCH 38/42] =?UTF-8?q?=E6=96=87=E6=A1=A3(=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E6=8F=90=E4=BA=A4):=20README.md=20=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index a54d0af..139daa8 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,21 @@ npm run build:prod 后端接口文档地址:http://127.0.0.1:8000/docs/ ~~~ +### docker-compose 运行 + +~~~shell +# 先安装docker-compose (自行百度安装),执行此命令等待安装 +docker-compose up +# 初始化后端数据(第一次执行即可) +docker exec -ti dvadmin-django bash +python manage.py init -y +exit + +前端地址:http://127.0.0.1:8080 +后端地址:http://127.0.0.1:8000 +账号:admin 密码:123456 +~~~ + ## 演示图 From 1fe784a644904b6d73db61c3c69a10c7bd873f27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Thu, 1 Apr 2021 00:08:53 +0800 Subject: [PATCH 39/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG(docker=20=E9=83=A8?= =?UTF-8?q?=E7=BD=B2):=20docker-compose.yml=20=E6=8F=90=E4=BA=A4=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index fb3d0fd..a61dab7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -23,6 +23,7 @@ services: npm install --registry=https://registry.npm.taobao.org rm -rf /dvadmin-ui/dist npm run build:prod + npm run dev dvadmin-redis: From 9970eed34d1a23f4a85452bc96270a679024cab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Thu, 1 Apr 2021 00:11:04 +0800 Subject: [PATCH 40/42] =?UTF-8?q?!13=20=E5=8F=91=E5=B8=831.0=E6=AD=A3?= =?UTF-8?q?=E5=BC=8F=E7=89=88=E6=9C=AC=E5=89=8D=E5=90=88=E5=B9=B6=20*=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG(docker=20=E9=83=A8=E7=BD=B2):=20docker-co?= =?UTF-8?q?mpose.yml=20=E6=8F=90=E4=BA=A4=E4=BF=AE=E6=94=B9=20*=20?= =?UTF-8?q?=E6=96=87=E6=A1=A3(=E6=96=87=E6=A1=A3=E6=8F=90=E4=BA=A4):=20REA?= =?UTF-8?q?DME.md=20=E6=96=87=E6=A1=A3=20*=20=E6=96=87=E6=A1=A3(=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E4=BF=AE=E6=94=B9):=20README.md=20=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=20*=20=E4=BF=AE=E5=A4=8DBUG(=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=BE=9D=E8=B5=96):=20=E6=B7=BB=E5=8A=A0=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=20psutil=3D=3D5.8.0=20*=20=E4=BF=AE=E5=A4=8DBUG(?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E6=B6=88=E6=81=AF):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E6=B6=88=E6=81=AF=E6=9C=AA=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E8=BF=87=E6=BB=A4=20*=20Merge=20branch=20'dv?= =?UTF-8?q?admin-liqianglog'=20of=20https://gitee.com/liqianglog/djan?= =?UTF-8?q?=E2=80=A6=20*=20=E4=BF=AE=E5=A4=8DBUG(=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF):=20=E4=B8=AA=E4=BA=BA=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=B8=AD=E6=9C=AA=E8=AF=BB=E6=B6=88=E6=81=AF=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E9=94=99=E8=AF=AF=20*=20=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=8F=98=E5=8C=96(=E8=8E=B7=E5=8F=96=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3):=20admin=E7=94=A8=E6=88=B7=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E5=8F=AF=E6=9F=A5=E7=9C=8B=E5=85=A8=E9=83=A8=EF=BC=8C?= =?UTF-8?q?=E4=BE=BF=E4=BA=8E=E5=BC=80=E5=8F=91=20*=20=E4=BF=AE=E5=A4=8DBU?= =?UTF-8?q?G(=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86):=20=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=86=E7=A0=81bug=EF=BC=8CUserProfile?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E4=BA=BA=20*=20update=20dvadmin-backend/apps/vadmin/o?= =?UTF-8?q?p=5Fdrf/middleware.py.=20*=20update=20dvadmin-backend/apps/vadm?= =?UTF-8?q?in/op=5Fdrf/middleware.py.=20*=20=E4=BF=AE=E5=A4=8DBUG(?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E4=BF=A1=E6=81=AF&=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E5=85=AC=E5=91=8A):=20=E4=B8=AA=E4=BA=BA=E6=9C=AA=E8=AF=BB?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E5=85=AC=E5=91=8A=E6=95=B0=E9=87=8F=E9=94=99?= =?UTF-8?q?=E8=AF=AF=20*=20=E4=BF=AE=E5=A4=8DBUG(=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E4=BB=B6bug):=20=E6=97=A5=E5=BF=97=E4=B8=AD=E9=97=B4=E4=BB=B6?= =?UTF-8?q?=E5=AD=98=E5=85=A5=E6=A8=A1=E5=9D=97=E4=BF=A1=E6=81=AF=E4=B8=8D?= =?UTF-8?q?=E5=85=A8=20*=20Merge=20remote-tracking=20branch=20'remotes/ori?= =?UTF-8?q?gin/master'=20into=20dvadmin-liqianglog=20*=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8DBUG(=E6=8F=90=E4=BA=A4=E9=94=99=E8=AF=AF):=20DEMO=5FEN?= =?UTF-8?q?V=20*=20Merge=20remote-tracking=20branch=20'remotes/origin/dvad?= =?UTF-8?q?min-liqianglog'=20into=20=E2=80=A6=20*=20=E4=BF=AE=E5=A4=8DBUG(?= =?UTF-8?q?=E4=B8=AD=E9=97=B4=E4=BB=B6bug):=20=E6=97=A5=E5=BF=97=E4=B8=AD?= =?UTF-8?q?=E9=97=B4=E4=BB=B6=E5=AD=98=E5=85=A5=E6=A8=A1=E5=9D=97=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E4=B8=8D=E5=85=A8=20*=20!11=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=A4=9A=E4=B8=AAbug=20*=20=E4=BF=AE=E5=A4=8DBUG(=E4=B8=AD?= =?UTF-8?q?=E9=97=B4=E4=BB=B6bug):=20=E6=97=A5=E5=BF=97=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E4=BB=B6=E5=AD=98=E5=85=A5=E6=A8=A1=E5=9D=97=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=B8=8D=E5=85=A8=20*=20!10=20=E5=90=8E=E7=AB=AF=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=9D=83=E9=99=90=E9=AA=8C=E8=AF=81bug=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20*=20=E6=B5=8B=E8=AF=95(=E9=83=A8=E7=BD=B2=E6=B5=8B?= =?UTF-8?q?=E8=AF=95):=20*=20=E4=BF=AE=E5=A4=8DBUG(=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0):=20doc=EF=BC=8Cdocx=EF=BC=8Cxlsx=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E9=83=BD=E6=97=A0=E6=B3=95=E4=B8=8A=E4=BC=A0=E6=88=90?= =?UTF-8?q?=E5=8A=9F=20*=20=E4=BF=AE=E5=A4=8DBUG(=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=83=A8=E9=97=A8):=20=E9=83=A8=E9=97=A8=E9=87=8C=E9=9D=A2?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E7=94=A8=E6=88=B7=EF=BC=8C=E4=BE=9D=E7=84=B6?= =?UTF-8?q?=E8=83=BD=E5=A4=9F=E5=88=A0=E9=99=A4=E9=83=A8=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 +++++++++--- docker-compose.yml | 1 + dvadmin-backend/application/settings.py | 2 +- .../apps/vadmin/op_drf/middleware.py | 37 ++++++++++++------- .../apps/vadmin/permission/models/users.py | 8 ++-- .../apps/vadmin/permission/permissions.py | 20 ++++++++++ .../apps/vadmin/permission/serializers.py | 4 +- .../apps/vadmin/permission/views.py | 11 ++++-- .../permission/permission_userprofile.sql | 4 +- .../apps/vadmin/system/models/save_file.py | 2 +- dvadmin-backend/apps/vadmin/system/views.py | 3 +- .../apps/vadmin/utils/authentication.py | 4 +- .../apps/vadmin/utils/exceptions.py | 2 - dvadmin-backend/requirements.txt | 1 + dvadmin-ui/README.md | 12 +++--- dvadmin-ui/src/layout/components/Navbar.vue | 6 +-- dvadmin-ui/src/store/modules/user.js | 3 +- .../views/vadmin/permission/user/index.vue | 3 +- .../views/vadmin/system/message/Mymessage.vue | 8 ++-- 19 files changed, 103 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index ea9949d..139daa8 100644 --- a/README.md +++ b/README.md @@ -12,26 +12,25 @@ Django-Vue-Admin 是一套全部开源的快速开发平台,毫无保留给个 * 后端采用Python语言Django框架。 * 权限认证使用Jwt,支持多终端认证系统。 * 支持加载动态权限菜单,多方式轻松权限控制。 -* ~~高效率开发,使用代码生成器可以一键生成前后端代码。~~ -* 特别鸣谢:[RuoYi](https://gitee.com/y_project/RuoYi-Vue) ,[Vue-Element-Admin](https://github.com/PanJiaChen/vue-element-admin),[eladmin-web](https://gitee.com/elunez/eladmin-web?_from=gitee_search),[Gin-Vue-Admin](https://www.gin-vue-admin.com/)。 +* 特别鸣谢:[Gin-Vue-Admin](https://www.gin-vue-admin.com/),[RuoYi](https://gitee.com/y_project/RuoYi-Vue) ,[Vue-Element-Admin](https://github.com/PanJiaChen/vue-element-admin),[eladmin-web](https://gitee.com/elunez/eladmin-web?_from=gitee_search)。 ## QQ群 - QQ群号:812482043 -- 由于项目正在启步阶段,第一版预计3月底发,后序会慢慢维护其他版本,有什么不到位的请大家担待~ +- 二维码 ## 源码地址 -gitee地址:[https://gitee.com/liqianglog/django-vue-admin](https://gitee.com/liqianglog/django-vue-admin) +gitee地址(主推):[https://gitee.com/liqianglog/django-vue-admin](https://gitee.com/liqianglog/django-vue-admin) github地址:[https://github.com/liqianglog/django-vue-admin](https://github.com/liqianglog/django-vue-admin) ## 内置功能 -##### 预计3月底发布v1.0正式版本,个别功能开发中 [版本功能说明](https://gitee.com/liqianglog/django-vue-admin/wikis/releaseNote?sort_id=3615540) +##### 后期版本 [版本功能说明](https://gitee.com/liqianglog/django-vue-admin/wikis/releaseNote?sort_id=3615540) 1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 @@ -119,6 +118,21 @@ npm run build:prod 后端接口文档地址:http://127.0.0.1:8000/docs/ ~~~ +### docker-compose 运行 + +~~~shell +# 先安装docker-compose (自行百度安装),执行此命令等待安装 +docker-compose up +# 初始化后端数据(第一次执行即可) +docker exec -ti dvadmin-django bash +python manage.py init -y +exit + +前端地址:http://127.0.0.1:8080 +后端地址:http://127.0.0.1:8000 +账号:admin 密码:123456 +~~~ + ## 演示图 diff --git a/docker-compose.yml b/docker-compose.yml index fb3d0fd..a61dab7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -23,6 +23,7 @@ services: npm install --registry=https://registry.npm.taobao.org rm -rf /dvadmin-ui/dist npm run build:prod + npm run dev dvadmin-redis: diff --git a/dvadmin-backend/application/settings.py b/dvadmin-backend/application/settings.py index ee3fc5b..4b385f0 100644 --- a/dvadmin-backend/application/settings.py +++ b/dvadmin-backend/application/settings.py @@ -54,7 +54,6 @@ INSTALLED_APPS = [ ] MIDDLEWARE = [ - 'vadmin.op_drf.middleware.PermissionModeMiddleware', # 权限中间件 'corsheaders.middleware.CorsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', @@ -64,6 +63,7 @@ MIDDLEWARE = [ 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'vadmin.op_drf.middleware.ApiLoggingMiddleware', # 用于记录API访问日志 + 'vadmin.op_drf.middleware.PermissionModeMiddleware', # 权限中间件 ] # 允许跨域源 CORS_ORIGIN_ALLOW_ALL = CORS_ORIGIN_ALLOW_ALL diff --git a/dvadmin-backend/apps/vadmin/op_drf/middleware.py b/dvadmin-backend/apps/vadmin/op_drf/middleware.py index bf28947..0990a07 100644 --- a/dvadmin-backend/apps/vadmin/op_drf/middleware.py +++ b/dvadmin-backend/apps/vadmin/op_drf/middleware.py @@ -1,6 +1,7 @@ """ django中间件 """ +import json import logging import os @@ -11,7 +12,7 @@ from django.utils.deprecation import MiddlewareMixin from apps.vadmin.permission.models import Menu from apps.vadmin.system.models import OperationLog from ..utils.request_util import get_request_ip, get_request_data, get_request_path, get_browser, get_os, \ - get_login_location, get_request_canonical_path, get_request_user + get_login_location, get_request_canonical_path, get_request_user, get_verbose_name from ..utils.response import ErrorJsonResponse logger = logging.getLogger(__name__) @@ -42,9 +43,16 @@ class ApiLoggingMiddleware(MiddlewareMixin): body['password'] = '*' * len(body['password']) if not hasattr(response, 'data') or not isinstance(response.data, dict): response.data = {} + if not response.data and response.content: + try: + content = json.loads(response.content.decode()) + response.data = content if isinstance(content, dict) else {} + except: + pass + user = get_request_user(request) info = { 'request_ip': getattr(request, 'request_ip', 'unknown'), - 'creator': request.user, + 'creator': user if not isinstance(user, AnonymousUser) else None, 'dept_belong_id': getattr(request.user, 'dept_id', None), 'request_method': request.method, 'request_path': request.request_path, @@ -58,11 +66,14 @@ class ApiLoggingMiddleware(MiddlewareMixin): 'json_result': {"code": response.data.get('code'), "msg": response.data.get('msg')}, 'request_modular': request.session.get('model_name'), } - if isinstance(request.user, AnonymousUser): - info['creator'] = None log = OperationLog(**info) log.save() + def process_view(self, request, view_func, view_args, view_kwargs): + if hasattr(view_func, 'cls') and hasattr(view_func.cls, 'queryset'): + request.session['model_name'] = get_verbose_name(view_func.cls.queryset) + return + def process_request(self, request): self.__handle_request(request) @@ -85,14 +96,7 @@ class PermissionModeMiddleware(MiddlewareMixin): """ def process_request(self, request): - """ - 判断环境变量中,是否为演示模式(正常可忽略此判断) - :param request: - :return: - """ - white_list = ['/admin/logout/', '/admin/login/'] - if os.getenv('DEMO_ENV') and not request.method == 'GET' and request.path not in white_list: - return ErrorJsonResponse(data={}, msg=f'演示模式,不允许操作!') + return def has_interface_permission(self, request, method, view_path, user=None): """ @@ -130,18 +134,23 @@ class PermissionModeMiddleware(MiddlewareMixin): if user.is_superuser or (hasattr(user, 'role') and user.role.filter(status='1', admin=True).count()): return 20 # (3)user的角色有该接口权限, 是:通过, 否:不通过 - if view_path in user.get_user_interface_dict: + if view_path in user.get_user_interface_dict.get(method, []): return 30 return -10 def process_view(self, request, view_func, view_args, view_kwargs): + # 判断环境变量中,是否为演示模式(正常可忽略此判断) + white_list = ['/admin/logout/', '/admin/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'演示模式,不允许操作!') + if not settings.INTERFACE_PERMISSION: return user = get_request_user(request) if user and not isinstance(user, AnonymousUser): method = request.method.upper() - if method == 'GET': # GET 不设置接口权限 + if method == 'GET': # GET 不设置接口权限 return view_path = get_request_canonical_path(request, *view_args, **view_kwargs) auth_code = self.has_interface_permission(request, method, view_path, user) diff --git a/dvadmin-backend/apps/vadmin/permission/models/users.py b/dvadmin-backend/apps/vadmin/permission/models/users.py index 2fead2f..e609a2a 100644 --- a/dvadmin-backend/apps/vadmin/permission/models/users.py +++ b/dvadmin-backend/apps/vadmin/permission/models/users.py @@ -4,10 +4,10 @@ from django.contrib.auth.models import UserManager, AbstractUser from django.core.cache import cache from django.db.models import IntegerField, ForeignKey, CharField, TextField, ManyToManyField, CASCADE -from ...op_drf.fields import CreateDateTimeField, UpdateDateTimeField +from ...op_drf.models import CoreModel -class UserProfile(AbstractUser): +class UserProfile(AbstractUser, CoreModel): USER_TYPE_CHOICES = ( (0, "后台用户"), (1, "前台用户"), @@ -25,9 +25,6 @@ class UserProfile(AbstractUser): post = ManyToManyField(to='Post', verbose_name='关联岗位', db_constraint=False) role = ManyToManyField(to='Role', verbose_name='关联角色', db_constraint=False) dept = ForeignKey(to='Dept', verbose_name='归属部门', on_delete=CASCADE, db_constraint=False, null=True, blank=True) - dept_belong_id = CharField(max_length=64, verbose_name="数据归属部门", null=True, blank=True) - create_datetime = CreateDateTimeField() - update_datetime = UpdateDateTimeField() @property def get_user_interface_dict(self): @@ -52,6 +49,7 @@ class UserProfile(AbstractUser): :return: """ return cache.delete(f'permission_interface_dict_{self.username}') + class Meta: verbose_name = '用户管理' verbose_name_plural = verbose_name diff --git a/dvadmin-backend/apps/vadmin/permission/permissions.py b/dvadmin-backend/apps/vadmin/permission/permissions.py index 0186adb..3c09387 100644 --- a/dvadmin-backend/apps/vadmin/permission/permissions.py +++ b/dvadmin-backend/apps/vadmin/permission/permissions.py @@ -93,3 +93,23 @@ class CommonPermission(CustomPermission): self.message = f"没有此数据操作权限!" res = self.check_queryset(request, instance) return res + + +class DeptDestroyPermission(CustomPermission): + """ + 部门删除权限校验:判断部门下是否有用户存在,存在不可删除 + """ + message = '没有有操作权限' + + def has_permission(self, request: Request, view: APIView): + return True + + def check_queryset(self, request, instance): + if instance.values_list('userprofile', flat=True): + self.message = "该部门下有关联用户,无法删除!" + return False + return True + + def has_object_permission(self, request: Request, view: APIView, instance): + res = self.check_queryset(request, instance) + return res diff --git a/dvadmin-backend/apps/vadmin/permission/serializers.py b/dvadmin-backend/apps/vadmin/permission/serializers.py index f9bfaf3..8fc641e 100644 --- a/dvadmin-backend/apps/vadmin/permission/serializers.py +++ b/dvadmin-backend/apps/vadmin/permission/serializers.py @@ -226,8 +226,8 @@ class UserProfileSerializer(CustomModelSerializer): return False def get_unread_msg_count(self, obj: UserProfile): - return MessagePush.objects.filter(status='2').exclude(user=obj, - messagepushuser_message_push__is_read=True).count() + return MessagePush.objects.filter(status='2').exclude(messagepushuser_message_push__is_read=True, + messagepushuser_message_push__user=obj).count() class Meta: model = UserProfile diff --git a/dvadmin-backend/apps/vadmin/permission/views.py b/dvadmin-backend/apps/vadmin/permission/views.py index bec3b8e..8ece4fa 100644 --- a/dvadmin-backend/apps/vadmin/permission/views.py +++ b/dvadmin-backend/apps/vadmin/permission/views.py @@ -2,7 +2,7 @@ from django.contrib.auth import authenticate from rest_framework.request import Request from rest_framework.views import APIView -from .permissions import CommonPermission +from .permissions import CommonPermission, DeptDestroyPermission from ..op_drf.filters import DataLevelPermissionsFilter from ..op_drf.viewsets import CustomModelViewSet from ..permission.filters import MenuFilter, DeptFilter, PostFilter, RoleFilter, UserProfileFilter @@ -48,7 +48,10 @@ class GetRouters(APIView): return dict def get(self, request, format=None): - menus = Menu.objects.filter(role__userprofile=request.user) \ + kwargs = {} + if not request.user.is_superuser: + kwargs['role__userprofile'] = request.user + menus = Menu.objects.filter(**kwargs) \ .exclude(menuType='2').values('id', 'name', 'web_path', 'visible', 'status', 'isFrame', 'component_path', 'icon', 'parentId', 'orderNum', 'isCache').distinct() data = [] @@ -129,7 +132,7 @@ class DeptModelViewSet(CustomModelViewSet): filter_class = DeptFilter extra_filter_backends = [DataLevelPermissionsFilter] update_extra_permission_classes = (CommonPermission,) - destroy_extra_permission_classes = (CommonPermission,) + destroy_extra_permission_classes = (CommonPermission, DeptDestroyPermission) create_extra_permission_classes = (CommonPermission,) search_fields = ('deptName',) ordering = 'create_datetime' # 默认排序 @@ -359,7 +362,7 @@ class UserProfileModelViewSet(CustomModelViewSet): :return: """ instance = self.queryset.get(id=request.user.id) - instance.mobile = request.data.get('newPassword', None) + instance.password = request.data.get('newPassword', None) if not authenticate(username=request.user.username, password=request.data.get('oldPassword', None)): return ErrorResponse(msg='旧密码不正确!') instance.set_password(request.data.get('newPassword')) diff --git a/dvadmin-backend/apps/vadmin/scripts/permission/permission_userprofile.sql b/dvadmin-backend/apps/vadmin/scripts/permission/permission_userprofile.sql index e59fc9e..56e3630 100644 --- a/dvadmin-backend/apps/vadmin/scripts/permission/permission_userprofile.sql +++ b/dvadmin-backend/apps/vadmin/scripts/permission/permission_userprofile.sql @@ -33,8 +33,8 @@ -- ---------------------------- -- Records of permission_userprofile -- ---------------------------- -INSERT INTO `permission_userprofile` (id, password, last_login, is_superuser, first_name, last_name, is_staff, is_active, date_joined, username, secret, email, mobile, avatar, name, gender, remark, user_type, create_datetime, update_datetime, dept_id, dept_belong_id) VALUES (1, 'pbkdf2_sha256$150000$OjTMSXJgkzrE$jEQCjWbIbXwpN4k2z0o8Yvou1UQGuoJALyL/kGDZFd4=', '2021-02-27 06:20:28.214775', 1, '', '', 1, 1, '2021-02-27 06:20:09.188689', 'admin', '3704adf3-380f-4c27-a8da-60420e8cb4ab', 'admin@qq.com', NULL, NULL, '管理员', '2', '1', 2, '2021-02-27 06:20:09.263192', '2021-02-27 09:14:30.009998', 8, 1); -INSERT INTO `permission_userprofile` (id, password, last_login, is_superuser, first_name, last_name, is_staff, is_active, date_joined, username, secret, email, mobile, avatar, name, gender, remark, user_type, create_datetime, update_datetime, dept_id, dept_belong_id) VALUES (2, 'pbkdf2_sha256$150000$5Z9LSi7LpNms$xVguE/dOEpI4D95LjSaKm0xzG7vNSopUolANr8f/6/E=', NULL, 0, '', '', 0, 1, '2021-03-03 15:38:27.009893', 'dvadmin', 'b4c5d79a-f01c-4244-92f8-b5288eca1d50', NULL, NULL, NULL, '普通用户', '2', NULL, 0, '2021-03-03 15:38:27.010771', '2021-03-03 15:38:27.086069', 8, 1); +INSERT INTO `permission_userprofile` (id, password, last_login, is_superuser, first_name, last_name, is_staff, is_active, date_joined, username, secret, email, mobile, avatar, name, gender, remark, user_type, create_datetime, update_datetime, dept_id, dept_belong_id, creator_id) VALUES (1, 'pbkdf2_sha256$150000$OjTMSXJgkzrE$jEQCjWbIbXwpN4k2z0o8Yvou1UQGuoJALyL/kGDZFd4=', '2021-02-27 06:20:28.214775', 1, '', '', 1, 1, '2021-02-27 06:20:09.188689', 'admin', '3704adf3-380f-4c27-a8da-60420e8cb4ab', 'admin@qq.com', NULL, NULL, '管理员', '2', '1', 2, '2021-02-27 06:20:09.263192', '2021-02-27 09:14:30.009998', 1, 1, 1); +INSERT INTO `permission_userprofile` (id, password, last_login, is_superuser, first_name, last_name, is_staff, is_active, date_joined, username, secret, email, mobile, avatar, name, gender, remark, user_type, create_datetime, update_datetime, dept_id, dept_belong_id, creator_id) VALUES (2, 'pbkdf2_sha256$150000$5Z9LSi7LpNms$xVguE/dOEpI4D95LjSaKm0xzG7vNSopUolANr8f/6/E=', NULL, 0, '', '', 0, 1, '2021-03-03 15:38:27.009893', 'dvadmin', 'b4c5d79a-f01c-4244-92f8-b5288eca1d50', NULL, NULL, NULL, '普通用户', '2', NULL, 0, '2021-03-03 15:38:27.010771', '2021-03-03 15:38:27.086069', 1, 1, 1); -- ---------------------------- -- Table structure for permission_userprofile_post -- ---------------------------- diff --git a/dvadmin-backend/apps/vadmin/system/models/save_file.py b/dvadmin-backend/apps/vadmin/system/models/save_file.py index b43757d..30407cf 100644 --- a/dvadmin-backend/apps/vadmin/system/models/save_file.py +++ b/dvadmin-backend/apps/vadmin/system/models/save_file.py @@ -13,7 +13,7 @@ def files_path(instance, filename): class SaveFile(CoreModel): name = CharField(max_length=128, verbose_name="文件名称", null=True, blank=True) - type = CharField(max_length=32, verbose_name="文件类型", null=True, blank=True) + type = CharField(max_length=200, verbose_name="文件类型", null=True, blank=True) size = CharField(max_length=64, verbose_name="文件大小", null=True, blank=True) address = CharField(max_length=16, verbose_name="存储位置", null=True, blank=True) # 本地、阿里云、腾讯云.. source = CharField(max_length=16, verbose_name="文件来源", null=True, blank=True) # 导出、用户上传. diff --git a/dvadmin-backend/apps/vadmin/system/views.py b/dvadmin-backend/apps/vadmin/system/views.py index 05257cc..c2d716b 100644 --- a/dvadmin-backend/apps/vadmin/system/views.py +++ b/dvadmin-backend/apps/vadmin/system/views.py @@ -202,7 +202,7 @@ class MessagePushModelViewSet(CustomModelViewSet): serializer_class = MessagePushSerializer create_serializer_class = MessagePushCreateUpdateSerializer update_serializer_class = MessagePushCreateUpdateSerializer - extra_filter_backends = [DataLevelPermissionsFilter] + # extra_filter_backends = [DataLevelPermissionsFilter] update_extra_permission_classes = (CommonPermission,) destroy_extra_permission_classes = (CommonPermission,) create_extra_permission_classes = (CommonPermission,) @@ -217,6 +217,7 @@ class MessagePushModelViewSet(CustomModelViewSet): 获取用户自己消息列表 """ queryset = self.filter_queryset(self.get_queryset()) + queryset = queryset.filter(status=2) is_read = request.query_params.get('is_read', None) if is_read: if is_read == 'False': diff --git a/dvadmin-backend/apps/vadmin/utils/authentication.py b/dvadmin-backend/apps/vadmin/utils/authentication.py index cc3b781..4a51ca5 100644 --- a/dvadmin-backend/apps/vadmin/utils/authentication.py +++ b/dvadmin-backend/apps/vadmin/utils/authentication.py @@ -12,8 +12,8 @@ from django.utils.translation import ugettext as _ from rest_framework import exceptions from rest_framework_jwt.utils import jwt_decode_handler -from .decorators import exceptionHandler from .jwt_util import jwt_get_session_id +from ..permission.models.users import UserProfile logger = logging.getLogger(__name__) User = get_user_model() @@ -38,6 +38,8 @@ class OpAuthJwtAuthentication(object): raise exceptions.AuthenticationFailed(msg) except jwt.InvalidTokenError: raise exceptions.AuthenticationFailed() + except UserProfile.DoesNotExist: + raise exceptions.AuthenticationFailed() username = payload.get('username', None) if not username: diff --git a/dvadmin-backend/apps/vadmin/utils/exceptions.py b/dvadmin-backend/apps/vadmin/utils/exceptions.py index cbd065e..f018592 100644 --- a/dvadmin-backend/apps/vadmin/utils/exceptions.py +++ b/dvadmin-backend/apps/vadmin/utils/exceptions.py @@ -65,8 +65,6 @@ def op_exception_handler(ex, context): """ msg = '' code = '201' - request = context.get('request') - request.session['model_name'] = str(get_verbose_name(view=context.get('view'))) if isinstance(ex, AuthenticationFailed): code = 401 diff --git a/dvadmin-backend/requirements.txt b/dvadmin-backend/requirements.txt index 5e06ebc..2ea4f69 100644 --- a/dvadmin-backend/requirements.txt +++ b/dvadmin-backend/requirements.txt @@ -26,3 +26,4 @@ xlrd==2.0.1 coreapi==2.3.3 user-agents==2.2.0 eventlet==0.30.2 +psutil==5.8.0 diff --git a/dvadmin-ui/README.md b/dvadmin-ui/README.md index a857617..b0823d8 100755 --- a/dvadmin-ui/README.md +++ b/dvadmin-ui/README.md @@ -2,22 +2,22 @@ ```bash # 克隆项目 -git clone https://gitee.com/y_project/RuoYi-Vue +git clone https://gitee.com/liqianglog/django-vue-admin.git # 进入项目目录 -cd ruoyi-ui +cd dvadmin-ui # 安装依赖 -npm install - -# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 npm install --registry=https://registry.npm.taobao.org # 启动服务 npm run dev + +# 浏览器访问 http://localhost:8080 +# .env.development 文件中可配置启动端口等参数 ``` -浏览器访问 http://localhost:80 +浏览器访问 http://localhost:8080 ## 发布 diff --git a/dvadmin-ui/src/layout/components/Navbar.vue b/dvadmin-ui/src/layout/components/Navbar.vue index c300c63..76e7800 100755 --- a/dvadmin-ui/src/layout/components/Navbar.vue +++ b/dvadmin-ui/src/layout/components/Navbar.vue @@ -14,7 +14,7 @@
- +
@@ -81,11 +81,11 @@ export default { }, data() { return { - count: store.getters.unread_msg_count, + count: store.unread_msg_count, }; }, computed: { - ...mapGetters(["sidebar", "avatar", "device"]), + ...mapGetters(["sidebar", "avatar", "device", "unread_msg_count"]), setting: { get() { return this.$store.state.settings.showSettings; diff --git a/dvadmin-ui/src/store/modules/user.js b/dvadmin-ui/src/store/modules/user.js index 895a689..9e4b5a5 100755 --- a/dvadmin-ui/src/store/modules/user.js +++ b/dvadmin-ui/src/store/modules/user.js @@ -7,7 +7,8 @@ const user = { name: '', avatar: '', roles: [], - permissions: [] + permissions: [], + unread_msg_count: 0 }, mutations: { diff --git a/dvadmin-ui/src/views/vadmin/permission/user/index.vue b/dvadmin-ui/src/views/vadmin/permission/user/index.vue index f11d209..35caf58 100755 --- a/dvadmin-ui/src/views/vadmin/permission/user/index.vue +++ b/dvadmin-ui/src/views/vadmin/permission/user/index.vue @@ -161,7 +161,7 @@ - {{role.roleName}} + {{role.roleName}} @@ -648,6 +648,7 @@ this.$refs['form'].validate(valid => { if (valid) { if (this.form.id != undefined) { + this.form.creator = undefined updateUser(this.form).then(response => { this.msgSuccess('修改成功') this.open = false diff --git a/dvadmin-ui/src/views/vadmin/system/message/Mymessage.vue b/dvadmin-ui/src/views/vadmin/system/message/Mymessage.vue index 1bbcd87..43a2581 100644 --- a/dvadmin-ui/src/views/vadmin/system/message/Mymessage.vue +++ b/dvadmin-ui/src/views/vadmin/system/message/Mymessage.vue @@ -103,9 +103,11 @@ // 修改通知查询状态 if (this.badgeType === "danger") { updateIsRead(this.showingMsgItem).then(response => { - store.getters.unread_msg_count - this.open = false; - this.getList(); + if(response.code === 200){ + store.commit('SET_UNREAD_MSG_COUNT', store.getters.unread_msg_count - 1); + this.open = false; + this.getList(); + } }); } } From 6591b7f48e489e04f83517ffccfcf16e4654e3b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Thu, 1 Apr 2021 00:17:28 +0800 Subject: [PATCH 41/42] =?UTF-8?q?=E6=96=87=E6=A1=A3(=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E6=8F=90=E4=BA=A4):=20README.md=20=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 139daa8..ae3166f 100644 --- a/README.md +++ b/README.md @@ -43,11 +43,10 @@ github地址:[https://github.com/liqianglog/django-vue-admin](https://github.c 9. 通知公告:发布通知公告给所有人,进行消息的通知。 10. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 11. 登录日志:系统登录日志记录查询包含登录异常。 -12. 在线用户:当前系统中活跃用户状态监控、用户强退功能。 -13. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 -14. 用户注册:新用户注册页面。 -15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈、celery 当前状态等相关信息。 -16. 在线构建器:拖动表单元素生成相应的HTML代码。 +12. 定时日志:celery定时任务执行日志记录。 +13. 在线用户:当前系统中活跃用户状态监控、用户强退功能。 +14. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 +15. 在线构建器:拖动表单元素生成相应的HTML代码。 ## 在线体验 From 495e2855f455640c5177d5e75673fdb5a5b83e5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Thu, 1 Apr 2021 00:19:46 +0800 Subject: [PATCH 42/42] =?UTF-8?q?!14=20=E6=96=87=E6=A1=A3(=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=8F=90=E4=BA=A4):=20README.md=20=E6=96=87=E6=A1=A3?= =?UTF-8?q?=20*=20=E6=96=87=E6=A1=A3(=E6=96=87=E6=A1=A3=E6=8F=90=E4=BA=A4)?= =?UTF-8?q?:=20README.md=20=E6=96=87=E6=A1=A3=20*=20=E4=BF=AE=E5=A4=8DBUG(?= =?UTF-8?q?docker=20=E9=83=A8=E7=BD=B2):=20docker-compose.yml=20=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E4=BF=AE=E6=94=B9=20*=20=E6=96=87=E6=A1=A3(=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=8F=90=E4=BA=A4):=20README.md=20=E6=96=87=E6=A1=A3?= =?UTF-8?q?=20*=20=E6=96=87=E6=A1=A3(=E6=96=87=E6=A1=A3=E4=BF=AE=E6=94=B9)?= =?UTF-8?q?:=20README.md=20=E6=96=87=E6=A1=A3=E4=BF=AE=E6=94=B9=20*=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG(=E6=B7=BB=E5=8A=A0=E4=BE=9D=E8=B5=96):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BE=9D=E8=B5=96=20psutil=3D=3D5.8.0=20*=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG(=E9=80=9A=E7=9F=A5=E6=B6=88=E6=81=AF):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=80=9A=E7=9F=A5=E6=B6=88=E6=81=AF=E6=9C=AA?= =?UTF-8?q?=E5=8F=91=E5=B8=83=E7=8A=B6=E6=80=81=E8=BF=87=E6=BB=A4=20*=20Me?= =?UTF-8?q?rge=20branch=20'dvadmin-liqianglog'=20of=20https://gitee.com/li?= =?UTF-8?q?qianglog/djan=E2=80=A6=20*=20=E4=BF=AE=E5=A4=8DBUG(=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E4=BF=A1=E6=81=AF):=20=E4=B8=AA=E4=BA=BA=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E4=B8=AD=E6=9C=AA=E8=AF=BB=E6=B6=88=E6=81=AF=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=95=B0=E9=87=8F=E9=94=99=E8=AF=AF=20*=20=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=8F=98=E5=8C=96(=E8=8E=B7=E5=8F=96=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E6=8E=A5=E5=8F=A3):=20admin=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=8F=AF=E6=9F=A5=E7=9C=8B=E5=85=A8=E9=83=A8?= =?UTF-8?q?=EF=BC=8C=E4=BE=BF=E4=BA=8E=E5=BC=80=E5=8F=91=20*=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8DBUG(=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86):=20=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E4=BF=AE=E6=94=B9=E5=AF=86=E7=A0=81bug=EF=BC=8CUserPr?= =?UTF-8?q?ofile=E6=A8=A1=E5=9E=8B=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E4=BA=BA=20*=20update=20dvadmin-backend/apps?= =?UTF-8?q?/vadmin/op=5Fdrf/middleware.py.=20*=20update=20dvadmin-backend/?= =?UTF-8?q?apps/vadmin/op=5Fdrf/middleware.py.=20*=20=E4=BF=AE=E5=A4=8DBUG?= =?UTF-8?q?(=E4=B8=AA=E4=BA=BA=E4=BF=A1=E6=81=AF&=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E5=85=AC=E5=91=8A):=20=E4=B8=AA=E4=BA=BA=E6=9C=AA=E8=AF=BB?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E5=85=AC=E5=91=8A=E6=95=B0=E9=87=8F=E9=94=99?= =?UTF-8?q?=E8=AF=AF=20*=20=E4=BF=AE=E5=A4=8DBUG(=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E4=BB=B6bug):=20=E6=97=A5=E5=BF=97=E4=B8=AD=E9=97=B4=E4=BB=B6?= =?UTF-8?q?=E5=AD=98=E5=85=A5=E6=A8=A1=E5=9D=97=E4=BF=A1=E6=81=AF=E4=B8=8D?= =?UTF-8?q?=E5=85=A8=20*=20Merge=20remote-tracking=20branch=20'remotes/ori?= =?UTF-8?q?gin/master'=20into=20dvadmin-liqianglog=20*=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8DBUG(=E6=8F=90=E4=BA=A4=E9=94=99=E8=AF=AF):=20DEMO=5FEN?= =?UTF-8?q?V=20*=20Merge=20remote-tracking=20branch=20'remotes/origin/dvad?= =?UTF-8?q?min-liqianglog'=20into=20=E2=80=A6=20*=20=E4=BF=AE=E5=A4=8DBUG(?= =?UTF-8?q?=E4=B8=AD=E9=97=B4=E4=BB=B6bug):=20=E6=97=A5=E5=BF=97=E4=B8=AD?= =?UTF-8?q?=E9=97=B4=E4=BB=B6=E5=AD=98=E5=85=A5=E6=A8=A1=E5=9D=97=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E4=B8=8D=E5=85=A8=20*=20!11=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=A4=9A=E4=B8=AAbug=20*=20=E4=BF=AE=E5=A4=8DBUG(=E4=B8=AD?= =?UTF-8?q?=E9=97=B4=E4=BB=B6bug):=20=E6=97=A5=E5=BF=97=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E4=BB=B6=E5=AD=98=E5=85=A5=E6=A8=A1=E5=9D=97=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=B8=8D=E5=85=A8=20*=20!10=20=E5=90=8E=E7=AB=AF=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=9D=83=E9=99=90=E9=AA=8C=E8=AF=81bug=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20*=20=E6=B5=8B=E8=AF=95(=E9=83=A8=E7=BD=B2=E6=B5=8B?= =?UTF-8?q?=E8=AF=95):=20*=20=E4=BF=AE=E5=A4=8DBUG(=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0):=20doc=EF=BC=8Cdocx=EF=BC=8Cxlsx=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E9=83=BD=E6=97=A0=E6=B3=95=E4=B8=8A=E4=BC=A0=E6=88=90?= =?UTF-8?q?=E5=8A=9F=20*=20=E4=BF=AE=E5=A4=8DBUG(=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=83=A8=E9=97=A8):=20=E9=83=A8=E9=97=A8=E9=87=8C=E9=9D=A2?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E7=94=A8=E6=88=B7=EF=BC=8C=E4=BE=9D=E7=84=B6?= =?UTF-8?q?=E8=83=BD=E5=A4=9F=E5=88=A0=E9=99=A4=E9=83=A8=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 139daa8..ae3166f 100644 --- a/README.md +++ b/README.md @@ -43,11 +43,10 @@ github地址:[https://github.com/liqianglog/django-vue-admin](https://github.c 9. 通知公告:发布通知公告给所有人,进行消息的通知。 10. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 11. 登录日志:系统登录日志记录查询包含登录异常。 -12. 在线用户:当前系统中活跃用户状态监控、用户强退功能。 -13. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 -14. 用户注册:新用户注册页面。 -15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈、celery 当前状态等相关信息。 -16. 在线构建器:拖动表单元素生成相应的HTML代码。 +12. 定时日志:celery定时任务执行日志记录。 +13. 在线用户:当前系统中活跃用户状态监控、用户强退功能。 +14. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 +15. 在线构建器:拖动表单元素生成相应的HTML代码。 ## 在线体验