栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

用户中心功能实现

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用户中心功能实现

用户中心功能 后端

创建模型类
生成迁移文件进行迁移

#收获地址users
class Addr(models.Model):
    name=models.CharField(max_length=16,verbose_name='收货人')
    tel=models.CharField(max_length=16,verbose_name='手机号')
    addr=models.CharField(max_length=200,verbose_name='收获地址')
    is_default=models.BooleanField(default=False,verbose_name='默认地址')
    user=models.ForeignKey(User,on_delete=models.CASCADE,verbose_name='用户')
    class Meta:
        verbose_name='用户地址'
        verbose_name_plural=verbose_name
    def __str__(self):
        return '(%s)-%s'%(self.name,self.user)

获取用户信息,收货地址信息,添加/修改/删除地址信息

#获取用户信息
class Userinfoview(APIView):
    #获取用户信息及用户的地址信息
    def get(self,request):
        user=request.META.get('USER')
        if not user:
            return Response({
                'code':400,
                'msg':'用户未登录'
            })
        user_id=user['user_id']
        user_info=User.objects.filter(id=user_id).first()
        addr_list=user_info.addr_set.all()
        addr_all=[]
        #用户的收获地址信息
        for i in addr_list:
            addr_all.append({
                'id':i.id,
                'name':i.name,
                'tel':i.tel,
                'addr':i.addr,
                'is_default':i.is_default
            })
        return Response({
            'code':200,
            'msg':'获取成功',
            'user':{
                'username':user_info.username,
                'mobile':user_info.mobile,
                'addr':addr_all
            }
        })
    #修改地址信息
    def put(self,request):
        user = request.META.get('USER')
        if not user:
            return Response({
                'code': 400,
                'msg': '用户未登录'
            })
        user_id = user['user_id']
        mobile=request.data.get('mobile')
        addrs=request.data.get('addrs')
        #获取一下用户信息
        user_info=User.objects.filter(id=user_id).first()
        if user_info.mobile !=mobile:
            user_info.mobile=mobile
            user_info.save()
        #修改地址,首先得获取到地址
        addr_all=user_info.addr_set.all()
        for i in addr_all:
            for j in addrs:
                #两个id不一致,不需要比对
                if i.id != j['id']:
                    continue
                #只有当两个一致的时候,才需要比对是否发生修改
                if j['name']!=i.name:
                    i.name=j['name']
                if j['tel']!=i.tel:
                    i.tel=j['tel']
                if j['addr']!=i.addr:
                    i.addr=j['addr']
                if j['tel']!=i.tel:
                    i.tel=j['tel']
                i.save()
        return Response({
            'code':200,
            'msg':'修改成功'
        })
#收货地址
class Addrview(APIView):
    #添加收货地址
    def post(self,request):
        user = request.META.get('USER')
        if not user:
            return Response({
                'code': 400,
                'msg': '用户未登录'
            })
        user_id = user['user_id']
        user_info=User.objects.filter(id=user_id).first()
        name=request.data.get('name') #收货人
        tel=request.data.get('tel') #联系方式
        addr=request.data.get('addr') #收货地址
        is_default=request.data.get('is_default') #是否默认地址
        #校验数据
        if (not name) or(not tel) or (not addr):
            return Response({
                'code':400,
                'msg':'请把信息填写完整'
            })
        if is_default:                    #把数据库的所有默认地址全部取消
            Addr.objects.filter(is_default=1).update(is_default=False)
        # 把数据写入到数据库
        Addr.objects.create(
            name=name,tel=tel,addr=addr,is_default=is_default,user=user_info
        )
        return Response({
            'code':200,
            'msg':'地址添加成功'
        })
    #删除收货地址
    def delete(self,request):
        user = request.META.get('USER')
        if not user:
            return Response({
                'code': 400,
                'msg': '用户未登录'
            })
        user_id = user['user_id']
        addr_id=request.data.get('id')
        #通过验证地址id和用户id把符合条件的地址i想你想取出来
        addr_info=Addr.objects.filter(id=addr_id,user_id=user_id).first()
        if not addr_info:
            return Response({
                'code':400,
                'msg':'收获地址不存在'
            })
        addr_info.delete()
        return Response({
            'code':200,
            'msg':'删除地址成功'
        })

配置路由

from django.urls import path
from users import views
urlpatterns = [
    path('info/',views.Userinfoview.as_view()),   #获取用户信息
    path('addr/',views.Addrview.as_view()),   #用户收获地址
]
前端

获取用户信息,收货地址信息,添加/修改/删除地址信息
找到对应的vue组件对对应的功能函数进行配置
例如:User.vue

