1.前言

刚好最近跟技术部门的【产品人员+UI人员+测试人员】,组成了一桌可以去公司楼下醉得意餐厅吃饭的小team。

所以为了实现这些主要点餐功能:

  • 提高每天中午点餐效率,把点餐时间由20分钟优化为1分钟;
  • 知道在哪些付款金额范围内,可以有哪些菜单可以选择;
  • 知道人均付款金额;
  • 知道微信需要付款总金额;
  • 给餐厅老板发的点餐文案;
  • 当前点餐菜单里的具体菜品名和价格;

结合之前学习的知识点,利用django框架的MTV思想,开发一个简单的html页面,让公司同个局域网的同事自己进行操作和查询醉得意菜单并得到想要的数据。

2.相关完整流程的操作步骤

2.1.第一步,在django项目【helloworld】的根路径【helloworld/】下,手动新增一个空文件【utils】,并把自己写的一个py脚本放到该文件【utils】里面。

细节:

  • 工具类默认要放在同个文件夹A,文件夹A由使用人员手动创建;
  • 文件夹A名称默认为utils,默认放在项目根目录;(大多数框架和行业人员使用时的默认遵守规范);

2.2.第二步,单元测试【zuideyiMenu.py】里的类【Zuideyi】代码功能,确保能正常实现。

