图书信息管理系统(python,sqlite)

这篇具有很好参考价值的文章主要介绍了图书信息管理系统(python,sqlite)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       sqlite数据库具体的结构设计和数据的截图放最后,因为图片有点多,但是能更好的帮助大家理解和实现该系统 

目录

一、任务描述

二、功能实现

三、数据库设计​编辑

四、程序流程图(某些新加功能没有)

 五、python代码(带注释)

六、具体数据库结构设计截图

1.Book表

 2.Bookstate表​编辑​编辑

 3.Login表​编辑​编辑

 4.manager表​编辑​编辑


一、任务描述

       基于python语言,实现图书馆图书管理的一般功能,要有管理员和用户两个角色。用户角色功能包括借书、还书、查询某本图书信息和图书状态、查询自己已借图书信息与状态等。管理员角色的功能包括录入图书、删除图书、修改图书信息、查询某本图书信息和状态、查询任意用户借书状态、总览图书馆图书信息和状态。

       所设计的系统以菜单方式工作,为用户提供清晰的使用提示,依据用户的选择来进行各种处理。图书信息包括编号、书名、作者、出版社、出版日期、价格。录入的图书信息使用SQLite数据库保存,图书数量不少于20本。用户数量不少于10个。每个图书都有三个副本可供读者借阅。每个读者一次最多借两本书。
管理系统功能解释(包括但不局限于):

  1. 录入:即增加一本书的记录到系统中。
  2. 存储:即将图书信息保存在数据库中。
  3. 查询:可根据书名、编号查找相关图书信息,若找到显示该书全部信息。用户可以查询已借的所有图书。管理员可以查询任一本书的信息和状态。管理员还可以总览所有书的信息和状态。
  4. 修改:可修改一本书的除书名外其它信息。
  5. 图书状态:提供该书在库、不在库的状态,该图书还有几个副本可借,归还期限、已超期时间等。
  6. 借书:用户借书,有超期图书未还不能借新书。
  7.  还书:用户还书。
  8. 能实现多用户的注册和登录,实现管理员登录

二、功能实现

用户功能:
(1)借书
(2)还书
(3)查询某本图书信息和图书状态
(4)查询自己已借图书信息与状态
(5)用户注册和登录

管理功能:
(1)管理员登录
(2)录入图书
(3)删除图书
(4)修改图书信息
(5)查询某本图书信息和状态
(6)查询任意用户借书状态
(7)总览图书馆图书信息和状态。

三、数据库设计

Book (图书信息表):包括编号(number)、书名(name)、作者(author)、出版社(press)、出版日期(pubdate)、价格(price)

Bookstate(图书状态表):包括副本编号(id)、用户编号(username)、图书编号(number)、是否在库(status),借书日期(borrowtime)、归还日期(returntime)、是否借出标志(flag)。

Login(用户表信息表):账号(username)、密码(password)。

manager(管理员表格):账号(username)、密码(password)。(后面新加的功能,所以图里里面没有)

四、程序流程图(某些新加功能没有)

python图书馆管理系统,项目制作,python,sqlite,pycharm

 五、python代码(带注释)

import sqlite3
import datetime
from datetime import datetime

overtime_flag = 2  #超期标志
def getconn():  # 连接数据库
    dbstr = "D:\学习\科目学习\专业综合训练2\PCT.db"
    conn = sqlite3.connect(dbstr)
    cur = conn.cursor()
    sqlstr = "create table if not exists Book(number nchar(10) primary key,name nchar(50)," \
             "author nchar(20),press nchar(50),pubdate nchar(50),price float)"
    cur.execute(sqlstr)

    sqlstr = "create table if not exists Bookstate(id int ,number nchar(10),status nchar(10) default '在库'," \
             "borrowtime date, returntime date,overtime nchar(20),flag int default 1," \
             "foreign key(number) references Book(number))"
    cur.execute(sqlstr)

    sqlstr = "create table if not exists Login(username primary key unique,password not null)"
    cur.execute(sqlstr)

    sqlstr = "create table if not exists manager(username nchar(10) primary key unique,password nchar(10) not null)"
    cur.execute(sqlstr)
    conn.commit()
    return conn


