月光大保健

导航

CRM系統

CRM系統

1.創建兩個app:1.rbac:權限組件。。。2.web:銷售管理系統

 Tool --> Run manage.py Task...

輸入 ,創建rbac和web 兩個app

// message 是工程名
startapp message 

 

創建表

from django.db import models
class Permission(models.Model):
    """
    權限表
    """
    title = models.CharField(verbose_name='標題',max_length=32)
    url = models.CharField(verbose_name='含正則的URL',max_length=128)

    def __str__(self):
        return self.title

class Role(models.Model):
    """
    角色表
    """
    title = models.CharField(verbose_name='角色名稱',max_length=32)
    permissions = models.ManyToManyField(verbose_name='擁有的所有權限',to='Permission',blank=True)

    def __str__(self):
        return self.title

class UserInfo(models.Model):
    """
    用戶表
    """
    name = models.CharField(verbose_name='用戶名',max_length=32)
    password = models.CharField(verbose_name='密碼',max_length=64)
    email = models.CharField(verbose_name='郵箱',max_length=32)
    roles = models.ManyToManyField(verbose_name='擁有的所有角色',to='Role',blank=True)

 

2.錄入信息:

  • 客户管理
    • 客户列表:/customer/list/
    • 添加客户:/customer/add/
    • 删除客户:/customer/list/(?P<cid>\d+)/
    • 修改客户:/customer/edit/(?P<cid>\d+)/
    • 批量导入:/customer/import/
    • 下载模板:/customer/tpl/
  • 账单管理
    • 账单列表:/payment/list/
    • 添加账单:/payment/add/
    • 删除账单:/payment/del/(?P<pid>\d+)/
    • 修改账单:/payment/edit/<?P<pid>\d+/ 

接下來的思路是:

任何用戶都可以訪問登錄頁面,用戶第一次登錄時,通過中間件、視圖函數、CRM、數據庫訪問檢測該用戶,之後往回走,返回給用戶,途中把用戶信息存放在session中,之後如果用戶再訪問網頁時,再登錄時會通過中間件,這時可以訪問session來判斷該用戶之前是否訪問過,這樣就不用每次都訪問數據庫,從而減輕數據庫的壓力。

 

 

//account.py

from django.shortcuts import HttpResponse,render,redirect
from rbac import models


def login(request):
    if request.method == 'GET':
        return render(request,'login.html')

    user = request.POST.get('user')
    pwd = request.POST.get('pwd')

    obj = models.UserInfo.objects.filter(name=user,password=pwd).first()

    if not obj:
        return render(request,'login.html',{"msg":"輸入的用戶名和密碼錯誤"})

    permission_queryset = obj.role.filter(permission__isnull=False).values("permission__id","permission__url").distinct()

    permission_list = [item['permission__url'] for item in permission_queryset]

    request.session['luffy_permission_url_list_key'] = permission_list

    return redirect('/customer/login/')

 

这个目的是当用户提交账号密码时,会将成功的账号密码存入到session里面

 

#########################################################

编写中间件

当你不知道这个中间件继承哪个父类时,可以在settings -> MIDDLEWARE  结果是:MiddlewareMixin

from django.shortcuts import HttpResponse
from django.utils.deprecation import MiddlewareMixin


class middle_test(MiddlewareMixin):
    def process_request(self, request):
        '''
        1.获取当前用户请求的URL
        2.获取当前用户在session中保存的权限列表['/customer/list/',......]
        3.权限信息匹配
        :param request:
        :return:
        '''

        current_url = request.path_info
        permission_list = request.session.get('luffy_permission_url_list_key')

        if not permission_list:
            return HttpResponse('未登陆')

        print(current_url)
        print(permission_list)

输出:

/customer/list/   ---->  current_url  获取了用户请求的url


['/customer/list/', '/customer/add/', '/customer/list/(?P<cid>\\d+)/', '/customer/edit/(?P<cid>\\d+)/', '/customer/import/', '/customer/tpl/', '/payment/list/', '/payment/add/', '/payment/del/(?P<pid>\\d+)/', '/payment/edit/<?P<pid>\\d+/']

               ------------------->>> 获取了用户保存在session中的数据

 

更新白名单的内容:

class middle_test(MiddlewareMixin):
    def process_request(self, request):
        '''
        1.获取当前用户请求的URL
        2.获取当前用户在session中保存的权限列表['/customer/list/',......]
        3.权限信息匹配
        :param request:
        :return:
        '''

        # 设置白名单,当用户访问时,可以使得各个用户都可以访问,无需任何权限
        vaild_list = [
            '/login/',
            '/admin/*',
        ]

        current_url = request.path_info                 # 获取用户请求的URL
        permission_list = request.session.get('luffy_permission_url_list_key')    # 获取用户在session中存在的权限列表
        for vaild_url in vaild_list:
            if re.match(vaild_url,current_url):               # 先循环白名单
                return None

        if not permission_list:                     # 如果没有在session中,判断你是没有登陆的用户
            return HttpResponse('你还没有登陆 ')

        flag = False          # 设置flag,当匹配成功后就没有需要继续往下匹配

        for url in permission_list:
            reg = "^%s$" % url                              # 通过正则表达式,实现完全的匹配
            if re.match(reg,current_url):
                flag = True
                break
        if not flag:
            return HttpResponse('你没有权限未登陆')

 

权限分配知识点:

  -- 保留URl中的原搜索条件    memory request

  -- 模板中整形转换字符串    1|safe

  -- ModelForm定制radio

  -- ModelForm显示默认值

  -- ModelForm save 之前对其instance 进行修改

  -- BootStrapModelForm基类

 

posted on 2019-08-07 00:26  月光大保健  阅读(154)  评论(0编辑  收藏  举报