CRM(2)

一:创建项目名称,并且配置好数据库

二:数据模型场景

 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         # :课程,学员,分数等级,成绩备注,考勤状况,记录时间;

数据模型场景

三:设计数据库

  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做以下几步就可以搞定

 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 )

原文地址:https://www.cnblogs.com/sun1994/p/8856692.html

时间: 2024-10-19 05:48:57

CRM(2)的相关文章

新项目CRM(1)

<title>CRM登陆</title> <script type="text/javascript"> if (window.parent.window != window) { window.top.location.href = "/Home/CheckLogin"; } </script> <script src="~/Scripts/jquery-1.7.1.min.js">&

Dynamic CRM 2013学习笔记(七)追踪、监控及性能优化

本文将介绍CRM的三个内容追踪.监控及性能优化.追踪是CRM里一个很有用的功能,它能为我们的CRM调试或解决错误.警告提供有价值的信息:我们可以用window的性能监控工具来了解CRM的性能状况:最后就是对CRM及其DB进行性能调整以让CRM达到最佳状态.   一.追踪 有二种追踪方式,一种是部署级,这种方式追踪所有的CRM 服务器上的角色.服务,默认情况,log文件在C:\crmdrop\logs:另一种是服务器级追踪,这种方式只追踪当前机器上运行的服务器角色.服务.默认情况,log文件在C:

Dynamic CRM 2013学习笔记(三十八)流程1 - 操作(action)开发与配置详解

CRM 2013 里流程有4个类别:操作(action).业务流程(business process flow).对话(dialog)和工作流(workflow).它们都是从 setting –> Process 进入,然后点击New按钮来创建: 这篇主要介绍操作:什么是操作.什么时候使用操作.如何创建以及如何调用 一.什么是操作 操作是CRM 2013 新增加的一个功能,用来扩展系统的标准功能.业务人员可以用它来实现业务逻辑,然后开发人员可以在系统事件里(比如update,create)来使用

Dynamic CRM 2013学习笔记(五)禁止修改审批通过后的单据

审批通过后的单据,一般要对其进行控制,不能修改,不能添加,删除等,下面分别介绍下如何实现: 一. 禁止修改: 1. 主表控制,如果页面上审批状态为审批中或审批通过,就把整个页面都disable掉 1: function controlReadonly() { 2: var status = Xrm.Page.data.entity.attributes.get("new_approval_status").getValue(); 3: if (status == 2 || status

Dynamic CRM 2013学习笔记(四)单据编号及插件批量注册工具

Dynamic CRM 2013学习笔记(一)插件输入实体参数解析 Dynamic CRM 2013学习笔记(二)插件基本用法及调试 Dynamic CRM 2013学习笔记(三)快速创建实体 EntityCreater 基本上每个实体form上都会有单据编号,而且不同的实体编号要求还不太一样,这时就需要一个通用的单据编号插件,可配置以应对不同的需求. 下面简单介绍下实现步骤: 1. 创建二个实体,以保存各实体所要求的不同单据规则及当前流水号 2. 为不同的实体配置各自的单据规则 3. 编写及注

Dynamic CRM 2013学习笔记(二)插件基本用法及调试

插件是可与 Microsoft Dynamics CRM 2013 和 Microsoft Dynamics CRM Online 集成的自定义业务逻辑(代码),用于修改或增加平台的标准行为.也可以将插件认为是针对 Microsoft Dynamics CRM 触发的事件的处理程序.您可以让插件订阅或注册已知事件集,以便在事件发生时运行您的代码.   一.基本用法 1. 要继承IPlugin,并实现Excute方法 ( 1- 3 行) 2. 从service provide 里获取执行上下文 (

Dynamic CRM 2015学习笔记(4)修改开发人员资源(发现服务、组织服务和组织数据服务)url地址及组织名

在azure vm上安装了CRM 2015后 Dynamic CRM 2015学习笔记(1)Azure 上安装 CRM 2015, 发现了一个问题,那就是在设置 ->自定义项 –> 开发人员资源 里面的几个ulr(发现服务.组织服务和组织数据服务)都不对,显示的都是http://机器名/XRMServices/2011/ -, 但这个url是访问不了的,正确的url应该是 http://xxx.cloudapp.net/XRMServices/2011/ - 下面介绍如何修改成正确的url.

Microsoft Dynamics CRM 2011的组织服务中的RetrieveMultiple方法(转)

本篇文章,介绍Microsoft Dynamics CRM 2011的组织服务中的RetrieveMultiple方法. RetreiveMultiple方法,用于获取实体的多个实例,该方法的签名如下: 1 public virtual EntityCollection RetrieveMultiple (2 QueryBase query3 ) RetreiveMultiple方法的输入参数是QueryBase类的对象.QueryBase是一个基类,有多个子类,其类树如下图所示: 由上图可见,

Dynamic CRM 2013学习笔记(三)快速创建实体 EntityCreater

一.实体简介 实体用于在 Microsoft Dynamics CRM 中建立业务数据模型和管理业务数据.例如,可以使用客户.市场活动和事件(案例)等实体跟踪和支持销售.市场营销和服务活动.实体具有一组属性,每个属性表示一个特定类型的数据项.例如,客户实体具有 Name.Address 和 OwnerId 属性.从概念上讲,实体类似于数据库表,实体属性对应于表列.在 Microsoft Dynamics CRM 中创建实体记录(或记录)类似于在数据库表中添加记录.实体划分成三个类别:系统.业务和