django CRM 学院管理系统开发

需求应用图css

 

======================================================html

经常使用组件python

django  mysql

bootstrapreact

jqueryjquery

python 3sql

PyCharm数据库

MySQLdjango

mysql-python(http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python)或者pymysqbootstrap


 命令

SHOW DATABASES;

建立名称为PerfectCRM的数据库

CREATE DATABASE PerfectCRM;

删除名称为PerfectCRM的数据库

DROP DATABASE PerfectCRM;

python manage.py makemigrations 

python manage.py migrate

python manage.py createsuperuser


 

数据库配置问题:难点

安装

pip install PyMySQ

 

配置pymysql,再主目录点 __init__

import pymysql
pymysql.install_as_MySQLdb()

 

 

===========================================

数据库设置

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

 

 

建立项目,设置表结构

├─.idea
├─crm
│  └─migrations
├─PerfectCRM
│  └─__pycache__
└─templates

设置stting app

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'crm',
]

templates搜索路径

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'PerfectCRM.wsgi.application'

 静态文件设置

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

 

 


 

models.py  表设置

 备用model

  1 from django.db import models
  2 from django.contrib.auth.models import User
  3 
  4 # Create your models here.
  5 
  6 
  7 class Customer(models.Model):
  8     '''客户信息表'''
  9     name = models.CharField(max_length=32,blank=True,null=True,verbose_name='客户姓名')  #32个字节 ,能够写10个汉字,blank=True admin能够不太填写,null=True数据库能够不填写
 10     qq = models.CharField(max_length=64,unique=True,verbose_name= 'QQ')  #unique 惟一值
 11     qq_name = models.CharField(max_length=64, blank=True, null=True,verbose_name='QQ呢陈')
 12     phone = models.CharField(max_length=64, blank=True, null=True,verbose_name='手机号')
 13     source_choises = ((0,'转介绍'),
 14                       (1,'QQ群'),
 15                       (2,'官网'),
 16                       (3,'百度推广'),
 17                       (4,'51CTO'),
 18                       (5, '知乎'),
 19                       (6, '市场推广'))     #来源
 20     source = models.SmallIntegerField(choices=source_choises,verbose_name='途径')
 21     referral_from = models.CharField(verbose_name='转介绍人',max_length=64, blank=True, null=True)
 22     consult_course = models.ForeignKey('Course',verbose_name='咨询课程')
 23     content = models.TextField(verbose_name='咨询详情')
 24     tags = models.ManyToManyField('Tag',blank=True,verbose_name='标签')
 25     status_choices = ((0, '已报名'),
 26                       (1, '未报名'),
 27                       )
 28 
 29     status = models.SmallIntegerField(choices=status_choices, default=1)
 30     consultant = models.ForeignKey('UserProfile',verbose_name='咨询人') #咨询人
 31     memo = models.TextField(blank=True, null=True,verbose_name='备注')
 32     date = models.DateTimeField(auto_now_add=True,verbose_name='咨询时间') #时间自增
 33 
 34     def __str__(self):
 35         return self.qq
 36 
 37     class Meta:
 38         verbose_name = "客户表"
 39         verbose_name_plural = "客户表"
 40 class Tag(models.Model):
 41     name = models.CharField(unique=True,max_length=32)  #标签名惟一
 42     def __str__(self):
 43         return self.name
 44 
 45     class Meta:
 46         verbose_name = "标签"
 47         verbose_name_plural = "标签"
 48 class CustomerFollowUp(models.Model):
 49     '''客户跟进表'''
 50     customer = models.ForeignKey('Customer')
 51     content = models.TextField(verbose_name='跟进内容')
 52     consultant = models.ForeignKey('UserProfile')
 53 
 54     intention_choices = ((0,'2周内报名'),
 55                          (1, '1个月内报名'),
 56                          (2, '近期无报名计划'),
 57                          (2, '近期无报名计划'),
 58                          (3, '一再其它机构报名'),
 59                          (4, '已报名'),
 60                          (5, '已拉黑'))
 61     intention = models.SmallIntegerField(choices=intention_choices)
 62     date = models.DateTimeField(auto_now_add=True)  # 自动统计时间
 63     def __str__(self):
 64         return "<%s : %s>" %(self.customer.name,self.intention)
 65 
 66     class Meta:
 67         verbose_name = "客户跟进记录"
 68         verbose_name_plural = "客户跟进记录"
 69 class Course(models.Model):
 70     '''课程表'''
 71     name = models.CharField(max_length=64,unique=True) #课程名
 72     price = models.PositiveSmallIntegerField()  #价格正书
 73     period = models.PositiveSmallIntegerField(verbose_name='周期')  # 周期
 74     outline = models.TextField() #课程大纲
 75 
 76     class Meta:
 77         verbose_name = "课程表"
 78         verbose_name_plural = "课程表"
 79 
 80 class Branch(models.Model):
 81     '''校区'''
 82     name = models.CharField(max_length=128,unique=True)
 83     addr= models.CharField(max_length=128) #地址
 84 
 85     class Meta:
 86         verbose_name = "校区"
 87         verbose_name_plural = "校区"
 88 
 89 class ClassList(models.Model):
 90     '''班级表'''
 91     branch = models.ForeignKey("Branch", verbose_name="校区")
 92     course = models.ForeignKey("Course")  #对应课程
 93     class_type_choices = ((0, '面授(脱产)'),
 94                           (1, '面授(周末)'),
 95                           (2, '网络班')
 96                           )
 97     class_type = models.SmallIntegerField(choices=class_type_choices, verbose_name="班级类型")
 98     semester = models.PositiveSmallIntegerField(verbose_name="学期")
 99     teachers = models.ManyToManyField("UserProfile")