# 管理员查询图书状态
def querycopy(number):
    conn = getconn()
    cur = conn.cursor()
    recorde = cur.execute(f"select * from Bookstate where Bookstate.number = {number}").fetchall()

    num = 0
    for i in recorde:  # 计算图书还有多少副本可以借
        if i[6] == 1:
            num += 1
    if num == 0:
        print(f"编号为{number}的书,不在库,没有副本可以借")
    else:
        print(f"编号为{number}的书,在库,还有{num}个副本可以借")
        j = 3
        today = datetime.today()
        while num < j:  #控制输出次数,还有几个副本可以借
            for i in recorde:
                if i[4] != None:   #归还时间不为空才继续执行,不然datetime.strptime会报错
                    if today > datetime.strptime(i[4], '%Y-%m-%d') and i[6] == 0:    #将字符串格式化为日期,避免输入错误
                        print(f"副本{j - num},借书时间:{i[3]},归还期限{i[4]},已超期时间:{today - datetime.strptime(i[4],'%Y-%m-%d')}")
                    else:
                        print(f"副本{j - num},借书时间:{i[3]},归还期限{i[4]},未超期")
            j -= 1
    cur.close()


# 显示所有书籍
def showall():
    conn = getconn()
    cur = conn.cursor()
    recorde = cur.execute("select * from Book").fetchall()
    for re in recorde:
        print(re)
        querycopy(re[0])
        print()
        ##recorde=cur.execute("select * from Bookstate where Bookstate.number = Book.number").fetchall()
    cur.close()


def getdata():
    number = input("请输入图书编号:")
    name = input("请输入图书名字:")
    author = input("请输入作者:")
    press = input("请输入出版社:")
    pubdate = input("请输入出版时间:")
    price = eval(input("请输入价格:"))
    return number, name, author, press, pubdate, price


# 添加书籍
def addbook():
    conn = getconn()
    cur = conn.cursor()
    records = getdata()
    sqlstr = "insert into Book (number,name,author,press,pubdate,price)" \
             "values(?,?,?,?,?,?)"
    # 每本书3个副本
    cur.execute(sqlstr, (records[0], records[1], records[2], records[3], records[4], records[5]))
    cur.execute(f"insert into Bookstate(id,number) values(1,{records[0]})")
    cur.execute(f"insert into Bookstate(id,number) values(2,{records[0]})")
    cur.execute(f"insert into Bookstate(id,number) values(3,{records[0]})")
    print("插入成功!")
    conn.commit()
    print(records[0], records[1], records[2], records[3], records[4], records[5])
    cur.close()


# 查询图书信息
def querybook():
    conn = getconn()
    cur = conn.cursor()
    op = input("按照编号查询,还是书名查询,请输入:")
    num = None
    name = None
    if op == "编号":
        num = input("请输入编号:")
        cur.execute("select * from Book where number=:num", {"num": num})
        record = cur.fetchall()
        for line in record:
            print(line)
    elif op == "书名":
        name = input("请输入书名:")
        cur.execute("select * from Book where name=:name", {"name": name})
        record = cur.fetchall()
        for line in record:
            print(line)
    cur.close()
    return [num, name]

# 删除图书
def delbook():
    conn = getconn()
    cur = conn.cursor()
    op = input("删除图书信息,你要输入编号还是书名:")
    if op == '编号':
        num = input("请输入编号:")
        cur.execute("select * from Book where number=:num", {"num": num})
        record = cur.fetchall()
        for line in record:
            print(line)
        cur.execute("delete from Book where number=:num", {"num": num})
        cur.execute("delete from Bookstate where number=:num", {"num": num})
    elif op == '书名':
        name = input("请输入书名:")
        cur.execute("select * from Book where name=:name", {"name": name})
        record = cur.fetchall()
        for line in record:
            print(line)
        cur.execute("delete from Bookstate where number in(select number from Book where name=:name)", {"name": name})
        cur.execute("delete from Book where name=:name", {"name": name})
    print("该图书删除成功!")
    conn.commit()
    cur.close()
