圖書館座位預定系統開發
功能:
登陸---〉預定--〉退出
#create_sql.py:創建用戶數據庫
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:服務端數據庫管理
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("輸入錯誤")
實際演示
我已經事先准備好兩個用戶:
用戶:liyi 密碼:123098 已經在使用座位
用戶:hanming 密碼:123456 還未預約使用座位
首先運行數據庫管理程序:

然后運行登陸程序
測試用戶liyi
測試結果顯示:
用戶
liyi已經在預約使用,所以不能再次預約使用其他座位

測試用戶hanming
因為hanming沒有在使用座位,可以預約座位,成功預約座位

我們到數據庫中查看,發現已經成功修改信息
這里只是時間的各種轉換格式,忘記轉換過來就存儲進去了

最后:
代碼沒有進一步的優化,很多地方,比如對用戶輸入的內容過濾消毒、判斷等
使用過多的數據庫連接語句,影響程序運行效率
最重要的問題是還沒有解決服務端程序運行后自動檢測用戶使用到期后的操作
