用Django框架完成一个相对完善的一个手机商城(一)

用Django框架完成一个相对完善的一个手机商城

这是一个很久之前我写的一个了,这些顺序不对,从哪入手开始做这个项目还是得看个人的思想,本着学习的态度,希望可以得到交流,相互学习,互相进步。

  • 首先我们要规划一下要完成那些内容,这个网站我们要做成一个B2C模式的一个电商网站,所以要有前台和后台,通俗来讲就是一个商家后台的增删改查,包括对商品和对商城会员(注册登录了的顾客),还有就是前台顾客对商品加入购物车,登录注册,以及个人中心的的一个制作,付款功能需要其他的一些东西所以就不在这展示了
  • 来展示一下我们本次项目的大致结构:主目录下的
    这里解释一下前边的myadmin和myhome是存放网站后台的代码,而后边的写的是前台界面。
  • 我们首先要做的是写一个后来的用户管理添加数据,这就需要在视图里
from django.shortcuts import render
from django.http import HttpResponse,JsonResponse

from django.contrib.auth.hashers import make_password, check_password
from .. models import Users

from web.settings import BASE_DIR

import os


# Create your views here.
# 用户模型的管理

# 会员列表
def user_index(request):

    # 获取所有用户数据
    data = Users.objects.all()

    # 获取搜索条件
    types = request.GET.get('types',None)
    keywords = request.GET.get('keywords',None)
    # 判断是否搜索
    if types == 'all':
        from django.db.models import Q
        data = data.filter(Q(id__contains=keywords)|Q(nikename__contains=keywords)|Q(phone__contains=keywords)|Q(email__contains=keywords))
    elif types :
        search = {types+'__contains':keywords}
        data = data.filter(**search)

    # 导入分页类
    from django.core.paginator import Paginator
    # 实例化分页类
    p = Paginator(data, 10)
    # 获取当前的页码数
    pageindex = request.GET.get('page',1)
    # 获取当前页的数据
    userlist = p.page(pageindex)
    # 获取所有的页码
    # pages = p.page_range
    # pages = p.num_pages

    # 分配数据
    context = {'userlist':userlist}

    # 加载模板
    return render(request,'myadmin/users/index.html',context)


# 会员添加表单
def user_add(request):
    return render(request,'myadmin/users/add.html')

# 会员执行添加
def user_insert(request):
    # 接收表单数据
    data = request.POST.dict()
    data.pop('csrfmiddlewaretoken')

    # 处理密码 加密
    data['password'] = make_password(data['password'], None, 'pbkdf2_sha256')

    # 头像上传
    # 接收上传的文件
    myfile = request.FILES.get('pic',None)
    if not myfile:
        # 没有选择头像上传,
        return HttpResponse('<script>alert("没有选择头像上传");history.back(-1);</script>')

    # 处理头像的上传  1.jpg ==> [1,jpg]
    data['pic_url'] = uploads_pic(myfile)
    
    try:
        # 创建模型,添加数据
        ob = Users(**data)
        ob.save()
        return HttpResponse('<script>alert("添加成功");location.href="/myadmin/user/index/";</script>')
    except:
        pass
    return HttpResponse('<script>alert("添加失败");history.back(-1);</script>')


# 会员编辑
def user_edit(request):
    # 接受会员id
    uid = request.GET.get('uid')
    # 获取当前会员对象
    ob = Users.objects.get(id=uid)

    # 判断当前的请求方式
    if request.method == 'POST':
        # 判断密码是否更新
        if request.POST.get('password',None):
            # 更新密码
            ob.password = make_password(request.POST['password'], None, 'pbkdf2_sha256')

        # 判断头像是否更新
        myfile = request.FILES.get('pic',None)
        if myfile:
            # 如果有新头像上传,则先删除原头像图片,
            os.remove(BASE_DIR+ob.pic_url)
            # /static/uploads/1545033786.7237682.png
            # ./static/uploads/1545033786.7237682.png
            # /home/yc/py16/py16-project/web
            # 在上传新的头像
            ob.pic_url = uploads_pic(myfile)

        # 更新其它字段
        ob.nikename = request.POST.get('nikename')
        ob.email = request.POST.get('email')
        ob.phone = request.POST.get('phone')
        ob.age = request.POST.get('age')
        ob.sex = request.POST.get('sex')
        ob.save()
        return HttpResponse('<script>alert("更新成功");location.href="/myadmin/user/index/";</script>')


    else:
        # 显示编辑表单
        context = {'uinfo':ob}
        return render(request,'myadmin/users/edit.html',context)



