Python+mysql-圖書館管理系統


無UI界面版本

python+mysql
是數據庫大作業...簡單搞了搞的版本。然后發現大家都是做帶UI界面的。啊這,我也搞搞8。來不及了做了一點pyqt的,然后意識到課設截止之前搞完不靠譜嗷。先把這個版本的完善了8。

main.py

import pymysql
from base import get_connection,query,query2,user_insert,book_insert,stu_delete,book_delete,user_modify
from menu import display_menu,menu1,menu2,A,B,get_choice
import operator
from prettytable import PrettyTable
import pandas as pd

name_list = []  # 存儲讀者信息字典,讀者信息用字典存,再用列表存儲字典
book_list = []  

# 檢查id是否重復或者有誤
def check_id(new_id):
    flag = True
    while flag:
        # 先檢查是不是純數字再去考慮是否重復的事情,如果不是純數字直接pass
        if new_id.isdigit():
            for i in range(len(name_list)):
                if name_list[i]['id'] == new_id:
                    new_id = check_id(input("您輸入的借閱卡號碼重復,請重新輸入:"))
            flag = False
        else:
            new_id = input("您輸入的借閱卡有誤,請重新輸入:")
    return new_id

def check_bid(new_bid):
    flag = True
    while flag:
        # 先檢查是不是純數字再去考慮是否重復的事情,如果不是純數字直接pass
        if new_bid.isdigit():
            for i in range(len(book_list)):
                if book_list[i]['bid'] == new_bid:
                    new_bid = check_bid(input("您輸入的圖書id重復,請重新輸入:"))
            flag = False
        else:
            new_bid = input("您輸入的圖書id有誤,請重新輸入:")
    return new_bid 
 
# 添加學生信息 返回學生信息字典
def add_name():
    new_info = {}
    new_id = check_id(input("請輸入id:"))
    new_info['id'] = new_id
    new_name = input("請輸入用戶名:")
    new_info['admin'] = new_name
    new_password = input("請輸入密碼:")
    new_info['password'] = new_password
    new_role = input("請輸入權限(管理員為1,普通用戶為0):")
    new_info['role'] = new_role
    new_email = input("請輸入郵箱:")
    new_info['email'] = new_email
    name_list.append(new_info)
    # 將新學生信息添加到數據庫中
    user_insert(new_info)
    print("添加成功!")

# 添加圖書信息 返回圖書信息字典
def add_book():
    new_binfo = {}
    new_bid = check_bid(input("請輸入圖書編號:"))
    new_binfo['bid'] = new_bid
    new_book = input("請輸入書名:")
    new_binfo['name'] = new_book
    new_author = input("請輸入作者:")
    new_binfo['author'] = new_author
    new_press = input("請輸入出版社:")
    new_binfo['press'] = new_press
    new_count = input("請輸入數量:")
    new_binfo['count'] = new_count
    book_list.append(new_binfo)
    # 將新圖書信息添加到數據庫中
    book_insert(new_binfo)
    print("添加成功!")  
 
# 查詢所有讀者信息  --是從數據庫中查詢信息的
def find_all():
    print("=" * 30)
    global name_list
    name_list = query()
    O=pd.DataFrame(name_list)
    Q=PrettyTable()
    Q.add_column('id',O['id'].values)
    Q.add_column('admin',O['admin'].values)
    Q.add_column('password',O['password'].values)
    Q.add_column('role',O['role'].values)
    Q.add_column('email',O['email'].values)
    print(Q)
    print("=" * 30)

# 查詢所有圖書信息  --是從數據庫中查詢信息的
def find_allbook():
    print("=" * 30)
    global book_list
    book_list = query2()
    O=pd.DataFrame(book_list)
    Q=PrettyTable()
    Q.add_column('bid',O['bid'].values)
    Q.add_column('name',O['name'].values)
    Q.add_column('author',O['author'].values)
    Q.add_column('press',O['press'].values)
    Q.add_column('count',O['count'].values)
    print(Q)
    print("=" * 30) 
 
# 刪除學生信息
def del_name():
    del_id_is = input("請輸入要刪除的讀者id:")
    flag = False
    index = 0
    for i in range(len(name_list)):
        if name_list[i]['id'] == del_id_is:
            flag = True
            index = i
            break
    if flag:
        name_list.pop(index)
        stu_delete(del_id_is)
        print("刪除成功!")
    else:
        print("讀者未找到!請檢查id輸入是否有誤!")

def del_book():
    del_id_is = input("請輸入要借出的圖書編號:")
    flag = False
    index = 0
    for i in range(len(book_list)):
        if book_list[i]['id'] == del_id_is:
            flag = True
            index = i
            break
    if flag:
        book_list.pop(index)
        book_delete(del_id_is)
        print("借出成功!")
    else:
        print("圖書未找到!請檢查編號輸入是否有誤!")   
 
