CRM(2)

一:建立項目名稱,而且配置好數據庫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表中添加關聯
model.py

四:註冊數據表微信

 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)
admin

五:生成數據表並建立管理員帳戶網絡

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 )
相關文章
相關標籤/搜索