编程逻辑思维巩固案列演练

在这里插入图片描述

通过python的面向对象编程,实现一个文字版的图书管理系统

  • 本章节的目的,强化大家编程的逻辑思维能力

  • 知识点

    • 基本的sql增删改查
    • 面向对象的使用

1、项目介绍

  • 功能模块

输入图片说明

  • 图书信息

在这里插入图片描述

2.环境准备

  • 数据存储方式:mysql

    • 创建表

      create table books( 
          id int unsigned primary key auto_increment not null, 
          name varchar(20) default '', 
          position varchar(40) default '', 
          status enum('在库','出借') default '在库', 
          borrorwer varchar(20) default '' 
      );
      
    • 插入数据

      # 部分列插入语法:=> insert into 表名(列1,...) values(值1,...) 
      insert into books(name,position) value('python入门到精通','A区2号架3层'); 
      
      # 全列插入语法=> insert into 表名 values(...) 
      insert into books value(0,'python入门到精通','A区2号架3层','在库','');
      
    • 修改数据

      # 修改数据 
      update 表名 set 列1=值1,列2=值2... where 条件
      
    • 删除数据语法

      delete from 表名 where 条件;
      
    • 查询

      select * from 表名;
      
  • python连接mysql数据库

    # 安装pymysql 
    pip install pymysql
    
    • 连接数据库

      pymysql.connect(
          host='localhost', 
          user='root', 
          password="123456", 
          database='test', 
          port=3306, 
          cursorclass=pymysql.cursors.DictCursor)
      
    • 创建游标对象

    • 执行sql语句

3.功能实现

1.项目主流程和菜单提示

输入图片说明

  • 1、运行程序,打印提示菜单
  • 2、根据输入不同的选项进行对应的操作
2.数据库连接
  • 通过pymysql连接数据库,封装执行查询语句和修改语句的方法。
3.添加图书

输入图片说明

  • 1、用户依次输入书名、存放位置

  • 2、校验输入的书名和位置是否有值

  • 3、添加图书到数据库

  • 4、提示:

    • 继续添加输入1,回车退回到主菜单
4.修改图书

需求:修改图书只能修改书名和位置信息。

输入图片说明

  • 1、用户输入修改的图书编号,判断id是否存在

  • 2、编号存在则打印改书本的全部信息,并提示用户输入新的书名,和新的位置。

  • 3、根据用户的输入,对图书进行修改

  • 4、提示:

    • 继续添加输入1,回车退回到主菜单
5.图书列表

在这里插入图片描述

  • 查询数据库中所有的图书,打印出来显示
6.查询图书
  • 1、输入书名,查询出与之匹配的图书信息,并打印

  • 2、提示:

    • 继续查询输入1,回车退回到主菜单
7.删除图书
  • 1、输入书籍编号,找到对应的书籍,从数据库中删除

  • 2、提示:

    • 继续删除输入1,回车退回到主菜单
8.借阅图书
  • 1、输入图书编号,查找到该书籍

  • 2、提示用户输入借阅人名字

  • 3、将书籍的状态改为出借,借阅人改为输入的名字

  • 4、提示:

    • 继续添加输入1,回车退回到主菜单
9.归还图书
  • 1、输入图书编号,查找到该书籍

  • 2、将书籍的状态改为在库,借阅人改为空

  • 3、提示:

    • 继续添加输入1,回车退回到主菜单

python操作数据库

pymysql_practice.py

import pymysql

#pymysql连接数据库
con = pymysql.connect( host='localhost',
                 user='root',
                 password="123456",
                 database='lenovo',
                 port=3306,
                 cursorclass=pymysql.cursors.DictCursor)

#创建一个游标对象
cur = con.cursor(cursor=pymysql.cursors.DictCursor) #以字典形式展示数据

#执行sql
sql = "select * from books"
res = cur.execute(sql)
print(res)

#获取查询的结果
result1 = cur.fetchall()
print(result1)

#执行增删改的sql
sql = 'insert into books(name,position) value("天龙八部","A区1号架1层");'
res2 = cur.execute(sql)

#提交事务
con.commit()
print(res2)
con.close()

图书管理小项目

BookManage.py

import pymysql


class DB:
    '''
    项目涉及到数据库的增删查改,咱们封装数据库对应的操作方法来处理
    查询的方法
    增删改的方法
    '''

    def __init__(self):
        # pymysql连接数据库
        self.con = pymysql.connect(host='localhost',
                              user='root',
                              password="123456",
                              database='lenovo',
                              port=3306,
                              cursorclass=pymysql.cursors.DictCursor)

        # 创建一个游标对象
        self.cur = self.con.cursor(cursor=pymysql.cursors.DictCursor)  # 以字典形式展示数据

    def query_sql(self,sql):
        '''
        查询sql方法
        :param sql: sql语句
        :return: 查询得到的结果
        '''
        self.cur.execute(sql)
        return self.cur.fetchall()

    def update_sql(self,sql):
        '''
        :param sql: sql语句
        :return:
        '''
        self.cur.execute(sql)
        self.con.commit()

    def close(self):
        """关闭游标,断开连接"""
        self.cur.close()
        self.con.close()