# 修改图书信息
def udbook():
    conn = getconn()
    cur = conn.cursor()
    num = input("请输入图书编号:")
    row = cur.execute("select * from Book where number=?", (num,)).fetchall()
    if not row:
        print("没有该图书,请重试!")
        return 0
    print(row)
    print("请输入修改后的信息(图书名字不能修改):")
    record = getdata()
    sqlstr = "update Book set number=?,author=?,press=?,pubdate=?,price=? where number=?"
    cur.execute(sqlstr, (record[0], record[2], record[3], record[4], record[5], num))
    sqlstr = "update Bookstate set number=? where number=?"
    cur.execute(sqlstr, (record[0], num))
    print("修改成功")
    conn.commit()
    cur.close()

# 判断操作是否继续执行
def continueif():
    op = input("是否继续操作:y/n?  请输入:")
    if str.lower(op) == 'y':
        return 1
    elif str.lower(op) == 'n':
        return 0
    else:
        print("输入错误")

def queryuser():    #管理员界面查询用户的借书状态
    username = input("请输入所要查询用户的编号:")
    querymybook(username)
def managerlog():
    conn = getconn()
    cur = conn.cursor()
    username = input("请输入管理员账号:")
    password = input("请输入账号密码:")
    row = cur.execute("select * from manager where username=? and password=?", (username, password)).fetchone()
    if row is not None:
        print("登录成功!")
        return 1
    else:
        print("账号或者密码错误,登陆失败!")
        return 0

def manager():

    flag = 1
    while flag == 1:
        line = "--------------------管理员界面------------------------------------"
        print(line)
        print("退出管理员界面:0    录入图书信息:1     删除图书信息:2     修改图书信息:3   ")
        print("查询某本图书信息和状态:4     查询任意用户借书状态:5        总览图书信息和状态:6")
        status = int(input("请输入选项:"))
        match status:
            case 0:
                break
            case 1:
                addbook()
            case 2:
                delbook()
            case 3:
                udbook()
            case 4:
                queryms()
            case 5:
                queryuser()
            case 6:
                showall()
            case _:
                print("没有该选项")
        flag = continueif()


def log():
    conn = getconn()
    cur = conn.cursor()
    username = input("请输入登录账号:")
    password = input("请输入登录密码:")
    row = cur.execute("select * from Login where username=? and password=?", (username,password)).fetchone()
    if row is not None:
        print("登录成功!")
        return [1, username]
    else:
        print("账号或者密码错误,登陆失败!")
        return [0, None]

def register():
    conn = getconn()
    cur = conn.cursor()
    username = input("请输入注册账号:")
    password = input("请输入注册密码:")
    cur.execute("insert into Login(username,password) values(?,?)", (username, password))
    print(f"注册成功!账号:{username},密码:{password} ")
    conn.commit()
    cur.close()

def overtime(username):  #判断是否有超期图书未归还
    conn = getconn()
    cur = conn.cursor()
    recorde = cur.execute("select * from Bookstate where username=?", (username,)).fetchall()
    if not recorde:
        return 0      #如果一条记录都没有,说明还未借书,也就没有超期图书
    today = datetime.today()
    for i in recorde:
        if i[4] != None:  # 归还时间不为空才继续执行,不然datetime.strptime会报错
            if today > datetime.strptime(i[4], '%Y-%m-%d') and i[6] == 0:  # 将字符串格式化为日期,避免输入错误
                recorde1 = cur.execute("select number,name from Book where number in "
                                       "(select number from Bookstate where username=? and number=?)", (i[7],i[1])).fetchall()
                print(f"图书编号:{recorde1[0][0]},图书名字:{recorde1[0][1]},副本{i[0]},借书时间:{i[3]},归还期限:{i[4]},"
                      f"已超期时间:{today - datetime.strptime(i[4], '%Y-%m-%d')}")
                global overtime_flag
                overtime_flag = 0
    cur.close()

def borrowbook(username):  #user登录时的账号,在借书时使用此账号
    conn = getconn()
    cur = conn.cursor()
    #username = input("请输入账号进行借书:")
    op = overtime(username)
    if overtime_flag == 0:
        print(f"你有超期图书未归还,请归还后才能借阅")
        return 0  #有超期图书不能借书
    row = cur.execute("select count(*) as count1 from Bookstate where username=?", (username,)).fetchone()
    count = row[0]
    if count >= 2:
        print("对不起,一个账号一次只能借阅两本书,你已经达到数量上限")
        return 0
    op = input("输入图书编号或者名字,请选择:")
    if op == '编号':
        number = input("请输入图书编号:")
        recorde = cur.execute("select * from Book where number=?", (number,)).fetchall()
        print(f"图书信息:{recorde}")

        recorde = cur.execute("select * from Bookstate where number = ?", (number,)).fetchall()
        num = 0
        for i in recorde:  # 计算图书还有多少副本可以借
            if i[6] == 1:
                num += 1
        if num == 0:
            print("该书已经没有副本可以借阅,请选择其他书籍")
        else:
            borrowtime = input("请输入借阅时间(yyyy-mm-dd):")
            returntime = input("请输入归还时间(yyyy-mm-dd):")
            if num == 3:   #还有3个副本,从第一个开始借阅
                sqlstr = "update Bookstate set status=?, borrowtime=?,returntime=?,flag=0,username=? " \
                         "where id=1 and number=?"
            elif num == 2:
                sqlstr = "update Bookstate set status=?, borrowtime=?,returntime=?,flag=0,username=? " \
                         "where id=2 and number=?"
            elif num == 1:
                sqlstr = "update Bookstate set status=?, borrowtime=?,returntime=?,flag=0,username=? " \
                         "where id=3 and number=?"
            cur.execute(sqlstr, ("不在库", borrowtime, returntime, username, number))
    elif op == "名字":
        name = input("请输入图书名字:")
        recorde = cur.execute("select * from Book where name=?", (name,)).fetchall()
        print(f"图书信息:{recorde}")

        recorde = cur.execute("select * from Bookstate where number in(select number from Book where name=?)",
                              (name,)).fetchall()
        number = recorde[0][1]
        num = 0
        for i in recorde:  # 计算图书还有多少副本可以借
            if i[6] == 1:
                num += 1
        if num == 0:
            print("该书已经没有副本可以借阅,请选择其他书籍")
        else:
            borrowtime = input("请输入借阅时间(yyyy-mm-dd):")
            returntime = input("请输入归还时间(yyyy-mm-dd):")
            if num == 3:  # 还有3个副本,从第一个开始借阅
                sqlstr = "update Bookstate set status=?, borrowtime=?,returntime=?,flag=0,username=? " \
                         "where id=1 and number=?"
            elif num == 2:
                sqlstr = "update Bookstate set status=?, borrowtime=?,returntime=?,flag=0,username=? " \
                         "where id=2 and number=?"
            elif num == 1:
                sqlstr = "update Bookstate set status=?, borrowtime=?,returntime=?,flag=0,username=? " \
                         "where id=3 and number=?"
            cur.execute(sqlstr, ("不在库", borrowtime, returntime, username, number))
    conn.commit()
    cur.close()

