开发环境:

  1. 语言Python3.X以上
  2. MTV WEB框架 Django
  3. 前端框架 jQuery+bootstrap
  4. 数据库 MySQL

运行环境

  1. 安装Python3.x
  2. 安装Django
  3. 除IE8以上的浏览器

项目需求:重写Django Admin的功能,实现对表动态的增删改查,实现权限的动态分配,实现自定义Action,等一系列组件扩展功能

项目功能图:

项目表UML表关系图

models.py表关系创建

 from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Customer(models.Model):
'''客户信息表'''
name = models.CharField(max_length=32,null=True,blank=True)
qq = models.CharField(max_length=64,unique=True)
qq_name = models.CharField(max_length=64,null=True,blank=True)
phone = models.CharField(max_length=64,null=True,blank=True)
source_choices = ((0,'转介绍'),(1,'QQ群'),(2,'官网'),(3,'百度推广'),(4,'51cto'),(5,'知乎推荐'),(6,'市场推广'))
source = models.SmallIntegerField(choices=source_choices)
referral_from = models.CharField(verbose_name='转介绍人QQ',max_length=64,null=True,blank=True)
consult_course = models.ForeignKey('Course',verbose_name='咨询课程')
content = models.TextField(verbose_name='咨询详情')
consultant = models.ForeignKey('UserProfile',verbose_name='销售')
tags = models.ManyToManyField('Tag',blank=True,null=True);
memo = models.TextField(blank=True,null=True)
status_choice = (('signed','已报名'),('unregistered','未报名'))
status = models.CharField(max_length=64,choices=status_choice,default='unregistered',verbose_name='客户状态')
date = models.DateTimeField(auto_now_add=True) class Meta:
verbose_name_plural = '客户' def __str__(self):
return self.name class CustomerFollowUp(models.Model):
'''客户跟进表'''
customer = models.ForeignKey('Customer')
content = models.TextField(verbose_name='跟进内容')
consultant = models.ForeignKey('UserProfile')
intention_choices = ((0,'2周内报名'),(1,'1个月报名'),(2,'近期无报名计划'),(3,'已在其他机构报名'),(4,'已报名'),(5,'已拉黑'))
intention = models.SmallIntegerField(choices=intention_choices)
date = models.DateTimeField(auto_now_add=True) def __str__(self):
return '%s %s' % (self.customer.qq, self.intention) class Meta:
verbose_name_plural = '客户跟进记录' class Course(models.Model):
'''课程表'''
name = models.CharField(max_length=128,unique=True)
price = models.PositiveSmallIntegerField()
period = models.PositiveSmallIntegerField(verbose_name='周期(月)')
outline = models.TextField() def __str__(self):
return self.name class Meta:
verbose_name_plural = '课程' class Branch(models.Model):
'''校区表'''
name = models.CharField(max_length=128,unique=True)
addr = models.CharField(max_length=512) def __str__(self):
return self.name class Meta:
verbose_name_plural = '校区' class ClassList(models.Model):
'''班级表'''
branch = models.ForeignKey('Branch',verbose_name='分校')
course = models.ForeignKey('Course')
semester = models.PositiveSmallIntegerField(verbose_name='学期')
teachers = models.ManyToManyField('UserProfile')
class_type_choice = ((0,'面授班(脱产)'),(1,'面授班(周末)'),(2,'网络班'))
class_type = models.SmallIntegerField(choices=class_type_choice)
start_date = models.DateField(verbose_name='开班日期')
end_date = models.DateField(verbose_name='结业日期',blank=True,null=True) def __str__(self):
return '%s %s %s' % (self.branch, self.course, self.semester) class Meta:
unique_together = ('branch', 'course', 'semester')
verbose_name_plural = '班级' class CourseRecord(models.Model):
'''上课记录表'''
from_class = models.ForeignKey('ClassList',verbose_name='班级')
day_num = models.PositiveSmallIntegerField(verbose_name='第几节(天)')
teacher = models.ForeignKey('UserProfile')
has_homework = models.BooleanField(default=True)
homework_title = models.CharField(max_length=256,blank=True,null=True)
homework_content = models.TextField(blank=True,null=True)
outline = models.TextField(verbose_name='本节课大纲')
date = models.DateTimeField(auto_now_add=True) def __str__(self):
return '%s %s' % (self.from_class, self.day_num) class Meta:
unique_together = ('from_class', 'day_num')
verbose_name_plural = '上课记录' class StudyRecord(models.Model):
'''学习记录表'''
student = models.ForeignKey('Enrollment')
course_record = models.ForeignKey('CourseRecord')
attendance_choice = ((0,'已签到'),(1,'迟到'),(2,'缺勤'),(3,'早退'))
attendance = models.SmallIntegerField(choices=attendance_choice,default=0)
score_choices = ((100,'A+'),(90,'A'),(85,'B+'),(80,'B'),(75,'B-'),(70,'C+'),(60,'C'),(40,'C-'),(-50,'D'),(-100,'COPY'),(0,'N/A'))
score = models.SmallIntegerField(choices=score_choices)
memo = models.TextField(blank=True,null=True)
date = models.DateTimeField(auto_now_add=True) def __str__(self):
return '%s %s %s' % (self.student, self.course_record, self.score) class Meta:
unique_together = ('student', 'course_record')
verbose_name_plural = '学习记录' class Enrollment(models.Model):
'''学生报名表(学生报名信息,合同,入学日期,所报班级)'''
customer = models.ForeignKey('Customer')
enrolled_class = models.ForeignKey('ClassList',verbose_name='所报班级')
consultant = models.ForeignKey('UserProfile',verbose_name='课程顾问')
contact_agreed = models.BooleanField(default=False,verbose_name='学生已同意合同条款')
contact_approved = models.BooleanField(default=False,verbose_name='合同已审核')
date = models.DateTimeField(auto_now_add=True) def __str__(self):
return '%s %s' % (self.customer, self.enrolled_class) class Meta:
unique_together = ('customer', 'enrolled_class')
verbose_name_plural = '报名' class Payment(models.Model):
'''缴费记录'''
customer = models.ForeignKey('Customer')
course = models.ForeignKey('Course')
amount = models.PositiveIntegerField(verbose_name='数额',default=500)
consultant = models.ForeignKey('UserProfile')
date = models.DateTimeField(auto_now_add=True) def __str__(self):
return '%s %s' % (self.customer, self.amount) class Meta:
verbose_name_plural = '缴费记录' class UserProfile(models.Model):
'''账号表'''
user = models.OneToOneField(User)
name = models.CharField(max_length=32)
roles = models.ManyToManyField('Role',blank=True,null=True) def __str__(self):
return self.name class Role(models.Model):
'''角色表'''
name = models.CharField(max_length=64,unique=True) def __str__(self):
return self.name class Meta:
verbose_name_plural = '角色' class Tag(models.Model):
'''标签备注'''
name = models.CharField(max_length=64,unique=True) def __str__(self):
return self.name
class Meta:
verbose_name_plural = '标签'

