Think Card · 轻量级内容与商城管理系统
一个基于 PHP + SQLite + 原生 HTML/CSS/JS 的轻量级内容管理系统, 集成文章、卡片、排行、文件仓库、商品商城、提货码核销、全站主题配色等模块。 无需数据库服务、无需构建工具,上传即用。
📖 项目简介
Think Card 是一套为个人站长、独立开发者、小型工作室打造的轻量级建站系统。 它同时兼顾了「内容发布」和「商品变现」两条主线:
- 用 Copy 卡片 + 文章 + 排行 + 链接卡片 组织内容;
- 用 商品 + 订单 + 提货码 完成虚拟商品的售卖与自动交付;
- 用 全站配色 + 栏目 + 底部自定义 + SEO 设置 完成站点个性化。
整个系统没有使用任何后端框架、没有 Composer 依赖、没有前端打包流程, 只需要一台支持 PHP 的服务器即可运行。数据存储采用 SQLite 单文件数据库, 备份只需复制一个文件。
适用场景:个人博客 / 提示词库 / 资源下载站 / 数字商品售卖 / 小规模会员制站点 / 独立开发者作品集。
✨ 功能特性
一、前台展示
| 模块 | 说明 |
|---|---|
🏠 首页 index.html | 瀑布流布局展示全部内容(卡片/文章混排),支持分页、置顶、角标 |
| 🎠 顶部轮播 | 两栏布局:左侧图片轮播(支持自动播放、触摸/鼠标滑动、圆点导航),右侧「冷门推荐」列表 |
🃏 Copy 卡片详情 copy.html | 封面 + 富文本内容介绍 + 提示词只读文本框,一键复制提示词 |
📥 下载详情 download.html | 支持「普通链接 / 下载链接 / 本地文件仓库」三种类型,展示下载说明与按钮 |
📝 文章 articles.html / article.php | 分类筛选、分页、置顶、角标;文章详情页富文本渲染并做 HTML 净化 |
🔗 链接汇总 downloads.html | 链接卡片 + Copy 卡片混排,支持按分类筛选 |
🏆 排行 ranking.html / rankingview.html | 排行条目可折叠展开,标题支持自定义颜色/粗细/字号 |
📚 全部内容 all.html | 卡片 + 文章混排的完整列表页 |
🛍️ 商城 shop.html / productpage.html | 商品网格(每行数量可配置)、多副图切换、库存、优惠价划线 |
💳 支付页 pay.html | 多收款二维码切换、下单后弹出提货码弹窗(一键复制地址 + 提货码) |
📦 提货中心 pickup.html | 输入 16 位提货码自动核销:订单码直接出结果,活动码进入多选界面 |
🔍 搜索 search.html | 全站搜索(文章/排行/商品/卡片),关键词高亮,浮动搜索层交互 |
| 🧭 面包屑 | 全站统一面包屑导航,栏目名自动从「栏目管理」读取 |
| 🎨 主题配色 | 8 个 CSS 变量由后台配置,前端 theme.js 动态注入,无需重新编译 |
二、后台管理 admin.html
| 模块 | 说明 |
|---|---|
| 📊 网站信息 | 站点标题、版本号、文章数 / Copy 卡片数 / 链接卡片数统计 |
| 📦 内容管理 | 四个子标签:Copy 卡片、链接卡片、文章管理、排行管理 |
| 📂 栏目管理 | 导航栏栏目自定义(名称、地址、排序、是否新窗口打开) |
| 📁 文件仓库 | 文件分类 + 文件上传(白名单 + MIME 检测),可被「本地文件」类型的链接卡片直接引用 |
| 🛒 商品管理 | 见下方「商城系统」 |
| ⚙️ 全站设置 | 基本设置 / 首页设置 / 顶部轮播 / URL 伪静态 / 网站配色 / 底部设置 |
| 🔐 账号管理 | 修改密码、修改用户名、多管理员管理(超级管理员可增删) |
三、商城与提货系统
0 视为售罄,留空视为不限)、Quill 富文本商品介绍。活动提货码:后台批量生成(1–1000 个),可指定可选商品集合、最大可提取数量、有效期;用户在提货页多选商品后核销。
四、安全机制
系统在多个层面做了防护,适合直接部署到公网:
🔒 账户与登录
- 登录防爆破:同一 IP 连续失败 5 次锁定 15 分钟,失败次数实时提示。
- 密码安全:
password_hash()+password_verify(),强制新密码至少 8 位且同时包含字母与数字;默认密码未修改时登录后弹窗提醒。 - Session 加固:
HttpOnly+SameSite=Strict+use_strict_mode,HTTPS 下自动启用Secure,Session 文件独立存放于sessions/。
🛡️ 请求与数据
- CSRF 防护:所有 POST 请求校验
Origin/Referer同源(自动忽略端口差异)。 - SQL 注入防护:全站使用 PDO 预处理语句。
- XSS 净化:文章正文、排行条目内容在前端渲染与 PHP 输出时均经过
sanitizeHtml(),移除<script>、<style>、on*事件、javascript:协议等,同时保留排版标签与iframe/video。 - 目录穿越防护:删除本地文件时使用
realpath()+DIRECTORY_SEPARATOR严格校验路径归属。
📤 上传安全
- 文件仓库采用「扩展名白名单 + 危险扩展名黑名单 +
finfoMIME 检测」三重校验。 - 图片上传仅允许
jpeg/png/gif/webp,并按finfo实际类型决定扩展名。 - 所有上传接口强制要求登录。
🚦 限流与并发
- 下单防刷:同 IP 同商品 5 分钟冷却、同 IP 每小时最多 10 单、全站每小时最多 500 单。
- 提货码限流:同 IP 每分钟最多 10 次验证请求。
- 并发安全:下单扣库存使用事务 +
stock > 0条件更新;提货码核销使用WHERE used = 0条件更新,杜绝重复使用。
五、伪静态(可选)
后台「全站设置 → URL 伪静态」一键开关,开启后链接变为:
article-{id}.html → article.php?id={id}
copy-{id}.html → copy.html?id={id}
download-{id}.html → download.html?id={id}
ranking-{id}.html → rankingview.html?id={id}
product-{id}.html → productpage.html?id={id}
需要服务器支持 URL 重写,配置见下方 🔧 伪静态配置。
🧱 技术栈
| 层面 | 技术 |
|---|---|
| 后端 | PHP(PDO + SQLite),无框架、无 Composer |
| 数据库 | SQLite(单文件 data.sqlite,首次运行自动建表并写入默认数据) |
| 前端 | 原生 HTML5 / CSS3 / JavaScript(ES6+),无构建工具 |
| 富文本 | Quill 1.3.6(CDN 引入) |
| 图标 | Emoji |
| 样式 | CSS 变量驱动的主题系统,响应式适配手机 / 平板 / 桌面 |
📁 目录结构
├── admin.html # 后台管理入口 ├── index.html # 首页(瀑布流) ├── all.html # 全部内容 ├── articles.html # 文章列表 ├── article.php # 文章详情(含 HTML 净化) ├── copy.html # Copy 卡片详情 ├── download.html # 下载详情 ├── downloads.html # 链接汇总 ├── ranking.html # 排行列表 ├── rankingview.html # 排行详情 ├── shop.html # 商城列表 ├── productpage.html # 商品详情 ├── pay.html # 支付页 ├── pickup.html # 提货中心 ├── search.html # 搜索结果 ├── edit_article.html # 独立文章编辑器(后台新窗口打开) ├── edit_ranking.html # 独立排行编辑器 ├── api.php # 全部后端接口(GET 查询 + POST 操作) │ ├── css/ │ ├── style.css # 前台主样式 │ ├── shop.css # 商城相关样式 │ ├── admin.css # 后台样式 │ ├── edit_article.css # 文章编辑器样式 │ └── edit_ranking.css # 排行编辑器样式 │ ├── js/ │ ├── theme.js # 主题配色注入(建议置于 head 中) │ ├── main.js # 首页逻辑 │ ├── all.js # 全部内容逻辑 │ ├── articles.js # 文章列表逻辑 │ ├── downloads.js # 链接汇总逻辑 │ ├── ranking.js # 排行列表逻辑 │ ├── rankingview.js # 排行详情逻辑 │ ├── copy.js # Copy 卡片详情逻辑 │ ├── download.js # 下载详情逻辑 │ ├── search.js # 搜索逻辑 │ ├── shop.js # 商城列表逻辑 │ ├── productpage.js # 商品详情逻辑 │ ├── pay.js # 支付页逻辑 │ ├── pickup.js # 提货中心逻辑 │ ├── breadcrumb.js # 通用面包屑 │ ├── admin.js # 后台主逻辑 │ ├── admin_shop.js # 后台商城逻辑 │ ├── edit_article.js # 文章编辑器逻辑 │ └── edit_ranking.js # 排行编辑器逻辑 │ ├── data.sqlite # SQLite 数据库(首次运行自动生成) ├── sessions/ # Session 文件目录(自动创建) ├── uploads/files/ # 文件仓库上传目录 ├── imgs/YYYYMM/ # 通用图片上传目录 ├── article/YYYYMM/img/ # 文章图片上传目录 └── products/YYYYMM/ # 商品图片上传目录
🚀 快速开始
1. 环境要求
- PHP 7.4 及以上(推荐 PHP 8.x)
- 启用扩展:
pdo_sqlite、fileinfo、mbstring(通常默认已开启) - Web 服务器:Nginx / Apache / Caddy 均可
- 无需 MySQL,无需 Node.js
2. 部署
# 1. 下载并解压
# 2. 将整个目录放到 Web 根目录,例如:
# /var/www/html/thinkdiy
# 或虚拟主机站点根目录
# 3. 确保以下目录可写(PHP 运行用户)
chmod -R 755 .
chmod 775 sessions uploads imgs article products 2>/dev/null
data.sqlite、sessions/、uploads/、imgs/、article/、products/ 若不存在会在首次运行时自动创建;如果权限不足,请手动创建并赋予写权限。
3. 首次登录
浏览器访问:
http://你的域名/admin.html
| 项目 | 值 |
|---|---|
| 默认用户名 | admin |
| 默认密码 | admin123 |
登录后系统会弹窗提醒修改密码。请立即前往「账号管理」修改为至少 8 位、包含字母与数字的强密码。
4. 完成基础配置
进入后台后建议按以下顺序配置:
- 全站设置 → 基本设置 网站标题、副标题、Logo、SEO 关键词与描述。
- 全站设置 → 首页设置 首页每页卡片数(建议 6–24)。
- 全站设置 → 网站配色 选择预设配色方案或自定义 8 个颜色变量。
- 全站设置 → 底部设置 开启自定义底部并填写 HTML。
- 栏目管理 添加导航栏目(如「首页 / 文章 / 资源 / 排行 / 商城 / 提货」)。
- 内容管理 按需添加 Copy 卡片、链接卡片、文章分类与文章、排行。
- 文件仓库 先建分类,再上传文件(供「本地文件」类型的链接卡片引用)。
🔧 伪静态配置
开启后台「全站设置 → URL 伪静态」后,需要配置服务器重写规则。
Nginx
location / {
try_files $uri $uri/ /index.html;
rewrite ^/article-([0-9A-Za-z_\-]+)\.html$ /article.php?id=$1 last;
rewrite ^/copy-([0-9A-Za-z_\-]+)\.html$ /copy.html?id=$1 last;
rewrite ^/download-([0-9A-Za-z_\-]+)\.html$ /download.html?id=$1 last;
rewrite ^/ranking-([0-9A-Za-z_\-]+)\.html$ /rankingview.html?id=$1 last;
rewrite ^/product-([0-9A-Za-z_\-]+)\.html$ /productpage.html?id=$1 last;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock; # 按实际 PHP-FPM 地址修改
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Apache(.htaccess)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^article-([0-9A-Za-z_\-]+)\.html$ article.php?id=$1 [L,QSA]
RewriteRule ^copy-([0-9A-Za-z_\-]+)\.html$ copy.html?id=$1 [L,QSA]
RewriteRule ^download-([0-9A-Za-z_\-]+)\.html$ download.html?id=$1 [L,QSA]
RewriteRule ^ranking-([0-9A-Za-z_\-]+)\.html$ rankingview.html?id=$1 [L,QSA]
RewriteRule ^product-([0-9A-Za-z_\-]+)\.html$ productpage.html?id=$1 [L,QSA]
</IfModule>
注意:article.php 支持 PATH_INFO 与 REQUEST_URI 双重兜底解析;其余详情页由前端 JS 从路径中提取 ID,因此只要重写规则把请求转发到对应 HTML 即可。
📘 使用说明
内容管理
🃏 Copy 卡片(内容管理 → Copy 卡片)
- 图片(支持上传或填 URL)、标题、内容介绍(支持 HTML,展示在
copy.html)、提示词(用户一键复制的内容)。 - 可设置角标文字 / 颜色、按钮文字 / 颜色、置顶。
- 列表按创建时间倒序编号(如「编号0001」),便于索引。
🔗 链接卡片(内容管理 → 链接卡片)
三种类型:
- 普通链接直接跳转外部地址(新窗口打开)。
- 下载链接跳转
download.html展示下载说明与下载按钮。 - 本地文件从「文件仓库」选择文件,前台同样走
download.html。
支持链接分类管理、角标、按钮、置顶。
📝 文章(内容管理 → 文章管理)
- 点击「添加文章」会打开独立编辑器(Quill),支持图片库、网络图片、视频嵌入代码、封面设置、草稿 / 发布、角标、分类。
- 文章正文在输出前会经过 HTML 净化。
- 文章 ID 采用
YYYYMM + 三位序号格式(如202609001),便于排序与管理。
🏆 排行(内容管理 → 排行管理)
- 每个排行包含若干条目,条目可设置排序、标题颜色 / 粗细 / 字号,内容为富文本。
- 前台详情页默认全部折叠,点击标题展开。
- 支持封面图片、排行介绍、分类归属。
文件仓库
- 先添加分类 如「文档 / 图片 / 压缩包」。
- 上传文件 点击「上传文件」,选择分类与文件。
-
支持的文件类型(白名单)
jpg/jpeg/png/gif/webp/bmp/ico、pdf/doc/docx/xls/xlsx/ppt/pptx/txt/md/csv、zip/rar/7z/tar/gz、mp3/wav/mp4/mov/avi/mkv、ttf/otf/woff/woff2 -
危险类型拒绝
php、html、js、svg、exe、sh等会被直接拒绝。 - 引用文件 上传后的文件可在「链接卡片 → 本地文件」中通过「📂 从文件库添加」引用。
商城与提货流程
用户浏览 shop.html
↓
进入 productpage.html(选规格/看图)
↓
点击「立即购买」→ pay.html(选择收款二维码并扫码支付)
↓
点击「我已支付」→ 系统生成订单 + 16 位提货码,弹窗提示保存
↓
商家在后台「订单管理」确认支付 → 「标记发货」
(两步都完成后订单进入已完成)
↓
用户访问 pickup.html,输入提货码 → 校验通过 → 展示下载链接 / 说明
🎁 活动提货码(商品管理 → 生成提货码)
- 勾选可选商品集合 → 设置生成数量(1–1000)、最大可提取数、有效期。
- 用户输入活动码后进入多选界面,在允许范围内挑选商品并确认核销。
- 后台「提货码管理」可分栏查看未使用 / 已使用,支持批量复制、批量删除、清空当前列表。
- 已使用的提货码会记录使用时间与实际提取商品,便于追溯。
全站设置项说明
| 设置项 | 说明 |
|---|---|
| 网站标题 / 副标题 | 显示在头部与浏览器标签栏 |
| Logo 图片 URL | 头部 Logo,留空显示默认图标 |
| SEO 关键词 / 描述 | 写入 <meta name="keywords"> 与 <meta name="description"> |
| 首页每页卡片数 | 首页瀑布流分页大小,建议 6–24 |
| 顶部图片轮播 | 开关 + 轮播间隔 + 图片列表(每张可配跳转链接) |
| URL 伪静态 | 开启后文章等详情页使用 xxx-{id}.html 形式 |
| 网站配色 | 5 套预设 + 8 个自定义颜色变量,实时预览、一键恢复默认 |
| 底部设置 | 开关 + 自定义 HTML(留空显示默认版权) |
网站配色变量
| 变量 | 对应 CSS 变量 | 作用 |
|---|---|---|
| 页面背景色 | --color-bg | 全站页面背景 |
| 卡片背景色 | --color-surface | 卡片、面板背景 |
| 主文字颜色 | --color-text | 标题、正文 |
| 次要文字颜色 | --color-text-secondary | 辅助说明文字 |
| 边框颜色 | --color-border | 分割线、边框 |
| 主色 | --color-primary | 按钮、导航高亮、分页激活 |
| 主色悬停色 | --color-primary-hover | 按钮 hover 状态 |
| 强调色 | --color-accent | 价格、置顶角标 |
🎨 内置 5 套预设配色
#F5F5F5 / 主色 #1a1a1a / 强调 #e74c3c#EEF4FF / 主色 #2563EB / 强调 #F97316#EFF7F1 / 主色 #16A34A / 强调 #EAB308#F6F3FD / 主色 #7C3AED / 强调 #EC4899#FFF7F0 / 主色 #EA580C / 强调 #DC2626🔐 安全建议
- 立即修改默认密码与用户名 首次登录后务必前往「账号管理」修改为强密码。
-
启用 HTTPS
生产环境请使用 HTTPS(系统会自动为 Session Cookie 加上
Secure)。 -
保护敏感文件
建议将
data.sqlite、sessions/通过服务器配置禁止直接访问。 例如 Nginx 中:location ~ \.(sqlite|db)$ { deny all; } location ^~ /sessions/ { deny all; } -
反向代理真实 IP
如果部署在 Cloudflare / Nginx 反向代理之后,请按
api.php中getClientIp()的注释启用对应的真实 IP 获取逻辑 (默认只信任REMOTE_ADDR,最安全但拿不到代理后的真实 IP)。 -
定期备份
定期备份
data.sqlite与uploads/目录。 -
限制后台入口
建议为后台入口
admin.html增加额外的访问限制(IP 白名单 / Basic Auth)。
❓ 常见问题
忘记后台密码怎么办?
删除 data.sqlite 会重置所有数据(不推荐)。更稳妥的方式是用 SQLite 工具修改 admins 表中对应用户的 password 字段为新的 password_hash() 值,或临时插入一个已知哈希的新管理员。
# 示例:用 PHP 生成新密码哈希
php -r "echo password_hash('YourNewPass123', PASSWORD_DEFAULT);"
上传文件提示「分类不存在」?
请先在「文件仓库」中创建至少一个文件分类。
提货码提示「商家尚未确认收款」/「尚未发货」?
订单提货码需要商家在后台完成「确认支付」+「标记发货」两步后才会生效。活动提货码则不受此限制,只需在有效期内且未被使用即可核销。
开启伪静态后页面 404?
请检查服务器重写规则是否生效,以及是否把请求正确转发到了对应的 HTML / PHP 文件。Nginx 需要 try_files + rewrite,Apache 需要开启 mod_rewrite 并允许 .htaccess 生效(AllowOverride All)。
首页不显示轮播?
需要在「全站设置 → 顶部图片轮播」中开启开关,并至少添加一张图片。轮播仅在首页第一页显示。
如何修改首页每页显示数量?
「全站设置 → 首页设置 → 首页每页卡片数」,建议 6–24。
数据库文件在哪里?如何备份?
项目根目录下的 data.sqlite,首次运行时自动创建。备份时直接复制该文件,同时建议一并备份 uploads/、imgs/、article/、products/ 等上传目录。
如何修改网站配色?
后台「全站设置 → 网站配色」,可选择 5 套预设方案,也可以在预设基础上微调 8 个颜色变量。点击「💾 保存全部设置」后前台立即生效(前端 theme.js 会动态注入 CSS 变量)。
提货码的长度和字符集是什么?
16 位随机码,字符集为 ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789(去除了容易混淆的 0/O/1/I/l),用户输入时区分大小写,输入框会自动忽略空格和连字符。
商品库存如何设置?
- 库存
= 0:商品视为售罄,前台显示「库存不足」按钮。 - 库存留空:视为不限库存。
- 库存
> 0:正常扣减,下单使用事务 + 条件更新保证并发安全。
如何自定义底部版权?
后台「全站设置 → 底部设置」,勾选「启用自定义底部」,在文本框中填写 HTML(支持任意 HTML 标签),留空则显示默认版权。
支持多管理员吗?
支持。超级管理员(role = admin)可以在「账号管理 → 管理员管理」中添加 / 删除管理员。普通管理员(role = user)只能管理内容,无法进入管理员管理面板。
📄 版权声明
本项目为专有软件,版权归作者所有,保留所有权利(All Rights Reserved)。 未经作者书面许可,任何人不得:
- 复制、传播、分发本项目的任何部分;
- 修改、改编、二次开发或创建衍生作品;
- 将本项目或其任何部分用于商业用途;
- 反向工程、反编译、反汇编或试图提取源代码;
- 移除或修改本项目中任何版权、商标或其他所有权声明。
本软件按“现状”提供,不提供任何明示或暗示的担保,包括但不限于对适销性、特定用途适用性及非侵权性的担保。 在任何情况下,作者均不对因使用或无法使用本软件而产生的任何直接、间接、偶然、特殊或后果性损害承担责任。
如需获得使用、商用或二次开发授权,请联系: your@email.com (请替换为你的真实联系方式)。
🙏 致谢
- 富文本编辑器:Quill
- 感谢所有为项目提出建议与反馈的使用者
Think不止,DIY不息。
