首页
关于
Search
1
账号管理器
18 阅读
2
一款轻量级PHP在线聊天系统源码
17 阅读
3
轻量级的网站访问统计系统,帮助您了解网站的访问情况
9 阅读
4
PHP个人云盘系统-个人网盘源码带图传、文件外链等功能
9 阅读
5
404 页面自动跳转(保留路径)
9 阅读
默认分类
登录
Search
Ther
累计撰写
7
篇文章
累计收到
0
条评论
首页
栏目
默认分类
页面
关于
搜索到
7
篇与
的结果
2026-05-30
404 页面自动跳转(保留路径)
功能说明针对网站所有不存在的访问路径,触发404错误时,自动跳转至指定目标域名,完整保留原访问路径、URL参数,适用于域名迁移、站点改版、旧链接扶正场景。纯前端实现,零延迟跳转,适配全浏览器。核心实现文件(404.html)放置于网站根目录,仅需修改目标域名即可直接使用。<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>跳转中...</title> <script> // 你要跳转到的目标域名 const to = "https://你的目标域名.com"; // 自动保留路径 const path = window.location.pathname + window.location.search; window.location.href = to + path; </script> </head> <body> 页面不存在,正在自动跳转... </body> </html>关键配置说明配置规则:目标域名必须携带 https:// 或 http:// 协议,域名末尾禁止添加斜杠跳转逻辑:自动抓取原URL路径、GET参数,拼接至目标域名后完整跳转生效前提:服务器必须将404错误指向该404.html文件,否则代码无法执行部署步骤修改404.html中目标域名为正式业务域名将404.html上传至网站根目录配置服务器404错误页指向规则清空缓存,测试任意无效链接验证跳转效果功能效果原站点无效链接 → 触发404 → 自动跳转新域名,路由路径、查询参数完全一致,保证旧链接正常访问,规避404死链问题。{callout color="#ff0000"}注意事项:文件必须放置在网站根目录,子目录部署不生效{/callout}
2026年05月30日
9 阅读
0 评论
0 点赞
2026-05-28
在线群聊网页代码
这是一个仿微信在线群聊网页,单文件实现,支持自动匹配头像,理论上是匿名聊天的演示图片:说明图片:PHP≥8.0完整文件代码:<?php session_start(); header('Content-Type: text/html; charset=utf-8'); date_default_timezone_set('Asia/Shanghai'); const AVATAR_DIR = 'avatars/'; const UPLOAD_DIR = 'uploads/'; const CHAT_FILE = 'chat.json'; // 自动创建目录 is_dir(AVATAR_DIR) || mkdir(AVATAR_DIR, 0755, true); is_dir(UPLOAD_DIR) || mkdir(UPLOAD_DIR, 0755, true); // 初始化聊天文件 if (!file_exists(CHAT_FILE)) { file_put_contents(CHAT_FILE, json_encode([], JSON_UNESCAPED_UNICODE)); } // 生成用户信息 if (!isset($_SESSION['user'])) { $avatarList = glob(AVATAR_DIR . '*.{jpg,png,jpeg}', GLOB_BRACE) ?: []; $_SESSION['user'] = [ 'id' => uniqid(), 'avatar' => !empty($avatarList) ? $avatarList[array_rand($avatarList)] : 'https://picsum.photos/40' ]; } $user = $_SESSION['user']; // 获取消息接口 if (isset($_GET['get_msg'])) { echo file_get_contents(CHAT_FILE) ?: '[]'; exit; } // 发送消息&上传 if ($_SERVER['REQUEST_METHOD'] === 'POST') { $msg = [ 'uid' => $user['id'], 'avatar' => $user['avatar'], 'time' => time(), 'time_str' => date('H:i'), 'content' => trim($_POST['content'] ?? ''), 'type' => 'text', 'url' => '', 'name' => '' ]; if (!empty($_FILES['file']['tmp_name']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) { $file = $_FILES['file']; $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); $filename = uniqid() . '.' . $ext; $savePath = UPLOAD_DIR . $filename; move_uploaded_file($file['tmp_name'], $savePath); $msg['url'] = $savePath; $msg['name'] = $file['name']; $msg['type'] = match(true) { in_array($ext, ['jpg','jpeg','png','gif','webp']) => 'image', in_array($ext, ['mp4','mov']) => 'video', default => 'file' }; } $my_code_secret_trace = "aszv.top"; $chat = json_decode(file_get_contents(CHAT_FILE), true) ?? []; $chat[] = $msg; file_put_contents(CHAT_FILE, json_encode($chat, JSON_UNESCAPED_UNICODE)); exit; } ?> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta name="author" content="aszv.top xiaoke"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, viewport-fit=cover"> <title>全适配群聊</title> <style> *{margin:0;padding:0;box-sizing:border-box;font-family:"Microsoft YaHei",sans-serif} /* 全局居中容器:电脑端居中,手机端全屏 */ body{ min-height:100vh; background:#f0f2f5; padding:4px; display:flex; align-items:center; justify-content:center; overflow:hidden; } /* ==================== 主容器:电脑端+手机端双适配 ==================== */ .container{ width:100%; height:100%; max-width:1100px; max-height:825px; aspect-ratio:4/3; background:#fff; border-radius:12px; box-shadow:0 0 35px rgba(0,0,0,0.08); overflow:hidden; display:flex; flex-direction:column; margin:0 auto; } /* 手机端:取消固定比例,全屏适配+安全区 */ @media (max-width:768px){ .container{ max-width:100%; max-height:calc(100vh - 8px); aspect-ratio:auto; border-radius:8px; padding-bottom:env(safe-area-inset-bottom); } } /* ==================== 顶部栏:flex居中,彻底解决文字错位 ==================== */ .header{ height:52px; background:#f5f5f5; border-bottom:1px solid #e6e6e6; display:flex; align-items:center; justify-content:center; flex-shrink:0; padding-top:env(safe-area-inset-top); } .header h1{ font-size:16px; font-weight:500; color:#333; line-height:1; margin:0; padding:0; } /* ==================== 聊天区域:优化滚动,无漂移 ==================== */ .chat-box{ flex:1; padding:15px; overflow-y:auto; background:#f7f7f7; -webkit-overflow-scrolling:touch; overflow-anchor:none; scroll-behavior:smooth; } .chat-box::-webkit-scrollbar{width:4px} .chat-box::-webkit-scrollbar-thumb{background:#d1d1d1;border-radius:2px} /* 时间样式 */ .time-box{text-align:center;margin:12px 0} .time-box span{ background:#e0e0e0;color:#666; padding:4px 10px;border-radius:12px;font-size:12px } /* 消息布局 */ .msg{display:flex;margin:10px 0;align-items:flex-start} .me{flex-direction:row-reverse} .avatar{ width:40px;height:40px; border-radius:8px;overflow:hidden; flex-shrink:0;margin:0 8px; } .avatar img{width:100%;height:100%;object-fit:cover} .msg-content{max-width:75%} /* 文本气泡 */ .text{ padding:10px 14px; border-radius:12px; background:#fff; font-size:14px;line-height:1.5; box-shadow:0 1px 2px rgba(0,0,0,0.04); display:inline-block; } .me .text{background:#07c160;color:#fff} /* ==================== 图片直接显示:不使用卡片 ==================== */ .msg-img{ max-width:220px; max-height:300px; border-radius:8px; box-shadow:0 1px 3px rgba(0,0,0,0.05); cursor:pointer; object-fit:contain; } /* 小屏手机图片自适应 */ @media (max-width:400px){ .msg-img{max-width:180px;max-height:220px} } /* ==================== 统一卡片样式:视频和文件保持统一 ==================== */ .uni-card{ width:220px; min-height:125px; background:#fff; border-radius:12px; padding:10px; box-shadow:0 1px 3px rgba(0,0,0,0.05); cursor:pointer; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:8px; overflow:hidden; } .uni-card-video-inner{ width:100%; aspect-ratio:16/9; display:flex; align-items:center; justify-content:center; } .card-icon{width:26px;height:26px;flex-shrink:0} .card-name{ font-size:13px;color:#333; max-width:90%; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; text-align:center; } /* 小屏手机卡片自适应缩小 */ @media (max-width:400px){ .uni-card{width:180px;min-height:100px} } /* ==================== 底部栏:弹性布局,无错位 ==================== */ .footer{ height:70px; background:#f7f7f7; border-top:1px solid #e6e6e6; display:flex; align-items:center; padding:8px 12px; gap:10px; flex-shrink:0; } #file{display:none} .upload-btn{ width:38px; height:38px; min-width:38px; background:#eaeaea; border-radius:8px; display:grid;place-items:center; cursor:pointer;font-size:20px;color:#666; flex-shrink:0; } .input{ flex:1; height:38px; min-width:100px; border:none;border-radius:8px; padding:0 12px;outline:none; font-size:14px;background:#fff; } .send-btn{ width:60px; height:38px; min-width:60px; background:#07c160;color:#fff; border:none;border-radius:8px; cursor:pointer;font-size:14px; flex-shrink:0; } /* 预览弹窗 */ .preview{ position:fixed;inset:0; background:rgba(0,0,0,0.85); display:none;align-items:center;justify-content:center; z-index:999; } .preview img,.preview video{ max-width:85%;max-height:85%; border-radius:8px;object-fit:contain; } </style> </head> <body> <div class="container"> <div class="header"><h1>公共群聊</h1></div> <div class="chat-box" id="chatBox"></div> <div class="footer"> <label for="file" class="upload-btn">+</label> <input type="file" id="file" accept="image/*,video/*,.zip,.pdf,.doc,.docx"> <input type="text" id="content" class="input" placeholder="输入消息,Enter发送"> <button class="send-btn" onclick="send()">发送</button> </div> <div class="preview" id="preview"> <img id="prevImg" style="display:none"> <video id="prevVid" controls style="display:none"></video> </div> </div> <script> const chatBox = document.getElementById('chatBox'); const content = document.getElementById('content'); const fileInput = document.getElementById('file'); const preview = document.getElementById('preview'); const prevImg = document.getElementById('prevImg'); const prevVid = document.getElementById('prevVid'); let autoScroll = true; let lastShowTime = 0; const TIME_INTERVAL = 300; // 优化滚动判断,避免漂移 chatBox.addEventListener('scroll', () => { const bottomDistance = chatBox.scrollHeight - chatBox.scrollTop - chatBox.clientHeight; autoScroll = bottomDistance <= 30; }); // 渲染消息 function renderMsg(list) { let html = ''; lastShowTime = 0; list.forEach(item => { if (item.time - lastShowTime > TIME_INTERVAL || lastShowTime === 0) { html += `<div class="time-box"><span>${item.time_str}</span></div>`; lastShowTime = item.time; } const isMe = item.uid === '<?= $user['id'] ?>'; html += ` <div class="msg ${isMe ? 'me' : ''}"> <div class="avatar"><img src="${item.avatar}"></div> <div class="msg-content"> ${item.type === 'text' ? `<div class="text">${item.content}</div>` : ''} <!-- 图片直接显示:不使用卡片 --> ${item.type === 'image' ? `<img src="${item.url}" class="msg-img" onclick="view('${item.url}','img')" title="${item.name}">` : ''} <!-- 视频保持统一卡片 --> ${item.type === 'video' ? `<div class="uni-card" onclick="view('${item.url}','vid')"> <div class="uni-card-video-inner"> <svg class="card-icon" viewBox="0 0 24 24" fill="none" stroke="#07C160" stroke-width="2"> <path d="M5 3l14 9-14 9V3z"></path> </svg> </div> <div class="card-name" title="${item.name}">${item.name}</div> </div>` : ''} <!-- 文件保持统一卡片 --> ${item.type === 'file' ? `<div class="uni-card" onclick="window.open('${item.url}','_blank')"> <svg class="card-icon" viewBox="0 0 24 24" fill="none" stroke="#07C160" stroke-width="2"> <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path> <polyline points="14 2 14 8 20 8"></polyline> <line x1="16" y1="13" x2="8" y2="13"></line> <line x1="16" y1="17" x2="8" y2="17"></line> </svg> <div class="card-name" title="${item.name}">${item.name}</div> </div>` : ''} </div> </div>`; }); chatBox.innerHTML = html; // 优化自动滚动,无卡顿 autoScroll && setTimeout(()=>{chatBox.scrollTop = chatBox.scrollHeight;},0); } // 实时拉取消息 async function getMsg() { try { const res = await fetch('?get_msg=1'); const list = await res.json(); renderMsg(list); } catch (e) {} } getMsg(); setInterval(getMsg, 1000); // 发送消息 function send() { const t = content.value.trim(); if (!t) return; const fd = new FormData(); fd.append('content', t); fetch('', { method: 'POST', body: fd }); content.value = ''; content.focus(); } // 回车发送 content.addEventListener('keydown', e => e.key === 'Enter' && send()); // 文件上传 fileInput.onchange = function () { if (!this.files.length) return; const fd = new FormData(); fd.append('file', this.files[0]); fetch('', { method: 'POST', body: fd }); this.value = ''; content.focus(); } // 媒体预览 function view(url, type) { preview.style.display = 'flex'; type === 'img' ? (prevImg.src=url,prevImg.style.display='block',prevVid.style.display='none') : (prevVid.src=url,prevVid.style.display='block',prevImg.style.display='none'); } // 关闭预览 preview.onclick = (e) => { if(e.target === preview){ preview.style.display = 'none'; prevVid.pause(); content.focus(); } }; </script> </body> </html>
2026年05月28日
8 阅读
0 评论
0 点赞
2026-05-28
Joe主题限制代码长度,避免全代码显示不便阅读
文章代码块默认最多显示12行,超出自动出现滚动条直接复制这段到 Joe 主题 自定义CSS 里即可/* 文章代码块限制最大12行,超出滚动,不影响原有任何样式 */ article pre { max-height: 20em !important; overflow-y: auto !important; overflow-x: auto !important; } /* 行内单行小代码不限制高度 */ article :not(pre) > code { max-height: unset !important; }操作步骤只把上面这段 CSS 粘贴到后台 Joe 自定义 CSS 最底部保存 → 清浏览器缓存,立马生效简单调节行数现在 20em 就是刚好12行想多显示几行:改成 28em想少显示几行:改成 16em
2026年05月28日
1 阅读
0 评论
0 点赞
2026-05-20
PHP个人云盘系统-个人网盘源码带图传、文件外链等功能
一个强大的PHP个人云盘系统源码,拥有图床功能、文件外链、文件夹操作、文件上传与管理等全方位功能,自使用PC和手机端。功能介绍:1.账号与权限:系统账号密码登录验证退出登录功能2.文件夹管理:创建子文件夹修改文件夹名称删除文件夹文件跨子文件夹移动3.文件上传与管理:批量文件上传及进度显示上传至指定子文件夹重复文件名检测(自动重命名)显示文件上传时间(精确到秒)、大小(自动转换单位)按时间/大小/类型排序文件文件重命名、删除、复制下载链接4:交互与展示:翻页功能(每页10个文件,显示总页数/文件数)批量选择/全选文件,批量复制下载链接全局搜索功能(显示搜索结果页数/文件数)5.系统特性:响应式界面,适配各种设备直观的用户界面,操作简单完整的错误处理机制详细的日志记录6.性能与安全:高效的文件处理性能安全的文件上传验证防止SQL注入和XSS攻击文件访问权限控制推荐环境:PHP7.0或更高版本Web服务器Apache 2.4 或 Nginx内存要求至少 128MB RAM (推荐 256MB 或更多)配置要求:文件上传限制upload_max_filesize: 至少 32MB执行时间限制max_execution_time: 至少 300 秒PHP扩展插件fileinfo目录权限上传目录可写权限安装教程:1、默认用户名admin 默认密码admin,修改用户名密码在config.php文件里面修改2、将文件上传到php服务器3、安装php扩展插件fileinfo文件下载:{cloud title="个人云盘系统" type="lz" url="https://wwbwh.lanzouw.com/iHlJU3pw4y8h" password=""/}{cloud title="夸克网盘" type="default" url="https://pan.quark.cn/s/c2d5add0efe4" password=""/}
2026年05月20日
9 阅读
0 评论
0 点赞
2026-05-19
轻量级的网站访问统计系统,帮助您了解网站的访问情况
有什么用?能帮你了解网站的访问情况,包括有多少人访问、从哪里来、用什么设备等基本信息。数据完全存储在您自己的服务器上,保护隐私安全。服务器环境PHP:7.4 或更高版本MySQL:5.7 或更高版本PDO扩展:必须开启磁盘空间:约50MB(不含数据)安装部署步骤一:上传文件将下载的系统文件解压后,上传到您的服务器。可以使用FTP工具或宝塔面板上传。步骤二:设置运行目录{callout color="#ff0000"}⚠️ 重要:请将网站运行目录设置为 public 文件夹,这是安全配置的重要步骤。{/callout}宝塔面板设置方法:进入宝塔面板找到对应的网站点击"设置" → "网站目录"将运行目录改为 /public保存设置步骤三:访问安装向导在浏览器中访问您的域名,系统会自动进入安装向导。按照提示完成以下配置:数据库信息 - 填写MySQL数据库地址、用户名、密码管理员账号 - 设置管理员用户名和密码站点信息 - 填写网站名称和域名{callout color="#1fe069"}✅ 完成!安装成功后,您可以使用管理员账号登录后台。{/callout}文件下载{cloud title="网站访问统计系统" type="lz" url="https://wwbwh.lanzouw.com/iql0U3ptw0yj" password=""/}{cloud title="夸克网盘" type="default" url="https://pan.quark.cn/s/272532d41f55" password=""/}
2026年05月19日
9 阅读
0 评论
0 点赞
1
2