1.引言

CRM,客户关系管理系统(Customer Relationship Management)。企业用CRM技术来管理与客户之间的关系,以求提升企业成功的管理方式,其目的是协助企业管理销售循环:新客户的招徕、保留旧客户、提供客户服务及进一步提升企业和客户的关系,并运用市场营销工具,提供创新式的个人化的客户商谈和服务,辅以相应的信息系统或信息技术如数据挖掘和数据库营销来协调所有公司与顾客间在销售、营销以及服务上的交互。

此系统主要是以教育行业为背景,为公司开发的一套客户关系管理系统。为了扩大的系统使用范围,特此将该项目开发改为组件化开发,让同学们可以日后在自己公司快速搭建类似系统及新功能扩展。

  • 权限系统,一个独立的rbac组件。
  • stark组件,一个独立的curd组件。
  • crm业务,以教育行业为背景并整合以上两个组件开发一套系统。

基于组件的软件工程:

基于组件的软件工程(Component-based software engineering,简称CBSE)或基于组件的开发(Component-Based Development,简称CBD)是一种软件开发范型。它是现今软件复用理论实用化的研究热点,在组件对象模型的支持下,通过复用已有的构件,软件开发者可以“即插即用”地快速构造应用软件

优势:

这样不仅可以节省时间和经费,提高工作效率,而且可以产生更加规范、更加可靠的应用软件

模型:

2.项目表设计:

ps:右键,新窗口打开查看大图

3.stark组件使用说明:

 使用stark组件需要完成一下几个步骤:
1. 拷贝stark app到任何系统。
2. 在目标project中注册stark app,如:
INSTALLED_APPS = [
...
'stark.apps.StarkConfig',
]
3. 如果想要使用stark组件,则需要在目标app的根目录中创建 stark.py
4. 配置路由信息
from stark.service.stark import site
urlpatterns = [
...
url(r'^stark/', site.urls),
] 5. 接下来就可以使用stark组件进行快速增删改查,示例:
from crm import models
from stark.service.stark import site, StarkConfig
from django.utils.safestring import mark_safe
from django.conf.urls import url
from django.shortcuts import HttpResponse
from django.urls import reverse
from crm.config.class_list import ClassListConfig class DepartmentConfig(StarkConfig):
list_display = ['id', 'title', StarkConfig.display_edit, StarkConfig.display_del] site.register(models.Department, DepartmentConfig) class UserInfoConfig(StarkConfig): def display_gender(self, row=None, header=False):
if header:
return '性别'
return row.get_gender_display() def display_detail(self,row=None, header=False):
if header:
return '查看详细'
return mark_safe('<a href="%s">%s</a>' %(reverse('stark:crm_userinfo_detail',kwargs={'pk':row.id}),row.name,)) list_display = [
display_detail,
display_gender,
'phone',
'email',
'depart',
StarkConfig.display_edit,
StarkConfig.display_del
] def extra_url(self):
info = self.model_class._meta.app_label, self.model_class._meta.model_name urlpatterns = [
url(r'^(?P<pk>\d+)/detail/$', self.wrapper(self.detail_view), name='%s_%s_detail' % info),
]
return urlpatterns def detail_view(self,request,pk):
"""
查看详细页面
:param request:
:param pk:
:return:
"""
return HttpResponse('详细页面...') search_list = ['name','depart__title'] site.register(models.UserInfo, UserInfoConfig)

4.rbac权限组件使用说明:

 使用rbac组件时,应用遵循以下规则:

 1. 清除rbac/migrations目录下所有数据库迁移记录(保留__init__.py)

 2. 在项目路由系统中注册rabc相关的路由信息,如:
urlpatterns = [
...
url(r'^rbac/', include('rbac.urls',namespace='rbac')),
] 3. 注册app 4. 让业务的用户表继承权限的UserInfo表
如:
rbac:
class UserInfo(models.Model):
"""
用户表
"""
username = models.CharField(verbose_name='用户名', max_length=32)
password = models.CharField(verbose_name='密码', max_length=64)
email = models.CharField(verbose_name='邮箱', max_length=32)
roles = models.ManyToManyField(verbose_name='拥有的所有角色', to=Role, blank=True) class Meta:
abstract = True
crm:
from rbac.models import UserInfo as RbacUserInfo
class UserInfo(RbacUserInfo):
"""
员工表
"""
name = models.CharField(verbose_name='真实姓名', max_length=16)
phone = models.CharField(verbose_name='手机号', max_length=32) gender_choices = (
(1,'男'),
(2,'女'),
)
gender = models.IntegerField(verbose_name='性别',choices=gender_choices,default=1) depart = models.ForeignKey(verbose_name='部门', to="Department") def __str__(self):
return self.name 5. 数据库迁移 6. rbac提供URL
urlpatterns = [
url(r'^menu/list/$', permission.menu_list, name='menu_list'), # rbac:menu_list
url(r'^menu/add/$', permission.menu_add, name='menu_add'),
url(r'^menu/edit/(?P<pk>\d+)/$', permission.menu_edit, name='menu_edit'),
url(r'^menu/del/(?P<pk>\d+)/$', permission.menu_del, name='menu_del'),
url(r'^permission/add/$', permission.permission_add, name='permission_add'),
url(r'^permission/edit/(?P<pk>\d+)/$', permission.permission_edit, name='permission_edit'),
url(r'^permission/del/(?P<pk>\d+)/$', permission.permission_del, name='permission_del'), url(r'^multi/permissions/$', permission.multi_permissions, name='multi_permissions'), url(r'^distribute/permissions/$', permission.distribute_permissions, name='distribute_permissions'),
url(r'^role/list/$', permission.role_list, name='role_list'),
url(r'^role/edit/(?P<pk>\d+)/$', permission.role_edit, name='role_edit'),
url(r'^role/del/(?P<pk>\d+)/$', permission.role_del, name='role_del'),
]

