轻量个人网盘
对标蓝奏云网盘开发的个人网盘系统。H5 自适应前端 + PHP 7.3+ + SQLite,无需 MySQL,开箱即用。
纯原生 JS 实现(零框架、零 CDN 依赖),全站不使用原生弹窗(统一自定义模态),全站使用无感刷新(AJAX 局部更新,无整页刷新)。
- 当前版本:v0.0.5
一、源码说明
1. 技术栈
| 项目 | 选型 | 说明 |
|---|---|---|
| 后端 | PHP 7.3+ | PDO 数据访问,兼容 7.3 ~ 8.x |
| 数据库 | SQLite | 单文件数据库,启用 WAL + busy_timeout |
| 前端 | 原生 HTML/CSS/JS | 零框架、零 CDN,H5 自适应(手机/平板/PC) |
| Web 服务器 | Nginx / Apache | 宝塔面板可一键部署 |
2. 目录结构
轻量个人网盘/
├── public/ # 唯一对外暴露的 Web 目录(站点根目录必须指向这里)
│ ├── index.php # 统一入口:自动加载、路由分发、未安装强制跳安装向导
│ └── assets/
│ ├── css/app.css # 全站样式:H5 自适应、网格/列表视图、暗色主题
│ └── js/
│ ├── app.js # 核心工具库 nd:api 请求、toast、modal、confirm、
│ │ # promptField、随机提取码 randCode、文件 SHA1 分片计算
│ ├── disk.js # 网盘主页:列表渲染、拖拽/分片上传、预览、分享、
│ │ # 右键菜单、多选批量、目录树移动、搜索排序
│ ├── share.js # 分享落地页(免登录):提取码门、文件/文件夹渲染、预览下载
│ ├── share-manage.js # 我的分享管理:列表、复制链接/提取码、修改、取消
│ ├── recycle.js # 回收站:恢复、彻底删除、清空
│ └── admin.js # 管理后台:用户/日志/设置(局部渲染,无感刷新)
├── app/ # 应用代码(Web 不可直接访问)
│ ├── lib/
│ │ ├── DB.php # SQLite PDO 封装 + 幂等建表迁移(users/folders/files/
│ │ │ # shares/settings/logs/login_attempts)
│ │ ├── Auth.php # 会话管理、CSRF、bcrypt 密码、remember_token、
│ │ │ # IP 防爆破(5 次/15 分钟)、requireLogin/requireAdmin
│ │ ├── Resp.php # 统一 JSON 响应(code/msg/data)
│ │ ├── Router.php # 路由:index.php?r=模块/动作
│ │ └── functions.php # 公共函数:设置读写、日志、大小格式化、扩展名判断等
│ ├── controllers/ # 7 个控制器
│ │ ├── InstallController # 安装向导:生成 config.php + 建库 + 创建管理员
│ │ ├── AuthController # 登录/注册/退出/改密
│ │ ├── DiskController # 网盘页面:主页/我的分享/回收站/个人中心
│ │ ├── FileApiController # 文件 API:列表/新建/重命名/移动/删除/回收站/ZIP/
│ │ │ # 上传初始化/分片/合并/秒传
│ │ ├── ShareController # 分享:创建/修改/取消(直接删除)/落地页/提取码校验/下载计数
│ │ ├── UserApiController # 用户 API:个人空间信息/修改密码
│ │ └── AdminController # 管理后台:用户管理/站点设置/日志(支持 ?partial=1 局部渲染)
│ └── views/ # 视图模板(PHP 直接输出,带 XSS 转义)
│ ├── install.php # 安装向导页
│ ├── auth/ # 登录、注册(独立页面,自带 CSS/JS 引用)
│ ├── disk/ # 网盘主页、我的分享、回收站、个人中心
│ ├── admin/ # 后台页面 + _users_table/_logs_table 局部视图(无感刷新)
│ ├── share/view.php # 免登录分享落地页
│ └── layout/ # header/footer 公共布局
├── storage/ # 运行数据(Web 禁止访问,含 .htaccess + Nginx deny)
│ ├── files/ # 物理文件:按 sha1 前 2 位分目录存放,文件名无扩展名(防执行)
│ ├── tmp/ # 分片上传临时目录
│ └── thumbs/ # 图片缩略图
├── data/netdisk.db # SQLite 数据库(运行时生成,不入交付包)
├── config.sample.php # 配置示例(常量:DB_FILE/STORAGE_DIR/配额/单文件上限/
│ # 分片大小/扩展名白名单/注册开关/回收站天数/防爆破参数)
└── config.php # 安装向导生成(含随机 SECRET_KEY,不随包交付)
3. 核心功能
账号系统
- 注册 / 登录 / 退出 / 修改密码 / 记住我(30 天)
- 第一个注册的用户自动成为管理员(无会员体系)
- 登录防爆破:同一 IP 连续失败 5 次锁定 15 分钟
- 管理员可封禁/解封用户、重置密码、调整空间配额
网盘文件
- 文件夹树形管理(新建/重命名/移动[目录树选择器,拒绝移入自身子孙]/删除)
- 文件上传:分片上传 + 断点续传 + 秒传(SHA1 校验,同内容不重复存储)
- 下载:断点续传(HTTP Range 支持)
- 重命名 / 移动 / 多选批量 / 拖拽上传 / 搜索 / 排序(时间/名称/大小)/ 网格与列表双视图
- 空间配额显示与实时计算
分享
- 文件/文件夹分享,链接免登录访问
- 提取码(留空免提取码)、有效期(1/7/30 天/永久)
- 访问与下载次数统计、分享管理(修改/取消[直接删除记录])
- 复制链接 / 复制提取码 / 二维码(外网可达时)
预览与增强
- 图片(缩略图)、文本、PDF、音视频在线预览
- ZIP 打包下载(未启用 zip 扩展时自动降级为逐个下载)
- 回收站:恢复 / 彻底删除 / 清空(引用计数释放物理文件)
- 暗色主题一键切换
管理后台(仅管理员)
- 用户管理(无感刷新:封禁/配额/重置密码行内操作)
- 站点设置:站点名、开放注册、默认配额、单文件上限、扩展名白名单、回收站保留天数、公告
- 系统信息 / 操作日志(筛选、分页,局部渲染)
4. 关键设计
- 路由约定:
index.php?r=模块/动作,如?r=file/uploadInit、?r=share/view&code=xxx - 统一响应:
{code:0, msg:'ok', data:...},前端nd.api()统一处理 - 安全:PDO 预处理、CSRF Token 校验、输出转义、按 user_id 越权隔离、
物理文件哈希重命名且无扩展名、storage/data 双重防访问(.htaccess + Nginx deny) - 无感刷新:列表/搜索/分页/批量操作/后台管理全部 AJAX 局部渲染,无
location.reload() - 无原生弹窗:确认/输入/预览/分享均使用
nd.modal / nd.confirm / nd.promptField,全站无 alert/confirm/prompt
二、部署说明
1. 环境要求
- PHP 7.3 及以上,需启用扩展:
pdo_sqlite、sqlite3、gd、fileinfo、mbstring、json - 建议启用
zip扩展(打包下载依赖,未启用时自动降级为逐个下载) - 无需 MySQL / 无需安装数据库服务
- Web 服务器:Nginx / Apache 均可(宝塔面板可一键)
2. 宝塔面板部署步骤
- 新建站点(PHP 版本选 7.3 及以上),站点根目录(运行目录)指向程序包内的
public/目录; - 上传程序包并解压,确保
public、app、storage、data、config.sample.php均在站点内; - 设置目录权限:
storage/与data/需可写(Linux 下chmod -R 755,目录 775 亦可); - 确认 PHP 已启用
pdo_sqlite扩展:软件商店 → PHP 设置 → 安装扩展 → pdo_sqlite; - 浏览器访问站点域名,自动进入安装向导,填写站点名 + 管理员账号密码即完成安装
(第一个注册的账号自动成为管理员); - 安装完成后自动生成
config.php(含随机 SECRET_KEY,请勿外泄;打包/迁移时不要包含它)。
⚠️ 常见错误:站点根目录指向了项目根目录(而非
public/)会导致首页 403。
宝塔中通过 网站 → 设置 → 网站目录 → 运行目录 选择/public即可。
3. Nginx 加固配置(宝塔默认即可,以下为推荐加固)
# 存储与数据库目录禁止直接访问(含禁止执行 PHP)
location ~ ^/(storage|data)/ {
deny all;
return 403;
}
# 伪静态美化地址(可选,默认 ?r= 路由无需配置)
location / {
try_files $uri $uri/ /index.php?r=$uri&$query_string;
}
public/是唯一对外暴露的目录,入口为public/index.php;- 物理文件按校验值存放于
storage/files/(文件名无扩展名,天然不可执行)。
4. Apache 部署
- 无需额外配置:
storage/与data/已内置.htaccess拒绝访问; - 需开启
AllowOverride All以启用.htaccess。
5. 数据备份与恢复
- 全量备份 = 复制
data/netdisk.db+storage/两个目录; - 恢复:将备份的
data/与storage/放回原位置即可,无需额外操作; - 注意:
config.php中 SECRET_KEY 变更会使旧「记住我」会话失效,属正常现象。
6. 已知限制
- 视频缩略图需 ffmpeg,默认未集成(列表以图标显示);
- 二维码分享图由外部服务生成(api.qrserver.com),服务器无法访问外网时仅能复制链接;
- 单文件上限默认 100MB(后台可调至 2GB);服务器
upload_max_filesize小于分片大小时,
程序会自动降低分片大小适配,正式环境建议调大上传限制; - SQLite 适合个人/小团队低频写入,高并发场景建议迁移 MySQL(接口均为 PDO,改动成本低)。
三、更新记录
v0.0.5(2026-10-26)
- 全面安全加固:
- 生产模式隐藏错误信息(
display_errors=0),错误统一写入data/php-error.log,不再向访客暴露路径与堆栈; - 全站安全响应头:
X-Content-Type-Options: nosniff、X-Frame-Options: SAMEORIGIN(防点击劫持,不影响站内 iframe 预览)、Referrer-Policy: same-origin、X-XSS-Protection; - 会话 Cookie 在 HTTPS 下自动启用
Secure(已有 HttpOnly + SameSite=Lax); - 「记住我」Token 改为数据库仅存 SHA-256 摘要(防数据库泄露后伪造登录凭证);
- 上传文件名安全化:剔除路径分隔符/穿越片段/控制字符、限制 200 字符、去除首尾非法字符(
..\..\xxx类名字会被清理为安全文件名)。
- 生产模式隐藏错误信息(
- 全站版权注释:全部 36 个源码文件(PHP/JS/CSS/config.sample.php)标注作者与网站(作者:开心彩棉糖,网站:开心彩棉糖.cn)
v0.0.4(2026-10-26)
- 取消分享改为直接删除分享记录(原为软删除,仅置失效状态)
- 「我的分享」列表新增复制提取码按钮(仅对有提取码的分享显示)
v0.0.3(2026-10-26)
- 创建分享 / 修改分享弹窗的提取码输入框新增「随机生成」按钮
(nd.randCode(),6 位随机码,剔除 0/O/1/l/I 易混淆字符)
v0.0.2(2026-10-26)
- 修复登录成功不跳转 Bug:登录页为独立页面、缺少
#toastBox容器,
nd.toast()在 null 上调用appendChild抛异常,中断了成功回调中的跳转逻辑;
toast()现改为容器不存在时自动创建(登录/注册/安装等独立页面统一受益) - 引入静态资源版本参数(
assets/*?v=版本号),避免浏览器缓存旧文件导致修复不生效
v0.0.1(2026-10-26 初始版本)
- 对标蓝奏云的核心功能完整实现(详见《开发策划书.md》):
安装向导、账号系统(首用户为管理员)、文件夹管理、分片上传/断点/秒传、
下载(Range)、文件/文件夹分享(提取码/有效期/二维码/访问下载计数)、
在线预览(图片/文本/PDF/音视频)、回收站、ZIP 打包、搜索排序、多选批量、
暗色主题、管理后台(用户/设置/日志)、操作日志、登录防爆破、
扩展名白名单 + 物理文件哈希重命名防脚本执行 - 落实项目约束:全站不使用原生弹窗、全站使用无感刷新
- 本地全流程实测并修复 5 个 Bug:安装期常量未加载、lastId() 取到日志表 ID、
回收站彻底删除时物理文件不释放(引用计数顺序错误)、compact() 未定义变量 Notice、
拖拽类型检测逻辑恒真 - 文件移动升级为目录树选择器,拒绝移动到不存在目录/自身子孙
四、版本与交付约定
- 版本号规则:每次功能/修复迭代自动
+0.0.1(当前 v0.0.4) - 交付物为全量 zip(不打增量包),不包含
config.php(保留config.sample.php),不包含运行时数据 - 本地测试环境:PHP 7.3 内置服务器运行于
http://127.0.0.1:8123(docroot 指向public/)