1、实验目的
设计并实现一个精简的图书管理系统,要求具有图书入库、查询、借书、还书、借书证管理等功能。
2、实验平台
- WAMP
- win 10
- mysqli
3、系统需求分析
基本数据对象
- 书(书号、类别、书名、出版社、年份、作者、价格、总藏书量、库存)
- 借书证(卡号、姓名、单位、类别(学生/教师))
- 管理员(管理员ID,密码,姓名,联系方式)
- 结束记录(书号、借书证号、借期、还期、经手(管理员id))
基本功能模块
管理员登录
输入管理员ID, 密码; 登入系统 或 返回ID/密码 错误.
图书入库
- 单本入库
- 批量入库 (方便最后测试)
图书信息存放在文件中, 每条图书信息为一行. 一行中的内容如下
( 书号, 类别, 书名, 出版社, 年份, 作者, 价格, 数量 )
Note: 其中 年份、数量是整数类型; 价格是两位小数类型; 其余为字符串类型
Sample:
( book_no_1, Computer Science, Computer Architecture, xxx, 2004, xxx, 90.00, 2 )
图书查询
要求可以对书的 类别, 书名, 出版社, 年份(年份区间), 作者, 价格(区间) 进行查询. 每条图书信息包括以下内容:
( 书号, 类别, 书名, 出版社, 年份, 作者, 价格, 总藏书量, 库存 )
可选要求: 可以按用户指定属性对图书信息进行排序. (默认是书名)
借书
- 输入借书证卡号
显示该借书证所有已借书籍 (返回, 格式同查询模块) - 输入书号
如果该书还有库存,则借书成功,同时库存数减一。
否则输出该书无库存,且输出最近归还的时间。
还书
1.输入借书证卡号
显示该借书证所有已借书籍 (返回, 格式同查询模块)
2.输入书号
如果该书在已借书籍列表内, 则还书成功, 同时库存加一.
否则输出出错信息.
借书证管理
增加或删除一个借书证.
4、系统设计
4.1 总体设计
采用简单粗暴的MV(视图-模型)这一系统模型,在视图端(浏览器)发送请求,服务器处理这一请求并返回数据,视图接受数据并显示到视图中。
4.2 数据库表结构设计
表定义
create table book
(
bno char(8),
category char(10),
title varchar(40),
press varchar(30),
year int,
author varchar(20),
price decimal(7,2),
total int,
stock int,
primary key(bno)
);
create table card
(
cno char(7),
name varchar(10),
department varchar(40),
type char(1),
primary key(cno),
check (type in ('T','S'))
);
create table admin
(
admin_id char(20),
password char(20),
name char(20),
email char(30),
primary key(admin_id)
);
create table borrow
(
cno char(7),
bno char(8),
borrow_date date,
return_date date,
done_by char(20),
foreign key (bno) references book(bno) on delete cascade,
foreign key (cno) references card(cno) on update cascade
);
但是,mysql的check是无用的,使用触发器来实现check功能:
DELIMITER $$
create trigger type_check_triger before insert on card
for each row
begin
if(new.type not in ('T','S'))
then
signal sqlstate '04922'
set message_text = "ERROR: card type not in ('T','S')";
end if;
end $$
DELIMITER ;
4.3 管理员登录模块
首先进入主页,选择(管理员/查询)这两个功能之一。由于普通用户只能进行查询功能,就不需要它们登录了。
这里使用的是html的radio表单:
<form method="post"
action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>">
<input type="radio" name="q" value="admin">ADMIN
<input type="radio" name="q" value="user">USER
<input type="submit" value=" OK ">
<span class="error" style="color:brown"> <?php echo $choseerror;?></span>
</form>
php脚本根据表单提交选择用户查询界面或者登录界面:
<?php
$choseerror="";
$chose="";
if($_SERVER["REQUEST_METHOD"] == "POST"){
if(empty($_POST['q'])){
$choseerror = "必须选择访问身份";
} else {
$chose=$_POST['q'];
if($chose=="admin"){
header("location:login.php");
}else{
header("location:query.php");
}
}
}
?>
登录界面如下图:
选择admin身份,进入登录界面,输入账号和密码:
这个初始的账号是我在创建数据库的时候创建的:
在登录界面的login.php
中,首先和数据库建立连接,这里我使用了mysqli这个mysql拓展来连接。在连接的过程中有一点要注意的是,由于wamp默认了mariadb,所以你在连接的时候要指定mysql服务器的端口号。我就是在连接时找不到我创建的book
数据库,然后在这了卡了很久。
<?php
$server_name="localhost";
$username="root";
$password="qazwsx";
$dbname="book";
$conn = new mysqli($server_name,$username,$password,$dbname,'3308');
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
?>
之后再从book数据库中,select
看看是否有表单输入的账户id和pwd,按情况分别处理:
include 'connect.php';
$id=$_POST['account'];
$pwd=$_POST['password'];
$sql_query="select * from admin where admin_id='".$id."' and password = '".$pwd."'";
$sql=$conn->query($sql_query);
$info=mysqli_fetch_array($sql);
if($info==false){
$loginerror