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

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