# 名字修改細節函數
def choice_of_name(index):
    while True:
        choice = input("請輸入要修改讀者的(1.用戶名 2.密碼 3.郵箱 4.權限 5.全部修改):")
        if choice == '5':
            """
                要做到內存中的數據與數據庫中數據同時修改的話,我做的是先修改本地的數據,
                再對數據庫中的數據做修改
            """
            new_name = input("請輸入新的用戶名:")
            name_list[index]['admin'] = new_name
            new_password = check_password(input("請輸入密碼:"))
            name_list[index]['password'] = new_password
            new_email = input("請輸入郵箱:")
            name_list[index]['email'] = new_email
            new_role = input("請輸入權限:")
            name_list[index]['role'] = new_role          
            stu_modify(name_list[index])
            break
        elif choice == '1':
            new_name = input("請輸入新的用戶名:")
            name_list[index]['name'] = new_name
            stu_modify(name_list[index])
            break
        elif choice == '2':
            new_password = input("請輸入密碼:")
            name_list[index]['password'] = new_password
            stu_modify(name_list[index])
            break
        elif choice == '3':
            new_email = input("請輸入email:")
            name_list[index]['email'] = new_email
            stu_modify(name_list[index])
            break
        elif choice =='4':
            new_role = input("請輸入權限:")
            name_list[index]['role'] = new_role          
            stu_modify(name_list[index])            
        else:
            print("輸入有誤,請重新輸入!")
  
# 修改學生信息
def re_name():
    id_is = input("請輸入要修改的讀者id:")
    flag = False
    index = 0
    # 先找到要修改的學生的下標
    for i in range(len(name_list)):
        if name_list[i]['id'] == id_is:
            flag = True
            index = i
            break
    if flag:
        choice_of_name(index)
        print("修改成功!")
    else:
        print("修改失敗,讀者信息未找到!") 
 
# 查詢單個學生信息 --並不是從數據庫中查詢的,還是從內存中查詢的
def find_name():
    find_id_is = input("請輸入要查詢的讀者id:")
    flag = False
    index = 0
    for i in range(len(name_list)):
        if name_list[i]['id'] == find_id_is:
            flag = True
            index = i
            break
    if flag:
        print("讀者查詢到,讀者信息為:")
        
        print(name_list[index]['id'], name_list[index]['admin'], name_list[index]['password'], name_list[index]['email'])
    else:
        print("讀者未找到!")

#查詢圖書信息
def find_book():
    find_id_is = input("請輸入要查詢的圖書書名:")
    flag = False
    index = 0
    for i in range(len(book_list)):
        if book_list[i]['name'] == find_id_is:
            flag = True
            index = i
            break
    if flag:     
        print("圖書查詢到,圖書信息為:")
        print("=" * 30)           
        print("bid——name—————————press—————author—count")
        print(book_list[index]['bid'], book_list[index]['name'], book_list[index]['author'], book_list[index]['press'],book_list[index]['count'])
        print("=" * 30) 
    else:
        print("圖書未找到!")  

#借書
def borrowbook():
    connection = get_connection()
    cur = connection.cursor()    
    name=str(input('請輸入要借的圖書書名:'))
    sql="""select * from book where (name = %s) """
    flag=cur.execute(sql,[name])
    connection.commit()
    if flag==1:
        sql="""select * from book where count = %s"""
        connection.commit()
        result=cur.fetchone()[4]
        if result!=0:
            print("成功借出")
            sql="""update book set count = count - 1 """
            cur.execute(sql)
            connection.commit()
    else:
        print("圖書借光或者未找到圖書")

def backbook():
    connection = get_connection()
    cur = connection.cursor()    
    name=str(input('請輸入要歸還的圖書書名:'))
    sql="""select * from book where (name = %s) """
    flag=cur.execute(sql,[name])
    connection.commit()
    if flag==1:
        print("成功歸還")
        sql="""update book set count = count + 1 """
        cur.execute(sql)
        connection.commit()
    else:
        print("沒有該圖書")
 
# 初始化函數,從數據庫中查詢到的賦值給name_list
def name_init():
    try:
        global name_list
        name_list = query()
        print("成功獲取數據庫中數據!")
    except Exception as e:
        raise e

def book_init():
    try:
        global book_list
        book_list = query2()
        print("成功獲取數據庫中數據!")
    except Exception as e:
        raise e  
 