# coding:utf-8
'''
@file: zuideyiMenu.py
@author: jingsheng hong
@ide: PyCharm
@createTime: 2020年12月31日 10点01分
@contactInformation: 727803257@qq.com
''' import random class Zuideyi:
'''醉得意,你懂的。''' def __init__(self,total,couponMoney,everyPlanMinimalMoney,everyPlanMaximalMoney):
'''
:param total 就餐人数
:param couponMoney 优惠券金额
:param everyPlanMinimalMoney 经过小伙伴协商达成的人均最低消费金额
:param everyPlanMaximalMoney 经过小伙伴协商达成的人均最高消费金额
''' self.total = total
self.couponMoney = couponMoney
self.everyPlanMinimalMoney = everyPlanMinimalMoney
self.everyPlanMaximalMoney = everyPlanMaximalMoney
# 自助费= 5元/人 (该属性值暂时固定)
self.supportFee = 5
# 折扣率 = 实际充值金额/最终获得金额 (该属性值暂时固定)
self.discountRate = 1000/1120
# 菜品集合(该属性值暂时固定)
self.menu = {
"招牌菜": {"酱椒片片鱼":68},
"6大必点菜": {"鲜花椒牛肉粒":58,"梅菜扣肉":46, "香酥脆皮鸭":32, "汽锅时蔬":28, "台式三杯鸡":42},
"醉经典": {"得意醉排骨":12,"肉末茄子":23, "铁板黑椒牛肉":48, "大碗有机花菜":22,"肉沫蒸蛋":18, },
"下饭南方菜": {"农家烧笋干":32,"海味紫菜煲":32,"干锅千叶豆腐":23,"红烧日本豆腐":23, },
"当季时蔬": {"油淋芥兰":18,},
"店长推荐": {"闽南醋肉":36,},
} # 大菜集合
# self.bigDish = self.menus()[0]
# 小菜集合
# self.sideDish = self.menus()[1] # # 新增一个空dict,用于存储相关需要展示到前端页面的打印信息
# self.printAll = {} def total_price_range_of_dishes(self):
'''
:return 可以点的菜品总价区间
'''
total_price_range_of_dishes = [self.everyPlanMinimalMoney*self.total/self.discountRate + self.couponMoney, self.everyPlanMaximalMoney*self.total/self.discountRate + self.couponMoney] return total_price_range_of_dishes def menus(self): '''
:return 返回一个整理过的菜品集合
'''
# 定义单价大于等于30元的菜品为【大菜】,定义单价小于30元的菜品为【小菜】
# 大菜数据集合:bigDish,小菜数据集合:sideDish
bigDish = []
sideDish = []
for key1,value1 in self.menu.items():
for key2,value2 in value1.items():
if value2>=30:
bigDish.append({key2:value2})
else:
sideDish.append({key2:value2})
dish = [bigDish,sideDish]
print("大菜集合如下:")
print(bigDish)
print("小菜集合如下:")
print(sideDish)
return dish def amount_of_payment_of_everyOne(self,totalMoney):
'''
:param totalMoney 醉得意点餐菜单总金额(不扣除相关优惠券金额,但包含就餐人数的总自助费)
:return 实际人均需付餐费
'''
amount_of_payment_zuiDeyi = (totalMoney-self.couponMoney)
print("今天醉得意公众号里的会员卡扣款金额:%s"%amount_of_payment_zuiDeyi) amount_of_payment_weChat = (totalMoney-self.couponMoney)*self.discountRate
print("今天微信实际支付扣款金额:%s"%amount_of_payment_weChat)
amount_of_payment_of_everyOne = (totalMoney-self.couponMoney)*self.discountRate/self.total
print("今天醉得意可以点的菜品总金额为%s元,点餐人数为:%s人,实际人均需付餐费:%s元" %(totalMoney,self.total,amount_of_payment_of_everyOne)) result1= {}
result1["今天醉得意公众号里的会员卡扣款金额:"] = amount_of_payment_zuiDeyi
result1["今天微信实际支付扣款金额:"] = amount_of_payment_weChat
result1["今天醉得意可以点的菜品总金额为:"] = totalMoney
result1["今天醉得意点餐人数为:"] = self.total
result1["今天醉得意实际人均需付餐费为:"] = amount_of_payment_of_everyOne
return result1 def chioce(self,bigDishCounts,sideDishCounts):
'''
:param bigDishCounts 大菜个数
:param sideDishCounts 小菜个数
'''
print("hongjingsheng")
dish = self.menus()
a1 = random.sample(dish[0],bigDishCounts)
b1 = random.sample(dish[1],sideDishCounts)
neededMenu =a1+b1 # 可以点的点餐菜品
totalMoney = 0 # 可以点的菜品总金额,初始值为0
stringA = "" # 在微信里要写给醉得意老板的菜单
for value3 in neededMenu:
for key4,value4 in value3.items():
# print(value4)
totalMoney = totalMoney + value4
stringA = stringA + key4 + ","
stringA=stringA[:-1]
# 总菜单金额 = 总菜品金额+ 总自助费
totalMoney = totalMoney + self.supportFee*self.total
# # 判断totalMoney 是否在可消费总金额区间 if totalMoney >= self.total_price_range_of_dishes()[0] and totalMoney <= self.total_price_range_of_dishes()[1]: result = {}
result["今天醉得意可以点的点餐菜品:"] = neededMenu
result["今天醉得意可以点的点餐菜品总数:"] = bigDishCounts+sideDishCounts
result["今天可以微信里发给醉得意老板的点餐文案:--->老板,今天点餐人数%s,11:45可以陆续上菜,桌上饮料杯子不用放,餐桌号安排好了之后麻烦说一声。点菜菜单如下:"%self.total] = stringA
result["今天总消费金额区间:"] = self.total_price_range_of_dishes() result1 = self.amount_of_payment_of_everyOne(totalMoney)
print("=================================================================================================================================================================") newResult = dict(result,**result1)
return newResult else:
return {"error:":"该场景下没有符合要求的醉得意菜单"} def run(self):
# 当11个人:3个大菜,3个小菜;3个大菜,4个小菜; 3个大菜,5个小菜;3个大菜,6个小菜;3个大菜,7个小菜; 4个大菜,3个小菜;4个大菜,4个小菜; 4个大菜,5个小菜;4个大菜,6个小菜;
# 当10个人:3个大菜,3个小菜;3个大菜,4个小菜; 3个大菜,5个小菜;3个大菜,6个小菜;3个大菜,7个小菜; 4个大菜,3个小菜;4个大菜,4个小菜; 4个大菜,5个小菜;4个大菜,6个小菜;
# 当9个人:3个大菜,3个小菜;3个大菜,4个小菜; 3个大菜,5个小菜;3个大菜,6个小菜; 2个大菜,4个小菜;2个大菜,5个小菜;2个大菜,6个小菜;2个大菜,7个小菜;
# 当8个人:3个大菜,2个小菜;3个大菜,3个小菜;3个大菜,4个小菜; 3个大菜,5个小菜;3个大菜,6个小菜; 2个大菜,3个小菜;2个大菜,4个小菜;2个大菜,5个小菜;2个大菜,6个小菜;
# 当7个人:2个大菜,3个小菜;2个大菜,4个小菜;2个大菜,5个小菜;2个大菜,6个小菜;
# 当6个人:2个大菜,3个小菜;2个大菜,2个小菜;2个大菜,1个小菜; 1个大菜,5个小菜;1个大菜,4个小菜;1个大菜,3个小菜;1个大菜,2个小菜;1个大菜,1个小菜;
if self.total == 10 or 11 :
a1 = self.chioce(bigDishCounts=3,sideDishCounts=3)
a2 = self.chioce(bigDishCounts=3,sideDishCounts=4)
a3 = self.chioce(bigDishCounts=3,sideDishCounts=5)
a4 = self.chioce(bigDishCounts=3,sideDishCounts=6)
a5 = self.chioce(bigDishCounts=3,sideDishCounts=7)
a6 = self.chioce(bigDishCounts=4,sideDishCounts=3)
a7 = self.chioce(bigDishCounts=4,sideDishCounts=4)
a8 = self.chioce(bigDishCounts=4,sideDishCounts=5)
a9 = self.chioce(bigDishCounts=4,sideDishCounts=6)
b = [a1,a2,a3,a4,a5,a6,a7,a8,a9]
return {"all":b} if self.total == 9 :
a1 = self.chioce(bigDishCounts=3,sideDishCounts=3)
a2 = self.chioce(bigDishCounts=3,sideDishCounts=4)
a3 = self.chioce(bigDishCounts=3,sideDishCounts=5)
a4 = self.chioce(bigDishCounts=3,sideDishCounts=6)
a5 = self.chioce(bigDishCounts=2,sideDishCounts=4)
a6 = self.chioce(bigDishCounts=2,sideDishCounts=5)
a7 = self.chioce(bigDishCounts=2,sideDishCounts=6)
a8 = self.chioce(bigDishCounts=2,sideDishCounts=7)
b = [a1,a2,a3,a4,a5,a6,a7,a8]
return {"all":b}
if self.total == 8 :
a1 = self.chioce(bigDishCounts=3,sideDishCounts=2)
a2 = self.chioce(bigDishCounts=3,sideDishCounts=3)
a3 = self.chioce(bigDishCounts=3,sideDishCounts=4)
a4 = self.chioce(bigDishCounts=3,sideDishCounts=5)
a5 = self.chioce(bigDishCounts=3,sideDishCounts=6)
a6 = self.chioce(bigDishCounts=2,sideDishCounts=3)
a7 = self.chioce(bigDishCounts=2,sideDishCounts=4)
a8 = self.chioce(bigDishCounts=2,sideDishCounts=5)
a9 = self.chioce(bigDishCounts=2,sideDishCounts=6)
a10 = self.chioce(bigDishCounts=2,sideDishCounts=7)
b = [a1,a2,a3,a4,a5,a6,a7,a8,a9,a10]
return {"all":b}
if self.total == 7 :
a1 = self.chioce(bigDishCounts=2,sideDishCounts=3)
a2 = self.chioce(bigDishCounts=2,sideDishCounts=4)
a3 = self.chioce(bigDishCounts=2,sideDishCounts=5)
a4 = self.chioce(bigDishCounts=2,sideDishCounts=6)
b = [a1,a2,a3,a4]
return {"all":b} if self.total == 6 :
a1 = self.chioce(bigDishCounts=2,sideDishCounts=3)
a2 = self.chioce(bigDishCounts=2,sideDishCounts=2)
a3 = self.chioce(bigDishCounts=2,sideDishCounts=1)
a4 = self.chioce(bigDishCounts=1,sideDishCounts=5)
a5 = self.chioce(bigDishCounts=1,sideDishCounts=4)
a6 = self.chioce(bigDishCounts=1,sideDishCounts=3)
a7 = self.chioce(bigDishCounts=1,sideDishCounts=2)
a8 = self.chioce(bigDishCounts=1,sideDishCounts=1)
b = [a1,a2,a3,a4,a5,a6,a7,a8]
return {"all":b} if __name__ =="__main__":
test = Zuideyi(9,5,19,22.5)
test.run()

