写在前面
这是我的一个答辩项目,我通过对一些开源项目的学习,进一步规范自己的编程开发思想,使其更加系统化,流程化,模块化。本系统若有不足之处,还请指正。
PHP项目开发标准流程
这是我经过大致梳理出来的流程,详细内容还需往后融会贯通。
- 需求分析
- 系统分析
- 系统目标
- 系统功能结构
- 业务逻辑结构*
- 确定开发环境
- 文件夹结构设计
- 数据库设计
- 数据库分析
- 根据系统分析和系统功能结构,规划出本系统的数据库实体关系E-R图
- 创建数据库和数据表
- 编写数据库连接文件
- 模块化编程
- 开发总结
知识点
以下仅列出本系统较为重要的知识点:
- PHP表单实现数据的收集
- PHP-Cookie和Session的使用
- PHP - AJAX数据库
- PHP与MySQL的连接及SQL语句的预处理
项目实现及详细设计
宿舍管理系统功能思维导图:
详细设计
前端使用的技术
- Jquery
- AOS Animate On Scroll Library 滚动动画库
- Bulma CSS框架
- Font awersome 字体和图标的库
- JavaScript
后端使用的技术
- PHP
数据库设计
源码解析
1.在前端方面我主要用了上面所提到的主要技术,具体使用方法可以去CSDN网站找,页面设计参考的网站是来自gitee上的不同前端系统。
2.在后端方面我则是运用PHP语言对信息的交互处理进行设计,这是我的项目目录。
系统首页public
系统首页主要包含用户登录,修改密码,退出账号等页面。
登录页面主要提供学生、老师、宿管等不同用户的登录。
主要功能实现为用户输入用户名,密码,验证码,并选择自己的用户身份进行登录系统。
主要代码如下:login.php
if($_POST){
require './_share/_pdo.php';
$account=$_POST['account'];
$pwd=$_POST['pwd'];
$captch=$_POST['captch'];
$type=$_POST['type']; //用户类型
if(strtolower($captch)==strtolower($_SESSION['captcha'])){
//strtolower函数将string中所有的字母字符转换为小写并返回
$type=$_POST['type'];
if(!empty($account)&&!empty($pwd)&&!empty($type)){
//登录后获取用户信息
$sql="select * from t_$type where account='$account' and pwd='$pwd'";
$result=$pdo->query($sql);
$row=$result->fetch();
$id=$row['id'];
$name=$row['name'];
$sex=$row['sex'];
if(!empty($id)){
$_SESSION['user_id']=$id;
$_SESSION['user_account']=$account;
$_SESSION['user_type']=$type;
$_SESSION['user_name']=$name;
$_SESSION['user_sex']=$sex;
header("Location: ../$type/home.php"); //
}else{
$pwd=null;
$msg="您输入的账号或密码有误,请重试";
}
}
}else{
$msg="您输入的验证码有误,请重试";
}
}
对于所有用户都提供修改密码功能。我的思路是通过获取旧密码判断用户输入的旧密码是否正确,是否与新密码相同,而后再通过sql语句更新数据库中的密码,这里要注意不同用户类型。
具体代码如下:changepwd.php
if(isset($_SESSION['user_id'])&&isset($_SESSION['user_type'])){
$user_name=$_SESSION['user_name'];
$user_id=$_SESSION['user_id'];
$user_type=$_SESSION['user_type'];
if($_POST){
$old_pwd=$_POST['old_pwd'];
$new_pwd=$_POST['new_pwd'];
$check_pwd=$_POST['check_pwd'];
if($new_pwd!=$check_pwd){
$msg="两次输入的新密码不一致,请核对";
}else{
require './_share/_pdo.php';
//判断用户输入的旧密码是否正确
$sql="select pwd from t_$user_type where id=$user_id";
$result=$pdo->query($sql);
$pwd=$result->fetch()['pwd'];
if($old_pwd!=$pwd){
$msg="您输入的旧密码有误,请核对";
}else if($new_pwd==$pwd){
$msg="旧密码不能与新密码相同";
}else{
$sql="update t_$user_type set pwd='$new_pwd'";
if(!$pdo->query($sql)){
exit("密码修改失败,请重试。".$stmt->errorInfo());
}
echo "<script>alert('新密码设置成功。');</script>";
}
}
}
}else{
//如果用户未登录,跳转到登录界面
header("Location: ./logout.php");
}
退出账号则是将PHP session变量都设置为null,并重定向到登录页面。具体代码如下:logout.php
<?php
session_start();
$_SESSION['user_id']=null;
$_SESSION['user_account']=null;
$_SESSION['user_type']=null;
$_SESSION['user_name']=null;
$_SESSION['user_sex']=null;
$_SESSION['dorm_id']=null;
$_SESSION['dorm_building']=null;
$_SESSION['dorm_number']=null;
header('Location: ./login.php');
?>
设计完我的系统首页后,就准备对每个用户的功能进行代码实现,在过程中应该要注意不同用户之间不同功能的交互。
管理页面Admin
在admin目录下,共有12个页面,由于篇幅所限这里主要讲部分重要PHP代码及其原理思路以及如何与前端页面进行交互。
- dorm_detail
- dorm
- exchange_detail
- exchange
- home
- leave
- maintain_detail
- maintain
- student_detail
- student
- violation_add
- violation
dorm_detail和dorm
这两个页面主要实现对宿舍信息的查看和如何向宿舍添加删除学生和设置宿舍长的功能。思路:使用sql语句获取宿舍详细信息,并实现上述功能。
具体代码如下:
$sql="select a.id,building,number,bed,sex,count from t_dorm as a
join (select count(b.id) as count,c.id from t_student_dorm as b right join t_dorm as c on b.dorm_id=c.id group by c.id)
as d on a.id=d.id order by ".$sql_order." limit $lim,$page_size";
$result=$pdo->query($sql);
$dorm_list=$result->fetchAll();
sql语句中的$ sql_order和$ lim,$ page_size,是实现排序和分页的功能。分页代码在整个系统中多处出现,我会在关键技术中对其进行讲解。这里先对排序功能进行讲解。思路:要对宿舍展现的信息实现排序
代码如下:
exchange和exchange_detail
这里主要实现学生如何申请换宿舍,具体代码如下:
$sql="select a.id,a.date,admin_response,a.student_id,a.to_dorm_id,d.dorm_id as from_dorm_id,name,account,c.building as to_dorm_building,c.number as to_dorm_number,e.building as from_dorm_building,e.number as from_dorm_number,e.id as from_dorm_id
from t_student_dorm_exchange as a left join t_student as b on a.student_id=b.id left join t_dorm as c on a.to_dorm_id=c.id left join t_student_dorm as d on d.student_id=b.id left join t_dorm as e on e.id=d.dorm_id
order by a.id desc limit $lim,$page_size";
$result=$pdo->query($sql);
$exchange_list=$result->fetchAll();
在写sql语句时会经常发生错误,我的方法就是将其分步骤来写,不断的检查,防止出错。
home和leave
home页面主要实现对用户信息的显示,leave页面主要是查看学生的请假外出。
具体代码如下:
$sql="select a.student_id,request,date_start,date_end,account,b.name,building,number,c.dorm_id
from t_student_leave as a join t_student as b on a.student_id=b.id join t_student_dorm as c on b.id=c.student_id join t_dorm as d on c.dorm_id=d.id
where teacher_response='批准'
order by date_end desc limit $lim,$page_size";
$result=$pdo->query($sql);
$leave_list=$result->fetchAll();
后端页面主要是从不同的表中查找出需要的信息,所以sql语句的编写在web开发过程中也非常重要的,决定了系统的效率。这里显示的主要是经过辅导员批准的外出申请。
在前端页面的话,从数据库获取到了信息,关键在于如何处理?并很好的展示在用户面前,这是一个很重要的问题!
思路:使用foreach遍历数组取出不同信息放到不同区域内,需要注意的是需要注意显示的数据格式,以及对于假条时间是否过期的处理。
具体代码如下:
<?php
foreach($leave_list as $row):
?>
<tr>
<td>
<?=$row['account']?>
</td>
<td>
<a href="./student_detail.php?id=<?=$row['student_id']?>">
<?=$row