数据库课程设计:利用python+MySQL+pyqt5设计一个带UI界面的书店管理系统

1.项目简述

1.1项目来源

基于MySQL+python+pyqt5设计和实现的书店管理系统
这个项目原本是这学期数据库课程设计,经过老师提醒准备在暑假时间进行完善和修改,待新学期申请一项软件著作权(这个很水的),也算是更进一步的磨练自己。暑期完成了以下内容:
①完成整个UI界面的实现(也是最主要的部分)
②对数据库相关表的定义进行完善和修改
③对相关异常进行了处理

1.2 相关工具

python3.8、MySQL8.0、pycharm2020.1、datagrip2020.1、pymysql、pyqt5。

2.需求分析

2.1 需求信息

书店管理系统需要满足以下需求:
对于一般店员来说:
①书店店员通过系统管理书籍的购入和卖出,以及查看书籍的存货量
②店员可以通过该系统对需要借书和还书的人员进行借书还书操作
③新增和删除新的借阅人员信息。
对于店长(也就是管理员),除了以上的三种需求之外,还有
①增加和删除雇员,
②增加和删除系统操作人员账号,
③修改雇员的信息。

2.2 数据需求

根据2.1中的需求信息,我们可以设计出以下的基本功能:
1.借阅人员信息的输入、查询,包括借阅证ID、姓名、年龄、性别、手机号
2.书籍信息的输入和删除包括ISBN、书籍名称、作者、定价
3.馆藏书籍信息包括ISBN、收藏量
4.书籍的卖出和购入包括书籍的ISBN、卖出量、购入量
5.雇员信息的增删查改,包括雇员姓名、性别、年龄、工资

2.3系统流程设计

根据上述的描述我们可以容易设计出系统流程图,流程图如下
在这里插入图片描述

图2.3 系统流程图

3.模型设计

3.1 employee表

在这里插入图片描述

3.2 book表

在这里插入图片描述

3.3 reader表

在这里插入图片描述

3.4 collectionofbook表

在这里插入图片描述

3.5 borrow表

在这里插入图片描述

3.6 return表

在这里插入图片描述

3.7 sell表

在这里插入图片描述

3.8 全局ER图

在这里插入图片描述
一个读者可以借到多本书,同一本书也可以被多人借去。Book表是指所有已经发行的书籍,而collectionofbook代表书店里面有的书籍,两者1:1关系。同一本书可以被买入或者卖出多本,两者是1:N的关系。

4.规范性检查

1)对于book表 属性有(ISBN, BookName, Author, Price),其中ISBN为主键,无非主属性对候选键的传递依赖且候选键只有一个,符合BCNF

(2)对于employee表,属性有(employeeid, employname, employsex, employage, employtel, salary),其中employeeid为主键,无非主属性对候选键的传递依赖且候选键只有一个,符合BCNF

(3)对于reader表,属性有(readerid, readername, sex, age, tel) 其中readerid为主键,无非主属性对候选键的传递依赖且候选键只有一个,符合BCNF

(4)对于collection表,属性有(isbn, totalnum),其中ISBN不仅为主键也为外键,参考book表中的ISBN。无非主属性对候选键的传递依赖且候选键只有一个,符合BCNF

(5)对于borrow表,属性有(borrowID,date,ISBN,readerID),borrowid为主键,决定了哪个人借了那本书,ISBN和readerid参考了collectionofbook中的isbn以及reader中的readerid,无非主属性对候选键的传递依赖且候选键只有一个,符合BCNF

(6)对于return表,属性有(returnID,ISBN,readerID,date),returnid为主键,决定了哪个人借了那本书,ISBN和readerid参考了collectionofbook中的isbn,以及reader中的readerid,无非主属性对候选键的传递依赖且候选键只有一个,符合BCNF

(7)对于sell表和purchase表,属性有(sellid,ISBN,alreadysold,price)和(purchaseid,ISBN,num,price),无非主属性对候选键的传递依赖且候选键只有一个,符合BCNF

5.系统实现

5.1 系统实现环境和技术

