修改邮箱
C:\Users\hlg\PycharmProjects\MxOnline\templates\usercenter-base.html
<div class="dialogbox changeemai1 changephone" id="jsChangeEmailDialog">
<h1>修改邮箱</h1>
<div class="close jsCloseDialog"><img src="{% static 'images/dig_close.png' %}"/></div>
<p>请输入新的邮箱地址</p>
<form id="jsChangeEmailForm" autocomplete="off">
<div class="box">
<input class="fl change_email" name="email" id="jsChangeEmail" type="text" placeholder="输入重新绑定的邮箱地址">
</div>
<div class="box">
<input class="fl email_code" type="text" id="jsChangeEmailCode" name="code" placeholder="输入邮箱验证码">
<input class="getcode getting" type="button" id="jsChangeEmailCodeBtn" value="获取验证码">
</div>
<div class="error btns change_email_tips" id="jsChangeEmailTips" >请输入...</div>
<div class="button">
<input class="changeemai_btn" id="jsChangeEmailBtn" type="button" value="完成"/>
</div>
{% csrf_token %}
</form>
</div>
C:\Users\hlg\PycharmProjects\MxOnline\static\js\deco-user.js
//个人资料邮箱修改
function changeEmailSubmit($btn){
var verify = verifyDialogSubmit(
[
{id: '#jsChangeEmail', tips: Dml.Msg.epMail, errorTips: Dml.Msg.erMail, regName: 'email', require: true},
]
);
if(!verify){
return;
}
$.ajax({
cache: false,
type: 'post',
dataType:'json',
url:"/users/update_email/",
data:$('#jsChangeEmailForm').serialize(),
async: true,
beforeSend:function(XMLHttpRequest){
$btn.val("发送中...");
$btn.attr('disabled',true);
$("#jsChangeEmailTips").html("验证中...").show(500);
},
success: function(data) {
if(data.email){
Dml.fun.showValidateError($('#jsChangeEmail'), data.email);
}else if(data.status == "success"){
Dml.fun.showErrorTips($('#jsChangePhoneTips'), "邮箱信息更新成功");
setTimeout(function(){location.reload();},1000);
}else{
Dml.fun.showValidateError($('#jsChangeEmail'), "邮箱信息更新失败");
}
},
complete: function(XMLHttpRequest){
$btn.val("完成");
$btn.removeAttr("disabled");
}
});
}
# 修改邮箱
url(r'^update_email/$', UpdateEmailView.as_view(), name="update_email"),
C:\Users\hlg\PycharmProjects\MxOnline\apps\users\views.py
class SendEmailCodeView(LoginRequiredMixin, View):
"""
发送邮箱验证码
"""
def get(self, request):
email = request.GET.get('email', '')
if UserProfile.objects.filter(email=email):
return HttpResponse('{"email": "邮箱已经存在"}', content_type='application/json')
send_register_email(email, "update_email")
return HttpResponse('{"status": "success"}', content_type='application/json')
class UpdateEmailView(LoginRequiredMixin, View):
"""
修改个人邮箱
"""
def post(self, request):
email = request.POST.get('email', '')
code = request.POST.get('code', '')
existed_records = EmailVerifyRecord.objects.filter(email=email, code=code, send_type='update_email')
if existed_records:
user = request.user
user.email = email
user.save()
return HttpResponse('{"status": "success"}', content_type='application/json')
else:
return HttpResponse('{"email": "验证码出错"}', content_type='application/json')
# _*_ encoding:utf-8 _*_
import json
from django.shortcuts import render
from django.contrib.auth import authenticate, login
from django.contrib.auth.backends import ModelBackend #
from django.db.models import Q # 完成并集
from django.views.generic.base import View #
from django.contrib.auth.hashers import make_password
from django.http import HttpResponse
# Create your views here.
from .models import UserProfile, EmailVerifyRecord
from .forms import LoginForm, RegisterForm, ForgetForm, ModifyPwdForm, UploadImageForm
from utils.email_send import send_register_email
from utils.mixin_utils import LoginRequiredMixin
class CustomBackend(ModelBackend):
def authenticate(self, username=None, password=None, **kwargs):
# 完成自己的逻辑
try:
# user = UserProfile.objects.get(username=username)
user = UserProfile.objects.get(Q(username=username)|Q(email=username))
if user.check_password(password):
return user
except Exception as e:
return None
class ActiveUserView(View):
def get(self, request, active_code):
all_records = EmailVerifyRecord.objects.filter(code=active_code)
if all_records:
for record in all_records:
email = record.email
user = UserProfile.objects.get(email= email)
user.is_active = True
user.save()
# 如果不存在 告诉用户你的链接有误
else:
# 验证失败的返回
return render(request, "active_fail.html")
return render(request, "login.html")
# Register+View 说明是一个处理前端请求的View类
class RegisterView(View):
def get(self, request):
register_form = RegisterForm()
return render(request, "register.html", {'register_form':register_form})
# 验证逻辑
def post(self, request):
# 实例化用户传来的数据
register_form = RegisterForm(request.POST)
if register_form.is_valid():
user_name = request.POST.get("email", "")
# 注册之前,判断用户是否存在
if UserProfile.objects.filter(email=user_name):
return render(request, "register.html", {"msg": "用户已经存在", "register_form": register_form})
pass_word = request.POST.get("password", "")
user_profile = UserProfile()
user_profile.username = user_name
user_profile.email = user_name
user_profile.is_active = False
user_profile.password = make_password(pass_word)
user_profile.save()
# 发送验证码
send_register_email(user_name, "register")
# 注册成功,返回到登录页面
return render(request, "login.html")
else:
# 注册失败,返回到注册页面
return render(request, "register.html", {"register_form":register_form})
# 基于类
class LoginView(View): # 继承View django的View会自动调用get ,post
def get(self, request):
return render(request, "login.html", {})
def post(self, request):
login_form = LoginForm(request.POST) # 实例化
if login_form.is_valid():
user_name = request.POST.get("username", "")
pass_word = request.POST.get("password", "")
user = authenticate(username=user_name, password=pass_word)
if user is not None:
if user.is_active:
login(request, user) # 这个是系统提供的 login
return render(request, "index.html") # 登录成功,跳转到首页
else:
return render(request, "login.html", {"msg": "用户名或密码错误"}) # 验证失败
else:
return render(request, "login.html", {"msg": "用户名或密码错误"}) # 验证失败
else:
return render(request, "login.html", {"login_form":login_form}) # 登录失败,跳转到登录页面
class ForgetPwdView(View):
def get(self, request):
forget_form = ForgetForm()
return render(request, "forgetpwd.html", {"forget_form": forget_form})
def post(self, request):
forget_form = ForgetForm(request.POST)
if forget_form.is_valid():
email = request.POST.get("email", "")
send_register_email(email, "forget")
# 发送邮件成功跳转页面
return render(request, "send_success.html")
else:
return render(request, "forgetpwd.html", {"forget_form": forget_form})
class ResetView(View):
def get(self, request, active_code):
all_records = EmailVerifyRecord.objects.filter(code=active_code)
if all_records:
for record in all_records:
email = record.email
# 查找到用户,跳转到重置页面
return render(request, "password_reset.html", {"email": email})
# 如果不存在 告诉用户你的链接有误
else:
# 验证失败的返回
return render(request, "active_fail.html")
return render(request, "login.html")
class ModifyPwdView(View):
"""
修改用户密码
"""
def post(self, request):
modify_form = ModifyPwdForm(request.POST)
if modify_form.is_valid():
pwd1 = request.POST.get("password1", "")
pwd2 = request.POST.get("password2", "")
email = request.POST.get("email", "")
# 密码不一致
if pwd1 != pwd2:
return render(request, "password_reset.html", {"email": email, "msg": "密码不一致"})
# 密码一致,保存密码
user = UserProfile.objects.get(email=email)
user.password = make_password(pwd2)
user.save()
# 密码修改成功,跳转到登录页面
return render(request, "login.html")
# 如果失败
else:
email = request.POST.get("email", "")
return render(request, "password_reset.html", {"email": email, "modify_form": modify_form})
class UserInfoView(LoginRequiredMixin, View):
"""
继承 LoginRequiredMixin 之后,只有登录才能继续执行
用户个人信息
"""
def get(self, request):
return render(request, 'usercenter-info.html',{})
class UploadImageView(LoginRequiredMixin, View):
"""
用户修改头像
"""
def post(self, request):
# 方式一
# 实际上是把用户上传的文件保存到form里了
# image_form = UploadImageForm(request.POST, request.FILES)
# if image_form.is_valid():
# #
# image = image_form.cleaned_data['image']
# request.user.image = image
# request.user.save()
# pass
# 方式二
# 实际上是把用户上传的文件保存到form里了
image_form = UploadImageForm(request.POST, request.FILES, instance=request.user)
if image_form.is_valid():
image_form.save()
return HttpResponse('{"status": "success"}', content_type='application/json')
else:
return HttpResponse('{"status": "fail"}', content_type='application/json')
class UpdatePwdView(View):
"""
个人中心修改用户密码
"""
def post(self, request):
modify_form = ModifyPwdForm(request.POST)
if modify_form.is_valid():
pwd1 = request.POST.get("password1", "")
pwd2 = request.POST.get("password2", "")
# 密码不一致
if pwd1 != pwd2:
return HttpResponse('{"status": "fail", "msg": "密码不一致"}', content_type='application/json')
# 密码一致,保存密码
user = request.user
user.password = make_password(pwd2)
user.save()
return HttpResponse('{"status": "success"}', content_type='application/json')
# 如果失败
else:
return HttpResponse(json.dumps(modify_form.errors), content_type='application/json')
class SendEmailCodeView(LoginRequiredMixin, View):
"""
发送邮箱验证码
"""
def get(self, request):
email = request.GET.get('email', '')
if UserProfile.objects.filter(email=email):
return HttpResponse('{"email": "邮箱已经存在"}', content_type='application/json')
send_register_email(email, "update_email")
return HttpResponse('{"status": "success"}', content_type='application/json')
class UpdateEmailView(LoginRequiredMixin, View):
"""
修改个人邮箱
"""
def post(self, request):
email = request.POST.get('email', '')
code = request.POST.get('code', '')
existed_records = EmailVerifyRecord.objects.filter(email=email, code=code, send_type='update_email')
if existed_records:
user = request.user
user.email = email
user.save()
return HttpResponse('{"status": "success"}', content_type='application/json')
else:
return HttpResponse('{"email": "验证码出错"}', content_type='application/json')
==============================================================
修改其他信息
注意这个地方:
<li>生 日:
<input type="text" id="birth_day" name="birthday" value="{{ request.user.birthday|date:'Y-m-d' }}" readonly="readonly"/>
<i class="error-tips"></i>
</li>
不然,每次必须选日子