Browse Source

权限管理

wushaodong 3 years ago
parent
commit
ae2fe2b5a3

+ 9 - 32
apps/account/consts.py

@@ -3,53 +3,30 @@
 CONTENT_TYPE_SORTING = (
 CONTENT_TYPE_SORTING = (
     # 系统设置
     # 系统设置
     'account-user',  # 用户管理
     'account-user',  # 用户管理
-    'account-manageagentuser',  # 权限管理
-    'option-option',  # 自定义项
-    'option-agentlevel',  # 代理商等级
-
+    'option-school',  # 商品管理
+    'option-student',  # 商品管理
+    'option-commoditylevel',  # 商品管理
     'commodity-commodity',  # 商品管理
     'commodity-commodity',  # 商品管理
-    'commodity-commodityparameter',  # 商品参数
-
-    'agent-agentapply',  # 代理商申请
-    'agent-agent',  # 代理商
-    'agent-agentcommodity',  # 代理商商品
+    'order-coupon',  # 代理商订单
     'order-order',  # 代理商订单
     'order-order',  # 代理商订单
-
-    'WechatApplet-wechatapplet',  # 小程序管理
-
-    'deliver-productdeliver',  # 防窜货管理
 )
 )
 
 
 MENU_TO_MODEL = (
 MENU_TO_MODEL = (
     (
     (
         u'基础数据', (
         u'基础数据', (
             'account-user',
             'account-user',
-            'account-manageagentuser',
-            'option-option',
-            'option-agentlevel',
-        )
-    ),
-    (
-        u'商品管理', (
+            'option-school',
+            'option-student',
+            'option-commoditylevel',
             'commodity-commodity',
             'commodity-commodity',
-            'commodity-commodityparameter',
         )
         )
     ),
     ),
     (
     (
-        u'代理商管理', (
-            'agent-agentapply',
-            'agent-agent',
-            'agent-agentcommodity',
+        u'订单管理', (
+            'order-coupon',
             'order-order',
             'order-order',
         )
         )
     ),
     ),
-    (
-        u'其他', (
-            'WechatApplet-wechatapplet',
-            'deliver-productdeliver',
-        ),
-    ),
-
 )
 )
 
 
 
 

+ 6 - 0
apps/account/filters.py

@@ -16,3 +16,9 @@ class UserFilter(django_filters.FilterSet):
     class Meta:
     class Meta:
         model = User
         model = User
         fields = ['name', 'username', 'tel', 'is_active']
         fields = ['name', 'username', 'tel', 'is_active']
+
+class GroupFilter(django_filters.FilterSet):
+
+    class Meta:
+        model = Group
+        fields = '__all__'

+ 1 - 0
apps/account/models.py

@@ -83,6 +83,7 @@ class User(AbstractBaseUser, PermissionsMixin):
         permissions = [
         permissions = [
             ('browse_user', u'查看'),
             ('browse_user', u'查看'),
             ('add_user', u'添加'),
             ('add_user', u'添加'),
+            ('manager_permissions', u'权限管理'),
         ]
         ]
 
 
     def __unicode__(self):
     def __unicode__(self):

+ 26 - 5
apps/account/serializers.py

@@ -60,6 +60,11 @@ class EmployeeSerializer(serializers.ModelSerializer):
     category_text = serializers.SerializerMethodField()
     category_text = serializers.SerializerMethodField()
     school_text = serializers.SerializerMethodField()
     school_text = serializers.SerializerMethodField()
     category_ids = serializers.SerializerMethodField()
     category_ids = serializers.SerializerMethodField()
+    groups = serializers.SerializerMethodField()
+    group_ids = serializers.PrimaryKeyRelatedField(source='groups', many=True, read_only=True)
+
+    def get_groups(self, obj):
+        return ','.join(obj.groups.values_list('name', flat=True))
 
 
     def get_category_ids(self, obj):
     def get_category_ids(self, obj):
         return obj.category.split(',')
         return obj.category.split(',')
@@ -101,19 +106,28 @@ class EmployeeSerializer(serializers.ModelSerializer):
                 validated_data['is_active'] = self.initial_data['is_active'] == '1'
                 validated_data['is_active'] = self.initial_data['is_active'] == '1'
                 validated_data['create_user'] = self.context['request'].user
                 validated_data['create_user'] = self.context['request'].user
                 instance = super(EmployeeSerializer, self).update(user, validated_data)
                 instance = super(EmployeeSerializer, self).update(user, validated_data)
-                instance.set_password(self.initial_data['password'])
-                instance.save()
         else:
         else:
             validated_data['is_active'] = self.initial_data['is_active'] == '1'
             validated_data['is_active'] = self.initial_data['is_active'] == '1'
             user = self.context['request'].user
             user = self.context['request'].user
             validated_data['create_user'] = user
             validated_data['create_user'] = user
             instance = super(EmployeeSerializer, self).create(validated_data)
             instance = super(EmployeeSerializer, self).create(validated_data)
