開發環境:
- 語言Python3.X以上
- MTV WEB框架 Django
- 前端框架 jQuery+bootstrap
- 數據庫 MySQL
運行環境
- 安裝Python3.x
- 安裝Django
- 除IE8以上的瀏覽器
項目需求:重寫Django Admin的功能,實現對表動態的增刪改查,實現權限的動態分配,實現自定義Action,等一系列組件擴展功能
項目功能圖:
項目表UML表關系圖
models.py表關系創建

1 from django.db import models 2 from django.contrib.auth.models import User 3 # Create your models here. 4 class Customer(models.Model): 5 '''客戶信息表''' 6 name = models.CharField(max_length=32,null=True,blank=True) 7 qq = models.CharField(max_length=64,unique=True) 8 qq_name = models.CharField(max_length=64,null=True,blank=True) 9 phone = models.CharField(max_length=64,null=True,blank=True) 10 source_choices = ((0,'轉介紹'),(1,'QQ群'),(2,'官網'),(3,'百度推廣'),(4,'51cto'),(5,'知乎推薦'),(6,'市場推廣')) 11 source = models.SmallIntegerField(choices=source_choices) 12 referral_from = models.CharField(verbose_name='轉介紹人QQ',max_length=64,null=True,blank=True) 13 consult_course = models.ForeignKey('Course',verbose_name='咨詢課程') 14 content = models.TextField(verbose_name='咨詢詳情') 15 consultant = models.ForeignKey('UserProfile',verbose_name='銷售') 16 tags = models.ManyToManyField('Tag',blank=True,null=True); 17 memo = models.TextField(blank=True,null=True) 18 status_choice = (('signed','已報名'),('unregistered','未報名')) 19 status = models.CharField(max_length=64,choices=status_choice,default='unregistered',verbose_name='客戶狀態') 20 date = models.DateTimeField(auto_now_add=True) 21 22 class Meta: 23 verbose_name_plural = '客戶' 24 25 def __str__(self): 26 return self.name 27 28 class CustomerFollowUp(models.Model): 29 '''客戶跟進表''' 30 customer = models.ForeignKey('Customer') 31 content = models.TextField(verbose_name='跟進內容') 32 consultant = models.ForeignKey('UserProfile') 33 intention_choices = ((0,'2周內報名'),(1,'1個月報名'),(2,'近期無報名計划'),(3,'已在其他機構報名'),(4,'已報名'),(5,'已拉黑')) 34 intention = models.SmallIntegerField(choices=intention_choices) 35 date = models.DateTimeField(auto_now_add=True) 36 37 def __str__(self): 38 return '%s %s' % (self.customer.qq, self.intention) 39 40 class Meta: 41 verbose_name_plural = '客戶跟進記錄' 42 43 class Course(models.Model): 44 '''課程表''' 45 name = models.CharField(max_length=128,unique=True) 46 price = models.PositiveSmallIntegerField() 47 period = models.PositiveSmallIntegerField(verbose_name='周期(月)') 48 outline = models.TextField() 49 50 def __str__(self): 51 return self.name 52 53 class Meta: 54 verbose_name_plural = '課程' 55 56 class Branch(models.Model): 57 '''校區表''' 58 name = models.CharField(max_length=128,unique=True) 59 addr = models.CharField(max_length=512) 60 61 def __str__(self): 62 return self.name 63 64 class Meta: 65 verbose_name_plural = '校區' 66 67 class ClassList(models.Model): 68 '''班級表''' 69 branch = models.ForeignKey('Branch',verbose_name='分校') 70 course = models.ForeignKey('Course') 71 semester = models.PositiveSmallIntegerField(verbose_name='學期') 72 teachers = models.ManyToManyField('UserProfile') 73 class_type_choice = ((0,'面授班(脫產)'),(1,'面授班(周末)'),(2,'網絡班')) 74 class_type = models.SmallIntegerField(choices=class_type_choice) 75 start_date = models.DateField(verbose_name='開班日期') 76 end_date = models.DateField(verbose_name='結業日期',blank=True,null=True) 77 78 def __str__(self): 79 return '%s %s %s' % (self.branch, self.course, self.semester) 80 81 class Meta: 82 unique_together = ('branch', 'course', 'semester') 83 verbose_name_plural = '班級' 84 85 86 87 class CourseRecord(models.Model): 88 '''上課記錄表''' 89 from_class = models.ForeignKey('ClassList',verbose_name='班級') 90 day_num = models.PositiveSmallIntegerField(verbose_name='第幾節(天)') 91 teacher = models.ForeignKey('UserProfile') 92 has_homework = models.BooleanField(default=True) 93 homework_title = models.CharField(max_length=256,blank=True,null=True) 94 homework_content = models.TextField(blank=True,null=True) 95 outline = models.TextField(verbose_name='本節課大綱') 96 date = models.DateTimeField(auto_now_add=True) 97 98 def __str__(self): 99 return '%s %s' % (self.from_class, self.day_num) 100 101 class Meta: 102 unique_together = ('from_class', 'day_num') 103 verbose_name_plural = '上課記錄' 104 105 106 class StudyRecord(models.Model): 107 '''學習記錄表''' 108 student = models.ForeignKey('Enrollment') 109 course_record = models.ForeignKey('CourseRecord') 110 attendance_choice = ((0,'已簽到'),(1,'遲到'),(2,'缺勤'),(3,'早退')) 111 attendance = models.SmallIntegerField(choices=attendance_choice,default=0) 112 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')) 113 score = models.SmallIntegerField(choices=score_choices) 114 memo = models.TextField(blank=True,null=True) 115 date = models.DateTimeField(auto_now_add=True) 116 117 def __str__(self): 118 return '%s %s %s' % (self.student, self.course_record, self.score) 119 120 class Meta: 121 unique_together = ('student', 'course_record') 122 verbose_name_plural = '學習記錄' 123 124 125 126 127 class Enrollment(models.Model): 128 '''學生報名表(學生報名信息,合同,入學日期,所報班級)''' 129 customer = models.ForeignKey('Customer') 130 enrolled_class = models.ForeignKey('ClassList',verbose_name='所報班級') 131 consultant = models.ForeignKey('UserProfile',verbose_name='課程顧問') 132 contact_agreed = models.BooleanField(default=False,verbose_name='學生已同意合同條款') 133 contact_approved = models.BooleanField(default=False,verbose_name='合同已審核') 134 date = models.DateTimeField(auto_now_add=True) 135 136 def __str__(self): 137 return '%s %s' % (self.customer, self.enrolled_class) 138 139 class Meta: 140 unique_together = ('customer', 'enrolled_class') 141 verbose_name_plural = '報名' 142 143 class Payment(models.Model): 144 '''繳費記錄''' 145 customer = models.ForeignKey('Customer') 146 course = models.ForeignKey('Course') 147 amount = models.PositiveIntegerField(verbose_name='數額',default=500) 148 consultant = models.ForeignKey('UserProfile') 149 date = models.DateTimeField(auto_now_add=True) 150 151 def __str__(self): 152 return '%s %s' % (self.customer, self.amount) 153 154 class Meta: 155 verbose_name_plural = '繳費記錄' 156 157 class UserProfile(models.Model): 158 '''賬號表''' 159 user = models.OneToOneField(User) 160 name = models.CharField(max_length=32) 161 roles = models.ManyToManyField('Role',blank=True,null=True) 162 163 def __str__(self): 164 return self.name 165 166 167 class Role(models.Model): 168 '''角色表''' 169 name = models.CharField(max_length=64,unique=True) 170 171 def __str__(self): 172 return self.name 173 174 class Meta: 175 verbose_name_plural = '角色' 176 177 class Tag(models.Model): 178 '''標簽備注''' 179 name = models.CharField(max_length=64,unique=True) 180 181 def __str__(self): 182 return self.name 183 class Meta: 184 verbose_name_plural = '標簽'
在Settings文件中配置靜態文件路徑

1 STATIC_URL = '/static/' 2 STATICFILES_DIRS =( 3 os.path.join(BASE_DIR,'static'), 4 )
更改默認的數據庫

1 DATABASES = { 2 'default': { 3 'ENGINE': 'django.db.backends.mysql', 4 'NAME': 'prefect_crm', 5 'USER': 'root', 6 'PASSWORD': 'oldboy', 7 'HOST': '127.0.0.1', 8 'PORT': '3306' 9 } 10 }
在app下的__init__.py中插入

1 import pymysql 2 pymysql.install_as_MySQLdb()