在Settings文件中配置静态文件路径

 STATIC_URL = '/static/'
STATICFILES_DIRS =(
os.path.join(BASE_DIR,'static'),
)

更改默认的数据库

 DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'prefect_crm',
'USER': 'root',
'PASSWORD': 'oldboy',
'HOST': '127.0.0.1',
'PORT': ''
}
}

在app下的__init__.py中插入

 import pymysql
pymysql.install_as_MySQLdb()

Python CRM项目一的更多相关文章

  1. Python CRM项目二

    一.准备工作 如果没有配置基本的项目,请参考 http://www.cnblogs.com/luhuajun/p/7771196.html 当我们配置完成后首先准备我们的app 创建2个app分别对应 ...

  2. Python CRM项目八

    自定义用户认证 目的:实现Django自定义的认证系统,在生产环境都是根据此代码进行定制的 步骤: 1.在settings文件中配置要使用的类 #命名规则 app名称.类名 AUTH_USER_MOD ...

  3. Python CRM项目三

    1.分页: 分页使用Django内置的分页模块来实现 官方的分页案例 from django.core.paginator import Paginator, EmptyPage, PageNotAn ...

  4. Python CRM项目七

    仿照Django Admin实现对readonly的字段进行设置 功能点: 1.页面不可进行更改 2.如果改变html代码中的值,则需要进行后端的数据库数据校验 3.可以对某些字段进行自定制校验规则 ...

  5. Python CRM项目六

    自定义Django Admin的action 在Django Admin中,可以通过action来自定义一些操作,其中默认的action的功能是选中多条数据来进行删除操作 我们在king_admin中 ...

  6. Python CRM项目四

    实现Django Admin的多对多的复选框效果 效果:左边显示的是未选中的字段,右边显示的是已选中的字段,两边点击的标签可以互相更换 首先在king_admin.py中增加filter_horizo ...

  7. CRM项目总结

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

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

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

  9. crm项目整理

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

随机推荐

  1. MySQL集群(三)mysql-proxy搭建负载均衡与读写分离

    前言 前面学习了主从复制和主主复制,接下来给大家分享一下怎么去使用mysql-proxy这个插件去配置MySQL集群中的负载均衡以及读写分离. 注意:这里比较坑的就是mysql-proxy一直没有更新 ...

  2. 基于CSS UI开源框架汇总

    从16年数据统计就有20几款UI框架出现在市面上,至今为止能统计的框架应该有40款左右了.前端框架都是基于HMTL5.CSS.JS开发的,这里主要给大家聊一下CSS UI开源框架有哪些?以后工作中选择 ...

  3. angular $observe() 和$watch的区别

    1.$observe()是属性attributes的方法,只能在DOM属性的值发生变化时用,并且只用于directive内. 当需要监听一个包含变量的属性值时attr1="Name:{{na ...

  4. 前端系列——jquery前端国际化解决方案“填坑日记”

    前言:最近,新的平台还没有开发完成,原来的老项目又提出了新的需求:系统国际化.如果是前后端完全分离的开发模式,要做国际化,真的太简单了,有现成的解决方案,基于Node构建的时下热门的任何一种技术选型都 ...

  5. VS2015 + EF6连接MYSQL

    ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,不仅支持SQL Server,还支持MySQL.Ora ...

  6. M方法

    ThinkPHP函数详解:M方法 M方法用于实例化一个基础模型类,和D方法的区别在于:1.不需要自定义模型类,减少IO加载,性能较好:2.实例化后只能调用基础模型类(默认是Model类)中的方法:3. ...

  7. 【转】Mapreduce部署与第三方依赖包管理

    Mapreduce部署是总会涉及到第三方包依赖问题,这些第三方包配置的方式不同,会对mapreduce的部署便捷性有一些影响,有时候还会导致脚本出错.本文介绍几种常用的配置方式: 1. HADOOP_ ...

  8. 51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题

    题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左 ...

  9. 上传本地项目到githup仓库

    1.在网上下载Git,然后安装 点击下一步 2.默认选择,下一步 3.选择使用命令行环境,下一步 4.后续步骤默认选择,点击下一步,等待安装完成 5.在githup上面新建一个仓库存放项目代码,具体方 ...

  10. 简单又炫酷的two.js 二维动画教程

      前  言 S     N 今天呢给大家介绍一个小js框架,Two.JS.其实在自己学习的过程中并没有找到合适的教程,所以我这种学习延迟的同学是有一定难度的,然后准备给大家整理一份,简单易懂的小教程 ...