目录

一. 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对象, 将该对象复制后可给该字典中添加页码的相关参数, 使用QueryDicturlencode()方法, 将结果拼接到生成的URL上.

添加或编辑后跳转至原页面: 自己生成一个QueryDict对象, 将当前访问的完整路径添加到该字典中复制给next, 使用QueryDicturlencode()方法, 将结果拼接到生成的添加或编辑的URL上. 添加或编辑后从request.GET中获取到next的值, 跳转到该地址即可.

9. CRM中有哪些优点, 用于做什么(至少写5个)

技术点 作用
auth模块 认证
modelform 对表进行增删改查
分页 对数据进行分页显示
Q对象 查询条件==或==的关系
QueryDict 保留搜索条件
url的命名和反向解析 ----
事务 + 行级锁 加入私户
批量创建对象 ----
modelformset ----

二. 权限

1. 使用几张表来完成权限控制的?每张表中有哪些字段?

字段
菜单表Menu idname
权限表Permission idtitleurlnameparent_idmenu_id
角色表Role idname
用户表User idusernamepassword
角色和权限关系表 idrole_idpermission_id
用户和角色关系表 iduser_idrole_id

2. 请简述实现权限控制的流程

在web应用中, 一个URL代表一个权限, 可以访问某一URL则说明有该权限. 该权限系统中URL被分为两种, 一种是可以做二级菜单的父权限, 一种是不能做菜单的子权限. Menu表中的数据称之为一级菜单, 二级菜单被分配给一级菜单. 子权限分配给父权限.

当用户登录成功时, 根据用户所有的角色查询出所具有的权限, 将权限信息和菜单信息存放在session中. 登录成功后跳转至其他URL时, 请求经过中间件时进行权限的校验, 根据当前访问的urlsession中存放的权限信息进行正则匹配. 都匹配不成功, 则拒绝访问. 匹配成功则继续走正常的流程得到相应的响应.

页面中的可点击的按钮也是权限, 在模板渲染时使用自定义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给一级菜单都添加了一个hideclass, 默认一级菜单下的二级菜单(父权限)是否是要默认选中的二级菜单, 如果是的话, 给该二级菜单添加一个activeclass, 给该二级菜单对应的一级菜单的class重新赋值为空.

模板中生成二级菜单时添加上对应的class, 则显示出相应的状态. classhide则是隐藏状态, classactive则是选中状态.

6. 权限控制到按钮级别是如何实现的?

session中存放着一个有关权限信息的字典, 字典的key为权限的URL别名, value为一个权限的具体信息.

自定义了一个filter, 用来判断某一个权限是否在该用户的权限字典中, 在的话返回True, 不在返回False.

模板中使用该filter来对每个要生成按钮的部分做判断, 有权限则会显示按钮, 没有权限则不显示.

7. 权限批量操作时, 哪些权限是需要新增的?哪些是需要删除的?哪些是可更新的?

  • 新增的: 路由系统中有, 数据库中没有的.

  • 删除: 路由系统中没有, 数据库中有的

  • 可更新: 路由系统和数据库中都有的

8. 开发过程中遇到问题,一般都是怎样解决的?请说一下你印象比较深刻的一个问题.

9. 请简述管理权限信息的流程(管理,分配权限是如何操作的)

  • 管理页面对权限进行增加,删除,更新等操作
  • 角色管理页面, 分别对角色设置权限并保存
  • 分别为用户设置角色信息并保存

10. 简述如何将rbac组件应用到一个新项目中.

  • (1)拷贝rbac组件到新的项目中, 注册app
  • (2)修改用户表, 继承rbac中的User
  • (3)执行数据库迁移指令
    • 1)删除rbacmigrations中的记录
    • 2)注释掉admin中的User
    • 3)roles=models.ManyToManyField(to=Role, verbose_name='用户拥有的角色', blank=True) 注意: 关联的字段不要写成字符串形式
  • (4)设置rbacurl

  • (5)菜单管理
  • (6)权限的录入
    • 1)所有的url要有name
    • 2)不要忽略rbacnamespace
    • 3)注意url和别名的长度
    • 4)构建层级结构
  • (7)角色管理
  • (8)分配权限
    • 1)注意用新的用户表替换rbac中的User
    • 2)给不同角色分配权限
    • 3)给不同用户分配角色
  • (9)应用权限
    • 1)应用中间件 -- 在settings.py中写上权限的配置
    • 2)登录成功后权限信息的初始化
  • (10)动态生成二级菜单
  • (11)应用路径导航
  • (12)权限控制到按钮级别

11. rbac组件中有哪些技术点, 用于做什么?

技术点 作用
中间件 进行访问权限校验
inclusion_tag 动态生成二级菜单和路径导航
filter 权限控制到按钮级别
modelformset 权限的批量操作
session 保存权限和菜单的数据结构