//router-link被点击时,判断用户是否登录
  // 登录后向后端发送异步请求,获取用户信息
  activated() {
    //   未登录时,弹出登录组件
    if (!this.$store.getters.getUser.userName) {
      this.$store.dispatch("setShowLogin", true);
    }
    // TODO 获取用户信息
    this.$axios.get('/user/info/',{
      'headers':{
        'token':localStorage.getItem('token')
      }
    }).then((result) => {
      if (result.data.code==200){
        this.userInfo.username=result.data.user.username
        this.userInfo.phone=result.data.user.mobile
        this.userInfo.addrs=result.data.user.addr
      }else{
        this.notifyError(result.data.msg)
      }
    }).catch((err) => {
      console.log(err)
    });
  },
  methods: {
    // 修改个人信息
    updateUserInfo() {
      console.log("修改个人信息...");
      // TODO 修改个人信息 收货地址信息
      this.$axios.put('/user/info/',{
        'mobile':this.userInfo.phone,
        'addrs':this.userInfo.addrs,
      },{
        'headers':{
          'token':localStorage.getItem('token')
        },
      }).then((result) => {
        if (result.data.code==200){
          this.notifySucceed(result.data.msg)
        }else{
          this.notifyError(result.data.msg)
        }
      }).catch((err) => {
        console.log(err)
      });
    },
    // 更改个人密码
    updatePassword() {
      console.log("修改个人密码...");
      this.$store.dispatch("setUpdatePw", true);

    },
    deleteAddr(addr_id) {
      // TODO 删除该地址
      console.log("删除ID", addr_id)
      this.$axios.delete('/user/addr/',{
        'headers':{
          'token':localStorage.getItem('token')
        },
        'data':{
          'id':addr_id
        }
      }).then((result) => {
        if (result.data.code==200){
          this.notifySucceed(result.data.msg)
          // 前端移除要删除的地址信息
          for (var i=0;i
            let temp=this.userInfo.addrs[i]
            if(temp['id']==addr_id){
              this.userInfo.addrs.splice(i,1)
            }
          }
        }else{
          this.notifyError(result.data.msg)
        }
      }).catch((err) => {
        console.log(err)
      });
    },
    // 添加地址
    addAddr() {
      console.log("增加地址...");
      // TODO 增加地址
      this.$axios.post('/user/addr/',{
        'name':this.receiver,
        'tel':this.receive_mobile,
        'addr':this.receive_addr,
        'is_default':this.is_default,
      },{
        'headers':{
          'token':localStorage.getItem('token')
        }
      }).then((result) => {
        if (result.data.code==200){
          this.notifySucceed(result.data.msg)
          this.receiver=''
          this.receive_mobile=''
          this.receive_addr=''
          this.is_default=false
        }else{
          this.notifyError(result.data.msg)
        }
      }).catch((err) => {
        console.log(err)
      });
    },
  },
修改用户密码 后端

修改登录用户的密码

#修改用户密码
class Changepwdview(Addrview):
    def put(self,request):
        user = request.META.get('USER')
        if not user:
            return Response({
                'code': 400,
                'msg': '用户未登录'
            })
        user_id = user['user_id']
        old_pwd=request.data.get('opwd')  #旧密码
        pwd=request.data.get('pwd')   #新密码
        pwd_re=request.data.get('pwd_re') #确认新密码
        user_info=User.objects.filter(id=user_id).first()
        if old_pwd!=user_info.password:
            #说明原始的密码输入有问题
            return Response({
                'code':400,
                'msg':'原始密码有问题'
            })
        if pwd!=pwd_re:
            return Response({
                'code':400,
                'msg':'密码输入不一致'
            })
        user_info.password=pwd
        user_info.save()
        return Response({
            'code':200,
            'msg':'修改成功'
        })

配置路由

from django.urls import path
from users import views
urlpatterns = [
    path('pwd/change/',views.Changepwdview.as_view()) #修改用户密码
]
前端

获取用户信息,收货地址信息,添加/修改/删除地址信息
找到对应的vue组件对对应的功能函数进行配置
修改登录用户的密码
例如:UpdatePw.vue

updatePassword() {
      // 通过element自定义表单校验规则,校验用户输入的用户信息
      this.$refs["ruleForm"].validate((valid) => {
        //如果通过校验开始请求后端
        if (valid) {
          // TODO 修改密码
          this.$axios.put('/user/pwd/change/',{
            'opwd':this.LoginUser.originPw,
            'pwd':this.LoginUser.newPw,
            'pwd_re':this.LoginUser.confirmNewPw
          },{
            'headers':{
              'token':localStorage.getItem('token')
            }
          }).then((result) => {
            if (result.data.code==200){
              this.notifySucceed(result.data.msg)
              this.LoginUser.originPw=''
              this.LoginUser.newPw=''
              this.LoginUser.confirmNewPw=''
              this.setUpdatePw=false
            }else{
              this.notifyError(result.data.msg)
            }
          }).catch((err) => {
            console.log(err)
          });
        }
      });
    },
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/948806.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号