1、用户信息展示

<1>用户模型类添加email_active字段,邮箱校验状态

email_active = models.BooleanField(default=True, verbose_name='邮箱验证状态')


<2>执行迁移命令

python manage.py makemigrations
pythn mange.py migrate

<3>apps/users/views下创建用户信息详情视图

from rest_framework.generics import RetrieveAPIViewclass UserDetailView(RetrieveAPIView):serializer_class = UserDetailSerializer# 权限指定,只有被认证后的用户才可以访问permission_classes = [IsAuthenticated]# 重写get_object方法,返回用户指定信息def get_object(self):return self.request.user

<4>apps/users/serializers下创建序列化器

class UserDetailSerializer(serializers.ModelSerializer):class Meta:model = Userexclude =('password',)


<5>apps/users/urls下添加子路由

urlpatterns = [url(r"^user/$", views.UserDetailView.as_view()),
]


2、使用Django发送邮件,实现用户邮箱验证

Django中内置了邮件发送功能,被定义在django.core.mail模块中。发送邮件需要使用SMTP服务器,常用的免费服务器有:163、126、QQ,下面以163邮件为例。

<1>注册163邮箱itcast88,登录后设置。

<2>在新页面中点击“客户端授权密码”,勾选“开启”,弹出新窗口填写手机验证码。

<3>填写授权码。

<4>提示开启成功。

<5>在Django配置文件settings/dev.py中,设置邮箱的配置信息

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = 25
#发送邮件的邮箱
EMAIL_HOST_USER = 'itcast88@163.com'
#在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = 'python808'
#收件人看到的发件人
EMAIL_FROM = 'python<itcast88@163.com>'

<6>注册异步发送邮件任务完成业务逻辑代码

  • 异步任务业务逻辑代码
from django.conf import settings
from django.core.mail import send_mail
from celery_tasks.main import app@app.task(name='send_email')
def send_email(subject, to_email, html_message):send_mail(subject, '', settings.EMAIL_FROM,[to_email], html_message=html_message)
  • celery_tasks/main/注册异步任务(如下图所示:)

<7>添加邮箱账号并向用户发送验证邮件

  • 创建用户信息更新视图类
class UserUpdateView(UpdateAPIView):"""绑定邮箱账号并发送邮件"""serializer_class = UserUpdateSerializerdef get_object(self):return self.request.user
  • 创建用户信息序列化器

class UserUpdateSerializer(serializers.ModelSerializer):"""绑定邮箱账号并发送邮件"""class Meta:model = Userfields = ("email",)def update(self, instance, validated_data):instance.email = validated_data["email"]instance.save()tjss = TJSS(settings.SECRET_KEY, 300)token = tjss.dumps({'username':instance.username}).decode()# send_mail(subject, message, from_email, recipient_list, html_message=None)# subject 邮件标题/message 普通邮件正文, 普通字符串/from_email 发件人/ recipient_list 收件人列表/html_message 多媒体邮件正文,可以是html字符串verify_url = 'http://www.meiduo.site:8080/success_verify_email.html?token=' + tokensubject = "美多商城用户邮箱验证"html_message = '<p>尊敬的用户您好!</p>' \'<p>感谢您使用美多商城。</p>' \'<p>您的邮箱为:%s 。请点击此链接激活您的邮箱:</p>' \'<p><a href="%s">%s<a></p>' % (validated_data['email'], verify_url, verify_url)# 异步发送邮件send_email(subject, validated_data['email'], html_message)# 往用户邮箱中发送验证信息return instance
  • apps/users/urls下添加子路由
urlpatterns = [url(r"^email/$", views.UserUpdateView.as_view()),
]

<7>实现邮箱验证

  • 在apps/users/views/下添加EmailVerifyView视图类
