# 实战博客后端开发 ## 数据库表的创建 系统表:config | id | name | value | | --- | --- | --- | 文章表:article | id | title | author | content | c_time | catid | keyword | | --- | --- | --- | --- | --- | --- | --- | 分类表: cate | id | class_name | | --- | --- | 友链表:flink | id | url | url_name | | --- | --- | --- | 用户表:users | id | username | password | email | | --- | --- | --- | --- | ```sql create table config( id int auto_increment primary key, name varchar(255), value varchar(255) )engine=innodb default charset=utf8; create table article( id int auto_increment primary key, title varchar(255), author varchar(255), content text, c_time int(11), catid int(11), keyword varchar(255) )engine=innodb default charset=utf8; create table config( id int auto_increment primary key, class_name varchar(255) )engine=innodb default charset=utf8; create table flink( id int auto_increment primary key, url varchar(255), url_name varchar(255) )engine=innodb default charset=utf8; create table cate( id int auto_increment primary key, class_name varchar(255) )engine=innodb default charset=utf8; create table users( id int auto_increment primary key, username varchar(255), password varchar(255), email varchar(255) )engine=innodb default charset=utf8; ``` ## 创建目录结构 - admin:后台管理目录 - common:一些功能模块 - configs:配置相关文件 ## config.php 编写网站配置文件,主要用于连接数据库 ```php ``` ## function.php 配置过滤函数,在特殊字符前加上转义符号防止注入 ```php ``` ## login.php 配置登陆界面 ```php 管理员登陆 query("select * from users where username='$username' and password='$password'"); if ($result->num_rows > 0) { echo "

登陆成功

"; } else { echo "

登陆失败

"; } } ?>
管理员登陆
用户名
密码
``` ![image.png](08.实战博客系统后端开发/1670749870204-2cf861bc-0346-4a47-b39c-da09220cad58.png) ## 配置用户SESSION验证 ```php session_start(); //开始记录会话 ``` 修改登陆页面代码,让登陆成功之后在cookie中添加一个记录 ```php query("select * from users where username='$username' and password='$password'"); if ($result->num_rows > 0) { $row = $result->fetch_assoc(); if ($row['password'] == $password) { echo "

登陆成功

"; $_SESSION['username'] = $row['username']; } } else { echo "

登陆失败

"; } } ?> ``` 创建一个main.php用于测试 ```php ``` 修改php.ini文件,配置session保存的路径,修改php.ini之后需要重启apache使之生效 ![image.png](08.实战博客系统后端开发/1670808101803-204fa0f5-3782-4493-8b73-6b6d77e1f5c9.png) 登陆之前访问main.php ![image.png](08.实战博客系统后端开发/1670808147278-bb0399ad-4230-497f-982b-418e32d25394.png) 在login.php之处登陆之后访问main.php ![image.png](08.实战博客系统后端开发/1670808180312-08a760a5-f5e3-4015-8c5b-a05308feae00.png) 可以看到在服务器端的tmp目录中已经存在session ![image.png](08.实战博客系统后端开发/1670808224577-daf9943c-8349-43a1-a437-b186867663d9.png) ## 配置前台JS验证 ```javascript
//在form标签中添加检测的函数 //在php代码中给登陆成功添加一个跳转到main.php的方法 if ($row['password'] == $password) { echo "

登陆成功