100     start_date = models.DateField(verbose_name="开班日期")
101     end_date = models.DateField(verbose_name="结业日期", blank=True, null=True)
102 
103     def __str__(self):
104         return "%s %s %s" %(self.branch,self.course,self.semester) # 校区 课程 学期
105 
106     class Meta:
107         unique_together = ('branch', 'course', 'semester')
108         verbose_name_plural = "班级表"
109         verbose_name = '班级表'
110 
111 class CourseRecord(models.Model):
112     '''上课记录'''
113     from_class = models.ForeignKey('ClassList',verbose_name='班级')
114     day_num = models.PositiveSmallIntegerField(verbose_name='第几节(天)')
115     teacher = models.ForeignKey('UserProfile',verbose_name='教师')
116     has_homework = models.BooleanField(default=True)
117     homework_title = models.CharField(max_length=128,blank=True,null=True) #有无做业
118     homework_content = models.CharField(max_length=128, blank=True, null=True) #做业内容
119     outline = models.TextField(verbose_name='本节课大纲')
120     date = models.DateField(auto_now_add=True)
121 
122     def __str__(self):
123         return  "%s %s "%(self.from_class,self.day_num)
124 
125     class Meta:
126         unique_together = ('from_class','day_num')   #班级和第几天是惟一的值
127         verbose_name_plural = "上课记录"
128         '''
129         ordering=['order_date'] # 按订单升序排列
130 ordering=['-order_date'] # 按订单降序排列,-表示降序
131 ordering=['?order_date'] # 随机排序,?表示随机
132 permissions
133 
134 permissions主要是为了在Django Admin管理模块下使用的,若是你设置了这个属性可让指定的方法权限描述更清晰可读。
135 proxy
136 
137 这是为了实现代理模型使用的,这里先不讲随后的文章介绍。
138 unique_together
139 
140 unique_together这个选项用于:当你须要经过两个字段保持惟一性时使用。好比假设你但愿,一个Person的FirstName和LastName二者的组合必须是惟一的,那么须要这样设置:
141 unique_together = (("first_name", "last_name"),)
142 verbose_name
143 
144 verbose_name的意思很简单,就是给你的模型类起一个更可读的名字:
145 verbose_name = "pizza"
146 verbose_name_plural
147 这个选项是指定,模型的复数形式是什么,好比:
148 verbose_name_plural = "stories"
149 若是不指定Django会自动在模型名称后加一个’s’
150 '''
151 
152 
153 class StudyRecord(models.Model):
154     '''学习纪律
155     '''
156     student = models.ForeignKey('Enrollment') #对应报名表
157     course_record = models.ForeignKey('CourseRecord')  #对应上课纪律
158     attendance_choices = ((0,'已签到'),
159                           (1, '迟到'),
160                           (2, '缺勤'),
161                           (3, '早退'),
162                          )
163     attendance = models.SmallIntegerField(choices=attendance_choices,default=0)
164     score_choices = ((100,'A+'),
165                      (90, 'A'),
166                      (85, 'B+'),
167                      (80, 'B'),
168                      (75, 'B-'),
169                      (70, 'C+'),
170                      (60, 'C'),
171                      (40, 'C-'),
172                      (-50, 'D'),
173                      (-100, 'copy'),
174                      (0, 'N/A'),)
175     score = models.SmallIntegerField(choices=score_choices)
176     memo = models.TextField(blank=True,null=True) #备注
177     date = models.DateField(auto_now_add=True)
178 
179     def __str__(self):
180         return  "%s %s %s" % (self.student,self.course_record,self.score)
181 
182     class Meta:
183         unique_together = ('student', 'course_record')
184         verbose_name_plural = "学习记录"
185 
186 
187 class Enrollment(models.Model):
188     '''报名表'''
189     customer = models.ForeignKey('Customer')  #对应客户
190     enrolled_class = models.ForeignKey('ClassList',verbose_name='所报班级')
191     consultant = models.ForeignKey('UserProfile',verbose_name='课程顾问')
192     contreact_agreed = models.BooleanField(default=False,verbose_name='学生已赞成条款')
193     contract_approvaed = models.BooleanField(default=False,verbose_name='合同已审核')
194     date = models.DateTimeField(auto_now_add=True)
195 
196     def __str__(self):
197         return '%s %s'%(self.customer,self.enrolled_class)
198 
199     class Meta:
200         unique_together = ('customer','enrolled_class')
201         verbose_name_plural = "报名表"
202 
203 class Payment(models.Model):
204     '''缴费记录'''
205     customer = models.ForeignKey('Customer') #客户
206     course= models.ForeignKey('Course',verbose_name='所报课程')
207     amount = models.PositiveIntegerField(verbose_name='数额',default=500)
208     consultant = models.ForeignKey('UserProfile')
209     date= models.DateTimeField(auto_now_add=True)
210 
211     def __str__(self):
212         return '%s %s'%(self.customer,self.amount)
213 
214     class Meta:
215         verbose_name_plural = "缴费记录"
216 
217 class UserProfile(models.Model):
218     '''教师帐号表'''
219     user = models.OneToOneField(User)
220     name = models.CharField(max_length=32)
221     roles = models.ManyToManyField('Role',blank=True)
222 
223     def __str__(self):
224         return  self.name
225 
226     class Meta:
227         verbose_name_plural = "教师帐号表"
228 
229 class Role(models.Model):
230     '''角色表'''
231     name = models.CharField(max_length=32,unique=True)
232     menus = models.ManyToManyField('Menu',blank=True )
233 
234     def __str__(self):
235         return self.name
236     class Meta:
237         verbose_name_plural = "角色表"
238 
239 class Menu(models.Model):
240 
241     '''菜单'''
242     name = models.CharField(max_length=32)
243     url_name = models.CharField(max_length=64)
244 
245     def __str__(self):
246         return self.name
247 
248     class Meta:
249         verbose_name_plural = "菜单"
Model 数据库表格

 

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,blank=True,null=True)
    qq = models.CharField(max_length=64,unique=True)
    qq_name = models.CharField(max_length=64,blank=True,null=True)
    phone = models.CharField(max_length=64,blank=True,null=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,blank=True,null=True)

    consult_course = models.ForeignKey("Course",verbose_name="咨询课程")
    content = models.TextField(verbose_name="咨询详情")
    tags = models.ManyToManyField("Tag",blank=True,null=True)
    status_choices = ((0,'已报名'),
                      (1,'未报名'),
                      )
    status = models.SmallIntegerField(choices=status_choices,default=1)
    consultant = models.ForeignKey("UserProfile")
    memo = models.TextField(blank=True,null=True)
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.qq

    class Meta:
        verbose_name ="客户表"
        verbose_name_plural ="客户表"