class Books(DB):

    def add_book(self):
        '''添加图书'''
        print("---------添加图书--------")
        name = input("请输入书名:")
        position = input("请输入图书存放的位置:")
        if name and position:
            sql = "insert into books(name,position) value('{}','{}')".format(name,position)
            self.update_sql(sql)
            print("添加成功!")
        else:
            print("添加失败,书名和位置均不能为空!!!")

        n = input("继续添加请输入1,回车返回主菜单")
        #判断用户输入的是否为1,为1则再次调用添加图书的方法
        if n == "1":
            self.add_book()
        else:
            pass

    def update_book(self):
        '''修改图书'''
        print("----------修改图书------------")
        id = input("请输入要修改图书的ID")
        #打印图书的信息
        res = self.query_sql(f'select * from books where id={id}')
        if res:
            print("当前图书的信息",res)
            # 进行修改
            name = input("请输入新的书名,不修改请输入回车:") or res[0]['name']
            position = input("请输入图书存放的位置,不修改请输入回车:") or res[0]['position']
            sql = f'update books set name = "{name}",position="{position}" where id="{id}"'
            self.update_sql(sql)
            print("修改成功!")
        else:
            print("您输入的书籍id不存在")
        n = input("继续修改请输入1,回车返回主菜单")
        if n == "1":
            self.update_book()
        else:
            pass

    def del_book(self):
        '''删除图书'''
        print("----------删除图书------------")
        id = input("请输入删除图书的id:")
        # 打印图书的信息
        res = self.query_sql(f'select * from books where id={id}')
        if res:
            print("您要删除的书籍信息如下:",res)
            is_delete = input("确认删除请输入1,否则请输入回车:")
            if is_delete == "1" and res[0]["status"]=="在库":
                sql = 'delete from books where id = {id}'
                self.update_sql(sql)
                print("删除成功")
            elif res[0]["status"]=="出借":
                print("本书已出借,无法删除!")
        else:
            print("您输入的书籍id不存在")
        #判断是否要继续删除
        n = input("继续删除请输入1,回车返回主菜单")
        if n == "1":
            self.del_book()
        else:
            pass



    def qurey_book(self):
        '''查询图书'''
        print("----------查询图书------------")
        name = input("请输入要查询的图书名:")
        if name:
            sql = f"select * from books where name = '{name}' "
            res = self.query_sql(sql)

            if res:
                for i in res:
                    print(i)
            else:
                print("图书馆暂无该书籍!")
        else:
            print("书名不能为空!")
        # 判断是否要继续查询
        n = input("继续查询请输入1,回车返回主菜单")
        if n == "1":
            self.qurey_book()
        else:
            pass


    def book_list(self):
        '''图书列表'''
        sql = "select * from books"
        res = self.query_sql(sql)
        print("****************图书列表***************")
        for i in res:
            print(f'编号:{i["id"]},书名:{i["name"]},位置:{i["position"]},'
                  f'转态:{i["status"]},借阅人:{i["borrorwer"]}')

        print("返回主菜单页面")

    def revert_book(self):
        '''归还图书'''
        print("----------删除图书------------")
        id = input("请输入要归还图书的ID:")
        sql = f'select * from books where id = {id}'
        res = self.query_sql(sql)
        if res:
            print("您要归还的图书信息如下:\n",res)
            #查看图书的状态,如果状态为出借,则不能借出
            if res[0]["status"] == "出借":
                status = "在库"
                lend_sql =  f'update books set status="{status}",borrorwer=" " where id="{id}"'
                self.update_sql(lend_sql)
                print("归还成功")
            else:
                print("本书并未出借!")
        else:
            print("请输入正确的图书编号!")

        # 判断是否要继续租借
        n = input("继续归还请输入1,回车返回主菜单")
        if n == "1":
            self.revert_book()
        else:
            pass


    def lend_book(self):
        '''租借图书'''
        print("----------租借图书------------")
        id = input("请输入要租借图书的ID:")
        sql = f'select * from books where id = {id}'
        res = self.query_sql(sql)
        if res:
            print("您要借阅的图书信息如下:\n",res)
            #查看图书的状态,如果状态为出借,则不能借出
            if res[0]["status"] == "出借":
                print("该图书已被借出!")
            else:
                print("本书可借出!")
                borrorwer = input("借书请输入您的名字:")
                status = "出借"
                lend_sql =  f'update books set status="{status}",borrorwer="{borrorwer}" where id="{id}"'
                self.update_sql(lend_sql)
                print("登记成功,借阅成功!")
        else:
            print("图书馆暂无该书籍!")

        # 判断是否要继续租借
        n = input("继续租借请输入1,回车返回主菜单")
        if n == "1":
            self.lend_book()
        else:
            pass

    def quit(self):
        '''退出'''
        self.close()
        print("程序退出!!!")


    def print_menu(self):
        '''打印菜单'''
        print("-----菜单---------")
        print("【1】︰添加图书\n"
              "【2】:修改图书\n"
              "【3】:删除图书\n"
              "【4】:查询图书\n"
              "【5】:图书列表\n"
              "【6】:出借图书\n"
              "【7】:归还图书\n"
              "【8】:退出")

    def main(self):
        print("---------------欢迎进入小仔图书管理系统---------------")
        while True:
            self.print_menu()
            number = input("请输入你的选项:")
            if number == '1':
                self.add_book()
            elif number == "2":
                self.update_book()
            elif number == "3":
                self.del_book()
            elif number == "4":
                self.qurey_book()
            elif number == "5":
                self.book_list()
            elif number == "6":
                self.lend_book()
            elif number == "7":
                self.revert_book()
            elif number == "8":
                self.quit()
                break
            else:
                print("您输入的选项有误!憨批!")


if __name__ == '__main__':
    book = Books()
    book.main()

欢迎关注我的微信公众号:
梦无矶的测试开发之路

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