Skip to content

David-deng-yeah/Leasing-Luxury-DataBaseSystem

Repository files navigation

this is a repository about the database system final assignment (很傻逼,但是当时没时间了[向晚_投降])

实验环境

PHP == 5.5.12

Mysql == 15.6.17

Operate system == Win 10 professtion

Node.js == 14.17.3

数据库架构介绍

在这里插入图片描述

! 图一为数据库的整体架构,分为前端主页面、后端php、数据库。前端主页面由一个index.html文件组成,分别提供了“展示可借的商品“,”个人已借的商品目录“,”所有数据表的信息“,”其他数据库功能“页面的重定向信息,后端由php编码,负责租借金额计算逻辑、数据库交互等功能;数据库使用mysql,编写了一系列存储过程、触发器与后端进行交互

建立数据库

数据库一共建立了三张表

  • Bags商品表
  • Customer用户信息表
  • Rentals交易表 下列为表的字段和主键
create table bags(  
    bag_id int not null,  
    names varchar(15),  
    Color varchar(15),  
    Manufacturer varchar(15),  
    Price float not null,  
    nums int not null,  
    primary key(bag_id)  
);  

在这里插入图片描述

create table customer(  
    customer_id int not null auto_increment,  
    first_name varchar(15),  
    last_name varchar(15),  
    phone varchar(15),  
    creditID varchar(15),  
    emailAdd varchar(15),  
    regularAdd varchar(15),  
    primary key(customer_id),  
    unique(creditID)  
);  

在这里插入图片描述

create table rentals(  
    rentals_id int not null auto_increment,  
    customer_id int not null,  
    DateRent Date,  
    DateReturn Date,  
    Insurance boolean,  
    bag_id int not null,  
    ReturnOP varchar(15),  
    foreign key(bag_id) references bags(bag_id),  
    foreign key(customer_id) references customer(customer_id),  
    -- 不会有人同一天借同一个包,所以可以唯一表示一条交易记录  
    primary key(rentals_id,customer_id, DateRent, bag_id),  
    unique(rentals_id, customer_id, DateRent, bag_id)  
);  

在这里插入图片描述

租借操作

进入主界面,点击可借商品目录 在这里插入图片描述

找到一条记录,进行租借操作 在这里插入图片描述

输入用户信息,进行租借 在这里插入图片描述

操作成功,成功租借了商品 在这里插入图片描述

去交易表rentals进行确认 在这里插入图片描述

查看用户的个人已借商品目录进行查看 在这里插入图片描述

进入页面之后,可以输入用户id进行查询 在这里插入图片描述

查询得到结果,此时我们可以发现多了一条租借记录,这表示我们的租借操作成功了 在这里插入图片描述

归还商品操作

我们进入个人已借商品目录,可以发现上面(租借包)的记录已经被添加到了个人目录下,我们可以点击归还按钮进行 在这里插入图片描述

我们可以发现归还操作成功了,并且归还时还计算了用户应该支付多少钱 计算金额的php逻辑如下

//计算花费金额  
$DateReturn = strtotime($DateReturn);  
$DateRent = strtotime($DateRent);  
$diffTime = round(($DateReturn-$DateRent)/3600/24);  
$money_toPay = $diffTime*$Price;  
//保险费  
if($Insurance == 1){  
    $money_toPay = $money_toPay + $diffTime;  
}  
  
echo '<script>alert("归还成功,花费'.$money_toPay.'");window.location.href=document.referrer;</script>';

在这里插入图片描述

归还之后,我们发现用户的个人租借页面上少了一条记录,这说明我们的归还操作成功了 在这里插入图片描述

归还商品后,我们观察交易表rentals,可以发现新插入了一条return记录,这代表着我们完成了一次归还操作;我们还发现了之前的租借记录的操作类型由rent变为了down,这说明我们的交易有借有还,可以结束了(down) 在这里插入图片描述

我们再去观察商品表bags,可以发现商品的数量恢复为1了

在这里插入图片描述

功能一 根据制造者姓名查询包的表

首先了我们进入对应的功能区,输入要查询的制造者的姓名,点击查询 在这里插入图片描述

