CRM总结大纲
- 一. CRM客户关系管理系统
- 二. 权限
- 1. 使用几张表来完成权限控制的?每张表中有哪些字段?
- 2. 请简述实现权限控制的流程
- 3. 初始化权限时, 定义了两个字典, 分别是什么数据结构?为什么要把他们存在session中?
- 4. 权限校验的中间件都做了什么事情?
- 5. 如何实现二级菜单默认展开并且是选中状态的?
- 6. 权限控制到按钮级别是如何实现的?
- 7. 权限批量操作时, 哪些权限是需要新增的?哪些是需要删除的?哪些是可更新的?
- 8. 开发过程中遇到问题,一般都是怎样解决的?请说一下你印象比较深刻的一个问题.
- 9. 请简述管理权限信息的流程(管理,分配权限是如何操作的)
- 10. 简述如何将rbac组件应用到一个新项目中.
- 11. rbac组件中有哪些技术点, 用于做什么?
 
一. CRM客户关系管理系统
1. CRM是什么? 里面都有哪些功能(业务)?
CRM系统是提供给销售, 班主任, 财务等人员使用的.
- 销售功能:
- 录入客户相关信息, 记录跟进客户情况, 添加报名表, 添加缴费记录及相关内容的展示.
 
- 班主任功能:
- 创建或编辑班级信息, 创建课程记录, 批量生成学生学习记录及相关内容的展示.
 
- 财务功能:
- 财务审批等
 
2. 什么是公户?什么是私户?为什么要做这个区分?
在CRM系统中, 将没有绑定销售的客户称为公户, 绑定销售的客户称为私户.
销售人员各自维护自己的客户(私户), 不可以查看或者跟进其他人的客户, 避免产生纠纷.
3. 请列举出CRM系统中的表
4. 通过ORM操作对数据库的数据做展示时, 不同字段类型有不同的展示方法, 分别是什么?
- 普通字段 -- 对象.字段名
- choice字段 -- 对象.get_字段名_display
- 外键 -- 对象.外键字段.属性
- 多对多 -- 对象.自定义方法
5. 简述如何使用modelform
(1)定义一个modelform:
class CustomerForm(forms.ModelForm):
    """这里可以重写某些字段"""
    class Meta:
        model = models.Customer
        fields = "__all__"
        exclude =
        wegits = 
