From cfbaf585a73422e1cab7ef1e19cc7415c8502718 Mon Sep 17 00:00:00 2001 From: kejingfan 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 @@
{{ username }} @@ -46,23 +46,24 @@
- + +
@@ -72,7 +73,7 @@
-
+
@@ -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}`); + }); 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 @@ + + + + + + 管理员登录 - KJF航班订票 + + + + + +
+

KJF航班订票

+
+
+
+

管理员登录

+ +
+
+
+

© 2024 KJF航班订票. 保留所有权利。

+
+ + 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@cPDV#FD)2Jr480-gaL@Pr6*#3GS%ExK~63-~1wm0wQWp5EEO4snE68FhBgrPQ^p?O9(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{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!hVH32lXHB)uEh4m_rJ=q=iIht{KKjp$jO z88(<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`jPk`04fMNxeH}bjNgRz@P>+IPeZ#0ub|?o($?+tJYg? zy;}PzqbHTmWS6W5D@TyHb$ev|8IwowGK`k@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*}nYZmuiC1w*_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 zxJaLVc88HCtRrRqjSsL_cE$5IzOmVR@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+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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 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-*nwtlaMbOJawpW%_(v#sY^9(K^yJA~p|?FblkK)!@Zcl)-g`6ez4^YGkDHsPa`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>&{aWXRWxGVCvL z*yD;lH0+7B^={**RsCUA2X{u+?%3Kr-k+Ga-#_?r>)W%h&xdAxWY))KeTeEaF%dLu zooiv@({3rT)K%WV744G4CqQlpM=Sy7#=|rZiUjYGn4AW$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; zClTgX_@cF9kY z60_)whXNWIIC)Lu*#~BSoz4Yj<4Cg~Yk$F+Wq3dthi9xBFqyYgDWE1~Zow8th|Vx%obEI#taf4MPd`NQ;kwcMNQu}@~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(lIqGfMDJEbq7pEZ6 z_1*65>~Ci0W@l#oVKf>-&>q;eSY8Pr^b?(Qn(sPs?Klu`Aqh#0iZrIcXug6^^B4RY zTVOS=z-fU(fI*T^@~c6OFYqqSs(o6h5CR%WoEk2K-7!*#NP#n`5S6$YlnP#@TciR` zKbCb##zi7)OR7j@Cy3?eE3!!(X3pWnSpyS?$FihgxkQ{`1*^rffv+-DnsI#6EcBr{ znG{P3QDie;qIx?m2!tQrYrjJO79t%!j0;qQ+ss{r>(B@hDs#O_%w<4b=^}e)Gl=jV zB!Es|$MvYHPYU+xtGiL@A==bs7_M}gD{PhR*`+H}4|hSEh+gSMcLfiSogPHurM^!> zy_PUYzhgHd!yf8Rga;Y4MJ{}!+zF(!FQS+HC(w%wNqF)LU9U_13L=8H@;>uAv%*!m z`hdstD6-3=7q)lkg8q!eG*x_EUMPvWZV+Ks78G3|^RfW)Bn{Pw?oz_alDo^`Vf_VBRiw5IR4z><>B={tFeE^m znVgAa}Pf@lieor1-g|A0b54bX?!eA9H&8O#yrl$N(pnd%~!E)R84qq{4Oponjlp4nLa&TD6 z!t{Q@v@Bv8uMR8XIn(jO4d(b29qu|BT+}HJZxRea1QhEAC`SxQT*d(^6?#%sEAk}9 z26lo=%i6N}yy^tugLSwiF)fE+Q3acHxjmXrD5sRj!Rt)To61 z0Q=~5iD?yeSZaN$&+!t4-m%NhwoO^o=4?VxOEJ9wobBEGDpF?Am|bvKY9YRZE{EFw zD}v#e7BZ9O98C$g{W(20Z)oz^qPzenUKaJSgN8)^1dKg_6}_Y^sj^u#%Eg>W#97gl zi!;k6{DXj1V*xxcR<7u!vFj(awCn`hB&KzSy59T(60n9^;mG;SI%2rHTm3_qg7skI z);;#Edm8;IyFX>|saAZ~#b?*z$<=tWzSxN0XUFfW9s_5HIe-) z_Cu(Vn6VQxYl){<6Hhl11v^o&_~B+a@d5vSbWPa5D(r6vN z-=?i&&srnTHQ19jd(vW0He-Wt80U;eY{ZU@)E@nj4V|4nJ^gb2Oum+Hvi#Yp(^D@` zpP8;r{~R7}^6^&x&R47FtIcggt%2Vy5DKHjyNu0(qQ@Sz(g`PjJ_Yf zE%#sl_gMz|RLtSZP%akR5lnN-%{n(!yS)M33}PPQG)43 zcnw~J)6o6NKd2c}MU@}I2Ve@(gUmC~f%6!qi5|6X=4qlGR`1h939I*MqFBxSHBo=f 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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 uDEkz2h-d2ouoh1#ZITPM;Aj%r@qSJ6Q7t%{ 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 @@ + + + + + + 航班预定 + + + +
+
+ + +
+ {{ username }} + +
+
+
+
+

预定航班

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
航班号航空公司出发机场到达机场出发时间到达时间头等舱剩余座位商务舱剩余座位经济舱剩余座位头等舱价格商务舱价格经济舱价格状态
{{ flight.ID }}{{ flight.Airline }}{{ flight.Departure_airport_name }}{{ flight.Arrival_airport_name }}{{ flight.Departure_time }}{{ flight.Arrival_time }}{{ flight.First_class_seats_remaining }}{{ flight.Business_class_seats_remaining }}{{ flight.Economy_class_seats_remaining }}{{ flight.First_class_price }}{{ flight.Business_class_price }}{{ flight.Economy_class_price }}{{ flight.Status }}
+
+
+
+
+

乘机人 1

+ +
+ + +
+
+
+ + +
+
+ + +
+
+
+ + +
+
+
+
+ 总价: 0 元 +
+ + +
+
+
+

© 2024 KJF航班订票. 保留所有权利。

+
+ + + 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 @@ + + + + + + KJF航班订票 + + + + + +
+
+ + +
+ {{ username }} + +
+
+
+
+
+
    + {% for image in images %} +
  • + + + +
  • + {% endfor %} +
+
+
+
+
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ +
+ + + +
+
+
+ +
+
+
+
+
+
+

© 2024 KJF航班订票. 保留所有权利。

+
+ + + + 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 @@ + + + + + + 订单详情 + + + +
+
+ + +
+ {{ username }} + +
+
+
+
+ +

订单详情

+
+

航班信息

+

航班号: {{ order.FlightID }}

+

航空公司: {{ order.Airline }}

+

出发机场: {{ order.Departure_airport_name }}

+

到达机场: {{ order.Arrival_airport_name }}

+

出发时间: {{ order.Departure_time }}

+

状态: {{ order.Status }}

+
+
+

乘机人信息

+ + + + + + + + + + + + {% for ticket in tickets %} + + + + + + + + {% endfor %} + +
身份证号姓名手机号座位级别票价
{{ ticket.PassengerID }}{{ ticket.Name }}{{ ticket.Phone_number }}{{ ticket.Seat_class }}{{ ticket.Price }}
+
+
+

订单总价: {{ total_price }}

+

支付状态: {% if order.Paid %}已支付{% else %}未支付{% endif %}

+
+
+ +
+ {% if not order.Paid %} +
+ +
+ {% endif %} +
+
+

© 2024 KJF航班订票. 保留所有权利。

+
+ + \ 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 @@ + + + + + + 我的订单 + + + +
+
+ + +
+ {{ username }} + +
+
+
+
+

我的订单

+
+ + + + + + + + + + + + + + + + {% for order in orders %} + + + + + + + + + + + + {% endfor %} + +
航班号航空公司出发机场到达机场出发时间状态乘机人订单总价支付状态
{{ order.FlightID }}{{ order.Airline }}{{ order.Departure_airport_name }}{{ order.Arrival_airport_name }}{{ order.Departure_time }}{{ order.Status }} + {% for passenger in order.Passengers %} + {{ passenger }}
+ {% endfor %} +
{{ order.TotalPrice }}{% if order.Paid %}已支付{% else %}未支付{% endif %}
+
+
+
+

© 2024 KJF航班订票. 保留所有权利。

+
+ + 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 @@ + + + + + + 航班搜索结果 + + + +
+
+ + +
+ {{ username }} + +
+
+
+
+
+
+
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ +
+ + + +
+
+
+ +
+
+
+
+ +

航班搜索结果

+ {% if flights %} + + + + + + + + + + + + + + + + + + + + {% for flight in flights %} + + + + + + + + + + + + + + + + {% endfor %} + +
航班号航空公司出发机场到达机场出发时间到达时间头等舱剩余座位商务舱剩余座位经济舱剩余座位头等舱价格商务舱价格经济舱价格状态
{{ flight.ID }}{{ flight.Airline }}{{ flight.Departure_airport_name }}{{ flight.Arrival_airport_name }}{{ flight.Departure_time }}{{ flight.Arrival_time }}{{ flight.First_class_seats_remaining }}{{ flight.Business_class_seats_remaining }}{{ flight.Economy_class_seats_remaining }}{{ flight.First_class_price }}{{ flight.Business_class_price }}{{ flight.Economy_class_price }}{{ flight.Status }}
+ {% else %} +

没有找到符合条件的航班。

+ {% endif %} +
+
+

© 2024 KJF航班订票. 保留所有权利。

+
+ + + + 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#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@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!s4QJ28CVYfecB##TQV;4EJ^O~(I83sPT%m&$f=0+D zAQ*&~-v$Q-Ra4ESH_OfC?PUoU-zWEOwbg7#&9>BRH*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 zcmcIJZEPFYk#ET*xgwWZO0+D?Vk9c^7iE1|lH zlBy$>O5MV3X`c!^Io(+;T$CtWS3%mwJrozWP0{=;(4trh3uLi?fB+Y|$*2|LtTYKb_ajtK|Ut)iXU zM1GQ`+!c1hS!~l9k*9XRbJPL&S`!%}l)pl#^Nxv-ci_pF34zvLArmetj1iyfQ$+f# znjncWDoVkm7@duTlA>ml#MkD;L{hU%MnZ{;8YhW#N)p3K%{C`Rf|GGcvn9ktVk#c< zF&aBC6;8t2dU8%m#HCLe92J@u#AJ}3*Q{Y3t?{!L<1sN9n~R3 z+~|njN_bx!_Mh{6&sOm1{i=6w;%$>=6JHm@b08XSQcQ-Cz-N}6Ftk()Kr<&^izILf zUa$AznVyUBsMs?jPEW-yOon1TC*u_5*K<~yiiM|UBVr;Lp9~I!lA-gVgcux~Pk`j1 zH$Dv_?wOp6g?plLIyE`pJv*di#&`~lt2TV&1Fpm|UL>GX|M72MC`J~F)e-QX? z;70$7XGO@e2Nd>z%pOo3b=OZ^JCSvG6o*G;j4BKthb=K zvjz4aL379T?=)LrH2D0O|D1%oPOE+K+-P7Zc=nmGu@^_r4QNj63clb!cWUsIe?W2p zjn7h6uG9z!35=Vdyuu*2gasPNkXPD)Xva523AB~hP77ch@FZRYaG7kFOb+hy$qg&9 zIJVM|(|tX7Etqw-D9)D4gP^bt!dRMAVOM%ywK>zFEAuyo*K8iy=23-KS!h)qyVED6 zoiKJ7o>D=rVRY{bDzJM>DJcPRG4%$F>7VtGi`V^b0v^f&gPciJJ1T^0m(Cm2+G(JBoYCFVOSelfB5U%@BcaX{&#ct?)~TcOO8%P~<@<{pTI1kg4^oJ4G$+no5}A1z!kI2D^p z27?Rkk&-X&E+TiqCpiA;k0JK40&!;I?vAYIh~hb-(|+XXR6Sj4 z>tVI^&_<1=#lArR$lUIYTGD!&QCnY9+rI%2`kJt>$)0AHoY3jrqqH89Tl!!!#oK%L zu+l#uxBAsR2b4WW?;Tc-pOM=~jD6+dab|sjezmn70!dR`(bv! z+I~iD9fsb=vG;Mkw`GGTyE;}ol*T8389ohv`IEDB`hfiKtkF-deNcgutHJ|Ay+m0) zp~lGDOu%Q7dVyYg0>ImhbOc@rq%A}QHVoQe!z|QSXsv)dfwXl1Kxu+|X>n!z)+>t8 zA#)vH2y@ag7#i5?gO|>pbQ~wFV2(pZa3>q~R1x_sQlk&i*;9nJ%%0nwiqIo-Jzpq) z{oC?ai>#E*YoV!1hUG4Q6|e1?f!k*kp;zX5zffKeZ_BG5omX1^LUR?jm7T*?{O--r z+Yv?Rm$`nO-+<4qfyLud8VqXoU@#h|a}lib!Qg9ip-8?*!gCyQj-(_#iJU!!;AsS3 zLx385o9F}T@u}oRECP&V6W;=Gx%9VT+G{zoGM;JABr*qXy}Ci5dC#rCszHEZEC(?> zEdVQHIfTsufMy>y3jmsju~`lBd?7bscuEDsCfy8QfS~3kNtQZDg%MI_2F;a7*OR5d z2>MHb6*U=y%SDnbg*=4ZfiKJ1;35OTU&Scp39IN#NzC&K1p`}S5DEdSIniU_rxcbM zM`B14&Aw2Qm{Al8H5>Uhw#G;jPw65p1eqx_wUiywFRgb#0`HWh0Q5y-c$ZxmwdJLE z!z6uX;J5VU7V@hc3DX+AP_8`tBKw8NxICbqJfv9Tnief73#}<=|4WuO%w#XjbRyYY zTr-5m4x?T$b;)4*zo|U3-g)DQ#un(YwLG*zrzK5n+Ktwfbs95Ry-;Ui9p9q0i?)<0 zQ?dVwG=!vV@C|x=y=-y2V#-wP)goQBJyq^VYMEh?PBO|*Fs|>*mtPI+rES)1&Fmf?;tN2Q} zH^o&;yGmc4GHtnL9I<+YFV|m$O)o?GzR0}+mpA$MCFT-&-TX4S1eZaO*4GC#^N@cW zE^+Y^XNqc;Nc_T7Y{3Cx2HrMaOhzO66`9YZ)mL6Q<}Z9SS0xTZ5sf`NIySD=mF@?M zdA@|=mT-UPGkHB_|8)6BpS=67X3fv0XRHhTg*&~Iqt6G%4|Mn*B~72hd(TqRpL_4$ za=%*1-CBhd^pkhr`}mK4f+R5ay?_7s5C2-CfxB8gKh`s4J!i&D+4q=)UJ4izlNaMu z!dnvw$CmK+A%6jg=C4`85iul5R>Y#MNO)l8lR3QYlh8_#C=O!vA_B7l34N{9g8+SN zIY@&GaYzfNl6tVFnP=m(T8;npusEB9>vXtkk4GZsL*W^z6TiY(&R3)7jGBp_*O}7z zNrVI8mzG{io76h@&8D}S-fUiOPFvR-_pe&- z+Ov(vmB!;~UKN@*h^eM~op&#dTpe8+O^>d-n}0Ht8OnM(6;Ef@-KDs@WWH-%XjxhO zV7L70v^*10UX98^EGxtmAtrONoX*A0HCt=e)>_Sld-w8FvbSGxA5L>yvy|J}mf5%3 zara_&=Lu!!3CM>XJ6C*bj&|A6{tx+5ox5aD=bE!qc6P4wbvL@Re4E0z$$Xp2*IpmK zHhlHDrRUPmitouB^LTad*pncdnuJ=eFDY>U6f@sM2sWZU4y8pg10r+m5U` zj>wK9>aLOWDV49k9=H}*Iht8e_CG7{8_4p0h4;(6UlkgzfBV|Evw~LYI(-^f z-tl4m!L|B>+4?S}zAMXjD?BdIAO%%uf;>^)8aSR_fa2{ZFpdJt@~cxy@S4r2Z)MewGt1(I2jx3F&N095btHVpf>EXfxy4Ha8`W~geC(9pF_(L*($gqH|)d;tR$^WKxfnHKVwC-wpSYl}Uw&-~W|&-4e{%ztZUpz*gh3&4P{ zF8}|unY{l%-=n*Z3de#jNV6vAXW>6b`7BSEosZ6g^>%~J!#~#&65iD29n>J!&_PMM z7xH3Fx8@&F02^k8VN^0A|9^feX_SpWl{_vRe=6B6 z8-E+DnR#sGg$)9)yZ!pB8rbbj^NMwYz-u+EzwV9cuMhGsy|r>+_a8YBTbAx=cX+D2Vn$9GOl?(FdH zJOZ;3n^^16Ai9;QQN>iZ0>(tObXz5&3T^+Csr+}&EX_J8Ql()x{54Am3H7hNcm7St z$n)Lv_r34u`}_U4Ki1Wm0cum0!=j{yfbLI5H$L5R8uok&iQ zqJBb808Yn|0wq!t6rusA7Yq{yj=BUUjGTT9I1P`m8mC@mAs^;==#zPIR`AQbYJ~im zC@;w>4S6mE`GBk%qfqb#Bk&P{WeC+U#mhc!(i^}!O3i=>61|TPQkq``SNQ3!>*GK! zq0s+ntVL@aIip1b8)PI?YMed>zMyU)&Ye=MU~D4|hJuCdE*zC2rxW*amuY?T&}q${HebqkSq%EMYqo2rMcEDUOO#iwLbGAw)s_8f#?%4@sdqqPBfUdZS zYb;k_dxaM>)#il&FIuMo-CJn4#Z4DXW5xfo#91&$z6H(_F`Ba#Yqgi#TC#_7RaLEu z?b>)=Y#G^WdQmoGM2rlQ>oQ6u>nnCE)H)A#R(SHR3e7dwW~p|x+4#o5y1Kj(HzDb& zbyl&t&bR+tHLj(U?akM3^L`iVU8(awx&$&}`>^|7GsVpR-?ol)d-s?DFz|?=9p$y}7pZdG^L%*1ozK-HUK* zOE=5GW$*qq_qW^G_ZARvZRu|IgMU1F|4R18mBQqCzHGtc9UC|~?(lfWM~cqvsrIK! zo5V%za=cs0^}Eh;1V1}+;?%&HW6v(B3ptKo=bG&PJ$55vT@{ zm!~5f#J7X0NB6X->L9ODqF)Y7tE9k(Rni|mry73Y7tqZP@qM5g0#PVMplamj_&^lh z`*e^;aK9j^rh&NtKP!hKVU?PNp|Gq{0U;vsNG2kRAsOP!3>vT&8b$#NE`&Zp2wuWhNjW=? zA5OTYBO>pb;ZKLcQ$c^&)feILhl*$&d%AyXbvl1vGoC2vKh5?lbbr=pMf|1}v|{g#EfMN9JS6niku9?S#6bcDz_f12M^e!GVqte{DV(C;Yotf^@gjZ?nN-_Jh7Hi_d zzuArzwj;&vPP4mHmd>=L6D#)+tG1Vuz02*2&7HEj(>AxlxU+S(`8OBdOz1KVwvStX z*ZSMGYi$Wb-axWUg3QwfB$Z*dT=ib|F20)FmSj^*cbe%|nC^_-@u}+*SIWLGZQpnM zNZS6&?K5fnfy7W^=;NzPSQ#eF zfN5TQX~oi}SlTkqQ$>Xt#(LF#**!nFFqjy8j>>X4W>a%jG`HuLTNKC96w{Yx`V^)Q ztMOd+%nvP~AXaT{e>k2zp4!%x-qw|}?N8hG=dGZQtr$uSK7CRL>RaLfdDacYl?XsP6ypwQ1TF4wntnWB1^2Dy zV@C3ROUE%CdB2B1^gneJ?t72WZaetaZuT4^zwLP4^BVbJ8-eHt+x4Eq;K6GYrVo*r zKHN0eNIGei3JQK{Mmu@5v#4@3Xr~NpK~}ZB^(XKckpOm~?gzR@jBrtbKMW6`A^yOX nCQ+9s34+LgUgbqk2H2I_Cj(3uwO?M}PY}&{@cbTjBQyU4zL!&N 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() -