"; $_SESSION['username'] = $row['username']; header('Location: main.php'); $conn->close(); } ``` ## 套用前端模版 前端模版下载:[https://pan.baidu.com/s/1WUzcDURS_iWiQXzlXKrQvA?pwd=6666](https://pan.baidu.com/s/1WUzcDURS_iWiQXzlXKrQvA?pwd=6666) 全部解压到admin目录下 首先修改login.php,把功能和界面都移植过来 ![image.png](08.实战博客系统后端开发/1670985626553-297db8af-d81a-4b32-9074-f561a01432e2.png) 准备main.php,界面使用index.html的html代码,并且可以做适当的精简,然后界面如下 ![image.png](08.实战博客系统后端开发/1670986219930-ed67ebe8-4e88-406e-ab77-8fcafaa97ba8.png) ## 文章添加界面 在admin文件夹中创建article_add.php,并且添加如下代码 ```php query("insert into article(title,content,author,keyword,c_time) value('$title', '$content', '$author', '$keywords', $ctime)"); if ($result) { echo ""; } else { echo ""; } } ?> 后台管理
首页>作品管理>新增作品
*分类:
*标题:
作者:
关键字:
内容:
``` 添加文章内容进行测试 ![image.png](08.实战博客系统后端开发/1670988347147-6d3592bb-a3c0-4087-b7f1-84ee797787ec.png) ### 富文本编辑器添加 下载富文本编辑器源码:[https://pan.baidu.com/s/1fxUEFU1JgAX0EvVugXxqzg?pwd=6666](https://pan.baidu.com/s/1fxUEFU1JgAX0EvVugXxqzg?pwd=6666) 将ueditor代码文件夹解压到admin目录下,然后在article_add.php中添加如下代码 ```javascript ``` ![image.png](08.实战博客系统后端开发/1670992117827-42c6797a-b832-4506-8a8a-8a4d2cb729e4.png) ## 分类功能 在article_add.php的分类选项代码改成如下 ```php *分类: ``` 在数据库中添加部分分类做测试 ![image.png](08.实战博客系统后端开发/1670996474546-3bf952b1-b1ea-4ec3-b8a8-bb1817a656a6.png) 查看页面中的最终效果 ![image.png](08.实战博客系统后端开发/1670996494448-8811b707-24f3-4c9e-93e8-f19a07059398.png) 修改添加文章的代码,加入分类的id到数据库中 ```php $catid = filterstr($_POST['colId']); $result = $conn->query("insert into article(title,catid,content,author,keyword,c_time) value('$title', $catid, '$content', '$author', '$keywords', $ctime)"); ``` 添加文章进行测试,在数据库中验证cateid正确添加 ![image.png](08.实战博客系统后端开发/1670997049018-83974f85-dc47-44b9-ac46-a73d8191f7f4.png) ## 文章栏目 新建article_list.php,并且复制design.html中的内容过来,并且进行修改 ![image.png](08.实战博客系统后端开发/1670999465637-8d34459b-448d-4833-9479-36abcefef9ee.png) 从数据库中读取对应的数据 ![image.png](08.实战博客系统后端开发/1670999968786-357b0d7e-8c25-4788-908a-f1adee81bced.png) ```php query("select * from article"); while($row=$result->fetch_assoc()){ ?> 修改 删除 ``` ### 文章修改功能 将修改的超链接改为 ```php article_edit.php?id= ``` 复制article_add.php为article_edit.php文件,并且使用如下代码获取文章内容 ```php $id = filterstr($_GET['id']); $result=$conn->query("select * from article where id='$id'"); $row = $result->fetch_assoc(); ``` 在对应的input标签中修改value值,其中分类改成如下代码 ```php *分类: ``` 查看点击修改后效果如下 ![image.png](08.实战博客系统后端开发/1671001373942-1d2af643-6a20-40ae-b137-03e2dfdbd278.png) 修改article_edit.php代码,能够更新文章 ```php if (isset($_POST['submit'])) { $title = filterstr($_POST['title']); $author = filterstr($_POST['author']); $keywords = filterstr($_POST['keywords']); $content = filterstr($_POST['content']); $ctime = time(); $catid = filterstr($_POST['colId']); $result = $conn->query("update article set title='$title', catid=$catid, content='$content', author='$author', keyword='$keywords', c_time=$ctime where id=$id"); if ($result) { echo ""; } else { echo ""; } } ``` ### 删除文章功能 在article_list.php中添加如下代码 ```php if(isset($_GET['action']) && $_GET['action'] == 'del') { $id = filterstr($_GET['id']); $result = $conn->query("delete from article where id='$id'"); if($result){ echo ""; }else{ echo ""; } } ``` 并且添加好确认的逻辑代码 ```javascript //将删除超链接改成 javascript:del() ``` ### 显示文章分类 修改article_list.php中查询文章的sql语句如下 ```sql select a.id,a.title,a.author,a.c_time,b.class_name from article as a left join cate as b on a.catid=b.id order by a.id desc ``` 文件分类处改成 ```php ``` 查看显示情况 ![image.png](08.实战博客系统后端开发/1671071824613-074019a3-5f16-4ea1-a19b-a64adb627901.png) ## 编写跳转页面 在function.php中添加如下代码 ```php function redirect($ms='', $url='', $text=''){ echo <<

页面操作提示:$text

本页面在$ms 秒后自动跳转,如果您的浏览器没有跳转,点此链接返回。
EOT; } ``` 然后在需要进行跳转的地方使用此函数进行跳转 ## 编写分页功能 下载分页类文件:[https://pan.baidu.com/s/114iEhrHdoXX7KHYOqCt76w?pwd=6666](https://pan.baidu.com/s/114iEhrHdoXX7KHYOqCt76w?pwd=6666) 将Page.class.php文件放到common目录下 编辑article_list.php文件,在开始的php代码块处获取如下变量 ```php $page = isset($_GET['page']) ? $_GET['page'] : 1; $subPages = 8; ``` 编辑article_list.php文件,在显示页码处改成如下代码 ```php
query("select * from article"); $result_count = $result->num_rows; $p = new Page($result_count, 4, $page,$subPages); echo $p->showPages(); ?>
``` 编辑article_list.php文件,在获取文章列表的sql语句后做如下修改 ```sql "select a.id,a.title,a.author,a.c_time,b.class_name from article as a,cate as b where a.catid=b.id order by a.id limit " . ($page-1)*8 . ",$subPages" ``` ## 系统设置功能 首先将config表修改成如下结构 ![image.png](08.实战博客系统后端开发/1671089206058-0629f4a3-a9f9-4afb-9d38-98e1f41f7737.png) 编写system.php代码 ```php query("select * from config"); $row = $result->fetch_assoc(); if(isset($_POST['submit'])){ $url = filterstr($_POST['url']); $title = filterstr($_POST['title']); $keyword = filterstr($_POST['keyword']); $email = filterstr($_POST['email']); $admin = filterstr($_POST['admin']); $icp = filterstr($_POST['icp']); $address = filterstr($_POST['address']); $result = $conn->query("update config set url='$url', title='$title', keyword='$keyword', email='$email', admin='$admin', icp='$icp', address='$address'"); if($result){ redirect("1","system.php","内容修改成功"); }else{ redirect("1","system.php","内容修改失败"); } } ?> 后台管理
首页>系统设置

