PHP在线相册--【强撸项目】

强撸项目系列总目录在000集

PHP要怎么学–【思维导图知识范围】

文章目录

    • 本系列校训
    • 本项目使用技术
  • 上效果图
  • phpStudy 设置
  • 导数据库
  • 项目目录如图:
  • 代码部分:
    • 主页
  • 配套资源
  • 作业:

本系列校训

用免费公开视频,卷飞培训班哈人!打死不报班,赚钱靠狠干!
只要自己有电脑,前后项目都能搞!N年苦学无人问,一朝成名天下知!

本项目使用技术

PHP无类PHP类写法ThinkPHP框架其它框架
*

环境

PHP版本mysql版本运行工具编辑工具
5.4.45+Apache5.5(phpstudy自带)phpstudy2018VSCode

上效果图

在php 当中,上传图片,上传照片这种小功能还是挺方便的。注意没有登陆
所以,在线相册这个小项目还是有一定的价值的。比如某宝(好象人家不会用这么LOW的)那就作业吧

在这里插入图片描述

修改了代码,可以搜索了。
在这里插入图片描述在这里插入图片描述

phpStudy 设置

网站目录,不能有中文或空格,就乖乖的用C语言能识别的变量名

在这里插入图片描述

导数据库

打开mysql-front 或navicat
注意:数据库名:email 超级用户:root 密码:123456
运行本例附件即可。最后导入数据库成功的截图如下:

在这里插入图片描述

项目目录如图:

在这里插入图片描述
颜色主题:
在这里插入图片描述

代码部分:

主页

<?php
require './common/init.php';
// 接收参数
$id = input('get', 'id', 'd');
$sort = input('get', 'sort', 's');
$action = input('post', 'action', 's');
// 判断相册是否存在
if ($id && !album_data($id)) {exit('相册不存在!');
}
// 新建相册
if ($action == 'new') {album_new($id, input('post', 'name', 's'));
}
// 上传图片
elseif ($action == 'upload') {album_upload($id, input($_FILES, 'upload', 'a'));
}
// 删除相册
elseif ($action == 'delete') {album_delete(input('post', 'action_id', 'd'));
}
// 设为封面
elseif ($action == 'pic_cover') {album_picture_cover(input('post', 'action_id', 'd'), $id);
}
// 删除图片
elseif ($action == 'pic_delete') {album_picture_delete(input('post', 'action_id', 'd'));
}
// 查询相册名称作为网页标题
$title = album_data($id)['name'] ?: '首页';
// 查询导航栏
$nav = album_nav($id);
// 查询相册列表
$list = album_list($id, $sort);
// 载入模板
require './view/index.html';

主页的html

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title><?=htmlspecialchars($title)?> - 在线相册</title><link rel="stylesheet" href="./css/style.css"></head><body><?php require './view/common/top.html'; ?><div class="container"><div class="opt"><div class="opt-sort"><a class="<?=($sort!='old') ? 'curr' : ''?>" href="?id=<?=$id?>">最新的</a><a class="<?=($sort=='old') ? 'curr' : ''?>" href="?id=<?=$id?>&sort=old">最旧的</a></div><div class="opt-new"><form method="post"><input type="hidden" name="action" value="new"><input type="text" name="name" placeholder="输入相册名称" required><input type="submit" value="创建相册"></form></div><div class="opt-upload"><form method="post" enctype="multipart/form-data"><input type="hidden" name="action" value="upload"><input type="file" name="upload" required><input type="submit" value="上传图片"></form></div><div class="opt-search"><form method="get" action="search.php"><input type="hidden" name="action" value="search"><input type="text" name="search" placeholder="输入关键词" required><input type="submit" value="搜索"></form></div></div><div class="album"><?php if(empty($list['album']) && empty($list['picture'])): ?><div class="album-tip">该相册为空。</div><?php endif; ?><!-- 子相册列表 --><?php foreach ($list['album'] as $v): ?><div class="album-list album-dir"><div class="album-list-content"><div class="album-list-tips">相册</div><a href="?id=<?=$v['id']?>"><img src="./covers/<?=$v['cover'] ?: 'nopic.png'?>"></a><div class="album-list-desc"><p><a href="?id=<?=$v['id']?>"><?=htmlspecialchars($v['name'])?></a> (<?=$v['total']?>)</p></div><div class="album-list-opt"><form method="post"><input type="hidden" name="action_id" value="<?=$v['id']?>"><button class="js-del" name="action" value="delete">删除</button></form></div></div></div>  <?php endforeach; ?><!-- 图片列表 --><?php foreach($list['picture'] as $v): ?><div class="album-list"><div class="album-list-content"><a href="show.php?id=<?=$v['id']?>"><img src="./thumbs/<?=$v['save']?>"></a><div class="album-list-desc"><p><a href="show.php?id=<?=$v['id']?>"><?=htmlspecialchars($v['name'])?></a></p></div><div class="album-list-opt"><form method="post"><input type="hidden" name="action_id" value="<?=$v['id']?>"><?php if($id): ?><button name="action" value="pic_cover">设为封面</button><?php endif; ?><button class="js-del" name="action" value="pic_delete">删除</button></form></div></div></div><?php endforeach; ?></div></div><?php require './view/common/footer.html'; ?><script src="./js/common.js"></script></body>
</html>

后台关键逻辑代码:

<?php/*** 查询相册记录(缓存查询结果)* @param int $id 相册ID* @return array 查询结果数组,不存在时返回false*/
function album_data($id)
{static $data = [0 => false];if (!isset($data[$id])) {$data[$id] = db_fetch_row("SELECT `pid`,`path`,`name`,`cover`,`total` FROM `album` WHERE `id`=$id") ?: false;}return $data[$id];
}/*** 查询相册层级导航* @param int $id 相册ID* @return array 查询结果数组,不存在时返回空数组*/
function album_nav($id)
{$path = preg_replace('/^0,/', '', (album_data($id)['path'] . $id));return $path ? db_fetch_all("SELECT `id`,`name` FROM `album` WHERE `id` IN ($path) ORDER BY FIELD(`id`,$path)") : [];
}/*** 查询当前相册所有的子相册和图片* @param int $id 相册ID* @param string $sort 排序(new、old)* @return array 查询结果数组*/
function album_list($id, $sort)
{$sort = ($sort == 'old') ? 'ASC' : 'DESC';return ['album' => db_fetch_all("SELECT `id`,`name`,`cover`,`total` FROM `album` WHERE `pid`=$id  ORDER BY `id` $sort"),'picture' => db_fetch_all("SELECT `id`,`name`,`save` FROM `picture` WHERE `pid`=$id ORDER BY `id` $sort")];
}/*** 创建相册* @param int $pid 新相册的上级目录ID* @param string $name 新相册的名称*/
function album_new($pid, $name)
{$data = album_data($pid);if (substr_count($data['path'], ',') >= config('LEVEL_MAX')) {return tips('无法继续创建子目录,已经达到最多层级!');}/* if (!preg_match('/^\w{1,12}$/', $name)) {return tips('无法创建相册,只允许1~12位字母、数字、下划线组成。');} */$name = mb_strimwidth(trim($name), 0, 12);db_exec('INSERT INTO `album` (`pid`,`path`,`name`) VALUES (?,?,?)', 'iss', [$pid, ($data['path'] . $pid . ','), ($name ?: '未命名')]);
}/*** 上传图片* @param int $pid 图片所属的相册ID* @param array $file 上传文件 $_FILES['xx'] 数组*/
function album_upload($pid, $file)
{// 检查文件是否上传成功if (true !== ($error = upload_check($file))) {return tips("文件上传失败:$error");}// 检查文件类型是否正确$ext = pathinfo($file['name'], PATHINFO_EXTENSION);if (!in_array(strtolower($ext), config('ALLOW_EXT'))) {return tips('文件上传失败:只允许扩展名:' . implode(', ', config('ALLOW_EXT')));}// 生成文件名和保存路径$new_dir = date('Y-m/d');                       // 生成子目录$new_name = md5(microtime(true)) . ".$ext";     // 生成文件名// 创建原图保存目录$upload_dir = "./uploads/$new_dir";if (!is_dir($upload_dir) && !mkdir($upload_dir, 0777, true)) {return tips('文件上传失败:无法创建保存目录!');}// 创建缩略图保存目录$thumb_dir = "./thumbs/$new_dir";if (!is_dir($thumb_dir) && !mkdir($thumb_dir, 0777, true)) {return tips('文件上传失败:无法创建缩略图保存目录!');}// 保存上传文件if (!move_uploaded_file($file['tmp_name'], "$upload_dir/$new_name")) {return tips('文件上传失败:无法保存文件!');}// 创建缩略图thumb("$upload_dir/$new_name", "$thumb_dir/$new_name", config('THUMB_SIZE'));// 保存到数据库$name = mb_strimwidth(trim(pathinfo($file['name'], PATHINFO_FILENAME)), 0, 80);db_exec('INSERT INTO `picture` (`pid`,`name`,`save`) VALUES (?,?,?)', 'iss', [$pid, $name, "$new_dir/$new_name"]);$pid && album_total($pid, '+1');
}/*** 修改相册的total字段* @param int $id 相册ID* @param string $method 操作(+1、-1)*/
function album_total($id, $method = '+1')
{$path = preg_replace('/^0,/', '', (album_data($id)['path'] . $id));$path && db_exec("UPDATE `album` SET `total`=`total`$method WHERE `id` IN ($path)");
}/*** 删除相册* @param int $id 相册ID*/
function album_delete($id)
{$data = album_data($id);if ($data['total'] > 0) {return tips('删除失败:只能删除空相册!');}if (db_fetch_row("SELECT 1 FROM `album` WHERE `pid`=$id")) {return tips('删除失败:该相册含有子相册!');}db_exec("DELETE FROM `album` WHERE `id`=$id");$data['cover'] && is_file("./covers/{$data['cover']}") && unlink("./covers/{$data['cover']}");
}/*** 查询图片记录* @param int $id 图片ID* @return array 查询结果数组,不存在时返回null*/
function album_picture_data($id)
{return db_fetch_row("SELECT `pid`,`name`,`save` FROM `picture` WHERE `id`=$id");
}/*** 设置图片为相册封面* @param int $id 图片ID* @param int $pid 相册ID*/
function album_picture_cover($id, $pid)
{if (!$data = album_picture_data($id)) {return tips('设置失败:图片不存在!');}$cover_dir = './covers/' . dirname($data['save']);if (!is_dir($cover_dir) && !mkdir($cover_dir, 0777, true)) {return tips('设置失败:无法创建封面图保存目录!');}$cover_del = album_data($pid)['cover'];is_file("./covers/$cover_del") && unlink("./covers/$cover_del");copy("./thumbs/{$data['save']}", "./covers/{$data['save']}");db_exec("UPDATE `album` SET `cover`=? WHERE `id`=?", 'si', [$data['save'], $pid]);tips('设置成功!');
}/*** 删除图片* @param int $id 图片ID*/
function album_picture_delete($id)
{if (!$data = album_picture_data($id)) {return tips('删除失败:图片不存在!');}db_exec("DELETE FROM `picture` WHERE `id`=$id");is_file("./thumbs/{$data['save']}") && unlink("./thumbs/{$data['save']}");is_file("./uploads/{$data['save']}") && unlink("./uploads/{$data['save']}"); $data['pid'] && album_total($data['pid'], '-1');
}

