django--生鲜商城项目

项目分两个模块:商家模块(seller)和买家模块(buyer)

商家模块:

视图函数:

from django.shortcuts import render, redirect, HttpResponse
from seller import models


# Create your views here.
# 登录装饰器
def login_docorator(func):
    def inner(request):
        username = request.session.get('username')
        if username:
            return func(request)
        else:
            return redirect('/seller/login/')

    return inner


# md5 加密 , 不可逆算法
import hashlib


def pwd_jm(password):
    md5 = hashlib.md5()
    md5.update(password.encode())
    result = md5.hexdigest()
    return result


# 注册功能
def register1(request):
    if request.method == "POST":
        # 1.获取表单提交过来的信息
        username = request.POST.get('username')
        nickname = request.POST.get('nickname')
        password = request.POST.get('password')
        picture = request.FILES.get('picture')
        password = pwd_jm(password)  # 密码加密
        # 2.保存图片
        path = 'static/touxiang/' + picture.name
        with open(path, mode='wb') as f:
            for content in picture.chunks():
                f.write(content)

        # 3.保存数据库
        models.Seller.objects.create(
            name=username,
            nikename=nickname,
            password=password,
            picture='touxiang/' + picture.name
        )
        # 4.重定向登录界面
        return redirect('/seller/login/')
    return render(request, 'seller/register1.html')


# 注册使用form表单
from django import forms
from django.forms import widgets


class RegisterForm(forms.Form):
    username = forms.CharField(
        label='用户名',
        required=True,
        min_length=3,
        widget=widgets.TextInput(attrs={'placeholder': '用户名', 'class': 'layui-input'})
    )
    password = forms.CharField(
        label='密码',
        required=True,
        min_length=3,
        widget=widgets.TextInput(attrs={'placeholder': '密码', 'class': 'layui-input'})
    )
    nikename = forms.CharField(
        label='昵称',
        required=True,
        min_length=3,
        widget=widgets.TextInput(attrs={'placeholder': '昵称', 'class': 'layui-input'})
    )
    picture = forms.CharField(
        label='头像',
        required=True,
        widget=widgets.FileInput(attrs={'placeholder': '头像', 'class': 'layui-input'})
    )


# 优化版的register
import time


def register(request):
    registerform = RegisterForm()
    if request.method == 'POST':
        registerform = RegisterForm(request.POST, request.FILES)  # 校验不同内容和上传内容
        if registerform.is_valid():
            data = registerform.cleaned_data
            username = data.get('username')
            nikename = data.get('nikename')
            password = data.get('password')
            picture = request.FILES.get('picture')
            time_temp = time.time()
            path = 'static/touxiang/' + str(time_temp) + '-' + picture.name
            with open(path, mode='wb') as f:
                for content in picture.chunks():
                    f.write(content)
            password = pwd_jm(password)
            # 保存数据库
            models.Seller.objects.create(
                name=username,
                nikename=nikename,
                password=password,
                picture='touxiang/' + str(time_temp) + '-' + picture.name
            )
            return redirect('/seller/login/')
    return render(request, 'seller/register.html', {'registerform': registerform})


class LoginForm(forms.Form):
    username = forms.CharField(
        label='用户名',
        required=True,
        min_length=3,
        widget=widgets.TextInput(attrs={'placeholder': '用户名', 'class': 'layui-input'})
    )

    password = forms.CharField(
        label='密码',
        required=True,
        min_length=3,
        widget=widgets.PasswordInput(attrs={'placeholder': '密码', 'class': 'layui-input'})
    )


def login(request):
    loginForm = LoginForm()
    error_msg = ''
    if request.method == "POST":
        loginForm = LoginForm(request.POST)
        if loginForm.is_valid():
            data = loginForm.cleaned_data
            username = data.get('username')
            password = data.get('password')
            pwd = pwd_jm(password)
            ret = models.Seller.objects.filter(name=username, password=pwd)
            if ret:
                request.session['username'] = username
                nikename = ret[0].nikename  # 获取昵称
                request.session['nikename'] = nikename
                request.session['seller_id'] = ret[0].id
                return redirect('/seller/index/')
            else:
                error_msg = '用户名或密码错误'
    return render(request, 'seller/login.html', {'error_msg': error_msg})


import datetime


@login_docorator
def index(request):
    times = datetime.datetime.now()
    seller_id = request.session.get('seller_id')
    seller_obj = models.Seller.objects.get(id=seller_id)
    return render(request, 'seller/index.html', {'times': times, "seller_obj": seller_obj})


@login_docorator
def logout(request):
    # 清除session
    request.session.clear()
    # 重定向到登录界面
    return redirect('/seller/login/')


def type_add(request):
    error_msg = ''
    if request.method == 'POST':
        type_name = request.POST.get('type_name')
        if type_name:
            # 查询数据库是否重名
            ret = models.GoodsType.objects.filter(name=type_name)
            if not ret:
                models.GoodsType.objects.create(name=type_name)
                return redirect('/seller/goods_type_list/')
            else:
                error_msg = '此类型已经存在'

    return render(request, 'seller/type_add.html', {'error_msg': error_msg})