(2)视图中:
form_obj = CustomerForm()
form_obj = CustomerForm(request.POST)
from_obj.is_valid()
(3)模板中:
{% for field in form_obj %}
	{{ field }}
{% endfor %}
6. 请详细说说公司销售是如何使用CRM的
销售可以通过个人渠道获取客户信息, 自己录入到系统中, 或者销售主管或网络咨询师将已经录入系统的客户分配给销售.
销售需要在规定时间间隔内对客户进行跟进或回访, 将跟进信息记录到系统中, 根据不同的情况标记客户的报名意向.
当客户确定报名时需要让客户本人或者销售帮忙添加报名表.
当销售收到客户缴纳的费用时, 需要填写缴费记录, 并将费用转交财务进行审批.
7. 详细说说班主任是如何使用CRM的
班主任对班级信息进行管理, 对班级信息进行增删改查.
创建好班级信息后, 可以对某一班级创建课程记录, 记录上课的情况, 作业要求等信息.
创建好班级信息后, 可根据某节上课记录来生成学习的上课记录(学习记录), 该操作作为批量操作, 批量生成该课程所对应班级的所有学生的学习记录. 使用modelformset来展示和编辑这些学习记录.
8. CRM项目中哪些地方用到了QueryDict对象, 详细说说它的用法
分页保留搜索条件时: 搜索条件在request.GET中, request.GET就是QueryDict对象, 将该对象复制后可给该字典中添加页码的相关参数, 使用QueryDict的urlencode()方法, 将结果拼接到生成的URL上.
添加或编辑后跳转至原页面: 自己生成一个QueryDict对象, 将当前访问的完整路径添加到该字典中复制给next, 使用QueryDict的urlencode()方法, 将结果拼接到生成的添加或编辑的URL上. 添加或编辑后从request.GET中获取到next的值, 跳转到该地址即可.
9. CRM中有哪些优点, 用于做什么(至少写5个)
| 技术点 | 作用 | 
|---|---|
| auth模块 | 认证 | 
| modelform | 对表进行增删改查 | 
| 分页 | 对数据进行分页显示 | 
| Q对象 | 查询条件或的关系 | 
| QueryDict | 保留搜索条件 | 
| url的命名和反向解析 | ---- | 
| 事务 + 行级锁 | 加入私户 | 
| 批量创建对象 | ---- | 
| modelformset | ---- | 
二. 权限
1. 使用几张表来完成权限控制的?每张表中有哪些字段?
| 表 | 字段 | 
|---|---|
| 菜单表 Menu | id、name | 
| 权限表 Permission | id、title、url、name、parent_id、menu_id | 
| 角色表 Role | id、name | 
| 用户表 User | id、username、password | 
| 角色和权限关系表 | id、role_id、permission_id | 
| 用户和角色关系表 | id、user_id、role_id | 
2. 请简述实现权限控制的流程
在web应用中, 一个URL代表一个权限, 可以访问某一URL则说明有该权限. 该权限系统中URL被分为两种, 一种是可以做二级菜单的父权限, 一种是不能做菜单的子权限. Menu表中的数据称之为一级菜单, 二级菜单被分配给一级菜单. 子权限分配给父权限.
当用户登录成功时, 根据用户所有的角色查询出所具有的权限, 将权限信息和菜单信息存放在session中. 登录成功后跳转至其他URL时, 请求经过中间件时进行权限的校验, 根据当前访问的url和session中存放的权限信息进行正则匹配. 都匹配不成功, 则拒绝访问. 匹配成功则继续走正常的流程得到相应的响应.
页面中的可点击的按钮也是权限, 在模板渲染时使用自定义filter判断该按钮所代表的权限是否在该用户所拥有的权限中, 如果是则显示该按钮, 否则不显示.
3. 初始化权限时, 定义了两个字典, 分别是什么数据结构?为什么要把他们存在session中?
permission_dict = {
    '权限的URL别名':{
        'url': 'url路径',
        'id': '权限的id',
        'pid': '父权限的id',
        'title': '权限的标题',
        'pname': '父权限的URL别名',
    }
}
menu_dict = {
    'title': '客户管理',
    'icon': 'fa-address-book-o',
    'weight': 10,
    'children': [{
        'title': '客户列表',
        'url': '/customer/list/',
        'id': 1,
    },]
}
将权限和菜单的字典存放在session中是为了给不同用户存放不同的权限和菜单, 并且session可以存放在Redis中, 读取速度快.
4. 权限校验的中间件都做了什么事情?
(1)获取当前访问的URL, 判断是否在不需要权限校验的白名单中, 如果在则不再进行校验.
(2)从session中获取到该用户的权限信息.
(3)循环出每一个权限进行正则匹配, 匹配成功则改变flag标志位为True, 并且获取到需要默认展开菜单的权限id和要展示的路径导航信息.
(4)循环结束后, flag还未False则拒绝访问.
5. 如何实现二级菜单默认展开并且是选中状态的?
二级菜单是通过inclusion_tag实现的, 将request当作参数传给menu函数, 函数中从request中获取到menu_dict. 循环menu_dict给一级菜单都添加了一个hide的class, 默认一级菜单下的二级菜单(父权限)是否是要默认选中的二级菜单, 如果是的话, 给该二级菜单添加一个active的class, 给该二级菜单对应的一级菜单的class重新赋值为空.
模板中生成二级菜单时添加上对应的class, 则显示出相应的状态. class为hide则是隐藏状态, class为active则是选中状态.
6. 权限控制到按钮级别是如何实现的?
session中存放着一个有关权限信息的字典, 字典的key为权限的URL别名, value为一个权限的具体信息.
自定义了一个filter, 用来判断某一个权限是否在该用户的权限字典中, 在的话返回True, 不在返回False.
模板中使用该filter来对每个要生成按钮的部分做判断, 有权限则会显示按钮, 没有权限则不显示.
7. 权限批量操作时, 哪些权限是需要新增的?哪些是需要删除的?哪些是可更新的?
- 新增的: 路由系统中有, 数据库中没有的. 
- 删除: 路由系统中没有, 数据库中有的 
- 可更新: 路由系统和数据库中都有的 
8. 开发过程中遇到问题,一般都是怎样解决的?请说一下你印象比较深刻的一个问题.
9. 请简述管理权限信息的流程(管理,分配权限是如何操作的)
- 管理页面对权限进行增加,删除,更新等操作
- 角色管理页面, 分别对角色设置权限并保存
- 分别为用户设置角色信息并保存
10. 简述如何将rbac组件应用到一个新项目中.
- (1)拷贝 - rbac组件到新的项目中, 注册app
- (2)修改用户表, 继承 - rbac中的- User表
- (3)执行数据库迁移指令 - 1)删除rbac下migrations中的记录
- 2)注释掉admin中的User表
- 3)roles=models.ManyToManyField(to=Role, verbose_name='用户拥有的角色', blank=True)注意: 关联的字段不要写成字符串形式
 
- 1)删除
- (4)设置 - rbac的- url
- (5)菜单管理 
- (6)权限的录入 - 1)所有的url要有name
- 2)不要忽略rbac的namespace
- 3)注意url和别名的长度
- 4)构建层级结构
 
- 1)所有的
- (7)角色管理 
- (8)分配权限 - 1)注意用新的用户表替换rbac中的User
- 2)给不同角色分配权限
- 3)给不同用户分配角色
 
- 1)注意用新的用户表替换
- (9)应用权限 - 1)应用中间件 -- 在settings.py中写上权限的配置
- 2)登录成功后权限信息的初始化
 
