数据库实验四-慈善管理系统 基于PHP MYSQL

这个实验花了我大概两个星期,期间阳了躺了好久(emo)发现网上几乎没有这个选题的例子,所以基本都是自己一点一点抠出来。。后面还要好好学前端vue之类的东西,所以PHP和MySQL要有一段时间不碰了,就浅浅记录一下叭,做到中间发现好多逻辑都有问题,数据库和表都没有完全弄懂就开始做,瞎搞搞!!外键都没加、界面贼拉......省略一大堆,最后实现个大概能跑就行嘎嘎,勿喷勿喷

更新(2024/1/21):后台挺多学弟来问的,这里就直接上github链接:https://github.com/leonwu117/MySQL_Assignment-Project.git

目录

1. 数据库的设计-创建数据库及相关表格。

2. 管理员前端界面实现(代码量很大,只展示核心代码)

3.界面的各个界面跳转和相应的增删改查功能实现

4.Mysql相关问题实现(MySQL Implementation)– 大作业要求


 

一、实验目的:

1、了解数据库设计;

2、掌握存储过程、函数、触发器的实现。

 

二、实验要求:

1、安装相关软件并浏览软件自带的帮助文件和功能菜单,

2、掌握PHP构建网页以及连接数据库的方法。

3、掌握phpmyadmin创建数据库与数据表的方法;

4、了解mysql的命令以及与php衔接的语句

5、掌握存储过程、函数的实现

6、掌握触发器的实现;

 

三、实验设备:

计算机、数据库管理系统如php,mysql 等软件。

 

四、实验内容

 

按要求完成individual project的数据库设计,MySQL Implementation 和Interface,可以按照自己的思路拓展功能。

1. 数据库的设计-创建数据库及相关表格。

创建一个名为library的数据库

并建立相关的数据表和数据:

1e2f7a63c8fd46cb8e3376b9f28752bb.png

 

 

咳嗯!!!数据库构建引擎最好选Innodb

admin-管理员登录账号和密码:id:2020910019 password:12345678

6c4c3b2d6427486db1749223708500ee.png

具体实现:

CREATE TABLE `admin` (
  `admin_id` int(11) NOT NULL,
  `password` varchar(15) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
//插入:
INSERT INTO `admin` (`admin_id`, `password`) VALUES
(2020910019, '12345678');

Charity-捐赠机构

数据库要求:

fb7458aaab0a4a8da43e65dc8613ccef.png

 

实现:

CREATE TABLE `charity` (
  `id` int(10) NOT NULL,
  `category` varchar(20) CHARACTER SET utf8mb4 NOT NULL,
  `categoryid` int(10) NOT NULL,
  `name` varchar(100) CHARACTER SET utf8mb4 NOT NULL,
  `address` text CHARACTER SET utf8mb4 NOT NULL,
  `city` varchar(100) CHARACTER SET utf8mb4 NOT NULL,
  `state` varchar(100) CHARACTER SET utf8mb4 NOT NULL,
  `zip` int(10) NOT NULL,
  `telephone` varchar(20) NOT NULL,
  `2005revenue` bigint(100) NOT NULL,
  `program` int(100) NOT NULL,
  `admin` int(100) NOT NULL,
  `fundraising` int(100) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

 

 

d55f45f6cf4f443d981809c8ab298c83.png

 

Donor-捐赠者数据库

 

要求:

cab51ec91c7041d1bb6801992aaca596.png

 

CREATE TABLE `donor` (
  `id` int(11) NOT NULL,
  `lastname` varchar(20) CHARACTER SET utf8mb4 NOT NULL,
  `firstname` varchar(20) CHARACTER SET utf8mb4 NOT NULL,
  `address` varchar(100) CHARACTER SET utf8mb4 NOT NULL,
  `city` varchar(100) CHARACTER SET utf8mb4 NOT NULL,
  `state` varchar(20) CHARACTER SET utf8mb4 NOT NULL,
  `zip` int(10) NOT NULL,
  `telephone` varchar(20) NOT NULL,
  `category` varchar(20) CHARACTER SET utf8 NOT NULL,
  `categoryid` int(10) NOT NULL,
  `charity_name` varchar(100) NOT NULL,
  `charity_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 7a9926f0f1d249f19f0221a1d414b38a.png

 

Gift- 礼物金额数据库

要求:

c9854862982d4849b53f76b9e1c2febb.png

 

实现:

CREATE TABLE `gift` (
  `donorid` int(11) NOT NULL,
  `charity_id` int(20) NOT NULL,
  `donorlastname` varchar(100) CHARACTER SET latin1 NOT NULL,
  `donorfirstname` varchar(100) CHARACTER SET latin1 NOT NULL,
  `date` date NOT NULL,
  `amount` int(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 

大概思路:每份礼物都有有一个对应的捐赠者donorid和慈善机构charityid ,捐赠者向其中一个慈善机构捐赠金额amount,并有一个时间date

11cc68f225264e6b8a1cd3dc52f185a9.png

Logs-操作日志表:

要求:

b009c5dd18f1466185e5e9b74a38f089.png

 

设计原理:基于安全原因,还需要包含操作日志的表。通过其他表上的触发器实现此表。此表描述了谁(数据库用户的登录名)在什么时间对哪个表(给出表名)和哪个元组(由元组的主键值指示)执行了什么操作(插入、删除、更新)

实现:

CREATE TABLE `logs` (
  `id` int(11) NOT NULL COMMENT '唯一标识',
  `date` datetime NOT NULL COMMENT '操作时间',
  `test` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '操作说明'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

379216d0a214480eb4b7b6f4dfb4c470.png

这里给出大概构建过程,只给出charity作为例子:

 

charity插入触发器addLogCharity:

b182d8585eba40c180ec77878b567f9e.png

Charity删除触发器deleteLogCharity:

e7e602b3c8f14c32bd22244193c5aa4b.png

Charity更新触发器updateLogCharity:

d00765a838ab4e51b3a4ad7777aba897.png

 

 

其余两个数据库表cardinfo为用户登录的账号和密码以及个人信息:

c32b213f6fea4c208491049f24d34497.png

实现:

Card:

08c800903d2b428d85db5027931662bd.png

Info

dc6e3b9b90ea4377aad5786eb9bf012d.png

 

2. 管理员前端界面实现(代码量很大,只展示核心代码)

首先做好连接数据库:

551ecb91dc684e118803ca21d66d9411.png

(1)创建管理员登录界面 (这里利用导航元素链接管理员和用户两个界面)。

创建一个面板,在其中放置两个输入框用于记录输入的用户名和密码,核心代码实现如下:

784c5e13e7174b4caa19da2a531dea42.png

然后是登入检测设置form表单的传值方式为POST。创建一个按钮嵌套在form表单,设置其响应点击事件,当发生点击事件时跳转至管理员界面并传递输入的参数,核心代码:

e9778bda0898498b82f8596dcedee27d.png

实现界面效果:

6fbc0d7e95f04f8cab02841f762c08d1.png

(2)点击登录后,会跳转至管理员界面(这里管理员账号:学号2020910019密码是12345678),并在该界面对输入的用户名和密码进行判断9859e3b9d4cc42ebb486877d0eaa6b7c.png

 

大概内容为

捐赠机构管理:管理charity数据库

捐赠者管理:管理donor数据库

操作日志管理:管理logs数据库

实现界面效果为:

e9fa57d449414b35b4efa8dc949f7e1e.png

 

主界面admin_index的实现界面效果如下

也就是刚进入管理员界面,显示管理员的账号,和显示记录了多少个慈善机构和捐赠者,这里起码都有20个以上,达到每个表都超过20条数据以上

d4ce6f6f139144d3bfd1888591680d79.png

核心代码:

6d933712b51e45f9a63e83594a9308ba.png

实现效果为:

5461b8f48ad641d1a2e46d2649a02a59.png

 

 

若用户名或密码错误,则会返回相应的出错信息并返回如上所示的登录界面:

 

1db4330cfa064c8cbf60df432c6ca64d.png

至此登录界面实现完毕。

 

3.界面的各个界面跳转和相应的增删改查功能实现

导航栏核心代码:

0b78823b1d0e494ca1066a7fe14e7c60.png

 

然后是捐赠机构管理页面:

核心部分代码admin_charity:

09682e0037274277aecedf73da84ea9c.png

界面这块随便弄弄,看过其他人的界面是真的又潮流又有新意,我是渣渣,,,

 

界面实现效果:

4bd5cd3677104cc19331156887feccc2.png

实现基本的增删改查功能:

增加新的机构

核心代码admin_charity_add:

9c60cd1a75084a028e2ffae2b79ab5ac.png

实现界面效果:

da661e7f5f124fae94fde4092dcbf45b.png

插入成功:

d2d5d6b327c841ef9d86583e4f097425.png

可以看得到数据库也插入成功

1fc3e81334854f459d08a49100344cf3.png

 

修改机构信息

核心代码admin_charity_edit:

2847c631220948afa83b560d41685653.png

实现界面效果:

e0d8af095f5245d2a61a044d5fa69aee.png

可以看得到数据库修改成功

b8796f66b42a4afcb4183416c36b41cc.png

 

b05070885da241d0a577a6a158b16dfa.png

删除机构

核心代码admin_charity_del:

88aaff9dfa794d83aeb6b14ac5ce9614.png

实现效果:

9e3b4b8799c64600844c5f5ed56eaebf.png

可以发现已经从数据库删除了数据:

f8786dd8d60b452f823fb8d3fba7c096.png

最后是机构的查询操作

核心代码:

Mysql语句

fecd8f2ef7db4da0b45dac9ff1699252.png

 

核心实现代码

18c651a8bb574d7ba4b00d95944c44e8.png

具体实现效果:

c3cb13580e9848879163c101d3955b49.png

最后可以看到已经按照名字“care”筛选出来charity数据库信息

1799888e41674736872bd3ee07f3c146.png

其他表donor、gift也是相似,就不多做讲述了,,毕竟完整的文档我做了40多页

除此以外管理捐赠者里面还多了一看查看每个捐赠者id对应的捐赠记录:

核心代码admin_person_gift:

bc7d03a3cbf04c808c1c234e5077779a.png

每条礼物记录都有相应的donorid和charity_id,对应着所在的哪个捐赠者和慈善机构,并捐赠了多少金额amount:

7ac651d9a782458d86224362ecfb3246.png

 

现在来查看id为171的捐赠者:

3999b98c6ae0490f9e99c07f88b57a99.png

然后查看捐赠记录:

711e5bd5314744269d741d9af9731050.png

可以看到点击进去有对应的捐赠者id,和姓名、时间,以及捐赠的金额

最后界面实现效果如下:

6b8ff35480f9410890ef4ddd14cb3345.png

再转换到用户管理界面,也是基本的实现方式:

首先登入用户(账户:111 密码:111111)

6d076754c8f54c0582bfefc4e055144a.png

用户管理主界面

核心代码如下:

4c1b92250d964ec291ae2d25461c8333.png

实现界面效果如下:

1cbaf0e9ce584e058c731830c335af29.png

 

这里主要讲的是进入捐赠操作,每个用户可以选择一个慈善机构进行捐赠金额,并相对应地会在管理员的捐赠记录看到每个用户的捐赠记录更新

1cc749297ffd4882a946828bc32c12cd.png

这里对donor id为234的捐赠者进行捐赠操作,显示出捐赠者的id号和捐赠者姓名6bb537b67a2d4d3086d53ed06669fd08.png

这里可以选择对某一个慈善机构进行捐赠一定的金额

b8c62dfbb5fe434ea4cdc7e5a3ebf3b3.png

捐赠成功!!

195881addfe140d886af164b3adcaf33.png

然后回到管理员界面的捐赠记录查看donor id为234的捐赠者捐赠记录

9d9d7b7469e8464f8d980b623c9829fb.png

点击记录进去就可以看到234捐赠者新增了捐赠记录

 

 

9ecda7fe05b04fa7bd79bc508d67621a.png

核心代码admin_gift_add1如下:

c027a6c32a9b423282777e42039a9abc.png

如果出现礼物记录有条错误不存在的捐赠者,会出现捐赠失败,显示信息不匹配

这里可以检查一下捐赠者记录

 

abed6be7fc2340fe8d7245a7bea64ef1.png

在个人捐赠管理可以看到donor id为12的捐赠者并没有出现在捐赠者管理数据库里

 

 

b9b8fda1d27d45aeb8aff42d2e1ef021.png

如果对它进行捐赠和修改,会返回错误信息:身份信息不匹配

捐赠礼物:

1322cdcdaf474538b8dc2448b76cc143.png

有良好的的异常检测处理,会输出报错信息

至此完成了捐赠功能。

 

比较重要的部分来啦,也是整个实验占分最多的地方,mysql query问题实现,这个考量的是有没有认真学习mysql语句,能跑出来,但素不一定正确,仅供参考

 

4.Mysql相关问题实现(MySQL Implementation)– 大作业要求

详细的运行结果和解决方案如下:

You need to create five queries and give a presentation as outlined in the Background section of this case. 

(1)(6 points) Create a query called Charities rated by Program Expenses. This query should list the Charity Name, Address, City, State, Zip, and Program Expenses. List the highest Program Expenses for the charity to the lowest.

 

这里简陋做个功能栏,如下

a38d4a3bc34243ccb746b4d9aba26e1f.png

 

按项目费用program进行排序慈善机构信息

核心代码 mysql实现:

f4810ee0282a4b4aa6a50504dffe2466.png

实现界面效果如下:

按照program费用从高到低进行排序

549a62ba72e44fcb896788aef224b2e2.png

(2)(6 points) Create a query called Donors by Requested Category. List the Category, Donor Last and First Names, Street Address, City, State, Zip, and Telephone. Your query should prompt for a category and allow the user to enter the desired category

b2773e149193438587b00e464306e3a6.png

实现核心代码admin_donor_category:

cf294679b386442fb7f53b7b5052198f.png

实现界面效果:

可以看到是按照类别category作为首选项

并有捐赠者的一些相关信息打印出来

可以根据类别去进行查询,会筛选出来

bf2d61d869a84cb2aa70ffc496779fd4.png

 

(3)(6 points) Create a query called Top Giver of Requested Charity. Display the Charity ID, Charity Name, Donor Last and First Names, and Total amount given. This query should prompt for a desired Charity ID. Keep in mind that some donors give more than once, but you want to display the total amount given. Also, your output needs to be sorted from top giver to lowest giver. Note the change to the column heading. 

核心代码admin_charity_top: 

33450a05cad74923b0d3b9b5fde270e2.png

 

实现界面效果:

可以看到慈善机构的id和名字、以及捐赠者的姓名和总捐赠金额

28b6ea0133814f73b059a4d467a25603.png

可以再查看charity数据库中匹配的捐赠者的信息是否对得上

2d46a3a33e90489e8c3ad51a50922fd3.png

 

然后再确认捐赠者的姓名,可以看到捐赠最多的捐赠者是Hunter Craig

 

ef68a725f3754ec194aa9feea0345398.png

然后这里再查看捐赠者id为101 姓名为Hunter Craig的捐赠记录,看到总捐赠金额是300060,跟第一个顶级捐赠者信息记录对得上!

8469f32cac724eef84a887dd44ea1d8a.png

至此顶级捐赠者功能介绍完毕。

 

(4)(6 points) Create a query called Frequency of Giving by Donor. List the Donor Last and First Names, the Number of Gifts, and the Average Gift. Sort alphabetically on Donor Last Name. Note the column headings’ changes.

捐赠者捐赠频率核心代码admin_donor_fre: 

52980ff9184b4325b949d6749bf3966a.png

最终的界面实现效果为:

可以看到每个donor的捐赠次数(frequency)和平均捐赠金额(averge gifts)

 3160c71b05514506bc8bebac08e20f85.png

 

这里可以选择第一个名为wuwu leon捐赠者的捐赠记录进行查看,确认捐赠次数是否正确

9aa5db141602477d8a44af3e0c6c2ba4.png

点进去记录查看:

可以发现wuwu leon 捐赠者共有两条捐赠记录,跟上面的捐赠频率2次对得上

 4e087cbfc30d420da071b929990bbf89.png

第五个乱来的 不过还是大概弄出来了 (实在没看懂它的要求)和第六个没能实现

(5)(6 points) Create a query called Matching Gifts that displays the Charity Name, Date, and Amount, and then calculate the Matched amount and the Total Donation. Recall that an anonymous donor is willing to match 50 cents on every dollar donated to the Food for the Hungry charity. 

 

59e3eb64bb2c43f5a97a5b62c2713476.png

 

 

核心代码admin_match_gift

以及相关的mysql实现如下:

ebe41de9229b4f10b41a0be65890d2e1.png

实现界面效果:

可以看到有相应的慈善机构名字、时间、金额、金额匹配以及总的捐赠金额

9c0efed4c90940b894d7bd867809a500.png

(7)(8 points) Add a tuple to the logs table automatically whenever any table is modified. You are suggested implement this table by triggers on other tables. This tuple describes who (the login name of a database user) has performed what operation (insert, delete, update) on which table (give the table name) and which tuple (as indicated by the value of the primary key of the tuple) at what time. You should also record both the updated value and the previous value.

具体实现触发器进行插入、删除和更新,并把相关操作记录插入到logs表中

Donor表:

846612df71ac4953aa664c231be90e56.png

 

首先来看看donor插入触发器AddLogDonor具体实现语句

CREATE TRIGGER `addLogDonor` AFTER INSERT ON `donor`

 FOR EACH ROW insert into `logs` value (new.id,NOW(),concat(new.lastname,new.firstname,'在',NOW(),'对donor表的id为',new.id,'执行了插入操作'))

 

再来看看donor更新触发器updateLogDonor具体实现语句

CREATE TRIGGER `updateLogDonor` AFTER UPDATE ON `donor`

 FOR EACH ROW insert into `logs` value (id,NOW(),concat(new.lastname,new.firstname,'在',NOW(),'对donor表的id为',new.id,'执行了更新操作'))

 

最后再查看donor删除触发器deleteLogDonor具体实现语句

CREATE TRIGGER `deleteLogDonor` AFTER DELETE ON `donor`

 FOR EACH ROW insert into `logs` value (id,NOW(),concat(old.lastname,old.firstname,'在',NOW(),'对cdonor表的id为',old.id,'执行了删除操作'))

 

其他表的触发器也是类似的设计和实现

Charity表:

09b4ca820bd142ca840129ebba4f8b1f.png

 

Gift表:

cd2e6d199e744f599354b8cc905ae483.png

 

然后再来看看具体页面

核心代码:

6e99b1fbec29432fa9942533b99b089e.png

 

实现的界面效果如下:

 91073f6cdac94706bc1ac0c045e8749b.png

 

可以看到logs中的各个表的触发器都在工作,例如插入、删除以及更新操作的记录都被打印出来

3e30a7da3ff046d6bbe73c36b9c4a558.png

至此操作日志表实现了 - 元组描述谁(数据库用户的登录名)在什么时间对哪个表(给出表名)和哪个元组(由元组的主键值指示)执行了什么操作(插入、删除、更新)

 

结语 - 还有其他的实现功能 密码修改、查看个人信息等就不展示了。之后如果有需求再开源 放github或者网盘

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值