• Django项目:CRM(客户关系管理系统)--51--42PerfectCRM实现AJAX全局账号注册


     1 #urls.py
     2 
     3 """PerfectCRM URL Configuration
     4 
     5 The `urlpatterns` list routes URLs to views. For more information please see:
     6     https://docs.djangoproject.com/en/2.0/topics/http/urls/
     7 Examples:
     8 Function views
     9     1. Add an import:  from my_app import views
    10     2. Add a URL to urlpatterns:  path('', views.home, name='home')
    11 Class-based views
    12     1. Add an import:  from other_app.views import Home
    13     2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    14 Including another URLconf
    15     1. Import the include() function: from django.urls import include, path
    16     2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    17 """
    18 from django.contrib import admin
    19 from django.urls import path
    20 
    21 # ————————02PerfectCRM创建ADMIN页面————————
    22 from django.conf.urls import url  # URL
    23 from django.conf.urls import include # 分发URL
    24 # ————————02PerfectCRM创建ADMIN页面————————
    25 
    26 urlpatterns = [
    27     path('admin/', admin.site.urls),
    28     
    29 # ————————02PerfectCRM创建ADMIN页面————————
    30     url(r'^king_admin/', include("king_admin.king_urls")),  # 自定义admin
    31 # ————————02PerfectCRM创建ADMIN页面————————
    32     
    33 # ————————03PerfectCRM创建基本数据————————
    34     url(r'^DBadd/', include("DBadd.DBadd_urls")),  # 添加随机数据
    35 # ————————03PerfectCRM创建基本数据————————
    36     # ————————38PerfectCRM实现全局账号登录注销————————
    37     url(r'^gbacc/', include("gbacc.gbacc_urls")),  # 全局账号登录注销
    38     # ————————38PerfectCRM实现全局账号登录注销————————
    39 
    40     # ————————42PerfectCRM实现AJAX全局账号注册————————
    41     url(r'^gbacc/', include("gbacc.gbacc_ajax_urls")),  # 全局账号登录注销
    42     # ————————42PerfectCRM实现AJAX全局账号注册————————
    43 
    44 ]
    #urls.py

     1 # gbacc_ajax_urls.py
     2 
     3 
     4 # ————————42PerfectCRM实现AJAX全局账号注册————————
     5 from django.conf.urls import url
     6 from gbacc import gbacc_ajax_views
     7 urlpatterns = [
     8     url(r'^gbacc_ajax_register/', gbacc_ajax_views.gbacc_ajax_register, name='gbacc_ajax_register'),  # ajax注册
     9 ]
    10 # ————————42PerfectCRM实现AJAX全局账号注册————————
    # gbacc_ajax_urls.py

     1 # gbacc_ajax_views.py
     2 # ————————42PerfectCRM实现AJAX全局账号注册————————
     3 from django.shortcuts import render  #页面返回
     4 #验证码函数 #处理注册的内容
     5 from io import BytesIO #创建内存空间
     6 from django.shortcuts import HttpResponse #页面返回
     7 from gbacc.gbacc_auxiliary.check_code import create_validate_code #验证图片
     8 def check_code(request):
     9     stream = BytesIO()#创建内存空间
    10     img, code = create_validate_code()#调用验证码图片生成函数 返回图片 和 对应的验证码
    11     img.save(stream, 'PNG')#保存为PNG格式
    12     request.session['CheckCode'] = code#保存在session中
    13     return HttpResponse(stream.getvalue())
    14 # json 对错误信息对象进行处理 #处理注册的内容
    15 import json  # 转为json格式
    16 from django.core.exceptions import ValidationError  # 错误信息
    17 class JsonCustomEncoder(json.JSONEncoder):
    18     def default(self, field):
    19         if isinstance(field, ValidationError):  # 如果是错误信息进行处理
    20             return {'code': field.code, 'messages': field.messages}
    21         else:
    22             return json.JSONEncoder.default(self, field)
    23 # AJAX注册
    24 from gbacc.gbacc_auxiliary.account import RegisterForm  # 注册验证
    25 from django.contrib.auth.hashers import make_password  # 密码加密
    26 from crm import models   #数据库
    27 def gbacc_ajax_register(request):
    28     if request.method=='GET':
    29         obj=RegisterForm(request=request, data=request.POST) #注册验证 #PerfectCRM.gbacc_auxiliary.account
    30         return render(request, 'gbacc_ajax/gbacc_ajax_register.html',{'obj':obj})
    31     elif request.method=='POST':
    32         #返回的字符串 字典
    33         ret={'status':False,'error':None,'data':None}
    34         #进行验证 调用RegisterForm
    35         obj=RegisterForm(request=request, data=request.POST)#注册验证 #PerfectCRM.gbacc_auxiliary.account
    36         if obj.is_valid():
    37             name = obj.cleaned_data.get('name')#获取用户名
    38             pwd = obj.cleaned_data.get('password')    #获取密码
    39             email= obj.cleaned_data.get('email')  #获取邮箱账号
    40             password=make_password(pwd,)#密码加密
    41             #print(username,password,email)
    42             #——————数据库添加数据——————
    43             models.UserProfile.objects.create(name=name,password=password,email=email,)
    44             #——————数据库添加数据——————
    45 
    46             #——————获取用户数据,放进个人主页——————
    47             # user_info= models.UserProfile.objects. 
    48             #     filter(email=email, password=password). 
    49             #     values('id', 'name', 'email',).first()
    50                 # #nid=user_info.id
    51             # print(user_info,type(user_info),'..........')
    52                 # admin_obj = base_admin.site.registered_sites['crm']['userprofile']#表类
    53                 # user_obj=admin_obj.model.objects.get(id=user_info['id'])#类表的对象
    54                 # user_obj.set_password(password)#加密
    55                 # user_obj.save()
    56             # request.session['user_info'] = user_info   # session
    57                 #print(user_info.id)
    58             #——————获取用户数据,放进个人主页——————
    59             #——————AJAX if (arg.status) { #状态——————
    60             ret['status']=True  #状态
    61             ret['data']=obj.cleaned_data
    62             # print(obj.cleaned_data)
    63             # print(ret)
    64             #对错误信息对象进行转化处理 前端不用二次序列化
    65             ret=json.dumps(ret)#转为json格式
    66             #return HttpResponse(ret)
    67             #——————AJAX if (arg.status) { #状态——————
    68         else:
    69             #加入错误信息
    70                 #print(obj.errors)
    71             ret['error']=obj.errors.as_data()
    72             #提示为False
    73                 #ret['status']=False
    74             #对错误信息对象进行转化处理 前端不用二次序列化
    75             ret=json.dumps(ret,cls=JsonCustomEncoder)  #转为json格式
    76                 #print(ret)
    77         return HttpResponse(ret)
    78 # ————————42PerfectCRM实现AJAX全局账号注册————————
    # gbacc_ajax_views.py

     1 # account.py
     2 # ————————40PerfectCRM实现全局账号注册+验证码+页面刷新保留信息————————
     3 from .base import BaseForm  #重写
     4 from django.core.exceptions import ValidationError #错误信息
     5 from django import forms as django_forms           # forms
     6 from django.forms import fields as django_fields     #字段
     7 from crm import models #数据库
     8 #注册验证
     9 class RegisterForm(BaseForm, django_forms.Form):
    10     name=django_fields.CharField(
    11         min_length=3,
    12         max_length=20,
    13         error_messages={'required': '用户名不能为空.',  #默认输入这个
    14                         'min_length': "用户名长度不能小于3个字符",
    15                         'max_length': "用户名长度不能大于32个字符"},     )
    16     email=django_fields.EmailField(
    17         error_messages={'required': '邮箱不能为空.','invalid':"邮箱格式错误"}, )
    18     password = django_fields.RegexField(
    19         #正则表达  配置密码复杂度
    20         # '^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[!@#$\%^&*()])[0-9a-zA-Z!@#$\%^&*()]{8,32}$',
    21         '',
    22         min_length=6,
    23         max_length=32,
    24         error_messages={'required': '密码不能为空.',  #默认输入这个
    25                         'invalid': '密码必须包含数字,字母、特殊字符', # 正则表达
    26                         'min_length': "密码长度不能小于6个字符",
    27                         'max_length': "密码长度不能大于32个字符",
    28                         'message':None},        )
    29     confirm_password=django_fields.CharField(
    30         error_messages={'required': '确认密码不能为空.',
    31                         'invalid': '确认密码不对', },  )
    32     check_code = django_fields.CharField(
    33         error_messages={'required': '验证码不能为空.'},     )
    34 
    35     #内置勾子
    36     #用户名重复查询
    37     def clean_username(self):
    38         #查询是否存在
    39         name=self.cleaned_data['name']  #cleaned_data 就是读取表单返回的值,返回类型为字典dict型
    40         u =models.UserProfile.objects.filter(name=name).count()  #查询数据库
    41         if not u:
    42             return self.cleaned_data['name']
    43         else:
    44             raise ValidationError(message='用户名已经存在',code='invalid')
    45     #邮箱重复查询
    46     def clean_email(self):
    47         email=self.cleaned_data['email']
    48         e=models.UserProfile.objects.filter(email=email).count() #查询数据库
    49         if not e:
    50             return  self.cleaned_data['email']
    51         else:
    52             raise ValidationError('邮箱已经被注册!',code='invalid')
    53 
    54     #确认密码
    55     def clean_confirm_password(self):
    56         pwd1=self.request.POST.get('password')  #通过POST 获取前端 输入的值
    57         pwd2=self.cleaned_data['confirm_password'] #name="confirm_password"
    58         if pwd1 != pwd2:
    59             raise ValidationError('二次输入密码不匹配')
    60         else:
    61             return self.cleaned_data['confirm_password']
    62 
    63     # ————————42PerfectCRM实现AJAX全局账号注册————————
    64     # ————————AJAX调用————————
    65     # 验证码 校对
    66     def clean_check_code(self):
    67             #调用check_code.py # 获取生成的验证码                  #获取输入的验证码
    68         if self.request.session.get('CheckCode').upper() != self.request.POST.get('check_code').upper():
    69             raise ValidationError(message='验证码错误', code='invalid')
    70         else:
    71             return self.cleaned_data['check_code']
    72      # ————————AJAX调用————————
    73     # ————————42PerfectCRM实现AJAX全局账号注册————————
    74 # ————————40PerfectCRM实现全局账号注册+验证码+页面刷新保留信息————————
    # account.py

      1 {#global_ajax_register.html#}
      2 {## ————————42PerfectCRM实现AJAX全局账号注册————————#}
      3 {% extends "gbacc_master/gbacc_sample.html" %}
      4 {% block right-container-content %}
      5     <h1 class="form-group col-lg-offset-3"> AJAX用户注册</h1>
      6     <form class="form-horizontal" role="form" method="POST" id="fm"
      7           action="/gbacc_ajax/gbacc_ajax_register.html"> {% csrf_token %}
      8         <div class="col-lg-offset-3">
      9             <div class="form-inline form-group">
     10                 <label class="col-sm-1 " for="email">邮箱账号</label>
     11                 <input class="form-control" type="email" id="email" name="email" placeholder="请输入邮箱">
     12                 <span class=" alert-danger hide"><span id="spemail"></span> {# ajax 验证#}</span></div>
     13             <div class="form-inline form-group">
     14                 <label class="col-sm-1 " for="username">用户名</label>
     15                 <input class="form-control" type="text" id="username" name="name" placeholder="请输入用户名">
     16                 <span class=" alert-danger hide"><span id="spuser"></span> {# ajax 验证#}</span></div>
     17             <div class="form-inline form-group">
     18                 <label class="col-sm-1 " for="password">密码</label>
     19                 <input class="form-control" type="password" id="password" name="password"
     20                        placeholder="请输入密码">{{ obj.errors.pwd }}
     21                 <span class=" alert-danger hide"><span id="sppwd"></span>  {# ajax 验证#}</span> </div>
     22             <div class="form-inline form-group">
     23                 <label class="col-sm-1 " for="confirm_password">确认密码</label>
     24                 <input class="form-control" type="password" id="confirm_password" name="confirm_password"
     25                        placeholder="请重新输入密码">{{ obj.errors.cnpwd }}
     26                 <span class=" alert-danger hide"><span id="spcnpwd"> </span>   {# ajax 验证#}</span></div>
     27             <div class="form-inline form-group">
     28                 <label class="col-sm-1 " for="text">验证码</label>
     29                 <input type="text" class="form-control" id="check_code" name="check_code"
     30                        placeholder="请输入验证码">{{ obj.errors.pwds }}
     31                 <img id="check_code_img" src="/gbacc/check_code.html/" onclick="changeCheckCode(this);">
     32                 {## 配置URL绝对路径#}{## 绑定JS刷新验证码图片#}
     33                 <span class=" alert-danger hide"><span id="error_msg"></span></span></div>
     34             <div class="form-inline form-group">
     35                 <div class="col-xs-2">
     36                     <a class="btn btn-lg btn-primary btn-block" href="/gbacc/gbacc_login/">登陆</a></div>
     37                 <div class="col-xs-2">
     38                     <a class="btn btn-lg btn-primary btn-block" id="submit">注册</a></div>
     39             </div>
     40         </div>
     41     </form>
     42 {% endblock %}
     43 
     44 {% block js %}{#自定义内容开始 body#}
     45     <script>
     46         $(function () {      //页面加载完自动执行函数
     47             register();
     48         });
     49         function register() {
     50             $('#submit').click(function () {
     51                 var $msg = $('#error_msg');//用来验证码错误 提示
     52                 var spuser = $('#spuser');//用户
     53                 var spemail = $('#spemail');//邮箱
     54                 var sppwd = $('#sppwd');//密码
     55                 var spcnpwd = $('#spcnpwd');//确认密码
     56                 $msg.parent().addClass('hide');//初始为隐藏提示标签  验证码
     57                 spuser.parent().addClass('hide'); //初始为隐藏提示标签 用户
     58                 spemail.parent().addClass('hide');//初始为隐藏提示标签 邮箱
     59                 sppwd.parent().addClass('hide'); //初始为隐藏提示标签 密码
     60                 spcnpwd.parent().addClass('hide');  //初始为隐藏提示标签 确认密码
     61                 $.ajax({
     62                     url: '/gbacc/gbacc_ajax_register/',   //绑定验证的页面
     63                     type: 'POST',
     64                     data: $('#fm').serialize(),//表单所有内容
     65                     dataType: 'JSON',
     66                     success: function (arg) {
     67                         //alert(arg.status);
     68                         console.log(arg);
     69                         
     70                         if (arg.status) {
     71                             alert('注册成功');
     72                             location.href = '/';//跳 转到 主页
     73                         } else {
     74                             //判断是否有这个错误信息
     75                             if (arg.error.name != null) {            // 如果错误名字不等于空      错误信息
     76                                 spuser.parent().removeClass('hide');              //移除Class里('hide')样式  错误信息
     77                                 spuser.text(arg.error.name[0].messages);   // 用户
     78                             }
     79                             if (arg.error.email != null) {
     80                                 spemail.parent().removeClass('hide');
     81                                 spemail.text(arg.error.email[0].messages);   // 邮箱
     82                             }
     83                             if (arg.error.password != null) {
     84                                 sppwd.parent().removeClass('hide');
     85                                 sppwd.text(arg.error.password[0].messages);  // 密码
     86                             }
     87                             if (arg.error.confirm_password != null) {
     88                                 spcnpwd.parent().removeClass('hide');
     89                                 spcnpwd.text(arg.error.confirm_password[0].messages); // 确认密码
     90                             }
     91                             if (arg.error.check_code != null) {
     92                                 $msg.parent().removeClass('hide');//移除隐藏提示标签
     93                                 $msg.text(arg.error.check_code[0].messages);
     94                             }
     95                             var img = $('#check_code_img')[0];//图片验证码变量
     96                             img.src = img.src + '?';//重载图片验证码
     97                             $('#check_code').val('');//验证码框清空  刷新页面后 变成 空
     98                             $('#confirm_password').val('');//刷新页面后 变成 空
     99                         }
    100                     }
    101                 })
    102             })
    103         }
    104         //刷新验证码
    105         function changeCheckCode(ths) {
    106             ths.src = ths.src + '?';
    107         }
    108     </script>
    109 {% endblock %}
    110 {## ————————42PerfectCRM实现AJAX全局账号注册————————#}
    {#global_ajax_register.html#}
     1 {#gbacc_base.html#}
     2 {## ————————38PerfectCRM实现全局账号登录注销————————#}
     3 {#模板文件 #}
     4 <!DOCTYPE html>
     5 <html lang="zh-CN">
     6     <head>
     7 {#      <meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词。#}
     8 {#      <meta> 标签位于文档的头部,不包含任何内容。<meta> 标签的属性定义了与文档相关联的名称/值对。#}
     9         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    10         <meta http-equiv="X-UA-Compatible" content="IE=edge">
    11         <meta name="viewport" content="width=device-width, initial-scale=1">
    12         <meta name="description" content="">
    13         <meta name="author" content="">
    14         <link rel="icon" href="/static/gbacc_img/gbacc_logo.jpg">{# icon,指的是图标 #}
    15         <title>全局账号</title> {# 页面头部显示#}
    16 {#        使用link来调用外部的css文件#}
    17         <link rel="stylesheet"  href="/static/gbacc_css/bootstrap.css"  /> {#导航栏样式#}
    18         <link rel="stylesheet"  href="/static/gbacc_css/dashboard.css" /> {#指示板样式#}
    19     </head>
    20     <body>
    21         {% block body %}{#自定义内容 body#}{% endblock %}
    22 {#        将纯JavaScript的语句另外保存在一个"*.js"的文件中,需要时再调用。#}
    23         <script src="/static/gbacc_js/jquery.js"></script>   {# jQuery 是一个 JavaScript库,极大地简化了 JavaScript 编程。#}
    24         <script src="/static/gbacc_js/bootstrap.js"></script>  {#指示板JS事件#}
    25 
    26 {#       # ————————42PerfectCRM实现AJAX全局账号注册————————#}
    27         {% block js %}{#自定义内容 JS#}{% endblock %}
    28 {#       # ————————42PerfectCRM实现AJAX全局账号注册————————#}
    29 
    30     </body>
    31 </html>
    32 {## ————————38PerfectCRM实现全局账号登录注销————————#}
    {#gbacc_base.html#}

  • 相关阅读:
    算法思想杂谈【原创】
    OpenGL坐标变换专题
    XSS的原理分析与解剖:第三章(技巧篇)【转】
    php实现字符串翻转
    (基础) --- php session原理和多台服务器session共享问题
    (基础) --- php get和post的区别
    (基础)--- PHP单引号和双引号区别
    MySQL主从复制原理解析
    详解MYSQL各种优化原理
    mysql索引详解
  • 原文地址:https://www.cnblogs.com/ujq3/p/8806531.html
Copyright © 2020-2023  润新知