第二章 天天生鲜项目实现基本功能
学习入门指南:
天天生鲜项目搭建文件可从公众号学聚思获取,关注公众号:学聚思、学聚思、学聚思。重要的事情说三遍
本文博客获取关键词:天天生鲜注册实现博客
本项目关键词:天天生鲜注册实现源码
请大家按照关键字搜索哦,另外,本人创建了1个QQ群欢迎各位加入讨论
QQ群号:301666877
另外如果需要其他资源,比如视频中的工程文档,欢迎公众号留言
本内容持续更新直至天天生鲜项目完成!
本文主要内容:实现注册基本逻辑
本设计不涉及中间过程,直接上手最后的功能,所以自己对着视频分模块学习,把这个整个模块学习完再导入下面的代码
本文中用到的Django的一些说明书
章节目录
第一步
首先将static文件夹下面的register.html复制到templates中,由于CSS文件以及js文件与其不在同一路径,我们需要将头文件做如下改变
# 将头部文件做如下改变 PS:这个注释最好不要复制进去
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
{% load static %}
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>天天生鲜-注册</title>
<link rel="stylesheet" type="text/css" href="{% static 'css/reset.css' %}">
<link rel="stylesheet" type="text/css" href="{% static 'css/main.css' %}">
<script type="text/javascript" src="{% static js/jquery-1.12.4.min.js %}"></script>
<script type="text/javascript" src="{% static 'js/register.js' %}"></script>
</head>
另外,如果前端代码中,存在图片连接,由于图片存放在static中,因此图片也需要做如下改变,只要是图片连接都要做这种改变
<a class="reg_logo"><img src="{% static 'images/logo02.png' %}"></a>
最后我们的前端页面register.html中的是这样的,当然中间还存在很多改变,自己看视频,防止敲错,直接复制即可
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
{% load static %}
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>天天生鲜-注册</title>
<link rel="stylesheet" type="text/css" href="{% static 'css/reset.css' %}">
<link rel="stylesheet" type="text/css" href="{% static 'css/main.css' %}">
<script type="text/javascript" src="{% static 'js/jquery-1.12.4.min.js' %}"></script>
<script type="text/javascript" src="{% static 'js/register.js' %}"></script>
</head>
<body>
<div class="register_con">
<div class="l_con fl">
<a class="reg_logo"><a class="reg_logo"><img src="{% static 'images/logo02.png' %}"></a></a>
<div class="reg_slogan">足不出户 · 新鲜每一天</div>
<div class="reg_banner"></div>
</div>
<div class="r_con fr">
<div class="reg_title clearfix">
<h1>用户注册</h1>
<a href="#">登录</a>
</div>
<div class="reg_form clearfix">
<form method="post" action="/user/register">
{% csrf_token %}
<ul>
<li>
<label>用户名:</label>
<input type="text" name="user_name" id="user_name">
<span class="error_tip">提示信息</span>
</li>
<li>
<label>密码:</label>
<input type="password" name="pwd" id="pwd">
<span class="error_tip">提示信息</span>
</li>
<li>
<label>确认密码:</label>
<input type="password" name="cpwd" id="cpwd">
<span class="error_tip">提示信息</span>
</li>
<li>
<label>邮箱:</label>
<input type="text" name="email" id="email">
<span class="error_tip">提示信息</span>
</li>
<li class="agreement">
<input type="checkbox" name="allow" id="allow" checked="checked">
<label>同意”天天生鲜用户使用协议“</label>
<span class="error_tip2">提示信息</span>
</li>
<li class="reg_sub">
<input type="submit" value="注 册" name="">
</li>
</ul>
</form>
</div>
</div>
</div>
<div class="footer no-mp">
<div class="foot_link">
<a href="#">关于我们</a>
<span>|</span>
<a href="#">联系我们</a>
<span>|</span>
<a href="#">招聘人才</a>
<span>|</span>
<a href="#">友情链接</a>
</div>
<p>CopyRight © 2016 北京天天生鲜信息技术有限公司 All Rights Reserved</p>
<p>电话:010-****888 京ICP备*******8号</p>
</div>
</body>
</html>
然后再user/views.py中添加如下代码
from django.shortcuts import render,redirect
from django.urls import reverse #反向解析函数
from django.core.mail import send_mail #导入发送邮件函数
from django.views.generic import View #导入类视图
from django.http import HttpResponse
from django.conf import settings
from user.models import User
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer #导入用于用户信息加密的插件并且给它取个别名为Serializer
from itsdangerous import SignatureExpired #导入异常
import re #导入正则匹配模块用于检验邮箱
# Create your views here.
class RegisterView(View):
"'注册类试图'"
def get(self,request):
"'显示注册页面'"
return render(request, 'register.html')
def post(self,request):
"'进行注册处理'"
# 接收数据
username = request.POST.get('user_name')
password = request.POST.get('pwd')
email = request.POST.get('email')
allow = request.POST.get('allow')
# 进行数据校验
if not all([username, password, email]):
# 数据不完整
return render(request, 'register.html', {'errmsg': '数据不完整'})
# 检验邮箱
# 如果不是一个邮箱,即邮箱形式不合法
if not re.match(r'^[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):
# 邮箱格式不正确
return render(request, 'register.html', {'errmsg': '邮箱不合法'})
if allow != 'on':
# 是否同意协议
return render(request, 'register.html', {'errmsg': '请同意协议'})
# 校验用户名是否重复
try:
user= User.objects.get(username=username)
except User.DoesNotExist:
user = None
if user:
# 用户名已存在
return render(request, 'register.html', {'errmsg': '用户名已存在'})
# 进行业务处理:进行用户注册
user = User.objects.create_user(username, email, password)
user.is_active = 0 # 不让他自动激活
user.save()
#发送激活邮件,包含激活链接:
#激活连接中需要包含用户的身份信息,并且要把身份信息进行加密
#加密用户的身份信息,生成激活token
serializer=Serializer(settings.SECRET_KEY,3600)
info={'confirm':user.id}
token=serializer.dumps(info) #返回的是字节
token=token.decode() #进行字节解码
# 组织邮件信息
subject = '天天生鲜欢迎信息'
message = '欢迎注册'
sender = settings.EMAIL_FROM # 发件人
receiver = [email]
html_message = '<h1>%s欢迎您成为为天天生鲜交易市场注册会员</h1>请点击下面链接激活您的账户<br/><a href="http://127.0.0.1:8000/user/active/%s">http://127.0.0.1:8000/user/active/%s</a>' % (username, token, token)
send_mail(subject, message, sender, receiver, html_message=html_message)
# 返回应答,跳转到首页
return redirect(reverse('goods:index'))
class ActiveView(View):
"'用户激活'"
def get(self,request,token):
"'进行用户激活'"
# 解密参数,获取要激活的用户信息
serializer = Serializer(settings.SECRET_KEY, 3600)
try:
info=serializer.loads(token)
#获取待激活用户的id
user_id=info['confirm']
#根据用户id获取用户信息
user=User.objects.get(id=user_id)
user.is_active=1
user.save()
#跳转登录页面
return redirect(reverse('user:login'))
except SignatureExpired as e:
#激活链接已过期
return HttpResponse('激活链接已过期')
然后在user/urls.py中添加如下内容太
from django.urls import path,re_path
from user.views import RegisterView,ActiveView
urlpatterns = [
path('register',RegisterView.as_view(),name='register'), #注册
re_path('active/(?P<token>.*)$',ActiveView.as_view(),name='active'), #用户激活
]
由于可能用到首页,所以在goods/urls.py中添加如下内容:
from django.urls import path
from goods import views
urlpatterns = [
path('',views.index,name='index'), #首页
]
在goods/views.py中添加如下内容
from django.shortcuts import render
# Create your views here.
def index(request):
"'首页'"
return render(request,'index.html')
第二步、一些插件的安装
发送邮件时,为了对有些链接进行加密,我们需要安装加密插件"itsdangerous",直接运行:
pip install itsdangerous #第一步安装插件
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer #第二步 在user/views.py导入这个
# 第三步,在settings中做如下配置,记得看视频改成自己的邮箱配置啊!
# 发送邮件配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# smpt服务地址
EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = 25
# 发送邮件的邮箱
EMAIL_HOST_USER = 'smartli_it@163.com'
# 在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = 'smartli123'
# 收件人看到的发件人
EMAIL_FROM = '天天生鲜<smartli_it@163.com>'
mysql数据库应用小技巧
# 1、如何删除数据库中某个表中的数据,比如从df_user表中删除id=1的用户
delete from df_user where id=1
# 2、查看df_user表中的全部数据
select * from df_user;
select * from df_user \G; #这个可以让数据一行行的展示
# 3、如何查看表的结构,比如df_user表
desc df_user;