2 Star 6 Fork 6

张亚飞/客户关系管理系统

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
CRM.txt 10.33 KB
一键复制 编辑 原始数据 按行查看 历史
张亚飞 提交于 2019-06-03 15:49 . 客户关系管理系统
CRM开发:选对方向,跟对人,坚持住
一套通用的增删改查框架
角色管理
通用的权限管理
数据增删改查有几种方式:
Ajax:提交数据页面不会刷新,验证,无需保留上次内容
form表单:页面会刷新,但django的form可以自动生成表单,验证,可以保留上次内容
前端验证:减少服务端的压力
后端验证:数据的安全,使数据真正符合要求
admin
username:zhang xiaoli
password:zhangyafei xiaoli@123
1.需求分析
存储所有客户咨询信息
避免重复数据
客户多次跟踪记录
客户来源、成单率分析
每个销售只能修改自己的客户信息
报名流程开发
班级管理
学员成绩、出勤管理
问卷调查
校区管理
课程管理
课程大纲,周期,价格,代课老师
讲师的上课记录
学员就业情况
知识库
权限管理
角色
销售
销售主管
讲师
学员
管理员
2.思维导图
3.业务场景分析(用户使用场景)
销售
(1)销售人员A刚从 百度推广 聊了一个客户,录入了CRM系统,咨询了Python全栈开发课程,但是没报名
(2)销售B从 qq群 聊了新客户,且报名了Python全栈5期课程,给客户发送了报名链接,待用户填写完毕后,把他添加到了Python fullstack
s5的班级里
(3)销售C 打电话给之前的一个客户,睡服了他报名Linux36期,但是没睡服成功,更新了跟踪记录
(4)销售D 聊了一个客户,录入时发现客户已存在,不能录入,随后通知响应的客户负责人 跟进
(5)销售B从 客户库里过滤出了 所有 超过一个未跟踪的客户,进行跟踪
(6)销售主管 查看了 部门本月的销售报表 包括来源分析 成单率分析 班级报名数量分析 销售额环比 同比
学员
(1)客户A 填写了销售发来的报名链接 上传了个人的证件信息 提交 过了一小会儿,发现收到一个邮件,告知他报名python5期课程成功,并帮他开通了学员账号
(2)学员A 登录了学员系统,看到了自己的合同,报名的班级,课程大纲
(3)学员A 提交了PY 5期的第三节课的作业
(4)学员A查看了自己在py5期的学习成绩,排名
(5)学员A 录入了一条 转介绍信息
(6)学员A 在线 搜索一个问题,发现没有答案,于是提交了一个问题
讲师
1.登录了CRM,查看自己管理的班级列表
2.进入了python5期,创建了第三节的上课记录,填入了本节内容,作业需求,
3.为python5期的第三节课 进行点名,发现小东北迟到了。标记他为迟到状态
4.批量下载了所有学员的py5期第二节的作业,给每个人在线 批了成绩 + 批注
管理员
(1)创建了,课程Linux,python,
(2)创建了校区 北京,上海
(3)创建了班级python fullstack s5 和 linux 36
(4)创建了账号A,B,C,D
(5)创建了销售,讲师,学员三个角色,并把ABCD分配到了销售角色里
(6)设置了销售可以操作的权限
4.原型图
Axure
开发工具选型
python
Django
mysql
jquery
bootstrap
linux
nginx
pycharm
创建项目
设计表结构
写代码
后续加入的表
权限
问卷调查
知识管理
合同
动态菜单
销售角色
客户的增删改查
onetoone 反向查 request.user.userprofile 后面跟反向的小写表名就可以
fk 反向查 request.user.userprofile_set 后面跟反向的小写表名+_set就可以
{{ request.user.userprofile.role.all }}
{{ request.user.userprofile.role.select_related }}
权限管理 user表,role表,menus表
django自带登录验证
from django import conf
conf.settings.INSTALLED_APPS #动态获取配置文件
enabel_admins = {
'crm':{'customer':CustomerAdmin,'role':RoleAdmin},
}
get_status_display()
models.CustomerInfo._meta.fields #获取所有字段对象
models.CustomerInfo._meta.get_field('status') #取一个字段对象
b = models.CustomerInfo._meta.get_field('status')
b.choices
[(0, '未报名'), (1, '已报名'), (2, '已退学')]
b.get_choices()
In [50]: b.get_internal_type()
Out[50]: 'SmallIntegerField'
In [51]: models.CustomerInfo.objects.filter(date__lte='2018-10-21')
Out[51]: <QuerySet [<CustomerInfo: 大头儿子>, <CustomerInfo: 张三>, <CustomerInfo: 李四>]>
Out[33]: [('', '---------'), (0, '未报名'), (1, '已报名'), (2, '已退学')]
d = [(0,'sas'),(1,'ssaa')]
c = [(0,1,3),('121','asa','sasa')]
In [48]: list(zip(*c))
Out[48]: [(0, '121'), (1, 'asa'), (3, 'sasa')]
list(zip(*d))
Out[45]: [(0, 1), ('sas', 'ssaa')]
import time
time_obj =time.gmtime()
In [55]: time_now = time.strftime('%Y-%m-%d',time_obj)
In [56]: time_now
Out[56]: '2018-10-21'
delete
a._meta.fields FK
a._meta.related_objects 反向关联
a._meta.many_to_many m2m
action
action 优化
面包屑导航
报名流程
销售 发起报名流程 选择班级 发报链接给学员
选择班级 选择客户
学员 填写在线报名表,填写个人信息,上传证件信息,同意培训协议
销售 审核报名表,审核通过后,创建一条缴费记录,自动把学员添加到相应的班级,报名成功
讲师上课
csrf:跨域请求保护
本质服务器与浏览器建立的是短链接,一次请求服务器返回一个页面,下载渲染之后在浏览器显示
为防止每一次请求都要登录,服务器在第一次的时候会建立当前用户的cookie,会返回一个session_id,下一次请求的时候浏览器会带着session_id去请求,服务器端验证session_id还是刚才那一个就不需要登录了
同源策略
GET 获取数据 幂等请求 请求多少次都不变化
csrf taken 令牌 口令
自定义用户认证:django支持变换认证方案:https://docs.djangoproject.com/en/2.1/topics/auth/customizing/
request.user.userprofile
class Meta:
abstract=True #不创建表,只把字段继承给自己的子类
MD5不可以反解
zhangyafei abc123 db zhengyafei sasaddsdsdsdssddss
装库
MD5+盐 abc123 = a12cb3
LDAP 轻量级目录账号管理协议
集中账号管理
Single Sign On
单点登录 SSO
request.user = userprofile
c/s
b/s
权限管理
student[
my_course
my_contract
my_homework
]
sales [
customers
get 获取客户表
post 修改 客户信息
my_customers
...
]
一条权限 = 一个动作 = 一个url + 请求方法 + 请求参数
perm_dic={
'crm_table_index':['table_index','GET',[],{},], #可以查看CRM APP里所有数据库表
'crm_table_list':['table_list','GET',[],{}], #可以查看每张表里所有的数据
'crm_table_list_view':['table_change','GET',[],{}],#可以访问表里每条数据的修改页
'crm_table_list_change':['table_change','POST',[],{}], #可以对表里的每条数据进行修改
}
'crm_table_list':['table_list','GET',[‘source','status'],{}], #可以查看每张表里所有的数据
  列表操作
In [23]: l = [1,2,3,4,5]
In [24]: all(l)
Out[24]: True
In [25]: a,b,c,d,e = l
In [26]: a
Out[26]: 1
In [27]: A,*B,C = l
In [28]: A
Out[28]: 1
In [29]: B
Out[29]: [2, 3, 4]
def perm_check(*args,**kwargs):
1.获取当前请求的url
2.把url解析成url_name
3.判断当前用户是否已登录 user.is_authenticated()
3.拿url_name到permission_dict去匹配,匹配时要包括请求方法和参数
4.拿匹配到权限key,调用user.has_perm(key)
反向解析
from django.urls import resolve
In [20]: r = resolve('/kingadmin/crm/customerinfo/')
In [21]: r
Out[21]: ResolverMatch(func=kingadmin.permissions.inner, args=('crm', 'customerinfo'), kwargs={}, url_name=table_obj_list, app_names=['kingadmin'], namespaces=['kingadmin'])
In [22]: r.url_name
Out[22]: 'table_obj_list'
In [7]: dir(models.CustomerInfo._meta)
Out[7]:
['FORWARD_PROPERTIES',
'REVERSE_PROPERTIES',
'__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'_expire_cache',
'_forward_fields_map',
'_get_fields',
'_get_fields_cache',
'_ordering_clash',
'_populate_directed_relation_graph',
'_prepare',
'_property_names',
'_relation_tree',
'abstract',
'add_field',
'add_manager',
'app_config',
'app_label',
'apps',
'auto_created',
'auto_field',
'base_manager',
'base_manager_name',
'can_migrate',
'concrete_fields',
'concrete_model',
'contribute_to_class',
'db_table',
'db_tablespace',
'default_apps',
'default_manager',
'default_manager_name',
'default_permissions',
'default_related_name',
'fields',
'fields_map',
'get_ancestor_link',
'get_base_chain',
'get_field',
'get_fields',
'get_latest_by',
'get_parent_list',
'get_path_from_parent',
'get_path_to_parent',
'has_auto_field',
'index_together',
'indexes',
'installed',
'label',
'label_lower',
'local_concrete_fields',
'local_fields',
'local_managers',
'local_many_to_many',
'managed',
'managers',
'managers_map',
'many_to_many',
'model',
'model_name',
'object_name',
'order_with_respect_to',
'ordering',
'original_attrs',
'parents',
'permissions',
'pk',
'private_fields',
'proxy',
'proxy_for_model',
'related_fkey_lookups',
'related_objects',
'required_db_features',
'required_db_vendor',
'select_on_save',
'setup_pk',
'setup_proxy',
'swappable',
'swapped',
'unique_together',
'verbose_name',
'verbose_name_plural',
'verbose_name_raw']
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/zhangyafeii/CRM.git
git@gitee.com:zhangyafeii/CRM.git
zhangyafeii
CRM
客户关系管理系统
master

搜索帮助