5.项目源码:

我的GitHub :https://github.com/hyyc554/crm

django——CRM项目的更多相关文章

  1. Django - CRM项目(2)Q查询(模糊查询)

    一.CRM项目(2) 利用Q查询中的q对象完成条件筛选功能. 批量删除.公户转私户功能. 新增一张跟进记录表ConsultRecord,迁移数据库并添加测试数据,实现跟进记录列表页面. 客户列表新增跟 ...

  2. Django - CRM项目(3)

    一.CRM项目的业务逻辑与表结构梳理 1.分析业务逻辑 (1) 引流(sem) (2) 网络咨询师(客服):添加客户信息和查看客户,分配销售 (3) 销售:查看私户 添加跟进记录 失败:加入公户 成功 ...

  3. Django CRM学员系统项目

    项目需求: 1.分讲师\学员\课程顾问角色,2.学员可以属于多个班级,学员成绩按课程分别统计3.每个班级至少包含一个或多个讲师4.一个学员要有状态转化的过程 ,比如未报名前,报名后,毕业老学员5.客户 ...

  4. CRM项目讲解和django知识点回顾

    今天想把之前写的CRM项目梳理下,顺便回顾一下djiango的部分重要知识. 1.登录页面(包含简单验证码) 首先来看下CRM的登录页面,样式啥的不重要,大家可以去jquery ui的网站上或者其他地 ...

  5. Django项目:CRM(客户关系管理系统)--81--71PerfectCRM实现CRM项目首页

    {#portal.html#} {## ————————46PerfectCRM实现登陆后页面才能访问————————#} {#{% extends 'king_admin/table_index.h ...

  6. CRM项目总结

                CRM项目总结      一:开发背景 在公司日益扩大的过程中,不可避免的会伴随着更多问题出现. 对外 : 如何更好的管理客户与公司的关系?如何更及时的了解客户日益发展的需求变 ...

  7. CRM项目之RBAC权限组件-day26

    写在前面 上课第26天,打卡: 世间安得双全法 不负如来不负卿 s17day26 CRM项目 项目概要:XX公司CRM - 权限管理,公共组件,app ***** - 熟悉增删改查,Low *** - ...

  8. crm项目整理

    crm项目整理   一.开发背景 由于公司人员的增多,原来通过excel表格存取方式过于繁琐,而且对于公司人员的调配和绩效考核等不能做到精确处理,所以开发crm系统,开始开发只是针对销售人员和客户,后 ...

  9. Linux下运行crm项目

    虚拟环境运行crm项目 1.进入虚拟环境 2.解决crm项目运行所需的依赖环境 1.手动解决 pip3 install django==1.11.14 pip3 install pymysql pip ...

随机推荐

  1. goroutine 和 线程的区别

    我们在使用Go语言进行开发时,一般会使用goroutine来处理并发任务.那么大家有没有考虑过goroutine的实现机制是什么样的?很多同学会把goroutine与线程等同起来,但是实际上并不是这样 ...

  2. MySQL实战45讲学习笔记:事务隔离级别(第三讲)

    一.隔离性与隔离级别 1.事务的特性 原子性 一致性 隔离性 持久性 2.不同事务隔离级别的区别 读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到.读已提交:别人改数据的事务已经提交,我在我 ...

  3. 如何解决Angular网页内嵌推特时间线无法正常显示

    我最近解决了一个折磨了我好久但是解决方法却只是添加两三行代码的问题.我没有在网上找到合适的解决方案,最后是我根据官方网站和很多的帖子里的部分代码得到的启发,尝试了很久之后得到的解决方法.因为过程实在是 ...

  4. Cygwin添加到鼠标右键

    From:http://www.cnblogs.com/killerlegend/p/3960112.html 在cygwin中安装chere 管理员权限执行mintty,输入下列命令即可. cher ...

  5. 第七节:语法总结(1)(自动属性、out参数、对象初始化器、var和dynamic等)

    一. 语法糖简介   语法糖也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方 ...

  6. metasploit 教程之信息收集

    信息收集 信息收集范围很大,可以从不同层面,不同维度进行信息收集. 系统补丁 我们知道目标机器缺少什么补丁就意味着存在与其对应的漏洞.我们可以利用这些漏洞来达到我们渗透攻击的目的. # 使用的模块 u ...

  7. 【OpenGL】搭建opgl环境

    *GLFW+GLEW环境. 工具: GLFW库(下载) GLEW库 cMake软件(下载) 用cMake编译GLFW和GLEW成vs工程文件包,运行得到编译后文件. 在编译后文件夹中找到各个必需文件, ...

  8. day 15 - 1 内置函数

    内置函数 作用域相关 locals() globals() #这两组开始容易搞混 print(locals()) #返回本地作用域中的所有名字 print(globals()) #返回全局作用域中的所 ...

  9. JAVA进阶11

    间歇性混吃等死,持续性踌躇满志系列-------------第11天 1.ArrayList package cn.intcast.demo11; import java.util.ArrayList ...

  10. ubuntu16.04降级内核版本至3.13.0-85

    1.前言 采用ubuntu16.04在编译实验课程的实例代码simplefs 时,发现编译时报如下错误: 因此需要将ubuntu16.04的内核版本降级为 3.13.0-85-generic 2.修改 ...