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 总结的更多相关文章
- Enterprise Solution 3.1 企业应用开发框架 .NET ERP/CRM/MIS 开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms
行业:基于数据库的制造行业管理软件,包含ERP.MRP.CRM.MIS.MES等企业管理软件 数据库平台:SQL Server 2005或以上 系统架构:C/S 开发技术 序号 领域 技术 1 数据库 ...
- SAP CRM 性能小技巧
导言 本页面打算收集SAP CRM实施中可以用于避免性能问题的注意事项,重要的事项会由图标标识. 如果你有其他的技巧想要说出来,别犹豫! 性能注意事项 通用 缓存读取类访问,特别是在性能关键的地方,比 ...
- SAP CRM 树视图(TREE VIEW)
树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...
- SAP CRM 用户界面对象类型和设计对象
在CRM中的用户界面对象类型的帮助下,我们可以做这些工作: 进行不同的视图配置 创建动态导航 从设计层控制字段标签.值帮助 控制BOL对象的属性的可视性 从导航栏访问自定义组件 一个用户界面对象类型之 ...
- SAP CRM 显示消息/在消息中进行导航
向用户展示消息,在任何软件中都是十分重要的. 在SAP CRM WEB UI中展示消息,不是一项很难的任务,只需要创建消息并在之后调用方法来显示它 消息类和消息号: 我在SE91中创建了如下的消息类和 ...
- Dynamics CRM 2015-Data Encryption激活报错
在CRM的日常开发中,Data Encryption经常是不得不开启的一个功能.但是有时,我们可能遇到一种情况,Organization导入之后,查看Data Encryption是已激活的状态,但是 ...
- SAP CRM 客户控制器与数据绑定
当用户从视图离开时,视图将失去它的数据.解决这个问题,需要引入客户控制器(Custom Controller)(译者注:SAP CRM客户端中,不同地方的Custom Controller会翻译为“客 ...
- SAP CRM BOL编程基础,代码+详细注释
网络上可以找到一些使用BOL查询.维护数据的DEMO,但几乎都是单纯的代码,缺乏说明,难以理解.本文除了代码外,还给出了详细的注释,有助于理解BOL编程中的一些基本概念. 这是一篇翻译的文章,你可能会 ...
- SAP CRM 通过调试观察CL_CRM_BOL_ENTITY中的数据
这个(BOL里面)最重要的类值得一看. BOL中的每条记录都会在CL_CRM_BOL_ENTIT中表示.至今,我们已经写过一些事件处理器,并且我们已经直接或间接的通过这个类工作.在业务场景中,我们也许 ...
- SAP CRM 7.0中的BOL(Business Object Layer)
业务对象层(BOL)和通用交互层(GenIL)属于业务层. 业务对象层: 在CRM WebClient会话运行期间,业务对象层存储业务对象的数据以及它们属性和关系的定义. 通用交互层 通用交互层将 ...
随机推荐
- Effection Go
Introduction: 新语言, 新思维 Formatting Indentation: 默认tab Line Length: 无限制, 会自动换行 Parentheses: 圆括号, 无限制, ...
- dotnet pack 打包文件版本号引起 "Could not load file or assembly" 问题
如果不是遇到,真的不会想到,代码世界的问题真是千奇百怪,这次遇到的是 dotnet pack 打包文件版本号引起的问题. 之前进行 nuget 打包都是在 Visual Studio build 时进 ...
- MVVM 下 ContextMenu的命令绑定
原文:MVVM 下 ContextMenu的命令绑定 由于ContextMenu不继承父级的DataContext,所以如果要绑定父级的DataContext,直接DataContext=" ...
- Xcode自动注释插件: VVDocumenter使用和安装
开源插件: VVDocumenter 下载地址: https://github.com/onevcat/VVDocumenter-Xcode 使用效果: 使用方法: 在方法写///,效果同上图,下面有 ...
- Win8Metro(C#)数字图像处理--2.11图像锐化
原文:Win8Metro(C#)数字图像处理--2.11图像锐化 [函数名称] 图像锐化函数SharpeningProcess(WriteableBitmap src,double sharpe ...
- SQL Server 命名实例更改端口进行发布订阅
原文:SQL Server 命名实例更改端口进行发布订阅 两台数据库服务器,都没有加入域,都安装多实例,端口也不一样了.现在使用命名实例进行复制,折腾了好久,才发现解决方法. 服务器A:myserve ...
- Caliburn.Micro 自定义View和ViewModel的匹配规则
使用TypeMappingConfiguration类 //Override the default subnamespaces var config = new TypeMappingConfigu ...
- 邮件带附件和html格式
1. 发送有附件的邮件需要添加一个附件类Attachment,这个附件可以为文件和图片: Attachment attach = new Attachment(“文件路径”");//文件 A ...
- Qt 5.3更新无数,更改C++控制台输出最为赞(这样就和普通C++ IDE没区别了)
转载请注明文章:Qt 5.3更新无数,更改C++控制台输出最为赞 出处:多客博图 本人觉得有了这个更新,Qt Creator可谓几乎没有缺点了,起码仅仅开发C/C++,是不用再去安装VS了. Qt 5 ...
- [2017.02.06] 阅读《Effective Morden C++》