from rest_framework.views import APIView
from itsdangerous import TimedJSONWebSignatureSerializer as TJSSclass EmailVerifyView(APIView):"""用户邮箱信息验证"""def get(self,request):# 1、从前端获取tokentoken = request.query_params.get('token')# 2、检查数据tjss = TJSS(settings.SECRET_KEY, 300)try:data = tjss.loads(token)except:return Response({'error':'token无效'})# 3、查询用户数据username = data.get('username')user = User.objects.get(username=username)# 4、修改用户邮箱状态user.email_activate = Trueuser.save()# 5返回结果return Response({'message':True})
  • 添加子路由
urlpatterns = [url(r"^emails/verification/$", views.EmailVerifyView.as_view()),
]

3、管理收货地址

<1>创建注册应用,创建模型类

  • 在meiduo_mall/apps创建areas应用
python ../../manage.py startapp areas
  • 注册应用,创建模型类
from django.db import models# Create your models here.
class Area(models.Model):"""行政区划"""name = models.CharField(max_length=20, verbose_name='名称')parent = models.ForeignKey('self', on_delete=models.SET_NULL, related_name='subs', null=True, blank=True, verbose_name='上级行政区划')class Meta:db_table = 'tb_areas'verbose_name = '行政区划'verbose_name_plural = '行政区划'def __str__(self):return self.name

  • 进行数据库迁移
python manage.py makemigrations
python manage.py migrate
  • 导入地区信息数据
mysql -u root -p meiduo32 < /home/python/Desktop/temp/美商城资料/省市区数据/areas.sql
  • 缓存使用配置(settings/dev)
# DRF扩展
REST_FRAMEWORK_EXTENSIONS = {# 缓存时间'DEFAULT_CACHE_RESPONSE_TIMEOUT': 60 * 60,# 缓存存储'DEFAULT_USE_CACHE': 'default',
}

<2>省市区地址联动功能

  • 在areas/views实现省市区地址联动视图类的实现
from rest_framework.generics import ListAPIView
from rest_framework_extensions.cache.decorators import cache_response
from rest_framework_extensions.cache.mixins import CacheResponseMixin
from areas.models import Area
from areas.serializers import AreaSerializer# 通过继承扩展类实现使用缓存,推荐使用
class AreaView(CacheResponseMixin,ListAPIView):"""获取省份信息"""queryset = Area.objects.filter(parent=None)serializer_class = AreaSerializerclass Area1View(ListAPIView):"""获取市/区信息"""    serializer_class = AreaSerializer# 缓存的使用需要装饰器装饰在定义的方法上# @cache_response(timeout=60*60, cache='default')def get_queryset(self):pk = self.kwargs['pk']return Area.objects.filter(parent_id=pk)
  • AreaSerializer序列化器实现
from rest_framework import serializers
from areas.models import Areaclass AreaSerializer(serializers.ModelSerializer):class Meta:model = Areafields = '__all__'
  • 注册路由
# 注册子路由 areas/urls
from django.conf.urls import url
from areas import viewsurlpatterns = [url(r'^areas/$', views.AreaView.as_view()),url(r'^areas/(?P<pk>\d+)/$', views.Area1View.as_view()),
]
# 注册主路由 meiduo_mall/urls
from areas.urlsurlpatterns = [url(r'^', include(areas.urls)),
]

<3>用户地址管理功能实现

  • 创建收货地址管理表,apps/users/models
# 创建地址管理表
class Address(BaseModel):"""用户地址"""user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='addresses', verbose_name='用户')title = models.CharField(max_length=20, verbose_name='地址名称')receiver = models.CharField(max_length=20, verbose_name='收货人')province = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='province_addresses', verbose_name='省')city = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='city_addresses', verbose_name='市')district = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='district_addresses', verbose_name='区')place = models.CharField(max_length=50, verbose_name='地址')mobile = models.CharField(max_length=11, verbose_name='手机')tel = models.CharField(max_length=20, null=True, blank=True, default='', verbose_name='固定电话')email = models.CharField(max_length=30, null=True, blank=True, default='', verbose_name='电子邮箱')is_deleted = models.BooleanField(default=False, verbose_name='逻辑删除')class Meta:db_table = 'tb_address'verbose_name = '用户地址'verbose_name_plural = verbose_nameordering = ['-update_time']
# 给用户表添加默认地址字段
class User(AbstractUser):...default_address = models.ForeignKey('Address', related_name='users', null=True, blank=True,on_delete=models.SET_NULL, verbose_name='默认地址')...
  • 数据库迁移
