安全(P0) - 发布包签名:新增 scripts/package_keygen.php、scripts/package_verify.php、 ywxapp\service\PackageVerifier;FrameworkService::apply() 解压前强制验签 (ywxapp.framework_package_verify,默认开启) - JWT 收紧:config/jwt.php 移除公开默认密钥,JwtService::assertStrongSecret() 校验非空 / 长度≥32 / 已知弱值;.env.production.example 键名由 JWT_SECRET_KEY 修正为 JWT_SECRET - /api/v1/Article:免登录白名单收窄为只读接口,写操作字段白名单 + assertOwner() 越权校验 - 开发者令牌:查找接口不再回显明文、统一失败文案 + 限流 - TemplateInstaller:文件名白名单 + realpath 归一化 + 目录内断言,修复 Zip Slip;补 use ZipArchive - 后台登录:接入验证码、失败锁定与登录限流(config/ratelimit.php) - 缓存 / Session 驱动可由 .env 覆盖(CACHE_DRIVER / SESSION_TYPE),集群部署改 redis - paycenter 支付日志开关改为 PAY_LOG,不再跟随 APP_DEBUG 工程化 / 交付 - 新增 CHANGELOG.md 与 .env.production.example;composer.lock 入库锁定依赖版本 - 插件离线安装 CLI 增加 --uid,后台上传安装透传 uid,付费插件授权校验可通过 - 授权拒绝文案区分「未携带 uid」与「未找到有效授权」,便于排障 - .gitignore 放行 .env.production.example / .env.addon.example / .gitattributes / public/.htaccess 结构 - appmall 由 addon/appmall 迁移为独立应用 app/appmall(市场 / 开发者中心 / 审核 / 分润)
3.0 KiB
3.0 KiB
巡检信息与清理缓存
内置的「系统管理 → 系统信息」页面已于 2026-09-28 下线(System 控制器 / view/system / modules/system.js 全部删除),
原因很直接:它展示的东西控制台首页顶部一字不差地都有(同一份 SystemInfo::collect()),留着就是两份要维护。
现在这两件事都在控制台首页(/admin/console/index.html,app/backend/controller/Console.php):
- 巡检信息:
Console::index()渲染,数据来自app/backend/library/SystemInfo.php - 清理缓存:
Console::clean(),权限console:clean(挂在「控制台」菜单下)
页面内容(控制台首页)
| 区块 | 说明 |
|---|---|
| 运行统计 | 管理员数、插件数、附件数、数据库占用(走 DbBackup::tables() 汇总) |
| 运行环境 | YwxApp / ThinkPHP / PHP / MySQL 版本、系统、服务器时间、上传限制、内存限制、脚本超时、禁用函数 |
| 磁盘 | 已用 / 总量 / 剩余,进度条(取 app()->getRootPath() 所在盘) |
| 目录权限 | runtime / public/storage / config / addon 是否存在、是否可写;不可写会导致缓存无法生成、上传失败、插件装不上 |
| 维护 | 清理数据缓存 / 模板缓存 / 全量清理(含路由缓存) |
| 安全提示 | 近 7 天操作条数、其中登录失败次数 |
| 近 7 天趋势 | 会员注册数、后台操作条数(真数据,Console::collectStats() 产出,ECharts 渲染) |
| 最新会员 / 最近操作日志 | 各取最近 8 条真数据 |
清理缓存
POST /admin/console/clean body: type=cache|temp|all
cache→runtime/cachetemp→runtime/tempall→ 上述两个 +runtime/route_list.php(下次请求自动重建)
不碰 runtime/log:操作日志(docs/guide/operation_log.md)与错误日志要留着。
清理动作本身会记一条 console/clean 日志(写在 SystemInfo::cleanRuntime() 里)。
巡检数据怎么取(给排障用)
- MySQL 版本:
Db::query('SELECT VERSION()') - 磁盘:
disk_total_space()/disk_free_space()—— 注意这俩返回 float,formatBytes()参数必须收 float,否则严格类型下直接 TypeError(页面 500)。 - 统计用
SystemInfo::safeCount()包一层:表缺失或查询异常时返回 0, 首页不会因为某张插件表没建就整体打不开。Console::collectStats()里的逐个查询同理。
老库迁移
已装好的库不会自动跟着变(权限表没有自删逻辑),跑一次一次性脚本即可:
php scripts/migrate_console_clean.php # 预演
php scripts/migrate_console_clean.php --force # 执行
做的事:删掉 system:index 页面节点及其子权限与角色授权,把 system:clean 就地改名为
console:clean(Route 同步改 console/clean,挂到「控制台」下)。
就地改名而不是新建,是为了保住 id ⇒ 保住角色授权表里既有的绑定。