项目分两个模块:商家模块(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() # 时间戳 , 用来判断验证码是否超过有效期