场景编程集锦 - 快乐时光咖啡屋

时间:2023-02-09 17:02:57

1. 场景描述

场景编程集锦 - 快乐时光咖啡屋   咖啡、可可和茶并称为世界著名的三大饮品。近十年来,咖啡倍受国人偏爱和追捧。因为咖啡文化与时尚生活、工作和休闲娱乐紧密地联系在一起,喝咖啡也似乎成为了小资生活与时尚生活的象征与标配。然而大部分中国人真正接受咖啡,并逐渐养成喝咖啡的习惯,不过是从星巴克进入中国后才开始的,至今也不过十几年的时间。咖啡馆不同于其他餐饮场所,自有其独特的魅力,由于其环境优雅,营造出放松的氛围,让处于快节奏工作和生活状态下的人们,可以借此放松身心、消除疲惫。咖啡馆避免了一些餐饮和饮品店的噪杂,所以它成为了人们聚会、洽谈生意、闲暇小憩和男女约会的理想之地,甚至成为一些人打发休闲时光的一个好去处。现代社会,人们进出咖啡馆不仅是一种消费行为,也参杂了社交、商务等需求,成为人们生活中的另一个空间。   正因如此,在城市商圈或者写字楼周边,咖啡店犹如雨后春笋随处可见,快乐时光咖啡屋就是其中之一。这是一家连锁的咖啡屋,在全国拥有20多家连锁店,具有强大的美誉度和良好的口碑。其特色之一就是其官网上推荐的营销活动:“特价咖啡天天喝”。每一天都有一款打折咖啡,但是工作日和周末的打折力度不同。这个活动受到众多年轻消费者的青睐。本案例中我们将通过Python开发一个WEB网站程序,再现“特价咖啡天天喝”的营销活动场景。


2. 编程思路

  快乐时光网站要实现的核心功能就是根据工作日和周末,在网站上展示不同的咖啡价目单。

2.1 开发工具

  Python提供了多种网站Web程序开发的解决方案,主流的开发工具有Flask和Django。Django适合大型网站开发,而Flask则对于小型WEB程序开发更加简洁和灵活。结合本案例的实际需要,我们选择Flask来开发快乐时光咖啡屋的网站程序更为恰当。

2.2 程序构成

  我们的快乐时光网站由3个部分构成:   后台服务器程序:定义路由和试图函数,判断工作日和周末,生成不同的咖啡价目表。   模板程序:前端展示的网站页面,它包含支持Jinjia2的模板语句,实现动态数据的加载。我们需要创建目录templates,存放网站的模板文件。   静态资源:包含网站的图片文件、CSS网页格式文件。我们需要创建目录static存放网站静态资源,其下创建子目录images保存图片文件,创建子目录存放css文件。   有了以上的程序规划,我们就可以进行网站程序的编码工作了。


3. 程序代码

3.1 服务器程序 joytime.py

"""
  joytime.py : 欢乐时光咖啡屋
"""
from flask import Flask, render_template
import datetime

joy_menus = [
    ('Cappuccino', '卡布诺奇', 32),
    ('Vanilla Latte', '香草拿铁', 35),
    ('Caramel Macchiato', '焦糖玛奇朵', 34),
    ('Latte', '拿铁', 30),
    ('Americano', '美式咖啡', 25),
    ('Mocha', '摩卡', 33),
    ('Brewed Coffee', '新鲜调制咖啡', 20)
    ]   # ①

DISCOUNT = 0.85
app = Flask(__name__)

@app.route('/')   # ②
def index():   # ③
    today = datetime.datetime.now()
    t_visit = today.strftime('%Y-%m-%d   %H:%M:%S %A')   # ④
    menus = []
    weekend = 0
    if today.weekday() >= 5:    # ⑤
        for item in joy_menus:
            menus.append((item[0], item[1], int(item[2]*DISCOUNT)))   # ⑥
        weekend = 1
    else:
        menus = joy_menus
    return render_template('joytime.html', today=t_visit, menus=menus, weekend=weekend)  # ⑦