# ajax添加验证
from django.http import JsonResponse


def type_add_ajax(request):
    dic = {'status': 'true'}
    # 获取ajax提交过来的内容
    name = request.GET.get('name')
    # 去数据库内查询
    type_obj = models.GoodsType.objects.filter(name=name)
    if type_obj:
        dic['status'] = 'false'
    return JsonResponse(dic)


def goods_add_ajax(request):
    dic = {'status': 'true'}
    # 获取ajax提交过来的内容
    goods_num = request.GET.get('goods_num')
    goods_name = request.GET.get('goods_name')
    # 去数据库内查询
    type_obj = models.Goods.objects.filter(goods_num=goods_num)
    type_obj_name = models.Goods.objects.filter(goods_name=goods_name)
    if type_obj:
        dic['status'] = 'false'
    elif type_obj_name:
        dic['status'] = 'false'
    return JsonResponse(dic)


# 页面展示添加分页
from django.core.paginator import Paginator, EmptyPage


def goods_type_list(request):
    goods_type_obj_list = models.GoodsType.objects.all()
    my_num = 2
    paginator = Paginator(goods_type_obj_list, my_num)
    count = paginator.count
    num_pages = paginator.num_pages
    try:
        current_num = int(request.GET.get('page', 1))
        page_obj = paginator.page(current_num)
    except EmptyPage:
        current_num = int(request.GET.get('page', 1))
        # 当传输的当前页面数大于总页面时,将总页面数赋值给当前页面
        if current_num > num_pages:
            current_num = num_pages
            page_obj = paginator.page(current_num)
        else:
            page_obj = paginator.page(1)
    return render(request, 'seller/type_list.html', locals())


def goods_type_delete(request):
    id = request.GET.get('id')
    models.GoodsType.objects.get(id=id).delete()
    # 获取当前页面 , 删除一个数据后重定向到当前页面
    page = request.GET.get('page')
    return redirect('/seller/goods_type_list/?page=' + page)


def goods_type_change(request):
    if request.method == 'POST':
        name = request.POST.get('type_name')
        queryset_obj = models.GoodsType.objects.filter(name=name)
        if not queryset_obj:
            id = request.POST.get('id')
            goods_type_obj = models.GoodsType.objects.get(id=id)
            goods_type_obj.name = name
            goods_type_obj.save()
            return redirect('/seller/goods_type_list/')
        else:
            # 当修改后的数据是已存在的数据 , 获取当前对象并传回页面回显
            goods_type_obj = queryset_obj[0]
            error = '该商品类型已存在'
            return render(request, 'seller/type_change.html', locals())

    else:
        id = request.GET.get('id')
        goods_type_obj = models.GoodsType.objects.get(id=id)
        return render(request, 'seller/type_change.html', {'goods_type_obj': goods_type_obj})


def goods_add(request):
    if request.method == 'POST':
        goods_num = request.POST.get('goods_num')  # 商品编号
        goods_name = request.POST.get('goods_name')  # 商品名字
        goods_oprice = request.POST.get('goods_oprice')  # 商品原价
        goods_xprice = request.POST.get('goods_xprice')  # 商品现价
        goods_count = request.POST.get('goods_count')  # 库存
        goods_description = request.POST.get('goods_description')  # 商品描述
        userfiles = request.FILES.getlist('userfiles')  # 商品图片
        goods_type_id = request.POST.get('goods_type')  # 商品对应的类型id
        goods_content = request.POST.get('goods_content')  # 商品详情
        goods_obj = models.Goods.objects.create(
            goods_num=goods_num,
            goods_name=goods_name,
            goods_oprice=goods_oprice,
            goods_xprice=goods_xprice,
            goods_kucun=goods_count,
            goods_desc=goods_description,
            goods_details=goods_content,
            types_id=goods_type_id,
            seller_id=request.session.get('seller_id')
        )
        # 获取上传图片
        for image_obj in userfiles:
            time_temp = time.time()
            path = 'static/images/' + str(time_temp) + '_' + image_obj.name  # 路径
            # 将图片保存到后台
            with open(path, mode='wb') as f:
                for content in image_obj.chunks():
                    f.write(content)
            # 将图片路径保存至GoodsImages数据库
            img_address = 'images/' + str(time_temp) + '_' + image_obj.name  # 路径
            goods_image_obj = models.GoodsImages.objects.create(
                img_address=img_address,
                goods_id=goods_obj.id
            )
        return redirect('/seller/goods_list/')
    else:
        # 将所有商品类型传入页面以供选择
        goods_type_obj_list = models.GoodsType.objects.all()
        return render(request, 'seller/goods_add.html', locals())


def goods_list(request):
    # 获取当前登录用户的id 以对应其相关商品信息
    seller_id = request.session.get('seller_id')
    goods_obj_list = models.Goods.objects.filter(seller_id=seller_id).order_by('-id')
    return render(request, 'seller/goods_list.html', locals())


# 删除商品数据的使用OS模块同时删除static里面的图片
import os