# 会员状态的更新
def user_set_status(request):
    # 通过uid获取当前会员对象
    ob = Users.objects.get(id=request.GET.get('uid'))
    ob.status = request.GET.get('status')
    ob.save()
    return JsonResponse({'msg':'状态更新成功','code':0})


# 头像上传的处理代码
def uploads_pic(myfile):
    try:
        import time
        filename = str(time.time())+"."+myfile.name.split('.').pop()
        destination = open(BASE_DIR+"/static/uploads/"+filename,"wb+")
        for chunk in myfile.chunks():# 分块写入文件  
            destination.write(chunk)  
        destination.close()
        return '/static/uploads/'+filename
    except:
        return False

  • 接着展示一下商品的后台代码
from django.shortcuts import render
from django.http import HttpResponse

from . CatesViews import get_cates_all
from . UsersViews import uploads_pic

from .. models import Cates,Goods

# Create your views here.

# 商品添加 表单
def goods_add(request):

    # 获取当前所有的分类数据
    data = get_cates_all()
    # 分配数据
    context = {'catelist':data}

    # 显示一个添加的表单
    return render(request,'myadmin/goods/add.html',context)

def goods_insert(request):
    try:
    
        # 接收表单数据
        data = request.POST.dict()
        data.pop('csrfmiddlewaretoken')

        # 处理 分类对象
        data['cateid'] = Cates.objects.get(id=data['cateid'])
        # 判断是否有图片上传
        myfile = request.FILES.get('pic',None)
        if not myfile:
            return HttpResponse('<script>alert("必须上传商品图片");history.back(-1);</script>')
        # 处理  上传的文件
        data['pic_url'] = uploads_pic(myfile)

        # 执行添加
        ob = Goods(**data)
        ob.save()
        
        return HttpResponse('<script>alert("商品添加成功");location.href="/myadmin/goods/index/";</script>')
    except:
        pass

    return HttpResponse('<script>alert("商品添加失败");history.back(-1);";</script>')



def goods_index(request):
    
    # 获取所有的商品对象
    data = Goods.objects.all()


    # 分配数据
    context = {'goodslist':data}

    # 加载模板
    return render(request,'myadmin/goods/index.html',context)
    


  • 那么下面有了商品,必然需要商品分类
from django.shortcuts import render
from django.http import HttpResponse,JsonResponse
from django.core.urlresolvers import reverse

# Create your views here.
from .. models import Cates

# 封装函数.格式化获取分类数据
def get_cates_all():
    # 获取所有的分类
    # data = Cates.objects.all()
    # select *,concat(path,id) as paths from myadmin_cates order by paths;
    data = Cates.objects.extra(select = {'paths':'concat(path,id)'}).order_by('paths')
    # 处理数据的顺序,缩进,及父级名
    for x in data:
        l = x.path.count(',')-1 # 0,1,2,
        x.sub = l*'|----'
        if x.pid == 0:
            x.pname = '顶级分类'
        else:
            pob = Cates.objects.get(id=x.pid)
            x.pname = pob.name
        # print(x.name,l)
    return data

# 分类 列表
def cate_index(request):
    # 获取数据
    data = get_cates_all()
    # 分配数据
    context = {'catelist':data}
    # 加载模板
    return render(request,'myadmin/cates/index.html',context)

# 分类 添加
def cate_add(request):
    if request.method == 'POST':
        # 接受数据
        data = {}
        data['name'] = request.POST.get('name')
        data['pid'] = request.POST.get('pid')

        # 判断是否为顶级分类
        if data['pid'] == '0':
            data['path'] = '0,'
        else:
            # 获取当前父级的path路径,
            pob = Cates.objects.get(id=data['pid'])
            # 拼接当前数据的path
            data['path'] = pob.path+data['pid']+','

        # 数据 入库
        ob = Cates(**data)
        ob.save()

        return HttpResponse('<script>alert("添加成功");location.href="'+reverse('myadmin_cate_index')+'";</script>')

    else:
        # 显示表单

        # 获取当前已有的 分类
        catelist = get_cates_all()
        # 分配数据
        context = {'catelist':catelist}
        # 加载一个模板
        return render(request,'myadmin/cates/add.html',context)


