Django项目:CRM(客户关系管理系统)--82--72PerfectCRM实现CRM动态菜单和角色

  1 #models.py
  2
  3 # ————————01PerfectCRM基本配置ADMIN————————
  4
  5 from django.db import models
  6 # Create your models here.
  7
  8 """
  9 #运行 Terminal
 10 #    生成 数据表
 11 #    python manage.py makemigrations
 12 #   数据表 迁移
 13 #    python manage.py migrate
 14 """
 15
 16 """01校区表"""
 17 class Branch(models.Model):
 18     name = models.CharField(max_length=128,unique=True) #校区名#CharField作用是保存文本,定长的变量类型
 19     addr = models.CharField(max_length=128) #地址
 20     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
 21         return self.name #返回 #校区名
 22     class Meta: #通过一个内嵌类 "class Meta" 给你的 model 定义元数据
 23         verbose_name_plural =  "01校区表" #verbose_name_plural给你的模型类起一个更可读的名字
 24
 25 """02班级表"""
 26 class ClassList(models.Model):
 27     #ForeignKey就是表与表之间的某种约定的关系  #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
 28     branch = models.ForeignKey("Branch",on_delete=models.CASCADE)#校区    关联到  校区表
 29     course = models.ForeignKey("Course",on_delete=models.CASCADE) #课程   关联到   课程表
 30
 31     # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
 32     contract = models.ForeignKey(‘ContractTemplate‘, blank=True, null=True, default=1,on_delete=models.CASCADE)  # 合同表
 33     # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
 34
 35     class_type_choices = ( #上课形式
 36                           (0,‘面授(脱产)‘),
 37                           (1,‘面授(周末)‘),
 38                           (2,‘网络班‘),)
 39     #PositiveSmallIntegerField正小整数 0 ~ 32767 #choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
 40     class_type = models.SmallIntegerField(choices=class_type_choices)#上课形式
 41
 42     #PositiveSmallIntegerField正小整数 0 ~ 32767
 43     semester = models.PositiveSmallIntegerField(verbose_name="学期") #课程的第几期
 44
 45     #ManyToManyField多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例。
 46     teachers = models.ManyToManyField("UserProfile") # 老师   关联到    账号表
 47
 48     start_date = models.DateField(verbose_name="开班日期") #DateField 日期格式 YYYY-MM-DD #verbose_name是Admin中显示的字段名称
 49
 50     # DateField 日期格式 YYYY-MM-DD #verbose_name是Admin中显示的字段名称 #Django可空#数据库可以为空
 51     end_date = models.DateField(verbose_name="结业日期",blank=True,null=True)
 52
 53     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
 54         return "%s %s %s" %(self.branch,self.course,self.semester) #返回 #%s格式化输出字符串 #校区#课程# 学期
 55     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
 56         unique_together=(‘branch‘,‘course‘,‘semester‘)  #联合索引
 57         verbose_name_plural = "02班级表" #verbose_name_plural给你的模型类起一个更可读的名字
 58
 59 """03课程表,可以报名那些课程"""
 60 class Course(models.Model):
 61     name = models.CharField(max_length=64,unique=True)#课程名 #CharField作用是保存文本,定长的变量类型
 62     price = models.PositiveSmallIntegerField(verbose_name="学费")#学费#PositiveSmallIntegerField正小整数 0 ~ 32767
 63     period = models.PositiveSmallIntegerField(verbose_name="周期(月)") #PositiveSmallIntegerField正小整数 0 ~ 32767
 64     outline = models.TextField() #课程大纲  #文本类型
 65     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
 66         return self.name #返回 #课程名
 67     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
 68         verbose_name_plural =  "03课程表"#verbose_name_plural给你的模型类起一个更可读的名字
 69
 70 ‘‘‘04客户信息表‘‘‘
 71 class Customer(models.Model):
 72     name = models.CharField(max_length=32,blank=True,null=True)#客户名#CharField定长文本 #名字最长32 # Django可空 #数据库可以为空
 73     qq = models.CharField(max_length=64,unique=True) #QQ号#CharField定长文本 #名字最长64 #唯一,不能重复
 74     qq_name = models.CharField(max_length=64,blank=True,null=True)#QQ名 #CharField定长文本 #名字最长64 # Django可空 #数据库可以为空
 75     phone = models.CharField(max_length=64,blank=True,null=True)#手机号 #CharField定长文本 #名字最长64 # Django可空 #数据库可以为空
 76
 77     # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
 78     id_num=models.CharField(max_length=64,blank=True,null=True,verbose_name=‘身份证号‘)#身份证号
 79     email=models.EmailField(max_length=64,blank=True,null=True,verbose_name=‘邮箱‘)#email
 80     sex_choices=((0,‘保密‘),(1,‘男‘),(2,‘女‘))
 81     sex=models.SmallIntegerField(choices=sex_choices,default=0,verbose_name=‘性别‘)
 82     # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
 83
 84     # ————————53PerfectCRM实现CRM客户报名流程缴费————————
 85     status_choices = ((0, ‘已报名‘), (1, ‘未报名‘), (2, ‘已退学‘))
 86     status = models.SmallIntegerField(choices=status_choices, default=1)  # 学员状态
 87     # ————————53PerfectCRM实现CRM客户报名流程缴费————————
 88
 89     source_choices = ( #客户渠道来源 (内存生成)
 90                       (0,‘转介绍‘),
 91                       (1,‘QQ群‘),
 92                       (2,‘官网‘),
 93                       (3,‘百度推广‘),
 94                       (4,‘51CTO‘),
 95                       (5,‘知乎‘),
 96                       (6,‘市场推广‘),)
 97     #PositiveSmallIntegerField正小整数 0 ~ 32767(省空间)#choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
 98     source = models.SmallIntegerField(choices=source_choices)#客户渠道来源
 99