if __name__ == '__main__':
    app.run()   # ⑧

重要语句说明: 语句①定义菜单列表,列表元素是一个元组,包括咖啡英文名称,中文名称和价格。 语句②定义路由,代表在浏览器中访问:localhost:5000,将执行视图函数index()。 语句③定义视图函数index()。 语句④将当前日期转换成字符串。 语句⑤判断今天是否是周末。 语句⑥动态创建咖啡价目表。 语句⑦渲染模块,实现动态页面展示。 语句⑧启动快乐时光的后台服务程序。

3.2 模板文件:joytime.html

<!—joytime.html 模板文件 -->

<!doctype html>
<html>
<head>
  <meta charset='utf-8'/>
  <title>快乐时光咖啡屋</title>
  <link rel="stylesheet" href="{{url_for('static',filename='css/joytime.css/')}}" />
</head>
<body>
<div >
  Welcome to Joy Time
</div>

<div >
<ul>
  <li>Home</li>
  <li>Members</li>
  <li>About</li>
  <li>Join Us</li>
</ul>
</div>

<div >
  <img src="{{url_for('static',filename='images/joytime.png/')}}"
    width='1300' height='300' alt='coffee picture'/>
</div>

<div >
  {% if weekend==1 %}
  <h2>Today specials</h2>
  {% endif %}
  <p>Date: {{today}}</p>
</div>

<div >
<ul>
  {% for item in menus %}
  <li>{{item[1]}} </li>
  {% endfor %}
</ul>
</div>

<div >
<ul>
  {% for item in menus %}
  <li>...... ¥{{item[2]}}</li>
  {% endfor %}
</ul>
</div>

<div >
  <p>&copy;Copyright : Joytime.com.cn</p>
</div>

</body>
</html>

3.3 css格式文件

/* joytime.css : 欢乐时光咖啡屋 */
body {
  background-color: linen;
}

li {
  list-style: none;
}

#header {
  background-color: black;
  color: white;
  text-align: center;
  padding: 5px;
}

#nav {
  line-height: 35px;
  background-color: #dddddd;
  color: #700505;
  height: 300px;
  width: 150px;
  float: left;
  padding: 5px;
}

#section {
  width: 1100px;
  float: left;
  padding: 5px;
  text-align: center;
}

#visit {
  clear: both;
  float: left;
  margin-left: 680px;
  text-align: center;
}

#item {
  width: 200px;
  clear: both;
  float: left;
  padding: 5px;
  margin-left: 630px;
  line-height: 30px;
}

#price {
  width: 500px;
  float: left;
  padding: 5px;
  line-height: 30px;
}

#footer {
  background-color: black;
  color: white;
  clear: both;
  text-align: center;
  padding: 5px;
}

3.4 网站图片文件:joytime.png

图片效果如下: 场景编程集锦 - 快乐时光咖啡屋


4. 执行效果

4.1 环境安装

快乐时光网站运行,需要安装Flask第三方开发库。你可以在Windows的命令行窗口中执行以上命令: pip install flask -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

4.2 程序执行

第一步启动后台服务器程序:

D:\cases\快乐时光咖啡屋>python joytime.py
 * Serving Flask app 'joytime'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit

第二步使用浏览器访问网站:127.0.0.1:5000或者localhost:5000,你将看到如下结果: 场景编程集锦 - 快乐时光咖啡屋   至此,大功告成。我们已经完成了快乐时光咖啡屋官网程序的开发。应该说这是一个功能非常简单的网站程序,但对于WEB网站开发的初学者来说,这是一个很好的起点,作为一个练手项目,是一个良好的开端。


5. 程序优化

