-
+
@@ -166,7 +159,7 @@
:before-upload="beforeAvatarUpload"
:headers="myHeaders"
>
-
+
@@ -204,36 +197,37 @@
}
diff --git a/server/apps/system/migrations/0003_auto_20200517_1400.py b/server/apps/system/migrations/0003_auto_20200517_1400.py
new file mode 100644
index 0000000..aa099d2
--- /dev/null
+++ b/server/apps/system/migrations/0003_auto_20200517_1400.py
@@ -0,0 +1,26 @@
+# Generated by Django 3.0.5 on 2020-05-17 06:00
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('system', '0002_dict_dicttype'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='dict',
+ options={'verbose_name': '字典', 'verbose_name_plural': '字典'},
+ ),
+ migrations.AlterModelOptions(
+ name='dicttype',
+ options={'verbose_name': '字典类型', 'verbose_name_plural': '字典类型'},
+ ),
+ migrations.AlterField(
+ model_name='permission',
+ name='method',
+ field=models.CharField(blank=True, max_length=50, null=True, unique=True, verbose_name='方法/代号'),
+ ),
+ ]
diff --git a/server/apps/system/models.py b/server/apps/system/models.py
index fc75e11..8ac7e54 100644
--- a/server/apps/system/models.py
+++ b/server/apps/system/models.py
@@ -14,7 +14,12 @@ class DictType(SoftModel):
code = models.CharField('代号', unique=True, max_length=30)
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.name
class Dict(SoftModel):
"""
@@ -28,6 +33,12 @@ class Dict(SoftModel):
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.name
class Position(BaseModel):
"""
@@ -60,7 +71,7 @@ class Permission(SoftModel):
sort = models.IntegerField('排序标记', default=1)
pid = models.ForeignKey('self', null=True, blank=True,
on_delete=models.SET_NULL, verbose_name='父')
- method = models.CharField('方法/代号', max_length=50, null=True, blank=True)
+ method = models.CharField('方法/代号', max_length=50, unique=True, null=True, blank=True)
def __str__(self):
return self.name
diff --git a/server/apps/system/permission.py b/server/apps/system/permission.py
index 978de93..4a5d321 100644
--- a/server/apps/system/permission.py
+++ b/server/apps/system/permission.py
@@ -47,9 +47,10 @@ class RbacPermission(BasePermission):
perms_map = view.perms_map
_method = request._request.method.lower()
if perms_map:
- for i in perms_map:
- if (i[_method] or i['*']) in perms:
- return True
+ for key in perms_map:
+ if key == _method or key == '*':
+ if perms_map[key] in perms or perms_map[key] == '*':
+ return True
return False
else:
return False
diff --git a/server/apps/system/views.py b/server/apps/system/views.py
index e80399f..1dd0269 100644
--- a/server/apps/system/views.py
+++ b/server/apps/system/views.py
@@ -16,7 +16,7 @@ from rest_framework.viewsets import GenericViewSet, ModelViewSet
from rest_framework_simplejwt.tokens import RefreshToken
from utils.queryset import get_child_queryset
-from .models import Organization, Permission, Position, Role, User, Dict, DictType
+from .models import Organization, Permission, Position, Role, User, DictType, Dict
from .permission import RbacPermission, get_permission_list
from .serializers import (OrganizationSerializer, PermissionSerializer,
PositionSerializer, RoleSerializer,
@@ -36,16 +36,11 @@ class LogoutView(APIView):
def get(self, request, *args, **kwargs): # 可将token加入黑名单
return Response(status=status.HTTP_200_OK)
-
class DictTypeViewSet(ModelViewSet):
"""
数据字典类型:增删改查
"""
- perms_map = [{'post': 'dicttype_create'},
- {'put': 'dicttype_update'},
- {'delete': 'dicttype_delete'},
- {'get': 'dicttype_view'},
- ]
+ perms_map = {'get': '*', 'post': 'dicttype_create', 'put': 'dicttype_update','delete': 'dicttype_delete'}
queryset = DictType.objects.all()
serializer_class = DictTypeSerializer
pagination_class = None
@@ -58,28 +53,18 @@ class DictViewSet(ModelViewSet):
"""
数据字典:增删改查
"""
- perms_map = [{'post': 'dict_create'},
- {'put': 'dict_update'},
- {'delete': 'dict_delete'},
- {'get': 'dict_view'},
- ]
+ perms_map = {'get': '*', 'post': 'dict_create', 'put': 'dict_update','delete': 'dict_delete'}
queryset = Dict.objects.all()
serializer_class = DictSerializer
- pagination_class = None
search_fields = ['^name']
ordering_fields = ['id']
ordering = 'id'
-
class PositionViewSet(ModelViewSet):
"""
岗位:增删改查
"""
- perms_map = [{'post': 'position_create'},
- {'put': 'position_update'},
- {'delete': 'position_delete'},
- {'get': 'position_view'},
- ]
+ perms_map = {'get': '*', 'post': 'position_create', 'put': 'position_update','delete': 'position_delete'}
queryset = Position.objects.all()
serializer_class = PositionSerializer
pagination_class = None
@@ -89,7 +74,7 @@ class PositionViewSet(ModelViewSet):
class TestView(APIView):
- perms_map = [{'get': 'test_view'}] # 单个API控权
+ perms_map = {'get':'test_view'} # 单个API控权
pass
@@ -97,11 +82,8 @@ class PermissionViewSet(ModelViewSet):
"""
权限:增删改查
"""
- perms_map = [{'post': 'perm_create'}, # 视图类控权
- {'put': 'perm_update'},
- {'delete': 'perm_delete'},
- {'get': 'perm_view'},
- ]
+ perms_map = {'get': '*', 'post': 'perm_create', 'put': 'perm_update','delete': 'perm_delete'}
+ queryset = Position.objects.all()
queryset = Permission.objects.all()
serializer_class = PermissionSerializer
pagination_class = None
@@ -114,15 +96,11 @@ class OrganizationViewSet(ModelViewSet):
"""
组织机构:增删改查
"""
- perms_map = [{'post': 'org_create'},
- {'put': 'org_update'},
- {'delete': 'org_delete'},
- {'get': 'org_view'},
- ]
+ perms_map = {'get': '*', 'post': 'org_create', 'put': 'org_update','delete': 'org_delete'}
queryset = Organization.objects.all()
serializer_class = OrganizationSerializer
pagination_class = None
- search_fields = ['^name']
+ search_fields = ['^name','^method']
ordering_fields = ['id']
ordering = 'id'
@@ -131,11 +109,7 @@ class RoleViewSet(ModelViewSet):
"""
角色:增删改查
"""
- perms_map = [{'post': 'role_create'},
- {'put': 'role_update'},
- {'delete': 'role_delete'},
- {'get': 'role_view'},
- ]
+ perms_map = {'get': '*', 'post': 'role_create', 'put': 'role_update','delete': 'role_delete'}
queryset = Role.objects.all()
serializer_class = RoleSerializer
pagination_class = None
@@ -148,11 +122,7 @@ class UserViewSet(ModelViewSet):
"""
用户管理:增删改查
"""
- perms_map = [{'post': 'user_create'},
- {'put': 'user_update'},
- {'delete': 'user_delete'},
- {'get': 'user_view'},
- ]
+ perms_map = {'get': '*', 'post': 'user_create', 'put': 'user_update','delete': 'user_delete'}
queryset = User.objects.all().order_by('-id')
serializer_class = UserListSerializer
filterset_class = UserFilter
@@ -180,17 +150,17 @@ class UserViewSet(ModelViewSet):
# 创建用户默认添加密码
password = request.data['password'] if 'password' in request.data else None
if password:
- request.data['password'] = make_password(password)
+ password = make_password(password)
else:
- request.data['password'] = make_password('0000')
+ password = make_password('0000')
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
- self.perform_create(serializer)
+ serializer.save(password = password)
return Response(serializer.data)
- @action(methods=['post'], detail=True, permission_classes=[IsAuthenticated],
- url_name='change_passwd')
- def change_passwd(self, request, pk=None):
+ @action(methods=['put'], detail=True, permission_classes=[IsAuthenticated],
+ url_name='change_password')
+ def password(self, request, pk=None):
"""
修改密码
"""
@@ -208,8 +178,8 @@ class UserViewSet(ModelViewSet):
else:
return Response('旧密码错误!', status=status.HTTP_400_BAD_REQUEST)
- # perms_map=[{'get':'my_info'}], 自定义action控权
- @action(methods=['get'], detail=False, url_name='my_info', permission_classes=[IsAuthenticated])
+ # perms_map={'get':'*'}, 自定义action控权
+ @action(methods=['get'], detail=False, url_name='my_info', permission_classes=[IsAuthenticated])
def info(self, request, pk=None):
"""
初始化用户信息
diff --git a/server/utils/model.py b/server/utils/model.py
index 2ea3282..f8ded06 100644
--- a/server/utils/model.py
+++ b/server/utils/model.py
@@ -17,7 +17,7 @@ class SoftDeletableQuerySetMixin(object):
field to True)
'''
if soft:
- self.update(is_delete=True)
+ self.update(is_deleted=True)
else:
return super(SoftDeletableQuerySetMixin, self).delete()
@@ -47,6 +47,7 @@ class SoftDeletableManagerMixin(object):
class SoftDeletableManager(SoftDeletableManagerMixin, models.Manager):
pass
+
class BaseModel(models.Model):
create_time = models.DateTimeField(
default=timezone.now, verbose_name='创建时间', help_text='创建时间')
@@ -57,13 +58,13 @@ class BaseModel(models.Model):
class Meta:
abstract = True
-
-class SoftModel(BaseModel):
+class SoftModel(BaseModel):
class Meta:
abstract = True
objects = SoftDeletableManager()
+
def delete(self, using=None, soft=True, *args, **kwargs):
'''
这里需要真删除的话soft=False即可