def goods_delete(request):
    id = request.GET.get('id')
    goods_obj = models.Goods.objects.get(id=id)
    # 获取图片对象列表 , 将图片从后台删除
    image_obj_list = models.GoodsImages.objects.filter(goods_id=id)
    for image_obj in image_obj_list:
        path = 'static/' + image_obj.img_address.name
        os.remove(path)
    # 删除图片后再删除商品信息 , 因为已设置外键 , 所以数据库同时删除图片的信息
    goods_obj.delete()
    return redirect('/seller/goods_list/')


def goods_change(request):
    if request.method == 'GET':
        id = request.GET.get('id')
        goods_obj = models.Goods.objects.get(id=id)
        goods_type_obj_list = models.GoodsType.objects.all()
        return render(request, 'seller/goods_change.html', locals())
    else:
        id = request.POST.get('id')
        goods_obj = models.Goods.objects.get(id=id)
        goods_num = request.POST.get('goods_num')
        goods_name = request.POST.get('goods_name')
        goods_oprice = request.POST.get('goods_oprice')
        goods_xprice = request.POST.get('goods_xprice')
        goods_count = request.POST.get('goods_count')  # 库存
        goods_description = request.POST.get('goods_description')
        userfiles = request.FILES.getlist('userfiles')  # 商品图片
        goods_type_id = request.POST.get('goods_type')
        goods_content = request.POST.get('goods_content')
        # 修改数据库
        goods_obj.goods_num = goods_num
        goods_obj.goods_name = goods_name
        goods_obj.goods_oprice = goods_oprice
        goods_obj.goods_xprice = goods_xprice
        goods_obj.goods_kucun = goods_count
        goods_obj.goods_desc = goods_description
        goods_obj.goods_type_id = goods_type_id
        goods_obj.goods_details = goods_content
        goods_obj.seller_id = request.session.get('seller_id')
        goods_obj.save()
        # 删图片
        image_obj_list = models.GoodsImages.objects.filter(goods_id=id)
        for image_obj in image_obj_list:
            path = 'static/' + image_obj.img_address.name
            os.remove(path)
        # 单独删除数据库中图片的信息
        image_obj_list.delete()
        for image_obj in userfiles:
            time_temp = time.time()
            path = 'static/images/' + str(time_temp) + '_' + image_obj.name  # 路径
            with open(path, mode='wb') as f:
                for content in image_obj.chunks():
                    f.write(content)
            img_address = 'images/' + str(time_temp) + '_' + image_obj.name  # 路径
            goods_image_obj = models.GoodsImages.objects.create(
                img_address=img_address,
                goods_id=goods_obj.id
            )
        return redirect('/seller/goods_list/')

 

商家模型类:

from django.db import models
from ckeditor.fields import RichTextField
# Create your models here.
#卖家模型类
class Seller(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)#姓名
    nikename = models.CharField(max_length=32)#昵称
    password = models.CharField(max_length=32)#密码
    picture = models.ImageField() # 头像 注意下载pillow
    def __str__(self):
        return ''.format(self.name)

class GoodsType(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)  # 商品类型
    def __str__(self):
        return ''.format(self.name)

class Goods(models.Model):
    goods_num = models.CharField(max_length=32) # 编号
    goods_name = models.CharField(max_length=32) # 商品名称
    goods_oprice = models.DecimalField(max_digits=4,decimal_places=2)# 原价
    goods_xprice = models.DecimalField(max_digits=4,decimal_places=2)# 现价
    goods_kucun = models.IntegerField() # 库存
    goods_desc = models.CharField(max_length=128) # 描述
    goods_details = RichTextField() # 商品详情
    # 建立外键
    types = models.ForeignKey(to='GoodsType',on_delete=models.CASCADE)
    seller = models.ForeignKey(to='Seller',on_delete=models.CASCADE)
    def __str__(self):
        return ''.format(self.goods_name)

class GoodsImages(models.Model):
    img_address = models.ImageField()
    goods = models.ForeignKey(to='Goods',on_delete=models.CASCADE)


买家模型类:

视图函数:

from django.shortcuts import render, HttpResponse, redirect
from seller import models as seller_models
from seller.views import pwd_jm
from buyer import models


# Create your views here.
def index(request):
    # 第一种方法
    goods_obj_list = seller_models.Goods.objects.all()
    return render(request, 'buyer/index.html', {'goods_obj_list': goods_obj_list})
    # 第二种方法以图片为主导
    # goods_image_obj_list = []
    # goods_obj_list = seller_models.Goods.objects.all()
    # for goods_obj in goods_obj_list:
    #     image_obj = goods_obj.goodsimages_set.first()
    #         模型类中图片是CharField就不需要.name , 此处用的是ImageField
    #     image_path = image_obj.img_address.name
    #     dic = {'goods_obj':goods_obj,'image_path':image_path}
    #     goods_image_obj_list.append(dic)
    # return render(request,'buyer/index.html',{'goods_image_obj_list':goods_image_obj_list})


