目录结构
1 | |- bs # Bootstrap3的js |
数据库设计
user 用户表
1 | /* |
good 物品表
1 | /* |
message 物品留言表
1 | /* |
favorite 收藏表
1
2
3
4
5
6
7
8/*
favorite 收藏表
*/
CREATE TABLE favorite(
id int auto_increment primary key,
username char(40) not null,
pid int not null
)character set utf8;
系统功能实现
头部代码header.php
is_login检测
is_login检测是用来检测用户是否登陆的代码,存放在header.php中。检测用户是否登陆的方法:启动session,然后检测session数组中是否存在username键,username键的值就是用户名。
检测登陆的目的:
1.决定输出注册和登陆按钮还是输出用户的个人下拉菜单
2.很多登陆后才具有权限操作的地方要判断是否登陆(可直接包含header.php),比如:登陆界面、修改个人信息界面、添加留言界面、发布物品界面。
1 | $is_login = false; |
导航栏
如果用户未登陆,则右侧导航栏显示”注册”、”登陆” 按钮,如果用户登陆则右侧显示下拉菜单(个人中心,我的发布,我的收藏,注销登陆)
1 | if($is_login){ |
导航栏的active(设置哪个按钮被选中)管理:在每个页面中加入自己的标志,存放于$here中,然后在header中用switch case语句进行选择。
1 | // 注意$here赋值要在包含header.php前面 |
注意事项:
/user/login.php 包含 header.php而header.php包含config/config.php的问题:此时当前目录会变成/user/ 如果header中包含./config/config.php,则会在/user/config/中寻找config.php,而如果header中包含config/config.php,那么先会/user/config/寻找,如果没有则以header所在目录为根目录寻找config/config.php
登陆相关
涉及文件:
1 | user/login.php |
user/login.php 登陆表单
login.php中有登陆表单,并且包含header.php。
login.php中直接调用header.php中的变量$is_login来判断用户是否登陆,如果已登陆则直接跳转到”个人中心”,否则显示登陆表单(表单的action属性指向checklogin.php)。
1 | require('./../config/config.php'); @ |
user/checklogin.php 登陆验证
登陆验证主要做两个方面:
- 1.判断账号密码是否正确
1 | /** |
- 2.设置session
1 | session_start(); |
上传图片upload.php
上传图片的功能单独写到一个php中,因为站点内有多处图片上传点,这样可以复用代码,不用过多的写重复代码。
- 1.检测是存在file
1 | if(isset($_FILES['file'])){ |
- 2.安全性检测1 - Content-type验证
1 | if ((($_FILES["file"]["type"] == "image/png")|| ($_FILES["file"]["type"] == "image/jpeg")|| ($_FILES["file"]["type"] == "image/gif"))) |
- 3.获取上传文件的信息
1 | $uploaded_name = $_FILES[ 'file' ][ 'name' ]; // 从数据包获取上传的文件名 |
- 4.安全性检测2 - 后缀名检测
1 | if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" )){ |
- 5.移动临时文件,并将图片完整路径赋值给$result
PHP的文件上传,上传后的文件是一个临时文件.tmp
文件,需要将其移动到指定目录下,并重命名。
1 | $dir = "uploads/"; |
发布物品addGood.php
- 1.包含header.php并检测用户是否登录
1 | include('config/config.php'); |
- 2.如果存在$_POST[‘submit’]则接收数据,并检测数据
因为表单也是像这个界面提交的,所以我们需要判断是访问物品发布界面还是已经填写完信息后的发布物品,使用isset($_POST['submit'])
可以判断,因为如果在addGood.php点击发布物品
按钮产生的访问请求中,存在该参数,而从主页或其他地方进入发布物品界面则不会有$_POST['submit']
1 | if(isset($_POST['submit'])) |
- 3.在尾部添加向数据库插入数据的代码
插入数据库代码必须在包含upload_file.php
后面,否则无法访问到$result
变量的值。
1 |
|
查看物品相关功能
涉及文件:
1 | showItem/index.php # 显示物品 |
显示物品信息
- 1.检测URL中是否存在id参数
如果没有id参数就结束程序。
1 | if(!isset($_GET['id'])) |
- 2.从good表中查询信息
如果信息不为空,那么说明记录存在,则把查询出来的记录存放在$row
变量中,供后面调用。如果信息为空,说明该id在数据库中不存在,则提示Error id!
程序退出。
1 | $id = $_GET['id']; |
- 3.拼接html和数据库的信息,以期望交换的物品为例
因为多个期望交换的物品是以;
隔开的,因此我们需要先以;
为单位,分割字符串,分割后的每一个子串就是一个期望的物品,然后用foreach
遍历数据,将数据中的信息打印到html的指定位置。
1 | <div class="col-md-4"> |
- 4.发表留言按钮
设置留言块div
的id
为message
,然后将发布留言按钮的href
指向#message
锚点即可。
1 | <a href="#message" class="btn btn-secondary btn-block btn-lg" type="button">发布留言</a> |
- 5.收藏物品按钮
将该物品的username
字段内容作为user/showuser.php?user=
的值查询即可。
1 | <a href="favorite.php?pid=<?php echo $id;?>" class="btn btn-secondary btn-lg btn-block" type="button">收藏物品</a> |
添加物品留言addMes.php
- 1.将留言内容和物品id提交给showItem/addMes.php界面
- 2.showItem/addMes.php检测提交信息,并补全username
1 | @include('../config/config.php'); |
- 3.数据检测并插入数据库后返回显示物品界面
1 | $sql = "INSERT INTO message(pid,content,username) VALUES('$pid','$content','$username')"; |
显示物品留言
- 1.从message表中查询并显示留言每页3条
1 | 第一步:查询当前物品的留言条数确定$page_max |
1 | // 查询当前物品的留言条数确定$page_max |
- 2.显示留言翻页
无留言情况:
收藏物品favorite.php
把物品的id作为GET参数传递给favorite.php,然后再获取用户的用户名,一并存入favorite表中。
1 | header("Content-type:text/html;charset=utf8"); |
主页 index.php
- 1.轮播图的设置
把数据库中按照id的降序排序,查询出3条记录,然后将此3条记录中的tilte
、 descr
和 image
输出到轮播图的前端中。
1 | // 1.先查询轮播图的信息 |
- 2.每页显示6个物品
每页显示6个物品,设置偏移量offset
来从数据库查询指定页面的条目。
1 | $page = isset($_GET['page']) ? $_GET['page'] : '1'; |
然后将条目中的内容输出到前端的指定位置,但descr
只输出36个汉字(108字节)的数据。
查看和分享
- 3.翻页设置
1 | // 3.翻页 - 从数据库中查出所有的记录数量,然后/6 = pageMax |
用户后台相关
涉及文件
1 | user/index.php #用户后台主页 |
用户后台主页user/index.php
- 1.检测用户是否登录
1 | session_start(); |
- 2.查询用户的信息并打印到指定的HTML位置
1 | $username=$_SESSION['username']; |
我的物品
为了将用户发布的物品展示到后台,采用action参数决定后台的显示。
- 1.接收action参数
1 | if(isset($_GET['action'])) |
- 2.根据参数来包含文件
- 3.显示物品功能的实现myGood.php
先判断用户是否登录,然后将用户的用户名作为引索到good表中查询。
1 | include('../config/config.php'); |
用一个table来显示结果
其中,查看物品引一个链接到showItem/index.php
,删除物品的实现:接收一个参数物品的id,然后先检测物品的主人是不是当前登录的用户,如果是则删除该物品,如果不是则提示非法访问,代码实现如下:
1 | Header('Content-type:text/html;charset=utf-8'); |
- 4.物品发布
直接一个超链接到addGood.php即可。
我的收藏
收藏列表也是通过action
参数,将收藏显示实现界面包含在后台主页的。
- 1.查询用户的收藏
1 | @include('../config/config.php'); |
- 2.将收藏信息打印到表格中
由于收藏表只记录了用户名和收藏的物品id,所以需要到good表中去查询具体的物品信息。
- 3.查看收藏的物品详情
打印出的表格会有一个按钮,是查看收藏物品的详情的,如下图:
其实现方法就是把物品id作为参数,超链接到showItem/index.php
- 4.取消收藏
其实现方法就是把物品id作为参数,超链接到user/delFavo.php
1 |
|
用户操作
- 1.修改密码
在用户主页包含resetPass.php
,resetPass.php
的实现:1.接收参数,检查参数;2.检测旧密码是否正确;3.新密码是否相同,如果相同则修改。
1 | include('../config/config.php'); |
- 2.注销登录
超链接到loginout.php,其实现方法就是把session
删掉。
1 |
|