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基类