网站信息设置

*域名:
*站点标题:
*关键字:

站长信息设置

*网站联系邮箱:
*管理员:
*备案ICP:
*地址:
``` 最终的效果 ![image.png](08.实战博客系统后端开发/1671089252357-e1ddb223-bc94-4c3d-8565-6b74b22583c0.png) ## 后台剩下的步骤 依次完成如下功能模块 - cate_list.php - cate_add.php - cate_edit.php - flink_list.php - flink_add.php - flink_edit.php - change_pwd.php 并且优化细节 ## 退出功能 在config.php中加入如下代码 ```php if(isset($_GET['logout'])){ session_destroy(); redirect('2','login.php','退出登陆成功!'); } ``` 然后将所有退出的超链接改为 ```html ?logout ``` ## 显示系统信息 首先打印系统变量,查看需要的信息 ```php print_r($_SERVER); //显示结果如下 Array ( [HTTP_HOST] => localhost:8080 [HTTP_CONNECTION] => keep-alive [HTTP_SEC_CH_UA] => "Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24" [HTTP_SEC_CH_UA_MOBILE] => ?0 [HTTP_SEC_CH_UA_PLATFORM] => "Windows" [HTTP_UPGRADE_INSECURE_REQUESTS] => 1 [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 [HTTP_SEC_FETCH_SITE] => none [HTTP_SEC_FETCH_MODE] => navigate [HTTP_SEC_FETCH_USER] => ?1 [HTTP_SEC_FETCH_DEST] => document [HTTP_ACCEPT_ENCODING] => gzip, deflate, br [HTTP_ACCEPT_LANGUAGE] => zh-CN,zh;q=0.9,zh-TW;q=0.8 [HTTP_COOKIE] => PHPSESSID=349e6574s902hllac20hh563s2 [PATH] => C:\Program Files (x86)\VMware\VMware Workstation\bin\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Microsoft VS Code\bin;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Users\simid\AppData\Local\Microsoft\WindowsApps; [SystemRoot] => C:\Windows [COMSPEC] => C:\Windows\system32\cmd.exe [PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC [WINDIR] => C:\Windows [SERVER_SIGNATURE] => [SERVER_SOFTWARE] => Apache/2.4.6 (Win32) PHP/5.4.17 [SERVER_NAME] => localhost [SERVER_ADDR] => ::1 [SERVER_PORT] => 8080 [REMOTE_ADDR] => ::1 [DOCUMENT_ROOT] => C:/Users/simid/Desktop/usbwebserver/root [REQUEST_SCHEME] => http [CONTEXT_PREFIX] => [CONTEXT_DOCUMENT_ROOT] => C:/Users/simid/Desktop/usbwebserver/root [SERVER_ADMIN] => mail@localhost [SCRIPT_FILENAME] => C:/Users/simid/Desktop/usbwebserver/root/admin/main.php [REMOTE_PORT] => 6751 [GATEWAY_INTERFACE] => CGI/1.1 [SERVER_PROTOCOL] => HTTP/1.1 [REQUEST_METHOD] => GET [QUERY_STRING] => [REQUEST_URI] => /admin/main.php [SCRIPT_NAME] => /admin/main.php [PHP_SELF] => /admin/main.php [REQUEST_TIME_FLOAT] => 1671169877.04 [REQUEST_TIME] => 1671169877 ) ``` 挑选需要的信息内容填入对应的位置,最终效果和代码 ![image.png](08.实战博客系统后端开发/1671170614478-071addaa-8649-4b9c-84ff-8619f3f0fd6f.png) ```html ``` ## 导入前端代码 前端代码示例下载地址:[https://pan.baidu.com/s/1dqmwUdXR77MyWiyhCIySkQ?pwd=6666](https://pan.baidu.com/s/1dqmwUdXR77MyWiyhCIySkQ?pwd=6666) ![image.png](08.实战博客系统后端开发/1671171771490-cadb228a-731d-4044-a1c4-78e4c3042e97.png) 获取博客系统信息 ```php $result = $conn->query("select * from config"); $web = $result->fetch_assoc() //下面在需要的地方进行替换,比如标题 <?php echo $web['title'] ?> ``` 修改分类 ```php ``` 修改文章列表 ```php query("select a.id,a.title,a.content,a.author,a.c_time,b.class_name from article as a left join cate as b on a.catid=b.id order by a.id desc"); while ($row = $result->fetch_assoc()) { ?>
``` ![image.png](08.实战博客系统后端开发/1671177398835-422d4e0d-68b8-4002-9401-b8527721296d.png) 分页功能 ```php $page = isset($_GET['page']) ? $_GET['page'] : 1; $subPages = 8; //将文章查询的sql语句修改成如下 "select a.id,a.title,a.author,a.c_time,b.class_name from article as a left join cate as b on a.catid=b.id order by a.id desc limit " . ($page-1)*8 . ",$subPages" //页码显示的代码
query("select * from article"); $result_count = $result->num_rows; $p = new Page($result_count, 4, $page,$subPages); echo $p->showPages(); ?>
``` ## 文章显示页面 ```php query("select a.id,a.content,a.title,a.author,a.c_time,b.class_name from article as a left join cate as b on a.catid=b.id where a.id=$id"); $row = $result->fetch_assoc(); }else{ redirect('2', 'index.php', '该页面不存在'); die("404 not find"); } ?> //之后在每个需要替换的地方使用$row['xxx'] ``` ![image.png](08.实战博客系统后端开发/1671178369821-f55dcdaa-eb55-4097-9f39-97ac8c1350cc.png) 评论功能同学们自己练习完成 ## 前端分类功能 写一个cate.php文件,实现分类文章显示 ![image.png](08.实战博客系统后端开发/1671178746669-e4b52bba-1ac2-4ffe-aeeb-d16c53cd7641.png) ## 热门文章 可以在数据库中追加每篇文章的阅读数功能,然后排列出热度靠前的文章