美文网首页Python全栈技术
django项目-电商平台(2)-用户模块

django项目-电商平台(2)-用户模块

作者: 伍只蚊 | 来源:发表于2017-07-16 00:56 被阅读519次

    用户模块概述

    用户模块主要为用户的模型类,用户的信息,用户的登录与注册,登录验证,用户中心视图几部分

    1. 建立模型类

    class User(models.Model):
        uname = models.CharField(max_length=20)
        upwd = models.CharField(max_length=40)
        uemil = models.CharField(max_length=30)
        urelname =models.CharField(max_length=20,default='')
        uadr = models.CharField(max_length=100,default='')
        uphone = models.CharField(max_length=11,default='')
    

    建立模型后要进行数据库迁移

    2. 建立视图函数,在view.py里建

    1. 首先是登录和注册的视图函数
    def login(request):
    
        uname = request.COOKIES.get('uname','')
    
        pwd = request.COOKIES.get('upwd','')
    #用来获取cookie里的用户名和密码,实现自动填写信息
        context = {'uname': uname,
                   'pwd': pwd,
                   'error': 0}
        try:
            url = request.META['HTTP_REFERER']
            #获取头部的 来源地址
        except:url = '/'
        response = render(request, 'df_user/login.html', context)
        #将请求的url存入cookie,然后登陆后跳回原来的地方
        # render方法返回httpesponse方法
        response.set_cookie('url', url)
        # 在esponse里写入cookie
        return response
        
    def register(request):
        return render(request, 'df_user/register.html')
    
    1. 登录和注册的处理函数
      用来处理登录和注册的表单提交 ,以及数据的存取数据库操作,还有向cookie的写入操作
    
    def login_handle(request):
        # 接收表单数据
        post = request.POST
        uname = post.get('username')
        upwd1 = post.get('pwd')
        # 设置默认值
        remember = post.get('remember', '0')
    
        # 加密
        s1 = sha1()#创建sha1对象
        s1.update(upwd1.encode('utf8'))#要先编码
        upwd = s1.hexdigest()
        # 验证用户是否正确
        user = User.objects.filter(uname=uname).filter(upwd=upwd).first();
    
        if user:
    
            url = request.COOKIES.get('url', '/')  # 第二个参数为默认参数,如果url没有,则条首页
            red = HttpResponseRedirect(url)
            # 如果记住密码则将用户名和密码写入cookies
            if remember == '1':
    
                red.set_cookie('uname', user.uname)
                red.set_cookie('upwd', upwd1)
    
            else:
                red.set_cookie('uname', '',max_age=-1)
                red.set_cookie('upwd', '',max_age=-1)
                #也应该写入session,会安全一点
                # request.COOKIES['userinfo']=[user.uname,user.upwd]
                #将uname和id写入session用来保持登录状态
            request.session['username'] = uname
            request.session['uid'] = user.id
            return red
    
        else:
            #如果没有用户,怎返回错误参数,模板界面,根据错误信息给出提示
            context = {'error': 1,
                       'uname': uname}
            return render(request, 'df_user/login.html', context)
        
            
            
    
    def register_handle(request):
        # 接收用户输入
        post = request.POST
        uname = post.get('user_name')
        pwd = post.get('pwd')
        cpwd = post.get('cpwd')
        uemail = post.get('email')
        # allow = post.get('allow')
        # 判断密码是否相等
        if pwd != cpwd:
            return redirect('/user/register')
        # 密码加密
        # 使用sha1加密
        s1 = sha1()
        # sha1加密前,要先编码为比特
        s1.update(pwd.encode('utf8'))
        pwd = s1.hexdigest()
        # 存入数据库
        user = User()
        user.uname = uname
        user.upwd = pwd
        user.uemil = uemail
        user.save()
        print(user.uname)
        return redirect('/user/login')
    
    1. 在注册的时候需要验证,,用户名是否存在,这里用ajax发送异步请求来判断是否存在相同用户名
    js部分
    function check_user_name(){
            var len = $('#user_name').val().length;
    
            if(len<5||len>20)
            {
                $('#user_name').next().html('请输入5-20个字符的用户名')
                $('#user_name').next().show();
                error_name = true;
            }
            else
                // 发送ajax请求,检查用户名是存在
            // {    alert('准备发送请求');
                $.get('/user/register_exist?uname='+$('#user_name').val(),function (data) {
                // alert('count'+data.count);
                if(data.count!=0){
                    $('#user_name').next().html('用户名已经存在');
                    //显示错误信息
                    $('#user_name').next().show();
                    error_name = true;
                }else {
                    $('#user_name').next().hide();
                error_name = false;}
    
    
            })
    
            }
        ;
    

    处理函数

    def register_exist(request):
        uname = request.GET.get('uname')  # 通过url传参的方式
        count = User.objects.filter(uname=uname).count()
        # print(count)
        # 返回json字典,判断是存在,
        return JsonResponse({'count': count})
    
    1. 注销
    def logout(request):
        request.session.flush()  # 清空所有session
        return redirect('/')
    
    1. 登录验证,很多页面如个人中心,购物车等都需要在进入视图前进行用户是否登录的验证,这正符合 装饰器 的用法,用装饰器完成登录验证
    def login(func):
        def login_fun(request,*args,**kwargs):
            if request.session.has_key('username'):
                #如果成功登录,继续执行 原函数
                return func(request,*args,**kwargs)
            else:
                red = HttpResponseRedirect('/user/login')
                #将当前页的url存入cookie
    
                red.set_cookie('url',request.get_full_path())
    
                return red
        return login_fun
        
        
        
        
        
        
        
        
        
        使用时只需要在视图函数前加上装饰器即可,方便
    @user_decorator.login
    def user_center_info(request):
        pass
    
    1. 个人信息中心,用来展示自己的信息
    @user_decorator.login  #用验证装饰器
    def user_center_info(request):
        username = request.session.get('username')
        user = User.objects.filter(uname=username).first()
    
        #获取最近浏览的商品
        goodids = request.COOKIES.get('goodids','')#获得 cookie存的记录
        if goodids != '':
            goodidsl = goodids.split(',')#拆分为列表
    
            #这样查询可以的到所需商品,但顺序无法维护,无法为原先设定顺序
            # GoodInfo.objects.filter(id__in=goodids)
            goods_list = []#用来存放 商品列表,并维持顺序不变
            for good_id in goodidsl:
                goods = GoodInfo.objects.filter(pk=good_id).first()
                goods_list.append(goods)
        else:
            goods_list = []
    
    #其实可以直接传user对象
        context = {'title': '用户中心', 'username': username, 'phone': user.uphone, 'adress': user.uadr,
                    'good_list':goods_list,'tag':1}  #tag用来标记 高亮页
        return render(request, 'df_user/user_center_info.html', context)
        
    

    8.个人信息的收货地址页,显示地址信息和修改信息

    def user_center_site(request):
        username = request.session.get('username')
        user = User.objects.filter(uname=username).first()
        if request.method == 'POST':  #当post的时候修改数据
            adr = request.POST.get('area')
            username = request.POST.get('user')
            phone = request.POST.get('phone')
            user.uadr = adr
            user.uphone =phone
            user.urelname = username
            user.save()
        context = {'adr':user.uadr,
                   'user':user.urelname,
                   'phone':user.uphone,
                   'tag':3}
        return render(request,'df_user/user_center_site.html',context)
    

    还有一个个人的订单页面,在订单模块讲

    3. 在模板里建立相应的模板,并填充数据

    4. 配置相应的url

    在user应用下建立urls.py文件,然后在主目录下的urls里这样配置

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^user/', include('df_user.urls',namespace='user')),
        url(r'^', include('df_goods.urls',namespace='goods')),
        url(r'^cart/',include('df_cart.urls')),
        url(r'^order/',include('df_order.urls')),
        url(r'^search/', include('haystack.urls')),
    ]
    

    然后在对应的应用下的urls里配置`

    from django.conf.urls import url
    from . import views
    urlpatterns =[
        url(r'^register$',views.register),
        url(r'^register_handle$',views.register_handle),
        url(r'^login$',views.login),
        url(r'^login_handle$',views.login_handle),
        url(r'^user_center_info$',views.user_center_info),
        url(r'^user_center_site$',views.user_center_site),
        url(r'^user_center_order/(\d+)$',views.user_center_order),
        url(r'^logout$',views.logout),
        url(r'^register_exist$',views.register_exist),
    
    ]
    

    到这里用户模块基本完成了

    相关文章

      网友评论

        本文标题:django项目-电商平台(2)-用户模块

        本文链接:https://www.haomeiwen.com/subject/acxtkxtx.html