Django CRM客戶關系管理系統


CRM需求分析

    隨着信息化時代帶來的科技創新,CRM客戶關系管理系統帶來的效益在已經成為很多企業提高競爭優勢的一分部,CRM客戶關系管理系統將企業管理和客戶關系管理集成到統一的平台,其系統功能主要體現在企業與客戶之間的業務和企業內部之前部門之間的業務。因此CRM客戶關系管理系統不但可以記錄企業自內部信息,對於客戶信息存儲也是可以做到的,其中還涉及市場競爭對手的情報資料,還包括了企業進行營銷、銷售及支持服務所需的各種數據。

功能實現
  (1)建議統一的信息編碼系統;
  (2)設計能夠良好反映事物特性的數據模型;
  (3)划分數據庫管理,在分布式數據庫管理系統和網絡平台基礎上,涉及全局共享及局部共享數據庫,以支持分布式數據處理,實現各分系統之間及其內部各功能模塊之間的信息集成。
  (4)提供強大的數據庫管理系統,並在此基礎上增加拿過來的完善的客戶銷售數據庫、客戶市場數據庫、客戶支持與服務數據庫、企業綜合信息數據庫等。
  CRM客戶關系管理系統的管理理念始終是以客戶為中心的,不同的管理系統有着自己不同的數據處理方式,因此企業在構建自己的客戶關系管理數據庫時需要注意系統的特性和其他企業管理軟件的協調。
  對於中小型企業在客戶關系管理系統上的應用,可有助於企業對客戶信息管理混亂狀態的改善,加強了企業和客戶之間的聯系,因此下面是中小企業在面對客戶關系管理系統時所需的需求:
   (1)因為是小型企業,系統將只設系統管理員,管理員擁有對企業全部系統資料的操作權限。
   (2)客戶管理模塊,基本資料的添加、修改、刪除和查詢功能;與客戶相關的聯系人資料的添加、修改、刪除和查詢功能。另外,當查詢到需要信息的時候,系統應提供報表和打印功能,以供公司領導作出決策。
   (3)客戶銷售管理模塊,有基本的添加、修改、刪除和查詢功能。其目標是提高客戶銷售數據的准確性、及時性和完整性,對客戶銷售進行有效管理,提供決策支持所需的數據。
     (4)服務反饋模塊,有基本的添加、修改、刪除和查詢功能,其目標是及時記錄客戶反饋的信息,提供有競爭力的售后支持、修理和維護服務
 
模型分析:

 

好了 開始寫項目吧!
    首先創建django項目:
            環境:Python3
            工具: pycharm
            用到的插件:jquery bootsharp
  • 創建項目:
  • 根據關系編寫model 認證方式繼承於django自帶認證from django.contrib.auth.models import User
  1 from django.db import models
  2 from django.contrib.auth.models import User
  3 # Create your models here.
  4 
  5 
  6 class Customer(models.Model):
  7 '''客戶信息表'''
  8 name = models.CharField(max_length=32,blank=True,null=True)
  9 qq = models.CharField(max_length=64,unique=True)
 10 qq_name = models.CharField(max_length=64,blank=True,null=True)
 11 phone = models.CharField(max_length=64,blank=True,null=True)
 12 source_choices = ((0,'轉介紹'),
 13 (1,'QQ群'),
 14 (2,'官網'),
 15 (3,'百度推廣'),
 16 (4,'51CTO'),
 17 (5,'知乎'),
 18 (6,'市場推廣')
 19 )
 20 
 21 source = models.SmallIntegerField(choices=source_choices)
 22 referral_from = models.CharField(verbose_name="轉介紹人qq",max_length=64,blank=True,null=True)
 23 
 24 consult_course = models.ForeignKey("Course",verbose_name="咨詢課程")
 25 content = models.TextField(verbose_name="咨詢詳情")
 26 tags = models.ManyToManyField("Tag",blank=True,null=True)
 27 status_choices = ((0,'已報名'),
 28 (1,'未報名'),
 29 )
 30 status = models.SmallIntegerField(choices=status_choices,default=1)
 31 consultant = models.ForeignKey("UserProfile")
 32 memo = models.TextField(blank=True,null=True)
 33 date = models.DateTimeField(auto_now_add=True)
 34 
 35 def __str__(self):
 36 return self.qq
 37 
 38 class Meta:
 39 verbose_name ="客戶表"
 40 verbose_name_plural ="客戶表"
 41 
 42 class Tag(models.Model):
 43 name = models.CharField(unique=True,max_length=32)
 44 
 45 def __str__(self):
 46 return self.name
 47 
 48 class Meta:
 49 verbose_name = "標簽"
 50 verbose_name_plural = "標簽"
 51 
 52 class CustomerFollowUp(models.Model):
 53 '''客戶跟進表'''
 54 customer = models.ForeignKey("Customer")
 55 content = models.TextField(verbose_name="跟進內容")
 56 consultant = models.ForeignKey("UserProfile")
 57 
 58 intention_choices = ((0,'2周內報名'),
 59 (1,'1個月內報名'),
 60 (2,'近期無報名計划'),
 61 (3,'已在其它機構報名'),
 62 (4,'已報名'),
 63 (5,'已拉黑'),
 64 )
 65 intention = models.SmallIntegerField(choices=intention_choices)
 66 date = models.DateTimeField(auto_now_add=True)
 67 
 68 def __str__(self):
 69 return "<%s : %s>" %(self.customer.qq,self.intention)
 70 
 71 
 72 class Meta:
 73 verbose_name = "客戶跟進記錄"
 74 verbose_name_plural = "客戶跟進記錄"
 75 
 76 class Course(models.Model):
 77 '''課程表'''
 78 name = models.CharField(max_length=64,unique=True)
 79 price = models.PositiveSmallIntegerField()
 80 period = models.PositiveSmallIntegerField(verbose_name="周期(月)")
 81 outline = models.TextField()
 82 
 83 def __str__(self):
 84 return self.name
 85 
 86 class Meta:
 87 verbose_name = "課程表"
 88 verbose_name_plural = "課程表"
 89 
 90 class Branch(models.Model):
 91 '''校區'''
 92 name = models.CharField(max_length=128,unique=True)
 93 addr = models.CharField(max_length=128)
 94 def __str__(self):
 95 return self.name
 96 
 97 
 98 class Meta:
 99 verbose_name = "校區"
