🎓

你刚刚拥有了一个
自己的机票比价网站

别怕,我用最大白话,一步步带你理解
这个网站是怎么「从无到有」做出来的

🕐 阅读约15分钟 🎮 有互动练习 💡 零基础友好

📑 今天你会学到

1

网站到底是个啥?

先搞懂全局,再看细节

🍜

想象一下餐厅

你去一家餐厅吃饭。你看到的菜单、装修、桌椅——这是「前端」,是给你看、给你用的。
但后面还有一个你看不到的「厨房」——厨师在里面炒菜、配料、计算成本——这是「后端」

🖥️

前端 = 你看到的网页

搜索框、航班列表、价格显示、按钮……所有你眼睛看到的、手能点的东西

用的技术:HTML + CSS + JavaScript
⚙️

后端 = 背后的大脑

搜索航班、计算价格、给航班打分、连接各个平台……所有你看不到的计算

用的技术:Python

当你在网站上搜一次航班,发生了什么?

👆
你点「搜索」
前端收到指令
📡
前端发请求
告诉后端"我要查上海→东京"
🧠
后端计算
搜航班、比价格、打评分
📋
返回结果
前端把结果漂亮地展示出来
💡 记住这个核心概念:前端负责「长什么样」,后端负责「怎么算」。它们俩通过网络互相说话。

2

我做了哪几个文件?

一共就5个文件,各有分工

📄
app.py Python 后端

这是「大脑」。负责:存储机场数据、搜索航班、计算评分、分析优缺点。所有聪明的事情都在这里发生。

打个比方:它就是餐厅后厨的厨师长 + 采购经理 + 成本会计,全干了。

🎨
static/index.html 前端页面

这是「脸面」。你看到的搜索框、航班卡片、价格对比、评分圆环……全部在这一个文件里。它包含了 HTML(骨架)+ CSS(化妆)+ JavaScript(动作)。

打个比方:它就是餐厅的门面装修 + 菜单设计 + 服务员的应对话术。

📦
requirements.txt 依赖清单

列出了程序运行需要的「工具包」。就像做菜前要准备食材清单一样,这里列出了 fastapi、uvicorn 等工具。

打个比方:它是菜谱上的「食材准备」列表。

🔑
.env.example 配置模板

如果你想连接真正的航班数据库(Amadeus),就把密钥填在这里。不填也没关系,程序会用演示数据。

打个比方:它是 VIP 会员卡申请表,有了就能享受高级服务,没有也能正常用。

📖
README.md 说明书

给人看的使用说明,告诉别人怎么安装和运行。

🎯 重点就两个文件:app.py(后端大脑)和 static/index.html(前端界面)。其他都是辅助的。

3

HTML 是什么?

网页的「骨架」,就像房子的框架

🏗️

盖房子的比喻

盖房子先要搭框架——哪里是客厅、哪里是卧室、门在哪、窗在哪。
HTML 就是网页的框架。它告诉浏览器:这里放标题、那里放按钮、这里放一张图。

HTML 用「标签」来描述内容。标签长这样:

<!-- 这是一个标题标签 -->
<h1>我是一个大标题</h1>

<!-- 这是一个段落标签 -->
<p>我是一段普通文字</p>

<!-- 这是一个按钮标签 -->
<button>点我!</button>

<!-- 这是一个输入框标签 -->
<input type="text" placeholder="请输入城市">
💡 规律:标签都是成对的,有开始 <h1> 就有结束 </h1>,内容夹在中间。就像括号 () 一样要配对。

在我们的机票比价网站中,搜索框部分的 HTML 简化版长这样:

<!-- 搜索区域的大盒子 -->
<div class="search-form">

  <!-- 出发城市输入框 -->
  <label>出发城市</label>
  <input type="text" placeholder="输入城市或机场">

  <!-- 到达城市输入框 -->
  <label>到达城市</label>
  <input type="text" placeholder="输入城市或机场">

  <!-- 搜索按钮 -->
  <button>搜索航班</button>

</div>

🎮 动手试一试!

下面有一小段 HTML 代码。你改改文字,点「运行」,看看右边会变什么:

✏️ 代码(试试改文字!)
👀 效果预览

点击「运行看看」查看效果 →