CRM 总结的更多相关文章

  1. 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 数据库 ...

  2. SAP CRM 性能小技巧

    导言 本页面打算收集SAP CRM实施中可以用于避免性能问题的注意事项,重要的事项会由图标标识. 如果你有其他的技巧想要说出来,别犹豫! 性能注意事项 通用 缓存读取类访问,特别是在性能关键的地方,比 ...

  3. SAP CRM 树视图(TREE VIEW)

    树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...

  4. SAP CRM 用户界面对象类型和设计对象

    在CRM中的用户界面对象类型的帮助下,我们可以做这些工作: 进行不同的视图配置 创建动态导航 从设计层控制字段标签.值帮助 控制BOL对象的属性的可视性 从导航栏访问自定义组件 一个用户界面对象类型之 ...

  5. SAP CRM 显示消息/在消息中进行导航

    向用户展示消息,在任何软件中都是十分重要的. 在SAP CRM WEB UI中展示消息,不是一项很难的任务,只需要创建消息并在之后调用方法来显示它 消息类和消息号: 我在SE91中创建了如下的消息类和 ...

  6. Dynamics CRM 2015-Data Encryption激活报错

    在CRM的日常开发中,Data Encryption经常是不得不开启的一个功能.但是有时,我们可能遇到一种情况,Organization导入之后,查看Data Encryption是已激活的状态,但是 ...

  7. SAP CRM 客户控制器与数据绑定

    当用户从视图离开时,视图将失去它的数据.解决这个问题,需要引入客户控制器(Custom Controller)(译者注:SAP CRM客户端中,不同地方的Custom Controller会翻译为“客 ...

  8. SAP CRM BOL编程基础,代码+详细注释

    网络上可以找到一些使用BOL查询.维护数据的DEMO,但几乎都是单纯的代码,缺乏说明,难以理解.本文除了代码外,还给出了详细的注释,有助于理解BOL编程中的一些基本概念. 这是一篇翻译的文章,你可能会 ...

  9. SAP CRM 通过调试观察CL_CRM_BOL_ENTITY中的数据

    这个(BOL里面)最重要的类值得一看. BOL中的每条记录都会在CL_CRM_BOL_ENTIT中表示.至今,我们已经写过一些事件处理器,并且我们已经直接或间接的通过这个类工作.在业务场景中,我们也许 ...

  10. SAP CRM 7.0中的BOL(Business Object Layer)

    业务对象层(BOL)和通用交互层(GenIL)属于业务层. 业务对象层:   在CRM WebClient会话运行期间,业务对象层存储业务对象的数据以及它们属性和关系的定义. 通用交互层 通用交互层将 ...

随机推荐

  1. Emgu-WPF 激光雷达研究-移动物体跟踪

    原文:Emgu-WPF 激光雷达研究-移动物体跟踪 接前两篇博客: 激光雷达数据解析并绘制雷达图 https://blog.csdn.net/u013224722/article/details/80 ...

  2. C# 元组、匿名对象、ref&out

    元组 private (int number,int newNumber) CaculateByTuple(int number) { return (number: number, newNumbe ...

  3. 在 Laravel 中通过 Artisan View 扩展包创建及删除应用视图文件

    1.简介 本扩展包添加了两个视图相关的Artisan命令到Laravel应用,以便我们通过Artisan命令即可创建和管理视图文件,可谓是进一步解放了生产力. 2.安装 还是通过Composer安装: ...

  4. 『开发技巧』Python音频操作工具PyAudio上手教程

    『开发技巧』Python音频操作工具PyAudio上手教程 ​ 0.引子 当需要使用Python处理音频数据时,使用python读取与播放声音必不可少,下面介绍一个好用的处理音频PyAudio工具包. ...

  5. 【Linux】PuTTY----------windows访问Linux 快捷方便

    第一步:百度PuTTY,下载好后直接运行,界面如下: 第二步:后输入IP:10.45.XX.XX,直接点击open按钮 第三步:输入用户名: 第四步:密码~ 现在,您就可以对你访问的linux设备进行 ...

  6. Win10 UWP版《芒果TV》v2.4.0直播超女,芒果台综艺一网打尽

    Win10 UWP版<芒果TV>直播超女,芒果台综艺一网打尽 Win10版UWP<芒果TV>自2015年9月登录商店以来,一直在持续更新,积极改进,拥有芒果台视频的独家点播和直 ...

  7. 浅谈.NET编译时注入(C#-->IL)

    原文:浅谈.NET编译时注入(C#-->IL) .NET是一门多语言平台,这是我们所众所周知的,其实现原理在于因为了MSIL(微软中间语言)的一种代码指令平台.所以.NET语言的编译就分为了两部 ...

  8. qt技巧--使用html导出表格替代excel

            曾经为qt不能直接导出excel而困扰,后来经过深入了解,得知qt支持xml国际语言,html是xml的一种.html是做网页的,相信大家比较熟悉.所以使用html的<table ...

  9. 栈内存不是只有2M吗?为什么不溢出?

    #include <stdio.h> #include <wchar.h> #include <stdlib.h> #define MAX_PATH 1024 FI ...

  10. 《解读window核心编程》 之 进程

    1.         进程是执行文件的运行时形态.包括两部分:内核数据(对应内核对象).地址空间(包括执行文件代码和栈堆等动态内存). 2.         把VC的“系统-子系统”值删除掉,即不指定 ...