图书馆座位预定系统开发
功能:
登陆---〉预定--〉退出
#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没有在使用座位,可以预约座位,成功预约座位
我们到数据库中查看,发现已经成功修改信息
这里只是时间的各种转换格式,忘记转换过来就存储进去了
最后:
代码没有进一步的优化,很多地方,比如对用户输入的内容过滤消毒、判断等
使用过多的数据库连接语句,影响程序运行效率
最重要的问题是还没有解决服务端程序运行后自动检测用户使用到期后的操作