CRM系統html
1.創建兩個app:1.rbac:權限組件。。。2.web:銷售管理系統web
Tool --> Run manage.py Task...正則表達式
輸入 ,創建rbac和web 兩個appdjango
// message 是工程名
startapp message
創建表session
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.錄入信息:app
接下來的思路是:url
任何用戶均可以訪問登錄頁面,用戶第一次登錄時,通過中間件、視圖函數、CRM、數據庫訪問檢測該用戶,之後往回走,返回給用戶,途中把用戶信息存放在session中,之後若是用戶再訪問網頁時,再登錄時會通過中間件,這時能夠訪問session來判斷該用戶以前是否訪問過,這樣就不用每次都訪問數據庫,從而減輕數據庫的壓力。spa
//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裏面code
#########################################################orm
編寫中間件
當你不知道這個中間件繼承哪一個父類時,能夠在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基類