登录 注册功能 表梳理

找模板

http://www.jq22.com/

我选用的模板

http://www.jq22.com/yanshI4320

真实连接

登录http://www.jq22.com/demo/jquery-Sharelink20151012/

注册http://www.jq22.com/demo/jquery-Sharelink20151012/register.html

注意iframe标签才是真正的页面

<iframe id="iframe" src="xxxxx" frameborder="0" width="100%" height="660px"></iframe>

右键另存为

1583557854735

文件夹里面是js文件和图片

建项目

登录

seting文件配置 配置静态文件

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'statics'),

]

创建静态文件夹statics

目的找到需要的静态文件

将模板需要的js css 图片依次放进去

1583558862685

拷贝来的模板放到templates

1583558985120

修改模板里面的静态文件配置

<script src="{% static 'js/jquery.min.js' %}"></script>
{#<script src="./登陆丨Sharelink_files/jquery.min.js(1).下载"></script>#}
<script src="{% static 'js/common.js' %}"></script>

<script src="{% static 'js/supersized.3.2.7.min.js' %}"></script>
<script src="{% static 'js/supersized-init.js' %}"></script>

<script src="{% static 'js/jquery.validate.min.js' %}"></script>

 等等  有的都需要改

jQuery文件也需要改路径

1583559755172

url

from django.conf.urls import url
from django.contrib import admin
from sales import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login,name='login'),#登录
    url(r'^register/', views.register,name='register'),#注册
    url(r'^home/', views.home,name='home'),#主页
]

view

from sales import models

def login(request):
    res_dict = {'status':None,'home':None,'msg':None}

    if request.method == 'GET':
        return render(request,'login.html')
    else:
        username = request.POST.get('username')
        password = request.POST.get('password')
        user_objs = models.UserInfo.objects.filter(username=username,password=md5_function(password))
        if user_objs:
            #{'status': 1, 'home': '/home/', 'msg': '用户名或者秘密错误'}
            res_dict['status'] = 1
            res_dict['home'] = '/home/'
            return JsonResponse(res_dict)

        else:
            res_dict['status'] = 0
            res_dict['msg'] = '用户名或者秘密错误'
            return JsonResponse(res_dict)

class RegisterForm(forms.Form):

    username = forms.CharField(

        max_length=16,
        min_length=4,
        error_messages={
            'max_length':'太长了',
            'min_length':'太短了,你不行',
            'required':'不能为空',
        },
        widget=forms.TextInput(attrs={'class':'username','placeholder':'您的用户名','autocomplete':'off'})
    )

    #<input type="text" name="username" class="username" placeholder="您的用户名" autocomplete="off">
    password = forms.CharField(
        max_length=32,
        error_messages={
            'required': '不能为空',
            'max_length': '不能太长',
        },
        widget=forms.PasswordInput(attrs={'class':'password','placeholder':'输入密码'
            ,'oncontextmenu':'return false','onpaste':'return false'}),

    )
#<input type="password" name="password" class="password" placeholder="输入密码" oncontextmenu="return false"
                   #onpaste="return false">
    confirm_password = forms.CharField(
        max_length=32,
        error_messages={
            'required': '不能为空',
            'max_length': '不能太长',
        },
        widget=forms.PasswordInput(attrs={'class': 'confirm_password', 'placeholder': '输入密码'
            , 'oncontextmenu': 'return false', 'onpaste': 'return false'}),
    )

    telephone = forms.CharField(
        max_length=11,
        min_length=11,
        error_messages={
            'max_length': '不能太长,需11位',
            'min_length': '不能太短,需11位',
            'required':'不能为空'
        },
        widget=forms.TextInput(attrs={'class':'phone_number','placeholder':'输入手机号码','autocomplete':'off','id':'number'})

    )
    #<input type="text" name="phone_number" class="phone_number" placeholder="输入手机号码" autocomplete="off"
                   # id="number">
    email = forms.EmailField(
        error_messages={
            'invalid': '必须是邮箱格式',
            'required': '不能为空'
        },
        widget=forms.EmailInput(
            attrs={ 'class': 'email', 'placeholder': '输入邮箱地址',
                   'oncontextmenu': 'return false','onpaste': 'return false'})

    )

    def clean(self):
        password = self.cleaned_data.get('password')
        confirm_password = self.cleaned_data.get('confirm_password')
        if password == confirm_password:
            return self.cleaned_data

        else:
            self.add_error('confirm_password','两次密码不一致!')
    #xx@xx
#<input type="email" name="email" class="email" placeholder="输入邮箱地址" oncontextmenu="return false"#}
#{#                   onpaste="return false">#}
    # def __init__(self):



def register(request):

    if request.method == 'GET':

        register_obj = RegisterForm()

        return render(request,'register.html',{'register_obj':register_obj})
    else:
        register_obj = RegisterForm(request.POST)
        if register_obj.is_valid():
            # print(register_obj.cleaned_data)
            register_obj.cleaned_data.pop('confirm_password')
            md5_password = md5_function(register_obj.cleaned_data.get('password'))
            register_obj.cleaned_data.update({'password':md5_password})
            models.UserInfo.objects.create(
                **register_obj.cleaned_data
            )

            return redirect('login')
        else:
            return render(request,'register.html',{'register_obj':register_obj})

