开心彩棉糖

轻量个人网盘

轻量个人网盘

对标蓝奏云网盘开发的个人网盘系统。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. 宝塔面板部署步骤

  1. 新建站点(PHP 版本选 7.3 及以上),站点根目录(运行目录)指向程序包内的 public/ 目录;
  2. 上传程序包并解压,确保 public、app、storage、data、config.sample.php 均在站点内;
  3. 设置目录权限:storage/ 与 data/ 需可写(Linux 下 chmod -R 755,目录 775 亦可);
  4. 确认 PHP 已启用 pdo_sqlite 扩展:软件商店 → PHP 设置 → 安装扩展 → pdo_sqlite;
  5. 浏览器访问站点域名,自动进入安装向导,填写站点名 + 管理员账号密码即完成安装
    (第一个注册的账号自动成为管理员);
  6. 安装完成后自动生成 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/)
版权与免责声明

本站所有原创文章均受著作权法保护,未经作者书面许可,禁止任何形式的转载、摘编、改编或商用。 转载本站文章须注明出处(作者:开心彩棉糖,来源:开心彩棉糖.cn)并保留原文完整链接,不得断章取义或篡改标题内容。

站内文章内容仅代表作者个人观点,仅供学习交流与参考,不构成任何投资、医疗、法律或其他专业建议。
本站文章所述信息、数据与案例力求准确,但不对其完整性、时效性与准确性作任何保证;读者据此操作,风险自担。
文中涉及的第三方链接、产品与观点仅为信息分享,其内容与立场均属原作者,本站不承担相关责任。
本站采用开放评论,评论内容由发布者自行负责;若发现侵权、违法或不实内容,请及时联系我们,核实后将依法处理。
访问并使用本网站即视为您已知悉并同意上述声明条款。

手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

收藏
留下你的评论