观察查询结果,可以发现与题目给出的案例相同,我们完成了一次查询

在这里插入图片描述

功能二 查找最佳用户

首先我们进入功能区,点击查询 在这里插入图片描述

可以发现弹出了最佳用户的表,和题目给出的样例相同 在这里插入图片描述

功能三 计算每个用户的租借记录和花费

首先我们进入功能区,输入用户id,进行查询 在这里插入图片描述

之后经过查询和计算,页面上显示了用户的消费计算,和题目给出的样例相同 在这里插入图片描述

功能四 添加交易记录和添加商品

首先我们进入报表功能区,这里记录了所有的报表,我们点击进入bags表,添加商品 在这里插入图片描述

我们在空格处输入我们想插入的商品信息,点击插入按钮 在这里插入图片描述

我们可以发现添加商品的操作成功了 在这里插入图片描述

为了验证商品是否添加成功,我们进入商品表页面。 可以发现在表的底部插入了一条数据,这就是我们所添加的商品 在这里插入图片描述

功能五 归还商品操作

归还商品时,计算总的花费金额

下面这部分代码,实现了计算总的花费金额

//计算花费金额  
$DateReturn = strtotime($DateReturn);  
$DateRent = strtotime($DateRent);  
$diffTime = round(($DateReturn-$DateRent)/3600/24);  
$money_toPay = $diffTime*$Price;  
//保险费  
if($Insurance == 1){  
    $money_toPay = $money_toPay + $diffTime;  
}  
  
echo '<script>alert("归还成功,花费'.$money_toPay.'");window.location.href=document.referrer;</script>';  

通过将两个time对象进行相减并进行规整化,我们得到了用户租借的天数,我们将之乘以商品的每天租借所需花费的价格,在根据保险类型添加保险费用,最后便得到了所需的cost,并通过JavaScript弹窗的形式弹出

归还商品时,恢复商品数量

这里我是实现了一个触发器trigger,当交易表发生插入时被触发

  • 如果sql得到的最新插入的记录为 归还记录,就将对应bag_id的商品数量加一
  • 如果sql得到的最新插入的记录为 租借记录,就将对应bag_id的商品数量减一
use finalassign;  
drop trigger if exists trigger_return;  
  
DELIMITER //    
create trigger trigger_return  
after insert on rentals for each row  
begin  
    -- 触发器的类型:1.insert归还记录 2.insert租借记录  
    declare types varchar(15);  
    -- 获取归还的商品id等属性  
    declare id int;  
  
    select bag_id, ReturnOP   
    into id, types  
    from rentals  
    order by rentals_id desc limit 1;  
    -- 根据触发器类型,更新商品数量  
    if types = 'rent' then  
        update bags  
        set nums = nums - 1  
        where bag_id = id;  
    else   
        update bags  
        set nums = nums + 1  
        where bag_id = id;  
    end if;  
      
end //  
DELIMITER ;  

功能六 异常检测

异常用户id

在输入用户id时,如果输入的是不合法的用户id,就会进行报错 在这里插入图片描述

如下图所示,发生了报错,错误被停止 在这里插入图片描述

代码的逻辑

//异常检测------------------  
$tmp_sql = 'select * from customer where customer_id = "'.$customerID.'"';  
$tmp_res = mysqli_query($conn, $tmp_sql);  
if(mysqli_num_rows($tmp_res)==0){  
    echo '<script>alert("操作失败,不存在的用户id");window.location.href=document.referrer;</script>';  
    die("customerID is uncorrect");  
}  
//异常检测------------------  

异常日期

在输入异常日期是,通过正则表达式来检验日期是否合法,不合法的输入会产生报错 在这里插入图片描述

报错如下图所示 在这里插入图片描述

代码逻辑

if(! preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$DateReturn)){  
    echo '<script>alert("操作失败,日期不正确");window.location.href=document.referrer;</script>';  
    die("date is uncorrect");  
}  

异常保险类型

在输入保险类型时,如果输入的是不合法的保险类型,就会进行报错 在这里插入图片描述

报错如下图所示

在这里插入图片描述

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages