需求應用圖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 = "菜單"
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)
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>
index.html 常常變化的模板 指參數,顯示再圖形上的頁面
再view上設置是index頁面
引入bese.html就能夠了
引入方式 是 {% extends ‘base.html’%} 就能夠了 中間 用 block包裹起來
URL設置
url分類 crm的單獨作一層連接 ,perfectCRM作一層,再後者上用include 包裹crm的url ,再crm裏作url
。。。。