100     #CharField定长文本#verbose_name是Admin中显示的字段名称#名字最长64 # Django可空 #数据库可以为空
101     referral_from = models.CharField(verbose_name="转介绍人qq",max_length=64,blank=True,null=True) #来自谁介绍的
102
103     #ForeignKey就是表与表之间的某种约定的关系#verbose_name是Admin中显示的字段名称 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
104     consult_courses = models.ForeignKey("Course",verbose_name="咨询课程", on_delete=models.CASCADE) #关联到 课程表
105
106     content= models.TextField(verbose_name="咨询详情") #TextField无限制长度的文本#verbose_name是Admin中显示的字段名称
107
108     #ManyToManyField多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例。
109     tags = models.ManyToManyField("Tag",blank=True)#多对多关联到 标签表
110
111     #ForeignKey就是表与表之间的某种约定的关系  #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
112     consultant = models.ForeignKey("UserProfile", on_delete=models.CASCADE) #关联到  账号表
113
114     memo = models.TextField(blank=True,null=True)#备注#TextField无限制长度的文本#Django可空#数据库可以为空
115
116     #DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)
117     date =  models.DateTimeField(auto_now_add=True)#创建时间(数据库自增)
118
119     def __str__(self): #__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
120         return self.qq  #返回 #QQ号
121
122     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
123         verbose_name_plural =  "04客户表" #verbose_name_plural给你的模型类起一个更可读的名字
124
125 # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
126 #合同模版
127 class ContractTemplate(models.Model):
128     name=models.CharField(‘合同名称‘,max_length=64,unique=True)
129     template=models.TextField()
130
131     def __str__(self):
132         return self.name
133     class Meta:
134         verbose_name_plural=‘合同表‘
135 # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
136
137
138 """05客户跟进表"""
139 class CustomerFollowUp(models.Model):
140
141     #ForeignKey就是表与表之间的某种约定的关系 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
142     customer = models.ForeignKey("Customer", on_delete=models.CASCADE)#客户名 #关联到  客户信息表
143
144     content = models.TextField(verbose_name="跟进内容")#跟进的内容#TextField无限制长度的文本#verbose_name是Admin中显示的字段名称
145
146     #ForeignKey就是表与表之间的某种约定的关系  #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
147     consultant =models.ForeignKey("UserProfile", on_delete=models.CASCADE) #关联到  账号表
148
149     intention_choices =(  #报名状态
150                         (0,‘2周内报名‘),
151                         (1,‘1个月内报名‘),
152                         (2,‘近期无报名计划‘),
153                         (3,‘已在其它机构报名‘),
154                         (4,‘已报名‘),
155                         (5,‘已拉黑‘),)
156     #PositiveSmallIntegerField正小整数 0 ~ 32767(省空间)#choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
157     intention=models.SmallIntegerField(choices=intention_choices) #报名状态
158
159     #DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)
160     date =  models.DateTimeField(auto_now_add=True)#创建时间(数据库自增)
161
162     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
163         return "<%s:%s>" %(self.customer.qq,self.intention) #返回#格式化字符串#跨表里的QQ号#报名状态
164     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
165         verbose_name_plural =  "05客户跟进表"#verbose_name_plural给你的模型类起一个更可读的名字
166
167 """06学员报名信息表"""
168 class Enrollment(models.Model):
169     # ForeignKey就是表与表之间的某种约定的关系#verbose_name是Admin中显示的字段名称 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
170     customer = models.ForeignKey("Customer",on_delete=models.CASCADE)#学员名字 #关联到  客户信息表
171     enrolled_class = models.ForeignKey("ClassList",verbose_name="所报班级",on_delete=models.CASCADE)#关联到  班级表
172     consultant = models.ForeignKey("UserProfile",verbose_name="课程顾问",on_delete=models.CASCADE) #关联到  账号表
173
174     # ————————52PerfectCRM实现CRM客户报名流程学生合同审核————————
175     contract_review = models.CharField(max_length=256, blank=True, null=True, verbose_name="合同审核")  # 合同审核
176     # ————————52PerfectCRM实现CRM客户报名流程学生合同审核————————
177
178     #BooleanField布尔值类型#default=False默认(True)不允许出现空字符#verbose_name是Admin中显示的字段名称
179     contract_agreed = models.BooleanField(default=False,verbose_name="学员已经同意合同")#学员看合同
180     contract_approved = models.BooleanField(default=False,verbose_name="合同已经审核") #谁审核
181
182     # ————————53PerfectCRM实现CRM客户报名流程缴费————————
183     Pay_cost= models.BooleanField(default=False,verbose_name="缴费") #缴费状态#是不是交定金
184     # ————————53PerfectCRM实现CRM客户报名流程缴费————————
185
186     # DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)
187     date = models.DateTimeField(auto_now_add=True)#创建时间(数据库自增)
188
189     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
190         # ————————57PerfectCRM实现admin批量生成上课记录————————
191         # return "%s %s" %(self.customer,self.enrolled_class)#返回#格式化字符串#学员名字#所报班级
192         return " 学员:%s |QQ: %s |班级:%s" %(self.customer.name,self.customer,self.enrolled_class)#返回#格式化字符串#学员名字#所报班级
193         # ————————57PerfectCRM实现admin批量生成上课记录————————
194     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
195         unique_together =  ("customer","enrolled_class")#联合索引
196         verbose_name_plural =  "06学员报名信息表"#verbose_name_plural给你的模型类起一个更可读的名字
197
198 """07缴费记录表"""
199 class Payment(models.Model):
200     #ForeignKey就是表与表之间的某种约定的关系#verbose_name是Admin中显示的字段名称 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
201     customer = models.ForeignKey("Customer",on_delete=models.CASCADE)#学员名字        关联到  客户信息表
202     course = models.ForeignKey("Course",verbose_name="所报课程",on_delete=models.CASCADE)#关联到  课程表
203
204     #PositiveSmallIntegerField正小整数 0 ~ 32767 #verbose_name是Admin中显示的字段名称#默认值=500
205     amount = models.PositiveIntegerField(verbose_name="数额",default=500)#缴费数额
206
207     #ForeignKey就是表与表之间的某种约定的关系#CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
208     consultant = models.ForeignKey("UserProfile",on_delete=models.CASCADE)#缴费给谁 关联到  账号表 #财务人员
209
210     #DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)
211     date=models.DateTimeField(auto_now_add=True)#创建时间(数据库自增)
212
213     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
214         return "%s %s" %(self.customer,self.amount)#返回#格式化字符串#学员名字#缴费数额
215     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
216         verbose_name_plural = "07缴费记录表"#verbose_name_plural给你的模型类起一个更可读的名字
217
218 """08每节课上课纪录表"""
219 class CourseRecord(models.Model):
220     # ForeignKey就是表与表之间的某种约定的关系#verbose_name是Admin中显示的字段名称 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
221     from_class = models.ForeignKey("ClassList",verbose_name="班级",on_delete=models.CASCADE) #那个班级
222
223     #PositiveSmallIntegerField正小整数 0 ~ 32767 #verbose_name是Admin中显示的字段名称
224     day_num = models.PositiveSmallIntegerField(verbose_name="第几节(天)") #第几节课
225
226     # ForeignKey就是表与表之间的某种约定的关系 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
227     teacher = models.ForeignKey("UserProfile",on_delete=models.CASCADE)#老师是谁    关联到    账号表
228
229     #BooleanField布尔值类型#default=True默认(True)不允许出现空字符
230     has_homework = models.BooleanField(default=True) #有没有作业
231
232     # CharField定长文本#名字最长128#Django可空#数据库可以为空
233     homework_title = models.CharField(max_length=128,blank=True,null=True) #作业标题
234
235     #TextField无限制长度的文本#Django可空#数据库可以为空
236     homework_content = models.TextField(blank=True,null=True) #作业内容
237
238     #TextField无限制长度的文本#verbose_name是Admin中显示的字段名称
239     outline =models.TextField(verbose_name="本节课程大纲") #课程主要讲什么
240
241     # DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)
242     date = models.DateField(auto_now_add=True)#创建时间(数据库自增)
243
244     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
245         return " %s:%s" %(self.from_class,self.day_num)#返回#格式化字符串#班级#第几节(天)
246     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
247         unique_together = ("from_class","day_num") #联合索引
248         verbose_name_plural = "08每节课上课纪录表" #verbose_name_plural给你的模型类起一个更可读的名字
249
250 """09学习纪录"""
251 class StudyRecord(models.Model):
252     # ForeignKey就是表与表之间的某种约定的关系 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
253     student = models.ForeignKey("Enrollment",on_delete=models.CASCADE)#学生名字   关联到    学员报名信息表
254     course_record = models.ForeignKey("CourseRecord",on_delete=models.CASCADE)#开课记录   # 关联到    每节课上课纪录表
255
256     attendance_choices = (# 本节课上课状态记录
257                             (0,"已签到"),
258                             (1,"迟到"),
259                             (2,"缺勤"),
260                             (3,"早退"),)
261     #PositiveSmallIntegerField正小整数 0 ~ 32767(省空间)#choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
262     attendance = models.SmallIntegerField(choices=attendance_choices) # 本节课上课状态记录
263
264     # ————————63PerfectCRM实现CRM讲师下载作业————————
265     delivery = models.BooleanField(default=False,verbose_name="交作业") #有没有交付作业
266     # ————————63PerfectCRM实现CRM讲师下载作业————————
267
268
269     # ————————61PerfectCRM实现CRM学生上传作业————————
270     homework_link = models.TextField(blank=True,null=True)#作业链接 #TextField无限制长度的文本#Django可空#数据库可以为空
271     # ————————61PerfectCRM实现CRM学生上传作业————————
272
273     score_choices = (#学习成绩
274                      (100,"A+"),
275                      (90,"A"),
276                      (85,"B+"),
277                      (80,"B"),
278                      (75,"B-"),
279                      (70,"C+"),
280                      (65,"C"),
281                      (40,"C-"),
282                      (-20,"D"),
283                      (-50,"COPY"),
284                      (0,"N/A"),)
285     #PositiveSmallIntegerField正小整数 0 ~ 32767(省空间)#choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
286     score = models.SmallIntegerField(choices=score_choices) #学习成绩
287
288
289     memo = models.TextField(blank=True,null=True)#TextField无限制长度的文本#Django可空#数据库可以为空
290
291     # DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)
292     date = models.DateField(auto_now_add=True)#创建时间(数据库自增)
293
294     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
295         return "%s %s %s" % (self.student, self.course_record, self.score)#返回#格式化字符串#学生名字#开课记录#学习成绩
296     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
297         unique_together = (‘student‘,‘course_record‘)#联合索引#学生名字#开课记录
298         verbose_name_plural =  "09学习纪录"#verbose_name_plural给你的模型类起一个更可读的名字
299
300 # ————————34PerfectCRM实现CRM自定义用户————————
301 # """10账号表"""
302 # class UserProfile(models.Model):
303 #     from django.contrib.auth.models import User  # 使用django内置的用户表
304 #
305 #     #OneToOneField一对一  #User是django Admin里的账号表#CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
306 #     user = models.OneToOneField(User,on_delete=models.CASCADE)# 用户名 #创建外键,关联django用户表
307 #
308 #     name = models.CharField(max_length=32) #账号名(扩展用户字段)#CharField定长文本
309 #
310 #     #ManyToManyField多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例。#Django可空
311 #     roles = models.ManyToManyField("Role",blank=True) #角色(权限)   # 双向一对多==多对多
312 #
313 #     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
314 #         return self.name #返回 #账号名
315 #     class Meta: #通过一个内嵌类 "class Meta" 给你的 model 定义元数据
316 #         verbose_name_plural = "10账号表"#verbose_name_plural给你的模型类起一个更可读的名字
317 # ————————34PerfectCRM实现CRM自定义用户————————
318
319 # ————————34PerfectCRM实现CRM自定义用户————————
320 #10账号表,创建用户和超级用户
321 from django.contrib.auth.models import BaseUserManager
322 class UserProfileManager(BaseUserManager):
323     def create_user(self, email, name, password=None):
324         """
325       创建并保存一个用户用给定的邮件,日期
326       出生和密码。
327         """
328         if not email:#没有email 报错
329             raise ValueError(‘用户必须有一个电子邮件地址‘)
330
331         user = self.model(
332             email=self.normalize_email(email),#验证邮箱格式
333             name=name,
334         )
335         user.set_password(password)#加密
336         user.is_active = True
337         user.save(using=self._db)
338         return user
339     def create_superuser(self, email, name, password):
340         """
341       创建并保存一个超级用户具有给定邮件,日期
342       出生和密码。
343         """
344         user = self.create_user(email,
345             password=password,
346             name=name
347         )
348         user.is_active = True
349         user.is_superuser = True
350         user.save(using=self._db)
351         return user
352
353 """10账号表"""
354 """
355
356 #删除数据库
357
358 #调用objects = UserProfileManager()#创建账号 #关联这个函数
359
360 #运行 Terminal
361 #    生成 数据表
362 #    python manage.py makemigrations
363 #   数据表 迁移
364 #    python manage.py migrate
365 Django Admin里账号密码重置方法
366 #运行 Terminal
367 python manage.py createsuperuser
368
369 Email address:          [email protected]
370 用户名 :                 admin
371 Password:               admin123456
372 Password (again):       admin123456
373 """
374 from django.contrib.auth.models import AbstractBaseUser
375 # ————————35PerfectCRM实现CRM重写Admin密码修改————————
376 from django.utils.translation import ugettext_lazy as _  # 语言国际化
377 from django.utils.safestring import mark_safe
378 from django.contrib.auth.models import PermissionsMixin
379 # class UserProfile(AbstractBaseUser):
380 class UserProfile(AbstractBaseUser,PermissionsMixin):
381 # ————————35PerfectCRM实现CRM重写Admin密码修改————————
382     email=models.EmailField(
383         verbose_name=‘邮箱账号‘,
384         max_length=255,
385         unique=True#唯一  #登陆账号
386     )
387     name=models.CharField(max_length=32,verbose_name=‘用户名‘)
388
389
390     # ————————72PerfectCRM实现CRM动态菜单和角色————————
391     branch = models.ForeignKey( "Branch", verbose_name="所属校区", blank=True, null=True, on_delete=models.CASCADE )
392     roles = models.ManyToManyField( ‘Role‘, verbose_name="角色", blank=True )
393     memo = models.TextField( blank=True, null=True, default=None, verbose_name="备注" )
394     from django.utils import timezone
395     date_joined = models.DateTimeField( verbose_name="创建时间", default=timezone.now )
396     # ————————72PerfectCRM实现CRM动态菜单和角色————————
397
398     # ————————35PerfectCRM实现CRM重写Admin密码修改————————
399     password = models.CharField(_(‘password‘), max_length=128, help_text=mark_safe(‘‘‘<a href=\"../password/\">修改密码</a>‘‘‘))
400     # ————————35PerfectCRM实现CRM重写Admin密码修改————————
401
402     is_active = models.BooleanField(default=True,verbose_name=‘合法账号‘)#权限#合法账号
403     is_superuser = models.BooleanField(default=False,verbose_name=‘超级账号‘) #超级账号
404     objects = UserProfileManager()#创建账号 #关联这个函数
405     USERNAME_FIELD =‘email‘#指定做为  #登陆账号
406     REQUIRED_FIELDS = [‘name‘]#必填字段
407
408
409     # ————————60PerfectCRM实现CRM学生上课记录————————
410     stu_account = models.ForeignKey( "Customer", verbose_name=‘关联学员帐号‘, blank=True, null=True, on_delete=models.CASCADE,
411                                      help_text=‘报名成功后创建关联帐户‘ )
412     # ————————60PerfectCRM实现CRM学生上课记录————————
413
414     def get_full_name(self):
415         return self.email
416     def get_short_name(self):
417         #用户确认的电子邮件地址
418         return self.email
419     def __str__(self):
420         return self.name
421     def has_perm(self,perm,obj=None):
422         #指明用户是否被认为活跃的。以反选代替删除帐号。
423         #最简单的可能的答案:是的,总是
424         return True   #有效 账号
425     def has_module_perms(self, app_label):
426         #指明用户是否可以登录到这个管理站点。
427         # 最简单的可能的答案:是的,总是
428         return True #职员状态
429     @property
430     def is_staff(self):
431         ‘‘‘“用户的员工吗?”‘‘‘
432         #最简单的可能的答案:所有管理员都是员工
433         return self.is_superuser#是不是超级用户状态
434 # AUTH_USER_MODEL = ‘crm.UserProfile‘#使用自定的admin 表单   #settings.py
435 # ————————34PerfectCRM实现CRM自定义用户————————
436
437 """11角色表"""
438 class Role(models.Model):
439     name = models.CharField(unique=True,max_length=32)#角色名#CharField定长文本#角色名不可以重复#最长度=32字节
440
441     # ————————72PerfectCRM实现CRM动态菜单和角色————————
442     menus = models.ManyToManyField(‘FirstLayerMenu‘,verbose_name=‘一层菜单‘,blank=True)
443     # ————————72PerfectCRM实现CRM动态菜单和角色————————
444
445     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
446         return self.name#返回 #角色名
447     class Meta: #通过一个内嵌类 "class Meta" 给你的 model 定义元数据
448         verbose_name_plural = "11角色表" #verbose_name_plural给你的模型类起一个更可读的名字
449
450
451 """12标签表"""
452 class Tag(models.Model):
453     name =  models.CharField(max_length=64,unique=True) #标签名#CharField定长文本#最长度=64字节#不可以重复
454     def __str__(self): #__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
455         return self.name #返回 #标签名
456     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
457         verbose_name_plural =  "12标签表" #verbose_name_plural给你的模型类起一个更可读的名字
458
459 # ————————01PerfectCRM基本配置ADMIN————————
460
461
462 # ————————72PerfectCRM实现CRM动态菜单和角色————————
463 """13一层菜单名"""
464 class FirstLayerMenu(models.Model):
465     ‘‘‘第一层侧边栏菜单‘‘‘
466     name = models.CharField(‘一层菜单名‘,max_length=64)
467     url_type_choices = ((0,‘相关的名字‘),(1,‘固定的URL‘))
468     url_type = models.SmallIntegerField(choices=url_type_choices,default=0)
469     url_name = models.CharField(max_length=64,verbose_name=‘一层菜单路径‘)
470     order = models.SmallIntegerField(default=0,verbose_name=‘菜单排序‘)
471     sub_menus = models.ManyToManyField(‘SubMenu‘,blank=True)
472
473     def __str__(self):
474         return self.name
475
476     class Meta:
477         verbose_name_plural = "13第一层菜单"
478
479 """14二层菜单名"""
480 class SubMenu(models.Model):
481     ‘‘‘第二层侧边栏菜单‘‘‘
482     name = models.CharField(‘二层菜单名‘, max_length=64)
483     url_type_choices = ((0,‘相关的名字‘),(1,‘固定的URL‘))
484     url_type = models.SmallIntegerField(choices=url_type_choices,default=0)
485     url_name = models.CharField(max_length=64, verbose_name=‘二层菜单路径‘)
486     order = models.SmallIntegerField(default=0, verbose_name=‘菜单排序‘)
487
488     def __str__(self):
489         return self.name
490
491     class Meta:
492         verbose_name_plural = "14第二层菜单"
493 # ————————72PerfectCRM实现CRM动态菜单和角色————————

#models.py

  1 # kingadmin.py
  2 # ————————04PerfectCRM实现King_admin注册功能————————
  3 from crm import models
  4 #print("kingadmin crm",models.Customer)
  5
  6 # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  7 # from king_admin.base_admin import register,BaseAdmin
  8 from king_admin.base_admin import site,BaseAdmin
  9 # ————————05PerfectCRM实现King_admin注册功能获取内存————————
 10
 11 # ————————24PerfectCRM实现King_admin自定义操作数据————————
 12 from django.shortcuts import render
 13 # ————————24PerfectCRM实现King_admin自定义操作数据————————
 14
 15 # ————————28PerfectCRM实现King_admin编辑限制————————
 16 from django.forms import ValidationError
 17 from django.shortcuts import render,redirect
 18 # ————————28PerfectCRM实现King_admin编辑限制————————
 19
 20
 21
 22
 23 # ————————62PerfectCRM实现CRM讲师讲课记录————————
 24 # 02班级表
 25 class ClassListAdmin(BaseAdmin):
 26     list_display = [‘id‘, ‘branch‘, ‘course‘, ‘class_type‘, ‘semester‘, ‘start_date‘, ‘end_date‘]  # 显示字段表头
 27     list_filter = [‘branch‘, ‘course‘, ‘class_type‘]  # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
 28     filter_horizontal = [‘teachers‘]  #复选框
 29 site.register(models.ClassList,ClassListAdmin)               #02班级表
 30
 31 # ————————62PerfectCRM实现CRM讲师讲课记录————————
 32
 33
 34
 35
 36 #04客户信息表
 37 class CustomerAdmin(BaseAdmin):#定制Djanago admin
 38     # ————————54PerfectCRM实现CRM客户报名链接————————
 39     # list_display = (‘id‘, ‘qq‘, ‘source‘, ‘consultant‘, ‘content‘, ‘date‘)  # 显示字段表头
 40     list_display = (‘id‘, ‘qq‘, ‘source‘, ‘consultant‘, ‘content‘, ‘date‘,‘status‘,‘enroll‘)  # 显示字段表头
 41     # ————————54PerfectCRM实现CRM客户报名链接————————
 42     # ————————11PerfectCRM实现King_admin分页显示条数————————
 43     list_per_page = 2  #分页条数  # 默认分页条数10
 44     # ————————11PerfectCRM实现King_admin分页显示条数————————
 45     # ————————16PerfectCRM实现King_admin日期过滤————————
 46     # ————————15PerfectCRM实现King_admin多条件过滤————————
 47     # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
 48     # list_filter = (‘source‘,‘consultant‘,‘consult_courses‘,)
 49     list_filter = (‘date‘,‘source‘,‘consultant‘,‘consult_courses‘,)
 50     # ————————15PerfectCRM实现King_admin多条件过滤————————
 51     # ————————16PerfectCRM实现King_admin日期过滤————————
 52     # ————————18PerfectCRM实现King_admin搜索关键字————————
 53     #搜索(不能包含CharField)(注意加 逗号 , )
 54     search_fields = (‘name‘,‘qq‘,)
 55     # ————————18PerfectCRM实现King_admin搜索关键字————————
 56     # ————————26PerfectCRM实现King_admin自定义排序————————
 57     ordering = ‘-qq‘  #自定义排序,默认‘-id‘
 58     # ————————26PerfectCRM实现King_admin自定义排序————————
 59     # ————————27PerfectCRM实现King_admin编辑复选框————————
 60     filter_horizontal = (‘tags‘,) #复选框
 61     # ————————27PerfectCRM实现King_admin编辑复选框————————
 62     # ————————33PerfectCRM实现King_admin编辑整张表限制————————
 63     readonly_table=True#默认表单不锁定
 64     # ————————33PerfectCRM实现King_admin编辑整张表限制————————
 65
 66     # ————————55PerfectCRM实现CRM客户报名状态颜色变化————————
 67     colored_fields = {
 68         ‘status‘:{‘已报名‘:"rgba(145, 255, 0, 0.78)",
 69                   ‘未报名‘:"#ddd"},}
 70     # ————————55PerfectCRM实现CRM客户报名状态颜色变化————————
 71
 72     # ————————54PerfectCRM实现CRM客户报名链接————————
 73     def enroll(self):
 74         ‘‘‘报名‘‘‘
 75         print("customize field enroll",self)
 76         link_name = "报名"
 77         if self.instance.status == 0:
 78             link_name = "报名新课程"
 79         return ‘‘‘<a target="_blank" class="btn-link" href="/bpm/customer/%s/enrollment/">点击%s</a> ‘‘‘ % (self.instance.id,link_name)
 80                 # url(r‘^customer/(\d+)/enrollment/$‘, sales_views.enrollment, name="enrollment"),  # 客户招生#报名流程一 下一步
 81                 # target属性用于表示所链接文件打开到的位置 #记住,“”内的文字只是表示一个对象的名子。
 82     enroll.display_name = "报名链接"
 83     # ————————54PerfectCRM实现CRM客户报名链接————————
 84
 85
 86
 87     # ————————24PerfectCRM实现King_admin自定义操作数据————————
 88     # from django.shortcuts import render
 89     actions = [‘test_actions‘,]#定制功能    #测试返回到一个新页面
 90     def test_actions(self,request,arg2):#对应的函数 #request类自己的请求  #arg2类的内容
 91         return render(request,"king_admin/table_index.html")
 92     test_actions.short_description = "测试显示中文"
 93     # ————————24PerfectCRM实现King_admin自定义操作数据————————
 94
 95     # ————————28PerfectCRM实现King_admin编辑限制————————
 96     # ————————31PerfectCRM实现King_admin编辑多对多限制————————
 97     # readonly_fields = (‘qq‘, ‘consultant‘,)  # 不可修改
 98     readonly_fields = (‘qq‘, ‘consultant‘,‘tags‘,)  # 不可修改
 99     # ————————31PerfectCRM实现King_admin编辑多对多限制————————
100
101     # ————————29PerfectCRM实现King_admin编辑自定义限制————————
102     def default_form_validation(self,obj):
103         print(‘validation:制定的‘,obj.cleaned_data)
104         consult_course=obj.cleaned_data.get(‘content‘,‘‘)#自制验证字段
105         if len(consult_course)<10:
106             return ValidationError(#添加错误信息 返回
107                                 ("该字段%(field)s 咨询内容记录不能少于10个字符"),
108                                 code=‘invalid‘,
109                                 params={‘field‘:‘content‘,},
110                             )
111     # ————————29PerfectCRM实现King_admin编辑自定义限制————————
112
113     # ————————28PerfectCRM实现King_admin编辑限制————————
114
115     # ————————30PerfectCRM实现King_admin编辑自定义字段验证————————
116     def clean_name(self,obj,*args,**kwargs):#名称验证 单个
117         name=obj.cleaned_data[‘name‘]
118         if not name:
119             obj.add_error(‘name‘,‘不能为空!‘)
120             return ValidationError(#添加错误信息 返回
121                                 ("%(field)s:该字段 不能为空"),
122                                 code=‘invalid‘,
123                                 params={‘field‘:‘name‘,},
124                             )
125         elif len(name)<5:
126             obj.add_error(‘name‘,‘不能小于5个字符!‘)
127             #return ValidationError(‘‘,)
128             return ValidationError(#添加错误信息 返回
129                                 ("%(field)s:该字段 不能小于5个字符!"),
130                                 code=‘invalid‘,
131                                 params={‘field‘:‘name‘,},
132                             )
133     # ————————30PerfectCRM实现King_admin编辑自定义字段验证————————
134
135 # ————————34PerfectCRM实现CRM自定义用户————————
136 #10账号表
137 class UserProfileAdmin(BaseAdmin):#定制Djanago admin
138     list_display = (‘id‘, ‘email‘, ‘name‘)  # 显示字段表头
139
140     # ————————36PerfectCRM实现King_admin密码修改————————
141     readonly_fields = (‘password‘,)   # 不可修改,限制
142
143     # ————————72PerfectCRM实现CRM动态菜单和角色————————
144     # filter_horizontal = (‘user_permissions‘,‘groups‘) #复选框
145     filter_horizontal = (‘user_permissions‘, ‘groups‘,‘roles‘)  # 复选框
146     # ————————72PerfectCRM实现CRM动态菜单和角色————————
147
148     modelform_exclude_fields=[‘last_login‘]#排除#不显示 #自增日期 #base_admin.py #forms.py
149     # ————————36PerfectCRM实现King_admin密码修改————————
150
151 site.register(models.UserProfile, UserProfileAdmin)
152 # ————————34PerfectCRM实现CRM自定义用户————————
153
154 # ————————05PerfectCRM实现King_admin注册功能获取内存————————
155 # register(models.Customer,CustomerAdmin)
156 # register(models.CourseRecord)
157 site.register(models.Customer,CustomerAdmin)
158 # ————————58PerfectCRM实现king_admin批量生成上课记录————————
159 # site.register(models.CourseRecord)
160 # ————————58PerfectCRM实现king_admin批量生成上课记录————————
161 # ————————05PerfectCRM实现King_admin注册功能获取内存————————
162
163 # ————————04PerfectCRM实现King_admin注册功能————————
164
165
166 # ————————56PerfectCRM实现CRM客户报名缴费链接————————
167 # 06学员报名信息表
168 class EnrollmentAdmin(BaseAdmin):  # 定制Djanago admin
169     list_display = (‘id‘, ‘customer‘, ‘enrolled_class‘, ‘consultant‘, ‘Pay_cost‘, ‘date‘, ‘payment‘)  # 显示字段表头
170
171     # ————————58PerfectCRM实现king_admin批量生成上课记录————————
172     list_filter = (‘enrolled_class‘,‘consultant‘, ‘Pay_cost‘,) # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
173     # ————————58PerfectCRM实现king_admin批量生成上课记录————————
174
175     colored_fields = {
176         ‘Pay_cost‘: {True: "rgba(145, 255, 0, 0.78)",
177                      False: "#ddd"}, }
178     def payment(self):
179         link_name = "增加缴费"
180         if self.instance.Pay_cost == False:
181             link_name = "缴费"
182         return ‘‘‘<a target="_blank" class="btn-link"  href="/bpm/payment/%s/" >点击%s</a> ‘‘‘ % (self.instance.id, link_name)
183         # url(r‘^payment/(\d+)/$‘, financial_views.payment, name="payment"),  # 报名流程四    缴费   #财务
184         # target属性用于表示所链接文件打开到的位置 #记住,“”内的文字只是表示一个对象的名子。
185     payment.display_name = "缴费链接"
186 site.register(models.Enrollment, EnrollmentAdmin)  # 06学员报名信息表
187 # ————————56PerfectCRM实现CRM客户报名缴费链接————————
188
189 # ————————58PerfectCRM实现king_admin批量生成上课记录————————
190 # 07缴费记录表
191 class PaymentAdmin(BaseAdmin):
192     list_display = [‘id‘, ‘customer‘, ‘course‘, ‘amount‘, ‘consultant‘,‘date‘]  # 显示字段表头
193     list_filter = (‘customer‘, ‘course‘, ‘consultant‘,)  # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
194
195 from django.shortcuts import render, HttpResponse, redirect
196 # 08每节课上课纪录表
197 class CourseRecordAdmin(BaseAdmin):
198     list_display = [‘id‘, ‘from_class‘, ‘day_num‘, ‘teacher‘, ‘has_homework‘, ‘homework_title‘, ‘homework_content‘,‘outline‘, ‘date‘]  # 显示字段表头
199     list_filter = (‘from_class‘, ‘teacher‘, ‘date‘)  # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
200     def initialize_studyrecords(self, request, queryset):  # 制定功能
201         print(‘initialize_studyrecords‘, self, request, queryset)
202         if len(queryset) > 1:
203             return HttpResponse("同时只能选择一个班级!")
204         print(‘获取对应的学员‘, queryset[0].from_class.enrollment_set.all())  # _set反向查询
205         new_obj_list = []  # 用于批量创建事务  #防止数据库事物回滚
206         for enrll_obj in queryset[0].from_class.enrollment_set.all():  # 创建学习记录
207             #     models.StudyRecord.objects.get_or_create(       #get_or_ #防止报错
208             #         student=enrll_obj,#对应学员
209             #         course_record=queryset[0],
210             #         attendance=0,#签到状态,默认签到,
211             #         score=0,#成绩
212             #     )
213
214             # 防止数据库事物回滚    #"""09学习纪录"""
215             new_obj_list.append(models.StudyRecord(
216                 student=enrll_obj,  # 对应学员
217                 course_record=queryset[0],  # 班级#节课
218                 attendance=0,  # 签到状态,默认签到,
219                 score=0,  # 成绩
220             ))
221         try:
222             models.StudyRecord.objects.bulk_create(new_obj_list)  # bulk_create批量创建数据库事物 #统一最后保存
223         except Exception as e:
224             return HttpResponse(‘批量创建失败,本节课可能有相应的上课记录‘)
225
226         return redirect("/king_admin/crm/studyrecord/?course_record=%s" % queryset[0].id)  # 学习记录 #加上过滤
227
228     actions = [‘initialize_studyrecords‘, ]
229     initialize_studyrecords.short_description = "创建班级本节上课记录"  # 显示别名
230 # 09学习纪录
231 class StudyRecordAdmin(BaseAdmin):
232     list_display = [‘id‘, ‘student‘, ‘course_record‘, ‘attendance‘, ‘score‘, ‘date‘]  # 显示字段表头
233
234     list_filter = [‘course_record‘, ‘attendance‘, ‘score‘, ‘student‘]  # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
235
236     list_editable = [‘score‘, ‘attendance‘]  # 可编辑   #用于上课点名 批改成绩
237
238 site.register(models.Payment, PaymentAdmin)  # 07缴费记录表
239 site.register(models.CourseRecord, CourseRecordAdmin)  # 08每节课上课纪录表
240 site.register(models.StudyRecord, StudyRecordAdmin)  # 09学习纪录
241 # ————————58PerfectCRM实现king_admin批量生成上课记录————————
242
243
244 # ————————72PerfectCRM实现CRM动态菜单和角色————————
245 # 11角色表
246 class RoleAdmin(BaseAdmin):
247     list_display = [‘id‘, ‘name‘]  # 显示字段表头
248     filter_horizontal = [‘menus‘]  # 复选框
249 site.register(models.Role,RoleAdmin) #11角色表
250
251 # 13一层菜单名
252 class FirstLayerMenuAdmin(BaseAdmin):
253     list_display = [‘id‘, ‘name‘, ‘url_type‘, ‘url_name‘, ‘order‘]  # 显示字段表头
254 site.register(models.FirstLayerMenu,FirstLayerMenuAdmin)  #13一层菜单名
255 # 14二层菜单名
256 class SubMenuMenuAdmin(BaseAdmin):
257     list_display = [‘id‘, ‘name‘, ‘url_type‘, ‘url_name‘, ‘order‘]  # 显示字段表头
258 site.register(models.SubMenu,SubMenuMenuAdmin)   #14二层菜单名
259 # ————————72PerfectCRM实现CRM动态菜单和角色————————

# kingadmin.py

 1 {#menu.html#}
 2
 3  {## ————————71PerfectCRM实现CRM项目首页————————#}
 4 <h4><a href="{% url ‘gbacc_logout‘ %}">重新登陆账号:</a>{{ request.user.name }}</h4>
 5
 6 {# 账号表  分配角色  夸表关联 角色表#}
 7 {% for role in request.user.roles.all %} {# 循环开始  role#}
 8     <h3 class="label-danger ">{{ role.name }}的菜单</h3>
 9     {# 角色表  可视菜单  夸表关联  动态菜单#}
10     {% for menu in role.menus.all %} {# 循环开始  menu#}
11         <li>
12             {#如果URL路径类型等于相对路径的URL      # URL +  URL路径 #} {# 否则         URL路径     #}
13             <a href="{% if menu.url_type == 0 %}{% url menu.url_name %}{% else %} {{ menu.url_name }}{% endif %}">
14                 {{ menu.name }} {# 动态菜单  菜单名#}
15             </a>
16         </li>
17
18         {% for menu in menu.sub_menus.all %} {# 循环开始  sub_menus#}
19             <li >
20
21                 {#如果URL路径类型等于相对路径的URL      # URL +  URL路径 #} {# 否则         URL路径     #}
22                 <a href="{% if menu.url_type == 0 %}{% url menu.url_name %}{% else %} {{ menu.url_name }}{% endif %}">
23                     {{ menu.name }} {# 动态菜单  菜单名#}
24                 </a>
25             </li>
26         {% endfor %} {# 循环结束  sub_menus#}
27     {% endfor %} {# 循环结束  menu#}
28
29 {% endfor %} {# 循环结束  role#}
30
31  {## ————————71PerfectCRM实现CRM项目首页————————#}

{#menu.html#}

 1 {# sample.thml  #}
 2 {## ————————71PerfectCRM实现CRM项目首页————————#}
 3 {% extends "master/base.html" %}
 4 {% block body %}{#自定义内容开始 body#}
 5     {% block nav-bar %}{#自定义内容开始 上面导航栏#}
 6         <nav class="navbar navbar-inverse navbar-fixed-top">
 7             <div class="container-fluid">
 8                 <div class="navbar-header">
 9                     <a class="navbar-brand" href="#">{% block head %}{#自定义内容开始 head#} CRM{% endblock %}{#自定义内容结束 #}</a>
10                 </div>
11                 <div id="navbar" class="navbar-collapse collapse">
12                     <ul class="nav navbar-nav navbar-right">
13                         <li><a href="/">主页</a></li>
14                         <li><a href="/king_admin/"> KingAdmin首页</a></li>
15                         <li class="dropdown">
16                             {% if request.user.id %}
17                                 <a href="#" class="dropdown-toggle" data-toggle="dropdown"
18                                    role="button" aria-haspopup="true" aria-expanded="false">
19                                     当前用户:{{ request.user.name }}
20                                     <span class="caret"></span>
21                                 </a>
22                                 <ul class="dropdown-menu">
23                                     <li><a href="{% url ‘gbacc_logout‘ %}">注销</a></li>
24                                     <li><a href="{% url ‘gbacc_modify‘ request.user.id %}">修改密码</a></li>
25                                 </ul>
26                             {% endif %}
27                         </li>
28                         <li><a href="{% url ‘gbacc_login‘ %}">登陆</a></li>
29                         <li><a href="{% url ‘gbacc_register‘ %}">注册</a></li>
30
31
32                         <li class="dropdown">
33                             <a href="#" class="dropdown-toggle" data-toggle="dropdown"
34                                role="button" aria-haspopup="true" aria-expanded="false">
35                                 更多
36                                 <span class="caret"></span>
37                             </a>
38                             <ul class="dropdown-menu">
39                                 <li><a target="_blank" href="/admin/"> admin首页</a></li>
40                             </ul>
41                         </li>
42                         <li><a href="#"> &emsp;&nbsp;&ensp;&thinsp;</a></li>
43                     </ul>
44                 </div>
45             </div>
46         </nav>
47     {% endblock %}{#自定义内容结束 nav-bar上面导航栏#}
48     <div class="container-fluid">
49         <div class="row">
50             {% block side-bar %}{#自定义内容开始 左边菜单#}
51                 <div class="col-sm-3 col-md-2 sidebar">
52                     <ul class="nav nav-sidebar"> {#JS绑定  base.html#}
53                         {% block side-bar-menus %}{#自定义内容开始 左边菜单#}
54
55                             {## ————————71PerfectCRM实现CRM项目首页————————#}
56 {#                            <h4>历史记录:</h4>#}
57                             {% include ‘components/menu.html‘ %}
58                             {## ————————71PerfectCRM实现CRM项目首页————————#}
59
60                         {% endblock %} {#自定义内容结束 side-bar-menus左边菜单#}
61                     </ul>
62                 </div>
63             {% endblock %}{#自定义内容结束 side-bar左边菜单#}
64             {% block right-container %} {#自定义内容开始 右边页面#}
65                 <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
66                     {% block right-container-content %} {#自定义内容开始 右边页面内容#}
67                         <div class="row placeholders">
68                             <div class="col-xs-6 col-sm-3 placeholder">
69                                 <h4>右边页面内容:</h4>
70                             </div>
71                         </div>
72                     {% endblock %}{#自定义内容结束 right-container-content右边页面内容#}
73                 </div>
74             {% endblock %} {#自定义内容结束 right-container右边页面#}
75         </div>
76     </div>
77 {% endblock %}
78 {#自定义内容结束 body#}
79 {## ————————71PerfectCRM实现CRM项目首页————————#}

{# sample.thml #}

原文地址:https://www.cnblogs.com/ujq3/p/9082410.html

时间: 2024-07-29 22:44:07

Django项目:CRM(客户关系管理系统)--82--72PerfectCRM实现CRM动态菜单和角色的相关文章

CRM客户关系管理系统如何分析客户的动态需求

由于激烈的市场竞争,对于怎样掌握客户的动态需求,怎样保持客户市场的稳定增长,对于企业来说已经成为普遍的关注点.CRM客户关系管理系统经过了10年的发展历程,怎样管理客户.了解客户成就了CRM客户关系管理系统的大市场. CRM供货商一般侧重于宣扬软件的特性及功用,而对其全体价值则没有做出了解的表述. 用户高档处理层一般从基础设施安顿而非运营和战略视点对待CRM客户关系管理系统施行. 由于无法从运营和战略视点安顿CRM客户关系管理系统,用户对CRM的价值认知只停留在技术功率层面上. 只需跨过技术和流

Django CRM客户关系管理系统

CRM需求分析 随着信息化时代带来的科技创新,CRM客户关系管理系统带来的效益在已经成为很多企业提高竞争优势的一分部,CRM客户关系管理系统将企业管理和客户关系管理集成到统一的平台,其系统功能主要体现在企业与客户之间的业务和企业内部之前部门之间的业务.因此CRM客户关系管理系统不但可以记录企业自内部信息,对于客户信息存储也是可以做到的,其中还涉及市场竞争对手的情报资料,还包括了企业进行营销.销售及支持服务所需的各种数据. 功能实现 (1)建议统一的信息编码系统; (2)设计能够良好反映事物特性的

CRM客户关系管理系统商业项目

本课程共33讲,购买课程后,可以下载项目需求分析文档,数据库设计文档,完整的项目源代码,数据库文件等资料,系统采用jsp,servlet,js,ajax,jquery,easyui,mysql数据库等相关技术实现,所有代码均为原生态,无第三方插件,系统稳定,高效,快捷,本系统是专门针对各种中小型企业量身定做的CRM客户关系管理系统,为企业管客户,管商机,管销售,从而推动业务进展,提高工作效率,管理大数据. 项目主要功能有客户管理,合同管理,合同附件管理,合同预览(放大缩小),订单管理,商务洽谈,

CRM客户关系管理系统商业项目视频课程

本课程共33讲,购买课程后,可以下载项目需求分析文档,数据库设计文档,完整的项目源代码,数据库文件等资料,系统采用jsp,servlet,js,ajax,jquery,easyui,mysql数据库等相关技术实现,所有代码均为原生态,无第三方插件,系统稳定,高效,快捷,本系统是专门针对各种中小型企业量身定做的CRM客户关系管理系统,为企业管客户,管商机,管销售,从而推动业务进展,提高工作效率,管理大数据. 项目主要功能有客户管理,合同管理,合同附件管理,合同预览(放大缩小),订单管理,商务洽谈,

CRM客户关系管理系统需求分析文档

系统简介 本软件采用现在流行的WEB架构开发,主要针对中小型公司.管销售,管客户,管商机:可以在任何能上网的地方登录使用,使用简单,功能强大,方便快捷,丰富完善的报表功能,极大的提高公司的运营效率,不会因为人员的变动而导致数据的丢失,对公司的日常业务,问题追责等提供详细数据,对于公司领导可以做到"一表知天下",具体功能如下:1.客户管理:1.1.有非常完善的客户资料信息,对不同的客户进行分类管理,如普通客户,VIP客户,成交客户和潜在客户等1.2.对客户的每次来电,拜访情况可以做详细的

crm客户关系管理系统大约多少钱?

随着CRM在企业中的应用普遍化,不少人相信对CRM系统并不陌生,但是更多人关注的还是CRM客户关系管理系统价格如何. 其实CRM价格并不是固定的,毕竟市面上CRM系统种类众多,种类不同,价格不一样,功能不同,价格也不一样,所以CRM客户关系管理系统价格是由多方面因素影响的. 其实不同的CRM都有不同的价格,况且现在很多CRM都分模块或分版本销售,所以会出现不同的需求不同的价格.当然了选择CRM不仅仅要看价格,而且要看这套CRM是否符合自己公司的具体需求.可以尝试多去试用,多去对比,找出适合自己企

最好用的CRM客户关系管理系统

佳网CRM客户关系管理系统我们致力于解决企业客户管理,提高企业的办事效率,为企业提供一站式服务化繁为简: 统一管理,不再分散 解决客户资料分散于业务员个人的问题,现在每个人一个帐号,客户资料统一管理 权限设置细化明确 不同部门设置不同的菜单权限,不同的员工级别设置不同的操作权限 精准定位,多条件查找 根据级别.合同状态.所属业务员.跟单状态等不同条件快速查找客户资料 客户资料随身而行 移动端全功能支持,随时随地看客户.跟单.订单.合同资料 实时消息提醒 第一时间通知与您相关的新消息,即刻加入企业

CRM客户关系管理系统如何推动企业走向成功

随着我国互联网信息技术水平的不断提高,crm客户关系管理系统发展迅速.许多的企业对crm系统进行了引进,帮助企业赢得收益与未来,那crm系统如何帮助企业走向成功的呢?下面我们一起来看看. 一.集中保存客户信息客户无疑是企业发展的根本,crm系统拥有强大的客户信息管理的能力,可以详细记录客户信息,对客户的信息进行集中管理和共享,防止出现因业务调整或人员的流动而产生客户资源或数据的流失:同时,crm系统能够保证客户信息的完整,积累企业的宝贵财富.让企业从现有客户中获取更多市场份额,让客户生命周期发挥

CRM客户关系管理系统-需求概设和详设

大概设计 大概设计就是对需求进行一个整体性分析,把需要实现的功能都列出来,对于客户关系管理系统,我们需要从角色出发,从而确定有哪些需求,最好是画个思维导图 首先我们是为培训学校这么一个场景来开发的,所以有:学生,讲师,销售,老板这么四个角色,那接下来,我们就要对这几个角色需要实现哪些功能逐一分析了 第一个,学生,1.交作业 2.查成绩 3.请假 4.合同 5.我的推荐 6.投诉建议 第二个,讲师, 1.上课点名 2.批作业 3.创建上课记录 4.查看班级成绩 5.课时申报 6.问卷调查 第三个,