100 verbose_name_plural = "校區"
101 
102 class ClassList(models.Model):
103 '''班級表'''
104 branch = models.ForeignKey("Branch",verbose_name="校區")
105 course = models.ForeignKey("Course")
106 class_type_choices = ((0,'面授(脫產)'),
107 (1,'面授(周末)'),
108 (2,'網絡班')
109 )
110 class_type = models.SmallIntegerField(choices=class_type_choices,verbose_name="班級類型")
111 semester = models.PositiveSmallIntegerField(verbose_name="學期")
112 teachers = models.ManyToManyField("UserProfile")
113 start_date = models.DateField(verbose_name="開班日期")
114 end_date = models.DateField(verbose_name="結業日期",blank=True,null=True)
115 
116 def __str__(self):
117 return "%s %s %s" %(self.branch,self.course,self.semester)
118 
119 class Meta:
120 unique_together = ('branch','course','semester')
121 verbose_name_plural = "班級"
122 verbose_name = "班級"
123 
124 class CourseRecord(models.Model):
125 '''上課記錄'''
126 from_class = models.ForeignKey("ClassList",verbose_name="班級")
127 day_num = models.PositiveSmallIntegerField(verbose_name="第幾節(天)")
128 teacher = models.ForeignKey("UserProfile")
129 has_homework = models.BooleanField(default=True)
130 homework_title = models.CharField(max_length=128,blank=True,null=True)
131 homework_content = models.TextField(blank=True,null=True)
132 outline = models.TextField(verbose_name="本節課程大綱")
133 date = models.DateField(auto_now_add=True)
134 
135 def __str__(self):
136 return "%s %s" %(self.from_class,self.day_num)
137 
138 class Meta:
139 unique_together = ("from_class", "day_num")
140 verbose_name_plural = "上課記錄"
141 
142 
143 class StudyRecord(models.Model):
144 '''學習記錄'''
145 student = models.ForeignKey("Enrollment")
146 course_record = models.ForeignKey("CourseRecord")
147 attendance_choices = ((0,'已簽到'),
148 (1,'遲到'),
149 (2,'缺勤'),
150 (3,'早退'),
151 )
152 attendance = models.SmallIntegerField(choices=attendance_choices,default=0)
153 score_choices = ((100,"A+"),
154 (90,"A"),
155 (85,"B+"),
156 (80,"B"),
157 (75,"B-"),
158 (70,"C+"),
159 (60,"C"),
160 (40,"C-"),
161 (-50,"D"),
162 (-100,"COPY"),
163 (0,"N/A"),
164 )
165 score = models.SmallIntegerField(choices=score_choices,default=0)
166 memo = models.TextField(blank=True,null=True)
167 date = models.DateField(auto_now_add=True)
168 
169 def __str__(self):
170 return "%s %s %s" %(self.student,self.course_record,self.score)
171 
172 class Meta:
173 unique_together = ('student','course_record')
174 verbose_name_plural = "學習記錄"
175 
176 
177 class Enrollment(models.Model):
178 '''報名表'''
179 customer = models.ForeignKey("Customer")
180 enrolled_class = models.ForeignKey("ClassList",verbose_name="所報班級")
181 consultant = models.ForeignKey("UserProfile",verbose_name="課程顧問")
182 contract_agreed = models.BooleanField(default=False,verbose_name="學員已同意合同條款")
183 contract_approved = models.BooleanField(default=False,verbose_name="合同已審核")
184 date = models.DateTimeField(auto_now_add=True)
185 
186 def __str__(self):
187 return "%s %s" %(self.customer,self.enrolled_class)
188 
189 class Meta:
190 unique_together = ("customer","enrolled_class")
191 verbose_name_plural = "報名表"
192 
193 class Payment(models.Model):
194 '''繳費記錄'''
195 customer = models.ForeignKey("Customer")
196 course = models.ForeignKey("Course",verbose_name="所報課程")
197 amount = models.PositiveIntegerField(verbose_name="數額",default=500)
198 consultant = models.ForeignKey("UserProfile")
199 date = models.DateTimeField(auto_now_add=True)
200 
201 def __str__(self):
202 return "%s %s" %(self.customer,self.amount)
203 
204 class Meta:
205 verbose_name_plural = "繳費記錄"
206 
207 class UserProfile(models.Model):
208 '''賬號表'''
209 user = models.OneToOneField(User)
210 name = models.CharField(max_length=32)
211 roles = models.ManyToManyField("Role",blank=True,null=True)
212 
213 def __str__(self):
214 return self.name
215 
216 class Role(models.Model):
217 '''角色表'''
218 name = models.CharField(max_length=32,unique=True)
219 menus = models.ManyToManyField("Menu",blank=True)
220 
221 def __str__(self):
222 return self.name
223 class Meta:
224 verbose_name_plural = "角色"
225 
226 
227 class Menu(models.Model):
228 '''菜單'''
229 name = models.CharField(max_length=32)
230 url_name = models.CharField(max_length=64)
231 
232 def __str__(self):
233 return self.name
models.py

 

  • 注冊數據表
