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全局账号注册————————
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实现账号快速重置密码————————
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实现账号快速重置密码————————#}
如果感觉本章博客对您有帮助,请尽情打赏吧!
您的资助是我最大的动力!
金额随意,欢迎来赏!
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的
因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【颜言】!