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)
有三张表,又生成了两张多对多的表
user
role
permission
role_permission
user_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一级菜单的菜单权限
客户和缴费列表。is_menu 是true,别的title不是,就可以筛了
和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二级菜单权限
改了权限表
之前的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