🎉 恭喜!你刚刚写了人生第一段 HTML 代码(如果你改了的话)。网页的骨架就是这么一个个标签搭出来的!

4

CSS 是什么?

给骨架穿漂亮衣服、化妆

👗

化妆的比喻

如果 HTML 是一个人的骨架和身体,那 CSS 就是衣服、化妆、发型
同一个人(同一份 HTML),穿不同的衣服(用不同的 CSS),看起来就完全不一样。

CSS 的写法是:选中一个东西,然后给它设置样式

/* 让所有按钮变成蓝色圆角 */
button {
  background: #4f46e5; /* 背景色:靛蓝色 */
  color: white; /* 文字:白色 */
  border-radius: 12px; /* 圆角 */
  padding: 12px 24px; /* 内边距(让按钮不那么挤) */
  font-size: 16px; /* 字号 */
}

🎮 CSS 的魔法

同一个按钮,点下面的按钮给它「换衣服」:

点击上面的按钮切换样式

💡 在我们的项目中:我用了一个叫 TailwindCSS 的工具。它把常用的 CSS 样式变成了简短的"代号"。比如 rounded-xl = 大圆角,bg-blue-500 = 蓝色背景。这样写起来特别快。

5

JavaScript 是什么?

让网页「活」起来的魔法

🤖

木偶戏的比喻

HTML 做了一个木偶(骨架),CSS 给木偶穿了衣服。但木偶不会动啊!
JavaScript 就是操纵木偶的「线」——让按钮被点了能响应、让搜索结果能刷新出来、让下拉框能弹出选项。

在机票比价工具里,JavaScript 做了这些事情:

1️⃣ 你输入「上海」
→ JS 把你打的字发给后端搜索匹配的机场
2️⃣ 你点「搜索航班」
→ JS 收集你填的出发地、目的地、日期,打包发给后端
3️⃣ 后端返回结果
→ JS 把数据变成一张张好看的航班卡片,塞进页面
4️⃣ 你点「加入对比」
→ JS 记住你选了哪些,弹出对比面板

核心代码长这样(我加了中文注释帮你看懂):

// 当用户点击「搜索航班」时执行这个函数
async function doSearch() {

  // 第一步:收集用户填写的信息
  const origin = "PVG"; // 出发机场   const dest = "NRT"; // 到达机场   const date = "2026-04-01"; // 日期
  // 第二步:发送给后端(就像下单给厨房)
  const resp = await fetch('/api/search', {     method: 'POST',
    body: JSON.stringify({ origin, dest, date })
  });

  // 第三步:拿到后端返回的航班数据
  const data = await resp.json();
  // 第四步:把数据展示在页面上
  renderResults(data.flights); }

🎮 感受 JavaScript 的力量

点击按钮,JavaScript 会动态计算并改变页面内容:

模拟搜索:上海 → 东京

结果会出现在这里...

点击计数器(JavaScript 最基础的功能)
0

每次点击,JavaScript 都在读取数字 → 计算 → 更新页面


6

Python 后端做了什么?

搜索引擎 + 评分算法 + 数据服务

👨‍🍳

继续我们的餐厅比喻

Python 后端就是厨房。它做了三大件事:
食材仓库(存储所有机场和航司数据)
做菜过程(根据你的要求搜索匹配的航班)
调味评分(给每个航班打综合分)

后端具体干了什么?4 件大事:

📁 第一件:存了一个大数据库

60多个全球机场的信息(代码、城市、国家、经纬度),45家航空公司的评级。比如:

{"code": "PVG", "name": "上海浦东国际机场", "city": "上海", "lat": 31.14}
{"code": "NRT", "name": "东京成田国际机场", "city": "东京", "lat": 35.76}

🔍 第二件:智能生成航班

根据两个城市的距离自动计算飞行时间,根据航线自动选择合理的航空公司,根据航司类型(全服务/廉价)给出合理的票价范围。

比如上海→东京约1800km,飞行时间约2-3小时,全日空/日航会稍贵,春秋航空会便宜但没免费行李。

💰 第三件:模拟多平台价格

同一个航班在携程、飞猪、去哪儿等不同平台的价格会有微小差异(因为平台补贴、手续费不同)。后端模拟了这个现实情况,让你一眼看出哪个平台最便宜。