# 展示商品详情
def goods_details(request):
    id = request.GET.get('id')
    goods_obj = seller_models.Goods.objects.get(id=id)
    seller_id = goods_obj.seller_id
    goods_objs = seller_models.Goods.objects.filter(seller_id=seller_id)

    return render(request, 'buyer/goods_details.html', {'goods_obj': goods_obj, 'goods_objs': goods_objs})


# 注册
def register(request):
    buyer_obj = None
    if request.method == "POST":
        # 1.获取表单提交过来的信息
        username = request.POST.get('username')
        password = request.POST.get('userpass')
        password = pwd_jm(password)  # 密码加密
        buyer_obj = models.Buyer.objects.filter(name=username).first()
        if not buyer_obj:
            # 3.保存数据库
            models.Buyer.objects.create(
                name=username,
                password=password,
            )
            # 4.重定向登录界面
            return redirect('/buyer/login/')
        else:
            return render(request, 'buyer/register.html', {'buyer_obj': buyer_obj, 'error_msg': '你咋不改呢'})
    return render(request, 'buyer/register.html')


# 判断是否用户名已注册
from django.http import JsonResponse


def register_ajax(request):
    dic = {'status': 'true'}
    # 获取ajax提交过来的内容
    name = request.GET.get('username')
    # 去数据库内查询
    type_obj = models.Buyer.objects.filter(name=name)
    if type_obj:
        dic['status'] = 'false'
    return JsonResponse(dic)


# 登录
def login(request):
    error_msg = ''
    if request.method == 'POST':
        username = request.POST.get('username')
        userpass = request.POST.get('userpass')
        password = pwd_jm(userpass)
        ret = models.Buyer.objects.filter(name=username, password=password)
        if ret:
            request.session['name'] = ret[0].name
            request.session['buyer_id'] = ret[0].id
            # 后续通过点击购物车若未登录则会返回登录页面,此时获取商品id然后再跳转购物车页面
            goods_id = request.session.get('goods_id')
            if goods_id:
                return redirect('/buyer/car_jump/?id=' + str(goods_id))
            return redirect('/buyer/index/')

            # response = redirect('/buyer/index/')
            # response.set_cookie('name',ret[0].name)
            # return response

        else:
            error_msg = '账户或密码错误'
    return render(request, 'buyer/login.html', {'error_msg': error_msg})


def logout(request):
    username = request.session.get('name')
    if username:
        request.session.clear()

        return redirect('/buyer/login/')
    return redirect('/buyer/login/')


def address_list(request):
    id = request.session.get('buyer_id')
    address_obj_list = models.Address.objects.filter(buyer_id=id)
    return render(request, 'buyer/address_list.html', {'address_obj_list': address_obj_list})


def address_add(request):
    if request.method == 'POST':
        name = request.POST.get('buyer_name')
        address = request.POST.get('buyer_address')
        phone = request.POST.get('buyer_phone')
        id = request.session.get('buyer_id')
        models.Address.objects.create(
            name=name,
            address=address,
            phone=phone,
            buyer_id=id
        )
        return redirect('/buyer/address_list/')

    return render(request, 'buyer/address_add.html')


def address_delete(request):
    id = request.GET.get('id')
    models.Address.objects.get(id=id).delete()
    return redirect('/buyer/address_list/')


def address_change(request):
    if request.method == "GET":
        id = request.GET.get('id')
        address_obj = models.Address.objects.get(id=id)
        return render(request, 'buyer/address_change.html', locals())
    else:
        id = request.POST.get('id')
        name = request.POST.get('buyer_name')
        address = request.POST.get('buyer_address')
        phone = request.POST.get('buyer_phone')
        address_obj = models.Address.objects.get(id=id)
        address_obj.name = name
        address_obj.address = address
        address_obj.phone = phone
        address_obj.save()
        return redirect('/buyer/address_list/')


