From d2a9034c20edd83e939f994847682289eda6681e Mon Sep 17 00:00:00 2001 From: caoqianming Date: Sat, 27 Jun 2020 21:56:14 +0800 Subject: [PATCH] consumer perm --- test_client/src/api/crm.js | 35 ++++ test_client/src/router/index.js | 6 + test_client/src/views/crm/consumerrole.vue | 178 ++++++++++++++++++ test_mini/pages/material/index.js | 5 +- test_server/crm/admin.py | 2 + .../crm/migrations/0015_auto_20200627_1413.py | 52 +++++ test_server/crm/models.py | 38 +++- test_server/crm/permission.py | 8 +- test_server/crm/serializers.py | 13 +- test_server/crm/urls.py | 4 +- test_server/crm/views.py | 43 ++++- test_server/examtest/views.py | 4 +- test_server/question/views.py | 4 +- 13 files changed, 369 insertions(+), 23 deletions(-) create mode 100644 test_client/src/views/crm/consumerrole.vue create mode 100644 test_server/crm/migrations/0015_auto_20200627_1413.py diff --git a/test_client/src/api/crm.js b/test_client/src/api/crm.js index dd1a3f5..7a8571f 100644 --- a/test_client/src/api/crm.js +++ b/test_client/src/api/crm.js @@ -83,4 +83,39 @@ export function unbindConsumer(id) { url: `/crm/consumer/${id}/unbind`, method: 'get', }) +} + +export function getConsumerRoleAll(query) { + return request({ + url: '/crm/consumerrole/', + method: 'get', + params: query + }) +} +export function createConsumerRole(data) { + return request({ + url: '/crm/consumerrole/', + method: 'post', + data + }) +} +export function updateConsumerRole(id, data) { + return request({ + url: `/crm/consumerrole/${id}/`, + method: 'put', + data + }) +} +export function deleteConsumerRole(id) { + return request({ + url: `/crm/consumerrole/${id}/`, + method: 'delete', +}) +} +export function getConsumerPermAll(query) { + return request({ + url: '/crm/consumerperm/', + method: 'get', + params: query + }) } \ No newline at end of file diff --git a/test_client/src/router/index.js b/test_client/src/router/index.js index 2e7a76e..6a3bc93 100644 --- a/test_client/src/router/index.js +++ b/test_client/src/router/index.js @@ -117,6 +117,12 @@ export const asyncRoutes = [ component: () => import('@/views/crm/consumer.vue'), meta: { title: '学员列表', icon: '', perms: ['consumer_list'] } }, + { + path: 'consumerrule', + name: 'ConsumerRule', + component: () => import('@/views/crm/consumerrole.vue'), + meta: { title: '客户角色', icon: '', perms: ['consumerrole_view'] } + }, ] }, diff --git a/test_client/src/views/crm/consumerrole.vue b/test_client/src/views/crm/consumerrole.vue new file mode 100644 index 0000000..02fcf2d --- /dev/null +++ b/test_client/src/views/crm/consumerrole.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/test_mini/pages/material/index.js b/test_mini/pages/material/index.js index 9f92b69..1b6dd92 100644 --- a/test_mini/pages/material/index.js +++ b/test_mini/pages/material/index.js @@ -98,6 +98,9 @@ Page({ }, downFile:function(e){ var that = this + wx.showLoading({ + title: '正在下载...', + }) api.request('/cms/material/'+e.currentTarget.dataset.id+'/down/', 'GET').then(res => { that.data.results[e.currentTarget.dataset.index].down_count = res.data.down_count var fileurl = getApp().globalData.host + res.data.path @@ -140,7 +143,7 @@ Page({ wx.hideLoading() console.log('打开文档成功') }, fail: function (e) { - console.log(e) + wx.hideLoading() } }) } diff --git a/test_server/crm/admin.py b/test_server/crm/admin.py index ca63135..81086ea 100644 --- a/test_server/crm/admin.py +++ b/test_server/crm/admin.py @@ -3,3 +3,5 @@ from crm import models # Register your models here. admin.site.register(models.Company) admin.site.register(models.Consumer) +admin.site.register(models.ConsumerPerm) +admin.site.register(models.ConsumerRole) diff --git a/test_server/crm/migrations/0015_auto_20200627_1413.py b/test_server/crm/migrations/0015_auto_20200627_1413.py new file mode 100644 index 0000000..11ee9cb --- /dev/null +++ b/test_server/crm/migrations/0015_auto_20200627_1413.py @@ -0,0 +1,52 @@ +# Generated by Django 3.0.5 on 2020-06-27 06:13 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('crm', '0014_auto_20200502_1054'), + ] + + operations = [ + migrations.CreateModel( + name='ConsumerPerm', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_delete', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=30, unique=True, verbose_name='名称')), + ('code', models.CharField(max_length=50, unique=True, verbose_name='方法/代号')), + ('pid', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='crm.ConsumerPerm', verbose_name='父')), + ], + options={ + 'verbose_name': '客户权限表', + 'verbose_name_plural': '客户权限表', + }, + ), + migrations.AlterField( + model_name='company', + name='name', + field=models.CharField(max_length=60, unique=True, verbose_name='名称'), + ), + migrations.CreateModel( + name='ConsumerRole', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_delete', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=30, unique=True, verbose_name='名称')), + ('description', models.CharField(blank=True, max_length=50, null=True, verbose_name='描述')), + ('perms', models.ManyToManyField(blank=True, to='crm.ConsumerPerm', verbose_name='功能权限')), + ], + options={ + 'verbose_name': '客户角色表', + 'verbose_name_plural': '客户角色表', + }, + ), + ] diff --git a/test_server/crm/models.py b/test_server/crm/models.py index b1a68a4..be3d469 100644 --- a/test_server/crm/models.py +++ b/test_server/crm/models.py @@ -18,7 +18,37 @@ class Company(CommonModel): def __str__(self): return self.name + +class ConsumerPerm(CommonModel): + """ + 权限表 + """ + name = models.CharField(max_length=30, unique=True, verbose_name="名称") + code = models.CharField(max_length=50, verbose_name="方法/代号", unique=True) + pid = models.ForeignKey("self", null=True, blank=True, on_delete=models.SET_NULL, verbose_name="父") + + class Meta: + verbose_name = '客户权限表' + verbose_name_plural = verbose_name + + def __str__(self): + return self.code +class ConsumerRole(CommonModel): + """ + 客户角色表 + """ + name = models.CharField(max_length=30, unique=True, verbose_name="名称") + perms = models.ManyToManyField(ConsumerPerm, blank=True, verbose_name="功能权限") + description = models.CharField(max_length=50, blank=True, null=True, verbose_name="描述") + + class Meta: + verbose_name = '客户角色表' + verbose_name_plural = verbose_name + + def __str__(self): + return self.name + class Consumer(SoftCommonModel): ''' 学员 @@ -33,6 +63,7 @@ class Consumer(SoftCommonModel): workscope = models.ForeignKey(WorkScope, verbose_name='工作类别', on_delete=models.SET_NULL, null=True, blank=True) collects = models.ManyToManyField(Question, verbose_name='收藏试题') remain_count = models.IntegerField('体验次数', default=3) + role = models.ForeignKey(ConsumerRole, verbose_name='用户角色', default=ConsumerRole.objects.get(name='游客'), on_delete=models.SET_NULL, null=True, blank=True) class Meta: @@ -42,13 +73,6 @@ class Consumer(SoftCommonModel): def __str__(self): return self.name -# class ConsumerPerm(CommonModel): -# """ -# 权限表 -# """ - - - class PaySubject(CommonModel): ''' 付费学科关联表 diff --git a/test_server/crm/permission.py b/test_server/crm/permission.py index bd9666a..6dec745 100644 --- a/test_server/crm/permission.py +++ b/test_server/crm/permission.py @@ -5,22 +5,20 @@ from rest_framework.permissions import IsAuthenticated # 学员接口列表 ConsumerPerms = [ - 'paper_list', + 'paper_view', 'gen_monitest', - 'questioncat_list', + 'questioncat_view', 'my_collects', 'my_subjects', 'my_examtest', - 'examtest_create', 'exercise', 'down_material' ] VistorPerms = [ 'gen_monitest', - 'questioncat_list', + 'questioncat_view', 'my_examtest', - 'examtest_create' ] class MyPermission(RbacPermission): diff --git a/test_server/crm/serializers.py b/test_server/crm/serializers.py index 4fa6fca..25690a8 100644 --- a/test_server/crm/serializers.py +++ b/test_server/crm/serializers.py @@ -1,8 +1,19 @@ from rest_framework import serializers -from .models import Company, Consumer, PaySubject +from .models import Company, Consumer, PaySubject, ConsumerPerm, ConsumerRole from question.models import Question, Questioncat + +class ConsumerPermSerializer(serializers.ModelSerializer): + class Meta: + model = ConsumerPerm + fields = '__all__' + +class ConsumerRoleSerializer(serializers.ModelSerializer): + class Meta: + model = ConsumerRole + fields = '__all__' + class CompanySerializer(serializers.ModelSerializer): """ 公司序列化 diff --git a/test_server/crm/urls.py b/test_server/crm/urls.py index b19a840..e57a5de 100644 --- a/test_server/crm/urls.py +++ b/test_server/crm/urls.py @@ -1,11 +1,13 @@ from django.urls import path,include -from .views import CompanyViewSet, ConsumerViewSet, ConsumerMPLoginView, ConsumerRegister, change_remain_count +from .views import CompanyViewSet, ConsumerViewSet, ConsumerMPLoginView, ConsumerRegister, change_remain_count, ConsumerPermViewSet, ConsumerRoleViewSet from rest_framework import routers router = routers.DefaultRouter() router.register('consumer', ConsumerViewSet, basename="consumer") router.register('company', CompanyViewSet, basename="company") +router.register('consumerrole', ConsumerRoleViewSet, basename="consumerrole") +router.register('consumerperm', ConsumerPermViewSet, basename="consumerperm") urlpatterns = [ path('consumer/mplogin/', ConsumerMPLoginView.as_view()), diff --git a/test_server/crm/views.py b/test_server/crm/views.py index a7abf9c..7d77c92 100644 --- a/test_server/crm/views.py +++ b/test_server/crm/views.py @@ -28,8 +28,8 @@ from server import settings from utils.custom import CommonPagination from .exports import export_consumer -from .models import Company, Consumer, PaySubject, SendCode -from .serializers import CompanySerializer, ConsumerSerializer +from .models import Company, Consumer, PaySubject, SendCode, ConsumerPerm, ConsumerRole +from .serializers import CompanySerializer, ConsumerSerializer, ConsumerPermSerializer, ConsumerRoleSerializer appid = 'wxf1e9471c93f05ad6' secret = '4bf7f9bd6c52634586bbe792a1f0a834' @@ -56,6 +56,38 @@ def jwt_payload_handler(user): return payload + + +class ConsumerRoleViewSet(ModelViewSet): + """ + 客户角色:增删改查 + """ + perms_map = [ + {'get': 'consumerrole_view'}, {'post': 'consumerrole_create'}, + {'put': 'consumerrole_update'}, {'delete': 'consumerrole_delete'}] + queryset = ConsumerRole.objects.filter(is_delete=0) + serializer_class = ConsumerRoleSerializer + pagination_class = None + filter_backends = [DjangoFilterBackend,SearchFilter, OrderingFilter] + search_fields = ['name','description'] + ordering_fields = ['create_time'] + ordering = ['-create_time'] + +class ConsumerPermViewSet(ModelViewSet): + """ + 客户权限:增删改查 + """ + perms_map = [ + {'get': 'consumerperm_view'}, {'post': 'consumerperm_create'}, + {'put': 'consumerperm_update'}, {'delete': 'consumerperm_delete'}] + queryset = ConsumerPerm.objects.filter(is_delete=0) + serializer_class = ConsumerPermSerializer + pagination_class = None + filter_backends = [DjangoFilterBackend,SearchFilter, OrderingFilter] + search_fields = ['name','code'] + ordering_fields = ['create_time'] + ordering = ['-create_time'] + class CompanyViewSet(ModelViewSet): """ 客户企业:增删改查 @@ -67,7 +99,7 @@ class CompanyViewSet(ModelViewSet): serializer_class = CompanySerializer pagination_class = CommonPagination filter_backends = [DjangoFilterBackend,SearchFilter, OrderingFilter] - search_fields = ('^name',) + search_fields = ('name',) ordering_fields = ('id',) ordering = ['-id'] @@ -85,7 +117,7 @@ class ConsumerViewSet(ModelViewSet): ordering = ['-create_time'] filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] filterset_fields = ('company',) - search_fields = ('^name','^username','^company__name') + search_fields = ('name','username','company__name') def get_queryset(self): queryset = self.queryset @@ -231,6 +263,7 @@ class ConsumerViewSet(ModelViewSet): PaySubject.objects.get_or_create(subject=workscopeobj.subject, consumer = obj) except: return Response({"error":"工作类别不存在!"}) + obj.role = ConsumerRole.objects.get(name='付费学员') obj.save() m = m + 1 return Response(status=status.HTTP_200_OK) @@ -307,6 +340,7 @@ class ConsumerRegister(APIView): consumer.avatar = avatar consumer.nickname = nickname consumer.is_delete = False + consumer.role = ConsumerRole.objects.get(name='注册用户') consumer.save() return Response(status=status.HTTP_200_OK) else: @@ -316,6 +350,7 @@ class ConsumerRegister(APIView): consumer.avatar = avatar consumer.nickname = nickname consumer.is_delete = False + consumer.role = ConsumerRole.objects.get(name='注册用户') consumer.save() return Response(status=status.HTTP_200_OK) else: diff --git a/test_server/examtest/views.py b/test_server/examtest/views.py index dfc53c2..40dc793 100644 --- a/test_server/examtest/views.py +++ b/test_server/examtest/views.py @@ -219,7 +219,7 @@ class ExamTestViewSet(ModelViewSet): """ 考试记录列表和详情 """ - perms_map = [{'get': 'examtest_list'},{'post': 'examtest_create'}] + perms_map = [{'get': 'examtest_list'},{'post': '*'}] pagination_class = CommonPagination queryset = ExamTest.objects.filter(is_delete=0).all() serializer_class = ExamTestListSerializer @@ -308,7 +308,7 @@ class PaperViewSet(ModelViewSet): 押题卷增删改查 """ perms_map = [ - {'get': 'paper_list'}, {'post': 'paper_create'}, + {'get': 'paper_view'}, {'post': 'paper_create'}, {'put': 'paper_update'}, {'delete': 'paper_delete'}] queryset = Paper.objects.filter(is_delete=0).all().order_by("id") pagination_class = CommonPagination diff --git a/test_server/question/views.py b/test_server/question/views.py index 34bc8b6..de10033 100644 --- a/test_server/question/views.py +++ b/test_server/question/views.py @@ -43,7 +43,7 @@ class QuestioncatViewSet(ModelViewSet): 题库分类:增删改查 """ perms_map = ( - {'get': 'questioncat_list'}, {'post': 'questioncat_create'}, + {'get': 'questioncat_view'}, {'post': 'questioncat_create'}, {'put': 'questioncat_update'}, {'delete': 'questioncat_delete'}) queryset = Questioncat.objects.filter(is_delete=0,is_subject=False).all() serializer_class = QuestioncatSerializerDefault @@ -52,7 +52,7 @@ class QuestioncatViewSet(ModelViewSet): ordering = ['type','id'] filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] filterset_fields = ['pid'] - search_fields = ['^name'] + search_fields = ['name'] @action(methods=['get'], detail=False, url_path='all', url_name='all_questioncat')