import json from django.core.serializers import serialize from django.http import JsonResponse from django.shortcuts import render, redirect from alipay import AliPay import datetime from django.views.decorators.http import require_http_methods from index.models import UserInfo from Sellers.models import Tickets, Order, Flight, Message from django.db.models import Count, Q def hello(request, user_id): user = UserInfo.objects.filter(id=user_id).first() name = user.name sex = user.sex if sex == '1': sexx = '先生' else: sexx = '女士' context = { 'user_id': user_id, 'name': name, 'sex': sexx, } return render(request, 'hello.html', context) def my_info(request, user_id): my_data = UserInfo.objects.filter(id=user_id).first() if my_data.licence == '1': lic = '中国居民身份证' elif my_data.licence == '2': lic = '港澳台居民居住证' elif my_data.licence == '3': lic = '港澳居民来往内地通行证' elif my_data.licence == '4': lic = '台湾居民来往内地通行证' elif my_data.licence == '5': lic = '护照' elif my_data.licence == '6': lic = '外国人永久居留身份证' if my_data.sex == '1': sexx = '男' else: sexx = '女' if my_data.grand == '1': gra = '成人' elif my_data.grand == '2': gra = '儿童' elif my_data.grand == '3': gra = '学生' elif my_data.grand == '4': gra = '残疾军人、伤残人民警察' context = { 'username': my_data.username, 'password': my_data.password, 'name': my_data.name, 'lic_typ': lic, 'lic_num': my_data.lic_num, 'sex': sexx, 'gra': gra, 'pho': my_data.phone, 'ema': my_data.mail, 'user_id': my_data.id, } return render(request, 'my_info.html', context) def update_info(request, user_id): if request.method != 'POST': my_data = UserInfo.objects.filter(id=user_id).first() if my_data.licence == '1': lic = '中国居民身份证' elif my_data.licence == '2': lic = '港澳台居民居住证' elif my_data.licence == '3': lic = '港澳居民来往内地通行证' elif my_data.licence == '4': lic = '台湾居民来往内地通行证' elif my_data.licence == '5': lic = '护照' elif my_data.licence == '6': lic = '外国人永久居留身份证' if my_data.sex == '1': sexx = '男' else: sexx = '女' if my_data.grand == '1': gra = '成人' elif my_data.grand == '2': gra = '儿童' elif my_data.grand == '3': gra = '学生' elif my_data.grand == '4': gra = '残疾军人、伤残人民警察' context = { 'user': my_data.username, 'password': my_data.password, 'name': my_data.name, 'lic_typ': lic, 'lic_num': my_data.lic_num, 'sex': sexx, 'gra': gra, 'pho': my_data.phone, 'ema': my_data.mail, 'user_id': my_data.id, } return render(request, 'update_info.html', context) else: user_name = request.POST.get('user') pwd = request.POST.get('pwd') apwd = request.POST.get('apwd') lic = request.POST.get('lic') lic_num = request.POST.get('lic_num') gra = request.POST.get('grand') pho = request.POST.get('phone') ema = request.POST.get('mail') if user_name == '': return redirect('Users:up_non_user', user_id) elif pwd == '': return redirect('Users:up_non_pwd', user_id) elif apwd == '': return redirect('Users:up_non_apwd', user_id) elif pwd != apwd: return redirect('Users:up_not_equ', user_id) elif lic == '0': return redirect('Users:up_non_lic', user_id) elif lic_num == '': return redirect('Users:up_non_licnum', user_id) elif gra == '0': return redirect('Users:up_non_gra', user_id) elif pho == '': return redirect('Users:up_non_pho', user_id) elif ema == '': return redirect('Users:up_non_ema', user_id) else: UserInfo.objects.filter(id=user_id).update(username=user_name, password=pwd, licence=lic, lic_num=lic_num, grand=gra, phone=pho, mail=ema) return redirect('Users:my_info', user_id) def up_nonuser(request, user_id): context = {'user_id': user_id} return render(request, 'up_non_user.html', context) def up_nonpwd(request, user_id): context = {'user_id': user_id} return render(request, 'up_non_pwd.html', context) def up_nonapwd(request, user_id): context = {'user_id': user_id} return render(request, 'up_non_apwd.html', context) def up_notequ(request, user_id): context = {'user_id': user_id} return render(request, 'up_not_equ.html', context) def up_nonlic(request, user_id): context = {'user_id': user_id} return render(request, 'up_non_lic.html', context) def up_nonlicnum(request, user_id): context = {'user_id': user_id} return render(request, 'up_non_licnum.html', context) def up_nongra(request, user_id): context = {'user_id': user_id} return render(request, 'up_non_gra.html', context) def up_nonpho(request, user_id): context = {'user_id': user_id} return render(request, 'up_non_pho.html', context) def up_nonema(request, user_id): context = {'user_id': user_id} return render(request, 'up_non_ema.html', context) def search(request, user_id): if request.method != 'POST': context = { 'user_id': user_id } return render(request, 'search.html', context) else: tickets = Tickets.objects.all() eff_tickets = [] now = str(datetime.datetime.now()) for ticket in tickets: if now < str(ticket.starting_time): eff_tickets.append(ticket) sta = request.POST.get('sta_point') sta = sta.strip() fin = request.POST.get('fin_point') fin = fin.strip() tim = request.POST.get('dat') time = str(tim) tics = [] # print(203, sta,fin,time) flight_result = Flight.objects.filter(sta_point__icontains=sta,fin_point__icontains=fin,status='未起飞') print(flight_result) for ticket in eff_tickets: if str(ticket.starting_time.date()) == time and ticket.start_point == sta and ticket.final_point == fin: tics.append(ticket) F_real_prices = [] C_real_prices = [] Y_real_prices = [] for tic in tics: F_real_prices.append(tic.F_price * tic.F_discount / 10) C_real_prices.append(tic.C_price * tic.C_discount / 10) Y_real_prices.append(tic.Y_price * tic.Y_discount / 10) context = { 'tickets': flight_result, 'user_id': user_id, 'F_prices': F_real_prices, 'C_prices': C_real_prices, 'Y_prices': Y_real_prices, } print(227, flight_result) return render(request, 'search_result.html', context) def check_ticket(request, user_id, ticket_id): ticket = Tickets.objects.filter(id=ticket_id).first() context = { 'user_id': user_id, 'ticket': ticket, } return render(request, 'check_ticket.html', context) def order(request, user_id, ticket_id): orders = Order.objects.filter(user_id=user_id) flag = 0 for order in orders: if order.ticket_id == ticket_id and order.status == '已支付': flag = 1 break elif order.ticket_id == ticket_id and order.status == '等待支付': flag = 2 break elif order.ticket_id == ticket_id and order.status == '退款审核中': flag = 3 break elif order.ticket_id == ticket_id and order.status == '改签审核中': flag = 4 break if flag == 0: ticket = Tickets.objects.filter(id=ticket_id).first() user = UserInfo.objects.filter(id=user_id).first() context = { 'ticket': ticket, 'user': user, } return render(request, 'order.html', context) elif flag == 1: context = {'user_id': user_id} return render(request, 'cant_two.html', context) elif flag == 2: context = {'user_id': user_id} return render(request, 'waiting_for_payment.html', context) elif flag == 3: context = {'user_id': user_id} return render(request, 'refunding.html', context) elif flag == 4: context = {'user_id': user_id} return render(request, 'changing.html', context) def dingdan(request, user_id, ticket_id): user = UserInfo.objects.filter(id=user_id).first() ticket = Tickets.objects.filter(id=ticket_id).first() berth = request.POST.get('berth') if berth == '1': ber = '头等舱' be_price = ticket.F_price if user.grand == '1': price = ticket.F_real_price discount = ticket.F_discount if user.grand == '2': price = ticket.F_price * 0.5 discount = 5 if user.grand == '3': price = ticket.F_price * 0.5 discount = 5 if user.grand == '4': price = ticket.F_price * 0.5 discount = 5 if berth == '2': ber = '商务舱' be_price = ticket.C_price if user.grand == '1': price = ticket.C_real_price discount = ticket.C_discount if user.grand == '2': price = ticket.C_price * 0.5 discount = 5 if user.grand == '3': price = ticket.C_price * 0.5 discount = 5 if user.grand == '4': price = ticket.C_price * 0.5 discount = 5 if berth == '3': be_price = ticket.Y_price ber = '经济舱' if user.grand == '1': price = ticket.Y_real_price discount = ticket.Y_discount if user.grand == '2': price = ticket.Y_price * 0.5 discount = 5 if user.grand == '3': price = ticket.Y_price * 0.5 discount = 5 if user.grand == '4': price = ticket.Y_price * 0.5 discount = 5 status='等待支付' order = Order.objects.create(flight=ticket.flight, start_point=ticket.start_point, final_point=ticket.final_point, tye=ticket.tye, stopover_hour=ticket.stopover_hour, stopover_minute=ticket.stopover_minute, stopover_point=ticket.stopover_point, starting_time=ticket.starting_time, final_time=ticket.final_time, be_price=ticket.be_price, discount=discount, true_price=price, Type=ticket.Type, berth=ber, status=status, ticket_id=ticket.id, user_id=user.id) if user.balance - order.true_price > 0: # 这里走余额 UserInfo.objects.filter(id=user_id).update(balance=user.balance - price) Order.objects.filter(id=order.id).update(status='已支付') return redirect('Users:my_orders', user_id) # User / my_orders / 2 / sub = f'{ticket.flight} {ticket.start_point}至{ticket.final_point} {str(ticket.starting_time)}' app_private_key_string = open(r"Users/rsakey/private2048.txt").read() alipay_public_key_string = open(r"Users/rsakey/paypublic.txt").read() # 实例化AliPay alipay = AliPay( appid="2021000122675132", app_notify_url=None, # 支付宝会向这个地址发送post请求 app_private_key_string=app_private_key_string, # 应用私钥 alipay_public_key_string=alipay_public_key_string, # 支付宝公钥 sign_type="RSA2", debug=True, # 默认是False ) # 定义请求地址传入的参数 res = alipay.api_alipay_trade_page_pay( out_trade_no=str(order.id), # 订单号 total_amount=str(order.true_price), # 交易金额(单位是元,保留两位小数) subject=sub, # 商品描述 return_url='http://127.0.0.1:8000/User/show/' # 支付后像这个界面发送GET请求 ) # 生成跳转到支付宝支付页面的url url = 'https://openapi.alipaydev.com/gateway.do?' + res return redirect(url) def pay_order(request, order_id): order = Order.objects.filter(id=order_id).first() ticket_id = order.ticket_id ticket = Tickets.objects.filter(id=ticket_id).first() sub = f'{ticket.flight} {ticket.start_point}至{ticket.final_point} {str(ticket.starting_time)}' app_private_key_string = open(r"Users/rsakey/private2048.txt").read() alipay_public_key_string = open(r"Users/rsakey/paypublic.txt").read() # 实例化AliPay alipay = AliPay( appid="2021000122675132", app_notify_url=None, # 支付宝会向这个地址发送post请求 app_private_key_string=app_private_key_string, # 应用私钥 alipay_public_key_string=alipay_public_key_string, # 支付宝公钥 sign_type="RSA2", # 支付宝会向这个地址发送get请求 debug=True, # 默认是False ) # 定义请求地址传入的参数 res = alipay.api_alipay_trade_page_pay( out_trade_no=str(order.id), # 订单号 total_amount=str(order.true_price), # 交易金额(单位是元,保留两位小数) subject=sub, # 商品描述 return_url='http://127.0.0.1:8000/User/show/' ) # 生成跳转到支付宝支付页面的url url = 'https://openapi.alipaydev.com/gateway.do?' + res return redirect(url) def show(request): if request.method == 'GET': app_private_key_string = open(r"Users/rsakey/private2048.txt").read() alipay_public_key_string = open(r"Users/rsakey/paypublic.txt").read() alipay = AliPay( appid="2021000122675132", app_notify_url=None, # 支付宝会向这个地址发送post请求 app_private_key_string=app_private_key_string, # 应用私钥 alipay_public_key_string=alipay_public_key_string, # 支付宝公钥 sign_type="RSA2", # 支付宝会向这个地址发送get请求 debug=True, # 默认是False ) param = request.GET.dict() # 获取请求携带的参数并转换成字典类型 print(param) sign = param.pop('sign', None) # 获取sign的值,并将字典中以'sign'为键的键值对删除 # 对sign参数进行验证 statu = alipay.verify(param, sign) if statu: numstr = param.pop('out_trade_no') Num = int(numstr) order = Order.objects.filter(id=Num).first() tiid = order.ticket_id uid = order.user_id flinum = order.flight ticket = Tickets.objects.filter(id=tiid).first() flight = Flight.objects.filter(number=flinum).first() if order.berth == '头等舱': num = ticket.F_quantity - 1 Tickets.objects.filter(id=tiid).update(F_quantity=num) if order.berth == '商务舱': num = ticket.C_quantity - 1 Tickets.objects.filter(id=tiid).update(C_quantity=num) if order.berth == '经济舱': num = ticket.Y_quantity - 1 Tickets.objects.filter(id=tiid).update(Y_quantity=num) new_inc = flight.income + order.true_price Flight.objects.filter(number=flinum).update(income=new_inc) Order.objects.filter(id=Num).update(status='已支付') context = {'user_id': uid} return render(request, 'showsuc.html', context) else: numstr = param.pop('out_trade_no') num = int(numstr) order = Order.objects.filter(id=num).first() uid = order.user_id context = {'user_id': uid} return render(request, 'showfal.html', context) else: return render(request, 'showwro.html') def my_orders(request, user_id): orders = Order.objects.filter(user_id=user_id) now = str(datetime.datetime.now()) eff_orders = [] for order in orders: if order.status != '退款审核中' and order.status != '改签审核中' and order.status != '退款成功' \ and order.status != '退款驳回' and order.status != '改签成功' and order.status != '改签驳回': eff_orders.append(order) for order in eff_orders: if order.status == '已支付' and now > str(order.starting_time) and now < str(order.final_time): Order.objects.filter(id=order.id).update(status='使用中') elif order.status == '已支付' and now > str(order.final_time): Order.objects.filter(id=order.id).update(status='已结束') elif order.status == '等待支付' and now > str(order.starting_time): Order.objects.filter(id=order.id).update(status='已取消') orders = Order.objects.filter(user_id=user_id) eff_orders = [] for order in orders: if order.status != '退款审核中' and order.status != '改签审核中' and order.status != '退款成功' \ and order.status != '退款驳回' and order.status != '改签成功' and order.status != '改签驳回': eff_orders.append(order) context = { 'orders': eff_orders, 'user_id': user_id, } return render(request, 'my_orders.html', context) def ask_for_refund(request, user_id, order_id): orders = Order.objects.filter(user_id=user_id) re_order = Order.objects.filter(id=order_id).first() if re_order.discount < 4: return redirect('cant_refund.html') eff_orders = [] for order in orders: if order.status != '退款审核中' and order.status != '改签审核中' and order.status != '退款成功' \ and order.status != '退款驳回' and order.status != '改签成功' and order.status != '改签驳回': eff_orders.append(order) context = { 'orders': eff_orders, 'user_id': user_id, 're_order': re_order, } return render(request, 'ask_for_refund.html', context) def assure_refund(request, user_id, order_id): Order.objects.filter(id=order_id).update(status='退款审核中') order = Order.objects.filter(id=order_id) now = datetime.datetime.now() sta_time = order.starting_time dur = sta_time - now hours = dur.seconds / 3600 if hours < 2: Order.objects.filter(id=order_id).update(refund_percent=30) elif hours < 24: Order.objects.filter(id=order_id).update(refund_percent=20) else: Order.objects.filter(id=order_id).update(refund_percent=10) if now > sta_time: Order.objects.filter(id=order_id).update(refund_percent=50) order = Order.objects.filter(id=order_id).first() context = { 'order': order, 'user_id': user_id, } return render(request, 'assure_refund.html', context) def choose_change(request, user_id, order_id): order = Order.objects.filter(id=order_id).first() if order.discount < 4: return render(request, 'cant_change_dis.html') if request.method != 'POST': context = { 'user_id': user_id, 'order_id': order_id, } return render(request, 'search_choose_change.html', context) else: tickets = Tickets.objects.all() eff_tickets = [] now = str(datetime.datetime.now()) for ticket in tickets: if now < str(ticket.starting_time): eff_tickets.append(ticket) sta = request.POST.get('sta_point') fin = request.POST.get('fin_point') tim = request.POST.get('dat') tics = [] time = str(tim) for ticket in eff_tickets: if ticket.start_point == sta and ticket.final_point == fin and str(ticket.starting_time.date()) == time: tics.append(ticket) context = { 'tickets': tics, 'user_id': user_id, 'order_id': order_id, } return render(request, 'choose_change.html', context) def check_change(request, user_id, order_id, ticket_id): ticket = Tickets.objects.filter(id=ticket_id).first() context = { 'ticket': ticket, 'user_id': user_id, 'order_id': order_id, } return render(request, 'check_change.html', context) def ask_for_change(request, user_id, order_id, ticket_id): new_ticket = Tickets.objects.filter(id=ticket_id).first() orders = Order.objects.all() user_orders = [] for order in orders: if order.user_id == user_id: user_orders.append(order) for order in user_orders: if order.ticket_id == new_ticket.id and order.status == '已支付': ticket = Tickets.objects.filter(id=ticket_id).first() order = Order.objects.filter(id=order_id).first() context = { 'user_id': user_id, 'order': order, 'ticket': ticket, } return render(request, 'cant_change_sam.html', context) elif order.ticket_id == new_ticket.id and order.status == '等待支付': ticket = Tickets.objects.filter(id=ticket_id).first() order = Order.objects.filter(id=order_id).first() context = { 'user_id': user_id, 'order': order, 'ticket': ticket, } return render(request, 'have_wait.html', context) elif order.ticket_id == new_ticket.id and order.status == '改签审核中': ticket = Tickets.objects.filter(id=ticket_id).first() order = Order.objects.filter(id=order_id).first() context = { 'user_id': user_id, 'order': order, 'ticket': ticket, } return render(request, 'have_changing.html', context) elif order.ticket_id == new_ticket.id and order.status == '退款审核中': ticket = Tickets.objects.filter(id=ticket_id).first() order = Order.objects.filter(id=order_id).first() context = { 'user_id': user_id, 'order': order, 'ticket': ticket, } return render(request, 'have_refunding.html', context) order = Order.objects.filter(id=order_id).first() ticket = Tickets.objects.filter(id=ticket_id).first() berth = request.POST.get('berth') Berth = int(berth) context = { 'user_id': user_id, 'order': order, 'ticket': ticket, 'berth': Berth, } return render(request, 'ask_for_change.html', context) def assure_change(request, user_id, order_id, ticket_id, berth): if berth == 1: ber = '头等舱' elif berth == 2: ber = '公务舱' elif berth == 3: ber = '经济舱' Order.objects.filter(id=order_id).update(status='改签审核中', new_ticket_id=ticket_id, new_berth=ber) ticket = Tickets.objects.filter(id=ticket_id).first() order = Order.objects.filter(id=order_id).first() now = datetime.datetime.now() sta_tim = ticket.starting_time duration = sta_tim - now hours = duration.seconds / 3600 if hours < 2: Order.objects.filter(id=order_id).update(change_percent=20) elif hours < 24: Order.objects.filter(id=order_id).update(change_percent=10) else: Order.objects.filter(id=order_id).update(change_percent=5) order = Order.objects.filter(id=order_id).first() value = order.true_price * (1 - order.change_percent * 0.01) if berth == 1: nee_val = ticket.F_real_price elif berth == 2: nee_val = ticket.C_real_price elif berth == 3: nee_val = ticket.Y_real_price if value < nee_val: sub = '改签补差' app_private_key_string = open(r"Users/rsakey/private2048.txt").read() alipay_public_key_string = open(r"Users/rsakey/paypublic.txt").read() # 实例化AliPay alipay = AliPay( appid="2021000122675132", app_notify_url=None, # 支付宝会向这个地址发送post请求 app_private_key_string=app_private_key_string, # 应用私钥 alipay_public_key_string=alipay_public_key_string, # 支付宝公钥 sign_type="RSA2", # 支付宝会向这个地址发送get请求 debug=True, # 默认是False ) # 定义请求地址传入的参数 res = alipay.api_alipay_trade_page_pay( out_trade_no=str(100000 - int(order.id)), # 订单号 total_amount=str(nee_val - value), # 交易金额(单位是元,保留两位小数) subject=sub, # 商品描述 return_url='http://127.0.0.1:8000/User/add_price_assure/' ) # 生成跳转到支付宝支付页面的url url = 'https://openapi.alipaydev.com/gateway.do?' + res return redirect(url) else: context = { 'user_id': user_id, 'ticket': ticket, 'order': order, } return render(request, 'assure_change.html', context) def add_price_assure(request): if request.method == 'GET': app_private_key_string = open(r"Users/rsakey/private2048.txt").read() alipay_public_key_string = open(r"Users/rsakey/paypublic.txt").read() alipay = AliPay( appid="2021000122675132", app_notify_url=None, # 支付宝会向这个地址发送post请求 app_private_key_string=app_private_key_string, # 应用私钥 alipay_public_key_string=alipay_public_key_string, # 支付宝公钥 sign_type="RSA2", # 支付宝会向这个地址发送get请求 debug=True, # 默认是False ) param = request.GET.dict() # 获取请求携带的参数并转换成字典类型 sign = param.pop('sign', None) # 获取sign的值,并将字典中以'sign'为键的键值对删除 # 对sign参数进行验证 statu = alipay.verify(param, sign) if statu: numstr = param.pop('out_trade_no') num = int(numstr) rel_num = 100000 - num order = Order.objects.filter(id=rel_num).first() uid = order.user_id ticket = Tickets.objects.filter(id=order.new_ticket_id).first() context = { 'user_id': uid, 'order': order, 'ticket': ticket, } return render(request, 'wait_change.html', context) else: numstr = param.pop('out_trade_no') num = int(numstr) order = Order.objects.filter(id=num).first() uid = order.user_id context = {'user_id': uid} return render(request, 'showfal.html', context) else: return render(request, 'showwro.html') def my_change(request, user_id): orders = Order.objects.filter(user_id=user_id) change_orders = [] change_new_tickets = [] for order in orders: if order.status == '改签审核中' or order.status == '改签成功' or order.status == '改签驳回': ticket = Tickets.objects.filter(id=order.new_ticket_id).first() change_orders.append(order) change_new_tickets.append(ticket) context = { 'user_id': user_id, 'orders': change_orders, 'tickets': change_new_tickets, } print(change_new_tickets) return render(request, 'my_change.html', context) def my_refund(request, user_id): orders = Order.objects.filter(user_id=user_id) refund_orders = [] for order in orders: if order.status == '退款审核中' or order.status == '退款成功' or order.status == '退款驳回': refund_orders.append(order) context = { 'user_id': user_id, 'orders': refund_orders, } return render(request, 'my_refund.html', context) def cancel_order(request, user_id, order_id): Order.objects.filter(id=order_id).update(status='已取消') return redirect('Users:my_orders', user_id) def consult(request, user_id): if request.method != 'POST': messages = Message.objects.all() fro_mess = [] to_mess = [] mess = [] for message in messages: if message.from_id == user_id or message.to_id == user_id: mess.append(message) context = { 'user_id': user_id, 'mess': mess, } return render(request, 'consult.html', context) else: new_mess = request.POST.get('new_mess') Message.objects.create(content=new_mess, from_id=user_id, to_id=1, status=0) return redirect('Users:consult', user_id) # Create your views here. @require_http_methods(["POST","GET"]) def search_recommend(request, user_id): # 统计历史订单中最多记录的机票信息,以终点为目标进行统计 duplicate_orders = Order.objects.values('final_point').annotate(count=Count('final_point')).filter(count__gt=1, user_id=user_id).order_by('-count')[:3] final_point_list = [] for order in duplicate_orders: final_point_list.append(order['final_point']) # print(order['final_point'], order['count']) # 查询航班信息 final_list=Flight.objects.filter(fin_point__in=final_point_list,status = '未起飞') final_list_data = [] for item in json.loads(serialize('json', final_list)): params = {**item['fields']} params.setdefault('id', item['pk']) final_list_data.append(params) return JsonResponse({ 'data': final_list_data })