# 购物车
def car_jump(request):
    buyer_id = request.session.get('buyer_id')
    # 若用户已登录
    if buyer_id:
        # 先登录后添加购物车
        if request.method == 'POST':
            goods_id = request.GET.get('id')  # 此id是从传过来的路由上直接获取
            goods_name = request.POST.get('goods_name')
            goods_price = request.POST.get('goods_xprice')
            goods_img_path = request.POST.get('goods_img_path')
            count = request.POST.get('count')
            buycar_obj = models.Car.objects.filter(goods_id=goods_id, buyer_id=buyer_id).first()
            # 购物车如果有这个商品就增加数量和总价
            if buycar_obj:
                buycar_obj.goods_num += int(count)
                buycar_obj.save()
                all_goods_price = int(count) * float(goods_price)
                return render(request, 'buyer/car_jump.html', locals())
            else:
                models.Car.objects.create(
                    goods_id=goods_id,
                    goods_name=goods_name,
                    goods_price=goods_price,
                    goods_num=count,
                    goods_picture=goods_img_path,
                    buyer_id=buyer_id,
                )
                all_goods_price = int(count) * float(goods_price)
                return render(request, 'buyer/car_jump.html', locals())
        else:
            # 先添加购物车后登录
            goods_id = request.session.get('goods_id')
            count = request.session.get('count')
            goods_name = request.session.get('goods_name')
            goods_price = request.session.get('goods_xprice')
            goods_img_path = request.session.get('goods_img_path')
            # 2. 查询数据库
            buycar_obj = models.Car.objects.filter(goods_id=goods_id, buyer_id=buyer_id).first()
            # 购物车如果有这个商品就增加数量和总价
            if buycar_obj:
                buycar_obj.goods_num += int(count)
                buycar_obj.save()
                all_goods_price = int(count) * float(goods_price)
                return render(request, 'buyer/car_jump.html', locals())
            else:
                models.Car.objects.create(
                    goods_id=goods_id,
                    goods_name=goods_name,
                    goods_price=goods_price,
                    goods_num=count,
                    goods_picture=goods_img_path,
                    buyer_id=buyer_id,
                )
                all_goods_price = int(count) * float(goods_price)
                return render(request, 'buyer/car_jump.html', locals())
    # 若用户未登录
    else:
        # 先获取数据
        goods_id = request.GET.get('id')
        goods_name = request.POST.get('goods_name')
        goods_xprice = request.POST.get('goods_xprice')
        goods_img_path = request.POST.get('goods_img_path')
        count = request.POST.get('count')
        # 将数据保存到session中
        request.session['goods_id'] = goods_id
        request.session['goods_name'] = goods_name
        request.session['goods_xprice'] = goods_xprice
        request.session['goods_img_path'] = goods_img_path
        request.session['count'] = count
        # 重定向到登录界面
        return redirect('/buyer/login/')


def car_list(request):
    buyer_id = request.session.get('buyer_id')
    buycar_obj_list = models.Car.objects.filter(buyer_id=buyer_id)
    new_buycar_list = []
    total_price = 0
    for buycar_obj in buycar_obj_list:
        goods_xiaoji = int(buycar_obj.goods_num) * float(buycar_obj.goods_price)
        dic = {'buycar_obj': buycar_obj, 'goods_xiaoji': goods_xiaoji}
        new_buycar_list.append(dic)
        total_price += goods_xiaoji
    address_obj_list = models.Address.objects.filter(buyer_id=buyer_id)
    return render(request, 'buyer/car_list.html', {'new_buycar_list': new_buycar_list, 'total_price': total_price,
                                                   'address_obj_list': address_obj_list})


# 删除购物车具体商品
def car_goods_delete(request):
    id = request.GET.get('id')
    models.Car.objects.get(id=id).delete()
    return redirect('/buyer/car_list/')


# 清空购物车
def car_clear(request):
    buyer_id = request.session.get('buyer_id')
    models.Car.objects.filter(buyer_id=buyer_id).delete()
    return redirect('/buyer/car_list/')


# 下单
import random, time, datetime


def get_random_num():
    num = random.randint(1000, 9999)
    return num


def enter_order(request):
    # 获取form表单里提交过来的地址
    address_id = request.POST.get('address')
    address_obj = models.Address.objects.get(id=address_id)
    times = datetime.datetime.now()
    now_time = times.strftime('%Y-%m-%d')
    new_buycar_list = []
    goods_all_price = 0
    # 勾选传来的商品数据name不是一个
    for key, value in request.POST.items():
        if key.startswith('name_'):
            buycar_obj = models.Car.objects.get(id=value)
            goods_xiaoji = int(buycar_obj.goods_num) * float(buycar_obj.goods_price)
            # 单个商品数据放入字典中
            dic = {'buycar_obj': buycar_obj, 'goods_xiaoji': goods_xiaoji}
            new_buycar_list.append(dic)
            goods_all_price += goods_xiaoji

    # 保存到订单数据库
    order_obj = models.Order.objects.create(
        order_num=now_time + str(get_random_num()),
        order_time=now_time,
        order_status='1',  # 1表示订单未支付
        order_total=goods_all_price,
        buyer_id=request.session.get('buyer_id'),
        address=address_obj,
    )
    # 保存订单中商品详情类
    for new_buycar_dic in new_buycar_list:
        buycar_obj = new_buycar_dic.get('buycar_obj')
        models.OrderGoods.objects.create(
            goods_id=buycar_obj.goods_id,
            goods_name=buycar_obj.goods_name,
            goods_num=buycar_obj.goods_num,
            goods_price=buycar_obj.goods_price,
            goods_picture=buycar_obj.goods_picture,
            order=order_obj
        )

    return render(request, 'buyer/enter_order.html', locals())


# 添加支付宝
from alipay import AliPay


