consumer perm

This commit is contained in:
caoqianming 2020-06-27 21:56:14 +08:00
parent e3cc947d4e
commit d2a9034c20
13 changed files with 369 additions and 23 deletions

View File

@ -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
})
}

View File

@ -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'] }
},
]
},

View File

@ -0,0 +1,178 @@
<template>
<div class="app-container">
<el-button type="primary" @click="handCreate">新增角色</el-button>
<el-table
:data="rolesList"
style="width: 100%;margin-top:30px;"
v-loading="listLoading"
border>
<el-table-column align="center" label="角色名称" width="220">
<template slot-scope="scope">
{{ scope.row.name }}
</template>
</el-table-column>
<el-table-column align="header-center" label="角色描述">
<template slot-scope="scope">
{{ scope.row.description }}
</template>
</el-table-column>
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-button type="primary" size="small" @click="handleUpdate(scope)" icon="el-icon-edit"></el-button>
<el-button type="danger" size="small" @click="handleDelete(scope)" icon="el-icon-delete"></el-button>
</template>
</el-table-column>
</el-table>
<el-dialog :visible.sync="dialogVisible" :title="dialogType==='update'?'编辑角色':'新增角色'">
<el-form :model="role" label-width="80px" label-position="left">
<el-form-item label="名称">
<el-input v-model="role.name" placeholder="角色名称" />
</el-form-item>
<el-form-item label="描述">
<el-input
v-model="role.description"
:autosize="{ minRows: 2, maxRows: 4}"
type="textarea"
placeholder="角色描述"
/>
</el-form-item>
<el-form-item label="权限">
<el-tree
v-model="role.perms"
ref="tree"
:check-strictly="checkStrictly"
:data="permsData"
show-checkbox
node-key="id"
class="permission-tree"
/>
</el-form-item>
</el-form>
<div style="text-align:right;">
<el-button type="danger" @click="dialogVisible=false">取消</el-button>
<el-button type="primary" @click="confirmRole">确认</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import path from 'path'
import { genTree,deepClone } from '@/utils'
import { getConsumerRoleAll, createConsumerRole, deleteConsumerRole, updateConsumerRole, getConsumerPermAll } from '@/api/crm'
const defaultRole = {
id: '',
name: '',
description: '',
perms: []
}
export default {
data() {
return {
role: Object.assign({}, defaultRole),
permsData: [],
rolesList: [],
dialogVisible: false,
dialogType: 'create',
checkStrictly:true,
listLoading:true
}
},
computed: {
},
created() {
// Mock: get all routes and roles list from server
this.getPerms()
this.getRoles()
},
methods: {
async getPerms() {
const res = await getConsumerPermAll()
// this.serviceRoutes = res.data
this.permsData = genTree(res.data)
},
async getRoles() {
this.listLoading = true
const res = await getConsumerRoleAll()
this.rolesList = res.data
this.listLoading = false
},
handCreate() {
this.role = Object.assign({}, defaultRole)
if (this.$refs.tree) {
this.$refs.tree.setCheckedNodes([])
}
this.dialogType = 'create'
this.dialogVisible = true
},
handleUpdate(scope) {
this.dialogType = 'update'
this.dialogVisible = true
this.role = deepClone(scope.row)
this.$nextTick(() => {
this.$refs.tree.setCheckedKeys(this.role.perms)
})
},
handleDelete({ $index, row }) {
this.$confirm('确认删除该角色吗?该角色成员将丢失权限!', '警告', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning'
})
.then(async() => {
await deleteConsumerRole(row.id)
this.rolesList.splice($index, 1)
this.$message({
type: 'success',
message: '成功删除!'
})
})
.catch(err => { console.error(err) })
},
async confirmRole() {
const isEdit = this.dialogType === 'update'
const checkedKeys = this.$refs.tree.getCheckedKeys()
this.role.perms = checkedKeys
if (isEdit) {
await updateConsumerRole(this.role.id, this.role)
for (let index = 0; index < this.rolesList.length; index++) {
if (this.rolesList[index].id === this.role.id) {
this.rolesList.splice(index, 1, Object.assign({}, this.role))
break
}
}
} else {
this.role.perms = this.$refs.tree.getCheckedKeys()
const { data } = await createConsumerRole(this.role)
this.getRoles()
}
const { description, name } = this.role
this.dialogVisible = false
this.$notify({
title: '成功',
dangerouslyUseHTMLString: true,
type: 'success'
})
},
}
}
</script>
<style lang="scss" scoped>
.app-container {
.roles-table {
margin-top: 30px;
}
.permission-tree {
margin-bottom: 30px;
}
}
</style>

View File

@ -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()
}
})
}

View File

@ -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)

View File

@ -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': '客户角色表',
},
),
]

View File

@ -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):
'''
付费学科关联表

View File

@ -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):

View File

@ -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):
"""
公司序列化

View File

@ -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()),

View File

@ -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:

View File

@ -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

View File

@ -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')