# 分类删除
def cate_del(request):
    cid = request.GET.get('cid')
    # 判断当前分类下是否还有子类
    res = Cates.objects.filter(pid=cid).count()
    if res:
        # 有子类
        return JsonResponse({'msg':'当前类下有子类,不能删除','code':1})

    # 判断当前分类下是否有商品发布


    # 执行删除
    ob = Cates.objects.get(id=cid)
    ob.delete()
    return JsonResponse({'msg':'删除成功','code':0})


# 分类 名字修改
def cate_edit(request):
    try:
        # 获取 参数
        cid = request.GET.get('cid')
        newname = request.GET.get('newname')

        # 获取对象
        ob = Cates.objects.get(id=cid)
        ob.name = newname
        # 修改属性
        ob.save()
        data = {'msg':'更新成功','code':0}
    except:
        data = {'msg':'更新失败','code':1}

    # 返回结果
    return JsonResponse(data)






  • 后台是不可以随便登录的,所以我们要写一个登录退出的界面
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.

def index(request):
    
    return render(request,'myadmin/index.html')



# 登录页
def myadmin_login(request):
    
    # 加载页面
    return render(request,'myadmin/login.html')

# 处理登录
def myadmin_dologin(request):

    # 检测验证是否正确
    if request.session.get('verifycode').upper() != request.POST.get('vcode').upper():
        return HttpResponse('<script>alert("验证码错误");location.href="/myadmin/login/"</script>')
    

    # 判断用户名是否存在,检验密码是否正确
    if request.POST['username'] == 'admin' and request.POST['password'] == '123456':
        # 成功,把用户信息记录在session中
        request.session['AdminUser'] = {'username':'admin','uid':10}
        return HttpResponse('<script>alert("欢迎登录");location.href="/myadmin/"</script>')


    return HttpResponse('<script>alert("账号或密码错误");location.href="/myadmin/login/"</script>')

# 退出登录
def myadmin_logout(request):
    
    del request.session['AdminUser']

    return HttpResponse('<script>alert("退出成功");location.href="/myadmin/login/"</script>')





# 验证码
def verifycode(request):
    #引入绘图模块
    from PIL import Image, ImageDraw, ImageFont
    #引入随机函数模块
    import random
    #定义变量,用于画面的背景色、宽、高
    bgcolor = (random.randrange(20, 100), random.randrange(
        20, 100), 255)
    width = 100
    height = 25
    #创建画面对象
    im = Image.new('RGB', (width, height), bgcolor)
    #创建画笔对象
    draw = ImageDraw.Draw(im)
    #调用画笔的point()函数绘制噪点
    for i in range(0, 100):
        xy = (random.randrange(0, width), random.randrange(0, height))
        fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
        draw.point(xy, fill=fill)
    #定义验证码的备选值
    str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
    # str1 = '123456789'
    #随机选取4个值作为验证码
    rand_str = ''
    for i in range(0, 4):
        rand_str += str1[random.randrange(0, len(str1))]
    #构造字体对象
    font = ImageFont.truetype('STFANGSO.TTF', 23)
    #构造字体颜色
    fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
    #绘制4个字
    draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)
    draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)
    draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)
    draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)
    #释放画笔
    del draw
    #存入session,用于做进一步验证
    request.session['verifycode'] = rand_str
    #内存文件操作
    import io
    buf = io.BytesIO()
    #将图片保存在内存中,文件类型为png
    im.save(buf, 'png')
    #将内存中的图片数据返回给客户端,MIME类型为图片png
    return HttpResponse(buf.getvalue(), 'image/png')

  • 以上还有个有意思的验证码代码,这个需要的小伙伴可以直接使用
  • 在下面的的是订单管理的,因为是后台商家看的,所以写一个后台展示的
from django.shortcuts import render,reverse
from django.http import HttpResponse,Http404,JsonResponse

from .. models import Order,OrderInfo



#订单列表
def order_index(request):
	

	#获取所有订单
    orderdata = Order.objects.all()
    print(orderdata)

	# 分配数据
    context = {'orderdata':orderdata}

    # 加载模板
    return render(request,'myadmin/order/index.html',context)
  • 目前就先展示这些个后台的一些代码,后台的实现前端界面代码就先不展示了,等着这些一些前后台交互的写完了,后面的会陆续给大家分享出来,欢迎大家批评指正。
发布了1 篇原创文章 · 获赞 4 · 访问量 91

猜你喜欢

转载自blog.csdn.net/qq_43674608/article/details/104424729
今日推荐