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

57 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 巡检信息与清理缓存
内置的「系统管理 → 系统信息」页面已于 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 条真数据 |
## 清理缓存
```text
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()` 里的逐个查询同理。
## 老库迁移
已装好的库不会自动跟着变(权限表没有自删逻辑),跑一次一次性脚本即可:
```bash
php scripts/migrate_console_clean.php # 预演
php scripts/migrate_console_clean.php --force # 执行
```
做的事:删掉 `system:index` 页面节点及其子权限与角色授权,把 `system:clean` **就地改名**为
`console:clean`(Route 同步改 `console/clean`,挂到「控制台」下)。
就地改名而不是新建,是为了保住 id ⇒ 保住角色授权表里既有的绑定。