Files
YwxAppThink/docs/guide/system_info_maintenance.md
T
yangwx 18101cf11a feat: 上线前安全加固与发布工程化;appmall 由插件迁移为独立应用
安全(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(市场 / 开发者中心 / 审核 / 分润)
2026-10-22 00:53:39 +08:00

3.0 KiB
Raw Blame History

巡检信息与清理缓存

内置的「系统管理 → 系统信息」页面已于 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/cache
  • temp → runtime/temp
  • all → 上述两个 + 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 ⇒ 保住角色授权表里既有的绑定。