配套资源

PHP在线相册-强撸项目
https://download.csdn.net/download/dearmite/88084818

作业:

PHP在线相册,美化前台页面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/9419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Matlab】基于粒子群优化算法优化BP神经网络的数据回归预测(Excel可直接替换数据)

【Matlab】基于粒子群优化算法优化 BP 神经网络的数据回归预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.数学公式3.文件结构4.Excel数据5.分块代码5.1 fun.m5.2 main.m 6.完整代码6.1 fun.m6.2 main.m 7.运行结果 1.模型原理 基于粒子群优化算法&#xff08;…

国标GB28181协议视频平台EasyCVR修改录像计划等待时间较长的原因排查与解决

音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成&…

MTK系统启动流程

MTK系统启动流程 boot rom -> preloader ->lk ->kernel ->Native -> Android 1、Boot rom:系统开机&#xff0c;最先执行的是固化在芯片内部的bootrom&#xff0c;其作用主要有 a.初始化ISRAM和EMMC b.当系统全擦后 &#xff0c;也会配置USB&#xff0c;用来仿…

CSS 瀑布流效果效果

示例 <!DOCTYPE html> <html lang="cn"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>瀑布流效果</title><style>…

IMU和视觉融合学习笔记

利用纯视觉信息进行位姿估计&#xff0c;对运动物体、光照干扰、场景纹理缺失等情况&#xff0c;定位效果不够鲁棒。当下&#xff0c;视觉与IMU融合(VI-SLAM&#xff09;逐渐成为常见的多传感器融合方式。视觉信息与IMU 数据进行融合&#xff0c;根据融合方式同样可分为基于滤波…

Rust vs Go:常用语法对比(八)

题目来自 Golang vs. Rust: Which Programming Language To Choose in 2023?[1] 141. Iterate in sequence over two lists Iterate in sequence over the elements of the list items1 then items2. For each iteration print the element. 依次迭代两个列表 依次迭代列表项1…

聊天机器人如何增加电子商务销售额

聊天机器人和自动化对企业和客户来说都是福音。自动对话和聊天机器人&#xff08;以下统称为“自动化”&#xff09;通过自动回答问题或分配会话信息来帮助用户浏览品牌网站或电商商店。即时答案对客户来说非常有用&#xff0c;使用自动化也可以让原本与客户聊天的客服员工专注…

MacDroid for Mac:在Mac上访问和传输Android文件的最简单方式

MacDroid for Mac是一款帮助用户在Mac和Android设备之间传输文件的软件。由于Mac OS X本身并不支持MTP协议&#xff0c;所以透过USB将Android设备连接到Mac电脑上是无法识别的&#xff0c;更别说读取里面的文件了。 MacDroid可以帮助您轻松搞定这个问题&#xff0c;您可以将An…

