--- tags: 勤益課程 title: 1102小考3 --- <style> .emp {color:red} .info {color:green} </style> # 第3次小考 ## 1102 Web程式設計 :::info 注意事項 - 請在完成下列題目後,將檔案存放在以學號命名的目錄,壓縮後上傳至:arrow_right: [Dropbox 雲端](https://www.dropbox.com/request/kboRJ9EGVVtQMb7VKQV0) - 上傳時限為 5/21(六) 24:00以前,逾期視同未交。 - 請勿以任何形式抄襲其它同學的答案,若有發現,所有人一律0分。 - 若有參考網路上之程式碼,請於程式中註明出處,避免如上的抄襲疑慮。 - 答案請勿使用 Python 以外的語言撰寫。 ::: ## 題目:網紅資料的CRUD操作 請在輸入正確的帳密後,進行網紅資料的CRUD操作。 ### 流程 ``` mermaid graph LR A[輸入帳密] --> C{判斷帳密是否正確} C -->|不正確| D[顯示錯誤訊息離開程式] C -->|正確| F{顯示選單} F -->|1| G[建立資料庫與資料表] F -->|2| H[匯入資料] F -->|3| I[顯示所有紀錄] F -->|4| J[新增記錄] F -->|5| K[修改記錄] F -->|6| L[查詢指定手機] F -->|7| M[刪除所有記錄] F -->|0,Enter| N[離開] ``` ### 補充說明 若有題意不清楚之處,請於課程群組中提出,老師會酌情增加說明或提示。 - 請下載:arrow_right: [帳密檔:pass.json](https://irw.ncut.edu.tw/peterju/course/flask/1102/quiz/test3/pass.json) 與:arrow_right: [資料檔:member.txt](https://irw.ncut.edu.tw/peterju/course/flask/1102/quiz/test3/member.txt) - 讀取 pass.json 檔案,比對帳密輸入是否正確,正確則顯示選單,不正確則結束程式 - 選單的功能請參考執行畫面,按下【Enter】或【0】結束程式,其它鍵則顯示【無效的選擇】 - 建立sqlite3資料庫:【mydb.db】 - 建立資料表:【member】,欄位如下 | 欄位名稱 | 資料形態 | 欄位要求 | | -------| ---------- | ------------- | | iid | 整數 | 主索引 自動累加 | | member | 字元,長度20 | 不可無值 | | msex | 字元,長度1 | 不可無值 | | mphone | 字元,長度15 | 不可無值 | - 讀取 member.txt 檔案,將資料匯入 member 資料表 - 其餘選單操作皆可以 sqlite3 套件執行 SQL 敘述完成 - 新增記錄時必須要求使用者輸入姓名、性別、手機 - 修改記錄時,必須要輸入想修改記錄的姓名 ### 重要提示 - 請將功能寫成函數放入模組內供主程式呼叫,例如讀取帳密檔、讀取資料檔建立資料庫、顯示選單、選單內之各項功能,並以 lib.py 命名 - 字串的 strip() 方法可刪除頭尾的空白字元 - 主程式請以 main.py 命名,上述自訂模組請以下列敘述引用: `from lib import *` - 有包含變數的顯示與SQL語法操作請都使用F字串,同時需留意對齊問題 ``` for record in data: print(f"{record[0]: <6} {record[1]}  {record[2]}") ``` - 所有變數命名與顯示要求必須和題目說明完全一致 - 讀取json檔案,可使用 json.load() 方法 - 可能出錯之處請使用例外處理 ### 執行畫面 請點選下方【詳細資料】後展開 :::spoiler ``` D:\quiz3>py main.py 請輸入帳號:admin 請輸入密碼:13579 =>帳密錯誤,程式結束 D:\quiz3>py main.py 請輸入帳號:admin 請輸入密碼:24680 ---------- 選單 ---------- 0 / Enter 離開 1 建立資料庫與資料表 2 匯入資料 3 顯示所有紀錄 4 新增記錄 5 修改記錄 6 查詢指定手機 7 刪除所有記錄 -------------------------- 請輸入您的選擇 [0-7]: 3 =>查無資料 ---------- 選單 ---------- 0 / Enter 離開 1 建立資料庫與資料表 2 匯入資料 3 顯示所有紀錄 4 新增記錄 5 修改記錄 6 查詢指定手機 7 刪除所有記錄 -------------------------- 請輸入您的選擇 [0-7]: 1 =>資料庫已建立 ---------- 選單 ---------- 0 / Enter 離開 1 建立資料庫與資料表 2 匯入資料 3 顯示所有紀錄 4 新增記錄 5 修改記錄 6 查詢指定手機 7 刪除所有記錄 -------------------------- 請輸入您的選擇 [0-7]: 2 =>異動 6 筆記錄 ---------- 選單 ---------- 0 / Enter 離開 1 建立資料庫與資料表 2 匯入資料 3 顯示所有紀錄 4 新增記錄 5 修改記錄 6 查詢指定手機 7 刪除所有記錄 -------------------------- 請輸入您的選擇 [0-7]: 3 姓名    性別 手機 ----------------------------- 辦公室小野  F  0912-345678 阿神     M  0923-456789 老高     M  0934-567890 黃明志    M  0945-678901 蔡阿嘎    F  0956-789012 簡單哥    M  0967-890123 ---------- 選單 ---------- 0 / Enter 離開 1 建立資料庫與資料表 2 匯入資料 3 顯示所有紀錄 4 新增記錄 5 修改記錄 6 查詢指定手機 7 刪除所有記錄 -------------------------- 請輸入您的選擇 [0-7]: 4 請輸入姓名: 蔡英文 請輸入性別: F 請輸入手機: 0911-222333 =>異動 1 筆記錄 ---------- 選單 ---------- 0 / Enter 離開 1 建立資料庫與資料表 2 匯入資料 3 顯示所有紀錄 4 新增記錄 5 修改記錄 6 查詢指定手機 7 刪除所有記錄 -------------------------- 請輸入您的選擇 [0-7]: 3 姓名    性別 手機 ----------------------------- 辦公室小野  F  0912-345678 阿神     M  0923-456789 老高     M  0934-567890 黃明志    M  0945-678901 蔡阿嘎    F  0956-789012 簡單哥    M  0967-890123 蔡英文    F  0911-222333 ---------- 選單 ---------- 0 / Enter 離開 1 建立資料庫與資料表 2 匯入資料 3 顯示所有紀錄 4 新增記錄 5 修改記錄 6 查詢指定手機 7 刪除所有記錄 -------------------------- 請輸入您的選擇 [0-7]: 5 請輸入想修改記錄的姓名: =>必須指定姓名才可修改記錄 ---------- 選單 ---------- 0 / Enter 離開 1 建立資料庫與資料表 2 匯入資料 3 顯示所有紀錄 4 新增記錄 5 修改記錄 6 查詢指定手機 7 刪除所有記錄 -------------------------- 請輸入您的選擇 [0-7]: 5 請輸入想修改記錄的姓名: 老高 請輸入要改變的性別: F 請輸入要改變的手機: 0923-444555 原資料: 姓名:老高,性別:M,手機:0934-567890 =>異動 1 筆記錄 修改後資料: 姓名:老高,性別:F,手機:0923-444555 ---------- 選單 ---------- 0 / Enter 離開 1 建立資料庫與資料表 2 匯入資料 3 顯示所有紀錄 4 新增記錄 5 修改記錄 6 查詢指定手機 7 刪除所有記錄 -------------------------- 請輸入您的選擇 [0-7]: 3 姓名    性別 手機 ----------------------------- 辦公室小野  F  0912-345678 阿神     M  0923-456789 老高     F  0923-444555 黃明志    M  0945-678901 蔡阿嘎    F  0956-789012 簡單哥    M  0967-890123 蔡英文    F  0911-222333 ---------- 選單 ---------- 0 / Enter 離開 1 建立資料庫與資料表 2 匯入資料 3 顯示所有紀錄 4 新增記錄 5 修改記錄 6 查詢指定手機 7 刪除所有記錄 -------------------------- 請輸入您的選擇 [0-7]: 6 請輸入想查詢記錄的手機: 0923-444555 姓名    性別 手機 ----------------------------- 老高     F  0923-444555 ---------- 選單 ---------- 0 / Enter 離開 1 建立資料庫與資料表 2 匯入資料 3 顯示所有紀錄 4 新增記錄 5 修改記錄 6 查詢指定手機 7 刪除所有記錄 -------------------------- 請輸入您的選擇 [0-7]: 7 =>異動 7 筆記錄 ---------- 選單 ---------- 0 / Enter 離開 1 建立資料庫與資料表 2 匯入資料 3 顯示所有紀錄 4 新增記錄 5 修改記錄 6 查詢指定手機 7 刪除所有記錄 -------------------------- 請輸入您的選擇 [0-7]: 3 =>查無資料 ---------- 選單 ---------- 0 / Enter 離開 1 建立資料庫與資料表 2 匯入資料 3 顯示所有紀錄 4 新增記錄 5 修改記錄 6 查詢指定手機 7 刪除所有記錄 -------------------------- 請輸入您的選擇 [0-7]: 9 =>無效的選擇 ---------- 選單 ---------- 0 / Enter 離開 1 建立資料庫與資料表 2 匯入資料 3 顯示所有紀錄 4 新增記錄 5 修改記錄 6 查詢指定手機 7 刪除所有記錄 -------------------------- 請輸入您的選擇 [0-7]: 0 D:\quiz3> ``` ::: ## 解答 ### main.py 請點選下方【詳細資料】後展開 :::spoiler ```python= from lib import * username = input('請輸入帳號:') password = input('請輸入密碼:') if not chkLogin(username.strip(), password.strip()): print("=>帳密錯誤,程式結束") quit() while True: lstMenu() # 顯示功能表 choice = input("請輸入您的選擇 [0-7]: ").strip() if choice == '1': createDB() elif choice == '2': importData() elif choice == '3': qryTable() elif choice == '4': iName = input("請輸入姓名: ").strip() iSex = input("請輸入性別: ").strip() iPhone = input("請輸入手機: ").strip() addRec(iName, iSex, iPhone) elif choice == '5': qName = input("請輸入想修改記錄的姓名: ").strip() if qName: iSex = input("請輸入要改變的性別: ").strip() iPhone = input("請輸入要改變的手機: ").strip() editRec(qName, iSex, iPhone) else: print("=>必須指定姓名才可修改記錄") elif choice == '6': qPhone = input("請輸入想查詢記錄的手機: ").strip() qryPhone(qPhone) elif choice == '7': delTable() elif choice == '' or choice == '0': break else: print("=>無效的選擇") ``` ::: ### lib.py 請點選下方【詳細資料】後展開 :::spoiler ```python= import sqlite3 import json def chkLogin(uid, pwd): try: with open('pass.json', 'r', encoding='UTF-8') as f: passTable = json.load(f) except Exception as e: print(f'=>開檔發生錯誤,錯誤訊息為{e}') else: for rec in passTable: if uid == rec["帳號"] and pwd ==rec["密碼"]: return True return False def lstMenu(): print() print(10*'-', "選單", 10*'-') print('0 / Enter 離開') print('1 建立資料庫與資料表') print('2 匯入資料') print('3 顯示所有紀錄') print('4 新增記錄') print('5 修改記錄') print('6 查詢指定手機') print('7 刪除所有記錄') print(26*'-') def createDB(): try: conn = sqlite3.connect('mydb.db') conn.execute(''' create table if not exists member ( iid integer primary key autoincrement, member char(20) not null, msex char(1) not null, mphone char(15) not null ); ''') print('=>資料庫已建立') conn.commit() conn.close() except Exception as e: print(f'=>資料庫連接或資料表建立失敗,錯誤訊息為{e}') def importData(): try: with open('member.txt', 'r', encoding='UTF-8') as f: conn = sqlite3.connect('mydb.db') for line in f: recL = line.strip().split(',') # conn.execute(f"insert into member(mname, msex, mphone) values ('{recL[0]}', '{recL[2]}', '{recL[2]}');") conn.execute(f"insert into member(mname, msex, mphone) select '{recL[0]}', '{recL[1]}', '{recL[2]}' \ where not exists(select 1 from member where mname='{recL[0]}' and mphone='{recL[2]}');") print(f"=>異動 {conn.total_changes} 筆記錄") conn.commit() conn.close() except Exception as e: print(f"=>匯入資料表失敗,錯誤訊息為{e}") def qryTable(): try: conn = sqlite3.connect('mydb.db') cursor = conn.execute("select * from member") data = cursor.fetchall() if len(data) > 0: print("\n姓名    性別 手機") print("-"*29) for record in data: print(f"{record[0]: <6} {record[1]}  {record[2]}") else: print("=>查無資料") conn.commit() conn.close() except Exception as e: print(f"=>顯示所有紀錄失敗,錯誤訊息為{e}") def addRec(nm, sex, phone): try: conn = sqlite3.connect('mydb.db') conn.execute(f"insert into member(mname, msex, mphone) values ('{nm}','{sex}','{phone}');") print(f"=>異動 {conn.total_changes} 筆記錄") conn.commit() conn.close() except Exception as e: print(f"=>新增記錄失敗,錯誤訊息為{e}") def editRec(nm, sex, phone): try: conn = sqlite3.connect('mydb.db') cursor = conn.execute(f"select * from member where mname like '%{nm}%'") data = cursor.fetchall() print("\n原資料:") if len(data) > 0: for record in data: print(f"姓名:{record[0]},性別:{record[1]},手機:{record[2]}") conn.execute(f"update member set msex='{sex}', mphone='{phone}' where mname like '%{nm}%'") print(f"=>異動 {conn.total_changes} 筆記錄") cursor = conn.execute(f"select * from member where mname like '%{nm}%'") data = cursor.fetchall() print("修改後資料:") if len(data) > 0: for record in data: print(f"姓名:{record[0]},性別:{record[1]},手機:{record[2]}") else: print("=>查無資料") else: print("=>查無資料") conn.commit() conn.close() except Exception as e: print(f"=>修改記錄失敗,錯誤訊息為{e}") def qryPhone(phone): try: conn = sqlite3.connect('mydb.db') cursor = conn.execute(f"select * from member where mphone like '%{phone}%'") data = cursor.fetchall() if len(data) > 0: print("\n姓名    性別 手機") print("-"*29) for record in data: print(f"{record[0]: <6} {record[1]}  {record[2]}") else: print("=>查無資料") conn.commit() conn.close() except Exception as e: print(f"=>查詢手機失敗,錯誤訊息為{e}") def delTable(): try: conn = sqlite3.connect('mydb.db') conn.execute("delete from member") print(f"=>異動 {conn.total_changes} 筆記錄") conn.commit() conn.close() except Exception as e: print(f"=>刪除所有紀錄失敗,錯誤訊息為{e}") ``` :::