#新書上架
def newbook():
    newbook_list= (sorted(book_list, key=lambda book_list:book_list['bid'],reverse=True))
    df=pd.DataFrame(newbook_list)
    tb = PrettyTable()
    tb.add_column('bid', df['bid'].values)
    tb.add_column('name', df['name'].values)
    tb.add_column('author', df['author'].values)
    tb.add_column('press', df['press'].values)
    tb.add_column('count', df['count'].values)
    print(tb)

#登錄注冊
def login():
    connection = get_connection()
    cur = connection.cursor() 
    pd =int(input('1.登錄\n2.注冊\n3.退出\n'))
#登陸
    if pd == 1:
        print('**************開始登陸************')
        id = str(input("請輸入賬號:"))
        password = str(input("請輸入密碼:"))

    #數據庫表中查詢是否含有該賬號和密碼
        sql = """select * from user where  (id = %s) and (password = %s) """
        flag = cur.execute(sql,[id,password])
        connection.commit()
        if flag == 1:
            print("登陸成功")
            connection.commit()        
            sql = """select * from user where (role = %s) """
            connection.commit()            
            if cur.fetchone()[3] != 0: 
                print("管理員賬戶")
                menu1()
                key = get_choice()
                if key=='1':
                    A()
                    key = get_choice()
                    if key=='1':
                        add_name()
                    elif key=='2':
                        del_name()
                    elif key=='3':
                        re_name()
                    elif key=='4':
                        find_name()
                    elif key=='5':
                        find_all()
                elif key=='2':
                    B()
                    key = get_choice()
                    if key=='1':
                        del_book()
                    elif key=='2':
                        add_book()
                    elif key=='3':
                        find_book()
                    elif key=='4':
                        find_allbook()
                    elif key=='6':
                        exit_name = False
                    else:
                        print("請輸入正確的數值!")   
                elif key=='3':
                    exit_name = False
                else:
                    print("請輸入正確的數值!")    
            else:
                print("普通賬戶")
                menu2()
                key = get_choice()
                if key=='1':
                    borrowbook()
                elif key=='2':
                    backbook()
                elif key=='3':
                    find_book()
                elif key=='4':
                    find_allbook()
                elif key=='5':
                    exit_name = False
                else:
                    print("請輸入正確的數值!")                       
        #登陸成功,顯示用戶信息
        else:
            print("賬號或密碼錯誤")
        connection.close()

    elif pd == 2:
        print('**************開始注冊************')
        id = str(input('請輸入id:'))
        admin=str(input('請輸入用戶名:'))
        password = str(input('請輸入密碼:'))
        email=str(input('請輸入郵箱:'))
        role=0

    # 判斷id是否已被注冊
        sql = """select * from user where id = %s"""
        flag = cur.execute(sql, [id])
        connection.commit()
        if flag == 1:
            print("id已存在,請重新注冊")
        else:
            sql = """insert into user(id,admin,password,role,email) values (%s,%s,%s,%s,%s)"""
            cur.execute(sql, [id,admin, password,role,email])
            connection.commit()
            print("注冊成功")
    else:
        print("注冊失敗")

def main():
    name_init()
    book_init()
    exit_name = True
    while exit_name:
        display_menu()
        key = get_choice()
        if key == '1':
            login()
        elif key == '2':
            newbook()
        elif key == '3':
            print('敬請期待')
        elif key == '4':
            exit_name = False
        else:
            print("請輸入正確的數值!")  
main()

base.py

import pymysql
# 獲取數據庫連接的方法
def get_connection():
    connection = pymysql.connect(host="localhost", user="root", password="123", database="admin", port=3306)
    return connection 
 
# 初始化的時候從數據庫中查詢學生信息
def query():
    connection = get_connection()
    # 獲取游標 對數據庫進行操作 並且將返回值設置為字典類型
    cur = connection.cursor(cursor=pymysql.cursors.DictCursor)
    # 寫sql語句
    sql = "select * from user"
    try:
        cur.execute(sql)
        students = cur.fetchall()
        """
            此處判斷很重要,如果數據庫中沒有記錄,則會結果是一個空的元組類型,
            如果有記錄,則結果是list類型,所以可以根據類型來判斷數據庫是否為空,
            如果不是就返回一個空列表。
        """
        if type(students) == list:
            return students
        else:
            return []
    except Exception as e:
        raise e
    finally:
        connection.close()  # 關閉連接

def query2():
    connection = get_connection()
    # 獲取游標 對數據庫進行操作 並且將返回值設置為字典類型
    cur = connection.cursor(cursor=pymysql.cursors.DictCursor)
    # 寫sql語句
    sql = "select * from book"
    try:
        cur.execute(sql)
        students = cur.fetchall()
        """
            此處判斷很重要,如果數據庫中沒有記錄,則會結果是一個空的元組類型,
            如果有記錄,則結果是list類型,所以可以根據類型來判斷數據庫是否為空,
            如果不是就返回一個空列表。
        """
        if type(students) == list:
            return students
        else:
            return []
    except Exception as e:
        raise e
    finally:
        connection.close()  # 關閉連接  