产业大数据应用:洞察企业全维数据,提升企业监、管、服水平

​在数字经济时代&#xff0c;数据已经成为重要的生产要素&#xff0c;数字化改革风生水起&#xff0c;在新一代科技革命、产业革命的背景下&#xff0c;产业大数据服务应运而生&#xff0c;为区域产业发展主导部门提供了企业洞察、监测、评估工具。能够助力区域全面了解企业经…

output delay 约束

output delay 约束 一、output delay约束概述二、output delay约束系统同步三、output delay约束源同步 一、output delay约束概述 特别注意&#xff1a;在源同步接口中&#xff0c;定义接口约束之前&#xff0c;需要用create_generated_clock 先定义送出的随路时钟。 二、out…

【优选算法题练习】day9

文章目录 一、DP35 【模板】二维前缀和1.题目简介2.解题思路3.代码4.运行结果 二、面试题 01.01. 判定字符是否唯一1.题目简介2.解题思路3.代码4.运行结果 三、724. 寻找数组的中心下标1.题目简介2.解题思路3.代码4.运行结果 总结 一、DP35 【模板】二维前缀和 1.题目简介 DP…

百度智能云连拿四年第一,为什么要深耕AI公有云市场

AI是过去几年云计算市场中的最大变量&#xff0c;而大模型的成熟&#xff0c;毫无疑问将指数级增强这个变量。 记得在2022年年底&#xff0c;生成式AI与大模型开始爆火的时候&#xff0c;我们就曾讨论过一个问题&#xff1a;这轮AI浪潮中&#xff0c;最先受到深刻影响的将是云计…

Oracle 多条记录根据某个字段获取相邻两条数据间的间隔天数,小于31天的记录都筛选出来

需求描述&#xff1a;在Oracle中 住院记录记录表为v_hospitalRecords&#xff0c;表中FIHDATE入院时间&#xff0c;FBIHID是住院号&#xff0c; 我想查询出每个患者在他们的所有住院记录中是否在一个月内再次入院(相邻的两条记录进行比较)&#xff0c;并且住院记录大于一的患者…

qsort的使用及模拟实现

qsort函数是C语言库中提供的一种快速排序&#xff0c;头文件是stdlib.h qsort的使用 qsort函数需要四个参数&#xff1a; 1.排序的起始位置的地址&#xff08;数组名&#xff09;: arr 2.排序元素的个数&#xff1a; sizeof&#xff08;arr)/sizeof(arr[0]) 3.排序元素…

echarts 饼图中间添加文字

需求&#xff1a;饼图中间展示总量数据 方法一、设置series对应饼图的label属性 series: [{type: "pie",radius: [55%, 62%],center: ["67%", "50%"],itemStyle: {borderRadius: 10,borderColor: #fff,borderWidth: 2},// 主要代码在这里label: …

protobuf入门实践1

protobuf入门实践1 下载和安装 protobuf&#xff1a;https://github.com/google/protobuf 解压压缩包&#xff1a;unzip protobuf-master.zip 2、进入解压后的文件夹&#xff1a;cd protobuf-master 3、安装所需工具&#xff1a;sudo apt-get install autoconf automake libt…

PostgreSQL数据库动态共享内存管理器——Dynamic shared memory areas

dsm.c提供的功能允许创建后端进程间共享的共享内存段。DSA利用多个DSM段提供共享内存heap&#xff1b;DSA可以利用已经存在的共享内存&#xff08;DSM段&#xff09;也可以创建额外的DSM段。和系统heap使用指针不同的是&#xff0c;DSA提供伪指针&#xff0c;可以转换为backend…

python与深度学习(六):CNN和手写数字识别二

目录 1. 说明2. 手写数字识别的CNN模型测试2.1 导入相关库2.2 加载数据和模型2.3 设置保存图片的路径2.4 加载图片2.5 图片预处理2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章训练的模型进行测试…

工具推荐:Linux Busybox

文章首发地址 BusyBox是一个开源的、轻量级的、可嵌入式的、多个Unix工具的集合。BusyBox提供了各种Unix工具的实现&#xff0c;包括文件处理工具、网络工具、shell工具、系统管理工具、进程管理工具等等。它被设计为一个小巧、高效、可靠、易于维护的工具&#xff0c;适用于嵌…

微服务——服务异步通讯RabbitMQ

前置文章 消息队列——RabbitMQ基本概念容器化部署和简单工作模式程序_北岭山脚鼠鼠的博客-CSDN博客 消息队列——rabbitmq的不同工作模式_北岭山脚鼠鼠的博客-CSDN博客 消息队列——spring和springboot整合rabbitmq_北岭山脚鼠鼠的博客-CSDN博客 目录 Work queues 工作队列…