def querymybook(username):  #用户查询已借图书与状态
    conn = getconn()
    cur = conn.cursor()
    recorde = cur.execute("select * from Bookstate where username=?", (username,)).fetchall()
    #recorde1 = cur.execute("select * from Book where number in "
     #                     "(select number from Bookstate where username=?)", (recorde[0][7],)).fetchall()
    today = datetime.today()
    for i in recorde:
            if i[4] != None:  # 归还时间不为空才继续执行,不然datetime.strptime会报错,且归还时间为空说明此书未借
                if today > datetime.strptime(i[4], '%Y-%m-%d') and i[6] == 0:  # 将字符串格式化为日期,避免输入错误
                    recorde1 = cur.execute("select * from Book where number in "
                                           "(select number from Bookstate where username=? and number=?)", (i[7],i[1])).fetchall()
                    print(f"图书信息:图书编号:{recorde1[0][0]},图书名字:{recorde1[0][1]},作者:{recorde1[0][2]},"
                          f"出版社:{recorde1[0][3]},出版时间:{recorde1[0][4]},价格:{recorde1[0][5]}")
                    print(f",副本{i[0]},借书时间:{i[3]},归还期限:{i[4]},已超期时间:{today - datetime.strptime(i[4], '%Y-%m-%d')}\n")
                else:
                    recorde1 = cur.execute("select * from Book where number in "
                                           "(select number from Bookstate where username=? and number=?)", (i[7],i[1])).fetchall()
                    print(f"图书信息:图书编号:{recorde1[0][0]},图书名字:{recorde1[0][1]},作者:{recorde1[0][2]},"
                          f"出版社:{recorde1[0][3]},出版时间:{recorde1[0][4]},价格:{recorde1[0][5]}")
                    print(f",副本{i[0]},借书时间:{i[3]},归还期限:{i[4]},未超期\n")
    if not recorde:
        print("信息为空,还未借书")
        return 0

def returnbook(username):  #还书
    conn = getconn()
    cur = conn.cursor()
    print("你所借图书信息与状态")
    line = "-------------------------------------------"
    print(line)
    op = querymybook(username)
    print(line)
    if op == 0:
        return 0   #还没借书,直接退出
    number = input("请输入所还书籍的编号:")
    sqlstr = "update Bookstate set status=?, borrowtime=?,returntime=?,flag=?,username=? " \
                 "where number=? and username=?"
    cur.execute(sqlstr, ('在库', None, None, 1, None, number, username))
    print("还书成功")
    conn.commit()
    cur.close()
    #recorde = cur.execute("select * from Bookstate where username=?", (username,)).fetchall()
    #recorde1 = cur.execute("select number,name from Book where number in "
    #                      "(select number from Bookstate where username=?)", (username,)).fetchall()

def queryms():   #查询图书信息和状态
    conn = getconn()
    cur = conn.cursor()
    op = querybook()   #查询图书信息
    if op[0] != None:
        querycopy(op[0])   #查询图书状态
    elif op[1] != None:
        num = cur.execute("select number from Book where name =?", (op[1],)).fetchall()
        querycopy(num[0][0])  #查询图书状态

def user():
    flag = 1
    op = 2
    ch=2
    while ch == 2:
        ch = int(input("登录账户:1   注册账户:2   请输入选项:"))
        global overtime_flag
        overtime_flag = 2   #切换账号时需要把超期标志赋值,不然会影响后面的账号
        if ch == 1:
            op = log()
        elif ch == 2:
            register()
    if op[0] == 1:
        while flag == 1:
            line = "--------------------用户界面-----------------------"
            print(line)
            print("退出用户界面:0    借书:1    还书:2 ")
            print("查询图书信息和状态:3     查询自己已借图书信息和状态:4   ")
            status = int(input("请输入选项:"))
            match status:
                case 0:
                    break
                case 1:
                    borrowbook(op[1])
                case 2:
                    returnbook(op[1])
                case 3:
                    queryms()
                case 4:
                    querymybook(op[1])
                case _:
                    print("没有该选项")
            flag = continueif()
    else:
        print("欢迎下次光临!")


if __name__ == "__main__":
    a = 1
    line = "--------------------主界面-----------------------"
    while a == 1:
        print(line)
        op = int(input("退出系统:0    管理员使用:1    用户使用:2   :"))
        if op == 1:
            ch = managerlog()
            if ch == 1:
                manager()
        elif op == 2:
            user()
        elif op == 0:
            break
        else:
            print("输入错误请重试!\n")

六、具体数据库结构设计截图

1.Book表

python图书馆管理系统,项目制作,python,sqlite,pycharm  

python图书馆管理系统,项目制作,python,sqlite,pycharm文章来源地址https://www.toymoban.com/news/detail-768517.html

 2.Bookstate表

 3.Login表

 4.manager表