def test_alipay(request):
    app_private_key_string = """-----BEGIN RSA PRIVATE KEY-----
        MIIEpQIBAAKCAQEAyxlAeCqSs3qmB6zIlhAmqRQsetRM3H176CsnFTdBzlBRRKf7l266QHgWmHFovSqw4pAUnEBRJYE1slbLg6Mn3TzNhyeJSt+jZC9l2Ylz+NVOqmpCDPzMPbhnODrt2qgiNcoqjG3N9OEQqHACJ32g2Ei/oiS5uAD7x/G0WigzAaMkc0yTCf1gCg7AeUaCOK/+Pn5P+JPdjzwMDTgB17k/aLZwLWzN4bAHdgT21aYFeGtgn2V4ce78KjA9ekZITFraTY2xbl7ofcVXi/dXViNQEVqIOKcoAX5CUdGou3MEfkeL2pgRmvdHLCS4cFkM8DRwMA+XArbBp3SkuOXuXeYpJQIDAQABAoIBAQCajMG5b7Qo7ekQKBSP1QSGX3qlkY5XrwmuF8Bq7Zye8hGVrDrQ9oq26mtPX+WzJZxrG/cDHBJj9to0tsWxi2OXgGBqO9TG7D26zDK2AloE/dUZ6zgOCAUn5n5tlLJRVOaLhicwq5IxiV8SvgF1qazPSTTCny3QbrcqZKy4eqSt1eouhkjgqY7o+xuYsy9dAGW958U0SGMvLrb1erTF3aEXDxFRHFZTCwyWmjYjwUxBm8BKQRXIuzagYOkFQmRJT05CbO8IWoc8JBM+00dKxD7yeyKtTifQY2FzqtwCERuMzBrwz0wo1G5t5mJ9ZERc0u4W9OfJl/6lppI7I1nbmNohAoGBAPohxh3jqes9WrN+6VhH1VtCPU+EGXzOXdHuRCpMMhViP5tunu0BmigI0Cafv49Bn1FyCNG1xZwlsE7+M6Npj35+V/BQmhUGBv8DYnf/qXLdjM5NavsD8/cGDMrhy9LUHhWy53HdHx/cusZLHLoolpfZyXPXOxrFCDCm39o1ddqJAoGBAM/dAiqumJKLQ79tCV0BYRKPXBrQXX2j7rgr/h9gb/4wXwVoViStq4DqQ28izWVl5QMziQh7sXc+EkngRYmSzhy9FrDVCHVpu7skxe9zaMwpUOPcQIHxWlcWN6hp3Fh3pcEN/I9qzlPDLLGq/RqE2NOUPhWqt3qGWPfc4FQyCMK9AoGBAOAhC0kVCtjC7VcRTT3RgBh5zj5F/CCdOew2N9Y+2FHY6233PWjZmqxs2TcCxb8z6fIs4EIpQpycGNNvbA3tNKr/wwSO9MIJ2JMBEWa9K7TFWLozHL032Y9rWGMi2GRdtWd0G3cn0A/Y1XOBMoiMfgQrHhwyq79c9e3CWatJZAUhAoGAGZ72O2iV6co8qYW5F7upyW3ePnfcbjYcoJrbkeaDJ2Oy8qmvpIm7kAJQGYzCoHL0zXY2t9L3Rulhu7VnHNP5j9VGzLkVd9N2jlS0CRXCnxegntVxJhMnvYBBkAKsZEMrLSaaMNtLX0u5YJTg6bniOAIXvPfz8ahJoxOYmwgnyEkCgYEAncNyAiBPS5nFcJq0yxtaqdfAfIW+h6SxXBWkdI66bK+YEZ3hvoW42z4cyuo9WbdoKJ4UKP8m0UAQ+qF6gxTvo5jpbaxgYDRpzTbj4B5exUqvH4jyVjZ+U1ASoC/MOVw+HApvdLpcnd9kcIRfNk8FuA6Fvj6UmQJLsc0pA+b19KI=
    -----END RSA PRIVATE KEY-----"""
    alipay_public_key_string = """-----BEGIN PUBLIC KEY-----
        MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlTKZzALbl67tl//jq7pWyjUsRe887eogf67LLFkR+AnDN6CRtkG5VIlHOQrL3xgBKZkrT6LeOFIyBy82fRM5yXOTJsyqxfwM5Bi+2sOs2QpzonkxPDFQUPmp8svgX7suXtAIZPNDfpVMb3AZ5JkpczGfFE8bEMo0CoVbpQbPLdjFFlTfoPfEmj6jWVTO7StSBrNwTfT1VxcGjtlTao73WQ3NquWDzxdkvsb3Jq5gB2hOsCU5vB71sedQWtbuFHdulZK9PUytn9xd0r5chZyN0+k+bGrEQD7tuj1rnDkJEGF/bCGK9Z7U1E7+2dRo4u1WmQ+T1Y35OYyxoc3MAr+jiQIDAQAB
    -----END PUBLIC KEY-----"""
    alipay = AliPay(
        appid="2016101300679685",
        app_notify_url=None,  # 默认回调url
        app_private_key_string=app_private_key_string,
        # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
        alipay_public_key_string=alipay_public_key_string,
        sign_type="RSA2",  # RSA 或者 RSA2
        debug=True,  # 默认False
    )
    order_string = alipay.api_alipay_trade_page_pay(
        out_trade_no="20161112",  # 订单号
        total_amount='1000',  # 总价
        subject='测试版本',  # 标题
        return_url=None,
        notify_url=None,  # 可选, 不填则使用默认notify url
    )
    return redirect('https://openapi.alipaydev.com/gateway.do?' + order_string)