我们建议对joytime.py进行两个方面的优化工作。具体说来就是: 1.咖啡价目表是以硬编码的方式写入程序,如果咖啡价格调整,我们需要手动修改程序,这种程序与数据构成方式我们称之为紧耦和; 2. 这一版程序目前仅实现了周末咖啡打折,并没有完全实现天天打折的业务需求。 为了解决以上两个问题,可有以下的解决方案。一是将咖啡价目表joy_menus列表内容以文本文件形式存放,在程序启动后进行一次性加载,实现程序与数据的分离;二是进一步优化视图函数index(),在条件分支语句中,针对今天是工作日的情况,随机选择一种咖啡打85折,以真正兑现“特价咖啡天天喝”这个庄严的营销承诺。具体工作如下:

5.1 咖啡价目表保存

将咖啡价目表保存到文本文件coffee_menu.txt中,内容如下:

Cappuccino	卡布诺奇	32
Vanilla Latte	香草拿铁	35
Caramel Macchiato		焦糖玛奇朵	34
Latte	拿铁	30
Americano	美式咖啡	25
Mocha	摩卡	33
Brewed Coffee		新鲜调制咖啡	20

每行数据代表一种咖啡,包含咖啡英文名称、咖啡中文名以及咖啡价格等三项数据,数据项之间使用tab键进行分隔。文件以UTF-8格式保存。你可以使用Windows notepad对这个文件进行编辑和修改。

5.2 在joytime.py模块中新增函数load_menu()

这个函数的主要作用是读取咖啡价目表文本文件。内容如下所示:

def load_menu(fname):
    """
    加载咖啡价目表内容
    """
    joy_menus = []
    with open(fname, encoding='utf8') as infile:
        lines = infile.readlines()
        for line in lines:
            items = line.strip().split('\t')
            joy_menus += [(items[0], items[1], int(items[2]))]

return joy_menus

这个函数load_menu(fname)能够方便地将coffee_menu.txt读入一个Python的列表,列表的每一个元素是一个元组,其中包含了包含咖啡英文名称、咖啡中文名以及咖啡价格等内容。

5.3 修改joytime.py相关内容

"""
  joytime.py : 欢乐时光咖啡屋
"""
from flask import Flask, render_template
import datetime

def load_menu(fname):    # ①
    """
    加载咖啡价目表内容
    """
    joy_menus = []
    with open(fname, encoding='utf8') as infile:
        lines = infile.readlines()
        for line in lines:
            items = line.strip().split('\t')
            joy_menus += [(items[0], items[1], int(items[2]))]   # ②
    return joy_menus

fname = 'coffee_menu.txt'
joy_menus = load_menu(fname)    # ③
DISCOUNT = 0.85

app = Flask(__name__)

@app.route('/')
def index():
    today = datetime.datetime.now()
    t_visit = today.strftime('%Y-%m-%d   %H:%M:%S %A')
    menus = []
    weekend = 0

    if today.weekday() >= 5:
        for item in joy_menus:
            menus.append([item[0], item[1], int(item[2]*DISCOUNT)])
        weekend = 1
    else:
        for item in joy_menus:    # ④
            menus.append([item[0], item[1], item[2]])
        numbers = len(menus)
        idx = today.weekday() % numbers     # ⑤

        menus[idx][-1] = int(menus[idx][-1]*DISCOUNT)    # ⑥

    return render_template('joytime.html', today=t_visit, menus=menus, weekend=weekend)

if __name__ == '__main__':
    app.run()

重要语句说明如下: 语句①定义加载咖啡价目表的函数; 语句②构建咖啡价目表的列表项; 语句③执行函数以从文本文件coffee_menu.txt读入咖啡价目表; 语句④循环体完成列表的内容复制,当然这个循环你也可以使用列表推导式代替; 语句⑤工作日选取一种咖啡打折,这里的idx代表某种咖啡在列表menus中的序号; 语句⑥对打折咖啡的价格进行进行调整。 以上就是程序优化部分的全部内容和代码实现。