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#}

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