zoukankan      html  css  js  c++  java
  • Django项目:CRM(客户关系管理系统)--48--39PerfectCRM实现登录+验证码+过期时间+页面保留账号

     1 # gbacc_urls.py
     2 # ————————38PerfectCRM实现全局账号登录注销————————
     3 from django.conf.urls import url
     4 from gbacc import gbacc_views
     5 urlpatterns = [
     6     url(r'^gbacc_login/', gbacc_views.gbacc_login, name='gbacc_login'),  # 全局登录
     7     # LOGIN_URL = '/gbacc/gbacc_login/'# login_url 配置,默认'/accounts/login/' #注意 / (斜杠,绝对路径)#settings.py
     8 
     9     url(r'^gbacc_logout/', gbacc_views.gbacc_logout, name='gbacc_logout'),  # 全局注销,默认跳转到accounts/login
    10 
    11     # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
    12     url(r'^check_code.html/$', gbacc_views.check_code, name='check_code'),  # 验证码 校对
    13     # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
    14 ]
    15 # ————————38PerfectCRM实现全局账号登密码密码录注销————————
    # gbacc_urls.py

     1 # check_code.py
     2 # ————————41PerfectCRM实现全局账号注册带验证码————————
     3 import random
     4 from PIL import Image, ImageDraw, ImageFont, ImageFilter
     5 _letter_cases = "abcdefghjkmnpqrstuvwxy"  # 小写字母,去除可能干扰的i,l,o,z
     6 _upper_cases = _letter_cases.upper()  # 大写字母
     7 _numbers = ''.join(map(str, range(3, 10)))  # 数字
     8 init_chars = ''.join((_letter_cases, _upper_cases, _numbers))
     9 def create_validate_code(size=(120, 30),
    10                          chars=init_chars,
    11                          img_type="GIF",
    12                          mode="RGB",
    13                          bg_color=(255, 255, 255),
    14                          fg_color=(0, 0, 255),
    15                          font_size=18,
    16                          font_type="check.ttf",    #必须有字体
    17                          length=4,
    18                          draw_lines=True,
    19                          n_line=(1, 2),
    20                          draw_points=True,
    21                          point_chance=2):
    22     """
    23     @todo: 生成验证码图片
    24     @param size: 图片的大小,格式(宽,高),默认为(120, 30)
    25     @param chars: 允许的字符集合,格式字符串
    26     @param img_type: 图片保存的格式,默认为GIF,可选的为GIF,JPEG,TIFF,PNG
    27     @param mode: 图片模式,默认为RGB
    28     @param bg_color: 背景颜色,默认为白色
    29     @param fg_color: 前景色,验证码字符颜色,默认为蓝色#0000FF
    30     @param font_size: 验证码字体大小
    31     @param font_type: 验证码字体,默认为 ae_AlArabiya.ttf
    32     @param length: 验证码字符个数
    33     @param draw_lines: 是否划干扰线
    34     @param n_lines: 干扰线的条数范围,格式元组,默认为(1, 2),只有draw_lines为True时有效
    35     @param draw_points: 是否画干扰点
    36     @param point_chance: 干扰点出现的概率,大小范围[0, 100]
    37     @return: [0]: PIL Image实例
    38     @return: [1]: 验证码图片中的字符串
    39     """
    40     width, height = size  # 宽高
    41     # 创建图形
    42     img = Image.new(mode, size, bg_color)
    43     draw = ImageDraw.Draw(img)  # 创建画笔
    44     def get_chars():
    45         """生成给定长度的字符串,返回列表格式"""
    46         return random.sample(chars, length)
    47     def create_lines():
    48         """绘制干扰线"""
    49         line_num = random.randint(*n_line)  # 干扰线条数
    50         for i in range(line_num):
    51             # 起始点
    52             begin = (random.randint(0, size[0]), random.randint(0, size[1]))
    53             # 结束点
    54             end = (random.randint(0, size[0]), random.randint(0, size[1]))
    55             draw.line([begin, end], fill=(0, 0, 0))
    56     def create_points():
    57         """绘制干扰点"""
    58         chance = min(100, max(0, int(point_chance)))  # 大小限制在[0, 100]
    59         for w in range(width):
    60             for h in range(height):
    61                 tmp = random.randint(0, 100)
    62                 if tmp > 100 - chance:
    63                     draw.point((w, h), fill=(0, 0, 0))
    64     def create_strs():
    65         """绘制验证码字符"""
    66         c_chars = get_chars()
    67         strs = ' %s ' % ' '.join(c_chars)  # 每个字符前后以空格隔开
    68         font = ImageFont.truetype(font_type, font_size)
    69         font_width, font_height = font.getsize(strs)
    70         draw.text(((width - font_width) / 3, (height - font_height) / 3),
    71                   strs, font=font, fill=fg_color)
    72         return ''.join(c_chars)
    73     if draw_lines:
    74         create_lines()
    75     if draw_points:
    76         create_points()
    77     strs = create_strs()
    78     # 图形扭曲参数
    79     params = [1 - float(random.randint(1, 2)) / 100,
    80               0,
    81               0,
    82               0,
    83               1 - float(random.randint(1, 10)) / 100,
    84               float(random.randint(1, 2)) / 500,
    85               0.001,
    86               float(random.randint(1, 2)) / 500
    87               ]
    88     img = img.transform(size, Image.PERSPECTIVE, params)  # 创建扭曲
    89     img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)  # 滤镜,边界加强(阈值更大)
    90     return img, strs
    91 # ————————41PerfectCRM实现全局账号注册带验证码————————
    # check_code.py

     

    控制面板所有控制面板项字体

    由于无法上传字体 ,请自己复制一个字体到项目下

     1 # gbacc_views.py
     2 # ————————38PerfectCRM实现全局账号登录注销————————
     3 from django.contrib.auth import login #记录登录 #Django在数据库创建一条记录 #记住密码,免登录
     4 from django.contrib.auth import authenticate #调用用户认证模块
     5 from django.contrib.auth import logout #注销功能
     6 from django.shortcuts import render  #页面返回
     7 from django.shortcuts import redirect  #页面返回
     8 
     9 # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
    10 #验证码函数 #处理注册的内容
    11 from io import BytesIO #创建内存空间
    12 from django.shortcuts import HttpResponse #页面返回
    13 from gbacc.gbacc_auxiliary.check_code import create_validate_code #验证图片
    14 def check_code(request):
    15     stream = BytesIO()#创建内存空间
    16     img, code = create_validate_code()#调用验证码图片生成函数 返回图片 和 对应的验证码
    17     img.save(stream, 'PNG')#保存为PNG格式
    18     request.session['CheckCode'] = code#保存在session中
    19     return HttpResponse(stream.getvalue())
    20 # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
    21 
    22 #全局账号登录
    23 def gbacc_login(request):
    24 
    25     # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
    26     email={} #变字典#传前端#页面获取值
    27     _email = request.POST.get('email')  #关键语句 #获取前端输入的值
    28     request.session['email'] = _email  #保存到 session 里
    29     email=request.session.get('email')   #保存到变量#变字典#传前端
    30     import datetime
    31     today_str = datetime.date.today().strftime("%Y%m%d")   #获取时间#登陆过期
    32     # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
    33     
    34     errors={}
    35     if request.method =="POST":
    36         _email=request.POST.get('email')
    37         _password=request.POST.get('password')
    38         # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
    39         #后台生成的验证码#调用上面def check_code(request):        #页面输入的验证码
    40         if request.session.get('CheckCode').upper() == request.POST.get('check_code').upper():#验证码
    41         # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
    42             user =authenticate(username=_email,password=_password)#调用用户认证模块
    43             print('认证账号密码',user)
    44             if user:
    45                 login(request,user)#记录登录 #Django在数据库创建一条记录 #记住密码,免登录
    46                 # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
    47                 request.session.set_expiry(60*60)  #登陆过期时间
    48                 # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
    49                 next_url =request.GET.get('next','/')#跳转的页面,默认为首页
    50                 return redirect(next_url)
    51             else:
    52                 errors['error']='认证失败!'
    53         # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
    54         else:
    55             errors['error']= "验证码错误!"
    56         # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
    57     return render(request,'gbacc_specific/gbacc_login.html',locals())
    58 
    59 #全局账号注销
    60 def gbacc_logout(request):
    61     logout(request)  #调用Djangao 注销功能
    62     return redirect('/gbacc/gbacc_login/')
    63 
    64 # ————————38PerfectCRM实现全局账号登录注销————————
    # gbacc_views.py

     1 {#gbacc_login.html#}
     2 {## ————————38PerfectCRM实现全局账号登录注销————————#}
     3 {% extends "gbacc_master/gbacc_sample.html" %}
     4 {% block right-container-content %}
     5 
     6     <div class="container col-lg-offset-3">
     7       <form class="form-signin col-lg-3 pu" method="post">{% csrf_token %}
     8         <h2 class="form-signin-heading">CRM 登陆</h2>
     9         <label for="inputEmail" class="sr-only col-sm-2">邮箱账号</label>
    10 
    11 
    12         {## ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————#}
    13 {#        <input type="email" name="email" id="inputEmail" class="form-control" placeholder="邮箱账号" required="" autofocus=""  >#}
    14         <input type="email" name="email" id="inputEmail" class="form-control" placeholder="邮箱账号"
    15                required="" autofocus="" value ={% if email %}{{ email }}{% else %}{{ '' }}{% endif %} >
    16         {## ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————#}
    17       
    18 
    19         <label for="inputPassword" class="sr-only col-sm-2">密码</label>
    20         <input type="password" name="password" id="inputPassword" class="form-control" placeholder="密码" required="">
    21 
    22 
    23         {## ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————#}
    24         <div class="form-group">
    25             <div class="row">
    26                 <div class="col-xs-7">
    27                     <input type="text" class="form-control" id="check_code" name="check_code" placeholder="请输入验证码">{{ obj.errors.pwds }}
    28                 </div>
    29                 <div class="col-xs-5">
    30                     <img id="check_code_img" src="/gbacc/check_code.html/" onclick="changeCheckCode(this);"> {## 配置URL绝对路径#}{## 绑定JS刷新验证码图片#}
    31                 </div>
    32             </div>
    33         </div>
    34         {## ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————#}
    35 
    36 
    37         {% if errors %}
    38             <span style="color: #761c19">{{ errors.error }}</span>
    39         {% endif %}
    40           <div class="checkbox">
    41           <label><input type="checkbox" value="remember-me"> 记住账号 </label>
    42         </div>
    43 
    44         <button class="btn btn-lg btn-primary btn-block" type="submit">登陆</button>
    45       </form>
    46     </div>
    47 
    48 
    49 {## ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————#}
    50 <script>
    51      //刷新验证码
    52      function changeCheckCode(ths){
    53             ths.src = ths.src +  '?';
    54      }
    55 </script>
    56 {## ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————#}
    57 
    58 
    59 {% endblock %}
    60 {## ————————38PerfectCRM实现全局账号登录注销————————#}
    {#gbacc_login.html#}

  • 相关阅读:
    在 ServiceModel 客户端配置部分中,找不到引用协定
    nopi 导出excel 带图片
    c# async await 理解 结合并行处理
    从数据库更新模型时出现System.ArgumentException
    C# HTTP请求 异步(async await)
    C# HTTP请求
    SQL列转行
    详解C# 匿名对象(匿名类型)、var、动态类型 dynamic
    JavaScript (function (){}()) 与(function(){})()
    记ssh错误排查-ansible
  • 原文地址:https://www.cnblogs.com/ujq3/p/8796730.html
Copyright © 2011-2022 走看看