CRM 开发

需求分析
存储所有的客户咨询信息
避免重复数据
客户的多次跟踪记录
客户来源、成单率分析
每个销售只能修改自己的客户信息
报名流程开发
班级管理
学员成绩,出勤管理
问卷调查 校区管理 课程管理
课程大纲,周期,价格,代课老师 讲师的上课记录 学员就业情况 知识库 权限管理
角色
销售
销售主管 讲师 学员 管理员 思维导图 业务场景分析(用户使用场景) 销售
1. 销售人员A刚从 百度推广 聊了一个客户,录入了CRM系统,咨询了Python全栈开发课程,但是没报名
2. 销售B 从 qq群聊了客户,且报名了Python全栈5期课程,给用户发送了报名连接,待用户填写完毕后,把他添加到了PYTHON FULLSTACK S5的班级里
3. 销售C 打电话给之前的一个客户,睡服他报名Linux 36期,但是没睡服成功,更新了跟踪记录
4. 销售D 聊了一个客户,录入时发现 此客户已存在,不能录入,随后通知相应的客户负责人 跟进
5. 销售B 从客户库里过滤出了 所有 超过一个月未跟踪的客户,进行跟踪
6. 销售主管 查看了部门 本月的销售报表,包括来源分析,成单率分析,班级报名数量分析,销售额环比,同比 学员
1. 客户A 填写了销售发来的 报名连接,上传了个人的证件信息,提交,过了一小会,发现收到一个邮件,告知他报名python 5期课程成功,并帮他开通了学员账号,
2. 学员A 登录了学员系统,看到了自己的合同,报名的班级,课程大纲
3. 学员A 提交了PY 5期的 第3节课的作业
4. 学员A查看了自己在py 5期的 学习成绩,排名
5.学员A 录入了一条 转介绍信息
6. 学员A 在线 搜素一个问题,发现没有答案,于是提交了一个问题, 讲师
1. 登录了CRM,查看自己管理的班级列表
2. 进入了python 5期,创建了第3节的上课记录,填入了本节内容,作业需求
3. 为PYTHON 5 的第三节课 进行点名,发现小东北迟到了,标记他为迟到状态
4. 批量下载了所有学员的 py 5期第二节的作业, 给每个人在线 批了成绩 + 批注 管理员
1.创建了,课程linux, python ,
2.创建了校区 北京,上海,
3.创建了班级Python FULLSTACK S5 和Linux 36,
4.创建了账号A,B,C,D
5.创建了销售,讲师,学员三个角色,并把ABCD分配到了销售角色里
6.设置了销售可以操作的权限 原型图 Axure 开发工具选型 Python
Django
mysql
jquery
bootstrap
linux
nginx
pycharm 创建项目
设计表结构
写代码 后续加入的表
权限
问卷调查
知识管理
合同 day 79
动态菜单
销售角色
客户的增删改查 one 反向查 直接 request.user.userprofile 后面跟反向的小写表名就可以
fk 反向查 直接 request.user.userprofile_set 后面跟反向的小写表名+_set就可以 request.user.userprofile.role.select_related == request.user.userprofile.role.all from django import conf
conf.settings 动态获取项目settings配置 enabled_admins = {
'crm': {'customer': CustomerAdmin,'role':RoleAdmin},
'student': {'test': TestAdmin,'role':RoleAdmin},
} >> a.get_status_display()
models.CustomerInfo._meta.fields 获取model所有字段对象 >>> models.CustomerInfo._meta.get_field('status') 取一个字段的对象
<django.db.models.fields.SmallIntegerField: status>
>>> >>> b.get_internal_type()
'DateField' selec * from tablename limit offset 50 limit 10 从第5
selec * from tablename limit limit 5,10 从第5 delete
action
csrf 跨域请求保护 GET 获取数据 幂等 csrf token 令牌 口令 action 优化
面包屑导航 报名流程
销售 发起报名流程, 选择班级,发报名连接给学员
选择班级
选择 客户 生成报名连接 学员 填写在线报名表, 提交个人信息,上传证件信息,同意
销售 审核报名表, 审核通过后,创建一条缴费记录,自动把学员添加到相应的班级, 报名成功 合同模板
缴费
报名表 讲师上课 自定义用户认证
request.user.userprofile class Meta:
abstract = True 不创建表,之把字段传递给继承自己的子类 #官方参考:https://docs.djangoproject.com/en/1.11/topics/auth/customizing/ #account LDAP :轻量级目录账号管理协议(集中账号管理) #django允许自定制验证
class MyBackend(object):#可定义任何验证方式(LDAP、微信、QQ、短信、邮箱)
def authenticate(self, request, username=None, password=None):
# Check the username/password and return a user.
... md5是不可以反解 shitzhengwen abc123 db shitzhengwen sfsafjak;lfjksajfkasjfksad 撞库
md5+盐 abc123 = a12bc3 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'],{}] 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)

  验证机制

判断是否有权限

#u是一个对象
u.user.has_parm(app_name,permission)
#第一个参数是APP的名字,第二个参数是permission对应数据库里的值 u.user.has_parm(crm,add_customerinfo)#返回时True,False