-            instance.set_password(self.initial_data['password'])
-            instance.save()
+        instance.set_password(self.initial_data['password'])
+        instance.save()
+        groups = self.context['request'].data.get('groups', None)
+        if groups:
+            groups = json.loads(groups)
+        else:
+            groups = []
+        for group in groups:
+            instance.groups.add(group)
         return instance
         return instance
 
 
     def update(self, instance, validated_data):
     def update(self, instance, validated_data):
-
+        username = self.initial_data['username']
+        user = User.objects.filter(username=username).exclude(id=instance.id).first()
+        if user:
+            raise CustomError(u'账号[{0}]和代理商账号、游客账号或其他员工账号重复,禁止修改。'.format(username))
+        instance.groups.clear()
         password = instance.password
         password = instance.password
         validated_data['is_superuser'] = instance.is_superuser
         validated_data['is_superuser'] = instance.is_superuser
         validated_data['is_active'] = self.initial_data['is_active'] == '1'
         validated_data['is_active'] = self.initial_data['is_active'] == '1'
@@ -124,6 +138,13 @@ class EmployeeSerializer(serializers.ModelSerializer):
            instance.set_password(self.initial_data['password'])
            instance.set_password(self.initial_data['password'])
 
 
         instance.save()
         instance.save()
+        groups = self.context['request'].data.get('groups', None)
+        if groups:
+            groups = json.loads(groups)
+        else:
+            groups = []
+        for group in groups:
+            instance.groups.add(group)
         return instance
         return instance
 
 
 class PermissionSerializer(serializers.ModelSerializer):
 class PermissionSerializer(serializers.ModelSerializer):

+ 4 - 0
apps/account/urls.py

@@ -10,8 +10,12 @@ urlpatterns = [
     url(r'^code2Session/$', WxLoginView.as_view()), # 自动登录
     url(r'^code2Session/$', WxLoginView.as_view()), # 自动登录
     url(r'^setUserInfo/$', SetUserInfoView.as_view()),
     url(r'^setUserInfo/$', SetUserInfoView.as_view()),
     url(r'^wxbind/$', WxBindView.as_view()), # 微信快捷登录
     url(r'^wxbind/$', WxBindView.as_view()), # 微信快捷登录
+
+    url(r'^permission/dict/$', PermissionDictView.as_view()),  # 人员管理,编辑,权限组
+    url(r'^permission/all/$', PermissionsListView.as_view()),  # 权限管理,编辑,加载所有权限
 ]
 ]
 
 
 router = SimpleRouter()
 router = SimpleRouter()
 router.register(r'employee', EmployeeViewSet)
 router.register(r'employee', EmployeeViewSet)
+router.register(r'permission', GroupsViewSet)
 urlpatterns += router.urls
 urlpatterns += router.urls

+ 83 - 2
apps/account/views.py

@@ -15,13 +15,15 @@ from django.contrib.auth import get_user_model
 
 
 User = get_user_model()
 User = get_user_model()
 from apps.account.serializers import JWTSerializer, EmployeeSerializer, \
 from apps.account.serializers import JWTSerializer, EmployeeSerializer, \
-    WechatLoginSerializer, WechatBindSerializer
+    WechatLoginSerializer, WechatBindSerializer, GroupDictSerializer, GroupSerializer
 from utils.custom_modelviewset import CustomModelViewSet
 from utils.custom_modelviewset import CustomModelViewSet
-from apps.account.filters import UserFilter
+from apps.account.filters import UserFilter, GroupFilter
 from apps.log.models import BizLog
 from apps.log.models import BizLog
 from utils.exceptions import CustomError
 from utils.exceptions import CustomError
 from apps.account.models import CustomerWechat
 from apps.account.models import CustomerWechat
 from utils.wx.WXBizDataCrypt import WXBizDataCrypt
 from utils.wx.WXBizDataCrypt import WXBizDataCrypt
+from apps.account.consts import PermissionMenu
+from collections import OrderedDict
 
 
 class LoginView(ObtainJSONWebToken):
 class LoginView(ObtainJSONWebToken):
     serializer_class = JWTSerializer
     serializer_class = JWTSerializer
@@ -102,6 +104,48 @@ class EmployeeViewSet(CustomModelViewSet):
         BizLog.objects.addnew(self.request.user, BizLog.UPDATE,
         BizLog.objects.addnew(self.request.user, BizLog.UPDATE,
                               u'修改用户[%s],id=%d' % (instance.name, instance.id), validated_data)
                               u'修改用户[%s],id=%d' % (instance.name, instance.id), validated_data)
 
 
