• crmfuxi


    客户系统表结构

    Day69 是注册登录用户信息展示
    注册是form提交生成对象,form_obj = form.UserForm(request.POST)
    判断是否合法form_obj.is_valid()用着个函数
    登录是判断验证码:这个验证码在哪调用的不知道呢
    然后 验证用户名和密码是不是存在
    user_obj = auth.authenticate(username=username,password=password)
    @login_required
    登陆了才能访问的函数
    还有访问all_customers = models.Customer.objects.all()顾客的信息
    Day70
    增删改查用户form(分页,你有简单的。我也没看,太多了)
    增:
    form_obj = form.CustomerModelForm(request.POST)
    form_obj.save()
    删:
    models.Customer.objects.filter(pk=pk).delete()
    改:
    custome_obj = models.Customer.objects.filter(pk=pk).first()
    form_obj = form.CustomerModelForm(request.POST,instance=custome_obj)
    form_obj.save()
    查:
    查询的
    wd = request.GET.get('wd', '')
    condition = request.GET.get('condition', '')
    q = Q()
    q.connector = 'or'  # 指定条件连接符号
    q.children.append((condition, wd))  # 默认是and的关系
    q.children.append(('qq_name__contains', '小'))
    all_data = models.Customer.objects.filter(q)
    是q查询就把字符串变成了关键字 filter(q)
    day71批量就加了批量的操作,pk__in
    #批量删除
    def batch_delete(self,request):
        models.Customer.objects.filter(pk__in=self.data).delete()
    #批量更新
    def batch_update(self,request):
        models.Customer.objects.filter(pk__in=self.data).update(name='雄哥')
    #批量公户转私户
    def batch_reverse_gs(self,request):
      models.Customer.objects.filter(pk__in=self.data).update(consultant=request.user)
    day72跟进表的操作
    和公户私户操作差不多
    
    

    day73 rbac权限(没有实现具体功能,只有那个用户可以访问哪个url)

    有三张表,又生成了两张多对多的表

    1571208219674user

    1571208240794role

    1571208280209permission

    1571208324641role_permission

    1571208342804user_roles

    通过user找到对应的role,通过role找到对应的permission,permission里写了可以访问的url

    先走登录,有白名单放行,在登录函数里,把这个登录的user应该访问的url写入session就是保存权限

    # 登录成功,保存登录状态
    request.session['user'] = user_obj.name
    
    查询(这个user的)权限,保存到session
    permissions = models.Permisson.objects.filter(role__user__name=user_obj.name).distinct()
    permisson_list = [i.url for i in permissions]
    request.session['permisson_list'] = permisson_list
    

    中间件那里(新的知识点,中间件,登录认证,和权限)

    #白名单放行
     for i in ['/login/', '/admin/.*']:
                ret = re.search(i, request.path)
                if ret:
                    return None
    
     #登录认证
            user = request.session.get('user')
            if not user:
                return redirect('login')
    
     # 访问别的函数时,判断
     #权限认证
            # if request.path in request.session['permisson_list']:
                #'/customer/delete/3/' '/customer/delete/(\d+)/'
            for item in request.session['permisson_list']:
                reg = '^%s$'%item  
                ret = re.search(reg, request.path)
                if ret:
                    return None
            else:
                return HttpResponse('不好意思,权限不够!!无权访问!')
    

    day74 rbac一级菜单的菜单权限

    1571207583031

    客户和缴费列表。is_menu 是true,别的title不是,就可以筛了

    1571201190260

    和73天一样,先走登录

    有一个权限注入函数:initial_session(request, user)

    里面的内容也和之前大致一样,只不过,注入了菜单权限,格式如下:

      [
                {'title':'客户列表','url':'/customer/list/','icon':'fa-..'},
                {'title':'客户列表','url':'/customer/list/','icon':'fa-..'},
            ]
    

    下面的基本和73天一样的,就是多加了一个菜单

    def initial_session(request, user_obj):
        permissions = models.Permission.objects.filter(role__user__name=user_obj).distinct()
        # print(permissions)
    
        permisson_list = []
        permisson_menu_list = []
        for item in permissions:
            # permisson_list = [i.url for i in permissions]
            permisson_list.append(item.url)  # 73天的权限注入方式 
            #往session中注入菜单栏的数据
            if item.is_menu:   # 如果是一级菜单 ,前面打对勾的那个 为了传给前端
                permisson_menu_list.append({  
                    'title':item.title,
                    'url':item.url,
                    'icon':item.icon,
                })
    
        print(permisson_list)
        request.session['permisson_list'] = permisson_list
        request.session['permisson_menu_list'] = permisson_menu_list  # 保存了菜单权限
    
    

    登陆之后,直接重定向到customer/list那里 走customer_list.html (里也有一些信息展示通过for循环展示了,但是主要是权限)

    模板还是组件来?这个 走layout了

    {% extends 'layout.html' %}
    {% block content %}
    

    layout里有这个,组件吗?(反正就是菜单的部分了)

    {% load rbac %}
    {% menu request %}
    

    然后通过这个什么标签 # 返回给menu_list.html

    @register.inclusion_tag('rbac/menu.html')
    def menu(request):
        menu_list = request.session.get('permisson_menu_list')
        for item in menu_list:
            # url =
            if re.match('^{}$'.format(item['url']), request.path):
                item['class'] = 'active'  # 当点下了那个url,才会给一个点下的url分配这个'active' # 就是选中的状态
                break
        return {"menu_list": menu_list}  
    

    menu_list.html

    <div class="static-menu">
    
        {% for item in menu_list %}
            <a href="{{ item.url }}" class="{{ item.class }}">
                <span class="icon-wrap"><i class="fa {{ item.icon }}"></i></span> {{ item.title }}</a>
        {% endfor %}
    </div>
    

    day75二级菜单权限

    改了权限表

    1571211056397

    之前的model class Permission(models.Model):权限表

    is_menu = models.BooleanField(default=False, verbose_name='是否是菜单')
    

    现在的

    menu = models.ForeignKey('Menu',null=True)
    
    class Menu(models.Model):
    
        title = models.CharField(max_length=32, verbose_name='一级菜单', null=True, blank=True)
        icon = models.CharField(max_length=32, verbose_name='一级菜单图标', null=True, blank=True)
    

    设计数据结构

    ‘目标数据结构’        
    {1:{# 1 --menu_id       
    'title':'..',       
    'icon':'xxx',       
    children:[{'title':'二级',‘url’:'xxx'},       
    {'title':'二级',‘url’:'xxx'},]    
    },      
    2:{# 2 --menu_id    
    'title':'..',   
    'icon':'xxx',   
    children:[{'title':'二级',‘url’:'xxx'},   
    

    先走login, login之后权限注入 。 def initial_session(request,user_obj):

    这个什么意思来?怎么这么多字段 之前是object对象 现在是字典 pk是啥 是id啊

        permissions = models.Permission.objects.filter(role__user__name=user_obj).values('title','url','pk','menu_id','menu__title','menu__icon','menu__pk','pid').distinct()
    
    

    这些和之前一样

      permisson_list = []
        # permisson_menu_list = []
        permisson_menu_dict = {}
        for item in permissions:
            # permisson_list = [i.url for i in permissions]
            # permisson_list.append(item['url'])
            permisson_list.append({
                'pk':item['pk'],
                'url':item['url'],
                'pid':item['pid'],
            })
    

    往session中注入菜单栏的数据

            if item['menu_id']:  #有说明是一级菜单, 这样加
    
                if item['menu_id'] in permisson_menu_dict:
                    permisson_menu_dict[item['menu__pk']]['children'].append(
                        {'pk':item['pk'],'title': item['title'], 'url': item['url']}
                    )
    
                else:  # 没有则说明是二级菜单,多加了children栏
    
                    permisson_menu_dict[item['menu__pk']] = {
                        'title':item['menu__title'],
                        'icon':item['menu__icon'],
                        'children':[
                            {'pk':item['pk'],'title':item['title'],'url':item['url']}
                        ],
                    }
    

    写成这样的格式

               '''
                1:{  # 1--menu_id
                    'title':'..',
                    'icon':'xx',
                    children:[
                        {'title':'二级','url':'xx'},
                        
                    ]
                },'''
    
       request.session['permisson_list'] = permisson_list
        request.session['permisson_menu_dict'] = permisson_menu_dict
    

    中间件权限认证:

        for item in request.session['permisson_list']:
    
                # [
                #     {'url':'/customer/add/','pid':'1','pk':1}
                #
                # ]
                
                reg = '^%s$'%item['url']
                ret = re.search(reg,request.path)
                if ret:
                    request.show_id = item['pid']  # 多加了这一步,‘pid’是后面的那个id   1111  5555   前面的是menu_id  
                    return None
    

    走customer页面的时候()

    @register.inclusion_tag('rbac/menu.html')
    def menu(request):
        # menu_list = request.session.get('permisson_menu_list')
        menu_dict= request.session.get('permisson_menu_dict')
        for key,item in menu_dict.items():
            item['class'] = 'hide'
    
            for child in item['children']:
                # /customer/add/
                # 'url': '/customer/list/'
                # 'url': '/payment/list/'
                # # if re.match('^{}$'.format(child['url']), request.path):
                if request.show_id == child['pk']:  
                    # null == child['pk'] 1
    
                    item['class'] = ''
                    child['class'] = 'active'
                    break
    
    
        return {"menu_dict": menu_dict}
    

    show_id 是pid 就是表里后面写的1111 5555 pk是id 就是12345678 因为点的pk是1和5 所以 if request.show_id == child['pk']: 等于1 和等于 5 时成立 , 展开当前的子标签 就是二级菜单了

    <div class="multi-menu">
    
        {% for item in menu_dict.values %}
    
            <div class="item">
                <div class="title">
                    <i class="{{ item.icon }}"></i>{{ item.title }}
                </div>
                {% for child in item.children %}
                    <div class="body {{ item.class }}">
                        <a href="{{ child.url }}" class="{{ child.class }}">{{ child.title }}</a>
                    </div>
                {% endfor %}
    
            </div>
    
        {% endfor %}
    
    </div>
    

    点击一级菜单的时候, 好像是前端js的事情吧?

    $('.item .title').click(function () {
        $(this).next().toggleClass('hide');
        $(this).parent().siblings().children(".body").addClass("hide")
    });
    

    还有一个过滤器 , 什么用来,判断的,判断啥来, 先不管了。

    @register.filter
    def haspermission(base_url,request):
    
    
        for item in request.session['permisson_list']:
            #item = {'url','','title':'','name':''}
            reg = '^%s$' % item['url']  #/customer/edit/(d+)/ --- "/customer/edit/1/"
            ret = re.search(reg, base_url)
            # if item['name'] == base_url:
            if ret:
                return True
    
        return False
    
    

    day76 面包屑(代码结果运行不出结果,逻辑是这样下边的)

    又叫路径导航,点一下,又出来一个。

    动态生成:三级编辑的可以替换删除的

    首页:客户列表 客户列表的url (按说首页是欢迎页面,但是这里写死了)

    middlewares.py 
    
    request.menu_breadcrumb  = [
        {‘title’:'首页',‘url’:'javascript:void(0)'},      
        #{‘title’:'客户列表',‘url’:'/cusomter/list/'}, 写死了      #js:void(0) 每次都刷新,不加井号   让人看不让人用 
    ]
    
    if ret:
        if item['pid'] == item['pk']:
            request.menu_breadcrumb.append(
        {
            'title' : item['title'],
            'url':request.path,
        })
        
        from rbac import models
        else:       循环多次所以渲染多次首页/客户列表/编辑客户
            obj = models.Pe.o.filter(pk=item['pid']).first()
                l1 = [
                { #父权限 客户列表
                    'title':obj.title,
                    'url':obj.url,
                },
                
                { #子权限 编辑客户
                    'title' : item['title'],
                    'url':request.path,
                },
                ]
                request.menu_breadcrumb.extend(l1)  和append差不多
    
    layout.html
    
    {% for bread in request.menu_breadcrumb}
    
    {% if forloop.last%}
         {{bread.url}}{bread.title}  产品经理最后的没有了点击效果
    {% else}
        a href {{bread.url}}{bread.title}
    {% endif }
    
    {%endfor}
    

    day77 crm批量录入学生成绩

    day78 crm权限分配和流程梳理

    dotnet-cnblog C:UsersAdministratorDesktopcrm复习.md

  • 相关阅读:
    Jenkins分享
    Java静态绑定和动态绑定
    SpringBoot中RedisTemplate订阅发布对象
    Idea项目:Failed to create a Maven project ‘…pom.xml’ already exists in VFS 解决
    Java Web不能不懂的知识
    Required String parameter 'id' is not present
    Hive使用druid做连接池代码实现
    Docker Toolbox常见错误解决方案
    初学者手册-MyBatis踩坑记(org.apache.ibatis.binding.BindingException)
    SpringMVC日志管理(自定义异常及自定义注解)
  • 原文地址:https://www.cnblogs.com/Doner/p/11802201.html
Copyright © 2020-2023  润新知