这个实验花了我大概两个星期,期间阳了躺了好久(emo)发现网上几乎没有这个选题的例子,所以基本都是自己一点一点抠出来。。后面还要好好学前端vue之类的东西,所以PHP和MySQL要有一段时间不碰了,就浅浅记录一下叭,做到中间发现好多逻辑都有问题,数据库和表都没有完全弄懂就开始做,瞎搞搞!!外键都没加、界面贼拉......省略一大堆,最后实现个大概能跑就行嘎嘎,勿喷勿喷
更新(2024/1/21):后台挺多学弟来问的,这里就直接上github链接:https://github.com/leonwu117/MySQL_Assignment-Project.git
目录
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的数据库
并建立相关的数据表和数据:
咳嗯!!!数据库构建引擎最好选Innodb
admin-管理员登录账号和密码:id:2020910019 password:12345678
具体实现:
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-捐赠机构
数据库要求:
实现:
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;
Donor-捐赠者数据库
要求:
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;
Gift- 礼物金额数据库
要求:
实现:
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
Logs-操作日志表:
要求:
设计原理:基于安全原因,还需要包含操作日志的表。通过其他表上的触发器实现此表。此表描述了谁(数据库用户的登录名)在什么时间对哪个表(给出表名)和哪个元组(由元组的主键值指示)执行了什么操作(插入、删除、更新)
实现:
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;
这里给出大概构建过程,只给出charity作为例子:
charity插入触发器addLogCharity:
Charity删除触发器deleteLogCharity:
Charity更新触发器updateLogCharity:
其余两个数据库表card和info为用户登录的账号和密码以及个人信息:
实现:
Card:
Info
2. 管理员前端界面实现(代码量很大,只展示核心代码)
首先做好连接数据库:
(1)创建管理员登录界面 (这里利用导航元素链接管理员和用户两个界面)。
创建一个面板,在其中放置两个输入框用于记录输入的用户名和密码,核心代码实现如下:
然后是登入检测,设置form表单的传值方式为POST。创建一个按钮嵌套在form表单,设置其响应点击事件,当发生点击事件时跳转至管理员界面并传递输入的参数,核心代码:
实现界面效果:
(2)点击登录后,会跳转至管理员界面(这里管理员账号:学号2020910019密码是12345678),并在该界面对输入的用户名和密码进行判断
大概内容为
捐赠机构管理:管理charity数据库
捐赠者管理:管理donor数据库
操作日志管理:管理logs数据库
实现界面效果为:
主界面admin_index的实现界面效果如下
也就是刚进入管理员界面,显示管理员的账号,和显示记录了多少个慈善机构和捐赠者,这里起码都有20个以上,达到每个表都超过20条数据以上
核心代码:
实现效果为:
若用户名或密码错误,则会返回相应的出错信息并返回如上所示的登录界面:
至此登录界面实现完毕。
3.界面的各个界面跳转和相应的增删改查功能实现
导航栏核心代码:
然后是捐赠机构管理页面:
核心部分代码admin_charity:
界面这块随便弄弄,看过其他人的界面是真的又潮流又有新意,我是渣渣,,,
界面实现效果:
实现基本的增删改查功能:
增加新的机构
核心代码admin_charity_add:
实现界面效果:
插入成功:
可以看得到数据库也插入成功
修改机构信息
核心代码admin_charity_edit:
实现界面效果:
可以看得到数据库修改成功
删除机构
核心代码admin_charity_del:
实现效果:
可以发现已经从数据库删除了数据:
最后是机构的查询操作
核心代码:
Mysql语句
核心实现代码
具体实现效果:
最后可以看到已经按照名字“care”筛选出来charity数据库信息
其他表donor、gift也是相似,就不多做讲述了,,毕竟完整的文档我做了40多页
除此以外管理捐赠者里面还多了一看查看每个捐赠者id对应的捐赠记录:
核心代码admin_person_gift:
每条礼物记录都有相应的donorid和charity_id,对应着所在的哪个捐赠者和慈善机构,并捐赠了多少金额amount:
现在来查看id为171的捐赠者:
然后查看捐赠记录:
可以看到点击进去有对应的捐赠者id,和姓名、时间,以及捐赠的金额
最后界面实现效果如下:
再转换到用户管理界面,也是基本的实现方式:
首先登入用户(账户:111 密码:111111)
用户管理主界面
核心代码如下:
实现界面效果如下:
这里主要讲的是进入捐赠操作,每个用户可以选择一个慈善机构进行捐赠金额,并相对应地会在管理员的捐赠记录看到每个用户的捐赠记录更新
这里对donor id为234的捐赠者进行捐赠操作,显示出捐赠者的id号和捐赠者姓名
这里可以选择对某一个慈善机构进行捐赠一定的金额
捐赠成功!!
然后回到管理员界面的捐赠记录查看donor id为234的捐赠者捐赠记录
点击记录进去就可以看到234捐赠者新增了捐赠记录
核心代码admin_gift_add1如下:
如果出现礼物记录有条错误不存在的捐赠者,会出现捐赠失败,显示信息不匹配
这里可以检查一下捐赠者记录
在个人捐赠管理可以看到donor id为12的捐赠者并没有出现在捐赠者管理数据库里
如果对它进行捐赠和修改,会返回错误信息:身份信息不匹配
捐赠礼物:
有良好的的异常检测处理,会输出报错信息
至此完成了捐赠功能。
比较重要的部分来啦,也是整个实验占分最多的地方,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.
这里简陋做个功能栏,如下
按项目费用program进行排序慈善机构信息
核心代码 mysql实现:
实现界面效果如下:
按照program费用从高到低进行排序
(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
实现核心代码admin_donor_category:
实现界面效果:
可以看到是按照类别category作为首选项
并有捐赠者的一些相关信息打印出来
可以根据类别去进行查询,会筛选出来
(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:
实现界面效果:
可以看到慈善机构的id和名字、以及捐赠者的姓名和总捐赠金额
可以再查看charity数据库中匹配的捐赠者的信息是否对得上
然后再确认捐赠者的姓名,可以看到捐赠最多的捐赠者是Hunter Craig
然后这里再查看捐赠者id为101 姓名为Hunter Craig的捐赠记录,看到总捐赠金额是300060,跟第一个顶级捐赠者信息记录对得上!
至此顶级捐赠者功能介绍完毕。
(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:
最终的界面实现效果为:
可以看到每个donor的捐赠次数(frequency)和平均捐赠金额(averge gifts)
这里可以选择第一个名为wuwu leon捐赠者的捐赠记录进行查看,确认捐赠次数是否正确
点进去记录查看:
可以发现wuwu leon 捐赠者共有两条捐赠记录,跟上面的捐赠频率2次对得上
第五个乱来的 不过还是大概弄出来了(实在没看懂它的要求)和第六个没能实现
(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.
核心代码admin_match_gift
以及相关的mysql实现如下:
实现界面效果:
可以看到有相应的慈善机构名字、时间、金额、金额匹配以及总的捐赠金额
(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表:
首先来看看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表:
Gift表:
然后再来看看具体页面
核心代码:
实现的界面效果如下:
可以看到logs中的各个表的触发器都在工作,例如插入、删除以及更新操作的记录都被打印出来
至此操作日志表实现了 - 元组描述谁(数据库用户的登录名)在什么时间对哪个表(给出表名)和哪个元组(由元组的主键值指示)执行了什么操作(插入、删除、更新)
结语 - 还有其他的实现功能 密码修改、查看个人信息等就不展示了。之后如果有需求再开源 放github或者网盘