+class GroupsViewSet(CustomModelViewSet):
+    permission_classes = [isLogin, ]
+    queryset = Group.objects.filter()
+    serializer_class = GroupSerializer
+
+    @permission_required('account.manager_permissions')
+    def filter_queryset(self, queryset):
+        if not self.request.user.is_superuser:
+            groups = self.request.user.groups.all()
+            queryset = queryset.filter(id__in=[g.id for g in groups])
+        f = GroupFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    @permission_required('account.manager_permissions')
+    def perform_create(self, serializer):
+        super(GroupsViewSet, self).perform_create(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        BizLog.objects.addnew(self.request.user, BizLog.INSERT,
+                              u'添加权限组[%s],id=%d' % (instance.name, instance.id), validated_data)
+
+    @permission_required('account.manager_permissions')
+    def perform_update(self, serializer):
+        super(GroupsViewSet, self).perform_update(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        BizLog.objects.addnew(self.request.user, BizLog.UPDATE,
+                              u'修改权限组[%s],id=%d' % (instance.name, instance.id), validated_data)
+
+    @permission_required('account.manager_permissions')
+    def destroy(self, request, *args, **kwargs):
+        with transaction.atomic():
+            instance = self.get_object()
+            # user_count = instance.user_set.all().count()
+            # if user_count:
+            #     raise CustomError(u'该权限组已分配给用户,禁止删除!')
+
+            BizLog.objects.addnew(self.request.user, BizLog.DELETE,
+                                  u'删除权限组[%s],id=%d' % (instance.name, instance.id))
+            instance.delete()
+        return response_ok()
+
 
 
 class SetUserInfoView(APIView):
 class SetUserInfoView(APIView):
     permission_classes = [isLogin, ]
     permission_classes = [isLogin, ]
@@ -154,3 +198,40 @@ class WxBindView(APIView):
             return response_ok(ser.validated_data)
             return response_ok(ser.validated_data)
         else:
         else:
             return response_error('参数错误')
             return response_error('参数错误')
+
+
+class PermissionsListView(APIView):
+    permission_classes = [isLogin, ]
+
+    @permission_required('account.manager_permissions')
+    def get(self, request):
+        rows = Permission.objects.all().exclude(name__startswith='Can')
+        perms_menus = PermissionMenu()
+        rows = perms_menus.sort_perms(rows)
+        menus = OrderedDict()
+        for row in rows:
+            item = {'id': row.id, 'name': row.name}
+            mn = perms_menus.get_menuname_of_contenttype(row.content_type.app_label, row.content_type.model)
+            if mn in menus:
+                permissions = menus[mn]
+            else:
+                permissions = menus[mn] = OrderedDict()
+            if row.content_type.name in permissions:
+                if not item in permissions[row.content_type.name]:
+                    permissions[row.content_type.name].append(item)
+            else:
+                permissions[row.content_type.name] = [item, ]
+        return response_ok(menus)
+
+
+class PermissionDictView(APIView):
+    permission_classes = [isLogin, ]
+
+    @permission_required('account.add_user')
+    def get(self, request):
+        rows = Group.objects.filter()
+        if not request.user.is_superuser:
+            groups = request.user.groups.all()
+            rows = rows.filter(id__in=[g.id for g in groups])
+        serializer = GroupDictSerializer(rows, many=True)
+        return response_ok(serializer.data)

+ 1 - 1
apps/option/models.py

@@ -126,7 +126,7 @@ class CommodityLevel(models.Model):
                              blank=True, null=True)
                              blank=True, null=True)
 
 
     class Meta:
     class Meta:
-        verbose_name = u"商品级别"
+        verbose_name = u"商品分类"
         db_table = "commodiey_level"
         db_table = "commodiey_level"
         ordering = ['-id']
         ordering = ['-id']
         default_permissions = ()
         default_permissions = ()

+ 1 - 1
apps/order/views.py

@@ -61,7 +61,7 @@ class OrderViewSet(CustomModelViewSet):
         elif self.request.user.type == User.AGENT:
         elif self.request.user.type == User.AGENT:
             # 代理商,筛选代理的类别和学校
             # 代理商,筛选代理的类别和学校
             queryset = queryset.filter(
             queryset = queryset.filter(
-                Q(commodity__cogetory__in=self.request.user.cogetory) | Q(student__school=self.request.user.school))
+                Q(commodity__category__in=self.request.user.category) | Q(student__school=self.request.user.school))
 
 
         f = OrderFilter(self.request.GET, queryset=queryset)
         f = OrderFilter(self.request.GET, queryset=queryset)
         return f.qs
         return f.qs

+ 1 - 1
bookshop_admin/settings.py

