From 8cfa767c56cdd6c2d2536868ea9ebf5b9edb9a54 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 2 Jul 2020 12:17:28 +0800 Subject: [PATCH] =?UTF-8?q?permission=5Fdata=E5=8A=A0=E5=85=A5=E6=80=A7?= =?UTF-8?q?=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/api/implementrule.js | 31 ++ .../implementrule/implementrulecreate.vue | 326 +++++++++--------- .../implementrule/implementruleupdate.vue | 311 ++++++++--------- client/src/views/implementrule/unittype.vue | 190 ++++++++++ client/src/views/standard/standardchoose.vue | 150 ++++++++ client/src/views/system/dict.vue | 6 +- .../migrations/0007_auto_20200629_1646.py | 18 + server/apps/certset/models.py | 2 +- server/apps/certset/serializers.py | 9 +- server/apps/certset/views.py | 16 +- server/apps/crm/views.py | 2 +- server/apps/system/mixins.py | 26 ++ server/apps/system/permission.py | 6 +- server/apps/system/permission_data.py | 9 +- server/apps/system/serializers.py | 4 +- server/apps/system/views.py | 8 +- server/utils/queryset.py | 2 +- 17 files changed, 767 insertions(+), 349 deletions(-) create mode 100644 client/src/views/implementrule/unittype.vue create mode 100644 client/src/views/standard/standardchoose.vue create mode 100644 server/apps/certset/migrations/0007_auto_20200629_1646.py diff --git a/client/src/api/implementrule.js b/client/src/api/implementrule.js index 7ab63dd..2431939 100644 --- a/client/src/api/implementrule.js +++ b/client/src/api/implementrule.js @@ -36,4 +36,35 @@ export function deleteImplementRule(id) { url: `/certset/implementrule/${id}/`, method: 'delete' }) +} + +export function getUnitTypeList(query) { + return request({ + url: '/certset/unittype/', + method: 'get', + params: query + }) +} + +export function createUnitType(data) { + return request({ + url: '/certset/unittype/', + method: 'post', + data + }) +} + +export function updateUnitType(id, data) { + return request({ + url: `/certset/unittype/${id}/`, + method: 'put', + data + }) +} + +export function deleteUnitType(id) { + return request({ + url: `/certset/unittype/${id}/`, + method: 'delete' + }) } \ No newline at end of file diff --git a/client/src/views/implementrule/implementrulecreate.vue b/client/src/views/implementrule/implementrulecreate.vue index 914d124..3bb2798 100644 --- a/client/src/views/implementrule/implementrulecreate.vue +++ b/client/src/views/implementrule/implementrulecreate.vue @@ -1,144 +1,149 @@ diff --git a/client/src/views/standard/standardchoose.vue b/client/src/views/standard/standardchoose.vue new file mode 100644 index 0000000..c50f90a --- /dev/null +++ b/client/src/views/standard/standardchoose.vue @@ -0,0 +1,150 @@ + + diff --git a/client/src/views/system/dict.vue b/client/src/views/system/dict.vue index dfeb466..8ab9097 100644 --- a/client/src/views/system/dict.vue +++ b/client/src/views/system/dict.vue @@ -203,10 +203,7 @@ export default { search:'', dictList: [], listLoading: true, - listQuery: { - page: 1, - page_size: 20 - }, + listQuery: {}, dgV1: false, dgT1: 'new', rule1: { @@ -239,7 +236,6 @@ export default { return data.label.indexOf(value) !== -1 }, handleDictTypeClick(obj, node, vue) { - this.listQuery.page = 1 this.listQuery.type = obj.id this.getList() }, diff --git a/server/apps/certset/migrations/0007_auto_20200629_1646.py b/server/apps/certset/migrations/0007_auto_20200629_1646.py new file mode 100644 index 0000000..a796fc0 --- /dev/null +++ b/server/apps/certset/migrations/0007_auto_20200629_1646.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.7 on 2020-06-29 08:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('certset', '0006_implementrule_path'), + ] + + operations = [ + migrations.AlterField( + model_name='unittype', + name='name', + field=models.CharField(max_length=1000, unique=True, verbose_name='单元类型名'), + ), + ] diff --git a/server/apps/certset/models.py b/server/apps/certset/models.py index 9e72cde..24efe97 100644 --- a/server/apps/certset/models.py +++ b/server/apps/certset/models.py @@ -55,7 +55,7 @@ class ImplementRule(CommonAModel): class UnitType(CommonAModel): - name = models.CharField('单元类型名', max_length=1000) + name = models.CharField('单元类型名', max_length=1000, unique=True) standard = models.ForeignKey(Standard, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='采用标准', related_name='unittype_standard') implementrule = models.ForeignKey(ImplementRule, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='所属规则', related_name='unittype_implementrule') description = models.TextField('描述', null=True, blank=True) diff --git a/server/apps/certset/serializers.py b/server/apps/certset/serializers.py index f046e1d..6eb887b 100644 --- a/server/apps/certset/serializers.py +++ b/server/apps/certset/serializers.py @@ -32,6 +32,13 @@ class ImplementRuleListSerializer(serializers.ModelSerializer): return obj.get_cert_type_display() class UnitTypeSerializer(serializers.ModelSerializer): + standard_ = StandardSerializer(source='standard', read_only=True) class Meta: model = UnitType - fields = '__all__' \ No newline at end of file + fields = '__all__' + + @staticmethod + def setup_eager_loading(queryset): + """ Perform necessary eager loading of data. """ + queryset = queryset.select_related('standard','implementrule') + return queryset \ No newline at end of file diff --git a/server/apps/certset/views.py b/server/apps/certset/views.py index 0bfad1e..554064f 100644 --- a/server/apps/certset/views.py +++ b/server/apps/certset/views.py @@ -40,5 +40,19 @@ class UnitTypedViewSet(ModelViewSet): queryset = UnitType.objects serializer_class = UnitTypeSerializer search_fields = ['name'] - filterset_fields = ['name'] + filterset_fields = ['name','implementrule'] ordering = ['-create_time'] + + def paginate_queryset(self, queryset): + """ + 如果查询参数里没有page且含有参数implementrule则不分页,否则请求分页 + """ + if ((not self.request.query_params.get('page', None)) and (self.request.query_params.get('implementrule', None))) or (self.paginator is None): + return None + return self.paginator.paginate_queryset(queryset, self.request, view=self) + + def get_queryset(self): + queryset = self.queryset + if hasattr(self.get_serializer_class(), 'setup_eager_loading'): + queryset = self.get_serializer_class().setup_eager_loading(queryset) # 性能优化 + return queryset \ No newline at end of file diff --git a/server/apps/crm/views.py b/server/apps/crm/views.py index e294013..7b9aea3 100644 --- a/server/apps/crm/views.py +++ b/server/apps/crm/views.py @@ -11,4 +11,4 @@ class EntBaseInfoViewSet(ModelViewSet): serializer_class = StandardSerializer search_fields = ['name', 'code', 'status', 'implement_date'] filterset_fields = ['status'] - ordering = ['-create_time'] + ordering = ['-create_time'] \ No newline at end of file diff --git a/server/apps/system/mixins.py b/server/apps/system/mixins.py index acf89cd..73624ad 100644 --- a/server/apps/system/mixins.py +++ b/server/apps/system/mixins.py @@ -1,6 +1,7 @@ from rest_framework import status from rest_framework.response import Response from rest_framework.settings import api_settings +from django.db.models.query import QuerySet class CreateUpdateModelAMixin: """ @@ -22,4 +23,29 @@ class CreateUpdateModelBMixin: def perform_update(self, serializer): serializer.save(update_by = self.request.user) +class CreateUpdateCustomMixin: + """ + 整合 + """ + def perform_create(self, serializer): + if hasattr(self.queryset.model, 'belong_dept'): + serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept) + else: + serializer.save(create_by = self.request.user) + def perform_update(self, serializer): + serializer.save(update_by = self.request.user) + +class OptimizationMixin: + """ + 性能优化,需要在序列化器里定义setup_eager_loading,可在必要的View下继承 + """ + def get_queryset(self): + queryset = self.queryset + if isinstance(queryset, QuerySet): + # Ensure queryset is re-evaluated on each request. + queryset = queryset.all() + if hasattr(self.get_serializer_class(), 'setup_eager_loading'): + queryset = self.get_serializer_class().setup_eager_loading(queryset) # 性能优化 + return queryset + \ No newline at end of file diff --git a/server/apps/system/permission.py b/server/apps/system/permission.py index 49c0822..14c5136 100644 --- a/server/apps/system/permission.py +++ b/server/apps/system/permission.py @@ -18,8 +18,8 @@ def get_permission_list(user): perms = perms | i.perms.all() perms_list = perms.values_list('method', flat=True) perms_list = list(set(perms_list)) - cache.set(user.username, perms_list) - cache.persist(user.username) + cache.set(user.username + '__perms', perms_list) + # cache.persist(user.username) return perms_list @@ -35,7 +35,7 @@ class RbacPermission(BasePermission): :param view: :return: """ - perms = cache.get(request.user) + perms = cache.get(request.user.username + '__perms') if not perms: perms = get_permission_list(request.user) if perms: diff --git a/server/apps/system/permission_data.py b/server/apps/system/permission_data.py index f5f8d5e..6ba4d69 100644 --- a/server/apps/system/permission_data.py +++ b/server/apps/system/permission_data.py @@ -1,15 +1,17 @@ from django.db.models import Q from django.db.models.query import QuerySet from rest_framework.generics import GenericAPIView - +from apps.system.mixins import CreateUpdateModelBMixin from utils.queryset import get_child_queryset2 -class RbacFilterSet(GenericAPIView): +class RbacFilterSet(CreateUpdateModelBMixin, GenericAPIView): """ 数据权限控权返回的queryset 在必须的View下继承 需要控数据权限的表需有belong_dept, create_by, update_by字段(部门, 创建人, 编辑人) + 带性能优化 + 包括必要的创建和编辑操作 """ def get_queryset(self): assert self.queryset is not None, ( @@ -47,7 +49,8 @@ class RbacFilterSet(GenericAPIView): elif '仅本人' in data_range: queryset = queryset.filter(Q(create_by=user)|Q(update_by=user)) return queryset - + if hasattr(self.get_serializer_class(), 'setup_eager_loading'): + queryset = self.get_serializer_class().setup_eager_loading(queryset) # 性能优化 return queryset diff --git a/server/apps/system/serializers.py b/server/apps/system/serializers.py index 8cff64f..bac62ae 100644 --- a/server/apps/system/serializers.py +++ b/server/apps/system/serializers.py @@ -85,8 +85,8 @@ class UserListSerializer(serializers.ModelSerializer): class Meta: model = User - fields = ('id', 'name', 'phone', 'email', 'position', - 'username', 'is_active', 'date_joined', 'dept_name', 'dept', 'roles', 'avatar') + fields = ['id', 'name', 'phone', 'email', 'position', + 'username', 'is_active', 'date_joined', 'dept_name', 'dept', 'roles', 'avatar'] @staticmethod def setup_eager_loading(queryset): diff --git a/server/apps/system/views.py b/server/apps/system/views.py index d4c0cb7..f150b37 100644 --- a/server/apps/system/views.py +++ b/server/apps/system/views.py @@ -83,9 +83,11 @@ class DictViewSet(ModelViewSet): def paginate_queryset(self, queryset): """ - 如果查询参数里有type或type__code,则不分页,否则请求分页 + 如果查询参数里没有page但有type或type__code时则不分页,否则请求分页 """ - if (self.request.query_params.get('type__code', None)) or (self.request.query_params.get('type', None)) or (self.paginator is None): + if self.paginator is None: + return None + if (not self.request.query_params.get('page', None)) and ((self.request.query_params.get('type__code', None)) or (self.request.query_params.get('type', None))): return None return self.paginator.paginate_queryset(queryset, self.request, view=self) @@ -158,7 +160,7 @@ class UserViewSet(ModelViewSet): """ perms_map = {'get': '*', 'post': 'user_create', 'put': 'user_update', 'delete': 'user_delete'} - queryset = User.objects.order_by('-id') + queryset = User.objects serializer_class = UserListSerializer filterset_class = UserFilter search_fields = ['username', 'name', 'phone', 'email'] diff --git a/server/utils/queryset.py b/server/utils/queryset.py index 102b10a..80c1d3d 100644 --- a/server/utils/queryset.py +++ b/server/utils/queryset.py @@ -45,7 +45,7 @@ def get_child_queryset2(obj, hasParent=True): ''' 获取所有子集 obj实例 - 数据表需包含pid字段 + 数据表需包含parent字段 是否包含父默认True ''' cls = type(obj)