# 添加用戶 -- 直接添加到數據庫里面
def user_insert(user):
    connection = get_connection()
    # 獲取游標 對數據庫進行操作 並且將返回值設置為字典類型
    cur = connection.cursor(cursor=pymysql.cursors.DictCursor)
    # 寫sql語句
    sql = "insert into user(id,admin,password,role,email) values('%s','%s','%s','%s','%s')"
    sid = user['id']
    admin = user['admin']
    password = user['password']
    role = user['role']
    email=user['email']
    try:
        cur.execute(sql % (sid,admin,password,role,email))
        connection.commit()
    except Exception as e:
        # 錯誤回滾
        connection.rollback()
        raise e
    finally:
        connection.close()  # 關閉連接

def book_insert(book):
    connection = get_connection()
    # 獲取游標 對數據庫進行操作 並且將返回值設置為字典類型
    cur = connection.cursor(cursor=pymysql.cursors.DictCursor)
    # 寫sql語句
    sql = "insert into book(bid,name,author,press,count) values('%s','%s','%s','%s','%s')"
    bid = book['bid']
    name = book['name']
    press = book['author']
    author = book['press']
    count = book['count']
    try:
        cur.execute(sql % (bid,name,author,press,count))
        connection.commit()
    except Exception as e:
        # 錯誤回滾
        connection.rollback()
        raise e
    finally:
        connection.close()  # 關閉連接  
 
# 刪除學生 --直接從數據庫里面刪除
def stu_delete(sid):
    connection = get_connection()
    cur = connection.cursor()
    sql = "delete from user where id = '%s'"
    try:
        cur.execute(sql % sid)
        connection.commit()
    except Exception as e:
        # 錯誤回滾
        connection.rollback()
        raise e
    finally:
        connection.close()  # 關閉連接

def book_delete(bid):
    connection = get_connection()
    cur = connection.cursor()
    sql = "delete from book where bid = '%s'"
    try:
        cur.execute(sql % bid)
        connection.commit()
    except Exception as e:
        # 錯誤回滾
        connection.rollback()
        raise e
    finally:
        connection.close()  # 關閉連接  
 
# 修改學生信息
def user_modify(user):
    connection = get_connection()
    cur = connection.cursor()
    sid = user['id']
    admin = user['admin']
    password = user['password']
    role = user['role']
    email=user['email']
    sql = "update user set admin='%s',password='%s',role='%s',email='%s' where id='%s'"
    try:
        cur.execute(sql % (admin, password, role, email,sid))
        connection.commit()
    except Exception as e:
        # 錯誤回滾
        connection.rollback()
        raise e
    finally:
        connection.close()  # 關閉連接
def display_menu():
    print("-" * 30)
    print("   圖書館管理系統  v8.8  ")
    print("1.登錄/注冊")
    print("2.新書上架")
    print("3.熱書推薦")
    print("4.退出系統")
    print("-" * 30)
 
def menu1():
    print("-" * 30) 
    print("   管理員入口  ")
    print("1、讀者管理") 
    print("2、圖書管理")
    print("3、退出系統")        
    print("-" * 30)

def A():
    print("-" * 30)
    print("  讀者管理  ")  
    print("1.添加讀者信息")
    print("2.刪除讀者信息")
    print("3.修改讀者信息")
    print("4.查詢單個讀者信息")
    print("5.查詢所有讀者信息")
    print("6.退出系統")
    print("-" * 30)
def B():
    print("-" * 30)
    print("  圖書管理  ")  
    print("1.刪除圖書")#刪除
    print("2.添加圖書")#添加
    print("3.查詢圖書信息")
    print("4.查詢所有圖書信息")
    print("6.退出系統")
    print("-" * 30) 

def menu2():
    print("-" * 30) 
    print("   讀者入口  ")
    print("1.借書登記")#刪除
    print("2.還書登記")#添加
    print("3.查詢圖書信息")
    print("4.查詢所有圖書信息")
    print("5.退出系統")
    print("-" * 30) 

def get_choice():
    selected_key = input("請輸入選擇的序號:")
    return selected_key

UI界面版本

python+pyqt5+mysql
打算用PyQt5做因為這個好做唄iui
做完了..晚點傳github..

主頁面

數據庫

我是直接用設計好表之后,直接連接數據庫用的。

三個表

book圖書表

hot熱書表

user用戶表

思路

項目下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM