zoukankan      html  css  js  c++  java
  • CRM项目的整理---第一篇

    CRM:cunstomer relationship management  客户管理系统   

    1.项目的使用者:销售  班主任    讲师  助教

    2.项目的需求分析

      2.1.注册

      2.2.登录

      2.3.销售

        2.3.1.客户信息管理

          客户信息的增加 ,编辑,展示

        2.3.2.跟进信息管理

          跟进信息的增加 ,编辑,展示

        2.3.3.报名信息的管理

          报名信息的增加 ,编辑,展示

        2.3.4.缴费记录的管理

          缴费记录信息的增加 ,编辑,展示

      2.4.班主任

        2.4.1.班级信息.

          班级信息的增加 ,编辑,展示

        2.4.2.课程信息

          课程信息的增加 ,编辑,展示

        2.4.3.学习信息

          学习信息的增加 ,编辑,展示

    3.表结构的分析

      3.1.用户表(销售,班主任等)

      3.2.客户表

      3.3.跟进记录表

      3.4.报名记录表

      3.5.缴费记录表

      3.6班级表

      3.7.课程记录表

      3.8.学习记录表

    4.表结构的设计

    from django.db import models
    from multiselectfield import MultiSelectField
    
    course_choices = (('Linux', 'Linux中高级'),
                      ('PythonFullStack', 'Python高级全栈开发'),)
    
    class_type_choices = (('fulltime', '脱产班',),
                          ('online', '网络班'),
                          ('weekend', '周末班',),)
    
    source_type = (('qq', "qq群"),
                   ('referral', "内部转介绍"),
                   ('website', "官方网站"),
                   ('baidu_ads', "百度推广"),
                   ('office_direct', "直接上门"),
                   ('WoM', "口碑"),
                   ('public_class', "公开课"),
                   ('website_luffy', "路飞官网"),
                   ('others', "其它"),)
    
    enroll_status_choices = (('signed', "已报名"),
                             ('unregistered', "未报名"),
                             ('studying', '学习中'),
                             ('paid_in_full', "学费已交齐"))
    
    seek_status_choices = (('A', '近期无报名计划'), ('B', '1个月内报名'), ('C', '2周内报名'), ('D', '1周内报名'),
                           ('E', '定金'), ('F', '到班'), ('G', '全款'), ('H', '无效'),)
    pay_type_choices = (('deposit', "订金/报名费"),
                        ('tuition', "学费"),
                        ('transfer', "转班"),
                        ('dropout', "退学"),
                        ('refund', "退款"),)
    
    attendance_choices = (('checked', "已签到"),
                          ('vacate', "请假"),
                          ('late', "迟到"),
                          ('absence', "缺勤"),
                          ('leave_early', "早退"),)
    
    score_choices = ((100, 'A+'),
                     (90, 'A'),
                     (85, 'B+'),
                     (80, 'B'),
                     (70, 'B-'),
                     (60, 'C+'),
                     (50, 'C'),
                     (40, 'C-'),
                     (0, ' D'),
                     (-1, 'N/A'),
                     (-100, 'COPY'),
                     (-1000, 'FAIL'),)
    
    
    class Department(models.Model):
        """
        部门表
        """
        name = models.CharField(max_length=32, verbose_name="部门名称")
        count = models.IntegerField(verbose_name="人数", default=0)
    
    
    class UserProfile(models.Model):
        """
        用户表
        """
        username = models.EmailField(max_length=255, unique=True, )
        password = models.CharField(max_length=128)
        name = models.CharField('名字', max_length=32)
        department = models.ForeignKey('Department', default=None, blank=True, null=True)
        mobile = models.CharField('手机', max_length=32, default=None, blank=True, null=True)
        memo = models.TextField('备注', blank=True, null=True, default=None)
        date_joined = models.DateTimeField(auto_now_add=True)
        is_active = models.BooleanField(default=True)
    
    
    class Customer(models.Model):
        """
        客户表
        """
        qq = models.CharField('QQ', max_length=64, unique=True, help_text='QQ号必须唯一')
        qq_name = models.CharField('QQ昵称', max_length=64, blank=True, null=True)
        name = models.CharField('姓名', max_length=32, blank=True, null=True, help_text='学员报名后,请改为真实姓名')
        sex_type = (('male', ''), ('female', ''))
        sex = models.CharField("性别", choices=sex_type, max_length=16, default='male', blank=True, null=True)
        birthday = models.DateField('出生日期', default=None, help_text="格式yyyy-mm-dd", blank=True, null=True)
        phone = models.BigIntegerField('手机号', blank=True, null=True)
        source = models.CharField('客户来源', max_length=64, choices=source_type, default='qq')
        introduce_from = models.ForeignKey('self', verbose_name="转介绍自学员", blank=True, null=True)
        course = MultiSelectField("咨询课程", choices=course_choices)
        class_type = models.CharField("班级类型", max_length=64, choices=class_type_choices, default='fulltime')
        customer_note = models.TextField("客户备注", blank=True, null=True, )
        status = models.CharField("状态", choices=enroll_status_choices, max_length=64, default="unregistered",
                                  help_text="选择客户此时的状态")
        last_consult_date = models.DateField("最后跟进日期", auto_now_add=True)
        next_date = models.DateField("预计再次跟进时间", blank=True, null=True)
        consultant = models.ForeignKey('UserProfile', verbose_name="销售", related_name='customers', blank=True, null=True, )
        class_list = models.ManyToManyField('ClassList', verbose_name="已报班级", )
    
    
    class Campuses(models.Model):
        """
        校区表
        """
        name = models.CharField(verbose_name='校区', max_length=64)
        address = models.CharField(verbose_name='详细地址', max_length=512, blank=True, null=True)
    
    
    class ClassList(models.Model):
        """
        班级表
        """
        course = models.CharField("课程名称", max_length=64, choices=course_choices)
        semester = models.IntegerField("学期")
        campuses = models.ForeignKey('Campuses', verbose_name="校区")
        price = models.IntegerField("学费", default=10000)
        memo = models.CharField('说明', blank=True, null=True, max_length=100)
        start_date = models.DateField("开班日期")
        graduate_date = models.DateField("结业日期", blank=True, null=True)
        teachers = models.ManyToManyField('UserProfile', verbose_name="老师")
        class_type = models.CharField(choices=class_type_choices, max_length=64, verbose_name='班额及类型', blank=True,
                                      null=True)
    
        class Meta:
            unique_together = ("course", "semester", 'campuses')
    
    
    class ConsultRecord(models.Model):
        """
        跟进记录表
        """
        customer = models.ForeignKey('Customer', verbose_name="所咨询客户")
        note = models.TextField(verbose_name="跟进内容...")
        status = models.CharField("跟进状态", max_length=8, choices=seek_status_choices, help_text="选择客户此时的状态")
        consultant = models.ForeignKey("UserProfile", verbose_name="跟进人", related_name='records')
        date = models.DateTimeField("跟进日期", auto_now_add=True)
        delete_status = models.BooleanField(verbose_name='删除状态', default=False)
    
    
    class Enrollment(models.Model):
        """
        报名表
        """
    
        why_us = models.TextField("为什么报名", max_length=1024, default=None, blank=True, null=True)
        your_expectation = models.TextField("学完想达到的具体期望", max_length=1024, blank=True, null=True)
        contract_agreed = models.BooleanField("我已认真阅读完培训协议并同意全部协议内容", default=False)
        contract_approved = models.BooleanField("审批通过", help_text="在审阅完学员的资料无误后勾选此项,合同即生效", default=False)
        enrolled_date = models.DateTimeField(auto_now_add=True, verbose_name="报名日期")
        memo = models.TextField('备注', blank=True, null=True)
        delete_status = models.BooleanField(verbose_name='删除状态', default=False)
        customer = models.ForeignKey('Customer', verbose_name='客户名称')
        school = models.ForeignKey('Campuses')
        enrolment_class = models.ForeignKey("ClassList", verbose_name="所报班级")
    
        class Meta:
            unique_together = ('enrolment_class', 'customer')
    
    
    class PaymentRecord(models.Model):
        """
        缴费记录表
        """
        pay_type = models.CharField("费用类型", choices=pay_type_choices, max_length=64, default="deposit")
        paid_fee = models.IntegerField("费用数额", default=0)
        note = models.TextField("备注", blank=True, null=True)
        date = models.DateTimeField("交款日期", auto_now_add=True)
        course = models.CharField("课程名", choices=course_choices, max_length=64, blank=True, null=True, default='N/A')
        class_type = models.CharField("班级类型", choices=class_type_choices, max_length=64, blank=True, null=True,
                                      default='N/A')
        enrolment_class = models.ForeignKey('ClassList', verbose_name='所报班级', blank=True, null=True)
        customer = models.ForeignKey('Customer', verbose_name="客户")
        consultant = models.ForeignKey('UserProfile', verbose_name="销售")
        delete_status = models.BooleanField(verbose_name='删除状态', default=False)
    
        status_choices = (
            (1, '未审核'),
            (2, '已审核'),
        )
        status = models.IntegerField(verbose_name='审核', default=1, choices=status_choices)
    
        confirm_date = models.DateTimeField(verbose_name="确认日期", null=True, blank=True)
        confirm_user = models.ForeignKey(verbose_name="确认人", to='UserProfile', related_name='confirms', null=True,
                                         blank=True)
    
    
    class CourseRecord(models.Model):
        """课程记录表"""
        day_num = models.IntegerField("节次", help_text="此处填写第几节课或第几天课程...,必须为数字")
        date = models.DateField(auto_now_add=True, verbose_name="上课日期")
        course_title = models.CharField('本节课程标题', max_length=64, blank=True, null=True)
        course_memo = models.TextField('本节课程内容', max_length=300, blank=True, null=True)
        has_homework = models.BooleanField(default=True, verbose_name="本节有作业")
        homework_title = models.CharField('本节作业标题', max_length=64, blank=True, null=True)
        homework_memo = models.TextField('作业描述', max_length=500, blank=True, null=True)
        scoring_point = models.TextField('得分点', max_length=300, blank=True, null=True)
        re_class = models.ForeignKey('ClassList', verbose_name="班级")
        teacher = models.ForeignKey('UserProfile', verbose_name="班主任")
    
        class Meta:
            unique_together = ('re_class', 'day_num')
    
    
    class StudyRecord(models.Model):
        """
        学习记录
        """
    
        attendance = models.CharField("考勤", choices=attendance_choices, default="checked", max_length=64)
        score = models.IntegerField("本节成绩", choices=score_choices, default=-1)
        homework_note = models.CharField(max_length=255, verbose_name='作业批语', blank=True, null=True)
        date = models.DateTimeField(auto_now_add=True)
        note = models.CharField("备注", max_length=255, blank=True, null=True)
        homework = models.FileField(verbose_name='作业文件', blank=True, null=True, default=None)
        course_record = models.ForeignKey('CourseRecord', verbose_name="某节课程")
        student = models.ForeignKey('Customer', verbose_name="学员")
    
        class Meta:
            unique_together = ('course_record', 'student')


    #数据库迁移时需要安装django-multiselectfield模块

    5.创建项目

    补充: csrf验证信息的更改在django项目的setting里面找

      1.from django.middleware.csrf import Csrfviewmiddleware

        进入Csrfviewmiddleware

        def process_view

          if request.....

            if request.methode=="POST"不可修改

      2.from django.conf import global_settings#全局默认配置

        进入global_settins查找CSRF_HANDER_NAME可以找到默认值

        进入global_settins查找sessions可以找到sessions的各种默认值

    6..django项目创建后第一步  settings的配置

     6.1 创建App会创建路径,两种方法,1.直接后面跟app的名称,逗号结尾,如直接写CRM,2.写全app路径,逗号结尾,如(

    'CRM.apps.CrmConfig',)
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'CRM.apps.CrmConfig',#app路径
    ]

    6.2中间件  注意注册的中间件csrf

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',  #注册中间件
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]

    6.3  tempaltes的注意

    6.4 数据库的设置

    #django默认数据库sqlite3
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    #mysql数据库的设置
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql', 
            'NAME': 'crm',  #库名
            'USER': 'root',  #用户
            'PASSWORD': '', #密码
            'HOST': '127.0.0.1', #数据库服务器的IP地址
            'PORT': 3306,  #端口
        }
    }

    如果使用mysql数据库,还需要配置项目的__init__.py

    import pymysql
    pymysql.install_as_MySQLdb()

     6.5 静态文件的设置

      6.5.1  静态文件的应用

    #固定写法
    STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static')]

       6.5.2  创建完静态文件后,需要在项目目录下创建static文件夹

     6.6  modols.py文件里面添加表结构,然后迁移数据库

    1.python manage.py makemigrations
    
    2. python manage.py migrate

      6.1迁移成功后可以在pycham中查看数据库

                                             

  • 相关阅读:
    大咖们如何评判优秀架构师?
    腾讯会议大规模任务调度系统架构设计
    计算压力倍增,携程度假起价引擎架构演变
    快手春节红包背后,高并发存储架构设计
    日均20亿流量:携程机票查询系统的架构升级
    我是如何一步步的在并行编程中将lock锁次数降到最低实现无锁编程
    OGRE
    CMake
    深入理解C++11【5】
    深入理解C++11【4】
  • 原文地址:https://www.cnblogs.com/l1222514/p/10858152.html
Copyright © 2011-2022 走看看