2.3.第三步,在指定应用【hello】里的目录【templates】里编写一个【search_form.html】,用于让使用人员输入并提交相关数据。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>醉得意点餐页面</title>
</head>
<body>
<form action="{% url ‘search_interface’ %}" method="get">
请输入就餐的人数:<input type="text" name="total" placeholder="请输入就餐人数" value="7"/>
<br>
请输入优惠券金额:<input type="text" name="couponMoney" placeholder="请输入优惠券金额" value="5" />
<br>
人均最低消费金额:<input type="text" name="everyPlanMinimalMoney" placeholder="人均最低消费金额" value="22" />
<br>
人均最高消费金额:<input type="text" name="everyPlanMaximalMoney" placeholder="人均最高消费金额" value="30" />
<br>
<br>
<input type="submit" value="开始搜索相关合适的菜单信息"/>
</form>
</body>
</html>

细节:

①.form属性里的action元素的值的赋值含义,可以参考这篇博客:https://www.cnblogs.com/softidea/p/5426244.html

②.form属性里的action元素的值如何赋值的官方解释,可以参考这篇菜鸟教程:https://www.runoob.com/tags/att-form-action.html

③.action值的使用场景分析

2.4.第四步,在指定应用【hello】里的目录【templates】里编写一个【zuideyi_result.html】,用于展示查询到的醉得意菜单相关数据。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>符合点餐要求的醉得意</title>
</head>
<body>
{#<h4> {{views_dict}}</h4>#}
{#<h2> {{views_dict.b}}</h2>#}
{#<br>==============<br>#}
{##}
{##}
{#<h4> {{views_dict.all}}</h4>#}
{#<br>==============<br>#}
{##}
{##}
<ul>
<h4> {% for thing in views_dict.all %}
{% for i,j in thing.items %}
{{ i }}{{ j }}<br>
{% endfor %}
<br>
========================================
<br>
<br>
{% endfor %} </h4>
</ul>
</body>
</html>

2.5.第五步,在指定应用【hello】里的【views.py】里编写一个视图函数/接口【search_form】,用于返回【search_form.html】。

def search_form(request):
return render(request, 'search_form.html')

2.6.第六步,在指定应用【hello】里的【views.py】里编写一个视图函数/接口【search】,用于返回【zuideyi_result.html】。

from utils.zuideyiMenu import Zuideyi

# 接收请求数据

def search(request):
request.encoding='utf-8'
# if 'total' in request.GET and request.GET['total']:
# message = '你搜索的内容为: ' + request.GET['total']
# else:
# message = '你提交了空表单' total = request.GET['total']
couponMoney = request.GET['couponMoney']
everyPlanMinimalMoney = request.GET['everyPlanMinimalMoney']
everyPlanMaximalMoney = request.GET['everyPlanMaximalMoney'] # list = [total,couponMoney,everyPlanMinimalMoney,everyPlanMaximalMoney] total = int(total)
couponMoney = int(couponMoney)
everyPlanMinimalMoney = float(everyPlanMinimalMoney)
everyPlanMaximalMoney = float(everyPlanMaximalMoney) zuideyi = Zuideyi(total=total,couponMoney=couponMoney,everyPlanMinimalMoney=everyPlanMinimalMoney,everyPlanMaximalMoney=everyPlanMaximalMoney)
run = zuideyi.run()
views_dict = run
return render(request,'zuideyi_result.html',{"views_dict":views_dict})

2.7.第七步,在django项目【helloworld】里路径为【helloworld/helloworld/urls.py/】里编写两个不同的url匹配规则。

    url(r'^search-form/$', views.search_form),
url(r'^search/$', views.search),

2.8.第八步,启动django项目【helloworld】服务。

2.9.第九步,在任一浏览器输入地址【http://127.0.0.1:8000/search-form/】或者地址【http://个人电脑IP:8000/search-form/】,会成功访问到页面名为【醉得意点餐页面】的html页面。

2.10.第十步,在第九步得到的【醉得意点餐页面】里,点击按钮【开始搜索相关合适的菜单信息】,会成功访问到页面名为【符合点餐要求的醉得意】的html页面,该html页面会展示我们想要的相关内容。

django学习-11.开发一个简单的醉得意菜单和人均支付金额查询页面的更多相关文章

  1. 开发一个简单的postgresql extension

      主要是学习如何编写一个简单的pg extension,参考https://severalnines.com/blog/creating-new-modules-using-postgresql-c ...

  2. LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS

    LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163. ...

  3. Python开发一个简单的BBS论坛

    项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...

  4. 如何开发一个简单的HTML5 Canvas 小游戏

    原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...

  5. 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务

    [源码下载] 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后 ...

  6. Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状)

    Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状) 本篇博客来给大家介绍怎样使用Lua这门语言来开发一个简单的小游戏-记数字踩白块. 游戏的流程是这种:在界面上生成5个数1~5字并显 ...

  7. Linux第三周学习总结——构造一个简单的Linux系统MenuOS

    第三周学习总结--构造一个简单的Linux系统MenuOS 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...

  8. 作业1开发一个简单的python计算器

    开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568 ...

  9. 【Mac系统 + Python + Django】之开发一个发布会系统【Django视图(二)】

    此学习资料是通过虫师的python接口自动化出的书学习而来的,在此说明一下,想学习更多的自动化的同学可以找虫师的博客园,非广告,因为我python+selenium自动化也是跟虫师学的,学习效果很好的 ...

随机推荐

  1. Stream API处理集合

    使用流来遍历集合 简介 如何工作 总结 从集合或数组创建流 简介 如何工作 结论 聚合流的值 简介 如何工作 结论 转载 使用流来遍历集合 简介: Java的集合框架,如List和Map接口及Arra ...

  2. Java模板引擎Freemarker

    Java模板引擎Freemarker 1.取值(插值)指令 2.逻辑指令:if.switch 3.字符串.集合操作 4.自定义函数 5.list排序内建函数.常用指令 6.自定义指令 7.freema ...

  3. Kafka调试入门(一)

    很多人对kafka消息队列应该不陌生,使用起来也比较方便.对kafka最常见的操作一般有如下几种: 启动kafka集群 创建一个名称为xxx的主题(topic) 查看已经创建好的主题 向xxx这个主题 ...

  4. HDU6434 Count【欧拉函数 线性筛】

    HDU6434 I. Count T次询问,每次询问\(\sum_{i=1}^{n}\sum_{j=1}^{n-1}[gcd(i-j,i+j)=1]\) \(T\le 1e5, n \le 2e7\) ...

  5. java swing JDialog 和 java.util.concurrent的使用

    参考链接: Java-Swing的JFrame的一些插件使用详解 java swing JDialog 使用 ScheduledExecutorService定时周期执行指定的任务 swing JDi ...

  6. CF-gym/101810 J、T-Shirts Dilemma

    题目链接:点我 题意: 给你一个区间[a,b],让你从里面选一个连续子区间[x,y](子区间可以为[a,b]),把这个区间的所有数或起来x|x+1|x+2|...|y 你要使得区间[x,y]异或起来的 ...

  7. PowerShell随笔3 ---别名

    上一篇提到了别名,这个有必要说一下,因为我们常常会遇到以下两种情况: 自己写脚本,想快速一些,使用命名 看别人的脚本,发现别人和你想的一样,用了别名,但是你忘记了这个别名是什么意思. 我们可以通过Ge ...

  8. Python基础--核心数据类型

    python的核心数据类型: Number 数字(整数,浮点数,复数,布尔型数) String 字符串 List 列表 Tuple 元组 Dictionary 字典 Set 集合 1. 整数(整型数) ...

  9. 1009E Intercity Travelling 【数学期望】

    题目:戳这里 题意:从0走到n,难度分别为a1~an,可以在任何地方休息,每次休息难度将重置为a1开始.求总难度的数学期望. 解题思路: 跟这题很像,利用期望的可加性,我们分析每个位置的状态,不管怎么 ...

  10. 桶排序 && leetcode 41

    桶排序 对于0-1000 ,用1001个桶  简单版 或者用10个桶0-9,先按各位装桶,然后依(桶)次放回,然后再按十位放桶,放回,然后百位. 也就是基数排序 https://www.cnblogs ...