🏆 第四件:评分 + 打标签

综合5个维度打分(下一章详细讲),然后自动贴上「最佳性价比」「最低价格」「最短用时」等标签,并生成优缺点列表。

💡 为什么用 Python?因为 Python 语法最接近自然语言,容易读懂。而且它有非常多现成的工具包(比如 FastAPI 帮你快速搭建网络服务),不用从零造轮子。

7

前后端怎么配合的?

一次搜索的完整旅程

让我们跟踪一次「搜索上海→东京航班」的完整过程

1

你在搜索框输入 "上海"

前端 JavaScript 检测到你在打字,立刻把"上海"发给后端:
GET /api/airports?q=上海
后端 Python 在机场数据库里搜索,找到「浦东」和「虹桥」,返回给前端。
前端 弹出下拉框让你选。
2

你选择了 "上海浦东 PVG",目的地选了 "东京成田 NRT"

前端 JavaScript 把机场代码 "PVG" 和 "NRT" 存起来,等你点搜索。
3

你点击「搜索航班」

前端 JavaScript 打包一个"订单"发给后端:
POST /api/search → {origin:"PVG", dest:"NRT", dep_date:"2026-04-01", cabin:"economy", passengers:1}
同时,前端显示加载动画让你知道"正在搜索"。
4

后端「做菜」— 生成航班数据

Python 后端 开始干活:
① 计算上海到东京距离 ≈ 1780km
② 基础飞行时间 ≈ 2.1 小时
③ 挑选合理的航空公司(国航、东航、全日空、日航、春秋...)
④ 为每家航司生成 1-3 个航班,价格、时间各有不同
⑤ 模拟各平台报价差异
5

后端「评分」— 给每个航班打分

对每个航班计算 5 个维度的分数,加权算出总分。
自动标注"最佳性价比""最低价格""最短用时"等标签。
自动分析优缺点(直飞?廉价航空?可退票?)
6

前端收到结果,漂亮地展示出来

JavaScript 拿到 26 个航班数据后:
① 按性价比排序
② 把每个航班画成一张卡片(航司、时间、价格、评分环)
③ 显示 AI 推荐总结
④ 隐藏加载动画,展示结果
💡 整个过程不到1秒钟!你点搜索到看到结果,前后端来了一个完整的"对话"。这就是现代网站的工作方式。

8

评分算法怎么算的?

五大维度打分,这是核心的核心

🏫

高考算分的比喻

就像高考有语数英物化生,每科满分不同、权重不同。
机票评分也有 5 个"科目",每个科目 0-100 分,最后按重要程度加权平均出总分。

💰
价格评分 权重 35%

越便宜分越高。最便宜的那个得 100 分,最贵的接近 0 分。

⏱️
用时评分 权重 25%

飞行时间越短分越高。最快的得 100 分。

🔄
便捷评分 权重 18%

直飞 100 分,经停 1 次 65 分,2 次以上 35 分。凌晨出发再扣分。可退票加分。

航司评分 权重 12%

根据航空公司口碑打分。新加坡航空 96 分,全日空 92 分,春秋 62 分。

🛋️
舒适评分 权重 10%

看有没有 WiFi、娱乐系统、充电口、餐食。有一项加一点分。

🧮 总分公式

总分 = 价格×35% + 用时×25% + 便捷×18% + 航司×12% + 舒适×10%

🎮 自己动手算一算!

拖动滑块,看看不同分数组合的最终得分是多少:

💰 价格评分 (35%) 80
⏱️ 用时评分 (25%) 60
🔄 便捷评分 (18%) 100
⭐ 航司评分 (12%) 90
🛋️ 舒适评分 (10%) 75
综合评分
78.3
80×0.35 + 60×0.25 + 100×0.18 + 90×0.12 + 75×0.10 = 78.3
这是一个不错的航班!

🎉

恭喜你看完了!

现在你已经理解了:网站的前后端结构、HTML/CSS/JavaScript 各自的作用、Python 后端怎么处理数据、以及评分算法是怎么算的。

🧱
HTML = 骨架
搭出页面结构
👗
CSS = 衣服
让页面好看
JS = 大脑
让页面能交互
✈️ 去试试你的机票比价工具