到了这里,关于图书信息管理系统(python,sqlite)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python】Python高校图书馆书籍管理系统(登录、注册、功能源码设计)【独一无二】

    👉博__主👈:米码收割机 👉技__能👈:C++/Python语言 👉公众号👈:测试开发自动化 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术 本文是基于PyQT5开发的一款Python高校图书馆书籍管理系统,源码可以关注公众号,后台回复: 高校图书馆管理系统 获

    2024年02月08日
    浏览(40)
  • 基于python图书馆管理系统和读者系统(附完整代码以及打包好的exe文件)

    摘要:         本文基于python的图书馆管理系统和读者系统,实现了登录、注册、忘记密码、书籍查询、借阅、归还、修改等功能,通过csv文件将数据存储在本地。注册时采用了邮箱验证码,模拟了现实场景。( 全部源代码地址见文末 )如果有其他奇思妙想或者bug欢迎提

    2024年02月07日
    浏览(45)
  • Java 实现图书馆管理系统

    目录 一:创建对象 1.学生类对象Student : 2.图书类对象book : 3.管理员类对象OP: 二.创建主要交互界面MainMenu,并实现主界面功能 1.创建交互界面: 2.实现主界面功能: 三:创建OP管理界面: 1.创建主要交互界面及实现\\\"管理学生\\\"功能OPmenu: (1).交互界面: (2):实现\\\"管理学生\\\"功能: 2.实现\\\"管理

    2024年02月12日
    浏览(45)
  • 实战 图书馆系统管理案例

    config :敏感的配置一般都是在配置中心配置,比如consul或者阿波罗上面 controller :写一些handler的,拿到参数要去调用service层的逻辑。( 只负责接受参数,怎么绑定参数,要去调用哪个service的,handler的一个入口 ) service: service层才是正真的业务处理层 。调用dao层的增删改

    2024年02月11日
    浏览(45)
  • 用C++实现图书馆管理系统

    该程序包含一个 `Book` 类,代表图书馆中的书籍,具有标题、作者、出版商、出版年份和可用性属性。程序中还定义了一个 `bookList` 向量,用于存储图书馆中的所有书籍。 程序的 `main` 函数通过循环显示菜单,然后根据用户的选择调用相应的函数。用户可以选择添加新书籍、

    2024年02月12日
    浏览(49)
  • 基于JavaWeb的图书馆管理系统

    🍅 作者主页:

    2024年02月05日
    浏览(58)
  • C++图书馆管理系统(简单版)

    实用的图书馆管理系统应该至少包括一下功能: 1、上传:新进图书以及基本信息的输入 2、删除:旧图书以及基本信息的删除 3、显示:显示图书馆已有的所有图书 4、查找:查询要借阅的图书信息 5、借阅:实现用户办理借阅手续 6、归还:实现用户办理归还手续 系统以菜单

    2024年02月09日
    浏览(46)
  • JavaWeb期末项目 图书馆管理系统

    1 项目基本信息 1.1 项目名称 图书馆管理系统 1.2 开发运行环境 Window 10 64位 JDK 1.8.0 Eclipse 4.8版本 MySql 5.5 Tomcat 9.0 2 项目需求分析 2.1 学生登录部分 (1)学生注册:在进入图书馆前必须要登录,如果没有学号则要注册,注册时系统会将用户填写的学号与数据库里面的数据对比,

    2024年02月10日
    浏览(46)
  • java项目-图书馆管理系统源码

    作者主页:夜未央5788  简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码   项目介绍 本毕业设计运用了使用技术:spring mvc+spring+hibernate,数据库使用了当前较为流行的Mysql5.7。根据本校图书馆的工作流程与实际的需求和特色,本系统需满足以下几个方

    2024年02月08日
    浏览(47)
  • Python小论文-图书管理系统+Python+tkinter+sqlite3+PersistentDB线程池管理

    该系统主要通过tkinter库实现图书管理系统,包含对SQLite3数据库的增删改查的知识点。主要功能有:登录、注册、图书查询、借书、还书、图书录入、图书删除、图书统计、管理员新增、数据库查询等模块。 Python小论文-图书管理系统+Python+tkinter+sqlite3+PersistentDB资源池 Python桌

    2024年02月02日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包