python manage.py makemigrations
python manage.py migrate

  • 创建AddressesView视图类完成新增地址的保存(apps/areas/views)
class AddressesView(CreateAPIView, ListAPIView):"""保存新增地址"""serializer_class = AddressesSerializer
  • 定义AddressesSerializer序列化器
class AddressesSerializer(serializers.ModelSerializer):# 显示指定字段city_id = serializers.IntegerField(min_value=1, write_only=True)district_id = serializers.IntegerField(min_value=1, write_only=True)province_id = serializers.IntegerField(min_value=1, write_only=True)district = serializers.StringRelatedField(read_only=True)province = serializers.StringRelatedField(read_only=True)city = serializers.StringRelatedField(read_only=True)class Meta:model = Addressexclude = ('user',)# 验证手机号格式def validate_mobile(self,value):if not re.match(r'^1[3-9]\d{9}$', value):raise serializers.ValidationError('手机号格式不正确')return value# 保存新增地址def create(self,validated_data):user = self.context['request'].user# 需要在验证后数据中添加uservalidated_data['user'] = user# 使用父类保存方法address = super().create(validated_data)return address
  • 注册子路由(apps/areas/urls)
urlpatterns = [url(r'^addresses/$', views.AddressesView.as_view()),
]

  • 修改AddressesView视图类完成地址的查询
class AddressesView(CreateAPIView, ListAPIView):"""保存新增地址"""serializer_class = AddressesSerializer# queryset = Address.objects.filter(user=request.user)# 重写get_queryset获取指定内容def get_queryset(self):return Address.objects.filter(user=self.request.user, is_deleted=False)def list(self, request, *args, **kwargs):queryset = self.filter_queryset(self.get_queryset())serializer = self.get_serializer(queryset, many=True)return Response({"addresses":serializer.data})

  • 修改AddressesView视图类完成地址的更新
class AddressesView(CreateAPIView, ListAPIView, UpdateAPIView):...
  • 注册子路由
urlpatterns = [url(r'^addresses/(?P<pk>\d+)/$', views.AddressesView.as_view()),
]

---------python

  • 修改AddressesView视图类完成地址的删除
class AddressesView(CreateAPIView, ListAPIView, UpdateAPIView, DestroyAPIView):"""保存新增地址"""serializer_class = AddressesSerializer# queryset = Address.objects.filter(user=request.user)# 重写get_queryset获取指定内容def get_queryset(self):return Address.objects.filter(user=self.request.user, is_deleted=False)# 地址查询操作def list(self, request, *args, **kwargs):queryset = self.filter_queryset(self.get_queryset())serializer = self.get_serializer(queryset, many=True)return Response({"addresses":serializer.data})# 地址删除操作def destroy(self, request, *args, **kwargs):instance = self.get_object()instance.is_deleted = Trueinstance.save()return Response(status=status.HTTP_204_NO_CONTENT)

