功能:python
登錄---〉預約--〉退出sql
#create_sql.py:建立用戶數據庫shell
import sqlite3 #建一個數據庫 def create_sql(): sql = sqlite3.connect("user_data.db") sql.execute("""create table if not exists %s( %s integer primary key autoincrement, %s varchar(128), %s varchar(128), %s varchar(128), %s char(128))""" % ('user', 'id', 'name', 'passworld', 'number', 'status' )) sql.close() create_sql() #user_data.db爲數據庫文件名 #create table if not exists爲創建一個數據庫指令,若是文件存在就打開,不存在就建立一個 #%s對應後面的四個參數 # 'user':表名 # 'id':至關於一個索引,autoincrement指定爲自動增量 # 'name':用戶名 # 'passworld':用戶密碼 # 'number':座位號 # 'status:狀態 # sql.close():是關閉數據庫,每次對數據庫進行操做後,都要記得進行關閉操做 #數據庫的格式 # file:user_data.db # table:user # id name passworld number status
#create_library:建立圖書館座位數據庫數據庫
import sqlite3 #建一個數據庫 def create_sql(): sql = sqlite3.connect("library_data.db") sql.execute("""create table if not exists %s( %s integer primary key autoincrement, %s varchar(128), %s varchar(128), %s char(128), %s Smalldatetime(128), %s Smalldatetime(128))""" % ('library', 'id', #主鍵 'name',#姓名 'number',#座位編號 'status',#使用狀態 'sdate',#開始時間 'ddate'#到期時間 )) sql.close() create_sql() #2019-01-19 8:00:00
#data_operations.py:服務端數據庫管理app
import sqlite3,time
# 數據庫增長數據
def add_data():
input_name = input("請輸入您的用戶名:")
input_passworld = input("請輸入您的密碼:")
number=input('請輸入學號')
status=None
sql = sqlite3.connect("user_data.db")
sql.execute("insert into user(name,passworld,number,status) values(?,?,?,?)",
(input_name,input_passworld,number,status))
sql.commit()
print("添加成功")
sql.close()
# 這裏增長了讀取四個個參數values(?,?,?,?)字段裏的四個?號,對應了參數input_name,input_passworld,number,status
def showalldata():
sql = sqlite3.connect("user_data.db")
data = sql.execute("select * from user").fetchall()
sql.close()
return data
# "select * from user"爲查詢user對應的表的全部資料的指令
def drop():
print('指定id刪除')
sql = sqlite3.connect("user_data.db")
data = sql.execute("select * from user").fetchall()
print('全部數據:'+str(data))
while 1:
id=input('請輸入你要刪除的數據的id:')
sql.execute("DELETE FROM user WHERE id = %s" % id)
sql.commit()
print('刪除完成')
sql.close()
break
def add_library():
number = input("請輸入座位號:")
name=input('請輸入姓名')
status = None
s_date=input("請輸入開始時間:")
# time.strftime("%Y-%m-%d %X",time.localtime())
d_date=input('請輸入到期時間:')
sql = sqlite3.connect("library_data.db")
sql.execute("insert into library(name,number,status,sdate,ddate) values(?,?,?,?,?)",
(name,number,status,s_date,d_date))
sql.commit()
print("添加成功")
sql.close()
def visit_data():
sql = sqlite3.connect("library_data.db")
data = sql.execute("select * from library").fetchall()
sql.close()
return data
def drop_library():
print('指定id刪除')
library = sqlite3.connect("library_data.db")
data = library.execute("select * from library").fetchall()
print('全部數據:' + str(data))
while 1:
id = input('請輸入你要刪除的數據的id:')
library.execute("DELETE FROM library WHERE id = %s" % id)
library.commit()
print('刪除完成')
library.close()
break
print("""
1:增長用戶數據
2:查詢用戶表
3.刪除用戶數據
4:增長圖書館座位
5.查詢圖書館座位表
6.刪除圖書館座位數據
q:退出
""")
while 1:
option =None
cho =input('選擇您想要的進行的操做:')
if cho == '1':
add_data()
elif cho == '2':
data=showalldata()
print(data)
elif cho == '3':
drop()
elif cho == 'q':
break
elif cho =='4':
add_library()
elif cho =='5':
data2=visit_data()
print(data2)
elif cho == '6':
drop_library()
else:
print("輸入錯誤")
#login.py:用戶登錄與預約座位測試
import sqlite3, getpass,time #保證每個用戶名和學號不一樣 #輸入用戶名正確後,輸入密碼。用戶名正確的狀況下,密碼連續輸錯三次,用戶將被鎖定,禁止登陸系統 #輸入用戶名後,若是用戶名被鎖定及無效用戶名,程序會退出,請確保輸入正確。 def showdate(username): sql = sqlite3.connect('user_data.db') data = sql.execute("select * from user where name='%s'" % username).fetchone() sql.close() return data # ("select * from user where username='%s'"% name)這條指令用來查詢表user的name字段的對應的數據 # 最後返回用戶名對應的資料 def val(): while 1: name = input("用戶名:") # 輸入用戶名 data = showdate(name) # 獲取用戶名對應的數據庫資料 if data: # passworld = getpass.getpass("密碼") # 輸入密碼 passworld=input('密碼:') if data[2] == passworld: print("登陸成功") return name else: print("密碼錯誤") else: print("用戶名不存在") # getpass模塊可使輸入的字符不可見,在python的shell中可能無效,在終端中和用戶登陸效果相同,不出現輸入字符 #預約座位 #首先查詢用戶有沒有已經在使用的座位,若是在使用,不能繼續預約,只能等時間過了以後才能預約 def schedule(name): pass # user=sqlite3.connect('user_data.db') library=sqlite3.connect('library_data.db') data = library.execute("select * from library where name='%s'" % name).fetchone() if data: print('已經在使用,請過了時間再預約') #得到當前時間 date1=time.time() #得到數據庫裏的到期時間 date2=library.execute("select * from library where name='%s'" % name).fetchone()[5] print(date2) #將時間轉爲時間戳 date2=time.strptime(date2,"%Y-%m-%d %X") date2=time.mktime(date2) print('還剩'+str(date1-date2)+'時間能夠預定下次') else: # sum=library.execute("select * from library").fetchall() count=library.execute("select * from library where name=''").fetchall() print('如今共有空位:'+str(len(count))) #存儲因此沒有被預定的座位,供用戶選擇 count_list=[] for i in count: #從數據庫中讀取 count_list.append(i[2]) print('你能夠選擇以下座位進行預約:'+str(count_list)) print('''預約座位: 預定的時間(最低2個小時,最多12個小時) 預定的座位''') #座位 cards=input('輸入你想要預定的座位') # 預定的時間 time_date =input('輸入你要預定的時間') time_date=int(time_date)*3600 #當前時間 date3=time.time() #到期時間=當前時間+預定時間 date4=date3+time_date print(date4) #將數據存儲到數據庫 library.execute("DELETE FROM library WHERE number = '%s'" % cards) library.execute("insert into library(name,number,status,sdate,ddate) values(?,?,?,?,?)", (name, cards, None,date3, date4)) library.commit() library.close() print(''' 按1進入登錄預約環節 按q退出程序 ''') while 1: option = None cho = input('選擇您想要的進行的操做:') if cho=='1': name=val() schedule(name) elif cho =='q': break else: print("輸入錯誤")
實際演示fetch
我已經事先準備好兩個用戶:優化
用戶:liyi 密碼:123098 已經在使用座位sqlite
用戶:hanming 密碼:123456 還未預定使用座位blog
首先運行數據庫管理程序:
而後運行登錄程序
測試用戶liyi
測試結果顯示:
用戶
liyi已經在預定使用,因此不能再次預定使用其餘座位
測試用戶hanming
由於hanming沒有在使用座位,能夠預定座位,成功預定座位
咱們到數據庫中查看,發現已經成功修改信息
這裏只是時間的各類轉換格式,忘記轉換過來就存儲進去了
最後:
代碼沒有進一步的優化,不少地方,好比對用戶輸入的內容過濾消毒、判斷等
使用過多的數據庫鏈接語句,影響程序運行效率
最重要的問題是尚未解決服務端程序運行後自動檢測用戶使用到期後的操做