一:建立項目名稱,而且配置好數據庫python
二:數據模型場景數據庫
1 設計模型類; 2 # 模擬整個業務流程 3 1.確認整個過程當中所要涉及的角色:銷售,學生,教師,管理員等; 4 # Role; 5 2.每一個角色對應着多個用戶,用戶可能也對應多個角色,好比:教師也擔任管理員的角色; 6 # UserProfile(ManyToMany,Role); 7 3.客戶報名學習,須要填寫客戶信息; 8 # CustomerInfo; 9 # 須要填寫的信息包括: 10 # 姓名,聯繫方式,來源(轉介紹,轉介紹人),諮詢人,客戶狀態,諮詢時間; 11 4.若是成功報名,須要錄入學員表; 12 # Students; 13 # :須要填寫學員名稱(從客戶表中取ForeignKey) 14 # :須要填寫所在班級(班級對應着課程信息,校區信息) 15 # ClassInfo;<<--Course,Branch; 16 # :班級類型,學期,任課教師(從用戶中取),開班日期,畢業日期; 17 # Course:課程名,學費,週期,大綱; 18 # Branch:校區名,地址; 19 5.若是沒有報名,須要對這類客戶作一個跟蹤記錄; 20 # CustomerInfo; 21 # 須要記錄的信息包括: 22 # 客戶(客戶表中取),跟蹤信息,跟蹤人(用戶表中取),客戶報名狀態,填寫時間; 23 6.在課期間,須要有上課的記錄,以及學員做業成績/考勤等記錄; 24 # CourseRecord:上課記錄 25 # :所在班級(在班級表中取),課程節次,上課教師(用戶表中取),本節主題,本節內容,是否有做業,做業需求,記錄日期; 26 # StudyRecord:學習記錄 27 # :課程,學員,分數等級,成績備註,考勤情況,記錄時間;
三:設計數據庫django
1 from django.db import models 2 from django.contrib.auth.models import User #使用Django內置的用戶表 3 4 # Create your models here. 5 6 class UserProfile(models.Model): 7 """ 8 用戶信息表 9 """ 10 user = models.OneToOneField(User,on_delete=models.CASCADE) #建立外鍵,關聯django用戶表 11 #擴展用戶字段 12 name = models.CharField(max_length=64,verbose_name="姓名") 13 role = models.ManyToManyField("Role",blank=True) # 雙向一對多==多對多 14 15 def __str__(self): #__unicode__ python2.7版本 16 return self.name 17 class Meta: 18 verbose_name_plural = "用戶信息" 19 20 class Role(models.Model): 21 """ 22 角色表 23 """ 24 name = models.CharField(max_length=64,unique=True) # 角色名不能夠重複 25 menus = models.ManyToManyField("Menus",blank=True) 26 27 def __str__(self): 28 return self.name 29 class Meta: 30 verbose_name_plural = "角色" 31 32 class Student(models.Model): 33 """ 34 學員表 35 """ 36 customer = models.ForeignKey("CustomerInfo",on_delete=models.CASCADE) 37 class_grades = models.ManyToManyField("ClassList") 38 def __str__(self): 39 return self.customer 40 class Meta: 41 verbose_name = "學員表" 42 verbose_name_plural = "學員表" 43 44 class CustomerInfo(models.Model): 45 """ 46 客戶信息表 47 """ 48 name = models.CharField(max_length=64,default=None) # 首次報名可能不知道名字 49 contact_type_choices = ((0,'qq'), 50 (1,'微信'), 51 (2,'手機號'), 52 ) 53 contact_type = models.SmallIntegerField(choices=contact_type_choices,default=0) 54 contact = models.CharField(max_length=64,unique=True) 55 source_choices = ((0,'QQ羣'), 56 (1,'51CTO'), 57 (2,'百度推廣'), 58 (3,'知乎'), 59 (4,'轉介紹'), 60 (5,'其餘'), 61 ) 62 source = models.SmallIntegerField(choices=source_choices) 63 referral_from = models.ForeignKey("self",blank=True,null=True,verbose_name="轉介紹",on_delete=models.CASCADE) 64 consult_courses = models.ManyToManyField("Course",verbose_name="諮詢課程") 65 consult_content = models.TextField(verbose_name="諮詢內容") 66 status_choices = ((0,'未報名'), 67 (1,'已報名'), 68 (2,'已退學') 69 ) 70 status = models.SmallIntegerField(choices=status_choices) 71 consultant = models.ForeignKey("UserProfile",verbose_name="課程顧問",on_delete=models.CASCADE) 72 date = models.DateField(auto_now_add=True) 73 74 def __str__(self): 75 return self.name 76 class Meta: 77 verbose_name = "客戶表" 78 verbose_name_plural = "客戶表" 79 80 class CustomerFollowUp(models.Model): 81 """ 82 客戶跟蹤記錄表 83 """ 84 customer = models.ForeignKey("CustomerInfo",on_delete=models.CASCADE) 85 content = models.TextField(verbose_name="跟蹤內容") 86 user = models.ForeignKey("UserProfile",verbose_name="跟進人",on_delete=models.CASCADE) 87 status_choices = ((0,'近期無報名計劃'), 88 (1, '一個月內報名'), 89 (2, '兩週內報名'), 90 (3, '已報名'), 91 ) 92 status = models.SmallIntegerField(choices=status_choices) 93 date = models.DateField(auto_now_add=True) 94 def __str__(self): 95 return self.content 96 class Meta: 97 verbose_name = "客戶追蹤" 98 verbose_name_plural = "客戶追蹤" 99 100 class Course(models.Model): 101 """ 102 課程表 103 """ 104 name = models.CharField(verbose_name='課程名稱',max_length=64,unique=True) 105 price = models.PositiveSmallIntegerField() 106 period = models.PositiveSmallIntegerField(verbose_name="課程週期(月)",default=5) 107 outline = models.TextField(verbose_name="大綱") 108 109 def __str__(self): 110 return self.name 111 class Meta: 112 verbose_name = "課程表" 113 verbose_name_plural = "課程表" 114 115 class ClassList(models.Model): 116 """ 117 班級列表 118 """ 119 branchschool = models.ForeignKey("BranchSchool",on_delete=models.CASCADE) 120 course = models.ForeignKey("Course",on_delete=models.CASCADE) 121 class_type_choices = ((0,'脫產'), 122 (1,'週末'), 123 (2,'網絡班'), 124 ) 125 class_type = models.SmallIntegerField(choices=class_type_choices,default=0) 126 semester = models.SmallIntegerField(verbose_name="學期") 127 teachers = models.ManyToManyField("UserProfile",verbose_name="講師") 128 start_date = models.DateField("開班日期") 129 graduate_date = models.DateField("畢業日期",blank=True,null=True) 130 131 def __str__(self): 132 return "%s(%s)期" %(self.course.name,self.semester) 133 134 class Meta: 135 """聯合惟一""" 136 unique_together = [ 137 ('branchschool','class_type','course','semester') 138 ] 139 verbose_name = "班級" 140 verbose_name_plural = "班級" 141 142 class CourseRecord(models.Model): 143 """ 144 上課記錄表 145 """ 146 class_grade = models.ForeignKey("ClassList",verbose_name="上課班級",on_delete=models.CASCADE) 147 day_num = models.PositiveSmallIntegerField(verbose_name="課程節次") 148 teacher = models.ForeignKey("UserProfile",on_delete=models.CASCADE) 149 title = models.CharField("本節主題",max_length=64) 150 content = models.TextField("本節內容") 151 has_homework = models.BooleanField("本節有做業",default=True) 152 homework = models.TextField("做業需求",blank=True,null=True) 153 date = models.DateTimeField(auto_now_add=True) 154 155 def __str__(self): 156 return "%s第(%s)節" %(self.class_grade,self.day_num) 157 class Meta: 158 unique_together = [ 159 ('class_grade','day_num') 160 ] 161 verbose_name_plural = "上課記錄" 162 163 class StudyRecord(models.Model): 164 """ 165 學習記錄表 166 """ 167 course_record = models.ForeignKey("CourseRecord",on_delete=models.CASCADE) 168 student = models.ForeignKey("Student",on_delete=models.CASCADE) 169 score_choices = ((100,"A+"), 170 (90,"A"), 171 (85,"B+"), 172 (80,"B"), 173 (75,"B-"), 174 (70,"C+"), 175 (60,"C"), 176 (40,"C-"), 177 (-50,"D"), 178 (0,"N/A"), #not avaliable 179 (-100,"COPY"), #not avaliable 180 ) 181 score = models.SmallIntegerField(choices=score_choices,default=0) 182 show_choices = ((0,'缺勤'), 183 (1,'已遲到'), 184 (2,'遲到'), 185 (3,'早退'), 186 ) 187 show_status = models.SmallIntegerField(choices=show_choices,default=1) 188 note = models.TextField("成績備註",blank=True,null=True) 189 date = models.DateTimeField(auto_now_add=True) 190 191 def __str__(self): 192 return "%s %s %s" %(self.course_record,self.student,self.score) 193 class Meta: 194 unique_together = ('course_record','student') 195 verbose_name_plural = "學習記錄" 196 197 class BranchSchool(models.Model): 198 """ 199 校區 200 """ 201 name = models.CharField(max_length=64,unique=True) 202 addr = models.CharField(max_length=128,blank=True,null=True) 203 def __str__(self): 204 return self.name 205 class Meta: 206 verbose_name = "校區" 207 verbose_name_plural = "校區" 208 209 class Menus(models.Model): 210 """ 211 動態菜單 212 """ 213 name = models.CharField(max_length=64) 214 url_type_choices = ((0,'absolute'), 215 (1,'dynamic'), 216 ) 217 url_type = models.SmallIntegerField(choices=url_type_choices) 218 url_name = models.CharField(max_length=128) 219 220 def __str__(self): 221 return self.name 222 class Meat: 223 unique_together = ('name','url_name') 224 verbose_name_plural = "菜單欄" 225 # 角色與菜單多對多關係,在Role表中添加關聯
四:註冊數據表微信
1 from django.contrib import admin 2 from crm import models 3 4 # Register your models here. 5 6 admin.site.register(models.UserProfile) 7 admin.site.register(models.Role) 8 admin.site.register(models.Student) 9 admin.site.register(models.CustomerInfo) 10 admin.site.register(models.CustomerFollowUp) 11 admin.site.register(models.Course) 12 admin.site.register(models.ClassList) 13 admin.site.register(models.CourseRecord) 14 admin.site.register(models.StudyRecord) 15 admin.site.register(models.BranchSchool) 16 admin.site.register(models.Menus)
五:生成數據表並建立管理員帳戶網絡
1 python manage.py makemigrations 2 python manage.py migrate 3 4 建立管理員用戶 5 6 python manage.py createsuperuser
爲啥個人後臺頁面和原生的admin後臺管理頁面不同,由於我美化了後臺只須要在settings作如下幾步就能夠搞定session
1 INSTALLED_APPS = [ 2 'suit', 3 'django.contrib.admin', 4 'django.contrib.auth', 5 'django.contrib.contenttypes', 6 'django.contrib.sessions', 7 'django.contrib.messages', 8 'django.contrib.staticfiles', 9 'crm.apps.CrmConfig', 10 ] 11 12 13 14 LANGUAGE_CODE = 'zh-Hans' 15 16 TIME_ZONE = 'Asia/Shanghai' 17 18 USE_I18N = True 19 20 USE_L10N = False 21 22 USE_TZ = True 23 24 DATETIME_FORMAT = 'Y-m-d H:i:s' 25 DATE_FORMAT = 'Y-m-d' 26 27 SUIT_CONFIG = { 28 'ADMIN_NAME': 'CRM管理系統', 29 'MENU': ( 30 'sites', 31 {'app': 'accounts', 'label': '賬戶'}, 32 {'app': 'zinnia', 'label': '博客'}, 33 {'app': 'auth', 'label': '認證管理'}, 34 ), 35 } 36 37 38 # Static files (CSS, JavaScript, Images) 39 # https://docs.djangoproject.com/en/2.0/howto/static-files/ 40 41 STATIC_URL = '/static/' 42 STATICFILES_DIRS = ( 43 os.path.join(BASE_DIR,'statics'), 44 )