pycharm,DataGrip,MySQL。利用Python第三方库MySQLlite来实现对MySQL数据库的操作。先在datagrip中创建好数据库和表以及触发器,再在Pycharm中编写相关系统程序。
5.2系统界面与关键代码
以下是关键几个表的创建

create table Reader(
    ReaderID int,
    ReaderName varchar(10) default '张三',
    Sex varchar(1),
    Age int default 18,
    TEL varchar(12) default NULL,
    primary key (ReaderID),
    unique (ReaderID),
    CHECK ( Sex='男' or Sex='女')
);

create table Book(
  ISBN varchar(20),
  BookName varchar(20) not null ,
  Author varchar(20) default ' ',
  Price int ,
    primary key (ISBN),
    unique (ISBN),
    check ( Price>0 )
);

create table CollectionOfBook(
    ISBN varchar(20),
    TotalNum int default 0,
    foreign key (ISBN)
        references Book(ISBN)
);
alter table collectionofbook add constraint check(TotalNum>=0);

CREATE table Employee(
    EmployeeID int primary key ,
    EmployName varchar(20),
    EmploySex varchar(1),
    EmployAge int,
    EmployTEL varchar(20),
    Salary int,
    check ( EmploySex ='男' or EmploySex = '女')
);
//创建触发器
create trigger increaseNumberOfBooks after insert on purchasebook
    for each row
    begin
        if not exists(select 1 from collectionofbook where NEW.ISBN in(select ISBN from collectionofbook)) then
            begin
       insert into CollectionOfBook(ISBN, TotalNum) VALUE (NEW.ISBN,NEW.PurchaseNum);
            end;
        else
            begin
                update CollectionOfBook set TotalNum = TotalNum+NEW.PurchaseNum
        where CollectionOfBook.ISBN = NEW.ISBN;
                end;
        end if;
    end;

create trigger decreaseNumberOfBooks after insert on sell
    for each row
    begin
        update CollectionOfBook set TotalNum = TotalNum-NEW.AlreadySold
        where  CollectionOfBook.ISBN = NEW.ISBN;
    end;

create  trigger borrowBook before insert on borrow
    for each row
    begin
        if (select TotalNum from collectionofbook where CollectionOfBook.ISBN
            = NEW.ISBN
            ) -1 >=0 then
        update collectionofbook set TotalNum = TotalNum-1 where CollectionOfBook.ISBN
        = NEW.ISBN;
        end if;
    end;

create  trigger ReturnBook before insert on returnofbook
    for each row
    begin
        update collectionofbook set TotalNum = TotalNum+1 where CollectionOfBook.ISBN
        = NEW.ISBN;
    end;
python创建类来封装操作
class BasicSqlOperation(object):
    def __init__(self):
        # 打开数据库连接
        self.db = connect(host='localhost', port=3306, charset='utf8', database='MySQL', password='zyh20000205',
                          user='root')
        # 创建游标对象
        self.cursor = self.db.cursor()
        sql = "use bookshopmanagement"
        self.cursor.execute(sql)

6.UI 界面

在这里插入图片描述
在登录界面可以选择登录级别
在这里插入图片描述
管理员登录
在这里插入图片描述
一般操作用户登录
在这里插入图片描述
操作窗口

7.GitHub地址

https://github.com/zyhsna/Database_courseDesign

8. 更新

