From cfbaf585a73422e1cab7ef1e19cc7415c8502718 Mon Sep 17 00:00:00 2001
From: kejingfan <jingfan_ke@bjtu.edu.cn>
Date: Fri, 14 Jun 2024 14:53:50 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=A4=A7=E4=BD=9C=E4=B8=9A?=
 =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=AB=AF=E4=BB=A3=E7=A0=81=EF=BC=8C=E6=96=B0?=
 =?UTF-8?q?=E5=BB=BA=E7=AE=A1=E7=90=86=E7=AB=AF=EF=BC=8C=E7=AE=A1=E7=90=86?=
 =?UTF-8?q?=E7=AB=AF=E4=B8=8D=E5=8F=AF=E7=94=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../Manager/data_source/airports/airports.csv | 208 +++++++++++++
 .../Manager/data_source/airports/airports.sql | 208 +++++++++++++
 .../Manager/data_source/airports/make_data.py |  32 ++
 Project/Manager/data_source/airports/raw.txt  | 241 +++++++++++++++
 .../data_source/db_user.sql}                  |   0
 .../Manager/data_source/flights/flights.sql   | 105 +++++++
 .../Manager/data_source/init_manager_db.sql   |   9 +
 .../data_source/init_service_db.sql}          |  29 +-
 Project/Manager/func/config.py                |   9 +
 Project/Manager/func/index.py                 |  32 ++
 Project/Manager/func/login.py                 |  34 +++
 Project/Manager/main.py                       |  49 +++
 Project/Manager/static/css/index.css          | 251 ++++++++++++++++
 Project/Manager/static/css/login.css          |  93 ++++++
 Project/Manager/static/js/index.js            |  42 +++
 Project/Manager/static/js/login.js            |  80 +++++
 Project/{ => Manager}/templates/index.html    |  59 ++--
 Project/Manager/templates/login.html          |  34 +++
 .../__pycache__/config.cpython-311.pyc        | Bin
 .../__pycache__/main.cpython-311.pyc          | Bin
 Project/Service/func/__init__.py              |   0
 .../func/__pycache__/__init__.cpython-311.pyc | Bin
 .../func/__pycache__/book.cpython-311.pyc     | Bin 0 -> 5525 bytes
 .../__pycache__/cancel_order.cpython-311.pyc  | Bin 0 -> 2710 bytes
 .../func/__pycache__/config.cpython-311.pyc   | Bin
 .../func/__pycache__/get_db.cpython-311.pyc   | Bin
 .../func/__pycache__/index.cpython-311.pyc    | Bin 0 -> 1338 bytes
 .../func/__pycache__/login.cpython-311.pyc    | Bin
 .../func/__pycache__/modify.cpython-311.pyc   | Bin 0 -> 7224 bytes
 .../func/__pycache__/order.cpython-311.pyc    | Bin 0 -> 2553 bytes
 .../__pycache__/order_list.cpython-311.pyc    | Bin 0 -> 2738 bytes
 .../func/__pycache__/pay.cpython-311.pyc      | Bin 0 -> 811 bytes
 .../__pycache__/pay_confirm.cpython-311.pyc   | Bin 0 -> 1754 bytes
 .../func/__pycache__/search.cpython-311.pyc   | Bin 0 -> 3023 bytes
 .../func/__pycache__/signup.cpython-311.pyc   | Bin 0 -> 3573 bytes
 .../func/__pycache__/utils.cpython-311.pyc    | Bin 0 -> 2072 bytes
 .../__pycache__/verify_user.cpython-311.pyc   | Bin
 Project/Service/func/book.py                  |  92 ++++++
 Project/Service/func/cancel_order.py          |  51 ++++
 Project/{ => Service}/func/config.py          |   0
 Project/{ => Service}/func/index.py           |   7 +-
 Project/{ => Service}/func/login.py           |   0
 Project/{ => Service}/func/modify.py          |  38 +--
 Project/Service/func/order.py                 |  47 +++
 Project/Service/func/order_list.py            |  54 ++++
 Project/Service/func/pay_confirm.py           |  30 ++
 Project/Service/func/search.py                |  49 +++
 Project/{ => Service}/func/signup.py          |  17 +-
 Project/Service/func/utils.py                 |  20 ++
 Project/{ => Service}/main.py                 |  44 ++-
 Project/{ => Service}/requirements.txt        |   0
 Project/{ => Service}/run.sh                  |   0
 Project/Service/static/css/book.css           | 238 +++++++++++++++
 Project/{ => Service}/static/css/index.css    |  46 +--
 Project/{ => Service}/static/css/login.css    |   0
 Project/{ => Service}/static/css/modify.css   |  23 +-
 Project/Service/static/css/order.css          | 191 ++++++++++++
 Project/Service/static/css/order_list.css     | 151 ++++++++++
 Project/Service/static/css/search.css         | 251 ++++++++++++++++
 Project/{ => Service}/static/css/signup.css   |   0
 Project/{ => Service}/static/js/checkInfo.js  |   0
 Project/{ => Service}/static/js/index.js      |   0
 Project/{ => Service}/static/js/login.js      |   0
 Project/{ => Service}/static/js/modify.js     |   0
 Project/Service/static/js/search.js           |  42 +++
 Project/{ => Service}/static/js/signup.js     |   0
 Project/{ => Service}/static/js/slideshow.js  |   0
 Project/Service/templates/book.html           | 281 ++++++++++++++++++
 Project/Service/templates/index.html          | 146 +++++++++
 Project/{ => Service}/templates/login.html    |   0
 Project/{ => Service}/templates/modify.html   |   0
 Project/Service/templates/order.html          |  83 ++++++
 Project/Service/templates/order_list.html     |  72 +++++
 Project/Service/templates/search.html         | 179 +++++++++++
 Project/{ => Service}/templates/signup.html   |   0
 .../func/__pycache__/index.cpython-311.pyc    | Bin 1245 -> 0 bytes
 .../func/__pycache__/modify.cpython-311.pyc   | Bin 7616 -> 0 bytes
 .../func/__pycache__/signup.cpython-311.pyc   | Bin 3422 -> 0 bytes
 Project/func/get_db.py                        |   7 -
 Project/init_db.py                            |  17 --
 80 files changed, 3563 insertions(+), 128 deletions(-)
 create mode 100644 Project/Manager/data_source/airports/airports.csv
 create mode 100644 Project/Manager/data_source/airports/airports.sql
 create mode 100644 Project/Manager/data_source/airports/make_data.py
 create mode 100644 Project/Manager/data_source/airports/raw.txt
 rename Project/{func/__init__.py => Manager/data_source/db_user.sql} (100%)
 create mode 100644 Project/Manager/data_source/flights/flights.sql
 create mode 100644 Project/Manager/data_source/init_manager_db.sql
 rename Project/{db.sql => Manager/data_source/init_service_db.sql} (72%)
 create mode 100644 Project/Manager/func/config.py
 create mode 100644 Project/Manager/func/index.py
 create mode 100644 Project/Manager/func/login.py
 create mode 100644 Project/Manager/main.py
 create mode 100644 Project/Manager/static/css/index.css
 create mode 100644 Project/Manager/static/css/login.css
 create mode 100644 Project/Manager/static/js/index.js
 create mode 100644 Project/Manager/static/js/login.js
 rename Project/{ => Manager}/templates/index.html (70%)
 create mode 100644 Project/Manager/templates/login.html
 rename Project/{ => Service}/__pycache__/config.cpython-311.pyc (100%)
 rename Project/{ => Service}/__pycache__/main.cpython-311.pyc (100%)
 create mode 100644 Project/Service/func/__init__.py
 rename Project/{ => Service}/func/__pycache__/__init__.cpython-311.pyc (100%)
 create mode 100644 Project/Service/func/__pycache__/book.cpython-311.pyc
 create mode 100644 Project/Service/func/__pycache__/cancel_order.cpython-311.pyc
 rename Project/{ => Service}/func/__pycache__/config.cpython-311.pyc (100%)
 rename Project/{ => Service}/func/__pycache__/get_db.cpython-311.pyc (100%)
 create mode 100644 Project/Service/func/__pycache__/index.cpython-311.pyc
 rename Project/{ => Service}/func/__pycache__/login.cpython-311.pyc (100%)
 create mode 100644 Project/Service/func/__pycache__/modify.cpython-311.pyc
 create mode 100644 Project/Service/func/__pycache__/order.cpython-311.pyc
 create mode 100644 Project/Service/func/__pycache__/order_list.cpython-311.pyc
 create mode 100644 Project/Service/func/__pycache__/pay.cpython-311.pyc
 create mode 100644 Project/Service/func/__pycache__/pay_confirm.cpython-311.pyc
 create mode 100644 Project/Service/func/__pycache__/search.cpython-311.pyc
 create mode 100644 Project/Service/func/__pycache__/signup.cpython-311.pyc
 create mode 100644 Project/Service/func/__pycache__/utils.cpython-311.pyc
 rename Project/{ => Service}/func/__pycache__/verify_user.cpython-311.pyc (100%)
 create mode 100644 Project/Service/func/book.py
 create mode 100644 Project/Service/func/cancel_order.py
 rename Project/{ => Service}/func/config.py (100%)
 rename Project/{ => Service}/func/index.py (69%)
 rename Project/{ => Service}/func/login.py (100%)
 rename Project/{ => Service}/func/modify.py (85%)
 create mode 100644 Project/Service/func/order.py
 create mode 100644 Project/Service/func/order_list.py
 create mode 100644 Project/Service/func/pay_confirm.py
 create mode 100644 Project/Service/func/search.py
 rename Project/{ => Service}/func/signup.py (88%)
 create mode 100644 Project/Service/func/utils.py
 rename Project/{ => Service}/main.py (63%)
 rename Project/{ => Service}/requirements.txt (100%)
 rename Project/{ => Service}/run.sh (100%)
 create mode 100644 Project/Service/static/css/book.css
 rename Project/{ => Service}/static/css/index.css (85%)
 rename Project/{ => Service}/static/css/login.css (100%)
 rename Project/{ => Service}/static/css/modify.css (86%)
 create mode 100644 Project/Service/static/css/order.css
 create mode 100644 Project/Service/static/css/order_list.css
 create mode 100644 Project/Service/static/css/search.css
 rename Project/{ => Service}/static/css/signup.css (100%)
 rename Project/{ => Service}/static/js/checkInfo.js (100%)
 rename Project/{ => Service}/static/js/index.js (100%)
 rename Project/{ => Service}/static/js/login.js (100%)
 rename Project/{ => Service}/static/js/modify.js (100%)
 create mode 100644 Project/Service/static/js/search.js
 rename Project/{ => Service}/static/js/signup.js (100%)
 rename Project/{ => Service}/static/js/slideshow.js (100%)
 create mode 100644 Project/Service/templates/book.html
 create mode 100644 Project/Service/templates/index.html
 rename Project/{ => Service}/templates/login.html (100%)
 rename Project/{ => Service}/templates/modify.html (100%)
 create mode 100644 Project/Service/templates/order.html
 create mode 100644 Project/Service/templates/order_list.html
 create mode 100644 Project/Service/templates/search.html
 rename Project/{ => Service}/templates/signup.html (100%)
 delete mode 100644 Project/func/__pycache__/index.cpython-311.pyc
 delete mode 100644 Project/func/__pycache__/modify.cpython-311.pyc
 delete mode 100644 Project/func/__pycache__/signup.cpython-311.pyc
 delete mode 100644 Project/func/get_db.py
 delete mode 100644 Project/init_db.py