class Tag(models.Model):
    name = models.CharField(unique=True,max_length=32)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "标签"
        verbose_name_plural = "标签"

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 = "客户跟进记录"
        verbose_name_plural = "客户跟进记录"

class Course(models.Model):
    '''课程表'''
    name = models.CharField(max_length=64,unique=True)
    price = models.PositiveSmallIntegerField()
    period = models.PositiveSmallIntegerField(verbose_name="周期(月)")
    outline = models.TextField()

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "课程表"
        verbose_name_plural = "课程表"

class Branch(models.Model):
    '''校区'''
    name = models.CharField(max_length=128,unique=True)
    addr = models.CharField(max_length=128)
    def __str__(self):
        return self.name


    class Meta:
        verbose_name = "校区"
        verbose_name_plural = "校区"

class ClassList(models.Model):
    '''班级表'''
    branch = models.ForeignKey("Branch",verbose_name="校区")
    course = models.ForeignKey("Course")
    class_type_choices = ((0,'面授(脱产)'),
                          (1,'面授(周末)'),
                          (2,'网络班')
                          )
    class_type = models.SmallIntegerField(choices=class_type_choices,verbose_name="班级类型")
    semester = models.PositiveSmallIntegerField(verbose_name="学期")
    teachers = models.ManyToManyField("UserProfile")
    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 = "班级"
        verbose_name = "班级"

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=128,blank=True,null=True)
    homework_content = models.TextField(blank=True,null=True)
    outline = models.TextField(verbose_name="本节课程大纲")
    date = models.DateField(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_choices = ((0,'已签到'),
                          (1,'迟到'),
                          (2,'缺勤'),
                          (3,'早退'),
                          )
    attendance = models.SmallIntegerField(choices=attendance_choices,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,default=0)
    memo = models.TextField(blank=True,null=True)
    date = models.DateField(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="课程顾问")
    contract_agreed = models.BooleanField(default=False,verbose_name="学员已赞成合同条款")
    contract_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",verbose_name="所报课程")
    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=32,unique=True)
    menus = models.ManyToManyField("Menu",blank=True)

    def __str__(self):
        return self.name
    class Meta:
        verbose_name_plural = "角色"