十二、用户中心(用户部分)相关推荐

  1. [原]Jenkins(十二)---jenkins管理员用户无法登陆解决办法Access Denied

    /** * lihaibo * 文章内容都是根据自己工作情况实践得出. *如有错误,请指正 * 版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horiz ...

  2. Android Studio TV开发教程(十二)帮助用户在电视上找到您的内容

    Android Studio TV开发教程 (转自Android官网https://developer.android.com/training/tv/start) 文章源自:光谷佳武 https:/ ...

  3. 美多商城之用户中心(用户基本信息)

    一.用户基本信息 1.1用户基本信息逻辑分析 1. 用户基本信息逻辑分析 以下是要实现的后端逻辑 用户模型补充email_active字段 查询并渲染用户基本信息 添加邮箱 发送邮箱验证邮件 验证邮箱 ...

  4. 现代软件工程 第十二章 【用户体验】练习与讨论

    1  什么是用户体验, 什么时候开始考虑用户体验? 究竟什么是用户体验呢? 请看: http://www.infoq.com/articles/aaron-sanders-user-experienc ...

  5. 实验十二 团队项目用户验收评审

    任务1:团队作业Beta冲刺 Beta冲刺-第一天 Beta冲刺-第二天 Beta冲刺-第三天 Beta冲刺-第四天 任务2:项目如果是有价值的,有可能有团队会继续开发你的项目,到时候会不会出现源代码 ...

  6. C++搭建集群聊天室(十二):用户单聊及离线消息处理功能实现

    单聊 单聊功能其实很简单的,就是数据包的发送,接收. public.h 现状: #ifndef PUBLIC_H_ #define PUBLIC_H_enum EnMsgType{LOGIN_TYPE ...

  7. 亿级高并发电商项目-- 实战篇 --万达商城项目 十二(编写用户服务、发送短信功能、发送注册验证码功能、手机号验证码登录功能、单点登录等模块)

  8. 用户中心 用户管理系统

    目录 企业做项目的流程 需求分析 技术选型 3种初始化Java 项目的方式 数据库设计 什么是数据库?存数据的数据库里有什么? 什么是设计数据库表? 用户表设计 自动生成器的使用 注册逻辑设计 登录功 ...

  9. 用户中心--需求分析

    接口分析 账号发布接口 每天该租户下所有:账号姓名 audit_log:user_id.tenant_name 在audit_log取出user_id集合通过tenant,创建时间 每天该租户下所有: ...

  10. RHEL4- WEB服务(十二)用户访问apache服务器认证

    RHEL4- WEB服务(十二)用户访问apache服务器认证   有些时候网站上的内容不是希望所有的用户都可以访问,由于网页内容性质的不同,会对来访的用户有所分类,网站的提供方希望部分网页内容只提供 ...

最新文章

  1. 递归调用(Java)
  2. Java类加载器( 死磕9)
  3. underscore api
  4. opencv 光线影响_在OpenCV中使用色彩校正
  5. Android usb audio信息获取(一)
  6. 人工智能:模型与算法2搜索求解之启发式搜索
  7. sql中的字符串拼接
  8. 2022年的1024程序员节有啥好玩的小游戏推荐?
  9. 2017 年终总结 --- 忙碌而又颇有意义的一年
  10. hibernate 一对多查询 对多的一方进行分页
  11. 如何从GitHub中下载别人的代码
  12. Prior to Segment: Foreground Cues for Weakly Annotated Classes in Partially Supervised Inseg
  13. x265工程简介、编译、调试测试
  14. Oh My Zsh和Oh My Posh
  15. 互联网食堂大比拼,谁才是互联网养猪场?
  16. 简洁天气预报小程序实现
  17. Win10应用图标变白块修复桌面白图标
  18. java加redis锁
  19. LeetCode1-540题汇总,希望对你有点帮助!
  20. crontab命令详细介绍教程,快来围观

热门文章

  1. 产品经理看AIGC--GAN(生成对抗网络)白话原理
  2. 中职计算机教师学期发展计划,中职计算机教师工作计划.docx
  3. 创建一个表单:个人信息注册页面
  4. D55XT80-ASEMI大功率三相整流桥55A 800V
  5. 快递单号查询、倒计时和发送短信效果
  6. 木浪云融合数据管理免费版之初体验
  7. 360如何设置远程连接到服务器,惠普服务器360 G8 ilo远程管理口怎么远程安装服务器系统...
  8. html_常用标签_盒子标签_图片标签_超链接_列表标签(2)
  9. laravel 集成采集_php laravel 万能采集器
  10. Android 屏幕 长虹电视,【沙发管家】长虹智能电视多屏互动使用教程