diff --git a/Project/Manager/data_source/airports/airports.csv b/Project/Manager/data_source/airports/airports.csv
new file mode 100644
index 0000000..553a5f3
--- /dev/null
+++ b/Project/Manager/data_source/airports/airports.csv
@@ -0,0 +1,208 @@
+ID,Name,City
+NAY,北京南苑机场,北京
+PEK,北京首都国际机场,北京
+TSN,天津滨海国际机场,天津
+ZQZ,张家口宁远机场,张家口
+HDG,邯郸机场,邯郸
+SHP,秦皇岛山海关机场,秦皇岛
+TVS,唐山三女河机场,唐山
+XNT,邢台褡裢机场,邢台
+SJW,石家庄正定国际机场,石家庄
+TYN,太原武宿国际机场,太原
+LLV,吕梁机场,吕梁
+CIH,长治王村机场,长治
+DAT,大同云冈机场,大同
+YCU,运城机场,运城
+AXF,阿拉善左旗巴彦浩特机场,阿拉善左旗
+RHT,阿拉善右旗巴丹吉林机场,阿拉善右旗
+BAV,包头二里半机场,包头
+CIF,赤峰玉龙机场,赤峰
+DSN,鄂尔多斯伊金霍洛机场,鄂尔多斯
+EJN,额济纳旗桃来机场,额济纳旗
+ERL,二连浩特赛乌苏机场,二连浩特
+NZH,满洲里西郊机场,满洲里
+WUA,乌海机场,乌海
+YIE,阿尔山伊尔施机场,阿尔山
+RLK,巴彦淖尔天吉泰机场,巴彦淖尔
+HET,呼和浩特白塔国际机场,呼和浩特
+HLD,呼伦贝尔海拉尔机场,呼伦贝尔
+TGO,通辽机场,通辽
+HLH,乌兰浩特机场,乌兰浩特
+XIL,锡林浩特机场,锡林浩特
+AOG,鞍山腾鳌机场,鞍山
+CNI,长海大长山岛机场,长海
+CHG,朝阳机场,朝阳
+DLC,大连周水子国际机场,大连
+DDG,丹东浪头机场,丹东
+JNZ,锦州小岭子机场,锦州
+SHE,沈阳桃仙国际机场,沈阳
+TNH,通化三源浦机场,通化
+NBS,长白山机场,白山
+YNJ,延吉朝阳川机场,延边
+CGQ,长春龙嘉国际机场,长春
+JXA,鸡西兴凯湖机场,鸡西
+JMU,佳木斯东郊机场,佳木斯
+MDG,牡丹江海浪机场,牡丹江
+LDS,伊春林都机场,伊春
+HEK,黑河机场,黑河
+DQA,大庆萨尔图机场,大庆
+JGD,加格达奇机场,大兴安岭
+HRB,哈尔滨太平国际机场,哈尔滨
+OHE,漠河古莲机场,漠河
+NDG,齐齐哈尔三家子机场,齐齐哈尔
+SHA,上海虹桥国际机场,上海
+PVG,上海浦东国际机场,上海
+HIA,淮安涟水机场,淮安
+NTG,南通兴东机场,南通
+YNZ,盐城南洋机场,盐城
+YTY,扬州泰州机场,扬州
+NKG,南京禄口国际机场,南京
+XUZ,徐州观音机场,徐州
+LYG,连云港白塔埠机场,连云港
+CZX,常州奔牛机场,常州
+WUX,苏南硕放国际机场,无锡
+WNZ,温州龙湾国际机场,温州
+JUZ,衢州机场,衢州
+HYN,台州路桥机场,台州
+HSN,舟山普陀山机场,舟山
+HGH,杭州萧山国际机场,杭州
+YIW,义乌机场,金华
+NGB,宁波栎社国际机场,宁波
+AQG,安庆天柱山机场,安庆
+JUH,池州九华山机场,池州
+TXN,黄山屯溪机场,黄山
+HFE,合肥新桥国际机场,合肥
+FUG,阜阳西关机场,阜阳
+FOC,福州长乐国际机场,福州
+SQJ,三明沙县机场,沙县
+LCX,连城冠豸山机场,龙岩
+JJN,泉州晋江机场,泉州
+WUS,武夷山机场,南平
+XMN,厦门高崎国际机场,厦门
+KOW,赣州黄金机场,赣州
+JGS,井冈山机场,吉安
+YIC,宜春明月山机场,宜春
+KHN,南昌昌北国际机场,南昌
+JDZ,景德镇罗家机场,景德镇
+JIU,九江庐山机场,九江
+JNG,济宁曲阜机场,济宁
+WEF,潍坊机场,潍坊
+TAO,青岛流亭国际机场,青岛
+TNA,济南遥墙国际机场,济南
+LYI,临沂沭埠岭机场,临沂
+YNT,烟台莱山国际机场,烟台
+DOY,东营胜利机场,东营
+WEH,威海国际机场,威海
+LYA,洛阳北郊机场,洛阳
+CGO,郑州新郑国际机场,郑州
+NNY,南阳姜营机场,南阳
+WUH,武汉天河国际机场,武汉
+YIH,宜昌三峡机场,宜昌
+ENH,恩施许家坪机场,恩施
+XFN,襄阳刘集机场,襄阳
+CGD,常德桃花源机场,常德
+HJJ,怀化芷江机场,怀化
+DYG,张家界荷花国际机场,张家界
+CSX,长沙黄花国际机场,长沙
+LLF,永州零陵机场,永州
+DGM,东莞机场,东莞
+SZX,深圳宝安国际机场,深圳
+HUZ,惠州机场,惠州
+MXZ,梅县长岗岌机场,梅州
+SWA,揭阳潮汕机场,揭阳
+ZHA,湛江机场,湛江
+FUO,佛山机场,佛山
+HSC,韶关桂头机场,韶关
+ZUH,珠海金湾机场,珠海
+CAN,广州白云国际机场,广州
+LZH,柳州白莲机场,柳州
+AEB,百色巴马机场,百色
+BHY,北海福成机场,北海
+NNG,南宁吴圩国际机场,南宁
+WUZ,梧州长洲岛机场,梧州
+KWL,桂林两江国际机场,桂林
+HAK,海口美兰国际机场,海口
+SYX,三亚凤凰国际机场,三亚
+CKG,重庆江北国际机场,重庆
+WXN,万州五桥机场,万州
+JIQ,黔江武陵山机场,黔江
+DAX,达州河市机场,达州
+DCY,稻城亚丁机场,稻城
+JZH,九寨黄龙机场,九寨沟
+NAO,南充高坪机场,南充
+PZI,攀枝花保安营机场,攀枝花
+CTU,成都双流国际机场,成都
+SUN,遂宁机场,遂宁
+GYS,广元盘龙机场,广元
+KGT,甘孜康定机场,康定
+MIG,绵阳南郊机场,绵阳
+LZO,泸州蓝田机场,泸州
+XIC,西昌青山机场,西昌
+YBP,宜宾菜坝机场,宜宾
+AVA,安顺黄果树机场,安顺
+BFJ,毕节飞雄机场,毕节
+KWE,贵阳龙洞堡国际机场,贵阳
+ACX,兴义机场,黔西南
+HZH,黎平机场,黎平
+KJH,凯里黄平机场,黔东南
+LLB,荔波机场,黔南
+TEN,铜仁凤凰机场,铜仁
+ZYI,遵义新舟机场,遵义
+SYM,普洱思茅机场,普洱
+TCZ,腾冲驼峰机场,腾冲
+LNJ,临沧机场,临沧
+JHG,西双版纳嘎洒国际机场,西双版纳
+LJG,丽江三义机场,丽江
+ZAT,昭通机场,昭通
+BSD,保山云瑞机场,隆阳
+DLU,大理机场,大理
+LUM,德宏芒市机场,德宏
+DIG,迪庆香格里拉机场,迪庆
+KMG,昆明长水国际机场,昆明
+WNH,文山普者黑机场,文山
+NGQ,阿里昆莎机场,阿里
+BPX,昌都邦达机场,昌都
+RKZ,日喀则和平机场,日喀则
+LXA,拉萨贡嘎机场,拉萨
+LZY,林芝米林机场,林芝
+XIY,西安咸阳国际机场,西安
+UYN,榆林榆阳机场,榆林
+HZG,汉中西关机场,汉中
+AKA,安康五里铺机场,安康
+ENY,延安二十里堡机场,延安
+GXH,甘南夏河机场,甘南
+JIC,金昌金川机场,金昌
+YZY,张掖甘州机场,张掖
+DNH,敦煌机场,敦煌
+JGN,嘉峪关机场,嘉峪关
+LHW,兰州中川机场,兰州
+IQN,庆阳机场,庆阳
+THQ,天水麦积山机场,天水
+XNN,西宁曹家堡机场,西宁
+GOQ,格尔木机场,格尔木
+YUS,玉树巴塘机场,玉树
+GYU,固原六盘山机场,固原
+INC,银川河东国际机场,银川
+ZHY,中卫沙坡头机场,中卫
+AKU,阿克苏机场,阿克苏
+AAT,阿勒泰机场,阿勒泰
+FYN,富蕴机场,富蕴
+HMI,哈密机场,哈密
+HTN,和田机场,和田
+KRL,库尔勒机场,库尔勒
+IQM,且末机场,且末
+TLQ,吐鲁番交河机场,吐鲁番
+URC,乌鲁木齐地窝堡国际机场,乌鲁木齐
+BPL,博乐阿拉山口机场,博尔塔拉
+KJI,布尔津喀纳斯机场,布尔津
+KHG,喀什机场,喀什
+KRY,克拉玛依机场,克拉玛依
+KCA,库车龟兹机场,库车
+TCG,塔城机场,塔城
+YIN,伊宁机场,伊宁
+NLT,新源那拉提机场,新源
+HKG,香港国际机场,香港
+MFM,澳门国际机场,澳门
+TSA,台北松山机场,台北
+TPE,桃园国际机场,桃园
+KHH,高雄国际机场,高雄
diff --git a/Project/Manager/data_source/airports/airports.sql b/Project/Manager/data_source/airports/airports.sql
new file mode 100644
index 0000000..e0eb444
--- /dev/null
+++ b/Project/Manager/data_source/airports/airports.sql
@@ -0,0 +1,208 @@
+INSERT INTO Airports (`ID`, `Name`, City) VALUES
+('NAY', '北京南苑机场', '北京'),
+('PEK', '北京首都国际机场', '北京'),
+('TSN', '天津滨海国际机场', '天津'),
+('ZQZ', '张家口宁远机场', '张家口'),
+('HDG', '邯郸机场', '邯郸'),
+('SHP', '秦皇岛山海关机场', '秦皇岛'),
+('TVS', '唐山三女河机场', '唐山'),
+('XNT', '邢台褡裢机场', '邢台'),
+('SJW', '石家庄正定国际机场', '石家庄'),
+('TYN', '太原武宿国际机场', '太原'),
+('LLV', '吕梁机场', '吕梁'),
+('CIH', '长治王村机场', '长治'),
+('DAT', '大同云冈机场', '大同'),
+('YCU', '运城机场', '运城'),
+('AXF', '阿拉善左旗巴彦浩特机场', '阿拉善左旗'),
+('RHT', '阿拉善右旗巴丹吉林机场', '阿拉善右旗'),
+('BAV', '包头二里半机场', '包头'),
+('CIF', '赤峰玉龙机场', '赤峰'),
+('DSN', '鄂尔多斯伊金霍洛机场', '鄂尔多斯'),
+('EJN', '额济纳旗桃来机场', '额济纳旗'),
+('ERL', '二连浩特赛乌苏机场', '二连浩特'),
+('NZH', '满洲里西郊机场', '满洲里'),
+('WUA', '乌海机场', '乌海'),
+('YIE', '阿尔山伊尔施机场', '阿尔山'),
+('RLK', '巴彦淖尔天吉泰机场', '巴彦淖尔'),
+('HET', '呼和浩特白塔国际机场', '呼和浩特'),
+('HLD', '呼伦贝尔海拉尔机场', '呼伦贝尔'),
+('TGO', '通辽机场', '通辽'),
+('HLH', '乌兰浩特机场', '乌兰浩特'),
+('XIL', '锡林浩特机场', '锡林浩特'),
+('AOG', '鞍山腾鳌机场', '鞍山'),
+('CNI', '长海大长山岛机场', '长海'),
+('CHG', '朝阳机场', '朝阳'),
+('DLC', '大连周水子国际机场', '大连'),
+('DDG', '丹东浪头机场', '丹东'),
+('JNZ', '锦州小岭子机场', '锦州'),
+('SHE', '沈阳桃仙国际机场', '沈阳'),
+('TNH', '通化三源浦机场', '通化'),
+('NBS', '长白山机场', '白山'),
+('YNJ', '延吉朝阳川机场', '延边'),
+('CGQ', '长春龙嘉国际机场', '长春'),
+('JXA', '鸡西兴凯湖机场', '鸡西'),
+('JMU', '佳木斯东郊机场', '佳木斯'),
+('MDG', '牡丹江海浪机场', '牡丹江'),
+('LDS', '伊春林都机场', '伊春'),
+('HEK', '黑河机场', '黑河'),
+('DQA', '大庆萨尔图机场', '大庆'),
+('JGD', '加格达奇机场', '大兴安岭'),
+('HRB', '哈尔滨太平国际机场', '哈尔滨'),
+('OHE', '漠河古莲机场', '漠河'),
+('NDG', '齐齐哈尔三家子机场', '齐齐哈尔'),
+('SHA', '上海虹桥国际机场', '上海'),
+('PVG', '上海浦东国际机场', '上海'),
+('HIA', '淮安涟水机场', '淮安'),
+('NTG', '南通兴东机场', '南通'),
+('YNZ', '盐城南洋机场', '盐城'),
+('YTY', '扬州泰州机场', '扬州'),
+('NKG', '南京禄口国际机场', '南京'),
+('XUZ', '徐州观音机场', '徐州'),
+('LYG', '连云港白塔埠机场', '连云港'),
+('CZX', '常州奔牛机场', '常州'),
+('WUX', '苏南硕放国际机场', '无锡'),
+('WNZ', '温州龙湾国际机场', '温州'),
+('JUZ', '衢州机场', '衢州'),
+('HYN', '台州路桥机场', '台州'),
+('HSN', '舟山普陀山机场', '舟山'),
+('HGH', '杭州萧山国际机场', '杭州'),
+('YIW', '义乌机场', '金华'),
+('NGB', '宁波栎社国际机场', '宁波'),
+('AQG', '安庆天柱山机场', '安庆'),
+('JUH', '池州九华山机场', '池州'),
+('TXN', '黄山屯溪机场', '黄山'),
+('HFE', '合肥新桥国际机场', '合肥'),
+('FUG', '阜阳西关机场', '阜阳'),
+('FOC', '福州长乐国际机场', '福州'),
+('SQJ', '三明沙县机场', '沙县'),
+('LCX', '连城冠豸山机场', '龙岩'),
+('JJN', '泉州晋江机场', '泉州'),
+('WUS', '武夷山机场', '南平'),
+('XMN', '厦门高崎国际机场', '厦门'),
+('KOW', '赣州黄金机场', '赣州'),
+('JGS', '井冈山机场', '吉安'),
+('YIC', '宜春明月山机场', '宜春'),
+('KHN', '南昌昌北国际机场', '南昌'),
+('JDZ', '景德镇罗家机场', '景德镇'),
+('JIU', '九江庐山机场', '九江'),
+('JNG', '济宁曲阜机场', '济宁'),
+('WEF', '潍坊机场', '潍坊'),
+('TAO', '青岛流亭国际机场', '青岛'),
+('TNA', '济南遥墙国际机场', '济南'),
+('LYI', '临沂沭埠岭机场', '临沂'),
+('YNT', '烟台莱山国际机场', '烟台'),
+('DOY', '东营胜利机场', '东营'),
+('WEH', '威海国际机场', '威海'),
+('LYA', '洛阳北郊机场', '洛阳'),
+('CGO', '郑州新郑国际机场', '郑州'),
+('NNY', '南阳姜营机场', '南阳'),
+('WUH', '武汉天河国际机场', '武汉'),
+('YIH', '宜昌三峡机场', '宜昌'),
+('ENH', '恩施许家坪机场', '恩施'),
+('XFN', '襄阳刘集机场', '襄阳'),
+('CGD', '常德桃花源机场', '常德'),
+('HJJ', '怀化芷江机场', '怀化'),
+('DYG', '张家界荷花国际机场', '张家界'),
+('CSX', '长沙黄花国际机场', '长沙'),
+('LLF', '永州零陵机场', '永州'),
+('DGM', '东莞机场', '东莞'),
+('SZX', '深圳宝安国际机场', '深圳'),
+('HUZ', '惠州机场', '惠州'),
+('MXZ', '梅县长岗岌机场', '梅州'),
+('SWA', '揭阳潮汕机场', '揭阳'),
+('ZHA', '湛江机场', '湛江'),
+('FUO', '佛山机场', '佛山'),
+('HSC', '韶关桂头机场', '韶关'),
+('ZUH', '珠海金湾机场', '珠海'),
+('CAN', '广州白云国际机场', '广州'),
+('LZH', '柳州白莲机场', '柳州'),
+('AEB', '百色巴马机场', '百色'),
+('BHY', '北海福成机场', '北海'),
+('NNG', '南宁吴圩国际机场', '南宁'),
+('WUZ', '梧州长洲岛机场', '梧州'),
+('KWL', '桂林两江国际机场', '桂林'),
+('HAK', '海口美兰国际机场', '海口'),
+('SYX', '三亚凤凰国际机场', '三亚'),
+('CKG', '重庆江北国际机场', '重庆'),
+('WXN', '万州五桥机场', '万州'),
+('JIQ', '黔江武陵山机场', '黔江'),
+('DAX', '达州河市机场', '达州'),
+('DCY', '稻城亚丁机场', '稻城'),
+('JZH', '九寨黄龙机场', '九寨沟'),
+('NAO', '南充高坪机场', '南充'),
+('PZI', '攀枝花保安营机场', '攀枝花'),
+('CTU', '成都双流国际机场', '成都'),
+('SUN', '遂宁机场', '遂宁'),
+('GYS', '广元盘龙机场', '广元'),
+('KGT', '甘孜康定机场', '康定'),
+('MIG', '绵阳南郊机场', '绵阳'),
+('LZO', '泸州蓝田机场', '泸州'),
+('XIC', '西昌青山机场', '西昌'),
+('YBP', '宜宾菜坝机场', '宜宾'),
+('AVA', '安顺黄果树机场', '安顺'),
+('BFJ', '毕节飞雄机场', '毕节'),
+('KWE', '贵阳龙洞堡国际机场', '贵阳'),
+('ACX', '兴义机场', '黔西南'),
+('HZH', '黎平机场', '黎平'),
+('KJH', '凯里黄平机场', '黔东南'),
+('LLB', '荔波机场', '黔南'),
+('TEN', '铜仁凤凰机场', '铜仁'),
+('ZYI', '遵义新舟机场', '遵义'),
+('SYM', '普洱思茅机场', '普洱'),
+('TCZ', '腾冲驼峰机场', '腾冲'),
+('LNJ', '临沧机场', '临沧'),
+('JHG', '西双版纳嘎洒国际机场', '西双版纳'),
+('LJG', '丽江三义机场', '丽江'),
+('ZAT', '昭通机场', '昭通'),
+('BSD', '保山云瑞机场', '隆阳'),
+('DLU', '大理机场', '大理'),
+('LUM', '德宏芒市机场', '德宏'),
+('DIG', '迪庆香格里拉机场', '迪庆'),
+('KMG', '昆明长水国际机场', '昆明'),
+('WNH', '文山普者黑机场', '文山'),
+('NGQ', '阿里昆莎机场', '阿里'),
+('BPX', '昌都邦达机场', '昌都'),
+('RKZ', '日喀则和平机场', '日喀则'),
+('LXA', '拉萨贡嘎机场', '拉萨'),
+('LZY', '林芝米林机场', '林芝'),
+('XIY', '西安咸阳国际机场', '西安'),
+('UYN', '榆林榆阳机场', '榆林'),
+('HZG', '汉中西关机场', '汉中'),
+('AKA', '安康五里铺机场', '安康'),
+('ENY', '延安二十里堡机场', '延安'),
+('GXH', '甘南夏河机场', '甘南'),
+('JIC', '金昌金川机场', '金昌'),
+('YZY', '张掖甘州机场', '张掖'),
+('DNH', '敦煌机场', '敦煌'),
+('JGN', '嘉峪关机场', '嘉峪关'),
+('LHW', '兰州中川机场', '兰州'),
+('IQN', '庆阳机场', '庆阳'),
+('THQ', '天水麦积山机场', '天水'),
+('XNN', '西宁曹家堡机场', '西宁'),
+('GOQ', '格尔木机场', '格尔木'),
+('YUS', '玉树巴塘机场', '玉树'),
+('GYU', '固原六盘山机场', '固原'),
+('INC', '银川河东国际机场', '银川'),
+('ZHY', '中卫沙坡头机场', '中卫'),
+('AKU', '阿克苏机场', '阿克苏'),
+('AAT', '阿勒泰机场', '阿勒泰'),
+('FYN', '富蕴机场', '富蕴'),
+('HMI', '哈密机场', '哈密'),
+('HTN', '和田机场', '和田'),
+('KRL', '库尔勒机场', '库尔勒'),
+('IQM', '且末机场', '且末'),
+('TLQ', '吐鲁番交河机场', '吐鲁番'),
+('URC', '乌鲁木齐地窝堡国际机场', '乌鲁木齐'),
+('BPL', '博乐阿拉山口机场', '博尔塔拉'),
+('KJI', '布尔津喀纳斯机场', '布尔津'),
+('KHG', '喀什机场', '喀什'),
+('KRY', '克拉玛依机场', '克拉玛依'),
+('KCA', '库车龟兹机场', '库车'),
+('TCG', '塔城机场', '塔城'),
+('YIN', '伊宁机场', '伊宁'),
+('NLT', '新源那拉提机场', '新源'),
+('HKG', '香港国际机场', '香港'),
+('MFM', '澳门国际机场', '澳门'),
+('TSA', '台北松山机场', '台北'),
+('TPE', '桃园国际机场', '桃园'),
+('KHH', '高雄国际机场', '高雄');
\ No newline at end of file
diff --git a/Project/Manager/data_source/airports/make_data.py b/Project/Manager/data_source/airports/make_data.py
new file mode 100644
index 0000000..de9d03c
--- /dev/null
+++ b/Project/Manager/data_source/airports/make_data.py
@@ -0,0 +1,32 @@
+import pandas as pd
+
+# 读取并处理数据
+with open("./raw.txt", "r") as f:
+    data_list = f.readlines()
+    
+data_list = [data.strip() for data in data_list]
+data = []
+for line in data_list:
+    l = line.split('\t')
+    if len(l) < 2:
+        continue
+    data.append((l[1], l[3], l[0])) # Code, Airport, City
+
+# 将数据转换为DataFrame
+columns = ['ID', 'Name', 'City']
+df = pd.DataFrame(data, columns=columns)
+
+# 保存为CSV文件
+df.to_csv('airports.csv', index=False)
+
+# 生成SQL插入语句
+insert_statements = 'INSERT INTO Airports (`ID`, `Name`, City) VALUES\n'
+insert_statements += ',\n'.join([
+    f"('{row.ID}', '{row.Name}', '{row.City}')" 
+    for row in df.itertuples(index=False)
+])
+insert_statements += ';'
+
+# 保存SQL插入语句到文件
+with open('airports.sql', 'w') as f:
+    f.write(insert_statements)
diff --git a/Project/Manager/data_source/airports/raw.txt b/Project/Manager/data_source/airports/raw.txt
new file mode 100644
index 0000000..0f2bd18
--- /dev/null
+++ b/Project/Manager/data_source/airports/raw.txt
@@ -0,0 +1,241 @@
+北京市
+北京	NAY	ZBNY	北京南苑机场	NANYUAN
+北京	PEK	ZBAA	北京首都国际机场	BEIJING
+天津市
+天津	TSN	ZBTJ	天津滨海国际机场	TIANJIN
+河北省
+张家口	ZQZ	ZBZJ	张家口宁远机场	ZHANGJIAKOU
+邯郸	HDG	ZBHD	邯郸机场	HANDAN
+秦皇岛	SHP	ZBSH	秦皇岛山海关机场	QINHUANGDAO
+唐山	TVS	ZBTS	唐山三女河机场	TANGSHAN
+邢台	XNT	ZBXT	邢台褡裢机场	SHAHE
+石家庄	SJW	ZBSJ	石家庄正定国际机场	SHIJIAZHUANG
+山西省
+太原	TYN	ZBYN	太原武宿国际机场	TAIYUAN
+吕梁	LLV	ZBLL	吕梁机场	LVLIANG
+长治	CIH	ZBCZ	长治王村机场	CHANGZHI
+大同	DAT	ZBDT	大同云冈机场	DATONG
+运城	YCU	ZBYC	运城机场	YUNCHENG
+内蒙古自治区
+阿拉善左旗	AXF		阿拉善左旗巴彦浩特机场	BAYANHAOTE
+阿拉善右旗	RHT		阿拉善右旗巴丹吉林机场	BADANJILIN
+包头	BAV	ZBOW	包头二里半机场	BAOTOU
+赤峰	CIF	ZBCF	赤峰玉龙机场	CHIFENG
+鄂尔多斯	DSN	ZBDS	鄂尔多斯伊金霍洛机场	ORDOS
+额济纳旗	EJN		额济纳旗桃来机场	ERJINA
+二连浩特	ERL	ZBER	二连浩特赛乌苏机场	ERLIANHOT
+满洲里	NZH	ZBMZ	满洲里西郊机场	MANZHOULI
+乌海	WUA	ZBUH	乌海机场	WUHAI
+阿尔山	YIE	ZBES	阿尔山伊尔施机场	ARXAN
+巴彦淖尔	RLK	ZBYZ	巴彦淖尔天吉泰机场	BAYANNUR
+呼和浩特	HET	ZBHH	呼和浩特白塔国际机场	HOHHOT
+呼伦贝尔	HLD	ZBLA	呼伦贝尔海拉尔机场	HAILAR
+通辽	TGO	ZBTL	通辽机场	TONGLIAO
+乌兰浩特	HLH	ZBUL	乌兰浩特机场	ULANHOT
+锡林浩特	XIL	ZBXH	锡林浩特机场	XILINHOT
+辽宁省
+鞍山	AOG	ZYAS	鞍山腾鳌机场	ANSHAN
+长海	CNI	ZYCH	长海大长山岛机场	CHANGHAI
+朝阳	CHG	ZYCY	朝阳机场	CHAOYANG
+大连	DLC	ZYTL	大连周水子国际机场	DALIAN
+丹东	DDG	ZYDD	丹东浪头机场	DANDONG
+锦州	JNZ	ZYJZ	锦州小岭子机场	JINZHOU
+沈阳	SHE	ZYTX	沈阳桃仙国际机场	SHENYANG
+吉林省
+通化	TNH	ZYTN	通化三源浦机场	TONGHUA
+白山	NBS	ZYBS	长白山机场	CHANGBAISHAN
+延边	YNJ	ZYYJ	延吉朝阳川机场	YANJI
+长春	CGQ	ZYCC	长春龙嘉国际机场	CHANGCHUN
+黑龙江省
+鸡西	JXA	ZYJX	鸡西兴凯湖机场	JIXI
+佳木斯	JMU	ZYJM	佳木斯东郊机场	JIAMUSI
+牡丹江	MDG	ZYMD	牡丹江海浪机场	MUDANJIANG
+伊春	LDS	ZYLD	伊春林都机场	YICHUN
+黑河	HEK	ZYHE	黑河机场	HEIHE
+大庆	DQA	ZYDQ	大庆萨尔图机场	DAQING
+大兴安岭	JGD	ZYJD	加格达奇机场	JIAGEDAQI
+哈尔滨	HRB	ZYHB	哈尔滨太平国际机场	HARBIN
+漠河	OHE	ZYMH	漠河古莲机场	MOHE
+齐齐哈尔	NDG	ZYQQ	齐齐哈尔三家子机场	QIQIHAER
+上海市
+上海	SHA	ZSSS	上海虹桥国际机场	HONGQIAO
+上海	PVG	ZSPD	上海浦东国际机场	PUDONG
+江苏省
+淮安	HIA	ZSSH	淮安涟水机场	HUAIAN
+南通	NTG	ZSNT	南通兴东机场	NANTONG
+盐城	YNZ	ZSYN	盐城南洋机场	YANCHENG
+扬州	YTY	ZSYA	扬州泰州机场	YANGZHOU
+南京	NKG	ZSNJ	南京禄口国际机场	NANJING
+徐州	XUZ	ZSXZ	徐州观音机场	XUZHOU
+连云港	LYG	ZSLG	连云港白塔埠机场	LIANYUNGANG
+常州	CZX	ZSCG	常州奔牛机场	CHANGZHOU
+无锡	WUX	ZSWX	苏南硕放国际机场	WUXI
+浙江省
+温州	WNZ	ZSWZ	温州龙湾国际机场	WENZHOU
+衢州	JUZ	ZSJU	衢州机场	QUZHOU
+台州	HYN	ZSLQ	台州路桥机场	TAIZHOU
+舟山	HSN	ZSZS	舟山普陀山机场	ZHOUSHAN
+杭州	HGH	ZSHC	杭州萧山国际机场	HANGZHOU
+金华	YIW	ZSYW	义乌机场	YIWU
+宁波	NGB	ZSNB	宁波栎社国际机场	NINGBO
+安徽省
+安庆	AQG	ZSAQ	安庆天柱山机场	ANQING
+池州	JUH	ZSJH	池州九华山机场	CHIZHOU
+黄山	TXN	ZSTX	黄山屯溪机场	HUANGSHAN
+合肥	HFE	ZSOF	合肥新桥国际机场	HEFEI
+阜阳	FUG	ZSFY	阜阳西关机场	FUYANG
+福建省
+福州	FOC	ZSFZ	福州长乐国际机场	FUZHOU
+沙县	SQJ		三明沙县机场	SANMING
+龙岩	LCX	ZSLD	连城冠豸山机场	LONGYAN
+泉州	JJN	ZSQZ	泉州晋江机场	QUANZHOU
+南平	WUS	ZSWY	武夷山机场	WUYISHAN
+厦门	XMN	ZSAM	厦门高崎国际机场	XIAMEN
+江西省
+赣州	KOW	ZSGZ	赣州黄金机场	GANZHOU
+吉安	JGS	ZSGS	井冈山机场	JINGGANGSHAN
+宜春	YIC	ZSYC	宜春明月山机场	YICHUN
+南昌	KHN	ZSCN	南昌昌北国际机场	NANCHANG
+景德镇	JDZ	ZSJD	景德镇罗家机场	JINGDEZHEN
+九江	JIU	ZSJJ	九江庐山机场	JIUJIANG
+山东省
+济宁	JNG	ZSJG	济宁曲阜机场	JINING
+潍坊	WEF	ZSWF	潍坊机场	WEIFANG
+青岛	TAO	ZSQD	青岛流亭国际机场	QINGDAO
+济南	TNA	ZSJN	济南遥墙国际机场	JINAN
+临沂	LYI	ZSLY	临沂沭埠岭机场	LINYI
+烟台	YNT	ZSYT	烟台莱山国际机场	YANTAI
+东营	DOY	ZSDY	东营胜利机场	DONGYING
+威海	WEH	ZSWH	威海国际机场	WEIHAI
+河南省
+洛阳	LYA	ZHLY	洛阳北郊机场	LUOYANG
+郑州	CGO	ZHCC	郑州新郑国际机场	ZHENGZHOU
+南阳	NNY	ZHNY	南阳姜营机场	NANYANG
+湖北省
+武汉	WUH	ZHHH	武汉天河国际机场	WUHAN
+宜昌	YIH	ZHYC	宜昌三峡机场	YICHANG
+恩施	ENH	ZHES	恩施许家坪机场	ENSHI
+襄阳	XFN	ZHXF	襄阳刘集机场	XIANGYANG
+湖南省
+常德	CGD	ZGCD	常德桃花源机场	CHANGDE
+怀化	HJJ	ZGCJ	怀化芷江机场	HUAIHUA
+张家界	DYG	ZGDY	张家界荷花国际机场	ZHANGJIAJIE
+长沙	CSX	ZGHA	长沙黄花国际机场	CHANGSHA
+永州	LLF	ZGLG	永州零陵机场	YONGZHOU
+广东省
+东莞	DGM		东莞机场	DONGGUAN
+深圳	SZX	ZGSZ	深圳宝安国际机场	SHENZHEN
+惠州	HUZ	ZGHZ	惠州机场	HUIZHOU
+梅州	MXZ	ZGMX	梅县长岗岌机场	MEIXIAN
+揭阳	SWA	ZGOW	揭阳潮汕机场	JIEYANG
+湛江	ZHA	ZGZJ	湛江机场	ZHANJIANG
+佛山	FUO	ZGFS	佛山机场	FOSHAN
+韶关	HSC		韶关桂头机场	SHAOGUAN
+珠海	ZUH	ZGSD	珠海金湾机场	ZHUHAI
+广州	CAN	ZGGG	广州白云国际机场	GUANGZHOU
+广西壮族自治区
+柳州	LZH	ZGZH	柳州白莲机场	LIUZHOU
+百色	AEB	ZGBS	百色巴马机场	BAISE
+北海	BHY	ZGBH	北海福成机场	BEIHAI
+南宁	NNG	ZGNN	南宁吴圩国际机场	NANNING
+梧州	WUZ	ZGWZ	梧州长洲岛机场	WUZHOU
+桂林	KWL	ZGKL	桂林两江国际机场	GUILIN
+海南省
+海口	HAK	ZJHK	海口美兰国际机场	HAIKOU
+三亚	SYX	ZJSY	三亚凤凰国际机场	SANYA
+重庆市
+重庆	CKG	ZUCK	重庆江北国际机场	CHONGQING
+万州	WXN	ZUWX	万州五桥机场	WANZHOU
+黔江	JIQ	ZUQJ	黔江武陵山机场	ZHOUBAI
+四川省
+达州	DAX	ZUDX	达州河市机场	DAZHOU
+稻城	DCY	ZUDC	稻城亚丁机场	DAOCHENG
+九寨沟	JZH	ZUJZ	九寨黄龙机场	JIUZHAIGOU
+南充	NAO	ZUNC	南充高坪机场	NANCHONG
+攀枝花	PZI	ZUZI	攀枝花保安营机场	PANZHIHUA
+成都	CTU	ZUUU	成都双流国际机场	CHENGDU
+遂宁	SUN	ZNSU	遂宁机场	SUINING
+广元	GYS	ZUGU	广元盘龙机场	GUANGYUAN
+康定	KGT	ZUKD	甘孜康定机场	KANGDING
+绵阳	MIG	ZUMY	绵阳南郊机场	MIANYANG
+泸州	LZO	ZULZ	泸州蓝田机场	LUZHOU
+西昌	XIC	ZUXC	西昌青山机场	XICHANG
+宜宾	YBP	ZUYB	宜宾菜坝机场	YIBIN
+贵州省
+安顺	AVA	ZUAS	安顺黄果树机场	ANSHUN
+毕节	BFJ	ZUBJ	毕节飞雄机场	BIJIE
+贵阳	KWE	ZUGY	贵阳龙洞堡国际机场	GUIYANG
+黔西南	ACX	ZUYI	兴义机场	XINGYI
+黎平	HZH	ZUNP	黎平机场	LIPING
+黔东南	KJH	ZUKJ	凯里黄平机场	KAILI
+黔南	LLB	ZULB	荔波机场	LIBO
+铜仁	TEN	ZUTR	铜仁凤凰机场	TONGREN
+遵义	ZYI	ZUZY	遵义新舟机场	ZUNYI
+云南省
+普洱	SYM	ZPSM	普洱思茅机场	PUER
+腾冲	TCZ	ZUTC	腾冲驼峰机场	TENGCHONG
+临沧	LNJ	ZPLC	临沧机场	LINCANG
+西双版纳	JHG	ZPJH	西双版纳嘎洒国际机场	JINGHONG
+丽江	LJG	ZPLJ	丽江三义机场	LIJIANG
+昭通	ZAT	ZPZT	昭通机场	ZHAOTONG
+隆阳	BSD	ZPBS	保山云瑞机场	BAOSHAN
+大理	DLU	ZPDL	大理机场	DALIXIAGUAN
+德宏	LUM	ZPMS	德宏芒市机场	MANGSHI
+迪庆	DIG	ZPDQ	迪庆香格里拉机场	DIQING
+昆明	KMG	ZPPP	昆明长水国际机场	KUNMING
+文山	WNH	ZPWS	文山普者黑机场	WENSHAN
+西藏自治区
+阿里	NGQ	ZUAL	阿里昆莎机场	SHIQUANHE
+昌都	BPX	ZUBD	昌都邦达机场	CHAMDO
+日喀则	RKZ	ZURK	日喀则和平机场	RIKAZE
+拉萨	LXA	ZULS	拉萨贡嘎机场	LHASA
+林芝	LZY	ZUNZ	林芝米林机场	NYINGCHI
+陕西省
+西安	XIY	ZLXY	西安咸阳国际机场	XIAN
+榆林	UYN	ZLYL	榆林榆阳机场	YULIN
+汉中	HZG	ZLHZ	汉中西关机场	HANZHONG
+安康	AKA	ZLAK	安康五里铺机场	ANKANG
+延安	ENY	ZLYA	延安二十里堡机场	YANAN
+甘肃省
+甘南	GXH	ZLXH	甘南夏河机场	XIAHE
+金昌	JIC	ZLJC	金昌金川机场	JINCHANG
+张掖	YZY	ZLZY	张掖甘州机场	ZHANGYE
+敦煌	DNH	ZLDH	敦煌机场	DUNHUANG
+嘉峪关	JGN	ZLJQ	嘉峪关机场	JIAYUGUAN
+兰州	LHW	ZLLL	兰州中川机场	LANZHOU
+庆阳	IQN	ZLQY	庆阳机场	QINGYANG
+天水	THQ	ZLTS	天水麦积山机场	TIANSHUI
+青海省
+西宁	XNN	ZLXN	西宁曹家堡机场	XINING
+格尔木	GOQ	ZLGM	格尔木机场	GOLMUD
+玉树	YUS	ZLYS	玉树巴塘机场	YUSHU
+宁夏回族自治区
+固原	GYU	ZLGY	固原六盘山机场	GUYUAN
+银川	INC	ZLIC	银川河东国际机场	YINCHUAN
+中卫	ZHY	ZLZW	中卫沙坡头机场	ZHONGWEI
+新疆维吾尔自治区
+阿克苏	AKU	ZWAK	阿克苏机场	AKSU
+阿勒泰	AAT	ZWAT	阿勒泰机场	ALTAY
+富蕴	FYN	ZWFY	富蕴机场	FUYUN
+哈密	HMI	ZWHM	哈密机场	HAMI
+和田	HTN	ZWTN	和田机场	HETIAN
+库尔勒	KRL	ZWKL	库尔勒机场	KORLA
+且末	IQM	ZWCM	且末机场	QIEMO
+吐鲁番	TLQ	ZWTP	吐鲁番交河机场	TULUFAN
+乌鲁木齐	URC	ZWWW	乌鲁木齐地窝堡国际机场	URUMQI
+博尔塔拉	BPL	ZWBL	博乐阿拉山口机场	BOLE
+布尔津	KJI	ZWKN	布尔津喀纳斯机场	BUERJIN
+喀什	KHG	ZWSH	喀什机场	KASHGAR
+克拉玛依	KRY	ZWKM	克拉玛依机场	KARAMAY
+库车	KCA	ZWKC	库车龟兹机场	KUQA
+塔城	TCG	ZWTC	塔城机场	TACHENG
+伊宁	YIN	ZWYN	伊宁机场	YINING
+新源	NLT	ZWNL	新源那拉提机场	NALATI
+香港特别行政区
+香港	HKG	VHHH	香港国际机场	HONG KONG
+澳门特别行政区
+澳门	MFM	VMMC	澳门国际机场	MACAU
+台湾省
+台北	TSA	RCSS	台北松山机场	TAIBEI
+桃园	TPE	RCTP	桃园国际机场	TAOYUAN
+高雄	KHH	RCKH	高雄国际机场	GAOXIONG
\ No newline at end of file
diff --git a/Project/func/__init__.py b/Project/Manager/data_source/db_user.sql
similarity index 100%
rename from Project/func/__init__.py
rename to Project/Manager/data_source/db_user.sql
diff --git a/Project/Manager/data_source/flights/flights.sql b/Project/Manager/data_source/flights/flights.sql
new file mode 100644
index 0000000..ce3320d
--- /dev/null
+++ b/Project/Manager/data_source/flights/flights.sql
@@ -0,0 +1,105 @@
+INSERT INTO Flights (ID, Airline, Departure_airport, Arrival_airport, Departure_time, Arrival_time, First_class_seats_remaining, Business_class_seats_remaining, Economy_class_seats_remaining, First_class_price, Business_class_price, Economy_class_price, `Status`) VALUES
+('FL001', 'AirlineA', 'PEK', 'SHA', '2024-06-14 08:00:00', '2024-06-14 10:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '已降落'),
+('FL002', 'AirlineB', 'TSN', 'PVG', '2024-06-14 09:00:00', '2024-06-14 11:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '已降落'),
+('FL003', 'AirlineC', 'SHA', 'SZX', '2024-06-14 07:00:00', '2024-06-14 09:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '已降落'),
+('FL004', 'AirlineD', 'PVG', 'CAN', '2024-06-14 06:00:00', '2024-06-14 08:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '已降落'),
+('FL005', 'AirlineE', 'SZX', 'CTU', '2024-06-14 10:00:00', '2024-06-14 12:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '已降落'),
+('FL006', 'AirlineF', 'CAN', 'KWE', '2024-06-14 11:00:00', '2024-06-14 13:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '已降落'),
+('FL007', 'AirlineG', 'CTU', 'XIY', '2024-06-14 12:00:00', '2024-06-14 14:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '已降落'),
+('FL008', 'AirlineH', 'KWE', 'LHW', '2024-06-14 13:00:00', '2024-06-14 15:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '已降落'),
+('FL009', 'AirlineI', 'XIY', 'PEK', '2024-06-14 14:00:00', '2024-06-14 16:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '已降落'),
+('FL010', 'AirlineJ', 'LHW', 'TSN', '2024-06-14 15:00:00', '2024-06-14 17:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '已降落'),
+('FL210', 'AirlineJ', 'LHW', 'TSN', '2024-06-14 21:00:00', '2024-06-14 23:50:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '开始检票'),
+('FL011', 'AirlineA', 'PEK', 'CAN', '2024-06-15 08:00:00', '2024-06-15 10:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '候机中'),
+('FL012', 'AirlineB', 'TSN', 'CTU', '2024-06-15 09:00:00', '2024-06-15 11:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '延误'),
+('FL013', 'AirlineC', 'SHA', 'KWE', '2024-06-15 07:00:00', '2024-06-15 09:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '候机中'),
+('FL014', 'AirlineD', 'PVG', 'XIY', '2024-06-15 06:00:00', '2024-06-15 08:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '候机中'),
+('FL015', 'AirlineE', 'SZX', 'LHW', '2024-06-15 10:00:00', '2024-06-15 12:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '延误'),
+('FL016', 'AirlineF', 'CAN', 'PEK', '2024-06-15 11:00:00', '2024-06-15 13:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '候机中'),
+('FL017', 'AirlineG', 'CTU', 'TSN', '2024-06-15 12:00:00', '2024-06-15 14:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '候机中'),
+('FL018', 'AirlineH', 'KWE', 'SHA', '2024-06-15 13:00:00', '2024-06-15 15:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '延误'),
+('FL019', 'AirlineI', 'XIY', 'PVG', '2024-06-15 14:00:00', '2024-06-15 16:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '候机中'),
+('FL020', 'AirlineJ', 'LHW', 'SZX', '2024-06-15 15:00:00', '2024-06-15 17:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '候机中'),
+('FL021', 'AirlineA', 'PEK', 'SHA', '2024-06-16 08:00:00', '2024-06-16 10:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '延误'),
+('FL121', 'AirlineB', 'NAY', 'SHA', '2024-06-16 09:00:00', '2024-06-16 12:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '未知'),
+('FL221', 'AirlineC', 'PEK', 'PVG', '2024-06-16 11:00:00', '2024-06-16 12:30:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '未知'),
+('FL022', 'AirlineB', 'TSN', 'PVG', '2024-06-16 09:00:00', '2024-06-16 11:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '延误'),
+('FL023', 'AirlineC', 'SHA', 'SZX', '2024-06-16 07:00:00', '2024-06-16 09:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '延误'),
+('FL024', 'AirlineD', 'PVG', 'CAN', '2024-06-16 06:00:00', '2024-06-16 08:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '延误'),
+('FL025', 'AirlineE', 'SZX', 'CTU', '2024-06-16 10:00:00', '2024-06-16 12:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '延误'),
+('FL026', 'AirlineF', 'CAN', 'KWE', '2024-06-16 11:00:00', '2024-06-16 13:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '延误'),
+('FL027', 'AirlineG', 'CTU', 'XIY', '2024-06-16 12:00:00', '2024-06-16 14:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '未知'),
+('FL028', 'AirlineH', 'KWE', 'LHW', '2024-06-16 13:00:00', '2024-06-16 15:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '未知'),
+('FL029', 'AirlineI', 'XIY', 'PEK', '2024-06-16 14:00:00', '2024-06-16 16:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '未知'),
+('FL030', 'AirlineJ', 'LHW', 'TSN', '2024-06-16 15:00:00', '2024-06-16 17:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '未知'),
+('FL031', 'AirlineA', 'PEK', 'CAN', '2024-06-17 08:00:00', '2024-06-17 10:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '未知'),
+('FL032', 'AirlineB', 'TSN', 'CTU', '2024-06-17 09:00:00', '2024-06-17 11:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '未知'),
+('FL033', 'AirlineC', 'SHA', 'KWE', '2024-06-17 07:00:00', '2024-06-17 09:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '未知'),
+('FL034', 'AirlineD', 'PVG', 'XIY', '2024-06-17 06:00:00', '2024-06-17 08:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '未知'),
+('FL035', 'AirlineE', 'SZX', 'LHW', '2024-06-17 10:00:00', '2024-06-17 12:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '未知'),
+('FL036', 'AirlineF', 'CAN', 'PEK', '2024-06-17 11:00:00', '2024-06-17 13:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '未知'),
+('FL037', 'AirlineG', 'CTU', 'TSN', '2024-06-17 12:00:00', '2024-06-17 14:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '未知'),
+('FL038', 'AirlineH', 'KWE', 'SHA', '2024-06-17 13:00:00', '2024-06-17 15:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '未知'),
+('FL039', 'AirlineI', 'XIY', 'PVG', '2024-06-17 14:00:00', '2024-06-17 16:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '未知'),
+('FL040', 'AirlineJ', 'LHW', 'SZX', '2024-06-17 15:00:00', '2024-06-17 17:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '未知'),
+('FL041', 'AirlineA', 'PEK', 'SHA', '2024-06-18 08:00:00', '2024-06-18 10:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '未知'),
+('FL042', 'AirlineB', 'TSN', 'PVG', '2024-06-18 09:00:00', '2024-06-18 11:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '未知'),
+('FL043', 'AirlineC', 'SHA', 'SZX', '2024-06-18 07:00:00', '2024-06-18 09:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '未知'),
+('FL044', 'AirlineD', 'PVG', 'CAN', '2024-06-18 06:00:00', '2024-06-18 08:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '未知'),
+('FL045', 'AirlineE', 'SZX', 'CTU', '2024-06-18 10:00:00', '2024-06-18 12:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '未知'),
+('FL046', 'AirlineF', 'CAN', 'KWE', '2024-06-18 11:00:00', '2024-06-18 13:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '未知'),
+('FL047', 'AirlineG', 'CTU', 'XIY', '2024-06-18 12:00:00', '2024-06-18 14:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '未知'),
+('FL048', 'AirlineH', 'KWE', 'LHW', '2024-06-18 13:00:00', '2024-06-18 15:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '未知'),
+('FL049', 'AirlineI', 'XIY', 'PEK', '2024-06-18 14:00:00', '2024-06-18 16:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '未知'),
+('FL050', 'AirlineJ', 'LHW', 'TSN', '2024-06-18 15:00:00', '2024-06-18 17:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '未知'),
+('FL051', 'AirlineA', 'PEK', 'CAN', '2024-06-19 08:00:00', '2024-06-19 10:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '未知'),
+('FL052', 'AirlineB', 'TSN', 'CTU', '2024-06-19 09:00:00', '2024-06-19 11:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '未知'),
+('FL053', 'AirlineC', 'SHA', 'KWE', '2024-06-19 07:00:00', '2024-06-19 09:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '未知'),
+('FL054', 'AirlineD', 'PVG', 'XIY', '2024-06-19 06:00:00', '2024-06-19 08:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '未知'),
+('FL055', 'AirlineE', 'SZX', 'LHW', '2024-06-19 10:00:00', '2024-06-19 12:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '未知'),
+('FL056', 'AirlineF', 'CAN', 'PEK', '2024-06-19 11:00:00', '2024-06-19 13:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '未知'),
+('FL057', 'AirlineG', 'CTU', 'TSN', '2024-06-19 12:00:00', '2024-06-19 14:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '未知'),
+('FL058', 'AirlineH', 'KWE', 'SHA', '2024-06-19 13:00:00', '2024-06-19 15:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '未知'),
+('FL059', 'AirlineI', 'XIY', 'PVG', '2024-06-19 14:00:00', '2024-06-19 16:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '未知'),
+('FL060', 'AirlineJ', 'LHW', 'SZX', '2024-06-19 15:00:00', '2024-06-19 17:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '未知'),
+('FL061', 'AirlineA', 'PEK', 'SHA', '2024-06-20 08:00:00', '2024-06-20 10:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '未知'),
+('FL062', 'AirlineB', 'TSN', 'PVG', '2024-06-20 09:00:00', '2024-06-20 11:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '未知'),
+('FL063', 'AirlineC', 'SHA', 'SZX', '2024-06-20 07:00:00', '2024-06-20 09:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '未知'),
+('FL064', 'AirlineD', 'PVG', 'CAN', '2024-06-20 06:00:00', '2024-06-20 08:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '未知'),
+('FL065', 'AirlineE', 'SZX', 'CTU', '2024-06-20 10:00:00', '2024-06-20 12:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '未知'),
+('FL066', 'AirlineF', 'CAN', 'KWE', '2024-06-20 11:00:00', '2024-06-20 13:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '未知'),
+('FL067', 'AirlineG', 'CTU', 'XIY', '2024-06-20 12:00:00', '2024-06-20 14:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '未知'),
+('FL068', 'AirlineH', 'KWE', 'LHW', '2024-06-20 13:00:00', '2024-06-20 15:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '未知'),
+('FL069', 'AirlineI', 'XIY', 'PEK', '2024-06-20 14:00:00', '2024-06-20 16:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '未知'),
+('FL070', 'AirlineJ', 'LHW', 'TSN', '2024-06-20 15:00:00', '2024-06-20 17:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '未知'),
+('FL071', 'AirlineA', 'PEK', 'CAN', '2024-06-21 08:00:00', '2024-06-21 10:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '未知'),
+('FL072', 'AirlineB', 'TSN', 'CTU', '2024-06-21 09:00:00', '2024-06-21 11:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '未知'),
+('FL073', 'AirlineC', 'SHA', 'KWE', '2024-06-21 07:00:00', '2024-06-21 09:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '未知'),
+('FL074', 'AirlineD', 'PVG', 'XIY', '2024-06-21 06:00:00', '2024-06-21 08:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '未知'),
+('FL075', 'AirlineE', 'SZX', 'LHW', '2024-06-21 10:00:00', '2024-06-21 12:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '未知'),
+('FL076', 'AirlineF', 'CAN', 'PEK', '2024-06-21 11:00:00', '2024-06-21 13:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '未知'),
+('FL077', 'AirlineG', 'CTU', 'TSN', '2024-06-21 12:00:00', '2024-06-21 14:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '未知'),
+('FL078', 'AirlineH', 'KWE', 'SHA', '2024-06-21 13:00:00', '2024-06-21 15:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '未知'),
+('FL079', 'AirlineI', 'XIY', 'PVG', '2024-06-21 14:00:00', '2024-06-21 16:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '未知'),
+('FL080', 'AirlineJ', 'LHW', 'SZX', '2024-06-21 15:00:00', '2024-06-21 17:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '未知'),
+('FL081', 'AirlineA', 'PEK', 'SHA', '2024-06-22 08:00:00', '2024-06-22 10:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '未知'),
+('FL082', 'AirlineB', 'TSN', 'PVG', '2024-06-22 09:00:00', '2024-06-22 11:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '未知'),
+('FL083', 'AirlineC', 'SHA', 'SZX', '2024-06-22 07:00:00', '2024-06-22 09:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '未知'),
+('FL084', 'AirlineD', 'PVG', 'CAN', '2024-06-22 06:00:00', '2024-06-22 08:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '未知'),
+('FL085', 'AirlineE', 'SZX', 'CTU', '2024-06-22 10:00:00', '2024-06-22 12:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '未知'),
+('FL086', 'AirlineF', 'CAN', 'KWE', '2024-06-22 11:00:00', '2024-06-22 13:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '未知'),
+('FL087', 'AirlineG', 'CTU', 'XIY', '2024-06-22 12:00:00', '2024-06-22 14:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '未知'),
+('FL088', 'AirlineH', 'KWE', 'LHW', '2024-06-22 13:00:00', '2024-06-22 15:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '未知'),
+('FL089', 'AirlineI', 'XIY', 'PEK', '2024-06-22 14:00:00', '2024-06-22 16:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '未知'),
+('FL090', 'AirlineJ', 'LHW', 'TSN', '2024-06-22 15:00:00', '2024-06-22 17:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '未知'),
+('FL091', 'AirlineA', 'PEK', 'SHA', '2024-06-23 08:00:00', '2024-06-23 10:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '未知'),
+('FL092', 'AirlineB', 'TSN', 'PVG', '2024-06-23 09:00:00', '2024-06-23 11:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '未知'),
+('FL093', 'AirlineC', 'SHA', 'SZX', '2024-06-23 07:00:00', '2024-06-23 09:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '未知'),
+('FL094', 'AirlineD', 'PVG', 'CAN', '2024-06-23 06:00:00', '2024-06-23 08:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '未知'),
+('FL095', 'AirlineE', 'SZX', 'CTU', '2024-06-23 10:00:00', '2024-06-23 12:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '未知'),
+('FL096', 'AirlineF', 'CAN', 'KWE', '2024-06-23 11:00:00', '2024-06-23 13:00:00', 5, 10, 100, 2000.00, 1000.00, 500.00, '未知'),
+('FL097', 'AirlineG', 'CTU', 'XIY', '2024-06-23 12:00:00', '2024-06-23 14:00:00', 3, 15, 80, 2100.00, 1100.00, 600.00, '未知'),
+('FL098', 'AirlineH', 'KWE', 'LHW', '2024-06-23 13:00:00', '2024-06-23 15:00:00', 2, 12, 70, 2200.00, 1200.00, 550.00, '未知'),
+('FL099', 'AirlineI', 'XIY', 'PEK', '2024-06-23 14:00:00', '2024-06-23 16:00:00', 4, 8, 90, 2300.00, 1300.00, 600.00, '未知'),
+('FL100', 'AirlineJ', 'LHW', 'TSN', '2024-06-23 15:00:00', '2024-06-23 17:00:00', 1, 10, 60, 2400.00, 1400.00, 650.00, '未知');
+
diff --git a/Project/Manager/data_source/init_manager_db.sql b/Project/Manager/data_source/init_manager_db.sql
new file mode 100644
index 0000000..053349a
--- /dev/null
+++ b/Project/Manager/data_source/init_manager_db.sql
@@ -0,0 +1,9 @@
+DROP TABLE IF EXISTS Managers;
+
+CREATE TABLE Managers (
+    ID VARCHAR(255) PRIMARY KEY,
+    `Password` VARCHAR(255) NOT NULL
+);
+
+INSERT INTO Managers
+VALUES ('Admin', 'e10adc3949ba59abbe56e057f20f883e');
\ No newline at end of file
diff --git a/Project/db.sql b/Project/Manager/data_source/init_service_db.sql
similarity index 72%
rename from Project/db.sql
rename to Project/Manager/data_source/init_service_db.sql
index 50163fd..803a8ec 100644
--- a/Project/db.sql
+++ b/Project/Manager/data_source/init_service_db.sql
@@ -1,14 +1,15 @@
 DROP TABLE IF EXISTS Tickets;
+DROP TABLE IF EXISTS Orders;
+DROP TABLE IF EXISTS Users;
 DROP TABLE IF EXISTS Flights;
 DROP TABLE IF EXISTS Airports;
-DROP TABLE IF EXISTS Users;
 DROP TABLE IF EXISTS Passengers;
 
 CREATE TABLE Passengers (
-    ID BIGINT PRIMARY KEY,
+    ID VARCHAR(18) PRIMARY KEY,
     `Name` VARCHAR(255) NOT NULL,
     Phone_number BIGINT NOT NULL,
-    CHECK (REGEXP_LIKE(ID, '^\\d{18}$')),
+    CHECK (REGEXP_LIKE(ID, '^[1-9]\\d{5}(19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2]\\d|3[0-1])\\d{3}([0-9]|x)$')),
     CHECK (REGEXP_LIKE(Phone_number, '^\\d{11}$'))
 );
 
@@ -20,17 +21,16 @@ CREATE TABLE Users (
 );
 
 CREATE TABLE Airports (
-    ID INT AUTO_INCREMENT PRIMARY KEY,
+    ID VARCHAR(3) PRIMARY KEY, -- 机场三字码
     `Name` VARCHAR(255) UNIQUE NOT NULL,
-    Country VARCHAR(255) NOT NULL,
     City VARCHAR(255) NOT NULL
 );
 
 CREATE TABLE Flights (
     ID VARCHAR(255) PRIMARY KEY,
     Airline VARCHAR(255) NOT NULL,
-    Departure_airport INT NOT NULL,
-    Arrival_airport INT NOT NULL,
+    Departure_airport VARCHAR(3) NOT NULL,
+    Arrival_airport VARCHAR(3) NOT NULL,
     Departure_time DATETIME NOT NULL,
     Arrival_time DATETIME NOT NULL,
     First_class_seats_remaining INT NOT NULL, -- 头等舱剩余座位
@@ -39,20 +39,29 @@ CREATE TABLE Flights (
     First_class_price DECIMAL(7, 2) NOT NULL, -- 头等舱价格
     Business_class_price DECIMAL(7, 2) NOT NULL, -- 商务舱价格
     Economy_class_price DECIMAL(7, 2) NOT NULL, -- 经济舱价格
-    `Status` VARCHAR(255) NOT NULL CHECK (`Status` IN ('候机中', '延误', '已起飞', '已降落', '开始检票')), -- 航班状态
+    `Status` VARCHAR(255) NOT NULL CHECK (`Status` IN ('候机中', '延误', '已起飞', '已降落', '开始检票', '未知')), -- 航班状态
     FOREIGN KEY (Departure_airport) REFERENCES Airports(ID) ON DELETE CASCADE,
     FOREIGN KEY (Arrival_airport) REFERENCES Airports(ID) ON DELETE CASCADE,
     CHECK (Departure_time < Arrival_time)
 );
 
+CREATE TABLE Orders (
+    ID INT AUTO_INCREMENT PRIMARY KEY,
+    Order_time DATETIME NOT NULL,
+    Paid TINYINT NOT NULL,
+    User_phone_number BIGINT NOT NULL,
+    FOREIGN KEY (User_phone_number) REFERENCES Users(Phone_number) ON DELETE CASCADE
+);
+
 CREATE TABLE Tickets (
     ID INT AUTO_INCREMENT PRIMARY KEY,
     Price DECIMAL(7, 2) NOT NULL,
     FlightID VARCHAR(255) NOT NULL,
     Seat_class VARCHAR(255) NOT NULL, -- 级别信息
-    PassengerID BIGINT NOT NULL,
-    Paid TINYINT NOT NULL,
+    PassengerID VARCHAR(18) NOT NULL,    
+    OrderID INT NOT NULL,
     FOREIGN KEY (FlightID) REFERENCES Flights(ID) ON DELETE CASCADE,
     FOREIGN KEY (PassengerID) REFERENCES Passengers(ID) ON DELETE CASCADE,
+    FOREIGN KEY (OrderID) REFERENCES Orders(ID) ON DELETE CASCADE,
     CHECK (Seat_class IN ('First Class', 'Business Class', 'Economy Class'))
 );
\ No newline at end of file
diff --git a/Project/Manager/func/config.py b/Project/Manager/func/config.py
new file mode 100644
index 0000000..5b82243
--- /dev/null
+++ b/Project/Manager/func/config.py
@@ -0,0 +1,9 @@
+db = {
+    'host':'localhost', 
+    'user':'kejingfan', 
+    'password':'KJF2811879', 
+    'database':'TESTDB'
+}
+
+SECRET_KEY = 'ILOVEDATABASETECH'
+
diff --git a/Project/Manager/func/index.py b/Project/Manager/func/index.py
new file mode 100644
index 0000000..c511859
--- /dev/null
+++ b/Project/Manager/func/index.py
@@ -0,0 +1,32 @@
+from flask import render_template, request, g, redirect, url_for, session
+from .config import db
+import pymysql
+
+def index():
+    if request.method == 'GET':
+        if not g.user:
+            return redirect(url_for("login"))
+        flightID = request.args.get('flightID')
+
+        conn = pymysql.connect(**db)
+        cursor = conn.cursor(pymysql.cursors.DictCursor)
+        
+        search_sql = """ """
+        cursor.execute(search_sql, (flightID, ))
+        flights = cursor.fetchall()
+        cursor.close()
+        conn.close()
+        
+        return render_template(
+            'search.html', 
+            flights=flights, 
+            username=g.user
+        )
+
+def logout():
+    session.clear()
+    session.pop('user_id', None)
+    return redirect(url_for('login'))
+
+def modify():
+    pass
diff --git a/Project/Manager/func/login.py b/Project/Manager/func/login.py
new file mode 100644
index 0000000..ac54ca4
--- /dev/null
+++ b/Project/Manager/func/login.py
@@ -0,0 +1,34 @@
+from flask import request, jsonify, session, url_for, render_template
+from .config import db
+import pymysql
+
+
+def connect(managerID, encrypted_password):
+    conn = pymysql.connect(**db)
+    cursor = conn.cursor(pymysql.cursors.DictCursor)
+    args = (managerID, encrypted_password)
+    verify_sql = "SELECT COUNT(*) FROM Managers WHERE ID = %s AND `Password` = %s;"
+    cursor.execute(verify_sql, args)
+    verified = cursor.fetchone()
+    cursor.close()
+    conn.close()
+    return verified['COUNT(*)'] > 0
+
+def login():
+    if request.method == 'GET':
+        return render_template('login.html')
+
+    if request.method == 'POST':
+        session.pop('user_id', None)
+        managerID = request.json.get('username')
+        encrypted_password = request.json.get('password')
+        try:
+            user = connect(managerID, encrypted_password)
+            if not user:
+                return jsonify({'message': '账号或密码错误'}), 401
+            session['user_id'] = managerID
+            session.modified = True
+            return jsonify({'redirect': url_for('index')})
+        except Exception as e:
+            print(e)
+            return jsonify({'message': '数据库错误,请稍后再试'}), 500
\ No newline at end of file
diff --git a/Project/Manager/main.py b/Project/Manager/main.py
new file mode 100644
index 0000000..44d35df
--- /dev/null
+++ b/Project/Manager/main.py
@@ -0,0 +1,49 @@
+from flask import Flask, redirect, url_for, session, g
+from flask_httpauth import HTTPTokenAuth
+from flask_cors import CORS
+from func.config import SECRET_KEY
+
+import func.login
+import func.index
+
+app = Flask(__name__)
+app.config["SECRET_KEY"] = SECRET_KEY
+app.config["JSON_AS_ASCII"] = False
+app.config['SESSION_COOKIE_HTTPONLY'] = True
+app.config['SESSION_COOKIE_SECURE'] = False
+app.config['SESSION_COOKIE_SAMESITE'] = 'Lax'
+CORS(app, supports_credentials=True)
+auth = HTTPTokenAuth(scheme='Bearer')
+
+@app.before_request
+def before_request():
+    g.user = None
+    if 'user_id' in session:
+        g.user = session.get('user_id')
+
+@app.route("/")
+def home():
+    return redirect(url_for('index'))
+
+@app.route("/index", methods=['GET'])
+def index():
+    return func.index.index()
+
+@app.route("/modify", methods=['POST'])
+def modify():
+    return func.index.modify()
+
+@app.route("/login", methods=['GET', 'POST'])
+def login():
+    return func.login.login()
+
+@app.route('/logout')
+def logout():
+    return func.index.logout()
+
+if __name__ == "__main__":
+    app.run(
+        host="0.0.0.0",
+        port=8889,
+        debug=True
+    )
diff --git a/Project/Manager/static/css/index.css b/Project/Manager/static/css/index.css
new file mode 100644
index 0000000..e2c6cdd
--- /dev/null
+++ b/Project/Manager/static/css/index.css
@@ -0,0 +1,251 @@
+body {
+    font-family: Arial, sans-serif;
+    margin: 0;
+    padding: 0;
+    display: flex;
+    flex-direction: column;
+    min-height: 100vh;
+}
+
+header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    background-color: rgba(28, 108, 178, 0.9);
+    color: white;
+    padding: 20px;
+    width: 100%;
+    position: fixed;
+    top: 0;
+    z-index: 1000;
+}
+
+.header-content {
+    display: flex;
+    align-items: center;
+    width: 100%;
+    justify-content: space-between;
+}
+
+.logo {
+    font-size: 24px;
+    font-weight: bold;
+    margin-left: 20px;
+}
+
+.nav-buttons {
+    display: flex;
+    gap: 20px;
+}
+
+.nav-buttons a {
+    color: white;
+    text-decoration: none;
+    font-size: 16px;
+    padding: 10px;
+    border-radius: 5px;
+}
+
+.nav-buttons a:hover {
+    background-color: #155a8c;
+}
+
+.user-menu {
+    position: relative;
+    display: flex;
+    align-items: center;
+    margin-right: 20px;
+}
+
+.user-menu span {
+    margin-right: 10px;
+}
+
+.dropdown {
+    position: relative;
+    display: inline-block;
+}
+
+.dropbtn {
+    background-color: rgba(28, 108, 178, 0.9);
+    color: white;
+    border: none;
+    cursor: pointer;
+    font-size: 16px;
+}
+
+.dropdown-content {
+    display: none;
+    position: absolute;
+    background-color: #f9f9f9;
+    min-width: 160px;
+    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
+    z-index: 1;
+    right: 0;  /* 确保下拉菜单靠右对齐 */
+}
+
+.dropdown-content a {
+    color: black;
+    padding: 12px 16px;
+    text-decoration: none;
+    display: block;
+}
+
+.dropdown-content a:hover {
+    background-color: #f1f1f1;
+}
+
+.dropdown:hover .dropdown-content {
+    display: block;
+}
+
+main {
+    flex: 1;
+    width: 80%;
+    margin: 20px auto;
+    padding-top: 80px; /* 给主内容增加顶部填充,以避免被固定导航栏遮挡 */
+}
+
+h2 {
+    text-align: center;
+    color: #1c6cb2;
+}
+
+table {
+    width: 100%;
+    border-collapse: collapse;
+    margin-top: 20px;
+}
+
+table, th, td {
+    border: 1px solid #ccc;
+}
+
+th, td {
+    padding: 10px;
+    text-align: center;
+}
+
+th {
+    background-color: #f2f2f2;
+}
+
+.no-results {
+    text-align: center;
+    color: red;
+    font-size: 18px;
+    margin-top: 20px;
+}
+
+footer {
+    background-color: rgba(28, 108, 178, 0.9);
+    color: white;
+    text-align: center;
+    padding: 10px 0;
+    width: 100%;
+    position: relative;
+    margin-top: auto; /* 将footer推到页面底部 */
+}
+
+.content {
+    background-color: rgba(255, 255, 255, 0.8);
+    padding: 20px;
+    border-radius: 10px;
+    text-align: center;
+    width: 80%;
+    max-width: 800px;
+    margin: 20px auto;
+    position: relative;
+}
+
+.tabcontent {
+    display: block;
+    padding: 20px;
+}
+
+.form-row {
+    display: flex;
+    justify-content: flex-start; /* Left-align the form items */
+    margin-bottom: 15px;
+}
+
+.form-row label {
+    flex: 0 0 120px; /* Fixed width for labels */
+    margin-right: 10px;
+    text-align: right;
+    line-height: 32px;
+}
+
+.form-row input,
+.form-row select {
+    flex: 1;
+    padding: 8px;
+    font-size: 16px;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+}
+
+.form-row.form-row-center {
+    justify-content: center; /* Center-align the button */
+}
+
+.passenger-input {
+    display: flex;
+    align-items: center;
+    gap: 5px;
+}
+
+.passenger-input button {
+    padding: 5px 10px;
+    font-size: 18px;
+    background-color: #1c6cb2;
+    color: white;
+    border: none;
+    border-radius: 5px;
+    cursor: pointer;
+}
+
+.passenger-input button:hover {
+    background-color: #155a8c;
+}
+
+.passenger-input input {
+    width: 50px;
+    text-align: center;
+    font-size: 16px;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+}
+
+.btn {
+    padding: 10px 20px;
+    background-color: #1c6cb2;
+    color: white;
+    border: none;
+    border-radius: 5px;
+    text-decoration: none;
+    display: inline-block;
+    cursor: pointer;
+}
+
+.btn:hover {
+    background-color: #155a8c;
+}
+
+.error-message {
+    color: red;
+    font-size: 12px;
+    margin-top: 5px;
+    text-align: left;
+}
+
+/* Add animations for flight rows */
+.flight-row {
+    transition: transform 0.3s ease, box-shadow 0.3s ease, border-radius 0.3s ease;
+}
+
+.flight-row:hover {
+    transform: scale(1.02);
+    box-shadow: 0 0 10px rgba(28, 108, 178, 0.5);
+    border-radius: 10px;
+}
diff --git a/Project/Manager/static/css/login.css b/Project/Manager/static/css/login.css
new file mode 100644
index 0000000..d3fdcab
--- /dev/null
+++ b/Project/Manager/static/css/login.css
@@ -0,0 +1,93 @@
+body {
+    font-family: Arial, sans-serif;
+    margin: 0;
+    padding: 0;
+    background-color: #ffffff;
+    height: 100vh;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+
+header {
+    background-color: rgba(28, 108, 178, 0.9);
+    color: white;
+    padding: 20px 0;
+    text-align: center;
+    width: 100%;
+}
+
+main {
+    flex: 1;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    width: 100%;
+    position: relative;
+}
+
+.content {
+    background-color: rgba(255, 255, 255, 0.8);
+    padding: 20px;
+    border-radius: 10px;
+    text-align: center;
+    position: absolute;
+}
+
+h2 {
+    color: #1c6cb2;
+}
+
+.login-form {
+    margin-bottom: 20px;
+}
+
+.login-form input {
+    display: block;
+    margin: 10px auto;
+    padding: 10px;
+    font-size: 16px;
+    width: 80%;
+    max-width: 300px;
+    margin-bottom: 20px;  /* 增加外边距 */
+}
+
+.buttons {
+    display: flex;
+    justify-content: center;
+    gap: 10px;
+}
+
+.login-form button,
+.btn {
+    padding: 10px 20px;
+    background-color: #1c6cb2;
+    color: white;
+    border: none;
+    border-radius: 5px;
+    text-decoration: none;
+    display: inline-block;
+    line-height: 20px;
+    cursor: pointer;
+}
+
+.login-form button:hover,
+.btn:hover {
+    background-color: #155a8c;
+}
+
+footer {
+    background-color: rgba(28, 108, 178, 0.9);
+    color: white;
+    text-align: center;
+    padding: 10px 0;
+    width: 100%;
+}
+
+.error-message {
+    color: red;
+    font-size: 12px;
+    text-align: left;
+    margin-top: -10px;
+    margin-bottom: 10px;
+}
diff --git a/Project/Manager/static/js/index.js b/Project/Manager/static/js/index.js
new file mode 100644
index 0000000..10e2492
--- /dev/null
+++ b/Project/Manager/static/js/index.js
@@ -0,0 +1,42 @@
+function validateForm() {
+    var departure = document.getElementById('departure').value;
+    var destination = document.getElementById('destination').value;
+    var warning = document.getElementById('destination-warning');
+    if (departure === destination) {
+        warning.textContent = '出发地和目的地不能相同';
+        return false;
+    } else {
+        warning.textContent = '';
+    }
+    return true;
+}
+
+function increment() {
+    var passengers = document.getElementById("passengers");
+    var value = parseInt(passengers.value, 10);
+    if (value < 50) {
+        passengers.value = value + 1;
+    }
+}
+
+function decrement() {
+    var passengers = document.getElementById("passengers");
+    var value = parseInt(passengers.value, 10);
+    if (value > 1) {
+        passengers.value = value - 1;
+    }
+}
+
+document.addEventListener('DOMContentLoaded', function() {
+    // Set default date to tomorrow
+    var departureDate = document.getElementById('departure-date');
+    if (!departureDate.value) {
+        var today = new Date();
+        var tomorrow = new Date(today);
+        tomorrow.setDate(tomorrow.getDate() + 1);
+        var month = ('0' + (tomorrow.getMonth() + 1)).slice(-2);
+        var day = ('0' + tomorrow.getDate()).slice(-2);
+        var year = tomorrow.getFullYear();
+        departureDate.value = `${year}-${month}-${day}`;
+    }
+});
diff --git a/Project/Manager/static/js/login.js b/Project/Manager/static/js/login.js
new file mode 100644
index 0000000..65de34a
--- /dev/null
+++ b/Project/Manager/static/js/login.js
@@ -0,0 +1,80 @@
+window.onload = function() {
+    autoLogin();
+};
+
+var checkInfo = {};
+
+checkInfo.checkUsername = function() {
+    let username = document.getElementById('username').value;
+    if (username.length < 1) {
+        document.getElementById('usernameError').textContent = '用户名不能为空';
+        return false;
+    }
+    document.getElementById('usernameError').textContent = '';
+    return true;
+}
+
+checkInfo.checkPassword = function() {
+    let password = document.getElementById('password').value;
+    let regexPassword = /^[A-Za-z0-9\W_]{6,20}$/;
+    if (!regexPassword.test(password)) {
+        document.getElementById('loginError').textContent = "密码须为长度为6-20位字母、数字或符号";
+        return false;
+    }
+    document.getElementById('loginError').textContent = '';
+    return true;
+}
+
+function submitForm() {
+    if (checkInfo.checkUsername() && checkInfo.checkPassword()) {
+        document.getElementById('encryptedPassword').value = md5(
+            document.getElementById('password').value
+        );
+        login();
+        return true;
+    }
+    return false;
+}
+
+// 登录函数
+async function login() {
+    const username = document.getElementById('username').value;
+    const encryptedPassword = document.getElementById('encryptedPassword').value;
+    try {
+        const response = await fetch('/login', {
+            method: 'POST',
+            headers: {
+                'Content-Type': 'application/json'
+            },
+            body: JSON.stringify({ username: username, password: encryptedPassword }),
+            credentials: 'include'  // 确保请求包含凭据(cookies)
+        });
+        const data = await response.json();
+        if (response.ok) {
+            alert('登录成功');
+            // 自动跳转到主页
+            window.location.href = data.redirect;
+        } else {
+            document.getElementById('loginError').textContent = data.message;
+        }
+    } catch (error) {
+        alert('数据库错误,请稍后再试');
+    }
+}
+
+// 自动登录函数
+async function autoLogin() {
+    const token = localStorage.getItem('token');
+    if (token) {
+        const response = await fetch('/index', {
+            headers: {
+                'Authorization': 'Bearer ' + token
+            }
+        });
+        if (response.ok) {
+            document.getElementById('content').innerText = '已自动登录';
+        } else {
+            document.getElementById('content').innerText = '自动登录失败';
+        }
+    }
+}
diff --git a/Project/templates/index.html b/Project/Manager/templates/index.html
similarity index 70%
rename from Project/templates/index.html
rename to Project/Manager/templates/index.html
index 2b5f51e..e82183d 100644
--- a/Project/templates/index.html
+++ b/Project/Manager/templates/index.html
@@ -14,7 +14,7 @@
             <div class="logo">KJF航班订票</div>
             <div class="nav-buttons">
                 <a href="{{ url_for('index') }}">首页</a>
-                <a href="{{ url_for('orders') }}">我的订单</a>
+                <a href="{{ url_for('order_list') }}">我的订单</a>
             </div>
             <div class="user-menu">
                 <span>{{ username }}</span>
@@ -46,23 +46,24 @@
                     <div class="form-row">
                         <label for="departure">出发地:</label>
                         <select id="departure" name="departure">
-                            <option value="北京">北京</option>
-                            <option value="上海">上海</option>
-                            <option value="广州">广州</option>
+                            {% for city in cities %}
+                                <option value="{{ city }}" {% if city == "北京" %}selected{% endif %}>{{ city }}</option>
+                            {% endfor %}
                         </select>
                     </div>
                     <div class="form-row">
                         <label for="destination">目的地:</label>
                         <select id="destination" name="destination">
-                            <option value="北京">北京</option>
-                            <option value="上海">上海</option>
-                            <option value="广州">广州</option>
+                            {% for city in cities %}
+                                <option value="{{ city }}" {% if city == "上海" %}selected{% endif %}>{{ city }}</option>
+                            {% endfor %}
                         </select>
                         <div id="destination-warning" class="error-message"></div>
                     </div>
                     <div class="form-row">
                         <label for="departure-date">出发日期:</label>
-                        <input type="date" id="departure-date" name="departure-date">
+                        <input type="date" id="departure-date" name="departure-date" required>
+                        <div id="date-warning" class="error-message"></div>
                     </div>
                     <div class="form-row">
                         <label for="passengers">乘客人数:</label>
@@ -72,7 +73,7 @@
                             <button type="button" onclick="increment()">+</button>
                         </div>
                     </div>
-                    <div class="form-row">
+                    <div class="form-row form-row-center">
                         <button type="submit" class="btn">立即查询</button>
                     </div>
                 </form>
@@ -88,27 +89,28 @@
             var departure = document.getElementById('departure').value;
             var destination = document.getElementById('destination').value;
             var warning = document.getElementById('destination-warning');
+            var dateWarning = document.getElementById('date-warning');
+            var departureDate = document.getElementById('departure-date').value;
+
+            var today = new Date();
+            var selectedDate = new Date(departureDate);
+            today.setHours(0, 0, 0, 0);  // Ensure time comparison is not affected
+
             if (departure === destination) {
                 warning.textContent = '出发地和目的地不能相同';
                 return false;
             } else {
                 warning.textContent = '';
             }
-            return true;
-        }
 
-        function openTab(evt, tabName) {
-            var i, tabcontent, tablinks;
-            tabcontent = document.getElementsByClassName("tabcontent");
-            for (i = 0; i < tabcontent.length; i++) {
-                tabcontent[i].style.display = "none";
+            if (selectedDate < today) {
+                dateWarning.textContent = '出发日期不能早于今天';
+                return false;
+            } else {
+                dateWarning.textContent = '';
             }
-            tablinks = document.getElementsByClassName("tablinks");
-            for (i = 0; i < tablinks.length; i++) {
-                tablinks[i].className = tablinks[i].className.replace(" active", "");
-            }
-            document.getElementById(tabName).style.display = "block";
-            evt.currentTarget.className += " active";
+
+            return true;
         }
 
         function increment() {
@@ -126,6 +128,19 @@
                 passengers.value = value - 1;
             }
         }
+
+        document.addEventListener('DOMContentLoaded', function() {
+            // Set default date to tomorrow
+            var departureDate = document.getElementById('departure-date');
+            var today = new Date();
+            var tomorrow = new Date(today);
+            tomorrow.setDate(tomorrow.getDate() + 1);
+            var month = ('0' + (tomorrow.getMonth() + 1)).slice(-2);
+            var day = ('0' + tomorrow.getDate()).slice(-2);
+            var year = tomorrow.getFullYear();
+            departureDate.value = `${year}-${month}-${day}`;
+            departureDate.setAttribute('min', `${year}-${month}-${day}`);
+        });
     </script>
 </body>
 </html>
diff --git a/Project/Manager/templates/login.html b/Project/Manager/templates/login.html
new file mode 100644
index 0000000..7f82b8e
--- /dev/null
+++ b/Project/Manager/templates/login.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>管理员登录 - KJF航班订票</title>
+    <link rel="stylesheet" href="{{ url_for('static', filename='css/login.css') }}">
+    <script src="{{ url_for('static', filename='js/login.js') }}" defer></script>
+    <script src="https://cdn.bootcss.com/blueimp-md5/2.12.0/js/md5.min.js"></script>
+</head>
+<body>
+    <header>
+        <h1>KJF航班订票</h1>
+    </header>
+    <main>
+        <div class="content">
+            <h2>管理员登录</h2>
+            <div class="login-form">
+                <input type="text" id="username" placeholder="用户名">
+                <div id="usernameError" class="error-message"></div>
+                <input type="password" id="password" placeholder="密码">
+                <div id="loginError" class="error-message"></div>
+                <input type="hidden" id="encryptedPassword">
+                <div class="buttons">
+                    <button onclick="submitForm()">登录</button>
+                </div>
+            </div>
+        </div>
+    </main>
+    <footer>
+        <p>&copy; 2024 KJF航班订票. 保留所有权利。</p>
+    </footer>
+</body>
+</html>
diff --git a/Project/__pycache__/config.cpython-311.pyc b/Project/Service/__pycache__/config.cpython-311.pyc
similarity index 100%
rename from Project/__pycache__/config.cpython-311.pyc
rename to Project/Service/__pycache__/config.cpython-311.pyc
diff --git a/Project/__pycache__/main.cpython-311.pyc b/Project/Service/__pycache__/main.cpython-311.pyc
similarity index 100%
rename from Project/__pycache__/main.cpython-311.pyc
rename to Project/Service/__pycache__/main.cpython-311.pyc
diff --git a/Project/Service/func/__init__.py b/Project/Service/func/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/Project/func/__pycache__/__init__.cpython-311.pyc b/Project/Service/func/__pycache__/__init__.cpython-311.pyc
similarity index 100%
rename from Project/func/__pycache__/__init__.cpython-311.pyc
rename to Project/Service/func/__pycache__/__init__.cpython-311.pyc
diff --git a/Project/Service/func/__pycache__/book.cpython-311.pyc b/Project/Service/func/__pycache__/book.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..076970f4a499d19db2b00db79f6c62be9fe04c3f
GIT binary patch
literal 5525
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
S?N>Iuh~p5!AFjD+Q02cw3*oT<

literal 0
HcmV?d00001

diff --git a/Project/Service/func/__pycache__/cancel_order.cpython-311.pyc b/Project/Service/func/__pycache__/cancel_order.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9d2e09edf5b4b5a77eecb331c4f32e6740791d54
GIT binary patch
literal 2710
zcmd58-D}%M{A8bP*^;faP93M+h@c<DNg5|jJ4)IvY<2n-Cn-tBMoMQ~Nlu)|Rw~J?
z@oeUXK+_PGGAJ!<0Y8i`qyLOl#A*bA!q`LK41Ftm*qvnggEnlByPWTS-}n2t`zgN#
zg8_iX&L69p2`>PDV#FD)2Jr480-gaL@Pr6*#3GS%ExK~<MRyJ^LIUtE-Yt4^-bF8h
z0S`srqL24%f<=;t^C0GZi_OHK>63-~1wm0wQWp5EEO4snE68FhBgrPQ^p?O<gz4h%
z&2U)58OST(M!$Dah`mr9I@(vTjy0-|uMWZ5dEy0<c-fRH0~K3qj1^?h9?B;w<-h=_
z!4}NBIxTc!^FU=<vMZzm^Ich>9(6DPekFb+%0!8%TDfk~ZAcBZC@W1rR%nOXd1e`9
zyX-Exs%>66k^q$4C6FOrplrNsW`qDpy6udX^a}*OY@%gYf=U9(w#C$Bf=*dvllX6P
zhh`Rb#?^_<1Kv~i92%wPkSM!a{<fe_&&%GDHv#V6E&ED7-rL(0E0YNKwc-Afzj~y}
zZUcCd_jhKv+E(k9VCT7fpom!I08f<yKLeh&*5IC}OdT2}RU$vE<<7T!s7xQKLw_tY
zJW~!HsuBE{2C8nj6-f)~jLEuL|BKraJ2GRElFSQoD$AQ5QCiC8iznwNlap5$*qaIV
z+T83kJB#@W`}K{<xk*gC!k$*lfUPBF6}5P&p>R#iE-kA!6GQC0kXBQim{t_q#6p%^
z6;#KDWzaE1I$CC+rS+a*O(JD>r4(dHNy$Pkoy}+SOT|+GwlTiCo%mv5lC`y!CV75x
zfi1d`kHwShAUoQmcX;2V7SAM5tk?_=^l&eWY`fgY67oBUb<4QlnlLRdDW-c#P-U-$
z7ZgF3anqDN827EM=hl_`qUqzLd>*xP88<-F%N1k=wRE4oqYNjqoO-oE6dnj%K^06g
zBdFZ6low17CrXM#NQ=mvEUbxX4sk^3J3&SUrCctn#zHb~pC-ho$x#e4+_J!}rtAu0
zPiPwy9-wL}CZ*cdN?A@e5YuY|raxm<8Q+%xu8v)1ld@q+EadVgQ&{8Es$f;mvT~Fc
zL;(@nEq66&O*a(WY@PDj`}?{0vXm3ztHKJZekPrdUzK?L6^!4Ovw1GNCJIVQ%A^u$
zHGMCw2&wsXMHO<0E3Kf+#xsRH7w6J>P7v*Ihu79kx}6}$(V@65%HQaFR{;l1WT*6+
z>3hZWRRcORXfT778wV7<^I07bo`D0VXU|vl>Ct{8+OIP)gNbQm?0`DDGoeu|ntOBh
zUP;t~M|SUQ-`VT=rO)Uc(}U-Y;Q7k6x)=0ZuFTe8;L*&+%#(@gH`OT}ju>!6gCn(Y
z@3V=YCiL(rBYdiod_(orf!h<Wk)d6Bn|>VH32lXHB)uEh4m_rJ=q=iIht{KKjp$jO
z88(<<jT}a2gl`j-Dd&(&)o7K{;gA7`G&ocXb?-{sk{;?aLVcC%SonAy_&q2<v}}26
z-N&Dg8{KEN{Iz2zo+piCv8_NY!oH65zl!wlhxa)>a?XgHdmXv>DsoYej2n@0?aHhk
zncbr5E_i}|6O7h9Xs-i|eA?eaEXo#B4*);28`=&%`C-3zpVr9>26;iVCUWNZmxKl*
z4cE2s>3y>Ly$;6=IHtid#E*_^u)E1VSzWH)(c!28M>RP529l4aHl`j<Z%$XHu}pF!
z`EX`)rZQ7QoLd{W9ws-FmE>Pk`04fMNxeH}bjNgRz@P>+IPeZ#0ub|?o($?+tJYg?
zy;}PzqbHTmWS6W5D@TyHb$ev|8IwowGK`k@<mH^i7ewK6c?_ZWzbNG{TIz0sAZj44
b{oAa8h}Jo4AXKsb>TsACtb-31>-c{Fq{?1q

literal 0
HcmV?d00001

diff --git a/Project/func/__pycache__/config.cpython-311.pyc b/Project/Service/func/__pycache__/config.cpython-311.pyc
similarity index 100%
rename from Project/func/__pycache__/config.cpython-311.pyc
rename to Project/Service/func/__pycache__/config.cpython-311.pyc
diff --git a/Project/func/__pycache__/get_db.cpython-311.pyc b/Project/Service/func/__pycache__/get_db.cpython-311.pyc
similarity index 100%
rename from Project/func/__pycache__/get_db.cpython-311.pyc
rename to Project/Service/func/__pycache__/get_db.cpython-311.pyc
diff --git a/Project/Service/func/__pycache__/index.cpython-311.pyc b/Project/Service/func/__pycache__/index.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..07187aff678917ca2c65658efaca00a269f61240
GIT binary patch
literal 1338
zcmb7D&1(}u6rat0CTVR;>UUaOXoWy)E_xF|{0LfXg?Ny?gf%lsx8098Gf^ul6?zcy
z;6?03P-rVs{RjLj5(yFpa`Mz$q@H^6&Bi1R9>mA&oA;YH^XBb)zxg;koIoI7zOI(W
zVhH_^peukQ*}n<XTZ9o-Jmf33;>YZmuiC1w*_yB0x^LKqf^ZD0p6Oe*71^2>_Y-yk
zY<&aSNo;@~!e$<2tUVbvV~7z-0!(Ou6Tjj)oCuSW`&GiYP|Cuh1iO?JxiG8LE0jVi
zOhy=U!(dO5=M^!^JQowT96l_#zEdU)))HmH3q_Z^gcapAT`|B=;oJWX>Mi2kb(mLV
zxJa<F8vQiA%eC$r_~p4sSenPXHbOkvw{dI-qU`n}4Wc~aL;bx^5g+Lztn#rw+5vO7
z2cMvUJbHJ3)^;Gj-CmA)Xbu!sUleNY+8v>LVc88HCtRrRqjSsL_cE$5Iz<sir&PkK
zGC~8#Cz%A5frQ}`z8qqzOQ1<Fl|`ebRFWlB)`7~O7Fu*rp`!qp{OPHKh3s<Zlk6&4
zaf5Qn39?s0EIXLJP2HgARy@KAVX1J{;m$pWkwSirLEpg}u0WHsrD{;jb`q|v2|cpt
zF^DYFiCVdiTIP|BXPZaAnUghhvNbaL>OmVR@pG-z>36yJxq5o8k)Erk<{PQ`+R%J!
zZ2E=K8kuYko!CD0A-$DurcQ2O-n!n_)zQRH1nQSmZKTE%?KrZ|K+Ju(3k}dl-X78B
zB^W@PUV{(QX0U0>;I8f~g4cu54xruM3hb1{{Ue8|^)EVQ)J1p}(4vBi=@AH!(WwQK
z(2E{%s8B0mrQf|zh#m(gJt}t?K#s7==>z~tLv{fa)K*Jw+<LyWv9!J<&4t(T&GU6_
zs-aEQw5e7y^(MEOtB=n##%Jou*+z1<rp-n{7c;{`FL@4I?a)I~DWXvS`c7s>F$_v>
zIbxE~tK9Wi#HFaoQ8qL!&-OAsurB%`u6pDWod$=jJbMnRttyJrL^o>xGn#0oHaMDS
YqBc0%nxz0AdTLx%&H_FDQc;S(0VWC{(EtDd

literal 0
HcmV?d00001

diff --git a/Project/func/__pycache__/login.cpython-311.pyc b/Project/Service/func/__pycache__/login.cpython-311.pyc
similarity index 100%
rename from Project/func/__pycache__/login.cpython-311.pyc
rename to Project/Service/func/__pycache__/login.cpython-311.pyc
diff --git a/Project/Service/func/__pycache__/modify.cpython-311.pyc b/Project/Service/func/__pycache__/modify.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5e22dc5823b7ffbc103a38acb1ca12ab49a6f783
GIT binary patch
literal 7224
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
W+zkGPaeuEiMCl<KG-NX%()bq!!NF(%

literal 0
HcmV?d00001

diff --git a/Project/Service/func/__pycache__/order.cpython-311.pyc b/Project/Service/func/__pycache__/order.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5481e7891ef02db2372872acedd3f0a470491dad
GIT binary patch
literal 2553
zcmb_d-)q}O96#BTrTFKPHi<hnEIL~1G_}WCHpaYerB2%<o>Q8#4wqq6{cz;Sl6yLr
zCfMMXu(lyAWfYQ!75q@Lj_hH7!u|w%Xv_!-gHc%D40-F*?xe_$yB7MelXUmJ?|tsR
zKkuubB9S1#EwZz$JYoR&n@qgs+b8xinAidmkSGmQr~*~-6?_$c!C#>ZbcHD}6p(z9
zUkg;&0*h%N(Hd9aBxVg1MkIO>Bm*zVQAx&*L0Ok%SVVHAstHK8St#GE$tJQnC`&4o
zMP#!zs1+3h+EnQUMYd74Pr8v8$q`;-G2zGGo)7n10C{{omdPHcwLAknhBHdk4o2+u
zQ4N3s13;PfX!AW3@@N21WI#*4;S+{uivYz2*fQtQ(ufMsm^TC93H3eIpz2i13BZ8w
zQYbp$l>2&=!yb27W&^vw;jjBz2ekB%0Mz|;pin#58@qjvPynM3$QYn^FuB{GHt0HS
zW-<1FP5nhMjKybCZ-;xMXX#<PhG&aFVj9dFtz_O{<vRm?2h_0UjllnI;Rgd*QeX|#
z1KC%+HEdghMaK^8VC!@}P-llS^N_dx3%7%>>Ms7=hA&t!Z*vADH%palMl(vPE_{Sj
zJjmm=IFp+>f0Z{<Q`5XcIw_SGDl#vad{(Xs5Y?bu6jWF>AS&v3WttcIh;tCCw*+ly
z-8uEbm4&bP1tQbr4Tm$gFq`MEs^YSYOdjzIc`R}^%YV+Jl!Kei4qz8FwX}p`3W1@N
zJ9WSc-ZQ|RbJa3=i2#+<e-y^YORwJ{xI11k0OJJ@f9=xDl^IXTW2Ph34!VBSR1>X!
z=dkwuhluN{j$_DpdCAb_qF$@qkf8%}9MU&`V8Ug=G-bU+{8V+V?Q<N1tHbK_orN{s
z*GcRbD;#iA_D<t(?>O$}0foz79ef)mr9=WpFwbpYgDr{z8xe`Z>EW}P%TN{N{Lh5;
zr9QL+$c+;z2t5CCKD}gA<n*#!R`rr1=;`x@MCx%GZ_`D!s>x>2P>NXr2{!~&E-tQ^
zxP;?Xql`;-TB+$`+VNYey7F=)Q<8Q0b`_pojl0Z@W{84jo=x>vPGPwwvEU#4G(mej
zgWspeA1d3|9vSZJV82I<T6IH{T0#{qN!yHbw$1KaVuz4{aH3X;p*B}DWk_-vlIx#5
z3`t$LX#ti@+h39qB!3W_CMZZQ5)6<zTV1KFm^U?>6%Ad-mcbFi4u~~q;vW+0j;0;V
zsv<hS&y;V=Vh#VwI7LPxNeY`0HN*56f~MJivsQs5a5hbJN^+2tbekqpV1ke%Zq^am
z`w6J(ih*r%!&Jlza1sMy9Cs%9so;z4G)U?KobWngjG4m;(*)0A6C3qEV~O8miB_-^
zJ88vEHZMI3g*QI#0g9P=7Mpy`w%AVmgcU#0i6yOAvdtx*hsHL(Xoq<GKEC3P&1^R^
zx_N#5`s2wT6V{Q_oyZw0a;ABq7vM&@=4@{aFrj<-yZMKoZr|Qs?$A>fJ=LbCx}%d@
zi60W3(WBPr(dJw)0KyYJ;AhfZF1i_B4?l=*MDIttTzE6M9()kq2;UF8Dup}oQ&#*`
zCzi5esWzAD1(-uzbG{e$<b2kOw?Z9y+M=i1^mI3Rc+*%nI?;p`O*Ak5MF;QY?&j{~
z*YeGLm*(!x-JQFWTgx?b&&S5yoci@59y{Y13-@CgYb?{8e;#^wJM(n)w@=#Nh=1sY
zrK5JJ)(O?DP_0eZ;5hbbGH5f3CYZ}kB%OpBq>h_U0US_8Ejd{O-}ge|q@Z(z6RVe8
yrea7nO+E`#7((v0xrDo(pQ5NP__F<WZx>9ohu<!UHl3$OPf@q19(aB4X!0+Ip-b8T

literal 0
HcmV?d00001

diff --git a/Project/Service/func/__pycache__/order_list.cpython-311.pyc b/Project/Service/func/__pycache__/order_list.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fc4a908e717bed43aea7f9892fd6b8e190854b9e
GIT binary patch
literal 2738
zcma(TTW`}=_&Bi>H)$HumR@LS4UExbC7}aN4AE_fw4+g%-k2tZO_7P6)~$2l*g-8y
zq=1k>2yNB&K&2HanpoLXH1W6}u}KNCgk=c{Y2tymNWAf~eaBAXrsIKA=R4o+eCNBJ
zbNbll^B@?1JYGxx;zsBnLNte?fxI~n$O9xGfs#>%N>CX`!jW+%oEbVnXP5*-A;BRy
zWmm?Xa08A6T4ochz}!ZO4uM`mLDy?yD##dqEM^4}Csi?%mw8n*+*rI;5Ea#6u_#Db
zOsR&ufaPR5hYf1^HAR+DhC{d-PZ1N%;RD18zc=FmA0V~Khk2E(F^4j&GEE#I6~b!{
zf!YDB-IiuMwS?4;rY6{H*${dqq;}epN7VOJ2^CRgk7Zk`vNpcj!dF|C+xIL{f}`Xp
zQWdit_DTyYI^G>&n%aRP?KTUAC<GR~`&Scs2Y$OPLCFbvdm?EG_UVB=^nQ90D$zw}
z6n*z&i77IIbFgKy<SM#~^mPhffSD0!TLKi*M!DK3cN@jFQ5|iRr;YO3)G`t}1>d%}
zNEcnCiOFnBg)SSfkdFG_01y4PPJ6{5H|^FAtUJ~nwl=H{*whWMpK_)g#EbhssfX>Y
zigd+qQ#RIKvG%=7ZuN+*DRdXzZT%5w%AWM>!1>rEC&e6a6c5G?M$RouS^i&We-8&^
zX=--r;$<!uo{4h2!p&hgp)=8OV3=r9l`<ls=6OjN=h6+eX<1rcQHfqUd_lsplm#Wz
z9<d2S2*>%1NGwLhJdf1^7L&Y$^Es?0vmhDg_?E^6jHT<myidN@S~_f7u^dW=msDOY
zDC1ndWoMpO6fwIjVzTu(r-tXTloCxl(~EOoS+OZx&g8`AX5!psDYYi53a4^&aVrIr
zu&j{-Tg{4A;nGA+4L5`5Ce3`<dXNbcpu!16aj(;j&|!rD8GOeI-deFQ6`;?z>9;~u
zxV+^|iv#tWgk&_Ve{*SSaSB5ET7e5Uzmm&}$!sBWRm7llTrnLm+>JmDk6mhmCWSWG
zW{ifrQC_3ZF2UYH8om2`Hp^>t+1jLFhRZ4!Cbw14i^=ta$*IF#1dua;4-i1Q7k3lT
zLqIP8!_$gUF+7)ZDleOb#RrMd*AkMd<37S;O!*Cejx=*pmJ~I-qGsfv!*H1_#b67N
z7t)8nqhL2CSGYkF7AE&Sb`jd0-^gqz*JQ(;%4M_gHeqsm8?ICVEAT$Ktr<LuN-6bX
zgDI|ysRF!gY+6)PE4(ZlOiIov5I>*K!|P|z#2do}?G6tgCTG*2i624MpvgXXl(0OO
zn@QLnlWU~GND8o(!I(mWwW5P!S=wft3VCbH0|?;ld}Jk;5hH8js+3($^V!J7oIoDh
z2;?W5lJc^sBy;Ixlvnwyydox-HWYZ9L7H2Icq8dTHWjgUF>{#Tz+o_N0+J`?XShVl
z=!LiQ{wH-rF`*a!{)g_0yEZVU4UE<NLCqhmvcXs0?)#rty&QZG7p=J*)qQ~<uH3uw
zuz!108$4a}ozZ+}%F}h1x0@};>H~=J-ihCeZ=U;=dgR*LsL?@<4p!-)?(6v>c`sS>
zjcC4+^7KpEb7%I}?9KS?csZ`q?48)H*v;A7v*p>k3w8IFV|t*!jsnc23GOm_&%oB8
z)^qGGt9yI4&Q-m~;d?oBOdmN`nbk%n^nt@$>204re54Z6hEM84TxC!j`bZB&s;4e#
zp&5PbWHlVs#-{Y6C#qv-wWFWvhej*xc0?cH^pVkef9D5Xbp+sUY;(QV$<+^`j-Ji4
z8aur8t;U9)vlGwQiKoZ^^lKkqs<AT~J5yz6bhf*pQe{K%f#PrC(=VT7YwUT8Q#1Lm
z0tYu&pZA@3)_0=T7u5QKwLnM<gvzm3-b2-)@u!KukNovv)w@vhE@<9`D!uRqYJ`Fw
zgGtN0vSv0Lrbz)?O>T9*3mPviEt~y~$>U^|d5B=A2#5f9%bw5Vgn}%7hED@Y{(DkZ
k0MwlnMd|2^>ic~<>Z`VYI_fH$e|36-TBPde-O%*pKYBiy*Z=?k

literal 0
HcmV?d00001

diff --git a/Project/Service/func/__pycache__/pay.cpython-311.pyc b/Project/Service/func/__pycache__/pay.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..575cb17680e3fd6257902c4c1c0ddba1b4be5218
GIT binary patch
literal 811
zcma)3&x_MQ6rM>Yo2=QTQIK7A4?Q-*nwtlaMbOJaw<ra{TtaLnY1;hg&P)zn6!zfJ
zqp)6to>pW%_(v#sY^9(K^yJA~p|?FblkK)!@Zcl)-g`6ez4^YGkDHs<fUp-k-4H<l
ze#_+2lzA|#iQohTAb<%-p$k*RRZ`VeQ{<vlb2SJ8<qdGx0<{Tj^hdVY8rKOvEHGuf
zLU0yf;xU}|5}#oXBW@5J#00k(*9($(VNP1}(@LiaRK-90F5m>Pa`6H>g64(M9VYAM
z#`Mbw2%@K=>TFTDnl%A4mbIP5jKSJ+br}W9YWHivDpz*ZSF7w6lRu+Vq2NraC{0|A
z*5F!_M{&m2!z7N{%!`8~qv!YUwON|j3XyNYje=s5`6;&7iR8wSTp*Ghks65{$&pVY
z%GC%ng37$?faM4(g;&q_opzpLr;9sr7KMK1JkA4o>&{aWXRWxGVCv<e_rz!ZOP^w|
z*{9-(#BSaZ595SI)^a4dUZ1PNlj~xtJexKI9D|9u@%H`{K<)0Nvh_h9=%el0c)K>L
z*yD;lH0+7B^={**RsCUA2X{u+?%3Kr-k+Ga-#_?r>)W%h&xdAxWY))KeTeEaF%dLu
zooiv@({3rT)K%WV744G4CqQlpM=Sy7#=|rZiUjYGn<ACM>4AW$3L*Rj9u5ERn<4}c
L;1v8D%j5n6nC7vc

literal 0
HcmV?d00001

diff --git a/Project/Service/func/__pycache__/pay_confirm.cpython-311.pyc b/Project/Service/func/__pycache__/pay_confirm.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c2623b6e0425887b742cf1b2cce5553588a0c68c
GIT binary patch
literal 1754
zcmcgsL2DaF6rPc0rLDBmHj#-Pa2tiBU^T?DFC_;%CPYfpSe9MOB}K*vWp^a6ysK4a
zR}cjWWMfEdL|qESy##b9F0FgWPgxZ~#e%_5a>z~KTTYo-S(cU7w5L8TGvAx}-kbNH
z-pnt7fDcd!{I-$1?grp5ru4;i3Qq1&un%M)LltN+4K-KVrMc5?4W$tTvP*WWoaRY;
zC<Zc8y=kw^ZG$u~qZEjE-ZD24Wb*{e3c-?Td&@-4<aA=gyzM3UX&D>lTgX_@cF9kY
z60_)whXNWIIC)Lu*#~BSoz4Yj<4Cg~Yk$F+Wq3dthi9xBFqyYgDWE<w#!Y`817HRQ
zSauD27}iq26bIY_-^a370p{ht2EfnoJ6MBN*mP<=Snr_&Ivt)Z)@U_r?y9SKE~2wd
zP<2;94j#~K56?1&fU<=FXMjHNjH<|pQSQ0?F5*(3@W1gctQ;Dy)v%TVGFRg+%#!=Z
zEMYS^h<AX7vvjKQKV?`2zk7!Nix0Dm@JXB3iHu1`k!?=Z^GfmgjZ{1lzrPaxDi(gQ
zytoivWcx<=@x%CXoGs3VKQnA!&q`Gc^ZCR#OR;+^@jfvXUkNW|6`2yJhpi%zuon9j
zL`1?m-9}lGH*9wvn}l=pvVjR<*NL$1x4or`RxzHcwpY@NMS3?0Yhv3Ym5D*`rx!oN
zQrW~dpTnlKt{1V*NvdvO%Fs1UF(V%5KpQc05@NQZw2q~XOfP)qTIfOijHY7PAD2sV
z*2IH-g9RFP<lWcNbzQ^J4O~!)`CPUby|2sc(TFY)r6?&S6&o2nmx*P~?31j4GpUMU
zVvX+V1sZ!aS1wA?Qnr$z(c~1OO_nOQ|C~-fp+~Vg7~}L!sDmT%N~8Lxc<m4ITGQ7O
zZ?(l+^@m4(q47l*K<@J+arBk9>1~Zow8th|Vx%obEI#taf4MPd`NQ;kwcMNQu}<L9
z-s<k^&RS!w{-Emtqcioz4)VQ7ZY95;Yku3DZ=tC+nzGPTCv<gx?uWTn=w>@~vz|Ei
zk9L8Zi+1?np0F$I1RKGZ!45C%`F4FfLPK~d^r8@2W4GI5w_D<5Tb#7`$>Y&`78*G{
z!V2AJt~Xa(Xu6H2Ei`?M_!skA^P3CX3-txYNo*xHliSI9vO{+sZ9UpdY$xi8H~!F%
zU;dPMea9M^X^qUZ>FA$r`)4gQdqRr@A|KgYPR$w{gNAXssMlJw189-+PQ#E(l<riQ
zu&YNtWy3ff-tjY<E|*n&mt3bRdx?!TI&|F-!VZX9|Mqpj6>IqGfMDJEb<tILw+sG0
HILE&StJiYN

literal 0
HcmV?d00001

diff --git a/Project/Service/func/__pycache__/search.cpython-311.pyc b/Project/Service/func/__pycache__/search.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c70dc8f6aa17b5ba97d3e77073025e1170b63f49
GIT binary patch
literal 3023
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
R{jCR547lLN4(|s;{sLPd(kB1_

literal 0
HcmV?d00001

diff --git a/Project/Service/func/__pycache__/signup.cpython-311.pyc b/Project/Service/func/__pycache__/signup.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..21d043673813eec5344cf5a6709506ba65a678c0
GIT binary patch
literal 3573
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
bHv^3G%98<>dF9Dzdk6y6<ncXx9@+aZG=O`M

literal 0
HcmV?d00001

diff --git a/Project/Service/func/__pycache__/utils.cpython-311.pyc b/Project/Service/func/__pycache__/utils.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..74669611454e280d45bc0a91634a1aec8c0601e5
GIT binary patch
literal 2072
zcmb7EQEMAV5Z=8zNr#j>H+Gxi5@IDZ6{f^;Nr?U6x;1tTaTPV#p$`s0$ag2_?2}I2
zJ5$TZa4`Zq#x&_eu^$=`rPvP6ALzf3iXh@35a?6hRNO-GQ)lih*;faej#jg?v$JzM
zGvDl<Bt;3(-mi<f&pASV$3>f9?a|>dOxr{yDm6%+&QeNLPUQ`5mV;R^_`EPHc)E}g
z%7<seAcretHlp$~q(Ab8!ts9Ua_Zb0^p^%Xd{-}&^a4ubOUyEvf;(*rfxyH6a2JlQ
z^V`Hm7ss^Fk=2M!Y@w|u<QMuqT_t5w#j|I~KBZacoLazdd4%6O==ffxWm*ll_fF3$
z4O(L06#~|g(^hSH7lecMf=rO$dX<B7VrTo55VWHh)jQeQJtt0rJ~sIcK1Wr)B9^(c
z_pm=WIah|FR>+IcE&$-54Fa;tVNu_9w#-49#q`RRnOmt_<M-kdw`cC%PJ=M6+okyA
z^w)RdV>&CE%(j$Hg5h&m1ibFyC1BfR9)f%j#l)+m7c@Toz-`6AJ#_{2_MANDTy9{{
z<(c`Ng?Ed`kG@JiH1k?=QCrXp^SNvxIc}<&s<Y%>rWX{wXlPc(%w;CBc6KgnX_=Xl
zWovoZH5W9+PUe;hN^;584QrrSI*N`Mx@9Y7zBsyaX<oB4if-$gH85hBO4hJOL1^z|
z=U5kkIiw~H`C~`fP@aCWwb)S{Vi<w25hq^QIS_uN$AMqNz#nr}(4D37zc5!loyLwi
zHfXSBIS$e{0O{k7=rtE6H;N$@z2<WxOe-2$MeFC;IdH-xU@k3M*go;N!(>!;0sF5+
zprJJd>~Dv(2rq|E*z0p$EuKWBjqDR+)7ZIQm-`xW-%C01o1EC^_owUfU_&0PiJ!Ij
zz&Z9FxC^8Wi|wVY8-#7Zib_vVf+40EnlP*iz=bYbn54KD#gRB-Wb<=sc68<9+iU9Y
zqH7BsIAs6w{@9C;9pYUC{PBxgDR7_vg<gi%-qlzPzu_bI-7}1Vcc7N2NjP?T0BV=F
za{daqcU3?Bm>VgU@+IqA!;L6rp#V5%SXMWzc+V|pz1ec36S`viZ?GHDmNjL`)?6{C
z*~-JLVYng1FfEPYE9r*eowhZ#UvLHV$*^s~q1PYm0^Sg#jK||&dV%>^JKj#fP8dyI
z0t1-5igj;&QH#Z4Je&4sXQC;ce{z5G{<9B%>TC2~uS+)?(hX;_DMZ)PYw23gP+b^q
z2*WjDxaqZ9^_#uS&zbtwn~keCq2KD#P(vE>?Ne*1N9ju1NjC*?eQIs$QL2)1Qm;h$
zvA88VV=XQKHV>|^dwN?TQ2&7d{u7xq`IkuK_n%Hy<*Hnhl65KBkdp8LFa6apq`WRA
z8d3sOvGdLyA1WfG#4P0Wc`xA%-v>9c?6;hs$FAej3>?>hVPY6&$VUi5zYW{GsV*7X
uDEkz2h-d2ouoh1#ZITPM;Aj%r@qSJ6Q7t%{<Vr0#T7pcwTjVVBqWA|zl*PjU

literal 0
HcmV?d00001

diff --git a/Project/func/__pycache__/verify_user.cpython-311.pyc b/Project/Service/func/__pycache__/verify_user.cpython-311.pyc
similarity index 100%
rename from Project/func/__pycache__/verify_user.cpython-311.pyc
rename to Project/Service/func/__pycache__/verify_user.cpython-311.pyc
diff --git a/Project/Service/func/book.py b/Project/Service/func/book.py
new file mode 100644
index 0000000..ca0adca
--- /dev/null
+++ b/Project/Service/func/book.py
@@ -0,0 +1,92 @@
+from flask import render_template, request, redirect, url_for, g, flash, session
+from .config import db
+import pymysql
+from datetime import datetime
+
+def book():
+    flight_id = request.args.get('flight_id')
+    if request.method == 'GET':
+        if not g.user:
+            return redirect(url_for("login"))
+        conn = pymysql.connect(**db)
+        cursor = conn.cursor(pymysql.cursors.DictCursor)
+        flight_sql = """
+        SELECT f.*, d.Name as Departure_airport_name, a.Name as Arrival_airport_name
+        FROM Flights f
+        JOIN Airports d ON f.Departure_airport = d.ID
+        JOIN Airports a ON f.Arrival_airport = a.ID
+        WHERE f.ID = %s;
+        """
+        cursor.execute(flight_sql, (flight_id,))
+        flight = cursor.fetchone()
+        
+        cursor.close()
+        conn.close()
+        
+        return render_template('book.html', flight=flight, username=g.name)
+
+    if request.method == 'POST':
+        passengers = []
+        passenger_keys = ['card_code', 'name', 'phone_number', 'seat_class']
+        
+        for i in range(len(request.form) // len(passenger_keys)):
+            passenger = {}
+            for key in passenger_keys:
+                passenger[key] = request.form.get(f'passengers[{i}][{key}]')
+            passengers.append(passenger)
+
+        conn = pymysql.connect(**db)
+        cursor = conn.cursor()
+        
+        try:
+            # 插入订单记录
+            insert_order_sql = """
+            INSERT INTO Orders (Order_time, Paid, User_phone_number)
+            VALUES (%s, 0, %s)
+            """
+            cursor.execute(insert_order_sql, (datetime.now(), g.user))
+            order_id = cursor.lastrowid
+            
+            for passenger in passengers:
+                passenger_id = passenger['card_code']
+                name = passenger['name']
+                phone_number = passenger['phone_number']
+                seat_class = passenger['seat_class']
+                
+                price_field = f"{seat_class.replace(' ', '_').lower()}_price"
+                price_sql = f"SELECT {price_field} FROM Flights WHERE ID = %s"
+                cursor.execute(price_sql, (flight_id,))
+                price = cursor.fetchone()[0]
+                
+                insert_passenger_sql = """
+                INSERT INTO Passengers (ID, Name, Phone_number)
+                VALUES (%s, %s, %s)
+                ON DUPLICATE KEY UPDATE Name=VALUES(Name), Phone_number=VALUES(Phone_number);
+                """
+                cursor.execute(insert_passenger_sql, (passenger_id, name, phone_number))
+
+                update_seat_sql = f"""
+                UPDATE Flights
+                SET {seat_class.replace(' ', '_').lower()}_seats_remaining = {seat_class.replace(' ', '_').lower()}_seats_remaining - 1
+                WHERE ID = %s
+                """
+                cursor.execute(update_seat_sql, (flight_id,))
+                
+                insert_ticket_sql = """
+                INSERT INTO Tickets (Price, FlightID, Seat_class, PassengerID, OrderID)
+                VALUES (%s, %s, %s, %s, %s)
+                """
+                cursor.execute(insert_ticket_sql, (price, flight_id, seat_class, passenger_id, order_id))
+            
+            conn.commit()
+            return redirect(url_for('order', order_id=order_id))
+        
+        except Exception as e:
+            conn.rollback()
+            print(e)
+            flash("订票失败", "error")
+            return redirect(url_for('search'))
+        
+        finally:
+            cursor.close()
+            conn.close()
diff --git a/Project/Service/func/cancel_order.py b/Project/Service/func/cancel_order.py
new file mode 100644
index 0000000..5e7fcfd
--- /dev/null
+++ b/Project/Service/func/cancel_order.py
@@ -0,0 +1,51 @@
+from flask import request, redirect, url_for, g
+from .config import db
+import pymysql
+
+def cancel_order():
+    order_id = request.args.get('order_id')
+    if not g.user:
+        return redirect(url_for("login"))
+    conn = pymysql.connect(**db)
+    cursor = conn.cursor(pymysql.cursors.DictCursor)
+
+    # 检查订单是否存在
+    check_order_sql = "SELECT ID FROM Orders WHERE ID = %s"
+    cursor.execute(check_order_sql, (order_id,))
+    order_exists = cursor.fetchone()
+
+    if not order_exists:
+        cursor.close()
+        conn.close()
+        return redirect(url_for("order_list"))
+
+    # 查询订单中所有机票的航班ID和座位级别
+    tickets_sql = "SELECT FlightID, Seat_class FROM Tickets WHERE OrderID = %s"
+    cursor.execute(tickets_sql, (order_id,))
+    tickets = cursor.fetchall()
+
+    # 恢复航班的对应余座数
+    for ticket in tickets:
+        flight_id = ticket['FlightID']
+        seat_class = ticket['Seat_class']
+        seat_column = seat_class.replace(' ', '_').lower() + "_seats_remaining"
+        update_seat_sql = f"""
+        UPDATE Flights
+        SET {seat_column} = {seat_column} + 1
+        WHERE ID = %s
+        """
+        cursor.execute(update_seat_sql, (flight_id,))
+
+    # 删除对应的机票
+    delete_tickets_sql = "DELETE FROM Tickets WHERE OrderID = %s"
+    cursor.execute(delete_tickets_sql, (order_id,))
+
+    # 删除订单
+    delete_order_sql = "DELETE FROM Orders WHERE ID = %s"
+    cursor.execute(delete_order_sql, (order_id,))
+
+    conn.commit()
+    cursor.close()
+    conn.close()
+
+    return redirect(url_for('order_list'))
diff --git a/Project/func/config.py b/Project/Service/func/config.py
similarity index 100%
rename from Project/func/config.py
rename to Project/Service/func/config.py
diff --git a/Project/func/index.py b/Project/Service/func/index.py
similarity index 69%
rename from Project/func/index.py
rename to Project/Service/func/index.py
index 336daa4..7c4dcb7 100644
--- a/Project/func/index.py
+++ b/Project/Service/func/index.py
@@ -1,13 +1,16 @@
 from flask import render_template, request, g, redirect, url_for, session
 from .config import slideshow_images
+from .utils import get_cities
 
 def index():
     if request.method == 'GET':
         if not g.user:
             return redirect(url_for("login"))
-        username = g.name
         images = slideshow_images
-        return render_template('index.html', images=images, username=username)
+        return render_template(
+            'index.html', cities=get_cities(), 
+            images=images, username=g.name
+        )
 
 def logout():
     session.clear()
diff --git a/Project/func/login.py b/Project/Service/func/login.py
similarity index 100%
rename from Project/func/login.py
rename to Project/Service/func/login.py
diff --git a/Project/func/modify.py b/Project/Service/func/modify.py
similarity index 85%
rename from Project/func/modify.py
rename to Project/Service/func/modify.py
index ea628cb..51771b0 100644
--- a/Project/func/modify.py
+++ b/Project/Service/func/modify.py
@@ -1,12 +1,8 @@
-from flask import render_template, request, flash, redirect, url_for, session
+from flask import render_template, request, flash, redirect, url_for, session, g
 from typing import Dict
 from pymysql.cursors import Cursor
-from .get_db import get_db
-
-def get_current_user(cursor: Cursor, phone_number: str):
-    sql = "SELECT Username FROM Users WHERE Phone_number = %s"
-    cursor.execute(sql, (phone_number,))
-    return cursor.fetchone()
+import pymysql
+from .config import db
 
 def verify_user(cursor: Cursor, phone_number: str, password: str) -> str:
     sql = """
@@ -23,7 +19,6 @@ def verify_user(cursor: Cursor, phone_number: str, password: str) -> str:
 class ModifyInfo:
     def __init__(self, form: Dict[str, str], user_phone: str):
         self.phone_number = user_phone
-        print(form)
         modifyType = form['modifyType']
         self.new_password = form.get('encryptedNewPassword', None)
         self.new_phone_number = form.get('mobileNo', None)
@@ -74,20 +69,17 @@ class ModifyInfo:
 
 def modify():
     if request.method == 'GET':
+        if not g.user:
+            return redirect(url_for("login"))
         user_phone = session.get('user_id')
-        db = get_db()
-        cursor = db.cursor()
-        current_user = get_current_user(cursor, user_phone)
-        if not current_user:
-            session.clear()
-            return redirect(url_for('login'))
-        return render_template('modify.html', current_user_phone=user_phone, current_username=current_user[0])
+        return render_template('modify.html', current_user_phone=user_phone, current_username=g.name)
+
 
     if request.method == 'POST':
         user_phone = session.get('user_id')
         password = request.form['encryptedPassword']
-        db = get_db()
-        cursor = db.cursor()
+        conn = pymysql.connect(**db)
+        cursor = conn.cursor(pymysql.cursors.DictCursor)
 
         verify_info = verify_user(cursor, user_phone, password)
         if verify_info == "NO_USER":
@@ -95,7 +87,7 @@ def modify():
             return redirect(url_for('login'))
         elif verify_info == "WRONG_PASSWORD":
             flash("密码错误")
-            db.close()
+            conn.close()
             return redirect(url_for('modify'))
 
         modifyInfo = ModifyInfo(request.form, user_phone)
@@ -105,14 +97,14 @@ def modify():
             cursor.execute(check_sql, (modifyInfo.new_phone_number,))
             if cursor.fetchone()[0] > 0:
                 flash("手机号已存在,请使用其他手机号")
-                db.close()
+                conn.close()
                 return redirect(url_for('modify'))
 
         try:
             cursor.execute(modifyInfo.get_sql(), modifyInfo.get_args())
-            db.commit()
+            conn.commit()
             flash(modifyInfo.get_ok_message())
-            db.close()
+            conn.close()
             if modifyInfo.command in ['modify Phone_Number', 'modify Password', 'delete account']:
                 session.clear()
                 session.pop("user_id", None)
@@ -120,8 +112,8 @@ def modify():
             elif modifyInfo.command == 'modify Username':
                 return redirect(url_for('modify'))
         except Exception as e:
-            db.rollback()
+            conn.rollback()
             print(e)
             flash(modifyInfo.get_fail_message())
-            db.close()
+            conn.close()
             return redirect(url_for('modify'))
diff --git a/Project/Service/func/order.py b/Project/Service/func/order.py
new file mode 100644
index 0000000..25bdd2d
--- /dev/null
+++ b/Project/Service/func/order.py
@@ -0,0 +1,47 @@
+from flask import render_template, request, redirect, url_for, g
+from .config import db
+import pymysql
+
+def order():
+    order_id = request.args.get('order_id')
+    if not g.user:
+        return redirect(url_for("login"))
+
+    conn = pymysql.connect(**db)
+    cursor = conn.cursor(pymysql.cursors.DictCursor)
+
+    # 查询订单信息和航班信息
+    order_sql = """
+    SELECT o.*, f.*, d.Name as Departure_airport_name, a.Name as Arrival_airport_name
+    FROM Orders o
+    JOIN Tickets t ON o.ID = t.OrderID
+    JOIN Flights f ON t.FlightID = f.ID
+    JOIN Airports d ON f.Departure_airport = d.ID
+    JOIN Airports a ON f.Arrival_airport = a.ID
+    WHERE o.ID = %s
+    """
+    cursor.execute(order_sql, (order_id,))
+    order_info = cursor.fetchone()
+
+    # 如果订单信息不存在,返回订单列表页面
+    if not order_info:
+        cursor.close()
+        conn.close()
+        return redirect(url_for("order_list"))
+
+    # 查询乘客信息和票据信息
+    tickets_sql = """
+    SELECT t.*, p.Name, p.Phone_number
+    FROM Tickets t
+    JOIN Passengers p ON t.PassengerID = p.ID
+    WHERE t.OrderID = %s
+    """
+    cursor.execute(tickets_sql, (order_id,))
+    tickets = cursor.fetchall()
+
+    cursor.close()
+    conn.close()
+
+    total_price = sum(ticket['Price'] for ticket in tickets)
+
+    return render_template('order.html', order=order_info, tickets=tickets, total_price=total_price, username=g.name)
diff --git a/Project/Service/func/order_list.py b/Project/Service/func/order_list.py
new file mode 100644
index 0000000..d61f136
--- /dev/null
+++ b/Project/Service/func/order_list.py
@@ -0,0 +1,54 @@
+from flask import render_template, request, redirect, url_for, g
+from .config import db
+import pymysql
+
+def order_list():
+    if not g.user:
+        return redirect(url_for("login"))
+
+    conn = pymysql.connect(**db)
+    cursor = conn.cursor(pymysql.cursors.DictCursor)
+
+    # 查询用户关联的所有订单信息
+    orders_sql = """
+    SELECT o.ID as OrderID, o.Order_time, o.Paid, f.ID as FlightID, f.Airline, 
+           d.Name as Departure_airport_name, a.Name as Arrival_airport_name, 
+           f.Departure_time, f.Status, p.Name as PassengerName, t.Price
+    FROM Orders o
+    JOIN Tickets t ON o.ID = t.OrderID
+    JOIN Flights f ON t.FlightID = f.ID
+    JOIN Airports d ON f.Departure_airport = d.ID
+    JOIN Airports a ON f.Arrival_airport = a.ID
+    JOIN Passengers p ON t.PassengerID = p.ID
+    WHERE o.User_phone_number = %s
+    """
+    cursor.execute(orders_sql, (g.user,))
+    orders = cursor.fetchall()
+
+    cursor.close()
+    conn.close()
+
+    # 整理订单信息
+    order_dict = {}
+    for order in orders:
+        order_id = order['OrderID']
+        if order_id not in order_dict:
+            order_dict[order_id] = {
+                'OrderID': order_id,
+                'Order_time': order['Order_time'],
+                'Paid': order['Paid'],
+                'FlightID': order['FlightID'],
+                'Airline': order['Airline'],
+                'Departure_airport_name': order['Departure_airport_name'],
+                'Arrival_airport_name': order['Arrival_airport_name'],
+                'Departure_time': order['Departure_time'],
+                'Status': order['Status'],
+                'Passengers': [],
+                'TotalPrice': 0
+            }
+        order_dict[order_id]['Passengers'].append(order['PassengerName'])
+        order_dict[order_id]['TotalPrice'] += order['Price']
+
+    order_list = list(order_dict.values())
+
+    return render_template('order_list.html', orders=order_list, username=g.name)
diff --git a/Project/Service/func/pay_confirm.py b/Project/Service/func/pay_confirm.py
new file mode 100644
index 0000000..f849d80
--- /dev/null
+++ b/Project/Service/func/pay_confirm.py
@@ -0,0 +1,30 @@
+from flask import redirect, url_for, g, request
+from .config import db
+import pymysql
+
+def pay_confirm():
+    order_id = request.args.get('order_id')
+    if not g.user:
+        return redirect(url_for("login"))
+
+    conn = pymysql.connect(**db)
+    cursor = conn.cursor()
+
+    # 检查订单是否存在
+    check_order_sql = "SELECT ID FROM Orders WHERE ID = %s"
+    cursor.execute(check_order_sql, (order_id,))
+    order_exists = cursor.fetchone()
+
+    if not order_exists:
+        cursor.close()
+        conn.close()
+        return redirect(url_for("order_list"))
+
+    update_order_sql = "UPDATE Orders SET Paid = 1 WHERE ID = %s"
+    cursor.execute(update_order_sql, (order_id,))
+
+    conn.commit()
+    cursor.close()
+    conn.close()
+
+    return redirect(url_for('order_list', order_id=order_id))
\ No newline at end of file
diff --git a/Project/Service/func/search.py b/Project/Service/func/search.py
new file mode 100644
index 0000000..ab35941
--- /dev/null
+++ b/Project/Service/func/search.py
@@ -0,0 +1,49 @@
+from flask import render_template, request, g, abort, redirect, url_for
+from .config import db
+from .utils import get_cities
+import pymysql
+import datetime
+
+
+def search():
+    if not g.user:
+        return redirect(url_for("login"))
+    departure_city = request.args.get('departure')
+    destination_city = request.args.get('destination')
+    departure_date = request.args.get('departure-date')
+    passengers = int(request.args.get('passengers', 1))
+
+    # Date validation
+    try:
+        departure_date_obj = datetime.datetime.strptime(departure_date, '%Y-%m-%d').date()
+        if departure_date_obj < datetime.date.today():
+            abort(400, description="Departure date cannot be in the past.")
+    except ValueError:
+        abort(400, description="Invalid date format.")
+
+    conn = pymysql.connect(**db)
+    cursor = conn.cursor(pymysql.cursors.DictCursor)
+    
+    search_sql = """
+    SELECT f.*, d.Name as Departure_airport_name, a.Name as Arrival_airport_name
+    FROM Flights f
+    JOIN Airports d ON f.Departure_airport = d.ID
+    JOIN Airports a ON f.Arrival_airport = a.ID
+    WHERE d.City = %s AND a.City = %s 
+    AND DATE(f.Departure_time) = %s 
+    AND (f.First_class_seats_remaining + f.Business_class_seats_remaining + f.Economy_class_seats_remaining) >= %s
+    AND f.Status NOT IN ('已起飞', '已降落');
+    """
+    
+    cursor.execute(search_sql, (departure_city, destination_city, departure_date, passengers))
+    flights = cursor.fetchall()
+    
+    cursor.close()
+    conn.close()
+    
+    return render_template(
+        'search.html', 
+        cities=get_cities(), 
+        flights=flights, 
+        username=g.name
+    )
diff --git a/Project/func/signup.py b/Project/Service/func/signup.py
similarity index 88%
rename from Project/func/signup.py
rename to Project/Service/func/signup.py
index 5cd61bb..7097c95 100644
--- a/Project/func/signup.py
+++ b/Project/Service/func/signup.py
@@ -1,6 +1,7 @@
 from flask import render_template, request, redirect, url_for
-from .get_db import get_db
+from .config import db
 import re
+import pymysql
 
 def signup():
     error_messages = {
@@ -34,8 +35,8 @@ def signup():
         if any(error_messages.values()):
             return render_template('signup.html', errors=error_messages)
 
-        db = get_db()
-        cursor = db.cursor()
+        conn = pymysql.connect(**db)
+        cursor = conn.cursor(pymysql.cursors.DictCursor)
 
         # 检查已有用户
         sql = """
@@ -44,7 +45,7 @@ def signup():
         """
         try:
             cursor.execute(sql, (phone_number,))
-            phone_exist = cursor.fetchall()[0][0]
+            phone_exist = cursor.fetchall()[0]['COUNT(*)']
         except Exception as e:
             error_messages['mobileNo'] = "数据库异常,查询失败"
             print(e)
@@ -52,7 +53,7 @@ def signup():
         
         if phone_exist != 0:
             error_messages['mobileNo'] = "该手机号已注册,请勿重复注册"
-            db.close()
+            conn.close()
             return render_template('signup.html', errors=error_messages)
 
         # 插入
@@ -62,12 +63,12 @@ def signup():
         '''
         try:
             cursor.execute(sql, (phone_number, username, password))
-            db.commit()
+            conn.commit()
             return redirect(url_for('index'))
         except Exception as e:
-            db.rollback()
+            conn.rollback()
             print(e)
             error_messages['mobileNo'] = "数据库异常,注册失败"
             return render_template('signup.html', errors=error_messages)
         finally:
-            db.close()
+            conn.close()
diff --git a/Project/Service/func/utils.py b/Project/Service/func/utils.py
new file mode 100644
index 0000000..cc663ff
--- /dev/null
+++ b/Project/Service/func/utils.py
@@ -0,0 +1,20 @@
+from .config import db
+import pymysql
+from xpinyin import Pinyin
+from pymysql.cursors import Cursor
+
+def get_cities():
+    conn = pymysql.connect(**db)
+    cursor = conn.cursor(pymysql.cursors.DictCursor)
+    cursor.execute("SELECT DISTINCT City FROM Airports")
+    cities = [row['City'] for row in cursor.fetchall()]
+    cursor.close()
+    conn.close()
+    p = Pinyin()
+    cities = [
+        (row, p.get_pinyin(row).replace("-", ""))
+        for row in cities
+    ]
+    cities = sorted(cities, key=lambda x: x[1])
+    cities = [row[0] for row in cities]
+    return cities
\ No newline at end of file
diff --git a/Project/main.py b/Project/Service/main.py
similarity index 63%
rename from Project/main.py
rename to Project/Service/main.py
index 9da23de..bdfbe76 100644
--- a/Project/main.py
+++ b/Project/Service/main.py
@@ -1,13 +1,19 @@
-from flask import Flask, redirect, url_for, session, render_template, request, g
+from flask import Flask, redirect, url_for, session, g
 from flask_httpauth import HTTPTokenAuth
 from flask_cors import CORS
-from func.config import db, SECRET_KEY, slideshow_images
+from func.config import db, SECRET_KEY
 import pymysql
 
 import func.login
 import func.signup
 import func.modify
 import func.index
+import func.search
+import func.book
+import func.pay_confirm
+import func.cancel_order
+import func.order
+import func.order_list
 
 app = Flask(__name__)
 app.config["SECRET_KEY"] = SECRET_KEY
@@ -26,14 +32,14 @@ def before_request():
         conn = pymysql.connect(**db)
         cursor = conn.cursor(pymysql.cursors.DictCursor)
         args = (session.get('user_id'),)
-        verify_sql = "SELECT Phone_number, Username FROM Users WHERE Phone_number = %s;"
+        verify_sql = "SELECT Username FROM Users WHERE Phone_number = %s;"
         cursor.execute(verify_sql, args)
         res = cursor.fetchone()
         if not res:
             g.user = None
             g.name = None
         else:
-            g.user = res['Phone_number']
+            g.user = session.get('user_id')
             g.name = res['Username']
 
 @app.route("/")
@@ -58,23 +64,35 @@ def signup():
 
 @app.route("/modify", methods=['GET', 'POST'])
 def modify():
-    if request.method == 'GET':
-        if not g.user:
-            return redirect(url_for("login"))
     return func.modify.modify()
 
 @app.route("/search", methods=['GET'])
 def search():
-    # 处理搜索逻辑
-    return "搜索结果"
+    return func.search.search()
 
-@app.route("/orders", methods=['GET', 'POST'])
-def orders():
-    return "我的订单"
+@app.route("/book", methods=['GET', 'POST'])
+def book():
+    return func.book.book()
+
+@app.route("/order", methods=['GET'])
+def order():
+    return func.order.order()
+
+@app.route('/cancel_order', methods=['POST'])
+def cancel_order():
+    return func.cancel_order.cancel_order()
+
+@app.route('/pay_confirm', methods=['POST'])
+def pay_confirm():
+    return func.pay_confirm.pay_confirm()
+
+@app.route("/order_list", methods=['GET', 'POST'])
+def order_list():
+    return func.order_list.order_list()
 
 if __name__ == "__main__":
     app.run(
         host="0.0.0.0",
-        port=5000,
+        port=8888,
         debug=True
     )
diff --git a/Project/requirements.txt b/Project/Service/requirements.txt
similarity index 100%
rename from Project/requirements.txt
rename to Project/Service/requirements.txt
diff --git a/Project/run.sh b/Project/Service/run.sh
similarity index 100%
rename from Project/run.sh
rename to Project/Service/run.sh
diff --git a/Project/Service/static/css/book.css b/Project/Service/static/css/book.css
new file mode 100644
index 0000000..8484a7d
--- /dev/null
+++ b/Project/Service/static/css/book.css
@@ -0,0 +1,238 @@
+body {
+    font-family: Arial, sans-serif;
+    margin: 0;
+    padding: 0;
+    display: flex;
+    flex-direction: column;
+    min-height: 100vh;
+}
+
+header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    background-color: rgba(28, 108, 178, 0.9);
+    color: white;
+    padding: 20px;
+    width: 100%;
+    position: fixed;
+    top: 0;
+    z-index: 1000;
+}
+
+.header-content {
+    display: flex;
+    align-items: center;
+    width: 100%;
+    justify-content: space-between;
+}
+
+.logo {
+    font-size: 24px;
+    font-weight: bold;
+    margin-left: 20px;
+}
+
+.nav-buttons {
+    display: flex;
+    gap: 20px;
+}
+
+.nav-buttons a {
+    color: white;
+    text-decoration: none;
+    font-size: 16px;
+    padding: 10px;
+    border-radius: 5px;
+}
+
+.nav-buttons a:hover {
+    background-color: #155a8c;
+}
+
+.user-menu {
+    position: relative;
+    display: flex;
+    align-items: center;
+    margin-right: 20px;
+}
+
+.user-menu span {
+    margin-right: 10px;
+}
+
+.dropdown {
+    position: relative;
+    display: inline-block;
+}
+
+.dropbtn {
+    background-color: rgba(28, 108, 178, 0.9);
+    color: white;
+    border: none;
+    cursor: pointer;
+    font-size: 16px;
+}
+
+.dropdown-content {
+    display: none;
+    position: absolute;
+    background-color: #f9f9f9;
+    min-width: 160px;
+    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
+    z-index: 1;
+    right: 0;  /* 确保下拉菜单靠右对齐 */
+}
+
+.dropdown-content a {
+    color: black;
+    padding: 12px 16px;
+    text-decoration: none;
+    display: block;
+}
+
+.dropdown-content a:hover {
+    background-color: #f1f1f1;
+}
+
+.dropdown:hover .dropdown-content {
+    display: block;
+}
+
+main {
+    flex: 1;
+    width: 80%;
+    margin: 20px auto;
+    padding-top: 80px; /* 给主内容增加顶部填充,以避免被固定导航栏遮挡 */
+}
+
+h2 {
+    text-align: center;
+    color: #1c6cb2;
+}
+
+table {
+    width: 100%;
+    border-collapse: collapse;
+    margin-top: 20px;
+}
+
+table, th, td {
+    border: 1px solid #ccc;
+}
+
+th, td {
+    padding: 10px;
+    text-align: center;
+}
+
+th {
+    background-color: #f2f2f2;
+}
+
+.flight-row {
+    transition: transform 0.3s ease, box-shadow 0.3s ease, border-radius 0.3s ease;
+}
+
+.flight-row:hover {
+    transform: scale(1.02);
+    box-shadow: 0 0 10px rgba(28, 108, 178, 0.5);
+    border-radius: 10px;
+}
+
+.flight-info th, .flight-info td {
+    padding: 10px;
+    border: 1px solid #ccc;
+}
+
+form {
+    background-color: rgba(255, 255, 255, 0.8);
+    padding: 20px;
+    border-radius: 10px;
+    margin-bottom: 20px;
+}
+
+.passenger {
+    margin-bottom: 20px;
+    transition: transform 0.3s ease, box-shadow 0.3s ease, border-radius 0.3s ease;
+}
+
+.passenger:hover {
+    transform: scale(1.02);
+    box-shadow: 0 0 10px rgba(28, 108, 178, 0.5);
+    border-radius: 10px;
+}
+
+.passenger h3 {
+    margin-top: 0;
+}
+
+.delete-btn {
+    background-color: #ff4d4d;
+    color: white;
+    border: none;
+    cursor: pointer;
+    padding: 5px 10px;
+    border-radius: 5px;
+    float: left;
+}
+
+.form-row {
+    display: flex;
+    justify-content: space-between;
+    margin-bottom: 15px;
+}
+
+label {
+    flex: 1;
+    margin-right: 10px;
+    text-align: right;
+    line-height: 32px;
+}
+
+input, select {
+    flex: 2;
+    padding: 8px;
+    font-size: 16px;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+}
+
+.error-message {
+    color: red;
+    font-size: 12px;
+    margin-top: 5px;
+}
+
+.total-price {
+    font-size: 18px;
+    font-weight: bold;
+    margin-top: 20px;
+    margin-bottom: 20px;
+}
+
+.btn {
+    padding: 10px 20px;
+    background-color: #1c6cb2;
+    color: white;
+    border: none;
+    border-radius: 5px;
+    text-decoration: none;
+    display: inline-block;
+    cursor: pointer;
+    margin-top: 10px;
+}
+
+.btn:hover {
+    background-color: #155a8c;
+}
+
+footer {
+    background-color: rgba(28, 108, 178, 0.9);
+    color: white;
+    text-align: center;
+    padding: 10px 0;
+    width: 100%;
+    position: relative;
+    margin-top: auto; /* 将footer推到页面底部 */
+}
diff --git a/Project/static/css/index.css b/Project/Service/static/css/index.css
similarity index 85%
rename from Project/static/css/index.css
rename to Project/Service/static/css/index.css
index 3943054..203de82 100644
--- a/Project/static/css/index.css
+++ b/Project/Service/static/css/index.css
@@ -2,12 +2,9 @@ body {
     font-family: Arial, sans-serif;
     margin: 0;
     padding: 0;
-    background-color: #ffffff;
-    height: 100vh;
     display: flex;
     flex-direction: column;
-    align-items: center;
-    overflow-x: hidden;  /* 防止出现水平滚动条 */
+    min-height: 100vh;
 }
 
 header {
@@ -18,6 +15,9 @@ header {
     color: white;
     padding: 20px;
     width: 100%;
+    position: fixed;
+    top: 0;
+    z-index: 1000;
 }
 
 .header-content {
@@ -99,10 +99,17 @@ header {
     display: block;
 }
 
+main {
+    flex: 1;
+    width: 100%;
+    margin: 20px auto;
+    padding-top: 80px; /* 给主内容增加顶部填充,以避免被固定导航栏遮挡 */
+}
+
 .slides {
     position: relative;
     width: 100%;
-    height: 400px;
+    height: 620px;
     overflow: hidden;
 }
 
@@ -134,7 +141,7 @@ header {
     text-align: center;
     width: 80%;
     max-width: 800px;
-    margin: -50px auto 20px;
+    margin: -170px auto 20px;
     position: relative;
 }
 
@@ -145,12 +152,12 @@ header {
 
 .form-row {
     display: flex;
-    justify-content: space-between;
+    justify-content: flex-start; /* Left-align the form items */
     margin-bottom: 15px;
 }
 
 .form-row label {
-    flex: 1;
+    flex: 0 0 120px; /* Fixed width for labels */
     margin-right: 10px;
     text-align: right;
     line-height: 32px;
@@ -158,13 +165,17 @@ header {
 
 .form-row input,
 .form-row select {
-    flex: 2;
+    flex: 1;
     padding: 8px;
     font-size: 16px;
     border: 1px solid #ccc;
     border-radius: 5px;
 }
 
+.form-row.form-row-center {
+    justify-content: center; /* Center-align the button */
+}
+
 .passenger-input {
     display: flex;
     align-items: center;
@@ -208,18 +219,19 @@ header {
     background-color: #155a8c;
 }
 
+.error-message {
+    color: red;
+    font-size: 12px;
+    margin-top: 5px;
+    text-align: left;
+}
+
 footer {
     background-color: rgba(28, 108, 178, 0.9);
     color: white;
     text-align: center;
     padding: 10px 0;
     width: 100%;
-    margin-top: auto;
-}
-
-.error-message {
-    color: red;
-    font-size: 12px;
-    text-align: left;
-    margin-top: 5px;
+    position: relative;
+    margin-top: auto; /* 将footer推到页面底部 */
 }
diff --git a/Project/static/css/login.css b/Project/Service/static/css/login.css
similarity index 100%
rename from Project/static/css/login.css
rename to Project/Service/static/css/login.css
diff --git a/Project/static/css/modify.css b/Project/Service/static/css/modify.css
similarity index 86%
rename from Project/static/css/modify.css
rename to Project/Service/static/css/modify.css
index 8f0fb54..0a30df4 100644
--- a/Project/static/css/modify.css
+++ b/Project/Service/static/css/modify.css
@@ -2,18 +2,22 @@ body {
     font-family: Arial, sans-serif;
     margin: 0;
     padding: 0;
-    background-color: #ffffff;
-    height: 100vh;
     display: flex;
     flex-direction: column;
-    align-items: center;
+    min-height: 100vh;
 }
 
 header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
     background-color: rgba(28, 108, 178, 0.9);
     color: white;
-    padding: 20px 0;
+    padding: 20px;
     width: 100%;
+    position: fixed;
+    top: 0;
+    z-index: 1000;
 }
 
 .header-content {
@@ -50,11 +54,9 @@ header {
 
 main {
     flex: 1;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    width: 100%;
-    position: relative;
+    width: 80%;
+    margin: 20px auto;
+    padding-top: 80px; /* 给主内容增加顶部填充,以避免被固定导航栏遮挡 */
 }
 
 .content {
@@ -64,6 +66,7 @@ main {
     text-align: center;
     width: 400px;
     position: relative;
+    margin: auto;
 }
 
 h2 {
@@ -141,4 +144,6 @@ footer {
     text-align: center;
     padding: 10px 0;
     width: 100%;
+    position: relative;
+    margin-top: auto; /* 将footer推到页面底部 */
 }
diff --git a/Project/Service/static/css/order.css b/Project/Service/static/css/order.css
new file mode 100644
index 0000000..9f06280
--- /dev/null
+++ b/Project/Service/static/css/order.css
@@ -0,0 +1,191 @@
+body {
+    font-family: Arial, sans-serif;
+    margin: 0;
+    padding: 0;
+    display: flex;
+    flex-direction: column;
+    min-height: 100vh;
+}
+
+header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    background-color: rgba(28, 108, 178, 0.9);
+    color: white;
+    padding: 20px;
+    width: 100%;
+    position: fixed;
+    top: 0;
+    z-index: 1000;
+}
+
+.header-content {
+    display: flex;
+    align-items: center;
+    width: 100%;
+    justify-content: space-between;
+}
+
+.logo {
+    font-size: 24px;
+    font-weight: bold;
+    margin-left: 20px;
+}
+
+.nav-buttons {
+    display: flex;
+    gap: 20px;
+}
+
+.nav-buttons a {
+    color: white;
+    text-decoration: none;
+    font-size: 16px;
+    padding: 10px;
+    border-radius: 5px;
+}
+
+.nav-buttons a:hover {
+    background-color: #155a8c;
+}
+
+.user-menu {
+    position: relative;
+    display: flex;
+    align-items: center;
+    margin-right: 20px;
+}
+
+.user-menu span {
+    margin-right: 10px;
+}
+
+.dropdown {
+    position: relative;
+    display: inline-block;
+}
+
+.dropbtn {
+    background-color: rgba(28, 108, 178, 0.9);
+    color: white;
+    border: none;
+    cursor: pointer;
+    font-size: 16px;
+}
+
+.dropdown-content {
+    display: none;
+    position: absolute;
+    background-color: #f9f9f9;
+    min-width: 160px;
+    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
+    z-index: 1;
+    right: 0;
+}
+
+.dropdown-content a {
+    color: black;
+    padding: 12px 16px;
+    text-decoration: none;
+    display: block;
+}
+
+.dropdown-content a:hover {
+    background-color: #f1f1f1;
+}
+
+.dropdown:hover .dropdown-content {
+    display: block;
+}
+
+main {
+    flex: 1;
+    width: 80%;
+    margin: 20px auto;
+    padding-top: 80px; /* 给主内容增加顶部填充,以避免被固定导航栏遮挡 */
+}
+
+h2 {
+    text-align: center;
+    color: #1c6cb2;
+}
+
+.order-info, .passenger-info, .order-summary {
+    background-color: rgba(255, 255, 255, 0.8);
+    padding: 20px;
+    border-radius: 10px;
+    margin-bottom: 20px;
+}
+
+.order-info p, .order-summary p {
+    margin: 5px 0;
+}
+
+table {
+    width: 100%;
+    border-collapse: collapse;
+}
+
+table, th, td {
+    border: 1px solid #ccc;
+}
+
+th, td {
+    padding: 10px;
+    text-align: center;
+}
+
+th {
+    background-color: #f2f2f2;
+}
+
+.btn {
+    padding: 10px 20px;
+    background-color: #1c6cb2;
+    color: white;
+    border: none;
+    border-radius: 5px;
+    text-decoration: none;
+    display: inline-block;
+    cursor: pointer;
+    margin-top: 10px;
+}
+
+.btn:hover {
+    background-color: #155a8c;
+}
+
+.cancel-btn {
+    background-color: #ff4d4d;
+}
+
+.cancel-btn:hover {
+    background-color: #cc0000;
+}
+
+.back-btn {
+    background-color: #f2f2f2;
+    color: black;
+    border: none;
+    border-radius: 5px;
+    padding: 10px 20px;
+    cursor: pointer;
+    text-decoration: none;
+    display: inline-block;
+    margin: 10px 0;
+}
+
+.back-btn:hover {
+    background-color: #d9d9d9;
+}
+
+footer {
+    background-color: rgba(28, 108, 178, 0.9);
+    color: white;
+    text-align: center;
+    padding: 10px 0;
+    width: 100%;
+    position: relative;
+    margin-top: auto; /* 将footer推到页面底部 */
+}
\ No newline at end of file
diff --git a/Project/Service/static/css/order_list.css b/Project/Service/static/css/order_list.css
new file mode 100644
index 0000000..5844d27
--- /dev/null
+++ b/Project/Service/static/css/order_list.css
@@ -0,0 +1,151 @@
+body {
+    font-family: Arial, sans-serif;
+    margin: 0;
+    padding: 0;
+    display: flex;
+    flex-direction: column;
+    min-height: 100vh;
+}
+
+header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    background-color: rgba(28, 108, 178, 0.9);
+    color: white;
+    padding: 20px;
+    width: 100%;
+    position: fixed;
+    top: 0;
+    z-index: 1000;
+}
+
+.header-content {
+    display: flex;
+    align-items: center;
+    width: 100%;
+    justify-content: space-between;
+}
+
+.logo {
+    font-size: 24px;
+    font-weight: bold;
+    margin-left: 20px;
+}
+
+.nav-buttons {
+    display: flex;
+    gap: 20px;
+}
+
+.nav-buttons a {
+    color: white;
+    text-decoration: none;
+    font-size: 16px;
+    padding: 10px;
+    border-radius: 5px;
+}
+
+.nav-buttons a:hover {
+    background-color: #155a8c;
+}
+
+.user-menu {
+    position: relative;
+    display: flex;
+    align-items: center;
+    margin-right: 20px;
+}
+
+.user-menu span {
+    margin-right: 10px;
+}
+
+.dropdown {
+    position: relative;
+    display: inline-block;
+}
+
+.dropbtn {
+    background-color: rgba(28, 108, 178, 0.9);
+    color: white;
+    border: none;
+    cursor: pointer;
+    font-size: 16px;
+}
+
+.dropdown-content {
+    display: none;
+    position: absolute;
+    background-color: #f9f9f9;
+    min-width: 160px;
+    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
+    z-index: 1;
+    right: 0;
+}
+
+.dropdown-content a {
+    color: black;
+    padding: 12px 16px;
+    text-decoration: none;
+    display: block;
+}
+
+.dropdown-content a:hover {
+    background-color: #f1f1f1;
+}
+
+.dropdown:hover .dropdown-content {
+    display: block;
+}
+
+main {
+    flex: 1;
+    width: 80%;
+    margin: 20px auto;
+    padding-top: 80px; /* 给主内容增加顶部填充,以避免被固定导航栏遮挡 */
+}
+
+h2 {
+    text-align: center;
+    color: #1c6cb2;
+}
+
+table {
+    width: 100%;
+    border-collapse: collapse;
+    margin-top: 20px;
+}
+
+table, th, td {
+    border: 1px solid #ccc;
+}
+
+th, td {
+    padding: 10px;
+    text-align: center;
+}
+
+th {
+    background-color: #f2f2f2;
+}
+
+footer {
+    background-color: rgba(28, 108, 178, 0.9);
+    color: white;
+    text-align: center;
+    padding: 10px 0;
+    width: 100%;
+    position: relative;
+    margin-top: auto; /* 将footer推到页面底部 */
+}
+
+.order-row {
+    transition: transform 0.3s ease, box-shadow 0.3s ease, border-radius 0.3s ease;
+}
+
+.order-row:hover {
+    transform: scale(1.02);
+    box-shadow: 0 0 10px rgba(28, 108, 178, 0.5);
+    border-radius: 10px;
+}
\ No newline at end of file
diff --git a/Project/Service/static/css/search.css b/Project/Service/static/css/search.css
new file mode 100644
index 0000000..e2c6cdd
--- /dev/null
+++ b/Project/Service/static/css/search.css
@@ -0,0 +1,251 @@
+body {
+    font-family: Arial, sans-serif;
+    margin: 0;
+    padding: 0;
+    display: flex;
+    flex-direction: column;
+    min-height: 100vh;
+}
+
+header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    background-color: rgba(28, 108, 178, 0.9);
+    color: white;
+    padding: 20px;
+    width: 100%;
+    position: fixed;
+    top: 0;
+    z-index: 1000;
+}
+
+.header-content {
+    display: flex;
+    align-items: center;
+    width: 100%;
+    justify-content: space-between;
+}
+
+.logo {
+    font-size: 24px;
+    font-weight: bold;
+    margin-left: 20px;
+}
+
+.nav-buttons {
+    display: flex;
+    gap: 20px;
+}
+
+.nav-buttons a {
+    color: white;
+    text-decoration: none;
+    font-size: 16px;
+    padding: 10px;
+    border-radius: 5px;
+}
+
+.nav-buttons a:hover {
+    background-color: #155a8c;
+}
+
+.user-menu {
+    position: relative;
+    display: flex;
+    align-items: center;
+    margin-right: 20px;
+}
+
+.user-menu span {
+    margin-right: 10px;
+}
+
+.dropdown {
+    position: relative;
+    display: inline-block;
+}
+
+.dropbtn {
+    background-color: rgba(28, 108, 178, 0.9);
+    color: white;
+    border: none;
+    cursor: pointer;
+    font-size: 16px;
+}
+
+.dropdown-content {
+    display: none;
+    position: absolute;
+    background-color: #f9f9f9;
+    min-width: 160px;
+    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
+    z-index: 1;
+    right: 0;  /* 确保下拉菜单靠右对齐 */
+}
+
+.dropdown-content a {
+    color: black;
+    padding: 12px 16px;
+    text-decoration: none;
+    display: block;
+}
+
+.dropdown-content a:hover {
+    background-color: #f1f1f1;
+}
+
+.dropdown:hover .dropdown-content {
+    display: block;
+}
+
+main {
+    flex: 1;
+    width: 80%;
+    margin: 20px auto;
+    padding-top: 80px; /* 给主内容增加顶部填充,以避免被固定导航栏遮挡 */
+}
+
+h2 {
+    text-align: center;
+    color: #1c6cb2;
+}
+
+table {
+    width: 100%;
+    border-collapse: collapse;
+    margin-top: 20px;
+}
+
+table, th, td {
+    border: 1px solid #ccc;
+}
+
+th, td {
+    padding: 10px;
+    text-align: center;
+}
+
+th {
+    background-color: #f2f2f2;
+}
+
+.no-results {
+    text-align: center;
+    color: red;
+    font-size: 18px;
+    margin-top: 20px;
+}
+
+footer {
+    background-color: rgba(28, 108, 178, 0.9);
+    color: white;
+    text-align: center;
+    padding: 10px 0;
+    width: 100%;
+    position: relative;
+    margin-top: auto; /* 将footer推到页面底部 */
+}
+
+.content {
+    background-color: rgba(255, 255, 255, 0.8);
+    padding: 20px;
+    border-radius: 10px;
+    text-align: center;
+    width: 80%;
+    max-width: 800px;
+    margin: 20px auto;
+    position: relative;
+}
+
+.tabcontent {
+    display: block;
+    padding: 20px;
+}
+
+.form-row {
+    display: flex;
+    justify-content: flex-start; /* Left-align the form items */
+    margin-bottom: 15px;
+}
+
+.form-row label {
+    flex: 0 0 120px; /* Fixed width for labels */
+    margin-right: 10px;
+    text-align: right;
+    line-height: 32px;
+}
+
+.form-row input,
+.form-row select {
+    flex: 1;
+    padding: 8px;
+    font-size: 16px;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+}
+
+.form-row.form-row-center {
+    justify-content: center; /* Center-align the button */
+}
+
+.passenger-input {
+    display: flex;
+    align-items: center;
+    gap: 5px;
+}
+
+.passenger-input button {
+    padding: 5px 10px;
+    font-size: 18px;
+    background-color: #1c6cb2;
+    color: white;
+    border: none;
+    border-radius: 5px;
+    cursor: pointer;
+}
+
+.passenger-input button:hover {
+    background-color: #155a8c;
+}
+
+.passenger-input input {
+    width: 50px;
+    text-align: center;
+    font-size: 16px;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+}
+
+.btn {
+    padding: 10px 20px;
+    background-color: #1c6cb2;
+    color: white;
+    border: none;
+    border-radius: 5px;
+    text-decoration: none;
+    display: inline-block;
+    cursor: pointer;
+}
+
+.btn:hover {
+    background-color: #155a8c;
+}
+
+.error-message {
+    color: red;
+    font-size: 12px;
+    margin-top: 5px;
+    text-align: left;
+}
+
+/* Add animations for flight rows */
+.flight-row {
+    transition: transform 0.3s ease, box-shadow 0.3s ease, border-radius 0.3s ease;
+}
+
+.flight-row:hover {
+    transform: scale(1.02);
+    box-shadow: 0 0 10px rgba(28, 108, 178, 0.5);
+    border-radius: 10px;
+}
diff --git a/Project/static/css/signup.css b/Project/Service/static/css/signup.css
similarity index 100%
rename from Project/static/css/signup.css
rename to Project/Service/static/css/signup.css
diff --git a/Project/static/js/checkInfo.js b/Project/Service/static/js/checkInfo.js
similarity index 100%
rename from Project/static/js/checkInfo.js
rename to Project/Service/static/js/checkInfo.js
diff --git a/Project/static/js/index.js b/Project/Service/static/js/index.js
similarity index 100%
rename from Project/static/js/index.js
rename to Project/Service/static/js/index.js
diff --git a/Project/static/js/login.js b/Project/Service/static/js/login.js
similarity index 100%
rename from Project/static/js/login.js
rename to Project/Service/static/js/login.js
diff --git a/Project/static/js/modify.js b/Project/Service/static/js/modify.js
similarity index 100%
rename from Project/static/js/modify.js
rename to Project/Service/static/js/modify.js
diff --git a/Project/Service/static/js/search.js b/Project/Service/static/js/search.js
new file mode 100644
index 0000000..10e2492
--- /dev/null
+++ b/Project/Service/static/js/search.js
@@ -0,0 +1,42 @@
+function validateForm() {
+    var departure = document.getElementById('departure').value;
+    var destination = document.getElementById('destination').value;
+    var warning = document.getElementById('destination-warning');
+    if (departure === destination) {
+        warning.textContent = '出发地和目的地不能相同';
+        return false;
+    } else {
+        warning.textContent = '';
+    }
+    return true;
+}
+
+function increment() {
+    var passengers = document.getElementById("passengers");
+    var value = parseInt(passengers.value, 10);
+    if (value < 50) {
+        passengers.value = value + 1;
+    }
+}
+
+function decrement() {
+    var passengers = document.getElementById("passengers");
+    var value = parseInt(passengers.value, 10);
+    if (value > 1) {
+        passengers.value = value - 1;
+    }
+}
+
+document.addEventListener('DOMContentLoaded', function() {
+    // Set default date to tomorrow
+    var departureDate = document.getElementById('departure-date');
+    if (!departureDate.value) {
+        var today = new Date();
+        var tomorrow = new Date(today);
+        tomorrow.setDate(tomorrow.getDate() + 1);
+        var month = ('0' + (tomorrow.getMonth() + 1)).slice(-2);
+        var day = ('0' + tomorrow.getDate()).slice(-2);
+        var year = tomorrow.getFullYear();
+        departureDate.value = `${year}-${month}-${day}`;
+    }
+});
diff --git a/Project/static/js/signup.js b/Project/Service/static/js/signup.js
similarity index 100%
rename from Project/static/js/signup.js
rename to Project/Service/static/js/signup.js
diff --git a/Project/static/js/slideshow.js b/Project/Service/static/js/slideshow.js
similarity index 100%
rename from Project/static/js/slideshow.js
rename to Project/Service/static/js/slideshow.js
diff --git a/Project/Service/templates/book.html b/Project/Service/templates/book.html
new file mode 100644
index 0000000..828ddb9
--- /dev/null
+++ b/Project/Service/templates/book.html
@@ -0,0 +1,281 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>航班预定</title>
+    <link rel="stylesheet" href="{{ url_for('static', filename='css/book.css') }}">
+</head>
+<body>
+    <header>
+        <div class="header-content">
+            <div class="logo">KJF航班订票</div>
+            <div class="nav-buttons">
+                <a href="{{ url_for('index') }}">首页</a>
+                <a href="{{ url_for('order_list') }}">我的订单</a>
+            </div>
+            <div class="user-menu">
+                <span>{{ username }}</span>
+                <div class="dropdown">
+                    <button class="dropbtn">▼</button>
+                    <div class="dropdown-content">
+                        <a href="{{ url_for('modify') }}">修改账户信息</a>
+                        <a href="{{ url_for('logout') }}">退出登录</a>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </header>
+    <main>
+        <h2>预定航班</h2>
+        <div class="flight-info">
+            <table>
+                <thead>
+                    <tr>
+                        <th>航班号</th>
+                        <th>航空公司</th>
+                        <th>出发机场</th>
+                        <th>到达机场</th>
+                        <th>出发时间</th>
+                        <th>到达时间</th>
+                        <th>头等舱剩余座位</th>
+                        <th>商务舱剩余座位</th>
+                        <th>经济舱剩余座位</th>
+                        <th>头等舱价格</th>
+                        <th>商务舱价格</th>
+                        <th>经济舱价格</th>
+                        <th>状态</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    <tr class="flight-row">
+                        <td>{{ flight.ID }}</td>
+                        <td>{{ flight.Airline }}</td>
+                        <td>{{ flight.Departure_airport_name }}</td>
+                        <td>{{ flight.Arrival_airport_name }}</td>
+                        <td>{{ flight.Departure_time }}</td>
+                        <td>{{ flight.Arrival_time }}</td>
+                        <td id="first-class-seats">{{ flight.First_class_seats_remaining }}</td>
+                        <td id="business-class-seats">{{ flight.Business_class_seats_remaining }}</td>
+                        <td id="economy-class-seats">{{ flight.Economy_class_seats_remaining }}</td>
+                        <td id="first-class-price">{{ flight.First_class_price }}</td>
+                        <td id="business-class-price">{{ flight.Business_class_price }}</td>
+                        <td id="economy-class-price">{{ flight.Economy_class_price }}</td>
+                        <td>{{ flight.Status }}</td>
+                    </tr>
+                </tbody>
+            </table>
+        </div>
+        <form id="booking-form" method="post" action="{{ url_for('book', flight_id=flight.ID) }}" onsubmit="return validateBookingForm()">
+            <div id="passenger-list">
+                <div class="passenger" data-index="0">
+                    <h3>乘机人 1</h3>
+                    <button type="button" class="delete-btn" onclick="removePassenger(this)">删除</button>
+                    <div class="form-row">
+                        <label for="card-code-0">身份证号:</label>
+                        <input type="text" id="card-code-0" name="passengers[0][card_code]" oninput="validateCardCode(this)">
+                        <div class="error-message" id="card-code-error-0"></div>
+                    </div>
+                    <div class="form-row">
+                        <label for="name-0">真实姓名:</label>
+                        <input type="text" id="name-0" name="passengers[0][name]">
+                    </div>
+                    <div class="form-row">
+                        <label for="phone-number-0">手机号:</label>
+                        <input type="text" id="phone-number-0" name="passengers[0][phone_number]" oninput="validatePhoneNumber(this)">
+                        <div class="error-message" id="phone-number-error-0"></div>
+                    </div>
+                    <div class="form-row">
+                        <label for="seat-class-0">座位级别:</label>
+                        <select id="seat-class-0" name="passengers[0][seat_class]" onchange="updateSeatCount(this)">
+                            <option value="" disabled selected>请选择座位级别</option>
+                            <option value="First Class">头等舱</option>
+                            <option value="Business Class">商务舱</option>
+                            <option value="Economy Class">经济舱</option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="total-price">
+                总价: <span id="total-price">0</span> 元
+            </div>
+            <button type="button" class="btn" onclick="addPassenger()">添加乘机人</button>
+            <button type="submit" class="btn">预定</button>
+        </form>
+    </main>
+    <footer>
+        <p>&copy; 2024 KJF航班订票. 保留所有权利。</p>
+    </footer>
+    <script>
+        document.addEventListener('DOMContentLoaded', function() {
+            // Initialize seat counts
+            var passengerCount = 1;
+            var firstClassSeats = {{ flight.First_class_seats_remaining }};
+            var businessClassSeats = {{ flight.Business_class_seats_remaining }};
+            var economyClassSeats = {{ flight.Economy_class_seats_remaining }};
+            var firstClassPrice = parseFloat(document.getElementById("first-class-price").textContent);
+            var businessClassPrice = parseFloat(document.getElementById("business-class-price").textContent);
+            var economyClassPrice = parseFloat(document.getElementById("economy-class-price").textContent);
+
+            window.addPassenger = function() {
+                passengerCount++;
+                const passengerList = document.getElementById('passenger-list');
+                const passengerDiv = document.createElement('div');
+                passengerDiv.classList.add('passenger');
+                passengerDiv.setAttribute('data-index', passengerCount - 1);
+
+                const disabledFirstClass = firstClassSeats <= 0 ? 'disabled' : '';
+                const disabledBusinessClass = businessClassSeats <= 0 ? 'disabled' : '';
+                const disabledEconomyClass = economyClassSeats <= 0 ? 'disabled' : '';
+
+                passengerDiv.innerHTML = `
+                    <h3>乘机人 ${passengerCount}</h3>
+                    <button type="button" class="delete-btn" onclick="removePassenger(this)">删除</button>
+                    <div class="form-row">
+                        <label for="card-code-${passengerCount - 1}">身份证号:</label>
+                        <input type="text" id="card-code-${passengerCount - 1}" name="passengers[${passengerCount - 1}][card_code]" oninput="validateCardCode(this)">
+                        <div class="error-message" id="card-code-error-${passengerCount - 1}"></div>
+                    </div>
+                    <div class="form-row">
+                        <label for="name-${passengerCount - 1}">真实姓名:</label>
+                        <input type="text" id="name-${passengerCount - 1}" name="passengers[${passengerCount - 1}][name]">
+                    </div>
+                    <div class="form-row">
+                        <label for="phone-number-${passengerCount - 1}">手机号:</label>
+                        <input type="text" id="phone-number-${passengerCount - 1}" name="passengers[${passengerCount - 1}][phone_number]" oninput="validatePhoneNumber(this)">
+                        <div class="error-message" id="phone-number-error-${passengerCount - 1}"></div>
+                    </div>
+                    <div class="form-row">
+                        <label for="seat-class-${passengerCount - 1}">座位级别:</label>
+                        <select id="seat-class-${passengerCount - 1}" name="passengers[${passengerCount - 1}][seat_class]" onchange="updateSeatCount(this)">
+                            <option value="" disabled selected>请选择座位级别</option>
+                            <option value="First Class" ${disabledFirstClass}>头等舱</option>
+                            <option value="Business Class" ${disabledBusinessClass}>商务舱</option>
+                            <option value="Economy Class" ${disabledEconomyClass}>经济舱</option>
+                        </select>
+                    </div>
+                `;
+
+                passengerList.appendChild(passengerDiv);
+            };
+
+            window.removePassenger = function(button) {
+                const passengerDiv = button.parentElement;
+                const index = passengerDiv.getAttribute('data-index');
+                const seatClassSelect = document.getElementById(`seat-class-${index}`);
+                const seatClass = seatClassSelect.value;
+
+                if (seatClass === 'First Class') firstClassSeats++;
+                else if (seatClass === 'Business Class') businessClassSeats++;
+                else if (seatClass === 'Economy Class') economyClassSeats++;
+
+                passengerDiv.remove();
+                updateSeatDisplay();
+                calculateTotalPrice();
+            };
+
+            window.validateCardCode = function(input) {
+                const regexCardCode = /^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
+                const errorDiv = document.getElementById(`card-code-error-${input.id.split('-')[2]}`);
+                if (!regexCardCode.test(input.value)) {
+                    errorDiv.textContent = '身份证号格式不正确';
+                } else {
+                    errorDiv.textContent = '';
+                }
+            };
+
+            window.validatePhoneNumber = function(input) {
+                const regexMobileNo = /^1[3-9]\d{9}$/;
+                const errorDiv = document.getElementById(`phone-number-error-${input.id.split('-')[2]}`);
+                if (!regexMobileNo.test(input.value)) {
+                    errorDiv.textContent = '手机号格式不正确';
+                } else {
+                    errorDiv.textContent = '';
+                }
+            };
+
+            window.updateSeatCount = function(select) {
+                const index = select.id.split('-')[2];
+                const previousClass = select.getAttribute("data-previous-class");
+                const newClass = select.value;
+
+                if (previousClass) {
+                    if (previousClass === 'First Class') firstClassSeats++;
+                    else if (previousClass === 'Business Class') businessClassSeats++;
+                    else if (previousClass === 'Economy Class') economyClassSeats++;
+                }
+
+                if (newClass === 'First Class') {
+                    if (firstClassSeats <= 0) {
+                        alert("头等舱座位已满");
+                        select.value = "";
+                        return;
+                    }
+                    firstClassSeats--;
+                } else if (newClass === 'Business Class') {
+                    if (businessClassSeats <= 0) {
+                        alert("商务舱座位已满");
+                        select.value = "";
+                        return;
+                    }
+                    businessClassSeats--;
+                } else if (newClass === 'Economy Class') {
+                    if (economyClassSeats <= 0) {
+                        alert("经济舱座位已满");
+                        select.value = "";
+                        return;
+                    }
+                    economyClassSeats--;
+                }
+
+                select.setAttribute("data-previous-class", newClass);
+                updateSeatDisplay();
+                calculateTotalPrice();
+            };
+
+            function updateSeatDisplay() {
+                document.getElementById("first-class-seats").textContent = firstClassSeats;
+                document.getElementById("business-class-seats").textContent = businessClassSeats;
+                document.getElementById("economy-class-seats").textContent = economyClassSeats;
+            }
+
+            function calculateTotalPrice() {
+                let totalPrice = 0;
+                const seatClassSelects = document.querySelectorAll("select[id^='seat-class-']");
+                seatClassSelects.forEach(select => {
+                    if (select.value === 'First Class') totalPrice += firstClassPrice;
+                    else if (select.value === 'Business Class') totalPrice += businessClassPrice;
+                    else if (select.value === 'Economy Class') totalPrice += economyClassPrice;
+                });
+                document.getElementById("total-price").textContent = totalPrice.toFixed(2);
+            }
+
+            window.validateBookingForm = function() {
+                // Validate seat availability
+                if (firstClassSeats < 0 || businessClassSeats < 0 || economyClassSeats < 0) {
+                    alert("预定的座位数不能超过余座数");
+                    return false;
+                }
+
+                // Validate all card codes and phone numbers
+                const cardCodes = document.querySelectorAll("input[id^='card-code-']");
+                const phoneNumbers = document.querySelectorAll("input[id^='phone-number-']");
+                for (let cardCode of cardCodes) {
+                    validateCardCode(cardCode);
+                    if (document.getElementById(`card-code-error-${cardCode.id.split('-')[2]}`).textContent !== '') {
+                        return false;
+                    }
+                }
+                for (let phoneNumber of phoneNumbers) {
+                    validatePhoneNumber(phoneNumber);
+                    if (document.getElementById(`phone-number-error-${phoneNumber.id.split('-')[2]}`).textContent !== '') {
+                        return false;
+                    }
+                }
+
+                return true;
+            };
+        });
+    </script>
+</body>
+</html>
diff --git a/Project/Service/templates/index.html b/Project/Service/templates/index.html
new file mode 100644
index 0000000..e82183d
--- /dev/null
+++ b/Project/Service/templates/index.html
@@ -0,0 +1,146 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>KJF航班订票</title>
+    <link rel="stylesheet" href="{{ url_for('static', filename='css/index.css') }}">
+    <script src="{{ url_for('static', filename='js/index.js') }}" defer></script>
+    <script src="https://cdn.bootcss.com/blueimp-md5/2.12.0/js/md5.min.js"></script>
+</head>
+<body>
+    <header>
+        <div class="header-content">
+            <div class="logo">KJF航班订票</div>
+            <div class="nav-buttons">
+                <a href="{{ url_for('index') }}">首页</a>
+                <a href="{{ url_for('order_list') }}">我的订单</a>
+            </div>
+            <div class="user-menu">
+                <span>{{ username }}</span>
+                <div class="dropdown">
+                    <button class="dropbtn">▼</button>
+                    <div class="dropdown-content">
+                        <a href="{{ url_for('modify') }}">修改账户信息</a>
+                        <a href="{{ url_for('logout') }}">退出登录</a>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </header>
+    <main>
+        <div class="slides">
+            <ul id="slide-container">
+                {% for image in images %}
+                <li>
+                    <a href="{{ image.link }}" target="_blank">
+                        <img src="{{ image.src }}">
+                    </a>
+                </li>
+                {% endfor %}
+            </ul>
+        </div>
+        <div class="content">
+            <div id="ticket" class="tabcontent" style="display: block;">
+                <form action="{{ url_for('search') }}" method="get" class="search-form" onsubmit="return validateForm()">
+                    <div class="form-row">
+                        <label for="departure">出发地:</label>
+                        <select id="departure" name="departure">
+                            {% for city in cities %}
+                                <option value="{{ city }}" {% if city == "北京" %}selected{% endif %}>{{ city }}</option>
+                            {% endfor %}
+                        </select>
+                    </div>
+                    <div class="form-row">
+                        <label for="destination">目的地:</label>
+                        <select id="destination" name="destination">
+                            {% for city in cities %}
+                                <option value="{{ city }}" {% if city == "上海" %}selected{% endif %}>{{ city }}</option>
+                            {% endfor %}
+                        </select>
+                        <div id="destination-warning" class="error-message"></div>
+                    </div>
+                    <div class="form-row">
+                        <label for="departure-date">出发日期:</label>
+                        <input type="date" id="departure-date" name="departure-date" required>
+                        <div id="date-warning" class="error-message"></div>
+                    </div>
+                    <div class="form-row">
+                        <label for="passengers">乘客人数:</label>
+                        <div class="passenger-input">
+                            <button type="button" onclick="decrement()">-</button>
+                            <input type="number" id="passengers" name="passengers" value="1" min="1" max="50">
+                            <button type="button" onclick="increment()">+</button>
+                        </div>
+                    </div>
+                    <div class="form-row form-row-center">
+                        <button type="submit" class="btn">立即查询</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </main>
+    <footer>
+        <p>&copy; 2024 KJF航班订票. 保留所有权利。</p>
+    </footer>
+    <script src="{{ url_for('static', filename='js/slideshow.js') }}"></script>
+    <script>
+        function validateForm() {
+            var departure = document.getElementById('departure').value;
+            var destination = document.getElementById('destination').value;
+            var warning = document.getElementById('destination-warning');
+            var dateWarning = document.getElementById('date-warning');
+            var departureDate = document.getElementById('departure-date').value;
+
+            var today = new Date();
+            var selectedDate = new Date(departureDate);
+            today.setHours(0, 0, 0, 0);  // Ensure time comparison is not affected
+
+            if (departure === destination) {
+                warning.textContent = '出发地和目的地不能相同';
+                return false;
+            } else {
+                warning.textContent = '';
+            }
+
+            if (selectedDate < today) {
+                dateWarning.textContent = '出发日期不能早于今天';
+                return false;
+            } else {
+                dateWarning.textContent = '';
+            }
+
+            return true;
+        }
+
+        function increment() {
+            var passengers = document.getElementById("passengers");
+            var value = parseInt(passengers.value, 10);
+            if (value < 50) {
+                passengers.value = value + 1;
+            }
+        }
+
+        function decrement() {
+            var passengers = document.getElementById("passengers");
+            var value = parseInt(passengers.value, 10);
+            if (value > 1) {
+                passengers.value = value - 1;
+            }
+        }
+
+        document.addEventListener('DOMContentLoaded', function() {
+            // Set default date to tomorrow
+            var departureDate = document.getElementById('departure-date');
+            var today = new Date();
+            var tomorrow = new Date(today);
+            tomorrow.setDate(tomorrow.getDate() + 1);
+            var month = ('0' + (tomorrow.getMonth() + 1)).slice(-2);
+            var day = ('0' + tomorrow.getDate()).slice(-2);
+            var year = tomorrow.getFullYear();
+            departureDate.value = `${year}-${month}-${day}`;
+            departureDate.setAttribute('min', `${year}-${month}-${day}`);
+        });
+    </script>
+</body>
+</html>
diff --git a/Project/templates/login.html b/Project/Service/templates/login.html
similarity index 100%
rename from Project/templates/login.html
rename to Project/Service/templates/login.html
diff --git a/Project/templates/modify.html b/Project/Service/templates/modify.html
similarity index 100%
rename from Project/templates/modify.html
rename to Project/Service/templates/modify.html
diff --git a/Project/Service/templates/order.html b/Project/Service/templates/order.html
new file mode 100644
index 0000000..1fefc46
--- /dev/null
+++ b/Project/Service/templates/order.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>订单详情</title>
+    <link rel="stylesheet" href="{{ url_for('static', filename='css/order.css') }}">
+</head>
+<body>
+    <header>
+        <div class="header-content">
+            <div class="logo">KJF航班订票</div>
+            <div class="nav-buttons">
+                <a href="{{ url_for('index') }}">首页</a>
+                <a href="{{ url_for('order_list') }}">我的订单</a>
+            </div>
+            <div class="user-menu">
+                <span>{{ username }}</span>
+                <div class="dropdown">
+                    <button class="dropbtn">▼</button>
+                    <div class="dropdown-content">
+                        <a href="{{ url_for('modify') }}">修改账户信息</a>
+                        <a href="{{ url_for('logout') }}">退出登录</a>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </header>
+    <main>
+        <button onclick="location.href='{{ url_for('order_list') }}'" class="back-btn">返回订单列表</button>
+        <h2>订单详情</h2>
+        <div class="order-info">
+            <h3>航班信息</h3>
+            <p>航班号: {{ order.FlightID }}</p>
+            <p>航空公司: {{ order.Airline }}</p>
+            <p>出发机场: {{ order.Departure_airport_name }}</p>
+            <p>到达机场: {{ order.Arrival_airport_name }}</p>
+            <p>出发时间: {{ order.Departure_time }}</p>
+            <p>状态: {{ order.Status }}</p>
+        </div>
+        <div class="passenger-info">
+            <h3>乘机人信息</h3>
+            <table>
+                <thead>
+                    <tr>
+                        <th>身份证号</th>
+                        <th>姓名</th>
+                        <th>手机号</th>
+                        <th>座位级别</th>
+                        <th>票价</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    {% for ticket in tickets %}
+                    <tr>
+                        <td>{{ ticket.PassengerID }}</td>
+                        <td>{{ ticket.Name }}</td>
+                        <td>{{ ticket.Phone_number }}</td>
+                        <td>{{ ticket.Seat_class }}</td>
+                        <td>{{ ticket.Price }}</td>
+                    </tr>
+                    {% endfor %}
+                </tbody>
+            </table>
+        </div>
+        <div class="order-summary">
+            <p>订单总价: {{ total_price }}</p>
+            <p>支付状态: {% if order.Paid %}已支付{% else %}未支付{% endif %}</p>
+        </div>
+        <form method="post" action="{{ url_for('cancel_order', order_id=order.ID) }}">
+            <button type="submit" class="btn cancel-btn">取消订单</button>
+        </form>
+        {% if not order.Paid %}
+        <form method="post" action="{{ url_for('pay_confirm', order_id=order.ID) }}">
+            <button type="submit" class="btn pay-btn">支付订单</button>
+        </form>
+        {% endif %}
+    </main>
+    <footer>
+        <p>&copy; 2024 KJF航班订票. 保留所有权利。</p>
+    </footer>
+</body>
+</html>
\ No newline at end of file
diff --git a/Project/Service/templates/order_list.html b/Project/Service/templates/order_list.html
new file mode 100644
index 0000000..9215d25
--- /dev/null
+++ b/Project/Service/templates/order_list.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>我的订单</title>
+    <link rel="stylesheet" href="{{ url_for('static', filename='css/order_list.css') }}">
+</head>
+<body>
+    <header>
+        <div class="header-content">
+            <div class="logo">KJF航班订票</div>
+            <div class="nav-buttons">
+                <a href="{{ url_for('index') }}">首页</a>
+                <a href="{{ url_for('order_list') }}">我的订单</a>
+            </div>
+            <div class="user-menu">
+                <span>{{ username }}</span>
+                <div class="dropdown">
+                    <button class="dropbtn">▼</button>
+                    <div class="dropdown-content">
+                        <a href="{{ url_for('modify') }}">修改账户信息</a>
+                        <a href="{{ url_for('logout') }}">退出登录</a>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </header>
+    <main>
+        <h2>我的订单</h2>
+        <div class="order-list">
+            <table>
+                <thead>
+                    <tr>
+                        <th>航班号</th>
+                        <th>航空公司</th>
+                        <th>出发机场</th>
+                        <th>到达机场</th>
+                        <th>出发时间</th>
+                        <th>状态</th>
+                        <th>乘机人</th>
+                        <th>订单总价</th>
+                        <th>支付状态</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    {% for order in orders %}
+                    <tr class="order-row" onclick="location.href='{{ url_for('order', order_id=order.OrderID) }}'">
+                        <td>{{ order.FlightID }}</td>
+                        <td>{{ order.Airline }}</td>
+                        <td>{{ order.Departure_airport_name }}</td>
+                        <td>{{ order.Arrival_airport_name }}</td>
+                        <td>{{ order.Departure_time }}</td>
+                        <td>{{ order.Status }}</td>
+                        <td>
+                            {% for passenger in order.Passengers %}
+                            {{ passenger }}<br>
+                            {% endfor %}
+                        </td>
+                        <td>{{ order.TotalPrice }}</td>
+                        <td>{% if order.Paid %}已支付{% else %}未支付{% endif %}</td>
+                    </tr>
+                    {% endfor %}
+                </tbody>
+            </table>
+        </div>
+    </main>
+    <footer>
+        <p>&copy; 2024 KJF航班订票. 保留所有权利。</p>
+    </footer>
+</body>
+</html>
diff --git a/Project/Service/templates/search.html b/Project/Service/templates/search.html
new file mode 100644
index 0000000..d847f69
--- /dev/null
+++ b/Project/Service/templates/search.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>航班搜索结果</title>
+    <link rel="stylesheet" href="{{ url_for('static', filename='css/search.css') }}">
+</head>
+<body>
+    <header>
+        <div class="header-content">
+            <div class="logo">KJF航班订票</div>
+            <div class="nav-buttons">
+                <a href="{{ url_for('index') }}">首页</a>
+                <a href="{{ url_for('order_list') }}">我的订单</a>
+            </div>
+            <div class="user-menu">
+                <span>{{ username }}</span>
+                <div class="dropdown">
+                    <button class="dropbtn">▼</button>
+                    <div class="dropdown-content">
+                        <a href="{{ url_for('modify') }}">修改账户信息</a>
+                        <a href="{{ url_for('logout') }}">退出登录</a>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </header>
+    <main>
+        <div class="content">
+            <div id="ticket" class="tabcontent" style="display: block;">
+                <form action="{{ url_for('search') }}" method="get" class="search-form" onsubmit="return validateForm()">
+                    <div class="form-row">
+                        <label for="departure">出发地:</label>
+                        <select id="departure" name="departure">
+                            {% for city in cities %}
+                                <option value="{{ city }}" {% if city == request.args.get('departure') %}selected{% endif %}>{{ city }}</option>
+                            {% endfor %}
+                        </select>
+                    </div>
+                    <div class="form-row">
+                        <label for="destination">目的地:</label>
+                        <select id="destination" name="destination">
+                            {% for city in cities %}
+                                <option value="{{ city }}" {% if city == request.args.get('destination') %}selected{% endif %}>{{ city }}</option>
+                            {% endfor %}
+                        </select>
+                        <div id="destination-warning" class="error-message"></div>
+                    </div>
+                    <div class="form-row">
+                        <label for="departure-date">出发日期:</label>
+                        <input type="date" id="departure-date" name="departure-date" value="{{ request.args.get('departure-date', '') }}" required>
+                        <div id="date-warning" class="error-message"></div>
+                    </div>
+                    <div class="form-row">
+                        <label for="passengers">乘客人数:</label>
+                        <div class="passenger-input">
+                            <button type="button" onclick="decrement()">-</button>
+                            <input type="number" id="passengers" name="passengers" value="{{ request.args.get('passengers', 1) }}" min="1" max="50">
+                            <button type="button" onclick="increment()">+</button>
+                        </div>
+                    </div>
+                    <div class="form-row form-row-center">
+                        <button type="submit" class="btn">立即查询</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+
+        <h2>航班搜索结果</h2>
+        {% if flights %}
+        <table>
+            <thead>
+                <tr>
+                    <th>航班号</th>
+                    <th>航空公司</th>
+                    <th>出发机场</th>
+                    <th>到达机场</th>
+                    <th>出发时间</th>
+                    <th>到达时间</th>
+                    <th>头等舱剩余座位</th>
+                    <th>商务舱剩余座位</th>
+                    <th>经济舱剩余座位</th>
+                    <th>头等舱价格</th>
+                    <th>商务舱价格</th>
+                    <th>经济舱价格</th>
+                    <th>状态</th>
+                </tr>
+            </thead>
+            <tbody>
+                {% for flight in flights %}
+                <tr class="flight-row" onclick="window.location.href='{{ url_for('book', flight_id=flight.ID) }}'">
+                    <td>{{ flight.ID }}</td>
+                    <td>{{ flight.Airline }}</td>
+                    <td>{{ flight.Departure_airport_name }}</td>
+                    <td>{{ flight.Arrival_airport_name }}</td>
+                    <td>{{ flight.Departure_time }}</td>
+                    <td>{{ flight.Arrival_time }}</td>
+                    <td>{{ flight.First_class_seats_remaining }}</td>
+                    <td>{{ flight.Business_class_seats_remaining }}</td>
+                    <td>{{ flight.Economy_class_seats_remaining }}</td>
+                    <td>{{ flight.First_class_price }}</td>
+                    <td>{{ flight.Business_class_price }}</td>
+                    <td>{{ flight.Economy_class_price }}</td>
+                    <td>{{ flight.Status }}</td>
+                </tr>
+                {% endfor %}
+            </tbody>
+        </table>
+        {% else %}
+        <p class="no-results">没有找到符合条件的航班。</p>
+        {% endif %}
+    </main>
+    <footer>
+        <p>&copy; 2024 KJF航班订票. 保留所有权利。</p>
+    </footer>
+    <script src="{{ url_for('static', filename='js/search.js') }}"></script>
+    <script>
+        function validateForm() {
+            var departure = document.getElementById('departure').value;
+            var destination = document.getElementById('destination').value;
+            var warning = document.getElementById('destination-warning');
+            var dateWarning = document.getElementById('date-warning');
+            var departureDate = document.getElementById('departure-date').value;
+
+            var today = new Date();
+            var selectedDate = new Date(departureDate);
+            today.setHours(0, 0, 0, 0);  // Ensure time comparison is not affected
+
+            if (departure === destination) {
+                warning.textContent = '出发地和目的地不能相同';
+                return false;
+            } else {
+                warning.textContent = '';
+            }
+
+            if (selectedDate < today) {
+                dateWarning.textContent = '出发日期不能早于今天';
+                return false;
+            } else {
+                dateWarning.textContent = '';
+            }
+
+            return true;
+        }
+
+        function increment() {
+            var passengers = document.getElementById("passengers");
+            var value = parseInt(passengers.value, 10);
+            if (value < 50) {
+                passengers.value = value + 1;
+            }
+        }
+
+        function decrement() {
+            var passengers = document.getElementById("passengers");
+            var value = parseInt(passengers.value, 10);
+            if (value > 1) {
+                passengers.value = value - 1;
+            }
+        }
+
+        document.addEventListener('DOMContentLoaded', function() {
+            // Set default date to tomorrow
+            var departureDate = document.getElementById('departure-date');
+            if (!departureDate.value) {
+                var today = new Date();
+                var tomorrow = new Date(today);
+                tomorrow.setDate(tomorrow.getDate() + 1);
+                var month = ('0' + (tomorrow.getMonth() + 1)).slice(-2);
+                var day = ('0' + tomorrow.getDate()).slice(-2);
+                var year = tomorrow.getFullYear();
+                departureDate.value = `${year}-${month}-${day}`;
+                departureDate.setAttribute('min', `${year}-${month}-${day}`);
+            }
+        });
+    </script>
+</body>
+</html>
diff --git a/Project/templates/signup.html b/Project/Service/templates/signup.html
similarity index 100%
rename from Project/templates/signup.html
rename to Project/Service/templates/signup.html
diff --git a/Project/func/__pycache__/index.cpython-311.pyc b/Project/func/__pycache__/index.cpython-311.pyc
deleted file mode 100644
index 72d8f8a8282947fc76385a86a87909e801dc352c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1245
zcmb7D%}*0S6rbsSmI8$oE<&&-V6q9&i+VC#{AdiJnBal*(yX0n*|HyXW~*YrVA2CI
z9z1B^V&cJI3?BRw_!C;wL^4TFp13vP#>qDeTOb~cFS~DlZ$5tW=Dpv39U2-yU|*WG
z$}f!2ZyCgvI0q*S0Co{U1iQ$?MeHSt2~R01o?28rt*Ci=QOAfRh~gTaSu_EwO;k)0
z4g3JnSCC~KOEOCrX-0iQSt+Dm-L*q13`U<dC=Ug$3X@UdFj@|U(O_<=5-?$K%DEHx
z$B-Seuo&U4LnvPhUX&cqu2No>#Ib1r6nIY#!R?|Dd~7vI5E;Si(bd>esK#Rm)#Sd&
z_+*%jF+ySL0+Yl(upIQ6u0|{93ZEYD+d|=Rj1k(x;pjy~luf*ezN`Ci`awT~6(}|o
zO)Cf`|KN$x+@R|CuLc~b+{^j3&~vSX(9f<f%m$~-w>@elnY@nBJsPeBgvnY6Rn9V*
z3NxZuu4J<3OrB;XSXyG4AD2bRW=|J$Yk@~|>$K+h)r#%s?gd1)CHI&)e%YzJl$U}^
z>AoG>Pi;<1D;pe|39~^BI+v?7{BrIr)B1+cBE-gkS|-O=!EK|iG2DE;H~!O@Y8g}A
z^vJvCJ%p3<-OR+N{O5doa<(%$+s@2&GIOoLxo&3c!<`+oJ9=YB@202rHh(-kTy3Qb
z?R24&F0{--FNMtOKy(7!s4QJ<eL1{^5s*W_anSBQ-iNt^cn88)SH=GTXrG{chz|NA
zuu_)v+%8MzUox?j0tg%$Q*sC!0s>28CVYfecB##TQV;4EJ^O~(I83sPT%m&$f=0+D
zAQ*&~-v$Q-Ra4ESH_OfC?PUoU-zWEOwbg7#&9>BRH<kIA-^;hhraNQP?bJ*sHPcdO
zBGQ7D5?aNz`FbRWNI;QrE{;FTOfLt1#i^btM|LyHfL)WQpWUf>*9%C)r3-8dCS-*<
m1J_e9#z*K;>wlgjG~K%T^i&-$;~u)?M-+UshyHd^PJaNnX$=$r

diff --git a/Project/func/__pycache__/modify.cpython-311.pyc b/Project/func/__pycache__/modify.cpython-311.pyc
deleted file mode 100644
index 0e4db8113ded86bfed36fb912e5ac1c5911d9798..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 7616
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
PTx1S2uu(PxT|oZ}15yE#

diff --git a/Project/func/__pycache__/signup.cpython-311.pyc b/Project/func/__pycache__/signup.cpython-311.pyc
deleted file mode 100644
index a42224ee2c6b1ac5c686bae8643ae609c10bdf43..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3422
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

diff --git a/Project/func/get_db.py b/Project/func/get_db.py
deleted file mode 100644
index 7101cb3..0000000
--- a/Project/func/get_db.py
+++ /dev/null
@@ -1,7 +0,0 @@
-import pymysql
-
-def get_db():
-    return pymysql.connect(
-        host='localhost', user='kejingfan', 
-        password='KJF2811879', database='TESTDB'
-    )
\ No newline at end of file
diff --git a/Project/init_db.py b/Project/init_db.py
deleted file mode 100644
index 1957f23..0000000
--- a/Project/init_db.py
+++ /dev/null
@@ -1,17 +0,0 @@
-import pymysql
-
-db = pymysql.connect(
-    host='localhost', user='kejingfan', 
-    password='KJF2811879', database='TESTDB'
-)
-
-cursor = db.cursor()
-
-with open('db.sql', 'r') as f:
-    sql_commands = f.read().split(';')
-    for command in sql_commands:
-        if command.strip():  # 确保不执行空命令
-            cursor.execute(command)
-
-db.close()
-