- 1)应用中间件 -- 在
- (10)动态生成二级菜单 
- (11)应用路径导航 
- (12)权限控制到按钮级别 
11. rbac组件中有哪些技术点, 用于做什么?
| 技术点 | 作用 | 
|---|---|
| 中间件 | 进行访问权限校验 | 
| inclusion_tag | 动态生成二级菜单和路径导航 | 
| filter | 权限控制到按钮级别 | 
| modelformset | 权限的批量操作 | 
| session | 保存权限和菜单的数据结构 | 
CRM总结大纲的更多相关文章
- CRM项目-1模型与站点管理
		一.项目环境 语言:python3 IDE:pycharm 组件:bootstarp,jQuery 二.模型 2.1编写模型 联合唯一 class Meta:显示中文名. 认证使用django自带的U ... 
- CRM客户关系管理系统(一)
		第一章.CRM介绍和开发流程 1.1.CRM简介 客户关系管理(CRM) 客户关系管理(customer relationship management)的定义是:企业为提高核心竞争力,利用相应的信息 ... 
- CRM客户关系管理系统(二)
		第三章.前端页面设计 3.1.前端页面布局 Bootstrap模板下载 (1)静态文件 新建statics目录(存放css/fonts/imgs/js/plugins) settings配置 STA ... 
- crm
		CRM 开发 需求分析 存储所有的客户咨询信息 避免重复数据 客户的多次跟踪记录 客户来源.成单率分析 每个销售只能修改自己的客户信息 报名流程开发 班级管理 学员成绩,出勤管理 问卷调查 校区管理 ... 
- Django CRM客户关系管理系统
		CRM需求分析 随着信息化时代带来的科技创新,CRM客户关系管理系统带来的效益在已经成为很多企业提高竞争优势的一分部,CRM客户关系管理系统将企业管理和客户关系管理集成到统一的平台,其系统功能主要体现 ... 
- Django CRM系统
		本节内容 业务痛点分析 项目需求讨论 使用场景分析 表结构设计 业务痛点分析 我2013年刚加入老男孩教育的时候,学校就一间教室,2个招生老师,招了学生后,招生老师就在自己的excel表里记录一下,每 ... 
- CRM客户关系管理系统知识点总结
		一.项目需求(使用PrecessOn) 二.models.py from django.db import models from django.contrib.auth.models import ... 
- crm销售管理系统一
		一.环境配置 1.首先配置pip,环境变量配置 pip 9.0.1 from c:\users\administrator\envs\crm\lib\site-packages (python 3.6 ... 
- Django项目:CRM(客户关系管理系统)--84--74PerfectCRM实现CRM权限和权限组限制访问URL
		#models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ... 
随机推荐
- string::begin
			iterator begin() noexcept; const_iterator begin() const noexcept; iterator end() noexcept; const_ite ... 
- C语言例题
			1.连接两个字符串 将两个字符串连接,不要用stract函数 2.求矩阵外围元素之和 求3行3列矩阵的外围元素之和. 3.求矩阵主对角线和副对角线元素之和 求5行5列矩阵的主对角线和副对角线元素之和. ... 
- shell爬取斗图网
			#!/bin/bash read -p "请输入要爬取的页面数(默认为10):" page_num page_num=${page_num:-} echo $page_num re ... 
- sqlite3-python
			官网资料 https://sqlite.org/lang_createtable.html 操作参考: https://www.runoob.com/sqlite/sqlite-insert.html ... 
- JavaScript程序设计——FOR循环
			FOR循环流程图: 1.编写求6!的阶乘的代码 2.编写10个10相加的和 3.编写1+2+3+...+10连续相加的和 4.编写1+(1+2)+(1+2+3)+...+(1+2+3+...+10)连 ... 
- MFC 静态文本框
			窗体上操作控件内容,需要句柄,在控件处使用鼠标右键——添加变量. DoDataExchange()函数会自动生成代码,把ID与变量绑定(即DDX_Control(pDX, IDC_TEXT, objT ... 
- Ecplilse使用
			0 注意版本 新版本对JDK的支持是有限的,如果Ecplise版本过高,而JDK版本低的话可能会不支持JDK 1.快捷键 右键-->source中可快速生成get set 重写方法 2.Deb ... 
- [Cogs] 线型网络
			题面 http://cogs.pro:8080/cogs/problem/problem.php?pid=6 题解 https://www.zybuluo.com/wsndy-xx/note/1135 ... 
- [C语言]结构体初始化的不同方法
			结构体的定义 struct Test{ int first; double second; }Sample; 方法一 定义时直接赋值 Sample s(1, 1.00); 缺点:必须匹配变量顺序,不能 ... 
- javascript操作表单
			表单元素除了可以运用上述所有DOM相关操作外,为了简化,还有一系列自己的属性和方法. 表单除了支持鼠标,键盘,更改和html时间之外,还支持一些表单特有的事件,如focus,change,blur等等 ... 