class Menu(models.Model):
    '''菜单'''
    name = models.CharField(max_length=32)
    url_name = models.CharField(max_length=64)

    def __str__(self):
        return self.name
备用

 

 

admin设置

from django.contrib import admin
from crm.models import *

# Register your models here.
class CustomerAdmin(admin.ModelAdmin):
    list_display = ('id','qq','source','consultant','content','status','date')
    list_filter = ('source','consultant','date')
    search_fields = ('qq','name')
    raw_id_fields = ('consult_course',)
    filter_horizontal = ('tags',)
    list_editable = ('status',)
admin.site.register(Customer,CustomerAdmin)


class UserProfileAdmin(admin.ModelAdmin):
    list_display = ('user','name')
admin.site.register(CustomerFollowUp)
admin.site.register(Enrollment)
admin.site.register(Course)
admin.site.register(ClassList)
admin.site.register(CourseRecord)
admin.site.register(Branch)
admin.site.register(Role)
admin.site.register(Payment)
admin.site.register(StudyRecord)
admin.site.register(Tag)
admin.site.register(UserProfile,UserProfileAdmin)
admin.site.register(Menu)
Admin设置

 


templates设置

Base.html    继承,指页面模板。外面一层永不变的页面

{%block  自定义变量 %}

{%endblock%}  

<!DOCTYPE html>
<!-- saved from url=(0041)http://v3.bootcss.com/examples/dashboard/ -->
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其余内容都*必须*跟随其后! -->
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="icon" href="http://v3.bootcss.com/favicon.ico">

    <title>Dashboard Template for Bootstrap</title>

    <!-- Bootstrap core CSS -->
    <link href="/static/css/bootstrap.min.css" rel="stylesheet">

    <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
    <link href="/static/css/ie10-viewport-bug-workaround.css" rel="stylesheet">

    <!-- Custom styles for this template -->
    <link href="/static/css/dashboard.css" rel="stylesheet">

    <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
    <!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
    <script src="/static/js/ie-emulation-modes-warning.js"></script>


    <![endif]-->
  </head>
 {% block content %}

 {% endblock %}
   <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="/static/js/jquery.min.js"></script>
    <script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
    <script src="/static/js/bootstrap.min.js"></script>
    <!-- Just to make our placeholder images work. Don't actually copy the next line! -->
    <script src="/static/js/holder.min.js"></script>
    <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
    <script src="/static/js/ie10-viewport-bug-workaround.js"></script>
</html>
base.html

 

 

index.html 常常变化的模板  指参数,显示再图形上的页面

再view上设置是index页面

引入bese.html就能够了

引入方式 是 {% extends  ‘base.html’%}  就能够了 中间 用 block包裹起来

 


 

URL设置

url分类 crm的单独作一层连接 ,perfectCRM作一层,再后者上用include  包裹crm的url ,再crm里作url


。。。。

相关文章
相关标签/搜索