@@ -218,7 +218,7 @@ UIS_ROOT = os.path.join(BASE_DIR, "uis/")
 EXPORT_URL = '/export/'
 EXPORT_URL = '/export/'
 EXPORT_ROOT = os.path.join(BASE_DIR, "export/")
 EXPORT_ROOT = os.path.join(BASE_DIR, "export/")
 
 
-SERVER_DOMAIN = 'https://lsr.zzly.vip'
+SERVER_DOMAIN = 'https://qjxl.zzly.vip'
 # SERVER_DOMAIN = 'http://192.168.2.45:8887'
 # SERVER_DOMAIN = 'http://192.168.2.45:8887'
 
 
 JWT_AUTH = {
 JWT_AUTH = {

+ 25 - 0
uis/views/employee/edit.html

@@ -94,6 +94,12 @@
                                     <select name="category" xm-select="categoryGroup"></select>
                                     <select name="category" xm-select="categoryGroup"></select>
                                 </div>
                                 </div>
                             </div>
                             </div>
+                            <div class="layui-col-lg6">
+                                <label class="layui-form-label">权限组:</label>
+                                <div class="layui-input-block">
+                                    <select name="groups" xm-select="selectGroup"></select>
+                                </div>
+                            </div>
                             <div class="layui-col-lg6">
                             <div class="layui-col-lg6">
                                 <label class="layui-form-label">是否在用:</label>
                                 <label class="layui-form-label">是否在用:</label>
                                 <div class="layui-input-block">
                                 <div class="layui-input-block">
@@ -137,6 +143,23 @@
         }
         }
         form.render(null, 'component-form-element');
         form.render(null, 'component-form-element');
 
 
+        formSelects.config('selectGroup', {
+            beforeSuccess: function (eid, url, searchVal, result) {
+                if (id) {
+                    var groupIds = parent.layui.table.editdata.group_ids;
+                    for (var n in result.data) {
+                        var item = result.data[n];
+                        if (groupIds.indexOf(parseInt(item.value)) > -1)
+                            item.selected = 'selected';
+                    }
+                }
+                return result;
+            }
+        });
+        formSelects.data('selectGroup', 'server', {
+            url: '/account/permission/dict/'
+        });
+
         formSelects.config('categoryGroup', {
         formSelects.config('categoryGroup', {
             beforeSuccess: function (eid, url, searchVal, result) {
             beforeSuccess: function (eid, url, searchVal, result) {
                 if (id) {
                 if (id) {
@@ -215,6 +238,8 @@
                 url = '/account/employee/';
                 url = '/account/employee/';
                 type = 'post';
                 type = 'post';
             }
             }
+            var groups = formSelects.value('selectGroup', 'val');
+            data.field.groups = JSON.stringify(groups);
 
 
             if (!data.field.is_active) {
             if (!data.field.is_active) {
                 data.field.is_active = '0'
                 data.field.is_active = '0'

+ 2 - 1
uis/views/employee/index.html

@@ -90,7 +90,8 @@
                 , {field: 'username', title: '账号', width: 120}
                 , {field: 'username', title: '账号', width: 120}
                 , {field: 'enable_text', title: '是否在用', width: 100}
                 , {field: 'enable_text', title: '是否在用', width: 100}
                 , {field: 'position', title: '职位', width: 120}
                 , {field: 'position', title: '职位', width: 120}
-                , {field: 'type_text', title: '类别', width: 200}
+                , {field: 'type_text', title: '类别', width: 120}
+                , {field: 'groups', title: '权限组', width: 200}
                 , {field: 'date_joined_f', title: '添加时间', width: 150}
                 , {field: 'date_joined_f', title: '添加时间', width: 150}
                 , {field: 'create_user_text', title: '添加人', width: 100}
                 , {field: 'create_user_text', title: '添加人', width: 100}
                 , {width: 170, align: 'center', fixed: 'right', toolbar: '#datagrid-operate-bar'}
                 , {width: 170, align: 'center', fixed: 'right', toolbar: '#datagrid-operate-bar'}

+ 3 - 0
uis/views/index.html

@@ -79,6 +79,9 @@
                             <dd data-name="nav" data-permission="account.browse_user">
                             <dd data-name="nav" data-permission="account.browse_user">
                                 <a lay-href="employee/index.html">人员管理</a>
                                 <a lay-href="employee/index.html">人员管理</a>
                             </dd>
                             </dd>
+                            <dd data-name="nav" data-permission="account.manager_permissions">
+                                <a lay-href="permissions/index.html">权限管理</a>
+                            </dd>
                             <!--dd data-name="nav">
                             <!--dd data-name="nav">
                                 <a lay-href="option/config.html">综合设置</a>
                                 <a lay-href="option/config.html">综合设置</a>
                             </dd-->
                             </dd-->