Django项目:CRM(客户关系管理系统)--54--45PerfectCRM实现账号快速重置密码

 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     # ————————45PerfectCRM实现账号快速重置密码————————
19     url(r'^gbacc_fast_pwdreset/', gbacc_ajax_views.gbacc_fast_pwdreset, name='gbacc_fast_pwdreset'),  # 快速重置密码
20     # ————————45PerfectCRM实现账号快速重置密码————————
21 ]
22 # ————————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实现账号快速注册登陆————————
203 
204 
205 # ————————45PerfectCRM实现账号快速重置密码————————
206 def gbacc_fast_pwdreset(request):
207     email = request.POST.get('email')  # 获取前端输入的值#邮箱账号
208     _email = request.session.get('email')  #  查询session 里
209     if not _email:
210         request.session['email'] = email   # 创建保存到 session 里 #防止下面第一次检查对比账号没有值
211     errors = {}  # 页面的错误提示
212     stmpemail = stmp() #实例化发送邮件的功能
213     if request.method =="POST":
214         username = models.UserProfile.objects.filter(email=email).first()  #获取前端输入的值#查询账号
215         if username:
216             if email != _email:  #检查是不是同一个账号,防止验证码用到其他账号
217                 request.session['email'] = email  # 不是同一个账号,就保存新账号到session里
218                 request.session['oldTime'] = None  # 同时清空过期时间,重新生成验证码发送邮件
219             else:
220                 errors['error'] = "请60秒后再重置!"
221             oldTime = request.session.get('oldTime')  # 到session里获取过期的时间
222             if oldTime == None or stmpemail.nowtime() > oldTime:
223                 stmpemail.stmps(request, email)             #调用类,发送邮件
224                 print('新密码',stmpemail.code)
225                 password = make_password(stmpemail.code, )  # 密码加密
226                 models.UserProfile.objects.filter(email=email).update(password=password) #更新密码
227                 errors['error'] = "新的密码已经发到您的邮箱,请去您的邮箱查收并使用新的密码登录,有问题请发邮件到 perfectcrm@sina.cn!"
228         else:
229             errors['error'] = "您的邮箱的账户注册信息没有找到"
230     return render(request, 'gbacc_ajax/gbacc_fast_pwdreset.html', locals())
231 # ————————45PerfectCRM实现账号快速重置密码————————
# gbacc_ajax_views.py

 1 {#gbacc_fast_pwdreset.html#}
 2 {## ————————45PerfectCRM实现账号快速重置密码————————#}
 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-3 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             <button class="btn btn-lg btn-primary btn-block" type="submit">发送邮件,重置密码</button>
12             {% if errors %}
13                 <span style="color: #761c19">{{ errors.error }}</span>
14             {% endif %}
15         </form>
16     </div>
17 {% endblock %}
18 {## ————————45PerfectCRM实现账号快速重置密码————————#}
{#gbacc_fast_pwdreset.html#}


 

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

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