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


。。。。

相關文章
相關標籤/搜索