django自定义创建用户

from django.db import models
from django.contrib.auth.models import (
BaseUserManager, AbstractBaseUser
) class UserProfileManager(BaseUserManager):
#创建普通用户
def create_user(self, email, name, password=None):
"""
Creates and saves a User with the given email, date of
birth and password.
"""
if not email:
raise ValueError('Users must have an email address') user = self.model(
email=self.normalize_email(email),
name=name,
) user.set_password(password) #赋值给user的属性
user.save(using=self._db) #self._db临时存用户名密码
return user #返回用户 #创建超级用户
def create_superuser(self, email, name, password):
"""
Creates and saves a superuser with the given email, date of
birth and password.
"""
user = self.create_user(
email,
password=password, #比上面多加了一个password
name=name,
)
user.is_admin = True #比上面多加了一个is_admin
user.save(using=self._db)
return user class UserProfile(AbstractBaseUser):#改名为用户类一样的名
email = models.EmailField( #email作为用户名,不想要可以改别的
verbose_name='email address',
max_length=255,
unique=True,
# blank=True,
# null=True,
# default="szw@126.com"
)
# date_of_birth = models.DateField() #出生日期可以不要
name = models.CharField(max_length=64, unique=True)#name字段
is_active = models.BooleanField(default=True)#如果用户帐户当前处于活动状态,则返回true
is_admin = models.BooleanField(default=False)
role = models.ManyToManyField("Role", blank=True)
objects = UserProfileManager() #必须是objects USERNAME_FIELD = 'email' #登录的字段
REQUIRED_FIELDS = ['name'] #必须要有的字段 def get_full_name(self): #返回全名
# The user is identified by their email address
return self.email def get_short_name(self): #返回别名的意思
# The user is identified by their email address
return self.email #一般和上面返回一样的 def __str__(self): # __unicode__ on Python 2
return self.email def has_perm(self, perm, obj=None): #是否有权限
"Does the user have a specific permission?"
# Simplest possible answer: Yes, always
return True #目前是假的,不涉及权限,所有一直返回True def has_module_perms(self, app_label): #有多个APP的时候,对APP有没有访问权
"Does the user have permissions to view the app `app_label`?"
# Simplest possible answer: Yes, always
return True @property
def is_staff(self): #如果用户被允许访问管理站点,则返回true。
"Is the user a member of staff?"
# Simplest possible answer: All admins are staff
return self.is_admin

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. BZOJ4391 High Card Low Card [Usaco2015 dec](贪心+线段树/set库

    正解:贪心+线段树/set库 解题报告: 算辣直接甩链接qwq 恩这题就贪心?从前往后从后往前各推一次然后找一遍哪个地方最大就欧克了,正确性很容易证明 (这里有个,很妙的想法,就是,从后往前推从前往后 ...

  2. sqlite数据导入mysql

    sqlite导出数据 1.首先将sqlite数据库中的数据库格式由db或者db3等转为.sql格式,方法如下: 首先是不修改路径的情况下,在命令行下(方法一): sqlite3 database_na ...

  3. C# Asp.net Quartz.NET作业调度之创建、安装、卸载、调试windows服务的简单事例

    一.创建windows服务 1.用VS创建windows服务,结果如下: 2.删除默认生成的Service1.cs文件,然后创建自己的服务文件(如:MyService),并修改Program.cs文件 ...

  4. 第5章 实现windows程序的数据绑定

    1:连接式: command 对象负责对数据库的执行命令 DataReader 对象负责从数据源中读取数据 connection 对象负责链接数据库 断开式: 数据集的Dataset存放在独立的数据源 ...

  5. 【托业】【新托业TOEIC新题型真题】学习笔记7-题库二->P1~4

    P1: 1. shopping cart 购物车 stock the shelves 补货 examining the vegetables 挑选蔬菜 4.admire some paintings ...

  6. 微信小程序添加悬浮在线客服会话按钮

    微信为小程序提供客服消息能力,小程序用户可以方便快捷地与小程序服务提供方进行沟通,并且已经做成了组件的形式,直接就可以调用.客服会话按钮,用于在页面上显示一个客服会话按钮,用户点击该按钮后会进入客服会 ...

  7. dedecms清空所有文章怎么操作?sql语句如何写?

    小C新建了一个站,确切的说是复制,出于seo考虑,决定清空所有文章,那么dedecms清空所有文章怎么操作?sql语句如何写呢?特别提醒:修改之前一定要先做好备份,以防万一!下面的语句在迫不得已的情况 ...

  8. OC通讯录选择封装

    ContactsService.h代码 #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> //block返回选 ...

  9. uWSGI+APScheduler不能执行定时任务

    在本地项目中使用APScheduler运行定时任务ok,但是在服务器上用uwsgi部署的Django环境下,APScheduler定时任务并不会被启动. 原因:uwsgi 默认one thread o ...

  10. python实现根据当前时间创建目录并输出日志

    举个例子:比如我们要实现根据当前时间的年月日来新建目录来存放每天的日志,当前时间作为日志文件名称:代码如下: #!/usr/bin/env python3 # _*_ coding: utf-8 _* ...