更新于2020/12/14,修改了一些bug,对程序运行可能出现的一些错误进行了说明和修改,具体内容可见GitHub上readme

  • 42
    点赞
  • 487
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
抱歉,根据我使用的API,我无法在这个平台上提供完整的项目代码。但是,我可以提供一个基本框架,您可以根据自己的需求进行修改和实现。 #### 三层架构 在这个项目中,我们将使用三层架构:表示层、业务逻辑层和数据访问层。 - 表示层:使用PyQt5实现GUI界面,提供用户交互功能。 - 业务逻辑层:处理用户请求,调用数据访问层进行数据操作。 - 数据访问层:使用MySQL数据库进行数据的持久化操作。 #### 项目框架 1. 安装必要的库 ```python pip install PyQt5 pip install mysql-connector-python ``` 2. 创建MySQL数据库MySQL中创建一个名为`mydatabase`的数据库,并创建一个名为`students`的表,包含以下字段: - id: int - name: varchar(255) - age: int - gender: varchar(255) - major: varchar(255) 3. 创建GUI界面 使用Qt Designer创建GUI界面,并将其保存为`ui`文件。然后使用`pyuic5`工具将`ui`文件转换为Python文件。 ```python pyuic5 mygui.ui -o mygui.py ``` 4. 实现业务逻辑层 创建一个名为`student_service.py`的文件,并实现以下功能: - 获取所有学生信息 - 添加学生信息 - 修改学生信息 - 删除学生信息 ```python import mysql.connector class StudentService: def __init__(self): self.db = mysql.connector.connect( host="localhost", user="yourusername", password="yourpassword", database="mydatabase" ) self.cursor = self.db.cursor() def get_all_students(self): self.cursor.execute("SELECT * FROM students") return self.cursor.fetchall() def add_student(self, name, age, gender, major): sql = "INSERT INTO students (name, age, gender, major) VALUES (%s, %s, %s, %s)" val = (name, age, gender, major) self.cursor.execute(sql, val) self.db.commit() def update_student(self, id, name, age, gender, major): sql = "UPDATE students SET name=%s, age=%s, gender=%s, major=%s WHERE id=%s" val = (name, age, gender, major, id) self.cursor.execute(sql, val) self.db.commit() def delete_student(self, id): sql = "DELETE FROM students WHERE id=%s" val = (id,) self.cursor.execute(sql, val) self.db.commit() def __del__(self): self.db.close() ``` 5. 实现表示层 创建一个名为`myapp.py`的文件,并实现以下功能: - 连接数据库 - 显示所有学生信息 - 添加学生信息 - 修改学生信息 - 删除学生信息 ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidgetItem from mygui import Ui_MainWindow from student_service import StudentService class MyApp(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) self.student_service = StudentService() self.show_all_students() self.btn_add.clicked.connect(self.add_student) self.btn_update.clicked.connect(self.update_student) self.btn_delete.clicked.connect(self.delete_student) self.tableWidget.doubleClicked.connect(self.edit_student) def show_all_students(self): students = self.student_service.get_all_students() self.tableWidget.setRowCount(len(students)) for i, student in enumerate(students): id = QTableWidgetItem(str(student[0])) name = QTableWidgetItem(student[1]) age = QTableWidgetItem(str(student[2])) gender = QTableWidgetItem(student[3]) major = QTableWidgetItem(student[4]) self.tableWidget.setItem(i, 0, id) self.tableWidget.setItem(i, 1, name) self.tableWidget.setItem(i, 2, age) self.tableWidget.setItem(i, 3, gender) self.tableWidget.setItem(i, 4, major) def add_student(self): name = self.lineEdit_name.text() age = self.spinBox_age.value() gender = self.comboBox_gender.currentText() major = self.lineEdit_major.text() self.student_service.add_student(name, age, gender, major) self.show_all_students() def update_student(self): id = self.lineEdit_id.text() name = self.lineEdit_name.text() age = self.spinBox_age.value() gender = self.comboBox_gender.currentText() major = self.lineEdit_major.text() self.student_service.update_student(id, name, age, gender, major) self.show_all_students() def delete_student(self): id = self.lineEdit_id.text() self.student_service.delete_student(id) self.show_all_students() def edit_student(self): row = self.tableWidget.currentRow() id = int(self.tableWidget.item(row, 0).text()) name = self.tableWidget.item(row, 1).text() age = int(self.tableWidget.item(row, 2).text()) gender = self.tableWidget.item(row, 3).text() major = self.tableWidget.item(row, 4).text() self.lineEdit_id.setText(str(id)) self.lineEdit_name.setText(name) self.spinBox_age.setValue(age) self.comboBox_gender.setCurrentText(gender) self.lineEdit_major.setText(major) if __name__ == '__main__': app = QApplication(sys.argv) myapp = MyApp() myapp.show() sys.exit(app.exec_()) ``` 6. 运行程序 ```python python myapp.py ``` 7. 结束程序 ```python Ctrl+C ``` 这个项目只是一个基本框架,仅供参考。您可以根据自己的需求进行修改和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值