crm/admin.py

1 from django.contrib import admin 2 from crm import models 3 4 admin.site.register(models.Customer) 5 admin.site.register(models.CustomerFollowUp) 6 admin.site.register(models.Enrollment) 7 admin.site.register(models.Course) 8 admin.site.register(models.ClassList) 9 admin.site.register(models.CourseRecord) 10 admin.site.register(models.Branch) 11 admin.site.register(models.Role) 12 admin.site.register(models.Payment) 13 admin.site.register(models.StudyRecord) 14 admin.site.register(models.Tag) 15 admin.site.register(models.UserProfile) 16 admin.site.register(models.Menu)

View Code

Python manage.py makemigrations python manage.py migrate

C:\Users\MrTong\Desktop\django\EasyCRM>Python manage.py makemigrations
System check identified some issues:
WARNINGS:
crm.Customer.tags: (fields.W340) null has no effect on ManyToManyField.
crm.UserProfile.roles: (fields.W340) null has no effect on ManyToManyField.
Migrations for 'crm':
  crm\migrations\0001_initial.py
    - Create model Branch
    - Create model ClassList
    - Create model Course
    - Create model CourseRecord
    - Create model Customer
    - Create model CustomerFollowUp
    - Create model Enrollment
    - Create model Menu
    - Create model Payment
    - Create model Role
    - Create model StudyRecord
    - Create model Tag
    - Create model UserProfile
    - Add field consultant to payment
    - Add field course to payment
    - Add field customer to payment
    - Add field consultant to enrollment
    - Add field customer to enrollment
    - Add field enrolled_class to enrollment
    - Add field consultant to customerfollowup
    - Add field customer to customerfollowup
    - Add field consultant to customer
    - Add field tags to customer
    - Add field teacher to courserecord
    - Add field course to classlist
    - Add field teachers to classlist
    - Alter unique_together for studyrecord (1 constraint(s))
    - Alter unique_together for enrollment (1 constraint(s))
    - Alter unique_together for courserecord (1 constraint(s))
    - Alter unique_together for classlist (1 constraint(s))
C:\Users\MrTong\Desktop\django\EasyCRM>Python manage.py migrate
System check identified some issues:
WARNINGS:
crm.Customer.tags: (fields.W340) null has no effect on ManyToManyField.
crm.UserProfile.roles: (fields.W340) null has no effect on ManyToManyField.
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, crm, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying crm.0001_initial... OK
  Applying sessions.0001_initial... OK

生成數據表

  • 創建管理用戶 (密碼不能純數字)

    Python manage.py createsuperuser
C:\Users\MrTong\Desktop\django\EasyCRM>python manage.py createsuperuser
System check identified some issues:
WARNINGS:
crm.Customer.tags: (fields.W340) null has no effect on ManyToManyField.
crm.UserProfile.roles: (fields.W340) null has no effect on ManyToManyField.
Username (leave blank to use 'mrtong'):
Email address: abc@qq.com
Password:
Password (again):
Superuser created successfully.
創建超級用戶

 

  • OK 先來登陸admin吧 

  • 接下來創建幾條數據吧! 

數據創建完成了,但是我們發現了一個問題,我們創建了那么多字段為什么只而admin只顯示了主鍵字段,這樣的話查看數據就非常的不方便,因此我們就需要對admin進行定制了!
        我們繼續修改crm/admin.py
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',)
class UserProfileAdmin(admin.ModelAdmin):
    list_display = ('user','name')
admin.site.register(models.Customer,CustomerAdmin)
admin.site.register(models.UserProfile,UserProfileAdmin)
admin.py

     效果顯而易見 

 

編寫自己的admin 管理系統

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM