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:\Users\Administrator\Desktop\crm复习.md

posted @ 2019-11-05 22:30  learnacode  阅读(125)  评论(0编辑  收藏  举报