consumer perm
This commit is contained in:
parent
e3cc947d4e
commit
d2a9034c20
|
@ -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
|
||||
})
|
||||
}
|
|
@ -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'] }
|
||||
},
|
||||
]
|
||||
},
|
||||
|
||||
|
|
|
@ -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>
|
|
@ -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()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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': '客户角色表',
|
||||
},
|
||||
),
|
||||
]
|
|
@ -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):
|
||||
'''
|
||||
付费学科关联表
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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):
|
||||
"""
|
||||
公司序列化
|
||||
|
|
|
@ -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()),
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in New Issue