图书管理系统
实验内容、步骤以及结果
做出数据流图和数据字典。
在数据流图和字典的基础上做出 E-R 图(概念结构设计)。
学生:
图书:
管理员:
汇总:
在 E-R 图基础上进行关系模式设计(至少满足 3NF)(逻辑结构设计)。
(图书一共有 4 种状态:
- 状态 0:在馆内无预订,
- 状态 1:在馆内有预订,
- 状态 2:已借出无预订,
- 状态 3:已借出有预订。)
c
Book(BookID, Title, Author, Publisher, Pyear, Category, State)
图书(书号,书名,作者,出版社,出版年,分类,状态)
c
Student(StuID, StuName, Gender, Dept, Class)
学生(学号,姓名,性别,学院,班级)
c
Librarian(LibID, LibName)
管理员(工号,姓名)
c
RBorrow(BookID, StuID, BrDate)
预借阅(书号,学号,借阅日期)
c
RRenew(BookID, StuID, RnDate)
预续借(书号,学号,续借日期)
c
RReturn(BookID, StuID, RtDate)
预归还(书号,学号,归还日期)
c
Borrow(BookID, StuID, BrDate)
借阅(书号,学号,借阅日期)
c
Renew(BookID, StuID, RnDate)
续借(书号,学号,续借日期)
c
Return(BookID, StuID, RtDate)
归还(书号,学号,归还日期)
根据需求分析中的各种数据请求得出各种视图以及各种约束、规则、触发器脚本描述。
视图:
学生的除密码外的所有信息,供管理员修改。
约束:
- 所有预订与确认的表中的所有列、书名与作者、学生与管理员姓名为非空;
- State 只能为 0、1、2、3,默认值为 0.
- 性别为"男"或"女"。
- 初始密码为"123456".
规则:
同一个人不能在一秒之内对同一本书借了还还了借。
触发器:
- 学生预借阅:判断书此时未被预订,写入预订时间,更新图书状态为已预订;
- 学生预续借:判断此书已借给相同学生且未被预订,写入续借时间;
- 学生预归还:判断此书已借给相同学生,写入归还时间;
- 管理员确认借阅:若在馆内更新相关图书状态为已借出,若已借出则更新为已预订;
- 管理员确认续借:不更新图书状态;
- 管理员确认归还:更新图书状态为在馆内。
实验中出现的问题以及解决方案(对于未解决问题请将问题列出来)
开始不会写界面程序,学习了一些 Qt 的操作与语法后逐渐写成,参考:
qmake 编译失败问题:文件路径必须为英文,不能含有中文字符。
Qt 连接 MySQL 驱动出错问题 QMYSQL driver not loaded;
**解决:**更改了 Qt 自带驱动中 libqsqlmysql.dylib 保存路径,install_name_tool -change /usr/local/mysql/lib/libmysqlclient.20.dylib /usr/local/Cellar/mysql/8.0.22_1/lib/libmysqlclient.21.dylib libqsqlmysql.dylib,Windows 中直接将 SQL 的驱动 libmysql.lib 复制粘贴到 C:\Qt\5.12.0\src\plugins\sqldrivers\mysql 即可。
尚未解决的问题:可能是全局静态变量 db 未赋初值的问题,从登录界面退出程序系统会报 L1brary quit unexpectedly。
程序从 Mac 移植到 Windows 上后界面大小不一致,加入判断屏幕分辨率改善。
开发环境(包括语言、平台、所使用数据库的名称以及版本号)
语言:C++
平台:MacOS 11.0, Qt 5.12.0, clang_64bit
Windows 10, Qt 5.12.0, MinGW_64_bit
数据库:华为云 GaussDB
ip: 139.9.119.34;
帐号:s2018303116;
密码:GaussDB@123;
数据库名:library_2018303116。
MySQL 版本号:8.0.18