def alipay_method(request):
    order_num = request.GET.get('order_num')
    total = request.GET.get('total')
    app_private_key_string = """-----BEGIN RSA PRIVATE KEY-----
            MIIEpQIBAAKCAQEAyxlAeCqSs3qmB6zIlhAmqRQsetRM3H176CsnFTdBzlBRRKf7l266QHgWmHFovSqw4pAUnEBRJYE1slbLg6Mn3TzNhyeJSt+jZC9l2Ylz+NVOqmpCDPzMPbhnODrt2qgiNcoqjG3N9OEQqHACJ32g2Ei/oiS5uAD7x/G0WigzAaMkc0yTCf1gCg7AeUaCOK/+Pn5P+JPdjzwMDTgB17k/aLZwLWzN4bAHdgT21aYFeGtgn2V4ce78KjA9ekZITFraTY2xbl7ofcVXi/dXViNQEVqIOKcoAX5CUdGou3MEfkeL2pgRmvdHLCS4cFkM8DRwMA+XArbBp3SkuOXuXeYpJQIDAQABAoIBAQCajMG5b7Qo7ekQKBSP1QSGX3qlkY5XrwmuF8Bq7Zye8hGVrDrQ9oq26mtPX+WzJZxrG/cDHBJj9to0tsWxi2OXgGBqO9TG7D26zDK2AloE/dUZ6zgOCAUn5n5tlLJRVOaLhicwq5IxiV8SvgF1qazPSTTCny3QbrcqZKy4eqSt1eouhkjgqY7o+xuYsy9dAGW958U0SGMvLrb1erTF3aEXDxFRHFZTCwyWmjYjwUxBm8BKQRXIuzagYOkFQmRJT05CbO8IWoc8JBM+00dKxD7yeyKtTifQY2FzqtwCERuMzBrwz0wo1G5t5mJ9ZERc0u4W9OfJl/6lppI7I1nbmNohAoGBAPohxh3jqes9WrN+6VhH1VtCPU+EGXzOXdHuRCpMMhViP5tunu0BmigI0Cafv49Bn1FyCNG1xZwlsE7+M6Npj35+V/BQmhUGBv8DYnf/qXLdjM5NavsD8/cGDMrhy9LUHhWy53HdHx/cusZLHLoolpfZyXPXOxrFCDCm39o1ddqJAoGBAM/dAiqumJKLQ79tCV0BYRKPXBrQXX2j7rgr/h9gb/4wXwVoViStq4DqQ28izWVl5QMziQh7sXc+EkngRYmSzhy9FrDVCHVpu7skxe9zaMwpUOPcQIHxWlcWN6hp3Fh3pcEN/I9qzlPDLLGq/RqE2NOUPhWqt3qGWPfc4FQyCMK9AoGBAOAhC0kVCtjC7VcRTT3RgBh5zj5F/CCdOew2N9Y+2FHY6233PWjZmqxs2TcCxb8z6fIs4EIpQpycGNNvbA3tNKr/wwSO9MIJ2JMBEWa9K7TFWLozHL032Y9rWGMi2GRdtWd0G3cn0A/Y1XOBMoiMfgQrHhwyq79c9e3CWatJZAUhAoGAGZ72O2iV6co8qYW5F7upyW3ePnfcbjYcoJrbkeaDJ2Oy8qmvpIm7kAJQGYzCoHL0zXY2t9L3Rulhu7VnHNP5j9VGzLkVd9N2jlS0CRXCnxegntVxJhMnvYBBkAKsZEMrLSaaMNtLX0u5YJTg6bniOAIXvPfz8ahJoxOYmwgnyEkCgYEAncNyAiBPS5nFcJq0yxtaqdfAfIW+h6SxXBWkdI66bK+YEZ3hvoW42z4cyuo9WbdoKJ4UKP8m0UAQ+qF6gxTvo5jpbaxgYDRpzTbj4B5exUqvH4jyVjZ+U1ASoC/MOVw+HApvdLpcnd9kcIRfNk8FuA6Fvj6UmQJLsc0pA+b19KI=
        -----END RSA PRIVATE KEY-----"""
    alipay_public_key_string = """-----BEGIN PUBLIC KEY-----
            MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlTKZzALbl67tl//jq7pWyjUsRe887eogf67LLFkR+AnDN6CRtkG5VIlHOQrL3xgBKZkrT6LeOFIyBy82fRM5yXOTJsyqxfwM5Bi+2sOs2QpzonkxPDFQUPmp8svgX7suXtAIZPNDfpVMb3AZ5JkpczGfFE8bEMo0CoVbpQbPLdjFFlTfoPfEmj6jWVTO7StSBrNwTfT1VxcGjtlTao73WQ3NquWDzxdkvsb3Jq5gB2hOsCU5vB71sedQWtbuFHdulZK9PUytn9xd0r5chZyN0+k+bGrEQD7tuj1rnDkJEGF/bCGK9Z7U1E7+2dRo4u1WmQ+T1Y35OYyxoc3MAr+jiQIDAQAB
        -----END PUBLIC KEY-----"""
    alipay = AliPay(
        appid="2016101300679685",
        app_notify_url=None,  # 默认回调url
        app_private_key_string=app_private_key_string,
        # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
        alipay_public_key_string=alipay_public_key_string,
        sign_type="RSA2",  # RSA 或者 RSA2
        debug=True,  # 默认False
    )
    order_string = alipay.api_alipay_trade_page_pay(
        out_trade_no=str(order_num),  # 订单号
        total_amount=str(total),  # 总价
        subject='水果商城',  # 标题
        return_url=None,
        notify_url=None,  # 可选, 不填则使用默认notify url
    )
    return redirect('https://openapi.alipaydev.com/gateway.do?' + order_string)


from django.core.mail import EmailMultiAlternatives
from django.http import JsonResponse
# 买家使用邮箱注册账号
def send_message(request):
    result = {'state':'error','data':''}
    if request.method == 'GET':
        email_name = request.GET.get('email')
        if email_name:
            try:
                subject='全球生鲜商城验证码'
                yzm = get_random_num()
                text_content = '您好 , 您的验证码是{}'.format(yzm)
                # 此处邮箱为后台发送验证码的邮箱
                msg = EmailMultiAlternatives(subject,text_content,'[email protected]',[email_name])
                msg.send()
            except Exception as e:
                # 有异常执行
                result['data'] = str(e)
            else:
                # 没有异常时执行
                # 保存数据
                result['state'] = 'success'
                result['data'] = 'success'
                models.EmailVaild.objects.create(
                    email_name=email_name,
                    value = yzm,
                    time = datetime.datetime.now()
                )
            finally:
                return JsonResponse(result)
    return redirect('/buyer/register_email/')

def register_email(request):
    error_msg = {}
    if request.method == 'POST':
        emailname = request.POST.get('emailname')
        code = request.POST.get('code') # 验证码
        userpass = request.POST.get('userpass') # 用户密码
        email_obj = models.EmailVaild.objects.filter(email_name=emailname).first()
        if email_obj:
            if email_obj.value == code:
                db_time = time.mktime(email_obj.time.timetuple()) # 时间戳
                now_time = time.time()
                if now_time -db_time < 180: #3min
                    models.Buyer.objects.create(
                        name = emailname,
                        password=pwd_jm(userpass),
                    )
                    email_obj.delete()
                    return redirect('/buyer/login/')
                else:
                    # 验证码超时
                    error_msg['yzm_sx'] = '验证码失效'
                    email_obj.delete()
            else:
                error_msg['yzm_error'] = '验证码错误'
        else:
            error_msg['email'] = '邮箱不存在'
    return render(request,'buyer/register_email.html',{'error_msg':error_msg})


# 短信验证http://www.ihuyi.com/




买家模型类:
from django.db import models

# Create your models here.
class Buyer(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    def __str__(self):
        return '< obj name:{}>'.format(self.name)

class Address(models.Model):
    name = models.CharField(max_length=32)
    address = models.CharField(max_length=100)
    phone = models.CharField(max_length=32)
    buyer = models.ForeignKey(to=Buyer,on_delete=models.CASCADE)
    def __str__(self):
        return '< obj name:{}>'.format(self.name)

class BuyerCar(models.Model):
    goods_name = models.CharField(max_length=32) # 商品名字
    goods_picture = models.CharField(max_length=32) # 商品缩略图
    goods_num = models.IntegerField() # 商品数量
    goods_price = models.FloatField() #商品单价
    buyer = models.ForeignKey(to='Buyer',on_delete=models.CASCADE)
    goods_id = models.IntegerField()  # 商品id

class Car(models.Model):
    goods_name = models.CharField(max_length=32) # 商品名字
    goods_picture = models.CharField(max_length=32) # 商品缩略图
    goods_num = models.IntegerField() # 商品数量
    goods_price = models.FloatField() #商品单价
    buyer = models.ForeignKey(to='Buyer',on_delete=models.CASCADE)
    goods_id = models.IntegerField()  # 商品id

# 订单类模型
class Order(models.Model):
    order_num = models.CharField(max_length=32) # 订单号
    order_time = models.DateField() # 订单时间
    order_status = models.CharField(max_length=32) # 订单状态
    order_total = models.FloatField() # 商品总价
    buyer = models.ForeignKey(to='Buyer',on_delete=models.CASCADE)
    address = models.ForeignKey(to='Address',on_delete=models.CASCADE)

# 订单类中的商品详情模型
class OrderGoods(models.Model):
    goods_name = models.CharField(max_length=32)  # 商品名字
    goods_picture = models.CharField(max_length=32)  # 商品缩略图
    goods_num = models.IntegerField()  # 商品数量
    goods_price = models.FloatField()  # 商品单价
    goods_id = models.IntegerField()  # 商品id
    order = models.ForeignKey(to='Order',on_delete=models.CASCADE)


# 注册邮箱
class EmailVaild(models.Model):
    email_name = models.CharField(max_length=32) # 邮箱名称
    value = models.CharField(max_length=32) # 验证码
    time = models.DateTimeField() # 时间戳 , 用来判断验证码是否超过有效期






 

 

 

 

 

你可能感兴趣的:(Django)