def home(request):
    return HttpResponse('ojbk')

注册

创建用户表

表的梳理

用户表

class UserInfo(models.Model):
    """
    用户表
    """

    username = models.CharField(max_length=16)
    password = models.CharField(max_length=32)

    telephone = models.CharField(max_length=11)
    email = models.EmailField()
    is_active = models.BooleanField(default=True)  #当前员工是否还是我的员工,False

    depart = models.ForeignKey('Department', on_delete=models.CASCADE, null=True, blank=True)

    def __str__(self):
        return self.username

部门表

class Department(models.Model):
    """
        部门表
    """
    name = models.CharField(max_length=32)
    count = models.IntegerField()

    def __str__(self):
        return self.name

客户表

sex_type = (('male', '男性'), ('female', '女性')) #对应字段性别
source_type = (('qq', "qq群"),
               ('referral', "内部转介绍"),
               ('website', "官方网站"),
               ('baidu_ads', "百度推广"),
               ('office_direct', "直接上门"),
               ('WoM', "口碑"),
               ('public_class', "公开课"),
               ('website_luffy', "路飞官网"),
               ('others', "其它"),)

course_choices = (('LinuxL', 'Linux中高级'),
                  ('PythonFullStack', 'Python高级全栈开发'),)


class_type_choices = (('fulltime', '脱产班',),
                      ('online', '网络班'),
                      ('weekend', '周末班',),)


class Customer(models.Model):
    """
    客户表(最开始的时候大家都是客户,销售就不停的撩你,你还没交钱就是个客户)
    """
    qq = models.CharField(verbose_name='QQ', max_length=64, unique=True, help_text='QQ号必须唯一')
    qq_name = models.CharField(verbose_name='QQ昵称', max_length=64, blank=True, null=True) #requierd:False
    name = models.CharField('姓名', max_length=32, blank=True, null=True, help_text='学员报名后,请改为真实姓名') #可为空,有些人就不愿意给自己的真实姓名
    sex = models.CharField("性别", choices=sex_type, max_length=16, default='male', blank=True, null=True) #存的是male或者female,字符串
    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,on_delete=models.CASCADE)  #self指的就是自己这个表,和

    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="选择客户此时的状态") #help_text这种参数基本都是针对admin应用里面用的

    date = models.DateTimeField("咨询日期", auto_now_add=True) #这个没啥用昂,我问销售,销售说是为了一周年的时候给客户发一个祝福信息啥的
    last_consult_date = models.DateField("最后跟进日期", auto_now_add=True) #考核销售的跟进情况,如果多天没有跟进,会影响销售的绩效等
    next_date = models.DateField("预计再次跟进时间", blank=True, null=True) #销售自己大概记录一下自己下一次会什么时候跟进,也没啥用

    #用户表中存放的是自己公司的所有员工。
    consultant = models.ForeignKey('UserInfo', verbose_name="销售", related_name='customers', blank=True, null=True,on_delete=models.CASCADE )

    # 一个客户可以报多个班,报个脱产班,再报个周末班等,所以是多对多。
    class_list = models.ManyToManyField('ClassList', verbose_name="已报班级",blank=True,)

    # 成单日期,统计成单日期的时候会用到
    deal_date = models.DateField(null=True)


    class Meta:
        ordering = ['id',]#排序作用
        verbose_name='客户信息表'
        verbose_name_plural = '客户信息表'#admin  表名字
        

    def __str__(self):
        return self.name+":"+self.qq

    
总结字段真多

校区表

class Campuses(models.Model):
    """
    校区表
    """
    name = models.CharField(verbose_name='校区', max_length=64)
    address = models.CharField(verbose_name='详细地址', max_length=512, blank=True, null=True)

    def __str__(self):
        return self.name

班级表

from django.db import models
from multiselectfield import MultiSelectField
from django.utils.safestring import mark_safe


# Create your models here.





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 ClassList(models.Model):
    """
    班级表
    """
    course = models.CharField("课程名称", max_length=64, choices=course_choices)
    semester = models.IntegerField("学期") #python20期等
    campuses = models.ForeignKey('Campuses', verbose_name="校区",on_delete=models.CASCADE)
    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) #不一定什么时候结业,哈哈,所以可为空

    #contract = models.ForeignKey('ContractTemplate', verbose_name="选择合同模版", blank=True, null=True,on_delete=models.CASCADE)
    teachers = models.ManyToManyField('UserInfo', verbose_name="老师") #对了,还有一点,如果你用的django2版本的,那么外键字段都需要自行写上on_delete=models.CASCADE

    class_type = models.CharField(choices=class_type_choices, max_length=64, verbose_name='班级类型', blank=True,null=True)

    class Meta:
        unique_together = ("course", "semester", 'campuses')


    def __str__(self):
        return "{}{}({})".format(self.get_course_display(), self.semester, self.campuses)


总结

修改静态文件
利用modeform生成标签

登录注册 
用到数据库 查询 md5加密

猜你喜欢

转载自www.cnblogs.com/saoqiang/p/12460267.html
今日推荐