zoukankan      html  css  js  c++  java
  • 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基类

  • 相关阅读:
    vc 定义返回值为字符串函数方法
    typedef用法(二)
    新版.Net开发必备十大工具【转自www.bitsCN.com】
    大公司面试题
    NET(C#)连接各类数据库集锦
    对对象类型和调用方法属性进行存储以提升反射性能
    数据库连接字符串大全
    C#操作注册表的方法
    上班族解除疲劳
    在Microsoft Visual Studio 2005上安装.net3.0开发环境(含开发环境下
  • 原文地址:https://www.cnblogs.com/tyh-tesla/p/11312719.html
Copyright © 2011-2022 走看看