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 @@
+
+
+
新增角色
+
+
+
+
+ {{ scope.row.name }}
+
+
+
+
+ {{ scope.row.description }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确认
+
+
+
+
+
+
+
+
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')