项目分两个模块:商家模块(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 hashlibdef 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.namewith 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 widgetsclass 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 timedef register(request):registerform = RegisterForm()if request.method == 'POST':registerform = RegisterForm(request.POST, request.FILES)  # 校验不同内容和上传内容if registerform.is_valid():data = registerform.cleaned_datausername = 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.namewith 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_datausername = 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'] = usernamenikename = ret[0].nikename  # 获取昵称request.session['nikename'] = nikenamerequest.session['seller_id'] = ret[0].idreturn 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):# 清除sessionrequest.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 JsonResponsedef 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, EmptyPagedef goods_type_list(request):goods_type_obj_list = models.GoodsType.objects.all()my_num = 2paginator = Paginator(goods_type_obj_list, my_num)count = paginator.countnum_pages = paginator.num_pagestry: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_pagespage_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 = namegoods_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')  # 商品对应的类型idgoods_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 osdef 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.nameos.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_numgoods_obj.goods_name = goods_namegoods_obj.goods_oprice = goods_opricegoods_obj.goods_xprice = goods_xpricegoods_obj.goods_kucun = goods_countgoods_obj.goods_desc = goods_descriptiongoods_obj.goods_type_id = goods_type_idgoods_obj.goods_details = goods_contentgoods_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.nameos.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() # 头像 注意下载pillowdef __str__(self):return '<obj name:{}>'.format(self.name)class GoodsType(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=32)  # 商品类型def __str__(self):return '<obj name:{}>'.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 '<obj name:{}>'.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_idgoods_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 = Noneif 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 JsonResponsedef 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].namerequest.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 responseelse: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 = nameaddress_obj.address = addressaddress_obj.phone = phoneaddress_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_idrequest.session['goods_name'] = goods_namerequest.session['goods_xprice'] = goods_xpricerequest.session['goods_img_path'] = goods_img_pathrequest.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 = 0for 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_xiaojiaddress_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, datetimedef get_random_num():num = random.randint(1000, 9999)return numdef 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 AliPaydef 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,  # 默认回调urlapp_private_key_string=app_private_key_string,# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,alipay_public_key_string=alipay_public_key_string,sign_type="RSA2",  # RSA 或者 RSA2debug=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,  # 默认回调urlapp_private_key_string=app_private_key_string,# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,alipay_public_key_string=alipay_public_key_string,sign_type="RSA2",  # RSA 或者 RSA2debug=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,'ccw605498258@163.com',[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: #3minmodels.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()  # 商品idclass 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()  # 商品idorder = 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--生鲜商城项目相关推荐

  1. django debug=false后静态文件丢失_python框架Django实战商城项目之工程搭建

    项目说明 该电商项目类似于京东商城,主要模块有验证.用户.第三方登录.首页广告.商品.购物车.订单.支付以及后台管理系统. 项目开发模式采用前后端不分离的模式,为了提高搜索引擎排名,页面整体刷新采用j ...

  2. python开发商城实战_python框架Django实战商城项目之工程搭建

    项目说明 该电商项目类似于京东商城,主要模块有验证.用户.第三方登录.首页广告.商品.购物车.订单.支付以及后台管理系统. 项目开发模式采用前后端不分离的模式,为了提高搜索引擎排名,页面整体刷新采用j ...

  3. 用python搭建微商城_python框架Django实战商城项目之工程搭建

    项目说明 该电商项目类似于京东商城,主要模块有验证.用户.第三方登录.首页广告.商品.购物车.订单.支付以及后台管理系统. 项目开发模式采用前后端不分离的模式,为了提高搜索引擎排名,页面整体刷新采用j ...

  4. 【项目实战开发】第三章——在线生鲜商城系统

    系列文章目录 第一章--AI人机对战版五子棋游戏 第二章--在线商城系统 第三章--在线生鲜商城系统 文章目录 系列文章目录 前言 1.系统背景介绍 2. 功能需求分析 3.准备工作 3.1 用到的库 ...

  5. 基于python+django+vue+mysql的天天生鲜商城

    项目介绍 根据毕业设计的需求,设计一个界面友好的天天生鲜商城系统,用户能够直观的浏览及查询生鲜信息,了解消费者的习惯,实现系统的基本功能,用户操作起来更方便.为了让管理者了解自己的权限,方便直观的操作 ...

  6. Python django天天生鲜商城系统

    Python django天天生鲜商城系统 pythondjango 网络商城 pythondjango 电商商城 该套系统可以改成其他的商城,比如衣服商城.车商城等等 后端:python djang ...

  7. 基于Django的商城开发项目笔记(一)

    基于Django的商城开发项目笔记(一) 一.环境搭建 1.安装Python:去Python官网下载最新版本Python进行安装,安装时记得勾选将Python加入系统环境变量 2.在命令行输入pip ...

  8. Django框架学习之网上商城项目一(后端设计)

    目录 一.项目需求分析 1.项目介绍 1.技术难点 2.系统功能 3.项目环境 4.后台管理页面 二.数据库模型设计 一.准备工作 二.用户认证数据库模型设计 1. app/users/models. ...

  9. 生鲜商城小程序项目总结

    生鲜商城小程序项目总结 1.项目需求 实现B2B的生鲜商城小程序,具有商品展示.加入购物车.提交订单.微信支付.推送微信模版消息等基本购物流程,还包括登陆注册.信息审核.个人中心等辅助功能. 2.项目 ...

  10. Django 19购物商城项目(收货地址:添加、修改)

    dDjango 19购物商城项目 1.新建axf_addr,收货地址表 2.路由 3.cart页面,添加默认收货地址 4.视图(主要修改了cart.新建了收货地址相关方法) 5.收货地址列表 6.收货 ...

最新文章

  1. 卡内基梅隆大学提出基于学习的动作捕捉模型,用自监督学习实现人类3D动作追踪
  2. 作为一个测试人员,在你提出问题之前请先想想如下问题
  3. android training 笔记
  4. 顶层const和底层const的区别
  5. 不自定义异步方法的线程池默认使用SimpleAsyncTaskExecutor
  6. 数学之路-分布式计算-disco(4)
  7. Http方法:Get请求与Post请求的区别
  8. 设计模式一の设计模式详解
  9. 2012 php mysql_Apache+Mysql+PHP(win sercer2012)
  10. Sentinel服务熔断配置fallback和blockHandler_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0052
  11. 计算机原理的拼音,微机原理课程,the course of microcomputer principles,音标,读音,翻译,英文例句,英语词典...
  12. 运用.net工厂编写数据库类
  13. Facebook采取赤裸裸抄袭的战略 争夺用户
  14. 查看一个进程的线程情况
  15. matlab3阶幺矩阵,Matlab操作矩阵的相关方法
  16. 七周成为数据分析师—Excel实战篇
  17. (一)Word中如何将表格断开,并且增加空的一行
  18. 快速求最小公倍数的四种方法
  19. C++中的protected
  20. java happen-before_Java内存模型happen-before的实现原理

热门文章

  1. Internet of things:是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器、激光扫描器等各种装置
  2. 哪些情况下会被银行拒贷?买房真的凑齐首付就够了吗?
  3. 微信内测新功能“边写边译”,好玩!
  4. 关于QUIC协议的连接、重传、多路复用、流量控制
  5. BN和IN对比及其他Normalization
  6. 大众点评必吃榜的必然
  7. 结构体及结构体内存对齐讲解
  8. R语言中quantmod金融分析包的实践
  9. 企业工信部备案提交教程(电子化备案)
  10. python获取计算股票技术指标DIF/DEA/MACD