工具即文件
每个工具是 app/tools/{分类}/{slug}.php 里返回的一份数组定义,丢进去就出现在前台。不用建表、不用装扩展、不用后台注册;表单字段与算法以磁盘文件为准,后台只覆盖名称、说明、积分、排序、开关。
FEATURES
不做「插件市场」那种花活,功能都写在源码里,读完一遍就知道边界在哪。
每个工具是 app/tools/{分类}/{slug}.php 里返回的一份数组定义,丢进去就出现在前台。不用建表、不用装扩展、不用后台注册;表单字段与算法以磁盘文件为准,后台只覆盖名称、说明、积分、排序、开关。
每个工具单独定价,0 即免费;会员按身份打折,解锁一次永久可用。月会员三分之一、年会员一半、永久会员免费,价格向上取整绝不出现小数积分,加减分全部留流水与余额快照。
前台所有模板共用同一套渲染函数与同一份基础样式,模板只负责「长什么样」。新模板通常只需要一个 layout.php + 一份 CSS,片段缺失自动回落 default 模板,后台模板中心一键全站切换。
注册登录、每日签到、积分明细、会员中心、解锁记录、收藏、评论与积分榜,全部由模板渲染。图形验证码缺 GD 时自动退回 SVG,连签满 7 天额外奖励,评论可先审后发、通过才发积分。
/admin 进入,独立会话键与前台互不影响,六个分类九个子模块:工具、分类、用户、评论、模板、设置、统计、日志。写操作强制 CSRF,统一留操作日志,访问统计按天记录 PV / UV / 执行次数。
根目录只有一个 index.php 入口加三个目录,伪静态规则随包给出。app/、storage/ 屏蔽直访,SQL 全走预处理参数绑定,输出统一转义,静态资源路径锁死在 assets 目录内。
TOOLS
全部自己实现,逻辑短平快,输入不发给任何第三方。以下名称与后台「工具管理」里看到的一致。
ECONOMY
工具在后台各自定价,会员身份决定折扣系数,实付积分按 ceil(原价 × 系数) 向上取整,同一工具对同一用户只扣一次。
7 分的工具就扣 7 分,解锁后永久可用。
7 分变 3 分,默认 300 积分开通。
7 分变 4 分,默认 1000 积分开通。最划算
所有付费工具不再扣分,默认 3000 积分开通。
| 工具原价 | 普通 | 月会员 | 年会员 | 永久 |
|---|---|---|---|---|
| 0 分(免费) | 0 | 0 | 0 | 0 |
| 7 分 | 7 | 3 | 4 | 0 |
| 30 分 | 30 | 10 | 15 | 0 |
| 99 分 | 99 | 33 | 50 | 0 |
| 设置键 | 默认 | 说明 |
|---|---|---|
points_register | 100 | 注册赠送 |
points_sign | 5 | 每日签到 |
points_sign_bonus | 10 | 连续签到满 7 天额外奖励 |
points_comment | 2 | 评论审核通过后奖励 |
UPDATE ... WHERE points >= ? 再写流水,不会出现负余额,也不会出现并发超扣。THEMES
三套模板共用同一套渲染函数与同一份基础 CSS,差别只在变量覆盖与签名样式。dark 只有一个 layout.php,light 只多一个页头片段,其余片段自动复用 default。
app/themes/mine/
├─ layout.php # 唯一必需文件:页面外壳
├─ theme.json # 名称、作者、版本、介绍、色块
└─ partial/header.php # 可选,只覆盖想改的片段
assets/mine/css/style.css # 覆盖 :root 变量 + 自己的签名样式/theme/{key} 自己试用,只影响当前会话。三套自带模板的 key 分别是 tp-classic(经典蓝,16 个页面片段都在这套里)、tp-plain(极简素,顶部改成横向分类条)、tp-night(夜间墨,深色底高对比)。ADMIN
管理员是用户表里 role = 1 的账号,后台会话与前台登录互不影响,有效期 6 小时滑动续期。
| 模块 | 地址 | 能做什么 |
|---|---|---|
| 概览 | /admin | 用户、工具、评论、今日访问等关键数字与待办 |
| 工具管理 | /admin/tools | 按分类 / 收费状态 / 关键词筛选,改名称、说明、所需积分、排序、上下架 |
| 分类管理 | /admin/categories | 改分类名称、描述、排序与开关 |
| 用户管理 | /admin/users | 查用户、加扣积分、封禁、设会员类型与到期时间 |
| 评论管理 | /admin/comments | 审核通过 / 驳回 / 删除,通过时按规则发放积分 |
| 模板中心 | /admin/themes | 列出模板与配色预览,一键切换全站模板,可改模板介绍 |
| 站点设置 | /admin/settings | 站点信息、公告、页脚、ICP、积分规则、会员价、评论策略、首页数量 |
| 访问统计 | /admin/stats | 按天 PV / UV / 执行次数柱状图与工具排行 |
| 操作日志 | /admin/logs | 后台写操作留痕,可清空 |
SPEC
面向还活着的老环境:不用 PHP 8 语法,不用 MySQL 5.7 之后才有的特性。
| 项目 | 要求 / 说明 |
|---|---|
| PHP | 7.4+(不使用 match、箭头空合并等 8.0 语法) |
| 数据库 | MySQL 5.6+ / utf8mb4 / InnoDB,兼容 MariaDB |
| 必需扩展 | pdo、pdo_mysql、mbstring、json |
| 可选扩展 | gd(图形验证码,缺则退 SVG)、openssl(AES / RSA 工具) |
| 表前缀 | 默认 laoli_,安装向导可改,换前缀不动代码 |
| 依赖 | 无框架、无 Composer、无模板引擎、无构建步骤 |
| 路由 | 单入口 index.php + PATH_INFO |
| 数据表 | 10 张 |
INSTALL
没有命令行初始化,没有额外服务,上传即装。
整个目录放到站点根目录或子目录,保证 app/、app/data/、storage/ 可写。
只要 app/config.php 不存在,任何地址都会进向导,页面先做 PHP 版本、必需扩展与写权限预检。
库不存在会自动创建;表前缀默认 laoli_;向导生成配置与 install.lock,导入十张表并建管理员(默认永久会员)。
根目录刻意不放 .htaccess / nginx.htaccess / web.config,README.md 第 4 节里 Apache / Nginx / IIS / 宝塔各有一段可以整块复制的原文,照抄即可。
Options -Indexes
AcceptPathInfo On
DirectoryIndex index.php index.html
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(app|storage)(/|$) - [F,L]
RewriteRule \.(sql|log|lock|bak|ini|conf|zip|tar|gz|tgz|7z|rar)$ - [F,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
# PATH_INFO 模式:/t/base64 交给 index.php 解析
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>
<IfModule mod_headers.c>
Header set X-Content-Type-Options "nosniff"
</IfModule># 第一步 · 面板「伪静态」框(server 层级)
location ~ ^/(app|storage)/ {
return 404;
}
if ($uri ~* \.(sql|log|lock|bak|ini|conf|zip|tar|gz)$) {
return 403;
}
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php$1 last;
}
# 第二步 · 把 PHP 段换成带 PATH_INFO 的版本
# 宝塔默认只有 location ~ \.php$,/t/base64 这类地址取不到 PATH_INFO
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
set $path_info $fastcgi_path_info;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PATH_INFO $path_info;
fastcgi_pass unix:/run/php/php74-fpm.sock;
}nginx -t 校验后 nginx -s reload 生效;nginx -s reopen 只是重开日志,配置不会换。规则漏配也不会被执行:app/bootstrap.php 有入口守卫,不经根目录 index.php 访问 app/ 一律 403。php -S 127.0.0.1:8080 app/router.php,浏览器打开就是安装向导(router.php 模拟线上规则;不带 router 直接指 index.php 是不行的,内置服务器不会把路径交给它)。装好之后在后台「商店与更新」里填官网的 /shouquan 地址,就能在线拉更新包与模板。FAQ
app/tools/ 下的文件里本地实现,没有任何工具发起外部 HTTP 请求;哈希、加解密用 PHP 自带的 hash / openssl 函数。laoli_unlock 表落一条用户与工具的记录,付费墙在工具执行层统一判断,已解锁的直接放行。会员过期只影响之后新工具的折扣,不影响已解锁的工具。cost。app/themes/{目录名}/layout.php 与 theme.json,再放一份 assets/{目录名}/css/style.css,模板中心扫描目录时会自动出现这张卡片。role = 1 的账号,用的是独立会话键,与前台登录状态互不通用;所有写操作统一校验 CSRF,未登录的 POST 直接返回 401。DEFAULT (expr)、不用 5.7 的 JSON 函数与窗口函数,时间全部存 INT 时间戳,字符集 utf8mb4。