zoukankan      html  css  js  c++  java
  • Django项目:CRM(客户关系管理系统)--53--44PerfectCRM实现账号快速注册登陆

     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     # ————————43PerfectCRM实现AJAX全局账号登陆————————
    11     url(r'^gbacc_ajax_login/', gbacc_ajax_views.gbacc_ajax_login, name='gbacc_ajax_login'),  # 全局登录
    12     # LOGIN_URL = '/gbacc/gbacc_login/'# login_url 配置,默认'/accounts/login/' #注意 / (斜杠,绝对路径)#settings.py
    13     # ————————43PerfectCRM实现AJAX全局账号登陆————————
    14 
    15     # ————————44PerfectCRM实现账号快速注册登陆————————
    16     url(r'^gbacc_fast_login/', gbacc_ajax_views.gbacc_fast_login, name='gbacc_fast_login'),  # 快速注册登陆
    17     # ————————44PerfectCRM实现账号快速注册登陆————————
    18 ]
    19 # ————————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全局账号注册————————
     79 
     80 
     81 # ————————43PerfectCRM实现AJAX全局账号登陆————————
     82 from django.contrib.auth import login #记录登录 #Django在数据库创建一条记录 #记住密码,免登录
     83 from django.contrib.auth import authenticate #调用用户认证模块
     84 #全局账号登录
     85 def gbacc_ajax_login(request):
     86     if request.method=='GET':
     87         next_url = request.GET.get("next")
     88         if not next_url:
     89             next_url='/'
     90         request.session['next_url']=next_url
     91         return render(request, 'gbacc_ajax/gbacc_ajax_login.html', locals())
     92     elif request.method =="POST":
     93         ret = {'status': False, 'usererror': None,'chederror': None, 'data': None,'next_url':None}
     94         _email=request.POST.get('email')
     95         _password=request.POST.get('password')
     96         if request.session.get('CheckCode').upper() == request.POST.get('check_code').upper():
     97             user =authenticate(username=_email,password=_password,)#调用用户认证模块
     98             print('认证账号密码',user)
     99             if user:
    100                 login(request,user)#记录登录 #Django在数据库创建一条记录 #记住密码,免登录.
    101                 # next_url= request.GET.get("next",'/')
    102                 ret['status'] = True  # 状态
    103                 ret['next_url'] = request.session.get('next_url')
    104                 ret = json.dumps(ret, cls=JsonCustomEncoder) # 转为json格式
    105             else:
    106                 ret['usererror']='账号或者密码错误!'
    107                 # 对错误信息对象进行转化处理 前端不用二次序列化
    108                 ret = json.dumps(ret, cls=JsonCustomEncoder)
    109         else:
    110             ret['chederror'] = '验证码错误!'
    111             #对错误信息对象进行转化处理 前端不用二次序列化
    112             ret=json.dumps(ret,cls=JsonCustomEncoder)
    113         return HttpResponse(ret)
    114 # ————————43PerfectCRM实现AJAX全局账号登陆————————
    115 
    116 
    117 # ————————44PerfectCRM实现账号快速注册登陆————————
    118 from django.core.mail import send_mail
    119 # send_mail的参数分别是  邮件标题,邮件内容,发件箱(settings.py中设置过的那个),收件箱列表(可以发送给多个人),失败静默(若发送失败,报错提示我们)
    120 import random
    121 #发送邮件的功能 #验证码#密码
    122 class stmp() :
    123     def __init__(self):
    124         self.nowTime=None  #现在的时间
    125         self.oldTime=None  #过期的时间
    126         self.emaillist=[]  #发送给谁
    127         self.code=None    #验证码#密码
    128     def stmps(self,request,email): #传参数#页面,session #邮箱,发送给谁
    129         self.emaillist.append(email) #将邮箱地址添加到调用Django发送邮件功能
    130         # ——————生成发送的时间,用来过期时间——————
    131         Time = datetime.datetime.now()  #现在的时间
    132         self.oldTime = Time + datetime.timedelta(seconds=60)  # 设置验证码过期时间 #现在的时间加上设置的参数等于过期时间
    133         self.oldTime = self.oldTime.strftime('%Y-%m-%d %H:%M:%S')  # 格式化时间
    134         request.session['oldTime'] = self.oldTime  # 将过期时间放进session进行对比
    135         # ——————生成发送的时间,用来过期时间——————
    136         # ——————生成验证码——————
    137         _letter_cases = "abcdefghjkmnpqrstuvwxy"  # 小写字母,去除可能干扰的i,l,o,z
    138         _upper_cases = _letter_cases.upper()  # 大写字母
    139         _numbers = ''.join(map(str, range(3, 10)))  # 数字
    140         chars = ''.join((_letter_cases, _upper_cases, _numbers))  # 变成一条字符串
    141         list = random.sample(chars, 4)  # 从一条字符串随机选4个字符变成列表
    142         self.code = ''.join(list)  # 列表变字符串
    143         request.session['check_smtp'] = self.code   # 将验证码放进session进行对比#邮件内容
    144         # ——————生成验证码——————
    145         # ——————调用Django发送邮件——————
    146         title= 'PerfectCRM项目自动邮件:%s'%self.code   # 邮件标题#防止一样的内容被邮箱屏蔽
    147         send_mail(title,  # 邮件标题
    148                   self.code,  # 验证码内容
    149                   'perfectcrm@sina.cn',  # 发送的邮箱  #根据情况重新配置
    150                   self.emaillist,  # 接受的邮箱
    151                   fail_silently=False,  # 静默,抛出异常
    152                   )
    153         print('发送邮件成功!没收到要换标题!检查发送邮箱的配置!')
    154         # ——————调用Django发送邮件——————
    155     def nowtime(self):  #现在的时间
    156         self.nowTime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')  # 格式化时间
    157         return self.nowTime #返回格式化后的时间
    158 # ————————44PerfectCRM实现账号快速注册登陆————————
    159 
    160 # ————————44PerfectCRM实现账号快速注册登陆————————
    161 import datetime  # 获取时间#登陆过期
    162 from django.shortcuts import redirect  #页面返回
    163 # from django.contrib.auth import login  # 记录登录 #Django在数据库创建一条记录 #记住密码,免登录
    164 # from django.contrib.auth import authenticate  # 调用用户认证模块
    165 def gbacc_fast_login(request):
    166     email = request.POST.get('email')  # 让页面POST提交的值,在页面GET后仍然存在显示
    167     _email = request.session.get('email')   # 查询session 里
    168     if not _email:
    169         request.session['email'] = email  # 创建保存到 session 里 #防止下面第一次检查账号没有值
    170     today_str = datetime.date.today().strftime("%Y%m%d")   #获取时间#登陆60*60秒后# 清空session的全部
    171     errors = {}  # 页面的错误提示
    172     stmpemail = stmp() #实例化发送邮件的功能
    173     if request.method =="POST":
    174         if email != _email: #检查是不是同一个账号,防止验证码用到其他账号
    175             request.session['email'] = email  # 不是同一个账号,就保存新账号到session里
    176             request.session['oldTime'] = None  # 同时清空过期时间,重新生成验证码发送邮件
    177         oldTime = request.session.get('oldTime') # 到session里获取过期的时间
    178         if oldTime==None or stmpemail.nowtime() > oldTime:  #判断过期的时间
    179             stmpemail.stmps(request,email)     #发送验证码邮件
    180             errors['error'] = "验证码邮件已发送成功!60秒后过期!"
    181         else:
    182             errors['error'] = "请输入验证码!验证码在%s后过期!" % oldTime
    183 
    184         print('验证码:',request.session['check_smtp'])
    185         if request.POST.get('check_code'): #前端输入验证码
    186             if request.session['check_smtp'].upper()  == request.POST.get('check_code').upper():#验证码对比
    187                 username = models.UserProfile.objects.filter(email=email).first()  # 查询数据库有没有这个账号
    188                 print('查询数据库',username)
    189                 if username == None: #数据库没有这个账号就创建
    190                     models.UserProfile.objects.create(email=email) #数据库创建一个新账号
    191                 user = models.UserProfile.objects.filter(email=email).first()  # 查询数据库有没有这个账号(新账号)
    192                 print('登陆的账号',user.email)
    193                 login(request,user)#记录登录 #Django在数据库创建一条记录 #记住密码,免登录
    194                 request.session['check_smtp'] = None #登陆后验证码进行清空
    195                 request.session['oldTime'] = None   #登陆后过期的时间 进行清空
    196                 request.session.set_expiry(60*60)  #登陆60*60秒后# 清空session的全部
    197                 next_url =request.GET.get('next','/')#跳转的页面,默认为首页
    198                 return redirect(next_url)
    199             else: #验证码对比不一样
    200                 errors['error']= "验证码错误!"
    201     return render(request, 'gbacc_ajax/gbacc_fast_login.html', locals())
    202 # ————————44PerfectCRM实现账号快速注册登陆————————
    # gbacc_ajax_views.py

      1 # settings.py
      2 
      3 """
      4 Django settings for PerfectCRM project.
      5 
      6 Generated by 'django-admin startproject' using Django 2.0.3.
      7 
      8 For more information on this file, see
      9 https://docs.djangoproject.com/en/2.0/topics/settings/
     10 
     11 For the full list of settings and their values, see
     12 https://docs.djangoproject.com/en/2.0/ref/settings/
     13 """
     14 
     15 import os
     16 
     17 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
     18 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
     19 
     20 
     21 # Quick-start development settings - unsuitable for production
     22 # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
     23 
     24 # SECURITY WARNING: keep the secret key used in production secret!
     25 SECRET_KEY = 'atkhzsd7emv4_okn@ynhji)p)qbpuvhq+a7@yx5=chaa0$l_br'
     26 
     27 # SECURITY WARNING: don't run with debug turned on in production!
     28 DEBUG = True
     29 
     30 ALLOWED_HOSTS = []
     31 
     32 
     33 # Application definition
     34 
     35 INSTALLED_APPS = [
     36     'django.contrib.admin',
     37     'django.contrib.auth',
     38     'django.contrib.contenttypes',
     39     'django.contrib.sessions',
     40     'django.contrib.messages',
     41     'django.contrib.staticfiles',
     42     
     43 # ————————04PerfectCRM实现King_admin注册功能————————
     44     # 'crm.apps.CrmConfig',
     45     'crm',
     46 # ————————04PerfectCRM实现King_admin注册功能————————
     47 
     48 # ————————02PerfectCRM创建ADMIN页面————————
     49     'king_admin',
     50 # ————————02PerfectCRM创建ADMIN页面————————
     51     # ————————38PerfectCRM实现全局账号登录注销————————
     52     'gbacc',
     53     # ————————38PerfectCRM实现全局账号登录注销————————
     54 
     55 ]
     56 
     57 MIDDLEWARE = [
     58     'django.middleware.security.SecurityMiddleware',
     59     'django.contrib.sessions.middleware.SessionMiddleware',
     60     'django.middleware.common.CommonMiddleware',
     61     'django.middleware.csrf.CsrfViewMiddleware',
     62     'django.contrib.auth.middleware.AuthenticationMiddleware',
     63     'django.contrib.messages.middleware.MessageMiddleware',
     64     'django.middleware.clickjacking.XFrameOptionsMiddleware',
     65 ]
     66 
     67 ROOT_URLCONF = 'PerfectCRM.urls'
     68 
     69 TEMPLATES = [
     70     {
     71         'BACKEND': 'django.template.backends.django.DjangoTemplates',
     72 # ————————02PerfectCRM创建ADMIN页面————————
     73         'DIRS': [os.path.join(BASE_DIR, 'templates'),
     74                   os.path.join(BASE_DIR, 'king_admin/king_templates'),
     75 
     76 # ————————03PerfectCRM创建基本数据————————
     77                   os.path.join(BASE_DIR, 'DBadd/DBadd_templates'),
     78 # ————————03PerfectCRM创建基本数据————————
     79                 # ————————38PerfectCRM实现全局账号登录注销————————
     80                   os.path.join(BASE_DIR, 'gbacc/gbacc_templates'), ]
     81                 # ————————38PerfectCRM实现全局账号登录注销————————
     82         
     83         ,
     84 # ————————02PerfectCRM创建ADMIN页面————————
     85         'APP_DIRS': True,
     86         'OPTIONS': {
     87             'context_processors': [
     88                 'django.template.context_processors.debug',
     89                 'django.template.context_processors.request',
     90                 'django.contrib.auth.context_processors.auth',
     91                 'django.contrib.messages.context_processors.messages',
     92             ],
     93         },
     94     },
     95 ]
     96 
     97 WSGI_APPLICATION = 'PerfectCRM.wsgi.application'
     98 
     99 
    100 # Database
    101 # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
    102 
    103 DATABASES = {
    104     'default': {
    105         'ENGINE': 'django.db.backends.sqlite3',
    106         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    107     }
    108 }
    109 
    110 
    111 # Password validation
    112 # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
    113 
    114 AUTH_PASSWORD_VALIDATORS = [
    115     {
    116         'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    117     },
    118     {
    119         'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    120     },
    121     {
    122         'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    123     },
    124     {
    125         'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    126     },
    127 ]
    128 
    129 
    130 # Internationalization
    131 # https://docs.djangoproject.com/en/2.0/topics/i18n/
    132 
    133 # ————————01PerfectCRM基本配置ADMIN————————
    134 #LANGUAGE_CODE = 'en-us'
    135 
    136 #英文转中文方法
    137 LANGUAGE_CODE = 'zh-Hans'
    138 # ————————01PerfectCRM基本配置ADMIN————————
    139 
    140 TIME_ZONE = 'UTC'
    141 
    142 USE_I18N = True
    143 
    144 USE_L10N = True
    145 
    146 USE_TZ = True
    147 
    148 
    149 # Static files (CSS, JavaScript, Images)
    150 # https://docs.djangoproject.com/en/2.0/howto/static-files/
    151 
    152 STATIC_URL = '/static/'
    153 
    154 # ————————01PerfectCRM基本配置ADMIN————————
    155 STATICFILES_DIRS = [os.path.join(BASE_DIR,'king_admin/static'),
    156 # ————————01PerfectCRM基本配置ADMIN————————
    157                     # ————————38PerfectCRM实现全局账号登录注销————————
    158                     os.path.join(BASE_DIR, 'gbacc/static'),]
    159                     # ————————38PerfectCRM实现全局账号登录注销————————
    160 
    161 # ————————34PerfectCRM实现CRM自定义用户————————
    162 AUTH_USER_MODEL = 'crm.UserProfile'#使用自定的admin 表单
    163 # ————————34PerfectCRM实现CRM自定义用户————————
    164 
    165 
    166 
    167 # ————————44PerfectCRM实现账号快速注册登陆————————
    168 # send e-mail
    169 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'  #email后端
    170 EMAIL_USE_TLS = False   #是否使用TLS安全传输协议
    171 EMAIL_USE_SSL = True    #是否使用SSL加密,qq企业邮箱要求使用
    172 EMAIL_HOST = 'smtp.sina.cn'   #发送邮件的邮箱 的 SMTP服务器       #根据情况重新配置
    173 EMAIL_PORT = 465                 #发件箱的SMTP服务器端口 #一般不需要修改465
    174 EMAIL_HOST_USER = 'perfectcrm@sina.cn'    #发送邮件的邮箱账号     #根据情况重新配置  #perfectcrm@sina.cn   pydjango@sina.cn
    175 EMAIL_HOST_PASSWORD = 'admin123456'         #发送邮件的邮箱密码    #根据情况重新配置
    176 
    177 # ————————44PerfectCRM实现账号快速注册登陆————————
    # settings.py

     1 {#gbacc_fast_login.html#}
     2 {## ————————44PerfectCRM实现账号快速注册登陆————————#}
     3 {% extends "gbacc_master/gbacc_sample.html" %}
     4 {% block right-container-content %}
     5     <div class="container col-lg-offset-3">
     6         <form class="form-signin col-lg-4 pu" method="post" enctype="multipart/form-data">{% csrf_token %}
     7             <h2 class="form-signin-heading">CRM 验证码注册登陆</h2>
     8             <label for="inputEmail" class="sr-only col-sm-2">邮箱账号</label>
     9             <input type="email" name="email" id="inputEmail" class="form-control" placeholder="邮箱账号"
    10                    required="" autofocus="" value={% if email %}{{ email }}{% else %}{{ '' }}{% endif %}>
    11             <div class="form-group">
    12                 <div class="row">
    13                     <div class="col-xs-7">
    14                         <input type="text" class="form-control" id="check_code" name="check_code"
    15                                placeholder="请输入验证码">{{ obj.errors.pwds }}
    16                     </div>
    17                     <button type="submit">发送验证码</button>
    18                 </div>
    19             </div>
    20             {% if errors %}
    21                 <span style="color: #761c19">{{ errors.error }}</span>
    22             {% endif %}
    23             <div class="checkbox">
    24                 <label><input type="checkbox" value="remember-me"> 记住账号 </label>
    25             </div>
    26             <button class="btn btn-lg btn-primary btn-block" type="submit">登陆</button>
    27         </form>
    28     </div>
    29 {% endblock %}
    30 {## ————————44PerfectCRM实现账号快速注册登陆————————#}
    {#gbacc_fast_login.html#}


     

    如果感觉本章博客对您有帮助,请尽情打赏吧!

  • 相关阅读:
    servlet 将输入内容通过拼接页面的方式显示出来
    localstorage和vue结合使用
    vue的通讯与传递props emit (简单的弹框组件)
    jquery插件之选项卡
    详解Cookie纪要
    jsonp
    滚动条样式
    axios基本使用
    IOS安卓常见问题
    简单购物车
  • 原文地址:https://www.cnblogs.com/ujq3/p/8849995.html
Copyright © 2011-2022 走看看